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
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Release Manager - Release coordination and management
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Provides release management capabilities:
|
|
5
5
|
* - Release planning and tracking
|
|
6
6
|
* - Feature flag management
|
|
7
7
|
* - Rollback procedures
|
|
8
8
|
* - Release notes generation
|
|
9
|
-
*
|
|
9
|
+
*
|
|
10
10
|
* Part of MUSUBI v5.0.0 - Production Readiness
|
|
11
|
-
*
|
|
11
|
+
*
|
|
12
12
|
* @module monitoring/release-manager
|
|
13
13
|
* @version 1.0.0
|
|
14
|
-
*
|
|
14
|
+
*
|
|
15
15
|
* @traceability
|
|
16
16
|
* - Requirement: REQ-P5-003 (Release Automation)
|
|
17
17
|
* - Design: docs/design/tdd-musubi-v5.0.0.md#3.3
|
|
@@ -32,7 +32,7 @@ const ReleaseState = {
|
|
|
32
32
|
PRODUCTION: 'production',
|
|
33
33
|
ROLLBACK: 'rollback',
|
|
34
34
|
COMPLETED: 'completed',
|
|
35
|
-
CANCELLED: 'cancelled'
|
|
35
|
+
CANCELLED: 'cancelled',
|
|
36
36
|
};
|
|
37
37
|
|
|
38
38
|
/**
|
|
@@ -43,7 +43,7 @@ const ReleaseType = {
|
|
|
43
43
|
MINOR: 'minor',
|
|
44
44
|
PATCH: 'patch',
|
|
45
45
|
HOTFIX: 'hotfix',
|
|
46
|
-
CANARY: 'canary'
|
|
46
|
+
CANARY: 'canary',
|
|
47
47
|
};
|
|
48
48
|
|
|
49
49
|
/**
|
|
@@ -53,7 +53,7 @@ const FeatureFlagStatus = {
|
|
|
53
53
|
ENABLED: 'enabled',
|
|
54
54
|
DISABLED: 'disabled',
|
|
55
55
|
PERCENTAGE: 'percentage',
|
|
56
|
-
USER_LIST: 'user-list'
|
|
56
|
+
USER_LIST: 'user-list',
|
|
57
57
|
};
|
|
58
58
|
|
|
59
59
|
/**
|
|
@@ -71,35 +71,35 @@ class Release {
|
|
|
71
71
|
this.createdAt = options.createdAt || new Date();
|
|
72
72
|
this.updatedAt = options.updatedAt || new Date();
|
|
73
73
|
this.completedAt = null;
|
|
74
|
-
|
|
74
|
+
|
|
75
75
|
this.features = options.features || [];
|
|
76
76
|
this.bugFixes = options.bugFixes || [];
|
|
77
77
|
this.breakingChanges = options.breakingChanges || [];
|
|
78
78
|
this.dependencies = options.dependencies || [];
|
|
79
|
-
|
|
79
|
+
|
|
80
80
|
this.rolloutStrategy = options.rolloutStrategy || {
|
|
81
81
|
type: 'percentage',
|
|
82
82
|
stages: [
|
|
83
83
|
{ percentage: 1, duration: '1h' },
|
|
84
84
|
{ percentage: 10, duration: '2h' },
|
|
85
85
|
{ percentage: 50, duration: '4h' },
|
|
86
|
-
{ percentage: 100, duration: null }
|
|
87
|
-
]
|
|
86
|
+
{ percentage: 100, duration: null },
|
|
87
|
+
],
|
|
88
88
|
};
|
|
89
|
-
|
|
89
|
+
|
|
90
90
|
this.rollbackPlan = options.rollbackPlan || {
|
|
91
91
|
automatic: true,
|
|
92
92
|
triggers: ['error_rate > 5%', 'latency_p99 > 2s'],
|
|
93
|
-
procedure: []
|
|
93
|
+
procedure: [],
|
|
94
94
|
};
|
|
95
|
-
|
|
95
|
+
|
|
96
96
|
this.metrics = {
|
|
97
97
|
errorsBefore: null,
|
|
98
98
|
errorsAfter: null,
|
|
99
99
|
latencyBefore: null,
|
|
100
|
-
latencyAfter: null
|
|
100
|
+
latencyAfter: null,
|
|
101
101
|
};
|
|
102
|
-
|
|
102
|
+
|
|
103
103
|
this.history = [];
|
|
104
104
|
this._addHistory('created', { version: this.version });
|
|
105
105
|
}
|
|
@@ -111,13 +111,22 @@ class Release {
|
|
|
111
111
|
const validTransitions = {
|
|
112
112
|
[ReleaseState.PLANNING]: [ReleaseState.DEVELOPMENT, ReleaseState.CANCELLED],
|
|
113
113
|
[ReleaseState.DEVELOPMENT]: [ReleaseState.TESTING, ReleaseState.CANCELLED],
|
|
114
|
-
[ReleaseState.TESTING]: [
|
|
115
|
-
|
|
114
|
+
[ReleaseState.TESTING]: [
|
|
115
|
+
ReleaseState.STAGING,
|
|
116
|
+
ReleaseState.DEVELOPMENT,
|
|
117
|
+
ReleaseState.CANCELLED,
|
|
118
|
+
],
|
|
119
|
+
[ReleaseState.STAGING]: [
|
|
120
|
+
ReleaseState.CANARY,
|
|
121
|
+
ReleaseState.PRODUCTION,
|
|
122
|
+
ReleaseState.TESTING,
|
|
123
|
+
ReleaseState.CANCELLED,
|
|
124
|
+
],
|
|
116
125
|
[ReleaseState.CANARY]: [ReleaseState.PRODUCTION, ReleaseState.ROLLBACK],
|
|
117
126
|
[ReleaseState.PRODUCTION]: [ReleaseState.COMPLETED, ReleaseState.ROLLBACK],
|
|
118
127
|
[ReleaseState.ROLLBACK]: [ReleaseState.TESTING, ReleaseState.CANCELLED],
|
|
119
128
|
[ReleaseState.COMPLETED]: [],
|
|
120
|
-
[ReleaseState.CANCELLED]: []
|
|
129
|
+
[ReleaseState.CANCELLED]: [],
|
|
121
130
|
};
|
|
122
131
|
|
|
123
132
|
const allowed = validTransitions[this.state] || [];
|
|
@@ -128,15 +137,15 @@ class Release {
|
|
|
128
137
|
const previousState = this.state;
|
|
129
138
|
this.state = newState;
|
|
130
139
|
this.updatedAt = new Date();
|
|
131
|
-
|
|
140
|
+
|
|
132
141
|
if (newState === ReleaseState.COMPLETED) {
|
|
133
142
|
this.completedAt = new Date();
|
|
134
143
|
}
|
|
135
144
|
|
|
136
|
-
this._addHistory('transition', {
|
|
137
|
-
from: previousState,
|
|
145
|
+
this._addHistory('transition', {
|
|
146
|
+
from: previousState,
|
|
138
147
|
to: newState,
|
|
139
|
-
...metadata
|
|
148
|
+
...metadata,
|
|
140
149
|
});
|
|
141
150
|
|
|
142
151
|
return this;
|
|
@@ -151,7 +160,7 @@ class Release {
|
|
|
151
160
|
title: feature.title,
|
|
152
161
|
description: feature.description || '',
|
|
153
162
|
jiraId: feature.jiraId || null,
|
|
154
|
-
breaking: feature.breaking || false
|
|
163
|
+
breaking: feature.breaking || false,
|
|
155
164
|
});
|
|
156
165
|
this._addHistory('featureAdded', { feature: feature.title });
|
|
157
166
|
return this;
|
|
@@ -166,7 +175,7 @@ class Release {
|
|
|
166
175
|
title: bugFix.title,
|
|
167
176
|
description: bugFix.description || '',
|
|
168
177
|
jiraId: bugFix.jiraId || null,
|
|
169
|
-
severity: bugFix.severity || 'medium'
|
|
178
|
+
severity: bugFix.severity || 'medium',
|
|
170
179
|
});
|
|
171
180
|
this._addHistory('bugFixAdded', { bugFix: bugFix.title });
|
|
172
181
|
return this;
|
|
@@ -181,7 +190,7 @@ class Release {
|
|
|
181
190
|
date: this.completedAt || new Date(),
|
|
182
191
|
features: this.features,
|
|
183
192
|
bugFixes: this.bugFixes,
|
|
184
|
-
breakingChanges: this.breakingChanges
|
|
193
|
+
breakingChanges: this.breakingChanges,
|
|
185
194
|
};
|
|
186
195
|
|
|
187
196
|
if (format === 'markdown') {
|
|
@@ -247,7 +256,7 @@ class Release {
|
|
|
247
256
|
this.history.push({
|
|
248
257
|
action,
|
|
249
258
|
timestamp: new Date(),
|
|
250
|
-
data
|
|
259
|
+
data,
|
|
251
260
|
});
|
|
252
261
|
}
|
|
253
262
|
|
|
@@ -276,7 +285,7 @@ class Release {
|
|
|
276
285
|
breakingChanges: this.breakingChanges,
|
|
277
286
|
rolloutStrategy: this.rolloutStrategy,
|
|
278
287
|
rollbackPlan: this.rollbackPlan,
|
|
279
|
-
history: this.history
|
|
288
|
+
history: this.history,
|
|
280
289
|
};
|
|
281
290
|
}
|
|
282
291
|
}
|
|
@@ -337,18 +346,19 @@ class FeatureFlag {
|
|
|
337
346
|
switch (this.status) {
|
|
338
347
|
case FeatureFlagStatus.ENABLED:
|
|
339
348
|
return true;
|
|
340
|
-
|
|
349
|
+
|
|
341
350
|
case FeatureFlagStatus.DISABLED:
|
|
342
351
|
return false;
|
|
343
|
-
|
|
352
|
+
|
|
344
353
|
case FeatureFlagStatus.USER_LIST:
|
|
345
354
|
return this.userList.includes(userId);
|
|
346
|
-
|
|
347
|
-
case FeatureFlagStatus.PERCENTAGE:
|
|
355
|
+
|
|
356
|
+
case FeatureFlagStatus.PERCENTAGE: {
|
|
348
357
|
// Consistent hashing based on userId
|
|
349
358
|
const hash = this._hashString(`${this.key}:${userId}`);
|
|
350
|
-
return
|
|
351
|
-
|
|
359
|
+
return hash % 100 < this.percentage;
|
|
360
|
+
}
|
|
361
|
+
|
|
352
362
|
default:
|
|
353
363
|
return false;
|
|
354
364
|
}
|
|
@@ -362,7 +372,7 @@ class FeatureFlag {
|
|
|
362
372
|
let hash = 0;
|
|
363
373
|
for (let i = 0; i < str.length; i++) {
|
|
364
374
|
const char = str.charCodeAt(i);
|
|
365
|
-
hash = (
|
|
375
|
+
hash = (hash << 5) - hash + char;
|
|
366
376
|
hash = hash & hash;
|
|
367
377
|
}
|
|
368
378
|
return Math.abs(hash);
|
|
@@ -378,7 +388,7 @@ class FeatureFlag {
|
|
|
378
388
|
userList: this.userList,
|
|
379
389
|
createdAt: this.createdAt,
|
|
380
390
|
updatedAt: this.updatedAt,
|
|
381
|
-
metadata: this.metadata
|
|
391
|
+
metadata: this.metadata,
|
|
382
392
|
};
|
|
383
393
|
}
|
|
384
394
|
}
|
|
@@ -393,7 +403,7 @@ class ReleaseManager extends EventEmitter {
|
|
|
393
403
|
this.featureFlags = new Map();
|
|
394
404
|
this.options = {
|
|
395
405
|
autoGenerateNotes: options.autoGenerateNotes !== false,
|
|
396
|
-
...options
|
|
406
|
+
...options,
|
|
397
407
|
};
|
|
398
408
|
}
|
|
399
409
|
|
|
@@ -431,14 +441,14 @@ class ReleaseManager extends EventEmitter {
|
|
|
431
441
|
*/
|
|
432
442
|
listReleases(filter = {}) {
|
|
433
443
|
let releases = [...this.releases.values()];
|
|
434
|
-
|
|
444
|
+
|
|
435
445
|
if (filter.state) {
|
|
436
446
|
releases = releases.filter(r => r.state === filter.state);
|
|
437
447
|
}
|
|
438
448
|
if (filter.type) {
|
|
439
449
|
releases = releases.filter(r => r.type === filter.type);
|
|
440
450
|
}
|
|
441
|
-
|
|
451
|
+
|
|
442
452
|
return releases.map(r => r.toJSON());
|
|
443
453
|
}
|
|
444
454
|
|
|
@@ -450,7 +460,7 @@ class ReleaseManager extends EventEmitter {
|
|
|
450
460
|
if (!release) {
|
|
451
461
|
throw new Error(`Release not found: ${releaseId}`);
|
|
452
462
|
}
|
|
453
|
-
|
|
463
|
+
|
|
454
464
|
release.transitionTo(newState, metadata);
|
|
455
465
|
this.emit('releaseTransitioned', { release, newState });
|
|
456
466
|
return release;
|
|
@@ -486,7 +496,7 @@ class ReleaseManager extends EventEmitter {
|
|
|
486
496
|
isFeatureEnabled(flagKey, userId = null) {
|
|
487
497
|
const flag = this.featureFlags.get(flagKey);
|
|
488
498
|
if (!flag) return false;
|
|
489
|
-
|
|
499
|
+
|
|
490
500
|
if (userId) {
|
|
491
501
|
return flag.isEnabledFor(userId);
|
|
492
502
|
}
|
|
@@ -541,41 +551,41 @@ class ReleaseManager extends EventEmitter {
|
|
|
541
551
|
order: 1,
|
|
542
552
|
action: 'notify',
|
|
543
553
|
description: 'Notify team of rollback initiation',
|
|
544
|
-
command: null
|
|
554
|
+
command: null,
|
|
545
555
|
},
|
|
546
556
|
{
|
|
547
557
|
order: 2,
|
|
548
558
|
action: 'disable-flags',
|
|
549
559
|
description: 'Disable all new feature flags',
|
|
550
|
-
command: 'musubi release disable-flags --version ' + release.version
|
|
560
|
+
command: 'musubi release disable-flags --version ' + release.version,
|
|
551
561
|
},
|
|
552
562
|
{
|
|
553
563
|
order: 3,
|
|
554
564
|
action: 'scale-down',
|
|
555
565
|
description: 'Scale down new deployment',
|
|
556
|
-
command: 'kubectl scale deployment app-v' + release.version + ' --replicas=0'
|
|
566
|
+
command: 'kubectl scale deployment app-v' + release.version + ' --replicas=0',
|
|
557
567
|
},
|
|
558
568
|
{
|
|
559
569
|
order: 4,
|
|
560
570
|
action: 'traffic-shift',
|
|
561
571
|
description: 'Shift traffic to previous version',
|
|
562
|
-
command: 'kubectl rollout undo deployment/app'
|
|
572
|
+
command: 'kubectl rollout undo deployment/app',
|
|
563
573
|
},
|
|
564
574
|
{
|
|
565
575
|
order: 5,
|
|
566
576
|
action: 'verify',
|
|
567
577
|
description: 'Verify rollback success',
|
|
568
|
-
command: 'curl -f http://app/health'
|
|
578
|
+
command: 'curl -f http://app/health',
|
|
569
579
|
},
|
|
570
580
|
{
|
|
571
581
|
order: 6,
|
|
572
582
|
action: 'notify-complete',
|
|
573
583
|
description: 'Notify team of rollback completion',
|
|
574
|
-
command: null
|
|
575
|
-
}
|
|
584
|
+
command: null,
|
|
585
|
+
},
|
|
576
586
|
],
|
|
577
587
|
automaticTriggers: release.rollbackPlan.triggers,
|
|
578
|
-
estimatedDuration: '5-10 minutes'
|
|
588
|
+
estimatedDuration: '5-10 minutes',
|
|
579
589
|
};
|
|
580
590
|
}
|
|
581
591
|
|
|
@@ -593,7 +603,7 @@ class ReleaseManager extends EventEmitter {
|
|
|
593
603
|
totalFeatureFlags: flags.length,
|
|
594
604
|
enabledFlags: flags.filter(f => f.status === FeatureFlagStatus.ENABLED).length,
|
|
595
605
|
disabledFlags: flags.filter(f => f.status === FeatureFlagStatus.DISABLED).length,
|
|
596
|
-
percentageFlags: flags.filter(f => f.status === FeatureFlagStatus.PERCENTAGE).length
|
|
606
|
+
percentageFlags: flags.filter(f => f.status === FeatureFlagStatus.PERCENTAGE).length,
|
|
597
607
|
};
|
|
598
608
|
}
|
|
599
609
|
|
|
@@ -621,12 +631,12 @@ module.exports = {
|
|
|
621
631
|
Release,
|
|
622
632
|
FeatureFlag,
|
|
623
633
|
ReleaseManager,
|
|
624
|
-
|
|
634
|
+
|
|
625
635
|
// Constants
|
|
626
636
|
ReleaseState,
|
|
627
637
|
ReleaseType,
|
|
628
638
|
FeatureFlagStatus,
|
|
629
|
-
|
|
639
|
+
|
|
630
640
|
// Factory
|
|
631
|
-
createReleaseManager
|
|
641
|
+
createReleaseManager,
|
|
632
642
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Agent-Skill Binding - Dynamic capability-based skill assignment
|
|
3
3
|
* Sprint 3.3: Skill System Architecture
|
|
4
|
-
*
|
|
4
|
+
*
|
|
5
5
|
* Features:
|
|
6
6
|
* - Agent capability scoring
|
|
7
7
|
* - Dynamic skill-agent matching
|
|
@@ -19,7 +19,7 @@ const AgentStatus = {
|
|
|
19
19
|
AVAILABLE: 'available',
|
|
20
20
|
BUSY: 'busy',
|
|
21
21
|
OFFLINE: 'offline',
|
|
22
|
-
MAINTENANCE: 'maintenance'
|
|
22
|
+
MAINTENANCE: 'maintenance',
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
/**
|
|
@@ -40,22 +40,22 @@ class AgentDefinition {
|
|
|
40
40
|
|
|
41
41
|
validate() {
|
|
42
42
|
const errors = [];
|
|
43
|
-
|
|
43
|
+
|
|
44
44
|
if (!this.id) {
|
|
45
45
|
errors.push('Agent ID is required');
|
|
46
46
|
}
|
|
47
|
-
|
|
47
|
+
|
|
48
48
|
if (!this.name) {
|
|
49
49
|
errors.push('Agent name is required');
|
|
50
50
|
}
|
|
51
|
-
|
|
51
|
+
|
|
52
52
|
if (!Array.isArray(this.capabilities)) {
|
|
53
53
|
errors.push('Capabilities must be an array');
|
|
54
54
|
}
|
|
55
|
-
|
|
55
|
+
|
|
56
56
|
return {
|
|
57
57
|
valid: errors.length === 0,
|
|
58
|
-
errors
|
|
58
|
+
errors,
|
|
59
59
|
};
|
|
60
60
|
}
|
|
61
61
|
|
|
@@ -69,7 +69,7 @@ class AgentDefinition {
|
|
|
69
69
|
maxConcurrentTasks: this.maxConcurrentTasks,
|
|
70
70
|
priority: this.priority,
|
|
71
71
|
tags: this.tags,
|
|
72
|
-
metadata: this.metadata
|
|
72
|
+
metadata: this.metadata,
|
|
73
73
|
};
|
|
74
74
|
}
|
|
75
75
|
}
|
|
@@ -93,16 +93,12 @@ class BindingRecord {
|
|
|
93
93
|
updateStats(success, executionTime) {
|
|
94
94
|
this.executionCount++;
|
|
95
95
|
const successWeight = success ? 1 : 0;
|
|
96
|
-
this.successRate =
|
|
97
|
-
(this.successRate * (this.executionCount - 1) + successWeight) /
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
this.averageExecutionTime = (
|
|
101
|
-
(this.averageExecutionTime * (this.executionCount - 1) + executionTime) /
|
|
102
|
-
this.executionCount
|
|
103
|
-
);
|
|
96
|
+
this.successRate =
|
|
97
|
+
(this.successRate * (this.executionCount - 1) + successWeight) / this.executionCount;
|
|
98
|
+
this.averageExecutionTime =
|
|
99
|
+
(this.averageExecutionTime * (this.executionCount - 1) + executionTime) / this.executionCount;
|
|
104
100
|
this.lastExecutedAt = new Date().toISOString();
|
|
105
|
-
|
|
101
|
+
|
|
106
102
|
// Update affinity based on performance
|
|
107
103
|
this.affinity = this._calculateAffinity();
|
|
108
104
|
}
|
|
@@ -111,10 +107,10 @@ class BindingRecord {
|
|
|
111
107
|
// Affinity increases with success rate and execution count
|
|
112
108
|
const successFactor = this.successRate * 50;
|
|
113
109
|
const experienceFactor = Math.min(this.executionCount / 10, 30);
|
|
114
|
-
const recencyFactor = this.lastExecutedAt
|
|
110
|
+
const recencyFactor = this.lastExecutedAt
|
|
115
111
|
? Math.max(0, 20 - (Date.now() - new Date(this.lastExecutedAt).getTime()) / 86400000)
|
|
116
112
|
: 0;
|
|
117
|
-
|
|
113
|
+
|
|
118
114
|
return Math.round(successFactor + experienceFactor + recencyFactor);
|
|
119
115
|
}
|
|
120
116
|
|
|
@@ -127,7 +123,7 @@ class BindingRecord {
|
|
|
127
123
|
executionCount: this.executionCount,
|
|
128
124
|
successRate: this.successRate,
|
|
129
125
|
averageExecutionTime: this.averageExecutionTime,
|
|
130
|
-
lastExecutedAt: this.lastExecutedAt
|
|
126
|
+
lastExecutedAt: this.lastExecutedAt,
|
|
131
127
|
};
|
|
132
128
|
}
|
|
133
129
|
}
|
|
@@ -215,13 +211,13 @@ class AgentSkillBinding extends EventEmitter {
|
|
|
215
211
|
this.agentLoad = new Map();
|
|
216
212
|
this.bindings = new Map(); // Map<agentId, Map<skillId, BindingRecord>>
|
|
217
213
|
this.matcher = new CapabilityMatcher();
|
|
218
|
-
|
|
214
|
+
|
|
219
215
|
// Options
|
|
220
216
|
this.options = {
|
|
221
217
|
autoBinding: options.autoBinding !== false,
|
|
222
218
|
minMatchScore: options.minMatchScore || 50,
|
|
223
219
|
enableLoadBalancing: options.enableLoadBalancing !== false,
|
|
224
|
-
affinityWeight: options.affinityWeight || 0.3
|
|
220
|
+
affinityWeight: options.affinityWeight || 0.3,
|
|
225
221
|
};
|
|
226
222
|
|
|
227
223
|
// Listen to skill registry events
|
|
@@ -238,9 +234,7 @@ class AgentSkillBinding extends EventEmitter {
|
|
|
238
234
|
* Register an agent
|
|
239
235
|
*/
|
|
240
236
|
registerAgent(agentDef) {
|
|
241
|
-
const agent = agentDef instanceof AgentDefinition
|
|
242
|
-
? agentDef
|
|
243
|
-
: new AgentDefinition(agentDef);
|
|
237
|
+
const agent = agentDef instanceof AgentDefinition ? agentDef : new AgentDefinition(agentDef);
|
|
244
238
|
|
|
245
239
|
const validation = agent.validate();
|
|
246
240
|
if (!validation.valid) {
|
|
@@ -262,7 +256,7 @@ class AgentSkillBinding extends EventEmitter {
|
|
|
262
256
|
}
|
|
263
257
|
|
|
264
258
|
this.emit('agent-registered', { agentId: agent.id, agent });
|
|
265
|
-
|
|
259
|
+
|
|
266
260
|
return agent;
|
|
267
261
|
}
|
|
268
262
|
|
|
@@ -280,7 +274,7 @@ class AgentSkillBinding extends EventEmitter {
|
|
|
280
274
|
this.bindings.delete(agentId);
|
|
281
275
|
|
|
282
276
|
this.emit('agent-unregistered', { agentId });
|
|
283
|
-
|
|
277
|
+
|
|
284
278
|
return true;
|
|
285
279
|
}
|
|
286
280
|
|
|
@@ -348,19 +342,19 @@ class AgentSkillBinding extends EventEmitter {
|
|
|
348
342
|
|
|
349
343
|
// Check permissions
|
|
350
344
|
if (skill.permissions && skill.permissions.length > 0) {
|
|
351
|
-
const hasPermission = skill.permissions.every(
|
|
352
|
-
p => agent.permissions.includes(p)
|
|
353
|
-
);
|
|
345
|
+
const hasPermission = skill.permissions.every(p => agent.permissions.includes(p));
|
|
354
346
|
if (!hasPermission) {
|
|
355
347
|
throw new Error(`Agent '${agentId}' lacks required permissions for skill '${skillId}'`);
|
|
356
348
|
}
|
|
357
349
|
}
|
|
358
350
|
|
|
359
351
|
// Calculate score
|
|
360
|
-
const score =
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
352
|
+
const score =
|
|
353
|
+
options.score ||
|
|
354
|
+
this.matcher.calculateScore(
|
|
355
|
+
agent.capabilities,
|
|
356
|
+
skill.tags // Use tags as capability requirements
|
|
357
|
+
);
|
|
364
358
|
|
|
365
359
|
const record = new BindingRecord(agentId, skillId, { score });
|
|
366
360
|
this.bindings.get(agentId).set(skillId, record);
|
|
@@ -405,7 +399,7 @@ class AgentSkillBinding extends EventEmitter {
|
|
|
405
399
|
/**
|
|
406
400
|
* Find best agent for a skill
|
|
407
401
|
*/
|
|
408
|
-
findBestAgentForSkill(skillId,
|
|
402
|
+
findBestAgentForSkill(skillId, _options = {}) {
|
|
409
403
|
const skill = this.skillRegistry?.getSkill(skillId);
|
|
410
404
|
if (!skill) {
|
|
411
405
|
return null;
|
|
@@ -427,9 +421,7 @@ class AgentSkillBinding extends EventEmitter {
|
|
|
427
421
|
|
|
428
422
|
// Check permissions
|
|
429
423
|
if (skill.permissions && skill.permissions.length > 0) {
|
|
430
|
-
const hasPermission = skill.permissions.every(
|
|
431
|
-
p => agent.permissions.includes(p)
|
|
432
|
-
);
|
|
424
|
+
const hasPermission = skill.permissions.every(p => agent.permissions.includes(p));
|
|
433
425
|
if (!hasPermission) {
|
|
434
426
|
continue;
|
|
435
427
|
}
|
|
@@ -454,7 +446,7 @@ class AgentSkillBinding extends EventEmitter {
|
|
|
454
446
|
agent,
|
|
455
447
|
binding,
|
|
456
448
|
finalScore,
|
|
457
|
-
load
|
|
449
|
+
load,
|
|
458
450
|
});
|
|
459
451
|
}
|
|
460
452
|
}
|
|
@@ -487,7 +479,7 @@ class AgentSkillBinding extends EventEmitter {
|
|
|
487
479
|
agent,
|
|
488
480
|
score,
|
|
489
481
|
status: this.agentStatus.get(agentId),
|
|
490
|
-
load: this.agentLoad.get(agentId) || 0
|
|
482
|
+
load: this.agentLoad.get(agentId) || 0,
|
|
491
483
|
});
|
|
492
484
|
}
|
|
493
485
|
}
|
|
@@ -516,7 +508,7 @@ class AgentSkillBinding extends EventEmitter {
|
|
|
516
508
|
}
|
|
517
509
|
|
|
518
510
|
this.emit('agent-acquired', { agentId, currentLoad: load + 1 });
|
|
519
|
-
|
|
511
|
+
|
|
520
512
|
return true;
|
|
521
513
|
}
|
|
522
514
|
|
|
@@ -541,7 +533,7 @@ class AgentSkillBinding extends EventEmitter {
|
|
|
541
533
|
}
|
|
542
534
|
|
|
543
535
|
this.emit('agent-released', { agentId, currentLoad: load - 1 });
|
|
544
|
-
|
|
536
|
+
|
|
545
537
|
return true;
|
|
546
538
|
}
|
|
547
539
|
|
|
@@ -578,7 +570,7 @@ class AgentSkillBinding extends EventEmitter {
|
|
|
578
570
|
[AgentStatus.AVAILABLE]: 0,
|
|
579
571
|
[AgentStatus.BUSY]: 0,
|
|
580
572
|
[AgentStatus.OFFLINE]: 0,
|
|
581
|
-
[AgentStatus.MAINTENANCE]: 0
|
|
573
|
+
[AgentStatus.MAINTENANCE]: 0,
|
|
582
574
|
};
|
|
583
575
|
|
|
584
576
|
let totalBindings = 0;
|
|
@@ -586,8 +578,8 @@ class AgentSkillBinding extends EventEmitter {
|
|
|
586
578
|
|
|
587
579
|
for (const [agentId, status] of this.agentStatus) {
|
|
588
580
|
statusCounts[status]++;
|
|
589
|
-
totalBindings +=
|
|
590
|
-
totalLoad +=
|
|
581
|
+
totalBindings += this.bindings.get(agentId)?.size || 0;
|
|
582
|
+
totalLoad += this.agentLoad.get(agentId) || 0;
|
|
591
583
|
}
|
|
592
584
|
|
|
593
585
|
return {
|
|
@@ -595,7 +587,7 @@ class AgentSkillBinding extends EventEmitter {
|
|
|
595
587
|
statusCounts,
|
|
596
588
|
totalBindings,
|
|
597
589
|
totalLoad,
|
|
598
|
-
averageLoad: this.agents.size > 0 ? totalLoad / this.agents.size : 0
|
|
590
|
+
averageLoad: this.agents.size > 0 ? totalLoad / this.agents.size : 0,
|
|
599
591
|
};
|
|
600
592
|
}
|
|
601
593
|
|
|
@@ -651,5 +643,5 @@ module.exports = {
|
|
|
651
643
|
AgentDefinition,
|
|
652
644
|
BindingRecord,
|
|
653
645
|
CapabilityMatcher,
|
|
654
|
-
AgentStatus
|
|
646
|
+
AgentStatus,
|
|
655
647
|
};
|