musubi-sdd 5.1.0 → 5.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/README.ja.md +106 -48
  2. package/README.md +110 -32
  3. package/bin/musubi-analyze.js +74 -67
  4. package/bin/musubi-browser.js +27 -26
  5. package/bin/musubi-change.js +48 -47
  6. package/bin/musubi-checkpoint.js +10 -7
  7. package/bin/musubi-convert.js +25 -25
  8. package/bin/musubi-costs.js +27 -10
  9. package/bin/musubi-gui.js +52 -46
  10. package/bin/musubi-init.js +1952 -10
  11. package/bin/musubi-orchestrate.js +327 -239
  12. package/bin/musubi-remember.js +69 -56
  13. package/bin/musubi-resolve.js +53 -45
  14. package/bin/musubi-trace.js +51 -22
  15. package/bin/musubi-validate.js +39 -30
  16. package/bin/musubi-workflow.js +33 -34
  17. package/bin/musubi.js +39 -2
  18. package/package.json +1 -1
  19. package/src/agents/agent-loop.js +94 -95
  20. package/src/agents/agentic/code-generator.js +119 -109
  21. package/src/agents/agentic/code-reviewer.js +105 -108
  22. package/src/agents/agentic/index.js +4 -4
  23. package/src/agents/browser/action-executor.js +13 -13
  24. package/src/agents/browser/ai-comparator.js +11 -10
  25. package/src/agents/browser/context-manager.js +6 -6
  26. package/src/agents/browser/index.js +5 -5
  27. package/src/agents/browser/nl-parser.js +31 -46
  28. package/src/agents/browser/screenshot.js +2 -2
  29. package/src/agents/browser/test-generator.js +6 -4
  30. package/src/agents/function-tool.js +71 -65
  31. package/src/agents/index.js +7 -7
  32. package/src/agents/schema-generator.js +98 -94
  33. package/src/analyzers/ast-extractor.js +158 -146
  34. package/src/analyzers/codegraph-auto-update.js +858 -0
  35. package/src/analyzers/complexity-analyzer.js +536 -0
  36. package/src/analyzers/context-optimizer.js +241 -126
  37. package/src/analyzers/impact-analyzer.js +1 -1
  38. package/src/analyzers/large-project-analyzer.js +766 -0
  39. package/src/analyzers/repository-map.js +77 -81
  40. package/src/analyzers/security-analyzer.js +19 -11
  41. package/src/analyzers/stuck-detector.js +19 -17
  42. package/src/converters/index.js +78 -57
  43. package/src/converters/ir/types.js +12 -12
  44. package/src/converters/parsers/musubi-parser.js +134 -126
  45. package/src/converters/parsers/openapi-parser.js +70 -53
  46. package/src/converters/parsers/speckit-parser.js +239 -175
  47. package/src/converters/writers/musubi-writer.js +123 -118
  48. package/src/converters/writers/speckit-writer.js +124 -113
  49. package/src/generators/rust-migration-generator.js +512 -0
  50. package/src/gui/public/index.html +1365 -1211
  51. package/src/gui/server.js +41 -40
  52. package/src/gui/services/file-watcher.js +23 -8
  53. package/src/gui/services/project-scanner.js +26 -20
  54. package/src/gui/services/replanning-service.js +27 -23
  55. package/src/gui/services/traceability-service.js +8 -8
  56. package/src/gui/services/workflow-service.js +14 -7
  57. package/src/index.js +151 -0
  58. package/src/integrations/cicd.js +90 -104
  59. package/src/integrations/codegraph-mcp.js +643 -0
  60. package/src/integrations/documentation.js +142 -103
  61. package/src/integrations/examples.js +95 -80
  62. package/src/integrations/github-client.js +17 -17
  63. package/src/integrations/index.js +5 -5
  64. package/src/integrations/mcp/index.js +21 -21
  65. package/src/integrations/mcp/mcp-context-provider.js +76 -78
  66. package/src/integrations/mcp/mcp-discovery.js +74 -72
  67. package/src/integrations/mcp/mcp-tool-registry.js +99 -94
  68. package/src/integrations/mcp-connector.js +70 -66
  69. package/src/integrations/platforms.js +50 -49
  70. package/src/integrations/tool-discovery.js +37 -31
  71. package/src/llm-providers/anthropic-provider.js +11 -11
  72. package/src/llm-providers/base-provider.js +16 -18
  73. package/src/llm-providers/copilot-provider.js +22 -19
  74. package/src/llm-providers/index.js +26 -25
  75. package/src/llm-providers/ollama-provider.js +11 -11
  76. package/src/llm-providers/openai-provider.js +12 -12
  77. package/src/managers/agent-memory.js +36 -24
  78. package/src/managers/checkpoint-manager.js +4 -8
  79. package/src/managers/delta-spec.js +19 -19
  80. package/src/managers/index.js +13 -4
  81. package/src/managers/memory-condenser.js +35 -45
  82. package/src/managers/repo-skill-manager.js +57 -31
  83. package/src/managers/skill-loader.js +25 -22
  84. package/src/managers/skill-tools.js +36 -72
  85. package/src/managers/workflow.js +30 -22
  86. package/src/monitoring/cost-tracker.js +48 -46
  87. package/src/monitoring/incident-manager.js +116 -106
  88. package/src/monitoring/index.js +144 -134
  89. package/src/monitoring/observability.js +75 -62
  90. package/src/monitoring/quality-dashboard.js +45 -41
  91. package/src/monitoring/release-manager.js +63 -53
  92. package/src/orchestration/agent-skill-binding.js +39 -47
  93. package/src/orchestration/error-handler.js +65 -107
  94. package/src/orchestration/guardrails/base-guardrail.js +26 -24
  95. package/src/orchestration/guardrails/guardrail-rules.js +50 -64
  96. package/src/orchestration/guardrails/index.js +5 -5
  97. package/src/orchestration/guardrails/input-guardrail.js +58 -45
  98. package/src/orchestration/guardrails/output-guardrail.js +104 -81
  99. package/src/orchestration/guardrails/safety-check.js +79 -79
  100. package/src/orchestration/index.js +38 -55
  101. package/src/orchestration/mcp-tool-adapters.js +96 -99
  102. package/src/orchestration/orchestration-engine.js +21 -21
  103. package/src/orchestration/pattern-registry.js +60 -45
  104. package/src/orchestration/patterns/auto.js +34 -47
  105. package/src/orchestration/patterns/group-chat.js +59 -65
  106. package/src/orchestration/patterns/handoff.js +67 -65
  107. package/src/orchestration/patterns/human-in-loop.js +51 -72
  108. package/src/orchestration/patterns/nested.js +25 -40
  109. package/src/orchestration/patterns/sequential.js +35 -34
  110. package/src/orchestration/patterns/swarm.js +63 -56
  111. package/src/orchestration/patterns/triage.js +150 -109
  112. package/src/orchestration/reasoning/index.js +9 -9
  113. package/src/orchestration/reasoning/planning-engine.js +143 -140
  114. package/src/orchestration/reasoning/reasoning-engine.js +206 -144
  115. package/src/orchestration/reasoning/self-correction.js +121 -128
  116. package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
  117. package/src/orchestration/replanning/alternative-generator.js +37 -42
  118. package/src/orchestration/replanning/config.js +63 -59
  119. package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
  120. package/src/orchestration/replanning/index.js +24 -20
  121. package/src/orchestration/replanning/plan-evaluator.js +49 -50
  122. package/src/orchestration/replanning/plan-monitor.js +32 -28
  123. package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
  124. package/src/orchestration/replanning/replan-history.js +33 -26
  125. package/src/orchestration/replanning/replanning-engine.js +106 -108
  126. package/src/orchestration/skill-executor.js +107 -109
  127. package/src/orchestration/skill-registry.js +85 -89
  128. package/src/orchestration/workflow-examples.js +228 -231
  129. package/src/orchestration/workflow-executor.js +65 -68
  130. package/src/orchestration/workflow-orchestrator.js +72 -73
  131. package/src/phase4-integration.js +47 -40
  132. package/src/phase5-integration.js +89 -30
  133. package/src/reporters/coverage-report.js +82 -30
  134. package/src/reporters/hierarchical-reporter.js +498 -0
  135. package/src/reporters/traceability-matrix-report.js +29 -20
  136. package/src/resolvers/issue-resolver.js +43 -31
  137. package/src/steering/advanced-validation.js +133 -124
  138. package/src/steering/auto-updater.js +60 -73
  139. package/src/steering/index.js +6 -6
  140. package/src/steering/quality-metrics.js +41 -35
  141. package/src/steering/steering-auto-update.js +83 -86
  142. package/src/steering/steering-validator.js +98 -106
  143. package/src/steering/template-constraints.js +53 -54
  144. package/src/templates/agents/claude-code/CLAUDE.md +32 -32
  145. package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
  146. package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
  147. package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
  148. package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
  149. package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
  150. package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
  151. package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
  152. package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
  153. package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
  154. package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
  155. package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
  156. package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
  157. package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
  158. package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
  159. package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
  160. package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
  161. package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
  162. package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
  163. package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
  164. package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
  165. package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
  166. package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
  167. package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
  168. package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
  169. package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
  170. package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
  171. package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
  172. package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
  173. package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
  174. package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
  175. package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
  176. package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
  177. package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
  178. package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
  179. package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
  180. package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
  181. package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
  182. package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
  183. package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
  184. package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
  185. package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
  186. package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
  187. package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
  188. package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
  189. package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
  190. package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
  191. package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
  192. package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
  193. package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
  194. package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
  195. package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
  196. package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
  197. package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
  198. package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
  199. package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
  200. package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
  201. package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
  202. package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
  203. package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
  204. package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
  205. package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
  206. package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
  207. package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
  208. package/src/templates/agents/codex/AGENTS.md +74 -42
  209. package/src/templates/agents/cursor/AGENTS.md +74 -42
  210. package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
  211. package/src/templates/agents/github-copilot/AGENTS.md +83 -51
  212. package/src/templates/agents/qwen-code/QWEN.md +74 -42
  213. package/src/templates/agents/windsurf/AGENTS.md +74 -42
  214. package/src/templates/architectures/README.md +41 -0
  215. package/src/templates/architectures/clean-architecture/README.md +113 -0
  216. package/src/templates/architectures/event-driven/README.md +162 -0
  217. package/src/templates/architectures/hexagonal/README.md +130 -0
  218. package/src/templates/index.js +6 -1
  219. package/src/templates/locale-manager.js +16 -16
  220. package/src/templates/shared/delta-spec-template.md +20 -13
  221. package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
  222. package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
  223. package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
  224. package/src/templates/shared/steering/structure.md +95 -0
  225. package/src/templates/skills/browser-agent.md +21 -16
  226. package/src/templates/skills/web-gui.md +8 -0
  227. package/src/templates/template-constraints.js +50 -53
  228. package/src/validators/advanced-validation.js +30 -36
  229. package/src/validators/constitutional-validator.js +77 -73
  230. package/src/validators/critic-system.js +49 -59
  231. package/src/validators/delta-format.js +59 -55
  232. package/src/validators/traceability-validator.js +7 -11
@@ -21,11 +21,11 @@ const chalk = require('chalk');
21
21
  const fs = require('fs-extra');
22
22
  const path = require('path');
23
23
 
24
- // Import memory management modules
25
- let AgentMemoryManager, MemoryCondenser;
24
+ // Import memory management modules (for future use)
25
+ let _AgentMemoryManager, _MemoryCondenser;
26
26
  try {
27
- AgentMemoryManager = require('../src/managers/agent-memory-manager');
28
- MemoryCondenser = require('../src/managers/memory-condenser');
27
+ _AgentMemoryManager = require('../src/managers/agent-memory-manager');
28
+ _MemoryCondenser = require('../src/managers/memory-condenser');
29
29
  } catch {
30
30
  // Modules may not exist yet
31
31
  }
@@ -73,19 +73,19 @@ program
73
73
  .action(async (memory, options) => {
74
74
  try {
75
75
  const memories = await loadMemories();
76
-
76
+
77
77
  const entry = {
78
78
  id: `mem_${Date.now()}`,
79
79
  content: memory,
80
80
  type: options.type,
81
81
  priority: options.priority,
82
82
  timestamp: new Date().toISOString(),
83
- session: process.env.SESSION_ID || 'cli'
83
+ session: process.env.SESSION_ID || 'cli',
84
84
  };
85
-
85
+
86
86
  memories.entries.push(entry);
87
87
  await saveMemories(memories);
88
-
88
+
89
89
  console.log(chalk.green('āœ“ Memory added:'), memory);
90
90
  console.log(chalk.dim(` ID: ${entry.id}`));
91
91
  console.log(chalk.dim(` Type: ${entry.type} | Priority: ${entry.priority}`));
@@ -106,24 +106,24 @@ program
106
106
  try {
107
107
  const memories = await loadMemories();
108
108
  let entries = memories.entries;
109
-
109
+
110
110
  // Filter by type
111
111
  if (options.type) {
112
112
  entries = entries.filter(e => e.type === options.type);
113
113
  }
114
-
114
+
115
115
  // Sort by timestamp (newest first)
116
116
  entries.sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp));
117
-
117
+
118
118
  // Limit entries
119
119
  const limit = parseInt(options.limit) || 20;
120
120
  entries = entries.slice(0, limit);
121
-
121
+
122
122
  if (options.format === 'json') {
123
123
  console.log(JSON.stringify(entries, null, 2));
124
124
  return;
125
125
  }
126
-
126
+
127
127
  if (options.format === 'markdown') {
128
128
  console.log('# Agent Memories\n');
129
129
  entries.forEach(entry => {
@@ -133,39 +133,43 @@ program
133
133
  });
134
134
  return;
135
135
  }
136
-
136
+
137
137
  // Console format
138
138
  console.log(chalk.bold('\nšŸ“ Agent Memories\n'));
139
139
  console.log(chalk.bold('━'.repeat(70)));
140
-
140
+
141
141
  if (entries.length === 0) {
142
142
  console.log(chalk.dim('\n No memories found.\n'));
143
143
  return;
144
144
  }
145
-
146
- entries.forEach((entry, i) => {
145
+
146
+ entries.forEach((entry, _i) => {
147
147
  const typeColors = {
148
148
  decision: chalk.blue,
149
149
  insight: chalk.green,
150
150
  context: chalk.cyan,
151
- todo: chalk.yellow
151
+ todo: chalk.yellow,
152
152
  };
153
153
  const color = typeColors[entry.type] || chalk.white;
154
-
154
+
155
155
  const priorityIcons = {
156
156
  critical: 'šŸ”“',
157
157
  high: '🟠',
158
158
  medium: '🟔',
159
- low: '🟢'
159
+ low: '🟢',
160
160
  };
161
161
  const icon = priorityIcons[entry.priority] || '⚪';
162
-
162
+
163
163
  console.log(`\n${icon} ${color(`[${entry.type.toUpperCase()}]`)} ${entry.content}`);
164
- console.log(chalk.dim(` ID: ${entry.id} | ${new Date(entry.timestamp).toLocaleString()}`));
164
+ console.log(
165
+ chalk.dim(` ID: ${entry.id} | ${new Date(entry.timestamp).toLocaleString()}`)
166
+ );
165
167
  });
166
-
168
+
167
169
  console.log('\n' + chalk.bold('━'.repeat(70)));
168
- console.log(chalk.dim(`\nTotal: ${memories.entries.length} memories | Showing: ${entries.length}`));
170
+ console.log(
171
+ chalk.dim(`\nTotal: ${memories.entries.length} memories | Showing: ${entries.length}`)
172
+ );
169
173
  console.log();
170
174
  } catch (error) {
171
175
  console.error(chalk.red('āœ— Failed to list memories:'), error.message);
@@ -181,22 +185,22 @@ program
181
185
  .action(async options => {
182
186
  try {
183
187
  const memories = await loadMemories();
184
-
188
+
185
189
  if (memories.entries.length < 10) {
186
190
  console.log(chalk.yellow('⚠ Not enough memories to condense (need at least 10)'));
187
191
  console.log(chalk.dim(` Current count: ${memories.entries.length}`));
188
192
  return;
189
193
  }
190
-
194
+
191
195
  console.log(chalk.dim('šŸ”„ Condensing memory bank...\n'));
192
-
196
+
193
197
  // Group entries by type
194
198
  const grouped = {};
195
199
  memories.entries.forEach(entry => {
196
200
  if (!grouped[entry.type]) grouped[entry.type] = [];
197
201
  grouped[entry.type].push(entry);
198
202
  });
199
-
203
+
200
204
  // Create condensed summaries
201
205
  const condensedEntries = [];
202
206
  for (const [type, entries] of Object.entries(grouped)) {
@@ -205,39 +209,43 @@ program
205
209
  id: `condensed_${type}_${Date.now()}`,
206
210
  type: 'condensed',
207
211
  originalType: type,
208
- content: `Summary of ${entries.length} ${type} entries:\n` +
209
- entries.slice(0, 5).map(e => `• ${e.content}`).join('\n') +
212
+ content:
213
+ `Summary of ${entries.length} ${type} entries:\n` +
214
+ entries
215
+ .slice(0, 5)
216
+ .map(e => `• ${e.content}`)
217
+ .join('\n') +
210
218
  (entries.length > 5 ? `\n• ... and ${entries.length - 5} more` : ''),
211
219
  count: entries.length,
212
220
  timestamp: new Date().toISOString(),
213
- originalIds: entries.map(e => e.id)
221
+ originalIds: entries.map(e => e.id),
214
222
  };
215
223
  condensedEntries.push(summary);
216
224
  }
217
225
  }
218
-
226
+
219
227
  console.log(chalk.bold('Condensation Summary:'));
220
228
  console.log(chalk.dim('━'.repeat(50)));
221
229
  condensedEntries.forEach(c => {
222
230
  console.log(` ${c.originalType}: ${c.count} entries → 1 summary`);
223
231
  });
224
-
232
+
225
233
  if (options.dryRun) {
226
234
  console.log(chalk.yellow('\n[DRY RUN] No changes saved.'));
227
235
  return;
228
236
  }
229
-
237
+
230
238
  // Keep only high-priority individual entries
231
- const keepEntries = memories.entries.filter(e =>
232
- e.priority === 'critical' || e.priority === 'high'
239
+ const keepEntries = memories.entries.filter(
240
+ e => e.priority === 'critical' || e.priority === 'high'
233
241
  );
234
-
242
+
235
243
  memories.condensed.push(...condensedEntries);
236
244
  memories.entries = keepEntries;
237
245
  memories.lastCondensed = new Date().toISOString();
238
-
246
+
239
247
  await saveMemories(memories);
240
-
248
+
241
249
  console.log(chalk.green('\nāœ“ Memory bank condensed'));
242
250
  console.log(chalk.dim(` Kept: ${keepEntries.length} high-priority entries`));
243
251
  console.log(chalk.dim(` Created: ${condensedEntries.length} summaries`));
@@ -255,43 +263,46 @@ program
255
263
  .action(async (query, options) => {
256
264
  try {
257
265
  const memories = await loadMemories();
258
-
266
+
259
267
  const queryLower = query.toLowerCase();
260
- const results = memories.entries.filter(entry =>
261
- entry.content.toLowerCase().includes(queryLower) ||
262
- entry.type.toLowerCase().includes(queryLower)
268
+ const results = memories.entries.filter(
269
+ entry =>
270
+ entry.content.toLowerCase().includes(queryLower) ||
271
+ entry.type.toLowerCase().includes(queryLower)
263
272
  );
264
-
273
+
265
274
  // Also search condensed
266
275
  const condensedResults = memories.condensed.filter(entry =>
267
276
  entry.content.toLowerCase().includes(queryLower)
268
277
  );
269
-
278
+
270
279
  if (options.format === 'json') {
271
280
  console.log(JSON.stringify({ entries: results, condensed: condensedResults }, null, 2));
272
281
  return;
273
282
  }
274
-
283
+
275
284
  console.log(chalk.bold(`\nšŸ” Search Results for "${query}"\n`));
276
-
285
+
277
286
  if (results.length === 0 && condensedResults.length === 0) {
278
287
  console.log(chalk.dim(' No matching memories found.\n'));
279
288
  return;
280
289
  }
281
-
290
+
282
291
  results.forEach(entry => {
283
292
  console.log(chalk.cyan(`[${entry.type}]`), entry.content);
284
293
  console.log(chalk.dim(` ${entry.id} | ${entry.timestamp}\n`));
285
294
  });
286
-
295
+
287
296
  if (condensedResults.length > 0) {
288
297
  console.log(chalk.bold('\nFrom Condensed Summaries:'));
289
298
  condensedResults.forEach(entry => {
290
299
  console.log(chalk.yellow(`[${entry.originalType}]`), entry.content.split('\n')[0]);
291
300
  });
292
301
  }
293
-
294
- console.log(chalk.dim(`\nFound: ${results.length} entries, ${condensedResults.length} condensed`));
302
+
303
+ console.log(
304
+ chalk.dim(`\nFound: ${results.length} entries, ${condensedResults.length} condensed`)
305
+ );
295
306
  } catch (error) {
296
307
  console.error(chalk.red('āœ— Search failed:'), error.message);
297
308
  process.exit(1);
@@ -308,20 +319,22 @@ program
308
319
  try {
309
320
  if (!options.force) {
310
321
  console.log(chalk.yellow('⚠ This will delete all agent memories.'));
311
- console.log(chalk.dim(' Use --force to confirm, or --keep-condensed to preserve summaries.\n'));
322
+ console.log(
323
+ chalk.dim(' Use --force to confirm, or --keep-condensed to preserve summaries.\n')
324
+ );
312
325
  return;
313
326
  }
314
-
327
+
315
328
  const memories = await loadMemories();
316
329
  const oldCount = memories.entries.length;
317
-
330
+
318
331
  memories.entries = [];
319
332
  if (!options.keepCondensed) {
320
333
  memories.condensed = [];
321
334
  }
322
-
335
+
323
336
  await saveMemories(memories);
324
-
337
+
325
338
  console.log(chalk.green('āœ“ Memories cleared'));
326
339
  console.log(chalk.dim(` Deleted: ${oldCount} entries`));
327
340
  if (options.keepCondensed) {
@@ -18,7 +18,7 @@
18
18
 
19
19
  const { Command } = require('commander');
20
20
  const chalk = require('chalk');
21
- const path = require('path');
21
+ const _path = require('path');
22
22
 
23
23
  // Import resolvers
24
24
  let IssueResolver, GitHubClient;
@@ -47,7 +47,7 @@ function parseIssueUrl(url) {
47
47
  return {
48
48
  owner: match[1],
49
49
  repo: match[2],
50
- number: parseInt(match[3])
50
+ number: parseInt(match[3]),
51
51
  };
52
52
  }
53
53
 
@@ -56,7 +56,7 @@ function parseIssueUrl(url) {
56
56
  */
57
57
  function getGitHubContext() {
58
58
  const { execSync } = require('child_process');
59
-
59
+
60
60
  try {
61
61
  const remoteUrl = execSync('git remote get-url origin', { encoding: 'utf8' }).trim();
62
62
  const match = remoteUrl.match(/github\.com[:/]([^/]+)\/(.+?)(\.git)?$/);
@@ -66,13 +66,13 @@ function getGitHubContext() {
66
66
  } catch {
67
67
  // Not in a git repo or no remote
68
68
  }
69
-
69
+
70
70
  // Try environment variables
71
71
  if (process.env.GITHUB_REPOSITORY) {
72
72
  const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');
73
73
  return { owner, repo };
74
74
  }
75
-
75
+
76
76
  return null;
77
77
  }
78
78
 
@@ -87,7 +87,7 @@ program
87
87
  .action(async (issueNumber, options) => {
88
88
  try {
89
89
  let owner, repo, number;
90
-
90
+
91
91
  // Parse issue reference
92
92
  if (options.url) {
93
93
  const parsed = parseIssueUrl(options.url);
@@ -108,108 +108,116 @@ program
108
108
  program.outputHelp();
109
109
  return;
110
110
  }
111
-
111
+
112
112
  console.log(chalk.bold('\nšŸ”§ MUSUBI Issue Resolver\n'));
113
113
  console.log(chalk.dim(`Repository: ${owner}/${repo}`));
114
114
  console.log(chalk.dim(`Issue: #${number}`));
115
115
  console.log(chalk.dim('━'.repeat(50)));
116
-
116
+
117
117
  // Check for GitHub token
118
118
  const token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
119
119
  if (!token) {
120
120
  console.log(chalk.yellow('\n⚠ No GITHUB_TOKEN found. Running in offline mode.\n'));
121
121
  }
122
-
122
+
123
123
  // Initialize resolver
124
124
  if (!IssueResolver) {
125
125
  console.error(chalk.red('āœ— IssueResolver module not found.'));
126
126
  console.error(chalk.dim(' Please ensure src/resolvers/issue-resolver.js exists.'));
127
127
  process.exit(1);
128
128
  }
129
-
129
+
130
130
  const resolver = new IssueResolver({
131
131
  workspaceRoot: process.cwd(),
132
132
  owner,
133
133
  repo,
134
134
  token,
135
- verbose: options.verbose
135
+ verbose: options.verbose,
136
136
  });
137
-
137
+
138
138
  // Step 1: Fetch issue details
139
139
  console.log(chalk.cyan('\n[1/4] Fetching issue details...'));
140
140
  const issue = await resolver.fetchIssue(number);
141
-
141
+
142
142
  if (options.verbose) {
143
143
  console.log(chalk.dim(` Title: ${issue.title}`));
144
- console.log(chalk.dim(` Labels: ${issue.labels?.map(l => l.name || l).join(', ') || 'none'}`));
144
+ console.log(
145
+ chalk.dim(` Labels: ${issue.labels?.map(l => l.name || l).join(', ') || 'none'}`)
146
+ );
145
147
  }
146
-
148
+
147
149
  // Step 2: Analyze issue
148
150
  console.log(chalk.cyan('[2/4] Analyzing issue context...'));
149
151
  const analysis = await resolver.analyze(issue);
150
-
152
+
151
153
  if (options.verbose) {
152
154
  console.log(chalk.dim(` Type: ${analysis.issueType}`));
153
155
  console.log(chalk.dim(` Confidence: ${analysis.confidence}%`));
154
156
  console.log(chalk.dim(` Files to modify: ${analysis.suggestedFiles?.length || 0}`));
155
157
  }
156
-
158
+
157
159
  // Step 3: Generate solution
158
160
  console.log(chalk.cyan('[3/4] Generating solution...'));
159
161
  const solution = await resolver.resolve(issue, analysis);
160
-
162
+
161
163
  if (options.format === 'json') {
162
- console.log(JSON.stringify({
163
- issue: { number, title: issue.title, owner, repo },
164
- analysis,
165
- solution,
166
- dryRun: options.dryRun
167
- }, null, 2));
164
+ console.log(
165
+ JSON.stringify(
166
+ {
167
+ issue: { number, title: issue.title, owner, repo },
168
+ analysis,
169
+ solution,
170
+ dryRun: options.dryRun,
171
+ },
172
+ null,
173
+ 2
174
+ )
175
+ );
168
176
  return;
169
177
  }
170
-
178
+
171
179
  // Display solution summary
172
180
  console.log(chalk.bold('\nšŸ“‹ Resolution Summary\n'));
173
181
  console.log(chalk.bold('━'.repeat(50)));
174
182
  console.log(`\n${chalk.bold('Issue:')} ${issue.title}`);
175
183
  console.log(`${chalk.bold('Type:')} ${analysis.issueType}`);
176
184
  console.log(`${chalk.bold('Confidence:')} ${analysis.confidence}%`);
177
-
185
+
178
186
  if (solution.changes && solution.changes.length > 0) {
179
187
  console.log(chalk.bold('\nProposed Changes:'));
180
188
  solution.changes.forEach((change, i) => {
181
189
  console.log(chalk.dim(` ${i + 1}. ${change.file}: ${change.description}`));
182
190
  });
183
191
  }
184
-
192
+
185
193
  if (solution.steps && solution.steps.length > 0) {
186
194
  console.log(chalk.bold('\nResolution Steps:'));
187
195
  solution.steps.forEach((step, i) => {
188
196
  console.log(chalk.dim(` ${i + 1}. ${step}`));
189
197
  });
190
198
  }
191
-
199
+
192
200
  // Step 4: Create PR (if not dry run)
193
201
  if (options.dryRun) {
194
202
  console.log(chalk.yellow('\n[DRY RUN] No pull request created.\n'));
195
203
  return;
196
204
  }
197
-
205
+
198
206
  if (!token) {
199
207
  console.log(chalk.yellow('\n⚠ Cannot create PR without GITHUB_TOKEN.\n'));
200
208
  console.log(chalk.dim(' Set GITHUB_TOKEN environment variable to enable PR creation.'));
201
209
  return;
202
210
  }
203
-
211
+
204
212
  console.log(chalk.cyan('[4/4] Creating pull request...'));
205
-
213
+
206
214
  const branchName = options.branch || `fix/issue-${number}`;
207
215
  const pr = await resolver.createPR({
208
216
  issue,
209
217
  solution,
210
- branchName
218
+ branchName,
211
219
  });
212
-
220
+
213
221
  if (pr) {
214
222
  console.log(chalk.green('\nāœ“ Pull request created successfully!\n'));
215
223
  console.log(chalk.bold(` PR #${pr.number}: ${pr.title}`));
@@ -218,7 +226,7 @@ program
218
226
  console.log(chalk.yellow('\n⚠ Could not create pull request.'));
219
227
  console.log(chalk.dim(' Review the proposed changes above and create manually.'));
220
228
  }
221
-
229
+
222
230
  console.log();
223
231
  } catch (error) {
224
232
  console.error(chalk.red('\nāœ— Resolution failed:'), error.message);
@@ -243,44 +251,44 @@ program
243
251
  console.error(chalk.red('āœ— Could not determine GitHub repository.'));
244
252
  process.exit(1);
245
253
  }
246
-
254
+
247
255
  const token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
248
256
  if (!token) {
249
257
  console.error(chalk.red('āœ— GITHUB_TOKEN required to list issues.'));
250
258
  process.exit(1);
251
259
  }
252
-
260
+
253
261
  if (!GitHubClient) {
254
262
  console.error(chalk.red('āœ— GitHubClient module not found.'));
255
263
  process.exit(1);
256
264
  }
257
-
265
+
258
266
  const client = new GitHubClient({
259
267
  token,
260
268
  owner: context.owner,
261
- repo: context.repo
269
+ repo: context.repo,
262
270
  });
263
-
271
+
264
272
  const labels = options.labels ? options.labels.split(',') : undefined;
265
273
  const issues = await client.listIssues({
266
274
  state: 'open',
267
275
  labels,
268
- per_page: parseInt(options.limit) || 10
276
+ per_page: parseInt(options.limit) || 10,
269
277
  });
270
-
278
+
271
279
  if (options.format === 'json') {
272
280
  console.log(JSON.stringify(issues, null, 2));
273
281
  return;
274
282
  }
275
-
283
+
276
284
  console.log(chalk.bold(`\nšŸ“‹ Open Issues - ${context.owner}/${context.repo}\n`));
277
285
  console.log(chalk.bold('━'.repeat(70)));
278
-
286
+
279
287
  if (issues.length === 0) {
280
288
  console.log(chalk.dim('\n No open issues found.\n'));
281
289
  return;
282
290
  }
283
-
291
+
284
292
  issues.forEach(issue => {
285
293
  const labelStr = issue.labels?.map(l => l.name).join(', ') || '';
286
294
  console.log(`\n #${chalk.cyan(issue.number)} ${issue.title}`);
@@ -289,7 +297,7 @@ program
289
297
  }
290
298
  console.log(chalk.dim(` ${issue.html_url}`));
291
299
  });
292
-
300
+
293
301
  console.log('\n' + chalk.bold('━'.repeat(70)));
294
302
  console.log(chalk.dim(`\nShowing ${issues.length} of total open issues.`));
295
303
  console.log(chalk.dim('Run `musubi-resolve <number>` to resolve an issue.\n'));