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
@@ -1 +1 @@
1
- {"version":3,"file":"modes.js","sourceRoot":"","sources":["../../../src/cli/install-skill/modes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"modes.js","sourceRoot":"","sources":["../../../src/cli/install-skill/modes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACvG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,2BAA2B,EAC3B,kBAAkB,EAClB,gCAAgC,EAChC,oBAAoB,GACrB,MAAM,WAAW,CAAC;AAInB,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,SAAS,oCAAoC,CAAC,MAI7C;IACC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChE,IAAI,kBAAkB,CAAC,cAAc,CAAC,EAAE,CAAC;QACvC,OAAO;IACT,CAAC;IAED,MAAM,sBAAsB,GAAG,GAAG,sBAAsB,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC;IAC7G,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,sBAAsB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAQ3C;IACC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAC7C,kBAAkB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAChD,+CAA+C,CAChD,CAAC;IACF,MAAM,MAAM,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,QAAiB,CAAC;IAC/B,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC5F,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;IACnF,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,GAAG,oBAAoB,CAC9D,UAAU,EACV,MAAM,CAAC,OAAO,CAAC,OAAO,EACtB,mBAAmB,CACpB,CAAC;IACF,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACpF,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,aAAa,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,sDAAsD,aAAa,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,QAAQ,CAAC,iBAAiB,CAAC,KAAK,UAAU,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,6CAA6C,iBAAiB,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,UAAU,CAAC,iBAAiB,CAAC,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,yDAAyD,iBAAiB,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ;QAC5C,CAAC,CAAC,gCAAgC,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC;QACzG,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,OAAO,GAAG,oBAAoB,CAAC;QACnC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,cAAc,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;KAC1C,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC7C,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,aAAa,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,4EAA4E,aAAa,EAAE,CAAC,CAAC;IAC/G,CAAC;IAED,MAAM,2BAA2B,CAAC;QAChC,SAAS;QACT,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;KAChC,CAAC,CAAC;IAEH,IAAI,WAAW,EAAE,CAAC;QAChB,iBAAiB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAE1C,cAAc,CAAC;YACb,SAAS;YACT,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,wBAAwB,EACtB,MAAM,CAAC,QAAQ,CAAC,YAAY;iBACzB,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC;iBAC/C,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;SAC1C,CAAC,CAAC;QAEH,sBAAsB,CAAC;YACrB,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE,MAAM,CAAC,gBAAgB;YACjC,WAAW,EAAE,2BAA2B,CAAC,MAAM,CAAC,QAAQ,CAAC;YACzD,WAAW,EAAE,CAAC,QAAQ,CAAC;SACxB,CAAC,CAAC;QAEH,oCAAoC,CAAC;YACnC,UAAU,EAAE,iBAAiB;YAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;SAChC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,cAAc,CAAC;YACb,SAAS;YACT,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,wBAAwB,EACtB,MAAM,CAAC,QAAQ,CAAC,YAAY;iBACzB,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC;iBAC/C,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;SAC1C,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,mBAAmB,CAAC;YAClC,GAAG,MAAM,CAAC,QAAQ;YAClB,IAAI;SACL,CAAC,CAAC;QAEH,cAAc,CAAC,iBAAiB,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,OAAO;QACL,MAAM,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,iBAAiB;SACxB;QACD,IAAI;QACJ,UAAU,EAAE,iBAAiB;QAC7B,MAAM,EAAE,MAAM,CAAC,GAAG;KACnB,CAAC;AACJ,CAAC"}
@@ -4,6 +4,7 @@ export declare function ensurePathWithinHome(path: string, homeDir: string, labe
4
4
  homeRealPath: string;
5
5
  };
6
6
  export declare function ensurePathWithinRoots(path: string, roots: readonly string[], label: string): string;
7
+ export declare function ensurePathIsNotSymbolicLink(path: string, label: string): string;
7
8
  export declare function ensurePathAncestorsContainNoSymbolicLinks(path: string, label: string, stopAtPath?: string): string;
8
9
  export declare function ensurePathAncestorsAndRealPathWithinHome(path: string, homeDir: string, label: string): {
9
10
  resolvedPath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"path-guard.d.ts","sourceRoot":"","sources":["../../src/cli/path-guard.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAUhD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAqBnG;AAcD,wBAAgB,yCAAyC,CACvD,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CA4BR;AAED,wBAAgB,wCAAwC,CACtD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAYhD"}
1
+ {"version":3,"file":"path-guard.d.ts","sourceRoot":"","sources":["../../src/cli/path-guard.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAUhD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAqBnG;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAY/E;AAcD,wBAAgB,yCAAyC,CACvD,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAmDR;AAED,wBAAgB,wCAAwC,CACtD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAYhD"}
@@ -31,6 +31,17 @@ export function ensurePathWithinRoots(path, roots, label) {
31
31
  }
32
32
  throw new Error(`${label} must be inside allowed facets directory: ${realPath}`);
33
33
  }
34
+ export function ensurePathIsNotSymbolicLink(path, label) {
35
+ const resolvedPath = resolve(path);
36
+ if (!existsSync(resolvedPath)) {
37
+ return resolvedPath;
38
+ }
39
+ const stat = lstatSync(resolvedPath);
40
+ if (stat.isSymbolicLink()) {
41
+ throw new Error(`Symbolic links are not allowed for ${label}: ${resolvedPath}`);
42
+ }
43
+ return resolvedPath;
44
+ }
34
45
  function findNearestExistingAncestor(path) {
35
46
  let current = path;
36
47
  while (!existsSync(current)) {
@@ -45,22 +56,43 @@ function findNearestExistingAncestor(path) {
45
56
  export function ensurePathAncestorsContainNoSymbolicLinks(path, label, stopAtPath) {
46
57
  const resolvedPath = resolve(path);
47
58
  const resolvedStopAtPath = stopAtPath ? resolve(stopAtPath) : undefined;
59
+ const nearestExistingAncestor = findNearestExistingAncestor(resolvedPath);
48
60
  let current = resolvedPath;
49
61
  while (true) {
50
- if (resolvedStopAtPath && !isWithinRoot(current, resolvedStopAtPath)) {
62
+ if (existsSync(current)) {
63
+ const stat = lstatSync(current);
64
+ if (stat.isSymbolicLink()) {
65
+ throw new Error(`Symbolic links are not allowed in ${label} path: ${current}`);
66
+ }
67
+ }
68
+ if (current === nearestExistingAncestor) {
69
+ break;
70
+ }
71
+ const parent = dirname(current);
72
+ if (parent === current) {
51
73
  break;
52
74
  }
75
+ current = parent;
76
+ }
77
+ if (!resolvedStopAtPath || !isWithinRoot(nearestExistingAncestor, resolvedStopAtPath)) {
78
+ return resolvedPath;
79
+ }
80
+ current = dirname(nearestExistingAncestor);
81
+ while (true) {
53
82
  if (existsSync(current)) {
54
83
  const stat = lstatSync(current);
55
84
  if (stat.isSymbolicLink()) {
56
85
  throw new Error(`Symbolic links are not allowed in ${label} path: ${current}`);
57
86
  }
58
87
  }
88
+ if (current === resolvedStopAtPath) {
89
+ break;
90
+ }
59
91
  const parent = dirname(current);
60
92
  if (parent === current) {
61
93
  break;
62
94
  }
63
- if (resolvedStopAtPath && current === resolvedStopAtPath) {
95
+ if (!isWithinRoot(parent, resolvedStopAtPath)) {
64
96
  break;
65
97
  }
66
98
  current = parent;
@@ -1 +1 @@
1
- {"version":3,"file":"path-guard.js","sourceRoot":"","sources":["../../src/cli/path-guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"path-guard.js","sourceRoot":"","sources":["../../src/cli/path-guard.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { runFacetCli } from './index.js';
2
2
  export interface RunnerDependencies {
3
+ readonly checkForUpdates: () => Promise<void>;
3
4
  readonly runFacetCli: typeof runFacetCli;
4
5
  readonly writeStdout: (message: string) => void;
5
6
  readonly writeStderr: (message: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAgBzC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,OAAO,WAAW,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAqBD,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EAAE,EACd,YAAY,GAAE,kBAA0C,GACvD,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAExD"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAiBzC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,OAAO,WAAW,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAsBD,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EAAE,EACd,YAAY,GAAE,kBAA0C,GACvD,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAExD"}
@@ -4,6 +4,7 @@ import { createInterface } from 'node:readline/promises';
4
4
  import { pathToFileURL } from 'node:url';
5
5
  import { runFacetCli } from './index.js';
6
6
  import { selectInteractive } from './select.js';
7
+ import { checkForUpdates } from './update-check.js';
7
8
  async function inputInteractive(prompt, defaultValue) {
8
9
  const rl = createInterface({ input, output });
9
10
  try {
@@ -19,6 +20,7 @@ async function inputInteractive(prompt, defaultValue) {
19
20
  }
20
21
  function defaultDependencies() {
21
22
  return {
23
+ checkForUpdates,
22
24
  runFacetCli,
23
25
  writeStdout: message => {
24
26
  output.write(message);
@@ -35,6 +37,15 @@ function toErrorMessage(error) {
35
37
  return error instanceof Error ? error.message : String(error);
36
38
  }
37
39
  export async function runMain(argv, dependencies = defaultDependencies()) {
40
+ try {
41
+ const updateCheckTask = dependencies.checkForUpdates();
42
+ void updateCheckTask.catch((error) => {
43
+ dependencies.writeStderr(`update check failed: ${toErrorMessage(error)}\n`);
44
+ });
45
+ }
46
+ catch (error) {
47
+ dependencies.writeStderr(`update check failed: ${toErrorMessage(error)}\n`);
48
+ }
38
49
  try {
39
50
  const result = await dependencies.runFacetCli(argv, {
40
51
  cwd: process.cwd(),
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,17 @@
1
1
  import type { FacetCliOptions, FacetCliResult } from './types.js';
2
- export declare function getSkillPaths(homeDir: string): {
3
- readonly facetedRoot: string;
4
- readonly facetsRoot: string;
5
- readonly compositionsDir: string;
2
+ export declare function getSkillPaths(cwd: string, homeDir: string): {
3
+ readonly facetedRoots: readonly string[];
4
+ readonly facetsRoots: readonly string[];
5
+ readonly compositionsDirs: readonly string[];
6
6
  };
7
+ export declare function selectCompositionDefinitionPath(params: {
8
+ options: FacetCliOptions;
9
+ compositionDefinitionDirs: readonly string[];
10
+ localCompositionsDir: string | undefined;
11
+ globalCompositionsDir: string;
12
+ cancelAction: 'Install' | 'Compose';
13
+ }): Promise<{
14
+ definitionPath: string;
15
+ }>;
7
16
  export declare function runInstallSkillCommand(options: FacetCliOptions): Promise<FacetCliResult>;
8
17
  //# sourceMappingURL=skill-commands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-commands.d.ts","sourceRoot":"","sources":["../../src/cli/skill-commands.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGlE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC,CAOA;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAoC9F"}
1
+ {"version":3,"file":"skill-commands.d.ts","sourceRoot":"","sources":["../../src/cli/skill-commands.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIlE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAC3D,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C,CAcA;AA+BD,wBAAsB,+BAA+B,CAAC,MAAM,EAAE;IAC5D,OAAO,EAAE,eAAe,CAAC;IACzB,yBAAyB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,YAAY,EAAE,SAAS,GAAG,SAAS,CAAC;CACrC,GAAG,OAAO,CAAC;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAyCtC;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAiC9F"}
@@ -1,41 +1,98 @@
1
- import { dirname, join } from 'node:path';
1
+ import { existsSync, realpathSync } from 'node:fs';
2
+ import { dirname, join, resolve, sep } from 'node:path';
2
3
  import { loadComposeDefinition } from '../compose-definition.js';
3
4
  import { getFacetedRoot } from '../config/index.js';
4
5
  import { buildSkillSections, ensureSafeDefinitionName, listCompositionDefinitions, } from './skill-renderer.js';
6
+ import { shouldOverwrite } from './install-skill/flow.js';
5
7
  import { runSkillDeployInstall } from './install-skill/modes.js';
6
- export function getSkillPaths(homeDir) {
7
- const facetedRoot = getFacetedRoot(homeDir);
8
+ export function getSkillPaths(cwd, homeDir) {
9
+ const globalFacetedRoot = getFacetedRoot(homeDir);
10
+ const localFacetedRoot = getFacetedRoot(cwd);
11
+ const realLocal = existsSync(localFacetedRoot) ? realpathSync(localFacetedRoot) : undefined;
12
+ const realGlobal = existsSync(globalFacetedRoot) ? realpathSync(globalFacetedRoot) : globalFacetedRoot;
13
+ const facetedRoots = realLocal && realLocal !== realGlobal
14
+ ? [localFacetedRoot, globalFacetedRoot]
15
+ : [globalFacetedRoot];
8
16
  return {
9
- facetedRoot,
10
- facetsRoot: join(facetedRoot, 'facets'),
11
- compositionsDir: join(facetedRoot, 'compositions'),
17
+ facetedRoots,
18
+ facetsRoots: facetedRoots.map(facetedRoot => join(facetedRoot, 'facets')),
19
+ compositionsDirs: facetedRoots.map(facetedRoot => join(facetedRoot, 'compositions')),
12
20
  };
13
21
  }
14
- export async function runInstallSkillCommand(options) {
15
- const { facetedRoot, facetsRoot, compositionsDir } = getSkillPaths(options.homeDir);
16
- const definitionMap = listCompositionDefinitions(compositionsDir);
17
- const compositionCandidates = Object.keys(definitionMap).sort();
22
+ function resolveCompositionSource(definitionPath, localCompositionsDir) {
23
+ if (!localCompositionsDir) {
24
+ return 'global';
25
+ }
26
+ const realDefPath = existsSync(definitionPath) ? realpathSync(resolve(definitionPath)) : resolve(definitionPath);
27
+ const realLocalDir = existsSync(localCompositionsDir) ? realpathSync(resolve(localCompositionsDir)) : resolve(localCompositionsDir);
28
+ if (realDefPath.startsWith(`${realLocalDir}${sep}`)) {
29
+ return 'local';
30
+ }
31
+ return 'global';
32
+ }
33
+ function hasGlobalCompositionShadow(compositionName, globalCompositionsDir) {
34
+ if (existsSync(join(globalCompositionsDir, `${compositionName}.yaml`)) ||
35
+ existsSync(join(globalCompositionsDir, `${compositionName}.yml`))) {
36
+ return true;
37
+ }
38
+ return false;
39
+ }
40
+ export async function selectCompositionDefinitionPath(params) {
41
+ const definitionMap = listCompositionDefinitions(params.compositionDefinitionDirs);
42
+ const compositionCandidates = Object.keys(definitionMap)
43
+ .sort()
44
+ .map(name => {
45
+ const definitionPath = definitionMap[name];
46
+ if (!definitionPath) {
47
+ throw new Error(`Unknown compose definition: ${name}`);
48
+ }
49
+ const source = resolveCompositionSource(definitionPath, params.localCompositionsDir);
50
+ return source === 'local' ? `${name} (local)` : `${name} (global)`;
51
+ });
18
52
  if (compositionCandidates.length === 0) {
19
- throw new Error(`No compose definitions found in ${compositionsDir}`);
53
+ throw new Error(`No compose definitions found in ${params.compositionDefinitionDirs.join(', ')}`);
20
54
  }
21
- const selectedComposition = await options.select(compositionCandidates, 'Choose composition with Up/Down and Enter:');
55
+ const selectedLabel = await params.options.select(compositionCandidates, 'Choose composition with Up/Down and Enter:');
56
+ const selectedComposition = selectedLabel.replace(/ \((local|global)\)$/u, '');
22
57
  const definitionPath = definitionMap[selectedComposition];
23
58
  if (!definitionPath) {
24
59
  throw new Error(`Unknown compose definition selected: ${selectedComposition}`);
25
60
  }
61
+ if (resolveCompositionSource(definitionPath, params.localCompositionsDir) === 'local' &&
62
+ hasGlobalCompositionShadow(selectedComposition, params.globalCompositionsDir)) {
63
+ const approved = await params.options.input(`Local composition "${selectedComposition}" overrides global definition. Continue? [y/N]`, 'n');
64
+ if (!shouldOverwrite(approved)) {
65
+ throw new Error(`${params.cancelAction} was cancelled for local composition: ${selectedComposition}`);
66
+ }
67
+ }
68
+ return { definitionPath };
69
+ }
70
+ export async function runInstallSkillCommand(options) {
71
+ const { facetedRoots, facetsRoots, compositionsDirs } = getSkillPaths(options.cwd, options.homeDir);
72
+ const localFacetedRoot = getFacetedRoot(options.cwd);
73
+ const globalFacetedRoot = getFacetedRoot(options.homeDir);
74
+ const localCompositionsDir = existsSync(localFacetedRoot) ? join(localFacetedRoot, 'compositions') : undefined;
75
+ const globalCompositionsDir = join(globalFacetedRoot, 'compositions');
76
+ const { definitionPath } = await selectCompositionDefinitionPath({
77
+ options,
78
+ compositionDefinitionDirs: compositionsDirs,
79
+ localCompositionsDir,
80
+ globalCompositionsDir,
81
+ cancelAction: 'Install',
82
+ });
26
83
  const definition = await loadComposeDefinition(definitionPath);
27
84
  const safeSkillName = ensureSafeDefinitionName(definition.name);
28
85
  const definitionDir = dirname(definitionPath);
29
86
  const sections = buildSkillSections({
30
87
  definition,
31
88
  definitionDir,
32
- facetsRoot,
89
+ facetsRoots,
33
90
  });
34
91
  return (await runSkillDeployInstall({
35
92
  options,
36
- facetedRoot,
93
+ facetedRoots,
37
94
  definitionDir,
38
- facetsRoot,
95
+ facetsRoots,
39
96
  safeSkillName,
40
97
  definition,
41
98
  sections,
@@ -1 +1 @@
1
- {"version":3,"file":"skill-commands.js","sourceRoot":"","sources":["../../src/cli/skill-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,UAAU,aAAa,CAAC,OAAe;IAK3C,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO;QACL,WAAW;QACX,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;QACvC,eAAe,EAAE,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAwB;IACnE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpF,MAAM,aAAa,GAAG,0BAA0B,CAAC,eAAe,CAAC,CAAC;IAClE,MAAM,qBAAqB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,mCAAmC,eAAe,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,MAAM,CAC9C,qBAAqB,EACrB,4CAA4C,CAC7C,CAAC;IACF,MAAM,cAAc,GAAG,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,wCAAwC,mBAAmB,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,wBAAwB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QAClC,UAAU;QACV,aAAa;QACb,UAAU;KACX,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,qBAAqB,CAAC;QAClC,OAAO;QACP,WAAW;QACX,aAAa;QACb,UAAU;QACV,aAAa;QACb,UAAU;QACV,QAAQ;KACT,CAAC,CAAC,CAAC,MAAM,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"skill-commands.js","sourceRoot":"","sources":["../../src/cli/skill-commands.ts"],"names":[],"mappings":"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"}
@@ -4,18 +4,21 @@ export declare function ensureSafeDefinitionName(name: string): string;
4
4
  export declare function resolveDefinitionSections(params: {
5
5
  definition: ComposeDefinition;
6
6
  definitionDir: string;
7
- facetsRoot: string;
7
+ facetsRoot?: string;
8
+ facetsRoots?: readonly string[];
8
9
  }): ResolvedDefinitionSections;
9
- export declare function listCompositionDefinitions(compositionsDir: string): Record<string, string>;
10
+ export declare function listCompositionDefinitions(compositionsDirs: string | readonly string[]): Record<string, string>;
10
11
  export declare function buildFacetSet(params: {
11
12
  definitionDir: string;
12
- facetsRoot: string;
13
+ facetsRoot?: string;
14
+ facetsRoots?: readonly string[];
13
15
  definition: ComposeDefinition;
14
16
  }): FacetSet;
15
17
  export declare function buildSkillSections(params: {
16
18
  definition: ComposeDefinition;
17
19
  definitionDir: string;
18
- facetsRoot: string;
20
+ facetsRoot?: string;
21
+ facetsRoots?: readonly string[];
19
22
  }): Omit<SkillDocumentInput, 'mode'>;
20
23
  export declare function renderSkillFrontmatter(definition: ComposeDefinition): string;
21
24
  export declare function hasYamlFrontmatter(content: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"skill-renderer.d.ts","sourceRoot":"","sources":["../../src/cli/skill-renderer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAEV,0BAA0B,EAC1B,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAS1B,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK7D;AAqBD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,UAAU,EAAE,iBAAiB,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,0BAA0B,CAqE7B;AAED,wBAAgB,0BAA0B,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqB1F;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,iBAAiB,CAAC;CAC/B,GAAG,QAAQ,CAaX;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAWnC;AAWD,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,iBAAiB,GAAG,MAAM,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3D;AAMD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAgDrE;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAM/F"}
1
+ {"version":3,"file":"skill-renderer.d.ts","sourceRoot":"","sources":["../../src/cli/skill-renderer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAEV,0BAA0B,EAC1B,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAS1B,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK7D;AA6CD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,UAAU,EAAE,iBAAiB,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC,GAAG,0BAA0B,CA2D7B;AAED,wBAAgB,0BAA0B,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6B/G;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,UAAU,EAAE,iBAAiB,CAAC;CAC/B,GAAG,QAAQ,CAaX;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC,GAAG,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAWnC;AAWD,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,iBAAiB,GAAG,MAAM,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3D;AAMD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAmDrE;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAM/F"}
@@ -15,24 +15,44 @@ export function ensureSafeDefinitionName(name) {
15
15
  return name;
16
16
  }
17
17
  function resolveFacetRefContent(options) {
18
- const { ref, label, baseDir, facetDir, allowedRoots } = options;
18
+ const { ref, label, baseDir, facetDirs, allowedRoots } = options;
19
+ const primaryFacetDir = facetDirs[0];
20
+ if (!primaryFacetDir) {
21
+ throw new Error(`Missing ${label}: facet directory is required`);
22
+ }
19
23
  if (isResourcePath(ref)) {
20
24
  const resourcePath = resolveResourcePath(ref, baseDir);
21
25
  const boundedPath = ensurePathWithinRoots(resourcePath, allowedRoots, label);
22
26
  return { path: boundedPath, body: requireFile(boundedPath, label) };
23
27
  }
24
- const facetPath = join(facetDir, `${ref}.md`);
25
- const boundedPath = ensurePathWithinRoots(facetPath, allowedRoots, label);
26
- return { path: boundedPath, body: requireFile(boundedPath, label) };
28
+ for (const facetDir of facetDirs) {
29
+ const facetPath = join(facetDir, `${ref}.md`);
30
+ if (!existsSync(facetPath)) {
31
+ continue;
32
+ }
33
+ const boundedPath = ensurePathWithinRoots(facetPath, allowedRoots, label);
34
+ return { path: boundedPath, body: requireFile(boundedPath, label) };
35
+ }
36
+ throw new Error(`Missing ${label}: ${join(primaryFacetDir, `${ref}.md`)}`);
37
+ }
38
+ function resolveFacetsRoots(params) {
39
+ if (params.facetsRoots && params.facetsRoots.length > 0) {
40
+ return params.facetsRoots;
41
+ }
42
+ if (params.facetsRoot) {
43
+ return [params.facetsRoot];
44
+ }
45
+ throw new Error('Facet roots are required');
27
46
  }
28
47
  export function resolveDefinitionSections(params) {
29
- const { definition, definitionDir, facetsRoot } = params;
30
- const allowedRoots = [facetsRoot];
48
+ const { definition, definitionDir } = params;
49
+ const facetsRoots = resolveFacetsRoots(params);
50
+ const allowedRoots = facetsRoots;
31
51
  const personaContent = resolveFacetRefContent({
32
52
  ref: definition.persona,
33
53
  label: `persona facet "${definition.persona}"`,
34
54
  baseDir: definitionDir,
35
- facetDir: join(facetsRoot, 'persona'),
55
+ facetDirs: facetsRoots.map(facetsRoot => join(facetsRoot, 'persona')),
36
56
  allowedRoots,
37
57
  });
38
58
  const policies = definition.policies?.map(ref => {
@@ -40,7 +60,7 @@ export function resolveDefinitionSections(params) {
40
60
  ref,
41
61
  label: `policy facet "${ref}"`,
42
62
  baseDir: definitionDir,
43
- facetDir: join(facetsRoot, 'policies'),
63
+ facetDirs: facetsRoots.map(facetsRoot => join(facetsRoot, 'policies')),
44
64
  allowedRoots,
45
65
  });
46
66
  return { ref, body: resolved.body, path: resolved.path };
@@ -50,34 +70,21 @@ export function resolveDefinitionSections(params) {
50
70
  ref,
51
71
  label: `knowledge facet "${ref}"`,
52
72
  baseDir: definitionDir,
53
- facetDir: join(facetsRoot, 'knowledge'),
73
+ facetDirs: facetsRoots.map(facetsRoot => join(facetsRoot, 'knowledge')),
74
+ allowedRoots,
75
+ });
76
+ return { ref, body: resolved.body, path: resolved.path };
77
+ }) ?? [];
78
+ const instructions = definition.instructions?.map(ref => {
79
+ const resolved = resolveFacetRefContent({
80
+ ref,
81
+ label: `instruction facet "${ref}"`,
82
+ baseDir: definitionDir,
83
+ facetDirs: facetsRoots.map(facetsRoot => join(facetsRoot, 'instructions')),
54
84
  allowedRoots,
55
85
  });
56
86
  return { ref, body: resolved.body, path: resolved.path };
57
87
  }) ?? [];
58
- let instruction;
59
- if (definition.instruction) {
60
- if (isResourcePath(definition.instruction)) {
61
- const resolved = resolveFacetRefContent({
62
- ref: definition.instruction,
63
- label: 'instruction file',
64
- baseDir: definitionDir,
65
- facetDir: facetsRoot,
66
- allowedRoots,
67
- });
68
- instruction = {
69
- ref: definition.instruction,
70
- body: resolved.body,
71
- path: resolved.path,
72
- };
73
- }
74
- else {
75
- instruction = {
76
- ref: 'literal',
77
- body: definition.instruction,
78
- };
79
- }
80
- }
81
88
  return {
82
89
  persona: {
83
90
  ref: definition.persona,
@@ -86,21 +93,28 @@ export function resolveDefinitionSections(params) {
86
93
  },
87
94
  policies,
88
95
  knowledge,
89
- instruction,
96
+ instructions,
90
97
  };
91
98
  }
92
- export function listCompositionDefinitions(compositionsDir) {
93
- if (!existsSync(compositionsDir)) {
94
- throw new Error(`Compose definition directory does not exist: ${compositionsDir}`);
95
- }
96
- const entries = readdirSync(compositionsDir, { withFileTypes: true })
97
- .filter(entry => !entry.isDirectory() && (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml')))
98
- .map(entry => entry.name);
99
+ export function listCompositionDefinitions(compositionsDirs) {
100
+ const dirs = Array.isArray(compositionsDirs) ? compositionsDirs : [compositionsDirs];
99
101
  const definitions = {};
100
- for (const entry of entries) {
101
- const name = entry.replace(/\.(yaml|yml)$/u, '');
102
- const definitionPath = join(compositionsDir, entry);
103
- definitions[name] = ensurePathWithinRoots(definitionPath, [compositionsDir], `compose definition "${entry}"`);
102
+ for (const compositionsDir of dirs) {
103
+ if (!existsSync(compositionsDir)) {
104
+ continue;
105
+ }
106
+ const entries = readdirSync(compositionsDir, { withFileTypes: true })
107
+ .filter(entry => !entry.isDirectory() && (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml')))
108
+ .map(entry => entry.name)
109
+ .sort();
110
+ for (const entry of entries) {
111
+ const name = entry.replace(/\.(yaml|yml)$/u, '');
112
+ if (name in definitions) {
113
+ continue;
114
+ }
115
+ const definitionPath = join(compositionsDir, entry);
116
+ definitions[name] = ensurePathWithinRoots(definitionPath, [compositionsDir], `compose definition "${entry}"`);
117
+ }
104
118
  }
105
119
  return definitions;
106
120
  }
@@ -110,11 +124,9 @@ export function buildFacetSet(params) {
110
124
  persona: { body: resolved.persona.body, sourcePath: resolved.persona.path },
111
125
  policies: resolved.policies.map(policy => ({ body: policy.body, sourcePath: policy.path })),
112
126
  knowledge: resolved.knowledge.map(item => ({ body: item.body, sourcePath: item.path })),
113
- instruction: resolved.instruction
114
- ? ('path' in resolved.instruction
115
- ? { body: resolved.instruction.body, sourcePath: resolved.instruction.path }
116
- : { body: resolved.instruction.body })
117
- : undefined,
127
+ instructions: resolved.instructions.map(instruction => 'path' in instruction
128
+ ? { body: instruction.body, sourcePath: instruction.path }
129
+ : { body: instruction.body }),
118
130
  };
119
131
  }
120
132
  export function buildSkillSections(params) {
@@ -125,7 +137,7 @@ export function buildSkillSections(params) {
125
137
  persona: resolved.persona,
126
138
  policies: resolved.policies,
127
139
  knowledge: resolved.knowledge,
128
- instruction: resolved.instruction,
140
+ instructions: resolved.instructions,
129
141
  };
130
142
  }
131
143
  function makeSkillHeader(definition) {
@@ -175,16 +187,20 @@ export function renderSkillDocument(input) {
175
187
  lines.push('');
176
188
  }
177
189
  }
178
- if (input.instruction) {
179
- lines.push('## Instruction');
190
+ if (input.instructions.length > 0) {
191
+ lines.push('## Instructions');
180
192
  lines.push('');
181
- if (input.mode === 'reference' && hasInstructionPath(input.instruction)) {
182
- lines.push(input.instruction.path);
183
- }
184
- else {
185
- lines.push(input.instruction.body);
193
+ for (const instruction of input.instructions) {
194
+ if (input.mode === 'reference' && hasInstructionPath(instruction)) {
195
+ lines.push(`### ${instruction.ref}`);
196
+ lines.push('');
197
+ lines.push(instruction.path);
198
+ }
199
+ else {
200
+ lines.push(instruction.body);
201
+ }
202
+ lines.push('');
186
203
  }
187
- lines.push('');
188
204
  }
189
205
  return `${lines.join('\n').trimEnd()}\n`;
190
206
  }