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.
Files changed (90) hide show
  1. package/README.md +340 -0
  2. package/dist/cli.d.ts +4 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +90 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/config.d.ts +9 -0
  7. package/dist/commands/config.d.ts.map +1 -0
  8. package/dist/commands/config.js +80 -0
  9. package/dist/commands/config.js.map +1 -0
  10. package/dist/commands/continue.d.ts +11 -0
  11. package/dist/commands/continue.d.ts.map +1 -0
  12. package/dist/commands/continue.js +167 -0
  13. package/dist/commands/continue.js.map +1 -0
  14. package/dist/commands/feature.d.ts +7 -0
  15. package/dist/commands/feature.d.ts.map +1 -0
  16. package/dist/commands/feature.js +123 -0
  17. package/dist/commands/feature.js.map +1 -0
  18. package/dist/commands/init.d.ts +8 -0
  19. package/dist/commands/init.d.ts.map +1 -0
  20. package/dist/commands/init.js +401 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/run.d.ts +12 -0
  23. package/dist/commands/run.d.ts.map +1 -0
  24. package/dist/commands/run.js +82 -0
  25. package/dist/commands/run.js.map +1 -0
  26. package/dist/commands/shared.d.ts +22 -0
  27. package/dist/commands/shared.d.ts.map +1 -0
  28. package/dist/commands/shared.js +32 -0
  29. package/dist/commands/shared.js.map +1 -0
  30. package/dist/commands/status.d.ts +8 -0
  31. package/dist/commands/status.d.ts.map +1 -0
  32. package/dist/commands/status.js +305 -0
  33. package/dist/commands/status.js.map +1 -0
  34. package/dist/commands/workspace.d.ts +2 -0
  35. package/dist/commands/workspace.d.ts.map +1 -0
  36. package/dist/commands/workspace.js +19 -0
  37. package/dist/commands/workspace.js.map +1 -0
  38. package/dist/constants.d.ts +21 -0
  39. package/dist/constants.d.ts.map +1 -0
  40. package/dist/constants.js +21 -0
  41. package/dist/constants.js.map +1 -0
  42. package/dist/core/claude.d.ts +20 -0
  43. package/dist/core/claude.d.ts.map +1 -0
  44. package/dist/core/claude.js +401 -0
  45. package/dist/core/claude.js.map +1 -0
  46. package/dist/core/commit-format.d.ts +22 -0
  47. package/dist/core/commit-format.d.ts.map +1 -0
  48. package/dist/core/commit-format.js +148 -0
  49. package/dist/core/commit-format.js.map +1 -0
  50. package/dist/core/config.d.ts +30 -0
  51. package/dist/core/config.d.ts.map +1 -0
  52. package/dist/core/config.js +130 -0
  53. package/dist/core/config.js.map +1 -0
  54. package/dist/core/feature-session.d.ts +8 -0
  55. package/dist/core/feature-session.d.ts.map +1 -0
  56. package/dist/core/feature-session.js +58 -0
  57. package/dist/core/feature-session.js.map +1 -0
  58. package/dist/core/git.d.ts +81 -0
  59. package/dist/core/git.d.ts.map +1 -0
  60. package/dist/core/git.js +475 -0
  61. package/dist/core/git.js.map +1 -0
  62. package/dist/core/loop.d.ts +3 -0
  63. package/dist/core/loop.d.ts.map +1 -0
  64. package/dist/core/loop.js +469 -0
  65. package/dist/core/loop.js.map +1 -0
  66. package/dist/core/session.d.ts +7 -0
  67. package/dist/core/session.d.ts.map +1 -0
  68. package/dist/core/session.js +57 -0
  69. package/dist/core/session.js.map +1 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +4 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/parser/progress.d.ts +7 -0
  75. package/dist/parser/progress.d.ts.map +1 -0
  76. package/dist/parser/progress.js +132 -0
  77. package/dist/parser/progress.js.map +1 -0
  78. package/dist/parser/requirements.d.ts +6 -0
  79. package/dist/parser/requirements.d.ts.map +1 -0
  80. package/dist/parser/requirements.js +126 -0
  81. package/dist/parser/requirements.js.map +1 -0
  82. package/dist/types/feature.d.ts +15 -0
  83. package/dist/types/feature.d.ts.map +1 -0
  84. package/dist/types/feature.js +2 -0
  85. package/dist/types/feature.js.map +1 -0
  86. package/dist/types/index.d.ts +78 -0
  87. package/dist/types/index.d.ts.map +1 -0
  88. package/dist/types/index.js +3 -0
  89. package/dist/types/index.js.map +1 -0
  90. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=feature.js.map
@@ -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,3 @@
1
+ // Re-export feature types
2
+ export * from './feature.js';
3
+ //# sourceMappingURL=index.js.map
@@ -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
+ }