diff --git a/examples/workflows/startup-goal/workflow.json b/examples/workflows/startup-goal/workflow.json index 1494ce27..d4f332a1 100644 --- a/examples/workflows/startup-goal/workflow.json +++ b/examples/workflows/startup-goal/workflow.json @@ -30,19 +30,19 @@ "source": "./skills/qa-lead" }, { - "source": "interface-craft:design-engineering", + "source": "emilkowalski:emil-design-eng", "repo": "emilkowalski/skills" }, { - "source": "interface-craft:motion-vocabulary", + "source": "emilkowalski:animation-vocabulary", "repo": "emilkowalski/skills" }, { - "source": "interface-craft:fluid-interface-design", + "source": "emilkowalski:apple-design", "repo": "emilkowalski/skills" }, { - "source": "interface-craft:motion-review", + "source": "emilkowalski:review-animations", "repo": "emilkowalski/skills" }, { diff --git a/examples/workflows/startup-goal/workflow.lock.json b/examples/workflows/startup-goal/workflow.lock.json index 0b6fa71b..1bbba44b 100644 --- a/examples/workflows/startup-goal/workflow.lock.json +++ b/examples/workflows/startup-goal/workflow.lock.json @@ -2,7 +2,7 @@ "schemaVersion": "0.1", "workflow": "startup-goal", "workflowVersion": "0.1.4", - "generatedAt": "2026-07-12T16:32:53.114Z", + "generatedAt": "2026-07-13T08:13:33.840Z", "skills": [ { "source": "./skills/startup-goal", @@ -53,32 +53,32 @@ "hash": "sha256:c6d13166af6a97fd2ef859d3414fa1e9211da153cab426cf46408fa6aa6d4af3" }, { - "source": "interface-craft:design-engineering", - "resolvedName": "interface-craft:design-engineering", + "source": "emilkowalski:emil-design-eng", + "resolvedName": "emilkowalski:emil-design-eng", "kind": "external", "repo": "emilkowalski/skills", - "hash": "sha256:109257bfe27cec096c72e6c96e60d6903fdfa06b129f97487851cf7ad93b1709" + "hash": "sha256:c98e0e85967f367ece5fd23f9b2bcef62c1a9d548579472bb829464c3ebdf461" }, { - "source": "interface-craft:motion-vocabulary", - "resolvedName": "interface-craft:motion-vocabulary", + "source": "emilkowalski:animation-vocabulary", + "resolvedName": "emilkowalski:animation-vocabulary", "kind": "external", "repo": "emilkowalski/skills", - "hash": "sha256:0e5d16e7ebb8d2402a62ed022b6759647578fd64bca29c7fe97da352485553f7" + "hash": "sha256:17043916f71310aff8b03af847f4cf1280496807113072ff9fb836e64f90f133" }, { - "source": "interface-craft:fluid-interface-design", - "resolvedName": "interface-craft:fluid-interface-design", + "source": "emilkowalski:apple-design", + "resolvedName": "emilkowalski:apple-design", "kind": "external", "repo": "emilkowalski/skills", - "hash": "sha256:bae462b073b3b86861270523152a52ead47c788da10e7620e7bc63ee7eae2e0a" + "hash": "sha256:4f2d0e6e554a9b8d313ae3b32a66f9e4f1ba4c9f491e0f050ad077e100eeefa3" }, { - "source": "interface-craft:motion-review", - "resolvedName": "interface-craft:motion-review", + "source": "emilkowalski:review-animations", + "resolvedName": "emilkowalski:review-animations", "kind": "external", "repo": "emilkowalski/skills", - "hash": "sha256:efcbc2ab60eece374e247fd2a525c5587c55c4df454ea7727dd772209a967468" + "hash": "sha256:f9266e7cdefa9ceadc60558f201618755382f03b06d5ab37d2ac73bdb7807b98" }, { "source": "superpowers:brainstorming", diff --git a/examples/workflows/web-design/workflow.json b/examples/workflows/web-design/workflow.json index 01f43e4a..e0048dbb 100644 --- a/examples/workflows/web-design/workflow.json +++ b/examples/workflows/web-design/workflow.json @@ -9,19 +9,19 @@ "entry": true }, { - "source": "interface-craft:design-engineering", + "source": "emilkowalski:emil-design-eng", "repo": "emilkowalski/skills" }, { - "source": "interface-craft:motion-vocabulary", + "source": "emilkowalski:animation-vocabulary", "repo": "emilkowalski/skills" }, { - "source": "interface-craft:fluid-interface-design", + "source": "emilkowalski:apple-design", "repo": "emilkowalski/skills" }, { - "source": "interface-craft:motion-review", + "source": "emilkowalski:review-animations", "repo": "emilkowalski/skills" } ], @@ -35,17 +35,17 @@ { "id": "motion-vocabulary", "title": "Name the intended motion", - "skill": "interface-craft:motion-vocabulary" + "skill": "emilkowalski:animation-vocabulary" }, { "id": "craft-review", "title": "Review interface craft", - "skill": "interface-craft:design-engineering" + "skill": "emilkowalski:emil-design-eng" }, { "id": "animation-review", "title": "Review animations strictly", - "skill": "interface-craft:motion-review" + "skill": "emilkowalski:review-animations" } ] } diff --git a/examples/workflows/web-design/workflow.lock.json b/examples/workflows/web-design/workflow.lock.json index 0752ea97..26a09309 100644 --- a/examples/workflows/web-design/workflow.lock.json +++ b/examples/workflows/web-design/workflow.lock.json @@ -2,7 +2,7 @@ "schemaVersion": "0.1", "workflow": "web-design", "workflowVersion": "0.1.0", - "generatedAt": "2026-07-12T10:25:01.437Z", + "generatedAt": "2026-07-13T08:13:33.839Z", "skills": [ { "source": "./skills/web-design", @@ -11,32 +11,32 @@ "hash": "sha256:5cd02b629f13409c04a8f28f92909aeae7ca7d392eba6b95587876b662814f88" }, { - "source": "interface-craft:design-engineering", - "resolvedName": "interface-craft:design-engineering", + "source": "emilkowalski:emil-design-eng", + "resolvedName": "emilkowalski:emil-design-eng", "kind": "external", "repo": "emilkowalski/skills", - "hash": "sha256:109257bfe27cec096c72e6c96e60d6903fdfa06b129f97487851cf7ad93b1709" + "hash": "sha256:c98e0e85967f367ece5fd23f9b2bcef62c1a9d548579472bb829464c3ebdf461" }, { - "source": "interface-craft:motion-vocabulary", - "resolvedName": "interface-craft:motion-vocabulary", + "source": "emilkowalski:animation-vocabulary", + "resolvedName": "emilkowalski:animation-vocabulary", "kind": "external", "repo": "emilkowalski/skills", - "hash": "sha256:0e5d16e7ebb8d2402a62ed022b6759647578fd64bca29c7fe97da352485553f7" + "hash": "sha256:17043916f71310aff8b03af847f4cf1280496807113072ff9fb836e64f90f133" }, { - "source": "interface-craft:fluid-interface-design", - "resolvedName": "interface-craft:fluid-interface-design", + "source": "emilkowalski:apple-design", + "resolvedName": "emilkowalski:apple-design", "kind": "external", "repo": "emilkowalski/skills", - "hash": "sha256:bae462b073b3b86861270523152a52ead47c788da10e7620e7bc63ee7eae2e0a" + "hash": "sha256:4f2d0e6e554a9b8d313ae3b32a66f9e4f1ba4c9f491e0f050ad077e100eeefa3" }, { - "source": "interface-craft:motion-review", - "resolvedName": "interface-craft:motion-review", + "source": "emilkowalski:review-animations", + "resolvedName": "emilkowalski:review-animations", "kind": "external", "repo": "emilkowalski/skills", - "hash": "sha256:efcbc2ab60eece374e247fd2a525c5587c55c4df454ea7727dd772209a967468" + "hash": "sha256:f9266e7cdefa9ceadc60558f201618755382f03b06d5ab37d2ac73bdb7807b98" } ] } diff --git a/src/plugins/skill-installer.ts b/src/plugins/skill-installer.ts index e68a8b98..f999632e 100644 --- a/src/plugins/skill-installer.ts +++ b/src/plugins/skill-installer.ts @@ -123,23 +123,23 @@ const supportedSuperpowersSkills = [ const interfaceCraftSkillMappings = [ { - canonicalSource: "interface-craft:design-engineering", - legacySource: "emilkowalski:emil-design-eng", + canonicalSource: "emilkowalski:emil-design-eng", + legacySource: "interface-craft:design-engineering", installedName: "emil-design-eng", }, { - canonicalSource: "interface-craft:motion-vocabulary", - legacySource: "emilkowalski:animation-vocabulary", + canonicalSource: "emilkowalski:animation-vocabulary", + legacySource: "interface-craft:motion-vocabulary", installedName: "animation-vocabulary", }, { - canonicalSource: "interface-craft:fluid-interface-design", - legacySource: "emilkowalski:apple-design", + canonicalSource: "emilkowalski:apple-design", + legacySource: "interface-craft:fluid-interface-design", installedName: "apple-design", }, { - canonicalSource: "interface-craft:motion-review", - legacySource: "emilkowalski:review-animations", + canonicalSource: "emilkowalski:review-animations", + legacySource: "interface-craft:motion-review", installedName: "review-animations", }, ] as const; diff --git a/tests/cli.test.ts b/tests/cli.test.ts index 252e7923..6407e200 100644 --- a/tests/cli.test.ts +++ b/tests/cli.test.ts @@ -696,16 +696,20 @@ describe("cli", () => { expect(externalInstalls).toEqual([{ source: "mattpocock/skills", homeDir }]); expect(stripAnsiLines(logs)).toContain("Skills package install result"); - expect(logs.some((line) => line.includes("Package: mattpocock/skills"))).toBe(true); + expect(stripAnsiLines(logs).some((line) => line.includes("Package: mattpocock/skills"))).toBe( + true, + ); expect( - logs.some((line) => + stripAnsiLines(logs).some((line) => line.includes( "Internal command: npx --yes skills@latest add mattpocock/skills --yes --global", ), ), ).toBe(true); - expect(logs.some((line) => line.includes(homeDir))).toBe(true); - expect(logs.some((line) => line.includes("Restart your agent IDE"))).toBe(true); + expect(stripAnsiLines(logs).some((line) => line.includes(homeDir))).toBe(true); + expect(stripAnsiLines(logs).some((line) => line.includes("Restart your agent IDE"))).toBe( + true, + ); } finally { console.log = originalLog; await rm(rootDir, { recursive: true, force: true }); @@ -736,8 +740,12 @@ describe("cli", () => { expect(externalInstalls).toEqual([]); expect(stripAnsiLines(logs)).toContain("Skills package install plan"); - expect(logs.some((line) => line.includes("Package: mattpocock/skills"))).toBe(true); - expect(logs.some((line) => line.includes("Restart your agent IDE"))).toBe(false); + expect(stripAnsiLines(logs).some((line) => line.includes("Package: mattpocock/skills"))).toBe( + true, + ); + expect(stripAnsiLines(logs).some((line) => line.includes("Restart your agent IDE"))).toBe( + false, + ); } finally { console.log = originalLog; await rm(rootDir, { recursive: true, force: true }); diff --git a/tests/omniskill.test.ts b/tests/omniskill.test.ts index 6d8b6860..0784be36 100644 --- a/tests/omniskill.test.ts +++ b/tests/omniskill.test.ts @@ -1608,17 +1608,17 @@ describe("omniskill command module", () => { ]); }); - test("installs canonical and legacy interface craft sources from the upstream package", async () => { + test("installs upstream canonical and interface craft compatibility sources", async () => { const homeDir = await mkdtemp(join(tmpdir(), "omniskill-home-")); const mappings = [ - ["interface-craft:design-engineering", "emilkowalski:emil-design-eng", "emil-design-eng"], + ["emilkowalski:emil-design-eng", "interface-craft:design-engineering", "emil-design-eng"], [ - "interface-craft:motion-vocabulary", "emilkowalski:animation-vocabulary", + "interface-craft:motion-vocabulary", "animation-vocabulary", ], - ["interface-craft:fluid-interface-design", "emilkowalski:apple-design", "apple-design"], - ["interface-craft:motion-review", "emilkowalski:review-animations", "review-animations"], + ["emilkowalski:apple-design", "interface-craft:fluid-interface-design", "apple-design"], + ["emilkowalski:review-animations", "interface-craft:motion-review", "review-animations"], ] as const; for (const [canonical, legacy, installedName] of mappings) { diff --git a/tests/skill-installer.test.ts b/tests/skill-installer.test.ts index 8c913bf3..ac5c6ece 100644 --- a/tests/skill-installer.test.ts +++ b/tests/skill-installer.test.ts @@ -341,17 +341,17 @@ describe("skill installer", () => { } }); - test("resolves canonical and legacy interface craft sources to upstream installed skills", async () => { + test("resolves upstream canonical and interface craft compatibility sources", async () => { const homeDir = await mkdtemp(join(tmpdir(), "skill-installer-home-")); const mappings = [ - ["interface-craft:design-engineering", "emilkowalski:emil-design-eng", "emil-design-eng"], + ["emilkowalski:emil-design-eng", "interface-craft:design-engineering", "emil-design-eng"], [ - "interface-craft:motion-vocabulary", "emilkowalski:animation-vocabulary", + "interface-craft:motion-vocabulary", "animation-vocabulary", ], - ["interface-craft:fluid-interface-design", "emilkowalski:apple-design", "apple-design"], - ["interface-craft:motion-review", "emilkowalski:review-animations", "review-animations"], + ["emilkowalski:apple-design", "interface-craft:fluid-interface-design", "apple-design"], + ["emilkowalski:review-animations", "interface-craft:motion-review", "review-animations"], ] as const; try { diff --git a/tests/workflow-bundles.test.ts b/tests/workflow-bundles.test.ts index fc0cef36..6d013f9f 100644 --- a/tests/workflow-bundles.test.ts +++ b/tests/workflow-bundles.test.ts @@ -332,16 +332,16 @@ describe("workflow bundles", () => { expect(bundle.manifest.skills).toEqual([ { source: "./skills/web-design", entry: true }, - { source: "interface-craft:design-engineering", repo: "emilkowalski/skills" }, - { source: "interface-craft:motion-vocabulary", repo: "emilkowalski/skills" }, - { source: "interface-craft:fluid-interface-design", repo: "emilkowalski/skills" }, - { source: "interface-craft:motion-review", repo: "emilkowalski/skills" }, + { source: "emilkowalski:emil-design-eng", repo: "emilkowalski/skills" }, + { source: "emilkowalski:animation-vocabulary", repo: "emilkowalski/skills" }, + { source: "emilkowalski:apple-design", repo: "emilkowalski/skills" }, + { source: "emilkowalski:review-animations", repo: "emilkowalski/skills" }, ]); expect(bundle.manifest.steps.map((step) => [step.id, step.skill, step.gate ?? null])).toEqual([ ["design-brief", "./skills/web-design", "human_approval"], - ["motion-vocabulary", "interface-craft:motion-vocabulary", null], - ["craft-review", "interface-craft:design-engineering", null], - ["animation-review", "interface-craft:motion-review", null], + ["motion-vocabulary", "emilkowalski:animation-vocabulary", null], + ["craft-review", "emilkowalski:emil-design-eng", null], + ["animation-review", "emilkowalski:review-animations", null], ]); expect(skill).toContain("## Required Companion Skills"); expect(skill).toContain("interface-craft:design-engineering"); @@ -386,10 +386,10 @@ describe("workflow bundles", () => { expect(bundle.manifest.skills).toEqual( expect.arrayContaining([ { source: "./skills/web-design" }, - { source: "interface-craft:design-engineering", repo: "emilkowalski/skills" }, - { source: "interface-craft:motion-vocabulary", repo: "emilkowalski/skills" }, - { source: "interface-craft:fluid-interface-design", repo: "emilkowalski/skills" }, - { source: "interface-craft:motion-review", repo: "emilkowalski/skills" }, + { source: "emilkowalski:emil-design-eng", repo: "emilkowalski/skills" }, + { source: "emilkowalski:animation-vocabulary", repo: "emilkowalski/skills" }, + { source: "emilkowalski:apple-design", repo: "emilkowalski/skills" }, + { source: "emilkowalski:review-animations", repo: "emilkowalski/skills" }, ]), ); expect(skill).toContain("name: startup-goal");