@ai-dossier/cli 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"install-skill.d.ts","sourceRoot":"","sources":["../../src/commands/install-skill.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,OAAO,EACL,oBAAoB,EAOrB,MAAM,kBAAkB,CAAC;AAM1B,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyQlE;AAGD,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"install-skill.d.ts","sourceRoot":"","sources":["../../src/commands/install-skill.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,OAAO,EACL,oBAAoB,EAOrB,MAAM,kBAAkB,CAAC;AAQ1B,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyRlE;AAGD,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -14,6 +14,8 @@ const multi_registry_1 = require("../multi-registry");
14
14
  const opencode_sync_1 = require("../opencode-sync");
15
15
  Object.defineProperty(exports, "isDossierFrontmatter", { enumerable: true, get: function () { return opencode_sync_1.isDossierFrontmatter; } });
16
16
  const registry_client_1 = require("../registry-client");
17
+ const skill_collision_1 = require("../skill-collision");
18
+ const skill_frontmatter_1 = require("../skill-frontmatter");
17
19
  /** Valid values for --for. Anything else is rejected up front. */
18
20
  const VALID_TARGETS = new Set(['claude', 'opencode', 'both']);
19
21
  function registerInstallSkillCommand(program) {
@@ -100,10 +102,17 @@ function registerInstallSkillCommand(program) {
100
102
  const skillName = dossierName.split('/').pop() ?? dossierName;
101
103
  const skillDir = node_path_1.default.join(skillsDir, skillName);
102
104
  const skillFile = node_path_1.default.join(skillDir, 'SKILL.md');
103
- if (!options.force && node_fs_1.default.existsSync(skillFile)) {
104
- console.error(`\n❌ Skill '${skillName}' already installed at ${skillDir}`);
105
- console.error(' Use --force to overwrite\n');
106
- process.exit(1);
105
+ // Reinstalling or upgrading the SAME dossier is the common case and should not
106
+ // need --force; requiring it there taught everyone to pass --force reflexively,
107
+ // which is precisely what made the dangerous case dangerous. A DIFFERENT dossier
108
+ // occupying the directory (two registry paths sharing a basename) still stops,
109
+ // and now says which one it is instead of just "already installed".
110
+ if (node_fs_1.default.existsSync(skillFile)) {
111
+ const collision = (0, skill_collision_1.checkSkillCollision)(skillFile, dossierName);
112
+ if (collision.collides && !options.force) {
113
+ console.error((0, skill_collision_1.collisionMessage)(skillName, collision.existingSource, dossierName, skillFile));
114
+ process.exit(1);
115
+ }
107
116
  }
108
117
  try {
109
118
  let resolvedVersion = version;
@@ -140,7 +149,9 @@ function registerInstallSkillCommand(program) {
140
149
  // future flows (e.g. opencode-only refreshes via sync-skills) can opt out.
141
150
  if (targets.writeClaude) {
142
151
  node_fs_1.default.mkdirSync(skillDir, { recursive: true });
143
- node_fs_1.default.writeFileSync(skillFile, content, 'utf8');
152
+ // Emit YAML frontmatter so the runtime can read `name`/`description`.
153
+ // The signed payload is unchanged — see skill-frontmatter.ts.
154
+ node_fs_1.default.writeFileSync(skillFile, (0, skill_frontmatter_1.toSkillFrontmatter)(content, dossierName), 'utf8');
144
155
  }
145
156
  // Dual-write the opencode wrapper when requested. YAML-native sources are
146
157
  // skipped because opencode reads them directly from ~/.claude/skills/.
@@ -1 +1 @@
1
- {"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../src/commands/install-skill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../src/commands/install-skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Guard against two different dossiers claiming the same skill directory.
3
+ *
4
+ * `install-skill` derives the directory with `dossierName.split('/').pop()`, so
5
+ * `imboard-ai/idea-to-prd` and `imboard-ai/pm/idea-to-prd` both resolve to
6
+ * `~/.claude/skills/idea-to-prd`. Whichever was installed last silently replaced the
7
+ * other, with no warning and no way to tell from the filesystem which one you had.
8
+ *
9
+ * Six such collisions existed in the registry at once. Those were cleaned up by
10
+ * deduplicating the registry, but nothing prevented the seventh — any two dossiers
11
+ * sharing a basename collide again the moment both are installed.
12
+ *
13
+ * This makes the overwrite explicit: installing over a *different* dossier requires
14
+ * --force. Reinstalling or upgrading the same one is unaffected, which is the common
15
+ * case and must stay frictionless.
16
+ */
17
+ export interface CollisionCheck {
18
+ /** True when the directory already holds a dossier from a different source. */
19
+ collides: boolean;
20
+ /** Registry name of whatever currently occupies the directory, when known. */
21
+ existingSource?: string;
22
+ }
23
+ /**
24
+ * Read the source identity an installed skill records, if any.
25
+ *
26
+ * `install-skill` writes `x_source` into the frontmatter (see below); older installs
27
+ * predate it, so fall back to the dossier's own `name`. Returns undefined when the
28
+ * file is absent or unparseable — an unreadable file is not evidence of a collision,
29
+ * and blocking on it would be worse than the problem.
30
+ */
31
+ export declare function readInstalledSource(skillFile: string): string | undefined;
32
+ /**
33
+ * Decide whether installing `incomingSource` into `skillFile` would clobber a
34
+ * different dossier.
35
+ *
36
+ * Comparison is on the full registry name where available. When the installed copy
37
+ * only records a bare `name` (pre-`x_source` installs), compare against the incoming
38
+ * basename so an upgrade of the same dossier is not mistaken for a collision.
39
+ */
40
+ export declare function checkSkillCollision(skillFile: string, incomingSource: string): CollisionCheck;
41
+ /** Human-readable explanation of a refused install. */
42
+ export declare function collisionMessage(skillName: string, existingSource: string, incomingSource: string, skillFile: string): string;
43
+ //# sourceMappingURL=skill-collision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-collision.d.ts","sourceRoot":"","sources":["../src/skill-collision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,MAAM,WAAW,cAAc;IAC7B,+EAA+E;IAC/E,QAAQ,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWzE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,cAAc,CAa7F;AAED,uDAAuD;AACvD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,GAChB,MAAM,CAcR"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ /**
3
+ * Guard against two different dossiers claiming the same skill directory.
4
+ *
5
+ * `install-skill` derives the directory with `dossierName.split('/').pop()`, so
6
+ * `imboard-ai/idea-to-prd` and `imboard-ai/pm/idea-to-prd` both resolve to
7
+ * `~/.claude/skills/idea-to-prd`. Whichever was installed last silently replaced the
8
+ * other, with no warning and no way to tell from the filesystem which one you had.
9
+ *
10
+ * Six such collisions existed in the registry at once. Those were cleaned up by
11
+ * deduplicating the registry, but nothing prevented the seventh — any two dossiers
12
+ * sharing a basename collide again the moment both are installed.
13
+ *
14
+ * This makes the overwrite explicit: installing over a *different* dossier requires
15
+ * --force. Reinstalling or upgrading the same one is unaffected, which is the common
16
+ * case and must stay frictionless.
17
+ */
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.readInstalledSource = readInstalledSource;
23
+ exports.checkSkillCollision = checkSkillCollision;
24
+ exports.collisionMessage = collisionMessage;
25
+ const node_fs_1 = __importDefault(require("node:fs"));
26
+ const core_1 = require("@ai-dossier/core");
27
+ /**
28
+ * Read the source identity an installed skill records, if any.
29
+ *
30
+ * `install-skill` writes `x_source` into the frontmatter (see below); older installs
31
+ * predate it, so fall back to the dossier's own `name`. Returns undefined when the
32
+ * file is absent or unparseable — an unreadable file is not evidence of a collision,
33
+ * and blocking on it would be worse than the problem.
34
+ */
35
+ function readInstalledSource(skillFile) {
36
+ if (!node_fs_1.default.existsSync(skillFile))
37
+ return undefined;
38
+ try {
39
+ const fm = (0, core_1.parseDossierContent)(node_fs_1.default.readFileSync(skillFile, 'utf8')).frontmatter;
40
+ return fm.x_source ?? fm.name ?? undefined;
41
+ }
42
+ catch {
43
+ return undefined;
44
+ }
45
+ }
46
+ /**
47
+ * Decide whether installing `incomingSource` into `skillFile` would clobber a
48
+ * different dossier.
49
+ *
50
+ * Comparison is on the full registry name where available. When the installed copy
51
+ * only records a bare `name` (pre-`x_source` installs), compare against the incoming
52
+ * basename so an upgrade of the same dossier is not mistaken for a collision.
53
+ */
54
+ function checkSkillCollision(skillFile, incomingSource) {
55
+ const existing = readInstalledSource(skillFile);
56
+ if (!existing)
57
+ return { collides: false };
58
+ if (existing === incomingSource)
59
+ return { collides: false };
60
+ // Legacy install recorded only the basename.
61
+ if (!existing.includes('/')) {
62
+ const incomingBase = incomingSource.split('/').pop();
63
+ return { collides: existing !== incomingBase, existingSource: existing };
64
+ }
65
+ return { collides: true, existingSource: existing };
66
+ }
67
+ /** Human-readable explanation of a refused install. */
68
+ function collisionMessage(skillName, existingSource, incomingSource, skillFile) {
69
+ return [
70
+ `\n❌ Skill '${skillName}' is already installed from a different dossier.`,
71
+ '',
72
+ ` installed: ${existingSource}`,
73
+ ` incoming: ${incomingSource}`,
74
+ ` location: ${skillFile}`,
75
+ '',
76
+ ' Both resolve to the same skill directory because the directory name is the',
77
+ ' last path segment. Installing would silently replace the existing skill.',
78
+ '',
79
+ ' Use --force to replace it, or --remove it first.',
80
+ '',
81
+ ].join('\n');
82
+ }
83
+ //# sourceMappingURL=skill-collision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-collision.js","sourceRoot":"","sources":["../src/skill-collision.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;AAoBH,kDAWC;AAUD,kDAaC;AAGD,4CAmBC;AA1ED,sDAAyB;AACzB,2CAAuD;AASvD;;;;;;;GAOG;AACH,SAAgB,mBAAmB,CAAC,SAAiB;IACnD,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAA,0BAAmB,EAAC,iBAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,WAGlE,CAAC;QACF,OAAQ,EAAE,CAAC,QAAmB,IAAK,EAAE,CAAC,IAAe,IAAI,SAAS,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,mBAAmB,CAAC,SAAiB,EAAE,cAAsB;IAC3E,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAE1C,IAAI,QAAQ,KAAK,cAAc;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAE5D,6CAA6C;IAC7C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACrD,OAAO,EAAE,QAAQ,EAAE,QAAQ,KAAK,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;IAC3E,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;AACtD,CAAC;AAED,uDAAuD;AACvD,SAAgB,gBAAgB,CAC9B,SAAiB,EACjB,cAAsB,EACtB,cAAsB,EACtB,SAAiB;IAEjB,OAAO;QACL,cAAc,SAAS,kDAAkD;QACzE,EAAE;QACF,iBAAiB,cAAc,EAAE;QACjC,iBAAiB,cAAc,EAAE;QACjC,iBAAiB,SAAS,EAAE;QAC5B,EAAE;QACF,+EAA+E;QAC/E,6EAA6E;QAC7E,EAAE;QACF,qDAAqD;QACrD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Render a dossier for installation as an agent skill.
3
+ *
4
+ * The problem: dossiers are stored with `---dossier` (JSON) frontmatter so the block
5
+ * can carry a checksum and signature. But agent runtimes parse standard `---` YAML.
6
+ * opencode skips such files outright; Claude Code fares slightly better but does not
7
+ * extract `name`/`description`, so an installed dossier surfaces with the literal
8
+ * string "---dossier" as its description and cannot be matched from a natural-language
9
+ * request. Every authored trigger phrase is inert.
10
+ *
11
+ * The fix: re-serialize the same frontmatter as YAML, with `name` and `description`
12
+ * first so the runtime reads them.
13
+ *
14
+ * Why this does not break verification: a v2 signature covers
15
+ * `canonicalizeFrontmatter(parsedFrontmatter) + body` — the parsed object, not the
16
+ * bytes of the frontmatter block. Re-serializing JSON to YAML leaves the parsed object
17
+ * (and therefore the signed payload) identical, so checksum and signature both still
18
+ * verify. Legacy body-only signatures are likewise unaffected, since the body is copied
19
+ * verbatim.
20
+ *
21
+ * A dossier that is already YAML-fronted is returned unchanged.
22
+ */
23
+ /**
24
+ * Convert a dossier to `---` YAML frontmatter suitable for agent skill discovery.
25
+ * Returns the input unchanged when it is already YAML-fronted or cannot be parsed.
26
+ */
27
+ export declare function toSkillFrontmatter(rawContent: string, source?: string): string;
28
+ //# sourceMappingURL=skill-frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-frontmatter.d.ts","sourceRoot":"","sources":["../src/skill-frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAQH;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAsC9E"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * Render a dossier for installation as an agent skill.
4
+ *
5
+ * The problem: dossiers are stored with `---dossier` (JSON) frontmatter so the block
6
+ * can carry a checksum and signature. But agent runtimes parse standard `---` YAML.
7
+ * opencode skips such files outright; Claude Code fares slightly better but does not
8
+ * extract `name`/`description`, so an installed dossier surfaces with the literal
9
+ * string "---dossier" as its description and cannot be matched from a natural-language
10
+ * request. Every authored trigger phrase is inert.
11
+ *
12
+ * The fix: re-serialize the same frontmatter as YAML, with `name` and `description`
13
+ * first so the runtime reads them.
14
+ *
15
+ * Why this does not break verification: a v2 signature covers
16
+ * `canonicalizeFrontmatter(parsedFrontmatter) + body` — the parsed object, not the
17
+ * bytes of the frontmatter block. Re-serializing JSON to YAML leaves the parsed object
18
+ * (and therefore the signed payload) identical, so checksum and signature both still
19
+ * verify. Legacy body-only signatures are likewise unaffected, since the body is copied
20
+ * verbatim.
21
+ *
22
+ * A dossier that is already YAML-fronted is returned unchanged.
23
+ */
24
+ var __importDefault = (this && this.__importDefault) || function (mod) {
25
+ return (mod && mod.__esModule) ? mod : { "default": mod };
26
+ };
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.toSkillFrontmatter = toSkillFrontmatter;
29
+ const core_1 = require("@ai-dossier/core");
30
+ const yaml_1 = __importDefault(require("yaml"));
31
+ /** Keys an agent runtime reads first; the rest follow in their existing order. */
32
+ const AGENT_KEYS = ['name', 'description'];
33
+ /**
34
+ * Convert a dossier to `---` YAML frontmatter suitable for agent skill discovery.
35
+ * Returns the input unchanged when it is already YAML-fronted or cannot be parsed.
36
+ */
37
+ function toSkillFrontmatter(rawContent, source) {
38
+ if (!rawContent.startsWith('---dossier')) {
39
+ return rawContent; // already YAML-fronted (or not a dossier) — leave alone
40
+ }
41
+ let parsed;
42
+ try {
43
+ parsed = (0, core_1.parseDossierContent)(rawContent);
44
+ }
45
+ catch {
46
+ return rawContent;
47
+ }
48
+ // Copy before mutating. parseDossierContent can hand back a shared object for
49
+ // identical input, so writing to it leaks fields into later calls — an unsourced
50
+ // install picked up the x_source of a previous one.
51
+ const fm = { ...parsed.frontmatter };
52
+ // `description` is what the runtime matches on. Fall back to `objective` so
53
+ // dossiers that never declared one are still discoverable.
54
+ if (fm.description == null && typeof fm.objective === 'string') {
55
+ fm.description = fm.objective;
56
+ }
57
+ // Record the full registry path the skill came from. The directory name is only
58
+ // the basename, so without this there is no way to tell which of two same-named
59
+ // dossiers is installed.
60
+ if (source)
61
+ fm.x_source = source;
62
+ const ordered = {};
63
+ for (const key of AGENT_KEYS) {
64
+ if (key in fm)
65
+ ordered[key] = fm[key];
66
+ }
67
+ for (const key of Object.keys(fm)) {
68
+ if (!(key in ordered))
69
+ ordered[key] = fm[key];
70
+ }
71
+ const yaml = yaml_1.default.stringify(ordered, { lineWidth: 0 });
72
+ return `---\n${yaml}---\n${parsed.body}`;
73
+ }
74
+ //# sourceMappingURL=skill-frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-frontmatter.js","sourceRoot":"","sources":["../src/skill-frontmatter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;;;AAYH,gDAsCC;AAhDD,2CAAuD;AACvD,gDAAwB;AAExB,kFAAkF;AAClF,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAE3C;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,UAAkB,EAAE,MAAe;IACpE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACzC,OAAO,UAAU,CAAC,CAAC,wDAAwD;IAC7E,CAAC;IAED,IAAI,MAA8C,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,IAAA,0BAAmB,EAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,8EAA8E;IAC9E,iFAAiF;IACjF,oDAAoD;IACpD,MAAM,EAAE,GAAG,EAAE,GAAI,MAAM,CAAC,WAAuC,EAAE,CAAC;IAElE,4EAA4E;IAC5E,2DAA2D;IAC3D,IAAI,EAAE,CAAC,WAAW,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC/D,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,SAAS,CAAC;IAChC,CAAC;IAED,gFAAgF;IAChF,gFAAgF;IAChF,yBAAyB;IACzB,IAAI,MAAM;QAAE,EAAE,CAAC,QAAQ,GAAG,MAAM,CAAC;IAEjC,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,GAAG,IAAI,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,IAAI,GAAG,cAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACvD,OAAO,QAAQ,IAAI,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-dossier/cli",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "description": "Create, verify, sign, publish, and run dossiers — portable, signed, versioned skills for any LLM tool. The dossier ⇄ Claude Code skill bridge (install-skill / skill-export).",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {
@@ -53,8 +53,9 @@
53
53
  "registry": "https://registry.npmjs.org"
54
54
  },
55
55
  "dependencies": {
56
- "@ai-dossier/core": "^1.4.0",
57
- "commander": "^12.1.0"
56
+ "@ai-dossier/core": "^1.4.1",
57
+ "commander": "^12.1.0",
58
+ "yaml": "^2.8.3"
58
59
  },
59
60
  "devDependencies": {
60
61
  "@types/node": "^24.10.0",