murmur8 3.5.0 → 4.0.1
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 +67 -47
- package/SKILL.md +17 -1
- package/bin/cli.js +69 -48
- package/package.json +2 -2
- package/src/history.js +1 -11
- package/src/index.js +3 -0
- package/src/{parallel.js → murm.js} +150 -114
- package/src/theme.js +119 -0
package/README.md
CHANGED
|
@@ -4,6 +4,26 @@ A multi-agent workflow framework for automated feature development. Like a murmu
|
|
|
4
4
|
|
|
5
5
|
Four specialized AI agents collaborate in sequence to take features from specification to implementation, with built-in feedback loops and self-improvement capabilities.
|
|
6
6
|
|
|
7
|
+
## Upgrading to v4.0
|
|
8
|
+
|
|
9
|
+
v4.0 completes the murmuration theming by renaming all parallel internals. Existing users should be aware of the following breaking changes.
|
|
10
|
+
|
|
11
|
+
### Breaking changes
|
|
12
|
+
|
|
13
|
+
- **Source file renamed**: `src/parallel.js` → `src/murm.js` — update any direct `require()` / `import` references
|
|
14
|
+
- **Exported functions renamed**: `runParallel` → `runMurm`, `abortParallel` → `abortMurm`, `rollbackParallel` → `rollbackMurm`, `readParallelConfig` → `readMurmConfig`, `writeParallelConfig` → `writeMurmConfig`, `getDefaultParallelConfig` → `getDefaultMurmConfig`, `validateParallelBatch` → `validateMurmBatch`
|
|
15
|
+
- **Status strings renamed**: `parallel_queued` → `murm_queued`, `parallel_running` → `murm_running`, `parallel_failed` → `murm_failed`, `parallel_complete` → `murm_complete` — update any code that matches on these values
|
|
16
|
+
- **On-disk paths renamed**: `.claude/parallel-config.json` → `.claude/murm-config.json`, `.claude/parallel-queue.json` → `.claude/murm-queue.json`, `.claude/parallel.lock` → `.claude/murm.lock`
|
|
17
|
+
- **CLI command renamed**: `parallel-config` → `murm-config`
|
|
18
|
+
|
|
19
|
+
### Automatic migration
|
|
20
|
+
|
|
21
|
+
Legacy on-disk files (`.claude/parallel-config.json`, `.claude/parallel-queue.json`, `.claude/parallel.lock`) are **automatically migrated** to the new paths on first access. No manual action is needed for existing configs.
|
|
22
|
+
|
|
23
|
+
### Backward-compatible aliases
|
|
24
|
+
|
|
25
|
+
The CLI commands `parallel`, `murmuration`, and `parallel-config` continue to work as aliases for `murm` and `murm-config` respectively.
|
|
26
|
+
|
|
7
27
|
## Agents
|
|
8
28
|
|
|
9
29
|
| Agent | Role |
|
|
@@ -83,16 +103,16 @@ This updates `.blueprint/agents/`, `.blueprint/templates/`, `.blueprint/ways_of_
|
|
|
83
103
|
| `npx murmur8 insights --bottlenecks` | View bottleneck analysis |
|
|
84
104
|
| `npx murmur8 insights --failures` | View failure pattern analysis |
|
|
85
105
|
|
|
86
|
-
### Parallel Execution
|
|
106
|
+
### Murmuration (Parallel Execution)
|
|
87
107
|
|
|
88
108
|
| Command | Description |
|
|
89
109
|
|---------|-------------|
|
|
90
|
-
| `npx murmur8
|
|
91
|
-
| `npx murmur8
|
|
92
|
-
| `npx murmur8
|
|
93
|
-
| `npx murmur8
|
|
94
|
-
| `npx murmur8
|
|
95
|
-
| `npx murmur8
|
|
110
|
+
| `npx murmur8 murm <slugs...>` | Run multiple features in parallel |
|
|
111
|
+
| `npx murmur8 murm <slugs...> --dry-run` | Preview execution plan |
|
|
112
|
+
| `npx murmur8 murm status` | Show status of running pipelines |
|
|
113
|
+
| `npx murmur8 murm cleanup` | Remove completed worktrees |
|
|
114
|
+
| `npx murmur8 murm-config` | View murmuration configuration |
|
|
115
|
+
| `npx murmur8 murm-config set <key> <value>` | Modify murmuration settings |
|
|
96
116
|
|
|
97
117
|
### Configuration
|
|
98
118
|
|
|
@@ -106,8 +126,8 @@ This updates `.blueprint/agents/`, `.blueprint/templates/`, `.blueprint/ways_of_
|
|
|
106
126
|
| `npx murmur8 retry-config reset` | Reset to defaults |
|
|
107
127
|
| `npx murmur8 feedback-config` | View feedback thresholds |
|
|
108
128
|
| `npx murmur8 feedback-config set <key> <value>` | Modify feedback settings |
|
|
109
|
-
| `npx murmur8
|
|
110
|
-
| `npx murmur8
|
|
129
|
+
| `npx murmur8 murm-config` | View murmuration pipeline configuration |
|
|
130
|
+
| `npx murmur8 murm-config set <key> <value>` | Modify murmuration settings |
|
|
111
131
|
|
|
112
132
|
## Usage
|
|
113
133
|
|
|
@@ -227,7 +247,7 @@ murmur8 includes these built-in modules for observability and self-improvement:
|
|
|
227
247
|
| **handoff** | Structured summaries between agents for token efficiency |
|
|
228
248
|
| **business-context** | Lazy loading of business context based on feature needs |
|
|
229
249
|
| **tools** | Tool schemas and validation for Claude native features |
|
|
230
|
-
| **
|
|
250
|
+
| **murm** | Murmuration pipeline execution using git worktrees |
|
|
231
251
|
| **stack** | Configurable tech stack detection and configuration |
|
|
232
252
|
|
|
233
253
|
### How They Work Together
|
|
@@ -290,8 +310,8 @@ your-project/
|
|
|
290
310
|
│ ├── pipeline-history.json # Execution history (gitignored)
|
|
291
311
|
│ ├── retry-config.json # Retry configuration (gitignored)
|
|
292
312
|
│ ├── feedback-config.json # Feedback thresholds (gitignored)
|
|
293
|
-
│ ├──
|
|
294
|
-
│ ├──
|
|
313
|
+
│ ├── murm-config.json # Murmuration execution config (gitignored)
|
|
314
|
+
│ ├── murm-queue.json # Murmuration pipeline state (gitignored)
|
|
295
315
|
│ ├── stack-config.json # Tech stack configuration (gitignored)
|
|
296
316
|
│ └── implement-queue.json # Pipeline queue state (gitignored)
|
|
297
317
|
└── test/
|
|
@@ -359,14 +379,14 @@ Version 2.7 introduces several optimizations to reduce token usage:
|
|
|
359
379
|
|
|
360
380
|
**Total estimated savings: 10,000+ tokens per pipeline run** (more for technical features)
|
|
361
381
|
|
|
362
|
-
##
|
|
382
|
+
## Murmuration
|
|
363
383
|
|
|
364
384
|
Run multiple feature pipelines simultaneously using git worktrees for isolation. Each feature gets its own worktree and branch, allowing true parallel development without conflicts.
|
|
365
385
|
|
|
366
386
|
### How It Works
|
|
367
387
|
|
|
368
388
|
```
|
|
369
|
-
murmur8
|
|
389
|
+
murmur8 murm <slug-a> <slug-b> <slug-c>
|
|
370
390
|
│
|
|
371
391
|
▼
|
|
372
392
|
┌───────────────────────────────────────┐
|
|
@@ -384,19 +404,19 @@ murmur8 parallel user-auth dashboard notifications
|
|
|
384
404
|
┌───────────────────────────────────────┐
|
|
385
405
|
│ Create Isolated Worktrees │
|
|
386
406
|
│ │
|
|
387
|
-
│ .claude/worktrees/feat-
|
|
388
|
-
│ └─ branch: feature
|
|
407
|
+
│ .claude/worktrees/feat-<slug-a>/ │
|
|
408
|
+
│ └─ branch: feature/<slug-a> │
|
|
389
409
|
│ │
|
|
390
|
-
│ .claude/worktrees/feat-
|
|
391
|
-
│ └─ branch: feature
|
|
410
|
+
│ .claude/worktrees/feat-<slug-b>/ │
|
|
411
|
+
│ └─ branch: feature/<slug-b> │
|
|
392
412
|
│ │
|
|
393
|
-
│ .claude/worktrees/feat-
|
|
394
|
-
│ └─ branch: feature
|
|
413
|
+
│ .claude/worktrees/feat-<slug-c>/ │
|
|
414
|
+
│ └─ branch: feature/<slug-c> │
|
|
395
415
|
└───────────────────────────────────────┘
|
|
396
416
|
│
|
|
397
417
|
▼
|
|
398
418
|
┌───────────────────────────────────────┐
|
|
399
|
-
│ Spawn
|
|
419
|
+
│ Spawn Pipelines │
|
|
400
420
|
│ (max 3 concurrent by default) │
|
|
401
421
|
│ │
|
|
402
422
|
│ Each runs: Alex → Nigel → Codey │
|
|
@@ -416,22 +436,22 @@ murmur8 parallel user-auth dashboard notifications
|
|
|
416
436
|
|
|
417
437
|
```bash
|
|
418
438
|
# Run 3 features in parallel (default concurrency)
|
|
419
|
-
npx murmur8
|
|
439
|
+
npx murmur8 murm <slug-a> <slug-b> <slug-c>
|
|
420
440
|
|
|
421
441
|
# Preview what would happen without executing
|
|
422
|
-
npx murmur8
|
|
442
|
+
npx murmur8 murm <slug-a> <slug-b> --dry-run
|
|
423
443
|
|
|
424
444
|
# Limit concurrent pipelines
|
|
425
|
-
npx murmur8
|
|
445
|
+
npx murmur8 murm <slug-a> <slug-b> <slug-c> <slug-d> --max-concurrency=2
|
|
426
446
|
|
|
427
447
|
# Check status of running pipelines
|
|
428
|
-
npx murmur8
|
|
448
|
+
npx murmur8 murm status
|
|
429
449
|
|
|
430
450
|
# Skip pre-flight feature validation
|
|
431
|
-
npx murmur8
|
|
451
|
+
npx murmur8 murm <slug-a> <slug-b> --skip-preflight
|
|
432
452
|
|
|
433
453
|
# Clean up completed/aborted worktrees
|
|
434
|
-
npx murmur8
|
|
454
|
+
npx murmur8 murm cleanup
|
|
435
455
|
```
|
|
436
456
|
|
|
437
457
|
### Pre-flight Batch Validation (v2.8)
|
|
@@ -439,7 +459,7 @@ npx murmur8 parallel cleanup
|
|
|
439
459
|
Before parallel execution, the system validates the batch to prevent wasted resources:
|
|
440
460
|
|
|
441
461
|
```
|
|
442
|
-
$ npx murmur8
|
|
462
|
+
$ npx murmur8 murm feat-a feat-b feat-c --dry-run
|
|
443
463
|
|
|
444
464
|
Pre-flight Validation
|
|
445
465
|
=====================
|
|
@@ -484,11 +504,11 @@ Suggested commands:
|
|
|
484
504
|
|
|
485
505
|
### Configuration
|
|
486
506
|
|
|
487
|
-
The
|
|
507
|
+
The murmuration module is **CLI-agnostic** — configure it to work with different AI coding tools:
|
|
488
508
|
|
|
489
509
|
```bash
|
|
490
510
|
# View current configuration
|
|
491
|
-
npx murmur8
|
|
511
|
+
npx murmur8 murm-config
|
|
492
512
|
|
|
493
513
|
# Output:
|
|
494
514
|
# cli: npx claude
|
|
@@ -496,7 +516,7 @@ npx murmur8 parallel-config
|
|
|
496
516
|
# skillFlags: --no-commit
|
|
497
517
|
# worktreeDir: .claude/worktrees
|
|
498
518
|
# maxConcurrency: 3
|
|
499
|
-
# queueFile: .claude/
|
|
519
|
+
# queueFile: .claude/murm-queue.json
|
|
500
520
|
```
|
|
501
521
|
|
|
502
522
|
#### Configuration Options
|
|
@@ -511,31 +531,31 @@ npx murmur8 parallel-config
|
|
|
511
531
|
| `maxFeatures` | `10` | Maximum features per batch |
|
|
512
532
|
| `timeout` | `30` | Timeout per pipeline (minutes) |
|
|
513
533
|
| `minDiskSpaceMB` | `500` | Minimum disk space warning threshold |
|
|
514
|
-
| `queueFile` | `.claude/
|
|
534
|
+
| `queueFile` | `.claude/murm-queue.json` | State persistence file |
|
|
515
535
|
|
|
516
536
|
#### Examples for Different CLIs
|
|
517
537
|
|
|
518
538
|
```bash
|
|
519
539
|
# Claude Code (default)
|
|
520
|
-
npx murmur8
|
|
521
|
-
npx murmur8
|
|
540
|
+
npx murmur8 murm-config set cli "npx claude"
|
|
541
|
+
npx murmur8 murm-config set skill "/implement-feature"
|
|
522
542
|
|
|
523
543
|
# Cursor
|
|
524
|
-
npx murmur8
|
|
525
|
-
npx murmur8
|
|
526
|
-
npx murmur8
|
|
544
|
+
npx murmur8 murm-config set cli "cursor"
|
|
545
|
+
npx murmur8 murm-config set skill "composer"
|
|
546
|
+
npx murmur8 murm-config set skillFlags ""
|
|
527
547
|
|
|
528
548
|
# Aider
|
|
529
|
-
npx murmur8
|
|
530
|
-
npx murmur8
|
|
531
|
-
npx murmur8
|
|
549
|
+
npx murmur8 murm-config set cli "aider"
|
|
550
|
+
npx murmur8 murm-config set skill "--message"
|
|
551
|
+
npx murmur8 murm-config set skillFlags "implement feature:"
|
|
532
552
|
|
|
533
553
|
# Custom agent script
|
|
534
|
-
npx murmur8
|
|
535
|
-
npx murmur8
|
|
554
|
+
npx murmur8 murm-config set cli "./my-agent.sh"
|
|
555
|
+
npx murmur8 murm-config set skill "run"
|
|
536
556
|
|
|
537
557
|
# Reset to defaults
|
|
538
|
-
npx murmur8
|
|
558
|
+
npx murmur8 murm-config reset
|
|
539
559
|
```
|
|
540
560
|
|
|
541
561
|
### State Management
|
|
@@ -543,10 +563,10 @@ npx murmur8 parallel-config reset
|
|
|
543
563
|
Each feature progresses through these states:
|
|
544
564
|
|
|
545
565
|
```
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
566
|
+
murm_queued → worktree_created → murm_running → merge_pending → murm_complete
|
|
567
|
+
│ │
|
|
568
|
+
▼ ▼
|
|
569
|
+
murm_failed merge_conflict
|
|
550
570
|
```
|
|
551
571
|
|
|
552
572
|
- **Successful features**: Merged to main, worktree cleaned up
|
package/SKILL.md
CHANGED
|
@@ -189,6 +189,8 @@ historyEntry = {
|
|
|
189
189
|
|
|
190
190
|
## Step 6: Spawn Alex Agent
|
|
191
191
|
|
|
192
|
+
**Announce:** `} Alex — creating feature spec`
|
|
193
|
+
|
|
192
194
|
**History:** Record `stages.alex.startedAt` before spawning.
|
|
193
195
|
|
|
194
196
|
**Runtime prompt:** `.blueprint/prompts/alex-runtime.md`
|
|
@@ -281,6 +283,8 @@ Then continue with your task.
|
|
|
281
283
|
|
|
282
284
|
## Step 7: Spawn Cass Agent
|
|
283
285
|
|
|
286
|
+
**Announce:** ` } Cass — writing user stories`
|
|
287
|
+
|
|
284
288
|
**History:** Record `stages.cass.startedAt` before spawning.
|
|
285
289
|
|
|
286
290
|
**Runtime prompt:** `.blueprint/prompts/cass-runtime.md`
|
|
@@ -379,6 +383,8 @@ Then continue with your task.
|
|
|
379
383
|
|
|
380
384
|
## Step 8: Spawn Nigel Agent
|
|
381
385
|
|
|
386
|
+
**Announce:** ` } Nigel — building tests`
|
|
387
|
+
|
|
382
388
|
**History:** Record `stages.nigel.startedAt` before spawning.
|
|
383
389
|
|
|
384
390
|
**Runtime prompt:** `.blueprint/prompts/nigel-runtime.md`
|
|
@@ -480,6 +486,8 @@ Then continue with your task.
|
|
|
480
486
|
|
|
481
487
|
## Step 9: Spawn Codey Agent (Plan)
|
|
482
488
|
|
|
489
|
+
**Announce:** ` } Codey — drafting implementation plan`
|
|
490
|
+
|
|
483
491
|
**History:** Record `stages.codeyPlan.startedAt` before spawning.
|
|
484
492
|
|
|
485
493
|
**Runtime prompt:** `.blueprint/prompts/codey-plan-runtime.md`
|
|
@@ -536,6 +544,8 @@ For detailed guidance, see: .blueprint/agents/AGENT_DEVELOPER_CODEY.md
|
|
|
536
544
|
|
|
537
545
|
## Step 10: Spawn Codey Agent (Implement)
|
|
538
546
|
|
|
547
|
+
**Announce:** ` } Codey — implementing feature`
|
|
548
|
+
|
|
539
549
|
**History:** Record `stages.codeyImplement.startedAt` before spawning.
|
|
540
550
|
|
|
541
551
|
**Runtime prompt:** `.blueprint/prompts/codey-implement-runtime.md`
|
|
@@ -631,7 +641,13 @@ historyEntry.commitHash = "{hash}";
|
|
|
631
641
|
|
|
632
642
|
**Display summary:**
|
|
633
643
|
```
|
|
634
|
-
|
|
644
|
+
} Alex — creating feature spec ✓
|
|
645
|
+
} Cass — writing user stories ✓
|
|
646
|
+
} Nigel — building tests ✓
|
|
647
|
+
} Codey — drafting plan ✓
|
|
648
|
+
} Codey — implementing feature ✓
|
|
649
|
+
|
|
650
|
+
## Landed
|
|
635
651
|
- feature_{slug}
|
|
636
652
|
- Stories: N
|
|
637
653
|
- Tests: N (all passing)
|
package/bin/cli.js
CHANGED
|
@@ -22,18 +22,18 @@ const {
|
|
|
22
22
|
formatStatus,
|
|
23
23
|
getDefaultConfig,
|
|
24
24
|
splitByLimit,
|
|
25
|
-
|
|
25
|
+
runMurm,
|
|
26
26
|
loadQueue,
|
|
27
27
|
cleanupWorktrees,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
readMurmConfig,
|
|
29
|
+
writeMurmConfig,
|
|
30
|
+
getDefaultMurmConfig,
|
|
31
|
+
abortMurm,
|
|
32
32
|
getLockInfo,
|
|
33
33
|
getDetailedStatus,
|
|
34
34
|
formatDetailedStatus,
|
|
35
|
-
|
|
36
|
-
} = require('../src/
|
|
35
|
+
rollbackMurm
|
|
36
|
+
} = require('../src/murm');
|
|
37
37
|
|
|
38
38
|
const args = process.argv.slice(2);
|
|
39
39
|
const command = args[0];
|
|
@@ -170,30 +170,30 @@ const commands = {
|
|
|
170
170
|
},
|
|
171
171
|
description: 'View or modify project tech stack configuration'
|
|
172
172
|
},
|
|
173
|
-
'
|
|
173
|
+
'murm-config': {
|
|
174
174
|
fn: () => {
|
|
175
175
|
if (subArg === 'set') {
|
|
176
176
|
const key = args[2];
|
|
177
177
|
const value = args[3];
|
|
178
178
|
if (!key || !value) {
|
|
179
|
-
console.error('Usage:
|
|
179
|
+
console.error('Usage: murm-config set <key> <value>');
|
|
180
180
|
console.error('Valid keys: cli, skill, skillFlags, worktreeDir, maxConcurrency, queueFile');
|
|
181
181
|
process.exit(1);
|
|
182
182
|
}
|
|
183
|
-
const config =
|
|
183
|
+
const config = readMurmConfig();
|
|
184
184
|
if (key === 'maxConcurrency') {
|
|
185
185
|
config[key] = parseInt(value, 10);
|
|
186
186
|
} else {
|
|
187
187
|
config[key] = value;
|
|
188
188
|
}
|
|
189
|
-
|
|
189
|
+
writeMurmConfig(config);
|
|
190
190
|
console.log(`Set ${key} = ${value}`);
|
|
191
191
|
} else if (subArg === 'reset') {
|
|
192
|
-
|
|
193
|
-
console.log('
|
|
192
|
+
writeMurmConfig(getDefaultMurmConfig());
|
|
193
|
+
console.log('Murmuration configuration reset to defaults.');
|
|
194
194
|
} else {
|
|
195
|
-
const config =
|
|
196
|
-
console.log('
|
|
195
|
+
const config = readMurmConfig();
|
|
196
|
+
console.log('Murmuration Configuration\n');
|
|
197
197
|
console.log(` cli: ${config.cli}`);
|
|
198
198
|
console.log(` skill: ${config.skill}`);
|
|
199
199
|
console.log(` skillFlags: ${config.skillFlags}`);
|
|
@@ -203,10 +203,15 @@ const commands = {
|
|
|
203
203
|
console.log(` timeout: ${config.timeout} min`);
|
|
204
204
|
console.log(` minDiskSpaceMB: ${config.minDiskSpaceMB}`);
|
|
205
205
|
console.log(` queueFile: ${config.queueFile}`);
|
|
206
|
-
console.log('\nTo change: murmur8
|
|
206
|
+
console.log('\nTo change: murmur8 murm-config set <key> <value>');
|
|
207
|
+
console.log('Run pipelines: murmur8 murm <slug1> <slug2> ...');
|
|
207
208
|
}
|
|
208
209
|
},
|
|
209
|
-
description: 'View or modify
|
|
210
|
+
description: 'View or modify murmuration pipeline configuration'
|
|
211
|
+
},
|
|
212
|
+
'parallel-config': {
|
|
213
|
+
fn: null, // alias — set below
|
|
214
|
+
description: 'View or modify murmuration pipeline configuration (alias for murm-config)'
|
|
210
215
|
},
|
|
211
216
|
parallel: {
|
|
212
217
|
fn: async () => {
|
|
@@ -222,29 +227,29 @@ const commands = {
|
|
|
222
227
|
|
|
223
228
|
if (!queue.features || queue.features.length === 0) {
|
|
224
229
|
if (lock) {
|
|
225
|
-
console.log(`
|
|
230
|
+
console.log(`Murmuration execution in progress (PID: ${lock.pid})`);
|
|
226
231
|
console.log(`Started: ${lock.startedAt}`);
|
|
227
232
|
console.log(`Features: ${lock.features.join(', ')}`);
|
|
228
233
|
} else {
|
|
229
|
-
console.log('No
|
|
234
|
+
console.log('No murmuration pipelines active.');
|
|
230
235
|
}
|
|
231
236
|
return;
|
|
232
237
|
}
|
|
233
238
|
|
|
234
|
-
console.log('
|
|
239
|
+
console.log('Murmuration Pipeline Status\n');
|
|
235
240
|
console.log(formatStatus(queue.features));
|
|
236
241
|
const summary = {
|
|
237
|
-
running: queue.features.filter(f => f.status === '
|
|
238
|
-
pending: queue.features.filter(f => f.status === '
|
|
239
|
-
completed: queue.features.filter(f => f.status === '
|
|
240
|
-
failed: queue.features.filter(f => f.status === '
|
|
242
|
+
running: queue.features.filter(f => f.status === 'murm_running').length,
|
|
243
|
+
pending: queue.features.filter(f => f.status === 'murm_queued').length,
|
|
244
|
+
completed: queue.features.filter(f => f.status === 'murm_complete').length,
|
|
245
|
+
failed: queue.features.filter(f => f.status === 'murm_failed').length,
|
|
241
246
|
conflicts: queue.features.filter(f => f.status === 'merge_conflict').length
|
|
242
247
|
};
|
|
243
248
|
console.log(`\nRunning: ${summary.running} | Pending: ${summary.pending} | Completed: ${summary.completed} | Failed: ${summary.failed} | Conflicts: ${summary.conflicts}`);
|
|
244
249
|
|
|
245
250
|
// Show log paths for running/failed
|
|
246
251
|
const withLogs = queue.features.filter(f =>
|
|
247
|
-
f.logPath && (f.status === '
|
|
252
|
+
f.logPath && (f.status === 'murm_running' || f.status === 'murm_failed')
|
|
248
253
|
);
|
|
249
254
|
if (withLogs.length > 0) {
|
|
250
255
|
console.log('\nLog files:');
|
|
@@ -256,17 +261,17 @@ const commands = {
|
|
|
256
261
|
} else if (subArg === 'rollback') {
|
|
257
262
|
const dryRunFlag = args.includes('--dry-run');
|
|
258
263
|
const forceFlag = args.includes('--force');
|
|
259
|
-
await
|
|
264
|
+
await rollbackMurm({ dryRun: dryRunFlag, force: forceFlag });
|
|
260
265
|
} else if (subArg === 'cleanup') {
|
|
261
266
|
const cleaned = await cleanupWorktrees();
|
|
262
267
|
console.log(`Cleaned ${cleaned} worktree(s).`);
|
|
263
268
|
} else if (subArg === 'abort') {
|
|
264
269
|
const cleanupFlag = args.includes('--cleanup');
|
|
265
|
-
await
|
|
270
|
+
await abortMurm({ cleanup: cleanupFlag });
|
|
266
271
|
} else {
|
|
267
272
|
const slugs = args.slice(1).filter(a => !a.startsWith('--') && !a.startsWith('-'));
|
|
268
273
|
if (slugs.length === 0) {
|
|
269
|
-
console.error('Usage: murmur8
|
|
274
|
+
console.error('Usage: murmur8 murm <slug1> <slug2> ... [options]');
|
|
270
275
|
console.error('\nOptions:');
|
|
271
276
|
console.error(' --dry-run Preview execution plan without running');
|
|
272
277
|
console.error(' --yes, -y Skip confirmation prompt');
|
|
@@ -275,9 +280,9 @@ const commands = {
|
|
|
275
280
|
console.error(' --skip-preflight Skip feature validation checks');
|
|
276
281
|
console.error(' --max-concurrency=N Set max parallel pipelines (default: 3)');
|
|
277
282
|
console.error('\nSubcommands:');
|
|
278
|
-
console.error('
|
|
279
|
-
console.error('
|
|
280
|
-
console.error('
|
|
283
|
+
console.error(' murm status Show status of all pipelines');
|
|
284
|
+
console.error(' murm abort Stop all running pipelines');
|
|
285
|
+
console.error(' murm cleanup Remove completed/aborted worktrees');
|
|
281
286
|
process.exit(1);
|
|
282
287
|
}
|
|
283
288
|
|
|
@@ -292,18 +297,31 @@ const commands = {
|
|
|
292
297
|
if (maxFlag) {
|
|
293
298
|
options.maxConcurrency = parseInt(maxFlag.split('=')[1], 10);
|
|
294
299
|
}
|
|
295
|
-
const result = await
|
|
300
|
+
const result = await runMurm(slugs, options);
|
|
296
301
|
process.exit(result.success ? 0 : 1);
|
|
297
302
|
}
|
|
298
303
|
},
|
|
299
304
|
description: 'Run multiple feature pipelines in parallel using git worktrees'
|
|
300
305
|
},
|
|
306
|
+
murm: {
|
|
307
|
+
fn: null, // alias — set below
|
|
308
|
+
description: 'Run multiple feature pipelines in parallel (murmuration)'
|
|
309
|
+
},
|
|
310
|
+
murmuration: {
|
|
311
|
+
fn: null, // alias — set below
|
|
312
|
+
description: 'Run multiple feature pipelines in parallel (murmuration)'
|
|
313
|
+
},
|
|
301
314
|
help: {
|
|
302
315
|
fn: showHelp,
|
|
303
316
|
description: 'Show this help message'
|
|
304
317
|
}
|
|
305
318
|
};
|
|
306
319
|
|
|
320
|
+
// Wire aliases
|
|
321
|
+
commands.murm.fn = commands.parallel.fn;
|
|
322
|
+
commands.murmuration.fn = commands.parallel.fn;
|
|
323
|
+
commands['parallel-config'].fn = commands['murm-config'].fn;
|
|
324
|
+
|
|
307
325
|
function showHelp() {
|
|
308
326
|
console.log(`
|
|
309
327
|
murmur8 - Multi-agent workflow framework
|
|
@@ -335,23 +353,26 @@ Commands:
|
|
|
335
353
|
stack-config View current tech stack configuration
|
|
336
354
|
stack-config set <key> <value> Modify a config value (language, runtime, frameworks, etc.)
|
|
337
355
|
stack-config reset Reset tech stack configuration to defaults
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
356
|
+
murm <slugs...> Run multiple feature pipelines in parallel (murmuration)
|
|
357
|
+
murm <slugs...> --dry-run Show execution plan without running
|
|
358
|
+
murm <slugs...> --yes Skip confirmation prompt
|
|
359
|
+
murm <slugs...> --verbose Stream output to console
|
|
360
|
+
murm <slugs...> --skip-preflight Skip feature validation checks
|
|
361
|
+
murm status Show status of all parallel pipelines
|
|
362
|
+
murm status --detailed Show progress bars and stage info
|
|
363
|
+
murm abort Stop all running pipelines
|
|
364
|
+
murm abort --cleanup Stop all and remove worktrees
|
|
365
|
+
murm rollback Undo completed merges and cleanup failures
|
|
366
|
+
murm rollback --dry-run Preview what would be rolled back
|
|
367
|
+
murm cleanup Remove completed/aborted worktrees
|
|
368
|
+
murm-config View murmuration pipeline configuration
|
|
369
|
+
murm-config set <key> <value> Modify config (cli, skill, skillFlags, etc.)
|
|
370
|
+
murm-config reset Reset murmuration configuration to defaults
|
|
353
371
|
help Show this help message
|
|
354
372
|
|
|
373
|
+
Aliases: parallel, murmuration (same as murm)
|
|
374
|
+
parallel-config (same as murm-config)
|
|
375
|
+
|
|
355
376
|
Examples:
|
|
356
377
|
npx murmur8 init
|
|
357
378
|
npx murmur8 update
|
|
@@ -360,7 +381,7 @@ Examples:
|
|
|
360
381
|
npx murmur8 history
|
|
361
382
|
npx murmur8 history --stats
|
|
362
383
|
npx murmur8 insights --feedback
|
|
363
|
-
npx murmur8
|
|
384
|
+
npx murmur8 murm user-auth dashboard --dry-run
|
|
364
385
|
`);
|
|
365
386
|
}
|
|
366
387
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "murmur8",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"description": "Multi-agent workflow framework for automated feature development",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"author": "NewmanJustice",
|
|
21
21
|
"repository": {
|
|
22
22
|
"type": "git",
|
|
23
|
-
"url": "git+https://github.com/NewmanJustice/
|
|
23
|
+
"url": "git+https://github.com/NewmanJustice/murmur8.git"
|
|
24
24
|
},
|
|
25
25
|
"license": "MIT",
|
|
26
26
|
"engines": {
|
package/src/history.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const fs = require('fs');
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const readline = require('readline');
|
|
4
|
+
const { colorize } = require('./theme');
|
|
4
5
|
|
|
5
6
|
const HISTORY_FILE = '.claude/pipeline-history.json';
|
|
6
7
|
|
|
@@ -104,17 +105,6 @@ function formatDate(isoString) {
|
|
|
104
105
|
return date.toISOString().replace('T', ' ').slice(0, 19);
|
|
105
106
|
}
|
|
106
107
|
|
|
107
|
-
function colorize(text, color, useColor) {
|
|
108
|
-
if (!useColor) return text;
|
|
109
|
-
const colors = {
|
|
110
|
-
green: '\x1b[32m',
|
|
111
|
-
red: '\x1b[31m',
|
|
112
|
-
yellow: '\x1b[33m',
|
|
113
|
-
reset: '\x1b[0m'
|
|
114
|
-
};
|
|
115
|
-
return `${colors[color] || ''}${text}${colors.reset}`;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
108
|
function displayHistory(options = {}) {
|
|
119
109
|
const showAll = options.all || false;
|
|
120
110
|
const useColor = options.color !== false && process.stdout.isTTY;
|
package/src/index.js
CHANGED
|
@@ -82,6 +82,7 @@ const {
|
|
|
82
82
|
displayStackConfig
|
|
83
83
|
} = require('./stack');
|
|
84
84
|
const tools = require('./tools');
|
|
85
|
+
const theme = require('./theme');
|
|
85
86
|
|
|
86
87
|
module.exports = {
|
|
87
88
|
init,
|
|
@@ -146,6 +147,8 @@ module.exports = {
|
|
|
146
147
|
displayStackConfig,
|
|
147
148
|
// Tools module (model native features)
|
|
148
149
|
tools,
|
|
150
|
+
// Theme module (murmuration visual theming)
|
|
151
|
+
theme,
|
|
149
152
|
// Interactive mode exports
|
|
150
153
|
parseInteractiveFlags,
|
|
151
154
|
shouldEnterInteractiveMode,
|