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.
Files changed (62) hide show
  1. package/README.md +190 -0
  2. package/dist/cli/commands/config.d.ts +8 -0
  3. package/dist/cli/commands/config.d.ts.map +1 -0
  4. package/dist/cli/commands/config.js +29 -0
  5. package/dist/cli/commands/config.js.map +1 -0
  6. package/dist/cli/commands/handover.d.ts +7 -0
  7. package/dist/cli/commands/handover.d.ts.map +1 -0
  8. package/dist/cli/commands/handover.js +188 -0
  9. package/dist/cli/commands/handover.js.map +1 -0
  10. package/dist/cli/commands/init.d.ts +8 -0
  11. package/dist/cli/commands/init.d.ts.map +1 -0
  12. package/dist/cli/commands/init.js +249 -0
  13. package/dist/cli/commands/init.js.map +1 -0
  14. package/dist/cli/commands/plan.d.ts +7 -0
  15. package/dist/cli/commands/plan.d.ts.map +1 -0
  16. package/dist/cli/commands/plan.js +193 -0
  17. package/dist/cli/commands/plan.js.map +1 -0
  18. package/dist/cli/commands/refine.d.ts +6 -0
  19. package/dist/cli/commands/refine.d.ts.map +1 -0
  20. package/dist/cli/commands/refine.js +272 -0
  21. package/dist/cli/commands/refine.js.map +1 -0
  22. package/dist/cli/commands/rollback.d.ts +6 -0
  23. package/dist/cli/commands/rollback.d.ts.map +1 -0
  24. package/dist/cli/commands/rollback.js +182 -0
  25. package/dist/cli/commands/rollback.js.map +1 -0
  26. package/dist/cli/commands/run.d.ts +8 -0
  27. package/dist/cli/commands/run.d.ts.map +1 -0
  28. package/dist/cli/commands/run.js +277 -0
  29. package/dist/cli/commands/run.js.map +1 -0
  30. package/dist/cli/commands/status.d.ts +6 -0
  31. package/dist/cli/commands/status.d.ts.map +1 -0
  32. package/dist/cli/commands/status.js +168 -0
  33. package/dist/cli/commands/status.js.map +1 -0
  34. package/dist/cli/commands/sync.d.ts +6 -0
  35. package/dist/cli/commands/sync.d.ts.map +1 -0
  36. package/dist/cli/commands/sync.js +194 -0
  37. package/dist/cli/commands/sync.js.map +1 -0
  38. package/dist/cli/index.d.ts +3 -0
  39. package/dist/cli/index.d.ts.map +1 -0
  40. package/dist/cli/index.js +88 -0
  41. package/dist/cli/index.js.map +1 -0
  42. package/dist/core/config-manager.d.ts +39 -0
  43. package/dist/core/config-manager.d.ts.map +1 -0
  44. package/dist/core/config-manager.js +213 -0
  45. package/dist/core/config-manager.js.map +1 -0
  46. package/dist/core/git-integration.d.ts +49 -0
  47. package/dist/core/git-integration.d.ts.map +1 -0
  48. package/dist/core/git-integration.js +223 -0
  49. package/dist/core/git-integration.js.map +1 -0
  50. package/dist/core/prompt-builder.d.ts +45 -0
  51. package/dist/core/prompt-builder.d.ts.map +1 -0
  52. package/dist/core/prompt-builder.js +342 -0
  53. package/dist/core/prompt-builder.js.map +1 -0
  54. package/dist/core/state-manager.d.ts +65 -0
  55. package/dist/core/state-manager.d.ts.map +1 -0
  56. package/dist/core/state-manager.js +200 -0
  57. package/dist/core/state-manager.js.map +1 -0
  58. package/dist/index.d.ts +5 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +6 -0
  61. package/dist/index.js.map +1 -0
  62. 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,8 @@
1
+ interface ConfigOptions {
2
+ setup?: boolean;
3
+ show?: boolean;
4
+ reset?: boolean;
5
+ }
6
+ export declare function configCommand(options: ConfigOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=config.d.ts.map
@@ -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,7 @@
1
+ interface HandoverOptions {
2
+ phase?: string;
3
+ summarize?: boolean;
4
+ }
5
+ export declare function handoverCommand(options: HandoverOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=handover.d.ts.map
@@ -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,8 @@
1
+ interface InitOptions {
2
+ ui?: string;
3
+ design?: string;
4
+ fromIdea?: string;
5
+ }
6
+ export declare function initCommand(options: InitOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=init.d.ts.map
@@ -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"}