From 5c5b624c525ca48a83409da9bfa05c5df8096bd4 Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 16 Apr 2026 12:14:21 +0800 Subject: [PATCH 1/8] Expand catalog taxonomy and rename entities to human-readable names --- .../707a0c91-4c88-45d9-a28e-1195c8834b66.json | 2 +- .../77083eb2-d809-4366-ad85-f757dc5c693b.json | 2 +- .../95cbe2c7-9b60-4afd-8a3c-1382b610e316.json | 4 +- .../a47dcb12-f1aa-4415-8be1-5ae04f5db457.json | 2 +- .../c1413482-092a-45b4-b92b-d8d2672641e7.json | 2 +- .../10ff8743-4b8c-403e-95a6-90c36cbb98ca.json | 2 +- .../2669572f-00e1-485f-900d-5b686acfe9c6.json | 4 +- .../2b1f1edf-dc57-4198-a180-9b07fc26dbfe.json | 2 +- .../2d838726-ed2c-437d-a171-eade2544ca66.json | 2 +- .../358a08b8-9e03-4a39-a40b-539eb3e01622.json | 2 +- .../36de56b9-9ee7-4105-8f2c-497819d76da6.json | 6 +- .../49ea1457-ecc8-418d-9013-d74730b116e1.json | 4 +- .../4aca5509-09d5-4aec-aeba-1cd26628cca9.json | 2 +- .../5b6c4561-ca61-4e38-aeb1-7d9f7ff9778e.json | 2 +- .../61be974d-6254-4ddd-9917-d91fa165a536.json | 4 +- .../694bf025-0904-488d-af1b-2b88bbd8df43.json | 4 +- .../79937c95-92ec-4393-acbb-b1028b78defe.json | 4 +- .../8190ab54-5b6f-457b-8c87-43f09eabf757.json | 2 +- .../9b84fcb0-80f4-456e-9fb3-e9abd0ec3fcb.json | 2 +- .../9de5efec-83f7-42d3-9425-3a19e8a15fd2.json | 2 +- .../9ffcb030-9c5a-4d17-ace6-2ea83c6ae2d4.json | 4 +- .../a487a65f-4356-42a1-9da0-c6e0be0166e4.json | 2 +- .../a51b73a3-08c5-4dfd-b22a-8e66a0285801.json | 2 +- .../b920054b-0f48-440b-b50e-64a5a097e7a5.json | 4 +- .../cbe2c79b-60aa-4dca-bc13-82b610e31653.json | 2 +- .../d5208656-b610-4ad5-81f8-cbd7d512493a.json | 4 +- .../CardListing/daily-report-dashboard.json | 4 +- .../e7fe0e9a-f6ce-40f7-bf63-02157530cae1.json | 4 +- .../ef22ef9b-d7f6-4593-8bec-e2cc283103ec.json | 2 +- .../f0277f2a-26af-4e25-8222-6d6492bc08f6.json | 4 +- .../f0c0ad91-0194-46b9-a971-9e60d637a51a.json | 2 +- .../Category/accounting-finance.json | 4 +- .../adventure-outdoor-activities.json | 4 +- .../catalog-realm/Category/ai-automation.json | 4 +- .../Category/analytics-reporting.json | 2 +- .../Category/api-integration.json | 2 +- .../Category/business-development.json | 2 +- .../Category/career-development.json | 2 +- .../Category/certifications-training.json | 2 +- .../catalog-realm/Category/communication.json | 32 + .../Category/content-creation.json | 2 +- .../Category/creative-projects.json | 2 +- .../Category/customer-support.json | 2 +- .../Category/data-analytics.json | 2 +- .../Category/data-engineering.json | 2 +- .../Category/data-management.json | 2 +- .../Category/design-creative.json | 2 +- .../Category/developer-tools-code.json | 2 +- .../Category/devops-infrastructure.json | 2 +- .../Category/e-commerce-online-sales.json | 2 +- .../Category/education-courses.json | 2 +- .../Category/entertainment-media.json | 2 +- .../Category/events-celebrations.json | 2 +- .../Category/family-relationships.json | 2 +- .../catalog-realm/Category/food-cooking.json | 32 + packages/catalog-realm/Category/gaming.json | 32 + .../catalog-realm/Category/goals-habits.json | 2 +- .../catalog-realm/Category/hardware-iot.json | 2 +- .../Category/health-wellness.json | 2 +- .../Category/hobbies-crafts.json | 2 +- .../catalog-realm/Category/home-living.json | 2 +- .../Category/hr-people-management.json | 2 +- .../Category/knowledge-management.json | 2 +- .../Category/language-learning.json | 2 +- .../Category/legal-compliance.json | 2 +- .../Category/maps-navigation.json | 32 + .../Category/marketing-growth.json | 2 +- .../catalog-realm/Category/news-media.json | 32 + .../Category/operations-supply-chain.json | 2 +- .../Category/parties-celebrations.json | 2 +- .../Category/personal-finance.json | 2 +- .../Category/product-catalogs.json | 6 +- .../Category/professional-services.json | 2 +- .../Category/project-management.json | 2 +- .../Category/prototyping-experiments.json | 2 +- .../Category/quality-assurance.json | 2 +- .../Category/reading-literature.json | 2 +- .../Category/real-estate-property.json | 2 +- .../Category/research-knowledge.json | 2 +- .../Category/science-discovery.json | 2 +- .../Category/security-privacy.json | 32 + .../Category/shopping-consumer.json | 2 +- .../Category/skills-training.json | 2 +- .../Category/social-networking.json | 2 +- .../Category/software-development.json | 2 +- .../Category/sports-fitness.json | 2 +- .../Category/teaching-instruction.json | 2 +- .../Category/technical-documentation.json | 2 +- .../Category/travel-experiences.json | 2 +- ...9f0c19081de.json => travel-lifestyle.json} | 6 +- .../Category/ui-components-design.json | 2 +- .../Category/video-games-interactive.json | 2 +- .../Category/web-development.json | 2 +- .../fb9494c4-0d61-4d2d-a6c0-7b16ca40b42b.json | 2 +- .../catalog-realm/FieldListing/geo-point.json | 2 +- .../FieldListing/geo-search-point.json | 2 +- .../SkillListing/cursor-coding.json | 4 +- .../SkillListing/talk-like-a-pirate.json | 4 +- ...40d6-9cd3-93f0b32a8fbb.json => build.json} | 0 ...4cd3-93f0-b32a8fbbd34e.json => learn.json} | 0 ...-491d-9570-60c01e07b14c.json => life.json} | 0 ...-40c0-9e07-b14c97eedb48.json => play.json} | 0 ...-4570-a0c0-1e07b14c97ee.json => work.json} | 0 ...d0-465c-964e-e535fc6bb893.json => ai.json} | 4 +- packages/catalog-realm/Tag/app.json | 28 + ...24-9ddb-6f4da891aef2.json => bundled.json} | 4 +- ...bdcf-d98686ee42d7.json => calculator.json} | 6 +- packages/catalog-realm/Tag/card-type.json | 28 + packages/catalog-realm/Tag/card.json | 28 + packages/catalog-realm/Tag/community.json | 28 + packages/catalog-realm/Tag/dashboard.json | 28 + packages/catalog-realm/Tag/featured.json | 28 + packages/catalog-realm/Tag/form.json | 28 + ...-4c4d-bd88-76e88274c483.json => game.json} | 4 +- packages/catalog-realm/Tag/general.json | 28 + packages/catalog-realm/Tag/new.json | 28 + ...5-b2a6-d88b0d2a7642.json => official.json} | 4 +- packages/catalog-realm/Tag/planner.json | 28 + ...6a8-8622-6c157716c26c.json => poster.json} | 4 +- packages/catalog-realm/Tag/report.json | 28 + packages/catalog-realm/Tag/skill.json | 28 + packages/catalog-realm/Tag/template.json | 28 + ...404c-b2a9-b4041b93090c.json => theme.json} | 4 +- packages/catalog-realm/Tag/tracker.json | 28 + ...006602ce6a4.json => user-contributed.json} | 6 +- .../4d6390f1-3bae-4e75-a95d-4309010e03e4.json | 4 +- .../f87667d9-7616-4baf-b2fe-8ce5d393f676.json | 4 +- .../catalog-app/catalog_structure.md | 615 ++++++++++++++++++ .../8a14f671-4daf-4195-aca5-85dc143d15b8.json | 19 +- .../631d1b5d-fcd0-465c-964e-e535fc6bb893.json | 17 +- .../e3625690-2231-428e-8f6d-d123d8f5cc6c.json | 19 +- 131 files changed, 1380 insertions(+), 148 deletions(-) create mode 100644 packages/catalog-realm/Category/communication.json create mode 100644 packages/catalog-realm/Category/food-cooking.json create mode 100644 packages/catalog-realm/Category/gaming.json create mode 100644 packages/catalog-realm/Category/maps-navigation.json create mode 100644 packages/catalog-realm/Category/news-media.json create mode 100644 packages/catalog-realm/Category/security-privacy.json rename packages/catalog-realm/Category/{38b5d1dc-00d3-4a19-8998-29f0c19081de.json => travel-lifestyle.json} (68%) rename packages/catalog-realm/Sphere/{637767ff-c7a9-40d6-9cd3-93f0b32a8fbb.json => build.json} (100%) rename packages/catalog-realm/Sphere/{67ffc7a9-70d6-4cd3-93f0-b32a8fbbd34e.json => learn.json} (100%) rename packages/catalog-realm/Sphere/{5d7420dc-c8f6-491d-9570-60c01e07b14c.json => life.json} (100%) rename packages/catalog-realm/Sphere/{c8f6891d-9570-40c0-9e07-b14c97eedb48.json => play.json} (100%) rename packages/catalog-realm/Sphere/{20dcc8f6-891d-4570-a0c0-1e07b14c97ee.json => work.json} (100%) rename packages/catalog-realm/Tag/{631d1b5d-fcd0-465c-964e-e535fc6bb893.json => ai.json} (92%) create mode 100644 packages/catalog-realm/Tag/app.json rename packages/catalog-realm/Tag/{140feda8-625b-4a24-9ddb-6f4da891aef2.json => bundled.json} (91%) rename packages/catalog-realm/Tag/{c1fe433a-b3df-41f4-bdcf-d98686ee42d7.json => calculator.json} (90%) create mode 100644 packages/catalog-realm/Tag/card-type.json create mode 100644 packages/catalog-realm/Tag/card.json create mode 100644 packages/catalog-realm/Tag/community.json create mode 100644 packages/catalog-realm/Tag/dashboard.json create mode 100644 packages/catalog-realm/Tag/featured.json create mode 100644 packages/catalog-realm/Tag/form.json rename packages/catalog-realm/Tag/{51de249c-516a-4c4d-bd88-76e88274c483.json => game.json} (91%) create mode 100644 packages/catalog-realm/Tag/general.json create mode 100644 packages/catalog-realm/Tag/new.json rename packages/catalog-realm/Tag/{ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642.json => official.json} (91%) create mode 100644 packages/catalog-realm/Tag/planner.json rename packages/catalog-realm/Tag/{f21d95da-0728-46a8-8622-6c157716c26c.json => poster.json} (91%) create mode 100644 packages/catalog-realm/Tag/report.json create mode 100644 packages/catalog-realm/Tag/skill.json create mode 100644 packages/catalog-realm/Tag/template.json rename packages/catalog-realm/Tag/{b793225c-32f9-404c-b2a9-b4041b93090c.json => theme.json} (91%) create mode 100644 packages/catalog-realm/Tag/tracker.json rename packages/catalog-realm/Tag/{4d0f9ae2-048e-4ce0-b263-7006602ce6a4.json => user-contributed.json} (89%) create mode 100644 packages/catalog-realm/catalog-app/catalog_structure.md diff --git a/packages/catalog-realm/AppListing/707a0c91-4c88-45d9-a28e-1195c8834b66.json b/packages/catalog-realm/AppListing/707a0c91-4c88-45d9-a28e-1195c8834b66.json index 9964f271627..f572f5d515e 100644 --- a/packages/catalog-realm/AppListing/707a0c91-4c88-45d9-a28e-1195c8834b66.json +++ b/packages/catalog-realm/AppListing/707a0c91-4c88-45d9-a28e-1195c8834b66.json @@ -30,7 +30,7 @@ }, "tags.0": { "links": { - "self": "../Tag/51de249c-516a-4c4d-bd88-76e88274c483" + "self": "../Tag/game" } }, "license": { diff --git a/packages/catalog-realm/AppListing/77083eb2-d809-4366-ad85-f757dc5c693b.json b/packages/catalog-realm/AppListing/77083eb2-d809-4366-ad85-f757dc5c693b.json index 54d004b5358..fe87ca26f86 100644 --- a/packages/catalog-realm/AppListing/77083eb2-d809-4366-ad85-f757dc5c693b.json +++ b/packages/catalog-realm/AppListing/77083eb2-d809-4366-ad85-f757dc5c693b.json @@ -29,7 +29,7 @@ }, "tags.0": { "links": { - "self": "../Tag/140feda8-625b-4a24-9ddb-6f4da891aef2" + "self": "../Tag/bundled" } }, "license": { diff --git a/packages/catalog-realm/AppListing/95cbe2c7-9b60-4afd-8a3c-1382b610e316.json b/packages/catalog-realm/AppListing/95cbe2c7-9b60-4afd-8a3c-1382b610e316.json index 0382bb4205e..75e165e9d3d 100644 --- a/packages/catalog-realm/AppListing/95cbe2c7-9b60-4afd-8a3c-1382b610e316.json +++ b/packages/catalog-realm/AppListing/95cbe2c7-9b60-4afd-8a3c-1382b610e316.json @@ -30,12 +30,12 @@ }, "tags.0": { "links": { - "self": "../Tag/140feda8-625b-4a24-9ddb-6f4da891aef2" + "self": "../Tag/bundled" } }, "tags.1": { "links": { - "self": "../Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642" + "self": "../Tag/official" } }, "license": { diff --git a/packages/catalog-realm/AppListing/a47dcb12-f1aa-4415-8be1-5ae04f5db457.json b/packages/catalog-realm/AppListing/a47dcb12-f1aa-4415-8be1-5ae04f5db457.json index a652d9f0b9e..500b04c8e68 100644 --- a/packages/catalog-realm/AppListing/a47dcb12-f1aa-4415-8be1-5ae04f5db457.json +++ b/packages/catalog-realm/AppListing/a47dcb12-f1aa-4415-8be1-5ae04f5db457.json @@ -28,7 +28,7 @@ }, "tags.0": { "links": { - "self": "../Tag/140feda8-625b-4a24-9ddb-6f4da891aef2" + "self": "../Tag/bundled" } }, "license": { diff --git a/packages/catalog-realm/AppListing/c1413482-092a-45b4-b92b-d8d2672641e7.json b/packages/catalog-realm/AppListing/c1413482-092a-45b4-b92b-d8d2672641e7.json index fb090b38013..940cefce364 100644 --- a/packages/catalog-realm/AppListing/c1413482-092a-45b4-b92b-d8d2672641e7.json +++ b/packages/catalog-realm/AppListing/c1413482-092a-45b4-b92b-d8d2672641e7.json @@ -28,7 +28,7 @@ }, "tags.0": { "links": { - "self": "../Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642" + "self": "../Tag/official" } }, "license": { diff --git a/packages/catalog-realm/CardListing/10ff8743-4b8c-403e-95a6-90c36cbb98ca.json b/packages/catalog-realm/CardListing/10ff8743-4b8c-403e-95a6-90c36cbb98ca.json index abbdb2ae07f..21ae48adf21 100644 --- a/packages/catalog-realm/CardListing/10ff8743-4b8c-403e-95a6-90c36cbb98ca.json +++ b/packages/catalog-realm/CardListing/10ff8743-4b8c-403e-95a6-90c36cbb98ca.json @@ -28,7 +28,7 @@ }, "tags.0": { "links": { - "self": "../Tag/51de249c-516a-4c4d-bd88-76e88274c483" + "self": "../Tag/game" } }, "license": { diff --git a/packages/catalog-realm/CardListing/2669572f-00e1-485f-900d-5b686acfe9c6.json b/packages/catalog-realm/CardListing/2669572f-00e1-485f-900d-5b686acfe9c6.json index 039a8825988..433b63bb8b3 100644 --- a/packages/catalog-realm/CardListing/2669572f-00e1-485f-900d-5b686acfe9c6.json +++ b/packages/catalog-realm/CardListing/2669572f-00e1-485f-900d-5b686acfe9c6.json @@ -28,12 +28,12 @@ }, "tags.0": { "links": { - "self": "../Tag/4d0f9ae2-048e-4ce0-b263-7006602ce6a4" + "self": "../Tag/user-contributed" } }, "tags.1": { "links": { - "self": "../Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642" + "self": "../Tag/official" } }, "license": { diff --git a/packages/catalog-realm/CardListing/2b1f1edf-dc57-4198-a180-9b07fc26dbfe.json b/packages/catalog-realm/CardListing/2b1f1edf-dc57-4198-a180-9b07fc26dbfe.json index 5515941b17d..045e82a80e3 100644 --- a/packages/catalog-realm/CardListing/2b1f1edf-dc57-4198-a180-9b07fc26dbfe.json +++ b/packages/catalog-realm/CardListing/2b1f1edf-dc57-4198-a180-9b07fc26dbfe.json @@ -95,7 +95,7 @@ }, "categories.1": { "links": { - "self": "../Category/38b5d1dc-00d3-4a19-8998-29f0c19081de" + "self": "../Category/travel-lifestyle" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/CardListing/2d838726-ed2c-437d-a171-eade2544ca66.json b/packages/catalog-realm/CardListing/2d838726-ed2c-437d-a171-eade2544ca66.json index 3327b9372b0..d4f5fb48f2f 100644 --- a/packages/catalog-realm/CardListing/2d838726-ed2c-437d-a171-eade2544ca66.json +++ b/packages/catalog-realm/CardListing/2d838726-ed2c-437d-a171-eade2544ca66.json @@ -24,7 +24,7 @@ "relationships": { "tags.0": { "links": { - "self": "../Tag/140feda8-625b-4a24-9ddb-6f4da891aef2" + "self": "../Tag/bundled" } }, "skills": { diff --git a/packages/catalog-realm/CardListing/358a08b8-9e03-4a39-a40b-539eb3e01622.json b/packages/catalog-realm/CardListing/358a08b8-9e03-4a39-a40b-539eb3e01622.json index 97fcc64c91b..fb86d420e30 100644 --- a/packages/catalog-realm/CardListing/358a08b8-9e03-4a39-a40b-539eb3e01622.json +++ b/packages/catalog-realm/CardListing/358a08b8-9e03-4a39-a40b-539eb3e01622.json @@ -28,7 +28,7 @@ }, "tags.0": { "links": { - "self": "../Tag/51de249c-516a-4c4d-bd88-76e88274c483" + "self": "../Tag/game" } }, "license": { diff --git a/packages/catalog-realm/CardListing/36de56b9-9ee7-4105-8f2c-497819d76da6.json b/packages/catalog-realm/CardListing/36de56b9-9ee7-4105-8f2c-497819d76da6.json index e640aa26866..a1b4b31bce7 100644 --- a/packages/catalog-realm/CardListing/36de56b9-9ee7-4105-8f2c-497819d76da6.json +++ b/packages/catalog-realm/CardListing/36de56b9-9ee7-4105-8f2c-497819d76da6.json @@ -30,12 +30,12 @@ }, "tags.0": { "links": { - "self": "../Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893" + "self": "../Tag/ai" } }, "tags.1": { "links": { - "self": "../Tag/c1fe433a-b3df-41f4-bdcf-d98686ee42d7" + "self": "../Tag/calculator" } }, "license": { @@ -170,7 +170,7 @@ }, "categories.0": { "links": { - "self": "../Category/38b5d1dc-00d3-4a19-8998-29f0c19081de" + "self": "../Category/travel-lifestyle" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/CardListing/49ea1457-ecc8-418d-9013-d74730b116e1.json b/packages/catalog-realm/CardListing/49ea1457-ecc8-418d-9013-d74730b116e1.json index 9b0efd3d919..ac3bcc7167e 100644 --- a/packages/catalog-realm/CardListing/49ea1457-ecc8-418d-9013-d74730b116e1.json +++ b/packages/catalog-realm/CardListing/49ea1457-ecc8-418d-9013-d74730b116e1.json @@ -29,12 +29,12 @@ }, "tags.0": { "links": { - "self": "../Tag/140feda8-625b-4a24-9ddb-6f4da891aef2" + "self": "../Tag/bundled" } }, "tags.1": { "links": { - "self": "../Tag/4d0f9ae2-048e-4ce0-b263-7006602ce6a4" + "self": "../Tag/user-contributed" } }, "license": { diff --git a/packages/catalog-realm/CardListing/4aca5509-09d5-4aec-aeba-1cd26628cca9.json b/packages/catalog-realm/CardListing/4aca5509-09d5-4aec-aeba-1cd26628cca9.json index 52f7624b776..35a6481968a 100644 --- a/packages/catalog-realm/CardListing/4aca5509-09d5-4aec-aeba-1cd26628cca9.json +++ b/packages/catalog-realm/CardListing/4aca5509-09d5-4aec-aeba-1cd26628cca9.json @@ -28,7 +28,7 @@ }, "tags.0": { "links": { - "self": "../Tag/c1fe433a-b3df-41f4-bdcf-d98686ee42d7" + "self": "../Tag/calculator" } }, "license": { diff --git a/packages/catalog-realm/CardListing/5b6c4561-ca61-4e38-aeb1-7d9f7ff9778e.json b/packages/catalog-realm/CardListing/5b6c4561-ca61-4e38-aeb1-7d9f7ff9778e.json index 44b1cdfc251..e961da67dab 100644 --- a/packages/catalog-realm/CardListing/5b6c4561-ca61-4e38-aeb1-7d9f7ff9778e.json +++ b/packages/catalog-realm/CardListing/5b6c4561-ca61-4e38-aeb1-7d9f7ff9778e.json @@ -88,7 +88,7 @@ }, "categories.1": { "links": { - "self": "../Category/38b5d1dc-00d3-4a19-8998-29f0c19081de" + "self": "../Category/travel-lifestyle" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/CardListing/61be974d-6254-4ddd-9917-d91fa165a536.json b/packages/catalog-realm/CardListing/61be974d-6254-4ddd-9917-d91fa165a536.json index c3dc8f1d3d3..c0580888da5 100644 --- a/packages/catalog-realm/CardListing/61be974d-6254-4ddd-9917-d91fa165a536.json +++ b/packages/catalog-realm/CardListing/61be974d-6254-4ddd-9917-d91fa165a536.json @@ -26,12 +26,12 @@ "relationships": { "tags.0": { "links": { - "self": "../Tag/51de249c-516a-4c4d-bd88-76e88274c483" + "self": "../Tag/game" } }, "tags.1": { "links": { - "self": "../Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893" + "self": "../Tag/ai" } }, "license": { diff --git a/packages/catalog-realm/CardListing/694bf025-0904-488d-af1b-2b88bbd8df43.json b/packages/catalog-realm/CardListing/694bf025-0904-488d-af1b-2b88bbd8df43.json index 6881e9bf012..443ece2a233 100644 --- a/packages/catalog-realm/CardListing/694bf025-0904-488d-af1b-2b88bbd8df43.json +++ b/packages/catalog-realm/CardListing/694bf025-0904-488d-af1b-2b88bbd8df43.json @@ -24,12 +24,12 @@ "relationships": { "tags.0": { "links": { - "self": "../Tag/51de249c-516a-4c4d-bd88-76e88274c483" + "self": "../Tag/game" } }, "tags.1": { "links": { - "self": "../Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893" + "self": "../Tag/ai" } }, "license": { diff --git a/packages/catalog-realm/CardListing/79937c95-92ec-4393-acbb-b1028b78defe.json b/packages/catalog-realm/CardListing/79937c95-92ec-4393-acbb-b1028b78defe.json index add063a6a33..ce907bcf3a1 100644 --- a/packages/catalog-realm/CardListing/79937c95-92ec-4393-acbb-b1028b78defe.json +++ b/packages/catalog-realm/CardListing/79937c95-92ec-4393-acbb-b1028b78defe.json @@ -29,12 +29,12 @@ }, "tags.0": { "links": { - "self": "../Tag/51de249c-516a-4c4d-bd88-76e88274c483" + "self": "../Tag/game" } }, "tags.1": { "links": { - "self": "../Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893" + "self": "../Tag/ai" } }, "license": { diff --git a/packages/catalog-realm/CardListing/8190ab54-5b6f-457b-8c87-43f09eabf757.json b/packages/catalog-realm/CardListing/8190ab54-5b6f-457b-8c87-43f09eabf757.json index 85646aab5ed..7d3857ebde0 100644 --- a/packages/catalog-realm/CardListing/8190ab54-5b6f-457b-8c87-43f09eabf757.json +++ b/packages/catalog-realm/CardListing/8190ab54-5b6f-457b-8c87-43f09eabf757.json @@ -30,7 +30,7 @@ }, "tags.0": { "links": { - "self": "../Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642" + "self": "../Tag/official" } }, "license": { diff --git a/packages/catalog-realm/CardListing/9b84fcb0-80f4-456e-9fb3-e9abd0ec3fcb.json b/packages/catalog-realm/CardListing/9b84fcb0-80f4-456e-9fb3-e9abd0ec3fcb.json index 709398895a4..a0a347330e2 100644 --- a/packages/catalog-realm/CardListing/9b84fcb0-80f4-456e-9fb3-e9abd0ec3fcb.json +++ b/packages/catalog-realm/CardListing/9b84fcb0-80f4-456e-9fb3-e9abd0ec3fcb.json @@ -80,7 +80,7 @@ }, "categories.0": { "links": { - "self": "../Category/38b5d1dc-00d3-4a19-8998-29f0c19081de" + "self": "../Category/travel-lifestyle" } }, "categories.1": { diff --git a/packages/catalog-realm/CardListing/9de5efec-83f7-42d3-9425-3a19e8a15fd2.json b/packages/catalog-realm/CardListing/9de5efec-83f7-42d3-9425-3a19e8a15fd2.json index eb88e46b794..ac2f13357ae 100644 --- a/packages/catalog-realm/CardListing/9de5efec-83f7-42d3-9425-3a19e8a15fd2.json +++ b/packages/catalog-realm/CardListing/9de5efec-83f7-42d3-9425-3a19e8a15fd2.json @@ -58,7 +58,7 @@ }, "categories.0": { "links": { - "self": "../Category/38b5d1dc-00d3-4a19-8998-29f0c19081de" + "self": "../Category/travel-lifestyle" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/CardListing/9ffcb030-9c5a-4d17-ace6-2ea83c6ae2d4.json b/packages/catalog-realm/CardListing/9ffcb030-9c5a-4d17-ace6-2ea83c6ae2d4.json index 618a26e619f..b4054d3b52d 100644 --- a/packages/catalog-realm/CardListing/9ffcb030-9c5a-4d17-ace6-2ea83c6ae2d4.json +++ b/packages/catalog-realm/CardListing/9ffcb030-9c5a-4d17-ace6-2ea83c6ae2d4.json @@ -29,7 +29,7 @@ }, "tags.0": { "links": { - "self": "../Tag/4d0f9ae2-048e-4ce0-b263-7006602ce6a4" + "self": "../Tag/user-contributed" } }, "license": { @@ -69,7 +69,7 @@ }, "categories.1": { "links": { - "self": "../Category/38b5d1dc-00d3-4a19-8998-29f0c19081de" + "self": "../Category/travel-lifestyle" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/CardListing/a487a65f-4356-42a1-9da0-c6e0be0166e4.json b/packages/catalog-realm/CardListing/a487a65f-4356-42a1-9da0-c6e0be0166e4.json index 662beb1cdcc..09d04dda407 100644 --- a/packages/catalog-realm/CardListing/a487a65f-4356-42a1-9da0-c6e0be0166e4.json +++ b/packages/catalog-realm/CardListing/a487a65f-4356-42a1-9da0-c6e0be0166e4.json @@ -29,7 +29,7 @@ }, "tags.0": { "links": { - "self": "../Tag/f21d95da-0728-46a8-8622-6c157716c26c" + "self": "../Tag/poster" } }, "license": { diff --git a/packages/catalog-realm/CardListing/a51b73a3-08c5-4dfd-b22a-8e66a0285801.json b/packages/catalog-realm/CardListing/a51b73a3-08c5-4dfd-b22a-8e66a0285801.json index af40bcb285b..255a41db0fa 100644 --- a/packages/catalog-realm/CardListing/a51b73a3-08c5-4dfd-b22a-8e66a0285801.json +++ b/packages/catalog-realm/CardListing/a51b73a3-08c5-4dfd-b22a-8e66a0285801.json @@ -28,7 +28,7 @@ }, "tags.0": { "links": { - "self": "../Tag/51de249c-516a-4c4d-bd88-76e88274c483" + "self": "../Tag/game" } }, "license": { diff --git a/packages/catalog-realm/CardListing/b920054b-0f48-440b-b50e-64a5a097e7a5.json b/packages/catalog-realm/CardListing/b920054b-0f48-440b-b50e-64a5a097e7a5.json index b79432ba536..8419ca10249 100644 --- a/packages/catalog-realm/CardListing/b920054b-0f48-440b-b50e-64a5a097e7a5.json +++ b/packages/catalog-realm/CardListing/b920054b-0f48-440b-b50e-64a5a097e7a5.json @@ -29,12 +29,12 @@ }, "tags.0": { "links": { - "self": "../Tag/51de249c-516a-4c4d-bd88-76e88274c483" + "self": "../Tag/game" } }, "tags.1": { "links": { - "self": "../Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893" + "self": "../Tag/ai" } }, "license": { diff --git a/packages/catalog-realm/CardListing/cbe2c79b-60aa-4dca-bc13-82b610e31653.json b/packages/catalog-realm/CardListing/cbe2c79b-60aa-4dca-bc13-82b610e31653.json index 1ea8c68f286..21d5c2fc02a 100644 --- a/packages/catalog-realm/CardListing/cbe2c79b-60aa-4dca-bc13-82b610e31653.json +++ b/packages/catalog-realm/CardListing/cbe2c79b-60aa-4dca-bc13-82b610e31653.json @@ -25,7 +25,7 @@ "relationships": { "tags.0": { "links": { - "self": "../Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893" + "self": "../Tag/ai" } }, "license": { diff --git a/packages/catalog-realm/CardListing/d5208656-b610-4ad5-81f8-cbd7d512493a.json b/packages/catalog-realm/CardListing/d5208656-b610-4ad5-81f8-cbd7d512493a.json index 55b04f5465e..aeb017d011c 100644 --- a/packages/catalog-realm/CardListing/d5208656-b610-4ad5-81f8-cbd7d512493a.json +++ b/packages/catalog-realm/CardListing/d5208656-b610-4ad5-81f8-cbd7d512493a.json @@ -30,12 +30,12 @@ }, "tags.0": { "links": { - "self": "../Tag/4d0f9ae2-048e-4ce0-b263-7006602ce6a4" + "self": "../Tag/user-contributed" } }, "tags.1": { "links": { - "self": "../Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642" + "self": "../Tag/official" } }, "license": { diff --git a/packages/catalog-realm/CardListing/daily-report-dashboard.json b/packages/catalog-realm/CardListing/daily-report-dashboard.json index 90cfd648bb4..fa7a913b0e5 100644 --- a/packages/catalog-realm/CardListing/daily-report-dashboard.json +++ b/packages/catalog-realm/CardListing/daily-report-dashboard.json @@ -23,12 +23,12 @@ "relationships": { "tags.0": { "links": { - "self": "../Tag/140feda8-625b-4a24-9ddb-6f4da891aef2" + "self": "../Tag/bundled" } }, "tags.1": { "links": { - "self": "../Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893" + "self": "../Tag/ai" } }, "license": { diff --git a/packages/catalog-realm/CardListing/e7fe0e9a-f6ce-40f7-bf63-02157530cae1.json b/packages/catalog-realm/CardListing/e7fe0e9a-f6ce-40f7-bf63-02157530cae1.json index eb24ebd3524..9657f30afeb 100644 --- a/packages/catalog-realm/CardListing/e7fe0e9a-f6ce-40f7-bf63-02157530cae1.json +++ b/packages/catalog-realm/CardListing/e7fe0e9a-f6ce-40f7-bf63-02157530cae1.json @@ -28,7 +28,7 @@ }, "tags.0": { "links": { - "self": "../Tag/4d0f9ae2-048e-4ce0-b263-7006602ce6a4" + "self": "../Tag/user-contributed" } }, "license": { @@ -68,7 +68,7 @@ }, "categories.1": { "links": { - "self": "../Category/38b5d1dc-00d3-4a19-8998-29f0c19081de" + "self": "../Category/travel-lifestyle" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/CardListing/ef22ef9b-d7f6-4593-8bec-e2cc283103ec.json b/packages/catalog-realm/CardListing/ef22ef9b-d7f6-4593-8bec-e2cc283103ec.json index b1b8a1b5f85..c30160cbae5 100644 --- a/packages/catalog-realm/CardListing/ef22ef9b-d7f6-4593-8bec-e2cc283103ec.json +++ b/packages/catalog-realm/CardListing/ef22ef9b-d7f6-4593-8bec-e2cc283103ec.json @@ -30,7 +30,7 @@ }, "tags.0": { "links": { - "self": "../Tag/140feda8-625b-4a24-9ddb-6f4da891aef2" + "self": "../Tag/bundled" } }, "license": { diff --git a/packages/catalog-realm/CardListing/f0277f2a-26af-4e25-8222-6d6492bc08f6.json b/packages/catalog-realm/CardListing/f0277f2a-26af-4e25-8222-6d6492bc08f6.json index a68ff1c620f..af98f59bbc2 100644 --- a/packages/catalog-realm/CardListing/f0277f2a-26af-4e25-8222-6d6492bc08f6.json +++ b/packages/catalog-realm/CardListing/f0277f2a-26af-4e25-8222-6d6492bc08f6.json @@ -29,12 +29,12 @@ }, "tags.0": { "links": { - "self": "../Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642" + "self": "../Tag/official" } }, "tags.1": { "links": { - "self": "../Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893" + "self": "../Tag/ai" } }, "license": { diff --git a/packages/catalog-realm/CardListing/f0c0ad91-0194-46b9-a971-9e60d637a51a.json b/packages/catalog-realm/CardListing/f0c0ad91-0194-46b9-a971-9e60d637a51a.json index eef8f2f8794..62f6a87732d 100644 --- a/packages/catalog-realm/CardListing/f0c0ad91-0194-46b9-a971-9e60d637a51a.json +++ b/packages/catalog-realm/CardListing/f0c0ad91-0194-46b9-a971-9e60d637a51a.json @@ -29,7 +29,7 @@ }, "tags.0": { "links": { - "self": "../Tag/140feda8-625b-4a24-9ddb-6f4da891aef2" + "self": "../Tag/bundled" } }, "license": { diff --git a/packages/catalog-realm/Category/accounting-finance.json b/packages/catalog-realm/Category/accounting-finance.json index e89902e12e8..6e6713c39b3 100644 --- a/packages/catalog-realm/Category/accounting-finance.json +++ b/packages/catalog-realm/Category/accounting-finance.json @@ -11,7 +11,7 @@ "name": "Accounting & Finance", "cardInfo": { "notes": null, - "name": null, + "name": "Accounting & Finance", "summary": "Financial management, bookkeeping, budgeting, invoicing, tax preparation, audit reports, and financial planning tools.", "cardThumbnailURL": null } @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee" + "self": "../Sphere/work" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/adventure-outdoor-activities.json b/packages/catalog-realm/Category/adventure-outdoor-activities.json index 6404fdd8920..218b847599c 100644 --- a/packages/catalog-realm/Category/adventure-outdoor-activities.json +++ b/packages/catalog-realm/Category/adventure-outdoor-activities.json @@ -11,7 +11,7 @@ "name": "Adventure & Outdoor Activities", "cardInfo": { "notes": null, - "name": null, + "name": "Adventure & Outdoor Activities", "summary": "Outdoor adventures, nature exploration, camping trips, hiking expeditions, extreme sports, and outdoor equipment management.", "cardThumbnailURL": null } @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/c8f6891d-9570-40c0-9e07-b14c97eedb48" + "self": "../Sphere/play" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/ai-automation.json b/packages/catalog-realm/Category/ai-automation.json index aff930d1e38..de6195b021a 100644 --- a/packages/catalog-realm/Category/ai-automation.json +++ b/packages/catalog-realm/Category/ai-automation.json @@ -11,7 +11,7 @@ "name": "AI & Automation", "cardInfo": { "notes": null, - "name": null, + "name": "AI & Automation", "summary": "Artificial intelligence projects, automation scripts, machine learning workflows, and intelligent system development.", "cardThumbnailURL": null } @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb" + "self": "../Sphere/build" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/analytics-reporting.json b/packages/catalog-realm/Category/analytics-reporting.json index a178452fd9f..2d7b91c7057 100644 --- a/packages/catalog-realm/Category/analytics-reporting.json +++ b/packages/catalog-realm/Category/analytics-reporting.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee" + "self": "../Sphere/work" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/api-integration.json b/packages/catalog-realm/Category/api-integration.json index c9c022b14ca..7cbed998af7 100644 --- a/packages/catalog-realm/Category/api-integration.json +++ b/packages/catalog-realm/Category/api-integration.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb" + "self": "../Sphere/build" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/business-development.json b/packages/catalog-realm/Category/business-development.json index dfc2f4c517f..f7c29706c63 100644 --- a/packages/catalog-realm/Category/business-development.json +++ b/packages/catalog-realm/Category/business-development.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee" + "self": "../Sphere/work" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/career-development.json b/packages/catalog-realm/Category/career-development.json index 6fc366078fd..2d8ab3a3676 100644 --- a/packages/catalog-realm/Category/career-development.json +++ b/packages/catalog-realm/Category/career-development.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/67ffc7a9-70d6-4cd3-93f0-b32a8fbbd34e" + "self": "../Sphere/learn" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/certifications-training.json b/packages/catalog-realm/Category/certifications-training.json index f982bfdbfba..141adeec481 100644 --- a/packages/catalog-realm/Category/certifications-training.json +++ b/packages/catalog-realm/Category/certifications-training.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/67ffc7a9-70d6-4cd3-93f0-b32a8fbbd34e" + "self": "../Sphere/learn" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/communication.json b/packages/catalog-realm/Category/communication.json new file mode 100644 index 00000000000..474c34fd3ef --- /dev/null +++ b/packages/catalog-realm/Category/communication.json @@ -0,0 +1,32 @@ +{ + "data": { + "meta": { + "adoptsFrom": { + "name": "Category", + "module": "../catalog-app/listing/category" + } + }, + "type": "card", + "attributes": { + "name": "Communication", + "cardInfo": { + "name": "Communication", + "notes": null, + "summary": "Email management, messaging, chat apps, notifications, team collaboration, and communication workflow tools.", + "cardThumbnailURL": null + } + }, + "relationships": { + "sphere": { + "links": { + "self": "../Sphere/work" + } + }, + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} \ No newline at end of file diff --git a/packages/catalog-realm/Category/content-creation.json b/packages/catalog-realm/Category/content-creation.json index 13c62bd2cf5..bf52124c2b9 100644 --- a/packages/catalog-realm/Category/content-creation.json +++ b/packages/catalog-realm/Category/content-creation.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/c8f6891d-9570-40c0-9e07-b14c97eedb48" + "self": "../Sphere/play" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/creative-projects.json b/packages/catalog-realm/Category/creative-projects.json index c2f3ba850df..125dfba2998 100644 --- a/packages/catalog-realm/Category/creative-projects.json +++ b/packages/catalog-realm/Category/creative-projects.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/c8f6891d-9570-40c0-9e07-b14c97eedb48" + "self": "../Sphere/play" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/customer-support.json b/packages/catalog-realm/Category/customer-support.json index 263df2966dd..16b6aa24ca4 100644 --- a/packages/catalog-realm/Category/customer-support.json +++ b/packages/catalog-realm/Category/customer-support.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee" + "self": "../Sphere/work" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/data-analytics.json b/packages/catalog-realm/Category/data-analytics.json index 6a429321174..872e18fa3c5 100644 --- a/packages/catalog-realm/Category/data-analytics.json +++ b/packages/catalog-realm/Category/data-analytics.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb" + "self": "../Sphere/build" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/data-engineering.json b/packages/catalog-realm/Category/data-engineering.json index 5764be1b152..f1bb06a18b3 100644 --- a/packages/catalog-realm/Category/data-engineering.json +++ b/packages/catalog-realm/Category/data-engineering.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb" + "self": "../Sphere/build" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/data-management.json b/packages/catalog-realm/Category/data-management.json index abbf2603272..4b5d0999d8a 100644 --- a/packages/catalog-realm/Category/data-management.json +++ b/packages/catalog-realm/Category/data-management.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb" + "self": "../Sphere/build" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/design-creative.json b/packages/catalog-realm/Category/design-creative.json index b798063f979..dd51bfde161 100644 --- a/packages/catalog-realm/Category/design-creative.json +++ b/packages/catalog-realm/Category/design-creative.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb" + "self": "../Sphere/build" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/developer-tools-code.json b/packages/catalog-realm/Category/developer-tools-code.json index 43e76ef9e22..ffa9ea3f533 100644 --- a/packages/catalog-realm/Category/developer-tools-code.json +++ b/packages/catalog-realm/Category/developer-tools-code.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb" + "self": "../Sphere/build" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/devops-infrastructure.json b/packages/catalog-realm/Category/devops-infrastructure.json index a992bf19bdc..c3d44017e92 100644 --- a/packages/catalog-realm/Category/devops-infrastructure.json +++ b/packages/catalog-realm/Category/devops-infrastructure.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb" + "self": "../Sphere/build" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/e-commerce-online-sales.json b/packages/catalog-realm/Category/e-commerce-online-sales.json index 3bc7e5d44cd..94488189896 100644 --- a/packages/catalog-realm/Category/e-commerce-online-sales.json +++ b/packages/catalog-realm/Category/e-commerce-online-sales.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee" + "self": "../Sphere/work" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/education-courses.json b/packages/catalog-realm/Category/education-courses.json index 6765d38bfb0..0ef8e97a7d8 100644 --- a/packages/catalog-realm/Category/education-courses.json +++ b/packages/catalog-realm/Category/education-courses.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/67ffc7a9-70d6-4cd3-93f0-b32a8fbbd34e" + "self": "../Sphere/learn" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/entertainment-media.json b/packages/catalog-realm/Category/entertainment-media.json index d19f4045f6d..4a9b77cd2ec 100644 --- a/packages/catalog-realm/Category/entertainment-media.json +++ b/packages/catalog-realm/Category/entertainment-media.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/c8f6891d-9570-40c0-9e07-b14c97eedb48" + "self": "../Sphere/play" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/events-celebrations.json b/packages/catalog-realm/Category/events-celebrations.json index c7ed03b0b9b..e7110fba8b4 100644 --- a/packages/catalog-realm/Category/events-celebrations.json +++ b/packages/catalog-realm/Category/events-celebrations.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/5d7420dc-c8f6-491d-9570-60c01e07b14c" + "self": "../Sphere/life" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/family-relationships.json b/packages/catalog-realm/Category/family-relationships.json index 74c436d71b7..7f47497cdeb 100644 --- a/packages/catalog-realm/Category/family-relationships.json +++ b/packages/catalog-realm/Category/family-relationships.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/5d7420dc-c8f6-491d-9570-60c01e07b14c" + "self": "../Sphere/life" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/food-cooking.json b/packages/catalog-realm/Category/food-cooking.json new file mode 100644 index 00000000000..3c0a3561bac --- /dev/null +++ b/packages/catalog-realm/Category/food-cooking.json @@ -0,0 +1,32 @@ +{ + "data": { + "meta": { + "adoptsFrom": { + "name": "Category", + "module": "../catalog-app/listing/category" + } + }, + "type": "card", + "attributes": { + "name": "Food & Cooking", + "cardInfo": { + "name": "Food & Cooking", + "notes": null, + "summary": "Recipes, meal planning, grocery lists, restaurant tracking, cooking guides, nutrition tracking, and food discovery.", + "cardThumbnailURL": null + } + }, + "relationships": { + "sphere": { + "links": { + "self": "../Sphere/life" + } + }, + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} \ No newline at end of file diff --git a/packages/catalog-realm/Category/gaming.json b/packages/catalog-realm/Category/gaming.json new file mode 100644 index 00000000000..de84081e206 --- /dev/null +++ b/packages/catalog-realm/Category/gaming.json @@ -0,0 +1,32 @@ +{ + "data": { + "meta": { + "adoptsFrom": { + "name": "Category", + "module": "../catalog-app/listing/category" + } + }, + "type": "card", + "attributes": { + "name": "Gaming", + "cardInfo": { + "name": "Gaming", + "notes": null, + "summary": "Game trackers, scoreboards, walkthroughs, gaming communities, achievement logs, and game collection management.", + "cardThumbnailURL": null + } + }, + "relationships": { + "sphere": { + "links": { + "self": "../Sphere/play" + } + }, + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} \ No newline at end of file diff --git a/packages/catalog-realm/Category/goals-habits.json b/packages/catalog-realm/Category/goals-habits.json index 4ee4ddd68da..1835c3153e1 100644 --- a/packages/catalog-realm/Category/goals-habits.json +++ b/packages/catalog-realm/Category/goals-habits.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/5d7420dc-c8f6-491d-9570-60c01e07b14c" + "self": "../Sphere/life" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/hardware-iot.json b/packages/catalog-realm/Category/hardware-iot.json index 0e820c659c5..91286d44821 100644 --- a/packages/catalog-realm/Category/hardware-iot.json +++ b/packages/catalog-realm/Category/hardware-iot.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb" + "self": "../Sphere/build" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/health-wellness.json b/packages/catalog-realm/Category/health-wellness.json index c2ebe1d9165..c62d5b96f40 100644 --- a/packages/catalog-realm/Category/health-wellness.json +++ b/packages/catalog-realm/Category/health-wellness.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/5d7420dc-c8f6-491d-9570-60c01e07b14c" + "self": "../Sphere/life" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/hobbies-crafts.json b/packages/catalog-realm/Category/hobbies-crafts.json index f306e00e783..89be52040f0 100644 --- a/packages/catalog-realm/Category/hobbies-crafts.json +++ b/packages/catalog-realm/Category/hobbies-crafts.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/c8f6891d-9570-40c0-9e07-b14c97eedb48" + "self": "../Sphere/play" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/home-living.json b/packages/catalog-realm/Category/home-living.json index 143b688506f..e88dc77ceb8 100644 --- a/packages/catalog-realm/Category/home-living.json +++ b/packages/catalog-realm/Category/home-living.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/5d7420dc-c8f6-491d-9570-60c01e07b14c" + "self": "../Sphere/life" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/hr-people-management.json b/packages/catalog-realm/Category/hr-people-management.json index 0f689a156bb..e6534ff6956 100644 --- a/packages/catalog-realm/Category/hr-people-management.json +++ b/packages/catalog-realm/Category/hr-people-management.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee" + "self": "../Sphere/work" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/knowledge-management.json b/packages/catalog-realm/Category/knowledge-management.json index 46ac4f0878c..e41297e789f 100644 --- a/packages/catalog-realm/Category/knowledge-management.json +++ b/packages/catalog-realm/Category/knowledge-management.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/67ffc7a9-70d6-4cd3-93f0-b32a8fbbd34e" + "self": "../Sphere/learn" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/language-learning.json b/packages/catalog-realm/Category/language-learning.json index f5f47594dcb..636271ac801 100644 --- a/packages/catalog-realm/Category/language-learning.json +++ b/packages/catalog-realm/Category/language-learning.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/67ffc7a9-70d6-4cd3-93f0-b32a8fbbd34e" + "self": "../Sphere/learn" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/legal-compliance.json b/packages/catalog-realm/Category/legal-compliance.json index 10bc329003c..abbc3a209e2 100644 --- a/packages/catalog-realm/Category/legal-compliance.json +++ b/packages/catalog-realm/Category/legal-compliance.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee" + "self": "../Sphere/work" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/maps-navigation.json b/packages/catalog-realm/Category/maps-navigation.json new file mode 100644 index 00000000000..4f7dd041066 --- /dev/null +++ b/packages/catalog-realm/Category/maps-navigation.json @@ -0,0 +1,32 @@ +{ + "data": { + "meta": { + "adoptsFrom": { + "name": "Category", + "module": "../catalog-app/listing/category" + } + }, + "type": "card", + "attributes": { + "name": "Maps & Navigation", + "cardInfo": { + "name": "Maps & Navigation", + "notes": null, + "summary": "Location-based apps, route planning, geo-tracking, place discovery, address management, and mapping tools.", + "cardThumbnailURL": null + } + }, + "relationships": { + "sphere": { + "links": { + "self": "../Sphere/life" + } + }, + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} \ No newline at end of file diff --git a/packages/catalog-realm/Category/marketing-growth.json b/packages/catalog-realm/Category/marketing-growth.json index c794070df04..f5008771343 100644 --- a/packages/catalog-realm/Category/marketing-growth.json +++ b/packages/catalog-realm/Category/marketing-growth.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee" + "self": "../Sphere/work" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/news-media.json b/packages/catalog-realm/Category/news-media.json new file mode 100644 index 00000000000..4700b32071e --- /dev/null +++ b/packages/catalog-realm/Category/news-media.json @@ -0,0 +1,32 @@ +{ + "data": { + "meta": { + "adoptsFrom": { + "name": "Category", + "module": "../catalog-app/listing/category" + } + }, + "type": "card", + "attributes": { + "name": "News & Media", + "cardInfo": { + "name": "News & Media", + "notes": null, + "summary": "News readers, RSS feeds, media trackers, journalism tools, newsletters, podcasts, and broadcast management.", + "cardThumbnailURL": null + } + }, + "relationships": { + "sphere": { + "links": { + "self": "../Sphere/life" + } + }, + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} \ No newline at end of file diff --git a/packages/catalog-realm/Category/operations-supply-chain.json b/packages/catalog-realm/Category/operations-supply-chain.json index 1c2ae80f165..2a5a22db55d 100644 --- a/packages/catalog-realm/Category/operations-supply-chain.json +++ b/packages/catalog-realm/Category/operations-supply-chain.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee" + "self": "../Sphere/work" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/parties-celebrations.json b/packages/catalog-realm/Category/parties-celebrations.json index 572133161b9..15720902e72 100644 --- a/packages/catalog-realm/Category/parties-celebrations.json +++ b/packages/catalog-realm/Category/parties-celebrations.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/c8f6891d-9570-40c0-9e07-b14c97eedb48" + "self": "../Sphere/play" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/personal-finance.json b/packages/catalog-realm/Category/personal-finance.json index 0de1df8c934..011b1ad9258 100644 --- a/packages/catalog-realm/Category/personal-finance.json +++ b/packages/catalog-realm/Category/personal-finance.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/5d7420dc-c8f6-491d-9570-60c01e07b14c" + "self": "../Sphere/life" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/product-catalogs.json b/packages/catalog-realm/Category/product-catalogs.json index 238cc7406c4..fdd1ae98521 100644 --- a/packages/catalog-realm/Category/product-catalogs.json +++ b/packages/catalog-realm/Category/product-catalogs.json @@ -11,15 +11,15 @@ "name": "Product Catalogs", "cardInfo": { "notes": null, - "name": null, - "summary": null, + "name": "Product Catalogs", + "summary": "Product listings, inventory catalogs, digital product stores, merchandise catalogs, and product collection management.", "cardThumbnailURL": null } }, "relationships": { "sphere": { "links": { - "self": "../Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee" + "self": "../Sphere/work" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/professional-services.json b/packages/catalog-realm/Category/professional-services.json index 20b262120fc..a919446bb7d 100644 --- a/packages/catalog-realm/Category/professional-services.json +++ b/packages/catalog-realm/Category/professional-services.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee" + "self": "../Sphere/work" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/project-management.json b/packages/catalog-realm/Category/project-management.json index ad2affd2f3b..af917fedb50 100644 --- a/packages/catalog-realm/Category/project-management.json +++ b/packages/catalog-realm/Category/project-management.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee" + "self": "../Sphere/work" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/prototyping-experiments.json b/packages/catalog-realm/Category/prototyping-experiments.json index d40cbd0e6d3..0064e2490d8 100644 --- a/packages/catalog-realm/Category/prototyping-experiments.json +++ b/packages/catalog-realm/Category/prototyping-experiments.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb" + "self": "../Sphere/build" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/quality-assurance.json b/packages/catalog-realm/Category/quality-assurance.json index ed8f6ef68a1..f848696e364 100644 --- a/packages/catalog-realm/Category/quality-assurance.json +++ b/packages/catalog-realm/Category/quality-assurance.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee" + "self": "../Sphere/work" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/reading-literature.json b/packages/catalog-realm/Category/reading-literature.json index 990058fdc74..2cceffd828e 100644 --- a/packages/catalog-realm/Category/reading-literature.json +++ b/packages/catalog-realm/Category/reading-literature.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/67ffc7a9-70d6-4cd3-93f0-b32a8fbbd34e" + "self": "../Sphere/learn" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/real-estate-property.json b/packages/catalog-realm/Category/real-estate-property.json index 76c06a3a165..74fed7c5e80 100644 --- a/packages/catalog-realm/Category/real-estate-property.json +++ b/packages/catalog-realm/Category/real-estate-property.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee" + "self": "../Sphere/work" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/research-knowledge.json b/packages/catalog-realm/Category/research-knowledge.json index ab464aa7e2c..eb0b955a18f 100644 --- a/packages/catalog-realm/Category/research-knowledge.json +++ b/packages/catalog-realm/Category/research-knowledge.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/67ffc7a9-70d6-4cd3-93f0-b32a8fbbd34e" + "self": "../Sphere/learn" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/science-discovery.json b/packages/catalog-realm/Category/science-discovery.json index f8f8f1770f5..a918cbd72fd 100644 --- a/packages/catalog-realm/Category/science-discovery.json +++ b/packages/catalog-realm/Category/science-discovery.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/67ffc7a9-70d6-4cd3-93f0-b32a8fbbd34e" + "self": "../Sphere/learn" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/security-privacy.json b/packages/catalog-realm/Category/security-privacy.json new file mode 100644 index 00000000000..d8fc6bdee45 --- /dev/null +++ b/packages/catalog-realm/Category/security-privacy.json @@ -0,0 +1,32 @@ +{ + "data": { + "meta": { + "adoptsFrom": { + "name": "Category", + "module": "../catalog-app/listing/category" + } + }, + "type": "card", + "attributes": { + "name": "Security & Privacy", + "cardInfo": { + "name": "Security & Privacy", + "notes": null, + "summary": "Password managers, security audits, privacy tools, access control, vulnerability tracking, and compliance checklists.", + "cardThumbnailURL": null + } + }, + "relationships": { + "sphere": { + "links": { + "self": "../Sphere/build" + } + }, + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} \ No newline at end of file diff --git a/packages/catalog-realm/Category/shopping-consumer.json b/packages/catalog-realm/Category/shopping-consumer.json index d2a0b2e2690..754bc7df76f 100644 --- a/packages/catalog-realm/Category/shopping-consumer.json +++ b/packages/catalog-realm/Category/shopping-consumer.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/5d7420dc-c8f6-491d-9570-60c01e07b14c" + "self": "../Sphere/life" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/skills-training.json b/packages/catalog-realm/Category/skills-training.json index 15589e32033..e9c86f3dc50 100644 --- a/packages/catalog-realm/Category/skills-training.json +++ b/packages/catalog-realm/Category/skills-training.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/67ffc7a9-70d6-4cd3-93f0-b32a8fbbd34e" + "self": "../Sphere/learn" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/social-networking.json b/packages/catalog-realm/Category/social-networking.json index 5cde4806496..d2187c28d20 100644 --- a/packages/catalog-realm/Category/social-networking.json +++ b/packages/catalog-realm/Category/social-networking.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb" + "self": "../Sphere/build" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/software-development.json b/packages/catalog-realm/Category/software-development.json index 4bc317a3488..0d0f86651e2 100644 --- a/packages/catalog-realm/Category/software-development.json +++ b/packages/catalog-realm/Category/software-development.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb" + "self": "../Sphere/build" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/sports-fitness.json b/packages/catalog-realm/Category/sports-fitness.json index d3084fd0502..058b248ba7c 100644 --- a/packages/catalog-realm/Category/sports-fitness.json +++ b/packages/catalog-realm/Category/sports-fitness.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/c8f6891d-9570-40c0-9e07-b14c97eedb48" + "self": "../Sphere/play" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/teaching-instruction.json b/packages/catalog-realm/Category/teaching-instruction.json index 6b5325a231e..de629b565e6 100644 --- a/packages/catalog-realm/Category/teaching-instruction.json +++ b/packages/catalog-realm/Category/teaching-instruction.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/67ffc7a9-70d6-4cd3-93f0-b32a8fbbd34e" + "self": "../Sphere/learn" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/technical-documentation.json b/packages/catalog-realm/Category/technical-documentation.json index 1bb88d46e12..f39a48c5ac5 100644 --- a/packages/catalog-realm/Category/technical-documentation.json +++ b/packages/catalog-realm/Category/technical-documentation.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/67ffc7a9-70d6-4cd3-93f0-b32a8fbbd34e" + "self": "../Sphere/learn" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/travel-experiences.json b/packages/catalog-realm/Category/travel-experiences.json index 85707cb878e..ac14ad6a028 100644 --- a/packages/catalog-realm/Category/travel-experiences.json +++ b/packages/catalog-realm/Category/travel-experiences.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/5d7420dc-c8f6-491d-9570-60c01e07b14c" + "self": "../Sphere/life" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/38b5d1dc-00d3-4a19-8998-29f0c19081de.json b/packages/catalog-realm/Category/travel-lifestyle.json similarity index 68% rename from packages/catalog-realm/Category/38b5d1dc-00d3-4a19-8998-29f0c19081de.json rename to packages/catalog-realm/Category/travel-lifestyle.json index 1fb1afe4c6d..4acf161b372 100644 --- a/packages/catalog-realm/Category/38b5d1dc-00d3-4a19-8998-29f0c19081de.json +++ b/packages/catalog-realm/Category/travel-lifestyle.json @@ -10,16 +10,16 @@ "attributes": { "name": "Travel and Lifestyle", "cardInfo": { - "name": null, + "name": "Travel and Lifestyle", "notes": null, - "summary": null, + "summary": "Travel planning, destination guides, cultural experiences, accommodation booking, travel itineraries, and vacation activities.", "cardThumbnailURL": null } }, "relationships": { "sphere": { "links": { - "self": "../Sphere/5d7420dc-c8f6-491d-9570-60c01e07b14c" + "self": "../Sphere/life" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/ui-components-design.json b/packages/catalog-realm/Category/ui-components-design.json index 8d615b2c255..0df5b924111 100644 --- a/packages/catalog-realm/Category/ui-components-design.json +++ b/packages/catalog-realm/Category/ui-components-design.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb" + "self": "../Sphere/build" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/video-games-interactive.json b/packages/catalog-realm/Category/video-games-interactive.json index 97de0f0efba..99323f659a5 100644 --- a/packages/catalog-realm/Category/video-games-interactive.json +++ b/packages/catalog-realm/Category/video-games-interactive.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/c8f6891d-9570-40c0-9e07-b14c97eedb48" + "self": "../Sphere/play" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/Category/web-development.json b/packages/catalog-realm/Category/web-development.json index a9b469617bb..d13168e4b3a 100644 --- a/packages/catalog-realm/Category/web-development.json +++ b/packages/catalog-realm/Category/web-development.json @@ -19,7 +19,7 @@ "relationships": { "sphere": { "links": { - "self": "../Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb" + "self": "../Sphere/build" } }, "cardInfo.theme": { diff --git a/packages/catalog-realm/FieldListing/fb9494c4-0d61-4d2d-a6c0-7b16ca40b42b.json b/packages/catalog-realm/FieldListing/fb9494c4-0d61-4d2d-a6c0-7b16ca40b42b.json index b051a9e6247..c19ea85f062 100644 --- a/packages/catalog-realm/FieldListing/fb9494c4-0d61-4d2d-a6c0-7b16ca40b42b.json +++ b/packages/catalog-realm/FieldListing/fb9494c4-0d61-4d2d-a6c0-7b16ca40b42b.json @@ -29,7 +29,7 @@ }, "tags.0": { "links": { - "self": "../Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642" + "self": "../Tag/official" } }, "license": { diff --git a/packages/catalog-realm/FieldListing/geo-point.json b/packages/catalog-realm/FieldListing/geo-point.json index aebe62c7a4d..7766d037e50 100644 --- a/packages/catalog-realm/FieldListing/geo-point.json +++ b/packages/catalog-realm/FieldListing/geo-point.json @@ -59,7 +59,7 @@ }, "categories.0": { "links": { - "self": "../Category/38b5d1dc-00d3-4a19-8998-29f0c19081de" + "self": "../Category/travel-lifestyle" } }, "categories.1": { diff --git a/packages/catalog-realm/FieldListing/geo-search-point.json b/packages/catalog-realm/FieldListing/geo-search-point.json index 70b4f8d5778..ed1a0ba959b 100644 --- a/packages/catalog-realm/FieldListing/geo-search-point.json +++ b/packages/catalog-realm/FieldListing/geo-search-point.json @@ -73,7 +73,7 @@ }, "categories.1": { "links": { - "self": "../Category/38b5d1dc-00d3-4a19-8998-29f0c19081de" + "self": "../Category/travel-lifestyle" } }, "categories.2": { diff --git a/packages/catalog-realm/SkillListing/cursor-coding.json b/packages/catalog-realm/SkillListing/cursor-coding.json index 38016d61023..1bc08819510 100644 --- a/packages/catalog-realm/SkillListing/cursor-coding.json +++ b/packages/catalog-realm/SkillListing/cursor-coding.json @@ -28,12 +28,12 @@ }, "tags.0": { "links": { - "self": "../Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893" + "self": "../Tag/ai" } }, "tags.1": { "links": { - "self": "../Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642" + "self": "../Tag/official" } }, "license": { diff --git a/packages/catalog-realm/SkillListing/talk-like-a-pirate.json b/packages/catalog-realm/SkillListing/talk-like-a-pirate.json index c02c6ff7ada..e550bd0eea7 100644 --- a/packages/catalog-realm/SkillListing/talk-like-a-pirate.json +++ b/packages/catalog-realm/SkillListing/talk-like-a-pirate.json @@ -28,12 +28,12 @@ }, "tags.0": { "links": { - "self": "../Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893" + "self": "../Tag/ai" } }, "tags.1": { "links": { - "self": "../Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642" + "self": "../Tag/official" } }, "license": { diff --git a/packages/catalog-realm/Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb.json b/packages/catalog-realm/Sphere/build.json similarity index 100% rename from packages/catalog-realm/Sphere/637767ff-c7a9-40d6-9cd3-93f0b32a8fbb.json rename to packages/catalog-realm/Sphere/build.json diff --git a/packages/catalog-realm/Sphere/67ffc7a9-70d6-4cd3-93f0-b32a8fbbd34e.json b/packages/catalog-realm/Sphere/learn.json similarity index 100% rename from packages/catalog-realm/Sphere/67ffc7a9-70d6-4cd3-93f0-b32a8fbbd34e.json rename to packages/catalog-realm/Sphere/learn.json diff --git a/packages/catalog-realm/Sphere/5d7420dc-c8f6-491d-9570-60c01e07b14c.json b/packages/catalog-realm/Sphere/life.json similarity index 100% rename from packages/catalog-realm/Sphere/5d7420dc-c8f6-491d-9570-60c01e07b14c.json rename to packages/catalog-realm/Sphere/life.json diff --git a/packages/catalog-realm/Sphere/c8f6891d-9570-40c0-9e07-b14c97eedb48.json b/packages/catalog-realm/Sphere/play.json similarity index 100% rename from packages/catalog-realm/Sphere/c8f6891d-9570-40c0-9e07-b14c97eedb48.json rename to packages/catalog-realm/Sphere/play.json diff --git a/packages/catalog-realm/Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee.json b/packages/catalog-realm/Sphere/work.json similarity index 100% rename from packages/catalog-realm/Sphere/20dcc8f6-891d-4570-a0c0-1e07b14c97ee.json rename to packages/catalog-realm/Sphere/work.json diff --git a/packages/catalog-realm/Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893.json b/packages/catalog-realm/Tag/ai.json similarity index 92% rename from packages/catalog-realm/Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893.json rename to packages/catalog-realm/Tag/ai.json index 159488e985a..77ed0b776ef 100644 --- a/packages/catalog-realm/Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893.json +++ b/packages/catalog-realm/Tag/ai.json @@ -3,10 +3,10 @@ "type": "card", "attributes": { "name": "Ai", - "color": "#6638ff", + "color": "#F97316", "cardInfo": { "notes": null, - "name": null, + "name": "AI", "summary": "Cards and apps that use artificial intelligence or machine learning, including LLM-powered features, smart automation, and AI-assisted workflows.", "cardThumbnailURL": null } diff --git a/packages/catalog-realm/Tag/app.json b/packages/catalog-realm/Tag/app.json new file mode 100644 index 00000000000..46a1c2fd7a5 --- /dev/null +++ b/packages/catalog-realm/Tag/app.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "meta": { + "adoptsFrom": { + "name": "Tag", + "module": "../catalog-app/listing/tag" + } + }, + "attributes": { + "name": "app", + "color": "#10B981", + "cardInfo": { + "name": "app", + "summary": "Full applications such as news readers, todo apps, CRMs, and other multi-feature tools.", + "cardThumbnailURL": null, + "notes": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} diff --git a/packages/catalog-realm/Tag/140feda8-625b-4a24-9ddb-6f4da891aef2.json b/packages/catalog-realm/Tag/bundled.json similarity index 91% rename from packages/catalog-realm/Tag/140feda8-625b-4a24-9ddb-6f4da891aef2.json rename to packages/catalog-realm/Tag/bundled.json index 1b4d748440f..a463fe780d7 100644 --- a/packages/catalog-realm/Tag/140feda8-625b-4a24-9ddb-6f4da891aef2.json +++ b/packages/catalog-realm/Tag/bundled.json @@ -3,10 +3,10 @@ "type": "card", "attributes": { "name": "Bundled", - "color": "#0069f9", + "color": "#F97316", "cardInfo": { "notes": null, - "name": null, + "name": "Bundled", "summary": "Cards or apps that are packaged together as a curated set, combining multiple related components into a single installable bundle.", "cardThumbnailURL": null } diff --git a/packages/catalog-realm/Tag/c1fe433a-b3df-41f4-bdcf-d98686ee42d7.json b/packages/catalog-realm/Tag/calculator.json similarity index 90% rename from packages/catalog-realm/Tag/c1fe433a-b3df-41f4-bdcf-d98686ee42d7.json rename to packages/catalog-realm/Tag/calculator.json index 188c378b13c..58740d3a955 100644 --- a/packages/catalog-realm/Tag/c1fe433a-b3df-41f4-bdcf-d98686ee42d7.json +++ b/packages/catalog-realm/Tag/calculator.json @@ -3,10 +3,10 @@ "type": "card", "attributes": { "name": "Calculator", - "color": "#00ebe5", + "color": "#10B981", "cardInfo": { "notes": null, - "name": null, + "name": "Calculator", "summary": "Cards that perform numerical computations, financial calculations, unit conversions, or any form of formula-driven data processing.", "cardThumbnailURL": null } @@ -25,4 +25,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/catalog-realm/Tag/card-type.json b/packages/catalog-realm/Tag/card-type.json new file mode 100644 index 00000000000..43b56c4c733 --- /dev/null +++ b/packages/catalog-realm/Tag/card-type.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "meta": { + "adoptsFrom": { + "name": "Tag", + "module": "../catalog-app/listing/tag" + } + }, + "attributes": { + "name": "card", + "color": "#10B981", + "cardInfo": { + "name": "card", + "summary": "Simple single-purpose cards that display or capture one focused piece of information.", + "cardThumbnailURL": null, + "notes": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} diff --git a/packages/catalog-realm/Tag/card.json b/packages/catalog-realm/Tag/card.json new file mode 100644 index 00000000000..aa67745f5c3 --- /dev/null +++ b/packages/catalog-realm/Tag/card.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "meta": { + "adoptsFrom": { + "name": "Tag", + "module": "../catalog-app/listing/tag" + } + }, + "attributes": { + "name": "card", + "cardInfo": { + "name": "card", + "summary": "Simple single-purpose cards that display or capture one focused piece of information.", + "cardThumbnailURL": null, + "notes": null + }, + "color": "#10B981" + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} diff --git a/packages/catalog-realm/Tag/community.json b/packages/catalog-realm/Tag/community.json new file mode 100644 index 00000000000..593e55d0ddb --- /dev/null +++ b/packages/catalog-realm/Tag/community.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "meta": { + "adoptsFrom": { + "name": "Tag", + "module": "../catalog-app/listing/tag" + } + }, + "attributes": { + "name": "community", + "color": "#F97316", + "cardInfo": { + "name": "community", + "summary": "Created and shared by the community. A friendly complement to the user-contributed tag.", + "cardThumbnailURL": null, + "notes": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} diff --git a/packages/catalog-realm/Tag/dashboard.json b/packages/catalog-realm/Tag/dashboard.json new file mode 100644 index 00000000000..c6b0f64a808 --- /dev/null +++ b/packages/catalog-realm/Tag/dashboard.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "meta": { + "adoptsFrom": { + "name": "Tag", + "module": "../catalog-app/listing/tag" + } + }, + "attributes": { + "name": "dashboard", + "color": "#10B981", + "cardInfo": { + "name": "dashboard", + "summary": "Data overview and analytics views that summarise key metrics at a glance.", + "cardThumbnailURL": null, + "notes": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} diff --git a/packages/catalog-realm/Tag/featured.json b/packages/catalog-realm/Tag/featured.json new file mode 100644 index 00000000000..e5f6f508e7f --- /dev/null +++ b/packages/catalog-realm/Tag/featured.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "meta": { + "adoptsFrom": { + "name": "Tag", + "module": "../catalog-app/listing/tag" + } + }, + "attributes": { + "name": "featured", + "color": "#F97316", + "cardInfo": { + "name": "featured", + "summary": "Curated and highlighted listings selected by the catalog team as top picks.", + "cardThumbnailURL": null, + "notes": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} diff --git a/packages/catalog-realm/Tag/form.json b/packages/catalog-realm/Tag/form.json new file mode 100644 index 00000000000..2cedca4ac5e --- /dev/null +++ b/packages/catalog-realm/Tag/form.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "meta": { + "adoptsFrom": { + "name": "Tag", + "module": "../catalog-app/listing/tag" + } + }, + "attributes": { + "name": "form", + "color": "#10B981", + "cardInfo": { + "name": "form", + "summary": "Data entry forms, surveys, intake forms, and structured input collection cards.", + "cardThumbnailURL": null, + "notes": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} diff --git a/packages/catalog-realm/Tag/51de249c-516a-4c4d-bd88-76e88274c483.json b/packages/catalog-realm/Tag/game.json similarity index 91% rename from packages/catalog-realm/Tag/51de249c-516a-4c4d-bd88-76e88274c483.json rename to packages/catalog-realm/Tag/game.json index 0dbd1a6918c..c8175d57a16 100644 --- a/packages/catalog-realm/Tag/51de249c-516a-4c4d-bd88-76e88274c483.json +++ b/packages/catalog-realm/Tag/game.json @@ -3,10 +3,10 @@ "type": "card", "attributes": { "name": "Game", - "color": "#37eb77", + "color": "#10B981", "cardInfo": { "notes": null, - "name": null, + "name": "Game", "summary": "Cards and apps for gaming, game tracking, scoreboards, turn management, or any interactive game-related experience.", "cardThumbnailURL": null } diff --git a/packages/catalog-realm/Tag/general.json b/packages/catalog-realm/Tag/general.json new file mode 100644 index 00000000000..9a793df1aa6 --- /dev/null +++ b/packages/catalog-realm/Tag/general.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "meta": { + "adoptsFrom": { + "name": "Tag", + "module": "../catalog-app/listing/tag" + } + }, + "attributes": { + "name": "general", + "color": "#F97316", + "cardInfo": { + "name": "general", + "summary": "Universal fallback tag for any card or app that does not fit a more specific type.", + "cardThumbnailURL": null, + "notes": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} diff --git a/packages/catalog-realm/Tag/new.json b/packages/catalog-realm/Tag/new.json new file mode 100644 index 00000000000..8606cadb87c --- /dev/null +++ b/packages/catalog-realm/Tag/new.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "meta": { + "adoptsFrom": { + "name": "Tag", + "module": "../catalog-app/listing/tag" + } + }, + "attributes": { + "name": "new", + "color": "#F97316", + "cardInfo": { + "name": "new", + "summary": "Recently added listings in the catalog.", + "cardThumbnailURL": null, + "notes": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} diff --git a/packages/catalog-realm/Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642.json b/packages/catalog-realm/Tag/official.json similarity index 91% rename from packages/catalog-realm/Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642.json rename to packages/catalog-realm/Tag/official.json index af8ba4a0bf3..1d608c04900 100644 --- a/packages/catalog-realm/Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642.json +++ b/packages/catalog-realm/Tag/official.json @@ -3,10 +3,10 @@ "type": "card", "attributes": { "name": "Official", - "color": "#00ebac", + "color": "#F97316", "cardInfo": { "notes": null, - "name": null, + "name": "Official", "summary": "Cards and apps officially created and maintained by the Cardstack team. Guaranteed quality, ongoing support, and compatibility with the latest platform updates.", "cardThumbnailURL": null } diff --git a/packages/catalog-realm/Tag/planner.json b/packages/catalog-realm/Tag/planner.json new file mode 100644 index 00000000000..0fcac6dc081 --- /dev/null +++ b/packages/catalog-realm/Tag/planner.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "meta": { + "adoptsFrom": { + "name": "Tag", + "module": "../catalog-app/listing/tag" + } + }, + "attributes": { + "name": "planner", + "color": "#10B981", + "cardInfo": { + "name": "planner", + "summary": "Meal planners, project planners, schedule cards, and anything focused on planning ahead.", + "cardThumbnailURL": null, + "notes": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} diff --git a/packages/catalog-realm/Tag/f21d95da-0728-46a8-8622-6c157716c26c.json b/packages/catalog-realm/Tag/poster.json similarity index 91% rename from packages/catalog-realm/Tag/f21d95da-0728-46a8-8622-6c157716c26c.json rename to packages/catalog-realm/Tag/poster.json index 7d583497aa7..50800c5708d 100644 --- a/packages/catalog-realm/Tag/f21d95da-0728-46a8-8622-6c157716c26c.json +++ b/packages/catalog-realm/Tag/poster.json @@ -9,10 +9,10 @@ "type": "card", "attributes": { "name": "Poster", - "color": "#ff7f00", + "color": "#10B981", "cardInfo": { "notes": null, - "name": "", + "name": "Poster", "summary": "Cards designed for creating posters, flyers, promotional visuals, or any print-ready or display-ready graphical layouts.", "cardThumbnailURL": null } diff --git a/packages/catalog-realm/Tag/report.json b/packages/catalog-realm/Tag/report.json new file mode 100644 index 00000000000..f95c54cf3c2 --- /dev/null +++ b/packages/catalog-realm/Tag/report.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "meta": { + "adoptsFrom": { + "name": "Tag", + "module": "../catalog-app/listing/tag" + } + }, + "attributes": { + "name": "report", + "color": "#10B981", + "cardInfo": { + "name": "report", + "summary": "Generated summaries, financial reports, audit reports, and structured output documents.", + "cardThumbnailURL": null, + "notes": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} diff --git a/packages/catalog-realm/Tag/skill.json b/packages/catalog-realm/Tag/skill.json new file mode 100644 index 00000000000..66ab604de6d --- /dev/null +++ b/packages/catalog-realm/Tag/skill.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "attributes": { + "name": "skill", + "color": "#10B981", + "cardInfo": { + "notes": null, + "name": "skill", + "summary": "Cards and apps that teach, demonstrate, or practice specific AI skills, capabilities, and techniques.", + "cardThumbnailURL": null + } + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} diff --git a/packages/catalog-realm/Tag/template.json b/packages/catalog-realm/Tag/template.json new file mode 100644 index 00000000000..ce11c9a013b --- /dev/null +++ b/packages/catalog-realm/Tag/template.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "meta": { + "adoptsFrom": { + "name": "Tag", + "module": "../catalog-app/listing/tag" + } + }, + "attributes": { + "name": "template", + "color": "#10B981", + "cardInfo": { + "name": "template", + "summary": "Reusable starting points and boilerplates ready to be customised for your own use.", + "cardThumbnailURL": null, + "notes": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} diff --git a/packages/catalog-realm/Tag/b793225c-32f9-404c-b2a9-b4041b93090c.json b/packages/catalog-realm/Tag/theme.json similarity index 91% rename from packages/catalog-realm/Tag/b793225c-32f9-404c-b2a9-b4041b93090c.json rename to packages/catalog-realm/Tag/theme.json index bb4d69a9f79..d6578b9015c 100644 --- a/packages/catalog-realm/Tag/b793225c-32f9-404c-b2a9-b4041b93090c.json +++ b/packages/catalog-realm/Tag/theme.json @@ -9,10 +9,10 @@ "type": "card", "attributes": { "name": "Theme", - "color": "#ff009d", + "color": "#10B981", "cardInfo": { "notes": null, - "name": null, + "name": "Theme", "summary": "Visual themes and styling cards that customize the appearance and color scheme of the Boxel workspace or other cards.", "cardThumbnailURL": null } diff --git a/packages/catalog-realm/Tag/tracker.json b/packages/catalog-realm/Tag/tracker.json new file mode 100644 index 00000000000..4a9869db31d --- /dev/null +++ b/packages/catalog-realm/Tag/tracker.json @@ -0,0 +1,28 @@ +{ + "data": { + "type": "card", + "meta": { + "adoptsFrom": { + "name": "Tag", + "module": "../catalog-app/listing/tag" + } + }, + "attributes": { + "name": "tracker", + "color": "#10B981", + "cardInfo": { + "name": "tracker", + "summary": "Habit trackers, expense trackers, progress trackers, and any card focused on monitoring over time.", + "cardThumbnailURL": null, + "notes": null + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} diff --git a/packages/catalog-realm/Tag/4d0f9ae2-048e-4ce0-b263-7006602ce6a4.json b/packages/catalog-realm/Tag/user-contributed.json similarity index 89% rename from packages/catalog-realm/Tag/4d0f9ae2-048e-4ce0-b263-7006602ce6a4.json rename to packages/catalog-realm/Tag/user-contributed.json index 8b149d2f5f1..5b65b8ab131 100644 --- a/packages/catalog-realm/Tag/4d0f9ae2-048e-4ce0-b263-7006602ce6a4.json +++ b/packages/catalog-realm/Tag/user-contributed.json @@ -3,10 +3,10 @@ "type": "card", "attributes": { "name": "User Contributed", - "color": "#c3fc33", + "color": "#F97316", "cardInfo": { "notes": null, - "name": null, + "name": "User Contributed", "summary": "Content created and submitted by community members rather than the official Cardstack team. Quality and support may vary.", "cardThumbnailURL": null } @@ -25,4 +25,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/catalog-realm/ThemeListing/4d6390f1-3bae-4e75-a95d-4309010e03e4.json b/packages/catalog-realm/ThemeListing/4d6390f1-3bae-4e75-a95d-4309010e03e4.json index f02d4aa4a30..db982be4889 100644 --- a/packages/catalog-realm/ThemeListing/4d6390f1-3bae-4e75-a95d-4309010e03e4.json +++ b/packages/catalog-realm/ThemeListing/4d6390f1-3bae-4e75-a95d-4309010e03e4.json @@ -35,12 +35,12 @@ }, "tags.0": { "links": { - "self": "../Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642" + "self": "../Tag/official" } }, "tags.1": { "links": { - "self": "../Tag/b793225c-32f9-404c-b2a9-b4041b93090c" + "self": "../Tag/theme" } }, "license": { diff --git a/packages/catalog-realm/ThemeListing/f87667d9-7616-4baf-b2fe-8ce5d393f676.json b/packages/catalog-realm/ThemeListing/f87667d9-7616-4baf-b2fe-8ce5d393f676.json index 98c9913a3ce..cf7234b0d74 100644 --- a/packages/catalog-realm/ThemeListing/f87667d9-7616-4baf-b2fe-8ce5d393f676.json +++ b/packages/catalog-realm/ThemeListing/f87667d9-7616-4baf-b2fe-8ce5d393f676.json @@ -35,12 +35,12 @@ }, "tags.0": { "links": { - "self": "../Tag/ed5a1a3f-0dbf-47b5-b2a6-d88b0d2a7642" + "self": "../Tag/official" } }, "tags.1": { "links": { - "self": "../Tag/b793225c-32f9-404c-b2a9-b4041b93090c" + "self": "../Tag/theme" } }, "license": { diff --git a/packages/catalog-realm/catalog-app/catalog_structure.md b/packages/catalog-realm/catalog-app/catalog_structure.md new file mode 100644 index 00000000000..93aa155a717 --- /dev/null +++ b/packages/catalog-realm/catalog-app/catalog_structure.md @@ -0,0 +1,615 @@ +# Catalog Structure Reference + +**For**: `catalog-app/listing` - Catalog listing organization and classification +**Location**: `catalog-realm/catalog-app/` + +This document describes the foundational structure of the Boxel catalog-realm, including **Spheres**, **Categories**, and **Tags**. These components work together to organize and classify cards, apps, and other content in the catalog through the `catalog-app/listing` module. + +--- + +## 📚 Table of Contents + +1. [Overview](#overview) +2. [Catalog-App Listing](#catalog-app-listing) +3. [Spheres](#spheres) +4. [Categories](#categories) +5. [Tags](#tags) +6. [File Structure](#file-structure) +7. [Relationships](#relationships) +8. [Examples](#examples) + +--- + +## 🎯 Overview + +The catalog structure is implemented through the **`catalog-app/listing`** module, which defines the core components: +- `sphere.gts` - Sphere card definition +- `category.gts` - Category card definition +- `tag.gts` - Tag card definition +- `listing.gts` - Base listing structure used by all catalog items + +All Spheres, Categories, and Tags use `adoptsFrom` to reference these core definitions, ensuring consistent structure and behavior across the catalog. + +--- + +## 📱 Catalog-App Listing + +The `catalog-app/listing` folder contains the core Glimmer TypeScript (GTS) components that define how catalog items are structured and displayed: + +### Core Files + +| File | Purpose | +|------|---------| +| `sphere.gts` | Defines the Sphere card type - top-level organizational structure | +| `category.gts` | Defines the Category card type - thematic groupings within spheres | +| `tag.gts` | Defines the Tag card type - flexible metadata labels | +| `listing.gts` | Base listing structure for cards, apps, fields, themes, and skills | + +### Module References + +All catalog components adopt from these modules: + +``` +adoptsFrom: { + "module": "../catalog-app/listing/sphere", // For Sphere cards + "module": "../catalog-app/listing/category", // For Category cards + "module": "../catalog-app/listing/tag", // For Tag cards + "module": "../catalog-app/listing/listing" // For Listings (CardListing, AppListing, etc.) +} +``` + +### Integration Points + +The catalog-app listing module: +- Defines JSON schema for all catalog items +- Provides UI components for rendering catalogs +- Manages relationships between spheres, categories, tags, and listings +- Handles filtering and navigation by type, category, and tag +- Supports metadata display (cardInfo, color coding, themes) + +--- + +## 🌍 Spheres + +Spheres are the **top-level organizational structure** that group all activities and interests into five major life areas. + +### Sphere Overview + +| Sphere | File | Purpose | Categories | Count | +|--------|------|---------|-----------|-------| +| **WORK** | `Sphere/work.json` | Professional, business, and work-related activities | Accounting, Business Development, HR, Marketing, Project Management, etc. | 15 | +| **PLAY** | `Sphere/play.json` | Entertainment, leisure, and recreational activities | Entertainment, Gaming, Sports, Hobbies, Parties, etc. | 9 | +| **BUILD** | `Sphere/build.json` | Creation, development, and technical activities | Software Development, AI/Automation, Design, DevOps, Web Development, etc. | 15 | +| **LEARN** | `Sphere/learn.json` | Education, knowledge, and skill development | Education, Training, Research, Teaching, Technical Documentation, etc. | 11 | +| **LIFE** | `Sphere/life.json` | Personal, lifestyle, and everyday activities | Health, Family, Finance, Travel, Shopping, Events, etc. | 12 | + +### Sphere JSON Structure + +```json +{ + "data": { + "type": "card", + "attributes": { + "name": "WORK" + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/sphere", + "name": "Sphere" + } + } + } +} +``` + +### Key Points + +- Each sphere represents a major life area +- All categories are linked to exactly one sphere +- Spheres serve as the primary organizational level for browsing and filtering +- Named in UPPERCASE for distinction +- **Adopts from** `catalog-app/listing/sphere.gts` - the core Sphere component definition +- Rendered by the Sphere component in `catalog-app/listing/` + +--- + +## 📂 Categories + +Categories are **thematic groupings of related content** that belong to a specific sphere. Each category focuses on a particular domain or topic. + +### Category Overview + +Categories organize content by topic within their assigned sphere. For example: + +- **WORK Sphere** contains categories like: Accounting & Finance, Marketing & Growth, Project Management, HR & People Management +- **PLAY Sphere** contains categories like: Entertainment & Media, Sports & Fitness, Gaming, Hobbies & Crafts +- **BUILD Sphere** contains categories like: Software Development, AI & Automation, Design & Creative, DevOps & Infrastructure +- **LEARN Sphere** contains categories like: Education & Courses, Knowledge Management, Research & Knowledge +- **LIFE Sphere** contains categories like: Health & Wellness, Personal Finance, Travel & Lifestyle + +### Category JSON Structure + +```json +{ + "data": { + "meta": { + "adoptsFrom": { + "name": "Category", + "module": "../catalog-app/listing/category" + } + }, + "type": "card", + "attributes": { + "name": "Software Development", + "cardInfo": { + "notes": null, + "name": "Software Development", + "summary": "Application development, coding projects, software architecture, version control, and code review processes.", + "cardThumbnailURL": null + } + }, + "relationships": { + "sphere": { + "links": { + "self": "../Sphere/build" + } + }, + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} +``` + +### Category File Naming Convention + +- **Format**: `kebab-case.json` +- **Example**: `software-development.json`, `personal-finance.json`, `travel-lifestyle.json` +- **Location**: `Category/` directory + +### Category Key Fields + +| Field | Type | Purpose | +|-------|------|---------| +| `name` | string | Display name of the category (e.g., "Software Development") | +| `cardInfo.name` | string | Card info name (typically matches `name`) | +| `cardInfo.summary` | string | Description of what content is in this category | +| `sphere` (relationship) | link | Reference to parent sphere (`work`, `play`, `build`, `learn`, or `life`) | + +### Key Points + +- 58 total categories across all spheres +- Each category belongs to exactly one sphere +- Kebab-case filenames for consistency +- `cardInfo` contains display information used in UI +- All categories have descriptive summaries +- **Adopts from** `catalog-app/listing/category.gts` - the core Category component definition +- Rendered by the Category component in `catalog-app/listing/` + +--- + +## 🏷️ Tags + +Tags are **flexible metadata labels** that describe characteristics of cards and apps. They add additional context beyond category classification. + +### Tag Purpose & Role + +Tags serve as **flexible metadata filters** that enable discovery and organization beyond the rigid sphere-category hierarchy: + +- **Functional Labeling**: Describe *what* a card/app does or *how* it's used (Content Type tags) +- **Contextual Metadata**: Add information about origin, quality, or special characteristics (Source/Origin tags) +- **Multi-Tagging**: A single card/app can have multiple tags, enabling cross-cutting categorization +- **Enhanced Discovery**: Users can filter by tags to find cards matching specific use cases or characteristics +- **Flexible Organization**: Unlike categories (fixed hierarchy), tags allow cards to be discovered through multiple dimensions + +**Key Difference from Categories**: Categories are mutually exclusive and create hierarchy (one per card), while tags are additive and enable flexible cross-cutting organization. + +### Tag Types + +Tags are divided into two main types based on what they describe: + +#### 1. Content Type Tags (Green - #10B981) + +Describe **what the card/app does** or **its functional purpose**: + +| Tag | Purpose | +|-----|---------| +| **app** | Full applications such as news readers, todo apps, CRMs, and other multi-feature tools | +| **card** | Simple single-purpose cards that display or capture one focused piece of information | +| **card-type** | Meta-category for organizing different card types | +| **dashboard** | Data overview and analytics views that summarise key metrics at a glance | +| **form** | Data entry forms, surveys, intake forms, and structured input collection cards | +| **game** | Cards and apps for gaming, game tracking, scoreboards, turn management | +| **planner** | Meal planners, project planners, schedule cards, and planning-focused tools | +| **poster** | Cards designed for creating posters, flyers, promotional visuals | +| **report** | Generated summaries, financial reports, audit reports, structured output documents | +| **template** | Reusable starting points and boilerplates ready to be customised | +| **theme** | Visual themes and styling cards that customize appearance and color scheme | +| **tracker** | Habit trackers, expense trackers, progress trackers, monitoring tools | +| **calculator** | Cards that perform numerical computations, financial calculations, unit conversions | +| **skill** | Cards and apps that teach, demonstrate, or practice specific AI skills, capabilities, and techniques | + +#### 2. Source/Origin Tags (Orange - #F97316) + +Describe **where it comes from or its status/quality**: + +| Tag | Purpose | +|-----|---------| +| **ai** | Cards and apps that use artificial intelligence or machine learning, LLM-powered features | +| **bundled** | Cards or apps packaged together as a curated set, combining multiple components | +| **community** | Created and shared by the community (complementary to user-contributed) | +| **featured** | Curated and highlighted listings selected by the catalog team as top picks | +| **general** | Universal fallback tag for cards that don't fit specific types | +| **new** | Recently added listings in the catalog | +| **official** | Cards and apps officially created and maintained by Cardstack team | +| **user-contributed** | Content created and submitted by community members | + +### Tag JSON Structure + +```json +{ + "data": { + "type": "card", + "attributes": { + "name": "dashboard", + "color": "#10B981", + "cardInfo": { + "notes": null, + "name": "dashboard", + "summary": "Data overview and analytics views that summarise key metrics at a glance.", + "cardThumbnailURL": null + } + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" + } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} +``` + +### Tag File Naming Convention + +- **Format**: `kebab-case.json` +- **Example**: `dashboard.json`, `user-contributed.json`, `official.json` +- **Location**: `Tag/` directory + +### Tag Color Coding + +Tags use consistent colors based on their type for visual distinction: + +- **🟢 Green (#10B981)** - Content Type tags (what it does) +- **🟠 Orange (#F97316)** - Source/Origin tags (where it comes from) + +### Tag Key Fields + +| Field | Type | Purpose | +|-------|------|---------| +| `name` | string | Display name of the tag | +| `color` | string | Hex color code (#10B981 for Content Type, #F97316 for Source/Origin) | +| `cardInfo.name` | string | Card info name (matches `name`) | +| `cardInfo.summary` | string | Description of what the tag represents | + +### Key Points + +- 22 total tags (14 Content Type + 8 Source/Origin) +- Multiple tags can be applied to a single card/app +- Color-coded by type for visual distinction +- Tags provide flexible metadata beyond category structure +- **Adopts from** `catalog-app/listing/tag.gts` - the core Tag component definition +- Rendered by the Tag component in `catalog-app/listing/` + +--- + +## 📁 File Structure + +``` +catalog-realm/ +├── Sphere/ +│ ├── work.json # WORK sphere (15 categories) +│ ├── play.json # PLAY sphere (9 categories) +│ ├── build.json # BUILD sphere (15 categories) +│ ├── learn.json # LEARN sphere (11 categories) +│ └── life.json # LIFE sphere (12 categories) +│ +├── Category/ +│ ├── software-development.json # BUILD sphere +│ ├── personal-finance.json # LIFE sphere +│ ├── project-management.json # WORK sphere +│ ├── entertainment-media.json # PLAY sphere +│ ├── education-courses.json # LEARN sphere +│ └── ... (58 total categories) +│ +├── Tag/ +│ ├── dashboard.json # Content Type - Green +│ ├── form.json # Content Type - Green +│ ├── app.json # Content Type - Green +│ ├── skill.json # Content Type - Green +│ ├── official.json # Source/Origin - Orange +│ ├── user-contributed.json # Source/Origin - Orange +│ ├── ai.json # Source/Origin - Orange +│ └── ... (22 total tags) +│ +└── CATALOG_STRUCTURE.md # This documentation +``` + +--- + +## 🔗 Relationships + +The catalog structure creates a hierarchical relationship system: + +### Sphere → Category → Tags + +``` +WORK Sphere +├── Accounting & Finance +│ ├── Tags: dashboard, report, tracker +│ └── Related Cards: Financial apps, calculators +├── Project Management +│ ├── Tags: app, dashboard, planner, tracker +│ └── Related Cards: Project tracking apps +└── HR & People Management + ├── Tags: form, dashboard, tracker + └── Related Cards: HR management tools + +BUILD Sphere +├── Software Development +│ ├── Tags: app, official, ai +│ └── Related Cards: Development tools, IDE integrations +├── AI & Automation +│ ├── Tags: ai, official, template +│ └── Related Cards: AI-powered cards, automation tools +└── Design & Creative + ├── Tags: template, poster, theme + └── Related Cards: Design tools, templates +``` + +### Reference Links in JSON + +**Category linking to Sphere:** +```json +"relationships": { + "sphere": { + "links": { + "self": "../Sphere/work" // References work.json + } + } +} +``` + +**CardListing linking to Categories and Tags:** +```json +"relationships": { + "categories.0": { + "links": { + "self": "../Category/software-development" // References Category + } + }, + "tags.0": { + "links": { + "self": "../Tag/app" // References Tag + } + }, + "tags.1": { + "links": { + "self": "../Tag/official" // References Tag + } + } +} +``` + +--- + +## 📋 Examples + +### Example 1: Complete Category Definition + +**File**: `Category/software-development.json` + +```json +{ + "data": { + "meta": { + "adoptsFrom": { + "name": "Category", + "module": "../catalog-app/listing/category" + } + }, + "type": "card", + "attributes": { + "name": "Software Development", + "cardInfo": { + "notes": null, + "name": "Software Development", + "summary": "Application development, coding projects, software architecture, version control, and code review processes.", + "cardThumbnailURL": null + } + }, + "relationships": { + "sphere": { + "links": { + "self": "../Sphere/build" + } + }, + "cardInfo.theme": { + "links": { + "self": null + } + } + } + } +} +``` + +### Example 2: Card Using Multiple Tags and Categories + +**File**: `CardListing/game-quiz.json` + +```json +{ + "data": { + "meta": { + "adoptsFrom": { + "name": "CardListing", + "module": "../catalog-app/listing/listing" + } + }, + "type": "card", + "attributes": { + "name": "Game Quiz", + "summary": "Interactive game-based quizzes framework", + "cardInfo": { + "name": "Game Quiz Listing", + "summary": "Comprehensive framework for creating interactive game-based quizzes" + } + }, + "relationships": { + "categories.0": { + "links": { + "self": "../Category/entertainment-media" + } + }, + "tags.0": { + "links": { + "self": "../Tag/game" // Content Type - Green + } + }, + "tags.1": { + "links": { + "self": "../Tag/ai" // Source/Origin - Orange + } + } + } + } +} +``` + +### Example 3: All Spheres at a Glance + +| Sphere | Count | Sample Categories | +|--------|-------|-------------------| +| 🎯 **WORK** | 15 | Accounting & Finance, Project Management, HR & People Management, Marketing & Growth | +| 🎮 **PLAY** | 9 | Entertainment & Media, Gaming, Sports & Fitness, Hobbies & Crafts | +| 🔨 **BUILD** | 15 | Software Development, AI & Automation, Design & Creative, DevOps & Infrastructure | +| 📚 **LEARN** | 11 | Education & Courses, Knowledge Management, Research & Knowledge, Teaching & Instruction | +| 💚 **LIFE** | 12 | Health & Wellness, Personal Finance, Travel & Lifestyle, Family & Relationships | + +--- + +## 🎯 Quick Reference + +### Finding Content + +1. **By Life Area**: Start with Spheres (Work, Play, Build, Learn, Life) +2. **By Topic**: Navigate to Categories within a Sphere +3. **By Characteristic**: Filter using Tags (Content Type or Source/Origin) + +### Creating New Content + +1. **Assign to Sphere**: Determine which life area it belongs to +2. **Assign to Category**: Choose the most relevant topic category +3. **Apply Tags**: Add Content Type tags (green) describing functionality +4. **Apply Tags**: Add Source/Origin tags (orange) describing source/status + +### Best Practices + +- ✅ Every category must have a sphere reference +- ✅ Content type and source/origin tags should both be used together +- ✅ Use kebab-case for all filenames +- ✅ Provide clear, descriptive summaries in cardInfo +- ✅ Keep color codes consistent (Green for content type, Orange for source/origin) + +--- + +## 📊 Statistics + +| Component | Count | Type | +|-----------|-------|------| +| **Spheres** | 5 | Top-level organizational structure | +| **Categories** | 58 | Thematic groupings within spheres | +| **Tags** | 21 | Flexible metadata (13 Content Type + 8 Source/Origin) | +| **Total Catalog Items** | 84 | Complete catalog organizational structure | + +--- + +## 🔄 Hierarchy Overview + +``` +┌─────────────────────────────────────────┐ +│ CATALOG-REALM STRUCTURE │ +├─────────────────────────────────────────┤ +│ Spheres (5) │ +│ ├─ WORK, PLAY, BUILD, LEARN, LIFE │ +│ └─ Each contains 9-15 categories │ +├─────────────────────────────────────────┤ +│ Categories (58) │ +│ ├─ Thematic topics within spheres │ +│ └─ Each links to exactly one sphere │ +├─────────────────────────────────────────┤ +│ Tags (21) │ +│ ├─ Content Type (Green): 13 │ +│ ├─ Source/Origin (Orange): 8 │ +│ └─ Multiple tags per card/app │ +└─────────────────────────────────────────┘ +``` + +--- + +## 📝 Notes + +- All filenames use kebab-case (lowercase with hyphens) +- All files are JSON format stored in `catalog-realm/` +- Color codes provide visual distinction for tag types +- Relationships are maintained through relative paths (`../Sphere/work`) +- The structure is designed to be flexible and scalable + +--- + +## 📞 Related Files & Locations + +### Catalog Components +- `../Sphere/` - Sphere instances (work, play, build, learn, life) +- `../Category/` - Category instances (58 total) +- `../Tag/` - Tag instances (21 total) + +### Catalog-App Listing (Core Definitions) +- `listing/sphere.gts` - Sphere card component definition +- `listing/category.gts` - Category card component definition +- `listing/tag.gts` - Tag card component definition +- `listing/listing.gts` - Base listing component for all catalog items + +### Related Directories +- `../CardListing/` - Card listings using catalog structure +- `../AppListing/` - App listings using catalog structure +- `../FieldListing/` - Field listings using catalog structure +- `../SkillListing/` - Skill listings using catalog structure +- `../ThemeListing/` - Theme listings using catalog structure + +--- + +## 🔗 How It Works + +1. **Core Definition**: `catalog-app/listing/` defines the structure +2. **Instances**: Spheres, Categories, and Tags are created as JSON instances +3. **Adoption**: All instances use `adoptsFrom` to reference core definitions +4. **Listings**: Cards, apps, and other content link to categories and tags +5. **UI Rendering**: Components in `catalog-app/listing/` handle display and interaction + +--- + +**Last Updated**: 2024 +**Version**: 1.1 +**Scope**: Catalog-realm structure for catalog-app/listing module diff --git a/packages/catalog-realm/crm-app/Tag/8a14f671-4daf-4195-aca5-85dc143d15b8.json b/packages/catalog-realm/crm-app/Tag/8a14f671-4daf-4195-aca5-85dc143d15b8.json index 671618648a3..74d3471fbe8 100644 --- a/packages/catalog-realm/crm-app/Tag/8a14f671-4daf-4195-aca5-85dc143d15b8.json +++ b/packages/catalog-realm/crm-app/Tag/8a14f671-4daf-4195-aca5-85dc143d15b8.json @@ -3,15 +3,26 @@ "type": "card", "attributes": { "name": "Proposal", - "color": "#A66DFA", - "cardDescription": null, - "cardThumbnailURL": null + "color": null, + "cardInfo": { + "notes": null, + "name": "Proposal", + "summary": "Proposal documents, client pitches, project proposals, business proposals, and contract proposals.", + "cardThumbnailURL": null + } }, "meta": { "adoptsFrom": { - "module": "../tag", + "module": "../catalog-app/listing/tag", "name": "Tag" } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } } } } diff --git a/packages/catalog-realm/sprint-planner/Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893.json b/packages/catalog-realm/sprint-planner/Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893.json index f007ebfa190..e23f468013a 100644 --- a/packages/catalog-realm/sprint-planner/Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893.json +++ b/packages/catalog-realm/sprint-planner/Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893.json @@ -4,14 +4,25 @@ "attributes": { "name": "AI", "color": null, - "cardDescription": null, - "cardThumbnailURL": null + "cardInfo": { + "notes": null, + "name": "AI", + "summary": "Cards and apps that use artificial intelligence or machine learning, including LLM-powered features, smart automation, and AI-assisted workflows.", + "cardThumbnailURL": null + } }, "meta": { "adoptsFrom": { - "module": "../tag", + "module": "../catalog-app/listing/tag", "name": "Tag" } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } } } } diff --git a/packages/catalog-realm/sprint-planner/Tag/e3625690-2231-428e-8f6d-d123d8f5cc6c.json b/packages/catalog-realm/sprint-planner/Tag/e3625690-2231-428e-8f6d-d123d8f5cc6c.json index e0ccdb20fba..0caaf4d353d 100644 --- a/packages/catalog-realm/sprint-planner/Tag/e3625690-2231-428e-8f6d-d123d8f5cc6c.json +++ b/packages/catalog-realm/sprint-planner/Tag/e3625690-2231-428e-8f6d-d123d8f5cc6c.json @@ -3,15 +3,26 @@ "type": "card", "attributes": { "name": "Health and Fitness", - "color": "#1EDF67", - "cardDescription": null, - "cardThumbnailURL": null + "color": null, + "cardInfo": { + "notes": null, + "name": "Health and Fitness", + "summary": "Cards and apps for tracking health metrics, fitness activities, wellness goals, exercise routines, and fitness progress.", + "cardThumbnailURL": null + } }, "meta": { "adoptsFrom": { - "module": "../tag", + "module": "../catalog-app/listing/tag", "name": "Tag" } + }, + "relationships": { + "cardInfo.theme": { + "links": { + "self": null + } + } } } } From 7fa26277732c404b46d24c28e01406ba91f4093e Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 16 Apr 2026 12:39:33 +0800 Subject: [PATCH 2/8] Use numbered indices in search-and-choose to prevent LLM ID hallucinations --- packages/host/app/commands/listing-create.ts | 33 ++++-- .../host/app/commands/one-shot-llm-request.ts | 2 +- .../host/app/commands/search-and-choose.ts | 101 ++++++++++-------- 3 files changed, 83 insertions(+), 53 deletions(-) diff --git a/packages/host/app/commands/listing-create.ts b/packages/host/app/commands/listing-create.ts index d08771639f9..89adfd7948d 100644 --- a/packages/host/app/commands/listing-create.ts +++ b/packages/host/app/commands/listing-create.ts @@ -153,7 +153,7 @@ export default class ListingCreateCommand extends HostBaseCommand< const listingCard = listing as CardAPI.CardDef; const firstOpenCardId = openCardIds?.[0]; - const backgroundWork = Promise.all([ + const backgroundWork = Promise.allSettled([ this.autoPatchName(listingCard, codeRef), this.autoPatchSummary(listingCard, codeRef), this.autoLinkTag(listingCard, codeRef), @@ -167,8 +167,24 @@ export default class ListingCreateCommand extends HostBaseCommand< codeRef.module, codeRef, ), - ]).catch((error) => { - console.warn('Background autopatch failed:', error); + ]).then((results) => { + const names = [ + 'autoPatchName', + 'autoPatchSummary', + 'autoLinkTag', + 'autoLinkCategory', + 'autoLinkLicense', + 'autoLinkExample', + 'linkSpecs', + ]; + results.forEach((result, i) => { + if (result.status === 'rejected') { + console.warn( + `Background autopatch failed [${names[i]}]:`, + result.reason, + ); + } + }); }); const { ListingCreateResult } = commandModule; @@ -508,10 +524,9 @@ export default class ListingCreateCommand extends HostBaseCommand< max: 1, additionalSystemPrompt: 'You are selecting from an existing list of catalog tags. ' + - "Choose the single best tag that describes the card's subject matter, use case, or domain. " + - 'Prefer a specific descriptive tag over a broad organizational bucket. ' + - 'Only select ids from the provided options. ' + - 'Return [] if no tag clearly fits.', + "Choose the most specific descriptive tags that describes the card's subject matter, use case, or domain. " + + 'If no tag clearly fits the subject matter, select a Source/Origin tag as a fallback (From tag pools). ' + + 'Return [] only if no appropriate tag exists.', }, ); (listing as any).tags = selected; @@ -533,9 +548,7 @@ export default class ListingCreateCommand extends HostBaseCommand< max: 1, additionalSystemPrompt: 'You are selecting from an existing list of catalog categories. ' + - "Choose the single best high-level category that matches the card's main purpose. " + - 'Prefer broad organizing categories over keyword-style tags. ' + - 'Only select ids from the provided options. ' + + "Choose the most specific descriptive category that matches the card's main purpose. " + 'Return [] if no category clearly fits.', }, ); diff --git a/packages/host/app/commands/one-shot-llm-request.ts b/packages/host/app/commands/one-shot-llm-request.ts index de081616ed2..5819963786d 100644 --- a/packages/host/app/commands/one-shot-llm-request.ts +++ b/packages/host/app/commands/one-shot-llm-request.ts @@ -182,7 +182,7 @@ export default class OneShotLlmRequestCommand extends HostBaseCommand< const responseData = await result.response.json(); oneShotLogger.debug('raw llm response meta', { status: result.response.status, - model: input.llmModel || 'anthropic/claude-3-haiku', + model: input.llmModel || 'anthropic/claude-haiku-4.5', usage: responseData.usage || null, }); const output = responseData.choices?.[0]?.message?.content || null; diff --git a/packages/host/app/commands/search-and-choose.ts b/packages/host/app/commands/search-and-choose.ts index 97e785e7aa0..b139d4dc1f9 100644 --- a/packages/host/app/commands/search-and-choose.ts +++ b/packages/host/app/commands/search-and-choose.ts @@ -6,8 +6,6 @@ import type * as BaseCommandModule from 'https://cardstack.com/base/command'; import HostBaseCommand from '../lib/host-base-command'; -import { prettifyPrompts } from '../utils/prettify-prompts'; - import OneShotLlmRequestCommand from './one-shot-llm-request'; import { SearchCardsByTypeAndTitleCommand } from './search-cards'; @@ -49,6 +47,8 @@ export default class SearchAndChooseCommand extends HostBaseCommand< throw new Error('max must be at least 1'); } + const { SearchAndChooseResult } = await this.loadCommandModule(); + // 1. Gather candidates via existing search command const search = new SearchCardsByTypeAndTitleCommand(this.commandContext); const searchResult = await search.execute({ type: candidateTypeCodeRef }); @@ -58,55 +58,71 @@ export default class SearchAndChooseCommand extends HostBaseCommand< log.debug('No instances found for type', { type: candidateTypeCodeRef.name, }); - const { SearchAndChooseResult } = await this.loadCommandModule(); return new SearchAndChooseResult({ selectedIds: [], selectedCards: [] }); } // 2. Prepare prompt content - const summaries = this.formatCandidatesForPrompt(instances); - let systemPrompt = - max === 1 - ? `Select the single most relevant id representing ${candidateTypeCodeRef.name}. Output ONLY a JSON array with exactly 1 id string. No commentary.` - : `Select the most relevant 1 to ${max} ids representing ${candidateTypeCodeRef.name}. Output ONLY a JSON array of unique id strings. No commentary.`; + // Use numbered indices instead of raw IDs to prevent the LLM from + // hallucinating IDs it knows from training data. Options are numbered starting + // from 1 in the prompt, then mapped back to 0-based indices when selecting. + const numberedCandidates = this.formatCandidatesAsNumberedList(instances); + const isMaxOne = max === 1; + + let contextSection = ''; if (selectionContextCodeRef) { - systemPrompt += ` Use the attached module source for "${selectionContextCodeRef.name}" (${selectionContextCodeRef.module}) as selection context.`; + contextSection = `Selection context: "${selectionContextCodeRef.name}" (${selectionContextCodeRef.module})`; } if (additionalSystemPrompt && additionalSystemPrompt.trim()) { - systemPrompt += ` ${additionalSystemPrompt.trim()}`; + contextSection += `${contextSection ? '\n' : ''}${additionalSystemPrompt.trim()}`; } - const userPrompt = - max === 1 - ? `Options (id :: title):\n${summaries}\n\nRules:\n- Return a JSON array with exactly 1 id.\n- Only use ids from the list.\n- If nothing is relevant return [].` - : `Options (id :: title):\n${summaries}\n\nRules:\n- Return a JSON array with 1 to ${max} ids.\n- No duplicates.\n- Only use ids from the list.\n- If nothing is relevant return [].`; + const systemPrompt = + 'You are a selection assistant. Return only what is asked with no commentary.'; + const userPrompt = [ + `Choose the most relevant ${ + isMaxOne ? '1 option' : `1 to ${max} options` + } for "${candidateTypeCodeRef.name}" from the numbered list below.`, + contextSection, + `Options:\n${numberedCandidates}`, + isMaxOne + ? `Return a JSON array containing exactly 1 number (the option number). If nothing is relevant return [].` + : `Return a JSON array of numbers (the option numbers, no duplicates, up to ${max}). If nothing is relevant return [].`, + ] + .filter(Boolean) + .join('\n\n'); // 3. LLM selection const oneShot = new OneShotLlmRequestCommand(this.commandContext); - // Unified prompt logging via reusable utility - log.debug( - prettifyPrompts({ - scope: `SearchAndChoose:${candidateTypeCodeRef.name}`, - systemPrompt, - userPrompt, - }), - ); - const r = await oneShot.execute({ + const res = await oneShot.execute({ systemPrompt, userPrompt, - llmModel: llmModel || 'anthropic/claude-3-haiku', + llmModel: llmModel || 'anthropic/claude-haiku-4.5', codeRef: selectionContextCodeRef ?? candidateTypeCodeRef, }); - const selectedIds = this.parseIdsFromLlmOutput(r.output || '[]').slice( - 0, - max, - ); - const selectedCards = instances.filter((inst: any) => - selectedIds.some( - (id) => typeof inst.id === 'string' && inst.id.includes(id), - ), - ); - const { SearchAndChooseResult } = await this.loadCommandModule(); + const validInstances = instances.filter((c: any) => c && c.id); + const selectedIndices = this.parseIndicesFromLlmOutput( + res.output || '[]', + ).slice(0, max); + const selectedCards = selectedIndices + .map((i) => validInstances[i - 1]) + .filter(Boolean); + const selectedIds = selectedCards.map((c: any) => c.id); + + // Log a warning if the LLM output could not be parsed into valid selections, to aid debugging + if (selectedCards.length === 0) { + console.warn( + `[SearchAndChoose:${candidateTypeCodeRef.name}] result is empty. candidates sent to LLM:\n${numberedCandidates}`, + ); + console.warn( + `[SearchAndChoose:${candidateTypeCodeRef.name}] LLM raw output: "${res.output}"`, + ); + console.warn( + `[SearchAndChoose:${candidateTypeCodeRef.name}] parsed indices:`, + selectedIndices, + ); + } + return new SearchAndChooseResult({ selectedIds, selectedCards, @@ -126,7 +142,7 @@ export default class SearchAndChooseCommand extends HostBaseCommand< return codeRef; } - private parseIdsFromLlmOutput(output: string): string[] { + private parseIndicesFromLlmOutput(output: string): number[] { let text = output.trim(); if (!text) return []; if (text.startsWith('```')) { @@ -138,21 +154,22 @@ export default class SearchAndChooseCommand extends HostBaseCommand< try { const parsed = JSON.parse(text); if (!Array.isArray(parsed)) return []; - return parsed.filter((v) => typeof v === 'string'); + return parsed.filter( + (v): v is number => + typeof v === 'number' && Number.isInteger(v) && v > 0, + ); } catch { return []; } } - private formatCandidatesForPrompt(instances: any[]): string { + private formatCandidatesAsNumberedList(instances: any[]): string { return instances .filter((c) => c && c.id) - .map((c) => { - const title = c.title || ''; + .map((c, i) => { + const name = c.cardInfo?.name || c.name || ''; const summary = c.cardInfo?.summary || ''; - return summary - ? `${c.id} :: ${title} — ${summary}`.trim() - : `${c.id} :: ${title}`.trim(); + return summary ? `${i + 1}. ${name} — ${summary}` : `${i + 1}. ${name}`; }) .join('\n'); } From 688f493c2414ec63e2686f2058e2685a363680ba Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 16 Apr 2026 14:05:44 +0800 Subject: [PATCH 3/8] capitilized tag name --- packages/catalog-realm/Tag/ai.json | 2 +- packages/catalog-realm/Tag/app.json | 20 ++++++------- packages/catalog-realm/Tag/card-type.json | 28 ------------------- packages/catalog-realm/Tag/card.json | 24 ++++++++-------- packages/catalog-realm/Tag/community.json | 20 ++++++------- packages/catalog-realm/Tag/dashboard.json | 20 ++++++------- packages/catalog-realm/Tag/featured.json | 20 ++++++------- packages/catalog-realm/Tag/form.json | 20 ++++++------- packages/catalog-realm/Tag/general.json | 20 ++++++------- packages/catalog-realm/Tag/new.json | 20 ++++++------- packages/catalog-realm/Tag/planner.json | 20 ++++++------- packages/catalog-realm/Tag/poster.json | 12 ++++---- packages/catalog-realm/Tag/report.json | 20 ++++++------- packages/catalog-realm/Tag/skill.json | 4 +-- packages/catalog-realm/Tag/template.json | 20 ++++++------- packages/catalog-realm/Tag/theme.json | 12 ++++---- packages/catalog-realm/Tag/tracker.json | 20 ++++++------- .../catalog-app/catalog_structure.md | 5 ++-- 18 files changed, 139 insertions(+), 168 deletions(-) delete mode 100644 packages/catalog-realm/Tag/card-type.json diff --git a/packages/catalog-realm/Tag/ai.json b/packages/catalog-realm/Tag/ai.json index 77ed0b776ef..95c7f24e72a 100644 --- a/packages/catalog-realm/Tag/ai.json +++ b/packages/catalog-realm/Tag/ai.json @@ -2,7 +2,7 @@ "data": { "type": "card", "attributes": { - "name": "Ai", + "name": "AI", "color": "#F97316", "cardInfo": { "notes": null, diff --git a/packages/catalog-realm/Tag/app.json b/packages/catalog-realm/Tag/app.json index 46a1c2fd7a5..153eb008eff 100644 --- a/packages/catalog-realm/Tag/app.json +++ b/packages/catalog-realm/Tag/app.json @@ -1,20 +1,20 @@ { "data": { "type": "card", - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, "attributes": { - "name": "app", + "name": "App", "color": "#10B981", "cardInfo": { - "name": "app", + "notes": null, + "name": "App", "summary": "Full applications such as news readers, todo apps, CRMs, and other multi-feature tools.", - "cardThumbnailURL": null, - "notes": null + "cardThumbnailURL": null + } + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" } }, "relationships": { diff --git a/packages/catalog-realm/Tag/card-type.json b/packages/catalog-realm/Tag/card-type.json deleted file mode 100644 index 43b56c4c733..00000000000 --- a/packages/catalog-realm/Tag/card-type.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "data": { - "type": "card", - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, - "attributes": { - "name": "card", - "color": "#10B981", - "cardInfo": { - "name": "card", - "summary": "Simple single-purpose cards that display or capture one focused piece of information.", - "cardThumbnailURL": null, - "notes": null - } - }, - "relationships": { - "cardInfo.theme": { - "links": { - "self": null - } - } - } - } -} diff --git a/packages/catalog-realm/Tag/card.json b/packages/catalog-realm/Tag/card.json index aa67745f5c3..575d2d9bee9 100644 --- a/packages/catalog-realm/Tag/card.json +++ b/packages/catalog-realm/Tag/card.json @@ -1,21 +1,21 @@ { "data": { "type": "card", - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, "attributes": { - "name": "card", + "name": "Card", + "color": "#10B981", "cardInfo": { - "name": "card", + "notes": null, + "name": "Card", "summary": "Simple single-purpose cards that display or capture one focused piece of information.", - "cardThumbnailURL": null, - "notes": null - }, - "color": "#10B981" + "cardThumbnailURL": null + } + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" + } }, "relationships": { "cardInfo.theme": { diff --git a/packages/catalog-realm/Tag/community.json b/packages/catalog-realm/Tag/community.json index 593e55d0ddb..de389bb6c37 100644 --- a/packages/catalog-realm/Tag/community.json +++ b/packages/catalog-realm/Tag/community.json @@ -1,20 +1,20 @@ { "data": { "type": "card", - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, "attributes": { - "name": "community", + "name": "Community", "color": "#F97316", "cardInfo": { - "name": "community", + "notes": null, + "name": "Community", "summary": "Created and shared by the community. A friendly complement to the user-contributed tag.", - "cardThumbnailURL": null, - "notes": null + "cardThumbnailURL": null + } + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" } }, "relationships": { diff --git a/packages/catalog-realm/Tag/dashboard.json b/packages/catalog-realm/Tag/dashboard.json index c6b0f64a808..031bb385837 100644 --- a/packages/catalog-realm/Tag/dashboard.json +++ b/packages/catalog-realm/Tag/dashboard.json @@ -1,20 +1,20 @@ { "data": { "type": "card", - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, "attributes": { - "name": "dashboard", + "name": "Dashboard", "color": "#10B981", "cardInfo": { - "name": "dashboard", + "notes": null, + "name": "Dashboard", "summary": "Data overview and analytics views that summarise key metrics at a glance.", - "cardThumbnailURL": null, - "notes": null + "cardThumbnailURL": null + } + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" } }, "relationships": { diff --git a/packages/catalog-realm/Tag/featured.json b/packages/catalog-realm/Tag/featured.json index e5f6f508e7f..c233a077265 100644 --- a/packages/catalog-realm/Tag/featured.json +++ b/packages/catalog-realm/Tag/featured.json @@ -1,20 +1,20 @@ { "data": { "type": "card", - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, "attributes": { - "name": "featured", + "name": "Featured", "color": "#F97316", "cardInfo": { - "name": "featured", + "notes": null, + "name": "Featured", "summary": "Curated and highlighted listings selected by the catalog team as top picks.", - "cardThumbnailURL": null, - "notes": null + "cardThumbnailURL": null + } + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" } }, "relationships": { diff --git a/packages/catalog-realm/Tag/form.json b/packages/catalog-realm/Tag/form.json index 2cedca4ac5e..0bd7080bef9 100644 --- a/packages/catalog-realm/Tag/form.json +++ b/packages/catalog-realm/Tag/form.json @@ -1,20 +1,20 @@ { "data": { "type": "card", - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, "attributes": { - "name": "form", + "name": "Form", "color": "#10B981", "cardInfo": { - "name": "form", + "notes": null, + "name": "Form", "summary": "Data entry forms, surveys, intake forms, and structured input collection cards.", - "cardThumbnailURL": null, - "notes": null + "cardThumbnailURL": null + } + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" } }, "relationships": { diff --git a/packages/catalog-realm/Tag/general.json b/packages/catalog-realm/Tag/general.json index 9a793df1aa6..e37b69e1a65 100644 --- a/packages/catalog-realm/Tag/general.json +++ b/packages/catalog-realm/Tag/general.json @@ -1,20 +1,20 @@ { "data": { "type": "card", - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, "attributes": { - "name": "general", + "name": "General", "color": "#F97316", "cardInfo": { - "name": "general", + "notes": null, + "name": "General", "summary": "Universal fallback tag for any card or app that does not fit a more specific type.", - "cardThumbnailURL": null, - "notes": null + "cardThumbnailURL": null + } + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" } }, "relationships": { diff --git a/packages/catalog-realm/Tag/new.json b/packages/catalog-realm/Tag/new.json index 8606cadb87c..dc80b1fb72e 100644 --- a/packages/catalog-realm/Tag/new.json +++ b/packages/catalog-realm/Tag/new.json @@ -1,20 +1,20 @@ { "data": { "type": "card", - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, "attributes": { - "name": "new", + "name": "New", "color": "#F97316", "cardInfo": { - "name": "new", + "notes": null, + "name": "New", "summary": "Recently added listings in the catalog.", - "cardThumbnailURL": null, - "notes": null + "cardThumbnailURL": null + } + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" } }, "relationships": { diff --git a/packages/catalog-realm/Tag/planner.json b/packages/catalog-realm/Tag/planner.json index 0fcac6dc081..c3ea358e988 100644 --- a/packages/catalog-realm/Tag/planner.json +++ b/packages/catalog-realm/Tag/planner.json @@ -1,20 +1,20 @@ { "data": { "type": "card", - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, "attributes": { - "name": "planner", + "name": "Planner", "color": "#10B981", "cardInfo": { - "name": "planner", + "notes": null, + "name": "Planner", "summary": "Meal planners, project planners, schedule cards, and anything focused on planning ahead.", - "cardThumbnailURL": null, - "notes": null + "cardThumbnailURL": null + } + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" } }, "relationships": { diff --git a/packages/catalog-realm/Tag/poster.json b/packages/catalog-realm/Tag/poster.json index 50800c5708d..dc020fdab85 100644 --- a/packages/catalog-realm/Tag/poster.json +++ b/packages/catalog-realm/Tag/poster.json @@ -1,11 +1,5 @@ { "data": { - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, "type": "card", "attributes": { "name": "Poster", @@ -17,6 +11,12 @@ "cardThumbnailURL": null } }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" + } + }, "relationships": { "cardInfo.theme": { "links": { diff --git a/packages/catalog-realm/Tag/report.json b/packages/catalog-realm/Tag/report.json index f95c54cf3c2..adc40233c18 100644 --- a/packages/catalog-realm/Tag/report.json +++ b/packages/catalog-realm/Tag/report.json @@ -1,20 +1,20 @@ { "data": { "type": "card", - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, "attributes": { - "name": "report", + "name": "Report", "color": "#10B981", "cardInfo": { - "name": "report", + "notes": null, + "name": "Report", "summary": "Generated summaries, financial reports, audit reports, and structured output documents.", - "cardThumbnailURL": null, - "notes": null + "cardThumbnailURL": null + } + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" } }, "relationships": { diff --git a/packages/catalog-realm/Tag/skill.json b/packages/catalog-realm/Tag/skill.json index 66ab604de6d..ef242c56fcc 100644 --- a/packages/catalog-realm/Tag/skill.json +++ b/packages/catalog-realm/Tag/skill.json @@ -2,11 +2,11 @@ "data": { "type": "card", "attributes": { - "name": "skill", + "name": "Skill", "color": "#10B981", "cardInfo": { "notes": null, - "name": "skill", + "name": "Skill", "summary": "Cards and apps that teach, demonstrate, or practice specific AI skills, capabilities, and techniques.", "cardThumbnailURL": null } diff --git a/packages/catalog-realm/Tag/template.json b/packages/catalog-realm/Tag/template.json index ce11c9a013b..3f369322d93 100644 --- a/packages/catalog-realm/Tag/template.json +++ b/packages/catalog-realm/Tag/template.json @@ -1,20 +1,20 @@ { "data": { "type": "card", - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, "attributes": { - "name": "template", + "name": "Template", "color": "#10B981", "cardInfo": { - "name": "template", + "notes": null, + "name": "Template", "summary": "Reusable starting points and boilerplates ready to be customised for your own use.", - "cardThumbnailURL": null, - "notes": null + "cardThumbnailURL": null + } + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" } }, "relationships": { diff --git a/packages/catalog-realm/Tag/theme.json b/packages/catalog-realm/Tag/theme.json index d6578b9015c..e0c0625ff3e 100644 --- a/packages/catalog-realm/Tag/theme.json +++ b/packages/catalog-realm/Tag/theme.json @@ -1,11 +1,5 @@ { "data": { - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, "type": "card", "attributes": { "name": "Theme", @@ -17,6 +11,12 @@ "cardThumbnailURL": null } }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" + } + }, "relationships": { "cardInfo.theme": { "links": { diff --git a/packages/catalog-realm/Tag/tracker.json b/packages/catalog-realm/Tag/tracker.json index 4a9869db31d..253e882f6b9 100644 --- a/packages/catalog-realm/Tag/tracker.json +++ b/packages/catalog-realm/Tag/tracker.json @@ -1,20 +1,20 @@ { "data": { "type": "card", - "meta": { - "adoptsFrom": { - "name": "Tag", - "module": "../catalog-app/listing/tag" - } - }, "attributes": { - "name": "tracker", + "name": "Tracker", "color": "#10B981", "cardInfo": { - "name": "tracker", + "notes": null, + "name": "Tracker", "summary": "Habit trackers, expense trackers, progress trackers, and any card focused on monitoring over time.", - "cardThumbnailURL": null, - "notes": null + "cardThumbnailURL": null + } + }, + "meta": { + "adoptsFrom": { + "module": "../catalog-app/listing/tag", + "name": "Tag" } }, "relationships": { diff --git a/packages/catalog-realm/catalog-app/catalog_structure.md b/packages/catalog-realm/catalog-app/catalog_structure.md index 93aa155a717..d1ff3d053fa 100644 --- a/packages/catalog-realm/catalog-app/catalog_structure.md +++ b/packages/catalog-realm/catalog-app/catalog_structure.md @@ -219,7 +219,6 @@ Describe **what the card/app does** or **its functional purpose**: |-----|---------| | **app** | Full applications such as news readers, todo apps, CRMs, and other multi-feature tools | | **card** | Simple single-purpose cards that display or capture one focused piece of information | -| **card-type** | Meta-category for organizing different card types | | **dashboard** | Data overview and analytics views that summarise key metrics at a glance | | **form** | Data entry forms, surveys, intake forms, and structured input collection cards | | **game** | Cards and apps for gaming, game tracking, scoreboards, turn management | @@ -304,7 +303,7 @@ Tags use consistent colors based on their type for visual distinction: ### Key Points -- 22 total tags (14 Content Type + 8 Source/Origin) +- 21 total tags (13 Content Type + 8 Source/Origin) - Multiple tags can be applied to a single card/app - Color-coded by type for visual distinction - Tags provide flexible metadata beyond category structure @@ -340,7 +339,7 @@ catalog-realm/ │ ├── official.json # Source/Origin - Orange │ ├── user-contributed.json # Source/Origin - Orange │ ├── ai.json # Source/Origin - Orange -│ └── ... (22 total tags) +│ └── ... (21 total tags) │ └── CATALOG_STRUCTURE.md # This documentation ``` From 97b22f8d768abaaa4c621ad19833a62efc2600fd Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 16 Apr 2026 14:27:01 +0800 Subject: [PATCH 4/8] fix typo --- packages/host/app/commands/listing-create.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/host/app/commands/listing-create.ts b/packages/host/app/commands/listing-create.ts index 89adfd7948d..d82248c77fc 100644 --- a/packages/host/app/commands/listing-create.ts +++ b/packages/host/app/commands/listing-create.ts @@ -524,7 +524,7 @@ export default class ListingCreateCommand extends HostBaseCommand< max: 1, additionalSystemPrompt: 'You are selecting from an existing list of catalog tags. ' + - "Choose the most specific descriptive tags that describes the card's subject matter, use case, or domain. " + + "Choose the most specific descriptive tag that describes the card's subject matter, use case, or domain. " + 'If no tag clearly fits the subject matter, select a Source/Origin tag as a fallback (From tag pools). ' + 'Return [] only if no appropriate tag exists.', }, From 7f469a6baf2731ecbb33e270075dc67645913f13 Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 16 Apr 2026 14:34:41 +0800 Subject: [PATCH 5/8] fix wrong path --- .../crm-app/Tag/8a14f671-4daf-4195-aca5-85dc143d15b8.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/catalog-realm/crm-app/Tag/8a14f671-4daf-4195-aca5-85dc143d15b8.json b/packages/catalog-realm/crm-app/Tag/8a14f671-4daf-4195-aca5-85dc143d15b8.json index 74d3471fbe8..253e6559f71 100644 --- a/packages/catalog-realm/crm-app/Tag/8a14f671-4daf-4195-aca5-85dc143d15b8.json +++ b/packages/catalog-realm/crm-app/Tag/8a14f671-4daf-4195-aca5-85dc143d15b8.json @@ -13,7 +13,7 @@ }, "meta": { "adoptsFrom": { - "module": "../catalog-app/listing/tag", + "module": "../tag", "name": "Tag" } }, From 1484a2e402bc38fbadafc3d11a93cd2dc1dcd54f Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 16 Apr 2026 14:40:46 +0800 Subject: [PATCH 6/8] fix wrong path --- .../Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893.json | 2 +- .../Tag/e3625690-2231-428e-8f6d-d123d8f5cc6c.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/catalog-realm/sprint-planner/Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893.json b/packages/catalog-realm/sprint-planner/Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893.json index e23f468013a..b3ff8fda1d8 100644 --- a/packages/catalog-realm/sprint-planner/Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893.json +++ b/packages/catalog-realm/sprint-planner/Tag/631d1b5d-fcd0-465c-964e-e535fc6bb893.json @@ -13,7 +13,7 @@ }, "meta": { "adoptsFrom": { - "module": "../catalog-app/listing/tag", + "module": "../tag", "name": "Tag" } }, diff --git a/packages/catalog-realm/sprint-planner/Tag/e3625690-2231-428e-8f6d-d123d8f5cc6c.json b/packages/catalog-realm/sprint-planner/Tag/e3625690-2231-428e-8f6d-d123d8f5cc6c.json index 0caaf4d353d..8fd626a5907 100644 --- a/packages/catalog-realm/sprint-planner/Tag/e3625690-2231-428e-8f6d-d123d8f5cc6c.json +++ b/packages/catalog-realm/sprint-planner/Tag/e3625690-2231-428e-8f6d-d123d8f5cc6c.json @@ -13,7 +13,7 @@ }, "meta": { "adoptsFrom": { - "module": "../catalog-app/listing/tag", + "module": "../tag", "name": "Tag" } }, From 1b25dcbcdeced2cb44c551c89a189fcbc110276c Mon Sep 17 00:00:00 2001 From: Lucas Date: Thu, 16 Apr 2026 15:10:10 +0800 Subject: [PATCH 7/8] fix codex comment --- .../host/app/commands/one-shot-llm-request.ts | 2 +- .../host/app/commands/search-and-choose.ts | 20 +++++-- .../commands/search-and-choose-test.gts | 56 ++++++++++++++++++- 3 files changed, 71 insertions(+), 7 deletions(-) diff --git a/packages/host/app/commands/one-shot-llm-request.ts b/packages/host/app/commands/one-shot-llm-request.ts index 5819963786d..30091c18aca 100644 --- a/packages/host/app/commands/one-shot-llm-request.ts +++ b/packages/host/app/commands/one-shot-llm-request.ts @@ -167,7 +167,7 @@ export default class OneShotLlmRequestCommand extends HostBaseCommand< url: 'https://openrouter.ai/api/v1/chat/completions', method: 'POST', requestBody: JSON.stringify({ - model: input.llmModel || 'anthropic/claude-3-haiku', + model: input.llmModel || 'anthropic/claude-haiku-4.5', messages: generationMessages, stream: false, }), diff --git a/packages/host/app/commands/search-and-choose.ts b/packages/host/app/commands/search-and-choose.ts index b139d4dc1f9..18f3866f591 100644 --- a/packages/host/app/commands/search-and-choose.ts +++ b/packages/host/app/commands/search-and-choose.ts @@ -154,10 +154,22 @@ export default class SearchAndChooseCommand extends HostBaseCommand< try { const parsed = JSON.parse(text); if (!Array.isArray(parsed)) return []; - return parsed.filter( - (v): v is number => - typeof v === 'number' && Number.isInteger(v) && v > 0, - ); + return parsed + .map((v) => { + // Accept either a number or a string representation of a positive integer + if (typeof v === 'number' && Number.isInteger(v) && v > 0) { + return v; + } + if (typeof v === 'string') { + const num = parseInt(v, 10); + // Verify the entire string was consumed (no partial parsing like "1.5" -> 1) + if (Number.isInteger(num) && num > 0 && String(num) === v.trim()) { + return num; + } + } + return null; + }) + .filter((v): v is number => v !== null); } catch { return []; } diff --git a/packages/host/tests/integration/commands/search-and-choose-test.gts b/packages/host/tests/integration/commands/search-and-choose-test.gts index 5b4bdf61a9a..69bfbd2c891 100644 --- a/packages/host/tests/integration/commands/search-and-choose-test.gts +++ b/packages/host/tests/integration/commands/search-and-choose-test.gts @@ -56,7 +56,7 @@ module('Integration | commands | search-and-choose', function (hooks) { choices: [ { message: { - content: JSON.stringify([`${testRealmURL}Choice/alpha`]), + content: JSON.stringify([1]), }, }, ], @@ -146,7 +146,7 @@ export class ContextCard extends CardDef { ); }); - test('uses sourceContextCodeRef source instead of the searched type source', async function (assert) { + test('LLM index selection uses sourceContextCodeRef as context', async function (assert) { let result = await searchAndChooseCommand.execute({ candidateTypeCodeRef: { module: `${testRealmURL}choice.gts`, @@ -178,4 +178,56 @@ export class ContextCard extends CardDef { 'LLM request does not include the searched type source', ); }); + + test('parseIndicesFromLlmOutput accepts numeric literals', function (assert) { + const result = + searchAndChooseCommand['parseIndicesFromLlmOutput']('[1, 2, 3]'); + assert.deepEqual(result, [1, 2, 3]); + }); + + test('parseIndicesFromLlmOutput accepts quoted numeric strings', function (assert) { + const result = + searchAndChooseCommand['parseIndicesFromLlmOutput']('["1", "2", "3"]'); + assert.deepEqual(result, [1, 2, 3]); + }); + + test('parseIndicesFromLlmOutput handles mixed numeric and quoted strings', function (assert) { + const result = + searchAndChooseCommand['parseIndicesFromLlmOutput']('[1, "2", 3]'); + assert.deepEqual(result, [1, 2, 3]); + }); + + test('parseIndicesFromLlmOutput rejects non-numeric strings', function (assert) { + const result = + searchAndChooseCommand['parseIndicesFromLlmOutput']('["abc", "1.5", ""]'); + assert.deepEqual(result, []); + }); + + test('parseIndicesFromLlmOutput rejects zero and negative numbers', function (assert) { + const result = + searchAndChooseCommand['parseIndicesFromLlmOutput']('[0, -1, 1]'); + assert.deepEqual(result, [1]); + }); + + test('parseIndicesFromLlmOutput handles code block formatting', function (assert) { + const result = searchAndChooseCommand['parseIndicesFromLlmOutput']( + '```json\n["1", "2"]\n```', + ); + assert.deepEqual(result, [1, 2]); + }); + + test('parseIndicesFromLlmOutput returns empty array for empty input', function (assert) { + assert.deepEqual( + searchAndChooseCommand['parseIndicesFromLlmOutput'](''), + [], + ); + assert.deepEqual( + searchAndChooseCommand['parseIndicesFromLlmOutput']('[]'), + [], + ); + assert.deepEqual( + searchAndChooseCommand['parseIndicesFromLlmOutput']('invalid json'), + [], + ); + }); }); From 1e0eb022a2accbee630cea7c433d0968e4809920 Mon Sep 17 00:00:00 2001 From: Lucas Date: Fri, 17 Apr 2026 11:28:21 +0800 Subject: [PATCH 8/8] fix copilot comment --- .../catalog-app/catalog_structure.md | 614 ------------------ packages/host/app/commands/listing-create.ts | 60 +- .../host/app/commands/one-shot-llm-request.ts | 5 - .../host/app/commands/search-and-choose.ts | 18 +- 4 files changed, 40 insertions(+), 657 deletions(-) delete mode 100644 packages/catalog-realm/catalog-app/catalog_structure.md diff --git a/packages/catalog-realm/catalog-app/catalog_structure.md b/packages/catalog-realm/catalog-app/catalog_structure.md deleted file mode 100644 index d1ff3d053fa..00000000000 --- a/packages/catalog-realm/catalog-app/catalog_structure.md +++ /dev/null @@ -1,614 +0,0 @@ -# Catalog Structure Reference - -**For**: `catalog-app/listing` - Catalog listing organization and classification -**Location**: `catalog-realm/catalog-app/` - -This document describes the foundational structure of the Boxel catalog-realm, including **Spheres**, **Categories**, and **Tags**. These components work together to organize and classify cards, apps, and other content in the catalog through the `catalog-app/listing` module. - ---- - -## 📚 Table of Contents - -1. [Overview](#overview) -2. [Catalog-App Listing](#catalog-app-listing) -3. [Spheres](#spheres) -4. [Categories](#categories) -5. [Tags](#tags) -6. [File Structure](#file-structure) -7. [Relationships](#relationships) -8. [Examples](#examples) - ---- - -## 🎯 Overview - -The catalog structure is implemented through the **`catalog-app/listing`** module, which defines the core components: -- `sphere.gts` - Sphere card definition -- `category.gts` - Category card definition -- `tag.gts` - Tag card definition -- `listing.gts` - Base listing structure used by all catalog items - -All Spheres, Categories, and Tags use `adoptsFrom` to reference these core definitions, ensuring consistent structure and behavior across the catalog. - ---- - -## 📱 Catalog-App Listing - -The `catalog-app/listing` folder contains the core Glimmer TypeScript (GTS) components that define how catalog items are structured and displayed: - -### Core Files - -| File | Purpose | -|------|---------| -| `sphere.gts` | Defines the Sphere card type - top-level organizational structure | -| `category.gts` | Defines the Category card type - thematic groupings within spheres | -| `tag.gts` | Defines the Tag card type - flexible metadata labels | -| `listing.gts` | Base listing structure for cards, apps, fields, themes, and skills | - -### Module References - -All catalog components adopt from these modules: - -``` -adoptsFrom: { - "module": "../catalog-app/listing/sphere", // For Sphere cards - "module": "../catalog-app/listing/category", // For Category cards - "module": "../catalog-app/listing/tag", // For Tag cards - "module": "../catalog-app/listing/listing" // For Listings (CardListing, AppListing, etc.) -} -``` - -### Integration Points - -The catalog-app listing module: -- Defines JSON schema for all catalog items -- Provides UI components for rendering catalogs -- Manages relationships between spheres, categories, tags, and listings -- Handles filtering and navigation by type, category, and tag -- Supports metadata display (cardInfo, color coding, themes) - ---- - -## 🌍 Spheres - -Spheres are the **top-level organizational structure** that group all activities and interests into five major life areas. - -### Sphere Overview - -| Sphere | File | Purpose | Categories | Count | -|--------|------|---------|-----------|-------| -| **WORK** | `Sphere/work.json` | Professional, business, and work-related activities | Accounting, Business Development, HR, Marketing, Project Management, etc. | 15 | -| **PLAY** | `Sphere/play.json` | Entertainment, leisure, and recreational activities | Entertainment, Gaming, Sports, Hobbies, Parties, etc. | 9 | -| **BUILD** | `Sphere/build.json` | Creation, development, and technical activities | Software Development, AI/Automation, Design, DevOps, Web Development, etc. | 15 | -| **LEARN** | `Sphere/learn.json` | Education, knowledge, and skill development | Education, Training, Research, Teaching, Technical Documentation, etc. | 11 | -| **LIFE** | `Sphere/life.json` | Personal, lifestyle, and everyday activities | Health, Family, Finance, Travel, Shopping, Events, etc. | 12 | - -### Sphere JSON Structure - -```json -{ - "data": { - "type": "card", - "attributes": { - "name": "WORK" - }, - "meta": { - "adoptsFrom": { - "module": "../catalog-app/listing/sphere", - "name": "Sphere" - } - } - } -} -``` - -### Key Points - -- Each sphere represents a major life area -- All categories are linked to exactly one sphere -- Spheres serve as the primary organizational level for browsing and filtering -- Named in UPPERCASE for distinction -- **Adopts from** `catalog-app/listing/sphere.gts` - the core Sphere component definition -- Rendered by the Sphere component in `catalog-app/listing/` - ---- - -## 📂 Categories - -Categories are **thematic groupings of related content** that belong to a specific sphere. Each category focuses on a particular domain or topic. - -### Category Overview - -Categories organize content by topic within their assigned sphere. For example: - -- **WORK Sphere** contains categories like: Accounting & Finance, Marketing & Growth, Project Management, HR & People Management -- **PLAY Sphere** contains categories like: Entertainment & Media, Sports & Fitness, Gaming, Hobbies & Crafts -- **BUILD Sphere** contains categories like: Software Development, AI & Automation, Design & Creative, DevOps & Infrastructure -- **LEARN Sphere** contains categories like: Education & Courses, Knowledge Management, Research & Knowledge -- **LIFE Sphere** contains categories like: Health & Wellness, Personal Finance, Travel & Lifestyle - -### Category JSON Structure - -```json -{ - "data": { - "meta": { - "adoptsFrom": { - "name": "Category", - "module": "../catalog-app/listing/category" - } - }, - "type": "card", - "attributes": { - "name": "Software Development", - "cardInfo": { - "notes": null, - "name": "Software Development", - "summary": "Application development, coding projects, software architecture, version control, and code review processes.", - "cardThumbnailURL": null - } - }, - "relationships": { - "sphere": { - "links": { - "self": "../Sphere/build" - } - }, - "cardInfo.theme": { - "links": { - "self": null - } - } - } - } -} -``` - -### Category File Naming Convention - -- **Format**: `kebab-case.json` -- **Example**: `software-development.json`, `personal-finance.json`, `travel-lifestyle.json` -- **Location**: `Category/` directory - -### Category Key Fields - -| Field | Type | Purpose | -|-------|------|---------| -| `name` | string | Display name of the category (e.g., "Software Development") | -| `cardInfo.name` | string | Card info name (typically matches `name`) | -| `cardInfo.summary` | string | Description of what content is in this category | -| `sphere` (relationship) | link | Reference to parent sphere (`work`, `play`, `build`, `learn`, or `life`) | - -### Key Points - -- 58 total categories across all spheres -- Each category belongs to exactly one sphere -- Kebab-case filenames for consistency -- `cardInfo` contains display information used in UI -- All categories have descriptive summaries -- **Adopts from** `catalog-app/listing/category.gts` - the core Category component definition -- Rendered by the Category component in `catalog-app/listing/` - ---- - -## 🏷️ Tags - -Tags are **flexible metadata labels** that describe characteristics of cards and apps. They add additional context beyond category classification. - -### Tag Purpose & Role - -Tags serve as **flexible metadata filters** that enable discovery and organization beyond the rigid sphere-category hierarchy: - -- **Functional Labeling**: Describe *what* a card/app does or *how* it's used (Content Type tags) -- **Contextual Metadata**: Add information about origin, quality, or special characteristics (Source/Origin tags) -- **Multi-Tagging**: A single card/app can have multiple tags, enabling cross-cutting categorization -- **Enhanced Discovery**: Users can filter by tags to find cards matching specific use cases or characteristics -- **Flexible Organization**: Unlike categories (fixed hierarchy), tags allow cards to be discovered through multiple dimensions - -**Key Difference from Categories**: Categories are mutually exclusive and create hierarchy (one per card), while tags are additive and enable flexible cross-cutting organization. - -### Tag Types - -Tags are divided into two main types based on what they describe: - -#### 1. Content Type Tags (Green - #10B981) - -Describe **what the card/app does** or **its functional purpose**: - -| Tag | Purpose | -|-----|---------| -| **app** | Full applications such as news readers, todo apps, CRMs, and other multi-feature tools | -| **card** | Simple single-purpose cards that display or capture one focused piece of information | -| **dashboard** | Data overview and analytics views that summarise key metrics at a glance | -| **form** | Data entry forms, surveys, intake forms, and structured input collection cards | -| **game** | Cards and apps for gaming, game tracking, scoreboards, turn management | -| **planner** | Meal planners, project planners, schedule cards, and planning-focused tools | -| **poster** | Cards designed for creating posters, flyers, promotional visuals | -| **report** | Generated summaries, financial reports, audit reports, structured output documents | -| **template** | Reusable starting points and boilerplates ready to be customised | -| **theme** | Visual themes and styling cards that customize appearance and color scheme | -| **tracker** | Habit trackers, expense trackers, progress trackers, monitoring tools | -| **calculator** | Cards that perform numerical computations, financial calculations, unit conversions | -| **skill** | Cards and apps that teach, demonstrate, or practice specific AI skills, capabilities, and techniques | - -#### 2. Source/Origin Tags (Orange - #F97316) - -Describe **where it comes from or its status/quality**: - -| Tag | Purpose | -|-----|---------| -| **ai** | Cards and apps that use artificial intelligence or machine learning, LLM-powered features | -| **bundled** | Cards or apps packaged together as a curated set, combining multiple components | -| **community** | Created and shared by the community (complementary to user-contributed) | -| **featured** | Curated and highlighted listings selected by the catalog team as top picks | -| **general** | Universal fallback tag for cards that don't fit specific types | -| **new** | Recently added listings in the catalog | -| **official** | Cards and apps officially created and maintained by Cardstack team | -| **user-contributed** | Content created and submitted by community members | - -### Tag JSON Structure - -```json -{ - "data": { - "type": "card", - "attributes": { - "name": "dashboard", - "color": "#10B981", - "cardInfo": { - "notes": null, - "name": "dashboard", - "summary": "Data overview and analytics views that summarise key metrics at a glance.", - "cardThumbnailURL": null - } - }, - "meta": { - "adoptsFrom": { - "module": "../catalog-app/listing/tag", - "name": "Tag" - } - }, - "relationships": { - "cardInfo.theme": { - "links": { - "self": null - } - } - } - } -} -``` - -### Tag File Naming Convention - -- **Format**: `kebab-case.json` -- **Example**: `dashboard.json`, `user-contributed.json`, `official.json` -- **Location**: `Tag/` directory - -### Tag Color Coding - -Tags use consistent colors based on their type for visual distinction: - -- **🟢 Green (#10B981)** - Content Type tags (what it does) -- **🟠 Orange (#F97316)** - Source/Origin tags (where it comes from) - -### Tag Key Fields - -| Field | Type | Purpose | -|-------|------|---------| -| `name` | string | Display name of the tag | -| `color` | string | Hex color code (#10B981 for Content Type, #F97316 for Source/Origin) | -| `cardInfo.name` | string | Card info name (matches `name`) | -| `cardInfo.summary` | string | Description of what the tag represents | - -### Key Points - -- 21 total tags (13 Content Type + 8 Source/Origin) -- Multiple tags can be applied to a single card/app -- Color-coded by type for visual distinction -- Tags provide flexible metadata beyond category structure -- **Adopts from** `catalog-app/listing/tag.gts` - the core Tag component definition -- Rendered by the Tag component in `catalog-app/listing/` - ---- - -## 📁 File Structure - -``` -catalog-realm/ -├── Sphere/ -│ ├── work.json # WORK sphere (15 categories) -│ ├── play.json # PLAY sphere (9 categories) -│ ├── build.json # BUILD sphere (15 categories) -│ ├── learn.json # LEARN sphere (11 categories) -│ └── life.json # LIFE sphere (12 categories) -│ -├── Category/ -│ ├── software-development.json # BUILD sphere -│ ├── personal-finance.json # LIFE sphere -│ ├── project-management.json # WORK sphere -│ ├── entertainment-media.json # PLAY sphere -│ ├── education-courses.json # LEARN sphere -│ └── ... (58 total categories) -│ -├── Tag/ -│ ├── dashboard.json # Content Type - Green -│ ├── form.json # Content Type - Green -│ ├── app.json # Content Type - Green -│ ├── skill.json # Content Type - Green -│ ├── official.json # Source/Origin - Orange -│ ├── user-contributed.json # Source/Origin - Orange -│ ├── ai.json # Source/Origin - Orange -│ └── ... (21 total tags) -│ -└── CATALOG_STRUCTURE.md # This documentation -``` - ---- - -## 🔗 Relationships - -The catalog structure creates a hierarchical relationship system: - -### Sphere → Category → Tags - -``` -WORK Sphere -├── Accounting & Finance -│ ├── Tags: dashboard, report, tracker -│ └── Related Cards: Financial apps, calculators -├── Project Management -│ ├── Tags: app, dashboard, planner, tracker -│ └── Related Cards: Project tracking apps -└── HR & People Management - ├── Tags: form, dashboard, tracker - └── Related Cards: HR management tools - -BUILD Sphere -├── Software Development -│ ├── Tags: app, official, ai -│ └── Related Cards: Development tools, IDE integrations -├── AI & Automation -│ ├── Tags: ai, official, template -│ └── Related Cards: AI-powered cards, automation tools -└── Design & Creative - ├── Tags: template, poster, theme - └── Related Cards: Design tools, templates -``` - -### Reference Links in JSON - -**Category linking to Sphere:** -```json -"relationships": { - "sphere": { - "links": { - "self": "../Sphere/work" // References work.json - } - } -} -``` - -**CardListing linking to Categories and Tags:** -```json -"relationships": { - "categories.0": { - "links": { - "self": "../Category/software-development" // References Category - } - }, - "tags.0": { - "links": { - "self": "../Tag/app" // References Tag - } - }, - "tags.1": { - "links": { - "self": "../Tag/official" // References Tag - } - } -} -``` - ---- - -## 📋 Examples - -### Example 1: Complete Category Definition - -**File**: `Category/software-development.json` - -```json -{ - "data": { - "meta": { - "adoptsFrom": { - "name": "Category", - "module": "../catalog-app/listing/category" - } - }, - "type": "card", - "attributes": { - "name": "Software Development", - "cardInfo": { - "notes": null, - "name": "Software Development", - "summary": "Application development, coding projects, software architecture, version control, and code review processes.", - "cardThumbnailURL": null - } - }, - "relationships": { - "sphere": { - "links": { - "self": "../Sphere/build" - } - }, - "cardInfo.theme": { - "links": { - "self": null - } - } - } - } -} -``` - -### Example 2: Card Using Multiple Tags and Categories - -**File**: `CardListing/game-quiz.json` - -```json -{ - "data": { - "meta": { - "adoptsFrom": { - "name": "CardListing", - "module": "../catalog-app/listing/listing" - } - }, - "type": "card", - "attributes": { - "name": "Game Quiz", - "summary": "Interactive game-based quizzes framework", - "cardInfo": { - "name": "Game Quiz Listing", - "summary": "Comprehensive framework for creating interactive game-based quizzes" - } - }, - "relationships": { - "categories.0": { - "links": { - "self": "../Category/entertainment-media" - } - }, - "tags.0": { - "links": { - "self": "../Tag/game" // Content Type - Green - } - }, - "tags.1": { - "links": { - "self": "../Tag/ai" // Source/Origin - Orange - } - } - } - } -} -``` - -### Example 3: All Spheres at a Glance - -| Sphere | Count | Sample Categories | -|--------|-------|-------------------| -| 🎯 **WORK** | 15 | Accounting & Finance, Project Management, HR & People Management, Marketing & Growth | -| 🎮 **PLAY** | 9 | Entertainment & Media, Gaming, Sports & Fitness, Hobbies & Crafts | -| 🔨 **BUILD** | 15 | Software Development, AI & Automation, Design & Creative, DevOps & Infrastructure | -| 📚 **LEARN** | 11 | Education & Courses, Knowledge Management, Research & Knowledge, Teaching & Instruction | -| 💚 **LIFE** | 12 | Health & Wellness, Personal Finance, Travel & Lifestyle, Family & Relationships | - ---- - -## 🎯 Quick Reference - -### Finding Content - -1. **By Life Area**: Start with Spheres (Work, Play, Build, Learn, Life) -2. **By Topic**: Navigate to Categories within a Sphere -3. **By Characteristic**: Filter using Tags (Content Type or Source/Origin) - -### Creating New Content - -1. **Assign to Sphere**: Determine which life area it belongs to -2. **Assign to Category**: Choose the most relevant topic category -3. **Apply Tags**: Add Content Type tags (green) describing functionality -4. **Apply Tags**: Add Source/Origin tags (orange) describing source/status - -### Best Practices - -- ✅ Every category must have a sphere reference -- ✅ Content type and source/origin tags should both be used together -- ✅ Use kebab-case for all filenames -- ✅ Provide clear, descriptive summaries in cardInfo -- ✅ Keep color codes consistent (Green for content type, Orange for source/origin) - ---- - -## 📊 Statistics - -| Component | Count | Type | -|-----------|-------|------| -| **Spheres** | 5 | Top-level organizational structure | -| **Categories** | 58 | Thematic groupings within spheres | -| **Tags** | 21 | Flexible metadata (13 Content Type + 8 Source/Origin) | -| **Total Catalog Items** | 84 | Complete catalog organizational structure | - ---- - -## 🔄 Hierarchy Overview - -``` -┌─────────────────────────────────────────┐ -│ CATALOG-REALM STRUCTURE │ -├─────────────────────────────────────────┤ -│ Spheres (5) │ -│ ├─ WORK, PLAY, BUILD, LEARN, LIFE │ -│ └─ Each contains 9-15 categories │ -├─────────────────────────────────────────┤ -│ Categories (58) │ -│ ├─ Thematic topics within spheres │ -│ └─ Each links to exactly one sphere │ -├─────────────────────────────────────────┤ -│ Tags (21) │ -│ ├─ Content Type (Green): 13 │ -│ ├─ Source/Origin (Orange): 8 │ -│ └─ Multiple tags per card/app │ -└─────────────────────────────────────────┘ -``` - ---- - -## 📝 Notes - -- All filenames use kebab-case (lowercase with hyphens) -- All files are JSON format stored in `catalog-realm/` -- Color codes provide visual distinction for tag types -- Relationships are maintained through relative paths (`../Sphere/work`) -- The structure is designed to be flexible and scalable - ---- - -## 📞 Related Files & Locations - -### Catalog Components -- `../Sphere/` - Sphere instances (work, play, build, learn, life) -- `../Category/` - Category instances (58 total) -- `../Tag/` - Tag instances (21 total) - -### Catalog-App Listing (Core Definitions) -- `listing/sphere.gts` - Sphere card component definition -- `listing/category.gts` - Category card component definition -- `listing/tag.gts` - Tag card component definition -- `listing/listing.gts` - Base listing component for all catalog items - -### Related Directories -- `../CardListing/` - Card listings using catalog structure -- `../AppListing/` - App listings using catalog structure -- `../FieldListing/` - Field listings using catalog structure -- `../SkillListing/` - Skill listings using catalog structure -- `../ThemeListing/` - Theme listings using catalog structure - ---- - -## 🔗 How It Works - -1. **Core Definition**: `catalog-app/listing/` defines the structure -2. **Instances**: Spheres, Categories, and Tags are created as JSON instances -3. **Adoption**: All instances use `adoptsFrom` to reference core definitions -4. **Listings**: Cards, apps, and other content link to categories and tags -5. **UI Rendering**: Components in `catalog-app/listing/` handle display and interaction - ---- - -**Last Updated**: 2024 -**Version**: 1.1 -**Scope**: Catalog-realm structure for catalog-app/listing module diff --git a/packages/host/app/commands/listing-create.ts b/packages/host/app/commands/listing-create.ts index d82248c77fc..7610ca5a4a1 100644 --- a/packages/host/app/commands/listing-create.ts +++ b/packages/host/app/commands/listing-create.ts @@ -153,34 +153,44 @@ export default class ListingCreateCommand extends HostBaseCommand< const listingCard = listing as CardAPI.CardDef; const firstOpenCardId = openCardIds?.[0]; - const backgroundWork = Promise.allSettled([ - this.autoPatchName(listingCard, codeRef), - this.autoPatchSummary(listingCard, codeRef), - this.autoLinkTag(listingCard, codeRef), - this.autoLinkCategory(listingCard, codeRef), - this.autoLinkLicense(listingCard), - this.autoLinkExample(listingCard, codeRef, openCardIds), - this.linkSpecs( - listingCard, - targetRealm, - firstOpenCardId ?? codeRef?.module, - codeRef.module, - codeRef, - ), - ]).then((results) => { - const names = [ - 'autoPatchName', - 'autoPatchSummary', - 'autoLinkTag', - 'autoLinkCategory', - 'autoLinkLicense', - 'autoLinkExample', - 'linkSpecs', - ]; + const backgroundTasks = [ + { + name: 'autoPatchName', + promise: this.autoPatchName(listingCard, codeRef), + }, + { + name: 'autoPatchSummary', + promise: this.autoPatchSummary(listingCard, codeRef), + }, + { name: 'autoLinkTag', promise: this.autoLinkTag(listingCard, codeRef) }, + { + name: 'autoLinkCategory', + promise: this.autoLinkCategory(listingCard, codeRef), + }, + { name: 'autoLinkLicense', promise: this.autoLinkLicense(listingCard) }, + { + name: 'autoLinkExample', + promise: this.autoLinkExample(listingCard, codeRef, openCardIds), + }, + { + name: 'linkSpecs', + promise: this.linkSpecs( + listingCard, + targetRealm, + firstOpenCardId ?? codeRef?.module, + codeRef.module, + codeRef, + ), + }, + ]; + + const backgroundWork = Promise.allSettled( + backgroundTasks.map((t) => t.promise), + ).then((results) => { results.forEach((result, i) => { if (result.status === 'rejected') { console.warn( - `Background autopatch failed [${names[i]}]:`, + `Background autopatch failed [${backgroundTasks[i].name}]:`, result.reason, ); } diff --git a/packages/host/app/commands/one-shot-llm-request.ts b/packages/host/app/commands/one-shot-llm-request.ts index 30091c18aca..30968217d1c 100644 --- a/packages/host/app/commands/one-shot-llm-request.ts +++ b/packages/host/app/commands/one-shot-llm-request.ts @@ -180,11 +180,6 @@ export default class OneShotLlmRequestCommand extends HostBaseCommand< } const responseData = await result.response.json(); - oneShotLogger.debug('raw llm response meta', { - status: result.response.status, - model: input.llmModel || 'anthropic/claude-haiku-4.5', - usage: responseData.usage || null, - }); const output = responseData.choices?.[0]?.message?.content || null; oneShotLogger.debug('llm request complete', output); diff --git a/packages/host/app/commands/search-and-choose.ts b/packages/host/app/commands/search-and-choose.ts index 18f3866f591..8af46d846c1 100644 --- a/packages/host/app/commands/search-and-choose.ts +++ b/packages/host/app/commands/search-and-choose.ts @@ -96,14 +96,13 @@ export default class SearchAndChooseCommand extends HostBaseCommand< const res = await oneShot.execute({ systemPrompt, userPrompt, - llmModel: llmModel || 'anthropic/claude-haiku-4.5', + llmModel, codeRef: selectionContextCodeRef ?? candidateTypeCodeRef, }); const validInstances = instances.filter((c: any) => c && c.id); - const selectedIndices = this.parseIndicesFromLlmOutput( - res.output || '[]', - ).slice(0, max); + const rawIndices = this.parseIndicesFromLlmOutput(res.output || '[]'); + const selectedIndices = Array.from(new Set(rawIndices)).slice(0, max); const selectedCards = selectedIndices .map((i) => validInstances[i - 1]) .filter(Boolean); @@ -112,14 +111,7 @@ export default class SearchAndChooseCommand extends HostBaseCommand< // Log a warning if the LLM output could not be parsed into valid selections, to aid debugging if (selectedCards.length === 0) { console.warn( - `[SearchAndChoose:${candidateTypeCodeRef.name}] result is empty. candidates sent to LLM:\n${numberedCandidates}`, - ); - console.warn( - `[SearchAndChoose:${candidateTypeCodeRef.name}] LLM raw output: "${res.output}"`, - ); - console.warn( - `[SearchAndChoose:${candidateTypeCodeRef.name}] parsed indices:`, - selectedIndices, + `[SearchAndChoose:${candidateTypeCodeRef.name}] LLM could not find a relevant option from ${validInstances.length} available cards. LLM output: "${res.output}" (Parsed indices: ${selectedIndices})`, ); } @@ -179,7 +171,7 @@ export default class SearchAndChooseCommand extends HostBaseCommand< return instances .filter((c) => c && c.id) .map((c, i) => { - const name = c.cardInfo?.name || c.name || ''; + const name = c.cardTitle || c.name || ''; const summary = c.cardInfo?.summary || ''; return summary ? `${i + 1}. ${name} — ${summary}` : `${i + 1}. ${name}`; })