murmur8 3.5.0 → 4.1.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/.blueprint/agents/TEAM_MANIFESTO.md +1 -1
- package/README.md +93 -49
- package/SKILL.md +17 -1
- package/bin/cli.js +69 -48
- package/package.json +3 -2
- package/src/history.js +1 -11
- package/src/index.js +3 -0
- package/src/init.js +41 -5
- package/src/{parallel.js → murm.js} +150 -114
- package/src/theme.js +119 -0
|
@@ -18,7 +18,7 @@ This is our shared manifesto — for every agent and the human. Read it before y
|
|
|
18
18
|
|
|
19
19
|
## We build things that matter
|
|
20
20
|
|
|
21
|
-
We are not here to generate output. We are here to build a product that makes a real impact on the people or agents who use it. Every line of code, every test, every story should serve that purpose. If it doesn't make things better for the user, we ask why we're doing it. We enjoy building
|
|
21
|
+
We are not here to generate output. We are here to build a product that makes a real impact on the people or agents who use it. Every line of code, every test, every story should serve that purpose. If it doesn't make things better for the user, we ask why we're doing it. We enjoy building great things. We don't just make slop!
|
|
22
22
|
|
|
23
23
|
## We take pride in beautiful code
|
|
24
24
|
|
package/README.md
CHANGED
|
@@ -1,8 +1,28 @@
|
|
|
1
1
|
# murmur8
|
|
2
2
|
|
|
3
|
-
A multi-agent workflow framework for automated feature development
|
|
3
|
+
A multi-agent workflow framework for automated feature development In Claude Code and Copilot CLI. Four specialised AI agents collaborate in sequence to take features from specification to implementation, with built-in feedback loops and self-improvement capabilities.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Like a murmuration of starlings, individual agents move together as one, each responding to its neighbours to create something greater than the sum of its parts.
|
|
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.
|
|
6
26
|
|
|
7
27
|
## Agents
|
|
8
28
|
|
|
@@ -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/
|
|
@@ -343,6 +363,30 @@ $ npx murmur8 insights
|
|
|
343
363
|
- Avg duration: 14 min → 11 min (improving)
|
|
344
364
|
```
|
|
345
365
|
|
|
366
|
+
## Multi-CLI Support (v4.1)
|
|
367
|
+
|
|
368
|
+
The `/implement-feature` skill works with both **Claude Code** and **GitHub Copilot CLI**. During initialization, murmur8 installs the skill to both locations:
|
|
369
|
+
|
|
370
|
+
| CLI | Location |
|
|
371
|
+
|-----|----------|
|
|
372
|
+
| Claude Code | `.claude/commands/implement-feature.md` |
|
|
373
|
+
| Copilot CLI | `.github/skills/implement-feature/SKILL.md` |
|
|
374
|
+
|
|
375
|
+
The Copilot CLI location is a symlink to the Claude Code master, ensuring both tools use identical skill definitions.
|
|
376
|
+
|
|
377
|
+
### Usage
|
|
378
|
+
|
|
379
|
+
```bash
|
|
380
|
+
# Initialize (installs skill for both CLIs)
|
|
381
|
+
npx murmur8 init
|
|
382
|
+
|
|
383
|
+
# Then use either CLI:
|
|
384
|
+
/implement-feature user-auth # Works in Claude Code
|
|
385
|
+
/implement-feature user-auth # Works in Copilot CLI
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
Both CLIs execute the same pipeline: Alex → Cass → Nigel → Codey. The skill uses each CLI's native agent/task mechanism.
|
|
389
|
+
|
|
346
390
|
## Token Efficiency (v2.7)
|
|
347
391
|
|
|
348
392
|
Version 2.7 introduces several optimizations to reduce token usage:
|
|
@@ -359,14 +403,14 @@ Version 2.7 introduces several optimizations to reduce token usage:
|
|
|
359
403
|
|
|
360
404
|
**Total estimated savings: 10,000+ tokens per pipeline run** (more for technical features)
|
|
361
405
|
|
|
362
|
-
##
|
|
406
|
+
## Murmuration
|
|
363
407
|
|
|
364
408
|
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
409
|
|
|
366
410
|
### How It Works
|
|
367
411
|
|
|
368
412
|
```
|
|
369
|
-
murmur8
|
|
413
|
+
murmur8 murm <slug-a> <slug-b> <slug-c>
|
|
370
414
|
│
|
|
371
415
|
▼
|
|
372
416
|
┌───────────────────────────────────────┐
|
|
@@ -384,19 +428,19 @@ murmur8 parallel user-auth dashboard notifications
|
|
|
384
428
|
┌───────────────────────────────────────┐
|
|
385
429
|
│ Create Isolated Worktrees │
|
|
386
430
|
│ │
|
|
387
|
-
│ .claude/worktrees/feat-
|
|
388
|
-
│ └─ branch: feature
|
|
431
|
+
│ .claude/worktrees/feat-<slug-a>/ │
|
|
432
|
+
│ └─ branch: feature/<slug-a> │
|
|
389
433
|
│ │
|
|
390
|
-
│ .claude/worktrees/feat-
|
|
391
|
-
│ └─ branch: feature
|
|
434
|
+
│ .claude/worktrees/feat-<slug-b>/ │
|
|
435
|
+
│ └─ branch: feature/<slug-b> │
|
|
392
436
|
│ │
|
|
393
|
-
│ .claude/worktrees/feat-
|
|
394
|
-
│ └─ branch: feature
|
|
437
|
+
│ .claude/worktrees/feat-<slug-c>/ │
|
|
438
|
+
│ └─ branch: feature/<slug-c> │
|
|
395
439
|
└───────────────────────────────────────┘
|
|
396
440
|
│
|
|
397
441
|
▼
|
|
398
442
|
┌───────────────────────────────────────┐
|
|
399
|
-
│ Spawn
|
|
443
|
+
│ Spawn Pipelines │
|
|
400
444
|
│ (max 3 concurrent by default) │
|
|
401
445
|
│ │
|
|
402
446
|
│ Each runs: Alex → Nigel → Codey │
|
|
@@ -416,22 +460,22 @@ murmur8 parallel user-auth dashboard notifications
|
|
|
416
460
|
|
|
417
461
|
```bash
|
|
418
462
|
# Run 3 features in parallel (default concurrency)
|
|
419
|
-
npx murmur8
|
|
463
|
+
npx murmur8 murm <slug-a> <slug-b> <slug-c>
|
|
420
464
|
|
|
421
465
|
# Preview what would happen without executing
|
|
422
|
-
npx murmur8
|
|
466
|
+
npx murmur8 murm <slug-a> <slug-b> --dry-run
|
|
423
467
|
|
|
424
468
|
# Limit concurrent pipelines
|
|
425
|
-
npx murmur8
|
|
469
|
+
npx murmur8 murm <slug-a> <slug-b> <slug-c> <slug-d> --max-concurrency=2
|
|
426
470
|
|
|
427
471
|
# Check status of running pipelines
|
|
428
|
-
npx murmur8
|
|
472
|
+
npx murmur8 murm status
|
|
429
473
|
|
|
430
474
|
# Skip pre-flight feature validation
|
|
431
|
-
npx murmur8
|
|
475
|
+
npx murmur8 murm <slug-a> <slug-b> --skip-preflight
|
|
432
476
|
|
|
433
477
|
# Clean up completed/aborted worktrees
|
|
434
|
-
npx murmur8
|
|
478
|
+
npx murmur8 murm cleanup
|
|
435
479
|
```
|
|
436
480
|
|
|
437
481
|
### Pre-flight Batch Validation (v2.8)
|
|
@@ -439,7 +483,7 @@ npx murmur8 parallel cleanup
|
|
|
439
483
|
Before parallel execution, the system validates the batch to prevent wasted resources:
|
|
440
484
|
|
|
441
485
|
```
|
|
442
|
-
$ npx murmur8
|
|
486
|
+
$ npx murmur8 murm feat-a feat-b feat-c --dry-run
|
|
443
487
|
|
|
444
488
|
Pre-flight Validation
|
|
445
489
|
=====================
|
|
@@ -484,11 +528,11 @@ Suggested commands:
|
|
|
484
528
|
|
|
485
529
|
### Configuration
|
|
486
530
|
|
|
487
|
-
The
|
|
531
|
+
The murmuration module is **CLI-agnostic** — configure it to work with different AI coding tools:
|
|
488
532
|
|
|
489
533
|
```bash
|
|
490
534
|
# View current configuration
|
|
491
|
-
npx murmur8
|
|
535
|
+
npx murmur8 murm-config
|
|
492
536
|
|
|
493
537
|
# Output:
|
|
494
538
|
# cli: npx claude
|
|
@@ -496,7 +540,7 @@ npx murmur8 parallel-config
|
|
|
496
540
|
# skillFlags: --no-commit
|
|
497
541
|
# worktreeDir: .claude/worktrees
|
|
498
542
|
# maxConcurrency: 3
|
|
499
|
-
# queueFile: .claude/
|
|
543
|
+
# queueFile: .claude/murm-queue.json
|
|
500
544
|
```
|
|
501
545
|
|
|
502
546
|
#### Configuration Options
|
|
@@ -511,31 +555,31 @@ npx murmur8 parallel-config
|
|
|
511
555
|
| `maxFeatures` | `10` | Maximum features per batch |
|
|
512
556
|
| `timeout` | `30` | Timeout per pipeline (minutes) |
|
|
513
557
|
| `minDiskSpaceMB` | `500` | Minimum disk space warning threshold |
|
|
514
|
-
| `queueFile` | `.claude/
|
|
558
|
+
| `queueFile` | `.claude/murm-queue.json` | State persistence file |
|
|
515
559
|
|
|
516
560
|
#### Examples for Different CLIs
|
|
517
561
|
|
|
518
562
|
```bash
|
|
519
563
|
# Claude Code (default)
|
|
520
|
-
npx murmur8
|
|
521
|
-
npx murmur8
|
|
564
|
+
npx murmur8 murm-config set cli "npx claude"
|
|
565
|
+
npx murmur8 murm-config set skill "/implement-feature"
|
|
522
566
|
|
|
523
567
|
# Cursor
|
|
524
|
-
npx murmur8
|
|
525
|
-
npx murmur8
|
|
526
|
-
npx murmur8
|
|
568
|
+
npx murmur8 murm-config set cli "cursor"
|
|
569
|
+
npx murmur8 murm-config set skill "composer"
|
|
570
|
+
npx murmur8 murm-config set skillFlags ""
|
|
527
571
|
|
|
528
572
|
# Aider
|
|
529
|
-
npx murmur8
|
|
530
|
-
npx murmur8
|
|
531
|
-
npx murmur8
|
|
573
|
+
npx murmur8 murm-config set cli "aider"
|
|
574
|
+
npx murmur8 murm-config set skill "--message"
|
|
575
|
+
npx murmur8 murm-config set skillFlags "implement feature:"
|
|
532
576
|
|
|
533
577
|
# Custom agent script
|
|
534
|
-
npx murmur8
|
|
535
|
-
npx murmur8
|
|
578
|
+
npx murmur8 murm-config set cli "./my-agent.sh"
|
|
579
|
+
npx murmur8 murm-config set skill "run"
|
|
536
580
|
|
|
537
581
|
# Reset to defaults
|
|
538
|
-
npx murmur8
|
|
582
|
+
npx murmur8 murm-config reset
|
|
539
583
|
```
|
|
540
584
|
|
|
541
585
|
### State Management
|
|
@@ -543,10 +587,10 @@ npx murmur8 parallel-config reset
|
|
|
543
587
|
Each feature progresses through these states:
|
|
544
588
|
|
|
545
589
|
```
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
590
|
+
murm_queued → worktree_created → murm_running → merge_pending → murm_complete
|
|
591
|
+
│ │
|
|
592
|
+
▼ ▼
|
|
593
|
+
murm_failed merge_conflict
|
|
550
594
|
```
|
|
551
595
|
|
|
552
596
|
- **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.1.1",
|
|
4
4
|
"description": "Multi-agent workflow framework for automated feature development",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -15,12 +15,13 @@
|
|
|
15
15
|
"ai",
|
|
16
16
|
"automation",
|
|
17
17
|
"claude",
|
|
18
|
+
"copilot",
|
|
18
19
|
"feature-development"
|
|
19
20
|
],
|
|
20
21
|
"author": "NewmanJustice",
|
|
21
22
|
"repository": {
|
|
22
23
|
"type": "git",
|
|
23
|
-
"url": "git+https://github.com/NewmanJustice/
|
|
24
|
+
"url": "git+https://github.com/NewmanJustice/murmur8.git"
|
|
24
25
|
},
|
|
25
26
|
"license": "MIT",
|
|
26
27
|
"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,
|