musubi-sdd 5.1.0 → 5.6.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.
Files changed (232) hide show
  1. package/README.ja.md +106 -48
  2. package/README.md +110 -32
  3. package/bin/musubi-analyze.js +74 -67
  4. package/bin/musubi-browser.js +27 -26
  5. package/bin/musubi-change.js +48 -47
  6. package/bin/musubi-checkpoint.js +10 -7
  7. package/bin/musubi-convert.js +25 -25
  8. package/bin/musubi-costs.js +27 -10
  9. package/bin/musubi-gui.js +52 -46
  10. package/bin/musubi-init.js +1952 -10
  11. package/bin/musubi-orchestrate.js +327 -239
  12. package/bin/musubi-remember.js +69 -56
  13. package/bin/musubi-resolve.js +53 -45
  14. package/bin/musubi-trace.js +51 -22
  15. package/bin/musubi-validate.js +39 -30
  16. package/bin/musubi-workflow.js +33 -34
  17. package/bin/musubi.js +39 -2
  18. package/package.json +1 -1
  19. package/src/agents/agent-loop.js +94 -95
  20. package/src/agents/agentic/code-generator.js +119 -109
  21. package/src/agents/agentic/code-reviewer.js +105 -108
  22. package/src/agents/agentic/index.js +4 -4
  23. package/src/agents/browser/action-executor.js +13 -13
  24. package/src/agents/browser/ai-comparator.js +11 -10
  25. package/src/agents/browser/context-manager.js +6 -6
  26. package/src/agents/browser/index.js +5 -5
  27. package/src/agents/browser/nl-parser.js +31 -46
  28. package/src/agents/browser/screenshot.js +2 -2
  29. package/src/agents/browser/test-generator.js +6 -4
  30. package/src/agents/function-tool.js +71 -65
  31. package/src/agents/index.js +7 -7
  32. package/src/agents/schema-generator.js +98 -94
  33. package/src/analyzers/ast-extractor.js +158 -146
  34. package/src/analyzers/codegraph-auto-update.js +858 -0
  35. package/src/analyzers/complexity-analyzer.js +536 -0
  36. package/src/analyzers/context-optimizer.js +241 -126
  37. package/src/analyzers/impact-analyzer.js +1 -1
  38. package/src/analyzers/large-project-analyzer.js +766 -0
  39. package/src/analyzers/repository-map.js +77 -81
  40. package/src/analyzers/security-analyzer.js +19 -11
  41. package/src/analyzers/stuck-detector.js +19 -17
  42. package/src/converters/index.js +78 -57
  43. package/src/converters/ir/types.js +12 -12
  44. package/src/converters/parsers/musubi-parser.js +134 -126
  45. package/src/converters/parsers/openapi-parser.js +70 -53
  46. package/src/converters/parsers/speckit-parser.js +239 -175
  47. package/src/converters/writers/musubi-writer.js +123 -118
  48. package/src/converters/writers/speckit-writer.js +124 -113
  49. package/src/generators/rust-migration-generator.js +512 -0
  50. package/src/gui/public/index.html +1365 -1211
  51. package/src/gui/server.js +41 -40
  52. package/src/gui/services/file-watcher.js +23 -8
  53. package/src/gui/services/project-scanner.js +26 -20
  54. package/src/gui/services/replanning-service.js +27 -23
  55. package/src/gui/services/traceability-service.js +8 -8
  56. package/src/gui/services/workflow-service.js +14 -7
  57. package/src/index.js +151 -0
  58. package/src/integrations/cicd.js +90 -104
  59. package/src/integrations/codegraph-mcp.js +643 -0
  60. package/src/integrations/documentation.js +142 -103
  61. package/src/integrations/examples.js +95 -80
  62. package/src/integrations/github-client.js +17 -17
  63. package/src/integrations/index.js +5 -5
  64. package/src/integrations/mcp/index.js +21 -21
  65. package/src/integrations/mcp/mcp-context-provider.js +76 -78
  66. package/src/integrations/mcp/mcp-discovery.js +74 -72
  67. package/src/integrations/mcp/mcp-tool-registry.js +99 -94
  68. package/src/integrations/mcp-connector.js +70 -66
  69. package/src/integrations/platforms.js +50 -49
  70. package/src/integrations/tool-discovery.js +37 -31
  71. package/src/llm-providers/anthropic-provider.js +11 -11
  72. package/src/llm-providers/base-provider.js +16 -18
  73. package/src/llm-providers/copilot-provider.js +22 -19
  74. package/src/llm-providers/index.js +26 -25
  75. package/src/llm-providers/ollama-provider.js +11 -11
  76. package/src/llm-providers/openai-provider.js +12 -12
  77. package/src/managers/agent-memory.js +36 -24
  78. package/src/managers/checkpoint-manager.js +4 -8
  79. package/src/managers/delta-spec.js +19 -19
  80. package/src/managers/index.js +13 -4
  81. package/src/managers/memory-condenser.js +35 -45
  82. package/src/managers/repo-skill-manager.js +57 -31
  83. package/src/managers/skill-loader.js +25 -22
  84. package/src/managers/skill-tools.js +36 -72
  85. package/src/managers/workflow.js +30 -22
  86. package/src/monitoring/cost-tracker.js +48 -46
  87. package/src/monitoring/incident-manager.js +116 -106
  88. package/src/monitoring/index.js +144 -134
  89. package/src/monitoring/observability.js +75 -62
  90. package/src/monitoring/quality-dashboard.js +45 -41
  91. package/src/monitoring/release-manager.js +63 -53
  92. package/src/orchestration/agent-skill-binding.js +39 -47
  93. package/src/orchestration/error-handler.js +65 -107
  94. package/src/orchestration/guardrails/base-guardrail.js +26 -24
  95. package/src/orchestration/guardrails/guardrail-rules.js +50 -64
  96. package/src/orchestration/guardrails/index.js +5 -5
  97. package/src/orchestration/guardrails/input-guardrail.js +58 -45
  98. package/src/orchestration/guardrails/output-guardrail.js +104 -81
  99. package/src/orchestration/guardrails/safety-check.js +79 -79
  100. package/src/orchestration/index.js +38 -55
  101. package/src/orchestration/mcp-tool-adapters.js +96 -99
  102. package/src/orchestration/orchestration-engine.js +21 -21
  103. package/src/orchestration/pattern-registry.js +60 -45
  104. package/src/orchestration/patterns/auto.js +34 -47
  105. package/src/orchestration/patterns/group-chat.js +59 -65
  106. package/src/orchestration/patterns/handoff.js +67 -65
  107. package/src/orchestration/patterns/human-in-loop.js +51 -72
  108. package/src/orchestration/patterns/nested.js +25 -40
  109. package/src/orchestration/patterns/sequential.js +35 -34
  110. package/src/orchestration/patterns/swarm.js +63 -56
  111. package/src/orchestration/patterns/triage.js +150 -109
  112. package/src/orchestration/reasoning/index.js +9 -9
  113. package/src/orchestration/reasoning/planning-engine.js +143 -140
  114. package/src/orchestration/reasoning/reasoning-engine.js +206 -144
  115. package/src/orchestration/reasoning/self-correction.js +121 -128
  116. package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
  117. package/src/orchestration/replanning/alternative-generator.js +37 -42
  118. package/src/orchestration/replanning/config.js +63 -59
  119. package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
  120. package/src/orchestration/replanning/index.js +24 -20
  121. package/src/orchestration/replanning/plan-evaluator.js +49 -50
  122. package/src/orchestration/replanning/plan-monitor.js +32 -28
  123. package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
  124. package/src/orchestration/replanning/replan-history.js +33 -26
  125. package/src/orchestration/replanning/replanning-engine.js +106 -108
  126. package/src/orchestration/skill-executor.js +107 -109
  127. package/src/orchestration/skill-registry.js +85 -89
  128. package/src/orchestration/workflow-examples.js +228 -231
  129. package/src/orchestration/workflow-executor.js +65 -68
  130. package/src/orchestration/workflow-orchestrator.js +72 -73
  131. package/src/phase4-integration.js +47 -40
  132. package/src/phase5-integration.js +89 -30
  133. package/src/reporters/coverage-report.js +82 -30
  134. package/src/reporters/hierarchical-reporter.js +498 -0
  135. package/src/reporters/traceability-matrix-report.js +29 -20
  136. package/src/resolvers/issue-resolver.js +43 -31
  137. package/src/steering/advanced-validation.js +133 -124
  138. package/src/steering/auto-updater.js +60 -73
  139. package/src/steering/index.js +6 -6
  140. package/src/steering/quality-metrics.js +41 -35
  141. package/src/steering/steering-auto-update.js +83 -86
  142. package/src/steering/steering-validator.js +98 -106
  143. package/src/steering/template-constraints.js +53 -54
  144. package/src/templates/agents/claude-code/CLAUDE.md +32 -32
  145. package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
  146. package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
  147. package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
  148. package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
  149. package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
  150. package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
  151. package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
  152. package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
  153. package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
  154. package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
  155. package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
  156. package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
  157. package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
  158. package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
  159. package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
  160. package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
  161. package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
  162. package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
  163. package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
  164. package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
  165. package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
  166. package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
  167. package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
  168. package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
  169. package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
  170. package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
  171. package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
  172. package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
  173. package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
  174. package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
  175. package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
  176. package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
  177. package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
  178. package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
  179. package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
  180. package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
  181. package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
  182. package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
  183. package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
  184. package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
  185. package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
  186. package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
  187. package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
  188. package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
  189. package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
  190. package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
  191. package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
  192. package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
  193. package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
  194. package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
  195. package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
  196. package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
  197. package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
  198. package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
  199. package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
  200. package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
  201. package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
  202. package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
  203. package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
  204. package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
  205. package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
  206. package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
  207. package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
  208. package/src/templates/agents/codex/AGENTS.md +74 -42
  209. package/src/templates/agents/cursor/AGENTS.md +74 -42
  210. package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
  211. package/src/templates/agents/github-copilot/AGENTS.md +83 -51
  212. package/src/templates/agents/qwen-code/QWEN.md +74 -42
  213. package/src/templates/agents/windsurf/AGENTS.md +74 -42
  214. package/src/templates/architectures/README.md +41 -0
  215. package/src/templates/architectures/clean-architecture/README.md +113 -0
  216. package/src/templates/architectures/event-driven/README.md +162 -0
  217. package/src/templates/architectures/hexagonal/README.md +130 -0
  218. package/src/templates/index.js +6 -1
  219. package/src/templates/locale-manager.js +16 -16
  220. package/src/templates/shared/delta-spec-template.md +20 -13
  221. package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
  222. package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
  223. package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
  224. package/src/templates/shared/steering/structure.md +95 -0
  225. package/src/templates/skills/browser-agent.md +21 -16
  226. package/src/templates/skills/web-gui.md +8 -0
  227. package/src/templates/template-constraints.js +50 -53
  228. package/src/validators/advanced-validation.js +30 -36
  229. package/src/validators/constitutional-validator.js +77 -73
  230. package/src/validators/critic-system.js +49 -59
  231. package/src/validators/delta-format.js +59 -55
  232. package/src/validators/traceability-validator.js +7 -11
@@ -21,7 +21,7 @@
21
21
  const { Command } = require('commander');
22
22
  const chalk = require('chalk');
23
23
  const ChangeManager = require('../src/managers/change.js');
24
- const { DeltaSpecManager, DeltaType } = require('../src/managers/delta-spec.js');
24
+ const { DeltaSpecManager } = require('../src/managers/delta-spec.js');
25
25
  const { DeltaFormatValidator } = require('../src/validators/delta-format.js');
26
26
  const { ImpactAnalyzer } = require('../src/analyzers/impact-analyzer.js');
27
27
 
@@ -135,7 +135,7 @@ program
135
135
 
136
136
  // Try DeltaSpecManager first (new workflow)
137
137
  const delta = deltaManager.load(changeId);
138
-
138
+
139
139
  if (delta) {
140
140
  // Check status
141
141
  if (delta.status !== 'implemented' && !options.force) {
@@ -148,7 +148,7 @@ program
148
148
  }
149
149
 
150
150
  const result = deltaManager.archive(changeId);
151
-
151
+
152
152
  console.log(chalk.green('āœ“ Change archived successfully'));
153
153
  console.log(chalk.dim(`Merged to: ${result.mergedTo}`));
154
154
  console.log(chalk.dim(`Archive: ${result.archivePath}`));
@@ -308,15 +308,15 @@ program
308
308
  console.log(chalk.bold.blue(`Delta Specification: ${delta.id}`));
309
309
  console.log(chalk.dim('─'.repeat(50)));
310
310
  console.log();
311
-
311
+
312
312
  const typeColors = {
313
313
  ADDED: chalk.green,
314
314
  MODIFIED: chalk.blue,
315
315
  REMOVED: chalk.red,
316
- RENAMED: chalk.yellow
316
+ RENAMED: chalk.yellow,
317
317
  };
318
318
  const typeColor = typeColors[delta.type] || chalk.white;
319
-
319
+
320
320
  console.log(`${chalk.bold('Type:')} ${typeColor(delta.type)}`);
321
321
  console.log(`${chalk.bold('Target:')} ${delta.target}`);
322
322
  console.log(`${chalk.bold('Status:')} ${delta.status}`);
@@ -325,13 +325,13 @@ program
325
325
  console.log();
326
326
  console.log(chalk.bold('Description:'));
327
327
  console.log(chalk.dim(delta.description));
328
-
328
+
329
329
  if (delta.rationale) {
330
330
  console.log();
331
331
  console.log(chalk.bold('Rationale:'));
332
332
  console.log(chalk.dim(delta.rationale));
333
333
  }
334
-
334
+
335
335
  if (delta.impactedAreas && delta.impactedAreas.length > 0) {
336
336
  console.log();
337
337
  console.log(chalk.bold('Impacted Areas:'));
@@ -339,23 +339,27 @@ program
339
339
  console.log(chalk.dim(` • ${area}`));
340
340
  });
341
341
  }
342
-
342
+
343
343
  if (delta.before) {
344
344
  console.log();
345
345
  console.log(chalk.bold('Before State:'));
346
- console.log(chalk.dim(typeof delta.before === 'object'
347
- ? JSON.stringify(delta.before, null, 2)
348
- : delta.before));
346
+ console.log(
347
+ chalk.dim(
348
+ typeof delta.before === 'object' ? JSON.stringify(delta.before, null, 2) : delta.before
349
+ )
350
+ );
349
351
  }
350
-
352
+
351
353
  if (delta.after) {
352
354
  console.log();
353
355
  console.log(chalk.bold('After State:'));
354
- console.log(chalk.dim(typeof delta.after === 'object'
355
- ? JSON.stringify(delta.after, null, 2)
356
- : delta.after));
356
+ console.log(
357
+ chalk.dim(
358
+ typeof delta.after === 'object' ? JSON.stringify(delta.after, null, 2) : delta.after
359
+ )
360
+ );
357
361
  }
358
-
362
+
359
363
  console.log();
360
364
  } catch (error) {
361
365
  console.error(chalk.red('āœ— Failed to show change'));
@@ -404,7 +408,7 @@ program
404
408
  console.log(chalk.bold.blue(`Impact Report: ${report.id}`));
405
409
  console.log(chalk.dim('─'.repeat(50)));
406
410
  console.log();
407
-
411
+
408
412
  console.log(`${chalk.bold('Type:')} ${report.type}`);
409
413
  console.log(`${chalk.bold('Target:')} ${report.target}`);
410
414
  console.log(`${chalk.bold('Analyzed:')} ${report.timestamp}`);
@@ -421,7 +425,7 @@ program
421
425
  high: chalk.yellow,
422
426
  medium: chalk.blue,
423
427
  low: chalk.green,
424
- info: chalk.dim
428
+ info: chalk.dim,
425
429
  };
426
430
 
427
431
  console.log(chalk.bold('Impact Levels:'));
@@ -471,12 +475,13 @@ program
471
475
  if (report.recommendations.length > 0) {
472
476
  console.log(chalk.bold('Recommendations:'));
473
477
  report.recommendations.forEach(rec => {
474
- const emoji = {
475
- critical: 'šŸ”“',
476
- high: '🟠',
477
- medium: '🟔',
478
- info: 'ā„¹ļø'
479
- }[rec.priority] || '•';
478
+ const emoji =
479
+ {
480
+ critical: 'šŸ”“',
481
+ high: '🟠',
482
+ medium: '🟔',
483
+ info: 'ā„¹ļø',
484
+ }[rec.priority] || '•';
480
485
  console.log(` ${emoji} ${rec.message}`);
481
486
  });
482
487
  console.log();
@@ -493,13 +498,13 @@ program
493
498
  .command('approve <change-id>')
494
499
  .description('Approve a change proposal')
495
500
  .option('--changes <dir>', 'Changes directory', 'storage/changes')
496
- .action(async (changeId, options) => {
501
+ .action(async (changeId, _options) => {
497
502
  try {
498
503
  const workspaceRoot = process.cwd();
499
504
  const deltaManager = new DeltaSpecManager(workspaceRoot);
500
505
 
501
- const delta = deltaManager.updateStatus(changeId, 'approved');
502
-
506
+ deltaManager.updateStatus(changeId, 'approved');
507
+
503
508
  console.log(chalk.green(`āœ“ Change ${changeId} approved`));
504
509
  console.log(chalk.dim(`Status updated to: approved`));
505
510
  console.log();
@@ -524,8 +529,8 @@ program
524
529
  const workspaceRoot = process.cwd();
525
530
  const deltaManager = new DeltaSpecManager(workspaceRoot);
526
531
 
527
- const delta = deltaManager.updateStatus(changeId, 'rejected');
528
-
532
+ deltaManager.updateStatus(changeId, 'rejected');
533
+
529
534
  console.log(chalk.red(`āœ— Change ${changeId} rejected`));
530
535
  if (options.reason) {
531
536
  console.log(chalk.dim(`Reason: ${options.reason}`));
@@ -548,7 +553,7 @@ program
548
553
  .option('-d, --description <description>', 'Change description')
549
554
  .option('-r, --rationale <rationale>', 'Reason for change')
550
555
  .option('--impact <areas>', 'Comma-separated impacted areas')
551
- .action(async (options) => {
556
+ .action(async options => {
552
557
  try {
553
558
  const workspaceRoot = process.cwd();
554
559
  const deltaManager = new DeltaSpecManager(workspaceRoot);
@@ -573,9 +578,7 @@ program
573
578
  process.exit(1);
574
579
  }
575
580
 
576
- const impactedAreas = options.impact
577
- ? options.impact.split(',').map(a => a.trim())
578
- : [];
581
+ const impactedAreas = options.impact ? options.impact.split(',').map(a => a.trim()) : [];
579
582
 
580
583
  const delta = deltaManager.create({
581
584
  id: options.id,
@@ -583,7 +586,7 @@ program
583
586
  target: options.target,
584
587
  description: options.description,
585
588
  rationale: options.rationale || '',
586
- impactedAreas
589
+ impactedAreas,
587
590
  });
588
591
 
589
592
  // Validate the created delta
@@ -591,7 +594,7 @@ program
591
594
 
592
595
  console.log(chalk.green(`āœ“ Delta specification created: ${delta.id}`));
593
596
  console.log(chalk.dim(`Location: storage/changes/${delta.id}/`));
594
-
597
+
595
598
  if (validation.warnings.length > 0) {
596
599
  console.log();
597
600
  console.log(chalk.yellow('Warnings:'));
@@ -599,7 +602,7 @@ program
599
602
  console.log(chalk.dim(` • ${w.message}`));
600
603
  });
601
604
  }
602
-
605
+
603
606
  console.log();
604
607
  console.log(chalk.yellow('Next steps:'));
605
608
  console.log(chalk.dim(`1. Review: musubi-change show ${delta.id}`));
@@ -618,7 +621,7 @@ program
618
621
  .description('Validate all delta specifications in the changes directory')
619
622
  .option('--changes <dir>', 'Changes directory', 'storage/changes')
620
623
  .option('--strict', 'Enable strict validation mode')
621
- .action(async (options) => {
624
+ .action(async options => {
622
625
  try {
623
626
  const workspaceRoot = process.cwd();
624
627
  const path = require('path');
@@ -668,7 +671,7 @@ program
668
671
  .description('Show before/after diff for a change')
669
672
  .option('--changes <dir>', 'Changes directory', 'storage/changes')
670
673
  .option('--context <lines>', 'Lines of context to show', '3')
671
- .action(async (changeId, options) => {
674
+ .action(async (changeId, _options) => {
672
675
  try {
673
676
  const workspaceRoot = process.cwd();
674
677
  const deltaManager = new DeltaSpecManager(workspaceRoot);
@@ -688,7 +691,7 @@ program
688
691
  ADDED: chalk.green,
689
692
  MODIFIED: chalk.yellow,
690
693
  REMOVED: chalk.red,
691
- RENAMED: chalk.cyan
694
+ RENAMED: chalk.cyan,
692
695
  };
693
696
  const typeColor = typeColors[delta.type] || chalk.white;
694
697
 
@@ -766,7 +769,7 @@ program
766
769
  console.log();
767
770
  console.log(chalk.bold('Description:'));
768
771
  console.log(chalk.dim(delta.description));
769
-
772
+
770
773
  if (delta.rationale) {
771
774
  console.log();
772
775
  console.log(chalk.bold('Rationale:'));
@@ -786,7 +789,7 @@ program
786
789
  .command('status')
787
790
  .description('Show status summary of all changes')
788
791
  .option('--changes <dir>', 'Changes directory', 'storage/changes')
789
- .action(async (options) => {
792
+ .action(async _options => {
790
793
  try {
791
794
  const workspaceRoot = process.cwd();
792
795
  const deltaManager = new DeltaSpecManager(workspaceRoot);
@@ -803,14 +806,14 @@ program
803
806
  approved: 0,
804
807
  rejected: 0,
805
808
  implemented: 0,
806
- archived: 0
809
+ archived: 0,
807
810
  };
808
811
 
809
812
  const typeCounts = {
810
813
  ADDED: 0,
811
814
  MODIFIED: 0,
812
815
  REMOVED: 0,
813
- RENAMED: 0
816
+ RENAMED: 0,
814
817
  };
815
818
 
816
819
  deltas.forEach(d => {
@@ -842,9 +845,7 @@ program
842
845
  console.log();
843
846
 
844
847
  // Show pending items
845
- const pending = deltas.filter(d =>
846
- d.status === 'proposed' || d.status === 'approved'
847
- );
848
+ const pending = deltas.filter(d => d.status === 'proposed' || d.status === 'approved');
848
849
 
849
850
  if (pending.length > 0) {
850
851
  console.log(chalk.bold('Pending Actions:'));
@@ -9,7 +9,7 @@
9
9
 
10
10
  const { Command } = require('commander');
11
11
  const chalk = require('chalk');
12
- const path = require('path');
12
+ const _path = require('path');
13
13
  const { CheckpointManager, CheckpointState } = require('../src/managers/checkpoint-manager');
14
14
 
15
15
  const program = new Command();
@@ -36,7 +36,7 @@ program
36
36
  .option('-d, --description <description>', 'Checkpoint description')
37
37
  .option('-t, --tags <tags>', 'Comma-separated tags')
38
38
  .option('-w, --workspace <dir>', 'Workspace directory')
39
- .action(async (options) => {
39
+ .action(async options => {
40
40
  try {
41
41
  const manager = getManager(options);
42
42
  await manager.initialize();
@@ -72,7 +72,7 @@ program
72
72
  .option('-l, --limit <n>', 'Maximum results', parseInt)
73
73
  .option('-w, --workspace <dir>', 'Workspace directory')
74
74
  .option('--json', 'Output as JSON')
75
- .action(async (options) => {
75
+ .action(async options => {
76
76
  try {
77
77
  const manager = getManager(options);
78
78
  await manager.initialize();
@@ -152,9 +152,12 @@ program
152
152
  console.log(chalk.bold('Files:'), checkpoint.stats.filesCount);
153
153
  console.log(chalk.bold('Size:'), formatSize(checkpoint.stats.totalSize));
154
154
  console.log(chalk.bold('Created:'), new Date(checkpoint.timestamp).toLocaleString());
155
- console.log(chalk.bold('Tags:'), checkpoint.tags.length > 0
156
- ? checkpoint.tags.map(t => chalk.blue(`#${t}`)).join(' ')
157
- : '(none)');
155
+ console.log(
156
+ chalk.bold('Tags:'),
157
+ checkpoint.tags.length > 0
158
+ ? checkpoint.tags.map(t => chalk.blue(`#${t}`)).join(' ')
159
+ : '(none)'
160
+ );
158
161
 
159
162
  if (Object.keys(checkpoint.context).length > 0) {
160
163
  console.log(chalk.bold('Context:'));
@@ -336,7 +339,7 @@ program
336
339
  .command('current')
337
340
  .description('Show current checkpoint')
338
341
  .option('-w, --workspace <dir>', 'Workspace directory')
339
- .action(async (options) => {
342
+ .action(async options => {
340
343
  try {
341
344
  const manager = getManager(options);
342
345
  await manager.initialize();
@@ -2,9 +2,9 @@
2
2
 
3
3
  /**
4
4
  * MUSUBI Convert CLI
5
- *
5
+ *
6
6
  * Convert between MUSUBI and Spec Kit formats
7
- *
7
+ *
8
8
  * Usage:
9
9
  * musubi-convert from-speckit <path> [--output <dir>]
10
10
  * musubi-convert to-speckit [--output <dir>]
@@ -15,10 +15,10 @@
15
15
  'use strict';
16
16
 
17
17
  const { program } = require('commander');
18
- const {
19
- convertFromSpeckit,
20
- convertToSpeckit,
21
- validateFormat,
18
+ const {
19
+ convertFromSpeckit,
20
+ convertToSpeckit,
21
+ validateFormat,
22
22
  testRoundtrip,
23
23
  convertFromOpenAPI,
24
24
  } = require('../src/converters');
@@ -40,7 +40,7 @@ program
40
40
  .action(async (sourcePath, options) => {
41
41
  try {
42
42
  console.log('šŸ”„ Converting Spec Kit → MUSUBI...\n');
43
-
43
+
44
44
  const result = await convertFromSpeckit(sourcePath, {
45
45
  output: options.output,
46
46
  dryRun: options.dryRun,
@@ -48,11 +48,11 @@ program
48
48
  verbose: options.verbose,
49
49
  preserveRaw: options.preserveRaw,
50
50
  });
51
-
51
+
52
52
  console.log(`\nāœ… Conversion complete!`);
53
53
  console.log(` Files written: ${result.filesConverted}`);
54
54
  console.log(` Output: ${result.outputPath}`);
55
-
55
+
56
56
  if (result.warnings.length > 0) {
57
57
  console.log(`\nāš ļø Warnings (${result.warnings.length}):`);
58
58
  result.warnings.forEach(w => console.log(` - ${w}`));
@@ -75,10 +75,10 @@ program
75
75
  .option('-v, --verbose', 'Verbose output')
76
76
  .option('-f, --force', 'Overwrite existing files')
77
77
  .option('--preserve-raw', 'Keep original content in comments')
78
- .action(async (options) => {
78
+ .action(async options => {
79
79
  try {
80
80
  console.log('šŸ”„ Converting MUSUBI → Spec Kit...\n');
81
-
81
+
82
82
  const result = await convertToSpeckit({
83
83
  source: options.source,
84
84
  output: options.output,
@@ -87,11 +87,11 @@ program
87
87
  verbose: options.verbose,
88
88
  preserveRaw: options.preserveRaw,
89
89
  });
90
-
90
+
91
91
  console.log(`\nāœ… Conversion complete!`);
92
92
  console.log(` Files written: ${result.filesConverted}`);
93
93
  console.log(` Output: ${result.outputPath}`);
94
-
94
+
95
95
  if (result.warnings.length > 0) {
96
96
  console.log(`\nāš ļø Warnings (${result.warnings.length}):`);
97
97
  result.warnings.forEach(w => console.log(` - ${w}`));
@@ -113,9 +113,9 @@ program
113
113
  try {
114
114
  const path = projectPath || '.';
115
115
  console.log(`šŸ” Validating ${format} project at ${path}...\n`);
116
-
116
+
117
117
  const result = await validateFormat(format, path);
118
-
118
+
119
119
  if (result.valid) {
120
120
  console.log(`āœ… Valid ${format} project`);
121
121
  } else {
@@ -124,7 +124,7 @@ program
124
124
  result.errors.forEach(e => console.log(` - ${e}`));
125
125
  process.exit(1);
126
126
  }
127
-
127
+
128
128
  if (result.warnings.length > 0) {
129
129
  console.log('\nāš ļø Warnings:');
130
130
  result.warnings.forEach(w => console.log(` - ${w}`));
@@ -149,7 +149,7 @@ program
149
149
  .action(async (specPath, options) => {
150
150
  try {
151
151
  console.log('šŸ”„ Converting OpenAPI → MUSUBI...\n');
152
-
152
+
153
153
  const result = await convertFromOpenAPI(specPath, {
154
154
  output: options.output,
155
155
  dryRun: options.dryRun,
@@ -157,12 +157,12 @@ program
157
157
  verbose: options.verbose,
158
158
  featureName: options.feature,
159
159
  });
160
-
160
+
161
161
  console.log(`\nāœ… Conversion complete!`);
162
162
  console.log(` Features created: ${result.featuresCreated}`);
163
163
  console.log(` Requirements: ${result.requirementsCreated}`);
164
164
  console.log(` Output: ${result.outputPath}`);
165
-
165
+
166
166
  if (result.warnings.length > 0) {
167
167
  console.log(`\nāš ļø Warnings (${result.warnings.length}):`);
168
168
  result.warnings.forEach(w => console.log(` - ${w}`));
@@ -178,31 +178,31 @@ program
178
178
 
179
179
  program
180
180
  .command('roundtrip <path>')
181
- .description('Test roundtrip conversion (A → B → A\')')
181
+ .description("Test roundtrip conversion (A → B → A')")
182
182
  .option('-v, --verbose', 'Show detailed diff')
183
183
  .action(async (projectPath, options) => {
184
184
  try {
185
185
  console.log(`šŸ”„ Testing roundtrip conversion at ${projectPath}...\n`);
186
-
186
+
187
187
  const result = await testRoundtrip(projectPath, {
188
188
  verbose: options.verbose,
189
189
  });
190
-
190
+
191
191
  if (result.passed) {
192
192
  console.log(`āœ… Roundtrip test PASSED`);
193
193
  } else {
194
194
  console.log(`āŒ Roundtrip test FAILED`);
195
195
  }
196
-
196
+
197
197
  console.log(` Similarity: ${result.similarity}%`);
198
-
198
+
199
199
  if (!result.passed || options.verbose) {
200
200
  if (result.differences.length > 0) {
201
201
  console.log('\nšŸ“‹ Differences:');
202
202
  result.differences.forEach(d => console.log(` - ${d}`));
203
203
  }
204
204
  }
205
-
205
+
206
206
  if (!result.passed) {
207
207
  process.exit(1);
208
208
  }
@@ -88,7 +88,9 @@ async function showSummary(tracker) {
88
88
 
89
89
  console.log(chalk.white('\n── This Month ──'));
90
90
  console.log(` Requests: ${chalk.cyan(period.requests)}`);
91
- console.log(` Tokens: ${chalk.cyan((period.inputTokens + period.outputTokens).toLocaleString())}`);
91
+ console.log(
92
+ ` Tokens: ${chalk.cyan((period.inputTokens + period.outputTokens).toLocaleString())}`
93
+ );
92
94
  console.log(` Cost: ${chalk.green('$' + period.cost.toFixed(4))}`);
93
95
 
94
96
  if (period.budgetLimit) {
@@ -116,7 +118,7 @@ async function showReport(tracker, args) {
116
118
 
117
119
  async function handleBudget(tracker, subCommand, args) {
118
120
  switch (subCommand) {
119
- case 'set':
121
+ case 'set': {
120
122
  const amount = parseFloat(args[0]);
121
123
  if (isNaN(amount) || amount < 0) {
122
124
  console.error(chalk.red('Invalid budget amount. Please provide a positive number.'));
@@ -133,8 +135,9 @@ async function handleBudget(tracker, subCommand, args) {
133
135
 
134
136
  console.log(chalk.green(`āœ“ Budget set to $${amount.toFixed(2)} per ${period}`));
135
137
  break;
138
+ }
136
139
 
137
- case 'status':
140
+ case 'status': {
138
141
  const summary = tracker.getPeriodSummary();
139
142
  console.log(chalk.blue.bold('\nšŸ’° Budget Status\n'));
140
143
 
@@ -152,12 +155,14 @@ async function handleBudget(tracker, subCommand, args) {
152
155
  }
153
156
  console.log('');
154
157
  break;
158
+ }
155
159
 
156
- case 'clear':
160
+ case 'clear': {
157
161
  const budgetPath = path.join(STORAGE_DIR, 'budget.json');
158
162
  await fs.remove(budgetPath);
159
163
  console.log(chalk.green('āœ“ Budget cleared'));
160
164
  break;
165
+ }
161
166
 
162
167
  default:
163
168
  console.log('Usage:');
@@ -231,9 +236,17 @@ async function showPricing(args) {
231
236
  } else {
232
237
  // Group by provider
233
238
  const providers = {
234
- 'OpenAI': ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo', 'gpt-3.5-turbo', 'o1', 'o1-mini', 'o3-mini'],
235
- 'Anthropic': ['claude-opus-4', 'claude-sonnet-4', 'claude-3.5-sonnet', 'claude-3.5-haiku', 'claude-3-opus', 'claude-3-sonnet', 'claude-3-haiku'],
236
- 'Google': ['gemini-2.0-flash', 'gemini-1.5-pro', 'gemini-1.5-flash'],
239
+ OpenAI: ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo', 'gpt-3.5-turbo', 'o1', 'o1-mini', 'o3-mini'],
240
+ Anthropic: [
241
+ 'claude-opus-4',
242
+ 'claude-sonnet-4',
243
+ 'claude-3.5-sonnet',
244
+ 'claude-3.5-haiku',
245
+ 'claude-3-opus',
246
+ 'claude-3-sonnet',
247
+ 'claude-3-haiku',
248
+ ],
249
+ Google: ['gemini-2.0-flash', 'gemini-1.5-pro', 'gemini-1.5-flash'],
237
250
  'Local (Free)': ['ollama', 'llama3.2', 'codellama', 'mistral', 'qwen2.5'],
238
251
  };
239
252
 
@@ -244,7 +257,9 @@ async function showPricing(args) {
244
257
  if (p) {
245
258
  const inputStr = p.input === 0 ? 'Free' : `$${p.input.toFixed(2)}`;
246
259
  const outputStr = p.output === 0 ? 'Free' : `$${p.output.toFixed(2)}`;
247
- console.log(` ${chalk.cyan(m.padEnd(20))} In: ${inputStr.padStart(7)} / Out: ${outputStr.padStart(7)}`);
260
+ console.log(
261
+ ` ${chalk.cyan(m.padEnd(20))} In: ${inputStr.padStart(7)} / Out: ${outputStr.padStart(7)}`
262
+ );
248
263
  }
249
264
  }
250
265
  console.log('');
@@ -270,10 +285,12 @@ async function showHistory(tracker, args) {
270
285
  try {
271
286
  const data = await fs.readJSON(path.join(STORAGE_DIR, file));
272
287
  const summary = data.summary;
273
-
288
+
274
289
  console.log(chalk.white(` ${summary.sessionStart}`));
275
290
  console.log(` Duration: ${formatDuration(summary.duration)}`);
276
- console.log(` Requests: ${summary.totalRequests}, Tokens: ${summary.totalTokens.toLocaleString()}`);
291
+ console.log(
292
+ ` Requests: ${summary.totalRequests}, Tokens: ${summary.totalTokens.toLocaleString()}`
293
+ );
277
294
  console.log(` Cost: ${chalk.green('$' + summary.totalCost.toFixed(4))}`);
278
295
  console.log('');
279
296
  } catch (e) {