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.
- package/README.md +40 -11
- package/dist/cli/compose-command.d.ts +3 -0
- package/dist/cli/compose-command.d.ts.map +1 -0
- package/dist/cli/compose-command.js +156 -0
- package/dist/cli/compose-command.js.map +1 -0
- package/dist/cli/compose-context.js +3 -3
- package/dist/cli/compose-context.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +21 -89
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/install-skill/facet-token-file-ops.d.ts +7 -0
- package/dist/cli/install-skill/facet-token-file-ops.d.ts.map +1 -0
- package/dist/cli/install-skill/facet-token-file-ops.js +69 -0
- package/dist/cli/install-skill/facet-token-file-ops.js.map +1 -0
- package/dist/cli/install-skill/facet-token-renderer.d.ts +6 -0
- package/dist/cli/install-skill/facet-token-renderer.d.ts.map +1 -0
- package/dist/cli/install-skill/facet-token-renderer.js +35 -0
- package/dist/cli/install-skill/facet-token-renderer.js.map +1 -0
- package/dist/cli/install-skill/facets.d.ts +8 -5
- package/dist/cli/install-skill/facets.d.ts.map +1 -1
- package/dist/cli/install-skill/facets.js +63 -34
- package/dist/cli/install-skill/facets.js.map +1 -1
- package/dist/cli/install-skill/flow.d.ts +3 -3
- package/dist/cli/install-skill/flow.d.ts.map +1 -1
- package/dist/cli/install-skill/flow.js +126 -21
- package/dist/cli/install-skill/flow.js.map +1 -1
- package/dist/cli/install-skill/modes.d.ts +2 -10
- package/dist/cli/install-skill/modes.d.ts.map +1 -1
- package/dist/cli/install-skill/modes.js +22 -49
- package/dist/cli/install-skill/modes.js.map +1 -1
- package/dist/cli/path-guard.d.ts +1 -0
- package/dist/cli/path-guard.d.ts.map +1 -1
- package/dist/cli/path-guard.js +34 -2
- package/dist/cli/path-guard.js.map +1 -1
- package/dist/cli/runner.d.ts +1 -0
- package/dist/cli/runner.d.ts.map +1 -1
- package/dist/cli/runner.js +11 -0
- package/dist/cli/runner.js.map +1 -1
- package/dist/cli/skill-commands.d.ts +13 -4
- package/dist/cli/skill-commands.d.ts.map +1 -1
- package/dist/cli/skill-commands.js +72 -15
- package/dist/cli/skill-commands.js.map +1 -1
- package/dist/cli/skill-renderer.d.ts +7 -4
- package/dist/cli/skill-renderer.d.ts.map +1 -1
- package/dist/cli/skill-renderer.js +74 -58
- package/dist/cli/skill-renderer.js.map +1 -1
- package/dist/cli/skill-types.d.ts +2 -2
- package/dist/cli/skill-types.d.ts.map +1 -1
- package/dist/cli/update-check.d.ts +2 -0
- package/dist/cli/update-check.d.ts.map +1 -0
- package/dist/cli/update-check.js +32 -0
- package/dist/cli/update-check.js.map +1 -0
- package/dist/compose-definition.d.ts.map +1 -1
- package/dist/compose-definition.js +10 -4
- package/dist/compose-definition.js.map +1 -1
- package/dist/compose.d.ts +5 -2
- package/dist/compose.d.ts.map +1 -1
- package/dist/compose.js +12 -5
- package/dist/compose.js.map +1 -1
- package/dist/init/index.d.ts +5 -1
- package/dist/init/index.d.ts.map +1 -1
- package/dist/init/index.js +30 -17
- package/dist/init/index.js.map +1 -1
- package/dist/prompt-payload.d.ts +2 -1
- package/dist/prompt-payload.d.ts.map +1 -1
- package/dist/prompt-payload.js +3 -1
- package/dist/prompt-payload.js.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -51,21 +51,24 @@ const result = compose(
|
|
|
51
51
|
persona: { body: 'You are a senior TypeScript developer.' },
|
|
52
52
|
policies: [{ body: 'Follow clean code principles. No any types.' }],
|
|
53
53
|
knowledge: [{ body: 'The project uses Vitest for testing.' }],
|
|
54
|
-
|
|
54
|
+
instructions: [{ body: 'Implement a retry function with exponential backoff.' }],
|
|
55
55
|
},
|
|
56
56
|
{ contextMaxChars: 8000 },
|
|
57
57
|
);
|
|
58
58
|
|
|
59
59
|
// result.systemPrompt → "You are a senior TypeScript developer."
|
|
60
|
-
// result.userMessage →
|
|
60
|
+
// result.userMessage → knowledge + instructions + policies (in order)
|
|
61
61
|
```
|
|
62
62
|
|
|
63
63
|
### As a CLI
|
|
64
64
|
|
|
65
65
|
```bash
|
|
66
|
-
# Create local
|
|
66
|
+
# Create local .faceted/ in current directory
|
|
67
67
|
facet init
|
|
68
68
|
|
|
69
|
+
# Initialize global ~/.faceted/ and pull sample facets
|
|
70
|
+
facet init global
|
|
71
|
+
|
|
69
72
|
# Pull sample facets from TAKT on GitHub
|
|
70
73
|
facet pull-sample
|
|
71
74
|
|
|
@@ -76,15 +79,26 @@ facet compose
|
|
|
76
79
|
facet install skill
|
|
77
80
|
```
|
|
78
81
|
|
|
79
|
-
`facet init` creates
|
|
82
|
+
`facet init` creates `.faceted/` in the current directory with config and empty directories. `facet init global` initializes `~/.faceted/` and pulls sample facets. Run `facet pull-sample` to update sample facets, compositions, and templates:
|
|
80
83
|
|
|
81
84
|
```
|
|
82
|
-
|
|
85
|
+
.faceted/ # Local (per-project)
|
|
86
|
+
├── config.yaml
|
|
87
|
+
├── facets/
|
|
88
|
+
│ ├── persona/
|
|
89
|
+
│ ├── knowledge/
|
|
90
|
+
│ ├── policies/
|
|
91
|
+
│ ├── instructions/
|
|
92
|
+
│ └── compositions/
|
|
93
|
+
└── templates/
|
|
94
|
+
|
|
95
|
+
~/.faceted/ # Global (fallback)
|
|
83
96
|
├── config.yaml
|
|
84
97
|
├── facets/
|
|
85
98
|
│ ├── persona/ # Persona Markdown files
|
|
86
99
|
│ ├── knowledge/ # Domain knowledge files
|
|
87
100
|
│ ├── policies/ # Policy/rules files
|
|
101
|
+
│ ├── instructions/ # Instruction files
|
|
88
102
|
│ └── compositions/ # Compose definition YAML files
|
|
89
103
|
└── templates/ # Skill templates
|
|
90
104
|
```
|
|
@@ -93,7 +107,8 @@ facet install skill
|
|
|
93
107
|
|
|
94
108
|
| Command | Description |
|
|
95
109
|
|---------|-------------|
|
|
96
|
-
| `facet init` | Create local
|
|
110
|
+
| `facet init` | Create local `.faceted/` in current directory |
|
|
111
|
+
| `facet init global` | Initialize global `~/.faceted/` and pull sample facets |
|
|
97
112
|
| `facet pull-sample` | Pull sample coding facets from TAKT on GitHub |
|
|
98
113
|
| `facet compose` | Auto-detect context, compose prompts, and write to files |
|
|
99
114
|
| `facet install skill` | Install a skill with facets to Claude Code or Codex |
|
|
@@ -112,16 +127,17 @@ knowledge:
|
|
|
112
127
|
- architecture
|
|
113
128
|
policies:
|
|
114
129
|
- quality
|
|
115
|
-
|
|
130
|
+
instructions:
|
|
131
|
+
- release-summary
|
|
116
132
|
order:
|
|
117
133
|
- knowledge
|
|
134
|
+
- instructions
|
|
118
135
|
- policies
|
|
119
|
-
- instruction
|
|
120
136
|
```
|
|
121
137
|
|
|
122
138
|
- `name` and `persona` are required.
|
|
123
|
-
- `order` controls user-message section order (default: `
|
|
124
|
-
- `
|
|
139
|
+
- `order` controls user-message section order (default: `knowledge` → `instructions` → `policies`).
|
|
140
|
+
- `instructions` is a list of facet file references.
|
|
125
141
|
|
|
126
142
|
## Scope References
|
|
127
143
|
|
|
@@ -182,17 +198,30 @@ See the [API Reference](./docs/api-reference.md) for the full API surface.
|
|
|
182
198
|
## Project Structure
|
|
183
199
|
|
|
184
200
|
```
|
|
185
|
-
|
|
201
|
+
.faceted/ # Local (per-project, created by `facet init`)
|
|
186
202
|
├── config.yaml
|
|
187
203
|
├── facets/
|
|
188
204
|
│ ├── persona/
|
|
189
205
|
│ ├── knowledge/
|
|
190
206
|
│ ├── policies/
|
|
207
|
+
│ ├── instructions/
|
|
208
|
+
│ └── compositions/
|
|
209
|
+
└── templates/
|
|
210
|
+
|
|
211
|
+
~/.faceted/ # Global (fallback, created by `facet init global`)
|
|
212
|
+
├── config.yaml
|
|
213
|
+
├── facets/
|
|
214
|
+
│ ├── persona/
|
|
215
|
+
│ ├── knowledge/
|
|
216
|
+
│ ├── policies/
|
|
217
|
+
│ ├── instructions/
|
|
191
218
|
│ └── compositions/
|
|
192
219
|
├── templates/ # Skill install templates
|
|
193
220
|
└── repertoire/ # Installed repertoire packages
|
|
194
221
|
```
|
|
195
222
|
|
|
223
|
+
Facet resolution is local-first: local `.faceted/facets/` is checked before global `~/.faceted/facets/`.
|
|
224
|
+
|
|
196
225
|
## Documentation
|
|
197
226
|
|
|
198
227
|
| Document | Description |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-command.d.ts","sourceRoot":"","sources":["../../src/cli/compose-command.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA8KlE,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CA+BzF"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { compose } from '../compose.js';
|
|
4
|
+
import { loadComposeDefinition } from '../compose-definition.js';
|
|
5
|
+
import { formatCombinedOutput, resolveOutputDirectory, writeComposeOutput } from '../output/index.js';
|
|
6
|
+
import { buildFacetSet, buildSkillSections, ensureSafeDefinitionName, } from './skill-renderer.js';
|
|
7
|
+
import { getSkillPaths, selectCompositionDefinitionPath, } from './skill-commands.js';
|
|
8
|
+
import { collectDirectoryFiles, copyDirectoryTree, ensureTemplateDirectoryFromRoots, shouldOverwrite, } from './install-skill/flow.js';
|
|
9
|
+
import { applyFacetTokensToFiles, buildInlineFacetTokenValues } from './install-skill/facets.js';
|
|
10
|
+
import { ensurePathAncestorsContainNoSymbolicLinks, ensurePathIsNotSymbolicLink } from './path-guard.js';
|
|
11
|
+
function buildComposeOutputPlans(params) {
|
|
12
|
+
if (params.splitSystem) {
|
|
13
|
+
return [
|
|
14
|
+
{
|
|
15
|
+
fileName: `${params.safeName}.system.md`,
|
|
16
|
+
content: `${params.systemPrompt}\n`,
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
fileName: `${params.safeName}.user.md`,
|
|
20
|
+
content: `${params.userMessage}\n`,
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
}
|
|
24
|
+
return [
|
|
25
|
+
{
|
|
26
|
+
fileName: `${params.safeName}.md`,
|
|
27
|
+
content: formatCombinedOutput({
|
|
28
|
+
systemPrompt: params.systemPrompt,
|
|
29
|
+
userMessage: params.userMessage,
|
|
30
|
+
}),
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
async function confirmOverwriteForExistingPaths(params) {
|
|
35
|
+
if (params.existingPaths.length === 0) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
const overwriteAnswer = await params.options.input(`${params.promptMessage} (${params.existingPaths.join(', ')}) [y/N]`, 'n');
|
|
39
|
+
if (!shouldOverwrite(overwriteAnswer)) {
|
|
40
|
+
throw new Error(`${params.cancelMessage}: ${params.existingPaths.join(', ')}`);
|
|
41
|
+
}
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
async function runTemplateBackedCompose(params) {
|
|
45
|
+
const templateName = params.definition.template;
|
|
46
|
+
if (!templateName) {
|
|
47
|
+
throw new Error(`Template-backed compose requires template: ${params.definition.name}`);
|
|
48
|
+
}
|
|
49
|
+
const templateDir = ensureTemplateDirectoryFromRoots(params.facetedRoots, templateName, dirname(params.definitionPath));
|
|
50
|
+
const outputInput = await params.options.input('Output directory', params.options.cwd);
|
|
51
|
+
const outputDir = resolveOutputDirectory(outputInput, params.options.cwd);
|
|
52
|
+
ensurePathIsNotSymbolicLink(outputDir, 'Output directory');
|
|
53
|
+
ensurePathAncestorsContainNoSymbolicLinks(outputDir, 'Output directory', params.options.cwd);
|
|
54
|
+
mkdirSync(outputDir, { recursive: true });
|
|
55
|
+
const templateRelativePaths = collectDirectoryFiles(templateDir);
|
|
56
|
+
const templateOutputPaths = templateRelativePaths.map(relativePath => resolve(outputDir, relativePath));
|
|
57
|
+
await confirmOverwriteForExistingPaths({
|
|
58
|
+
options: params.options,
|
|
59
|
+
existingPaths: templateOutputPaths.filter(path => existsSync(path)),
|
|
60
|
+
promptMessage: 'Output files exist. Overwrite?',
|
|
61
|
+
cancelMessage: 'Output files exist and overwrite was cancelled',
|
|
62
|
+
});
|
|
63
|
+
copyDirectoryTree(templateDir, outputDir);
|
|
64
|
+
const sections = buildSkillSections({
|
|
65
|
+
definition: params.definition,
|
|
66
|
+
definitionDir: dirname(params.definitionPath),
|
|
67
|
+
facetsRoots: params.facetsRoots,
|
|
68
|
+
});
|
|
69
|
+
applyFacetTokensToFiles({
|
|
70
|
+
filePaths: templateOutputPaths.filter(path => existsSync(path)),
|
|
71
|
+
tokenValues: buildInlineFacetTokenValues(sections),
|
|
72
|
+
rootDir: outputDir,
|
|
73
|
+
});
|
|
74
|
+
return {
|
|
75
|
+
kind: 'path',
|
|
76
|
+
path: outputDir,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
async function runStandardCompose(params) {
|
|
80
|
+
const safeName = ensureSafeDefinitionName(params.definition.name);
|
|
81
|
+
const facetSet = buildFacetSet({
|
|
82
|
+
definitionDir: dirname(params.definitionPath),
|
|
83
|
+
facetsRoots: params.facetsRoots,
|
|
84
|
+
definition: params.definition,
|
|
85
|
+
});
|
|
86
|
+
const composed = compose(facetSet, {
|
|
87
|
+
contextMaxChars: 2000,
|
|
88
|
+
userMessageOrder: params.definition.order,
|
|
89
|
+
});
|
|
90
|
+
const splitSelection = await params.options.select(['Combined (single file)', 'Split (system + user)'], 'Choose output mode with Up/Down and Enter:');
|
|
91
|
+
const outputPlans = buildComposeOutputPlans({
|
|
92
|
+
safeName,
|
|
93
|
+
systemPrompt: composed.systemPrompt,
|
|
94
|
+
userMessage: composed.userMessage,
|
|
95
|
+
splitSystem: splitSelection === 'Split (system + user)',
|
|
96
|
+
});
|
|
97
|
+
const outputInput = await params.options.input('Output directory', params.options.cwd);
|
|
98
|
+
const outputDir = resolveOutputDirectory(outputInput, params.options.cwd);
|
|
99
|
+
const existingPaths = outputPlans
|
|
100
|
+
.map(plan => resolve(outputDir, plan.fileName))
|
|
101
|
+
.filter(path => existsSync(path));
|
|
102
|
+
const overwrite = await confirmOverwriteForExistingPaths({
|
|
103
|
+
options: params.options,
|
|
104
|
+
existingPaths,
|
|
105
|
+
promptMessage: 'Output file exists. Overwrite?',
|
|
106
|
+
cancelMessage: 'Output file exists and overwrite was cancelled',
|
|
107
|
+
});
|
|
108
|
+
const outputPaths = [];
|
|
109
|
+
for (const plan of outputPlans) {
|
|
110
|
+
outputPaths.push(await writeComposeOutput({
|
|
111
|
+
outputDir,
|
|
112
|
+
fileName: plan.fileName,
|
|
113
|
+
content: plan.content,
|
|
114
|
+
overwrite,
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
if (outputPaths.length === 1) {
|
|
118
|
+
return {
|
|
119
|
+
kind: 'path',
|
|
120
|
+
path: outputPaths[0],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
kind: 'paths',
|
|
125
|
+
paths: outputPaths,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
export async function runComposeCommand(options) {
|
|
129
|
+
const { facetedRoots, facetsRoots, compositionsDirs } = getSkillPaths(options.cwd, options.homeDir);
|
|
130
|
+
const localCompositionsDir = facetedRoots.length > 1 ? resolve(facetedRoots[0], 'compositions') : undefined;
|
|
131
|
+
const globalCompositionsDir = resolve(facetedRoots[facetedRoots.length - 1], 'compositions');
|
|
132
|
+
const { definitionPath } = await selectCompositionDefinitionPath({
|
|
133
|
+
options,
|
|
134
|
+
compositionDefinitionDirs: compositionsDirs,
|
|
135
|
+
localCompositionsDir,
|
|
136
|
+
globalCompositionsDir,
|
|
137
|
+
cancelAction: 'Compose',
|
|
138
|
+
});
|
|
139
|
+
const definition = await loadComposeDefinition(definitionPath);
|
|
140
|
+
if (definition.template) {
|
|
141
|
+
return runTemplateBackedCompose({
|
|
142
|
+
options,
|
|
143
|
+
facetedRoots,
|
|
144
|
+
facetsRoots,
|
|
145
|
+
definitionPath,
|
|
146
|
+
definition,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
return runStandardCompose({
|
|
150
|
+
options,
|
|
151
|
+
facetsRoots,
|
|
152
|
+
definitionPath,
|
|
153
|
+
definition,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=compose-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-command.js","sourceRoot":"","sources":["../../src/cli/compose-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -93,9 +93,9 @@ function detectGitRelatedFiles(cwd) {
|
|
|
93
93
|
}
|
|
94
94
|
const collected = new Set();
|
|
95
95
|
const commands = [
|
|
96
|
-
['diff', '--name-only', '--diff-filter=ACMR'],
|
|
97
|
-
['diff', '--name-only', '--cached', '--diff-filter=ACMR'],
|
|
98
|
-
['ls-files', '--others', '--exclude-standard'],
|
|
96
|
+
['diff', '--name-only', '--diff-filter=ACMR', '--', '.'],
|
|
97
|
+
['diff', '--name-only', '--cached', '--diff-filter=ACMR', '--', '.'],
|
|
98
|
+
['ls-files', '--others', '--exclude-standard', '--', '.'],
|
|
99
99
|
];
|
|
100
100
|
for (const args of commands) {
|
|
101
101
|
const output = execFileSync('git', args, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose-context.js","sourceRoot":"","sources":["../../src/cli/compose-context.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"compose-context.js","sourceRoot":"","sources":["../../src/cli/compose-context.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA2BlE,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CA4DzB"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { formatCombinedOutput, resolveOutputDirectory, writeComposeOutput } from '../output/index.js';
|
|
7
|
-
import { resolveComposeContext } from './compose-context.js';
|
|
8
|
-
import { buildFacetSet, ensureSafeDefinitionName } from './skill-renderer.js';
|
|
9
|
-
import { getSkillPaths, runInstallSkillCommand, } from './skill-commands.js';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { initializeGlobalFaceted, initializeLocalFaceted, listPullSampleTargetPaths, pullSampleFacets, } from '../init/index.js';
|
|
4
|
+
import { runComposeCommand, } from './compose-command.js';
|
|
5
|
+
import { runInstallSkillCommand, } from './skill-commands.js';
|
|
10
6
|
import { shouldOverwrite } from './install-skill/flow.js';
|
|
11
7
|
const USAGE = [
|
|
12
8
|
'Usage: facet <command>',
|
|
13
9
|
'',
|
|
14
10
|
'Commands:',
|
|
15
|
-
' init Initialize local faceted home',
|
|
11
|
+
' init Initialize local faceted home (.faceted under cwd)',
|
|
12
|
+
' init global Initialize global faceted home (~/.faceted) and pull sample facets',
|
|
16
13
|
' pull-sample Pull sample coding facets from TAKT on GitHub',
|
|
17
14
|
' compose Compose facets into a prompt file',
|
|
18
15
|
' install skill Install a skill from a composition',
|
|
@@ -28,89 +25,25 @@ function ensureSkillSubcommand(command, subcommand) {
|
|
|
28
25
|
throw new Error(`Unsupported command: ${command}`);
|
|
29
26
|
}
|
|
30
27
|
}
|
|
31
|
-
async function runComposeCommand(options) {
|
|
32
|
-
const { facetsRoot, compositionsDir } = getSkillPaths(options.homeDir);
|
|
33
|
-
const composeContext = resolveComposeContext(options.cwd);
|
|
34
|
-
const definition = {
|
|
35
|
-
name: composeContext.name,
|
|
36
|
-
persona: 'coder',
|
|
37
|
-
policies: ['coding', 'ai-antipattern'],
|
|
38
|
-
knowledge: composeContext.knowledgeRefs,
|
|
39
|
-
instruction: composeContext.relatedInstruction,
|
|
40
|
-
order: ['policies', 'knowledge', 'instruction'],
|
|
41
|
-
};
|
|
42
|
-
const definitionDir = dirname(compositionsDir);
|
|
43
|
-
const facetSet = buildFacetSet({
|
|
44
|
-
definitionDir,
|
|
45
|
-
facetsRoot,
|
|
46
|
-
definition,
|
|
47
|
-
});
|
|
48
|
-
const composed = compose(facetSet, {
|
|
49
|
-
contextMaxChars: 2000,
|
|
50
|
-
userMessageOrder: definition.order,
|
|
51
|
-
});
|
|
52
|
-
const splitSelection = await options.select(['Combined (single file)', 'Split (system + user)'], 'Choose output mode with Up/Down and Enter:');
|
|
53
|
-
const splitSystem = splitSelection === 'Split (system + user)';
|
|
54
|
-
const outputInput = await options.input('Output directory', options.cwd);
|
|
55
|
-
const outputDir = resolveOutputDirectory(outputInput, options.cwd);
|
|
56
|
-
const safeName = ensureSafeDefinitionName(definition.name);
|
|
57
|
-
const outputPlans = splitSystem
|
|
58
|
-
? [
|
|
59
|
-
{
|
|
60
|
-
fileName: `${safeName}.system.md`,
|
|
61
|
-
content: `${composed.systemPrompt}\n`,
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
fileName: `${safeName}.user.md`,
|
|
65
|
-
content: `${composed.userMessage}\n`,
|
|
66
|
-
},
|
|
67
|
-
]
|
|
68
|
-
: [
|
|
69
|
-
{
|
|
70
|
-
fileName: `${safeName}.md`,
|
|
71
|
-
content: formatCombinedOutput(composed),
|
|
72
|
-
},
|
|
73
|
-
];
|
|
74
|
-
const existingPaths = outputPlans
|
|
75
|
-
.map(plan => resolve(outputDir, plan.fileName))
|
|
76
|
-
.filter(path => existsSync(path));
|
|
77
|
-
let overwrite = false;
|
|
78
|
-
if (existingPaths.length > 0) {
|
|
79
|
-
const overwriteAnswer = await options.input(`Output file exists. Overwrite? (${existingPaths.join(', ')}) [y/N]`, 'n');
|
|
80
|
-
if (!shouldOverwrite(overwriteAnswer)) {
|
|
81
|
-
throw new Error(`Output file exists and overwrite was cancelled: ${existingPaths.join(', ')}`);
|
|
82
|
-
}
|
|
83
|
-
overwrite = true;
|
|
84
|
-
}
|
|
85
|
-
const outputPaths = [];
|
|
86
|
-
for (const plan of outputPlans) {
|
|
87
|
-
outputPaths.push(await writeComposeOutput({
|
|
88
|
-
outputDir,
|
|
89
|
-
fileName: plan.fileName,
|
|
90
|
-
content: plan.content,
|
|
91
|
-
overwrite,
|
|
92
|
-
}));
|
|
93
|
-
}
|
|
94
|
-
if (outputPaths.length === 1) {
|
|
95
|
-
return {
|
|
96
|
-
kind: 'path',
|
|
97
|
-
path: outputPaths[0],
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
return {
|
|
101
|
-
kind: 'paths',
|
|
102
|
-
paths: outputPaths,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
28
|
export async function runFacetCli(args, options) {
|
|
106
29
|
const command = ensureCommand(args[0]);
|
|
107
30
|
const subcommand = args[1];
|
|
108
31
|
if (command === 'init') {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
32
|
+
if (subcommand === undefined) {
|
|
33
|
+
await initializeLocalFaceted({ cwd: options.cwd });
|
|
34
|
+
return {
|
|
35
|
+
kind: 'text',
|
|
36
|
+
text: `Initialized: ${resolve(options.cwd, '.faceted')}`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (subcommand === 'global') {
|
|
40
|
+
await initializeGlobalFaceted({ homeDir: options.homeDir });
|
|
41
|
+
return {
|
|
42
|
+
kind: 'text',
|
|
43
|
+
text: `Initialized global with sample facets: ${resolve(options.homeDir, '.faceted')}`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
throw new Error(`Unsupported command: ${command} ${subcommand}`);
|
|
114
47
|
}
|
|
115
48
|
if (command === 'pull-sample') {
|
|
116
49
|
const overlappingPaths = listPullSampleTargetPaths(options.homeDir).filter(path => existsSync(path));
|
|
@@ -131,7 +64,6 @@ export async function runFacetCli(args, options) {
|
|
|
131
64
|
if (command !== 'compose' && command !== 'install') {
|
|
132
65
|
throw new Error(`Unsupported command: ${command}`);
|
|
133
66
|
}
|
|
134
|
-
await readFacetedConfig(options.homeDir);
|
|
135
67
|
if (command === 'compose') {
|
|
136
68
|
return runComposeCommand(options);
|
|
137
69
|
}
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function readUtf8FileWithoutFollowingSymbolicLinks(filePath: string): string;
|
|
2
|
+
export declare function writeUtf8FileWithoutFollowingSymbolicLinks(filePath: string, content: string): void;
|
|
3
|
+
export declare function resolveBoundedOutputFilePath(filePath: string, rootDir: string): {
|
|
4
|
+
filePath: string;
|
|
5
|
+
rootRealPath: string;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=facet-token-file-ops.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facet-token-file-ops.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/facet-token-file-ops.ts"],"names":[],"mappings":"AAIA,wBAAgB,yCAAyC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmBlF;AAED,wBAAgB,0CAA0C,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAmBlG;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CA8B5C"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { closeSync, constants, existsSync, lstatSync, openSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { basename, dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { ensurePathAncestorsContainNoSymbolicLinks, isWithinRoot } from '../path-guard.js';
|
|
4
|
+
export function readUtf8FileWithoutFollowingSymbolicLinks(filePath) {
|
|
5
|
+
const openFlags = constants.O_RDONLY | constants.O_NOFOLLOW;
|
|
6
|
+
let fileDescriptor;
|
|
7
|
+
try {
|
|
8
|
+
fileDescriptor = openSync(filePath, openFlags);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
const errorCode = error.code;
|
|
12
|
+
if (errorCode === 'ELOOP') {
|
|
13
|
+
throw new Error(`Symbolic links are not allowed for output file: ${filePath}`);
|
|
14
|
+
}
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
return readFileSync(fileDescriptor, 'utf-8');
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
closeSync(fileDescriptor);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function writeUtf8FileWithoutFollowingSymbolicLinks(filePath, content) {
|
|
25
|
+
const openFlags = constants.O_WRONLY | constants.O_TRUNC | constants.O_NOFOLLOW;
|
|
26
|
+
let fileDescriptor;
|
|
27
|
+
try {
|
|
28
|
+
fileDescriptor = openSync(filePath, openFlags);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
const errorCode = error.code;
|
|
32
|
+
if (errorCode === 'ELOOP') {
|
|
33
|
+
throw new Error(`Symbolic links are not allowed for output file: ${filePath}`);
|
|
34
|
+
}
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
writeFileSync(fileDescriptor, content, 'utf-8');
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
closeSync(fileDescriptor);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function resolveBoundedOutputFilePath(filePath, rootDir) {
|
|
45
|
+
const resolvedRootDir = resolve(rootDir);
|
|
46
|
+
const resolvedFilePath = resolve(filePath);
|
|
47
|
+
ensurePathAncestorsContainNoSymbolicLinks(resolvedFilePath, 'Output directory', resolvedRootDir);
|
|
48
|
+
const rootRealPath = realpathSync(resolvedRootDir);
|
|
49
|
+
const parentDir = dirname(resolvedFilePath);
|
|
50
|
+
if (!existsSync(parentDir)) {
|
|
51
|
+
throw new Error(`Output file directory does not exist: ${parentDir}`);
|
|
52
|
+
}
|
|
53
|
+
const parentRealPath = realpathSync(parentDir);
|
|
54
|
+
if (!isWithinRoot(parentRealPath, rootRealPath)) {
|
|
55
|
+
throw new Error(`Output path escapes target directory: ${resolvedFilePath}`);
|
|
56
|
+
}
|
|
57
|
+
const boundedFilePath = join(parentRealPath, basename(resolvedFilePath));
|
|
58
|
+
if (!existsSync(boundedFilePath)) {
|
|
59
|
+
throw new Error(`Output file does not exist: ${resolvedFilePath}`);
|
|
60
|
+
}
|
|
61
|
+
if (lstatSync(boundedFilePath).isSymbolicLink()) {
|
|
62
|
+
throw new Error(`Symbolic links are not allowed for output file: ${resolvedFilePath}`);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
filePath: boundedFilePath,
|
|
66
|
+
rootRealPath,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=facet-token-file-ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facet-token-file-ops.js","sourceRoot":"","sources":["../../../src/cli/install-skill/facet-token-file-ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
type FacetPlaceholderKey = 'persona' | 'knowledges' | 'policies' | 'instructions';
|
|
2
|
+
export type FacetTokenValues = Record<FacetPlaceholderKey, string>;
|
|
3
|
+
export declare function hasFacetToken(content: string): boolean;
|
|
4
|
+
export declare function replaceFacetTokens(content: string, values: FacetTokenValues): string;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=facet-token-renderer.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
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*}}/;
|
|
3
|
+
export function hasFacetToken(content) {
|
|
4
|
+
return FACET_TOKEN_TEST.test(content);
|
|
5
|
+
}
|
|
6
|
+
export function replaceFacetTokens(content, values) {
|
|
7
|
+
return content.replaceAll(FACET_TOKEN_PATTERN, (_match, token, indentMode, offset, source) => {
|
|
8
|
+
const value = values[token];
|
|
9
|
+
if (indentMode === 'none') {
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
const lineIndent = detectPlaceholderLineIndent(source, offset);
|
|
13
|
+
return applyAutoIndentToMultilineValue(value, lineIndent);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function detectPlaceholderLineIndent(source, offset) {
|
|
17
|
+
const lineStart = source.lastIndexOf('\n', offset - 1) + 1;
|
|
18
|
+
const linePrefix = source.slice(lineStart, offset);
|
|
19
|
+
return /^\s*$/.test(linePrefix) ? linePrefix : '';
|
|
20
|
+
}
|
|
21
|
+
function applyAutoIndentToMultilineValue(value, lineIndent) {
|
|
22
|
+
if (lineIndent === '' || !value.includes('\n')) {
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
const lines = value.split('\n');
|
|
26
|
+
return lines
|
|
27
|
+
.map((line, index) => {
|
|
28
|
+
if (index === 0 || line === '') {
|
|
29
|
+
return line;
|
|
30
|
+
}
|
|
31
|
+
return `${lineIndent}${line}`;
|
|
32
|
+
})
|
|
33
|
+
.join('\n');
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=facet-token-renderer.js.map
|