@stackmemoryai/stackmemory 0.3.9 → 0.3.11
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.md +54 -0
- package/dist/agents/core/agent-task-manager.js +12 -1
- package/dist/agents/core/agent-task-manager.js.map +3 -3
- package/dist/agents/testing-agent.js +610 -0
- package/dist/agents/testing-agent.js.map +7 -0
- package/dist/cli/browser-test.js +4 -4
- package/dist/cli/browser-test.js.map +2 -2
- package/dist/cli/claude-sm.js +2 -2
- package/dist/cli/claude-sm.js.map +2 -2
- package/dist/cli/codex-sm.js +5 -5
- package/dist/cli/codex-sm.js.map +2 -2
- package/dist/cli/commands/agent.js +3 -3
- package/dist/cli/commands/agent.js.map +2 -2
- package/dist/cli/commands/handoff.js +67 -20
- package/dist/cli/commands/handoff.js.map +3 -3
- package/dist/cli/commands/linear-unified.js +3 -3
- package/dist/cli/commands/linear-unified.js.map +2 -2
- package/dist/cli/commands/linear.js +2 -2
- package/dist/cli/commands/linear.js.map +2 -2
- package/dist/cli/commands/onboard.js +3 -3
- package/dist/cli/commands/onboard.js.map +2 -2
- package/dist/cli/commands/quality.js +2 -2
- package/dist/cli/commands/quality.js.map +2 -2
- package/dist/cli/commands/skills.js +113 -28
- package/dist/cli/commands/skills.js.map +2 -2
- package/dist/cli/commands/tasks.js +3 -3
- package/dist/cli/commands/tasks.js.map +2 -2
- package/dist/cli/commands/test.js +282 -0
- package/dist/cli/commands/test.js.map +7 -0
- package/dist/cli/commands/worktree.js +28 -10
- package/dist/cli/commands/worktree.js.map +2 -2
- package/dist/cli/index.js +5 -3
- package/dist/cli/index.js.map +2 -2
- package/dist/cli/utils/viewer.js +9 -9
- package/dist/cli/utils/viewer.js.map +2 -2
- package/dist/core/config/config-manager.js +26 -0
- package/dist/core/config/config-manager.js.map +3 -3
- package/dist/core/context/frame-handoff-manager.js +4 -4
- package/dist/core/context/frame-handoff-manager.js.map +1 -1
- package/dist/core/context/frame-manager.js +139 -0
- package/dist/core/context/frame-manager.js.map +2 -2
- package/dist/core/context/refactored-frame-manager.js +180 -1
- package/dist/core/context/refactored-frame-manager.js.map +2 -2
- package/dist/core/projects/project-isolation.js +197 -0
- package/dist/core/projects/project-isolation.js.map +7 -0
- package/dist/core/trace/debug-trace.js +1 -1
- package/dist/core/trace/debug-trace.js.map +2 -2
- package/dist/core/trace/index.js +4 -4
- package/dist/core/trace/index.js.map +2 -2
- package/dist/core/trace/trace-demo.js +8 -8
- package/dist/core/trace/trace-demo.js.map +2 -2
- package/dist/core/trace/trace-detector.demo.js +5 -5
- package/dist/core/trace/trace-detector.demo.js.map +2 -2
- package/dist/core/utils/update-checker.js +2 -2
- package/dist/core/utils/update-checker.js.map +2 -2
- package/dist/features/analytics/core/analytics-service.js +2 -2
- package/dist/features/analytics/core/analytics-service.js.map +2 -2
- package/dist/features/tasks/linear-task-manager.js +483 -0
- package/dist/features/tasks/linear-task-manager.js.map +7 -0
- package/dist/integrations/claude-code/subagent-client-stub.js +16 -0
- package/dist/integrations/claude-code/subagent-client-stub.js.map +7 -0
- package/dist/integrations/linear/auto-sync.js +2 -2
- package/dist/integrations/linear/auto-sync.js.map +2 -2
- package/dist/integrations/linear/config.js +12 -1
- package/dist/integrations/linear/config.js.map +2 -2
- package/dist/integrations/linear/sync-manager.js.map +1 -1
- package/dist/integrations/linear/sync.js.map +1 -1
- package/dist/integrations/linear/unified-sync.js.map +1 -1
- package/dist/integrations/linear/webhook-handler.js.map +2 -2
- package/dist/integrations/linear/webhook.js.map +2 -2
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +1 -1
- package/dist/integrations/mcp/handlers/task-handlers.js.map +1 -1
- package/dist/integrations/mcp/refactored-server.js +2 -2
- package/dist/integrations/mcp/refactored-server.js.map +2 -2
- package/dist/integrations/mcp/server.js +3 -3
- package/dist/integrations/mcp/server.js.map +2 -2
- package/dist/mcp/stackmemory-mcp-server.js +3 -3
- package/dist/mcp/stackmemory-mcp-server.js.map +2 -2
- package/dist/skills/claude-skills.js +99 -5
- package/dist/skills/claude-skills.js.map +2 -2
- package/dist/skills/recursive-agent-orchestrator.js.map +1 -1
- package/dist/skills/security-secrets-scanner.js +21 -6
- package/dist/skills/security-secrets-scanner.js.map +2 -2
- package/dist/skills/unified-rlm-orchestrator.js +400 -0
- package/dist/skills/unified-rlm-orchestrator.js.map +7 -0
- package/package.json +4 -5
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import {
|
|
2
|
+
RecursiveAgentOrchestrator
|
|
3
|
+
} from "./recursive-agent-orchestrator.js";
|
|
4
|
+
import {
|
|
5
|
+
ClaudeSkillsManager
|
|
6
|
+
} from "./claude-skills.js";
|
|
7
|
+
import { logger } from "../core/monitoring/logger.js";
|
|
8
|
+
class UnifiedRLMOrchestrator {
|
|
9
|
+
rlmOrchestrator;
|
|
10
|
+
skillsManager;
|
|
11
|
+
skillMappings;
|
|
12
|
+
constructor(frameManager, dualStackManager, contextRetriever, taskStore, skillContext) {
|
|
13
|
+
this.rlmOrchestrator = new RecursiveAgentOrchestrator(
|
|
14
|
+
frameManager,
|
|
15
|
+
dualStackManager,
|
|
16
|
+
contextRetriever,
|
|
17
|
+
taskStore
|
|
18
|
+
);
|
|
19
|
+
this.skillsManager = new ClaudeSkillsManager(skillContext);
|
|
20
|
+
this.skillMappings = this.initializeSkillMappings();
|
|
21
|
+
logger.info("Unified RLM Orchestrator initialized with RLM-first routing");
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Initialize skill to RLM agent mappings
|
|
25
|
+
*/
|
|
26
|
+
initializeSkillMappings() {
|
|
27
|
+
const mappings = /* @__PURE__ */ new Map();
|
|
28
|
+
mappings.set("handoff", {
|
|
29
|
+
skillName: "handoff",
|
|
30
|
+
primaryAgent: "context",
|
|
31
|
+
secondaryAgents: ["planning"],
|
|
32
|
+
taskTemplate: "Prepare comprehensive handoff to {targetUser}: {message}. Extract relevant context, identify dependencies, and create actionable items.",
|
|
33
|
+
defaultOptions: {
|
|
34
|
+
maxParallel: 3,
|
|
35
|
+
reviewStages: 1,
|
|
36
|
+
shareContextRealtime: true
|
|
37
|
+
},
|
|
38
|
+
preprocessor: (args, options) => ({
|
|
39
|
+
task: `Handoff to ${args[0]}: ${args[1]}`,
|
|
40
|
+
context: {
|
|
41
|
+
targetUser: args[0],
|
|
42
|
+
message: args[1],
|
|
43
|
+
priority: options.priority || "medium",
|
|
44
|
+
frames: options.frames || []
|
|
45
|
+
}
|
|
46
|
+
}),
|
|
47
|
+
postprocessor: (result) => ({
|
|
48
|
+
success: result.success,
|
|
49
|
+
message: `Handoff ${result.success ? "completed" : "failed"}`,
|
|
50
|
+
data: result.rootNode.result
|
|
51
|
+
})
|
|
52
|
+
});
|
|
53
|
+
mappings.set("checkpoint", {
|
|
54
|
+
skillName: "checkpoint",
|
|
55
|
+
primaryAgent: "context",
|
|
56
|
+
secondaryAgents: ["code"],
|
|
57
|
+
taskTemplate: "Create recovery checkpoint: {description}. Capture current state, identify risky operations, and backup critical files.",
|
|
58
|
+
defaultOptions: {
|
|
59
|
+
maxParallel: 2,
|
|
60
|
+
reviewStages: 0,
|
|
61
|
+
verboseLogging: false
|
|
62
|
+
},
|
|
63
|
+
preprocessor: (args, options) => ({
|
|
64
|
+
task: `${args[0]} checkpoint: ${args[1]}`,
|
|
65
|
+
context: {
|
|
66
|
+
operation: args[0],
|
|
67
|
+
description: args[1],
|
|
68
|
+
...options
|
|
69
|
+
}
|
|
70
|
+
})
|
|
71
|
+
});
|
|
72
|
+
mappings.set("dig", {
|
|
73
|
+
skillName: "dig",
|
|
74
|
+
primaryAgent: "context",
|
|
75
|
+
taskTemplate: "Deep archaeological search: {query}. Analyze patterns, extract decisions, and build timeline.",
|
|
76
|
+
defaultOptions: {
|
|
77
|
+
maxParallel: 1,
|
|
78
|
+
maxTokensPerAgent: 5e4,
|
|
79
|
+
reviewStages: 0
|
|
80
|
+
},
|
|
81
|
+
preprocessor: (args, options) => ({
|
|
82
|
+
task: `Archaeological dig: ${args[0]}`,
|
|
83
|
+
context: {
|
|
84
|
+
query: args[0],
|
|
85
|
+
depth: options.depth || "30days",
|
|
86
|
+
patterns: options.patterns,
|
|
87
|
+
decisions: options.decisions,
|
|
88
|
+
timeline: options.timeline
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
});
|
|
92
|
+
mappings.set("lint", {
|
|
93
|
+
skillName: "lint",
|
|
94
|
+
primaryAgent: "linting",
|
|
95
|
+
secondaryAgents: ["improve"],
|
|
96
|
+
taskTemplate: "Comprehensive linting of {path}: Check syntax, types, formatting, security, performance, and dead code. Provide fixes.",
|
|
97
|
+
defaultOptions: {
|
|
98
|
+
maxParallel: 1,
|
|
99
|
+
reviewStages: 0,
|
|
100
|
+
verboseLogging: true
|
|
101
|
+
},
|
|
102
|
+
preprocessor: (args, options) => ({
|
|
103
|
+
task: `Lint ${args[0] || "current directory"}`,
|
|
104
|
+
context: {
|
|
105
|
+
path: args[0] || process.cwd(),
|
|
106
|
+
fix: options.fix,
|
|
107
|
+
focus: options.security ? "security" : options.performance ? "performance" : "all"
|
|
108
|
+
}
|
|
109
|
+
}),
|
|
110
|
+
postprocessor: (result) => {
|
|
111
|
+
const lintingNode = this.findNodeByAgent(result.rootNode, "linting");
|
|
112
|
+
return {
|
|
113
|
+
success: result.success,
|
|
114
|
+
message: `Found ${result.issuesFound} issues, fixed ${result.issuesFixed}`,
|
|
115
|
+
data: {
|
|
116
|
+
issues: lintingNode?.result?.issues || [],
|
|
117
|
+
fixes: lintingNode?.result?.fixes || [],
|
|
118
|
+
stats: {
|
|
119
|
+
found: result.issuesFound,
|
|
120
|
+
fixed: result.issuesFixed,
|
|
121
|
+
duration: result.duration
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
mappings.set("test", {
|
|
128
|
+
skillName: "test",
|
|
129
|
+
primaryAgent: "testing",
|
|
130
|
+
secondaryAgents: ["code", "review"],
|
|
131
|
+
taskTemplate: "Generate comprehensive {testMode} tests for {target}. Ensure high coverage and meaningful assertions.",
|
|
132
|
+
defaultOptions: {
|
|
133
|
+
maxParallel: 3,
|
|
134
|
+
testGenerationMode: "all",
|
|
135
|
+
reviewStages: 2,
|
|
136
|
+
qualityThreshold: 0.9
|
|
137
|
+
},
|
|
138
|
+
preprocessor: (args, options) => ({
|
|
139
|
+
task: `Generate tests for ${args[0] || "project"}`,
|
|
140
|
+
context: {
|
|
141
|
+
target: args[0] || process.cwd(),
|
|
142
|
+
testMode: options.mode || "all",
|
|
143
|
+
coverage: options.coverage || "high"
|
|
144
|
+
}
|
|
145
|
+
})
|
|
146
|
+
});
|
|
147
|
+
mappings.set("review", {
|
|
148
|
+
skillName: "review",
|
|
149
|
+
primaryAgent: "review",
|
|
150
|
+
secondaryAgents: ["improve", "testing"],
|
|
151
|
+
taskTemplate: "Multi-stage code review of {target}. Analyze architecture, quality, performance, security. Suggest improvements.",
|
|
152
|
+
defaultOptions: {
|
|
153
|
+
maxParallel: 2,
|
|
154
|
+
reviewStages: 3,
|
|
155
|
+
qualityThreshold: 0.85,
|
|
156
|
+
verboseLogging: true
|
|
157
|
+
},
|
|
158
|
+
preprocessor: (args, options) => ({
|
|
159
|
+
task: `Review code in ${args[0] || "project"}`,
|
|
160
|
+
context: {
|
|
161
|
+
target: args[0] || process.cwd(),
|
|
162
|
+
focus: options.focus || "all",
|
|
163
|
+
autofix: options.fix || false
|
|
164
|
+
}
|
|
165
|
+
})
|
|
166
|
+
});
|
|
167
|
+
mappings.set("refactor", {
|
|
168
|
+
skillName: "refactor",
|
|
169
|
+
primaryAgent: "code",
|
|
170
|
+
secondaryAgents: ["review", "improve", "testing"],
|
|
171
|
+
taskTemplate: "Refactor {target}: Improve architecture, reduce complexity, enhance maintainability. Preserve functionality.",
|
|
172
|
+
defaultOptions: {
|
|
173
|
+
maxParallel: 4,
|
|
174
|
+
reviewStages: 2,
|
|
175
|
+
qualityThreshold: 0.9,
|
|
176
|
+
testGenerationMode: "unit"
|
|
177
|
+
},
|
|
178
|
+
preprocessor: (args, options) => ({
|
|
179
|
+
task: `Refactor ${args[0] || "codebase"}`,
|
|
180
|
+
context: {
|
|
181
|
+
target: args[0] || process.cwd(),
|
|
182
|
+
scope: options.scope || "moderate",
|
|
183
|
+
preserveApi: options.preserveApi !== false
|
|
184
|
+
}
|
|
185
|
+
})
|
|
186
|
+
});
|
|
187
|
+
mappings.set("publish", {
|
|
188
|
+
skillName: "publish",
|
|
189
|
+
primaryAgent: "publish",
|
|
190
|
+
secondaryAgents: ["testing", "linting"],
|
|
191
|
+
taskTemplate: "Prepare and execute {publishType} release. Run tests, update versions, generate changelog, publish.",
|
|
192
|
+
defaultOptions: {
|
|
193
|
+
maxParallel: 1,
|
|
194
|
+
reviewStages: 1,
|
|
195
|
+
testGenerationMode: "all"
|
|
196
|
+
},
|
|
197
|
+
preprocessor: (args, options) => ({
|
|
198
|
+
task: `Publish ${options.type || "npm"} release`,
|
|
199
|
+
context: {
|
|
200
|
+
version: args[0],
|
|
201
|
+
publishType: options.type || "npm",
|
|
202
|
+
prerelease: options.prerelease || false,
|
|
203
|
+
skipTests: options.skipTests || false
|
|
204
|
+
}
|
|
205
|
+
})
|
|
206
|
+
});
|
|
207
|
+
return mappings;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Execute any skill through RLM orchestration first
|
|
211
|
+
*/
|
|
212
|
+
async executeSkill(skillName, args, options) {
|
|
213
|
+
logger.info(`Executing skill through RLM: ${skillName}`, { args, options });
|
|
214
|
+
const mapping = this.skillMappings.get(skillName);
|
|
215
|
+
if (mapping) {
|
|
216
|
+
return this.executeViaRLM(mapping, args, options || {});
|
|
217
|
+
}
|
|
218
|
+
if (skillName === "rlm") {
|
|
219
|
+
const task = args.join(" ") || "Analyze and optimize current code";
|
|
220
|
+
const result = await this.rlmOrchestrator.execute(
|
|
221
|
+
task,
|
|
222
|
+
options || {},
|
|
223
|
+
options
|
|
224
|
+
);
|
|
225
|
+
return {
|
|
226
|
+
success: result.success,
|
|
227
|
+
message: `RLM execution ${result.success ? "completed" : "failed"}`,
|
|
228
|
+
data: result
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
logger.warn(`Skill ${skillName} not mapped to RLM, using legacy execution`);
|
|
232
|
+
return this.skillsManager.executeSkill(skillName, args, options);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Execute skill via RLM orchestration
|
|
236
|
+
*/
|
|
237
|
+
async executeViaRLM(mapping, args, options) {
|
|
238
|
+
try {
|
|
239
|
+
const { task, context } = mapping.preprocessor ? mapping.preprocessor(args, options) : {
|
|
240
|
+
task: mapping.taskTemplate.replace("{args}", args.join(" ")),
|
|
241
|
+
context: { args, ...options }
|
|
242
|
+
};
|
|
243
|
+
const rlmOptions = {
|
|
244
|
+
...mapping.defaultOptions,
|
|
245
|
+
...options,
|
|
246
|
+
// Force specific agents if specified
|
|
247
|
+
agents: [mapping.primaryAgent, ...mapping.secondaryAgents || []]
|
|
248
|
+
};
|
|
249
|
+
const result = await this.rlmOrchestrator.execute(
|
|
250
|
+
task,
|
|
251
|
+
context,
|
|
252
|
+
rlmOptions
|
|
253
|
+
);
|
|
254
|
+
if (mapping.postprocessor) {
|
|
255
|
+
return mapping.postprocessor(result);
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
success: result.success,
|
|
259
|
+
message: `${mapping.skillName} ${result.success ? "completed" : "failed"}`,
|
|
260
|
+
data: {
|
|
261
|
+
duration: result.duration,
|
|
262
|
+
tokens: result.totalTokens,
|
|
263
|
+
cost: result.totalCost,
|
|
264
|
+
improvements: result.improvements,
|
|
265
|
+
testsGenerated: result.testsGenerated,
|
|
266
|
+
issuesFound: result.issuesFound,
|
|
267
|
+
issuesFixed: result.issuesFixed,
|
|
268
|
+
details: result.rootNode
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
} catch (error) {
|
|
272
|
+
logger.error(`RLM execution failed for ${mapping.skillName}:`, error);
|
|
273
|
+
return {
|
|
274
|
+
success: false,
|
|
275
|
+
message: `Failed to execute ${mapping.skillName}: ${error.message}`
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Helper: Find node by agent type in task tree
|
|
281
|
+
*/
|
|
282
|
+
findNodeByAgent(node, agentType) {
|
|
283
|
+
if (node.agent === agentType) {
|
|
284
|
+
return node;
|
|
285
|
+
}
|
|
286
|
+
if (node.children) {
|
|
287
|
+
for (const child of node.children) {
|
|
288
|
+
const found = this.findNodeByAgent(child, agentType);
|
|
289
|
+
if (found) return found;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Get available skills (all RLM-mapped + legacy)
|
|
296
|
+
*/
|
|
297
|
+
getAvailableSkills() {
|
|
298
|
+
const rlmSkills = Array.from(this.skillMappings.keys());
|
|
299
|
+
const legacySkills = this.skillsManager.getAvailableSkills();
|
|
300
|
+
const allSkills = /* @__PURE__ */ new Set([...rlmSkills, ...legacySkills, "rlm"]);
|
|
301
|
+
return Array.from(allSkills);
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Get skill help
|
|
305
|
+
*/
|
|
306
|
+
getSkillHelp(skillName) {
|
|
307
|
+
const mapping = this.skillMappings.get(skillName);
|
|
308
|
+
if (mapping) {
|
|
309
|
+
return `
|
|
310
|
+
${skillName} (RLM-Orchestrated)
|
|
311
|
+
Primary Agent: ${mapping.primaryAgent}
|
|
312
|
+
Secondary Agents: ${mapping.secondaryAgents?.join(", ") || "none"}
|
|
313
|
+
|
|
314
|
+
${mapping.taskTemplate}
|
|
315
|
+
|
|
316
|
+
This skill is executed through RLM orchestration for:
|
|
317
|
+
- Automatic task decomposition
|
|
318
|
+
- Parallel agent execution
|
|
319
|
+
- Multi-stage quality review
|
|
320
|
+
- Comprehensive result aggregation
|
|
321
|
+
`;
|
|
322
|
+
}
|
|
323
|
+
return this.skillsManager.getSkillHelp(skillName);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Execute task with intelligent routing
|
|
327
|
+
*/
|
|
328
|
+
async executeTask(task, context) {
|
|
329
|
+
const taskAnalysis = this.analyzeTask(task);
|
|
330
|
+
if (taskAnalysis.suggestedSkill) {
|
|
331
|
+
return this.executeSkill(
|
|
332
|
+
taskAnalysis.suggestedSkill,
|
|
333
|
+
taskAnalysis.args,
|
|
334
|
+
taskAnalysis.options
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
const result = await this.rlmOrchestrator.execute(task, context || {}, {
|
|
338
|
+
maxParallel: 5,
|
|
339
|
+
reviewStages: 2,
|
|
340
|
+
qualityThreshold: 0.85,
|
|
341
|
+
verboseLogging: true
|
|
342
|
+
});
|
|
343
|
+
return {
|
|
344
|
+
success: result.success,
|
|
345
|
+
message: `Task ${result.success ? "completed" : "failed"}`,
|
|
346
|
+
data: result
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Analyze task to determine best routing
|
|
351
|
+
*/
|
|
352
|
+
analyzeTask(task) {
|
|
353
|
+
const taskLower = task.toLowerCase();
|
|
354
|
+
const patterns = [
|
|
355
|
+
{ pattern: /lint|format|style|quality/i, skill: "lint" },
|
|
356
|
+
{ pattern: /test|coverage|unit|integration/i, skill: "test" },
|
|
357
|
+
{ pattern: /review|analyze|improve/i, skill: "review" },
|
|
358
|
+
{ pattern: /refactor|restructure|clean/i, skill: "refactor" },
|
|
359
|
+
{ pattern: /handoff|transfer|pass/i, skill: "handoff" },
|
|
360
|
+
{ pattern: /checkpoint|backup|save/i, skill: "checkpoint" },
|
|
361
|
+
{ pattern: /search|find|dig|history/i, skill: "dig" },
|
|
362
|
+
{ pattern: /publish|release|deploy/i, skill: "publish" }
|
|
363
|
+
];
|
|
364
|
+
for (const { pattern, skill } of patterns) {
|
|
365
|
+
if (pattern.test(taskLower)) {
|
|
366
|
+
return {
|
|
367
|
+
suggestedSkill: skill,
|
|
368
|
+
args: [task],
|
|
369
|
+
options: {}
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return {
|
|
374
|
+
args: [task],
|
|
375
|
+
options: {}
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
let unifiedOrchestrator = null;
|
|
380
|
+
function initializeUnifiedOrchestrator(frameManager, dualStackManager, contextRetriever, taskStore, skillContext) {
|
|
381
|
+
if (!unifiedOrchestrator) {
|
|
382
|
+
unifiedOrchestrator = new UnifiedRLMOrchestrator(
|
|
383
|
+
frameManager,
|
|
384
|
+
dualStackManager,
|
|
385
|
+
contextRetriever,
|
|
386
|
+
taskStore,
|
|
387
|
+
skillContext
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
return unifiedOrchestrator;
|
|
391
|
+
}
|
|
392
|
+
function getUnifiedOrchestrator() {
|
|
393
|
+
return unifiedOrchestrator;
|
|
394
|
+
}
|
|
395
|
+
export {
|
|
396
|
+
UnifiedRLMOrchestrator,
|
|
397
|
+
getUnifiedOrchestrator,
|
|
398
|
+
initializeUnifiedOrchestrator
|
|
399
|
+
};
|
|
400
|
+
//# sourceMappingURL=unified-rlm-orchestrator.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/skills/unified-rlm-orchestrator.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Unified RLM-First Orchestrator for StackMemory\n *\n * All skills and tasks flow through RLM orchestration first,\n * ensuring consistent decomposition, parallel execution, and quality control.\n */\n\nimport {\n RecursiveAgentOrchestrator,\n type RLMOptions,\n type SubagentType,\n type ExecutionResult,\n} from './recursive-agent-orchestrator.js';\nimport {\n ClaudeSkillsManager,\n type SkillContext,\n type SkillResult,\n} from './claude-skills.js';\nimport { logger } from '../core/monitoring/logger.js';\nimport type { DualStackManager } from '../core/context/dual-stack-manager.js';\nimport type { ContextRetriever } from '../core/retrieval/context-retriever.js';\nimport type { FrameManager } from '../core/context/frame-manager.js';\nimport type { LinearTaskManager } from '../features/tasks/linear-task-manager.js';\n\n// Skill to RLM mapping configuration\ninterface SkillToRLMConfig {\n skillName: string;\n primaryAgent: SubagentType;\n secondaryAgents?: SubagentType[];\n taskTemplate: string;\n defaultOptions?: Partial<RLMOptions>;\n preprocessor?: (\n args: string[],\n options: Record<string, any>\n ) => { task: string; context: Record<string, any> };\n postprocessor?: (result: ExecutionResult) => SkillResult;\n}\n\n/**\n * UnifiedRLMOrchestrator - Routes all skills through RLM first\n */\nexport class UnifiedRLMOrchestrator {\n private rlmOrchestrator: RecursiveAgentOrchestrator;\n private skillsManager: ClaudeSkillsManager;\n private skillMappings: Map<string, SkillToRLMConfig>;\n\n constructor(\n frameManager: FrameManager,\n dualStackManager: DualStackManager,\n contextRetriever: ContextRetriever,\n taskStore: LinearTaskManager,\n skillContext: SkillContext\n ) {\n // Initialize RLM orchestrator\n this.rlmOrchestrator = new RecursiveAgentOrchestrator(\n frameManager,\n dualStackManager,\n contextRetriever,\n taskStore\n );\n\n // Initialize skills manager (for legacy compatibility)\n this.skillsManager = new ClaudeSkillsManager(skillContext);\n\n // Initialize skill mappings\n this.skillMappings = this.initializeSkillMappings();\n\n logger.info('Unified RLM Orchestrator initialized with RLM-first routing');\n }\n\n /**\n * Initialize skill to RLM agent mappings\n */\n private initializeSkillMappings(): Map<string, SkillToRLMConfig> {\n const mappings = new Map<string, SkillToRLMConfig>();\n\n // Handoff skill -> Context + Planning agents\n mappings.set('handoff', {\n skillName: 'handoff',\n primaryAgent: 'context',\n secondaryAgents: ['planning'],\n taskTemplate:\n 'Prepare comprehensive handoff to {targetUser}: {message}. Extract relevant context, identify dependencies, and create actionable items.',\n defaultOptions: {\n maxParallel: 3,\n reviewStages: 1,\n shareContextRealtime: true,\n },\n preprocessor: (args, options) => ({\n task: `Handoff to ${args[0]}: ${args[1]}`,\n context: {\n targetUser: args[0],\n message: args[1],\n priority: options.priority || 'medium',\n frames: options.frames || [],\n },\n }),\n postprocessor: (result) => ({\n success: result.success,\n message: `Handoff ${result.success ? 'completed' : 'failed'}`,\n data: result.rootNode.result,\n }),\n });\n\n // Checkpoint skill -> Context + Code agents\n mappings.set('checkpoint', {\n skillName: 'checkpoint',\n primaryAgent: 'context',\n secondaryAgents: ['code'],\n taskTemplate:\n 'Create recovery checkpoint: {description}. Capture current state, identify risky operations, and backup critical files.',\n defaultOptions: {\n maxParallel: 2,\n reviewStages: 0,\n verboseLogging: false,\n },\n preprocessor: (args, options) => ({\n task: `${args[0]} checkpoint: ${args[1]}`,\n context: {\n operation: args[0],\n description: args[1],\n ...options,\n },\n }),\n });\n\n // Dig skill -> Context agent (deep search)\n mappings.set('dig', {\n skillName: 'dig',\n primaryAgent: 'context',\n taskTemplate:\n 'Deep archaeological search: {query}. Analyze patterns, extract decisions, and build timeline.',\n defaultOptions: {\n maxParallel: 1,\n maxTokensPerAgent: 50000,\n reviewStages: 0,\n },\n preprocessor: (args, options) => ({\n task: `Archaeological dig: ${args[0]}`,\n context: {\n query: args[0],\n depth: options.depth || '30days',\n patterns: options.patterns,\n decisions: options.decisions,\n timeline: options.timeline,\n },\n }),\n });\n\n // Lint skill -> Linting agent primarily\n mappings.set('lint', {\n skillName: 'lint',\n primaryAgent: 'linting',\n secondaryAgents: ['improve'],\n taskTemplate:\n 'Comprehensive linting of {path}: Check syntax, types, formatting, security, performance, and dead code. Provide fixes.',\n defaultOptions: {\n maxParallel: 1,\n reviewStages: 0,\n verboseLogging: true,\n },\n preprocessor: (args, options) => ({\n task: `Lint ${args[0] || 'current directory'}`,\n context: {\n path: args[0] || process.cwd(),\n fix: options.fix,\n focus: options.security\n ? 'security'\n : options.performance\n ? 'performance'\n : 'all',\n },\n }),\n postprocessor: (result) => {\n const lintingNode = this.findNodeByAgent(result.rootNode, 'linting');\n return {\n success: result.success,\n message: `Found ${result.issuesFound} issues, fixed ${result.issuesFixed}`,\n data: {\n issues: lintingNode?.result?.issues || [],\n fixes: lintingNode?.result?.fixes || [],\n stats: {\n found: result.issuesFound,\n fixed: result.issuesFixed,\n duration: result.duration,\n },\n },\n };\n },\n });\n\n // Test generation -> Testing agent\n mappings.set('test', {\n skillName: 'test',\n primaryAgent: 'testing',\n secondaryAgents: ['code', 'review'],\n taskTemplate:\n 'Generate comprehensive {testMode} tests for {target}. Ensure high coverage and meaningful assertions.',\n defaultOptions: {\n maxParallel: 3,\n testGenerationMode: 'all',\n reviewStages: 2,\n qualityThreshold: 0.9,\n },\n preprocessor: (args, options) => ({\n task: `Generate tests for ${args[0] || 'project'}`,\n context: {\n target: args[0] || process.cwd(),\n testMode: options.mode || 'all',\n coverage: options.coverage || 'high',\n },\n }),\n });\n\n // Code review -> Review + Improve agents\n mappings.set('review', {\n skillName: 'review',\n primaryAgent: 'review',\n secondaryAgents: ['improve', 'testing'],\n taskTemplate:\n 'Multi-stage code review of {target}. Analyze architecture, quality, performance, security. Suggest improvements.',\n defaultOptions: {\n maxParallel: 2,\n reviewStages: 3,\n qualityThreshold: 0.85,\n verboseLogging: true,\n },\n preprocessor: (args, options) => ({\n task: `Review code in ${args[0] || 'project'}`,\n context: {\n target: args[0] || process.cwd(),\n focus: options.focus || 'all',\n autofix: options.fix || false,\n },\n }),\n });\n\n // Refactor -> Code + Review + Improve agents\n mappings.set('refactor', {\n skillName: 'refactor',\n primaryAgent: 'code',\n secondaryAgents: ['review', 'improve', 'testing'],\n taskTemplate:\n 'Refactor {target}: Improve architecture, reduce complexity, enhance maintainability. Preserve functionality.',\n defaultOptions: {\n maxParallel: 4,\n reviewStages: 2,\n qualityThreshold: 0.9,\n testGenerationMode: 'unit',\n },\n preprocessor: (args, options) => ({\n task: `Refactor ${args[0] || 'codebase'}`,\n context: {\n target: args[0] || process.cwd(),\n scope: options.scope || 'moderate',\n preserveApi: options.preserveApi !== false,\n },\n }),\n });\n\n // Deploy/Publish -> Publish agent\n mappings.set('publish', {\n skillName: 'publish',\n primaryAgent: 'publish',\n secondaryAgents: ['testing', 'linting'],\n taskTemplate:\n 'Prepare and execute {publishType} release. Run tests, update versions, generate changelog, publish.',\n defaultOptions: {\n maxParallel: 1,\n reviewStages: 1,\n testGenerationMode: 'all',\n },\n preprocessor: (args, options) => ({\n task: `Publish ${options.type || 'npm'} release`,\n context: {\n version: args[0],\n publishType: options.type || 'npm',\n prerelease: options.prerelease || false,\n skipTests: options.skipTests || false,\n },\n }),\n });\n\n return mappings;\n }\n\n /**\n * Execute any skill through RLM orchestration first\n */\n async executeSkill(\n skillName: string,\n args: string[],\n options?: Record<string, any>\n ): Promise<SkillResult> {\n logger.info(`Executing skill through RLM: ${skillName}`, { args, options });\n\n // Check if skill has RLM mapping\n const mapping = this.skillMappings.get(skillName);\n\n if (mapping) {\n // Route through RLM orchestrator\n return this.executeViaRLM(mapping, args, options || {});\n }\n\n // Special case: Direct RLM execution\n if (skillName === 'rlm') {\n const task = args.join(' ') || 'Analyze and optimize current code';\n const result = await this.rlmOrchestrator.execute(\n task,\n options || {},\n options as RLMOptions\n );\n return {\n success: result.success,\n message: `RLM execution ${result.success ? 'completed' : 'failed'}`,\n data: result,\n };\n }\n\n // Fallback to legacy skill manager for unmapped skills\n logger.warn(`Skill ${skillName} not mapped to RLM, using legacy execution`);\n return this.skillsManager.executeSkill(skillName, args, options);\n }\n\n /**\n * Execute skill via RLM orchestration\n */\n private async executeViaRLM(\n mapping: SkillToRLMConfig,\n args: string[],\n options: Record<string, any>\n ): Promise<SkillResult> {\n try {\n // Preprocess arguments\n const { task, context } = mapping.preprocessor\n ? mapping.preprocessor(args, options)\n : {\n task: mapping.taskTemplate.replace('{args}', args.join(' ')),\n context: { args, ...options },\n };\n\n // Merge options\n const rlmOptions: RLMOptions = {\n ...mapping.defaultOptions,\n ...options,\n // Force specific agents if specified\n agents: [mapping.primaryAgent, ...(mapping.secondaryAgents || [])],\n };\n\n // Execute through RLM\n const result = await this.rlmOrchestrator.execute(\n task,\n context,\n rlmOptions\n );\n\n // Postprocess result\n if (mapping.postprocessor) {\n return mapping.postprocessor(result);\n }\n\n // Default postprocessing\n return {\n success: result.success,\n message: `${mapping.skillName} ${result.success ? 'completed' : 'failed'}`,\n data: {\n duration: result.duration,\n tokens: result.totalTokens,\n cost: result.totalCost,\n improvements: result.improvements,\n testsGenerated: result.testsGenerated,\n issuesFound: result.issuesFound,\n issuesFixed: result.issuesFixed,\n details: result.rootNode,\n },\n };\n } catch (error: any) {\n logger.error(`RLM execution failed for ${mapping.skillName}:`, error);\n return {\n success: false,\n message: `Failed to execute ${mapping.skillName}: ${error.message}`,\n };\n }\n }\n\n /**\n * Helper: Find node by agent type in task tree\n */\n private findNodeByAgent(node: any, agentType: SubagentType): any {\n if (node.agent === agentType) {\n return node;\n }\n if (node.children) {\n for (const child of node.children) {\n const found = this.findNodeByAgent(child, agentType);\n if (found) return found;\n }\n }\n return null;\n }\n\n /**\n * Get available skills (all RLM-mapped + legacy)\n */\n getAvailableSkills(): string[] {\n const rlmSkills = Array.from(this.skillMappings.keys());\n const legacySkills = this.skillsManager.getAvailableSkills();\n const allSkills = new Set([...rlmSkills, ...legacySkills, 'rlm']);\n return Array.from(allSkills);\n }\n\n /**\n * Get skill help\n */\n getSkillHelp(skillName: string): string {\n const mapping = this.skillMappings.get(skillName);\n if (mapping) {\n return `\n${skillName} (RLM-Orchestrated)\nPrimary Agent: ${mapping.primaryAgent}\nSecondary Agents: ${mapping.secondaryAgents?.join(', ') || 'none'}\n\n${mapping.taskTemplate}\n\nThis skill is executed through RLM orchestration for:\n- Automatic task decomposition\n- Parallel agent execution\n- Multi-stage quality review\n- Comprehensive result aggregation\n`;\n }\n\n // Fallback to legacy help\n return this.skillsManager.getSkillHelp(skillName);\n }\n\n /**\n * Execute task with intelligent routing\n */\n async executeTask(\n task: string,\n context?: Record<string, any>\n ): Promise<SkillResult> {\n // Analyze task to determine best skill/agent combination\n const taskAnalysis = this.analyzeTask(task);\n\n if (taskAnalysis.suggestedSkill) {\n // Route to specific skill\n return this.executeSkill(\n taskAnalysis.suggestedSkill,\n taskAnalysis.args,\n taskAnalysis.options\n );\n }\n\n // Direct RLM execution for complex/ambiguous tasks\n const result = await this.rlmOrchestrator.execute(task, context || {}, {\n maxParallel: 5,\n reviewStages: 2,\n qualityThreshold: 0.85,\n verboseLogging: true,\n });\n\n return {\n success: result.success,\n message: `Task ${result.success ? 'completed' : 'failed'}`,\n data: result,\n };\n }\n\n /**\n * Analyze task to determine best routing\n */\n private analyzeTask(task: string): {\n suggestedSkill?: string;\n args: string[];\n options: Record<string, any>;\n } {\n const taskLower = task.toLowerCase();\n\n // Pattern matching for skill detection\n const patterns = [\n { pattern: /lint|format|style|quality/i, skill: 'lint' },\n { pattern: /test|coverage|unit|integration/i, skill: 'test' },\n { pattern: /review|analyze|improve/i, skill: 'review' },\n { pattern: /refactor|restructure|clean/i, skill: 'refactor' },\n { pattern: /handoff|transfer|pass/i, skill: 'handoff' },\n { pattern: /checkpoint|backup|save/i, skill: 'checkpoint' },\n { pattern: /search|find|dig|history/i, skill: 'dig' },\n { pattern: /publish|release|deploy/i, skill: 'publish' },\n ];\n\n for (const { pattern, skill } of patterns) {\n if (pattern.test(taskLower)) {\n return {\n suggestedSkill: skill,\n args: [task],\n options: {},\n };\n }\n }\n\n // No specific skill detected\n return {\n args: [task],\n options: {},\n };\n }\n}\n\n/**\n * Singleton instance for global access\n */\nlet unifiedOrchestrator: UnifiedRLMOrchestrator | null = null;\n\nexport function initializeUnifiedOrchestrator(\n frameManager: FrameManager,\n dualStackManager: DualStackManager,\n contextRetriever: ContextRetriever,\n taskStore: LinearTaskManager,\n skillContext: SkillContext\n): UnifiedRLMOrchestrator {\n if (!unifiedOrchestrator) {\n unifiedOrchestrator = new UnifiedRLMOrchestrator(\n frameManager,\n dualStackManager,\n contextRetriever,\n taskStore,\n skillContext\n );\n }\n return unifiedOrchestrator;\n}\n\nexport function getUnifiedOrchestrator(): UnifiedRLMOrchestrator | null {\n return unifiedOrchestrator;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stackmemoryai/stackmemory",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.11",
|
|
4
4
|
"description": "Lossless memory runtime for AI coding tools - organizes context as a call stack instead of linear chat logs, with team collaboration and infinite retention",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=20.0.0",
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
"test:ui": "vitest --ui",
|
|
53
53
|
"test:run": "vitest run",
|
|
54
54
|
"test:pre-publish": "./scripts/test-pre-publish-quick.sh",
|
|
55
|
+
"test:pre-commit": "vitest related --run --reporter=dot --silent --bail=1",
|
|
55
56
|
"prepublishOnly": "npm run build && npm run test:pre-publish",
|
|
56
57
|
"quality": "npm run lint && npm run test:run && npm run build",
|
|
57
58
|
"dev": "tsx watch src/mcp/mcp-server.ts",
|
|
@@ -63,7 +64,7 @@
|
|
|
63
64
|
"tui": "npm run build && node dist/features/tui/index.js",
|
|
64
65
|
"tui:dev": "./scripts/dev-tui.sh",
|
|
65
66
|
"tui:watch": "npm run build && nodemon --watch src/features/tui --watch src/cli --watch src/skills -e ts --exec 'npm run build && node dist/features/tui/index.js'",
|
|
66
|
-
"claude:setup": "
|
|
67
|
+
"claude:setup": "node scripts/setup-claude-integration.js",
|
|
67
68
|
"daemons:start": "node scripts/claude-sm-autostart.js",
|
|
68
69
|
"daemons:status": "node scripts/claude-sm-autostart.js status",
|
|
69
70
|
"daemons:stop": "node scripts/claude-sm-autostart.js stop",
|
|
@@ -112,6 +113,7 @@
|
|
|
112
113
|
"puppeteer": "^24.34.0",
|
|
113
114
|
"rate-limiter-flexible": "^9.0.1",
|
|
114
115
|
"redis": "^5.10.0",
|
|
116
|
+
"shell-escape": "^0.2.0",
|
|
115
117
|
"simple-peer": "^9.11.1",
|
|
116
118
|
"socket.io": "^4.6.0",
|
|
117
119
|
"socket.io-client": "^4.6.0",
|
|
@@ -148,9 +150,6 @@
|
|
|
148
150
|
"*.{ts,js}": [
|
|
149
151
|
"npm run lint:fix",
|
|
150
152
|
"prettier --write"
|
|
151
|
-
],
|
|
152
|
-
"*.ts": [
|
|
153
|
-
"vitest related --run"
|
|
154
153
|
]
|
|
155
154
|
},
|
|
156
155
|
"optionalDependencies": {
|