openplanr 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.
- package/dist/agents/agent-factory.d.ts +7 -0
- package/dist/agents/agent-factory.d.ts.map +1 -0
- package/dist/agents/agent-factory.js +22 -0
- package/dist/agents/agent-factory.js.map +1 -0
- package/dist/agents/claude-agent.d.ts +13 -0
- package/dist/agents/claude-agent.d.ts.map +1 -0
- package/dist/agents/claude-agent.js +48 -0
- package/dist/agents/claude-agent.js.map +1 -0
- package/dist/agents/codex-agent.d.ts +13 -0
- package/dist/agents/codex-agent.d.ts.map +1 -0
- package/dist/agents/codex-agent.js +47 -0
- package/dist/agents/codex-agent.js.map +1 -0
- package/dist/agents/cursor-agent.d.ts +13 -0
- package/dist/agents/cursor-agent.d.ts.map +1 -0
- package/dist/agents/cursor-agent.js +40 -0
- package/dist/agents/cursor-agent.js.map +1 -0
- package/dist/agents/implementation-bridge.d.ts +21 -0
- package/dist/agents/implementation-bridge.d.ts.map +1 -0
- package/dist/agents/implementation-bridge.js +173 -0
- package/dist/agents/implementation-bridge.js.map +1 -0
- package/dist/agents/index.d.ts +6 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +5 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/prompt-composer.d.ts +30 -0
- package/dist/agents/prompt-composer.d.ts.map +1 -0
- package/dist/agents/prompt-composer.js +81 -0
- package/dist/agents/prompt-composer.js.map +1 -0
- package/dist/agents/task-parser.d.ts +38 -0
- package/dist/agents/task-parser.d.ts.map +1 -0
- package/dist/agents/task-parser.js +83 -0
- package/dist/agents/task-parser.js.map +1 -0
- package/dist/agents/types.d.ts +23 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +8 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/utils.d.ts +9 -0
- package/dist/agents/utils.d.ts.map +1 -0
- package/dist/agents/utils.js +21 -0
- package/dist/agents/utils.js.map +1 -0
- package/dist/ai/codebase/context-builder.d.ts +31 -0
- package/dist/ai/codebase/context-builder.d.ts.map +1 -0
- package/dist/ai/codebase/context-builder.js +93 -0
- package/dist/ai/codebase/context-builder.js.map +1 -0
- package/dist/ai/codebase/file-reader.d.ts +22 -0
- package/dist/ai/codebase/file-reader.d.ts.map +1 -0
- package/dist/ai/codebase/file-reader.js +111 -0
- package/dist/ai/codebase/file-reader.js.map +1 -0
- package/dist/ai/codebase/index.d.ts +5 -0
- package/dist/ai/codebase/index.d.ts.map +1 -0
- package/dist/ai/codebase/index.js +5 -0
- package/dist/ai/codebase/index.js.map +1 -0
- package/dist/ai/codebase/stack-detector.d.ts +18 -0
- package/dist/ai/codebase/stack-detector.d.ts.map +1 -0
- package/dist/ai/codebase/stack-detector.js +147 -0
- package/dist/ai/codebase/stack-detector.js.map +1 -0
- package/dist/ai/codebase/tree-generator.d.ts +8 -0
- package/dist/ai/codebase/tree-generator.d.ts.map +1 -0
- package/dist/ai/codebase/tree-generator.js +85 -0
- package/dist/ai/codebase/tree-generator.js.map +1 -0
- package/dist/ai/errors.d.ts +22 -0
- package/dist/ai/errors.d.ts.map +1 -0
- package/dist/ai/errors.js +70 -0
- package/dist/ai/errors.js.map +1 -0
- package/dist/ai/index.d.ts +11 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +10 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/prompts/prompt-builder.d.ts +42 -0
- package/dist/ai/prompts/prompt-builder.d.ts.map +1 -0
- package/dist/ai/prompts/prompt-builder.js +96 -0
- package/dist/ai/prompts/prompt-builder.js.map +1 -0
- package/dist/ai/prompts/system-prompts.d.ts +13 -0
- package/dist/ai/prompts/system-prompts.d.ts.map +1 -0
- package/dist/ai/prompts/system-prompts.js +115 -0
- package/dist/ai/prompts/system-prompts.js.map +1 -0
- package/dist/ai/provider-factory.d.ts +10 -0
- package/dist/ai/provider-factory.d.ts.map +1 -0
- package/dist/ai/provider-factory.js +33 -0
- package/dist/ai/provider-factory.js.map +1 -0
- package/dist/ai/providers/anthropic-provider.d.ts +22 -0
- package/dist/ai/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/ai/providers/anthropic-provider.js +82 -0
- package/dist/ai/providers/anthropic-provider.js.map +1 -0
- package/dist/ai/providers/ollama-provider.d.ts +13 -0
- package/dist/ai/providers/ollama-provider.d.ts.map +1 -0
- package/dist/ai/providers/ollama-provider.js +16 -0
- package/dist/ai/providers/ollama-provider.js.map +1 -0
- package/dist/ai/providers/openai-provider.d.ts +17 -0
- package/dist/ai/providers/openai-provider.d.ts.map +1 -0
- package/dist/ai/providers/openai-provider.js +58 -0
- package/dist/ai/providers/openai-provider.js.map +1 -0
- package/dist/ai/schemas/ai-response-schemas.d.ts +422 -0
- package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -0
- package/dist/ai/schemas/ai-response-schemas.js +86 -0
- package/dist/ai/schemas/ai-response-schemas.js.map +1 -0
- package/dist/ai/types.d.ts +40 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +16 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/cli/commands/config.d.ts +8 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +112 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/epic.d.ts +7 -0
- package/dist/cli/commands/epic.d.ts.map +1 -1
- package/dist/cli/commands/epic.js +161 -31
- package/dist/cli/commands/epic.js.map +1 -1
- package/dist/cli/commands/feature.d.ts +6 -0
- package/dist/cli/commands/feature.d.ts.map +1 -1
- package/dist/cli/commands/feature.js +143 -30
- package/dist/cli/commands/feature.js.map +1 -1
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +48 -6
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +15 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +259 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/refine.d.ts +9 -0
- package/dist/cli/commands/refine.d.ts.map +1 -0
- package/dist/cli/commands/refine.js +81 -0
- package/dist/cli/commands/refine.js.map +1 -0
- package/dist/cli/commands/story.d.ts +6 -0
- package/dist/cli/commands/story.d.ts.map +1 -1
- package/dist/cli/commands/story.js +172 -43
- package/dist/cli/commands/story.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +12 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +226 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/task.d.ts +9 -0
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +348 -35
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/index.js +10 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/models/schema.d.ts +41 -0
- package/dist/models/schema.d.ts.map +1 -1
- package/dist/models/schema.js +9 -0
- package/dist/models/schema.js.map +1 -1
- package/dist/models/types.d.ts +9 -0
- package/dist/models/types.d.ts.map +1 -1
- package/dist/services/ai-service.d.ts +40 -0
- package/dist/services/ai-service.d.ts.map +1 -0
- package/dist/services/ai-service.js +150 -0
- package/dist/services/ai-service.js.map +1 -0
- package/dist/services/artifact-gathering.d.ts +49 -0
- package/dist/services/artifact-gathering.d.ts.map +1 -0
- package/dist/services/artifact-gathering.js +128 -0
- package/dist/services/artifact-gathering.js.map +1 -0
- package/dist/services/artifact-service.d.ts +47 -0
- package/dist/services/artifact-service.d.ts.map +1 -1
- package/dist/services/artifact-service.js +166 -0
- package/dist/services/artifact-service.js.map +1 -1
- package/dist/services/credentials-service.d.ts +22 -0
- package/dist/services/credentials-service.d.ts.map +1 -0
- package/dist/services/credentials-service.js +58 -0
- package/dist/services/credentials-service.js.map +1 -0
- package/dist/services/id-service.d.ts.map +1 -1
- package/dist/services/id-service.js +8 -5
- package/dist/services/id-service.js.map +1 -1
- package/dist/services/prompt-service.d.ts +1 -0
- package/dist/services/prompt-service.d.ts.map +1 -1
- package/dist/services/prompt-service.js +4 -1
- package/dist/services/prompt-service.js.map +1 -1
- package/dist/services/template-service.d.ts.map +1 -1
- package/dist/services/template-service.js +1 -0
- package/dist/services/template-service.js.map +1 -1
- package/dist/templates/checklists/agile-checklist.md.hbs +8 -8
- package/dist/templates/epics/epic.md.hbs +8 -2
- package/dist/templates/features/feature.md.hbs +3 -3
- package/dist/templates/rules/cursor/2001-agile-create-epic.mdc.hbs +1 -1
- package/dist/templates/rules/cursor/2002-agile-create-features.mdc.hbs +1 -1
- package/dist/templates/rules/cursor/2003-agile-create-user-story.mdc.hbs +1 -1
- package/dist/templates/stories/user-story.md.hbs +2 -2
- package/dist/templates/tasks/task-list.md.hbs +26 -3
- package/package.json +4 -2
- package/dist/templates/templates/adrs/adr-general.md.hbs +0 -46
- package/dist/templates/templates/checklists/agile-checklist.md.hbs +0 -49
- package/dist/templates/templates/epics/epic.md.hbs +0 -46
- package/dist/templates/templates/features/feature.md.hbs +0 -42
- package/dist/templates/templates/rules/claude/CLAUDE.md.hbs +0 -63
- package/dist/templates/templates/rules/codex/AGENTS.md.hbs +0 -28
- package/dist/templates/templates/rules/cursor/2000-agile-checklist.mdc.hbs +0 -33
- package/dist/templates/templates/rules/cursor/2001-agile-create-epic.mdc.hbs +0 -35
- package/dist/templates/templates/rules/cursor/2002-agile-create-features.mdc.hbs +0 -35
- package/dist/templates/templates/rules/cursor/2003-agile-create-user-story.mdc.hbs +0 -31
- package/dist/templates/templates/rules/cursor/2100-create-task-list.mdc.hbs +0 -36
- package/dist/templates/templates/rules/cursor/2101-implement-task-list.mdc.hbs +0 -28
- package/dist/templates/templates/stories/gherkin.feature.hbs +0 -13
- package/dist/templates/templates/stories/user-story.md.hbs +0 -28
- package/dist/templates/templates/tasks/task-list.md.hbs +0 -24
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory for creating coding agent instances.
|
|
3
|
+
*/
|
|
4
|
+
import type { CodingAgent } from './types.js';
|
|
5
|
+
import type { CodingAgentName } from '../models/types.js';
|
|
6
|
+
export declare function createAgent(name: CodingAgentName): Promise<CodingAgent>;
|
|
7
|
+
//# sourceMappingURL=agent-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-factory.d.ts","sourceRoot":"","sources":["../../src/agents/agent-factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAiB7E"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory for creating coding agent instances.
|
|
3
|
+
*/
|
|
4
|
+
export async function createAgent(name) {
|
|
5
|
+
switch (name) {
|
|
6
|
+
case 'claude': {
|
|
7
|
+
const { ClaudeAgent } = await import('./claude-agent.js');
|
|
8
|
+
return new ClaudeAgent();
|
|
9
|
+
}
|
|
10
|
+
case 'cursor': {
|
|
11
|
+
const { CursorAgent } = await import('./cursor-agent.js');
|
|
12
|
+
return new CursorAgent();
|
|
13
|
+
}
|
|
14
|
+
case 'codex': {
|
|
15
|
+
const { CodexAgent } = await import('./codex-agent.js');
|
|
16
|
+
return new CodexAgent();
|
|
17
|
+
}
|
|
18
|
+
default:
|
|
19
|
+
throw new Error(`Unknown coding agent: ${name}. Supported: claude, cursor, codex.`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=agent-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-factory.js","sourceRoot":"","sources":["../../src/agents/agent-factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAqB;IACrD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAC1D,OAAO,IAAI,WAAW,EAAE,CAAC;QAC3B,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAC1D,OAAO,IAAI,WAAW,EAAE,CAAC;QAC3B,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACxD,OAAO,IAAI,UAAU,EAAE,CAAC;QAC1B,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,qCAAqC,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code CLI agent adapter.
|
|
3
|
+
*
|
|
4
|
+
* Invokes the `claude` CLI binary with --print mode, piping
|
|
5
|
+
* the implementation prompt via stdin and streaming output.
|
|
6
|
+
*/
|
|
7
|
+
import type { CodingAgent, AgentOptions, AgentResult } from './types.js';
|
|
8
|
+
export declare class ClaudeAgent implements CodingAgent {
|
|
9
|
+
readonly name = "claude";
|
|
10
|
+
isAvailable(): Promise<boolean>;
|
|
11
|
+
execute(prompt: string, options: AgentOptions): Promise<AgentResult>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=claude-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-agent.d.ts","sourceRoot":"","sources":["../../src/agents/claude-agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzE,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,YAAY;IAEnB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;CAuC3E"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code CLI agent adapter.
|
|
3
|
+
*
|
|
4
|
+
* Invokes the `claude` CLI binary with --print mode, piping
|
|
5
|
+
* the implementation prompt via stdin and streaming output.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import { which } from './utils.js';
|
|
9
|
+
export class ClaudeAgent {
|
|
10
|
+
name = 'claude';
|
|
11
|
+
async isAvailable() {
|
|
12
|
+
return (await which('claude')) !== null;
|
|
13
|
+
}
|
|
14
|
+
async execute(prompt, options) {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
const args = ['--print', '-p', prompt];
|
|
17
|
+
const child = spawn('claude', args, {
|
|
18
|
+
cwd: options.cwd,
|
|
19
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
20
|
+
env: { ...process.env },
|
|
21
|
+
});
|
|
22
|
+
const chunks = [];
|
|
23
|
+
child.stdout.on('data', (data) => {
|
|
24
|
+
const text = data.toString();
|
|
25
|
+
chunks.push(text);
|
|
26
|
+
if (options.stream) {
|
|
27
|
+
process.stdout.write(text);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
child.stderr.on('data', (data) => {
|
|
31
|
+
const text = data.toString();
|
|
32
|
+
if (options.stream) {
|
|
33
|
+
process.stderr.write(text);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
child.on('error', (err) => {
|
|
37
|
+
reject(new Error(`Failed to launch claude CLI: ${err.message}`));
|
|
38
|
+
});
|
|
39
|
+
child.on('close', (code) => {
|
|
40
|
+
resolve({
|
|
41
|
+
output: chunks.join(''),
|
|
42
|
+
exitCode: code ?? 1,
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=claude-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-agent.js","sourceRoot":"","sources":["../../src/agents/claude-agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,MAAM,OAAO,WAAW;IACb,IAAI,GAAG,QAAQ,CAAC;IAEzB,KAAK,CAAC,WAAW;QACf,OAAO,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAAqB;QACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAEvC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE;gBAClC,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;aACxB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAa,EAAE,CAAC;YAE5B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,OAAO,CAAC;oBACN,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvB,QAAQ,EAAE,IAAI,IAAI,CAAC;iBACpB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Codex CLI agent adapter.
|
|
3
|
+
*
|
|
4
|
+
* Invokes the `codex` CLI binary with the implementation prompt
|
|
5
|
+
* and streams output in real time.
|
|
6
|
+
*/
|
|
7
|
+
import type { CodingAgent, AgentOptions, AgentResult } from './types.js';
|
|
8
|
+
export declare class CodexAgent implements CodingAgent {
|
|
9
|
+
readonly name = "codex";
|
|
10
|
+
isAvailable(): Promise<boolean>;
|
|
11
|
+
execute(prompt: string, options: AgentOptions): Promise<AgentResult>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=codex-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-agent.d.ts","sourceRoot":"","sources":["../../src/agents/codex-agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzE,qBAAa,UAAW,YAAW,WAAW;IAC5C,QAAQ,CAAC,IAAI,WAAW;IAElB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;CAqC3E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Codex CLI agent adapter.
|
|
3
|
+
*
|
|
4
|
+
* Invokes the `codex` CLI binary with the implementation prompt
|
|
5
|
+
* and streams output in real time.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import { which } from './utils.js';
|
|
9
|
+
export class CodexAgent {
|
|
10
|
+
name = 'codex';
|
|
11
|
+
async isAvailable() {
|
|
12
|
+
return (await which('codex')) !== null;
|
|
13
|
+
}
|
|
14
|
+
async execute(prompt, options) {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
const child = spawn('codex', [prompt], {
|
|
17
|
+
cwd: options.cwd,
|
|
18
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
19
|
+
env: { ...process.env },
|
|
20
|
+
});
|
|
21
|
+
const chunks = [];
|
|
22
|
+
child.stdout.on('data', (data) => {
|
|
23
|
+
const text = data.toString();
|
|
24
|
+
chunks.push(text);
|
|
25
|
+
if (options.stream) {
|
|
26
|
+
process.stdout.write(text);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
child.stderr.on('data', (data) => {
|
|
30
|
+
const text = data.toString();
|
|
31
|
+
if (options.stream) {
|
|
32
|
+
process.stderr.write(text);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
child.on('error', (err) => {
|
|
36
|
+
reject(new Error(`Failed to launch codex CLI: ${err.message}`));
|
|
37
|
+
});
|
|
38
|
+
child.on('close', (code) => {
|
|
39
|
+
resolve({
|
|
40
|
+
output: chunks.join(''),
|
|
41
|
+
exitCode: code ?? 1,
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=codex-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-agent.js","sourceRoot":"","sources":["../../src/agents/codex-agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,MAAM,OAAO,UAAU;IACZ,IAAI,GAAG,OAAO,CAAC;IAExB,KAAK,CAAC,WAAW;QACf,OAAO,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAAqB;QACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE;gBACrC,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;aACxB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAa,EAAE,CAAC;YAE5B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,OAAO,CAAC;oBACN,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvB,QAAQ,EAAE,IAAI,IAAI,CAAC;iBACpB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor agent adapter.
|
|
3
|
+
*
|
|
4
|
+
* Since Cursor is GUI-based, this agent writes the implementation
|
|
5
|
+
* prompt to a file that Cursor can read from its prompt panel.
|
|
6
|
+
*/
|
|
7
|
+
import type { CodingAgent, AgentOptions, AgentResult } from './types.js';
|
|
8
|
+
export declare class CursorAgent implements CodingAgent {
|
|
9
|
+
readonly name = "cursor";
|
|
10
|
+
isAvailable(): Promise<boolean>;
|
|
11
|
+
execute(prompt: string, options: AgentOptions): Promise<AgentResult>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=cursor-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-agent.d.ts","sourceRoot":"","sources":["../../src/agents/cursor-agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzE,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,YAAY;IAEnB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAO/B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;CA2B3E"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor agent adapter.
|
|
3
|
+
*
|
|
4
|
+
* Since Cursor is GUI-based, this agent writes the implementation
|
|
5
|
+
* prompt to a file that Cursor can read from its prompt panel.
|
|
6
|
+
*/
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { writeFile, ensureDir } from '../utils/fs.js';
|
|
9
|
+
export class CursorAgent {
|
|
10
|
+
name = 'cursor';
|
|
11
|
+
async isAvailable() {
|
|
12
|
+
// Cursor is available if the project has a .cursor directory
|
|
13
|
+
// or the cursor binary exists
|
|
14
|
+
const fse = await import('fs-extra');
|
|
15
|
+
return fse.pathExists(path.join(process.cwd(), '.cursor'));
|
|
16
|
+
}
|
|
17
|
+
async execute(prompt, options) {
|
|
18
|
+
const promptDir = path.join(options.cwd, '.cursor', 'prompts');
|
|
19
|
+
await ensureDir(promptDir);
|
|
20
|
+
// Extract task ID from prompt for filename
|
|
21
|
+
const taskMatch = prompt.match(/TASK-\d{3}/);
|
|
22
|
+
const filename = taskMatch ? `${taskMatch[0]}.md` : `implement-${Date.now()}.md`;
|
|
23
|
+
const filePath = path.join(promptDir, filename);
|
|
24
|
+
await writeFile(filePath, prompt);
|
|
25
|
+
const output = [
|
|
26
|
+
`Implementation prompt saved to: ${filePath}`,
|
|
27
|
+
'',
|
|
28
|
+
'To implement in Cursor:',
|
|
29
|
+
' 1. Open Cursor in this project',
|
|
30
|
+
' 2. Open the Command Palette (Cmd+Shift+P)',
|
|
31
|
+
' 3. Run "Cursor: Open Prompt" and select the saved file',
|
|
32
|
+
' 4. Or paste the prompt directly into Cursor\'s AI chat',
|
|
33
|
+
].join('\n');
|
|
34
|
+
if (options.stream) {
|
|
35
|
+
console.log(output);
|
|
36
|
+
}
|
|
37
|
+
return { output, exitCode: 0 };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=cursor-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-agent.js","sourceRoot":"","sources":["../../src/agents/cursor-agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,OAAO,WAAW;IACb,IAAI,GAAG,QAAQ,CAAC;IAEzB,KAAK,CAAC,WAAW;QACf,6DAA6D;QAC7D,8BAA8B;QAC9B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACrC,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAAqB;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/D,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;QAE3B,2CAA2C;QAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;QACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEhD,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG;YACb,mCAAmC,QAAQ,EAAE;YAC7C,EAAE;YACF,yBAAyB;YACzB,kCAAkC;YAClC,6CAA6C;YAC7C,0DAA0D;YAC1D,0DAA0D;SAC3D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task implementation bridge.
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates the full flow:
|
|
5
|
+
* 1. Read and parse the task artifact
|
|
6
|
+
* 2. Resolve target subtask(s)
|
|
7
|
+
* 3. Gather parent chain context (story → feature → epic)
|
|
8
|
+
* 4. Build codebase context
|
|
9
|
+
* 5. Compose the implementation prompt
|
|
10
|
+
* 6. Dispatch to the configured coding agent
|
|
11
|
+
*/
|
|
12
|
+
import type { OpenPlanrConfig } from '../models/types.js';
|
|
13
|
+
export interface ImplementOptions {
|
|
14
|
+
subtask?: string;
|
|
15
|
+
next?: boolean;
|
|
16
|
+
agent?: string;
|
|
17
|
+
dryRun?: boolean;
|
|
18
|
+
markDone?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function executeImplementation(projectDir: string, config: OpenPlanrConfig, taskId: string, opts: ImplementOptions): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=implementation-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implementation-bridge.d.ts","sourceRoot":"","sources":["../../src/agents/implementation-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,oBAAoB,CAAC;AAY3E,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CA6Kf"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task implementation bridge.
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates the full flow:
|
|
5
|
+
* 1. Read and parse the task artifact
|
|
6
|
+
* 2. Resolve target subtask(s)
|
|
7
|
+
* 3. Gather parent chain context (story → feature → epic)
|
|
8
|
+
* 4. Build codebase context
|
|
9
|
+
* 5. Compose the implementation prompt
|
|
10
|
+
* 6. Dispatch to the configured coding agent
|
|
11
|
+
*/
|
|
12
|
+
import { readArtifact, readArtifactRaw, getParentChain, } from '../services/artifact-service.js';
|
|
13
|
+
import { createAgent } from './agent-factory.js';
|
|
14
|
+
import { parseTaskMarkdown, findSubtasks, getNextPending, formatSubtaskList } from './task-parser.js';
|
|
15
|
+
import { composeImplementationPrompt } from './prompt-composer.js';
|
|
16
|
+
import { logger } from '../utils/logger.js';
|
|
17
|
+
import chalk from 'chalk';
|
|
18
|
+
export async function executeImplementation(projectDir, config, taskId, opts) {
|
|
19
|
+
// 1. Read the task artifact
|
|
20
|
+
const taskData = await readArtifact(projectDir, config, 'task', taskId);
|
|
21
|
+
if (!taskData) {
|
|
22
|
+
logger.error(`Task list ${taskId} not found.`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const taskRaw = await readArtifactRaw(projectDir, config, 'task', taskId);
|
|
26
|
+
logger.heading(`Implement: ${taskId}`);
|
|
27
|
+
// 2. Parse subtasks
|
|
28
|
+
const allSubtasks = parseTaskMarkdown(taskData.content);
|
|
29
|
+
if (allSubtasks.length === 0) {
|
|
30
|
+
logger.warn('No subtasks found in this task list.');
|
|
31
|
+
logger.info('Task list content:');
|
|
32
|
+
console.log(taskData.content);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// 3. Resolve target subtask(s)
|
|
36
|
+
let targetSubtasks = allSubtasks;
|
|
37
|
+
if (opts.next) {
|
|
38
|
+
const next = getNextPending(allSubtasks);
|
|
39
|
+
if (!next) {
|
|
40
|
+
logger.success('All subtasks are completed!');
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
targetSubtasks = [next];
|
|
44
|
+
logger.info(`Next pending: ${next.id} ${next.title}`);
|
|
45
|
+
}
|
|
46
|
+
else if (opts.subtask) {
|
|
47
|
+
const matches = findSubtasks(allSubtasks, opts.subtask);
|
|
48
|
+
if (matches.length === 0) {
|
|
49
|
+
logger.error(`No subtask matching "${opts.subtask}" found.`);
|
|
50
|
+
logger.dim('Available subtasks:');
|
|
51
|
+
console.log(formatSubtaskList(allSubtasks));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
targetSubtasks = matches;
|
|
55
|
+
logger.info(`Matched ${matches.length} subtask(s):`);
|
|
56
|
+
for (const m of matches) {
|
|
57
|
+
logger.dim(` ${m.id} ${m.title}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Implementing all subtasks
|
|
62
|
+
logger.info(`Implementing all ${allSubtasks.length} subtasks`);
|
|
63
|
+
}
|
|
64
|
+
// 4. Gather parent chain context
|
|
65
|
+
const ora = (await import('ora')).default;
|
|
66
|
+
const spinner = ora('Preparing implementation context...').start();
|
|
67
|
+
const parents = await getParentChain(projectDir, config, 'task', taskId);
|
|
68
|
+
let storyContent;
|
|
69
|
+
let featureContent;
|
|
70
|
+
let epicContent;
|
|
71
|
+
const storyId = taskData.data.storyId;
|
|
72
|
+
if (storyId) {
|
|
73
|
+
storyContent = (await readArtifactRaw(projectDir, config, 'story', storyId)) || undefined;
|
|
74
|
+
spinner.text = `Read parent story ${storyId}`;
|
|
75
|
+
}
|
|
76
|
+
if (parents.feature) {
|
|
77
|
+
const featureId = parents.story?.data?.featureId;
|
|
78
|
+
if (featureId) {
|
|
79
|
+
featureContent = (await readArtifactRaw(projectDir, config, 'feature', featureId)) || undefined;
|
|
80
|
+
spinner.text = `Read parent feature ${featureId}`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (parents.epic) {
|
|
84
|
+
const epicId = parents.feature?.data?.epicId;
|
|
85
|
+
if (epicId) {
|
|
86
|
+
epicContent = (await readArtifactRaw(projectDir, config, 'epic', epicId)) || undefined;
|
|
87
|
+
spinner.text = `Read parent epic ${epicId}`;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// 5. Build codebase context
|
|
91
|
+
spinner.text = 'Scanning codebase...';
|
|
92
|
+
let codebaseContext;
|
|
93
|
+
try {
|
|
94
|
+
const { buildCodebaseContext, formatCodebaseContext, extractKeywords } = await import('../ai/codebase/index.js');
|
|
95
|
+
const textToAnalyze = [
|
|
96
|
+
taskData.content,
|
|
97
|
+
storyContent || '',
|
|
98
|
+
featureContent || '',
|
|
99
|
+
].join(' ');
|
|
100
|
+
const keywords = extractKeywords(textToAnalyze);
|
|
101
|
+
const ctx = await buildCodebaseContext(projectDir, keywords);
|
|
102
|
+
codebaseContext = formatCodebaseContext(ctx);
|
|
103
|
+
if (ctx.techStack) {
|
|
104
|
+
spinner.text = `Stack: ${ctx.techStack.language}${ctx.techStack.framework ? ' + ' + ctx.techStack.framework : ''}`;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Codebase scanning is best-effort
|
|
109
|
+
}
|
|
110
|
+
spinner.stop();
|
|
111
|
+
// Show context summary
|
|
112
|
+
logger.success(`Read ${taskId} (${allSubtasks.length} subtasks)`);
|
|
113
|
+
if (storyContent)
|
|
114
|
+
logger.success(`Read parent story`);
|
|
115
|
+
if (featureContent)
|
|
116
|
+
logger.success(`Read parent feature`);
|
|
117
|
+
if (epicContent)
|
|
118
|
+
logger.success(`Read parent epic`);
|
|
119
|
+
if (codebaseContext)
|
|
120
|
+
logger.success(`Scanned codebase`);
|
|
121
|
+
// 6. Compose prompt
|
|
122
|
+
const prompt = composeImplementationPrompt({
|
|
123
|
+
taskId,
|
|
124
|
+
taskTitle: taskData.data.title || taskId,
|
|
125
|
+
taskContent: taskData.content,
|
|
126
|
+
targetSubtasks,
|
|
127
|
+
allSubtasks,
|
|
128
|
+
storyContent,
|
|
129
|
+
featureContent,
|
|
130
|
+
epicContent,
|
|
131
|
+
codebaseContext,
|
|
132
|
+
});
|
|
133
|
+
// 7. Handle dry run
|
|
134
|
+
if (opts.dryRun) {
|
|
135
|
+
logger.heading('Dry Run — Composed Prompt:');
|
|
136
|
+
console.log(chalk.dim('━'.repeat(60)));
|
|
137
|
+
console.log(prompt);
|
|
138
|
+
console.log(chalk.dim('━'.repeat(60)));
|
|
139
|
+
logger.dim(`Prompt length: ${prompt.length} chars (~${Math.ceil(prompt.length / 4)} tokens)`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// 8. Resolve and launch coding agent
|
|
143
|
+
const agentName = (opts.agent || config.defaultAgent || 'claude');
|
|
144
|
+
const agent = await createAgent(agentName);
|
|
145
|
+
const available = await agent.isAvailable();
|
|
146
|
+
if (!available) {
|
|
147
|
+
logger.error(`Coding agent "${agentName}" is not available on this machine.`);
|
|
148
|
+
logger.dim(`Make sure the "${agentName}" CLI is installed and in your PATH.`);
|
|
149
|
+
logger.dim('');
|
|
150
|
+
logger.dim('Install instructions:');
|
|
151
|
+
logger.dim(' Claude: npm install -g @anthropic-ai/claude-code');
|
|
152
|
+
logger.dim(' Codex: npm install -g @openai/codex');
|
|
153
|
+
logger.dim(' Cursor: Install from https://cursor.sh');
|
|
154
|
+
logger.dim('');
|
|
155
|
+
logger.dim('Or use --dry-run to see the prompt without executing.');
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
logger.heading(`Launching ${agentName}...`);
|
|
159
|
+
console.log(chalk.dim('━'.repeat(60)));
|
|
160
|
+
const result = await agent.execute(prompt, {
|
|
161
|
+
cwd: projectDir,
|
|
162
|
+
stream: true,
|
|
163
|
+
dryRun: false,
|
|
164
|
+
});
|
|
165
|
+
console.log(chalk.dim('━'.repeat(60)));
|
|
166
|
+
if (result.exitCode === 0) {
|
|
167
|
+
logger.success(`${agentName} completed successfully.`);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
logger.warn(`${agentName} exited with code ${result.exitCode}.`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=implementation-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implementation-bridge.js","sourceRoot":"","sources":["../../src/agents/implementation-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { CodingAgent, AgentOptions, AgentResult } from './types.js';
|
|
2
|
+
export { createAgent } from './agent-factory.js';
|
|
3
|
+
export { parseTaskMarkdown, findSubtasks, getNextPending } from './task-parser.js';
|
|
4
|
+
export { composeImplementationPrompt } from './prompt-composer.js';
|
|
5
|
+
export { executeImplementation } from './implementation-bridge.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createAgent } from './agent-factory.js';
|
|
2
|
+
export { parseTaskMarkdown, findSubtasks, getNextPending } from './task-parser.js';
|
|
3
|
+
export { composeImplementationPrompt } from './prompt-composer.js';
|
|
4
|
+
export { executeImplementation } from './implementation-bridge.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composes rich implementation prompts for coding agents.
|
|
3
|
+
*
|
|
4
|
+
* Assembles a structured prompt from:
|
|
5
|
+
* 1. Target subtask details
|
|
6
|
+
* 2. Full task list context (what's done, what's next)
|
|
7
|
+
* 3. Parent story and feature context
|
|
8
|
+
* 4. Codebase context (tech stack, folder tree, related files)
|
|
9
|
+
*
|
|
10
|
+
* The output is a detailed markdown prompt that any coding agent
|
|
11
|
+
* (Claude, Cursor, Codex) can understand and act on.
|
|
12
|
+
*/
|
|
13
|
+
import type { ParsedSubtask } from './task-parser.js';
|
|
14
|
+
export interface ImplementationContext {
|
|
15
|
+
taskId: string;
|
|
16
|
+
taskTitle: string;
|
|
17
|
+
taskContent: string;
|
|
18
|
+
targetSubtasks: ParsedSubtask[];
|
|
19
|
+
allSubtasks: ParsedSubtask[];
|
|
20
|
+
storyContent?: string;
|
|
21
|
+
featureContent?: string;
|
|
22
|
+
epicContent?: string;
|
|
23
|
+
codebaseContext?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Compose a complete implementation prompt from gathered context.
|
|
27
|
+
* Returns a markdown string ready to be sent to a coding agent.
|
|
28
|
+
*/
|
|
29
|
+
export declare function composeImplementationPrompt(ctx: ImplementationContext): string;
|
|
30
|
+
//# sourceMappingURL=prompt-composer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-composer.d.ts","sourceRoot":"","sources":["../../src/agents/prompt-composer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAmE9E"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composes rich implementation prompts for coding agents.
|
|
3
|
+
*
|
|
4
|
+
* Assembles a structured prompt from:
|
|
5
|
+
* 1. Target subtask details
|
|
6
|
+
* 2. Full task list context (what's done, what's next)
|
|
7
|
+
* 3. Parent story and feature context
|
|
8
|
+
* 4. Codebase context (tech stack, folder tree, related files)
|
|
9
|
+
*
|
|
10
|
+
* The output is a detailed markdown prompt that any coding agent
|
|
11
|
+
* (Claude, Cursor, Codex) can understand and act on.
|
|
12
|
+
*/
|
|
13
|
+
import { formatSubtaskList } from './task-parser.js';
|
|
14
|
+
/**
|
|
15
|
+
* Compose a complete implementation prompt from gathered context.
|
|
16
|
+
* Returns a markdown string ready to be sent to a coding agent.
|
|
17
|
+
*/
|
|
18
|
+
export function composeImplementationPrompt(ctx) {
|
|
19
|
+
const sections = [];
|
|
20
|
+
// Header
|
|
21
|
+
sections.push(`# Implementation Task: ${ctx.taskId}`);
|
|
22
|
+
// Target subtask(s)
|
|
23
|
+
if (ctx.targetSubtasks.length > 0) {
|
|
24
|
+
sections.push('## Target Subtask(s)\n');
|
|
25
|
+
sections.push('Implement ONLY the following subtask(s):');
|
|
26
|
+
sections.push('');
|
|
27
|
+
for (const st of ctx.targetSubtasks) {
|
|
28
|
+
sections.push(`- **${st.id}**: ${st.title}`);
|
|
29
|
+
}
|
|
30
|
+
// Parent group context
|
|
31
|
+
const parentId = ctx.targetSubtasks[0]?.parentId;
|
|
32
|
+
if (parentId) {
|
|
33
|
+
const parentGroup = ctx.allSubtasks.find((t) => t.id === parentId);
|
|
34
|
+
if (parentGroup) {
|
|
35
|
+
sections.push(`\nParent task group: **${parentGroup.id}** ${parentGroup.title}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Full task list (shows what's done and what's pending)
|
|
40
|
+
sections.push('\n## Full Task List\n');
|
|
41
|
+
sections.push('```');
|
|
42
|
+
const targetIds = new Set(ctx.targetSubtasks.map((t) => t.id));
|
|
43
|
+
const firstTargetId = ctx.targetSubtasks[0]?.id;
|
|
44
|
+
sections.push(formatSubtaskList(ctx.allSubtasks, firstTargetId));
|
|
45
|
+
sections.push('```');
|
|
46
|
+
// Parent story context
|
|
47
|
+
if (ctx.storyContent) {
|
|
48
|
+
sections.push('\n## User Story Context\n');
|
|
49
|
+
sections.push(truncate(ctx.storyContent, 3000));
|
|
50
|
+
}
|
|
51
|
+
// Parent feature context
|
|
52
|
+
if (ctx.featureContent) {
|
|
53
|
+
sections.push('\n## Feature Context\n');
|
|
54
|
+
sections.push(truncate(ctx.featureContent, 2000));
|
|
55
|
+
}
|
|
56
|
+
// Parent epic context (brief)
|
|
57
|
+
if (ctx.epicContent) {
|
|
58
|
+
sections.push('\n## Epic Context (summary)\n');
|
|
59
|
+
sections.push(truncate(ctx.epicContent, 1000));
|
|
60
|
+
}
|
|
61
|
+
// Codebase context
|
|
62
|
+
if (ctx.codebaseContext) {
|
|
63
|
+
sections.push('\n## Codebase Context\n');
|
|
64
|
+
sections.push(ctx.codebaseContext);
|
|
65
|
+
}
|
|
66
|
+
// Instructions
|
|
67
|
+
sections.push('\n## Instructions\n');
|
|
68
|
+
sections.push('1. Implement ONLY the target subtask(s) listed above.');
|
|
69
|
+
sections.push('2. Follow existing code patterns and conventions in the codebase.');
|
|
70
|
+
sections.push('3. Write clean, well-documented code.');
|
|
71
|
+
sections.push('4. Include appropriate error handling.');
|
|
72
|
+
sections.push('5. Add or update tests for the changes.');
|
|
73
|
+
sections.push('6. Do NOT modify code unrelated to the target subtask(s).');
|
|
74
|
+
return sections.join('\n');
|
|
75
|
+
}
|
|
76
|
+
function truncate(text, maxChars) {
|
|
77
|
+
if (text.length <= maxChars)
|
|
78
|
+
return text;
|
|
79
|
+
return text.slice(0, maxChars) + '\n\n... (truncated)';
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=prompt-composer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-composer.js","sourceRoot":"","sources":["../../src/agents/prompt-composer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses task list markdown files to extract subtask structure.
|
|
3
|
+
*
|
|
4
|
+
* Supports addressing subtasks by:
|
|
5
|
+
* - ID (e.g., "2.1")
|
|
6
|
+
* - Group ID (e.g., "2.0" returns the group + all subtasks)
|
|
7
|
+
* - Keyword search (e.g., "auth" fuzzy-matches against titles)
|
|
8
|
+
* - Next pending (returns the first unchecked subtask)
|
|
9
|
+
*/
|
|
10
|
+
export interface ParsedSubtask {
|
|
11
|
+
id: string;
|
|
12
|
+
title: string;
|
|
13
|
+
done: boolean;
|
|
14
|
+
parentId: string | null;
|
|
15
|
+
depth: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Parse a task list markdown file into structured subtasks.
|
|
19
|
+
* Expected format: `- [x] 1.0 Task title` or ` - [ ] 1.1 Subtask title`
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseTaskMarkdown(content: string): ParsedSubtask[];
|
|
22
|
+
/**
|
|
23
|
+
* Find subtasks matching a query.
|
|
24
|
+
*
|
|
25
|
+
* - Exact ID match: "2.1" → single subtask
|
|
26
|
+
* - Group match: "2.0" → group + all its subtasks
|
|
27
|
+
* - Keyword search: "auth" → fuzzy match on titles
|
|
28
|
+
*/
|
|
29
|
+
export declare function findSubtasks(tasks: ParsedSubtask[], query: string): ParsedSubtask[];
|
|
30
|
+
/**
|
|
31
|
+
* Get the next pending (unchecked) subtask.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getNextPending(tasks: ParsedSubtask[]): ParsedSubtask | null;
|
|
34
|
+
/**
|
|
35
|
+
* Format subtasks for display in the terminal.
|
|
36
|
+
*/
|
|
37
|
+
export declare function formatSubtaskList(tasks: ParsedSubtask[], highlightId?: string): string;
|
|
38
|
+
//# sourceMappingURL=task-parser.d.ts.map
|