murmur8 4.7.0 → 4.7.2
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 +9 -5
- package/package.json +1 -1
- package/src/init.js +8 -0
- package/src/update.js +19 -6
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# murmur8
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
AI coding tools can be a black box. You describe what you want, magic happens, and code appears. If it's wrong, you describe it again and hope for better. There's no process, no trail, no shared understanding of why decisions were made.
|
|
4
4
|
|
|
5
|
-
murmur8 is different.
|
|
5
|
+
murmur8 is different. Agents Alex, Cass, Nigel, and Codey run a structured, documented pipeline — the kind a good engineering team would run naturally. Each agent produces real, readable artefacts: a feature spec, user stories, a test plan, an implementation. You can read every one of them, understand the reasoning, and step in at any point. It's not magic. It's a repeatable process that happens to move very fast.
|
|
6
6
|
|
|
7
|
-
Like a murmuration of starlings, the agents move together — each one responding to what came before
|
|
7
|
+
Like a murmuration of starlings, the agents move together — each one responding to what came before and building upon it.
|
|
8
8
|
|
|
9
9
|
## The Workflow
|
|
10
10
|
|
|
@@ -12,7 +12,7 @@ Like a murmuration of starlings, the agents move together — each one respondin
|
|
|
12
12
|
|
|
13
13
|
Every feature starts with intent. If you're setting up a new project, murmur8 will walk you through creating a system specification interactively — Alex asks questions, you answer, and together you produce a document that grounds everything that follows. If a feature spec doesn't exist yet, the same thing happens at the feature level.
|
|
14
14
|
|
|
15
|
-
You can also trigger this explicitly with `--interactive
|
|
15
|
+
You can also trigger this explicitly with `--interactive` flag. This is useful when an idea is still fuzzy, you can have a conversation with Alex until the shape of the feature becomes clear. The spec that comes out the other side is yours to review and approve before anything else runs.
|
|
16
16
|
|
|
17
17
|
### The pipeline runs
|
|
18
18
|
|
|
@@ -24,10 +24,14 @@ At every handoff, the agent writes a summary of what it did, what it decided, an
|
|
|
24
24
|
|
|
25
25
|
The first run won't always land exactly right. Requirements shift, something was misunderstood, or the implementation reveals a gap in the spec. That's normal.
|
|
26
26
|
|
|
27
|
-
`/refine-feature` reopens the conversation. Alex reads what was built,
|
|
27
|
+
`/refine-feature` reopens the conversation. You can discuss with Alex whats not right, provide error logs, or user feedback. Alex reads what was built, and describes what needs to change, and proposes an updated spec diff for your approval. From there Cass updates only the affected stories, Nigel updates only the affected tests, and Codey reimplements. The pipeline pauses before Codey runs — you always see the full picture of what's changing before any code is touched.
|
|
28
28
|
|
|
29
29
|
Every refinement is linked to the run it came from, so the history of a feature — original intent, what changed, and why — is always traceable.
|
|
30
30
|
|
|
31
|
+
### Turning it up to 11
|
|
32
|
+
|
|
33
|
+
If you using the skill with Claude Code or Github Copilot, or via an npx command, you can run multiple of these pipelines at the same time, working independantly on features in parallel. The pipeline looks at whats required and works out how multiple fetaures can be delivered at the same time withough Nigel 1, 2, and 3 treading on each others toes in the code base. The pipeline runs EXACTLY the same way... just mutiple of them at the same time!
|
|
34
|
+
|
|
31
35
|
## Quick Start
|
|
32
36
|
|
|
33
37
|
**Inside Claude Code or Copilot CLI:**
|
package/package.json
CHANGED
package/src/init.js
CHANGED
|
@@ -94,8 +94,10 @@ async function init() {
|
|
|
94
94
|
const businessContextSrc = path.join(PACKAGE_ROOT, '.business_context');
|
|
95
95
|
const businessContextDest = path.join(TARGET_DIR, '.business_context');
|
|
96
96
|
const skillSrc = path.join(PACKAGE_ROOT, 'SKILL.md');
|
|
97
|
+
const refineSkillSrc = path.join(PACKAGE_ROOT, 'REFINE_SKILL.md');
|
|
97
98
|
const claudeCommandsDir = path.join(TARGET_DIR, '.claude', 'commands');
|
|
98
99
|
const skillCommandDest = path.join(claudeCommandsDir, 'implement-feature.md');
|
|
100
|
+
const refineSkillCommandDest = path.join(claudeCommandsDir, 'refine-feature.md');
|
|
99
101
|
|
|
100
102
|
// Check if .blueprint already exists
|
|
101
103
|
if (fs.existsSync(blueprintDest)) {
|
|
@@ -130,6 +132,12 @@ async function init() {
|
|
|
130
132
|
createCopilotSymlink();
|
|
131
133
|
}
|
|
132
134
|
|
|
135
|
+
// Copy refine-feature skill to .claude/commands/
|
|
136
|
+
if (fs.existsSync(refineSkillSrc)) {
|
|
137
|
+
fs.copyFileSync(refineSkillSrc, refineSkillCommandDest);
|
|
138
|
+
console.log('Copied skill to .claude/commands/refine-feature.md');
|
|
139
|
+
}
|
|
140
|
+
|
|
133
141
|
// Copy framework directories only (not user content directories)
|
|
134
142
|
console.log('Copying .blueprint directory...');
|
|
135
143
|
fs.mkdirSync(blueprintDest, { recursive: true });
|
package/src/update.js
CHANGED
|
@@ -42,6 +42,8 @@ async function update() {
|
|
|
42
42
|
const blueprintSrc = path.join(PACKAGE_ROOT, '.blueprint');
|
|
43
43
|
const skillSrc = path.join(PACKAGE_ROOT, 'SKILL.md');
|
|
44
44
|
const skillDest = path.join(TARGET_DIR, 'SKILL.md');
|
|
45
|
+
const refineSkillSrc = path.join(PACKAGE_ROOT, 'REFINE_SKILL.md');
|
|
46
|
+
const refineSkillDest = path.join(TARGET_DIR, 'REFINE_SKILL.md');
|
|
45
47
|
|
|
46
48
|
// Check if running in the package source directory (dev mode)
|
|
47
49
|
if (PACKAGE_ROOT === TARGET_DIR) {
|
|
@@ -73,17 +75,26 @@ async function update() {
|
|
|
73
75
|
}
|
|
74
76
|
}
|
|
75
77
|
|
|
76
|
-
// Update
|
|
77
|
-
const answer = await prompt('\nUpdate
|
|
78
|
+
// Update skill files and .claude/commands/
|
|
79
|
+
const answer = await prompt('\nUpdate skill files and .claude/commands/? (Y/n): ');
|
|
78
80
|
if (answer !== 'n' && answer !== 'no') {
|
|
79
81
|
fs.copyFileSync(skillSrc, skillDest);
|
|
80
82
|
console.log('Updated SKILL.md');
|
|
81
83
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
if (fs.existsSync(refineSkillSrc)) {
|
|
85
|
+
fs.copyFileSync(refineSkillSrc, refineSkillDest);
|
|
86
|
+
console.log('Updated REFINE_SKILL.md');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const claudeCommandsDir = path.join(TARGET_DIR, '.claude', 'commands');
|
|
90
|
+
if (fs.existsSync(claudeCommandsDir)) {
|
|
91
|
+
fs.copyFileSync(skillSrc, path.join(claudeCommandsDir, 'implement-feature.md'));
|
|
86
92
|
console.log('Updated .claude/commands/implement-feature.md');
|
|
93
|
+
|
|
94
|
+
if (fs.existsSync(refineSkillSrc)) {
|
|
95
|
+
fs.copyFileSync(refineSkillSrc, path.join(claudeCommandsDir, 'refine-feature.md'));
|
|
96
|
+
console.log('Updated .claude/commands/refine-feature.md');
|
|
97
|
+
}
|
|
87
98
|
}
|
|
88
99
|
}
|
|
89
100
|
|
|
@@ -96,7 +107,9 @@ Updated:
|
|
|
96
107
|
- .blueprint/templates/
|
|
97
108
|
- .blueprint/ways_of_working/
|
|
98
109
|
- SKILL.md
|
|
110
|
+
- REFINE_SKILL.md
|
|
99
111
|
- .claude/commands/implement-feature.md (if exists)
|
|
112
|
+
- .claude/commands/refine-feature.md (if exists)
|
|
100
113
|
|
|
101
114
|
Preserved:
|
|
102
115
|
- .blueprint/features/
|