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