From 36281dbacdcab59fd8ce8d265b22cacec25bbcf3 Mon Sep 17 00:00:00 2001 From: Buck Doyle Date: Wed, 18 Mar 2026 11:57:26 -0700 Subject: [PATCH] Add @cardstack/skills universal reference --- packages/host/app/lib/utils.ts | 13 ++++++------- packages/host/app/services/network.ts | 8 ++++++++ packages/matrix/helpers/isolated-realm-server.ts | 2 +- packages/matrix/tests/skills.spec.ts | 4 ++-- packages/realm-server/scripts/start-development.sh | 2 +- packages/realm-server/scripts/start-production.sh | 2 +- packages/realm-server/scripts/start-staging.sh | 2 +- .../scripts/start-worker-development.sh | 2 +- .../realm-server/scripts/start-worker-production.sh | 2 +- .../realm-server/scripts/start-worker-staging.sh | 2 +- 10 files changed, 23 insertions(+), 16 deletions(-) diff --git a/packages/host/app/lib/utils.ts b/packages/host/app/lib/utils.ts index 873e5c0ad73..8210e6b2be0 100644 --- a/packages/host/app/lib/utils.ts +++ b/packages/host/app/lib/utils.ts @@ -155,18 +155,17 @@ export const catalogRealm = ENV.resolvedCatalogRealmURL export const skillsRealm = new RealmPaths(new URL(ENV.resolvedSkillsRealmURL)); /** - * Safely constructs a URL to a skill card in the skills realm. - * Uses the URL constructor to handle path joining safely. + * Safely constructs a universal @cardstack/skills/ reference to a skill card. * * @param skillId - The ID of the skill (e.g., 'boxel-environment', 'catalog-listing') - * @returns The complete URL to the skill card + * @returns The universal skill card reference * * @example - * skillCardURL('catalog-listing') // 'http://localhost:4201/skills/Skill/catalog-listing' + * skillCardURL('catalog-listing') // '@cardstack/skills/Skill/catalog-listing' */ export function skillCardURL(skillId: string): string { - return skillsRealm.fileURL(`Skill/${skillId}`).href; + return `@cardstack/skills/Skill/${skillId}`; } -export const devSkillId = skillsRealm.fileURL(devSkillLocalPath).href; -export const envSkillId = skillsRealm.fileURL(envSkillLocalPath).href; +export const devSkillId = `@cardstack/skills/${devSkillLocalPath}`; +export const envSkillId = `@cardstack/skills/${envSkillLocalPath}`; diff --git a/packages/host/app/services/network.ts b/packages/host/app/services/network.ts index a754f07d4c5..c452419d577 100644 --- a/packages/host/app/services/network.ts +++ b/packages/host/app/services/network.ts @@ -67,6 +67,14 @@ export default class NetworkService extends Service { (rest) => new URL(rest, catalogURL).href, ); } + if (config.resolvedSkillsRealmURL) { + let skillsURL = withTrailingSlash(config.resolvedSkillsRealmURL); + registerCardReferencePrefix('@cardstack/skills/', skillsURL); + virtualNetwork.addImportMap( + '@cardstack/skills/', + (rest) => new URL(rest, skillsURL).href, + ); + } if (config.resolvedOpenRouterRealmURL) { let openRouterURL = withTrailingSlash(config.resolvedOpenRouterRealmURL); registerCardReferencePrefix('@cardstack/openrouter/', openRouterURL); diff --git a/packages/matrix/helpers/isolated-realm-server.ts b/packages/matrix/helpers/isolated-realm-server.ts index 32216d5d32d..71312ea6d39 100644 --- a/packages/matrix/helpers/isolated-realm-server.ts +++ b/packages/matrix/helpers/isolated-realm-server.ts @@ -277,7 +277,7 @@ export async function startServer({ serverArgs = serverArgs.concat([ `--username='skills_realm'`, `--path='${skillsRealmDir}'`, - `--fromUrl='http://localhost:4205/skills/'`, + `--fromUrl='@cardstack/skills/'`, `--toUrl='http://localhost:4205/skills/'`, ]); serverArgs = serverArgs.concat([ diff --git a/packages/matrix/tests/skills.spec.ts b/packages/matrix/tests/skills.spec.ts index 629d521d222..7510be425cd 100644 --- a/packages/matrix/tests/skills.spec.ts +++ b/packages/matrix/tests/skills.spec.ts @@ -50,9 +50,9 @@ test.describe('Skills', () => { ).toContainClass('checked'); } - const environmentSkillCardId = `http://localhost:4205/skills/Skill/boxel-environment`; + const environmentSkillCardId = `@cardstack/skills/Skill/boxel-environment`; const defaultSkillCardsForCodeMode = [ - `http://localhost:4205/skills/Skill/boxel-development`, + `@cardstack/skills/Skill/boxel-development`, environmentSkillCardId, ]; const skillCard1 = `${appURL}/skill-pirate-speak`; diff --git a/packages/realm-server/scripts/start-development.sh b/packages/realm-server/scripts/start-development.sh index a1b07ba6e37..60ebc74c206 100755 --- a/packages/realm-server/scripts/start-development.sh +++ b/packages/realm-server/scripts/start-development.sh @@ -127,7 +127,7 @@ LOW_CREDIT_THRESHOLD="${LOW_CREDIT_THRESHOLD:-2000}" \ \ --path='../skills-realm/contents' \ --username='skills_realm' \ - --fromUrl="${REALM_BASE_URL}/skills/" \ + --fromUrl='@cardstack/skills/' \ --toUrl="${REALM_BASE_URL}/skills/" \ \ ${START_SUBMISSION:+--path="${SUBMISSION_REALM_PATH}"} \ diff --git a/packages/realm-server/scripts/start-production.sh b/packages/realm-server/scripts/start-production.sh index 139f9589316..bb59e7cd8fd 100755 --- a/packages/realm-server/scripts/start-production.sh +++ b/packages/realm-server/scripts/start-production.sh @@ -60,7 +60,7 @@ NODE_NO_WARNINGS=1 \ \ --path='/persistent/skills' \ --username='skills_realm' \ - --fromUrl='https://app.boxel.ai/skills/' \ + --fromUrl='@cardstack/skills/' \ --toUrl='https://app.boxel.ai/skills/' \ \ --path='/persistent/boxel-homepage' \ diff --git a/packages/realm-server/scripts/start-staging.sh b/packages/realm-server/scripts/start-staging.sh index 207381bb6a6..a62ccd5301b 100755 --- a/packages/realm-server/scripts/start-staging.sh +++ b/packages/realm-server/scripts/start-staging.sh @@ -60,7 +60,7 @@ NODE_NO_WARNINGS=1 \ \ --path='/persistent/skills' \ --username='skills_realm' \ - --fromUrl='https://realms-staging.stack.cards/skills/' \ + --fromUrl='@cardstack/skills/' \ --toUrl='https://realms-staging.stack.cards/skills/' \ \ --path='/persistent/boxel-homepage' \ diff --git a/packages/realm-server/scripts/start-worker-development.sh b/packages/realm-server/scripts/start-worker-development.sh index 2441b31f565..a7353eda05f 100755 --- a/packages/realm-server/scripts/start-worker-development.sh +++ b/packages/realm-server/scripts/start-worker-development.sh @@ -62,7 +62,7 @@ NODE_ENV=development \ ${START_CATALOG:+--fromUrl='@cardstack/catalog/'} \ ${START_CATALOG:+--toUrl="${CATALOG_REALM_URL}"} \ \ - --fromUrl="${REALM_BASE_URL}/skills/" \ + --fromUrl='@cardstack/skills/' \ --toUrl="${REALM_BASE_URL}/skills/" \ \ ${START_CATALOG:+--fromUrl="${EXTERNAL_CATALOG_REALM_URL}"} \ diff --git a/packages/realm-server/scripts/start-worker-production.sh b/packages/realm-server/scripts/start-worker-production.sh index 9993e12d4f1..09df8f7bb95 100755 --- a/packages/realm-server/scripts/start-worker-production.sh +++ b/packages/realm-server/scripts/start-worker-production.sh @@ -28,7 +28,7 @@ NODE_NO_WARNINGS=1 \ --fromUrl='@cardstack/catalog/' \ --toUrl="${CATALOG_REALM_URL}" \ \ - --fromUrl='https://app.boxel.ai/skills/' \ + --fromUrl='@cardstack/skills/' \ --toUrl='https://app.boxel.ai/skills/' \ \ --fromUrl="${EXTERNAL_CATALOG_REALM_URL}" \ diff --git a/packages/realm-server/scripts/start-worker-staging.sh b/packages/realm-server/scripts/start-worker-staging.sh index c34cb4d4a6e..340ef231cc2 100755 --- a/packages/realm-server/scripts/start-worker-staging.sh +++ b/packages/realm-server/scripts/start-worker-staging.sh @@ -33,7 +33,7 @@ NODE_NO_WARNINGS=1 \ --fromUrl="${EXTERNAL_CATALOG_REALM_URL}" \ --toUrl="${EXTERNAL_CATALOG_REALM_URL}" \ \ - --fromUrl='https://realms-staging.stack.cards/skills/' \ + --fromUrl='@cardstack/skills/' \ --toUrl='https://realms-staging.stack.cards/skills/' \ \ --fromUrl='@cardstack/openrouter/' \