murmur8 4.1.1 → 4.3.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 (50) hide show
  1. package/.blueprint/agents/AGENT_SPECIFICATION_ALEX.md +33 -3
  2. package/.blueprint/features/feature_config-factory/FEATURE_SPEC.md +138 -0
  3. package/.blueprint/features/feature_config-factory/IMPLEMENTATION_PLAN.md +187 -0
  4. package/.blueprint/features/feature_config-factory/handoff-nigel.md +57 -0
  5. package/.blueprint/features/feature_export-history/FEATURE_SPEC.md +215 -0
  6. package/.blueprint/features/feature_export-history/IMPLEMENTATION_PLAN.md +48 -0
  7. package/.blueprint/features/feature_export-history/story-basic-export.md +48 -0
  8. package/.blueprint/features/feature_export-history/story-date-filter.md +42 -0
  9. package/.blueprint/features/feature_export-history/story-feature-filter.md +42 -0
  10. package/.blueprint/features/feature_export-history/story-file-output.md +48 -0
  11. package/.blueprint/features/feature_export-history/story-status-filter.md +42 -0
  12. package/.blueprint/features/feature_extract-prompt-util/FEATURE_SPEC.md +42 -0
  13. package/.blueprint/features/feature_fix-status-icons/FEATURE_SPEC.md +37 -0
  14. package/.blueprint/features/feature_murm-subagent/FEATURE_SPEC.md +137 -0
  15. package/.blueprint/features/feature_murm-subagent/SKILL_CHANGES.md +345 -0
  16. package/.blueprint/features/feature_split-cli-commands/FEATURE_SPEC.md +125 -0
  17. package/.blueprint/features/feature_split-cli-commands/IMPLEMENTATION_PLAN.md +119 -0
  18. package/.blueprint/features/feature_split-cli-commands/handoff-nigel.md +45 -0
  19. package/.blueprint/features/feature_theme-adoption/FEATURE_SPEC.md +143 -0
  20. package/.blueprint/features/feature_theme-adoption/IMPLEMENTATION_PLAN.md +68 -0
  21. package/.blueprint/features/feature_theme-adoption/handoff-nigel.md +35 -0
  22. package/.blueprint/templates/BACKLOG_TEMPLATE.md +46 -0
  23. package/README.md +26 -10
  24. package/SKILL.md +377 -3
  25. package/bin/cli.js +20 -384
  26. package/package.json +1 -1
  27. package/src/commands/feedback-config.js +32 -0
  28. package/src/commands/help.js +81 -0
  29. package/src/commands/history.js +42 -0
  30. package/src/commands/init.js +12 -0
  31. package/src/commands/insights.js +23 -0
  32. package/src/commands/murm-config.js +52 -0
  33. package/src/commands/murm.js +109 -0
  34. package/src/commands/queue.js +19 -0
  35. package/src/commands/retry-config.js +28 -0
  36. package/src/commands/stack-config.js +32 -0
  37. package/src/commands/update.js +12 -0
  38. package/src/commands/utils.js +24 -0
  39. package/src/commands/validate.js +15 -0
  40. package/src/config-factory.js +190 -0
  41. package/src/feedback.js +5 -2
  42. package/src/history.js +92 -1
  43. package/src/init.js +1 -15
  44. package/src/insights.js +19 -16
  45. package/src/retry.js +5 -2
  46. package/src/stack.js +4 -1
  47. package/src/theme.js +4 -4
  48. package/src/update.js +2 -15
  49. package/src/utils.js +26 -0
  50. package/src/validate.js +5 -12
package/bin/cli.js CHANGED
@@ -1,405 +1,41 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const { init } = require('../src/init');
4
- const { update } = require('../src/update');
5
- const { displayQueue, resetQueue } = require('../src/orchestrator');
6
- const { validate, formatOutput } = require('../src/validate');
7
- const { displayHistory, showStats, clearHistory } = require('../src/history');
8
- const { displayInsights } = require('../src/insights');
9
- const { displayConfig, setConfigValue, resetConfig } = require('../src/retry');
10
- const {
11
- displayConfig: displayFeedbackConfig,
12
- setConfigValue: setFeedbackConfigValue,
13
- resetConfig: resetFeedbackConfig
14
- } = require('../src/feedback');
15
- const {
16
- displayStackConfig,
17
- setStackConfigValue,
18
- resetStackConfig
19
- } = require('../src/stack');
20
- const { displayFeedbackInsights } = require('../src/insights');
21
- const {
22
- formatStatus,
23
- getDefaultConfig,
24
- splitByLimit,
25
- runMurm,
26
- loadQueue,
27
- cleanupWorktrees,
28
- readMurmConfig,
29
- writeMurmConfig,
30
- getDefaultMurmConfig,
31
- abortMurm,
32
- getLockInfo,
33
- getDetailedStatus,
34
- formatDetailedStatus,
35
- rollbackMurm
36
- } = require('../src/murm');
3
+ const path = require('path');
4
+ const fs = require('fs');
37
5
 
38
6
  const args = process.argv.slice(2);
39
7
  const command = args[0];
40
- const subArg = args[1];
41
8
 
42
- function parseFlags(args) {
43
- const flags = {};
44
- for (const arg of args) {
45
- if (arg === '--all') flags.all = true;
46
- if (arg === '--stats') flags.stats = true;
47
- if (arg === '--force') flags.force = true;
48
- if (arg === '--bottlenecks') flags.bottlenecks = true;
49
- if (arg === '--failures') flags.failures = true;
50
- if (arg === '--json') flags.json = true;
51
- if (arg === '--feedback') flags.feedback = true;
52
- }
53
- return flags;
54
- }
55
-
56
- const commands = {
57
- init: {
58
- fn: init,
59
- description: 'Initialize .blueprint directory in current project'
60
- },
61
- update: {
62
- fn: update,
63
- description: 'Update agents, templates, and rituals (preserves your content)'
64
- },
65
- queue: {
66
- fn: () => {
67
- if (subArg === 'reset') {
68
- resetQueue();
69
- console.log('Queue has been reset.');
70
- } else {
71
- displayQueue();
72
- }
73
- },
74
- description: 'Show queue status (use "reset" to clear)'
75
- },
76
- validate: {
77
- fn: async () => {
78
- const result = await validate();
79
- const useColor = process.stdout.isTTY || false;
80
- console.log(formatOutput(result, useColor));
81
- process.exit(result.exitCode);
82
- },
83
- description: 'Run pre-flight checks to validate project configuration'
84
- },
85
- history: {
86
- fn: async () => {
87
- const flags = parseFlags(args);
88
- if (subArg === 'clear') {
89
- await clearHistory({ force: flags.force });
90
- } else if (flags.stats) {
91
- showStats();
92
- } else {
93
- displayHistory({ all: flags.all });
94
- }
95
- },
96
- description: 'View pipeline execution history'
97
- },
98
- insights: {
99
- fn: () => {
100
- const flags = parseFlags(args);
101
- if (flags.feedback) {
102
- displayFeedbackInsights({ json: flags.json });
103
- } else {
104
- displayInsights({
105
- bottlenecks: flags.bottlenecks,
106
- failures: flags.failures,
107
- json: flags.json
108
- });
109
- }
110
- },
111
- description: 'Analyze pipeline history for bottlenecks, failures, and trends'
112
- },
113
- 'retry-config': {
114
- fn: () => {
115
- if (subArg === 'set') {
116
- const key = args[2];
117
- const value = args[3];
118
- if (!key || !value) {
119
- console.error('Usage: retry-config set <key> <value>');
120
- console.error('Valid keys: maxRetries, windowSize, highFailureThreshold');
121
- process.exit(1);
122
- }
123
- setConfigValue(key, value);
124
- } else if (subArg === 'reset') {
125
- resetConfig();
126
- console.log('Retry configuration reset to defaults.');
127
- } else {
128
- displayConfig();
129
- }
130
- },
131
- description: 'Manage retry configuration for adaptive retry logic'
132
- },
133
- 'feedback-config': {
134
- fn: () => {
135
- if (subArg === 'set') {
136
- const key = args[2];
137
- const value = args[3];
138
- if (!key || !value) {
139
- console.error('Usage: feedback-config set <key> <value>');
140
- console.error('Valid keys: minRatingThreshold, enabled');
141
- process.exit(1);
142
- }
143
- setFeedbackConfigValue(key, value);
144
- } else if (subArg === 'reset') {
145
- resetFeedbackConfig();
146
- console.log('Feedback configuration reset to defaults.');
147
- } else {
148
- displayFeedbackConfig();
149
- }
150
- },
151
- description: 'Manage feedback loop configuration'
152
- },
153
- 'stack-config': {
154
- fn: () => {
155
- if (subArg === 'set') {
156
- const key = args[2];
157
- const value = args[3];
158
- if (!key || !value) {
159
- console.error('Usage: stack-config set <key> <value>');
160
- console.error('Valid keys: language, runtime, packageManager, frameworks, testRunner, testCommand, linter, tools');
161
- process.exit(1);
162
- }
163
- setStackConfigValue(key, value);
164
- } else if (subArg === 'reset') {
165
- resetStackConfig();
166
- console.log('Stack configuration reset to defaults.');
167
- } else {
168
- displayStackConfig();
169
- }
170
- },
171
- description: 'View or modify project tech stack configuration'
172
- },
173
- 'murm-config': {
174
- fn: () => {
175
- if (subArg === 'set') {
176
- const key = args[2];
177
- const value = args[3];
178
- if (!key || !value) {
179
- console.error('Usage: murm-config set <key> <value>');
180
- console.error('Valid keys: cli, skill, skillFlags, worktreeDir, maxConcurrency, queueFile');
181
- process.exit(1);
182
- }
183
- const config = readMurmConfig();
184
- if (key === 'maxConcurrency') {
185
- config[key] = parseInt(value, 10);
186
- } else {
187
- config[key] = value;
188
- }
189
- writeMurmConfig(config);
190
- console.log(`Set ${key} = ${value}`);
191
- } else if (subArg === 'reset') {
192
- writeMurmConfig(getDefaultMurmConfig());
193
- console.log('Murmuration configuration reset to defaults.');
194
- } else {
195
- const config = readMurmConfig();
196
- console.log('Murmuration Configuration\n');
197
- console.log(` cli: ${config.cli}`);
198
- console.log(` skill: ${config.skill}`);
199
- console.log(` skillFlags: ${config.skillFlags}`);
200
- console.log(` worktreeDir: ${config.worktreeDir}`);
201
- console.log(` maxConcurrency: ${config.maxConcurrency}`);
202
- console.log(` maxFeatures: ${config.maxFeatures}`);
203
- console.log(` timeout: ${config.timeout} min`);
204
- console.log(` minDiskSpaceMB: ${config.minDiskSpaceMB}`);
205
- console.log(` queueFile: ${config.queueFile}`);
206
- console.log('\nTo change: murmur8 murm-config set <key> <value>');
207
- console.log('Run pipelines: murmur8 murm <slug1> <slug2> ...');
208
- }
209
- },
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)'
215
- },
216
- parallel: {
217
- fn: async () => {
218
- if (subArg === 'status') {
219
- const detailed = args.includes('--detailed') || args.includes('-d');
220
- const lock = getLockInfo();
221
-
222
- if (detailed) {
223
- const details = getDetailedStatus();
224
- console.log(formatDetailedStatus(details));
225
- } else {
226
- const queue = loadQueue();
227
-
228
- if (!queue.features || queue.features.length === 0) {
229
- if (lock) {
230
- console.log(`Murmuration execution in progress (PID: ${lock.pid})`);
231
- console.log(`Started: ${lock.startedAt}`);
232
- console.log(`Features: ${lock.features.join(', ')}`);
233
- } else {
234
- console.log('No murmuration pipelines active.');
235
- }
236
- return;
237
- }
238
-
239
- console.log('Murmuration Pipeline Status\n');
240
- console.log(formatStatus(queue.features));
241
- const summary = {
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,
246
- conflicts: queue.features.filter(f => f.status === 'merge_conflict').length
247
- };
248
- console.log(`\nRunning: ${summary.running} | Pending: ${summary.pending} | Completed: ${summary.completed} | Failed: ${summary.failed} | Conflicts: ${summary.conflicts}`);
249
-
250
- // Show log paths for running/failed
251
- const withLogs = queue.features.filter(f =>
252
- f.logPath && (f.status === 'murm_running' || f.status === 'murm_failed')
253
- );
254
- if (withLogs.length > 0) {
255
- console.log('\nLog files:');
256
- withLogs.forEach(f => console.log(` ${f.slug}: ${f.logPath}`));
257
- }
258
-
259
- console.log('\nTip: Use --detailed for progress bars');
260
- }
261
- } else if (subArg === 'rollback') {
262
- const dryRunFlag = args.includes('--dry-run');
263
- const forceFlag = args.includes('--force');
264
- await rollbackMurm({ dryRun: dryRunFlag, force: forceFlag });
265
- } else if (subArg === 'cleanup') {
266
- const cleaned = await cleanupWorktrees();
267
- console.log(`Cleaned ${cleaned} worktree(s).`);
268
- } else if (subArg === 'abort') {
269
- const cleanupFlag = args.includes('--cleanup');
270
- await abortMurm({ cleanup: cleanupFlag });
271
- } else {
272
- const slugs = args.slice(1).filter(a => !a.startsWith('--') && !a.startsWith('-'));
273
- if (slugs.length === 0) {
274
- console.error('Usage: murmur8 murm <slug1> <slug2> ... [options]');
275
- console.error('\nOptions:');
276
- console.error(' --dry-run Preview execution plan without running');
277
- console.error(' --yes, -y Skip confirmation prompt');
278
- console.error(' --force Override existing lock');
279
- console.error(' --verbose Stream output to console (not just logs)');
280
- console.error(' --skip-preflight Skip feature validation checks');
281
- console.error(' --max-concurrency=N Set max parallel pipelines (default: 3)');
282
- console.error('\nSubcommands:');
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');
286
- process.exit(1);
287
- }
288
-
289
- const maxFlag = args.find(a => a.startsWith('--max-concurrency='));
290
- const options = {
291
- dryRun: args.includes('--dry-run'),
292
- yes: args.includes('--yes') || args.includes('-y'),
293
- force: args.includes('--force'),
294
- verbose: args.includes('--verbose'),
295
- skipPreflight: args.includes('--skip-preflight')
296
- };
297
- if (maxFlag) {
298
- options.maxConcurrency = parseInt(maxFlag.split('=')[1], 10);
299
- }
300
- const result = await runMurm(slugs, options);
301
- process.exit(result.success ? 0 : 1);
302
- }
303
- },
304
- description: 'Run multiple feature pipelines in parallel using git worktrees'
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
- },
314
- help: {
315
- fn: showHelp,
316
- description: 'Show this help message'
317
- }
9
+ // Alias resolution
10
+ const aliases = {
11
+ 'parallel': 'murm',
12
+ 'murmuration': 'murm',
13
+ 'parallel-config': 'murm-config'
318
14
  };
319
15
 
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
-
325
- function showHelp() {
326
- console.log(`
327
- murmur8 - Multi-agent workflow framework
328
-
329
- Usage: murmur8 <command> [options]
330
-
331
- Commands:
332
- init Initialize .blueprint directory in current project
333
- update Update agents, templates, and rituals (preserves your content)
334
- validate Run pre-flight checks to validate project configuration
335
- queue Show current queue state for /implement-feature pipeline
336
- queue reset Clear the queue and reset all state
337
- history View recent pipeline runs (last 10 by default)
338
- history --all View all pipeline runs
339
- history --stats View aggregate statistics
340
- history clear Clear all pipeline history (with confirmation)
341
- history clear --force Clear all pipeline history (no confirmation)
342
- insights Analyze pipeline for bottlenecks, failures, and trends
343
- insights --bottlenecks Show only bottleneck analysis
344
- insights --failures Show only failure patterns
345
- insights --feedback Show feedback loop insights (calibration, correlations)
346
- insights --json Output analysis as JSON
347
- retry-config View current retry configuration
348
- retry-config set <key> <value> Modify a config value (maxRetries, windowSize, highFailureThreshold)
349
- retry-config reset Reset retry configuration to defaults
350
- feedback-config View current feedback loop configuration
351
- feedback-config set <key> <value> Modify a config value (minRatingThreshold, enabled)
352
- feedback-config reset Reset feedback configuration to defaults
353
- stack-config View current tech stack configuration
354
- stack-config set <key> <value> Modify a config value (language, runtime, frameworks, etc.)
355
- stack-config reset Reset tech stack configuration to defaults
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
371
- help Show this help message
372
-
373
- Aliases: parallel, murmuration (same as murm)
374
- parallel-config (same as murm-config)
375
-
376
- Examples:
377
- npx murmur8 init
378
- npx murmur8 update
379
- npx murmur8 validate
380
- npx murmur8 queue
381
- npx murmur8 history
382
- npx murmur8 history --stats
383
- npx murmur8 insights --feedback
384
- npx murmur8 murm user-auth dashboard --dry-run
385
- `);
386
- }
16
+ const resolvedCommand = aliases[command] || command;
387
17
 
18
+ // Dynamic command loading
388
19
  async function main() {
20
+ // Handle help/no command
389
21
  if (!command || command === 'help' || command === '--help' || command === '-h') {
390
- showHelp();
391
- process.exit(0);
22
+ const help = require('../src/commands/help');
23
+ await help.run(args);
24
+ return;
392
25
  }
393
26
 
394
- const cmd = commands[command];
395
- if (!cmd) {
27
+ // Load and run the command
28
+ const cmdPath = path.join(__dirname, '../src/commands', `${resolvedCommand}.js`);
29
+
30
+ if (!fs.existsSync(cmdPath)) {
396
31
  console.error(`Unknown command: ${command}`);
397
- console.error('Run "agent-workflow help" for usage information.');
32
+ console.error('Run "murmur8 help" for usage information.');
398
33
  process.exit(1);
399
34
  }
400
35
 
401
36
  try {
402
- await cmd.fn();
37
+ const cmd = require(cmdPath);
38
+ await cmd.run(args);
403
39
  } catch (error) {
404
40
  console.error(`Error: ${error.message}`);
405
41
  process.exit(1);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "murmur8",
3
- "version": "4.1.1",
3
+ "version": "4.3.0",
4
4
  "description": "Multi-agent workflow framework for automated feature development",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -0,0 +1,32 @@
1
+ /**
2
+ * feedback-config command - Manage feedback loop configuration
3
+ */
4
+ const {
5
+ displayConfig: displayFeedbackConfig,
6
+ setConfigValue: setFeedbackConfigValue,
7
+ resetConfig: resetFeedbackConfig
8
+ } = require('../feedback');
9
+
10
+ const description = 'Manage feedback loop configuration';
11
+
12
+ async function run(args) {
13
+ const subArg = args[1];
14
+
15
+ if (subArg === 'set') {
16
+ const key = args[2];
17
+ const value = args[3];
18
+ if (!key || !value) {
19
+ console.error('Usage: feedback-config set <key> <value>');
20
+ console.error('Valid keys: minRatingThreshold, enabled');
21
+ process.exit(1);
22
+ }
23
+ setFeedbackConfigValue(key, value);
24
+ } else if (subArg === 'reset') {
25
+ resetFeedbackConfig();
26
+ console.log('Feedback configuration reset to defaults.');
27
+ } else {
28
+ displayFeedbackConfig();
29
+ }
30
+ }
31
+
32
+ module.exports = { run, description };
@@ -0,0 +1,81 @@
1
+ /**
2
+ * help command - Show help message
3
+ */
4
+
5
+ const description = 'Show this help message';
6
+
7
+ function showHelp() {
8
+ console.log(`
9
+ murmur8 - Multi-agent workflow framework
10
+
11
+ Usage: murmur8 <command> [options]
12
+
13
+ Commands:
14
+ init Initialize .blueprint directory in current project
15
+ update Update agents, templates, and rituals (preserves your content)
16
+ validate Run pre-flight checks to validate project configuration
17
+ queue Show current queue state for /implement-feature pipeline
18
+ queue reset Clear the queue and reset all state
19
+ history View recent pipeline runs (last 10 by default)
20
+ history --all View all pipeline runs
21
+ history --stats View aggregate statistics
22
+ history clear Clear all pipeline history (with confirmation)
23
+ history clear --force Clear all pipeline history (no confirmation)
24
+ history export Export history as CSV (default) or JSON
25
+ history export --format=json Export as JSON
26
+ history export --since=YYYY-MM-DD Filter entries on or after date
27
+ history export --until=YYYY-MM-DD Filter entries on or before date
28
+ history export --status=<status> Filter by status (success|failed|paused)
29
+ history export --feature=<slug> Filter by feature slug
30
+ history export --output=<path> Write to file instead of stdout
31
+ insights Analyze pipeline for bottlenecks, failures, and trends
32
+ insights --bottlenecks Show only bottleneck analysis
33
+ insights --failures Show only failure patterns
34
+ insights --feedback Show feedback loop insights (calibration, correlations)
35
+ insights --json Output analysis as JSON
36
+ retry-config View current retry configuration
37
+ retry-config set <key> <value> Modify a config value (maxRetries, windowSize, highFailureThreshold)
38
+ retry-config reset Reset retry configuration to defaults
39
+ feedback-config View current feedback loop configuration
40
+ feedback-config set <key> <value> Modify a config value (minRatingThreshold, enabled)
41
+ feedback-config reset Reset feedback configuration to defaults
42
+ stack-config View current tech stack configuration
43
+ stack-config set <key> <value> Modify a config value (language, runtime, frameworks, etc.)
44
+ stack-config reset Reset tech stack configuration to defaults
45
+ murm <slugs...> Run multiple feature pipelines in parallel (murmuration)
46
+ murm <slugs...> --dry-run Show execution plan without running
47
+ murm <slugs...> --yes Skip confirmation prompt
48
+ murm <slugs...> --verbose Stream output to console
49
+ murm <slugs...> --skip-preflight Skip feature validation checks
50
+ murm status Show status of all parallel pipelines
51
+ murm status --detailed Show progress bars and stage info
52
+ murm abort Stop all running pipelines
53
+ murm abort --cleanup Stop all and remove worktrees
54
+ murm rollback Undo completed merges and cleanup failures
55
+ murm rollback --dry-run Preview what would be rolled back
56
+ murm cleanup Remove completed/aborted worktrees
57
+ murm-config View murmuration pipeline configuration
58
+ murm-config set <key> <value> Modify config (cli, skill, skillFlags, etc.)
59
+ murm-config reset Reset murmuration configuration to defaults
60
+ help Show this help message
61
+
62
+ Aliases: parallel, murmuration (same as murm)
63
+ parallel-config (same as murm-config)
64
+
65
+ Examples:
66
+ npx murmur8 init
67
+ npx murmur8 update
68
+ npx murmur8 validate
69
+ npx murmur8 queue
70
+ npx murmur8 history
71
+ npx murmur8 history --stats
72
+ npx murmur8 insights --feedback
73
+ npx murmur8 murm user-auth dashboard --dry-run
74
+ `);
75
+ }
76
+
77
+ async function run(args) {
78
+ showHelp();
79
+ }
80
+
81
+ module.exports = { run, description };
@@ -0,0 +1,42 @@
1
+ /**
2
+ * history command - View pipeline execution history
3
+ */
4
+ const { displayHistory, showStats, clearHistory, exportHistory } = require('../history');
5
+ const { parseFlags } = require('./utils');
6
+
7
+ const description = 'View pipeline execution history';
8
+
9
+ async function run(args) {
10
+ const flags = parseFlags(args);
11
+ const subArg = args[1];
12
+
13
+ if (subArg === 'clear') {
14
+ await clearHistory({ force: flags.force });
15
+ } else if (subArg === 'export') {
16
+ const exportOpts = {};
17
+ for (const arg of args) {
18
+ if (arg.startsWith('--format=')) exportOpts.format = arg.split('=')[1];
19
+ if (arg.startsWith('--since=')) exportOpts.since = arg.split('=')[1];
20
+ if (arg.startsWith('--until=')) exportOpts.until = arg.split('=')[1];
21
+ if (arg.startsWith('--status=')) exportOpts.status = arg.split('=')[1];
22
+ if (arg.startsWith('--feature=')) exportOpts.feature = arg.split('=')[1];
23
+ if (arg.startsWith('--output=')) exportOpts.output = arg.split('=')[1];
24
+ }
25
+ const result = await exportHistory(exportOpts);
26
+ if (result.exitCode) {
27
+ console.error(`Error: ${result.error}`);
28
+ process.exit(result.exitCode);
29
+ }
30
+ if (result.message) {
31
+ console.log(result.message);
32
+ } else if (result.output) {
33
+ console.log(result.output);
34
+ }
35
+ } else if (flags.stats) {
36
+ showStats();
37
+ } else {
38
+ displayHistory({ all: flags.all });
39
+ }
40
+ }
41
+
42
+ module.exports = { run, description };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * init command - Initialize .blueprint directory in current project
3
+ */
4
+ const { init } = require('../init');
5
+
6
+ const description = 'Initialize .blueprint directory in current project';
7
+
8
+ async function run(args) {
9
+ await init();
10
+ }
11
+
12
+ module.exports = { run, description };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * insights command - Analyze pipeline history for bottlenecks, failures, and trends
3
+ */
4
+ const { displayInsights, displayFeedbackInsights } = require('../insights');
5
+ const { parseFlags } = require('./utils');
6
+
7
+ const description = 'Analyze pipeline history for bottlenecks, failures, and trends';
8
+
9
+ async function run(args) {
10
+ const flags = parseFlags(args);
11
+
12
+ if (flags.feedback) {
13
+ displayFeedbackInsights({ json: flags.json });
14
+ } else {
15
+ displayInsights({
16
+ bottlenecks: flags.bottlenecks,
17
+ failures: flags.failures,
18
+ json: flags.json
19
+ });
20
+ }
21
+ }
22
+
23
+ module.exports = { run, description };
@@ -0,0 +1,52 @@
1
+ /**
2
+ * murm-config command - View or modify murmuration pipeline configuration
3
+ */
4
+ const {
5
+ readMurmConfig,
6
+ writeMurmConfig,
7
+ getDefaultMurmConfig
8
+ } = require('../murm');
9
+
10
+ const description = 'View or modify murmuration pipeline configuration';
11
+ const aliases = ['parallel-config'];
12
+
13
+ async function run(args) {
14
+ const subArg = args[1];
15
+
16
+ if (subArg === 'set') {
17
+ const key = args[2];
18
+ const value = args[3];
19
+ if (!key || !value) {
20
+ console.error('Usage: murm-config set <key> <value>');
21
+ console.error('Valid keys: cli, skill, skillFlags, worktreeDir, maxConcurrency, queueFile');
22
+ process.exit(1);
23
+ }
24
+ const config = readMurmConfig();
25
+ if (key === 'maxConcurrency') {
26
+ config[key] = parseInt(value, 10);
27
+ } else {
28
+ config[key] = value;
29
+ }
30
+ writeMurmConfig(config);
31
+ console.log(`Set ${key} = ${value}`);
32
+ } else if (subArg === 'reset') {
33
+ writeMurmConfig(getDefaultMurmConfig());
34
+ console.log('Murmuration configuration reset to defaults.');
35
+ } else {
36
+ const config = readMurmConfig();
37
+ console.log('Murmuration Configuration\n');
38
+ console.log(` cli: ${config.cli}`);
39
+ console.log(` skill: ${config.skill}`);
40
+ console.log(` skillFlags: ${config.skillFlags}`);
41
+ console.log(` worktreeDir: ${config.worktreeDir}`);
42
+ console.log(` maxConcurrency: ${config.maxConcurrency}`);
43
+ console.log(` maxFeatures: ${config.maxFeatures}`);
44
+ console.log(` timeout: ${config.timeout} min`);
45
+ console.log(` minDiskSpaceMB: ${config.minDiskSpaceMB}`);
46
+ console.log(` queueFile: ${config.queueFile}`);
47
+ console.log('\nTo change: murmur8 murm-config set <key> <value>');
48
+ console.log('Run pipelines: murmur8 murm <slug1> <slug2> ...');
49
+ }
50
+ }
51
+
52
+ module.exports = { run, description, aliases };