claude-devloop 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 +340 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +90 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.d.ts +9 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +80 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/continue.d.ts +11 -0
- package/dist/commands/continue.d.ts.map +1 -0
- package/dist/commands/continue.js +167 -0
- package/dist/commands/continue.js.map +1 -0
- package/dist/commands/feature.d.ts +7 -0
- package/dist/commands/feature.d.ts.map +1 -0
- package/dist/commands/feature.js +123 -0
- package/dist/commands/feature.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +401 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/run.d.ts +12 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +82 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/shared.d.ts +22 -0
- package/dist/commands/shared.d.ts.map +1 -0
- package/dist/commands/shared.js +32 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +305 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/workspace.d.ts +2 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +19 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/constants.d.ts +21 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +21 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/claude.d.ts +20 -0
- package/dist/core/claude.d.ts.map +1 -0
- package/dist/core/claude.js +401 -0
- package/dist/core/claude.js.map +1 -0
- package/dist/core/commit-format.d.ts +22 -0
- package/dist/core/commit-format.d.ts.map +1 -0
- package/dist/core/commit-format.js +148 -0
- package/dist/core/commit-format.js.map +1 -0
- package/dist/core/config.d.ts +30 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +130 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/feature-session.d.ts +8 -0
- package/dist/core/feature-session.d.ts.map +1 -0
- package/dist/core/feature-session.js +58 -0
- package/dist/core/feature-session.js.map +1 -0
- package/dist/core/git.d.ts +81 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +475 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/loop.d.ts +3 -0
- package/dist/core/loop.d.ts.map +1 -0
- package/dist/core/loop.js +469 -0
- package/dist/core/loop.js.map +1 -0
- package/dist/core/session.d.ts +7 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +57 -0
- package/dist/core/session.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/progress.d.ts +7 -0
- package/dist/parser/progress.d.ts.map +1 -0
- package/dist/parser/progress.js +132 -0
- package/dist/parser/progress.js.map +1 -0
- package/dist/parser/requirements.d.ts +6 -0
- package/dist/parser/requirements.d.ts.map +1 -0
- package/dist/parser/requirements.js +126 -0
- package/dist/parser/requirements.js.map +1 -0
- package/dist/types/feature.d.ts +15 -0
- package/dist/types/feature.d.ts.map +1 -0
- package/dist/types/feature.js +2 -0
- package/dist/types/feature.js.map +1 -0
- package/dist/types/index.d.ts +78 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
export async function readProgress(filePath) {
|
|
4
|
+
try {
|
|
5
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
6
|
+
return parseProgressContent(content);
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return null; // File doesn't exist yet
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function parseProgressContent(content) {
|
|
13
|
+
// Parse summary section
|
|
14
|
+
const totalMatch = content.match(/\*\*Total Tasks\*\*:\s*(\d+)/);
|
|
15
|
+
const completedMatch = content.match(/\*\*Completed\*\*:\s*(\d+)/);
|
|
16
|
+
const remainingMatch = content.match(/\*\*Remaining\*\*:\s*(\d+)/);
|
|
17
|
+
const lastUpdatedMatch = content.match(/\*\*Last Updated\*\*:\s*(.+)/);
|
|
18
|
+
// Parse iteration logs - split by iteration headers
|
|
19
|
+
const iterations = [];
|
|
20
|
+
const iterationBlocks = content.split(/(?=### Iteration \d+)/).slice(1);
|
|
21
|
+
for (const block of iterationBlocks) {
|
|
22
|
+
const headerMatch = block.match(/### Iteration (\d+) - (.+)/);
|
|
23
|
+
const taskMatch = block.match(/- \*\*Task Completed\*\*: ([\w-]+|none)/);
|
|
24
|
+
const summaryMatch = block.match(/- \*\*Summary\*\*: (.+)/);
|
|
25
|
+
const durationMatch = block.match(/- \*\*Duration\*\*: (.+)/);
|
|
26
|
+
const statusMatch = block.match(/- \*\*Exit Status\*\*: (\w+)/);
|
|
27
|
+
const errorTypeMatch = block.match(/- \*\*Error Type\*\*: (\w+)/);
|
|
28
|
+
const errorDetailMatch = block.match(/- \*\*Error Detail\*\*:\s*\n```\n([\s\S]*?)\n```/);
|
|
29
|
+
const tokensMatch = block.match(/- \*\*Tokens\*\*: ([\d,]+) total \(([\d,]+) in, ([\d,]+) out(?:, ([\d,]+) cache-create, ([\d,]+) cache-read)?\)/);
|
|
30
|
+
const costMatch = block.match(/- \*\*Cost\*\*: \$([\d.]+)/);
|
|
31
|
+
if (headerMatch && taskMatch && summaryMatch && durationMatch && statusMatch) {
|
|
32
|
+
const log = {
|
|
33
|
+
iteration: parseInt(headerMatch[1], 10),
|
|
34
|
+
timestamp: headerMatch[2].trim(),
|
|
35
|
+
taskCompleted: taskMatch[1] === 'none' ? null : taskMatch[1],
|
|
36
|
+
summary: summaryMatch[1].trim(),
|
|
37
|
+
duration: durationMatch[1].trim(),
|
|
38
|
+
exitStatus: statusMatch[1]
|
|
39
|
+
};
|
|
40
|
+
if (errorTypeMatch) {
|
|
41
|
+
log.errorType = errorTypeMatch[1];
|
|
42
|
+
}
|
|
43
|
+
if (errorDetailMatch) {
|
|
44
|
+
log.errorDetail = errorDetailMatch[1].trim();
|
|
45
|
+
}
|
|
46
|
+
if (tokensMatch) {
|
|
47
|
+
log.tokenUsage = {
|
|
48
|
+
totalTokens: parseInt(tokensMatch[1].replace(/,/g, ''), 10),
|
|
49
|
+
inputTokens: parseInt(tokensMatch[2].replace(/,/g, ''), 10),
|
|
50
|
+
outputTokens: parseInt(tokensMatch[3].replace(/,/g, ''), 10),
|
|
51
|
+
cacheCreationTokens: tokensMatch[4] ? parseInt(tokensMatch[4].replace(/,/g, ''), 10) : 0,
|
|
52
|
+
cacheReadTokens: tokensMatch[5] ? parseInt(tokensMatch[5].replace(/,/g, ''), 10) : 0,
|
|
53
|
+
costUsd: costMatch ? parseFloat(costMatch[1]) : 0
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
iterations.push(log);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
totalTasks: parseInt(totalMatch?.[1] || '0', 10),
|
|
61
|
+
completed: parseInt(completedMatch?.[1] || '0', 10),
|
|
62
|
+
remaining: parseInt(remainingMatch?.[1] || '0', 10),
|
|
63
|
+
lastUpdated: lastUpdatedMatch?.[1]?.trim() || new Date().toISOString(),
|
|
64
|
+
iterations
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function generateProgressContent(totalTasks, completedCount, iterations) {
|
|
68
|
+
const now = new Date().toISOString();
|
|
69
|
+
let content = `# DevLoop Progress Log
|
|
70
|
+
|
|
71
|
+
## Summary
|
|
72
|
+
- **Total Tasks**: ${totalTasks}
|
|
73
|
+
- **Completed**: ${completedCount}
|
|
74
|
+
- **Remaining**: ${totalTasks - completedCount}
|
|
75
|
+
- **Last Updated**: ${now}
|
|
76
|
+
|
|
77
|
+
## Iteration Log
|
|
78
|
+
|
|
79
|
+
`;
|
|
80
|
+
for (const iter of iterations) {
|
|
81
|
+
content += `### Iteration ${iter.iteration} - ${iter.timestamp}
|
|
82
|
+
- **Task Completed**: ${iter.taskCompleted || 'none'}
|
|
83
|
+
- **Summary**: ${iter.summary}
|
|
84
|
+
- **Duration**: ${iter.duration}
|
|
85
|
+
- **Exit Status**: ${iter.exitStatus}
|
|
86
|
+
`;
|
|
87
|
+
if (iter.tokenUsage) {
|
|
88
|
+
content += `- **Tokens**: ${iter.tokenUsage.totalTokens.toLocaleString()} total (${iter.tokenUsage.inputTokens.toLocaleString()} in, ${iter.tokenUsage.outputTokens.toLocaleString()} out, ${iter.tokenUsage.cacheCreationTokens.toLocaleString()} cache-create, ${iter.tokenUsage.cacheReadTokens.toLocaleString()} cache-read)
|
|
89
|
+
- **Cost**: $${iter.tokenUsage.costUsd.toFixed(4)}
|
|
90
|
+
`;
|
|
91
|
+
}
|
|
92
|
+
if (iter.errorType) {
|
|
93
|
+
content += `- **Error Type**: ${iter.errorType}
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
if (iter.errorDetail) {
|
|
97
|
+
content += `- **Error Detail**:
|
|
98
|
+
\`\`\`
|
|
99
|
+
${iter.errorDetail}
|
|
100
|
+
\`\`\`
|
|
101
|
+
`;
|
|
102
|
+
}
|
|
103
|
+
content += '\n';
|
|
104
|
+
}
|
|
105
|
+
return content;
|
|
106
|
+
}
|
|
107
|
+
export async function writeProgress(filePath, progress) {
|
|
108
|
+
const content = generateProgressContent(progress.totalTasks, progress.completed, progress.iterations);
|
|
109
|
+
// Ensure directory exists (for feature mode progress files in progress/ folder)
|
|
110
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
111
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
112
|
+
}
|
|
113
|
+
export async function appendIteration(filePath, totalTasks, iteration) {
|
|
114
|
+
let progress = await readProgress(filePath);
|
|
115
|
+
if (!progress) {
|
|
116
|
+
progress = {
|
|
117
|
+
totalTasks,
|
|
118
|
+
completed: 0,
|
|
119
|
+
remaining: totalTasks,
|
|
120
|
+
lastUpdated: new Date().toISOString(),
|
|
121
|
+
iterations: []
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
progress.iterations.push(iteration);
|
|
125
|
+
if (iteration.exitStatus === 'success' && iteration.taskCompleted) {
|
|
126
|
+
progress.completed++;
|
|
127
|
+
progress.remaining--;
|
|
128
|
+
}
|
|
129
|
+
progress.lastUpdated = new Date().toISOString();
|
|
130
|
+
await writeProgress(filePath, progress);
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/parser/progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Task, Requirements } from '../types/index.js';
|
|
2
|
+
export declare function parseRequirements(filePath: string): Promise<Requirements>;
|
|
3
|
+
export declare function parseRequirementsContent(content: string): Requirements;
|
|
4
|
+
export declare function getNextTask(requirements: Requirements): Task | null;
|
|
5
|
+
export declare function generateRequirementsTemplate(projectName: string): string;
|
|
6
|
+
//# sourceMappingURL=requirements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirements.d.ts","sourceRoot":"","sources":["../../src/parser/requirements.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,YAAY,EAA4B,MAAM,mBAAmB,CAAC;AAQjF,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAG/E;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAyEtE;AAED,wBAAgB,WAAW,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAwBnE;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA6BxE"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
const TASK_REGEX = /^### (TASK-\d+): (.+)$/;
|
|
3
|
+
const STATUS_REGEX = /^\s*-\s*\*\*Status\*\*:\s*(pending|in-progress|done)/i;
|
|
4
|
+
const PRIORITY_REGEX = /^\s*-\s*\*\*Priority\*\*:\s*(high|medium|low)/i;
|
|
5
|
+
const DEPS_REGEX = /^\s*-\s*\*\*Dependencies\*\*:\s*(.+)/i;
|
|
6
|
+
const DESC_REGEX = /^\s*-\s*\*\*Description\*\*:\s*(.+)/i;
|
|
7
|
+
export async function parseRequirements(filePath) {
|
|
8
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
9
|
+
return parseRequirementsContent(content);
|
|
10
|
+
}
|
|
11
|
+
export function parseRequirementsContent(content) {
|
|
12
|
+
const lines = content.split('\n');
|
|
13
|
+
const tasks = [];
|
|
14
|
+
let currentTask = null;
|
|
15
|
+
// Parse metadata from header - try multiple formats
|
|
16
|
+
const projectMatch = content.match(/\*\*Project\*\*:\s*(.+)/);
|
|
17
|
+
const createdMatch = content.match(/\*\*Created\*\*:\s*(.+)/);
|
|
18
|
+
const authorMatch = content.match(/\*\*Author\*\*:\s*(.+)/);
|
|
19
|
+
// Also try to get project name from markdown title (# ProjectName - ...) or (# ProjectName)
|
|
20
|
+
const titleMatch = content.match(/^#\s+([^-\n]+)/m);
|
|
21
|
+
const projectName = projectMatch?.[1]?.trim() || titleMatch?.[1]?.trim() || 'Unknown Project';
|
|
22
|
+
for (const line of lines) {
|
|
23
|
+
const taskMatch = line.match(TASK_REGEX);
|
|
24
|
+
if (taskMatch) {
|
|
25
|
+
if (currentTask && currentTask.id) {
|
|
26
|
+
tasks.push(currentTask);
|
|
27
|
+
}
|
|
28
|
+
currentTask = {
|
|
29
|
+
id: taskMatch[1],
|
|
30
|
+
title: taskMatch[2],
|
|
31
|
+
status: 'pending',
|
|
32
|
+
priority: 'medium',
|
|
33
|
+
dependencies: [],
|
|
34
|
+
description: ''
|
|
35
|
+
};
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (currentTask) {
|
|
39
|
+
const statusMatch = line.match(STATUS_REGEX);
|
|
40
|
+
if (statusMatch) {
|
|
41
|
+
currentTask.status = statusMatch[1].toLowerCase();
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const priorityMatch = line.match(PRIORITY_REGEX);
|
|
45
|
+
if (priorityMatch) {
|
|
46
|
+
currentTask.priority = priorityMatch[1].toLowerCase();
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const depsMatch = line.match(DEPS_REGEX);
|
|
50
|
+
if (depsMatch) {
|
|
51
|
+
const deps = depsMatch[1].trim();
|
|
52
|
+
currentTask.dependencies = deps.toLowerCase() === 'none'
|
|
53
|
+
? []
|
|
54
|
+
: deps.split(',').map(d => d.trim());
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const descMatch = line.match(DESC_REGEX);
|
|
58
|
+
if (descMatch) {
|
|
59
|
+
currentTask.description = descMatch[1].trim();
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Don't forget the last task
|
|
65
|
+
if (currentTask && currentTask.id) {
|
|
66
|
+
tasks.push(currentTask);
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
projectName,
|
|
70
|
+
created: createdMatch?.[1]?.trim() || new Date().toISOString().split('T')[0],
|
|
71
|
+
author: authorMatch?.[1]?.trim() || 'Unknown',
|
|
72
|
+
tasks
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export function getNextTask(requirements) {
|
|
76
|
+
const completedIds = new Set(requirements.tasks.filter(t => t.status === 'done').map(t => t.id));
|
|
77
|
+
// Sort by priority (high > medium > low), then by task ID
|
|
78
|
+
const priorityOrder = { high: 0, medium: 1, low: 2 };
|
|
79
|
+
const pendingTasks = requirements.tasks
|
|
80
|
+
.filter(t => t.status === 'pending')
|
|
81
|
+
.sort((a, b) => {
|
|
82
|
+
const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];
|
|
83
|
+
if (priorityDiff !== 0)
|
|
84
|
+
return priorityDiff;
|
|
85
|
+
return a.id.localeCompare(b.id);
|
|
86
|
+
});
|
|
87
|
+
// Find first pending task whose dependencies are all done
|
|
88
|
+
for (const task of pendingTasks) {
|
|
89
|
+
const depsComplete = task.dependencies.every(dep => completedIds.has(dep));
|
|
90
|
+
if (depsComplete) {
|
|
91
|
+
return task;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
export function generateRequirementsTemplate(projectName) {
|
|
97
|
+
const today = new Date().toISOString().split('T')[0];
|
|
98
|
+
return `# Project Requirements
|
|
99
|
+
|
|
100
|
+
## Metadata
|
|
101
|
+
- **Project**: ${projectName}
|
|
102
|
+
- **Created**: ${today}
|
|
103
|
+
- **Author**: Developer
|
|
104
|
+
|
|
105
|
+
## Tasks
|
|
106
|
+
|
|
107
|
+
### TASK-001: Example task one
|
|
108
|
+
- **Status**: pending
|
|
109
|
+
- **Priority**: high
|
|
110
|
+
- **Dependencies**: none
|
|
111
|
+
- **Description**: This is an example task. Replace with your actual task description.
|
|
112
|
+
|
|
113
|
+
### TASK-002: Example task two
|
|
114
|
+
- **Status**: pending
|
|
115
|
+
- **Priority**: medium
|
|
116
|
+
- **Dependencies**: TASK-001
|
|
117
|
+
- **Description**: This task depends on TASK-001. It will only be worked on after TASK-001 is complete.
|
|
118
|
+
|
|
119
|
+
### TASK-003: Example task three
|
|
120
|
+
- **Status**: pending
|
|
121
|
+
- **Priority**: low
|
|
122
|
+
- **Dependencies**: none
|
|
123
|
+
- **Description**: This is an independent task with no dependencies.
|
|
124
|
+
`;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=requirements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirements.js","sourceRoot":"","sources":["../../src/parser/requirements.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { SessionPhase } from './index.js';
|
|
2
|
+
export interface FeatureSession {
|
|
3
|
+
feature: string;
|
|
4
|
+
phase: SessionPhase;
|
|
5
|
+
sessionId: string | null;
|
|
6
|
+
lastIteration: number;
|
|
7
|
+
startedAt: string;
|
|
8
|
+
requirementsPath: string;
|
|
9
|
+
progressPath: string;
|
|
10
|
+
}
|
|
11
|
+
export interface WorkspaceConfig {
|
|
12
|
+
/** Format for all DevLoop commits. Use {action} placeholder. */
|
|
13
|
+
devloopCommitFormat?: string;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=feature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature.d.ts","sourceRoot":"","sources":["../../src/types/feature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature.js","sourceRoot":"","sources":["../../src/types/feature.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export type TaskStatus = 'pending' | 'in-progress' | 'done';
|
|
2
|
+
export type TaskPriority = 'high' | 'medium' | 'low';
|
|
3
|
+
export type ExitStatus = 'success' | 'error' | 'partial' | 'interrupted';
|
|
4
|
+
export type SessionPhase = 'init' | 'run';
|
|
5
|
+
export interface Task {
|
|
6
|
+
id: string;
|
|
7
|
+
title: string;
|
|
8
|
+
status: TaskStatus;
|
|
9
|
+
priority: TaskPriority;
|
|
10
|
+
dependencies: string[];
|
|
11
|
+
description: string;
|
|
12
|
+
}
|
|
13
|
+
export interface Requirements {
|
|
14
|
+
projectName: string;
|
|
15
|
+
created: string;
|
|
16
|
+
author: string;
|
|
17
|
+
tasks: Task[];
|
|
18
|
+
}
|
|
19
|
+
export interface IterationLog {
|
|
20
|
+
iteration: number;
|
|
21
|
+
timestamp: string;
|
|
22
|
+
taskCompleted: string | null;
|
|
23
|
+
summary: string;
|
|
24
|
+
duration: string;
|
|
25
|
+
exitStatus: ExitStatus;
|
|
26
|
+
errorType?: ClaudeErrorType;
|
|
27
|
+
errorDetail?: string;
|
|
28
|
+
tokenUsage?: TokenUsage;
|
|
29
|
+
}
|
|
30
|
+
export interface Progress {
|
|
31
|
+
totalTasks: number;
|
|
32
|
+
completed: number;
|
|
33
|
+
remaining: number;
|
|
34
|
+
lastUpdated: string;
|
|
35
|
+
iterations: IterationLog[];
|
|
36
|
+
}
|
|
37
|
+
export interface Session {
|
|
38
|
+
phase: SessionPhase;
|
|
39
|
+
sessionId: string | null;
|
|
40
|
+
lastIteration: number;
|
|
41
|
+
startedAt: string;
|
|
42
|
+
}
|
|
43
|
+
export interface GlobalConfig {
|
|
44
|
+
defaultWorkspace: string | null;
|
|
45
|
+
maxIterations: number;
|
|
46
|
+
}
|
|
47
|
+
export interface DevLoopConfig {
|
|
48
|
+
maxIterations: number;
|
|
49
|
+
requirementsPath: string;
|
|
50
|
+
progressPath: string;
|
|
51
|
+
workspacePath: string;
|
|
52
|
+
verbose: boolean;
|
|
53
|
+
dryRun: boolean;
|
|
54
|
+
tokenLimit?: number;
|
|
55
|
+
costLimit?: number;
|
|
56
|
+
featureName?: string;
|
|
57
|
+
sessionAction?: 'create' | 'update' | 'create-feature' | 'none';
|
|
58
|
+
}
|
|
59
|
+
export type ClaudeErrorType = 'rate_limit' | 'api_overload' | 'auth_error' | 'network_error' | 'task_failure' | 'unknown';
|
|
60
|
+
export interface TokenUsage {
|
|
61
|
+
inputTokens: number;
|
|
62
|
+
outputTokens: number;
|
|
63
|
+
cacheCreationTokens: number;
|
|
64
|
+
cacheReadTokens: number;
|
|
65
|
+
totalTokens: number;
|
|
66
|
+
costUsd: number;
|
|
67
|
+
}
|
|
68
|
+
export interface ClaudeResult {
|
|
69
|
+
success: boolean;
|
|
70
|
+
output: string;
|
|
71
|
+
error?: string;
|
|
72
|
+
errorType?: ClaudeErrorType;
|
|
73
|
+
duration: number;
|
|
74
|
+
sessionId?: string;
|
|
75
|
+
tokenUsage?: TokenUsage;
|
|
76
|
+
}
|
|
77
|
+
export * from './feature.js';
|
|
78
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AA6FA,0BAA0B;AAC1B,cAAc,cAAc,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "claude-devloop",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Automate iterative development with Claude Code",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"bin": {
|
|
11
|
+
"devloop": "dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"dev": "tsx src/index.ts",
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"start": "node dist/index.js",
|
|
17
|
+
"typecheck": "tsc --noEmit"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"cli",
|
|
21
|
+
"claude",
|
|
22
|
+
"automation",
|
|
23
|
+
"development"
|
|
24
|
+
],
|
|
25
|
+
"author": "",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^22.0.0",
|
|
29
|
+
"tsx": "^4.21.0",
|
|
30
|
+
"typescript": "^5.7.0"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"chalk": "^5.4.0",
|
|
34
|
+
"commander": "^13.0.0",
|
|
35
|
+
"ora": "^8.1.0"
|
|
36
|
+
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=20.0.0"
|
|
39
|
+
}
|
|
40
|
+
}
|