openplanr 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -5
- 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 +124 -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 +425 -0
- package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -0
- package/dist/ai/schemas/ai-response-schemas.js +87 -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/checklist.d.ts.map +1 -1
- package/dist/cli/commands/checklist.js +60 -1
- package/dist/cli/commands/checklist.js.map +1 -1
- 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 +101 -0
- package/dist/cli/commands/refine.js.map +1 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +150 -18
- package/dist/cli/commands/status.js.map +1 -1
- 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 +259 -45
- 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 +227 -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 +350 -35
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/index.js +16 -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 +169 -0
- package/dist/services/artifact-service.js.map +1 -1
- package/dist/services/checklist-service.d.ts +23 -0
- package/dist/services/checklist-service.d.ts.map +1 -1
- package/dist/services/checklist-service.js +44 -0
- package/dist/services/checklist-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 +6 -0
- package/dist/services/prompt-service.d.ts.map +1 -1
- package/dist/services/prompt-service.js +7 -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 +6 -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/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +12 -0
- package/dist/utils/logger.js.map +1 -1
- package/package.json +12 -5
- 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
package/README.md
CHANGED
|
@@ -52,7 +52,14 @@ planr init
|
|
|
52
52
|
planr rules generate # Generate .cursor/rules, CLAUDE.md, AGENTS.md
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
Each command creates markdown artifacts in `docs/agile/` and interactively prompts for the details. The hierarchy is enforced — features require an epic, stories require a feature, tasks require a story.
|
|
55
|
+
Each command creates markdown artifacts in `docs/agile/` and interactively prompts for the details. The hierarchy is enforced — features require an epic, stories require a feature, tasks require a story or feature.
|
|
56
|
+
|
|
57
|
+
Or use `planr plan` to run the full flow in a single command:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
planr plan # start from scratch
|
|
61
|
+
planr plan --epic EPIC-001 # cascade from an existing epic
|
|
62
|
+
```
|
|
56
63
|
|
|
57
64
|
## Supported AI Targets
|
|
58
65
|
|
|
@@ -75,17 +82,28 @@ planr rules generate --dry-run # preview
|
|
|
75
82
|
| `planr init` | Initialize project with config and directory structure |
|
|
76
83
|
| `planr epic create` | Create a new epic |
|
|
77
84
|
| `planr epic list` | List all epics |
|
|
78
|
-
| `planr feature create --epic <ID>` | Create
|
|
85
|
+
| `planr feature create --epic <ID>` | Create features from an epic |
|
|
79
86
|
| `planr feature list` | List all features |
|
|
80
|
-
| `planr story create --feature <ID>` | Create
|
|
87
|
+
| `planr story create --feature <ID>` | Create user stories from a feature |
|
|
88
|
+
| `planr story create --epic <ID>` | Batch-generate stories for all features under an epic |
|
|
81
89
|
| `planr story list` | List all user stories |
|
|
82
|
-
| `planr task create --story <ID>` | Create a task list from a story |
|
|
90
|
+
| `planr task create --story <ID>` | Create a task list from a single story |
|
|
91
|
+
| `planr task create --feature <ID>` | Create a task list from all stories in a feature |
|
|
83
92
|
| `planr task list` | List all task lists |
|
|
84
93
|
| `planr task implement <ID>` | View tasks and start implementing |
|
|
94
|
+
| `planr plan` | Full automated flow: Epic → Features → Stories → Tasks |
|
|
95
|
+
| `planr refine <ID>` | AI-powered review and apply improvements |
|
|
96
|
+
| `planr sync` | Validate and fix cross-references across artifacts |
|
|
85
97
|
| `planr checklist show` | View the agile development checklist |
|
|
98
|
+
| `planr checklist toggle` | Interactively toggle checklist items |
|
|
86
99
|
| `planr checklist reset` | Reset checklist to initial state |
|
|
87
100
|
| `planr rules generate` | Generate AI agent rule files |
|
|
88
|
-
| `planr status` | Show planning progress
|
|
101
|
+
| `planr status` | Show planning progress with tree view and metrics |
|
|
102
|
+
| `planr config show` | Display current configuration |
|
|
103
|
+
| `planr config set-provider` | Set AI provider (anthropic, openai, ollama) |
|
|
104
|
+
| `planr config set-key` | Store API key securely |
|
|
105
|
+
| `planr config set-model` | Set AI model |
|
|
106
|
+
| `planr config set-agent` | Set default coding agent |
|
|
89
107
|
|
|
90
108
|
See [docs/CLI.md](docs/CLI.md) for the full command reference with all options and flags.
|
|
91
109
|
|
|
@@ -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"}
|