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.
- package/README.md +45 -12
- package/dist/cli/compose-command.d.ts.map +1 -1
- package/dist/cli/compose-command.js +1 -0
- package/dist/cli/compose-command.js.map +1 -1
- package/dist/cli/compose-execution.d.ts +1 -0
- package/dist/cli/compose-execution.d.ts.map +1 -1
- package/dist/cli/compose-execution.js +2 -0
- package/dist/cli/compose-execution.js.map +1 -1
- package/dist/cli/facet-includes.d.ts +11 -0
- package/dist/cli/facet-includes.d.ts.map +1 -0
- package/dist/cli/facet-includes.js +136 -0
- package/dist/cli/facet-includes.js.map +1 -0
- package/dist/cli/install-skill/facet-partial-copy.d.ts +13 -0
- package/dist/cli/install-skill/facet-partial-copy.d.ts.map +1 -0
- package/dist/cli/install-skill/facet-partial-copy.js +66 -0
- package/dist/cli/install-skill/facet-partial-copy.js.map +1 -0
- package/dist/cli/install-skill/facet-token-renderer.d.ts +1 -1
- package/dist/cli/install-skill/facet-token-renderer.d.ts.map +1 -1
- package/dist/cli/install-skill/facet-token-renderer.js +2 -2
- package/dist/cli/install-skill/facet-token-renderer.js.map +1 -1
- package/dist/cli/install-skill/facets.d.ts +3 -0
- package/dist/cli/install-skill/facets.d.ts.map +1 -1
- package/dist/cli/install-skill/facets.js +36 -3
- package/dist/cli/install-skill/facets.js.map +1 -1
- package/dist/cli/install-skill/modes.d.ts.map +1 -1
- package/dist/cli/install-skill/modes.js +2 -1
- package/dist/cli/install-skill/modes.js.map +1 -1
- package/dist/cli/skill-commands.d.ts.map +1 -1
- package/dist/cli/skill-commands.js +1 -0
- package/dist/cli/skill-commands.js.map +1 -1
- package/dist/cli/skill-document-renderer.d.ts +6 -0
- package/dist/cli/skill-document-renderer.d.ts.map +1 -0
- package/dist/cli/skill-document-renderer.js +73 -0
- package/dist/cli/skill-document-renderer.js.map +1 -0
- package/dist/cli/skill-renderer.d.ts +5 -3
- package/dist/cli/skill-renderer.d.ts.map +1 -1
- package/dist/cli/skill-renderer.js +137 -79
- package/dist/cli/skill-renderer.js.map +1 -1
- package/dist/cli/skill-types.d.ts +7 -1
- package/dist/cli/skill-types.d.ts.map +1 -1
- package/dist/compose-definition.d.ts.map +1 -1
- package/dist/compose-definition.js +4 -1
- package/dist/compose-definition.js.map +1 -1
- package/dist/compose.d.ts +3 -2
- package/dist/compose.d.ts.map +1 -1
- package/dist/compose.js +30 -33
- package/dist/compose.js.map +1 -1
- package/dist/facet-partial-paths.d.ts +7 -0
- package/dist/facet-partial-paths.d.ts.map +1 -0
- package/dist/facet-partial-paths.js +29 -0
- package/dist/facet-partial-paths.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/init/index.d.ts.map +1 -1
- package/dist/init/index.js +9 -1
- package/dist/init/index.js.map +1 -1
- package/dist/prompt-payload.d.ts +1 -0
- package/dist/prompt-payload.d.ts.map +1 -1
- package/dist/prompt-payload.js +34 -8
- package/dist/prompt-payload.js.map +1 -1
- package/dist/types.d.ts +10 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -2
- package/dist/types.js.map +1 -1
- 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*,
|
|
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
|
|
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
|
|
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
|
-
│
|
|
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
|
-
│
|
|
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`
|
|
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
|
-
│ └──
|
|
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
|
-
│ └──
|
|
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,
|
|
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,
|
|
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":"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"}
|
|
@@ -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;
|
|
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,
|
|
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":"
|
|
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
|
|
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
|
-
|
|
156
|
+
if (params.literalInstructionBodies) {
|
|
129
157
|
for (let i = 0; i < params.literalInstructionBodies.length; i++) {
|
|
130
|
-
const suffix =
|
|
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) {
|