murmur8 4.7.1 → 4.7.3

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 CHANGED
@@ -1,5 +1,7 @@
1
1
  # murmur8
2
2
 
3
+ ![murmur8](.github/assets/github-readme-header.svg)
4
+
3
5
  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
6
 
5
7
  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.
@@ -30,7 +32,7 @@ Every refinement is linked to the run it came from, so the history of a feature
30
32
 
31
33
  ### Turning it up to 11
32
34
 
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 look at whats required and work 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!
35
+ 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
36
 
35
37
  ## Quick Start
36
38
 
@@ -0,0 +1,230 @@
1
+ # /refine-feature Skill
2
+
3
+ Refine an existing feature by conversing with Alex, then propagating changes through stories, tests, and implementation.
4
+
5
+ ## Invocation
6
+
7
+ ```bash
8
+ /refine-feature [slug]
9
+ /refine-feature "user-auth" # Refine a specific feature
10
+ /refine-feature "user-auth" --no-commit # Skip auto-commit
11
+ ```
12
+
13
+ ## When to Use
14
+
15
+ Use `/refine-feature` after `/implement-feature` when:
16
+ - The implementation doesn't match your intent
17
+ - Requirements changed since the original run
18
+ - Tests pass but behaviour is wrong
19
+ - You have new information that changes scope
20
+
21
+ ## Pipeline
22
+
23
+ ```
24
+ /refine-feature "slug"
25
+
26
+
27
+ ┌────────────────────────────────────────┐
28
+ │ 1. Load context │
29
+ │ Read existing spec, stories, tests │
30
+ │ and pipeline history for slug │
31
+ └────────────────────────────────────────┘
32
+
33
+
34
+ ┌────────────────────────────────────────┐
35
+ │ 2. Alex — Conversation + Spec Diff │
36
+ │ User provides feedback (freeform) │
37
+ │ Alex proposes spec diff │
38
+ │ User approves or requests revision │
39
+ │ Alex writes updated FEATURE_SPEC.md │
40
+ └────────────────────────────────────────┘
41
+
42
+
43
+ ┌────────────────────────────────────────┐
44
+ │ 3. Cass — Story Propagation │
45
+ │ (skipped for technical features) │
46
+ │ Updates affected story files │
47
+ │ Writes story-changes.md │
48
+ └────────────────────────────────────────┘
49
+
50
+
51
+ ┌────────────────────────────────────────┐
52
+ │ 4. Nigel — Test Propagation │
53
+ │ Updates affected test cases │
54
+ │ Writes test-changes.md │
55
+ └────────────────────────────────────────┘
56
+
57
+
58
+ ┌────────────────────────────────────────┐
59
+ │ *** MANDATORY PAUSE *** │
60
+ │ User reviews: spec diff, story │
61
+ │ changes, test changes │
62
+ │ Must confirm before Codey runs │
63
+ └────────────────────────────────────────┘
64
+
65
+
66
+ ┌────────────────────────────────────────┐
67
+ │ 5. Codey — Implement │
68
+ │ Test-first, incremental │
69
+ │ Iterates until tests pass │
70
+ │ Auto-commit (unless --no-commit) │
71
+ └────────────────────────────────────────┘
72
+ ```
73
+
74
+ ## Rules
75
+
76
+ - **featureId is always preserved** — never changes across refinements
77
+ - **Mandatory pause before Codey** — no flag can bypass this gate
78
+ - **Cass skipped for technical features** — if no story-*.md files exist
79
+ - **Telemetry lineage** — each refinement records `parentRunId` pointing to the run being refined; `type: "refinement"`
80
+
81
+ ## Telemetry Lineage
82
+
83
+ Every refinement is linked to the run it refines:
84
+
85
+ ```
86
+ run-1 (original /implement-feature)
87
+ └── run-2 (first /refine-feature, parentRunId: run-1)
88
+ └── run-3 (second /refine-feature, parentRunId: run-2)
89
+ ```
90
+
91
+ All runs share the same `featureId`. This lets you track how many refinements a feature has had and trace the full history chain.
92
+
93
+ ## Implementation Prompt
94
+
95
+ You are the `/refine-feature` orchestrator.
96
+
97
+ ### Step 1: Load Context
98
+
99
+ ```javascript
100
+ const { loadRefinementContext, linkParentRun } = require('./src/refine');
101
+ const ctx = await loadRefinementContext(slug, process.cwd());
102
+ // ctx: { slug, featureId, spec, stories, history, lastRunStatus }
103
+ ```
104
+
105
+ Display to user:
106
+ ```
107
+ Feature: {slug}
108
+ Stories: {count} found
109
+ Last run: {status or "no history"}
110
+ Feature ID: {featureId}
111
+
112
+ What needs to change?
113
+ ```
114
+
115
+ ### Step 2: Alex — Conversation + Spec Diff
116
+
117
+ Use the Task tool with `subagent_type="general-purpose"`:
118
+
119
+ ```
120
+ You are Alex, the System Specification Agent, in REFINEMENT mode.
121
+
122
+ ## Context
123
+ - Feature: {slug}
124
+ - Feature ID: {featureId} (MUST be preserved)
125
+ - Current spec: {spec content}
126
+ - Stories: {story list}
127
+ - Last run status: {status}
128
+
129
+ ## User Feedback
130
+ {user's freeform feedback}
131
+
132
+ ## Task
133
+ 1. Analyse what needs to change in the spec based on the feedback
134
+ 2. Present a proposed diff (show OLD vs NEW for changed sections)
135
+ 3. Wait for user approval
136
+ 4. On approval: update FEATURE_SPEC.md preserving featureId in YAML frontmatter
137
+ 5. Write .blueprint/features/feature_{slug}/story-changes.md listing which stories are affected and why
138
+
139
+ ## Rules
140
+ - featureId MUST remain unchanged in the frontmatter
141
+ - Present diff before writing — do not write until approved
142
+ - Keep changes minimal — only what the feedback requires
143
+ - If feedback is unclear, ask a clarifying question
144
+ ```
145
+
146
+ ### Step 3: Cass — Story Propagation (if user-facing)
147
+
148
+ Use the Task tool with `subagent_type="general-purpose"`:
149
+
150
+ ```
151
+ You are Cass, the Story Writer Agent, in REFINEMENT mode.
152
+
153
+ ## Context
154
+ - Feature: {slug}
155
+ - story-changes.md: {path}
156
+
157
+ ## Task
158
+ 1. Read story-changes.md to understand which stories are affected
159
+ 2. Update ONLY the affected story files
160
+ 3. Preserve all unaffected stories as-is
161
+ 4. Write a brief note at the top of each updated story: "Refined: {date} — {reason}"
162
+
163
+ ## Rules
164
+ - Do NOT rewrite stories that are not in story-changes.md
165
+ - Keep acceptance criteria testable and explicit
166
+ ```
167
+
168
+ ### Step 4: Nigel — Test Propagation
169
+
170
+ Use the Task tool with `subagent_type="general-purpose"`:
171
+
172
+ ```
173
+ You are Nigel, the Tester Agent, in REFINEMENT mode.
174
+
175
+ ## Context
176
+ - Feature: {slug}
177
+ - story-changes.md: {path} (or spec diff if no stories)
178
+ - Existing tests: test/feature_{slug}.test.js
179
+
180
+ ## Task
181
+ 1. Identify which tests are affected by the story/spec changes
182
+ 2. Update ONLY the affected test cases
183
+ 3. Write test-changes.md documenting what changed and why
184
+
185
+ ## Rules
186
+ - Do NOT modify tests for unaffected stories
187
+ - New test IDs must not collide with existing ones
188
+ - Write test-changes.md to .blueprint/features/feature_{slug}/
189
+ ```
190
+
191
+ ### Step 5: Mandatory Pause
192
+
193
+ Display to user:
194
+ ```
195
+ --- Changes ready for review ---
196
+
197
+ Spec: .blueprint/features/feature_{slug}/FEATURE_SPEC.md
198
+ Stories updated: {list or "none (technical feature)"}
199
+ Tests updated: {count} test cases
200
+
201
+ Review the changes above.
202
+
203
+ Proceed with Codey implementation? [y/n]
204
+ ```
205
+
206
+ **Wait for explicit "y" or "yes". No flag bypasses this.**
207
+
208
+ ### Step 6: Codey — Implement
209
+
210
+ Use the Task tool with `subagent_type="general-purpose"` (same prompt as main pipeline Codey implement stage).
211
+
212
+ ### Step 7: Record Telemetry
213
+
214
+ ```javascript
215
+ const { linkParentRun, buildRefinementPayload } = require('./src/refine');
216
+ const lineage = linkParentRun(slug, ctx.history);
217
+ // lineage: { parentRunId, type: 'refinement', featureId }
218
+ // Include in telemetry payload alongside standard run fields
219
+ ```
220
+
221
+ ### Step 8: Commit (unless --no-commit)
222
+
223
+ ```bash
224
+ git add .blueprint/features/feature_{slug}/ test/
225
+ git commit -m "refine({slug}): {brief description of change}
226
+
227
+ parentRunId: {lineage.parentRunId}
228
+
229
+ Co-Authored-By: Claude <noreply@anthropic.com>"
230
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "murmur8",
3
- "version": "4.7.1",
3
+ "version": "4.7.3",
4
4
  "description": "Multi-agent workflow framework for automated feature development",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -24,6 +24,7 @@
24
24
  "url": "git+https://github.com/NewmanJustice/murmur8.git"
25
25
  },
26
26
  "license": "MIT",
27
+ "logo": ".github/assets/murmur8-npm-icon.svg",
27
28
  "engines": {
28
29
  "node": ">=18.0.0"
29
30
  },
@@ -32,6 +33,7 @@
32
33
  "src",
33
34
  ".blueprint",
34
35
  ".business_context",
35
- "SKILL.md"
36
+ "SKILL.md",
37
+ "REFINE_SKILL.md"
36
38
  ]
37
39
  }
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 SKILL.md and .claude/commands/implement-feature.md
77
- const answer = await prompt('\nUpdate SKILL.md and .claude/commands/implement-feature.md? (Y/n): ');
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
- // Also update the Claude Code skill command
83
- const skillCommandDest = path.join(TARGET_DIR, '.claude', 'commands', 'implement-feature.md');
84
- if (fs.existsSync(path.dirname(skillCommandDest))) {
85
- fs.copyFileSync(skillSrc, skillCommandDest);
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/