ai-phase-builder 1.0.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 +190 -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 +29 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/handover.d.ts +7 -0
- package/dist/cli/commands/handover.d.ts.map +1 -0
- package/dist/cli/commands/handover.js +188 -0
- package/dist/cli/commands/handover.js.map +1 -0
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +249 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +7 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +193 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/refine.d.ts +6 -0
- package/dist/cli/commands/refine.d.ts.map +1 -0
- package/dist/cli/commands/refine.js +272 -0
- package/dist/cli/commands/refine.js.map +1 -0
- package/dist/cli/commands/rollback.d.ts +6 -0
- package/dist/cli/commands/rollback.d.ts.map +1 -0
- package/dist/cli/commands/rollback.js +182 -0
- package/dist/cli/commands/rollback.js.map +1 -0
- package/dist/cli/commands/run.d.ts +8 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +277 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/status.d.ts +6 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +168 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +6 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +194 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +88 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config-manager.d.ts +39 -0
- package/dist/core/config-manager.d.ts.map +1 -0
- package/dist/core/config-manager.js +213 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/git-integration.d.ts +49 -0
- package/dist/core/git-integration.d.ts.map +1 -0
- package/dist/core/git-integration.js +223 -0
- package/dist/core/git-integration.js.map +1 -0
- package/dist/core/prompt-builder.d.ts +45 -0
- package/dist/core/prompt-builder.d.ts.map +1 -0
- package/dist/core/prompt-builder.js +342 -0
- package/dist/core/prompt-builder.js.map +1 -0
- package/dist/core/state-manager.d.ts +65 -0
- package/dist/core/state-manager.d.ts.map +1 -0
- package/dist/core/state-manager.js +200 -0
- package/dist/core/state-manager.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/package.json +64 -0
package/README.md
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# AI Phase Builder š
|
|
2
|
+
|
|
3
|
+
AI-powered project phase orchestration for Cursor IDE. Transform your ideas into structured, executable development phases with intelligent handovers and rollback support.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **š® Idea Refinement Chain** - Turn rough ideas into comprehensive specs using Claude Opus
|
|
8
|
+
- **š Phase Structuring** - Break projects into logical, executable phases
|
|
9
|
+
- **š Smart Handovers** - Context-aware transitions between phases with summarization
|
|
10
|
+
- **ā©ļø Rollback Support** - Retry failed phases with learned context (max 3 attempts)
|
|
11
|
+
- **š Drift Detection** - Track manual changes made outside of phase runs
|
|
12
|
+
- **š Context7 Integration** - Always use up-to-date documentation
|
|
13
|
+
- **š¾ Git Integration** - Auto-commit checkpoints for each phase
|
|
14
|
+
|
|
15
|
+
## Requirements
|
|
16
|
+
|
|
17
|
+
- Node.js 18+
|
|
18
|
+
- Cursor IDE with active subscription
|
|
19
|
+
- Context7 MCP enabled (recommended)
|
|
20
|
+
|
|
21
|
+
## Installation
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Global install
|
|
25
|
+
npm install -g ai-phase-builder
|
|
26
|
+
|
|
27
|
+
# Or run directly
|
|
28
|
+
npx ai-phase-builder
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Quick Start
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# First time setup (zero API keys needed!)
|
|
35
|
+
ai-phases config --setup
|
|
36
|
+
|
|
37
|
+
# Initialize in your project
|
|
38
|
+
cd your-project
|
|
39
|
+
ai-phases init
|
|
40
|
+
|
|
41
|
+
# Transform your idea into a structured plan
|
|
42
|
+
ai-phases refine "build a crypto price dashboard with real-time updates"
|
|
43
|
+
|
|
44
|
+
# Run phases
|
|
45
|
+
ai-phases run --phase 1
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Commands
|
|
49
|
+
|
|
50
|
+
| Command | Description |
|
|
51
|
+
|---------|-------------|
|
|
52
|
+
| `ai-phases init` | Initialize AI Phase Builder in current project |
|
|
53
|
+
| `ai-phases refine <idea>` | Transform idea into enhanced spec + phase plan |
|
|
54
|
+
| `ai-phases plan` | Create or edit phase plan manually |
|
|
55
|
+
| `ai-phases run --phase N` | Execute a specific phase |
|
|
56
|
+
| `ai-phases status` | Show current project status |
|
|
57
|
+
| `ai-phases handover` | Generate handover summary for current phase |
|
|
58
|
+
| `ai-phases rollback` | Rollback a failed phase to retry |
|
|
59
|
+
| `ai-phases sync` | Detect and reconcile manual changes |
|
|
60
|
+
| `ai-phases config` | Manage configuration |
|
|
61
|
+
|
|
62
|
+
## How It Works
|
|
63
|
+
|
|
64
|
+
### 1. Idea Refinement Chain
|
|
65
|
+
|
|
66
|
+
Your rough idea goes through a three-stage enhancement process:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
Your Idea ā [Superprompt Enhancement] ā [Phase Structuring] ā Executable Plan
|
|
70
|
+
(Claude Opus) (Claude Opus)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 2. Model Routing
|
|
74
|
+
|
|
75
|
+
- **Claude Opus** - Planning, architecture decisions, complex reasoning
|
|
76
|
+
- **Gemini Flash** - Coding, code review, handover generation
|
|
77
|
+
|
|
78
|
+
All models are accessed through your Cursor subscription - no additional API keys needed!
|
|
79
|
+
|
|
80
|
+
### 3. Phase Execution & Clean Context
|
|
81
|
+
|
|
82
|
+
Each phase runs with **minimal, focused context**:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
Phase N Context (ONLY these):
|
|
86
|
+
āāā Phase description + tasks
|
|
87
|
+
āāā Validation checklist
|
|
88
|
+
āāā Handover from Phase N-1 (summarized)
|
|
89
|
+
āāā Context7 docs (fetched fresh)
|
|
90
|
+
āāā Failure report (if retrying)
|
|
91
|
+
|
|
92
|
+
NOT included (cleared):
|
|
93
|
+
āāā Full project specification
|
|
94
|
+
āāā Research findings
|
|
95
|
+
āāā Context from Phase N-2 and earlier
|
|
96
|
+
āāā Previous attempt details (except failures)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
This "clean context" approach:
|
|
100
|
+
- Keeps prompts efficient (~500-1000 tokens vs 5000+)
|
|
101
|
+
- Prevents context pollution across phases
|
|
102
|
+
- Forces handovers to capture essential info
|
|
103
|
+
- Lets Context7 provide fresh documentation each phase
|
|
104
|
+
|
|
105
|
+
### 4. Failure Handling
|
|
106
|
+
|
|
107
|
+
- Max 3 attempts per phase before blocking
|
|
108
|
+
- Failure reports capture what went wrong
|
|
109
|
+
- Rollback notes guide the next attempt
|
|
110
|
+
- Blocked phases require manual intervention
|
|
111
|
+
|
|
112
|
+
## Project Structure
|
|
113
|
+
|
|
114
|
+
When initialized, creates:
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
.ai-phases/
|
|
118
|
+
āāā config.json # Project settings
|
|
119
|
+
āāā state.json # Phase tracking state
|
|
120
|
+
āāā context.md # Persistent project context
|
|
121
|
+
āāā plan.md # Master phase plan
|
|
122
|
+
āāā phases/
|
|
123
|
+
ā āāā phase-1/
|
|
124
|
+
ā ā āāā state.json
|
|
125
|
+
ā ā āāā prompt.md
|
|
126
|
+
ā ā āāā handover.md
|
|
127
|
+
ā ā āāā attempt-1/
|
|
128
|
+
ā āāā phase-2/
|
|
129
|
+
ā āāā ...
|
|
130
|
+
āāā logs/
|
|
131
|
+
ā āāā drift.log
|
|
132
|
+
āāā templates/
|
|
133
|
+
āāā handover.md
|
|
134
|
+
āāā failure-report.md
|
|
135
|
+
āāā phase-prompt.md
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Configuration
|
|
139
|
+
|
|
140
|
+
Global config stored at: `~/.ai-phase-builder/config.json`
|
|
141
|
+
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"cursor": {
|
|
145
|
+
"planning_model": "claude-opus-4.5",
|
|
146
|
+
"execution_model": "gemini-3-flash",
|
|
147
|
+
"context7_enabled": true
|
|
148
|
+
},
|
|
149
|
+
"defaults": {
|
|
150
|
+
"ui_library": "shadcn",
|
|
151
|
+
"design_system": "vercel",
|
|
152
|
+
"auto_commit": true,
|
|
153
|
+
"max_retry_attempts": 3
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Context7 Integration
|
|
159
|
+
|
|
160
|
+
Context7 MCP provides up-to-date documentation directly in Cursor. Enable it:
|
|
161
|
+
|
|
162
|
+
1. Open Cursor Settings (Cmd+,)
|
|
163
|
+
2. Go to: Features ā MCP Servers
|
|
164
|
+
3. Add Context7: https://context7.com/docs/clients/cursor
|
|
165
|
+
4. Restart Cursor
|
|
166
|
+
|
|
167
|
+
## Example Workflow
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# 1. Start with an idea
|
|
171
|
+
ai-phases refine "build a task management app with drag-and-drop"
|
|
172
|
+
|
|
173
|
+
# 2. Review and approve the generated plan
|
|
174
|
+
# 3. Execute phases one by one
|
|
175
|
+
ai-phases run --phase 1
|
|
176
|
+
ai-phases handover --phase 1
|
|
177
|
+
ai-phases run --phase 2
|
|
178
|
+
# ...
|
|
179
|
+
|
|
180
|
+
# 4. If a phase fails
|
|
181
|
+
ai-phases rollback --phase 3
|
|
182
|
+
ai-phases run --phase 3
|
|
183
|
+
|
|
184
|
+
# 5. Check status anytime
|
|
185
|
+
ai-phases status --verbose
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## License
|
|
189
|
+
|
|
190
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAQA,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BzE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { loadGlobalConfig, runSetupWizard, showConfig, resetConfig, } from '../../core/config-manager.js';
|
|
3
|
+
export async function configCommand(options) {
|
|
4
|
+
if (options.setup) {
|
|
5
|
+
await runSetupWizard();
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
if (options.reset) {
|
|
9
|
+
await resetConfig();
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
if (options.show) {
|
|
13
|
+
await showConfig();
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
// Default: show config
|
|
17
|
+
const config = await loadGlobalConfig();
|
|
18
|
+
if (!config || !config.setup_complete) {
|
|
19
|
+
console.log(chalk.yellow('\nNo configuration found. Running setup...\n'));
|
|
20
|
+
await runSetupWizard();
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
await showConfig();
|
|
24
|
+
console.log(chalk.dim('Options:'));
|
|
25
|
+
console.log(chalk.cyan(' ai-phases config --setup ') + chalk.dim('Re-run setup wizard'));
|
|
26
|
+
console.log(chalk.cyan(' ai-phases config --reset ') + chalk.dim('Reset to defaults'));
|
|
27
|
+
console.log();
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,WAAW,GACZ,MAAM,8BAA8B,CAAC;AAQtC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,cAAc,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,WAAW,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,UAAU,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,uBAAuB;IACvB,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAExC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAC1E,MAAM,cAAc,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,UAAU,EAAE,CAAC;IAEnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handover.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/handover.ts"],"names":[],"mappings":"AAoBA,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAwH7E"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import inquirer from 'inquirer';
|
|
5
|
+
import { loadGlobalConfig, getProjectPhasesDir } from '../../core/config-manager.js';
|
|
6
|
+
import { loadProjectState, loadPhaseState, } from '../../core/state-manager.js';
|
|
7
|
+
import { generateHandoverPrompt, buildCursorPrompt, } from '../../core/prompt-builder.js';
|
|
8
|
+
import { exec } from 'child_process';
|
|
9
|
+
import { promisify } from 'util';
|
|
10
|
+
const execAsync = promisify(exec);
|
|
11
|
+
export async function handoverCommand(options) {
|
|
12
|
+
const globalConfig = await loadGlobalConfig();
|
|
13
|
+
if (!globalConfig || !globalConfig.setup_complete) {
|
|
14
|
+
console.log(chalk.yellow('Please run setup first: ai-phases config --setup'));
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const state = await loadProjectState();
|
|
18
|
+
if (!state) {
|
|
19
|
+
console.log(chalk.yellow('Project not initialized. Run: ai-phases init'));
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
// Determine phase number
|
|
23
|
+
let phaseNumber;
|
|
24
|
+
if (options.phase) {
|
|
25
|
+
phaseNumber = parseInt(options.phase, 10);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Find the most recently completed phase
|
|
29
|
+
const completedPhases = state.phases
|
|
30
|
+
.filter(p => p.status === 'completed')
|
|
31
|
+
.sort((a, b) => b.phase_number - a.phase_number);
|
|
32
|
+
if (completedPhases.length === 0) {
|
|
33
|
+
console.log(chalk.yellow('No completed phases found. Complete a phase first.'));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
phaseNumber = completedPhases[0].phase_number;
|
|
37
|
+
}
|
|
38
|
+
const phase = await loadPhaseState(phaseNumber);
|
|
39
|
+
if (!phase) {
|
|
40
|
+
console.log(chalk.red(`Phase ${phaseNumber} not found.`));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
console.log(chalk.cyan(`\nš Generating handover for Phase ${phaseNumber}: ${phase.name}\n`));
|
|
44
|
+
// Check if handover already exists
|
|
45
|
+
const handoverPath = path.join(getProjectPhasesDir(), 'phases', `phase-${phaseNumber}`, 'handover.md');
|
|
46
|
+
if (await fs.pathExists(handoverPath)) {
|
|
47
|
+
const { overwrite } = await inquirer.prompt([
|
|
48
|
+
{
|
|
49
|
+
type: 'confirm',
|
|
50
|
+
name: 'overwrite',
|
|
51
|
+
message: 'Handover already exists. Overwrite?',
|
|
52
|
+
default: false,
|
|
53
|
+
},
|
|
54
|
+
]);
|
|
55
|
+
if (!overwrite) {
|
|
56
|
+
console.log(chalk.dim('Existing handover:'));
|
|
57
|
+
console.log(chalk.cyan(` ${handoverPath}\n`));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Generate handover prompt
|
|
62
|
+
const prompt = await generateHandoverPrompt(phase);
|
|
63
|
+
const fullPrompt = buildCursorPrompt(prompt);
|
|
64
|
+
// Copy to clipboard
|
|
65
|
+
await copyToClipboard(fullPrompt);
|
|
66
|
+
console.log(chalk.green('ā Handover prompt copied to clipboard!\n'));
|
|
67
|
+
// Save prompt for reference
|
|
68
|
+
const promptPath = path.join(getProjectPhasesDir(), 'phases', `phase-${phaseNumber}`, 'handover-prompt.md');
|
|
69
|
+
await fs.writeFile(promptPath, fullPrompt);
|
|
70
|
+
// Instructions
|
|
71
|
+
console.log(chalk.yellow('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā'));
|
|
72
|
+
console.log(chalk.yellow('ā ') + chalk.white.bold('Generate Handover Summary') + chalk.yellow(' ā'));
|
|
73
|
+
console.log(chalk.yellow('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤'));
|
|
74
|
+
console.log(chalk.yellow('ā ') + chalk.white('1. Paste the prompt in Cursor') + chalk.yellow(' ā'));
|
|
75
|
+
console.log(chalk.yellow('ā ') + chalk.white(`2. Model: ${prompt.modelName.substring(0, 30).padEnd(30)}`) + chalk.yellow(' ā'));
|
|
76
|
+
console.log(chalk.yellow('ā ') + chalk.white('3. Review the generated handover') + chalk.yellow(' ā'));
|
|
77
|
+
console.log(chalk.yellow('ā ') + chalk.white('4. Paste the handover back here') + chalk.yellow(' ā'));
|
|
78
|
+
console.log(chalk.yellow('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n'));
|
|
79
|
+
// Get handover content
|
|
80
|
+
const { handoverContent } = await inquirer.prompt([
|
|
81
|
+
{
|
|
82
|
+
type: 'editor',
|
|
83
|
+
name: 'handoverContent',
|
|
84
|
+
message: 'Paste the handover summary (opens editor):',
|
|
85
|
+
default: getHandoverTemplate(phase),
|
|
86
|
+
},
|
|
87
|
+
]);
|
|
88
|
+
// Apply summarization if requested
|
|
89
|
+
let finalContent = handoverContent;
|
|
90
|
+
if (options.summarize) {
|
|
91
|
+
finalContent = summarizeHandover(handoverContent);
|
|
92
|
+
console.log(chalk.dim('\nSummarized handover for context efficiency.'));
|
|
93
|
+
}
|
|
94
|
+
// Save handover
|
|
95
|
+
await fs.writeFile(handoverPath, finalContent);
|
|
96
|
+
console.log(chalk.green(`\nā Handover saved to: ${handoverPath}`));
|
|
97
|
+
// Show next steps
|
|
98
|
+
if (phaseNumber < state.total_phases) {
|
|
99
|
+
console.log(chalk.white('\nNext step:'));
|
|
100
|
+
console.log(chalk.cyan(` ai-phases run --phase ${phaseNumber + 1}\n`));
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
console.log(chalk.green('\nš This was the final phase! Project complete.\n'));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function getHandoverTemplate(phase) {
|
|
107
|
+
return `# Handover - Phase ${phase.phase_number}: ${phase.name}
|
|
108
|
+
|
|
109
|
+
## Completed Work
|
|
110
|
+
- [What was implemented]
|
|
111
|
+
|
|
112
|
+
## Files Modified
|
|
113
|
+
| File | Description |
|
|
114
|
+
|------|-------------|
|
|
115
|
+
| \`path/to/file\` | What this file does |
|
|
116
|
+
|
|
117
|
+
## Key Decisions
|
|
118
|
+
- **Decision**: [What was decided]
|
|
119
|
+
- **Rationale**: [Why]
|
|
120
|
+
|
|
121
|
+
## Known Issues
|
|
122
|
+
- [ ] [Any issues discovered]
|
|
123
|
+
|
|
124
|
+
## Context for Next Phase
|
|
125
|
+
- [Important information for the next developer]
|
|
126
|
+
|
|
127
|
+
## Validation Status
|
|
128
|
+
${phase.validation_criteria.map((c) => `- [ ] ${c}`).join('\n')}
|
|
129
|
+
`;
|
|
130
|
+
}
|
|
131
|
+
function summarizeHandover(content) {
|
|
132
|
+
// Simple summarization - keep headings and first item under each
|
|
133
|
+
const lines = content.split('\n');
|
|
134
|
+
const summarized = [];
|
|
135
|
+
let inList = false;
|
|
136
|
+
let listItemCount = 0;
|
|
137
|
+
const maxListItems = 3;
|
|
138
|
+
for (const line of lines) {
|
|
139
|
+
if (line.startsWith('#')) {
|
|
140
|
+
summarized.push(line);
|
|
141
|
+
inList = false;
|
|
142
|
+
listItemCount = 0;
|
|
143
|
+
}
|
|
144
|
+
else if (line.startsWith('- ') || line.startsWith('* ') || line.match(/^\d+\./)) {
|
|
145
|
+
if (!inList || listItemCount < maxListItems) {
|
|
146
|
+
summarized.push(line);
|
|
147
|
+
inList = true;
|
|
148
|
+
listItemCount++;
|
|
149
|
+
}
|
|
150
|
+
else if (listItemCount === maxListItems) {
|
|
151
|
+
summarized.push('- ... (see full handover for details)');
|
|
152
|
+
listItemCount++;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if (line.trim() === '') {
|
|
156
|
+
summarized.push(line);
|
|
157
|
+
inList = false;
|
|
158
|
+
listItemCount = 0;
|
|
159
|
+
}
|
|
160
|
+
else if (!inList) {
|
|
161
|
+
summarized.push(line);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return summarized.join('\n');
|
|
165
|
+
}
|
|
166
|
+
async function copyToClipboard(text) {
|
|
167
|
+
try {
|
|
168
|
+
const platform = process.platform;
|
|
169
|
+
let command;
|
|
170
|
+
if (platform === 'darwin') {
|
|
171
|
+
command = 'pbcopy';
|
|
172
|
+
}
|
|
173
|
+
else if (platform === 'linux') {
|
|
174
|
+
command = 'xclip -selection clipboard';
|
|
175
|
+
}
|
|
176
|
+
else if (platform === 'win32') {
|
|
177
|
+
command = 'clip';
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
await execAsync(`echo "${text.replace(/"/g, '\\"').replace(/\n/g, '\\n')}" | ${command}`);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Silent fail
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=handover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handover.js","sourceRoot":"","sources":["../../../src/cli/commands/handover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAkBA,UAAU,WAAW;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyIrE"}
|