Skip to content

Commit 3ab3d2c

Browse files
authored
Add @cardstack/skills universal reference (#4206)
1 parent 5c03aab commit 3ab3d2c

22 files changed

Lines changed: 100 additions & 101 deletions

File tree

mise-tasks/services/realm-server

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ LOW_CREDIT_THRESHOLD="${LOW_CREDIT_THRESHOLD:-2000}" \
102102
\
103103
--path='../skills-realm/contents' \
104104
--username='skills_realm' \
105-
--fromUrl="${REALM_BASE_URL}/skills/" \
105+
--fromUrl='@cardstack/skills/' \
106106
--toUrl="${REALM_BASE_URL}/skills/" \
107107
\
108108
${START_SUBMISSION:+--path="${SUBMISSION_REALM_PATH}"} \

mise-tasks/services/worker

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ NODE_ENV=development \
4040
${START_CATALOG:+--fromUrl='@cardstack/catalog/'} \
4141
${START_CATALOG:+--toUrl="${CATALOG_REALM_URL}"} \
4242
\
43-
--fromUrl="${REALM_BASE_URL}/skills/" \
43+
--fromUrl='@cardstack/skills/' \
4444
--toUrl="${REALM_BASE_URL}/skills/" \
4545
\
4646
${START_CATALOG:+--fromUrl="${EXTERNAL_CATALOG_REALM_URL}"} \

mise-tasks/services/worker-test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,5 @@ NODE_ENV=test \
3838
--toUrl="${REALM_TEST_URL}/test/" \
3939
--fromUrl='https://cardstack.com/base/' \
4040
--toUrl="${REALM_BASE_URL}/base/" \
41-
--fromUrl="${REALM_BASE_URL}/skills/" \
41+
--fromUrl='@cardstack/skills/' \
4242
--toUrl="${REALM_BASE_URL}/skills/"

packages/base/card-api.gts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2832,7 +2832,7 @@ function lazilyLoadLink(
28322832
fieldValue = (await createFromSerialized(
28332833
fileMetaDoc.data,
28342834
fileMetaDoc,
2835-
new URL(fileMetaDoc.data.id!),
2835+
cardIdToURL(fileMetaDoc.data.id!),
28362836
{ store, dependencyTrackingContext },
28372837
)) as FileDef;
28382838
} else {
@@ -2848,7 +2848,7 @@ function lazilyLoadLink(
28482848
fieldValue = (await createFromSerialized(
28492849
cardDoc.data,
28502850
cardDoc,
2851-
new URL(cardDoc.data.id!),
2851+
cardIdToURL(cardDoc.data.id!),
28522852
{ store, dependencyTrackingContext },
28532853
)) as CardDef;
28542854
}
@@ -3173,7 +3173,7 @@ export async function updateFromSerialized<T extends BaseDefConstructor>(
31733173
): Promise<BaseInstanceType<T>> {
31743174
stores.set(instance, store);
31753175
if (!instance[relativeTo] && doc.data.id) {
3176-
instance[relativeTo] = new URL(doc.data.id);
3176+
instance[relativeTo] = cardIdToURL(doc.data.id);
31773177
}
31783178

31793179
if (isCardInstance(instance)) {
@@ -3299,7 +3299,7 @@ async function _updateFromSerialized<T extends BaseDefConstructor>({
32993299
let instanceRelativeTo =
33003300
instance[relativeTo] ??
33013301
('id' in instance && typeof instance.id === 'string'
3302-
? new URL(instance.id)
3302+
? cardIdToURL(instance.id)
33033303
: undefined);
33043304

33053305
function getFieldMeta(
@@ -3482,7 +3482,7 @@ async function _updateFromSerialized<T extends BaseDefConstructor>({
34823482
let relativeToVal =
34833483
instance[relativeTo] ??
34843484
('id' in instance && typeof instance.id === 'string'
3485-
? new URL(instance.id)
3485+
? cardIdToURL(instance.id)
34863486
: undefined);
34873487
let deserializedValue = await getDeserializedValue({
34883488
card,

packages/base/cards-grid.gts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Captions from '@cardstack/boxel-icons/captions';
1414
import AllCardsIcon from '@cardstack/boxel-icons/square-stack';
1515

1616
import {
17+
cardIdToURL,
1718
chooseCard,
1819
specRef,
1920
baseRealm,
@@ -258,7 +259,7 @@ class Isolated extends Component<typeof CardsGrid> {
258259
}
259260

260261
if (spec && isCardInstance<Spec>(spec)) {
261-
await this.args.createCard?.(spec.ref, new URL(spec.id!), {
262+
await this.args.createCard?.(spec.ref, cardIdToURL(spec.id!), {
262263
realmURL: this.args.model[realmURL],
263264
});
264265
}

packages/base/query-field-support.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import type {
1313
RuntimeDependencyTrackingContext,
1414
} from '@cardstack/runtime-common';
1515
import {
16+
cardIdToURL,
1617
getField,
1718
getSingularRelationship,
1819
identifyCard,
@@ -361,7 +362,7 @@ function resolveQueryAndRealm(
361362
fieldPath,
362363
resolvePathValue: (path) => resolveInstancePathValue(instance, path),
363364
relativeTo: (instance as CardDef).id
364-
? new URL((instance as CardDef).id)
365+
? cardIdToURL((instance as CardDef).id)
365366
: realmURL,
366367
});
367368

packages/host/app/components/operator-mode/submode-layout.gts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { bool, cn, not } from '@cardstack/boxel-ui/helpers';
2424

2525
import { BoxelIconWithText } from '@cardstack/boxel-ui/icons';
2626

27+
import { cardIdToURL } from '@cardstack/runtime-common';
2728
import type { ResolvedCodeRef } from '@cardstack/runtime-common';
2829

2930
import AiAssistantButton from '@cardstack/host/components/ai-assistant/button';
@@ -182,7 +183,7 @@ export default class SubmodeLayout extends Component<Signature> {
182183
case Submodes.Code:
183184
await this.operatorModeStateService.updateCodePath(
184185
this.lastCardIdInRightMostStack
185-
? new URL(this.lastCardIdInRightMostStack + '.json')
186+
? cardIdToURL(this.lastCardIdInRightMostStack + '.json')
186187
: null,
187188
);
188189
break;

packages/host/app/lib/realm-utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { RealmPaths } from '@cardstack/runtime-common';
1+
import { cardIdToURL, RealmPaths } from '@cardstack/runtime-common';
22

33
/**
44
* Normalizes realm URLs by ensuring they have trailing slashes and
@@ -33,7 +33,7 @@ export function normalizeRealms(realms: string[]): string[] {
3333
* // Returns: 'http://localhost:4201/test/'
3434
*/
3535
export function resolveCardRealmUrl(cardId: string, realms: string[]): string {
36-
let cardUrl = new URL(cardId);
36+
let cardUrl = cardIdToURL(cardId);
3737
for (let realm of realms) {
3838
let realmUrl = new URL(realm);
3939
let realmPaths = new RealmPaths(realmUrl);

packages/host/app/lib/utils.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,18 +68,17 @@ export const catalogRealm = ENV.resolvedCatalogRealmURL
6868
export const skillsRealm = new RealmPaths(new URL(ENV.resolvedSkillsRealmURL));
6969

7070
/**
71-
* Safely constructs a URL to a skill card in the skills realm.
72-
* Uses the URL constructor to handle path joining safely.
71+
* Constructs a universal @cardstack/skills/ reference to a skill card.
7372
*
7473
* @param skillId - The ID of the skill (e.g., 'boxel-environment', 'catalog-listing')
75-
* @returns The complete URL to the skill card
74+
* @returns The universal skill card reference
7675
*
7776
* @example
78-
* skillCardURL('catalog-listing') // 'http://localhost:4201/skills/Skill/catalog-listing'
77+
* skillCardURL('catalog-listing') // '@cardstack/skills/Skill/catalog-listing'
7978
*/
8079
export function skillCardURL(skillId: string): string {
81-
return skillsRealm.fileURL(`Skill/${skillId}`).href;
80+
return `@cardstack/skills/Skill/${skillId}`;
8281
}
8382

84-
export const devSkillId = skillsRealm.fileURL(devSkillLocalPath).href;
85-
export const envSkillId = skillsRealm.fileURL(envSkillLocalPath).href;
83+
export const devSkillId = `@cardstack/skills/${devSkillLocalPath}`;
84+
export const envSkillId = `@cardstack/skills/${envSkillLocalPath}`;

packages/host/app/resources/room.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import difference from 'lodash/difference';
1111
import { TrackedMap } from 'tracked-built-ins';
1212

1313
import {
14+
cardIdToURL,
1415
isCardInstance,
1516
type LooseSingleCardDocument,
1617
} from '@cardstack/runtime-common';
@@ -317,7 +318,7 @@ export class RoomResource extends Resource<Args> {
317318
for (let skillCard of this.allSkillFileDefs) {
318319
result.push({
319320
cardId: skillCard.sourceUrl,
320-
realmURL: this.realm.realmOfURL(new URL(skillCard.sourceUrl))?.href,
321+
realmURL: this.realm.realmOfURL(cardIdToURL(skillCard.sourceUrl))?.href,
321322
fileDef: skillCard,
322323
isActive:
323324
this.matrixRoom?.skillsConfig.enabledSkillCards

0 commit comments

Comments
 (0)