musubi-sdd 5.1.0 → 5.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/README.ja.md +106 -48
  2. package/README.md +110 -32
  3. package/bin/musubi-analyze.js +74 -67
  4. package/bin/musubi-browser.js +27 -26
  5. package/bin/musubi-change.js +48 -47
  6. package/bin/musubi-checkpoint.js +10 -7
  7. package/bin/musubi-convert.js +25 -25
  8. package/bin/musubi-costs.js +27 -10
  9. package/bin/musubi-gui.js +52 -46
  10. package/bin/musubi-init.js +1952 -10
  11. package/bin/musubi-orchestrate.js +327 -239
  12. package/bin/musubi-remember.js +69 -56
  13. package/bin/musubi-resolve.js +53 -45
  14. package/bin/musubi-trace.js +51 -22
  15. package/bin/musubi-validate.js +39 -30
  16. package/bin/musubi-workflow.js +33 -34
  17. package/bin/musubi.js +39 -2
  18. package/package.json +1 -1
  19. package/src/agents/agent-loop.js +94 -95
  20. package/src/agents/agentic/code-generator.js +119 -109
  21. package/src/agents/agentic/code-reviewer.js +105 -108
  22. package/src/agents/agentic/index.js +4 -4
  23. package/src/agents/browser/action-executor.js +13 -13
  24. package/src/agents/browser/ai-comparator.js +11 -10
  25. package/src/agents/browser/context-manager.js +6 -6
  26. package/src/agents/browser/index.js +5 -5
  27. package/src/agents/browser/nl-parser.js +31 -46
  28. package/src/agents/browser/screenshot.js +2 -2
  29. package/src/agents/browser/test-generator.js +6 -4
  30. package/src/agents/function-tool.js +71 -65
  31. package/src/agents/index.js +7 -7
  32. package/src/agents/schema-generator.js +98 -94
  33. package/src/analyzers/ast-extractor.js +158 -146
  34. package/src/analyzers/codegraph-auto-update.js +858 -0
  35. package/src/analyzers/complexity-analyzer.js +536 -0
  36. package/src/analyzers/context-optimizer.js +241 -126
  37. package/src/analyzers/impact-analyzer.js +1 -1
  38. package/src/analyzers/large-project-analyzer.js +766 -0
  39. package/src/analyzers/repository-map.js +77 -81
  40. package/src/analyzers/security-analyzer.js +19 -11
  41. package/src/analyzers/stuck-detector.js +19 -17
  42. package/src/converters/index.js +78 -57
  43. package/src/converters/ir/types.js +12 -12
  44. package/src/converters/parsers/musubi-parser.js +134 -126
  45. package/src/converters/parsers/openapi-parser.js +70 -53
  46. package/src/converters/parsers/speckit-parser.js +239 -175
  47. package/src/converters/writers/musubi-writer.js +123 -118
  48. package/src/converters/writers/speckit-writer.js +124 -113
  49. package/src/generators/rust-migration-generator.js +512 -0
  50. package/src/gui/public/index.html +1365 -1211
  51. package/src/gui/server.js +41 -40
  52. package/src/gui/services/file-watcher.js +23 -8
  53. package/src/gui/services/project-scanner.js +26 -20
  54. package/src/gui/services/replanning-service.js +27 -23
  55. package/src/gui/services/traceability-service.js +8 -8
  56. package/src/gui/services/workflow-service.js +14 -7
  57. package/src/index.js +151 -0
  58. package/src/integrations/cicd.js +90 -104
  59. package/src/integrations/codegraph-mcp.js +643 -0
  60. package/src/integrations/documentation.js +142 -103
  61. package/src/integrations/examples.js +95 -80
  62. package/src/integrations/github-client.js +17 -17
  63. package/src/integrations/index.js +5 -5
  64. package/src/integrations/mcp/index.js +21 -21
  65. package/src/integrations/mcp/mcp-context-provider.js +76 -78
  66. package/src/integrations/mcp/mcp-discovery.js +74 -72
  67. package/src/integrations/mcp/mcp-tool-registry.js +99 -94
  68. package/src/integrations/mcp-connector.js +70 -66
  69. package/src/integrations/platforms.js +50 -49
  70. package/src/integrations/tool-discovery.js +37 -31
  71. package/src/llm-providers/anthropic-provider.js +11 -11
  72. package/src/llm-providers/base-provider.js +16 -18
  73. package/src/llm-providers/copilot-provider.js +22 -19
  74. package/src/llm-providers/index.js +26 -25
  75. package/src/llm-providers/ollama-provider.js +11 -11
  76. package/src/llm-providers/openai-provider.js +12 -12
  77. package/src/managers/agent-memory.js +36 -24
  78. package/src/managers/checkpoint-manager.js +4 -8
  79. package/src/managers/delta-spec.js +19 -19
  80. package/src/managers/index.js +13 -4
  81. package/src/managers/memory-condenser.js +35 -45
  82. package/src/managers/repo-skill-manager.js +57 -31
  83. package/src/managers/skill-loader.js +25 -22
  84. package/src/managers/skill-tools.js +36 -72
  85. package/src/managers/workflow.js +30 -22
  86. package/src/monitoring/cost-tracker.js +48 -46
  87. package/src/monitoring/incident-manager.js +116 -106
  88. package/src/monitoring/index.js +144 -134
  89. package/src/monitoring/observability.js +75 -62
  90. package/src/monitoring/quality-dashboard.js +45 -41
  91. package/src/monitoring/release-manager.js +63 -53
  92. package/src/orchestration/agent-skill-binding.js +39 -47
  93. package/src/orchestration/error-handler.js +65 -107
  94. package/src/orchestration/guardrails/base-guardrail.js +26 -24
  95. package/src/orchestration/guardrails/guardrail-rules.js +50 -64
  96. package/src/orchestration/guardrails/index.js +5 -5
  97. package/src/orchestration/guardrails/input-guardrail.js +58 -45
  98. package/src/orchestration/guardrails/output-guardrail.js +104 -81
  99. package/src/orchestration/guardrails/safety-check.js +79 -79
  100. package/src/orchestration/index.js +38 -55
  101. package/src/orchestration/mcp-tool-adapters.js +96 -99
  102. package/src/orchestration/orchestration-engine.js +21 -21
  103. package/src/orchestration/pattern-registry.js +60 -45
  104. package/src/orchestration/patterns/auto.js +34 -47
  105. package/src/orchestration/patterns/group-chat.js +59 -65
  106. package/src/orchestration/patterns/handoff.js +67 -65
  107. package/src/orchestration/patterns/human-in-loop.js +51 -72
  108. package/src/orchestration/patterns/nested.js +25 -40
  109. package/src/orchestration/patterns/sequential.js +35 -34
  110. package/src/orchestration/patterns/swarm.js +63 -56
  111. package/src/orchestration/patterns/triage.js +150 -109
  112. package/src/orchestration/reasoning/index.js +9 -9
  113. package/src/orchestration/reasoning/planning-engine.js +143 -140
  114. package/src/orchestration/reasoning/reasoning-engine.js +206 -144
  115. package/src/orchestration/reasoning/self-correction.js +121 -128
  116. package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
  117. package/src/orchestration/replanning/alternative-generator.js +37 -42
  118. package/src/orchestration/replanning/config.js +63 -59
  119. package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
  120. package/src/orchestration/replanning/index.js +24 -20
  121. package/src/orchestration/replanning/plan-evaluator.js +49 -50
  122. package/src/orchestration/replanning/plan-monitor.js +32 -28
  123. package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
  124. package/src/orchestration/replanning/replan-history.js +33 -26
  125. package/src/orchestration/replanning/replanning-engine.js +106 -108
  126. package/src/orchestration/skill-executor.js +107 -109
  127. package/src/orchestration/skill-registry.js +85 -89
  128. package/src/orchestration/workflow-examples.js +228 -231
  129. package/src/orchestration/workflow-executor.js +65 -68
  130. package/src/orchestration/workflow-orchestrator.js +72 -73
  131. package/src/phase4-integration.js +47 -40
  132. package/src/phase5-integration.js +89 -30
  133. package/src/reporters/coverage-report.js +82 -30
  134. package/src/reporters/hierarchical-reporter.js +498 -0
  135. package/src/reporters/traceability-matrix-report.js +29 -20
  136. package/src/resolvers/issue-resolver.js +43 -31
  137. package/src/steering/advanced-validation.js +133 -124
  138. package/src/steering/auto-updater.js +60 -73
  139. package/src/steering/index.js +6 -6
  140. package/src/steering/quality-metrics.js +41 -35
  141. package/src/steering/steering-auto-update.js +83 -86
  142. package/src/steering/steering-validator.js +98 -106
  143. package/src/steering/template-constraints.js +53 -54
  144. package/src/templates/agents/claude-code/CLAUDE.md +32 -32
  145. package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
  146. package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
  147. package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
  148. package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
  149. package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
  150. package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
  151. package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
  152. package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
  153. package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
  154. package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
  155. package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
  156. package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
  157. package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
  158. package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
  159. package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
  160. package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
  161. package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
  162. package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
  163. package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
  164. package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
  165. package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
  166. package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
  167. package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
  168. package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
  169. package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
  170. package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
  171. package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
  172. package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
  173. package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
  174. package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
  175. package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
  176. package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
  177. package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
  178. package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
  179. package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
  180. package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
  181. package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
  182. package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
  183. package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
  184. package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
  185. package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
  186. package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
  187. package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
  188. package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
  189. package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
  190. package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
  191. package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
  192. package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
  193. package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
  194. package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
  195. package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
  196. package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
  197. package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
  198. package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
  199. package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
  200. package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
  201. package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
  202. package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
  203. package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
  204. package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
  205. package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
  206. package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
  207. package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
  208. package/src/templates/agents/codex/AGENTS.md +74 -42
  209. package/src/templates/agents/cursor/AGENTS.md +74 -42
  210. package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
  211. package/src/templates/agents/github-copilot/AGENTS.md +83 -51
  212. package/src/templates/agents/qwen-code/QWEN.md +74 -42
  213. package/src/templates/agents/windsurf/AGENTS.md +74 -42
  214. package/src/templates/architectures/README.md +41 -0
  215. package/src/templates/architectures/clean-architecture/README.md +113 -0
  216. package/src/templates/architectures/event-driven/README.md +162 -0
  217. package/src/templates/architectures/hexagonal/README.md +130 -0
  218. package/src/templates/index.js +6 -1
  219. package/src/templates/locale-manager.js +16 -16
  220. package/src/templates/shared/delta-spec-template.md +20 -13
  221. package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
  222. package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
  223. package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
  224. package/src/templates/shared/steering/structure.md +95 -0
  225. package/src/templates/skills/browser-agent.md +21 -16
  226. package/src/templates/skills/web-gui.md +8 -0
  227. package/src/templates/template-constraints.js +50 -53
  228. package/src/validators/advanced-validation.js +30 -36
  229. package/src/validators/constitutional-validator.js +77 -73
  230. package/src/validators/critic-system.js +49 -59
  231. package/src/validators/delta-format.js +59 -55
  232. package/src/validators/traceability-validator.js +7 -11
@@ -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]: [ReleaseState.STAGING, ReleaseState.DEVELOPMENT, ReleaseState.CANCELLED],
115
- [ReleaseState.STAGING]: [ReleaseState.CANARY, ReleaseState.PRODUCTION, ReleaseState.TESTING, ReleaseState.CANCELLED],
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 (hash % 100) < this.percentage;
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 = ((hash << 5) - hash) + char;
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
- this.executionCount
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 = options.score || this.matcher.calculateScore(
361
- agent.capabilities,
362
- skill.tags // Use tags as capability requirements
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, options = {}) {
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 += (this.bindings.get(agentId)?.size || 0);
590
- totalLoad += (this.agentLoad.get(agentId) || 0);
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
  };