faceted-prompting 0.0.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +208 -2
  3. package/bin/facet +2 -0
  4. package/dist/cli/compose-context.d.ts +8 -0
  5. package/dist/cli/compose-context.d.ts.map +1 -0
  6. package/dist/cli/compose-context.js +194 -0
  7. package/dist/cli/compose-context.js.map +1 -0
  8. package/dist/cli/index.d.ts +3 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +144 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/cli/install-skill/facets.d.ts +28 -0
  13. package/dist/cli/install-skill/facets.d.ts.map +1 -0
  14. package/dist/cli/install-skill/facets.js +160 -0
  15. package/dist/cli/install-skill/facets.js.map +1 -0
  16. package/dist/cli/install-skill/flow.d.ts +13 -0
  17. package/dist/cli/install-skill/flow.d.ts.map +1 -0
  18. package/dist/cli/install-skill/flow.js +63 -0
  19. package/dist/cli/install-skill/flow.js.map +1 -0
  20. package/dist/cli/install-skill/modes.d.ts +27 -0
  21. package/dist/cli/install-skill/modes.d.ts.map +1 -0
  22. package/dist/cli/install-skill/modes.js +130 -0
  23. package/dist/cli/install-skill/modes.js.map +1 -0
  24. package/dist/cli/install-skill/targets.d.ts +10 -0
  25. package/dist/cli/install-skill/targets.d.ts.map +1 -0
  26. package/dist/cli/install-skill/targets.js +27 -0
  27. package/dist/cli/install-skill/targets.js.map +1 -0
  28. package/dist/cli/path-guard.d.ts +12 -0
  29. package/dist/cli/path-guard.d.ts.map +1 -0
  30. package/dist/cli/path-guard.js +81 -0
  31. package/dist/cli/path-guard.js.map +1 -0
  32. package/dist/cli/runner.d.ts +10 -0
  33. package/dist/cli/runner.d.ts.map +1 -0
  34. package/dist/cli/runner.js +66 -0
  35. package/dist/cli/runner.js.map +1 -0
  36. package/dist/cli/select.d.ts +7 -0
  37. package/dist/cli/select.d.ts.map +1 -0
  38. package/dist/cli/select.js +70 -0
  39. package/dist/cli/select.js.map +1 -0
  40. package/dist/cli/skill-commands.d.ts +8 -0
  41. package/dist/cli/skill-commands.d.ts.map +1 -0
  42. package/dist/cli/skill-commands.js +44 -0
  43. package/dist/cli/skill-commands.js.map +1 -0
  44. package/dist/cli/skill-file-ops.d.ts +3 -0
  45. package/dist/cli/skill-file-ops.d.ts.map +1 -0
  46. package/dist/cli/skill-file-ops.js +89 -0
  47. package/dist/cli/skill-file-ops.js.map +1 -0
  48. package/dist/cli/skill-renderer.d.ts +24 -0
  49. package/dist/cli/skill-renderer.d.ts.map +1 -0
  50. package/dist/cli/skill-renderer.js +194 -0
  51. package/dist/cli/skill-renderer.js.map +1 -0
  52. package/dist/cli/skill-types.d.ts +31 -0
  53. package/dist/cli/skill-types.d.ts.map +1 -0
  54. package/dist/cli/skill-types.js +2 -0
  55. package/dist/cli/skill-types.js.map +1 -0
  56. package/dist/cli/types.d.ts +17 -0
  57. package/dist/cli/types.d.ts.map +1 -0
  58. package/dist/cli/types.js +2 -0
  59. package/dist/cli/types.js.map +1 -0
  60. package/dist/compose-definition.d.ts +3 -0
  61. package/dist/compose-definition.d.ts.map +1 -0
  62. package/dist/compose-definition.js +99 -0
  63. package/dist/compose-definition.js.map +1 -0
  64. package/dist/compose.d.ts +18 -0
  65. package/dist/compose.d.ts.map +1 -0
  66. package/dist/compose.js +51 -0
  67. package/dist/compose.js.map +1 -0
  68. package/dist/config/index.d.ts +9 -0
  69. package/dist/config/index.d.ts.map +1 -0
  70. package/dist/config/index.js +82 -0
  71. package/dist/config/index.js.map +1 -0
  72. package/dist/data-engine.d.ts +49 -0
  73. package/dist/data-engine.d.ts.map +1 -0
  74. package/dist/data-engine.js +85 -0
  75. package/dist/data-engine.js.map +1 -0
  76. package/dist/escape.d.ts +14 -0
  77. package/dist/escape.d.ts.map +1 -0
  78. package/dist/escape.js +16 -0
  79. package/dist/escape.js.map +1 -0
  80. package/dist/index.d.ts +19 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +19 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/init/index.d.ts +17 -0
  85. package/dist/init/index.d.ts.map +1 -0
  86. package/dist/init/index.js +197 -0
  87. package/dist/init/index.js.map +1 -0
  88. package/dist/output/index.d.ts +10 -0
  89. package/dist/output/index.d.ts.map +1 -0
  90. package/dist/output/index.js +67 -0
  91. package/dist/output/index.js.map +1 -0
  92. package/dist/prompt-payload.d.ts +8 -0
  93. package/dist/prompt-payload.d.ts.map +1 -0
  94. package/dist/prompt-payload.js +24 -0
  95. package/dist/prompt-payload.js.map +1 -0
  96. package/dist/resolve.d.ts +73 -0
  97. package/dist/resolve.d.ts.map +1 -0
  98. package/dist/resolve.js +160 -0
  99. package/dist/resolve.js.map +1 -0
  100. package/dist/scope.d.ts +47 -0
  101. package/dist/scope.d.ts.map +1 -0
  102. package/dist/scope.js +69 -0
  103. package/dist/scope.js.map +1 -0
  104. package/dist/template.d.ts +27 -0
  105. package/dist/template.d.ts.map +1 -0
  106. package/dist/template.js +49 -0
  107. package/dist/template.js.map +1 -0
  108. package/dist/truncation.d.ts +36 -0
  109. package/dist/truncation.d.ts.map +1 -0
  110. package/dist/truncation.js +63 -0
  111. package/dist/truncation.js.map +1 -0
  112. package/dist/types.d.ts +70 -0
  113. package/dist/types.d.ts.map +1 -0
  114. package/dist/types.js +10 -0
  115. package/dist/types.js.map +1 -0
  116. package/package.json +49 -6
@@ -0,0 +1,160 @@
1
+ import { basename, join } from 'node:path';
2
+ import { copyFileSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
3
+ const FACET_TOKEN_PATTERN = /{{facet:(persona|knowledges|policies|instructions)}}/g;
4
+ const FACET_TOKEN_TEST = /{{facet:(persona|knowledges|policies|instructions)}}/;
5
+ function requireFacetPathCount(params) {
6
+ if (params.expected !== params.actual) {
7
+ throw new Error(`Copied ${params.label} facet count mismatch: expected ${params.expected}, received ${params.actual}`);
8
+ }
9
+ }
10
+ function requireFacetPathAtIndex(params) {
11
+ const path = params.paths[params.index];
12
+ if (path === undefined) {
13
+ throw new Error(`Missing copied ${params.label} facet path at index ${params.index}`);
14
+ }
15
+ return path;
16
+ }
17
+ function normalizeInstructionBody(body) {
18
+ return body.endsWith('\n') ? body : `${body}\n`;
19
+ }
20
+ export function buildInlineFacetTokenValues(sections) {
21
+ return {
22
+ persona: sections.persona.body,
23
+ knowledges: sections.knowledge.map(knowledge => knowledge.body).join('\n'),
24
+ policies: sections.policies.map(policy => policy.body).join('\n'),
25
+ instructions: sections.instruction ? sections.instruction.body : '',
26
+ };
27
+ }
28
+ function replaceFacetTokens(content, values) {
29
+ return content.replaceAll(FACET_TOKEN_PATTERN, (_match, token) => {
30
+ return values[token];
31
+ });
32
+ }
33
+ export function buildSectionsWithCopiedPaths(sections, facets) {
34
+ requireFacetPathCount({
35
+ label: 'knowledge',
36
+ expected: sections.knowledge.length,
37
+ actual: facets.knowledges.length,
38
+ });
39
+ requireFacetPathCount({
40
+ label: 'policy',
41
+ expected: sections.policies.length,
42
+ actual: facets.policies.length,
43
+ });
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
+ return {
52
+ ...sections,
53
+ persona: {
54
+ ...sections.persona,
55
+ path: facets.persona,
56
+ },
57
+ knowledge: sections.knowledge.map((knowledge, index) => ({
58
+ ...knowledge,
59
+ path: requireFacetPathAtIndex({
60
+ label: 'knowledge',
61
+ paths: facets.knowledges,
62
+ index,
63
+ }),
64
+ })),
65
+ policies: sections.policies.map((policy, index) => ({
66
+ ...policy,
67
+ path: requireFacetPathAtIndex({
68
+ label: 'policy',
69
+ paths: facets.policies,
70
+ index,
71
+ }),
72
+ })),
73
+ instruction,
74
+ };
75
+ }
76
+ export function copyFacetFiles(params) {
77
+ const facetsDir = join(params.targetDir, 'facets');
78
+ const personaDir = join(facetsDir, 'persona');
79
+ const knowledgeDir = join(facetsDir, 'knowledge');
80
+ const policiesDir = join(facetsDir, 'policies');
81
+ const instructionsDir = join(facetsDir, 'instructions');
82
+ mkdirSync(personaDir, { recursive: true });
83
+ mkdirSync(knowledgeDir, { recursive: true });
84
+ mkdirSync(policiesDir, { recursive: true });
85
+ const sourcePersonaPath = params.copyFiles.persona[0];
86
+ if (!sourcePersonaPath) {
87
+ throw new Error('Missing persona copy file path');
88
+ }
89
+ const personaPath = join(personaDir, basename(sourcePersonaPath));
90
+ copyFileSync(sourcePersonaPath, personaPath);
91
+ const knowledgePaths = params.copyFiles.knowledge.map(path => {
92
+ const targetPath = join(knowledgeDir, basename(path));
93
+ copyFileSync(path, targetPath);
94
+ return targetPath;
95
+ });
96
+ const policyPaths = params.copyFiles.policies.map(path => {
97
+ const targetPath = join(policiesDir, basename(path));
98
+ copyFileSync(path, targetPath);
99
+ return targetPath;
100
+ });
101
+ let instructionPath;
102
+ const sourceInstructionPath = params.copyFiles.instructions[0];
103
+ if (sourceInstructionPath || params.literalInstructionBody) {
104
+ mkdirSync(instructionsDir, { recursive: true });
105
+ if (sourceInstructionPath) {
106
+ instructionPath = join(instructionsDir, basename(sourceInstructionPath));
107
+ copyFileSync(sourceInstructionPath, instructionPath);
108
+ }
109
+ else {
110
+ instructionPath = join(instructionsDir, `${params.safeSkillName}.md`);
111
+ writeFileSync(instructionPath, normalizeInstructionBody(params.literalInstructionBody ?? ''), 'utf-8');
112
+ }
113
+ }
114
+ return {
115
+ persona: personaPath,
116
+ knowledges: knowledgePaths,
117
+ policies: policyPaths,
118
+ instructions: instructionPath,
119
+ };
120
+ }
121
+ export function applyFacetTokensToPath(params) {
122
+ const { rootDir, maxDepth, tokenValues, excludeDirs } = params;
123
+ const visit = (currentDir, depth) => {
124
+ for (const entry of readdirSync(currentDir, { withFileTypes: true })) {
125
+ if (entry.isSymbolicLink()) {
126
+ continue;
127
+ }
128
+ const entryPath = join(currentDir, entry.name);
129
+ if (entry.isDirectory()) {
130
+ if (currentDir === rootDir && excludeDirs.includes(entry.name)) {
131
+ continue;
132
+ }
133
+ if (depth < maxDepth) {
134
+ visit(entryPath, depth + 1);
135
+ }
136
+ continue;
137
+ }
138
+ if (!entry.isFile()) {
139
+ continue;
140
+ }
141
+ const original = readFileSync(entryPath, 'utf-8');
142
+ if (!FACET_TOKEN_TEST.test(original)) {
143
+ continue;
144
+ }
145
+ const replaced = replaceFacetTokens(original, tokenValues);
146
+ if (replaced !== original) {
147
+ writeFileSync(entryPath, replaced, 'utf-8');
148
+ }
149
+ }
150
+ };
151
+ visit(rootDir, 0);
152
+ }
153
+ export function parseScanDepth(rawDepth) {
154
+ const parsed = Number.parseInt(rawDepth, 10);
155
+ if (!Number.isFinite(parsed) || parsed < 0) {
156
+ throw new Error(`Invalid scan depth: ${rawDepth}`);
157
+ }
158
+ return parsed;
159
+ }
160
+ //# sourceMappingURL=facets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facets.js","sourceRoot":"","sources":["../../../src/cli/install-skill/facets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { FacetCliOptions } from '../types.js';
2
+ export { defaultOutputPath, listInstallTargets, resolveInstallTarget } from './targets.js';
3
+ export declare function shouldOverwrite(answer: string): boolean;
4
+ export declare function ensureTemplateDirectory(facetedRoot: string, templateName: string): string;
5
+ export declare function copyDirectoryTree(sourceDir: string, targetDir: string): void;
6
+ export declare function ensureRegenerationTargetDir(params: {
7
+ targetDir: string;
8
+ options: FacetCliOptions;
9
+ promptLabel: string;
10
+ homeDir?: string;
11
+ }): Promise<void>;
12
+ export declare function ensureDirectoryExists(path: string, label: string): void;
13
+ //# sourceMappingURL=flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/flow.ts"],"names":[],"mappings":"AAcA,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,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAazF;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAoB5E;AAgBD,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,CAkBhB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIvE"}
@@ -0,0 +1,63 @@
1
+ import { copyFileSync, existsSync, lstatSync, mkdirSync, readdirSync, rmSync, } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { ensurePathAncestorsAndRealPathWithinHome, ensurePathAncestorsContainNoSymbolicLinks, ensurePathWithinRoots, } from '../path-guard.js';
4
+ export { defaultOutputPath, listInstallTargets, resolveInstallTarget } from './targets.js';
5
+ export function shouldOverwrite(answer) {
6
+ const normalized = answer.trim().toLowerCase();
7
+ return normalized === 'y' || normalized === 'yes';
8
+ }
9
+ export function ensureTemplateDirectory(facetedRoot, templateName) {
10
+ const templatesRoot = join(facetedRoot, 'templates');
11
+ const templatePath = ensurePathWithinRoots(join(templatesRoot, templateName), [templatesRoot], `template "${templateName}"`);
12
+ if (!lstatSync(templatePath).isDirectory()) {
13
+ throw new Error(`Template path must be a directory: ${templatePath}`);
14
+ }
15
+ return templatePath;
16
+ }
17
+ export function copyDirectoryTree(sourceDir, targetDir) {
18
+ mkdirSync(targetDir, { recursive: true });
19
+ for (const entry of readdirSync(sourceDir, { withFileTypes: true })) {
20
+ if (entry.isSymbolicLink()) {
21
+ throw new Error(`Symbolic links are not allowed in template directory: ${join(sourceDir, entry.name)}`);
22
+ }
23
+ const sourcePath = join(sourceDir, entry.name);
24
+ const targetPath = join(targetDir, entry.name);
25
+ if (entry.isDirectory()) {
26
+ copyDirectoryTree(sourcePath, targetPath);
27
+ continue;
28
+ }
29
+ if (entry.isFile()) {
30
+ copyFileSync(sourcePath, targetPath);
31
+ }
32
+ }
33
+ }
34
+ function ensurePathSafety(params) {
35
+ if (params.homeDir) {
36
+ ensurePathAncestorsAndRealPathWithinHome(params.targetDir, params.homeDir, params.promptLabel);
37
+ return;
38
+ }
39
+ ensurePathAncestorsContainNoSymbolicLinks(params.targetDir, params.promptLabel, params.cwd);
40
+ }
41
+ export async function ensureRegenerationTargetDir(params) {
42
+ const { targetDir, options, promptLabel } = params;
43
+ ensurePathSafety({
44
+ targetDir,
45
+ promptLabel,
46
+ homeDir: params.homeDir,
47
+ cwd: options.cwd,
48
+ });
49
+ if (existsSync(targetDir)) {
50
+ const overwriteAnswer = await options.input(`${promptLabel} exists. Replace? (${targetDir}) [y/N]`, 'n');
51
+ if (!shouldOverwrite(overwriteAnswer)) {
52
+ throw new Error(`${promptLabel} exists and overwrite was cancelled: ${targetDir}`);
53
+ }
54
+ rmSync(targetDir, { recursive: true, force: true });
55
+ }
56
+ mkdirSync(targetDir, { recursive: true });
57
+ }
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
+ //# sourceMappingURL=flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/cli/install-skill/flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { FacetCliOptions, FacetCliResult } from '../types.js';
2
+ import type { SkillSections } from './facets.js';
3
+ import type { ComposeDefinition } from '../../types.js';
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
+ export declare function runSkillDeployInstall(params: {
14
+ options: FacetCliOptions;
15
+ facetedRoot: string;
16
+ definitionDir: string;
17
+ facetsRoot: string;
18
+ safeSkillName: string;
19
+ definition: ComposeDefinition;
20
+ sections: SkillSections;
21
+ }): Promise<{
22
+ result: FacetCliResult;
23
+ mode: 'inline';
24
+ outputPath: string;
25
+ target: InstallTarget;
26
+ }>;
27
+ //# sourceMappingURL=modes.d.ts.map
@@ -0,0 +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;AAgBnE,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,uBAAuB,CAAC,MAAM,EAAE;IACpD,OAAO,EAAE,eAAe,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,aAAa,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,cAAc,CAAC,CA2C1B;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,OAAO,EAAE,eAAe,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,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,CA0FjG"}
@@ -0,0 +1,130 @@
1
+ import { existsSync, lstatSync, readFileSync } from 'node:fs';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { ensurePathWithinHome } from '../path-guard.js';
4
+ import { hasYamlFrontmatter, renderSkillDocument, renderSkillFrontmatter } from '../skill-renderer.js';
5
+ import { writeSkillFile } from '../skill-file-ops.js';
6
+ import { applyFacetTokensToPath, buildInlineFacetTokenValues, copyFacetFiles, parseScanDepth, } from './facets.js';
7
+ import { copyDirectoryTree, defaultOutputPath, ensureDirectoryExists, ensureRegenerationTargetDir, listInstallTargets, ensureTemplateDirectory, resolveInstallTarget, } from './flow.js';
8
+ import { composePromptPayload } from '../../prompt-payload.js';
9
+ function ensureTemplateBackedSkillFrontmatter(params) {
10
+ if (!existsSync(params.outputPath)) {
11
+ return;
12
+ }
13
+ const currentContent = readFileSync(params.outputPath, 'utf-8');
14
+ if (hasYamlFrontmatter(currentContent)) {
15
+ return;
16
+ }
17
+ const contentWithFrontmatter = `${renderSkillFrontmatter(params.definition)}\n${currentContent.trimStart()}`;
18
+ writeSkillFile(params.outputPath, contentWithFrontmatter, params.homeDir);
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
+ const facetPaths = 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
+ export async function runSkillDeployInstall(params) {
58
+ const targetLabel = await params.options.select(listInstallTargets().map(target => target.label), 'Choose install target with Up/Down and Enter:');
59
+ const target = resolveInstallTarget(targetLabel);
60
+ const mode = 'inline';
61
+ const defaultPath = defaultOutputPath(params.options.homeDir, params.safeSkillName, target);
62
+ const outputPath = resolve(await params.options.input('Output path', defaultPath));
63
+ const { resolvedPath: boundedOutputPath } = ensurePathWithinHome(outputPath, params.options.homeDir, 'Skill output path');
64
+ if (existsSync(boundedOutputPath) && lstatSync(boundedOutputPath).isSymbolicLink()) {
65
+ throw new Error(`Symbolic links are not allowed for skill output file: ${boundedOutputPath}`);
66
+ }
67
+ const templateDir = params.definition.template
68
+ ? ensureTemplateDirectory(params.facetedRoot, params.definition.template)
69
+ : undefined;
70
+ const payload = composePromptPayload({
71
+ definition: params.definition,
72
+ definitionDir: params.definitionDir,
73
+ facetsRoot: params.facetsRoot,
74
+ composeOptions: { contextMaxChars: 8000 },
75
+ });
76
+ const targetDir = dirname(boundedOutputPath);
77
+ await ensureRegenerationTargetDir({
78
+ targetDir,
79
+ options: params.options,
80
+ promptLabel: 'Target directory',
81
+ homeDir: params.options.homeDir,
82
+ });
83
+ if (templateDir) {
84
+ copyDirectoryTree(templateDir, targetDir);
85
+ const facetPaths = copyFacetFiles({
86
+ targetDir,
87
+ safeSkillName: params.safeSkillName,
88
+ copyFiles: payload.copyFiles,
89
+ literalInstructionBody: params.sections.instruction && !('path' in params.sections.instruction)
90
+ ? params.sections.instruction.body
91
+ : undefined,
92
+ });
93
+ applyFacetTokensToPath({
94
+ rootDir: targetDir,
95
+ maxDepth: Number.MAX_SAFE_INTEGER,
96
+ tokenValues: buildInlineFacetTokenValues(params.sections),
97
+ excludeDirs: ['facets'],
98
+ });
99
+ ensureTemplateBackedSkillFrontmatter({
100
+ outputPath: boundedOutputPath,
101
+ definition: params.definition,
102
+ homeDir: params.options.homeDir,
103
+ });
104
+ }
105
+ else {
106
+ const copiedFacetPaths = copyFacetFiles({
107
+ targetDir,
108
+ safeSkillName: params.safeSkillName,
109
+ copyFiles: payload.copyFiles,
110
+ literalInstructionBody: params.sections.instruction && !('path' in params.sections.instruction)
111
+ ? params.sections.instruction.body
112
+ : undefined,
113
+ });
114
+ const content = renderSkillDocument({
115
+ ...params.sections,
116
+ mode,
117
+ });
118
+ writeSkillFile(boundedOutputPath, content, params.options.homeDir);
119
+ }
120
+ return {
121
+ result: {
122
+ kind: 'path',
123
+ path: boundedOutputPath,
124
+ },
125
+ mode,
126
+ outputPath: boundedOutputPath,
127
+ target: target.key,
128
+ };
129
+ }
130
+ //# sourceMappingURL=modes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modes.js","sourceRoot":"","sources":["../../../src/cli/install-skill/modes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { InstallTarget } from '../skill-types.js';
2
+ export interface InstallTargetDefinition {
3
+ readonly key: InstallTarget;
4
+ readonly label: string;
5
+ readonly relativeOutputPath: readonly string[];
6
+ }
7
+ export declare function listInstallTargets(): readonly InstallTargetDefinition[];
8
+ export declare function resolveInstallTarget(targetLabel: string): InstallTargetDefinition;
9
+ export declare function defaultOutputPath(homeDir: string, skillName: string, target: InstallTargetDefinition): string;
10
+ //# sourceMappingURL=targets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../../../src/cli/install-skill/targets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD;AAeD,wBAAgB,kBAAkB,IAAI,SAAS,uBAAuB,EAAE,CAEvE;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,uBAAuB,CAMjF;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,uBAAuB,GAC9B,MAAM,CAER"}
@@ -0,0 +1,27 @@
1
+ import { join } from 'node:path';
2
+ const INSTALL_TARGETS = [
3
+ {
4
+ key: 'cc',
5
+ label: 'Claude Code',
6
+ relativeOutputPath: ['.claude', 'skills'],
7
+ },
8
+ {
9
+ key: 'codex',
10
+ label: 'Codex',
11
+ relativeOutputPath: ['.codex', 'skills'],
12
+ },
13
+ ];
14
+ export function listInstallTargets() {
15
+ return INSTALL_TARGETS;
16
+ }
17
+ export function resolveInstallTarget(targetLabel) {
18
+ const definition = INSTALL_TARGETS.find(candidate => candidate.label === targetLabel);
19
+ if (!definition) {
20
+ throw new Error(`Unsupported skill target: ${targetLabel}`);
21
+ }
22
+ return definition;
23
+ }
24
+ export function defaultOutputPath(homeDir, skillName, target) {
25
+ return join(homeDir, ...target.relativeOutputPath, skillName, 'SKILL.md');
26
+ }
27
+ //# sourceMappingURL=targets.js.map
@@ -0,0 +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;AASjC,MAAM,eAAe,GAAuC;IAC1D;QACE,GAAG,EAAE,IAAI;QACT,KAAK,EAAE,aAAa;QACpB,kBAAkB,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;KAC1C;IACD;QACE,GAAG,EAAE,OAAO;QACZ,KAAK,EAAE,OAAO;QACd,kBAAkB,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;KACzC;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,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,SAAiB,EACjB,MAA+B;IAE/B,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,kBAAkB,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare function isWithinRoot(path: string, root: string): boolean;
2
+ export declare function ensurePathWithinHome(path: string, homeDir: string, label: string): {
3
+ resolvedPath: string;
4
+ homeRealPath: string;
5
+ };
6
+ export declare function ensurePathWithinRoots(path: string, roots: readonly string[], label: string): string;
7
+ export declare function ensurePathAncestorsContainNoSymbolicLinks(path: string, label: string, stopAtPath?: string): string;
8
+ export declare function ensurePathAncestorsAndRealPathWithinHome(path: string, homeDir: string, label: string): {
9
+ resolvedPath: string;
10
+ homeRealPath: string;
11
+ };
12
+ //# sourceMappingURL=path-guard.d.ts.map
@@ -0,0 +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;AAcD,wBAAgB,yCAAyC,CACvD,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CA4BR;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"}
@@ -0,0 +1,81 @@
1
+ import { existsSync, lstatSync, realpathSync } from 'node:fs';
2
+ import { dirname, resolve, sep } from 'node:path';
3
+ export function isWithinRoot(path, root) {
4
+ return path === root || path.startsWith(`${root}${sep}`);
5
+ }
6
+ export function ensurePathWithinHome(path, homeDir, label) {
7
+ const resolvedPath = resolve(path);
8
+ const resolvedHomeDir = resolve(homeDir);
9
+ const homeRealPath = realpathSync(resolvedHomeDir);
10
+ if (!isWithinRoot(resolvedPath, resolvedHomeDir)) {
11
+ throw new Error(`${label} must be inside home directory: ${resolvedPath}`);
12
+ }
13
+ return { resolvedPath, homeRealPath };
14
+ }
15
+ export function ensurePathWithinRoots(path, roots, label) {
16
+ const resolvedPath = resolve(path);
17
+ if (!existsSync(resolvedPath)) {
18
+ throw new Error(`Missing ${label}: ${resolvedPath}`);
19
+ }
20
+ const pathStat = lstatSync(resolvedPath);
21
+ if (pathStat.isSymbolicLink()) {
22
+ throw new Error(`Symbolic links are not allowed for ${label}: ${resolvedPath}`);
23
+ }
24
+ const realPath = realpathSync(resolvedPath);
25
+ for (const root of roots) {
26
+ const resolvedRoot = resolve(root);
27
+ const realRoot = existsSync(resolvedRoot) ? realpathSync(resolvedRoot) : resolvedRoot;
28
+ if (isWithinRoot(realPath, realRoot)) {
29
+ return realPath;
30
+ }
31
+ }
32
+ throw new Error(`${label} must be inside allowed facets directory: ${realPath}`);
33
+ }
34
+ function findNearestExistingAncestor(path) {
35
+ let current = path;
36
+ while (!existsSync(current)) {
37
+ const parent = dirname(current);
38
+ if (parent === current) {
39
+ throw new Error(`No existing ancestor found for path: ${path}`);
40
+ }
41
+ current = parent;
42
+ }
43
+ return current;
44
+ }
45
+ export function ensurePathAncestorsContainNoSymbolicLinks(path, label, stopAtPath) {
46
+ const resolvedPath = resolve(path);
47
+ const resolvedStopAtPath = stopAtPath ? resolve(stopAtPath) : undefined;
48
+ let current = resolvedPath;
49
+ while (true) {
50
+ if (resolvedStopAtPath && !isWithinRoot(current, resolvedStopAtPath)) {
51
+ break;
52
+ }
53
+ if (existsSync(current)) {
54
+ const stat = lstatSync(current);
55
+ if (stat.isSymbolicLink()) {
56
+ throw new Error(`Symbolic links are not allowed in ${label} path: ${current}`);
57
+ }
58
+ }
59
+ const parent = dirname(current);
60
+ if (parent === current) {
61
+ break;
62
+ }
63
+ if (resolvedStopAtPath && current === resolvedStopAtPath) {
64
+ break;
65
+ }
66
+ current = parent;
67
+ }
68
+ return resolvedPath;
69
+ }
70
+ export function ensurePathAncestorsAndRealPathWithinHome(path, homeDir, label) {
71
+ const { resolvedPath, homeRealPath } = ensurePathWithinHome(path, homeDir, label);
72
+ const resolvedHomeDir = resolve(homeDir);
73
+ ensurePathAncestorsContainNoSymbolicLinks(resolvedPath, label, resolvedHomeDir);
74
+ const existingAncestor = findNearestExistingAncestor(resolvedPath);
75
+ const ancestorRealPath = realpathSync(existingAncestor);
76
+ if (!isWithinRoot(ancestorRealPath, homeRealPath)) {
77
+ throw new Error(`${label} must resolve inside home directory: ${resolvedPath}`);
78
+ }
79
+ return { resolvedPath, homeRealPath };
80
+ }
81
+ //# sourceMappingURL=path-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-guard.js","sourceRoot":"","sources":["../../src/cli/path-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { runFacetCli } from './index.js';
2
+ export interface RunnerDependencies {
3
+ readonly runFacetCli: typeof runFacetCli;
4
+ readonly writeStdout: (message: string) => void;
5
+ readonly writeStderr: (message: string) => void;
6
+ readonly setExitCode: (code: number) => void;
7
+ }
8
+ export declare function runMain(argv: string[], dependencies?: RunnerDependencies): Promise<void>;
9
+ export declare function main(argv: string[]): Promise<void>;
10
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAgBzC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,OAAO,WAAW,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAqBD,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EAAE,EACd,YAAY,GAAE,kBAA0C,GACvD,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAExD"}