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
package/README.md ADDED
@@ -0,0 +1,340 @@
1
+ # DevLoop
2
+
3
+ Automate iterative development with Claude Code. DevLoop helps you break down projects into small tasks and automatically executes them in a loop using Claude.
4
+
5
+ ![DevLoop in action](images/example-devloop-usage.png)
6
+
7
+ ## How It Works
8
+
9
+ 1. **Define requirements** - Use an interactive Claude session to break your project into small tasks (~30 min each)
10
+ 2. **Run the loop** - DevLoop picks the next task, spawns Claude to complete it, logs progress, and repeats
11
+ 3. **Track progress** - View task status and iteration logs at any time
12
+
13
+ Each iteration runs in a fresh Claude context, so you get consistent behavior without context buildup.
14
+
15
+ ## Installation
16
+
17
+ ### From npm (recommended)
18
+
19
+ ```bash
20
+ npm install -g claude-devloop
21
+ ```
22
+
23
+ ### From source
24
+
25
+ ```bash
26
+ # Clone this repo, then:
27
+ npm install
28
+ npm run build
29
+ npm link
30
+ ```
31
+
32
+ You may need `sudo npm link` (macOS/Linux) or run as Administrator (Windows) if you get permission errors.
33
+
34
+ ### Verify Installation
35
+
36
+ ```bash
37
+ devloop --version
38
+ devloop --help
39
+ ```
40
+
41
+ ## Uninstallation
42
+
43
+ ```bash
44
+ npm uninstall -g claude-devloop
45
+ ```
46
+
47
+ ### Clean Up Config Files
48
+
49
+ DevLoop stores configuration in your home directory:
50
+
51
+ ```powershell
52
+ # Windows - remove global config
53
+ rmdir /s /q %USERPROFILE%\.devloop
54
+ ```
55
+
56
+ ```bash
57
+ # macOS / Linux - remove global config
58
+ rm -rf ~/.devloop
59
+ ```
60
+
61
+ Workspace files (`requirements.md`, `progress.md`, `CLAUDE.md`, `.devloop/`) are stored in each project directory and can be deleted manually if no longer needed.
62
+
63
+ ## Quick Start
64
+
65
+ ```bash
66
+ # 1. Navigate to your project directory
67
+ cd C:\Projects\MyApp
68
+
69
+ # 2. Create requirements.md interactively with Claude
70
+ devloop init
71
+
72
+ # 3. Check your tasks
73
+ devloop status
74
+
75
+ # 4. Run the loop (10 iterations by default)
76
+ devloop run
77
+
78
+ # 5. Come back later and continue
79
+ devloop continue
80
+ ```
81
+
82
+ ## Tips for `devloop init`
83
+
84
+ When you run `devloop init`, DevLoop creates a placeholder `requirements.md` and then opens an interactive Claude session. Here's what to expect:
85
+
86
+ - **Claude will ask to overwrite the file** — say yes. The placeholder is just a template; Claude needs to replace it with your actual tasks.
87
+ - **Describe what you want to build.** Include any preferences for technologies, libraries, or approaches. Claude will break your idea into small tasks (~30 min each) with dependencies.
88
+ - **Don't ask Claude to start building the project.** The init session is only for creating the requirements document. Implementation happens later when you run `devloop run`. If Claude starts writing code or creating files, remind it to just write the requirements doc.
89
+ - **Review the tasks before exiting.** Ask Claude to adjust priorities, split large tasks, or add missing steps. It's much easier to fix the plan now than after tasks have started running.
90
+ - **Exit when you're happy** with Ctrl+C or `/exit`. DevLoop will commit the requirements and you can start running tasks.
91
+
92
+ ## Commands
93
+
94
+ ### `devloop init`
95
+
96
+ Starts an interactive Claude session to create your `requirements.md` file. Claude helps you break down your project into small, actionable tasks.
97
+
98
+ If a `requirements.md` already exists but DevLoop hasn't been initialized (no `.devloop/` folder), the command will **adopt** the existing file and set up the necessary infrastructure, allowing you to use `devloop run` immediately.
99
+
100
+ ```bash
101
+ devloop init # Use default/configured workspace
102
+ devloop init -w ./my-project # Specify workspace
103
+ devloop init --force # Overwrite existing requirements.md and reinitialize
104
+ ```
105
+
106
+ **Behavior with existing files:**
107
+ - `requirements.md` exists + no session → Adopts existing file, creates infrastructure
108
+ - `requirements.md` exists + session exists → Prompts to use `continue` or `--force`
109
+ - No `requirements.md` → Creates template and starts fresh
110
+
111
+ ### `devloop run`
112
+
113
+ Executes tasks from `requirements.md` in a loop. Each iteration:
114
+ 1. Parses requirements.md to find the next pending task (respecting dependencies)
115
+ 2. Spawns Claude with the task details
116
+ 3. Claude completes the task and marks it done
117
+ 4. Logs the result to progress.md
118
+ 5. Repeats until all tasks done or max iterations reached
119
+
120
+ ```bash
121
+ devloop run # Run with defaults (10 iterations)
122
+ devloop run -n 5 # Limit to 5 iterations
123
+ devloop run -t 500000 # Stop when session tokens exceed 500k
124
+ devloop run -c 5 # Stop when session cost exceeds $5
125
+ devloop run -v # Verbose output (show Claude's work)
126
+ devloop run --dry-run # Show what would run without executing
127
+ devloop run -w ./my-project # Specify workspace
128
+ ```
129
+
130
+ ### `devloop status`
131
+
132
+ Shows current progress and task list.
133
+
134
+ ```bash
135
+ devloop status # Human-readable output
136
+ devloop status --json # JSON output for scripting
137
+ ```
138
+
139
+ ### `devloop continue`
140
+
141
+ Resume work after a break. Prompts you to choose:
142
+ - **Continue requirements** - Resume refining requirements.md with Claude
143
+ - **Continue run** - Resume task execution from where you left off
144
+
145
+ ```bash
146
+ devloop continue
147
+ devloop continue -n 20 # Continue run with 20 max iterations
148
+ devloop continue -t 500000 # Continue with token limit
149
+ devloop continue -c 5 # Continue with $5 cost limit
150
+ ```
151
+
152
+ ### `devloop workspace`
153
+
154
+ View or set the default workspace directory.
155
+
156
+ ```bash
157
+ devloop workspace # Show current default
158
+ devloop workspace C:\Dev # Set default workspace
159
+ ```
160
+
161
+ ## File Structure
162
+
163
+ DevLoop creates these files in your workspace:
164
+
165
+ ```
166
+ my-project/
167
+ ├── requirements.md # Your tasks (you + Claude create this)
168
+ ├── progress.md # Iteration logs (auto-generated)
169
+ ├── CLAUDE.md # Context for Claude (auto-generated)
170
+ └── .devloop/
171
+ ├── session.json # Session state for resuming
172
+ └── config.json # Workspace config (commit format, etc.)
173
+ ```
174
+
175
+ Global config is stored at `~/.devloop/config.json`.
176
+
177
+ ## Task Format
178
+
179
+ Tasks in `requirements.md` follow this format:
180
+
181
+ ```markdown
182
+ ### TASK-001: Set up project structure
183
+ - **Status**: pending
184
+ - **Priority**: high
185
+ - **Dependencies**: none
186
+ - **Description**: Initialize with package.json and tsconfig.json.
187
+
188
+ ### TASK-002: Implement user authentication
189
+ - **Status**: pending
190
+ - **Priority**: high
191
+ - **Dependencies**: TASK-001
192
+ - **Description**: Create login endpoint with JWT tokens.
193
+ ```
194
+
195
+ - **Status**: `pending`, `in-progress`, or `done`
196
+ - **Priority**: `high`, `medium`, or `low` (higher priority tasks run first)
197
+ - **Dependencies**: `none` or comma-separated task IDs (e.g., `TASK-001, TASK-002`)
198
+
199
+ ## Progress Indicators
200
+
201
+ DevLoop provides visual feedback during execution:
202
+
203
+ - **Terminal title**: Shows current iteration, task ID, and progress (e.g., "DevLoop: 3/10 - TASK-005 (2/12 done)")
204
+ - **Animated spinner**: Displays elapsed time while Claude works on a task
205
+ - **Final status**: Terminal title updates to show completion status
206
+
207
+ ## Graceful Shutdown
208
+
209
+ DevLoop supports graceful shutdown during task execution:
210
+
211
+ - **First Ctrl+C**: Requests graceful stop - the current task will complete, then DevLoop stops
212
+ - **Second Ctrl+C**: Warning that next press will force stop
213
+ - **Third Ctrl+C**: Force stops immediately (may leave work incomplete)
214
+
215
+ This allows you to stop the loop without interrupting Claude mid-task.
216
+
217
+ ## Interrupted Work Recovery
218
+
219
+ If a task is interrupted (e.g., force Ctrl+C during execution), DevLoop detects and preserves partial work:
220
+
221
+ - **Detection**: At the start of each run, DevLoop checks for uncommitted git changes
222
+ - **Commit**: If uncommitted changes exist, they are committed with a message like `DevLoop: Interrupted work on TASK-001 - Task title`
223
+ - **Fresh start**: Claude then starts fresh with a clean working tree
224
+ - **Failure handling**: If the commit fails, DevLoop stops and provides instructions for manual resolution
225
+
226
+ The partial work is preserved in git history. If it was needed (and tests fail without it), you can recover it from the commit.
227
+
228
+ If DevLoop cannot commit the uncommitted changes (e.g., git configuration issues), it will stop and ask you to resolve manually using `git status`, then either commit or discard the changes before running `devloop continue`.
229
+
230
+ ## Commit Message Format
231
+
232
+ DevLoop commits use a configurable format with an `{action}` placeholder that gets replaced with what DevLoop did.
233
+
234
+ - **Default format**: `DevLoop: {action}`
235
+ - **Example actions**: "Initialize workspace", "Complete TASK-001 - Fix bug", "Attempted TASK-002 - Add feature"
236
+
237
+ **Auto-detection during init**: When you run `devloop init`, DevLoop detects commit hooks (commitlint, husky, git hooks). If hooks are found, you're prompted for a commit message format.
238
+
239
+ **Manual configuration**:
240
+
241
+ ```bash
242
+ devloop config set devloopCommitFormat "chore(devloop): {action}"
243
+ devloop config list # Show current config
244
+ ```
245
+
246
+ **Hook failure handling**: If a commit fails due to a hook, DevLoop displays the error, prompts you for a valid commit message (with `{action}` placeholder), retries, and saves the format for future commits.
247
+
248
+ ## Safety
249
+
250
+ When running automated tasks, DevLoop restricts Claude to your workspace:
251
+
252
+ - Uses `--add-dir <workspace>` to limit file operations
253
+ - Prompts explicitly state workspace boundaries
254
+ - Dangerous commands (rm -rf /, sudo, etc.) are blocked in settings
255
+
256
+ ## Token Tracking
257
+
258
+ DevLoop tracks API token usage across iterations:
259
+
260
+ - **Per-iteration tracking**: Each iteration logs input tokens, output tokens, and cost
261
+ - **Cumulative display**: After each task, shows running total of tokens used
262
+ - **Token limits**: Use `-t, --token-limit` to stop before exceeding a token threshold
263
+ - **Cost limits**: Use `-c, --cost-limit` to stop before exceeding a dollar amount
264
+ - **Status display**: `devloop status` shows total tokens and cost for the project
265
+
266
+ Token data is stored in `progress.md` and persists across sessions.
267
+
268
+ ## API Error Handling
269
+
270
+ DevLoop automatically detects and handles API-level errors:
271
+
272
+ - **Rate limits** (400/429): Stops the loop and displays the error message
273
+ - **Authentication errors** (401): Stops and prompts to check credentials
274
+ - **API overload** (503): Stops and suggests retrying later
275
+ - **Network errors**: Stops on connection failures
276
+
277
+ Task failures (Claude ran but couldn't complete the task) continue to the next iteration, as a future attempt may succeed.
278
+
279
+ When `devloop status` is run after a failure, it displays:
280
+ - Error type (rate_limit, auth_error, etc.)
281
+ - Error summary and detailed message
282
+ - Timestamp of the failure
283
+
284
+ ## Feature Mode
285
+
286
+ Feature mode lets you organize work into independent features, each with their own requirements, progress tracking, and session state. This is useful for larger projects where you want to work on multiple features in parallel without mixing their tasks.
287
+
288
+ ### File Structure
289
+
290
+ ```
291
+ my-project/
292
+ ├── requirements/
293
+ │ ├── auth.md # Feature-specific requirements
294
+ │ └── dashboard.md
295
+ ├── progress/
296
+ │ ├── auth.md # Feature-specific progress
297
+ │ └── dashboard.md
298
+ └── .devloop/
299
+ └── features/
300
+ ├── auth.json # Feature session state
301
+ └── dashboard.json
302
+ ```
303
+
304
+ ### Usage
305
+
306
+ Use the `--feature <name>` flag on any command:
307
+
308
+ ```bash
309
+ devloop init --feature auth # Create requirements/auth.md
310
+ devloop run --feature auth # Run tasks for auth feature
311
+ devloop continue --feature auth # Continue auth feature
312
+ devloop status --feature auth # Check auth feature status
313
+ ```
314
+
315
+ ### Managing Features
316
+
317
+ ```bash
318
+ devloop feature list # List all features
319
+ devloop feature status # Summary of all features
320
+ ```
321
+
322
+ ### Quick Example
323
+
324
+ ```bash
325
+ # Create two independent features
326
+ devloop init --feature auth
327
+ devloop init --feature dashboard
328
+
329
+ # Work on them independently
330
+ devloop run --feature auth -n 5
331
+ devloop run --feature dashboard -n 5
332
+
333
+ # Check overall status
334
+ devloop feature status
335
+ ```
336
+
337
+ ## Requirements
338
+
339
+ - Node.js >= 20.0.0
340
+ - [Claude Code CLI](https://claude.ai/code) installed and authenticated
package/dist/cli.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ declare const program: Command;
3
+ export { program };
4
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AA+F9B,OAAO,EAAE,OAAO,EAAE,CAAC"}
package/dist/cli.js ADDED
@@ -0,0 +1,90 @@
1
+ import { Command } from 'commander';
2
+ import { initCommand } from './commands/init.js';
3
+ import { continueCommand } from './commands/continue.js';
4
+ import { runCommand } from './commands/run.js';
5
+ import { statusCommand } from './commands/status.js';
6
+ import { workspaceCommand } from './commands/workspace.js';
7
+ import { featureListCommand, featureStatusCommand } from './commands/feature.js';
8
+ import { configSetCommand, configGetCommand, configUnsetCommand, configListCommand } from './commands/config.js';
9
+ const program = new Command();
10
+ program
11
+ .name('devloop')
12
+ .description('Automate iterative development with Claude Code')
13
+ .version('1.0.0');
14
+ program
15
+ .command('init')
16
+ .description('Create requirements.md with interactive Claude session')
17
+ .option('-w, --workspace <path>', 'Workspace directory')
18
+ .option('--feature <name>', 'Feature mode: create requirements/<name>.md')
19
+ .option('-f, --force', 'Overwrite existing requirements')
20
+ .action(initCommand);
21
+ program
22
+ .command('continue')
23
+ .description('Resume work on requirements or task execution')
24
+ .option('-w, --workspace <path>', 'Workspace directory')
25
+ .option('--feature <name>', 'Feature mode: work on specific feature')
26
+ .option('-n, --max-iterations <number>', 'Maximum iterations for run', '10')
27
+ .option('-t, --token-limit <number>', 'Stop when cumulative tokens exceed this limit')
28
+ .option('-c, --cost-limit <number>', 'Stop when session cost (USD) exceeds this limit')
29
+ .option('-v, --verbose', 'Verbose output')
30
+ .action(continueCommand);
31
+ program
32
+ .command('run')
33
+ .description('Start the task execution loop')
34
+ .option('-w, --workspace <path>', 'Workspace directory')
35
+ .option('--feature <name>', 'Feature mode: run specific feature tasks')
36
+ .option('-n, --max-iterations <number>', 'Maximum iterations', '10')
37
+ .option('-t, --token-limit <number>', 'Stop when cumulative tokens exceed this limit')
38
+ .option('-c, --cost-limit <number>', 'Stop when session cost (USD) exceeds this limit')
39
+ .option('-v, --verbose', 'Verbose output')
40
+ .option('--dry-run', 'Show what would be done without executing')
41
+ .action(runCommand);
42
+ program
43
+ .command('status')
44
+ .description('Show current progress')
45
+ .option('-w, --workspace <path>', 'Workspace directory')
46
+ .option('--feature <name>', 'Feature mode: show feature status')
47
+ .option('--json', 'Output as JSON')
48
+ .action(statusCommand);
49
+ const featureCommand = program
50
+ .command('feature')
51
+ .description('Manage features');
52
+ featureCommand
53
+ .command('list')
54
+ .description('List all features')
55
+ .option('-w, --workspace <path>', 'Workspace directory')
56
+ .action(featureListCommand);
57
+ featureCommand
58
+ .command('status')
59
+ .description('Show summary of all features')
60
+ .option('-w, --workspace <path>', 'Workspace directory')
61
+ .action(featureStatusCommand);
62
+ const configCommand = program
63
+ .command('config')
64
+ .description('Manage workspace configuration (commit message formats, etc.)');
65
+ configCommand
66
+ .command('set <key> <value>')
67
+ .description('Set a config value. Keys: devloopCommitFormat. Variable: {action}')
68
+ .option('-w, --workspace <path>', 'Workspace directory')
69
+ .action(configSetCommand);
70
+ configCommand
71
+ .command('get <key>')
72
+ .description('Get a configuration value')
73
+ .option('-w, --workspace <path>', 'Workspace directory')
74
+ .action(configGetCommand);
75
+ configCommand
76
+ .command('unset <key>')
77
+ .description('Unset a configuration value')
78
+ .option('-w, --workspace <path>', 'Workspace directory')
79
+ .action(configUnsetCommand);
80
+ configCommand
81
+ .command('list')
82
+ .description('List all configuration values and available keys')
83
+ .option('-w, --workspace <path>', 'Workspace directory')
84
+ .action(configListCommand);
85
+ program
86
+ .command('workspace [path]')
87
+ .description('View or set default workspace')
88
+ .action(workspaceCommand);
89
+ export { program };
90
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface ConfigOptions {
2
+ workspace?: string;
3
+ }
4
+ export declare function configSetCommand(key: string, value: string, options: ConfigOptions): Promise<void>;
5
+ export declare function configGetCommand(key: string, options: ConfigOptions): Promise<void>;
6
+ export declare function configUnsetCommand(key: string, options: ConfigOptions): Promise<void>;
7
+ export declare function configListCommand(options: ConfigOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBxG;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBzF;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB3F;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B7E"}
@@ -0,0 +1,80 @@
1
+ import chalk from 'chalk';
2
+ import { resolveWorkspace, readWorkspaceConfig, writeWorkspaceConfig } from '../core/config.js';
3
+ const VALID_CONFIG_KEYS = ['devloopCommitFormat'];
4
+ export async function configSetCommand(key, value, options) {
5
+ if (!VALID_CONFIG_KEYS.includes(key)) {
6
+ console.log(chalk.red(`Error: Unknown config key: ${key}`));
7
+ console.log(chalk.gray('Valid keys:'));
8
+ for (const validKey of VALID_CONFIG_KEYS) {
9
+ console.log(chalk.gray(` - ${validKey}`));
10
+ }
11
+ process.exit(1);
12
+ }
13
+ const workspace = await resolveWorkspace(options.workspace);
14
+ const config = await readWorkspaceConfig(workspace);
15
+ config[key] = value;
16
+ await writeWorkspaceConfig(workspace, config);
17
+ console.log(chalk.green(`✓ Set ${key} = ${value}`));
18
+ }
19
+ export async function configGetCommand(key, options) {
20
+ if (!VALID_CONFIG_KEYS.includes(key)) {
21
+ console.log(chalk.red(`Error: Unknown config key: ${key}`));
22
+ console.log(chalk.gray('Valid keys:'));
23
+ for (const validKey of VALID_CONFIG_KEYS) {
24
+ console.log(chalk.gray(` - ${validKey}`));
25
+ }
26
+ process.exit(1);
27
+ }
28
+ const workspace = await resolveWorkspace(options.workspace);
29
+ const config = await readWorkspaceConfig(workspace);
30
+ const value = config[key];
31
+ if (value !== undefined) {
32
+ console.log(chalk.white(`${key}: ${value}`));
33
+ }
34
+ else {
35
+ console.log(chalk.gray(`${key}: (not set)`));
36
+ }
37
+ }
38
+ export async function configUnsetCommand(key, options) {
39
+ if (!VALID_CONFIG_KEYS.includes(key)) {
40
+ console.log(chalk.red(`Error: Unknown config key: ${key}`));
41
+ console.log(chalk.gray('Valid keys:'));
42
+ for (const validKey of VALID_CONFIG_KEYS) {
43
+ console.log(chalk.gray(` - ${validKey}`));
44
+ }
45
+ process.exit(1);
46
+ }
47
+ const workspace = await resolveWorkspace(options.workspace);
48
+ const config = await readWorkspaceConfig(workspace);
49
+ delete config[key];
50
+ await writeWorkspaceConfig(workspace, config);
51
+ console.log(chalk.green(`✓ Unset ${key}`));
52
+ }
53
+ export async function configListCommand(options) {
54
+ const workspace = await resolveWorkspace(options.workspace);
55
+ const config = await readWorkspaceConfig(workspace);
56
+ console.log(chalk.blue.bold('\n=== Workspace Configuration ===\n'));
57
+ console.log(chalk.gray(`Workspace: ${workspace}`));
58
+ console.log();
59
+ for (const key of VALID_CONFIG_KEYS) {
60
+ const value = config[key];
61
+ if (value !== undefined) {
62
+ console.log(chalk.white(`${key}:`));
63
+ console.log(chalk.cyan(` ${value}`));
64
+ }
65
+ else {
66
+ console.log(chalk.gray(`${key}: (not set)`));
67
+ }
68
+ }
69
+ console.log();
70
+ console.log(chalk.white('Variables for devloopCommitFormat:'));
71
+ console.log(chalk.gray(' {action} - What DevLoop is doing, e.g.:'));
72
+ console.log(chalk.gray(' "Initialize workspace"'));
73
+ console.log(chalk.gray(' "Complete TASK-001 - Fix the bug"'));
74
+ console.log(chalk.gray(' "Attempted TASK-002 - Add feature"'));
75
+ console.log();
76
+ console.log(chalk.white('Example:'));
77
+ console.log(chalk.gray(' devloop config set devloopCommitFormat "chore(devloop): {action}"'));
78
+ console.log();
79
+ }
80
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ interface ContinueOptions {
2
+ workspace?: string;
3
+ feature?: string;
4
+ maxIterations?: string;
5
+ tokenLimit?: string;
6
+ costLimit?: string;
7
+ verbose?: boolean;
8
+ }
9
+ export declare function continueCommand(options: ContinueOptions): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=continue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continue.d.ts","sourceRoot":"","sources":["../../src/commands/continue.ts"],"names":[],"mappings":"AASA,UAAU,eAAe;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAgBD,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA0G7E"}