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.
- package/README.ja.md +106 -48
- package/README.md +110 -32
- package/bin/musubi-analyze.js +74 -67
- package/bin/musubi-browser.js +27 -26
- package/bin/musubi-change.js +48 -47
- package/bin/musubi-checkpoint.js +10 -7
- package/bin/musubi-convert.js +25 -25
- package/bin/musubi-costs.js +27 -10
- package/bin/musubi-gui.js +52 -46
- package/bin/musubi-init.js +1952 -10
- package/bin/musubi-orchestrate.js +327 -239
- package/bin/musubi-remember.js +69 -56
- package/bin/musubi-resolve.js +53 -45
- package/bin/musubi-trace.js +51 -22
- package/bin/musubi-validate.js +39 -30
- package/bin/musubi-workflow.js +33 -34
- package/bin/musubi.js +39 -2
- package/package.json +1 -1
- package/src/agents/agent-loop.js +94 -95
- package/src/agents/agentic/code-generator.js +119 -109
- package/src/agents/agentic/code-reviewer.js +105 -108
- package/src/agents/agentic/index.js +4 -4
- package/src/agents/browser/action-executor.js +13 -13
- package/src/agents/browser/ai-comparator.js +11 -10
- package/src/agents/browser/context-manager.js +6 -6
- package/src/agents/browser/index.js +5 -5
- package/src/agents/browser/nl-parser.js +31 -46
- package/src/agents/browser/screenshot.js +2 -2
- package/src/agents/browser/test-generator.js +6 -4
- package/src/agents/function-tool.js +71 -65
- package/src/agents/index.js +7 -7
- package/src/agents/schema-generator.js +98 -94
- package/src/analyzers/ast-extractor.js +158 -146
- package/src/analyzers/codegraph-auto-update.js +858 -0
- package/src/analyzers/complexity-analyzer.js +536 -0
- package/src/analyzers/context-optimizer.js +241 -126
- package/src/analyzers/impact-analyzer.js +1 -1
- package/src/analyzers/large-project-analyzer.js +766 -0
- package/src/analyzers/repository-map.js +77 -81
- package/src/analyzers/security-analyzer.js +19 -11
- package/src/analyzers/stuck-detector.js +19 -17
- package/src/converters/index.js +78 -57
- package/src/converters/ir/types.js +12 -12
- package/src/converters/parsers/musubi-parser.js +134 -126
- package/src/converters/parsers/openapi-parser.js +70 -53
- package/src/converters/parsers/speckit-parser.js +239 -175
- package/src/converters/writers/musubi-writer.js +123 -118
- package/src/converters/writers/speckit-writer.js +124 -113
- package/src/generators/rust-migration-generator.js +512 -0
- package/src/gui/public/index.html +1365 -1211
- package/src/gui/server.js +41 -40
- package/src/gui/services/file-watcher.js +23 -8
- package/src/gui/services/project-scanner.js +26 -20
- package/src/gui/services/replanning-service.js +27 -23
- package/src/gui/services/traceability-service.js +8 -8
- package/src/gui/services/workflow-service.js +14 -7
- package/src/index.js +151 -0
- package/src/integrations/cicd.js +90 -104
- package/src/integrations/codegraph-mcp.js +643 -0
- package/src/integrations/documentation.js +142 -103
- package/src/integrations/examples.js +95 -80
- package/src/integrations/github-client.js +17 -17
- package/src/integrations/index.js +5 -5
- package/src/integrations/mcp/index.js +21 -21
- package/src/integrations/mcp/mcp-context-provider.js +76 -78
- package/src/integrations/mcp/mcp-discovery.js +74 -72
- package/src/integrations/mcp/mcp-tool-registry.js +99 -94
- package/src/integrations/mcp-connector.js +70 -66
- package/src/integrations/platforms.js +50 -49
- package/src/integrations/tool-discovery.js +37 -31
- package/src/llm-providers/anthropic-provider.js +11 -11
- package/src/llm-providers/base-provider.js +16 -18
- package/src/llm-providers/copilot-provider.js +22 -19
- package/src/llm-providers/index.js +26 -25
- package/src/llm-providers/ollama-provider.js +11 -11
- package/src/llm-providers/openai-provider.js +12 -12
- package/src/managers/agent-memory.js +36 -24
- package/src/managers/checkpoint-manager.js +4 -8
- package/src/managers/delta-spec.js +19 -19
- package/src/managers/index.js +13 -4
- package/src/managers/memory-condenser.js +35 -45
- package/src/managers/repo-skill-manager.js +57 -31
- package/src/managers/skill-loader.js +25 -22
- package/src/managers/skill-tools.js +36 -72
- package/src/managers/workflow.js +30 -22
- package/src/monitoring/cost-tracker.js +48 -46
- package/src/monitoring/incident-manager.js +116 -106
- package/src/monitoring/index.js +144 -134
- package/src/monitoring/observability.js +75 -62
- package/src/monitoring/quality-dashboard.js +45 -41
- package/src/monitoring/release-manager.js +63 -53
- package/src/orchestration/agent-skill-binding.js +39 -47
- package/src/orchestration/error-handler.js +65 -107
- package/src/orchestration/guardrails/base-guardrail.js +26 -24
- package/src/orchestration/guardrails/guardrail-rules.js +50 -64
- package/src/orchestration/guardrails/index.js +5 -5
- package/src/orchestration/guardrails/input-guardrail.js +58 -45
- package/src/orchestration/guardrails/output-guardrail.js +104 -81
- package/src/orchestration/guardrails/safety-check.js +79 -79
- package/src/orchestration/index.js +38 -55
- package/src/orchestration/mcp-tool-adapters.js +96 -99
- package/src/orchestration/orchestration-engine.js +21 -21
- package/src/orchestration/pattern-registry.js +60 -45
- package/src/orchestration/patterns/auto.js +34 -47
- package/src/orchestration/patterns/group-chat.js +59 -65
- package/src/orchestration/patterns/handoff.js +67 -65
- package/src/orchestration/patterns/human-in-loop.js +51 -72
- package/src/orchestration/patterns/nested.js +25 -40
- package/src/orchestration/patterns/sequential.js +35 -34
- package/src/orchestration/patterns/swarm.js +63 -56
- package/src/orchestration/patterns/triage.js +150 -109
- package/src/orchestration/reasoning/index.js +9 -9
- package/src/orchestration/reasoning/planning-engine.js +143 -140
- package/src/orchestration/reasoning/reasoning-engine.js +206 -144
- package/src/orchestration/reasoning/self-correction.js +121 -128
- package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
- package/src/orchestration/replanning/alternative-generator.js +37 -42
- package/src/orchestration/replanning/config.js +63 -59
- package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
- package/src/orchestration/replanning/index.js +24 -20
- package/src/orchestration/replanning/plan-evaluator.js +49 -50
- package/src/orchestration/replanning/plan-monitor.js +32 -28
- package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
- package/src/orchestration/replanning/replan-history.js +33 -26
- package/src/orchestration/replanning/replanning-engine.js +106 -108
- package/src/orchestration/skill-executor.js +107 -109
- package/src/orchestration/skill-registry.js +85 -89
- package/src/orchestration/workflow-examples.js +228 -231
- package/src/orchestration/workflow-executor.js +65 -68
- package/src/orchestration/workflow-orchestrator.js +72 -73
- package/src/phase4-integration.js +47 -40
- package/src/phase5-integration.js +89 -30
- package/src/reporters/coverage-report.js +82 -30
- package/src/reporters/hierarchical-reporter.js +498 -0
- package/src/reporters/traceability-matrix-report.js +29 -20
- package/src/resolvers/issue-resolver.js +43 -31
- package/src/steering/advanced-validation.js +133 -124
- package/src/steering/auto-updater.js +60 -73
- package/src/steering/index.js +6 -6
- package/src/steering/quality-metrics.js +41 -35
- package/src/steering/steering-auto-update.js +83 -86
- package/src/steering/steering-validator.js +98 -106
- package/src/steering/template-constraints.js +53 -54
- package/src/templates/agents/claude-code/CLAUDE.md +32 -32
- package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
- package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
- package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
- package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
- package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
- package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
- package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
- package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
- package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
- package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
- package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
- package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
- package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
- package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
- package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
- package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
- package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
- package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
- package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
- package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
- package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
- package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
- package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
- package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
- package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
- package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
- package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
- package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
- package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
- package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
- package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
- package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
- package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
- package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
- package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
- package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
- package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
- package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
- package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
- package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
- package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
- package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
- package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
- package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
- package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
- package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
- package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
- package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
- package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
- package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
- package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
- package/src/templates/agents/codex/AGENTS.md +74 -42
- package/src/templates/agents/cursor/AGENTS.md +74 -42
- package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
- package/src/templates/agents/github-copilot/AGENTS.md +83 -51
- package/src/templates/agents/qwen-code/QWEN.md +74 -42
- package/src/templates/agents/windsurf/AGENTS.md +74 -42
- package/src/templates/architectures/README.md +41 -0
- package/src/templates/architectures/clean-architecture/README.md +113 -0
- package/src/templates/architectures/event-driven/README.md +162 -0
- package/src/templates/architectures/hexagonal/README.md +130 -0
- package/src/templates/index.js +6 -1
- package/src/templates/locale-manager.js +16 -16
- package/src/templates/shared/delta-spec-template.md +20 -13
- package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
- package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
- package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
- package/src/templates/shared/steering/structure.md +95 -0
- package/src/templates/skills/browser-agent.md +21 -16
- package/src/templates/skills/web-gui.md +8 -0
- package/src/templates/template-constraints.js +50 -53
- package/src/validators/advanced-validation.js +30 -36
- package/src/validators/constitutional-validator.js +77 -73
- package/src/validators/critic-system.js +49 -59
- package/src/validators/delta-format.js +59 -55
- package/src/validators/traceability-validator.js +7 -11
package/bin/musubi-change.js
CHANGED
|
@@ -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
|
|
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(
|
|
347
|
-
|
|
348
|
-
|
|
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(
|
|
355
|
-
|
|
356
|
-
|
|
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
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
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,
|
|
501
|
+
.action(async (changeId, _options) => {
|
|
497
502
|
try {
|
|
498
503
|
const workspaceRoot = process.cwd();
|
|
499
504
|
const deltaManager = new DeltaSpecManager(workspaceRoot);
|
|
500
505
|
|
|
501
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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:'));
|
package/bin/musubi-checkpoint.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
const { Command } = require('commander');
|
|
11
11
|
const chalk = require('chalk');
|
|
12
|
-
const
|
|
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
|
|
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
|
|
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(
|
|
156
|
-
|
|
157
|
-
|
|
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
|
|
342
|
+
.action(async options => {
|
|
340
343
|
try {
|
|
341
344
|
const manager = getManager(options);
|
|
342
345
|
await manager.initialize();
|
package/bin/musubi-convert.js
CHANGED
|
@@ -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
|
|
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(
|
|
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
|
}
|
package/bin/musubi-costs.js
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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(
|
|
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(
|
|
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) {
|