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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facet-token-renderer.js","sourceRoot":"","sources":["../../../src/cli/install-skill/facet-token-renderer.ts"],"names":[],"mappings":"AAIA,MAAM,mBAAmB,GACvB,uFAAuF,CAAC;AAC1F,MAAM,gBAAgB,GACpB,sFAAsF,CAAC;AAEzF,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,MAAwB;IAC1E,OAAO,OAAO,CAAC,UAAU,CACvB,mBAAmB,EACnB,CACE,MAAc,EACd,KAA0B,EAC1B,UAA8B,EAC9B,MAAc,EACd,MAAc,EACd,EAAE;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,UAAU,GAAG,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/D,OAAO,+BAA+B,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC5D,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAAC,MAAc,EAAE,MAAc;IACjE,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,+BAA+B,CAAC,KAAa,EAAE,UAAkB;IACxE,IAAI,UAAU,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACnB,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,GAAG,UAAU,GAAG,IAAI,EAAE,CAAC;IAChC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import type { buildSkillSections } from '../skill-renderer.js';
|
|
2
2
|
import type { CopyFiles } from '../../types.js';
|
|
3
|
-
type
|
|
4
|
-
type FacetTokenValues = Record<FacetPlaceholderKey, string>;
|
|
3
|
+
import type { FacetTokenValues } from './facet-token-renderer.js';
|
|
5
4
|
export type SkillSections = ReturnType<typeof buildSkillSections>;
|
|
6
5
|
export interface FacetPathMap {
|
|
7
6
|
readonly persona: string;
|
|
8
7
|
readonly knowledges: readonly string[];
|
|
9
8
|
readonly policies: readonly string[];
|
|
10
|
-
readonly instructions
|
|
9
|
+
readonly instructions: readonly string[];
|
|
11
10
|
}
|
|
12
11
|
export declare function buildInlineFacetTokenValues(sections: SkillSections): FacetTokenValues;
|
|
13
12
|
export declare function buildSectionsWithCopiedPaths(sections: SkillSections, facets: FacetPathMap): SkillSections;
|
|
@@ -15,7 +14,7 @@ export declare function copyFacetFiles(params: {
|
|
|
15
14
|
targetDir: string;
|
|
16
15
|
safeSkillName: string;
|
|
17
16
|
copyFiles: CopyFiles;
|
|
18
|
-
|
|
17
|
+
literalInstructionBodies?: readonly string[];
|
|
19
18
|
}): FacetPathMap;
|
|
20
19
|
export declare function applyFacetTokensToPath(params: {
|
|
21
20
|
rootDir: string;
|
|
@@ -23,6 +22,10 @@ export declare function applyFacetTokensToPath(params: {
|
|
|
23
22
|
tokenValues: FacetTokenValues;
|
|
24
23
|
excludeDirs: readonly string[];
|
|
25
24
|
}): void;
|
|
25
|
+
export declare function applyFacetTokensToFiles(params: {
|
|
26
|
+
filePaths: readonly string[];
|
|
27
|
+
tokenValues: FacetTokenValues;
|
|
28
|
+
rootDir: string;
|
|
29
|
+
}): void;
|
|
26
30
|
export declare function parseScanDepth(rawDepth: string): number;
|
|
27
|
-
export {};
|
|
28
31
|
//# sourceMappingURL=facets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facets.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/facets.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"facets.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/facets.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAQhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AA8BD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,aAAa,GAAG,gBAAgB,CAOrF;AAyBD,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,YAAY,GACnB,aAAa,CA8Cf;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,wBAAwB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C,GAAG,YAAY,CA0Df;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC,GAAG,IAAI,CAiCP;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,IAAI,CAQP;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMvD"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { basename, join } from 'node:path';
|
|
2
|
-
import { copyFileSync, mkdirSync,
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import { copyFileSync, mkdirSync, readdirSync, realpathSync, writeFileSync, } from 'node:fs';
|
|
3
|
+
import { isWithinRoot } from '../path-guard.js';
|
|
4
|
+
import { readUtf8FileWithoutFollowingSymbolicLinks, resolveBoundedOutputFilePath, writeUtf8FileWithoutFollowingSymbolicLinks, } from './facet-token-file-ops.js';
|
|
5
|
+
import { hasFacetToken, replaceFacetTokens } from './facet-token-renderer.js';
|
|
5
6
|
function requireFacetPathCount(params) {
|
|
6
7
|
if (params.expected !== params.actual) {
|
|
7
8
|
throw new Error(`Copied ${params.label} facet count mismatch: expected ${params.expected}, received ${params.actual}`);
|
|
@@ -22,13 +23,24 @@ export function buildInlineFacetTokenValues(sections) {
|
|
|
22
23
|
persona: sections.persona.body,
|
|
23
24
|
knowledges: sections.knowledge.map(knowledge => knowledge.body).join('\n'),
|
|
24
25
|
policies: sections.policies.map(policy => policy.body).join('\n'),
|
|
25
|
-
instructions: sections.instruction
|
|
26
|
+
instructions: sections.instructions.map(instruction => instruction.body).join('\n'),
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
|
-
function
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
function applyFacetTokensToSingleFile(params) {
|
|
30
|
+
const boundedPath = resolveBoundedOutputFilePath(params.filePath, params.rootDir);
|
|
31
|
+
const original = readUtf8FileWithoutFollowingSymbolicLinks(boundedPath.filePath);
|
|
32
|
+
if (!hasFacetToken(original)) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const replaced = replaceFacetTokens(original, params.tokenValues);
|
|
36
|
+
if (replaced === original) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
writeUtf8FileWithoutFollowingSymbolicLinks(boundedPath.filePath, replaced);
|
|
40
|
+
const outputRealPath = realpathSync(boundedPath.filePath);
|
|
41
|
+
if (!isWithinRoot(outputRealPath, boundedPath.rootRealPath)) {
|
|
42
|
+
throw new Error(`Output path escapes target directory: ${params.filePath}`);
|
|
43
|
+
}
|
|
32
44
|
}
|
|
33
45
|
export function buildSectionsWithCopiedPaths(sections, facets) {
|
|
34
46
|
requireFacetPathCount({
|
|
@@ -41,13 +53,6 @@ export function buildSectionsWithCopiedPaths(sections, facets) {
|
|
|
41
53
|
expected: sections.policies.length,
|
|
42
54
|
actual: facets.policies.length,
|
|
43
55
|
});
|
|
44
|
-
const instruction = sections.instruction && facets.instructions
|
|
45
|
-
? {
|
|
46
|
-
ref: basename(facets.instructions, '.md'),
|
|
47
|
-
body: sections.instruction.body,
|
|
48
|
-
path: facets.instructions,
|
|
49
|
-
}
|
|
50
|
-
: sections.instruction;
|
|
51
56
|
return {
|
|
52
57
|
...sections,
|
|
53
58
|
persona: {
|
|
@@ -70,7 +75,17 @@ export function buildSectionsWithCopiedPaths(sections, facets) {
|
|
|
70
75
|
index,
|
|
71
76
|
}),
|
|
72
77
|
})),
|
|
73
|
-
instruction,
|
|
78
|
+
instructions: sections.instructions.map((instruction, index) => {
|
|
79
|
+
const instructionPath = facets.instructions[index];
|
|
80
|
+
if (instructionPath) {
|
|
81
|
+
return {
|
|
82
|
+
ref: basename(instructionPath, '.md'),
|
|
83
|
+
body: instruction.body,
|
|
84
|
+
path: instructionPath,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return instruction;
|
|
88
|
+
}),
|
|
74
89
|
};
|
|
75
90
|
}
|
|
76
91
|
export function copyFacetFiles(params) {
|
|
@@ -98,24 +113,32 @@ export function copyFacetFiles(params) {
|
|
|
98
113
|
copyFileSync(path, targetPath);
|
|
99
114
|
return targetPath;
|
|
100
115
|
});
|
|
101
|
-
|
|
102
|
-
const
|
|
103
|
-
|
|
116
|
+
const instructionPaths = [];
|
|
117
|
+
const hasSourceInstructions = params.copyFiles.instructions.length > 0;
|
|
118
|
+
const hasLiteralInstructions = params.literalInstructionBodies && params.literalInstructionBodies.length > 0;
|
|
119
|
+
if (hasSourceInstructions || hasLiteralInstructions) {
|
|
104
120
|
mkdirSync(instructionsDir, { recursive: true });
|
|
105
|
-
if (
|
|
106
|
-
|
|
107
|
-
|
|
121
|
+
if (hasSourceInstructions) {
|
|
122
|
+
for (const sourceInstructionPath of params.copyFiles.instructions) {
|
|
123
|
+
const targetPath = join(instructionsDir, basename(sourceInstructionPath));
|
|
124
|
+
copyFileSync(sourceInstructionPath, targetPath);
|
|
125
|
+
instructionPaths.push(targetPath);
|
|
126
|
+
}
|
|
108
127
|
}
|
|
109
|
-
else {
|
|
110
|
-
|
|
111
|
-
|
|
128
|
+
else if (params.literalInstructionBodies) {
|
|
129
|
+
for (let i = 0; i < params.literalInstructionBodies.length; i++) {
|
|
130
|
+
const suffix = params.literalInstructionBodies.length === 1 ? '' : `-${i + 1}`;
|
|
131
|
+
const targetPath = join(instructionsDir, `${params.safeSkillName}${suffix}.md`);
|
|
132
|
+
writeFileSync(targetPath, normalizeInstructionBody(params.literalInstructionBodies[i] ?? ''), 'utf-8');
|
|
133
|
+
instructionPaths.push(targetPath);
|
|
134
|
+
}
|
|
112
135
|
}
|
|
113
136
|
}
|
|
114
137
|
return {
|
|
115
138
|
persona: personaPath,
|
|
116
139
|
knowledges: knowledgePaths,
|
|
117
140
|
policies: policyPaths,
|
|
118
|
-
instructions:
|
|
141
|
+
instructions: instructionPaths,
|
|
119
142
|
};
|
|
120
143
|
}
|
|
121
144
|
export function applyFacetTokensToPath(params) {
|
|
@@ -138,18 +161,24 @@ export function applyFacetTokensToPath(params) {
|
|
|
138
161
|
if (!entry.isFile()) {
|
|
139
162
|
continue;
|
|
140
163
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (replaced !== original) {
|
|
147
|
-
writeFileSync(entryPath, replaced, 'utf-8');
|
|
148
|
-
}
|
|
164
|
+
applyFacetTokensToSingleFile({
|
|
165
|
+
filePath: entryPath,
|
|
166
|
+
tokenValues,
|
|
167
|
+
rootDir,
|
|
168
|
+
});
|
|
149
169
|
}
|
|
150
170
|
};
|
|
151
171
|
visit(rootDir, 0);
|
|
152
172
|
}
|
|
173
|
+
export function applyFacetTokensToFiles(params) {
|
|
174
|
+
for (const filePath of params.filePaths) {
|
|
175
|
+
applyFacetTokensToSingleFile({
|
|
176
|
+
filePath,
|
|
177
|
+
tokenValues: params.tokenValues,
|
|
178
|
+
rootDir: params.rootDir,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
153
182
|
export function parseScanDepth(rawDepth) {
|
|
154
183
|
const parsed = Number.parseInt(rawDepth, 10);
|
|
155
184
|
if (!Number.isFinite(parsed) || parsed < 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facets.js","sourceRoot":"","sources":["../../../src/cli/install-skill/facets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,
|
|
1
|
+
{"version":3,"file":"facets.js","sourceRoot":"","sources":["../../../src/cli/install-skill/facets.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { FacetCliOptions } from '../types.js';
|
|
2
2
|
export { defaultOutputPath, listInstallTargets, resolveInstallTarget } from './targets.js';
|
|
3
3
|
export declare function shouldOverwrite(answer: string): boolean;
|
|
4
|
-
export declare function
|
|
5
|
-
export declare function copyDirectoryTree(sourceDir: string, targetDir: string): void;
|
|
4
|
+
export declare function ensureTemplateDirectoryFromRoots(facetedRoots: readonly string[], templateRef: string, definitionDir?: string): string;
|
|
5
|
+
export declare function copyDirectoryTree(sourceDir: string, targetDir: string, rootTargetDir?: string): void;
|
|
6
|
+
export declare function collectDirectoryFiles(dir: string, basePath?: string): string[];
|
|
6
7
|
export declare function ensureRegenerationTargetDir(params: {
|
|
7
8
|
targetDir: string;
|
|
8
9
|
options: FacetCliOptions;
|
|
9
10
|
promptLabel: string;
|
|
10
11
|
homeDir?: string;
|
|
11
12
|
}): Promise<void>;
|
|
12
|
-
export declare function ensureDirectoryExists(path: string, label: string): void;
|
|
13
13
|
//# sourceMappingURL=flow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/flow.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/flow.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE3F,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED,wBAAgB,gCAAgC,CAC9C,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAmCR;AAgGD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,SAAY,GAAG,IAAI,CASvG;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,MAAM,EAAE,CAsB1E;AAiBD,wBAAsB,2BAA2B,CAAC,MAAM,EAAE;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,eAAe,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBhB"}
|
|
@@ -1,45 +1,155 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { ensurePathAncestorsAndRealPathWithinHome, ensurePathAncestorsContainNoSymbolicLinks, ensurePathWithinRoots, } from '../path-guard.js';
|
|
1
|
+
import { closeSync, constants, existsSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { basename, dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { ensurePathAncestorsAndRealPathWithinHome, ensurePathAncestorsContainNoSymbolicLinks, ensurePathIsNotSymbolicLink, isWithinRoot, ensurePathWithinRoots, } from '../path-guard.js';
|
|
4
|
+
import { isResourcePath, resolveResourcePath } from '../../resolve.js';
|
|
4
5
|
export { defaultOutputPath, listInstallTargets, resolveInstallTarget } from './targets.js';
|
|
5
6
|
export function shouldOverwrite(answer) {
|
|
6
7
|
const normalized = answer.trim().toLowerCase();
|
|
7
8
|
return normalized === 'y' || normalized === 'yes';
|
|
8
9
|
}
|
|
9
|
-
export function
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
export function ensureTemplateDirectoryFromRoots(facetedRoots, templateRef, definitionDir) {
|
|
11
|
+
if (isResourcePath(templateRef) && definitionDir) {
|
|
12
|
+
const resolvedPath = resolveResourcePath(templateRef, definitionDir);
|
|
13
|
+
if (!existsSync(resolvedPath)) {
|
|
14
|
+
throw new Error(`Template directory does not exist: ${resolvedPath}`);
|
|
15
|
+
}
|
|
16
|
+
if (!lstatSync(resolvedPath).isDirectory()) {
|
|
17
|
+
throw new Error(`Template path must be a directory: ${resolvedPath}`);
|
|
18
|
+
}
|
|
19
|
+
return resolvedPath;
|
|
20
|
+
}
|
|
21
|
+
const templatesRoots = facetedRoots.map(facetedRoot => join(facetedRoot, 'templates'));
|
|
22
|
+
const primaryTemplatesRoot = templatesRoots[0];
|
|
23
|
+
if (!primaryTemplatesRoot) {
|
|
24
|
+
throw new Error('Template roots are required');
|
|
14
25
|
}
|
|
15
|
-
|
|
26
|
+
for (const templatesRoot of templatesRoots) {
|
|
27
|
+
const candidatePath = join(templatesRoot, templateRef);
|
|
28
|
+
if (!existsSync(candidatePath)) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const templatePath = ensurePathWithinRoots(candidatePath, [templatesRoot], `template "${templateRef}"`);
|
|
32
|
+
if (!lstatSync(templatePath).isDirectory()) {
|
|
33
|
+
throw new Error(`Template path must be a directory: ${templatePath}`);
|
|
34
|
+
}
|
|
35
|
+
return templatePath;
|
|
36
|
+
}
|
|
37
|
+
throw new Error(`Template directory does not exist: ${join(primaryTemplatesRoot, templateRef)}`);
|
|
16
38
|
}
|
|
17
|
-
|
|
39
|
+
function copyFileIntoTargetRoot(params) {
|
|
40
|
+
const targetParentDir = dirname(params.targetPath);
|
|
41
|
+
mkdirSync(targetParentDir, { recursive: true });
|
|
42
|
+
ensurePathAncestorsContainNoSymbolicLinks(targetParentDir, 'Output directory', params.rootTargetDir);
|
|
43
|
+
const targetParentRealPath = realpathSync(targetParentDir);
|
|
44
|
+
if (!isWithinRoot(targetParentRealPath, params.rootTargetRealPath)) {
|
|
45
|
+
throw new Error(`Output path escapes target directory: ${params.targetPath}`);
|
|
46
|
+
}
|
|
47
|
+
const targetFilePath = join(targetParentRealPath, basename(params.targetPath));
|
|
48
|
+
const tempFilePath = join(targetParentRealPath, `.${basename(params.targetPath)}.${process.pid}.${Date.now()}.tmp`);
|
|
49
|
+
const openFlags = constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW;
|
|
50
|
+
let targetFileDescriptor;
|
|
51
|
+
try {
|
|
52
|
+
if (existsSync(targetFilePath) && lstatSync(targetFilePath).isSymbolicLink()) {
|
|
53
|
+
throw new Error(`Symbolic links are not allowed for output file: ${params.targetPath}`);
|
|
54
|
+
}
|
|
55
|
+
targetFileDescriptor = openSync(tempFilePath, openFlags, 0o600);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
const errorCode = error.code;
|
|
59
|
+
if (errorCode === 'ELOOP') {
|
|
60
|
+
throw new Error(`Symbolic links are not allowed for output file: ${tempFilePath}`);
|
|
61
|
+
}
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
writeFileSync(targetFileDescriptor, readFileSync(params.sourcePath));
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
closeSync(targetFileDescriptor);
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
renameSync(tempFilePath, targetFilePath);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (existsSync(tempFilePath)) {
|
|
75
|
+
unlinkSync(tempFilePath);
|
|
76
|
+
}
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
const targetRealPath = realpathSync(targetFilePath);
|
|
80
|
+
if (!isWithinRoot(targetRealPath, params.rootTargetRealPath)) {
|
|
81
|
+
throw new Error(`Output path escapes target directory: ${params.targetPath}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function copyDirectoryTreeInternal(params) {
|
|
85
|
+
mkdirSync(params.targetDir, { recursive: true });
|
|
86
|
+
for (const entry of readdirSync(params.sourceDir, { withFileTypes: true })) {
|
|
87
|
+
if (entry.isSymbolicLink()) {
|
|
88
|
+
throw new Error(`Symbolic links are not allowed in template directory: ${join(params.sourceDir, entry.name)}`);
|
|
89
|
+
}
|
|
90
|
+
const sourcePath = join(params.sourceDir, entry.name);
|
|
91
|
+
const targetPath = join(params.targetDir, entry.name);
|
|
92
|
+
if (entry.isDirectory()) {
|
|
93
|
+
ensurePathAncestorsContainNoSymbolicLinks(targetPath, 'Output directory', params.rootTargetDir);
|
|
94
|
+
copyDirectoryTreeInternal({
|
|
95
|
+
sourceDir: sourcePath,
|
|
96
|
+
targetDir: targetPath,
|
|
97
|
+
rootTargetDir: params.rootTargetDir,
|
|
98
|
+
rootTargetRealPath: params.rootTargetRealPath,
|
|
99
|
+
});
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (entry.isFile()) {
|
|
103
|
+
copyFileIntoTargetRoot({
|
|
104
|
+
sourcePath,
|
|
105
|
+
targetPath,
|
|
106
|
+
rootTargetDir: params.rootTargetDir,
|
|
107
|
+
rootTargetRealPath: params.rootTargetRealPath,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export function copyDirectoryTree(sourceDir, targetDir, rootTargetDir = targetDir) {
|
|
18
113
|
mkdirSync(targetDir, { recursive: true });
|
|
19
|
-
|
|
114
|
+
const rootTargetRealPath = realpathSync(rootTargetDir);
|
|
115
|
+
copyDirectoryTreeInternal({
|
|
116
|
+
sourceDir,
|
|
117
|
+
targetDir,
|
|
118
|
+
rootTargetDir,
|
|
119
|
+
rootTargetRealPath,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
export function collectDirectoryFiles(dir, basePath = '') {
|
|
123
|
+
const files = [];
|
|
124
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
20
125
|
if (entry.isSymbolicLink()) {
|
|
21
|
-
|
|
126
|
+
continue;
|
|
22
127
|
}
|
|
23
|
-
const
|
|
24
|
-
const
|
|
128
|
+
const relativePath = basePath ? join(basePath, entry.name) : entry.name;
|
|
129
|
+
const entryPath = join(dir, entry.name);
|
|
25
130
|
if (entry.isDirectory()) {
|
|
26
|
-
|
|
131
|
+
files.push(...collectDirectoryFiles(entryPath, relativePath));
|
|
27
132
|
continue;
|
|
28
133
|
}
|
|
29
134
|
if (entry.isFile()) {
|
|
30
|
-
|
|
135
|
+
files.push(relativePath);
|
|
31
136
|
}
|
|
32
137
|
}
|
|
138
|
+
return files;
|
|
33
139
|
}
|
|
34
140
|
function ensurePathSafety(params) {
|
|
35
141
|
if (params.homeDir) {
|
|
36
142
|
ensurePathAncestorsAndRealPathWithinHome(params.targetDir, params.homeDir, params.promptLabel);
|
|
37
143
|
return;
|
|
38
144
|
}
|
|
145
|
+
ensurePathIsNotSymbolicLink(params.targetDir, params.promptLabel);
|
|
39
146
|
ensurePathAncestorsContainNoSymbolicLinks(params.targetDir, params.promptLabel, params.cwd);
|
|
40
147
|
}
|
|
41
148
|
export async function ensureRegenerationTargetDir(params) {
|
|
42
149
|
const { targetDir, options, promptLabel } = params;
|
|
150
|
+
if (params.homeDir && resolve(targetDir) === resolve(params.homeDir)) {
|
|
151
|
+
throw new Error(`${promptLabel} must not be home directory: ${resolve(targetDir)}`);
|
|
152
|
+
}
|
|
43
153
|
ensurePathSafety({
|
|
44
154
|
targetDir,
|
|
45
155
|
promptLabel,
|
|
@@ -55,9 +165,4 @@ export async function ensureRegenerationTargetDir(params) {
|
|
|
55
165
|
}
|
|
56
166
|
mkdirSync(targetDir, { recursive: true });
|
|
57
167
|
}
|
|
58
|
-
export function ensureDirectoryExists(path, label) {
|
|
59
|
-
if (!existsSync(path) || !lstatSync(path).isDirectory()) {
|
|
60
|
-
throw new Error(`${label} does not exist: ${path}`);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
168
|
//# sourceMappingURL=flow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/cli/install-skill/flow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/cli/install-skill/flow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,MAAM,EACN,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EACL,wCAAwC,EACxC,yCAAyC,EACzC,2BAA2B,EAC3B,YAAY,EACZ,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE3F,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,YAA+B,EAC/B,WAAmB,EACnB,aAAsB;IAEtB,IAAI,cAAc,CAAC,WAAW,CAAC,IAAI,aAAa,EAAE,CAAC;QACjD,MAAM,YAAY,GAAG,mBAAmB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QACrE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,sCAAsC,YAAY,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,sCAAsC,YAAY,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;IACvF,MAAM,oBAAoB,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;QAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QACD,MAAM,YAAY,GAAG,qBAAqB,CACxC,aAAa,EACb,CAAC,aAAa,CAAC,EACf,aAAa,WAAW,GAAG,CAC5B,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,sCAAsC,YAAY,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,sBAAsB,CAAC,MAK/B;IACC,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnD,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,yCAAyC,CAAC,eAAe,EAAE,kBAAkB,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAErG,MAAM,oBAAoB,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAC3D,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,yCAAyC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/E,MAAM,YAAY,GAAG,IAAI,CACvB,oBAAoB,EACpB,IAAI,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CACnE,CAAC;IAEF,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC;IACnG,IAAI,oBAA4B,CAAC;IACjC,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;YAC7E,MAAM,IAAI,KAAK,CAAC,mDAAmD,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,oBAAoB,GAAG,QAAQ,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,SAAS,GAAI,KAA+B,CAAC,IAAI,CAAC;QACxD,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mDAAmD,YAAY,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,aAAa,CAAC,oBAAoB,EAAE,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACvE,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,CAAC;QACH,UAAU,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,UAAU,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IACpD,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,yCAAyC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,MAKlC;IACC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjD,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3E,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,yDAAyD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjH,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAEtD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,yCAAyC,CAAC,UAAU,EAAE,kBAAkB,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;YAChG,yBAAyB,CAAC;gBACxB,SAAS,EAAE,UAAU;gBACrB,SAAS,EAAE,UAAU;gBACrB,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;aAC9C,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,sBAAsB,CAAC;gBACrB,UAAU;gBACV,UAAU;gBACV,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;aAC9C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,SAAiB,EAAE,aAAa,GAAG,SAAS;IAC/F,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,kBAAkB,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IACvD,yBAAyB,CAAC;QACxB,SAAS;QACT,SAAS;QACT,aAAa;QACb,kBAAkB;KACnB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAW,EAAE,QAAQ,GAAG,EAAE;IAC9D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACxE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;YAC9D,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,MAKzB;IACC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,wCAAwC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/F,OAAO;IACT,CAAC;IAED,2BAA2B,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAClE,yCAAyC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,MAKjD;IACC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IACnD,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,GAAG,WAAW,gCAAgC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,gBAAgB,CAAC;QACf,SAAS;QACT,WAAW;QACX,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,sBAAsB,SAAS,SAAS,EAAE,GAAG,CAAC,CAAC;QACzG,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,GAAG,WAAW,wCAAwC,SAAS,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -2,19 +2,11 @@ import type { FacetCliOptions, FacetCliResult } from '../types.js';
|
|
|
2
2
|
import type { SkillSections } from './facets.js';
|
|
3
3
|
import type { ComposeDefinition } from '../../types.js';
|
|
4
4
|
import type { InstallTarget } from '../skill-types.js';
|
|
5
|
-
export declare function runTemplateApplyInstall(params: {
|
|
6
|
-
options: FacetCliOptions;
|
|
7
|
-
safeSkillName: string;
|
|
8
|
-
sections: SkillSections;
|
|
9
|
-
templateDir: string;
|
|
10
|
-
definitionDir: string;
|
|
11
|
-
facetsRoot: string;
|
|
12
|
-
}): Promise<FacetCliResult>;
|
|
13
5
|
export declare function runSkillDeployInstall(params: {
|
|
14
6
|
options: FacetCliOptions;
|
|
15
|
-
|
|
7
|
+
facetedRoots: readonly string[];
|
|
16
8
|
definitionDir: string;
|
|
17
|
-
|
|
9
|
+
facetsRoots: readonly string[];
|
|
18
10
|
safeSkillName: string;
|
|
19
11
|
definition: ComposeDefinition;
|
|
20
12
|
sections: SkillSections;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modes.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/modes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"modes.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/modes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAcnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAqBvD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,OAAO,EAAE,eAAe,CAAC;IACzB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,EAAE,aAAa,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC,CAoGjG"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { existsSync, lstatSync, readFileSync } from 'node:fs';
|
|
2
|
-
import {
|
|
3
|
-
import { ensurePathWithinHome } from '../path-guard.js';
|
|
2
|
+
import { basename, dirname, resolve } from 'node:path';
|
|
3
|
+
import { ensurePathWithinHome, isWithinRoot } from '../path-guard.js';
|
|
4
4
|
import { hasYamlFrontmatter, renderSkillDocument, renderSkillFrontmatter } from '../skill-renderer.js';
|
|
5
5
|
import { writeSkillFile } from '../skill-file-ops.js';
|
|
6
|
-
import { applyFacetTokensToPath, buildInlineFacetTokenValues, copyFacetFiles,
|
|
7
|
-
import { copyDirectoryTree, defaultOutputPath,
|
|
6
|
+
import { applyFacetTokensToPath, buildInlineFacetTokenValues, copyFacetFiles, } from './facets.js';
|
|
7
|
+
import { copyDirectoryTree, defaultOutputPath, ensureRegenerationTargetDir, listInstallTargets, ensureTemplateDirectoryFromRoots, resolveInstallTarget, } from './flow.js';
|
|
8
8
|
import { composePromptPayload } from '../../prompt-payload.js';
|
|
9
9
|
function ensureTemplateBackedSkillFrontmatter(params) {
|
|
10
10
|
if (!existsSync(params.outputPath)) {
|
|
@@ -17,43 +17,6 @@ function ensureTemplateBackedSkillFrontmatter(params) {
|
|
|
17
17
|
const contentWithFrontmatter = `${renderSkillFrontmatter(params.definition)}\n${currentContent.trimStart()}`;
|
|
18
18
|
writeSkillFile(params.outputPath, contentWithFrontmatter, params.homeDir);
|
|
19
19
|
}
|
|
20
|
-
export async function runTemplateApplyInstall(params) {
|
|
21
|
-
const requestedDir = await params.options.input('Output directory', params.options.cwd);
|
|
22
|
-
const targetDir = resolve(requestedDir);
|
|
23
|
-
ensureDirectoryExists(targetDir, 'Output directory');
|
|
24
|
-
const scanDepth = parseScanDepth(await params.options.input('Scan depth', '1'));
|
|
25
|
-
const payload = composePromptPayload({
|
|
26
|
-
definition: params.sections.definition,
|
|
27
|
-
definitionDir: params.definitionDir,
|
|
28
|
-
facetsRoot: params.facetsRoot,
|
|
29
|
-
composeOptions: { contextMaxChars: 8000 },
|
|
30
|
-
});
|
|
31
|
-
copyDirectoryTree(params.templateDir, targetDir);
|
|
32
|
-
const facetsDir = join(targetDir, 'facets');
|
|
33
|
-
await ensureRegenerationTargetDir({
|
|
34
|
-
targetDir: facetsDir,
|
|
35
|
-
options: params.options,
|
|
36
|
-
promptLabel: 'Facets directory',
|
|
37
|
-
});
|
|
38
|
-
copyFacetFiles({
|
|
39
|
-
targetDir,
|
|
40
|
-
safeSkillName: params.safeSkillName,
|
|
41
|
-
copyFiles: payload.copyFiles,
|
|
42
|
-
literalInstructionBody: params.sections.instruction && !('path' in params.sections.instruction)
|
|
43
|
-
? params.sections.instruction.body
|
|
44
|
-
: undefined,
|
|
45
|
-
});
|
|
46
|
-
applyFacetTokensToPath({
|
|
47
|
-
rootDir: targetDir,
|
|
48
|
-
maxDepth: scanDepth,
|
|
49
|
-
tokenValues: buildInlineFacetTokenValues(params.sections),
|
|
50
|
-
excludeDirs: ['facets'],
|
|
51
|
-
});
|
|
52
|
-
return {
|
|
53
|
-
kind: 'path',
|
|
54
|
-
path: targetDir,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
20
|
export async function runSkillDeployInstall(params) {
|
|
58
21
|
const targetLabel = await params.options.select(listInstallTargets().map(target => target.label), 'Choose install target with Up/Down and Enter:');
|
|
59
22
|
const target = resolveInstallTarget(targetLabel);
|
|
@@ -61,19 +24,29 @@ export async function runSkillDeployInstall(params) {
|
|
|
61
24
|
const defaultPath = defaultOutputPath(params.options.homeDir, params.safeSkillName, target);
|
|
62
25
|
const outputPath = resolve(await params.options.input('Output path', defaultPath));
|
|
63
26
|
const { resolvedPath: boundedOutputPath } = ensurePathWithinHome(outputPath, params.options.homeDir, 'Skill output path');
|
|
27
|
+
const targetRootDir = resolve(params.options.homeDir, ...target.relativeOutputPath);
|
|
28
|
+
if (!isWithinRoot(boundedOutputPath, targetRootDir)) {
|
|
29
|
+
throw new Error(`Skill output path must be inside target directory: ${targetRootDir}`);
|
|
30
|
+
}
|
|
31
|
+
if (basename(boundedOutputPath) !== 'SKILL.md') {
|
|
32
|
+
throw new Error(`Skill output path must point to SKILL.md: ${boundedOutputPath}`);
|
|
33
|
+
}
|
|
64
34
|
if (existsSync(boundedOutputPath) && lstatSync(boundedOutputPath).isSymbolicLink()) {
|
|
65
35
|
throw new Error(`Symbolic links are not allowed for skill output file: ${boundedOutputPath}`);
|
|
66
36
|
}
|
|
67
37
|
const templateDir = params.definition.template
|
|
68
|
-
?
|
|
38
|
+
? ensureTemplateDirectoryFromRoots(params.facetedRoots, params.definition.template, params.definitionDir)
|
|
69
39
|
: undefined;
|
|
70
40
|
const payload = composePromptPayload({
|
|
71
41
|
definition: params.definition,
|
|
72
42
|
definitionDir: params.definitionDir,
|
|
73
|
-
|
|
43
|
+
facetsRoots: params.facetsRoots,
|
|
74
44
|
composeOptions: { contextMaxChars: 8000 },
|
|
75
45
|
});
|
|
76
46
|
const targetDir = dirname(boundedOutputPath);
|
|
47
|
+
if (resolve(targetDir) === targetRootDir) {
|
|
48
|
+
throw new Error(`Skill output path must include a skill directory under target directory: ${targetRootDir}`);
|
|
49
|
+
}
|
|
77
50
|
await ensureRegenerationTargetDir({
|
|
78
51
|
targetDir,
|
|
79
52
|
options: params.options,
|
|
@@ -86,9 +59,9 @@ export async function runSkillDeployInstall(params) {
|
|
|
86
59
|
targetDir,
|
|
87
60
|
safeSkillName: params.safeSkillName,
|
|
88
61
|
copyFiles: payload.copyFiles,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
62
|
+
literalInstructionBodies: params.sections.instructions
|
|
63
|
+
.filter(instruction => !('path' in instruction))
|
|
64
|
+
.map(instruction => instruction.body),
|
|
92
65
|
});
|
|
93
66
|
applyFacetTokensToPath({
|
|
94
67
|
rootDir: targetDir,
|
|
@@ -107,9 +80,9 @@ export async function runSkillDeployInstall(params) {
|
|
|
107
80
|
targetDir,
|
|
108
81
|
safeSkillName: params.safeSkillName,
|
|
109
82
|
copyFiles: payload.copyFiles,
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
83
|
+
literalInstructionBodies: params.sections.instructions
|
|
84
|
+
.filter(instruction => !('path' in instruction))
|
|
85
|
+
.map(instruction => instruction.body),
|
|
113
86
|
});
|
|
114
87
|
const content = renderSkillDocument({
|
|
115
88
|
...params.sections,
|