faceted-prompting 0.3.1 → 0.5.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 +39 -12
- package/dist/cli/compose-command.d.ts +2 -2
- package/dist/cli/compose-command.d.ts.map +1 -1
- package/dist/cli/compose-command.js +16 -145
- package/dist/cli/compose-command.js.map +1 -1
- package/dist/cli/compose-definition-resolution.d.ts +12 -0
- package/dist/cli/compose-definition-resolution.d.ts.map +1 -0
- package/dist/cli/compose-definition-resolution.js +50 -0
- package/dist/cli/compose-definition-resolution.js.map +1 -0
- package/dist/cli/compose-execution.d.ts +19 -0
- package/dist/cli/compose-execution.d.ts.map +1 -0
- package/dist/cli/compose-execution.js +167 -0
- package/dist/cli/compose-execution.js.map +1 -0
- package/dist/cli/compose-options.d.ts +4 -0
- package/dist/cli/compose-options.d.ts.map +1 -0
- package/dist/cli/compose-options.js +64 -0
- package/dist/cli/compose-options.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -1
- package/dist/cli/index.js.map +1 -1
- 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 +2 -0
- package/dist/cli/install-skill/facets.d.ts.map +1 -1
- package/dist/cli/install-skill/facets.js +43 -4
- package/dist/cli/install-skill/facets.js.map +1 -1
- package/dist/cli/install-skill/flow.d.ts +2 -1
- package/dist/cli/install-skill/flow.d.ts.map +1 -1
- package/dist/cli/install-skill/flow.js +7 -2
- package/dist/cli/install-skill/flow.js.map +1 -1
- package/dist/cli/install-skill/instruction-partial-copy.d.ts +6 -0
- package/dist/cli/install-skill/instruction-partial-copy.d.ts.map +1 -0
- package/dist/cli/install-skill/instruction-partial-copy.js +32 -0
- package/dist/cli/install-skill/instruction-partial-copy.js.map +1 -0
- package/dist/cli/install-skill/modes.d.ts +3 -1
- package/dist/cli/install-skill/modes.d.ts.map +1 -1
- package/dist/cli/install-skill/modes.js +16 -14
- package/dist/cli/install-skill/modes.js.map +1 -1
- package/dist/cli/install-skill/targets.d.ts +4 -3
- package/dist/cli/install-skill/targets.d.ts.map +1 -1
- package/dist/cli/install-skill/targets.js +18 -4
- package/dist/cli/install-skill/targets.js.map +1 -1
- package/dist/cli/instruction-includes.d.ts +11 -0
- package/dist/cli/instruction-includes.d.ts.map +1 -0
- package/dist/cli/instruction-includes.js +130 -0
- package/dist/cli/instruction-includes.js.map +1 -0
- package/dist/cli/path-guard.d.ts +5 -0
- package/dist/cli/path-guard.d.ts.map +1 -1
- package/dist/cli/path-guard.js +25 -0
- package/dist/cli/path-guard.js.map +1 -1
- package/dist/cli/skill-commands.d.ts +8 -0
- package/dist/cli/skill-commands.d.ts.map +1 -1
- package/dist/cli/skill-commands.js +23 -6
- 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-file-ops.d.ts +1 -2
- package/dist/cli/skill-file-ops.d.ts.map +1 -1
- package/dist/cli/skill-file-ops.js +12 -38
- package/dist/cli/skill-file-ops.js.map +1 -1
- 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 +98 -75
- package/dist/cli/skill-renderer.js.map +1 -1
- package/dist/cli/skill-types.d.ts +6 -2
- package/dist/cli/skill-types.d.ts.map +1 -1
- package/dist/cli/types.d.ts +6 -0
- package/dist/cli/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/config/index.d.ts +12 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +44 -2
- package/dist/config/index.js.map +1 -1
- package/dist/config/install-targets.d.ts +6 -0
- package/dist/config/install-targets.d.ts.map +1 -0
- package/dist/config/install-targets.js +71 -0
- package/dist/config/install-targets.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/install-targets.d.ts +2 -0
- package/dist/install-targets.d.ts.map +1 -0
- package/dist/install-targets.js +2 -0
- package/dist/install-targets.js.map +1 -0
- package/dist/instruction-partial-paths.d.ts +3 -0
- package/dist/instruction-partial-paths.d.ts.map +1 -0
- package/dist/instruction-partial-paths.js +6 -0
- package/dist/instruction-partial-paths.js.map +1 -0
- package/dist/prompt-payload.d.ts +1 -0
- package/dist/prompt-payload.d.ts.map +1 -1
- package/dist/prompt-payload.js +26 -8
- package/dist/prompt-payload.js.map +1 -1
- package/dist/types.d.ts +9 -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
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
|
+
import { getBuiltInInstallRootTemplates, readInstallRootTemplatesFromConfigValue, resolveInstallRootTemplates, } from '../../config/install-targets.js';
|
|
2
3
|
const INSTALL_TARGETS = [
|
|
3
4
|
{
|
|
4
5
|
key: 'cc',
|
|
5
6
|
label: 'Claude Code',
|
|
6
|
-
relativeOutputPath: ['.claude', 'skills'],
|
|
7
7
|
},
|
|
8
8
|
{
|
|
9
9
|
key: 'codex',
|
|
10
10
|
label: 'Codex',
|
|
11
|
-
relativeOutputPath: ['.codex', 'skills'],
|
|
12
11
|
},
|
|
13
12
|
];
|
|
14
13
|
export function listInstallTargets() {
|
|
@@ -21,7 +20,22 @@ export function resolveInstallTarget(targetLabel) {
|
|
|
21
20
|
}
|
|
22
21
|
return definition;
|
|
23
22
|
}
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
function resolveCodexInstallRoots(homeDir, config) {
|
|
24
|
+
const rootTemplates = readInstallRootTemplatesFromConfigValue('codex', config);
|
|
25
|
+
return resolveInstallRootTemplates(homeDir, rootTemplates);
|
|
26
|
+
}
|
|
27
|
+
export function resolveInstallTargetRoots(homeDir, target, config) {
|
|
28
|
+
if (target.key === 'codex') {
|
|
29
|
+
return resolveCodexInstallRoots(homeDir, config);
|
|
30
|
+
}
|
|
31
|
+
return resolveInstallRootTemplates(homeDir, getBuiltInInstallRootTemplates(target.key));
|
|
32
|
+
}
|
|
33
|
+
export function defaultOutputPath(homeDir, skillName, target, config) {
|
|
34
|
+
const roots = resolveInstallTargetRoots(homeDir, target, config);
|
|
35
|
+
const primaryRoot = roots[0];
|
|
36
|
+
if (!primaryRoot) {
|
|
37
|
+
throw new Error(`Install target roots are required: ${target.key}`);
|
|
38
|
+
}
|
|
39
|
+
return join(primaryRoot, skillName, 'SKILL.md');
|
|
26
40
|
}
|
|
27
41
|
//# sourceMappingURL=targets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../../../src/cli/install-skill/targets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../../../src/cli/install-skill/targets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,8BAA8B,EAC9B,uCAAuC,EACvC,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AAQzC,MAAM,eAAe,GAAuC;IAC1D;QACE,GAAG,EAAE,IAAI;QACT,KAAK,EAAE,aAAa;KACrB;IACD;QACE,GAAG,EAAE,OAAO;QACZ,KAAK,EAAE,OAAO;KACf;CACF,CAAC;AAEF,MAAM,UAAU,kBAAkB;IAChC,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC;IACtF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe,EAAE,MAAsB;IACvE,MAAM,aAAa,GAAG,uCAAuC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/E,OAAO,2BAA2B,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,OAAe,EACf,MAA+B,EAC/B,MAAsB;IAEtB,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,wBAAwB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,2BAA2B,CAAC,OAAO,EAAE,8BAA8B,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,SAAiB,EACjB,MAA+B,EAC/B,MAAsB;IAEtB,MAAM,KAAK,GAAG,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ExpandedInstructionIncludes {
|
|
2
|
+
readonly body: string;
|
|
3
|
+
readonly sourcePaths: readonly string[];
|
|
4
|
+
}
|
|
5
|
+
export declare function expandInstructionIncludes(params: {
|
|
6
|
+
body: string;
|
|
7
|
+
partialDirs: readonly string[];
|
|
8
|
+
repertoireDirs?: readonly string[];
|
|
9
|
+
allowedRoots: readonly string[];
|
|
10
|
+
}): ExpandedInstructionIncludes;
|
|
11
|
+
//# sourceMappingURL=instruction-includes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruction-includes.d.ts","sourceRoot":"","sources":["../../src/cli/instruction-includes.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAuJD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC,GAAG,2BAA2B,CAQ9B"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { existsSync, readFileSync } 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 { INSTRUCTION_PARTIALS_FACET_DIR } from '../instruction-partial-paths.js';
|
|
6
|
+
const INCLUDE_TOKEN_PATTERN = /\{\{\s*include\s*:\s*([^}]*)\}\}/gu;
|
|
7
|
+
const INSTRUCTION_INCLUDE_REF_PATTERN = /^instructions\/([A-Za-z0-9._-]+)$/u;
|
|
8
|
+
const INSTRUCTION_INCLUDE_SCOPE_REF_PATTERN = /^instructions\/(@[^/]+\/[^/]+\/[^/]+)$/u;
|
|
9
|
+
function parseInstructionIncludeRef(rawRef) {
|
|
10
|
+
const ref = rawRef.trim();
|
|
11
|
+
if (ref.length === 0) {
|
|
12
|
+
throw new Error('Invalid instruction include: missing include name');
|
|
13
|
+
}
|
|
14
|
+
const scopeMatch = INSTRUCTION_INCLUDE_SCOPE_REF_PATTERN.exec(ref);
|
|
15
|
+
if (scopeMatch) {
|
|
16
|
+
const scopeRef = scopeMatch[1];
|
|
17
|
+
if (scopeRef === undefined) {
|
|
18
|
+
throw new Error(`Invalid instruction include "${ref}": missing scope reference`);
|
|
19
|
+
}
|
|
20
|
+
return { ref, name: scopeRef };
|
|
21
|
+
}
|
|
22
|
+
const match = INSTRUCTION_INCLUDE_REF_PATTERN.exec(ref);
|
|
23
|
+
if (!match) {
|
|
24
|
+
throw new Error(`Invalid instruction include "${ref}": expected {{include:instructions/<name>}}`);
|
|
25
|
+
}
|
|
26
|
+
const name = match[1];
|
|
27
|
+
if (name === undefined) {
|
|
28
|
+
throw new Error(`Invalid instruction include "${ref}": missing include name`);
|
|
29
|
+
}
|
|
30
|
+
return { ref, name };
|
|
31
|
+
}
|
|
32
|
+
function resolveScopedInstructionPartial(params) {
|
|
33
|
+
const parsed = parseScopeRef(params.scopeRef);
|
|
34
|
+
const candidatePaths = params.repertoireDirs.map(repertoireDir => resolveScopeRef(parsed, INSTRUCTION_PARTIALS_FACET_DIR, repertoireDir));
|
|
35
|
+
const candidatePath = candidatePaths.find(path => existsSync(path));
|
|
36
|
+
if (!candidatePath) {
|
|
37
|
+
throw new Error(`Missing instruction include "${params.ref}": ${candidatePaths.join(', ')}`);
|
|
38
|
+
}
|
|
39
|
+
const boundedPath = ensurePathWithinRoots(candidatePath, params.allowedRoots, `instruction include "${params.ref}"`);
|
|
40
|
+
return {
|
|
41
|
+
ref: params.ref,
|
|
42
|
+
body: readFileSync(boundedPath, 'utf-8'),
|
|
43
|
+
path: boundedPath,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function resolveInstructionPartial(params) {
|
|
47
|
+
if (isScopeRef(params.name)) {
|
|
48
|
+
return resolveScopedInstructionPartial({
|
|
49
|
+
ref: params.ref,
|
|
50
|
+
scopeRef: params.name,
|
|
51
|
+
repertoireDirs: params.repertoireDirs,
|
|
52
|
+
allowedRoots: params.allowedRoots,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const candidatePaths = params.partialDirs.map(partialDir => join(partialDir, `${params.name}.md`));
|
|
56
|
+
for (const candidatePath of candidatePaths) {
|
|
57
|
+
if (!existsSync(candidatePath)) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const boundedPath = ensurePathWithinRoots(candidatePath, params.allowedRoots, `instruction include "${params.ref}"`);
|
|
61
|
+
return {
|
|
62
|
+
ref: params.ref,
|
|
63
|
+
body: readFileSync(boundedPath, 'utf-8'),
|
|
64
|
+
path: boundedPath,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
throw new Error(`Missing instruction include "${params.ref}": ${candidatePaths.join(', ')}`);
|
|
68
|
+
}
|
|
69
|
+
function collectIncludeTokens(body) {
|
|
70
|
+
return Array.from(body.matchAll(INCLUDE_TOKEN_PATTERN), match => {
|
|
71
|
+
const token = match[0];
|
|
72
|
+
const rawRef = match[1];
|
|
73
|
+
const index = match.index;
|
|
74
|
+
if (rawRef === undefined || index === undefined) {
|
|
75
|
+
throw new Error(`Invalid instruction include token: ${token}`);
|
|
76
|
+
}
|
|
77
|
+
return { token, rawRef, index };
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function requireNonCyclicInclude(partial, stack) {
|
|
81
|
+
const cycleStart = stack.findIndex(frame => frame.path === partial.path);
|
|
82
|
+
if (cycleStart < 0) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const chain = stack
|
|
86
|
+
.slice(cycleStart)
|
|
87
|
+
.map(frame => frame.ref)
|
|
88
|
+
.concat(partial.ref);
|
|
89
|
+
throw new Error(`Cyclic instruction include: ${chain.join(' -> ')}`);
|
|
90
|
+
}
|
|
91
|
+
function expandBody(params) {
|
|
92
|
+
const initial = { body: '', sourcePaths: [], cursor: 0 };
|
|
93
|
+
const expanded = collectIncludeTokens(params.body).reduce((accumulator, includeToken) => {
|
|
94
|
+
const { ref, name } = parseInstructionIncludeRef(includeToken.rawRef);
|
|
95
|
+
const partial = resolveInstructionPartial({
|
|
96
|
+
ref,
|
|
97
|
+
name,
|
|
98
|
+
partialDirs: params.partialDirs,
|
|
99
|
+
repertoireDirs: params.repertoireDirs,
|
|
100
|
+
allowedRoots: params.allowedRoots,
|
|
101
|
+
});
|
|
102
|
+
requireNonCyclicInclude(partial, params.stack);
|
|
103
|
+
const nested = expandBody({
|
|
104
|
+
body: partial.body,
|
|
105
|
+
partialDirs: params.partialDirs,
|
|
106
|
+
repertoireDirs: params.repertoireDirs,
|
|
107
|
+
allowedRoots: params.allowedRoots,
|
|
108
|
+
stack: params.stack.concat({ ref: partial.ref, path: partial.path }),
|
|
109
|
+
});
|
|
110
|
+
return {
|
|
111
|
+
body: `${accumulator.body}${params.body.slice(accumulator.cursor, includeToken.index)}${nested.body}`,
|
|
112
|
+
sourcePaths: [...accumulator.sourcePaths, partial.path, ...nested.sourcePaths],
|
|
113
|
+
cursor: includeToken.index + includeToken.token.length,
|
|
114
|
+
};
|
|
115
|
+
}, initial);
|
|
116
|
+
return {
|
|
117
|
+
body: expanded.body + params.body.slice(expanded.cursor),
|
|
118
|
+
sourcePaths: expanded.sourcePaths,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
export function expandInstructionIncludes(params) {
|
|
122
|
+
return expandBody({
|
|
123
|
+
body: params.body,
|
|
124
|
+
partialDirs: params.partialDirs,
|
|
125
|
+
repertoireDirs: params.repertoireDirs ?? [],
|
|
126
|
+
allowedRoots: params.allowedRoots,
|
|
127
|
+
stack: [],
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=instruction-includes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruction-includes.js","sourceRoot":"","sources":["../../src/cli/instruction-includes.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/path-guard.d.ts
CHANGED
|
@@ -4,10 +4,15 @@ export declare function ensurePathWithinHome(path: string, homeDir: string, labe
|
|
|
4
4
|
homeRealPath: string;
|
|
5
5
|
};
|
|
6
6
|
export declare function ensurePathWithinRoots(path: string, roots: readonly string[], label: string): string;
|
|
7
|
+
export declare function ensurePathWithinAllowedRoots(path: string, roots: readonly string[], label: string): string;
|
|
7
8
|
export declare function ensurePathIsNotSymbolicLink(path: string, label: string): string;
|
|
8
9
|
export declare function ensurePathAncestorsContainNoSymbolicLinks(path: string, label: string, stopAtPath?: string): string;
|
|
9
10
|
export declare function ensurePathAncestorsAndRealPathWithinHome(path: string, homeDir: string, label: string): {
|
|
10
11
|
resolvedPath: string;
|
|
11
12
|
homeRealPath: string;
|
|
12
13
|
};
|
|
14
|
+
export declare function ensurePathAncestorsAndRealPathWithinAllowedRoots(path: string, roots: readonly string[], label: string): {
|
|
15
|
+
resolvedPath: string;
|
|
16
|
+
allowedRootRealPaths: readonly string[];
|
|
17
|
+
};
|
|
13
18
|
//# sourceMappingURL=path-guard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-guard.d.ts","sourceRoot":"","sources":["../../src/cli/path-guard.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAUhD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAqBnG;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAY/E;AAcD,wBAAgB,yCAAyC,CACvD,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAmDR;AAED,wBAAgB,wCAAwC,CACtD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAYhD"}
|
|
1
|
+
{"version":3,"file":"path-guard.d.ts","sourceRoot":"","sources":["../../src/cli/path-guard.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAUhD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAqBnG;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAS1G;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAY/E;AAcD,wBAAgB,yCAAyC,CACvD,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAmDR;AAED,wBAAgB,wCAAwC,CACtD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAYhD;AAED,wBAAgB,gDAAgD,CAC9D,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,GACZ;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAmBnE"}
|
package/dist/cli/path-guard.js
CHANGED
|
@@ -31,6 +31,14 @@ export function ensurePathWithinRoots(path, roots, label) {
|
|
|
31
31
|
}
|
|
32
32
|
throw new Error(`${label} must be inside allowed facets directory: ${realPath}`);
|
|
33
33
|
}
|
|
34
|
+
export function ensurePathWithinAllowedRoots(path, roots, label) {
|
|
35
|
+
const resolvedPath = resolve(path);
|
|
36
|
+
const resolvedRoots = roots.map(root => resolve(root));
|
|
37
|
+
if (!resolvedRoots.some(root => isWithinRoot(resolvedPath, root))) {
|
|
38
|
+
throw new Error(`${label} must be inside allowed roots: ${resolvedPath}`);
|
|
39
|
+
}
|
|
40
|
+
return resolvedPath;
|
|
41
|
+
}
|
|
34
42
|
export function ensurePathIsNotSymbolicLink(path, label) {
|
|
35
43
|
const resolvedPath = resolve(path);
|
|
36
44
|
if (!existsSync(resolvedPath)) {
|
|
@@ -110,4 +118,21 @@ export function ensurePathAncestorsAndRealPathWithinHome(path, homeDir, label) {
|
|
|
110
118
|
}
|
|
111
119
|
return { resolvedPath, homeRealPath };
|
|
112
120
|
}
|
|
121
|
+
export function ensurePathAncestorsAndRealPathWithinAllowedRoots(path, roots, label) {
|
|
122
|
+
const resolvedPath = ensurePathWithinAllowedRoots(path, roots, label);
|
|
123
|
+
const resolvedRoots = roots.map(root => resolve(root));
|
|
124
|
+
const containingRoot = resolvedRoots.find(root => isWithinRoot(resolvedPath, root));
|
|
125
|
+
if (!containingRoot) {
|
|
126
|
+
throw new Error(`${label} must be inside allowed roots: ${resolvedPath}`);
|
|
127
|
+
}
|
|
128
|
+
ensurePathAncestorsContainNoSymbolicLinks(resolvedPath, label, containingRoot);
|
|
129
|
+
const existingAncestor = findNearestExistingAncestor(resolvedPath);
|
|
130
|
+
const ancestorRealPath = realpathSync(existingAncestor);
|
|
131
|
+
const allowedRootRealPaths = resolvedRoots.map(root => (existsSync(root) ? realpathSync(root) : root));
|
|
132
|
+
const containingRootRealPath = existsSync(containingRoot) ? realpathSync(containingRoot) : undefined;
|
|
133
|
+
if (containingRootRealPath && !isWithinRoot(ancestorRealPath, containingRootRealPath)) {
|
|
134
|
+
throw new Error(`${label} must resolve inside allowed roots: ${resolvedPath}`);
|
|
135
|
+
}
|
|
136
|
+
return { resolvedPath, allowedRootRealPaths };
|
|
137
|
+
}
|
|
113
138
|
//# sourceMappingURL=path-guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-guard.js","sourceRoot":"","sources":["../../src/cli/path-guard.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"path-guard.js","sourceRoot":"","sources":["../../src/cli/path-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,8 @@ export declare function getSkillPaths(cwd: string, homeDir: string): {
|
|
|
3
3
|
readonly facetedRoots: readonly string[];
|
|
4
4
|
readonly facetsRoots: readonly string[];
|
|
5
5
|
readonly compositionsDirs: readonly string[];
|
|
6
|
+
readonly localCompositionsDir?: string;
|
|
7
|
+
readonly globalCompositionsDir: string;
|
|
6
8
|
};
|
|
7
9
|
export declare function selectCompositionDefinitionPath(params: {
|
|
8
10
|
options: FacetCliOptions;
|
|
@@ -13,5 +15,11 @@ export declare function selectCompositionDefinitionPath(params: {
|
|
|
13
15
|
}): Promise<{
|
|
14
16
|
definitionPath: string;
|
|
15
17
|
}>;
|
|
18
|
+
export declare function resolveCompositionDefinitionPathByName(params: {
|
|
19
|
+
compositionName: string;
|
|
20
|
+
compositionDefinitionDirs: readonly string[];
|
|
21
|
+
}): {
|
|
22
|
+
definitionPath: string;
|
|
23
|
+
};
|
|
16
24
|
export declare function runInstallSkillCommand(options: FacetCliOptions): Promise<FacetCliResult>;
|
|
17
25
|
//# sourceMappingURL=skill-commands.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-commands.d.ts","sourceRoot":"","sources":["../../src/cli/skill-commands.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIlE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAC3D,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-commands.d.ts","sourceRoot":"","sources":["../../src/cli/skill-commands.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIlE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAC3D,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC,CAoBA;AA+BD,wBAAsB,+BAA+B,CAAC,MAAM,EAAE;IAC5D,OAAO,EAAE,eAAe,CAAC;IACzB,yBAAyB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,YAAY,EAAE,SAAS,GAAG,SAAS,CAAC;CACrC,GAAG,OAAO,CAAC;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAyCtC;AAED,wBAAgB,sCAAsC,CAAC,MAAM,EAAE;IAC7D,eAAe,EAAE,MAAM,CAAC;IACxB,yBAAyB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C,GAAG;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,CAe7B;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAsC9F"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync, realpathSync } from 'node:fs';
|
|
2
2
|
import { dirname, join, resolve, sep } from 'node:path';
|
|
3
3
|
import { loadComposeDefinition } from '../compose-definition.js';
|
|
4
|
-
import { getFacetedRoot } from '../config/index.js';
|
|
4
|
+
import { getFacetedRoot, readFacetedConfigOrDefault } from '../config/index.js';
|
|
5
5
|
import { buildSkillSections, ensureSafeDefinitionName, listCompositionDefinitions, } from './skill-renderer.js';
|
|
6
6
|
import { shouldOverwrite } from './install-skill/flow.js';
|
|
7
7
|
import { runSkillDeployInstall } from './install-skill/modes.js';
|
|
@@ -13,10 +13,16 @@ export function getSkillPaths(cwd, homeDir) {
|
|
|
13
13
|
const facetedRoots = realLocal && realLocal !== realGlobal
|
|
14
14
|
? [localFacetedRoot, globalFacetedRoot]
|
|
15
15
|
: [globalFacetedRoot];
|
|
16
|
+
const localCompositionsDir = facetedRoots.length === 2
|
|
17
|
+
? join(localFacetedRoot, 'compositions')
|
|
18
|
+
: undefined;
|
|
19
|
+
const globalCompositionsDir = join(globalFacetedRoot, 'compositions');
|
|
16
20
|
return {
|
|
17
21
|
facetedRoots,
|
|
18
22
|
facetsRoots: facetedRoots.map(facetedRoot => join(facetedRoot, 'facets')),
|
|
19
23
|
compositionsDirs: facetedRoots.map(facetedRoot => join(facetedRoot, 'compositions')),
|
|
24
|
+
localCompositionsDir,
|
|
25
|
+
globalCompositionsDir,
|
|
20
26
|
};
|
|
21
27
|
}
|
|
22
28
|
function resolveCompositionSource(definitionPath, localCompositionsDir) {
|
|
@@ -67,12 +73,20 @@ export async function selectCompositionDefinitionPath(params) {
|
|
|
67
73
|
}
|
|
68
74
|
return { definitionPath };
|
|
69
75
|
}
|
|
76
|
+
export function resolveCompositionDefinitionPathByName(params) {
|
|
77
|
+
const definitionMap = listCompositionDefinitions(params.compositionDefinitionDirs);
|
|
78
|
+
const definitionPath = definitionMap[params.compositionName];
|
|
79
|
+
if (definitionPath) {
|
|
80
|
+
return { definitionPath };
|
|
81
|
+
}
|
|
82
|
+
const availableNames = Object.keys(definitionMap).sort();
|
|
83
|
+
if (availableNames.length === 0) {
|
|
84
|
+
throw new Error(`No compose definitions found in ${params.compositionDefinitionDirs.join(', ')}`);
|
|
85
|
+
}
|
|
86
|
+
throw new Error(`Unknown compose definition: ${params.compositionName}. Available compositions: ${availableNames.join(', ')}`);
|
|
87
|
+
}
|
|
70
88
|
export async function runInstallSkillCommand(options) {
|
|
71
|
-
const { facetedRoots, facetsRoots, compositionsDirs } = getSkillPaths(options.cwd, options.homeDir);
|
|
72
|
-
const localFacetedRoot = getFacetedRoot(options.cwd);
|
|
73
|
-
const globalFacetedRoot = getFacetedRoot(options.homeDir);
|
|
74
|
-
const localCompositionsDir = existsSync(localFacetedRoot) ? join(localFacetedRoot, 'compositions') : undefined;
|
|
75
|
-
const globalCompositionsDir = join(globalFacetedRoot, 'compositions');
|
|
89
|
+
const { facetedRoots, facetsRoots, compositionsDirs, localCompositionsDir, globalCompositionsDir, } = getSkillPaths(options.cwd, options.homeDir);
|
|
76
90
|
const { definitionPath } = await selectCompositionDefinitionPath({
|
|
77
91
|
options,
|
|
78
92
|
compositionDefinitionDirs: compositionsDirs,
|
|
@@ -83,9 +97,11 @@ export async function runInstallSkillCommand(options) {
|
|
|
83
97
|
const definition = await loadComposeDefinition(definitionPath);
|
|
84
98
|
const safeSkillName = ensureSafeDefinitionName(definition.name);
|
|
85
99
|
const definitionDir = dirname(definitionPath);
|
|
100
|
+
const config = await readFacetedConfigOrDefault(options.homeDir);
|
|
86
101
|
const sections = buildSkillSections({
|
|
87
102
|
definition,
|
|
88
103
|
definitionDir,
|
|
104
|
+
facetedRoots,
|
|
89
105
|
facetsRoots,
|
|
90
106
|
});
|
|
91
107
|
return (await runSkillDeployInstall({
|
|
@@ -93,6 +109,7 @@ export async function runInstallSkillCommand(options) {
|
|
|
93
109
|
facetedRoots,
|
|
94
110
|
definitionDir,
|
|
95
111
|
facetsRoots,
|
|
112
|
+
config,
|
|
96
113
|
safeSkillName,
|
|
97
114
|
definition,
|
|
98
115
|
sections,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-commands.js","sourceRoot":"","sources":["../../src/cli/skill-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-commands.js","sourceRoot":"","sources":["../../src/cli/skill-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ComposeDefinition } from '../types.js';
|
|
2
|
+
import type { SkillDocumentInput } from './skill-types.js';
|
|
3
|
+
export declare function renderSkillFrontmatter(definition: ComposeDefinition): string;
|
|
4
|
+
export declare function hasYamlFrontmatter(content: string): boolean;
|
|
5
|
+
export declare function renderSkillDocument(input: SkillDocumentInput): string;
|
|
6
|
+
//# sourceMappingURL=skill-document-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-document-renderer.d.ts","sourceRoot":"","sources":["../../src/cli/skill-document-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AACxE,OAAO,KAAK,EAGV,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAW1B,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,iBAAiB,GAAG,MAAM,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3D;AAuDD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAerE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { DEFAULT_USER_MESSAGE_ORDER } from '../types.js';
|
|
2
|
+
function makeSkillHeader(definition) {
|
|
3
|
+
return [
|
|
4
|
+
'---',
|
|
5
|
+
`name: ${definition.name}`,
|
|
6
|
+
...(definition.description ? [`description: ${definition.description}`] : []),
|
|
7
|
+
'---',
|
|
8
|
+
].join('\n');
|
|
9
|
+
}
|
|
10
|
+
export function renderSkillFrontmatter(definition) {
|
|
11
|
+
return `${makeSkillHeader(definition)}\n`;
|
|
12
|
+
}
|
|
13
|
+
export function hasYamlFrontmatter(content) {
|
|
14
|
+
return /^---\n[\s\S]*?\n---(?:\n|$)/u.test(content);
|
|
15
|
+
}
|
|
16
|
+
function hasInstructionPath(instruction) {
|
|
17
|
+
return instruction.ref !== 'literal';
|
|
18
|
+
}
|
|
19
|
+
function renderSkillSection(title, sections, mode) {
|
|
20
|
+
if (sections.length === 0) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
return [
|
|
24
|
+
`## ${title}`,
|
|
25
|
+
'',
|
|
26
|
+
...sections.flatMap(section => [
|
|
27
|
+
`### ${section.ref}`,
|
|
28
|
+
'',
|
|
29
|
+
mode === 'inline' ? section.body : section.path,
|
|
30
|
+
'',
|
|
31
|
+
]),
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
function renderInstructions(instructions, mode) {
|
|
35
|
+
if (instructions.length === 0) {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
return [
|
|
39
|
+
'## Instructions',
|
|
40
|
+
'',
|
|
41
|
+
...instructions.flatMap(instruction => (mode === 'reference' && hasInstructionPath(instruction)
|
|
42
|
+
? [`### ${instruction.ref}`, '', instruction.path, '']
|
|
43
|
+
: [instruction.body, ''])),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
function renderOrderedSection(input, entry) {
|
|
47
|
+
if (entry === 'knowledge') {
|
|
48
|
+
return renderSkillSection('Knowledge', input.knowledge, input.mode);
|
|
49
|
+
}
|
|
50
|
+
if (entry === 'instructions') {
|
|
51
|
+
return renderInstructions(input.instructions, input.mode);
|
|
52
|
+
}
|
|
53
|
+
if (entry === 'output-contracts') {
|
|
54
|
+
return renderSkillSection('Output Contracts', input.outputContracts, input.mode);
|
|
55
|
+
}
|
|
56
|
+
return renderSkillSection('Policies', input.policies, input.mode);
|
|
57
|
+
}
|
|
58
|
+
export function renderSkillDocument(input) {
|
|
59
|
+
const sectionOrder = input.definition.order ?? DEFAULT_USER_MESSAGE_ORDER;
|
|
60
|
+
const lines = [
|
|
61
|
+
makeSkillHeader(input.definition),
|
|
62
|
+
'',
|
|
63
|
+
'<!-- Generated by faceted-prompting. Do not edit manually. -->',
|
|
64
|
+
'',
|
|
65
|
+
'## Persona',
|
|
66
|
+
'',
|
|
67
|
+
input.mode === 'inline' ? input.persona.body : input.persona.path,
|
|
68
|
+
'',
|
|
69
|
+
...sectionOrder.flatMap(entry => renderOrderedSection(input, entry)),
|
|
70
|
+
];
|
|
71
|
+
return `${lines.join('\n').trimEnd()}\n`;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=skill-document-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-document-renderer.js","sourceRoot":"","sources":["../../src/cli/skill-document-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
export declare function writeSkillFile(outputPath: string, content: string,
|
|
2
|
-
export declare function removeSkillFile(outputPath: string, homeDir: string): void;
|
|
1
|
+
export declare function writeSkillFile(outputPath: string, content: string, allowedRoots: readonly string[]): void;
|
|
3
2
|
//# sourceMappingURL=skill-file-ops.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-file-ops.d.ts","sourceRoot":"","sources":["../../src/cli/skill-file-ops.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skill-file-ops.d.ts","sourceRoot":"","sources":["../../src/cli/skill-file-ops.ts"],"names":[],"mappings":"AA8DA,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CA8BzG"}
|
|
@@ -1,30 +1,23 @@
|
|
|
1
|
-
import { closeSync, constants, existsSync, lstatSync, mkdirSync, openSync, realpathSync, renameSync,
|
|
1
|
+
import { closeSync, constants, existsSync, lstatSync, mkdirSync, openSync, realpathSync, renameSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
2
2
|
import { basename, dirname, join } from 'node:path';
|
|
3
|
-
import {
|
|
4
|
-
function
|
|
3
|
+
import { ensurePathAncestorsAndRealPathWithinAllowedRoots, isWithinRoot, } from './path-guard.js';
|
|
4
|
+
function ensureParentPathWithinAllowedRoots(resolvedPath, allowedRootRealPaths) {
|
|
5
5
|
const outputParentDirectory = dirname(resolvedPath);
|
|
6
6
|
mkdirSync(outputParentDirectory, { recursive: true });
|
|
7
7
|
const outputParentRealPath = realpathSync(outputParentDirectory);
|
|
8
|
-
if (!isWithinRoot(outputParentRealPath,
|
|
9
|
-
throw new Error(`Skill output path escapes
|
|
8
|
+
if (!allowedRootRealPaths.some(root => isWithinRoot(outputParentRealPath, root))) {
|
|
9
|
+
throw new Error(`Skill output path escapes allowed roots: ${resolvedPath}`);
|
|
10
10
|
}
|
|
11
11
|
return outputParentRealPath;
|
|
12
12
|
}
|
|
13
13
|
function buildTemporaryPath(targetPath, parentRealPath) {
|
|
14
14
|
return join(parentRealPath, `.${basename(targetPath)}.${process.pid}.${Date.now()}.tmp`);
|
|
15
15
|
}
|
|
16
|
-
function resolveOutputTargetPathForWrite(resolvedPath,
|
|
17
|
-
const outputParentRealPath =
|
|
16
|
+
function resolveOutputTargetPathForWrite(resolvedPath, allowedRootRealPaths) {
|
|
17
|
+
const outputParentRealPath = ensureParentPathWithinAllowedRoots(resolvedPath, allowedRootRealPaths);
|
|
18
18
|
const outputTargetPath = join(outputParentRealPath, basename(resolvedPath));
|
|
19
19
|
return { outputParentRealPath, outputTargetPath };
|
|
20
20
|
}
|
|
21
|
-
function resolveOutputTargetPathForRemoval(resolvedPath, homeRealPath) {
|
|
22
|
-
const outputParentRealPath = realpathSync(dirname(resolvedPath));
|
|
23
|
-
if (!isWithinRoot(outputParentRealPath, homeRealPath)) {
|
|
24
|
-
throw new Error(`Skill output path escapes home directory: ${resolvedPath}`);
|
|
25
|
-
}
|
|
26
|
-
return join(outputParentRealPath, basename(resolvedPath));
|
|
27
|
-
}
|
|
28
21
|
function writeFreshFile(path, content) {
|
|
29
22
|
const openFlags = constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW;
|
|
30
23
|
let fileDescriptor;
|
|
@@ -45,9 +38,9 @@ function writeFreshFile(path, content) {
|
|
|
45
38
|
closeSync(fileDescriptor);
|
|
46
39
|
}
|
|
47
40
|
}
|
|
48
|
-
export function writeSkillFile(outputPath, content,
|
|
49
|
-
const { resolvedPath,
|
|
50
|
-
const { outputParentRealPath, outputTargetPath } = resolveOutputTargetPathForWrite(resolvedPath,
|
|
41
|
+
export function writeSkillFile(outputPath, content, allowedRoots) {
|
|
42
|
+
const { resolvedPath, allowedRootRealPaths } = ensurePathAncestorsAndRealPathWithinAllowedRoots(outputPath, allowedRoots, 'Skill output path');
|
|
43
|
+
const { outputParentRealPath, outputTargetPath } = resolveOutputTargetPathForWrite(resolvedPath, allowedRootRealPaths);
|
|
51
44
|
const tempOutputPath = buildTemporaryPath(outputTargetPath, outputParentRealPath);
|
|
52
45
|
try {
|
|
53
46
|
if (existsSync(outputTargetPath) && lstatSync(outputTargetPath).isSymbolicLink()) {
|
|
@@ -63,27 +56,8 @@ export function writeSkillFile(outputPath, content, homeDir) {
|
|
|
63
56
|
throw error;
|
|
64
57
|
}
|
|
65
58
|
const outputRealPath = realpathSync(outputTargetPath);
|
|
66
|
-
if (!isWithinRoot(outputRealPath,
|
|
67
|
-
throw new Error(`Skill output path escapes
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
export function removeSkillFile(outputPath, homeDir) {
|
|
71
|
-
const { resolvedPath, homeRealPath } = ensurePathWithinHome(outputPath, homeDir, 'Skill output path');
|
|
72
|
-
if (!existsSync(resolvedPath)) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
const outputTargetPath = resolveOutputTargetPathForRemoval(resolvedPath, homeRealPath);
|
|
76
|
-
const fileStat = lstatSync(outputTargetPath);
|
|
77
|
-
if (fileStat.isSymbolicLink()) {
|
|
78
|
-
throw new Error(`Symbolic links are not allowed for skill output file: ${resolvedPath}`);
|
|
79
|
-
}
|
|
80
|
-
const fileRealPath = realpathSync(outputTargetPath);
|
|
81
|
-
if (!isWithinRoot(fileRealPath, homeRealPath)) {
|
|
82
|
-
throw new Error(`Skill output path escapes home directory: ${resolvedPath}`);
|
|
59
|
+
if (!allowedRootRealPaths.some(root => isWithinRoot(outputRealPath, root))) {
|
|
60
|
+
throw new Error(`Skill output path escapes allowed roots: ${resolvedPath}`);
|
|
83
61
|
}
|
|
84
|
-
const outputParentRealPath = ensureParentPathWithinHome(outputTargetPath, homeRealPath);
|
|
85
|
-
const quarantinePath = join(outputParentRealPath, `.${basename(outputTargetPath)}.${process.pid}.${Date.now()}.delete`);
|
|
86
|
-
renameSync(outputTargetPath, quarantinePath);
|
|
87
|
-
rmSync(quarantinePath, { force: true });
|
|
88
62
|
}
|
|
89
63
|
//# sourceMappingURL=skill-file-ops.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-file-ops.js","sourceRoot":"","sources":["../../src/cli/skill-file-ops.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,
|
|
1
|
+
{"version":3,"file":"skill-file-ops.js","sourceRoot":"","sources":["../../src/cli/skill-file-ops.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EACL,gDAAgD,EAChD,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,SAAS,kCAAkC,CAAC,YAAoB,EAAE,oBAAuC;IACvG,MAAM,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACpD,SAAS,CAAC,qBAAqB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,oBAAoB,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;IACjE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,4CAA4C,YAAY,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB,EAAE,cAAsB;IACpE,OAAO,IAAI,CAAC,cAAc,EAAE,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,+BAA+B,CACtC,YAAoB,EACpB,oBAAuC;IAEvC,MAAM,oBAAoB,GAAG,kCAAkC,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC;IACpG,MAAM,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IAC5E,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,OAAe;IACnD,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC;IAEnG,IAAI,cAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,cAAc,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACpD,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,yDAAyD,IAAI,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,aAAa,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,cAAc,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,OAAe,EAAE,YAA+B;IACjG,MAAM,EAAE,YAAY,EAAE,oBAAoB,EAAE,GAAG,gDAAgD,CAC7F,UAAU,EACV,YAAY,EACZ,mBAAmB,CACpB,CAAC;IACF,MAAM,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,GAAG,+BAA+B,CAChF,YAAY,EACZ,oBAAoB,CACrB,CAAC;IACF,MAAM,cAAc,GAAG,kBAAkB,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;IAElF,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,gBAAgB,CAAC,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;YACjF,MAAM,IAAI,KAAK,CAAC,yDAAyD,YAAY,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,cAAc,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACxC,UAAU,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAC/B,UAAU,CAAC,cAAc,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,cAAc,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;IACtD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,4CAA4C,YAAY,EAAE,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
|