@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.
- package/dist/commands/install-skill.d.ts.map +1 -1
- package/dist/commands/install-skill.js +16 -5
- package/dist/commands/install-skill.js.map +1 -1
- package/dist/skill-collision.d.ts +43 -0
- package/dist/skill-collision.d.ts.map +1 -0
- package/dist/skill-collision.js +83 -0
- package/dist/skill-collision.js.map +1 -0
- package/dist/skill-frontmatter.d.ts +28 -0
- package/dist/skill-frontmatter.d.ts.map +1 -0
- package/dist/skill-frontmatter.js +74 -0
- package/dist/skill-frontmatter.js.map +1 -0
- package/package.json +4 -3
|
@@ -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;
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
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":";;;;;;
|
|
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.
|
|
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.
|
|
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",
|