faceted-prompting 0.1.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 (88) hide show
  1. package/README.md +155 -16
  2. package/bin/facet +2 -0
  3. package/dist/cli/compose-context.d.ts +8 -0
  4. package/dist/cli/compose-context.d.ts.map +1 -0
  5. package/dist/cli/compose-context.js +194 -0
  6. package/dist/cli/compose-context.js.map +1 -0
  7. package/dist/cli/index.d.ts +3 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +144 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/install-skill/facets.d.ts +28 -0
  12. package/dist/cli/install-skill/facets.d.ts.map +1 -0
  13. package/dist/cli/install-skill/facets.js +160 -0
  14. package/dist/cli/install-skill/facets.js.map +1 -0
  15. package/dist/cli/install-skill/flow.d.ts +13 -0
  16. package/dist/cli/install-skill/flow.d.ts.map +1 -0
  17. package/dist/cli/install-skill/flow.js +63 -0
  18. package/dist/cli/install-skill/flow.js.map +1 -0
  19. package/dist/cli/install-skill/modes.d.ts +27 -0
  20. package/dist/cli/install-skill/modes.d.ts.map +1 -0
  21. package/dist/cli/install-skill/modes.js +130 -0
  22. package/dist/cli/install-skill/modes.js.map +1 -0
  23. package/dist/cli/install-skill/targets.d.ts +10 -0
  24. package/dist/cli/install-skill/targets.d.ts.map +1 -0
  25. package/dist/cli/install-skill/targets.js +27 -0
  26. package/dist/cli/install-skill/targets.js.map +1 -0
  27. package/dist/cli/path-guard.d.ts +12 -0
  28. package/dist/cli/path-guard.d.ts.map +1 -0
  29. package/dist/cli/path-guard.js +81 -0
  30. package/dist/cli/path-guard.js.map +1 -0
  31. package/dist/cli/runner.d.ts +10 -0
  32. package/dist/cli/runner.d.ts.map +1 -0
  33. package/dist/cli/runner.js +66 -0
  34. package/dist/cli/runner.js.map +1 -0
  35. package/dist/cli/select.d.ts +7 -0
  36. package/dist/cli/select.d.ts.map +1 -0
  37. package/dist/cli/select.js +70 -0
  38. package/dist/cli/select.js.map +1 -0
  39. package/dist/cli/skill-commands.d.ts +8 -0
  40. package/dist/cli/skill-commands.d.ts.map +1 -0
  41. package/dist/cli/skill-commands.js +44 -0
  42. package/dist/cli/skill-commands.js.map +1 -0
  43. package/dist/cli/skill-file-ops.d.ts +3 -0
  44. package/dist/cli/skill-file-ops.d.ts.map +1 -0
  45. package/dist/cli/skill-file-ops.js +89 -0
  46. package/dist/cli/skill-file-ops.js.map +1 -0
  47. package/dist/cli/skill-renderer.d.ts +24 -0
  48. package/dist/cli/skill-renderer.d.ts.map +1 -0
  49. package/dist/cli/skill-renderer.js +194 -0
  50. package/dist/cli/skill-renderer.js.map +1 -0
  51. package/dist/cli/skill-types.d.ts +31 -0
  52. package/dist/cli/skill-types.d.ts.map +1 -0
  53. package/dist/cli/skill-types.js +2 -0
  54. package/dist/cli/skill-types.js.map +1 -0
  55. package/dist/cli/types.d.ts +17 -0
  56. package/dist/cli/types.d.ts.map +1 -0
  57. package/dist/cli/types.js +2 -0
  58. package/dist/cli/types.js.map +1 -0
  59. package/dist/compose-definition.d.ts +3 -0
  60. package/dist/compose-definition.d.ts.map +1 -0
  61. package/dist/compose-definition.js +99 -0
  62. package/dist/compose-definition.js.map +1 -0
  63. package/dist/compose.d.ts.map +1 -1
  64. package/dist/compose.js +25 -19
  65. package/dist/compose.js.map +1 -1
  66. package/dist/config/index.d.ts +9 -0
  67. package/dist/config/index.d.ts.map +1 -0
  68. package/dist/config/index.js +82 -0
  69. package/dist/config/index.js.map +1 -0
  70. package/dist/index.d.ts +2 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +1 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/init/index.d.ts +17 -0
  75. package/dist/init/index.d.ts.map +1 -0
  76. package/dist/init/index.js +197 -0
  77. package/dist/init/index.js.map +1 -0
  78. package/dist/output/index.d.ts +10 -0
  79. package/dist/output/index.d.ts.map +1 -0
  80. package/dist/output/index.js +67 -0
  81. package/dist/output/index.js.map +1 -0
  82. package/dist/prompt-payload.d.ts +8 -0
  83. package/dist/prompt-payload.d.ts.map +1 -0
  84. package/dist/prompt-payload.js +24 -0
  85. package/dist/prompt-payload.js.map +1 -0
  86. package/dist/types.d.ts +26 -0
  87. package/dist/types.d.ts.map +1 -1
  88. package/package.json +18 -6
@@ -0,0 +1,66 @@
1
+ import { homedir } from 'node:os';
2
+ import { stdin as input, stdout as output } from 'node:process';
3
+ import { createInterface } from 'node:readline/promises';
4
+ import { pathToFileURL } from 'node:url';
5
+ import { runFacetCli } from './index.js';
6
+ import { selectInteractive } from './select.js';
7
+ async function inputInteractive(prompt, defaultValue) {
8
+ const rl = createInterface({ input, output });
9
+ try {
10
+ const renderedPrompt = prompt.includes('[y/N]') || prompt.includes('[Y/n]')
11
+ ? `${prompt}: `
12
+ : `${prompt} [${defaultValue}]: `;
13
+ const answer = (await rl.question(renderedPrompt)).trim();
14
+ return answer.length > 0 ? answer : defaultValue;
15
+ }
16
+ finally {
17
+ rl.close();
18
+ }
19
+ }
20
+ function defaultDependencies() {
21
+ return {
22
+ runFacetCli,
23
+ writeStdout: message => {
24
+ output.write(message);
25
+ },
26
+ writeStderr: message => {
27
+ process.stderr.write(message);
28
+ },
29
+ setExitCode: code => {
30
+ process.exitCode = code;
31
+ },
32
+ };
33
+ }
34
+ function toErrorMessage(error) {
35
+ return error instanceof Error ? error.message : String(error);
36
+ }
37
+ export async function runMain(argv, dependencies = defaultDependencies()) {
38
+ try {
39
+ const result = await dependencies.runFacetCli(argv, {
40
+ cwd: process.cwd(),
41
+ homeDir: homedir(),
42
+ select: selectInteractive,
43
+ input: inputInteractive,
44
+ });
45
+ if (result.kind === 'path') {
46
+ dependencies.writeStdout(`Generated: ${result.path}\n`);
47
+ return;
48
+ }
49
+ if (result.kind === 'paths') {
50
+ dependencies.writeStdout(`Generated:\n${result.paths.map(path => `- ${path}`).join('\n')}\n`);
51
+ return;
52
+ }
53
+ dependencies.writeStdout(`${result.text}\n`);
54
+ }
55
+ catch (error) {
56
+ dependencies.writeStderr(`facet command failed: ${toErrorMessage(error)}\n`);
57
+ dependencies.setExitCode(1);
58
+ }
59
+ }
60
+ export async function main(argv) {
61
+ await runMain(argv);
62
+ }
63
+ if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
64
+ void main(process.argv.slice(2));
65
+ }
66
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,YAAoB;IAClE,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YACzE,CAAC,CAAC,GAAG,MAAM,IAAI;YACf,CAAC,CAAC,GAAG,MAAM,KAAK,YAAY,KAAK,CAAC;QACpC,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1D,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;IACnD,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AASD,SAAS,mBAAmB;IAC1B,OAAO;QACL,WAAW;QACX,WAAW,EAAE,OAAO,CAAC,EAAE;YACrB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,WAAW,EAAE,OAAO,CAAC,EAAE;YACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,WAAW,EAAE,IAAI,CAAC,EAAE;YAClB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAc,EACd,eAAmC,mBAAmB,EAAE;IAExD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE;YAClD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,OAAO,EAAE,OAAO,EAAE;YAClB,MAAM,EAAE,iBAAiB;YACzB,KAAK,EAAE,gBAAgB;SACxB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,YAAY,CAAC,WAAW,CAAC,cAAc,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,YAAY,CAAC,WAAW,CAAC,eAAe,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9F,OAAO;QACT,CAAC;QAED,YAAY,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,YAAY,CAAC,WAAW,CAAC,yBAAyB,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7E,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc;IACvC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,7 @@
1
+ type SelectInput = NodeJS.ReadStream & {
2
+ setRawMode: (mode: boolean) => void;
3
+ };
4
+ export declare function selectInteractiveFromIO(candidates: string[], inStream: SelectInput, outStream: NodeJS.WriteStream, prompt?: string): Promise<string>;
5
+ export declare function selectInteractive(candidates: string[], prompt?: string): Promise<string>;
6
+ export {};
7
+ //# sourceMappingURL=select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/cli/select.ts"],"names":[],"mappings":"AAGA,KAAK,WAAW,GAAG,MAAM,CAAC,UAAU,GAAG;IACrC,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC,CAAC;AAqBF,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAE,MAAM,CAAC,WAAW,EAC7B,MAAM,SAA0C,GAC/C,OAAO,CAAC,MAAM,CAAC,CAwDjB;AAED,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE9F"}
@@ -0,0 +1,70 @@
1
+ import { stdin as input, stdout as output } from 'node:process';
2
+ import { emitKeypressEvents } from 'node:readline';
3
+ function renderMenu(candidates, selectedIndex, prompt) {
4
+ const lines = [prompt];
5
+ for (let index = 0; index < candidates.length; index += 1) {
6
+ const marker = index === selectedIndex ? '\x1B[36m❯\x1B[0m' : ' ';
7
+ lines.push(`${marker} ${candidates[index]}`);
8
+ }
9
+ return lines;
10
+ }
11
+ function drawMenu(out, lines) {
12
+ out.write(lines.join('\n') + '\n');
13
+ }
14
+ function redrawMenu(out, lines, prevLineCount) {
15
+ out.write(`\x1B[${prevLineCount}A`); // move cursor up
16
+ out.write('\x1B[J'); // clear from cursor to end
17
+ drawMenu(out, lines);
18
+ }
19
+ export async function selectInteractiveFromIO(candidates, inStream, outStream, prompt = 'Choose option with Up/Down and Enter:') {
20
+ if (!inStream.isTTY) {
21
+ throw new Error('Interactive selection requires a TTY');
22
+ }
23
+ emitKeypressEvents(inStream);
24
+ inStream.setRawMode(true);
25
+ inStream.resume();
26
+ let selectedIndex = 0;
27
+ let prevLineCount = 0;
28
+ const lines = renderMenu(candidates, selectedIndex, prompt);
29
+ outStream.write('\n');
30
+ drawMenu(outStream, lines);
31
+ prevLineCount = lines.length;
32
+ return new Promise((resolve, reject) => {
33
+ const handleKeyPress = (_str, key) => {
34
+ if (key.ctrl && key.name === 'c') {
35
+ cleanup();
36
+ reject(new Error('Selection cancelled by user'));
37
+ return;
38
+ }
39
+ if (key.name === 'up') {
40
+ selectedIndex = selectedIndex === 0 ? candidates.length - 1 : selectedIndex - 1;
41
+ const newLines = renderMenu(candidates, selectedIndex, prompt);
42
+ redrawMenu(outStream, newLines, prevLineCount);
43
+ prevLineCount = newLines.length;
44
+ return;
45
+ }
46
+ if (key.name === 'down') {
47
+ selectedIndex = selectedIndex === candidates.length - 1 ? 0 : selectedIndex + 1;
48
+ const newLines = renderMenu(candidates, selectedIndex, prompt);
49
+ redrawMenu(outStream, newLines, prevLineCount);
50
+ prevLineCount = newLines.length;
51
+ return;
52
+ }
53
+ if (key.name === 'return' || key.name === 'enter') {
54
+ const selected = candidates[selectedIndex];
55
+ cleanup();
56
+ resolve(selected);
57
+ }
58
+ };
59
+ const cleanup = () => {
60
+ inStream.off('keypress', handleKeyPress);
61
+ inStream.setRawMode(false);
62
+ outStream.write('\n');
63
+ };
64
+ inStream.on('keypress', handleKeyPress);
65
+ });
66
+ }
67
+ export async function selectInteractive(candidates, prompt) {
68
+ return selectInteractiveFromIO(candidates, input, output, prompt);
69
+ }
70
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/cli/select.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { FacetCliOptions, FacetCliResult } from './types.js';
2
+ export declare function getSkillPaths(homeDir: string): {
3
+ readonly facetedRoot: string;
4
+ readonly facetsRoot: string;
5
+ readonly compositionsDir: string;
6
+ };
7
+ export declare function runInstallSkillCommand(options: FacetCliOptions): Promise<FacetCliResult>;
8
+ //# sourceMappingURL=skill-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-commands.d.ts","sourceRoot":"","sources":["../../src/cli/skill-commands.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGlE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC,CAOA;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAoC9F"}
@@ -0,0 +1,44 @@
1
+ import { dirname, join } from 'node:path';
2
+ import { loadComposeDefinition } from '../compose-definition.js';
3
+ import { getFacetedRoot } from '../config/index.js';
4
+ import { buildSkillSections, ensureSafeDefinitionName, listCompositionDefinitions, } from './skill-renderer.js';
5
+ import { runSkillDeployInstall } from './install-skill/modes.js';
6
+ export function getSkillPaths(homeDir) {
7
+ const facetedRoot = getFacetedRoot(homeDir);
8
+ return {
9
+ facetedRoot,
10
+ facetsRoot: join(facetedRoot, 'facets'),
11
+ compositionsDir: join(facetedRoot, 'compositions'),
12
+ };
13
+ }
14
+ export async function runInstallSkillCommand(options) {
15
+ const { facetedRoot, facetsRoot, compositionsDir } = getSkillPaths(options.homeDir);
16
+ const definitionMap = listCompositionDefinitions(compositionsDir);
17
+ const compositionCandidates = Object.keys(definitionMap).sort();
18
+ if (compositionCandidates.length === 0) {
19
+ throw new Error(`No compose definitions found in ${compositionsDir}`);
20
+ }
21
+ const selectedComposition = await options.select(compositionCandidates, 'Choose composition with Up/Down and Enter:');
22
+ const definitionPath = definitionMap[selectedComposition];
23
+ if (!definitionPath) {
24
+ throw new Error(`Unknown compose definition selected: ${selectedComposition}`);
25
+ }
26
+ const definition = await loadComposeDefinition(definitionPath);
27
+ const safeSkillName = ensureSafeDefinitionName(definition.name);
28
+ const definitionDir = dirname(definitionPath);
29
+ const sections = buildSkillSections({
30
+ definition,
31
+ definitionDir,
32
+ facetsRoot,
33
+ });
34
+ return (await runSkillDeployInstall({
35
+ options,
36
+ facetedRoot,
37
+ definitionDir,
38
+ facetsRoot,
39
+ safeSkillName,
40
+ definition,
41
+ sections,
42
+ })).result;
43
+ }
44
+ //# sourceMappingURL=skill-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-commands.js","sourceRoot":"","sources":["../../src/cli/skill-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,UAAU,aAAa,CAAC,OAAe;IAK3C,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO;QACL,WAAW;QACX,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;QACvC,eAAe,EAAE,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAwB;IACnE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpF,MAAM,aAAa,GAAG,0BAA0B,CAAC,eAAe,CAAC,CAAC;IAClE,MAAM,qBAAqB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,mCAAmC,eAAe,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,MAAM,CAC9C,qBAAqB,EACrB,4CAA4C,CAC7C,CAAC;IACF,MAAM,cAAc,GAAG,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,wCAAwC,mBAAmB,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,wBAAwB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QAClC,UAAU;QACV,aAAa;QACb,UAAU;KACX,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,qBAAqB,CAAC;QAClC,OAAO;QACP,WAAW;QACX,aAAa;QACb,UAAU;QACV,aAAa;QACb,UAAU;QACV,QAAQ;KACT,CAAC,CAAC,CAAC,MAAM,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function writeSkillFile(outputPath: string, content: string, homeDir: string): void;
2
+ export declare function removeSkillFile(outputPath: string, homeDir: string): void;
3
+ //# sourceMappingURL=skill-file-ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-file-ops.d.ts","sourceRoot":"","sources":["../../src/cli/skill-file-ops.ts"],"names":[],"mappings":"AAoEA,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA0BzF;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAyBzE"}
@@ -0,0 +1,89 @@
1
+ import { closeSync, constants, existsSync, lstatSync, mkdirSync, openSync, realpathSync, renameSync, rmSync, unlinkSync, writeFileSync, } from 'node:fs';
2
+ import { basename, dirname, join } from 'node:path';
3
+ import { ensurePathWithinHome, isWithinRoot } from './path-guard.js';
4
+ function ensureParentPathWithinHome(resolvedPath, homeRealPath) {
5
+ const outputParentDirectory = dirname(resolvedPath);
6
+ mkdirSync(outputParentDirectory, { recursive: true });
7
+ const outputParentRealPath = realpathSync(outputParentDirectory);
8
+ if (!isWithinRoot(outputParentRealPath, homeRealPath)) {
9
+ throw new Error(`Skill output path escapes home directory: ${resolvedPath}`);
10
+ }
11
+ return outputParentRealPath;
12
+ }
13
+ function buildTemporaryPath(targetPath, parentRealPath) {
14
+ return join(parentRealPath, `.${basename(targetPath)}.${process.pid}.${Date.now()}.tmp`);
15
+ }
16
+ function resolveOutputTargetPathForWrite(resolvedPath, homeRealPath) {
17
+ const outputParentRealPath = ensureParentPathWithinHome(resolvedPath, homeRealPath);
18
+ const outputTargetPath = join(outputParentRealPath, basename(resolvedPath));
19
+ return { outputParentRealPath, outputTargetPath };
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
+ function writeFreshFile(path, content) {
29
+ const openFlags = constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW;
30
+ let fileDescriptor;
31
+ try {
32
+ fileDescriptor = openSync(path, openFlags, 0o600);
33
+ }
34
+ catch (error) {
35
+ const errorCode = error.code;
36
+ if (errorCode === 'ELOOP') {
37
+ throw new Error(`Symbolic links are not allowed for skill output file: ${path}`);
38
+ }
39
+ throw error;
40
+ }
41
+ try {
42
+ writeFileSync(fileDescriptor, content, 'utf-8');
43
+ }
44
+ finally {
45
+ closeSync(fileDescriptor);
46
+ }
47
+ }
48
+ export function writeSkillFile(outputPath, content, homeDir) {
49
+ const { resolvedPath, homeRealPath } = ensurePathWithinHome(outputPath, homeDir, 'Skill output path');
50
+ const { outputParentRealPath, outputTargetPath } = resolveOutputTargetPathForWrite(resolvedPath, homeRealPath);
51
+ const tempOutputPath = buildTemporaryPath(outputTargetPath, outputParentRealPath);
52
+ try {
53
+ if (existsSync(outputTargetPath) && lstatSync(outputTargetPath).isSymbolicLink()) {
54
+ throw new Error(`Symbolic links are not allowed for skill output file: ${resolvedPath}`);
55
+ }
56
+ writeFreshFile(tempOutputPath, content);
57
+ renameSync(tempOutputPath, outputTargetPath);
58
+ }
59
+ catch (error) {
60
+ if (existsSync(tempOutputPath)) {
61
+ unlinkSync(tempOutputPath);
62
+ }
63
+ throw error;
64
+ }
65
+ const outputRealPath = realpathSync(outputTargetPath);
66
+ if (!isWithinRoot(outputRealPath, homeRealPath)) {
67
+ throw new Error(`Skill output path escapes home directory: ${resolvedPath}`);
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}`);
83
+ }
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
+ }
89
+ //# sourceMappingURL=skill-file-ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-file-ops.js","sourceRoot":"","sources":["../../src/cli/skill-file-ops.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ComposeDefinition, FacetSet } from '../types.js';
2
+ import type { ResolvedDefinitionSections, SkillDocumentInput } from './skill-types.js';
3
+ export declare function ensureSafeDefinitionName(name: string): string;
4
+ export declare function resolveDefinitionSections(params: {
5
+ definition: ComposeDefinition;
6
+ definitionDir: string;
7
+ facetsRoot: string;
8
+ }): ResolvedDefinitionSections;
9
+ export declare function listCompositionDefinitions(compositionsDir: string): Record<string, string>;
10
+ export declare function buildFacetSet(params: {
11
+ definitionDir: string;
12
+ facetsRoot: string;
13
+ definition: ComposeDefinition;
14
+ }): FacetSet;
15
+ export declare function buildSkillSections(params: {
16
+ definition: ComposeDefinition;
17
+ definitionDir: string;
18
+ facetsRoot: string;
19
+ }): Omit<SkillDocumentInput, 'mode'>;
20
+ export declare function renderSkillFrontmatter(definition: ComposeDefinition): string;
21
+ export declare function hasYamlFrontmatter(content: string): boolean;
22
+ export declare function renderSkillDocument(input: SkillDocumentInput): string;
23
+ export declare function resolveDefinitionPathFromSource(source: string, compositionsDir: string): string;
24
+ //# sourceMappingURL=skill-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-renderer.d.ts","sourceRoot":"","sources":["../../src/cli/skill-renderer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAEV,0BAA0B,EAC1B,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAS1B,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK7D;AAqBD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,UAAU,EAAE,iBAAiB,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,0BAA0B,CAqE7B;AAED,wBAAgB,0BAA0B,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqB1F;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,iBAAiB,CAAC;CAC/B,GAAG,QAAQ,CAaX;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAWnC;AAWD,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,iBAAiB,GAAG,MAAM,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3D;AAMD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAgDrE;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAM/F"}
@@ -0,0 +1,194 @@
1
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { isResourcePath, resolveResourcePath } from '../resolve.js';
4
+ import { ensurePathWithinRoots } from './path-guard.js';
5
+ function requireFile(path, label) {
6
+ if (!existsSync(path)) {
7
+ throw new Error(`Missing ${label}: ${path}`);
8
+ }
9
+ return readFileSync(path, 'utf-8');
10
+ }
11
+ export function ensureSafeDefinitionName(name) {
12
+ if (!/^[A-Za-z0-9._-]+$/u.test(name)) {
13
+ throw new Error(`Invalid compose definition name: ${name}`);
14
+ }
15
+ return name;
16
+ }
17
+ function resolveFacetRefContent(options) {
18
+ const { ref, label, baseDir, facetDir, allowedRoots } = options;
19
+ if (isResourcePath(ref)) {
20
+ const resourcePath = resolveResourcePath(ref, baseDir);
21
+ const boundedPath = ensurePathWithinRoots(resourcePath, allowedRoots, label);
22
+ return { path: boundedPath, body: requireFile(boundedPath, label) };
23
+ }
24
+ const facetPath = join(facetDir, `${ref}.md`);
25
+ const boundedPath = ensurePathWithinRoots(facetPath, allowedRoots, label);
26
+ return { path: boundedPath, body: requireFile(boundedPath, label) };
27
+ }
28
+ export function resolveDefinitionSections(params) {
29
+ const { definition, definitionDir, facetsRoot } = params;
30
+ const allowedRoots = [facetsRoot];
31
+ const personaContent = resolveFacetRefContent({
32
+ ref: definition.persona,
33
+ label: `persona facet "${definition.persona}"`,
34
+ baseDir: definitionDir,
35
+ facetDir: join(facetsRoot, 'persona'),
36
+ allowedRoots,
37
+ });
38
+ const policies = definition.policies?.map(ref => {
39
+ const resolved = resolveFacetRefContent({
40
+ ref,
41
+ label: `policy facet "${ref}"`,
42
+ baseDir: definitionDir,
43
+ facetDir: join(facetsRoot, 'policies'),
44
+ allowedRoots,
45
+ });
46
+ return { ref, body: resolved.body, path: resolved.path };
47
+ }) ?? [];
48
+ const knowledge = definition.knowledge?.map(ref => {
49
+ const resolved = resolveFacetRefContent({
50
+ ref,
51
+ label: `knowledge facet "${ref}"`,
52
+ baseDir: definitionDir,
53
+ facetDir: join(facetsRoot, 'knowledge'),
54
+ allowedRoots,
55
+ });
56
+ return { ref, body: resolved.body, path: resolved.path };
57
+ }) ?? [];
58
+ let instruction;
59
+ if (definition.instruction) {
60
+ if (isResourcePath(definition.instruction)) {
61
+ const resolved = resolveFacetRefContent({
62
+ ref: definition.instruction,
63
+ label: 'instruction file',
64
+ baseDir: definitionDir,
65
+ facetDir: facetsRoot,
66
+ allowedRoots,
67
+ });
68
+ instruction = {
69
+ ref: definition.instruction,
70
+ body: resolved.body,
71
+ path: resolved.path,
72
+ };
73
+ }
74
+ else {
75
+ instruction = {
76
+ ref: 'literal',
77
+ body: definition.instruction,
78
+ };
79
+ }
80
+ }
81
+ return {
82
+ persona: {
83
+ ref: definition.persona,
84
+ body: personaContent.body,
85
+ path: personaContent.path,
86
+ },
87
+ policies,
88
+ knowledge,
89
+ instruction,
90
+ };
91
+ }
92
+ export function listCompositionDefinitions(compositionsDir) {
93
+ if (!existsSync(compositionsDir)) {
94
+ throw new Error(`Compose definition directory does not exist: ${compositionsDir}`);
95
+ }
96
+ const entries = readdirSync(compositionsDir, { withFileTypes: true })
97
+ .filter(entry => !entry.isDirectory() && (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml')))
98
+ .map(entry => entry.name);
99
+ const definitions = {};
100
+ for (const entry of entries) {
101
+ const name = entry.replace(/\.(yaml|yml)$/u, '');
102
+ const definitionPath = join(compositionsDir, entry);
103
+ definitions[name] = ensurePathWithinRoots(definitionPath, [compositionsDir], `compose definition "${entry}"`);
104
+ }
105
+ return definitions;
106
+ }
107
+ export function buildFacetSet(params) {
108
+ const resolved = resolveDefinitionSections(params);
109
+ return {
110
+ persona: { body: resolved.persona.body, sourcePath: resolved.persona.path },
111
+ policies: resolved.policies.map(policy => ({ body: policy.body, sourcePath: policy.path })),
112
+ knowledge: resolved.knowledge.map(item => ({ body: item.body, sourcePath: item.path })),
113
+ instruction: resolved.instruction
114
+ ? ('path' in resolved.instruction
115
+ ? { body: resolved.instruction.body, sourcePath: resolved.instruction.path }
116
+ : { body: resolved.instruction.body })
117
+ : undefined,
118
+ };
119
+ }
120
+ export function buildSkillSections(params) {
121
+ const { definition } = params;
122
+ const resolved = resolveDefinitionSections(params);
123
+ return {
124
+ definition,
125
+ persona: resolved.persona,
126
+ policies: resolved.policies,
127
+ knowledge: resolved.knowledge,
128
+ instruction: resolved.instruction,
129
+ };
130
+ }
131
+ function makeSkillHeader(definition) {
132
+ const lines = ['---', `name: ${definition.name}`];
133
+ if (definition.description) {
134
+ lines.push(`description: ${definition.description}`);
135
+ }
136
+ lines.push('---');
137
+ return lines.join('\n');
138
+ }
139
+ export function renderSkillFrontmatter(definition) {
140
+ return `${makeSkillHeader(definition)}\n`;
141
+ }
142
+ export function hasYamlFrontmatter(content) {
143
+ return /^---\n[\s\S]*?\n---(?:\n|$)/u.test(content);
144
+ }
145
+ function hasInstructionPath(instruction) {
146
+ return instruction.ref !== 'literal';
147
+ }
148
+ export function renderSkillDocument(input) {
149
+ const lines = [];
150
+ lines.push(makeSkillHeader(input.definition));
151
+ lines.push('');
152
+ lines.push('<!-- Generated by faceted-prompting. Do not edit manually. -->');
153
+ lines.push('');
154
+ lines.push('## Persona');
155
+ lines.push('');
156
+ lines.push(input.mode === 'inline' ? input.persona.body : input.persona.path);
157
+ lines.push('');
158
+ if (input.policies.length > 0) {
159
+ lines.push('## Policies');
160
+ lines.push('');
161
+ for (const policy of input.policies) {
162
+ lines.push(`### ${policy.ref}`);
163
+ lines.push('');
164
+ lines.push(input.mode === 'inline' ? policy.body : policy.path);
165
+ lines.push('');
166
+ }
167
+ }
168
+ if (input.knowledge.length > 0) {
169
+ lines.push('## Knowledge');
170
+ lines.push('');
171
+ for (const knowledge of input.knowledge) {
172
+ lines.push(`### ${knowledge.ref}`);
173
+ lines.push('');
174
+ lines.push(input.mode === 'inline' ? knowledge.body : knowledge.path);
175
+ lines.push('');
176
+ }
177
+ }
178
+ if (input.instruction) {
179
+ lines.push('## Instruction');
180
+ lines.push('');
181
+ if (input.mode === 'reference' && hasInstructionPath(input.instruction)) {
182
+ lines.push(input.instruction.path);
183
+ }
184
+ else {
185
+ lines.push(input.instruction.body);
186
+ }
187
+ lines.push('');
188
+ }
189
+ return `${lines.join('\n').trimEnd()}\n`;
190
+ }
191
+ export function resolveDefinitionPathFromSource(source, compositionsDir) {
192
+ return ensurePathWithinRoots(join(compositionsDir, source), [compositionsDir], `compose definition "${source}"`);
193
+ }
194
+ //# sourceMappingURL=skill-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-renderer.js","sourceRoot":"","sources":["../../src/cli/skill-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ComposeDefinition } from '../types.js';
2
+ export type SkillMode = 'inline' | 'reference';
3
+ export type InstallTarget = 'cc' | 'codex';
4
+ export interface FacetRefContent {
5
+ readonly body: string;
6
+ readonly path: string;
7
+ }
8
+ export interface SkillSection {
9
+ readonly ref: string;
10
+ readonly body: string;
11
+ readonly path: string;
12
+ }
13
+ export type InstructionSection = SkillSection | {
14
+ readonly ref: 'literal';
15
+ readonly body: string;
16
+ };
17
+ export interface SkillDocumentInput {
18
+ readonly definition: ComposeDefinition;
19
+ readonly mode: SkillMode;
20
+ readonly persona: SkillSection;
21
+ readonly policies: readonly SkillSection[];
22
+ readonly knowledge: readonly SkillSection[];
23
+ readonly instruction?: InstructionSection;
24
+ }
25
+ export interface ResolvedDefinitionSections {
26
+ readonly persona: SkillSection;
27
+ readonly policies: readonly SkillSection[];
28
+ readonly knowledge: readonly SkillSection[];
29
+ readonly instruction?: InstructionSection;
30
+ }
31
+ //# sourceMappingURL=skill-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-types.d.ts","sourceRoot":"","sources":["../../src/cli/skill-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;AAC/C,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC;AAE3C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,SAAS,YAAY,EAAE,CAAC;IAC5C,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAC3C;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,SAAS,YAAY,EAAE,CAAC;IAC5C,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAC3C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skill-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-types.js","sourceRoot":"","sources":["../../src/cli/skill-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ export interface FacetCliOptions {
2
+ readonly cwd: string;
3
+ readonly homeDir: string;
4
+ readonly select: (candidates: string[], prompt?: string) => Promise<string>;
5
+ readonly input: (prompt: string, defaultValue: string) => Promise<string>;
6
+ }
7
+ export type FacetCliResult = {
8
+ readonly kind: 'path';
9
+ readonly path: string;
10
+ } | {
11
+ readonly kind: 'paths';
12
+ readonly paths: readonly string[];
13
+ } | {
14
+ readonly kind: 'text';
15
+ readonly text: string;
16
+ };
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5E,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3E;AAED,MAAM,MAAM,cAAc,GACtB;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map