faceted-prompting 0.2.1 → 0.3.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.
Files changed (70) hide show
  1. package/README.md +40 -11
  2. package/dist/cli/compose-command.d.ts +3 -0
  3. package/dist/cli/compose-command.d.ts.map +1 -0
  4. package/dist/cli/compose-command.js +156 -0
  5. package/dist/cli/compose-command.js.map +1 -0
  6. package/dist/cli/compose-context.js +3 -3
  7. package/dist/cli/compose-context.js.map +1 -1
  8. package/dist/cli/index.d.ts.map +1 -1
  9. package/dist/cli/index.js +21 -89
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/cli/install-skill/facet-token-file-ops.d.ts +7 -0
  12. package/dist/cli/install-skill/facet-token-file-ops.d.ts.map +1 -0
  13. package/dist/cli/install-skill/facet-token-file-ops.js +69 -0
  14. package/dist/cli/install-skill/facet-token-file-ops.js.map +1 -0
  15. package/dist/cli/install-skill/facet-token-renderer.d.ts +6 -0
  16. package/dist/cli/install-skill/facet-token-renderer.d.ts.map +1 -0
  17. package/dist/cli/install-skill/facet-token-renderer.js +35 -0
  18. package/dist/cli/install-skill/facet-token-renderer.js.map +1 -0
  19. package/dist/cli/install-skill/facets.d.ts +8 -5
  20. package/dist/cli/install-skill/facets.d.ts.map +1 -1
  21. package/dist/cli/install-skill/facets.js +63 -34
  22. package/dist/cli/install-skill/facets.js.map +1 -1
  23. package/dist/cli/install-skill/flow.d.ts +3 -3
  24. package/dist/cli/install-skill/flow.d.ts.map +1 -1
  25. package/dist/cli/install-skill/flow.js +126 -21
  26. package/dist/cli/install-skill/flow.js.map +1 -1
  27. package/dist/cli/install-skill/modes.d.ts +2 -10
  28. package/dist/cli/install-skill/modes.d.ts.map +1 -1
  29. package/dist/cli/install-skill/modes.js +22 -49
  30. package/dist/cli/install-skill/modes.js.map +1 -1
  31. package/dist/cli/path-guard.d.ts +1 -0
  32. package/dist/cli/path-guard.d.ts.map +1 -1
  33. package/dist/cli/path-guard.js +34 -2
  34. package/dist/cli/path-guard.js.map +1 -1
  35. package/dist/cli/runner.d.ts +1 -0
  36. package/dist/cli/runner.d.ts.map +1 -1
  37. package/dist/cli/runner.js +11 -0
  38. package/dist/cli/runner.js.map +1 -1
  39. package/dist/cli/skill-commands.d.ts +13 -4
  40. package/dist/cli/skill-commands.d.ts.map +1 -1
  41. package/dist/cli/skill-commands.js +72 -15
  42. package/dist/cli/skill-commands.js.map +1 -1
  43. package/dist/cli/skill-renderer.d.ts +7 -4
  44. package/dist/cli/skill-renderer.d.ts.map +1 -1
  45. package/dist/cli/skill-renderer.js +74 -58
  46. package/dist/cli/skill-renderer.js.map +1 -1
  47. package/dist/cli/skill-types.d.ts +2 -2
  48. package/dist/cli/skill-types.d.ts.map +1 -1
  49. package/dist/cli/update-check.d.ts +2 -0
  50. package/dist/cli/update-check.d.ts.map +1 -0
  51. package/dist/cli/update-check.js +32 -0
  52. package/dist/cli/update-check.js.map +1 -0
  53. package/dist/compose-definition.d.ts.map +1 -1
  54. package/dist/compose-definition.js +10 -4
  55. package/dist/compose-definition.js.map +1 -1
  56. package/dist/compose.d.ts +5 -2
  57. package/dist/compose.d.ts.map +1 -1
  58. package/dist/compose.js +12 -5
  59. package/dist/compose.js.map +1 -1
  60. package/dist/init/index.d.ts +5 -1
  61. package/dist/init/index.d.ts.map +1 -1
  62. package/dist/init/index.js +30 -17
  63. package/dist/init/index.js.map +1 -1
  64. package/dist/prompt-payload.d.ts +2 -1
  65. package/dist/prompt-payload.d.ts.map +1 -1
  66. package/dist/prompt-payload.js +3 -1
  67. package/dist/prompt-payload.js.map +1 -1
  68. package/dist/types.d.ts +3 -3
  69. package/dist/types.d.ts.map +1 -1
  70. package/package.json +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facet-token-renderer.js","sourceRoot":"","sources":["../../../src/cli/install-skill/facet-token-renderer.ts"],"names":[],"mappings":"AAIA,MAAM,mBAAmB,GACvB,uFAAuF,CAAC;AAC1F,MAAM,gBAAgB,GACpB,sFAAsF,CAAC;AAEzF,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,MAAwB;IAC1E,OAAO,OAAO,CAAC,UAAU,CACvB,mBAAmB,EACnB,CACE,MAAc,EACd,KAA0B,EAC1B,UAA8B,EAC9B,MAAc,EACd,MAAc,EACd,EAAE;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,UAAU,GAAG,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/D,OAAO,+BAA+B,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC5D,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAAC,MAAc,EAAE,MAAc;IACjE,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,+BAA+B,CAAC,KAAa,EAAE,UAAkB;IACxE,IAAI,UAAU,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACnB,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,GAAG,UAAU,GAAG,IAAI,EAAE,CAAC;IAChC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -1,13 +1,12 @@
1
1
  import type { buildSkillSections } from '../skill-renderer.js';
2
2
  import type { CopyFiles } from '../../types.js';
3
- type FacetPlaceholderKey = 'persona' | 'knowledges' | 'policies' | 'instructions';
4
- type FacetTokenValues = Record<FacetPlaceholderKey, string>;
3
+ import type { FacetTokenValues } from './facet-token-renderer.js';
5
4
  export type SkillSections = ReturnType<typeof buildSkillSections>;
6
5
  export interface FacetPathMap {
7
6
  readonly persona: string;
8
7
  readonly knowledges: readonly string[];
9
8
  readonly policies: readonly string[];
10
- readonly instructions?: string;
9
+ readonly instructions: readonly string[];
11
10
  }
12
11
  export declare function buildInlineFacetTokenValues(sections: SkillSections): FacetTokenValues;
13
12
  export declare function buildSectionsWithCopiedPaths(sections: SkillSections, facets: FacetPathMap): SkillSections;
@@ -15,7 +14,7 @@ export declare function copyFacetFiles(params: {
15
14
  targetDir: string;
16
15
  safeSkillName: string;
17
16
  copyFiles: CopyFiles;
18
- literalInstructionBody?: string;
17
+ literalInstructionBodies?: readonly string[];
19
18
  }): FacetPathMap;
20
19
  export declare function applyFacetTokensToPath(params: {
21
20
  rootDir: string;
@@ -23,6 +22,10 @@ export declare function applyFacetTokensToPath(params: {
23
22
  tokenValues: FacetTokenValues;
24
23
  excludeDirs: readonly string[];
25
24
  }): void;
25
+ export declare function applyFacetTokensToFiles(params: {
26
+ filePaths: readonly string[];
27
+ tokenValues: FacetTokenValues;
28
+ rootDir: string;
29
+ }): void;
26
30
  export declare function parseScanDepth(rawDepth: string): number;
27
- export {};
28
31
  //# sourceMappingURL=facets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"facets.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/facets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAKhD,KAAK,mBAAmB,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,GAAG,cAAc,CAAC;AAClF,KAAK,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AA8BD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,aAAa,GAAG,gBAAgB,CAOrF;AAQD,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,YAAY,GACnB,aAAa,CA6Cf;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,GAAG,YAAY,CAiDf;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC,GAAG,IAAI,CAqCP;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMvD"}
1
+ {"version":3,"file":"facets.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/facets.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAQhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AA8BD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,aAAa,GAAG,gBAAgB,CAOrF;AAyBD,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,YAAY,GACnB,aAAa,CA8Cf;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,wBAAwB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C,GAAG,YAAY,CA0Df;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC,GAAG,IAAI,CAiCP;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,IAAI,CAQP;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMvD"}
@@ -1,7 +1,8 @@
1
1
  import { basename, join } from 'node:path';
2
- import { copyFileSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
3
- const FACET_TOKEN_PATTERN = /{{facet:(persona|knowledges|policies|instructions)}}/g;
4
- const FACET_TOKEN_TEST = /{{facet:(persona|knowledges|policies|instructions)}}/;
2
+ import { copyFileSync, mkdirSync, readdirSync, realpathSync, writeFileSync, } from 'node:fs';
3
+ import { isWithinRoot } from '../path-guard.js';
4
+ import { readUtf8FileWithoutFollowingSymbolicLinks, resolveBoundedOutputFilePath, writeUtf8FileWithoutFollowingSymbolicLinks, } from './facet-token-file-ops.js';
5
+ import { hasFacetToken, replaceFacetTokens } from './facet-token-renderer.js';
5
6
  function requireFacetPathCount(params) {
6
7
  if (params.expected !== params.actual) {
7
8
  throw new Error(`Copied ${params.label} facet count mismatch: expected ${params.expected}, received ${params.actual}`);
@@ -22,13 +23,24 @@ export function buildInlineFacetTokenValues(sections) {
22
23
  persona: sections.persona.body,
23
24
  knowledges: sections.knowledge.map(knowledge => knowledge.body).join('\n'),
24
25
  policies: sections.policies.map(policy => policy.body).join('\n'),
25
- instructions: sections.instruction ? sections.instruction.body : '',
26
+ instructions: sections.instructions.map(instruction => instruction.body).join('\n'),
26
27
  };
27
28
  }
28
- function replaceFacetTokens(content, values) {
29
- return content.replaceAll(FACET_TOKEN_PATTERN, (_match, token) => {
30
- return values[token];
31
- });
29
+ function applyFacetTokensToSingleFile(params) {
30
+ const boundedPath = resolveBoundedOutputFilePath(params.filePath, params.rootDir);
31
+ const original = readUtf8FileWithoutFollowingSymbolicLinks(boundedPath.filePath);
32
+ if (!hasFacetToken(original)) {
33
+ return;
34
+ }
35
+ const replaced = replaceFacetTokens(original, params.tokenValues);
36
+ if (replaced === original) {
37
+ return;
38
+ }
39
+ writeUtf8FileWithoutFollowingSymbolicLinks(boundedPath.filePath, replaced);
40
+ const outputRealPath = realpathSync(boundedPath.filePath);
41
+ if (!isWithinRoot(outputRealPath, boundedPath.rootRealPath)) {
42
+ throw new Error(`Output path escapes target directory: ${params.filePath}`);
43
+ }
32
44
  }
33
45
  export function buildSectionsWithCopiedPaths(sections, facets) {
34
46
  requireFacetPathCount({
@@ -41,13 +53,6 @@ export function buildSectionsWithCopiedPaths(sections, facets) {
41
53
  expected: sections.policies.length,
42
54
  actual: facets.policies.length,
43
55
  });
44
- const instruction = sections.instruction && facets.instructions
45
- ? {
46
- ref: basename(facets.instructions, '.md'),
47
- body: sections.instruction.body,
48
- path: facets.instructions,
49
- }
50
- : sections.instruction;
51
56
  return {
52
57
  ...sections,
53
58
  persona: {
@@ -70,7 +75,17 @@ export function buildSectionsWithCopiedPaths(sections, facets) {
70
75
  index,
71
76
  }),
72
77
  })),
73
- instruction,
78
+ instructions: sections.instructions.map((instruction, index) => {
79
+ const instructionPath = facets.instructions[index];
80
+ if (instructionPath) {
81
+ return {
82
+ ref: basename(instructionPath, '.md'),
83
+ body: instruction.body,
84
+ path: instructionPath,
85
+ };
86
+ }
87
+ return instruction;
88
+ }),
74
89
  };
75
90
  }
76
91
  export function copyFacetFiles(params) {
@@ -98,24 +113,32 @@ export function copyFacetFiles(params) {
98
113
  copyFileSync(path, targetPath);
99
114
  return targetPath;
100
115
  });
101
- let instructionPath;
102
- const sourceInstructionPath = params.copyFiles.instructions[0];
103
- if (sourceInstructionPath || params.literalInstructionBody) {
116
+ const instructionPaths = [];
117
+ const hasSourceInstructions = params.copyFiles.instructions.length > 0;
118
+ const hasLiteralInstructions = params.literalInstructionBodies && params.literalInstructionBodies.length > 0;
119
+ if (hasSourceInstructions || hasLiteralInstructions) {
104
120
  mkdirSync(instructionsDir, { recursive: true });
105
- if (sourceInstructionPath) {
106
- instructionPath = join(instructionsDir, basename(sourceInstructionPath));
107
- copyFileSync(sourceInstructionPath, instructionPath);
121
+ if (hasSourceInstructions) {
122
+ for (const sourceInstructionPath of params.copyFiles.instructions) {
123
+ const targetPath = join(instructionsDir, basename(sourceInstructionPath));
124
+ copyFileSync(sourceInstructionPath, targetPath);
125
+ instructionPaths.push(targetPath);
126
+ }
108
127
  }
109
- else {
110
- instructionPath = join(instructionsDir, `${params.safeSkillName}.md`);
111
- writeFileSync(instructionPath, normalizeInstructionBody(params.literalInstructionBody ?? ''), 'utf-8');
128
+ else if (params.literalInstructionBodies) {
129
+ for (let i = 0; i < params.literalInstructionBodies.length; i++) {
130
+ const suffix = params.literalInstructionBodies.length === 1 ? '' : `-${i + 1}`;
131
+ const targetPath = join(instructionsDir, `${params.safeSkillName}${suffix}.md`);
132
+ writeFileSync(targetPath, normalizeInstructionBody(params.literalInstructionBodies[i] ?? ''), 'utf-8');
133
+ instructionPaths.push(targetPath);
134
+ }
112
135
  }
113
136
  }
114
137
  return {
115
138
  persona: personaPath,
116
139
  knowledges: knowledgePaths,
117
140
  policies: policyPaths,
118
- instructions: instructionPath,
141
+ instructions: instructionPaths,
119
142
  };
120
143
  }
121
144
  export function applyFacetTokensToPath(params) {
@@ -138,18 +161,24 @@ export function applyFacetTokensToPath(params) {
138
161
  if (!entry.isFile()) {
139
162
  continue;
140
163
  }
141
- const original = readFileSync(entryPath, 'utf-8');
142
- if (!FACET_TOKEN_TEST.test(original)) {
143
- continue;
144
- }
145
- const replaced = replaceFacetTokens(original, tokenValues);
146
- if (replaced !== original) {
147
- writeFileSync(entryPath, replaced, 'utf-8');
148
- }
164
+ applyFacetTokensToSingleFile({
165
+ filePath: entryPath,
166
+ tokenValues,
167
+ rootDir,
168
+ });
149
169
  }
150
170
  };
151
171
  visit(rootDir, 0);
152
172
  }
173
+ export function applyFacetTokensToFiles(params) {
174
+ for (const filePath of params.filePaths) {
175
+ applyFacetTokensToSingleFile({
176
+ filePath,
177
+ tokenValues: params.tokenValues,
178
+ rootDir: params.rootDir,
179
+ });
180
+ }
181
+ }
153
182
  export function parseScanDepth(rawDepth) {
154
183
  const parsed = Number.parseInt(rawDepth, 10);
155
184
  if (!Number.isFinite(parsed) || parsed < 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"facets.js","sourceRoot":"","sources":["../../../src/cli/install-skill/facets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"facets.js","sourceRoot":"","sources":["../../../src/cli/install-skill/facets.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,13 @@
1
1
  import type { FacetCliOptions } from '../types.js';
2
2
  export { defaultOutputPath, listInstallTargets, resolveInstallTarget } from './targets.js';
3
3
  export declare function shouldOverwrite(answer: string): boolean;
4
- export declare function ensureTemplateDirectory(facetedRoot: string, templateName: string): string;
5
- export declare function copyDirectoryTree(sourceDir: string, targetDir: string): void;
4
+ export declare function ensureTemplateDirectoryFromRoots(facetedRoots: readonly string[], templateRef: string, definitionDir?: string): string;
5
+ export declare function copyDirectoryTree(sourceDir: string, targetDir: string, rootTargetDir?: string): void;
6
+ export declare function collectDirectoryFiles(dir: string, basePath?: string): string[];
6
7
  export declare function ensureRegenerationTargetDir(params: {
7
8
  targetDir: string;
8
9
  options: FacetCliOptions;
9
10
  promptLabel: string;
10
11
  homeDir?: string;
11
12
  }): Promise<void>;
12
- export declare function ensureDirectoryExists(path: string, label: string): void;
13
13
  //# sourceMappingURL=flow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/flow.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE3F,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAazF;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAoB5E;AAgBD,wBAAsB,2BAA2B,CAAC,MAAM,EAAE;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,eAAe,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBhB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIvE"}
1
+ {"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/flow.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE3F,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED,wBAAgB,gCAAgC,CAC9C,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAmCR;AAgGD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,SAAY,GAAG,IAAI,CASvG;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,MAAM,EAAE,CAsB1E;AAiBD,wBAAsB,2BAA2B,CAAC,MAAM,EAAE;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,eAAe,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBhB"}
@@ -1,45 +1,155 @@
1
- import { copyFileSync, existsSync, lstatSync, mkdirSync, readdirSync, rmSync, } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { ensurePathAncestorsAndRealPathWithinHome, ensurePathAncestorsContainNoSymbolicLinks, ensurePathWithinRoots, } from '../path-guard.js';
1
+ import { closeSync, constants, existsSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, unlinkSync, writeFileSync, } from 'node:fs';
2
+ import { basename, dirname, join, resolve } from 'node:path';
3
+ import { ensurePathAncestorsAndRealPathWithinHome, ensurePathAncestorsContainNoSymbolicLinks, ensurePathIsNotSymbolicLink, isWithinRoot, ensurePathWithinRoots, } from '../path-guard.js';
4
+ import { isResourcePath, resolveResourcePath } from '../../resolve.js';
4
5
  export { defaultOutputPath, listInstallTargets, resolveInstallTarget } from './targets.js';
5
6
  export function shouldOverwrite(answer) {
6
7
  const normalized = answer.trim().toLowerCase();
7
8
  return normalized === 'y' || normalized === 'yes';
8
9
  }
9
- export function ensureTemplateDirectory(facetedRoot, templateName) {
10
- const templatesRoot = join(facetedRoot, 'templates');
11
- const templatePath = ensurePathWithinRoots(join(templatesRoot, templateName), [templatesRoot], `template "${templateName}"`);
12
- if (!lstatSync(templatePath).isDirectory()) {
13
- throw new Error(`Template path must be a directory: ${templatePath}`);
10
+ export function ensureTemplateDirectoryFromRoots(facetedRoots, templateRef, definitionDir) {
11
+ if (isResourcePath(templateRef) && definitionDir) {
12
+ const resolvedPath = resolveResourcePath(templateRef, definitionDir);
13
+ if (!existsSync(resolvedPath)) {
14
+ throw new Error(`Template directory does not exist: ${resolvedPath}`);
15
+ }
16
+ if (!lstatSync(resolvedPath).isDirectory()) {
17
+ throw new Error(`Template path must be a directory: ${resolvedPath}`);
18
+ }
19
+ return resolvedPath;
20
+ }
21
+ const templatesRoots = facetedRoots.map(facetedRoot => join(facetedRoot, 'templates'));
22
+ const primaryTemplatesRoot = templatesRoots[0];
23
+ if (!primaryTemplatesRoot) {
24
+ throw new Error('Template roots are required');
14
25
  }
15
- return templatePath;
26
+ for (const templatesRoot of templatesRoots) {
27
+ const candidatePath = join(templatesRoot, templateRef);
28
+ if (!existsSync(candidatePath)) {
29
+ continue;
30
+ }
31
+ const templatePath = ensurePathWithinRoots(candidatePath, [templatesRoot], `template "${templateRef}"`);
32
+ if (!lstatSync(templatePath).isDirectory()) {
33
+ throw new Error(`Template path must be a directory: ${templatePath}`);
34
+ }
35
+ return templatePath;
36
+ }
37
+ throw new Error(`Template directory does not exist: ${join(primaryTemplatesRoot, templateRef)}`);
16
38
  }
17
- export function copyDirectoryTree(sourceDir, targetDir) {
39
+ function copyFileIntoTargetRoot(params) {
40
+ const targetParentDir = dirname(params.targetPath);
41
+ mkdirSync(targetParentDir, { recursive: true });
42
+ ensurePathAncestorsContainNoSymbolicLinks(targetParentDir, 'Output directory', params.rootTargetDir);
43
+ const targetParentRealPath = realpathSync(targetParentDir);
44
+ if (!isWithinRoot(targetParentRealPath, params.rootTargetRealPath)) {
45
+ throw new Error(`Output path escapes target directory: ${params.targetPath}`);
46
+ }
47
+ const targetFilePath = join(targetParentRealPath, basename(params.targetPath));
48
+ const tempFilePath = join(targetParentRealPath, `.${basename(params.targetPath)}.${process.pid}.${Date.now()}.tmp`);
49
+ const openFlags = constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW;
50
+ let targetFileDescriptor;
51
+ try {
52
+ if (existsSync(targetFilePath) && lstatSync(targetFilePath).isSymbolicLink()) {
53
+ throw new Error(`Symbolic links are not allowed for output file: ${params.targetPath}`);
54
+ }
55
+ targetFileDescriptor = openSync(tempFilePath, openFlags, 0o600);
56
+ }
57
+ catch (error) {
58
+ const errorCode = error.code;
59
+ if (errorCode === 'ELOOP') {
60
+ throw new Error(`Symbolic links are not allowed for output file: ${tempFilePath}`);
61
+ }
62
+ throw error;
63
+ }
64
+ try {
65
+ writeFileSync(targetFileDescriptor, readFileSync(params.sourcePath));
66
+ }
67
+ finally {
68
+ closeSync(targetFileDescriptor);
69
+ }
70
+ try {
71
+ renameSync(tempFilePath, targetFilePath);
72
+ }
73
+ catch (error) {
74
+ if (existsSync(tempFilePath)) {
75
+ unlinkSync(tempFilePath);
76
+ }
77
+ throw error;
78
+ }
79
+ const targetRealPath = realpathSync(targetFilePath);
80
+ if (!isWithinRoot(targetRealPath, params.rootTargetRealPath)) {
81
+ throw new Error(`Output path escapes target directory: ${params.targetPath}`);
82
+ }
83
+ }
84
+ function copyDirectoryTreeInternal(params) {
85
+ mkdirSync(params.targetDir, { recursive: true });
86
+ for (const entry of readdirSync(params.sourceDir, { withFileTypes: true })) {
87
+ if (entry.isSymbolicLink()) {
88
+ throw new Error(`Symbolic links are not allowed in template directory: ${join(params.sourceDir, entry.name)}`);
89
+ }
90
+ const sourcePath = join(params.sourceDir, entry.name);
91
+ const targetPath = join(params.targetDir, entry.name);
92
+ if (entry.isDirectory()) {
93
+ ensurePathAncestorsContainNoSymbolicLinks(targetPath, 'Output directory', params.rootTargetDir);
94
+ copyDirectoryTreeInternal({
95
+ sourceDir: sourcePath,
96
+ targetDir: targetPath,
97
+ rootTargetDir: params.rootTargetDir,
98
+ rootTargetRealPath: params.rootTargetRealPath,
99
+ });
100
+ continue;
101
+ }
102
+ if (entry.isFile()) {
103
+ copyFileIntoTargetRoot({
104
+ sourcePath,
105
+ targetPath,
106
+ rootTargetDir: params.rootTargetDir,
107
+ rootTargetRealPath: params.rootTargetRealPath,
108
+ });
109
+ }
110
+ }
111
+ }
112
+ export function copyDirectoryTree(sourceDir, targetDir, rootTargetDir = targetDir) {
18
113
  mkdirSync(targetDir, { recursive: true });
19
- for (const entry of readdirSync(sourceDir, { withFileTypes: true })) {
114
+ const rootTargetRealPath = realpathSync(rootTargetDir);
115
+ copyDirectoryTreeInternal({
116
+ sourceDir,
117
+ targetDir,
118
+ rootTargetDir,
119
+ rootTargetRealPath,
120
+ });
121
+ }
122
+ export function collectDirectoryFiles(dir, basePath = '') {
123
+ const files = [];
124
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
20
125
  if (entry.isSymbolicLink()) {
21
- throw new Error(`Symbolic links are not allowed in template directory: ${join(sourceDir, entry.name)}`);
126
+ continue;
22
127
  }
23
- const sourcePath = join(sourceDir, entry.name);
24
- const targetPath = join(targetDir, entry.name);
128
+ const relativePath = basePath ? join(basePath, entry.name) : entry.name;
129
+ const entryPath = join(dir, entry.name);
25
130
  if (entry.isDirectory()) {
26
- copyDirectoryTree(sourcePath, targetPath);
131
+ files.push(...collectDirectoryFiles(entryPath, relativePath));
27
132
  continue;
28
133
  }
29
134
  if (entry.isFile()) {
30
- copyFileSync(sourcePath, targetPath);
135
+ files.push(relativePath);
31
136
  }
32
137
  }
138
+ return files;
33
139
  }
34
140
  function ensurePathSafety(params) {
35
141
  if (params.homeDir) {
36
142
  ensurePathAncestorsAndRealPathWithinHome(params.targetDir, params.homeDir, params.promptLabel);
37
143
  return;
38
144
  }
145
+ ensurePathIsNotSymbolicLink(params.targetDir, params.promptLabel);
39
146
  ensurePathAncestorsContainNoSymbolicLinks(params.targetDir, params.promptLabel, params.cwd);
40
147
  }
41
148
  export async function ensureRegenerationTargetDir(params) {
42
149
  const { targetDir, options, promptLabel } = params;
150
+ if (params.homeDir && resolve(targetDir) === resolve(params.homeDir)) {
151
+ throw new Error(`${promptLabel} must not be home directory: ${resolve(targetDir)}`);
152
+ }
43
153
  ensurePathSafety({
44
154
  targetDir,
45
155
  promptLabel,
@@ -55,9 +165,4 @@ export async function ensureRegenerationTargetDir(params) {
55
165
  }
56
166
  mkdirSync(targetDir, { recursive: true });
57
167
  }
58
- export function ensureDirectoryExists(path, label) {
59
- if (!existsSync(path) || !lstatSync(path).isDirectory()) {
60
- throw new Error(`${label} does not exist: ${path}`);
61
- }
62
- }
63
168
  //# sourceMappingURL=flow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/cli/install-skill/flow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/cli/install-skill/flow.ts"],"names":[],"mappings":"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"}
@@ -2,19 +2,11 @@ import type { FacetCliOptions, FacetCliResult } from '../types.js';
2
2
  import type { SkillSections } from './facets.js';
3
3
  import type { ComposeDefinition } from '../../types.js';
4
4
  import type { InstallTarget } from '../skill-types.js';
5
- export declare function runTemplateApplyInstall(params: {
6
- options: FacetCliOptions;
7
- safeSkillName: string;
8
- sections: SkillSections;
9
- templateDir: string;
10
- definitionDir: string;
11
- facetsRoot: string;
12
- }): Promise<FacetCliResult>;
13
5
  export declare function runSkillDeployInstall(params: {
14
6
  options: FacetCliOptions;
15
- facetedRoot: string;
7
+ facetedRoots: readonly string[];
16
8
  definitionDir: string;
17
- facetsRoot: string;
9
+ facetsRoots: readonly string[];
18
10
  safeSkillName: string;
19
11
  definition: ComposeDefinition;
20
12
  sections: SkillSections;
@@ -1 +1 @@
1
- {"version":3,"file":"modes.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/modes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgBnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAqBvD,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,OAAO,EAAE,eAAe,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,aAAa,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,cAAc,CAAC,CA2C1B;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,OAAO,EAAE,eAAe,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,EAAE,aAAa,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC,CA0FjG"}
1
+ {"version":3,"file":"modes.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/modes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAcnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAqBvD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,OAAO,EAAE,eAAe,CAAC;IACzB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,EAAE,aAAa,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC,CAoGjG"}
@@ -1,10 +1,10 @@
1
1
  import { existsSync, lstatSync, readFileSync } from 'node:fs';
2
- import { dirname, join, resolve } from 'node:path';
3
- import { ensurePathWithinHome } from '../path-guard.js';
2
+ import { basename, dirname, resolve } from 'node:path';
3
+ import { ensurePathWithinHome, isWithinRoot } from '../path-guard.js';
4
4
  import { hasYamlFrontmatter, renderSkillDocument, renderSkillFrontmatter } from '../skill-renderer.js';
5
5
  import { writeSkillFile } from '../skill-file-ops.js';
6
- import { applyFacetTokensToPath, buildInlineFacetTokenValues, copyFacetFiles, parseScanDepth, } from './facets.js';
7
- import { copyDirectoryTree, defaultOutputPath, ensureDirectoryExists, ensureRegenerationTargetDir, listInstallTargets, ensureTemplateDirectory, resolveInstallTarget, } from './flow.js';
6
+ import { applyFacetTokensToPath, buildInlineFacetTokenValues, copyFacetFiles, } from './facets.js';
7
+ import { copyDirectoryTree, defaultOutputPath, ensureRegenerationTargetDir, listInstallTargets, ensureTemplateDirectoryFromRoots, resolveInstallTarget, } from './flow.js';
8
8
  import { composePromptPayload } from '../../prompt-payload.js';
9
9
  function ensureTemplateBackedSkillFrontmatter(params) {
10
10
  if (!existsSync(params.outputPath)) {
@@ -17,43 +17,6 @@ function ensureTemplateBackedSkillFrontmatter(params) {
17
17
  const contentWithFrontmatter = `${renderSkillFrontmatter(params.definition)}\n${currentContent.trimStart()}`;
18
18
  writeSkillFile(params.outputPath, contentWithFrontmatter, params.homeDir);
19
19
  }
20
- export async function runTemplateApplyInstall(params) {
21
- const requestedDir = await params.options.input('Output directory', params.options.cwd);
22
- const targetDir = resolve(requestedDir);
23
- ensureDirectoryExists(targetDir, 'Output directory');
24
- const scanDepth = parseScanDepth(await params.options.input('Scan depth', '1'));
25
- const payload = composePromptPayload({
26
- definition: params.sections.definition,
27
- definitionDir: params.definitionDir,
28
- facetsRoot: params.facetsRoot,
29
- composeOptions: { contextMaxChars: 8000 },
30
- });
31
- copyDirectoryTree(params.templateDir, targetDir);
32
- const facetsDir = join(targetDir, 'facets');
33
- await ensureRegenerationTargetDir({
34
- targetDir: facetsDir,
35
- options: params.options,
36
- promptLabel: 'Facets directory',
37
- });
38
- copyFacetFiles({
39
- targetDir,
40
- safeSkillName: params.safeSkillName,
41
- copyFiles: payload.copyFiles,
42
- literalInstructionBody: params.sections.instruction && !('path' in params.sections.instruction)
43
- ? params.sections.instruction.body
44
- : undefined,
45
- });
46
- applyFacetTokensToPath({
47
- rootDir: targetDir,
48
- maxDepth: scanDepth,
49
- tokenValues: buildInlineFacetTokenValues(params.sections),
50
- excludeDirs: ['facets'],
51
- });
52
- return {
53
- kind: 'path',
54
- path: targetDir,
55
- };
56
- }
57
20
  export async function runSkillDeployInstall(params) {
58
21
  const targetLabel = await params.options.select(listInstallTargets().map(target => target.label), 'Choose install target with Up/Down and Enter:');
59
22
  const target = resolveInstallTarget(targetLabel);
@@ -61,19 +24,29 @@ export async function runSkillDeployInstall(params) {
61
24
  const defaultPath = defaultOutputPath(params.options.homeDir, params.safeSkillName, target);
62
25
  const outputPath = resolve(await params.options.input('Output path', defaultPath));
63
26
  const { resolvedPath: boundedOutputPath } = ensurePathWithinHome(outputPath, params.options.homeDir, 'Skill output path');
27
+ const targetRootDir = resolve(params.options.homeDir, ...target.relativeOutputPath);
28
+ if (!isWithinRoot(boundedOutputPath, targetRootDir)) {
29
+ throw new Error(`Skill output path must be inside target directory: ${targetRootDir}`);
30
+ }
31
+ if (basename(boundedOutputPath) !== 'SKILL.md') {
32
+ throw new Error(`Skill output path must point to SKILL.md: ${boundedOutputPath}`);
33
+ }
64
34
  if (existsSync(boundedOutputPath) && lstatSync(boundedOutputPath).isSymbolicLink()) {
65
35
  throw new Error(`Symbolic links are not allowed for skill output file: ${boundedOutputPath}`);
66
36
  }
67
37
  const templateDir = params.definition.template
68
- ? ensureTemplateDirectory(params.facetedRoot, params.definition.template)
38
+ ? ensureTemplateDirectoryFromRoots(params.facetedRoots, params.definition.template, params.definitionDir)
69
39
  : undefined;
70
40
  const payload = composePromptPayload({
71
41
  definition: params.definition,
72
42
  definitionDir: params.definitionDir,
73
- facetsRoot: params.facetsRoot,
43
+ facetsRoots: params.facetsRoots,
74
44
  composeOptions: { contextMaxChars: 8000 },
75
45
  });
76
46
  const targetDir = dirname(boundedOutputPath);
47
+ if (resolve(targetDir) === targetRootDir) {
48
+ throw new Error(`Skill output path must include a skill directory under target directory: ${targetRootDir}`);
49
+ }
77
50
  await ensureRegenerationTargetDir({
78
51
  targetDir,
79
52
  options: params.options,
@@ -86,9 +59,9 @@ export async function runSkillDeployInstall(params) {
86
59
  targetDir,
87
60
  safeSkillName: params.safeSkillName,
88
61
  copyFiles: payload.copyFiles,
89
- literalInstructionBody: params.sections.instruction && !('path' in params.sections.instruction)
90
- ? params.sections.instruction.body
91
- : undefined,
62
+ literalInstructionBodies: params.sections.instructions
63
+ .filter(instruction => !('path' in instruction))
64
+ .map(instruction => instruction.body),
92
65
  });
93
66
  applyFacetTokensToPath({
94
67
  rootDir: targetDir,
@@ -107,9 +80,9 @@ export async function runSkillDeployInstall(params) {
107
80
  targetDir,
108
81
  safeSkillName: params.safeSkillName,
109
82
  copyFiles: payload.copyFiles,
110
- literalInstructionBody: params.sections.instruction && !('path' in params.sections.instruction)
111
- ? params.sections.instruction.body
112
- : undefined,
83
+ literalInstructionBodies: params.sections.instructions
84
+ .filter(instruction => !('path' in instruction))
85
+ .map(instruction => instruction.body),
113
86
  });
114
87
  const content = renderSkillDocument({
115
88
  ...params.sections,