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
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export interface PhaseTask {
|
|
2
|
+
id: string;
|
|
3
|
+
description: string;
|
|
4
|
+
status: 'pending' | 'in_progress' | 'completed' | 'failed';
|
|
5
|
+
notes?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface PhaseState {
|
|
8
|
+
phase_number: number;
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
model: 'planning' | 'execution';
|
|
12
|
+
status: 'pending' | 'in_progress' | 'completed' | 'failed' | 'blocked';
|
|
13
|
+
current_attempt: number;
|
|
14
|
+
max_attempts: number;
|
|
15
|
+
tasks: PhaseTask[];
|
|
16
|
+
validation_criteria: string[];
|
|
17
|
+
started_at?: string;
|
|
18
|
+
completed_at?: string;
|
|
19
|
+
context7_queries?: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface AttemptState {
|
|
22
|
+
attempt_number: number;
|
|
23
|
+
started_at: string;
|
|
24
|
+
completed_at?: string;
|
|
25
|
+
status: 'in_progress' | 'completed' | 'failed';
|
|
26
|
+
error_summary?: string;
|
|
27
|
+
suggested_fix?: string;
|
|
28
|
+
files_modified: string[];
|
|
29
|
+
tokens_used?: {
|
|
30
|
+
input: number;
|
|
31
|
+
output: number;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export interface ProjectState {
|
|
35
|
+
project_name: string;
|
|
36
|
+
created_at: string;
|
|
37
|
+
updated_at: string;
|
|
38
|
+
original_idea: string;
|
|
39
|
+
enhanced_idea?: string;
|
|
40
|
+
total_phases: number;
|
|
41
|
+
current_phase: number;
|
|
42
|
+
status: 'planning' | 'refining' | 'in_progress' | 'completed' | 'blocked';
|
|
43
|
+
phases: PhaseState[];
|
|
44
|
+
research_findings?: string;
|
|
45
|
+
design_tokens?: Record<string, string>;
|
|
46
|
+
git_base_commit?: string;
|
|
47
|
+
}
|
|
48
|
+
export declare function loadProjectState(): Promise<ProjectState | null>;
|
|
49
|
+
export declare function saveProjectState(state: ProjectState): Promise<void>;
|
|
50
|
+
export declare function createInitialState(projectName: string, idea: string): Promise<ProjectState>;
|
|
51
|
+
export declare function loadPhaseState(phaseNumber: number): Promise<PhaseState | null>;
|
|
52
|
+
export declare function updatePhaseState(phaseNumber: number, updates: Partial<PhaseState>): Promise<void>;
|
|
53
|
+
export declare function loadAttemptState(phaseNumber: number, attemptNumber: number): Promise<AttemptState | null>;
|
|
54
|
+
export declare function saveAttemptState(phaseNumber: number, attemptNumber: number, attemptState: AttemptState): Promise<void>;
|
|
55
|
+
export declare function createNewAttempt(phaseNumber: number): Promise<AttemptState>;
|
|
56
|
+
export declare function markAttemptFailed(phaseNumber: number, attemptNumber: number, errorSummary: string, suggestedFix: string): Promise<void>;
|
|
57
|
+
export declare function markAttemptCompleted(phaseNumber: number, attemptNumber: number, filesModified: string[]): Promise<void>;
|
|
58
|
+
export declare function getPhaseDirectory(phaseNumber: number): Promise<string>;
|
|
59
|
+
export declare function getCurrentPhaseInfo(): Promise<{
|
|
60
|
+
phase: PhaseState;
|
|
61
|
+
attempt: AttemptState | null;
|
|
62
|
+
canRetry: boolean;
|
|
63
|
+
} | null>;
|
|
64
|
+
export declare function createPhaseState(phaseNumber: number, name: string, description: string, tasks: PhaseTask[], validationCriteria: string[], context7Queries: string[], maxAttempts?: number): PhaseState;
|
|
65
|
+
//# sourceMappingURL=state-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.d.ts","sourceRoot":"","sources":["../../src/core/state-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { getProjectPhasesDir } from './config-manager.js';
|
|
4
|
+
export async function loadProjectState() {
|
|
5
|
+
try {
|
|
6
|
+
const statePath = path.join(getProjectPhasesDir(), 'state.json');
|
|
7
|
+
if (await fs.pathExists(statePath)) {
|
|
8
|
+
return await fs.readJson(statePath);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
// State doesn't exist or is invalid
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
export async function saveProjectState(state) {
|
|
17
|
+
const statePath = path.join(getProjectPhasesDir(), 'state.json');
|
|
18
|
+
state.updated_at = new Date().toISOString();
|
|
19
|
+
await fs.ensureDir(path.dirname(statePath));
|
|
20
|
+
await fs.writeJson(statePath, state, { spaces: 2 });
|
|
21
|
+
}
|
|
22
|
+
export async function createInitialState(projectName, idea) {
|
|
23
|
+
const state = {
|
|
24
|
+
project_name: projectName,
|
|
25
|
+
created_at: new Date().toISOString(),
|
|
26
|
+
updated_at: new Date().toISOString(),
|
|
27
|
+
original_idea: idea,
|
|
28
|
+
total_phases: 0,
|
|
29
|
+
current_phase: 0,
|
|
30
|
+
status: 'planning',
|
|
31
|
+
phases: [],
|
|
32
|
+
};
|
|
33
|
+
await saveProjectState(state);
|
|
34
|
+
return state;
|
|
35
|
+
}
|
|
36
|
+
export async function loadPhaseState(phaseNumber) {
|
|
37
|
+
const state = await loadProjectState();
|
|
38
|
+
if (!state)
|
|
39
|
+
return null;
|
|
40
|
+
return state.phases.find(p => p.phase_number === phaseNumber) || null;
|
|
41
|
+
}
|
|
42
|
+
export async function updatePhaseState(phaseNumber, updates) {
|
|
43
|
+
const state = await loadProjectState();
|
|
44
|
+
if (!state)
|
|
45
|
+
throw new Error('No project state found');
|
|
46
|
+
const phaseIndex = state.phases.findIndex(p => p.phase_number === phaseNumber);
|
|
47
|
+
if (phaseIndex === -1)
|
|
48
|
+
throw new Error(`Phase ${phaseNumber} not found`);
|
|
49
|
+
state.phases[phaseIndex] = { ...state.phases[phaseIndex], ...updates };
|
|
50
|
+
await saveProjectState(state);
|
|
51
|
+
}
|
|
52
|
+
export async function loadAttemptState(phaseNumber, attemptNumber) {
|
|
53
|
+
try {
|
|
54
|
+
const attemptPath = path.join(getProjectPhasesDir(), 'phases', `phase-${phaseNumber}`, `attempt-${attemptNumber}`, 'state.json');
|
|
55
|
+
if (await fs.pathExists(attemptPath)) {
|
|
56
|
+
return await fs.readJson(attemptPath);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Attempt state doesn't exist
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
export async function saveAttemptState(phaseNumber, attemptNumber, attemptState) {
|
|
65
|
+
const attemptPath = path.join(getProjectPhasesDir(), 'phases', `phase-${phaseNumber}`, `attempt-${attemptNumber}`, 'state.json');
|
|
66
|
+
await fs.ensureDir(path.dirname(attemptPath));
|
|
67
|
+
await fs.writeJson(attemptPath, attemptState, { spaces: 2 });
|
|
68
|
+
}
|
|
69
|
+
export async function createNewAttempt(phaseNumber) {
|
|
70
|
+
const phase = await loadPhaseState(phaseNumber);
|
|
71
|
+
if (!phase)
|
|
72
|
+
throw new Error(`Phase ${phaseNumber} not found`);
|
|
73
|
+
const attemptNumber = phase.current_attempt + 1;
|
|
74
|
+
if (attemptNumber > phase.max_attempts) {
|
|
75
|
+
throw new Error(`Maximum attempts (${phase.max_attempts}) exceeded for phase ${phaseNumber}`);
|
|
76
|
+
}
|
|
77
|
+
const attemptState = {
|
|
78
|
+
attempt_number: attemptNumber,
|
|
79
|
+
started_at: new Date().toISOString(),
|
|
80
|
+
status: 'in_progress',
|
|
81
|
+
files_modified: [],
|
|
82
|
+
};
|
|
83
|
+
await saveAttemptState(phaseNumber, attemptNumber, attemptState);
|
|
84
|
+
await updatePhaseState(phaseNumber, { current_attempt: attemptNumber, status: 'in_progress' });
|
|
85
|
+
return attemptState;
|
|
86
|
+
}
|
|
87
|
+
export async function markAttemptFailed(phaseNumber, attemptNumber, errorSummary, suggestedFix) {
|
|
88
|
+
const attemptState = await loadAttemptState(phaseNumber, attemptNumber);
|
|
89
|
+
if (!attemptState)
|
|
90
|
+
throw new Error(`Attempt ${attemptNumber} not found for phase ${phaseNumber}`);
|
|
91
|
+
attemptState.status = 'failed';
|
|
92
|
+
attemptState.completed_at = new Date().toISOString();
|
|
93
|
+
attemptState.error_summary = errorSummary;
|
|
94
|
+
attemptState.suggested_fix = suggestedFix;
|
|
95
|
+
await saveAttemptState(phaseNumber, attemptNumber, attemptState);
|
|
96
|
+
// Save failure report
|
|
97
|
+
const failureReportPath = path.join(getProjectPhasesDir(), 'phases', `phase-${phaseNumber}`, `attempt-${attemptNumber}`, 'failure-report.md');
|
|
98
|
+
const failureReport = `# Failure Report - Phase ${phaseNumber}, Attempt ${attemptNumber}
|
|
99
|
+
|
|
100
|
+
## Date
|
|
101
|
+
${new Date().toISOString()}
|
|
102
|
+
|
|
103
|
+
## What Was Attempted
|
|
104
|
+
[Details from the attempt]
|
|
105
|
+
|
|
106
|
+
## Why It Failed
|
|
107
|
+
${errorSummary}
|
|
108
|
+
|
|
109
|
+
## Suggested Fix for Next Attempt
|
|
110
|
+
${suggestedFix}
|
|
111
|
+
|
|
112
|
+
## Files Modified During This Attempt
|
|
113
|
+
${attemptState.files_modified.map(f => `- ${f}`).join('\n') || 'None recorded'}
|
|
114
|
+
`;
|
|
115
|
+
await fs.writeFile(failureReportPath, failureReport);
|
|
116
|
+
// Check if max attempts reached
|
|
117
|
+
const phase = await loadPhaseState(phaseNumber);
|
|
118
|
+
if (phase && phase.current_attempt >= phase.max_attempts) {
|
|
119
|
+
await updatePhaseState(phaseNumber, { status: 'blocked' });
|
|
120
|
+
// Create BLOCKED.md
|
|
121
|
+
const blockedPath = path.join(getProjectPhasesDir(), 'phases', `phase-${phaseNumber}`, 'BLOCKED.md');
|
|
122
|
+
const blockedContent = `# ⛔ Phase ${phaseNumber} BLOCKED
|
|
123
|
+
|
|
124
|
+
This phase has failed after ${phase.max_attempts} attempts.
|
|
125
|
+
|
|
126
|
+
## Summary of All Attempts
|
|
127
|
+
|
|
128
|
+
${Array.from({ length: phase.max_attempts }, (_, i) => i + 1)
|
|
129
|
+
.map(n => `### Attempt ${n}\nSee: attempt-${n}/failure-report.md`)
|
|
130
|
+
.join('\n\n')}
|
|
131
|
+
|
|
132
|
+
## Recommendation
|
|
133
|
+
Manual intervention required. Consider:
|
|
134
|
+
1. Reviewing the architecture decisions
|
|
135
|
+
2. Breaking this phase into smaller phases
|
|
136
|
+
3. Adjusting the requirements
|
|
137
|
+
|
|
138
|
+
## To Unblock
|
|
139
|
+
Run: \`ai-phases config --unblock ${phaseNumber}\`
|
|
140
|
+
`;
|
|
141
|
+
await fs.writeFile(blockedPath, blockedContent);
|
|
142
|
+
// Update project status
|
|
143
|
+
const state = await loadProjectState();
|
|
144
|
+
if (state) {
|
|
145
|
+
state.status = 'blocked';
|
|
146
|
+
await saveProjectState(state);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
await updatePhaseState(phaseNumber, { status: 'failed' });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
export async function markAttemptCompleted(phaseNumber, attemptNumber, filesModified) {
|
|
154
|
+
const attemptState = await loadAttemptState(phaseNumber, attemptNumber);
|
|
155
|
+
if (!attemptState)
|
|
156
|
+
throw new Error(`Attempt ${attemptNumber} not found for phase ${phaseNumber}`);
|
|
157
|
+
attemptState.status = 'completed';
|
|
158
|
+
attemptState.completed_at = new Date().toISOString();
|
|
159
|
+
attemptState.files_modified = filesModified;
|
|
160
|
+
await saveAttemptState(phaseNumber, attemptNumber, attemptState);
|
|
161
|
+
await updatePhaseState(phaseNumber, {
|
|
162
|
+
status: 'completed',
|
|
163
|
+
completed_at: new Date().toISOString()
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
export async function getPhaseDirectory(phaseNumber) {
|
|
167
|
+
return path.join(getProjectPhasesDir(), 'phases', `phase-${phaseNumber}`);
|
|
168
|
+
}
|
|
169
|
+
export async function getCurrentPhaseInfo() {
|
|
170
|
+
const state = await loadProjectState();
|
|
171
|
+
if (!state || state.phases.length === 0)
|
|
172
|
+
return null;
|
|
173
|
+
const currentPhase = state.phases.find(p => p.phase_number === state.current_phase);
|
|
174
|
+
if (!currentPhase)
|
|
175
|
+
return null;
|
|
176
|
+
const currentAttempt = currentPhase.current_attempt > 0
|
|
177
|
+
? await loadAttemptState(currentPhase.phase_number, currentPhase.current_attempt)
|
|
178
|
+
: null;
|
|
179
|
+
const canRetry = currentPhase.current_attempt < currentPhase.max_attempts;
|
|
180
|
+
return {
|
|
181
|
+
phase: currentPhase,
|
|
182
|
+
attempt: currentAttempt,
|
|
183
|
+
canRetry,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
export function createPhaseState(phaseNumber, name, description, tasks, validationCriteria, context7Queries, maxAttempts = 3) {
|
|
187
|
+
return {
|
|
188
|
+
phase_number: phaseNumber,
|
|
189
|
+
name,
|
|
190
|
+
description,
|
|
191
|
+
model: phaseNumber === 0 ? 'planning' : 'execution',
|
|
192
|
+
status: 'pending',
|
|
193
|
+
current_attempt: 0,
|
|
194
|
+
max_attempts: maxAttempts,
|
|
195
|
+
tasks,
|
|
196
|
+
validation_criteria: validationCriteria,
|
|
197
|
+
context7_queries: context7Queries,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=state-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../src/core/state-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ai-phase-builder",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "AI-powered project phase orchestration for Cursor IDE. Transform ideas into structured development phases with intelligent handovers, rollback support, and Context7 integration.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"ai-phases": "dist/cli/index.js"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsc -w",
|
|
13
|
+
"start": "node dist/cli/index.js",
|
|
14
|
+
"lint": "eslint src --ext .ts",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"ai",
|
|
19
|
+
"cursor",
|
|
20
|
+
"cursor-ide",
|
|
21
|
+
"coding",
|
|
22
|
+
"phases",
|
|
23
|
+
"orchestration",
|
|
24
|
+
"cli",
|
|
25
|
+
"claude",
|
|
26
|
+
"gemini",
|
|
27
|
+
"context7",
|
|
28
|
+
"developer-tools",
|
|
29
|
+
"automation",
|
|
30
|
+
"project-management"
|
|
31
|
+
],
|
|
32
|
+
"author": "nemtudom001",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/nemtudom001/AutoAIBuilder.git"
|
|
37
|
+
},
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/nemtudom001/AutoAIBuilder/issues"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/nemtudom001/AutoAIBuilder#readme",
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"chalk": "^5.3.0",
|
|
44
|
+
"commander": "^12.1.0",
|
|
45
|
+
"fs-extra": "^11.2.0",
|
|
46
|
+
"inquirer": "^9.2.23",
|
|
47
|
+
"ora": "^8.0.1",
|
|
48
|
+
"boxen": "^7.1.1",
|
|
49
|
+
"cli-table3": "^0.6.5"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@types/fs-extra": "^11.0.4",
|
|
53
|
+
"@types/inquirer": "^9.0.7",
|
|
54
|
+
"@types/node": "^20.11.0",
|
|
55
|
+
"typescript": "^5.3.3"
|
|
56
|
+
},
|
|
57
|
+
"engines": {
|
|
58
|
+
"node": ">=18.0.0"
|
|
59
|
+
},
|
|
60
|
+
"files": [
|
|
61
|
+
"dist",
|
|
62
|
+
"templates"
|
|
63
|
+
]
|
|
64
|
+
}
|