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-trace.js
CHANGED
|
@@ -723,7 +723,7 @@ program
|
|
|
723
723
|
.option('--no-gaps', 'Exclude gaps analysis')
|
|
724
724
|
.action(async options => {
|
|
725
725
|
try {
|
|
726
|
-
const { CoverageReporter
|
|
726
|
+
const { CoverageReporter } = require('../src/reporters/coverage-report.js');
|
|
727
727
|
|
|
728
728
|
console.log(chalk.bold('\nš Generating Coverage Report\n'));
|
|
729
729
|
|
|
@@ -762,7 +762,7 @@ program
|
|
|
762
762
|
.option('-o, --output <path>', 'Output report path')
|
|
763
763
|
.action(async options => {
|
|
764
764
|
try {
|
|
765
|
-
const { TraceabilityValidator
|
|
765
|
+
const { TraceabilityValidator } = require('../src/validators/traceability-validator.js');
|
|
766
766
|
|
|
767
767
|
const validator = new TraceabilityValidator(process.cwd(), {
|
|
768
768
|
thresholds: {
|
|
@@ -778,14 +778,18 @@ program
|
|
|
778
778
|
const result = await validator.validate();
|
|
779
779
|
|
|
780
780
|
if (options.format === 'json') {
|
|
781
|
-
const output = JSON.stringify(
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
781
|
+
const output = JSON.stringify(
|
|
782
|
+
{
|
|
783
|
+
passed: result.valid,
|
|
784
|
+
coverage: result.coverage,
|
|
785
|
+
gaps: result.gaps,
|
|
786
|
+
violations: result.violations,
|
|
787
|
+
warnings: result.warnings,
|
|
788
|
+
timestamp: new Date().toISOString(),
|
|
789
|
+
},
|
|
790
|
+
null,
|
|
791
|
+
2
|
|
792
|
+
);
|
|
789
793
|
|
|
790
794
|
if (options.output) {
|
|
791
795
|
const fs = require('fs-extra');
|
|
@@ -917,14 +921,17 @@ program
|
|
|
917
921
|
console.log(output);
|
|
918
922
|
}
|
|
919
923
|
} else if (options.format === 'html') {
|
|
920
|
-
const {
|
|
924
|
+
const {
|
|
925
|
+
TraceabilityMatrixReport,
|
|
926
|
+
ReportFormat,
|
|
927
|
+
} = require('../src/reporters/traceability-matrix-report.js');
|
|
921
928
|
const reporter = new TraceabilityMatrixReport(process.cwd(), {
|
|
922
929
|
theme: options.theme,
|
|
923
930
|
interactive: true,
|
|
924
931
|
});
|
|
925
|
-
|
|
932
|
+
|
|
926
933
|
const html = await reporter.generate(result, ReportFormat.HTML);
|
|
927
|
-
|
|
934
|
+
|
|
928
935
|
if (options.output) {
|
|
929
936
|
const fs = require('fs-extra');
|
|
930
937
|
await fs.writeFile(options.output, html, 'utf-8');
|
|
@@ -935,15 +942,26 @@ program
|
|
|
935
942
|
} else {
|
|
936
943
|
// Text format
|
|
937
944
|
console.log(chalk.bold('š Forward Traceability (Requirements ā Tests)'));
|
|
938
|
-
console.log(
|
|
945
|
+
console.log(
|
|
946
|
+
chalk.dim(
|
|
947
|
+
` Complete: ${result.completeness.forwardComplete}/${result.completeness.forwardTotal} (${result.completeness.forwardPercentage}%)`
|
|
948
|
+
)
|
|
949
|
+
);
|
|
939
950
|
console.log();
|
|
940
951
|
|
|
941
952
|
console.log(chalk.bold('š Backward Traceability (Tests ā Requirements)'));
|
|
942
|
-
console.log(
|
|
953
|
+
console.log(
|
|
954
|
+
chalk.dim(
|
|
955
|
+
` Complete: ${result.completeness.backwardComplete}/${result.completeness.backwardTotal} (${result.completeness.backwardPercentage}%)`
|
|
956
|
+
)
|
|
957
|
+
);
|
|
943
958
|
console.log();
|
|
944
959
|
|
|
945
960
|
// Show orphaned items
|
|
946
|
-
const totalOrphaned = Object.values(result.orphaned).reduce(
|
|
961
|
+
const totalOrphaned = Object.values(result.orphaned).reduce(
|
|
962
|
+
(sum, arr) => sum + arr.length,
|
|
963
|
+
0
|
|
964
|
+
);
|
|
947
965
|
if (totalOrphaned > 0) {
|
|
948
966
|
console.log(chalk.yellow.bold(`ā ļø Orphaned Items (${totalOrphaned}):`));
|
|
949
967
|
['requirements', 'design', 'tasks', 'code', 'tests'].forEach(cat => {
|
|
@@ -977,11 +995,14 @@ program
|
|
|
977
995
|
try {
|
|
978
996
|
console.log(chalk.bold('\nš Generating HTML Traceability Report\n'));
|
|
979
997
|
|
|
980
|
-
const {
|
|
998
|
+
const {
|
|
999
|
+
TraceabilityMatrixReport,
|
|
1000
|
+
ReportFormat,
|
|
1001
|
+
} = require('../src/reporters/traceability-matrix-report.js');
|
|
981
1002
|
const analyzer = new TraceabilityAnalyzer(process.cwd());
|
|
982
|
-
|
|
1003
|
+
|
|
983
1004
|
const traceabilityData = await analyzer.analyzeBidirectional();
|
|
984
|
-
|
|
1005
|
+
|
|
985
1006
|
const reporter = new TraceabilityMatrixReport(process.cwd(), {
|
|
986
1007
|
theme: options.theme,
|
|
987
1008
|
interactive: options.interactive !== false,
|
|
@@ -996,9 +1017,17 @@ program
|
|
|
996
1017
|
console.log(chalk.green(`ā HTML report generated: ${options.output}`));
|
|
997
1018
|
console.log();
|
|
998
1019
|
console.log(chalk.dim('Summary:'));
|
|
999
|
-
console.log(
|
|
1000
|
-
|
|
1001
|
-
|
|
1020
|
+
console.log(
|
|
1021
|
+
chalk.dim(` Forward coverage: ${traceabilityData.completeness.forwardPercentage}%`)
|
|
1022
|
+
);
|
|
1023
|
+
console.log(
|
|
1024
|
+
chalk.dim(` Backward coverage: ${traceabilityData.completeness.backwardPercentage}%`)
|
|
1025
|
+
);
|
|
1026
|
+
console.log(
|
|
1027
|
+
chalk.dim(
|
|
1028
|
+
` Orphaned items: ${Object.values(traceabilityData.orphaned).reduce((s, a) => s + a.length, 0)}`
|
|
1029
|
+
)
|
|
1030
|
+
);
|
|
1002
1031
|
console.log();
|
|
1003
1032
|
|
|
1004
1033
|
process.exit(0);
|
package/bin/musubi-validate.js
CHANGED
|
@@ -23,7 +23,6 @@ const {
|
|
|
23
23
|
createOutputGuardrail,
|
|
24
24
|
createSafetyCheckGuardrail,
|
|
25
25
|
GuardrailChain,
|
|
26
|
-
SafetyLevel
|
|
27
26
|
} = require('../src/orchestration/guardrails');
|
|
28
27
|
|
|
29
28
|
const program = new Command();
|
|
@@ -130,7 +129,7 @@ program
|
|
|
130
129
|
try {
|
|
131
130
|
// Get content from argument, file, or stdin
|
|
132
131
|
let inputContent = content;
|
|
133
|
-
|
|
132
|
+
|
|
134
133
|
if (options.file) {
|
|
135
134
|
const fs = require('fs');
|
|
136
135
|
const path = require('path');
|
|
@@ -156,20 +155,20 @@ program
|
|
|
156
155
|
switch (guardrailType) {
|
|
157
156
|
case 'input':
|
|
158
157
|
guardrail = createInputGuardrail('userInput', {
|
|
159
|
-
sanitize: true
|
|
158
|
+
sanitize: true,
|
|
160
159
|
});
|
|
161
160
|
break;
|
|
162
|
-
|
|
161
|
+
|
|
163
162
|
case 'output':
|
|
164
163
|
guardrail = createOutputGuardrail(options.redact ? 'redact' : 'safe');
|
|
165
164
|
break;
|
|
166
|
-
|
|
165
|
+
|
|
167
166
|
case 'safety':
|
|
168
167
|
guardrail = createSafetyCheckGuardrail(options.level, {
|
|
169
|
-
enforceConstitution: options.constitutional
|
|
168
|
+
enforceConstitution: options.constitutional,
|
|
170
169
|
});
|
|
171
170
|
break;
|
|
172
|
-
|
|
171
|
+
|
|
173
172
|
default:
|
|
174
173
|
console.error(chalk.red(`ā Unknown guardrail type: ${guardrailType}`));
|
|
175
174
|
process.exit(1);
|
|
@@ -200,7 +199,7 @@ program
|
|
|
200
199
|
try {
|
|
201
200
|
// Get content
|
|
202
201
|
let inputContent = content;
|
|
203
|
-
|
|
202
|
+
|
|
204
203
|
if (options.file) {
|
|
205
204
|
const fs = require('fs');
|
|
206
205
|
const path = require('path');
|
|
@@ -223,7 +222,7 @@ program
|
|
|
223
222
|
const chain = new GuardrailChain({
|
|
224
223
|
name: 'ValidationChain',
|
|
225
224
|
parallel: options.parallel || false,
|
|
226
|
-
stopOnFirstFailure: options.stopOnFailure || false
|
|
225
|
+
stopOnFirstFailure: options.stopOnFailure || false,
|
|
227
226
|
});
|
|
228
227
|
|
|
229
228
|
// Add default guardrails
|
|
@@ -252,7 +251,7 @@ program
|
|
|
252
251
|
.action(async options => {
|
|
253
252
|
try {
|
|
254
253
|
const validator = new ConstitutionValidator(process.cwd());
|
|
255
|
-
|
|
254
|
+
|
|
256
255
|
console.log(chalk.dim('š Calculating constitutional compliance score...\n'));
|
|
257
256
|
|
|
258
257
|
const [constitutionResults, gatesResults, complexityResults] = await Promise.all([
|
|
@@ -262,12 +261,15 @@ program
|
|
|
262
261
|
]);
|
|
263
262
|
|
|
264
263
|
// Calculate weighted score
|
|
265
|
-
const constitutionScore = constitutionResults.passed
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
Math.max(0, 100 - (
|
|
264
|
+
const constitutionScore = constitutionResults.passed
|
|
265
|
+
? 100
|
|
266
|
+
: Math.max(0, 100 - (constitutionResults.violations?.length || 0) * 10);
|
|
267
|
+
const gatesScore = gatesResults.passed
|
|
268
|
+
? 100
|
|
269
|
+
: Math.max(0, 100 - (gatesResults.violations?.length || 0) * 15);
|
|
270
|
+
const complexityScore = complexityResults.passed
|
|
271
|
+
? 100
|
|
272
|
+
: Math.max(0, 100 - (complexityResults.violations?.length || 0) * 5);
|
|
271
273
|
|
|
272
274
|
// Weighted average: Constitution 50%, Gates 30%, Complexity 20%
|
|
273
275
|
const overallScore = Math.round(
|
|
@@ -284,32 +286,35 @@ program
|
|
|
284
286
|
breakdown: {
|
|
285
287
|
constitution: { score: constitutionScore, weight: '50%' },
|
|
286
288
|
gates: { score: gatesScore, weight: '30%' },
|
|
287
|
-
complexity: { score: complexityScore, weight: '20%' }
|
|
289
|
+
complexity: { score: complexityScore, weight: '20%' },
|
|
288
290
|
},
|
|
289
|
-
timestamp: new Date().toISOString()
|
|
291
|
+
timestamp: new Date().toISOString(),
|
|
290
292
|
};
|
|
291
293
|
|
|
292
294
|
if (options.format === 'json') {
|
|
293
295
|
console.log(JSON.stringify(result, null, 2));
|
|
294
296
|
} else {
|
|
295
|
-
const scoreBar =
|
|
296
|
-
|
|
297
|
-
|
|
297
|
+
const scoreBar =
|
|
298
|
+
'ā'.repeat(Math.floor(overallScore / 10)) +
|
|
299
|
+
'ā'.repeat(10 - Math.floor(overallScore / 10));
|
|
300
|
+
|
|
298
301
|
console.log(chalk.bold('Constitutional Compliance Score\n'));
|
|
299
302
|
console.log(chalk.bold('ā'.repeat(50)));
|
|
300
303
|
console.log(`\n${scoreBar} ${chalk.bold(overallScore)}%\n`);
|
|
301
|
-
|
|
304
|
+
|
|
302
305
|
console.log(chalk.dim('Breakdown:'));
|
|
303
306
|
console.log(` Constitution (50%): ${constitutionScore}%`);
|
|
304
307
|
console.log(` Gates (30%): ${gatesScore}%`);
|
|
305
308
|
console.log(` Complexity (20%): ${complexityScore}%`);
|
|
306
|
-
|
|
309
|
+
|
|
307
310
|
console.log('\n' + chalk.bold('ā'.repeat(50)));
|
|
308
|
-
|
|
311
|
+
|
|
309
312
|
if (passed) {
|
|
310
313
|
console.log(chalk.bold.green(`\nā PASSED (threshold: ${threshold}%)\n`));
|
|
311
314
|
} else {
|
|
312
|
-
console.log(
|
|
315
|
+
console.log(
|
|
316
|
+
chalk.bold.red(`\nā FAILED (threshold: ${threshold}%, got: ${overallScore}%)\n`)
|
|
317
|
+
);
|
|
313
318
|
}
|
|
314
319
|
}
|
|
315
320
|
|
|
@@ -508,10 +513,14 @@ function displayGuardrailResults(result, options) {
|
|
|
508
513
|
if (result.violations && result.violations.length > 0) {
|
|
509
514
|
console.log(chalk.bold.red('Violations:'));
|
|
510
515
|
result.violations.forEach(violation => {
|
|
511
|
-
const severityIcon =
|
|
512
|
-
|
|
513
|
-
const severityColor =
|
|
514
|
-
|
|
516
|
+
const severityIcon =
|
|
517
|
+
violation.severity === 'error' ? 'ā' : violation.severity === 'warning' ? 'ā ' : 'ā¹';
|
|
518
|
+
const severityColor =
|
|
519
|
+
violation.severity === 'error'
|
|
520
|
+
? chalk.red
|
|
521
|
+
: violation.severity === 'warning'
|
|
522
|
+
? chalk.yellow
|
|
523
|
+
: chalk.blue;
|
|
515
524
|
console.log(severityColor(` ${severityIcon} [${violation.code}] ${violation.message}`));
|
|
516
525
|
});
|
|
517
526
|
console.log();
|
|
@@ -562,7 +571,7 @@ function displayChainResults(result, options) {
|
|
|
562
571
|
|
|
563
572
|
// Show individual guardrail results
|
|
564
573
|
console.log(chalk.bold('Individual Results:'));
|
|
565
|
-
result.results.forEach((r,
|
|
574
|
+
result.results.forEach((r, _index) => {
|
|
566
575
|
const icon = r.passed ? chalk.green('ā') : chalk.red('ā');
|
|
567
576
|
console.log(` ${icon} ${r.guardrailName} (${r.executionTimeMs}ms)`);
|
|
568
577
|
});
|
package/bin/musubi-workflow.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* MUSUBI Workflow CLI
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
6
|
* Manage workflow state, transitions, and metrics.
|
|
7
|
-
*
|
|
7
|
+
*
|
|
8
8
|
* Commands:
|
|
9
9
|
* init <feature> - Initialize workflow for a feature
|
|
10
10
|
* status - Show current workflow status
|
|
@@ -32,7 +32,7 @@ const STAGE_ICONS = {
|
|
|
32
32
|
testing: 'š§Ŗ',
|
|
33
33
|
deployment: 'š',
|
|
34
34
|
monitoring: 'š',
|
|
35
|
-
retrospective: 'š'
|
|
35
|
+
retrospective: 'š',
|
|
36
36
|
};
|
|
37
37
|
|
|
38
38
|
/**
|
|
@@ -48,9 +48,11 @@ function formatStage(stage) {
|
|
|
48
48
|
*/
|
|
49
49
|
async function showStatus() {
|
|
50
50
|
const state = await engine.getState();
|
|
51
|
-
|
|
51
|
+
|
|
52
52
|
if (!state) {
|
|
53
|
-
console.log(
|
|
53
|
+
console.log(
|
|
54
|
+
chalk.yellow('\nā ļø No active workflow. Use "musubi-workflow init <feature>" to start.')
|
|
55
|
+
);
|
|
54
56
|
return;
|
|
55
57
|
}
|
|
56
58
|
|
|
@@ -58,18 +60,18 @@ async function showStatus() {
|
|
|
58
60
|
console.log(chalk.white(`Feature: ${chalk.cyan(state.feature)}`));
|
|
59
61
|
console.log(chalk.white(`Current Stage: ${formatStage(state.currentStage)}`));
|
|
60
62
|
console.log(chalk.white(`Started: ${new Date(state.startedAt).toLocaleString()}`));
|
|
61
|
-
|
|
63
|
+
|
|
62
64
|
// Show stage progress
|
|
63
65
|
console.log(chalk.bold('\nš Stage Progress:\n'));
|
|
64
|
-
|
|
66
|
+
|
|
65
67
|
const allStages = Object.keys(WORKFLOW_STAGES);
|
|
66
68
|
const currentIndex = allStages.indexOf(state.currentStage);
|
|
67
|
-
|
|
69
|
+
|
|
68
70
|
allStages.forEach((stage, index) => {
|
|
69
71
|
const data = state.stages[stage];
|
|
70
72
|
let status = '';
|
|
71
73
|
let color = chalk.gray;
|
|
72
|
-
|
|
74
|
+
|
|
73
75
|
if (data?.status === 'completed') {
|
|
74
76
|
status = `ā
Completed (${data.duration})`;
|
|
75
77
|
color = chalk.green;
|
|
@@ -83,7 +85,7 @@ async function showStatus() {
|
|
|
83
85
|
status = 'ā³ Pending';
|
|
84
86
|
color = chalk.gray;
|
|
85
87
|
}
|
|
86
|
-
|
|
88
|
+
|
|
87
89
|
console.log(color(` ${formatStage(stage).padEnd(25)} ${status}`));
|
|
88
90
|
});
|
|
89
91
|
|
|
@@ -102,18 +104,18 @@ async function showStatus() {
|
|
|
102
104
|
*/
|
|
103
105
|
async function showHistory() {
|
|
104
106
|
const state = await engine.getState();
|
|
105
|
-
|
|
107
|
+
|
|
106
108
|
if (!state || !state.history) {
|
|
107
109
|
console.log(chalk.yellow('\nā ļø No workflow history available.'));
|
|
108
110
|
return;
|
|
109
111
|
}
|
|
110
112
|
|
|
111
113
|
console.log(chalk.bold('\nš Workflow History\n'));
|
|
112
|
-
|
|
114
|
+
|
|
113
115
|
state.history.forEach(event => {
|
|
114
116
|
const time = new Date(event.timestamp).toLocaleString();
|
|
115
117
|
let desc = '';
|
|
116
|
-
|
|
118
|
+
|
|
117
119
|
switch (event.action) {
|
|
118
120
|
case 'workflow-started':
|
|
119
121
|
desc = `Started workflow for "${event.feature}" at ${formatStage(event.stage)}`;
|
|
@@ -132,7 +134,7 @@ async function showHistory() {
|
|
|
132
134
|
default:
|
|
133
135
|
desc = event.action;
|
|
134
136
|
}
|
|
135
|
-
|
|
137
|
+
|
|
136
138
|
console.log(chalk.white(` ${chalk.gray(time)} ${desc}`));
|
|
137
139
|
});
|
|
138
140
|
}
|
|
@@ -142,9 +144,9 @@ async function showHistory() {
|
|
|
142
144
|
*/
|
|
143
145
|
async function showMetrics() {
|
|
144
146
|
const summary = await engine.getMetricsSummary();
|
|
145
|
-
|
|
147
|
+
|
|
146
148
|
console.log(chalk.bold('\nš Workflow Metrics Summary\n'));
|
|
147
|
-
|
|
149
|
+
|
|
148
150
|
if (summary.message) {
|
|
149
151
|
console.log(chalk.yellow(` ${summary.message}`));
|
|
150
152
|
return;
|
|
@@ -154,7 +156,7 @@ async function showMetrics() {
|
|
|
154
156
|
console.log(chalk.white(` Completed: ${summary.completedWorkflows}`));
|
|
155
157
|
console.log(chalk.white(` Stage Transitions: ${summary.stageTransitions}`));
|
|
156
158
|
console.log(chalk.white(` Feedback Loops: ${summary.feedbackLoops}`));
|
|
157
|
-
|
|
159
|
+
|
|
158
160
|
if (summary.averageDuration) {
|
|
159
161
|
console.log(chalk.white(` Average Duration: ${summary.averageDuration}`));
|
|
160
162
|
}
|
|
@@ -190,10 +192,7 @@ program
|
|
|
190
192
|
}
|
|
191
193
|
});
|
|
192
194
|
|
|
193
|
-
program
|
|
194
|
-
.command('status')
|
|
195
|
-
.description('Show current workflow status')
|
|
196
|
-
.action(showStatus);
|
|
195
|
+
program.command('status').description('Show current workflow status').action(showStatus);
|
|
197
196
|
|
|
198
197
|
program
|
|
199
198
|
.command('next [stage]')
|
|
@@ -232,7 +231,9 @@ program
|
|
|
232
231
|
try {
|
|
233
232
|
await engine.recordFeedbackLoop(from, to, options.reason);
|
|
234
233
|
await engine.transitionTo(to, `Feedback: ${options.reason}`);
|
|
235
|
-
console.log(
|
|
234
|
+
console.log(
|
|
235
|
+
chalk.yellow(`\nš Feedback loop recorded: ${formatStage(from)} ā ${formatStage(to)}`)
|
|
236
|
+
);
|
|
236
237
|
console.log(chalk.gray(` Reason: ${options.reason}`));
|
|
237
238
|
} catch (error) {
|
|
238
239
|
console.error(chalk.red(`\nā Error: ${error.message}`));
|
|
@@ -244,21 +245,25 @@ program
|
|
|
244
245
|
.command('complete')
|
|
245
246
|
.description('Complete the current workflow')
|
|
246
247
|
.option('-n, --notes <notes>', 'Completion notes')
|
|
247
|
-
.action(async
|
|
248
|
+
.action(async options => {
|
|
248
249
|
try {
|
|
249
250
|
const summary = await engine.completeWorkflow(options.notes);
|
|
250
|
-
|
|
251
|
+
|
|
251
252
|
console.log(chalk.green('\nā
Workflow Completed!\n'));
|
|
252
253
|
console.log(chalk.bold('š Summary:'));
|
|
253
254
|
console.log(chalk.white(` Feature: ${summary.feature}`));
|
|
254
255
|
console.log(chalk.white(` Total Duration: ${summary.totalDuration}`));
|
|
255
256
|
console.log(chalk.white(` Stages: ${summary.stages.length}`));
|
|
256
257
|
console.log(chalk.white(` Feedback Loops: ${summary.feedbackLoops}`));
|
|
257
|
-
|
|
258
|
+
|
|
258
259
|
if (summary.stages.length > 0) {
|
|
259
260
|
console.log(chalk.bold('\nš Stage Breakdown:'));
|
|
260
261
|
summary.stages.forEach(s => {
|
|
261
|
-
console.log(
|
|
262
|
+
console.log(
|
|
263
|
+
chalk.white(
|
|
264
|
+
` ${formatStage(s.name).padEnd(25)} ${s.duration} (${s.attempts} attempt${s.attempts > 1 ? 's' : ''})`
|
|
265
|
+
)
|
|
266
|
+
);
|
|
262
267
|
});
|
|
263
268
|
}
|
|
264
269
|
} catch (error) {
|
|
@@ -267,14 +272,8 @@ program
|
|
|
267
272
|
}
|
|
268
273
|
});
|
|
269
274
|
|
|
270
|
-
program
|
|
271
|
-
.command('history')
|
|
272
|
-
.description('Show workflow history')
|
|
273
|
-
.action(showHistory);
|
|
275
|
+
program.command('history').description('Show workflow history').action(showHistory);
|
|
274
276
|
|
|
275
|
-
program
|
|
276
|
-
.command('metrics')
|
|
277
|
-
.description('Show workflow metrics summary')
|
|
278
|
-
.action(showMetrics);
|
|
277
|
+
program.command('metrics').description('Show workflow metrics summary').action(showMetrics);
|
|
279
278
|
|
|
280
279
|
program.parse();
|
package/bin/musubi.js
CHANGED
|
@@ -95,6 +95,32 @@ aliasFlags.forEach(flag => {
|
|
|
95
95
|
initCommand.option(`--${flag}`, `Select agent: ${flag}`);
|
|
96
96
|
});
|
|
97
97
|
|
|
98
|
+
// Add spec option for external specification reference
|
|
99
|
+
initCommand.option(
|
|
100
|
+
'--spec <source>',
|
|
101
|
+
'Reference external specification (URL, file path, or git repo)'
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
// Add reference option for GitHub repository references (can be specified multiple times)
|
|
105
|
+
initCommand.option(
|
|
106
|
+
'--reference <repo>',
|
|
107
|
+
'Reference GitHub repository for improvements (can be specified multiple times)',
|
|
108
|
+
(value, previous) => (previous ? [...previous, value] : [value]),
|
|
109
|
+
[]
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
// Shorthand aliases for reference
|
|
113
|
+
initCommand.option(
|
|
114
|
+
'-r, --ref <repo>',
|
|
115
|
+
'Alias for --reference',
|
|
116
|
+
(value, previous) => (previous ? [...previous, value] : [value]),
|
|
117
|
+
[]
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
// Add workspace/monorepo option
|
|
121
|
+
initCommand.option('--workspace', 'Initialize as workspace/monorepo project');
|
|
122
|
+
initCommand.option('--template <name>', 'Use project template (e.g., microservices, clean-arch)');
|
|
123
|
+
|
|
98
124
|
initCommand.action(async options => {
|
|
99
125
|
const agentKey = detectAgentFromFlags(options);
|
|
100
126
|
const agent = getAgentDefinition(agentKey);
|
|
@@ -102,9 +128,20 @@ initCommand.action(async options => {
|
|
|
102
128
|
console.log(chalk.blue(`Initializing MUSUBI for ${chalk.bold(agent.label)}...`));
|
|
103
129
|
console.log(chalk.gray(`Description: ${agent.description}\n`));
|
|
104
130
|
|
|
105
|
-
//
|
|
131
|
+
// Merge --reference and --ref options
|
|
132
|
+
const references = [...(options.reference || []), ...(options.ref || [])];
|
|
133
|
+
|
|
134
|
+
// Extract init-specific options
|
|
135
|
+
const initOptions = {
|
|
136
|
+
spec: options.spec,
|
|
137
|
+
workspace: options.workspace,
|
|
138
|
+
template: options.template,
|
|
139
|
+
references: references.length > 0 ? references : undefined,
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
// Delegate to musubi-init.js with agent info and options
|
|
106
143
|
const initMain = require('./musubi-init.js');
|
|
107
|
-
await initMain(agent, agentKey);
|
|
144
|
+
await initMain(agent, agentKey, initOptions);
|
|
108
145
|
});
|
|
109
146
|
|
|
110
147
|
// ============================================================================
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "musubi-sdd",
|
|
3
|
-
"version": "5.1
|
|
3
|
+
"version": "5.6.1",
|
|
4
4
|
"description": "Ultimate Specification Driven Development Tool with 27 Agents for 7 AI Coding Platforms + MCP Integration (Claude Code, GitHub Copilot, Cursor, Gemini CLI, Windsurf, Codex, Qwen Code)",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|