sdd-mcp-server 3.4.0 → 3.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.
Files changed (69) hide show
  1. package/README.md +75 -40
  2. package/dist/adapters/cli/SDDToolAdapter.js +3 -3
  3. package/dist/adapters/cli/SDDToolAdapter.js.map +1 -1
  4. package/dist/application/services/staticSteering.js +2 -4
  5. package/dist/application/services/staticSteering.js.map +1 -1
  6. package/dist/cli/install-skills.d.ts +10 -32
  7. package/dist/cli/install-skills.js +213 -176
  8. package/dist/cli/install-skills.js.map +1 -1
  9. package/dist/cli/install-target.d.ts +127 -0
  10. package/dist/cli/install-target.js +127 -0
  11. package/dist/cli/install-target.js.map +1 -0
  12. package/dist/cli/migrate-steering.js +13 -13
  13. package/dist/cli/migrate-steering.js.map +1 -1
  14. package/dist/cli/sdd-mcp-cli.d.ts +1 -1
  15. package/dist/cli/sdd-mcp-cli.js +14 -10
  16. package/dist/cli/sdd-mcp-cli.js.map +1 -1
  17. package/dist/cli/tool-support/antigravity.d.ts +6 -1
  18. package/dist/cli/tool-support/antigravity.js +55 -12
  19. package/dist/cli/tool-support/antigravity.js.map +1 -1
  20. package/dist/cli/tool-support/claude-code.d.ts +5 -0
  21. package/dist/cli/tool-support/claude-code.js +93 -0
  22. package/dist/cli/tool-support/claude-code.js.map +1 -0
  23. package/dist/cli/tool-support/codex.d.ts +18 -1
  24. package/dist/cli/tool-support/codex.js +161 -36
  25. package/dist/cli/tool-support/codex.js.map +1 -1
  26. package/dist/cli/tool-support/index.d.ts +2 -2
  27. package/dist/cli/tool-support/root-guidance.d.ts +9 -0
  28. package/dist/cli/tool-support/root-guidance.js +40 -0
  29. package/dist/cli/tool-support/root-guidance.js.map +1 -0
  30. package/dist/cli/tool-support/target-agent-renderer.d.ts +11 -0
  31. package/dist/cli/tool-support/target-agent-renderer.js +52 -0
  32. package/dist/cli/tool-support/target-agent-renderer.js.map +1 -0
  33. package/dist/cli/tool-support/target-installer.d.ts +40 -0
  34. package/dist/cli/tool-support/target-installer.js +116 -0
  35. package/dist/cli/tool-support/target-installer.js.map +1 -0
  36. package/dist/cli/utils/gitignore-manager.d.ts +5 -0
  37. package/dist/cli/utils/gitignore-manager.js +85 -0
  38. package/dist/cli/utils/gitignore-manager.js.map +1 -0
  39. package/dist/cli/utils/preserving-writer.d.ts +13 -0
  40. package/dist/cli/utils/preserving-writer.js +106 -0
  41. package/dist/cli/utils/preserving-writer.js.map +1 -0
  42. package/dist/hooks/HookLoader.js +9 -1
  43. package/dist/hooks/HookLoader.js.map +1 -1
  44. package/dist/index.js +6 -6
  45. package/dist/index.js.map +1 -1
  46. package/dist/shared/BaseManager.d.ts +10 -1
  47. package/dist/shared/BaseManager.js +34 -5
  48. package/dist/shared/BaseManager.js.map +1 -1
  49. package/dist/skills/SkillManager.d.ts +3 -1
  50. package/dist/skills/SkillManager.js +15 -3
  51. package/dist/skills/SkillManager.js.map +1 -1
  52. package/package.json +1 -1
  53. package/sdd-entry.js +2 -2
  54. package/skills/sdd-design/SKILL.md +4 -0
  55. package/skills/sdd-implement/SKILL.md +4 -0
  56. package/skills/sdd-requirements/SKILL.md +4 -0
  57. package/skills/sdd-review/SKILL.md +4 -0
  58. package/skills/sdd-security-check/SKILL.md +4 -0
  59. package/skills/sdd-steering/SKILL.md +4 -0
  60. package/skills/sdd-steering-custom/SKILL.md +4 -0
  61. package/skills/sdd-tasks/SKILL.md +4 -0
  62. package/skills/sdd-test-gen/SKILL.md +4 -0
  63. package/skills/simple-task/SKILL.md +4 -0
  64. package/templates/CLAUDE.md +2 -36
  65. package/templates/codex-AGENTS.md +1 -2
  66. package/templates/codex-hook-runner.js +85 -0
  67. package/dist/utils/sddPaths.d.ts +0 -69
  68. package/dist/utils/sddPaths.js +0 -138
  69. package/dist/utils/sddPaths.js.map +0 -1
@@ -0,0 +1,93 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { findTemplate } from '../utils/find-package-root.js';
4
+ import { PreservingWriter, validateChildName } from '../utils/preserving-writer.js';
5
+ import { parseSourceAgent, renderClaudeCodeAgent } from './target-agent-renderer.js';
6
+ import { buildGuidanceSection, buildSteeringSection, buildTableSection, listMarkdownFiles, } from './root-guidance.js';
7
+ import { copyFlatComponents, TargetInstallSession, } from './target-installer.js';
8
+ export async function installClaudeCodeTarget(request) {
9
+ const session = new TargetInstallSession('claude-code', request.projectRoot, request.writer ?? new PreservingWriter(request.projectRoot));
10
+ const selected = new Set(request.components);
11
+ if (selected.has('skills')) {
12
+ await session.copySkills(request.sources.skillManager, request.paths.skills);
13
+ }
14
+ if (selected.has('steering')) {
15
+ await session.copySteering(request.sources.steeringSource, request.paths.steering);
16
+ }
17
+ if (selected.has('rules')) {
18
+ await copyFlatComponents(session, 'rules', request.paths.rules, await request.sources.rulesManager.listComponents());
19
+ }
20
+ if (selected.has('contexts')) {
21
+ await copyFlatComponents(session, 'contexts', request.paths.contexts, await request.sources.contextManager.listComponents());
22
+ }
23
+ if (selected.has('agents')) {
24
+ const destinationRoot = session.resolve(request.paths.agents);
25
+ for (const descriptor of await request.sources.agentManager.listComponents()) {
26
+ const destination = path.join(destinationRoot, `${descriptor.name}.md`);
27
+ try {
28
+ validateChildName(descriptor.name);
29
+ const source = await fs.promises.readFile(descriptor.path, 'utf8');
30
+ const rendered = renderClaudeCodeAgent(parseSourceAgent(source));
31
+ await session.write('agents', descriptor.name, destination, rendered);
32
+ }
33
+ catch (error) {
34
+ session.fail('agents', descriptor.name, destination, error);
35
+ }
36
+ }
37
+ }
38
+ if (selected.has('hooks')) {
39
+ const destinationRoot = session.resolve(request.paths.hooks);
40
+ for (const hook of await request.sources.hookLoader.listComponents()) {
41
+ const fileName = path.basename(hook.path);
42
+ const destination = path.join(destinationRoot, hook.event, fileName);
43
+ try {
44
+ validateChildName(hook.event);
45
+ validateChildName(fileName);
46
+ await session.copy('hooks', hook.name, hook.path, destination);
47
+ }
48
+ catch (error) {
49
+ session.fail('hooks', hook.name, destination, error);
50
+ }
51
+ }
52
+ }
53
+ let rootPreamble;
54
+ try {
55
+ rootPreamble = request.rootGuidanceContent ?? await loadClaudeTemplate();
56
+ }
57
+ catch (error) {
58
+ session.fail('root', request.paths.rootGuidance, session.resolve(request.paths.rootGuidance), error);
59
+ return session.report;
60
+ }
61
+ const rootContent = await buildClaudeRootGuidance(request, selected, rootPreamble);
62
+ await session.write('root', request.paths.rootGuidance, session.resolve(request.paths.rootGuidance), rootContent);
63
+ return session.report;
64
+ }
65
+ async function buildClaudeRootGuidance(request, selected, preamble) {
66
+ const [skills, rules, contexts, agents, steeringDocs] = await Promise.all([
67
+ selected.has('skills') ? request.sources.skillManager.listSkills() : Promise.resolve([]),
68
+ selected.has('rules') ? request.sources.rulesManager.listComponents() : Promise.resolve([]),
69
+ selected.has('contexts') ? request.sources.contextManager.listComponents() : Promise.resolve([]),
70
+ selected.has('agents') ? request.sources.agentManager.listComponents() : Promise.resolve([]),
71
+ selected.has('steering') ? listMarkdownFiles(request.sources.steeringSource) : Promise.resolve([]),
72
+ ]);
73
+ const sections = [
74
+ buildTableSection('Skills', 'On-demand guidance invoked via slash commands:', request.paths.skills, skills, skill => `${request.paths.skills}/${skill.name}/`),
75
+ buildTableSection('Rules', 'Always-active coding standards:', request.paths.rules, rules, rule => `${request.paths.rules}/${path.basename(rule.path)}`),
76
+ buildTableSection('Contexts', 'Switchable modes:', request.paths.contexts, contexts, context => `${request.paths.contexts}/${path.basename(context.path)}`),
77
+ buildTableSection('Agents', 'Specialized roles with model routing:', request.paths.agents, agents, agent => `${request.paths.agents}/${path.basename(agent.path, path.extname(agent.path))}.md`),
78
+ buildSteeringSection(request.paths.steering, steeringDocs),
79
+ selected.has('hooks') ? buildGuidanceSection('Hooks', request.paths.hooks) : '',
80
+ ].join('');
81
+ const marker = '\n## MCP Tools';
82
+ const markerIndex = preamble.indexOf(marker);
83
+ if (markerIndex < 0)
84
+ return `${preamble}${sections}`;
85
+ return `${preamble.slice(0, markerIndex)}\n${sections}${preamble.slice(markerIndex)}`;
86
+ }
87
+ async function loadClaudeTemplate() {
88
+ const template = findTemplate('CLAUDE.md');
89
+ if (!template)
90
+ return '# CLAUDE.md — Spec-Driven Development (SDD)\n';
91
+ return fs.promises.readFile(template, 'utf8');
92
+ }
93
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/cli/tool-support/claude-code.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { SkillManager } from '../../skills/SkillManager.js';
2
2
  import { RulesManager } from '../../rules/RulesManager.js';
3
3
  import { AgentManager } from '../../agents/AgentManager.js';
4
+ import { type BaseTargetInstallRequest } from './target-installer.js';
4
5
  /**
5
6
  * References to manager instances needed for generating AGENTS.md
6
7
  */
@@ -19,6 +20,9 @@ export interface InstallPaths {
19
20
  rulesPath: string;
20
21
  agentsPath: string;
21
22
  steeringPath: string;
23
+ contextsPath?: string;
24
+ hooksPath?: string;
25
+ agentExtension?: '.md' | '.toml';
22
26
  }
23
27
  /**
24
28
  * Which component types were actually installed in this run.
@@ -29,6 +33,13 @@ export interface InstalledComponents {
29
33
  rules: boolean;
30
34
  agents: boolean;
31
35
  steering: boolean;
36
+ contexts?: boolean;
37
+ hooks?: boolean;
38
+ }
39
+ export interface CodexGuidanceFailure {
40
+ name: string;
41
+ path: string;
42
+ error: string;
32
43
  }
33
44
  /**
34
45
  * Generate AGENTS.md in the project root for OpenAI Codex CLI.
@@ -40,4 +51,10 @@ export interface InstalledComponents {
40
51
  * Only sections for actually-installed component types are included,
41
52
  * and paths reflect the effective install targets (not hardcoded defaults).
42
53
  */
43
- export declare function generateCodexAgentsMd(projectRoot: string, managers: ManagerRefs, paths: InstallPaths, installed: InstalledComponents): Promise<void>;
54
+ export declare function generateCodexAgentsMd(projectRoot: string, managers: ManagerRefs, paths: InstallPaths, installed: InstalledComponents): Promise<CodexGuidanceFailure[]>;
55
+ export interface CodexInstallRequest extends BaseTargetInstallRequest {
56
+ rootGuidancePreamble?: string;
57
+ hookRunnerContent?: string;
58
+ }
59
+ export declare function installCodexTarget(request: CodexInstallRequest): Promise<import("../install-target.js").TargetInstallReport>;
60
+ export declare function renderCodexHooksConfig(hooksPath: string, projectRoot?: string): string;
@@ -1,37 +1,12 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import { findTemplate } from '../utils/find-package-root.js';
4
- /**
5
- * Build a markdown table section for a component type.
6
- * Returns the section string, or empty string if items is empty.
7
- */
8
- function buildTableSection(title, subtitle, basePath, items, pathFormatter) {
9
- if (items.length === 0)
10
- return '';
11
- let section = `### ${title} (\`${basePath}/\`)\n\n`;
12
- section += `${subtitle}\n\n`;
13
- section += `| ${title.slice(0, -1)} | Description | Path |\n`;
14
- section += '|-------|-------------|------|\n';
15
- for (const item of items) {
16
- section += `| ${item.name} | ${item.description || '—'} | \`${pathFormatter(item)}\` |\n`;
17
- }
18
- section += '\n';
19
- return section;
20
- }
21
- /**
22
- * Build a markdown bullet list section for steering docs.
23
- */
24
- function buildSteeringSection(basePath, docs) {
25
- if (docs.length === 0)
26
- return '';
27
- let section = `### Steering (\`${basePath}/\`)\n\n`;
28
- section += 'Project-specific context documents:\n\n';
29
- for (const doc of docs) {
30
- section += `- \`${basePath}/${doc}\`\n`;
31
- }
32
- section += '\n';
33
- return section;
34
- }
4
+ import { PreservingWriter, validateChildName } from '../utils/preserving-writer.js';
5
+ import { parseSourceAgent, renderCodexAgent } from './target-agent-renderer.js';
6
+ import { buildGuidanceSection, buildSteeringSection, buildTableSection, listMarkdownFiles, } from './root-guidance.js';
7
+ import { copyFlatComponents, TargetInstallSession, } from './target-installer.js';
8
+ const CODEX_HOOK_RUNNER_FILE = 'sdd-hook-runner.mjs';
9
+ const GIT_ROOT_EXPRESSION = '$(git rev-parse --show-toplevel)';
35
10
  /**
36
11
  * Load the template preamble for AGENTS.md
37
12
  */
@@ -60,9 +35,24 @@ function loadPreamble() {
60
35
  */
61
36
  export async function generateCodexAgentsMd(projectRoot, managers, paths, installed) {
62
37
  const targetPath = path.join(projectRoot, 'AGENTS.md');
38
+ const failures = [];
63
39
  if (fs.existsSync(targetPath)) {
40
+ try {
41
+ if (fs.statSync(targetPath).isDirectory()) {
42
+ const error = 'AGENTS.md destination is a directory';
43
+ failures.push({ name: 'AGENTS.md', path: targetPath, error });
44
+ console.error(' ❌ Failed to create AGENTS.md:', error);
45
+ return failures;
46
+ }
47
+ }
48
+ catch (error) {
49
+ const message = error instanceof Error ? error.message : String(error);
50
+ failures.push({ name: 'AGENTS.md', path: targetPath, error: message });
51
+ console.error(' ❌ Failed to inspect AGENTS.md:', message);
52
+ return failures;
53
+ }
64
54
  console.log(' ⏭️ AGENTS.md already exists, skipping');
65
- return;
55
+ return failures;
66
56
  }
67
57
  let content = loadPreamble();
68
58
  try {
@@ -74,18 +64,153 @@ export async function generateCodexAgentsMd(projectRoot, managers, paths, instal
74
64
  ]);
75
65
  content += buildTableSection('Skills', 'Workflow guidance invoked via slash commands:', paths.skillsPath, skills, (s) => `${paths.skillsPath}/${s.name}/`);
76
66
  content += buildTableSection('Rules', 'Always-active coding standards:', paths.rulesPath, rules, (r) => `${paths.rulesPath}/${path.basename(r.path)}`);
77
- content += buildTableSection('Agents', 'Specialized AI personas:', paths.agentsPath, agents, (a) => `${paths.agentsPath}/${path.basename(a.path)}`);
67
+ content += buildTableSection('Agents', 'Specialized AI personas:', paths.agentsPath, agents, (a) => `${paths.agentsPath}/${path.basename(a.path, path.extname(a.path))}${paths.agentExtension ?? path.extname(a.path)}`);
78
68
  content += buildSteeringSection(paths.steeringPath, steeringDocs);
69
+ if (installed.contexts)
70
+ content += buildGuidanceSection('Contexts', paths.contextsPath);
71
+ if (installed.hooks)
72
+ content += buildGuidanceSection('Hooks', paths.hooksPath);
79
73
  }
80
74
  catch (error) {
81
- console.error(' ⚠️ Failed to gather component metadata:', error.message);
75
+ const message = error instanceof Error ? error.message : String(error);
76
+ console.error(' ⚠️ Failed to gather component metadata:', message);
77
+ failures.push({ name: 'metadata', path: targetPath, error: message });
82
78
  }
83
79
  try {
84
- fs.writeFileSync(targetPath, content, 'utf-8');
80
+ fs.writeFileSync(targetPath, content, { encoding: 'utf-8', flag: 'wx' });
85
81
  console.log(' ✅ Created AGENTS.md for Codex CLI');
86
82
  }
87
83
  catch (error) {
88
- console.error(' ❌ Failed to create AGENTS.md:', error.message);
84
+ if (isAlreadyExists(error)) {
85
+ console.log(' ⏭️ AGENTS.md already exists, skipping');
86
+ return failures;
87
+ }
88
+ const message = error instanceof Error ? error.message : String(error);
89
+ failures.push({ name: 'AGENTS.md', path: targetPath, error: message });
90
+ console.error(' ❌ Failed to create AGENTS.md:', message);
91
+ }
92
+ return failures;
93
+ }
94
+ export async function installCodexTarget(request) {
95
+ const session = new TargetInstallSession('codex', request.projectRoot, request.writer ?? new PreservingWriter(request.projectRoot));
96
+ const selected = new Set(request.components);
97
+ if (selected.has('skills')) {
98
+ await session.copySkills(request.sources.skillManager, request.paths.skills);
99
+ }
100
+ if (selected.has('steering')) {
101
+ await session.copySteering(request.sources.steeringSource, request.paths.steering);
102
+ }
103
+ if (selected.has('rules')) {
104
+ await copyFlatComponents(session, 'rules', request.paths.rules, await request.sources.rulesManager.listComponents());
105
+ }
106
+ if (selected.has('contexts')) {
107
+ await copyFlatComponents(session, 'contexts', request.paths.contexts, await request.sources.contextManager.listComponents());
108
+ }
109
+ if (selected.has('agents')) {
110
+ const destinationRoot = session.resolve(request.paths.agents);
111
+ for (const descriptor of await request.sources.agentManager.listComponents()) {
112
+ const destination = path.join(destinationRoot, `${descriptor.name}.toml`);
113
+ try {
114
+ validateChildName(descriptor.name);
115
+ const source = await fs.promises.readFile(descriptor.path, 'utf8');
116
+ const rendered = renderCodexAgent(parseSourceAgent(source));
117
+ await session.write('agents', descriptor.name, destination, rendered);
118
+ }
119
+ catch (error) {
120
+ session.fail('agents', descriptor.name, destination, error);
121
+ }
122
+ }
123
+ }
124
+ if (selected.has('hooks')) {
125
+ const runnerDestination = session.resolve(path.join(request.paths.hooks, CODEX_HOOK_RUNNER_FILE));
126
+ const configDestination = session.resolve(path.join(path.dirname(request.paths.hooks), 'hooks.json'));
127
+ let runnerContent = request.hookRunnerContent ?? null;
128
+ let templateLoadFailed = false;
129
+ if (request.hookRunnerContent === undefined) {
130
+ try {
131
+ runnerContent = await loadHookRunnerTemplate();
132
+ }
133
+ catch (error) {
134
+ templateLoadFailed = true;
135
+ session.fail('hooks', CODEX_HOOK_RUNNER_FILE, runnerDestination, error);
136
+ }
137
+ }
138
+ if (runnerContent === null && !templateLoadFailed) {
139
+ session.fail('hooks', CODEX_HOOK_RUNNER_FILE, runnerDestination, new Error('Codex hook runner template not found'));
140
+ }
141
+ else if (runnerContent !== null) {
142
+ await session.write('hooks', CODEX_HOOK_RUNNER_FILE, runnerDestination, runnerContent);
143
+ await session.write('hooks', 'hooks.json', configDestination, renderCodexHooksConfig(request.paths.hooks, request.projectRoot));
144
+ }
89
145
  }
146
+ const rootContent = await buildCodexRootGuidance(request, selected, request.rootGuidancePreamble ?? loadPreamble());
147
+ await session.write('root', request.paths.rootGuidance, session.resolve(request.paths.rootGuidance), rootContent);
148
+ return session.report;
149
+ }
150
+ async function buildCodexRootGuidance(request, selected, preamble) {
151
+ const [skills, rules, agents, steeringDocs] = await Promise.all([
152
+ selected.has('skills') ? request.sources.skillManager.listSkills() : Promise.resolve([]),
153
+ selected.has('rules') ? request.sources.rulesManager.listComponents() : Promise.resolve([]),
154
+ selected.has('agents') ? request.sources.agentManager.listComponents() : Promise.resolve([]),
155
+ selected.has('steering') ? listMarkdownFiles(request.sources.steeringSource) : Promise.resolve([]),
156
+ ]);
157
+ let content = preamble;
158
+ content += buildTableSection('Skills', 'Workflow guidance invoked as skills:', request.paths.skills, skills, skill => `${request.paths.skills}/${skill.name}/`);
159
+ content += buildTableSection('Rules', 'Always-active project guidance:', request.paths.rules, rules, rule => `${request.paths.rules}/${path.basename(rule.path)}`);
160
+ content += buildTableSection('Agents', 'Specialized AI personas with role-specific model routing:', request.paths.agents, agents, agent => `${request.paths.agents}/${path.basename(agent.path, path.extname(agent.path))}.toml`);
161
+ content += buildSteeringSection(request.paths.steering, steeringDocs);
162
+ if (selected.has('contexts'))
163
+ content += buildGuidanceSection('Contexts', request.paths.contexts);
164
+ if (selected.has('hooks'))
165
+ content += buildGuidanceSection('Hooks', request.paths.hooks);
166
+ return content;
167
+ }
168
+ export function renderCodexHooksConfig(hooksPath, projectRoot = process.cwd()) {
169
+ const runner = resolveHookRunnerCommandPath(hooksPath, projectRoot);
170
+ const command = (event) => `node ${runner} ${event}`;
171
+ return `${JSON.stringify({
172
+ hooks: {
173
+ SessionStart: [{
174
+ matcher: 'startup|resume',
175
+ hooks: [{ type: 'command', command: command('session-start') }],
176
+ }],
177
+ Stop: [{
178
+ hooks: [{ type: 'command', command: command('stop') }],
179
+ }],
180
+ },
181
+ }, null, 2)}\n`;
182
+ }
183
+ function resolveHookRunnerCommandPath(hooksPath, projectRoot) {
184
+ const absoluteProjectRoot = path.resolve(projectRoot);
185
+ const absoluteRunner = path.resolve(absoluteProjectRoot, hooksPath, CODEX_HOOK_RUNNER_FILE);
186
+ const relativeRunner = path.relative(absoluteProjectRoot, absoluteRunner).split(path.sep).join('/');
187
+ if (path.isAbsolute(hooksPath)
188
+ || relativeRunner === ''
189
+ || relativeRunner === '..'
190
+ || relativeRunner.startsWith('../')) {
191
+ return shellQuote(absoluteRunner);
192
+ }
193
+ return `"${GIT_ROOT_EXPRESSION}/${shellDoubleQuote(relativeRunner)}"`;
194
+ }
195
+ function shellDoubleQuote(value) {
196
+ if (value.includes('\n') || value.includes('\r') || value.includes('\0')) {
197
+ throw new Error('Hook path contains an unsupported control character');
198
+ }
199
+ return value.replace(/(["\\$`])/g, '\\$1');
200
+ }
201
+ function shellQuote(value) {
202
+ if (value.includes('\n') || value.includes('\r') || value.includes('\0')) {
203
+ throw new Error('Hook path contains an unsupported control character');
204
+ }
205
+ return `'${value.replaceAll("'", "'\\''")}'`;
206
+ }
207
+ async function loadHookRunnerTemplate() {
208
+ const template = findTemplate('codex-hook-runner.js');
209
+ if (!template)
210
+ return null;
211
+ return fs.promises.readFile(template, 'utf8');
212
+ }
213
+ function isAlreadyExists(error) {
214
+ return typeof error === 'object' && error !== null && 'code' in error && error.code === 'EEXIST';
90
215
  }
91
216
  //# sourceMappingURL=codex.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/cli/tool-support/codex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/cli/tool-support/codex.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  export { generateCodexAgentsMd } from './codex.js';
2
- export type { ManagerRefs, InstallPaths, InstalledComponents } from './codex.js';
2
+ export type { ManagerRefs, InstallPaths, InstalledComponents, CodexGuidanceFailure } from './codex.js';
3
3
  export { createAntigravitySymlinks } from './antigravity.js';
4
- export type { AntigravityPaths } from './antigravity.js';
4
+ export type { AntigravityPaths, AntigravityFailure } from './antigravity.js';
@@ -0,0 +1,9 @@
1
+ export interface GuidanceItem {
2
+ name: string;
3
+ description: string;
4
+ path: string;
5
+ }
6
+ export declare function buildTableSection(title: string, subtitle: string, basePath: string, items: GuidanceItem[], pathFormatter: (item: GuidanceItem) => string): string;
7
+ export declare function buildSteeringSection(basePath: string, docs: string[]): string;
8
+ export declare function buildGuidanceSection(title: string, basePath: string | undefined): string;
9
+ export declare function listMarkdownFiles(directory: string): Promise<string[]>;
@@ -0,0 +1,40 @@
1
+ import * as fs from 'fs';
2
+ export function buildTableSection(title, subtitle, basePath, items, pathFormatter) {
3
+ if (items.length === 0)
4
+ return '';
5
+ let section = `### ${title} (\`${basePath}/\`)\n\n`;
6
+ section += `${subtitle}\n\n`;
7
+ section += `| ${title.slice(0, -1)} | Description | Path |\n`;
8
+ section += '|-------|-------------|------|\n';
9
+ for (const item of items) {
10
+ section += `| ${item.name} | ${item.description || '—'} | \`${pathFormatter(item)}\` |\n`;
11
+ }
12
+ section += '\n';
13
+ return section;
14
+ }
15
+ export function buildSteeringSection(basePath, docs) {
16
+ if (docs.length === 0)
17
+ return '';
18
+ let section = `### Steering (\`${basePath}/\`)\n\n`;
19
+ section += 'Project-specific context documents:\n\n';
20
+ for (const doc of docs) {
21
+ section += `- \`${basePath}/${doc}\`\n`;
22
+ }
23
+ section += '\n';
24
+ return section;
25
+ }
26
+ export function buildGuidanceSection(title, basePath) {
27
+ if (!basePath)
28
+ return '';
29
+ return `### ${title} (\`${basePath}/\`)\n\nRead the relevant guidance files from this directory on demand.\n\n`;
30
+ }
31
+ export async function listMarkdownFiles(directory) {
32
+ try {
33
+ const entries = await fs.promises.readdir(directory);
34
+ return entries.filter(file => file.endsWith('.md'));
35
+ }
36
+ catch {
37
+ return [];
38
+ }
39
+ }
40
+ //# sourceMappingURL=root-guidance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-guidance.js","sourceRoot":"","sources":["../../../src/cli/tool-support/root-guidance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAQzB,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,QAAgB,EAChB,QAAgB,EAChB,KAAqB,EACrB,aAA6C;IAE7C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,IAAI,OAAO,GAAG,OAAO,KAAK,OAAO,QAAQ,UAAU,CAAC;IACpD,OAAO,IAAI,GAAG,QAAQ,MAAM,CAAC;IAC7B,OAAO,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,2BAA2B,CAAC;IAC9D,OAAO,IAAI,kCAAkC,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,WAAW,IAAI,GAAG,QAAQ,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC5F,CAAC;IACD,OAAO,IAAI,IAAI,CAAC;IAChB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,IAAc;IACnE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,IAAI,OAAO,GAAG,mBAAmB,QAAQ,UAAU,CAAC;IACpD,OAAO,IAAI,yCAAyC,CAAC;IACrD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,IAAI,OAAO,QAAQ,IAAI,GAAG,MAAM,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,IAAI,CAAC;IAChB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,QAA4B;IAC9E,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,OAAO,OAAO,KAAK,OAAO,QAAQ,6EAA6E,CAAC;AAClH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAiB;IACvD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type AgentRole } from '../install-target.js';
2
+ export interface SourceAgent {
3
+ name: string;
4
+ description: string;
5
+ role: AgentRole;
6
+ expertise: string;
7
+ instructions: string;
8
+ }
9
+ export declare function parseSourceAgent(content: string): SourceAgent;
10
+ export declare function renderClaudeCodeAgent(agent: SourceAgent): string;
11
+ export declare function renderCodexAgent(agent: SourceAgent): string;
@@ -0,0 +1,52 @@
1
+ import { ROLE_MODEL_ROUTES, } from '../install-target.js';
2
+ export function parseSourceAgent(content) {
3
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
4
+ if (!match)
5
+ throw new Error('Agent source requires YAML frontmatter');
6
+ const metadata = new Map();
7
+ for (const line of match[1].split(/\r?\n/)) {
8
+ const separator = line.indexOf(':');
9
+ if (separator <= 0)
10
+ continue;
11
+ metadata.set(line.slice(0, separator).trim(), stripQuotes(line.slice(separator + 1).trim()));
12
+ }
13
+ const role = metadata.get('role');
14
+ if (!role || !(role in ROLE_MODEL_ROUTES))
15
+ throw new Error(`Unsupported agent role: ${role ?? '(missing)'}`);
16
+ return {
17
+ name: required(metadata, 'name'),
18
+ description: required(metadata, 'description'),
19
+ role: role,
20
+ expertise: metadata.get('expertise') ?? '',
21
+ instructions: match[2].trim(),
22
+ };
23
+ }
24
+ export function renderClaudeCodeAgent(agent) {
25
+ const model = ROLE_MODEL_ROUTES[agent.role].claudeCode.model;
26
+ return `---\nname: ${agent.name}\ndescription: ${agent.description}\nrole: ${agent.role}\nexpertise: ${agent.expertise}\nmodel: ${model}\n---\n\n${agent.instructions}\n`;
27
+ }
28
+ export function renderCodexAgent(agent) {
29
+ const route = ROLE_MODEL_ROUTES[agent.role].codex;
30
+ return [
31
+ `name = ${JSON.stringify(agent.name)}`,
32
+ `description = ${JSON.stringify(agent.description)}`,
33
+ `model = ${JSON.stringify(route.model)}`,
34
+ `model_reasoning_effort = ${JSON.stringify(route.reasoningEffort)}`,
35
+ `developer_instructions = ${JSON.stringify(agent.instructions)}`,
36
+ '',
37
+ ].join('\n');
38
+ }
39
+ function required(metadata, key) {
40
+ const value = metadata.get(key);
41
+ if (!value)
42
+ throw new Error(`Agent source requires ${key}`);
43
+ return value;
44
+ }
45
+ function stripQuotes(value) {
46
+ if (value.length >= 2 && ((value.startsWith('"') && value.endsWith('"')) ||
47
+ (value.startsWith("'") && value.endsWith("'")))) {
48
+ return value.slice(1, -1);
49
+ }
50
+ return value;
51
+ }
52
+ //# sourceMappingURL=target-agent-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-agent-renderer.js","sourceRoot":"","sources":["../../../src/cli/tool-support/target-agent-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { SkillManager } from '../../skills/SkillManager.js';
2
+ import type { RulesManager } from '../../rules/RulesManager.js';
3
+ import type { ContextManager } from '../../contexts/ContextManager.js';
4
+ import type { AgentManager } from '../../agents/AgentManager.js';
5
+ import type { HookLoader } from '../../hooks/HookLoader.js';
6
+ import type { ComponentType, InstallTarget, ResolvedInstallPaths, TargetInstallReport } from '../install-target.js';
7
+ import { PreservingWriter } from '../utils/preserving-writer.js';
8
+ export interface TargetSources {
9
+ skillManager: SkillManager;
10
+ rulesManager: RulesManager;
11
+ contextManager: ContextManager;
12
+ agentManager: AgentManager;
13
+ hookLoader: HookLoader;
14
+ steeringSource: string;
15
+ }
16
+ export interface BaseTargetInstallRequest {
17
+ projectRoot: string;
18
+ paths: ResolvedInstallPaths;
19
+ components: readonly ComponentType[];
20
+ sources: TargetSources;
21
+ writer?: PreservingWriter;
22
+ }
23
+ export declare class TargetInstallSession {
24
+ readonly target: InstallTarget;
25
+ readonly projectRoot: string;
26
+ readonly writer: PreservingWriter;
27
+ readonly report: TargetInstallReport;
28
+ constructor(target: InstallTarget, projectRoot: string, writer: PreservingWriter);
29
+ resolve(configuredPath: string): string;
30
+ label(destination: string): string;
31
+ write(component: ComponentType | 'root', name: string, destination: string, content: string): Promise<void>;
32
+ copy(component: ComponentType | 'root', name: string, source: string, destination: string): Promise<void>;
33
+ copySkills(sourceManager: SkillManager, configuredPath: string): Promise<void>;
34
+ copySteering(source: string, configuredPath: string): Promise<void>;
35
+ fail(component: ComponentType | 'root', name: string, destination: string, error: unknown): void;
36
+ }
37
+ export declare function copyFlatComponents(session: TargetInstallSession, component: 'rules' | 'contexts', configuredPath: string, descriptors: Array<{
38
+ name: string;
39
+ path: string;
40
+ }>): Promise<void>;