faceted-prompting 0.4.0 → 0.6.0

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 (66) hide show
  1. package/README.md +45 -12
  2. package/dist/cli/compose-command.d.ts.map +1 -1
  3. package/dist/cli/compose-command.js +1 -0
  4. package/dist/cli/compose-command.js.map +1 -1
  5. package/dist/cli/compose-execution.d.ts +1 -0
  6. package/dist/cli/compose-execution.d.ts.map +1 -1
  7. package/dist/cli/compose-execution.js +2 -0
  8. package/dist/cli/compose-execution.js.map +1 -1
  9. package/dist/cli/facet-includes.d.ts +11 -0
  10. package/dist/cli/facet-includes.d.ts.map +1 -0
  11. package/dist/cli/facet-includes.js +136 -0
  12. package/dist/cli/facet-includes.js.map +1 -0
  13. package/dist/cli/install-skill/facet-partial-copy.d.ts +13 -0
  14. package/dist/cli/install-skill/facet-partial-copy.d.ts.map +1 -0
  15. package/dist/cli/install-skill/facet-partial-copy.js +66 -0
  16. package/dist/cli/install-skill/facet-partial-copy.js.map +1 -0
  17. package/dist/cli/install-skill/facet-token-renderer.d.ts +1 -1
  18. package/dist/cli/install-skill/facet-token-renderer.d.ts.map +1 -1
  19. package/dist/cli/install-skill/facet-token-renderer.js +2 -2
  20. package/dist/cli/install-skill/facet-token-renderer.js.map +1 -1
  21. package/dist/cli/install-skill/facets.d.ts +3 -0
  22. package/dist/cli/install-skill/facets.d.ts.map +1 -1
  23. package/dist/cli/install-skill/facets.js +36 -3
  24. package/dist/cli/install-skill/facets.js.map +1 -1
  25. package/dist/cli/install-skill/modes.d.ts.map +1 -1
  26. package/dist/cli/install-skill/modes.js +2 -1
  27. package/dist/cli/install-skill/modes.js.map +1 -1
  28. package/dist/cli/skill-commands.d.ts.map +1 -1
  29. package/dist/cli/skill-commands.js +1 -0
  30. package/dist/cli/skill-commands.js.map +1 -1
  31. package/dist/cli/skill-document-renderer.d.ts +6 -0
  32. package/dist/cli/skill-document-renderer.d.ts.map +1 -0
  33. package/dist/cli/skill-document-renderer.js +73 -0
  34. package/dist/cli/skill-document-renderer.js.map +1 -0
  35. package/dist/cli/skill-renderer.d.ts +5 -3
  36. package/dist/cli/skill-renderer.d.ts.map +1 -1
  37. package/dist/cli/skill-renderer.js +137 -79
  38. package/dist/cli/skill-renderer.js.map +1 -1
  39. package/dist/cli/skill-types.d.ts +7 -1
  40. package/dist/cli/skill-types.d.ts.map +1 -1
  41. package/dist/compose-definition.d.ts.map +1 -1
  42. package/dist/compose-definition.js +4 -1
  43. package/dist/compose-definition.js.map +1 -1
  44. package/dist/compose.d.ts +3 -2
  45. package/dist/compose.d.ts.map +1 -1
  46. package/dist/compose.js +30 -33
  47. package/dist/compose.js.map +1 -1
  48. package/dist/facet-partial-paths.d.ts +7 -0
  49. package/dist/facet-partial-paths.d.ts.map +1 -0
  50. package/dist/facet-partial-paths.js +29 -0
  51. package/dist/facet-partial-paths.js.map +1 -0
  52. package/dist/index.d.ts +1 -1
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js.map +1 -1
  55. package/dist/init/index.d.ts.map +1 -1
  56. package/dist/init/index.js +9 -1
  57. package/dist/init/index.js.map +1 -1
  58. package/dist/prompt-payload.d.ts +1 -0
  59. package/dist/prompt-payload.d.ts.map +1 -1
  60. package/dist/prompt-payload.js +34 -8
  61. package/dist/prompt-payload.js.map +1 -1
  62. package/dist/types.d.ts +10 -4
  63. package/dist/types.d.ts.map +1 -1
  64. package/dist/types.js +7 -2
  65. package/dist/types.js.map +1 -1
  66. package/package.json +3 -3
package/README.md CHANGED
@@ -4,15 +4,15 @@
4
4
 
5
5
  Structured prompt composition for LLMs — decompose prompts into reusable facets and compose them into LLM-ready messages.
6
6
 
7
- faceted-prompting separates prompt concerns into distinct facets (persona, policy, knowledge, instruction), each with a defined role and message placement. This keeps prompts modular, testable, and maintainable as they grow in complexity.
7
+ faceted-prompting separates prompt concerns into distinct facets (persona, policy, knowledge, instruction, output contracts), each with a defined role and message placement. This keeps prompts modular, testable, and maintainable as they grow in complexity.
8
8
 
9
9
  ## Why Faceted Prompting
10
10
 
11
- **Separation of concerns** — Each facet has a single responsibility. Persona defines *who* the agent is, policies define *how* it should behave, knowledge provides *what it needs to know*, and instructions define *what to do*. Changes to one facet don't affect others.
11
+ **Separation of concerns** — Each facet has a single responsibility. Persona defines *who* the agent is, policies define *how* it should behave, knowledge provides *what it needs to know*, instructions define *what to do*, and output contracts define *how to answer*. Changes to one facet don't affect others.
12
12
 
13
- **Deterministic placement** — Persona always goes to the system prompt. Policies, knowledge, and instructions always go to the user message. This placement rule is enforced by the library, not left to convention.
13
+ **Deterministic placement** — Persona always goes to the system prompt. Policies, knowledge, instructions, and output contracts always go to the user message. This placement rule is enforced by the library, not left to convention.
14
14
 
15
- **Composable** — Facets are plain Markdown files. Mix and match personas, policies, and knowledge across different workflows. Share them as repertoire packages via `@owner/repo/facet-name` scope references.
15
+ **Composable** — Facets are plain Markdown files. Mix and match personas, policies, knowledge, instructions, and output contracts across different workflows. Share them as repertoire packages via `@owner/repo/facet-name` scope references.
16
16
 
17
17
  **Framework-independent** — Zero dependencies on any specific AI framework. Use it with Claude, OpenAI, or any LLM provider.
18
18
 
@@ -24,6 +24,7 @@ faceted-prompting separates prompt concerns into distinct facets (persona, polic
24
24
  | **Policy** | User message | HOW — rules, standards, constraints |
25
25
  | **Knowledge** | User message | WHAT TO KNOW — domain context, architecture |
26
26
  | **Instruction** | User message | WHAT TO DO — the specific task |
27
+ | **Output contracts** | User message | HOW TO ANSWER — output/report format |
27
28
 
28
29
  ## Install
29
30
 
@@ -52,12 +53,13 @@ const result = compose(
52
53
  policies: [{ body: 'Follow clean code principles. No any types.' }],
53
54
  knowledge: [{ body: 'The project uses Vitest for testing.' }],
54
55
  instructions: [{ body: 'Implement a retry function with exponential backoff.' }],
56
+ outputContracts: [{ body: 'Return a concise implementation report with test results.' }],
55
57
  },
56
58
  { contextMaxChars: 8000 },
57
59
  );
58
60
 
59
61
  // result.systemPrompt → "You are a senior TypeScript developer."
60
- // result.userMessage → knowledge + instructions + policies (in order)
62
+ // result.userMessage → knowledge + instructions + output contracts + policies (in order)
61
63
  ```
62
64
 
63
65
  ### As a CLI
@@ -89,7 +91,13 @@ facet install skill
89
91
  │ ├── knowledge/
90
92
  │ ├── policies/
91
93
  │ ├── instructions/
92
- └── compositions/
94
+ ├── partials/
95
+ │ │ ├── instructions/
96
+ │ │ ├── policies/
97
+ │ │ ├── knowledge/
98
+ │ │ └── output-contracts/
99
+ │ └── output-contracts/
100
+ ├── compositions/
93
101
  └── templates/
94
102
 
95
103
  ~/.faceted/ # Global (fallback)
@@ -99,7 +107,13 @@ facet install skill
99
107
  │ ├── knowledge/ # Domain knowledge files
100
108
  │ ├── policies/ # Policy/rules files
101
109
  │ ├── instructions/ # Instruction files
102
- └── compositions/ # Compose definition YAML files
110
+ ├── partials/
111
+ │ │ ├── instructions/ # Reusable Markdown partials by facet kind
112
+ │ │ ├── policies/
113
+ │ │ ├── knowledge/
114
+ │ │ └── output-contracts/
115
+ │ └── output-contracts/ # Output/report format files
116
+ ├── compositions/ # Compose definition YAML files
103
117
  └── templates/ # Skill templates
104
118
  ```
105
119
 
@@ -129,15 +143,32 @@ policies:
129
143
  - quality
130
144
  instructions:
131
145
  - release-summary
146
+ output-contracts:
147
+ - concise-report
132
148
  order:
133
149
  - knowledge
134
150
  - instructions
151
+ - output-contracts
135
152
  - policies
136
153
  ```
137
154
 
138
155
  - `name` and `persona` are required.
139
- - `order` controls user-message section order (default: `knowledge` `instructions` `policies`).
140
- - `instructions` is a list of facet names, file paths, or inline text.
156
+ - `order` controls user-message section order (default: `knowledge` -> `instructions` -> `output-contracts` -> `policies`).
157
+ - `instructions` is a list of instruction facet names, Markdown file paths, scope references, or inline Markdown text.
158
+ - `output-contracts` is a list of facet names, file paths, or scope references and is exposed as `outputContracts` in the TypeScript API.
159
+ - Relative file paths are resolved from the compose definition directory. Real paths must stay inside that directory or the configured facets roots; symlinks and paths outside those roots fail.
160
+
161
+ File-backed instruction, policy, knowledge, and output-contract facet files can include shared Markdown partials:
162
+
163
+ ```md
164
+ Review the change for mergeable quality.
165
+
166
+ {{include:instructions/review-common}}
167
+ ```
168
+
169
+ The include above resolves to `facets/partials/instructions/review-common.md` and expands at the include site before prompt composition. Supported include kinds are `instructions`, `policies`, `knowledge`, and `output-contracts`. The syntax is `{{include:<kind>/<name>}}` for local/global partials and `{{include:<kind>/@owner/repo/<name>}}` for repertoire partials under `repertoire/@owner/repo/facets/partials/<kind>/<name>.md`; shortened forms such as `{{include:review-common}}` are invalid.
170
+
171
+ Facet partials use the same local-first layering as facets: `.faceted/facets/partials/<kind>/` is checked before `~/.faceted/facets/partials/<kind>/`. Missing includes, empty include names, shortened syntax, cyclic include chains, paths that escape the allowed roots, and partial paths that resolve to directories or other non-file targets fail with explicit errors. Include tokens inside inline instruction text are not expanded. `composePromptPayload().copyFiles.facetPartials` is present only when included partial paths exist; `copyFiles.instructionPartials` is retained for compatibility with existing instruction partial consumers.
141
172
 
142
173
  ## Scope References
143
174
 
@@ -149,7 +180,7 @@ knowledge:
149
180
  - "@nrslib/takt-fullstack/architecture"
150
181
  ```
151
182
 
152
- Scope references resolve to `~/.faceted/repertoire/@{owner}/{repo}/facets/{kind}/{name}.md`.
183
+ Scope references require repertoire roots and resolve to `~/.faceted/repertoire/@{owner}/{repo}/facets/{kind}/{name}.md`.
153
184
 
154
185
  ## API
155
186
 
@@ -205,7 +236,8 @@ See the [API Reference](./docs/api-reference.md) for the full API surface.
205
236
  │ ├── knowledge/
206
237
  │ ├── policies/
207
238
  │ ├── instructions/
208
- │ └── compositions/
239
+ │ └── output-contracts/
240
+ ├── compositions/
209
241
  └── templates/
210
242
 
211
243
  ~/.faceted/ # Global (fallback, created by `facet init global`)
@@ -215,7 +247,8 @@ See the [API Reference](./docs/api-reference.md) for the full API surface.
215
247
  │ ├── knowledge/
216
248
  │ ├── policies/
217
249
  │ ├── instructions/
218
- │ └── compositions/
250
+ │ └── output-contracts/
251
+ ├── compositions/
219
252
  ├── templates/ # Skill install templates
220
253
  └── repertoire/ # Installed repertoire packages
221
254
  ```
@@ -1 +1 @@
1
- {"version":3,"file":"compose-command.d.ts","sourceRoot":"","sources":["../../src/cli/compose-command.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAErF,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,eAAe,EACxB,cAAc,EAAE,iBAAiB,GAChC,OAAO,CAAC,cAAc,CAAC,CAwBzB"}
1
+ {"version":3,"file":"compose-command.d.ts","sourceRoot":"","sources":["../../src/cli/compose-command.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAErF,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,eAAe,EACxB,cAAc,EAAE,iBAAiB,GAChC,OAAO,CAAC,cAAc,CAAC,CAyBzB"}
@@ -17,6 +17,7 @@ export async function runComposeCommand(options, composeOptions) {
17
17
  }
18
18
  return runStandardCompose({
19
19
  options,
20
+ facetedRoots: resolved.facetedRoots,
20
21
  facetsRoots: resolved.facetsRoots,
21
22
  definitionPath: resolved.definitionPath,
22
23
  definition: resolved.definition,
@@ -1 +1 @@
1
- {"version":3,"file":"compose-command.js","sourceRoot":"","sources":["../../src/cli/compose-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGtF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAwB,EACxB,cAAiC;IAEjC,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC;QAC9C,OAAO;QACP,cAAc;KACf,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QACjC,OAAO,wBAAwB,CAAC;YAC9B,OAAO;YACP,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,cAAc;SACf,CAAC,CAAC;IACL,CAAC;IAED,OAAO,kBAAkB,CAAC;QACxB,OAAO;QACP,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,cAAc;KACf,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"compose-command.js","sourceRoot":"","sources":["../../src/cli/compose-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGtF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAwB,EACxB,cAAiC;IAEjC,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC;QAC9C,OAAO;QACP,cAAc;KACf,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QACjC,OAAO,wBAAwB,CAAC;YAC9B,OAAO;YACP,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,cAAc;SACf,CAAC,CAAC;IACL,CAAC;IAED,OAAO,kBAAkB,CAAC;QACxB,OAAO;QACP,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,cAAc;KACf,CAAC,CAAC;AACL,CAAC"}
@@ -10,6 +10,7 @@ export declare function runTemplateBackedCompose(params: {
10
10
  }): Promise<FacetCliResult>;
11
11
  export declare function runStandardCompose(params: {
12
12
  options: FacetCliOptions;
13
+ facetedRoots: readonly string[];
13
14
  facetsRoots: readonly string[];
14
15
  definitionPath: string;
15
16
  definition: ComposeDefinition;
@@ -1 +1 @@
1
- {"version":3,"file":"compose-execution.d.ts","sourceRoot":"","sources":["../../src/cli/compose-execution.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAOrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAuFrF,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,OAAO,EAAE,eAAe,CAAC;IACzB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,cAAc,EAAE,iBAAiB,CAAC;CACnC,GAAG,OAAO,CAAC,cAAc,CAAC,CAkD1B;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,OAAO,EAAE,eAAe,CAAC;IACzB,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,cAAc,EAAE,iBAAiB,CAAC;CACnC,GAAG,OAAO,CAAC,cAAc,CAAC,CAsE1B"}
1
+ {"version":3,"file":"compose-execution.d.ts","sourceRoot":"","sources":["../../src/cli/compose-execution.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAOrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAuFrF,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,OAAO,EAAE,eAAe,CAAC;IACzB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,cAAc,EAAE,iBAAiB,CAAC;CACnC,GAAG,OAAO,CAAC,cAAc,CAAC,CAmD1B;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,OAAO,EAAE,eAAe,CAAC;IACzB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,cAAc,EAAE,iBAAiB,CAAC;CACnC,GAAG,OAAO,CAAC,cAAc,CAAC,CAuE1B"}
@@ -89,6 +89,7 @@ export async function runTemplateBackedCompose(params) {
89
89
  const sections = buildSkillSections({
90
90
  definition: params.definition,
91
91
  definitionDir: dirname(params.definitionPath),
92
+ facetedRoots: params.facetedRoots,
92
93
  facetsRoots: params.facetsRoots,
93
94
  });
94
95
  applyFacetTokensToFiles({
@@ -105,6 +106,7 @@ export async function runStandardCompose(params) {
105
106
  const safeName = ensureSafeDefinitionName(params.definition.name);
106
107
  const facetSet = buildFacetSet({
107
108
  definitionDir: dirname(params.definitionPath),
109
+ facetedRoots: params.facetedRoots,
108
110
  facetsRoots: params.facetsRoots,
109
111
  definition: params.definition,
110
112
  });
@@ -1 +1 @@
1
- {"version":3,"file":"compose-execution.js","sourceRoot":"","sources":["../../src/cli/compose-execution.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compose-execution.js","sourceRoot":"","sources":["../../src/cli/compose-execution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface ExpandedFacetIncludes {
2
+ readonly body: string;
3
+ readonly sourcePaths: readonly string[];
4
+ }
5
+ export declare function expandFacetIncludes(params: {
6
+ body: string;
7
+ facetsRoots: readonly string[];
8
+ repertoireDirs: readonly string[];
9
+ allowedRoots: readonly string[];
10
+ }): ExpandedFacetIncludes;
11
+ //# sourceMappingURL=facet-includes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facet-includes.d.ts","sourceRoot":"","sources":["../../src/cli/facet-includes.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAuKD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC,GAAG,qBAAqB,CAQxB"}
@@ -0,0 +1,136 @@
1
+ import { existsSync, readFileSync, statSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { isScopeRef, parseScopeRef, resolveScopeRef } from '../scope.js';
4
+ import { ensurePathWithinRoots } from './path-guard.js';
5
+ import { facetPartialsDir, facetPartialsFacetDir, isFacetPartialKind, } from '../facet-partial-paths.js';
6
+ const INCLUDE_TOKEN_PATTERN = /\{\{\s*include\s*:\s*([^}]*)\}\}/gu;
7
+ const LOCAL_INCLUDE_NAME_PATTERN = /^[A-Za-z0-9._-]+$/u;
8
+ function readFacetPartial(params) {
9
+ const boundedPath = ensurePathWithinRoots(params.path, params.allowedRoots, `facet include "${params.ref}"`);
10
+ if (!statSync(boundedPath).isFile()) {
11
+ throw new Error(`Facet include "${params.ref}" must resolve to a file: ${boundedPath}`);
12
+ }
13
+ return {
14
+ ref: params.ref,
15
+ body: readFileSync(boundedPath, 'utf-8'),
16
+ path: boundedPath,
17
+ };
18
+ }
19
+ function parseFacetIncludeRef(rawRef) {
20
+ const ref = rawRef.trim();
21
+ if (ref.length === 0) {
22
+ throw new Error('Invalid facet include: missing include name');
23
+ }
24
+ const separatorIndex = ref.indexOf('/');
25
+ if (separatorIndex < 0) {
26
+ throw new Error(`Invalid facet include "${ref}": expected {{include:<kind>/<name>}}`);
27
+ }
28
+ const kind = ref.slice(0, separatorIndex);
29
+ const name = ref.slice(separatorIndex + 1);
30
+ if (!isFacetPartialKind(kind) || name.length === 0) {
31
+ throw new Error(`Invalid facet include "${ref}": expected {{include:<kind>/<name>}}`);
32
+ }
33
+ if (isScopeRef(name) || LOCAL_INCLUDE_NAME_PATTERN.test(name)) {
34
+ return { kind, ref, name };
35
+ }
36
+ throw new Error(`Invalid facet include "${ref}": expected {{include:<kind>/<name>}}`);
37
+ }
38
+ function resolveScopedFacetPartial(params) {
39
+ const parsed = parseScopeRef(params.scopeRef);
40
+ const candidatePaths = params.repertoireDirs.map(repertoireDir => resolveScopeRef(parsed, facetPartialsFacetDir(params.kind), repertoireDir));
41
+ const candidatePath = candidatePaths.find(path => existsSync(path));
42
+ if (!candidatePath) {
43
+ throw new Error(`Missing facet include "${params.ref}": ${candidatePaths.join(', ')}`);
44
+ }
45
+ return readFacetPartial({
46
+ path: candidatePath,
47
+ ref: params.ref,
48
+ allowedRoots: params.allowedRoots,
49
+ });
50
+ }
51
+ function resolveFacetPartial(params) {
52
+ if (isScopeRef(params.name)) {
53
+ return resolveScopedFacetPartial({
54
+ ref: params.ref,
55
+ scopeRef: params.name,
56
+ kind: params.kind,
57
+ repertoireDirs: params.repertoireDirs,
58
+ allowedRoots: params.allowedRoots,
59
+ });
60
+ }
61
+ const candidatePaths = params.facetsRoots.map(facetsRoot => join(facetPartialsDir(facetsRoot, params.kind), `${params.name}.md`));
62
+ for (const candidatePath of candidatePaths) {
63
+ if (!existsSync(candidatePath)) {
64
+ continue;
65
+ }
66
+ return readFacetPartial({
67
+ path: candidatePath,
68
+ ref: params.ref,
69
+ allowedRoots: params.allowedRoots,
70
+ });
71
+ }
72
+ throw new Error(`Missing facet include "${params.ref}": ${candidatePaths.join(', ')}`);
73
+ }
74
+ function collectIncludeTokens(body) {
75
+ return Array.from(body.matchAll(INCLUDE_TOKEN_PATTERN), match => {
76
+ const token = match[0];
77
+ const rawRef = match[1];
78
+ const index = match.index;
79
+ if (rawRef === undefined || index === undefined) {
80
+ throw new Error(`Invalid facet include token: ${token}`);
81
+ }
82
+ return { token, rawRef, index };
83
+ });
84
+ }
85
+ function requireNonCyclicInclude(partial, stack) {
86
+ const cycleStart = stack.findIndex(frame => frame.path === partial.path);
87
+ if (cycleStart < 0) {
88
+ return;
89
+ }
90
+ const chain = stack
91
+ .slice(cycleStart)
92
+ .map(frame => frame.ref)
93
+ .concat(partial.ref);
94
+ throw new Error(`Cyclic facet include: ${chain.join(' -> ')}`);
95
+ }
96
+ function expandBody(params) {
97
+ const initial = { body: '', sourcePaths: [], cursor: 0 };
98
+ const expanded = collectIncludeTokens(params.body).reduce((accumulator, includeToken) => {
99
+ const parsed = parseFacetIncludeRef(includeToken.rawRef);
100
+ const partial = resolveFacetPartial({
101
+ ref: parsed.ref,
102
+ name: parsed.name,
103
+ kind: parsed.kind,
104
+ facetsRoots: params.facetsRoots,
105
+ repertoireDirs: params.repertoireDirs,
106
+ allowedRoots: params.allowedRoots,
107
+ });
108
+ requireNonCyclicInclude(partial, params.stack);
109
+ const nested = expandBody({
110
+ body: partial.body,
111
+ facetsRoots: params.facetsRoots,
112
+ repertoireDirs: params.repertoireDirs,
113
+ allowedRoots: params.allowedRoots,
114
+ stack: params.stack.concat({ ref: partial.ref, path: partial.path }),
115
+ });
116
+ return {
117
+ body: `${accumulator.body}${params.body.slice(accumulator.cursor, includeToken.index)}${nested.body}`,
118
+ sourcePaths: [...accumulator.sourcePaths, partial.path, ...nested.sourcePaths],
119
+ cursor: includeToken.index + includeToken.token.length,
120
+ };
121
+ }, initial);
122
+ return {
123
+ body: expanded.body + params.body.slice(expanded.cursor),
124
+ sourcePaths: expanded.sourcePaths,
125
+ };
126
+ }
127
+ export function expandFacetIncludes(params) {
128
+ return expandBody({
129
+ body: params.body,
130
+ facetsRoots: params.facetsRoots,
131
+ repertoireDirs: params.repertoireDirs,
132
+ allowedRoots: params.allowedRoots,
133
+ stack: [],
134
+ });
135
+ }
136
+ //# sourceMappingURL=facet-includes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facet-includes.js","sourceRoot":"","sources":["../../src/cli/facet-includes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,GAEnB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,qBAAqB,GAAG,oCAAoC,CAAC;AACnE,MAAM,0BAA0B,GAAG,oBAAoB,CAAC;AA8BxD,SAAS,gBAAgB,CAAC,MAIzB;IACC,MAAM,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,EAAE,kBAAkB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;IAC7G,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,CAAC,GAAG,6BAA6B,WAAW,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI,EAAE,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC;QACxC,IAAI,EAAE,WAAW;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,uCAAuC,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,uCAAuC,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,uCAAuC,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,yBAAyB,CAAC,MAMlC;IACC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAC/D,eAAe,CAAC,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAC3E,CAAC;IAEF,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,gBAAgB,CAAC;QACtB,IAAI,EAAE,aAAa;QACnB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,MAO5B;IACC,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,yBAAyB,CAAC;YAC/B,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,QAAQ,EAAE,MAAM,CAAC,IAAI;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CACzD,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,KAAK,CAAC,CACrE,CAAC;IACF,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QACD,OAAO,gBAAgB,CAAC;YACtB,IAAI,EAAE,aAAa;YACnB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,KAAK,CAAC,EAAE;QAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAAC,OAA6B,EAAE,KAA8B;IAC5F,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,UAAU,CAAC;SACjB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;SACvB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,UAAU,CAAC,MAMnB;IACC,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAuB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC9E,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,EAAE;QACtF,MAAM,MAAM,GAAG,oBAAoB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,mBAAmB,CAAC;YAClC,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAC;QACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;SACrE,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE,GAAG,WAAW,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE;YACrG,WAAW,EAAE,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;YAC9E,MAAM,EAAE,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM;SACvD,CAAC;IACJ,CAAC,EAAE,OAAO,CAAC,CAAC;IAEZ,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QACxD,WAAW,EAAE,QAAQ,CAAC,WAAW;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAKnC;IACC,OAAO,UAAU,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,KAAK,EAAE,EAAE;KACV,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare function facetPartialTargetPath(params: {
2
+ sourcePath: string;
3
+ targetDir: string;
4
+ }): string;
5
+ export declare function copyFacetPartials(params: {
6
+ targetDir: string;
7
+ facetPartials?: readonly string[];
8
+ instructionPartials?: readonly string[];
9
+ }): {
10
+ facetPartialPaths: readonly string[];
11
+ instructionPartialPaths: readonly string[];
12
+ };
13
+ //# sourceMappingURL=facet-partial-copy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facet-partial-copy.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/facet-partial-copy.ts"],"names":[],"mappings":"AA+CA,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAQT;AAQD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC,GAAG;IACF,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,uBAAuB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C,CAmBA"}
@@ -0,0 +1,66 @@
1
+ import { copyFileSync, mkdirSync } from 'node:fs';
2
+ import { basename, dirname, join } from 'node:path';
3
+ import { facetPartialKindFromPath, facetPartialsFacetDir, isFacetPartialKind, } from '../../facet-partial-paths.js';
4
+ function scopedFacetPartialSegments(sourcePath) {
5
+ const segments = sourcePath.split(/[\\/]+/u);
6
+ const repertoireIndex = segments.lastIndexOf('repertoire');
7
+ if (repertoireIndex < 0) {
8
+ return undefined;
9
+ }
10
+ const owner = segments[repertoireIndex + 1];
11
+ const repo = segments[repertoireIndex + 2];
12
+ const facets = segments[repertoireIndex + 3];
13
+ const partials = segments[repertoireIndex + 4];
14
+ const kind = segments[repertoireIndex + 5];
15
+ const fileName = segments[repertoireIndex + 6];
16
+ const trailing = segments[repertoireIndex + 7];
17
+ if (!owner?.startsWith('@') ||
18
+ !repo ||
19
+ facets !== 'facets' ||
20
+ partials !== 'partials' ||
21
+ !kind ||
22
+ !isFacetPartialKind(kind) ||
23
+ !fileName ||
24
+ trailing) {
25
+ return undefined;
26
+ }
27
+ return [owner, repo, facets, ...facetPartialsFacetDir(kind).split('/'), fileName];
28
+ }
29
+ function requireFacetPartialKind(sourcePath) {
30
+ const kind = facetPartialKindFromPath(sourcePath);
31
+ if (kind) {
32
+ return kind;
33
+ }
34
+ throw new Error(`Facet partial source path must be inside facets/partials/<kind>: ${sourcePath}`);
35
+ }
36
+ export function facetPartialTargetPath(params) {
37
+ const scopedSegments = scopedFacetPartialSegments(params.sourcePath);
38
+ if (scopedSegments) {
39
+ return join(params.targetDir, 'repertoire', ...scopedSegments);
40
+ }
41
+ const kind = requireFacetPartialKind(params.sourcePath);
42
+ return join(params.targetDir, 'facets', facetPartialsFacetDir(kind), basename(params.sourcePath));
43
+ }
44
+ function dedupePaths(paths) {
45
+ return paths.reduce((deduped, path) => deduped.includes(path) ? deduped : [...deduped, path], []);
46
+ }
47
+ export function copyFacetPartials(params) {
48
+ const sourcePaths = dedupePaths([
49
+ ...(params.facetPartials ?? []),
50
+ ...(params.instructionPartials ?? []),
51
+ ]);
52
+ const facetPartialPaths = sourcePaths.map(path => {
53
+ const targetPath = facetPartialTargetPath({
54
+ sourcePath: path,
55
+ targetDir: params.targetDir,
56
+ });
57
+ mkdirSync(dirname(targetPath), { recursive: true });
58
+ copyFileSync(path, targetPath);
59
+ return targetPath;
60
+ });
61
+ return {
62
+ facetPartialPaths,
63
+ instructionPartialPaths: facetPartialPaths.filter(path => facetPartialKindFromPath(path) === 'instructions'),
64
+ };
65
+ }
66
+ //# sourceMappingURL=facet-partial-copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facet-partial-copy.js","sourceRoot":"","sources":["../../../src/cli/install-skill/facet-partial-copy.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- type FacetPlaceholderKey = 'persona' | 'knowledges' | 'policies' | 'instructions';
1
+ type FacetPlaceholderKey = 'persona' | 'knowledges' | 'policies' | 'instructions' | 'outputContracts';
2
2
  export type FacetTokenValues = Record<FacetPlaceholderKey, string>;
3
3
  export declare function hasFacetToken(content: string): boolean;
4
4
  export declare function replaceFacetTokens(content: string, values: FacetTokenValues): string;
@@ -1 +1 @@
1
- {"version":3,"file":"facet-token-renderer.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/facet-token-renderer.ts"],"names":[],"mappings":"AAAA,KAAK,mBAAmB,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,GAAG,cAAc,CAAC;AAElF,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;AAOnE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAkBpF"}
1
+ {"version":3,"file":"facet-token-renderer.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/facet-token-renderer.ts"],"names":[],"mappings":"AAAA,KAAK,mBAAmB,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,GAAG,cAAc,GAAG,iBAAiB,CAAC;AAEtG,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;AAOnE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAkBpF"}
@@ -1,5 +1,5 @@
1
- const FACET_TOKEN_PATTERN = /{{\s*facet:(persona|knowledges|policies|instructions)(?:\s*\|\s*indent:(none))?\s*}}/g;
2
- const FACET_TOKEN_TEST = /{{\s*facet:(persona|knowledges|policies|instructions)(?:\s*\|\s*indent:(none))?\s*}}/;
1
+ const FACET_TOKEN_PATTERN = /{{\s*facet:(persona|knowledges|policies|instructions|outputContracts)(?:\s*\|\s*indent:(none))?\s*}}/g;
2
+ const FACET_TOKEN_TEST = /{{\s*facet:(persona|knowledges|policies|instructions|outputContracts)(?:\s*\|\s*indent:(none))?\s*}}/;
3
3
  export function hasFacetToken(content) {
4
4
  return FACET_TOKEN_TEST.test(content);
5
5
  }
@@ -1 +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
+ {"version":3,"file":"facet-token-renderer.js","sourceRoot":"","sources":["../../../src/cli/install-skill/facet-token-renderer.ts"],"names":[],"mappings":"AAIA,MAAM,mBAAmB,GACvB,uGAAuG,CAAC;AAC1G,MAAM,gBAAgB,GACpB,sGAAsG,CAAC;AAEzG,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"}
@@ -7,6 +7,9 @@ export interface FacetPathMap {
7
7
  readonly knowledges: readonly string[];
8
8
  readonly policies: readonly string[];
9
9
  readonly instructions: readonly string[];
10
+ readonly outputContracts: readonly string[];
11
+ readonly facetPartials: readonly string[];
12
+ readonly instructionPartials: readonly string[];
10
13
  }
11
14
  export declare function buildInlineFacetTokenValues(sections: SkillSections): FacetTokenValues;
12
15
  export declare function buildSectionsWithCopiedPaths(sections: SkillSections, facets: FacetPathMap): SkillSections;
@@ -1 +1 @@
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
+ {"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;AAQhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAClE,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;IACzC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AA8BD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,aAAa,GAAG,gBAAgB,CAQrF;AAyBD,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,GAAG,aAAa,CA4DzG;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,CA8Ef;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,CACrC,MAAM,EAAE;IAAE,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvF,IAAI,CAQN;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMvD"}
@@ -1,8 +1,9 @@
1
1
  import { basename, join } from 'node:path';
2
- import { copyFileSync, mkdirSync, readdirSync, realpathSync, writeFileSync, } from 'node:fs';
2
+ import { copyFileSync, mkdirSync, readdirSync, realpathSync, writeFileSync } from 'node:fs';
3
3
  import { isWithinRoot } from '../path-guard.js';
4
4
  import { readUtf8FileWithoutFollowingSymbolicLinks, resolveBoundedOutputFilePath, writeUtf8FileWithoutFollowingSymbolicLinks, } from './facet-token-file-ops.js';
5
5
  import { hasFacetToken, replaceFacetTokens } from './facet-token-renderer.js';
6
+ import { copyFacetPartials } from './facet-partial-copy.js';
6
7
  function requireFacetPathCount(params) {
7
8
  if (params.expected !== params.actual) {
8
9
  throw new Error(`Copied ${params.label} facet count mismatch: expected ${params.expected}, received ${params.actual}`);
@@ -24,6 +25,7 @@ export function buildInlineFacetTokenValues(sections) {
24
25
  knowledges: sections.knowledge.map(knowledge => knowledge.body).join('\n'),
25
26
  policies: sections.policies.map(policy => policy.body).join('\n'),
26
27
  instructions: sections.instructions.map(instruction => instruction.body).join('\n'),
28
+ outputContracts: sections.outputContracts.map(outputContract => outputContract.body).join('\n'),
27
29
  };
28
30
  }
29
31
  function applyFacetTokensToSingleFile(params) {
@@ -53,6 +55,11 @@ export function buildSectionsWithCopiedPaths(sections, facets) {
53
55
  expected: sections.policies.length,
54
56
  actual: facets.policies.length,
55
57
  });
58
+ requireFacetPathCount({
59
+ label: 'output-contracts',
60
+ expected: sections.outputContracts.length,
61
+ actual: facets.outputContracts.length,
62
+ });
56
63
  return {
57
64
  ...sections,
58
65
  persona: {
@@ -82,10 +89,19 @@ export function buildSectionsWithCopiedPaths(sections, facets) {
82
89
  ref: basename(instructionPath, '.md'),
83
90
  body: instruction.body,
84
91
  path: instructionPath,
92
+ sourcePaths: [instructionPath],
85
93
  };
86
94
  }
87
95
  return instruction;
88
96
  }),
97
+ outputContracts: sections.outputContracts.map((outputContract, index) => ({
98
+ ...outputContract,
99
+ path: requireFacetPathAtIndex({
100
+ label: 'output-contracts',
101
+ paths: facets.outputContracts,
102
+ index,
103
+ }),
104
+ })),
89
105
  };
90
106
  }
91
107
  export function copyFacetFiles(params) {
@@ -94,9 +110,11 @@ export function copyFacetFiles(params) {
94
110
  const knowledgeDir = join(facetsDir, 'knowledge');
95
111
  const policiesDir = join(facetsDir, 'policies');
96
112
  const instructionsDir = join(facetsDir, 'instructions');
113
+ const outputContractsDir = join(facetsDir, 'output-contracts');
97
114
  mkdirSync(personaDir, { recursive: true });
98
115
  mkdirSync(knowledgeDir, { recursive: true });
99
116
  mkdirSync(policiesDir, { recursive: true });
117
+ mkdirSync(outputContractsDir, { recursive: true });
100
118
  const sourcePersonaPath = params.copyFiles.persona[0];
101
119
  if (!sourcePersonaPath) {
102
120
  throw new Error('Missing persona copy file path');
@@ -113,6 +131,16 @@ export function copyFacetFiles(params) {
113
131
  copyFileSync(path, targetPath);
114
132
  return targetPath;
115
133
  });
134
+ const { facetPartialPaths, instructionPartialPaths } = copyFacetPartials({
135
+ targetDir: params.targetDir,
136
+ facetPartials: params.copyFiles.facetPartials,
137
+ instructionPartials: params.copyFiles.instructionPartials,
138
+ });
139
+ const outputContractPaths = params.copyFiles.outputContracts.map(path => {
140
+ const targetPath = join(outputContractsDir, basename(path));
141
+ copyFileSync(path, targetPath);
142
+ return targetPath;
143
+ });
116
144
  const instructionPaths = [];
117
145
  const hasSourceInstructions = params.copyFiles.instructions.length > 0;
118
146
  const hasLiteralInstructions = params.literalInstructionBodies && params.literalInstructionBodies.length > 0;
@@ -125,9 +153,11 @@ export function copyFacetFiles(params) {
125
153
  instructionPaths.push(targetPath);
126
154
  }
127
155
  }
128
- else if (params.literalInstructionBodies) {
156
+ if (params.literalInstructionBodies) {
129
157
  for (let i = 0; i < params.literalInstructionBodies.length; i++) {
130
- const suffix = params.literalInstructionBodies.length === 1 ? '' : `-${i + 1}`;
158
+ const suffix = hasSourceInstructions
159
+ ? `-inline-${i + 1}`
160
+ : params.literalInstructionBodies.length === 1 ? '' : `-${i + 1}`;
131
161
  const targetPath = join(instructionsDir, `${params.safeSkillName}${suffix}.md`);
132
162
  writeFileSync(targetPath, normalizeInstructionBody(params.literalInstructionBodies[i] ?? ''), 'utf-8');
133
163
  instructionPaths.push(targetPath);
@@ -139,6 +169,9 @@ export function copyFacetFiles(params) {
139
169
  knowledges: knowledgePaths,
140
170
  policies: policyPaths,
141
171
  instructions: instructionPaths,
172
+ outputContracts: outputContractPaths,
173
+ facetPartials: facetPartialPaths,
174
+ instructionPartials: instructionPartialPaths,
142
175
  };
143
176
  }
144
177
  export function applyFacetTokensToPath(params) {