@stackmemoryai/stackmemory 0.3.17 → 0.3.19

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 (234) hide show
  1. package/dist/cli/claude-sm.js +51 -5
  2. package/dist/cli/claude-sm.js.map +2 -2
  3. package/dist/cli/codex-sm.js +52 -19
  4. package/dist/cli/codex-sm.js.map +2 -2
  5. package/dist/cli/commands/db.js +143 -0
  6. package/dist/cli/commands/db.js.map +7 -0
  7. package/dist/cli/commands/login.js +50 -0
  8. package/dist/cli/commands/login.js.map +7 -0
  9. package/dist/cli/commands/migrate.js +178 -0
  10. package/dist/cli/commands/migrate.js.map +7 -0
  11. package/dist/cli/commands/onboard.js +158 -2
  12. package/dist/cli/commands/onboard.js.map +2 -2
  13. package/dist/cli/commands/skills.js +15 -2
  14. package/dist/cli/commands/skills.js.map +2 -2
  15. package/dist/cli/index.js +118 -834
  16. package/dist/cli/index.js.map +3 -3
  17. package/dist/core/context/dual-stack-manager.js +1 -1
  18. package/dist/core/context/dual-stack-manager.js.map +1 -1
  19. package/dist/core/context/frame-database.js +1 -0
  20. package/dist/core/context/frame-database.js.map +2 -2
  21. package/dist/core/context/frame-manager.js +59 -2
  22. package/dist/core/context/frame-manager.js.map +2 -2
  23. package/dist/core/database/database-adapter.js +6 -1
  24. package/dist/core/database/database-adapter.js.map +2 -2
  25. package/dist/core/database/sqlite-adapter.js +60 -2
  26. package/dist/core/database/sqlite-adapter.js.map +2 -2
  27. package/dist/integrations/claude-code/subagent-client.js +106 -3
  28. package/dist/integrations/claude-code/subagent-client.js.map +2 -2
  29. package/dist/servers/railway/config.js +51 -0
  30. package/dist/servers/railway/config.js.map +7 -0
  31. package/dist/servers/railway/index-enhanced.js +156 -0
  32. package/dist/servers/railway/index-enhanced.js.map +7 -0
  33. package/dist/servers/railway/index.js +843 -82
  34. package/dist/servers/railway/index.js.map +3 -3
  35. package/dist/servers/railway/minimal.js +48 -3
  36. package/dist/servers/railway/minimal.js.map +2 -2
  37. package/dist/servers/railway/storage-test.js +455 -0
  38. package/dist/servers/railway/storage-test.js.map +7 -0
  39. package/dist/skills/claude-skills.js +13 -12
  40. package/dist/skills/claude-skills.js.map +2 -2
  41. package/dist/skills/recursive-agent-orchestrator.js +27 -18
  42. package/dist/skills/recursive-agent-orchestrator.js.map +2 -2
  43. package/dist/skills/unified-rlm-orchestrator.js.map +2 -2
  44. package/package.json +13 -21
  45. package/scripts/README-TESTING.md +186 -0
  46. package/scripts/analyze-cli-security.js +288 -0
  47. package/scripts/archive/add-phase-tasks-to-linear.js +163 -0
  48. package/scripts/archive/analyze-linear-duplicates.js +214 -0
  49. package/scripts/archive/analyze-remaining-duplicates.js +230 -0
  50. package/scripts/archive/analyze-sta-duplicates.js +292 -0
  51. package/scripts/archive/analyze-sta-graphql.js +399 -0
  52. package/scripts/archive/cancel-duplicate-tasks.ts +246 -0
  53. package/scripts/archive/check-all-duplicates.ts +419 -0
  54. package/scripts/archive/clean-duplicate-tasks.js +114 -0
  55. package/scripts/archive/cleanup-duplicate-tasks.ts +286 -0
  56. package/scripts/archive/create-phase-tasks.js +387 -0
  57. package/scripts/archive/delete-linear-duplicates.js +182 -0
  58. package/scripts/archive/delete-remaining-duplicates.js +158 -0
  59. package/scripts/archive/delete-sta-duplicates.js +201 -0
  60. package/scripts/archive/delete-sta-oauth.js +201 -0
  61. package/scripts/archive/export-sta-tasks.js +62 -0
  62. package/scripts/archive/install-auto-sync.js +266 -0
  63. package/scripts/archive/install-chromadb-hooks.sh +133 -0
  64. package/scripts/archive/install-enhanced-clear-hooks.sh +431 -0
  65. package/scripts/archive/install-post-task-hooks.sh +289 -0
  66. package/scripts/archive/install-stackmemory-hooks.sh +420 -0
  67. package/scripts/archive/merge-linear-duplicates-safe.ts +362 -0
  68. package/scripts/archive/merge-linear-duplicates.ts +180 -0
  69. package/scripts/archive/remove-sta-tasks.js +70 -0
  70. package/scripts/archive/setup-background-sync.sh +168 -0
  71. package/scripts/archive/setup-claude-auto-triggers.sh +181 -0
  72. package/scripts/archive/setup-claude-autostart.sh +305 -0
  73. package/scripts/archive/setup-git-hooks.sh +25 -0
  74. package/scripts/archive/setup-linear-oauth.sh +46 -0
  75. package/scripts/archive/setup-mcp.sh +113 -0
  76. package/scripts/archive/setup-railway-deployment.sh +81 -0
  77. package/scripts/auto-handoff.sh +262 -0
  78. package/scripts/background-sync-manager.js +416 -0
  79. package/scripts/benchmark-performance.ts +57 -0
  80. package/scripts/check-redis.ts +48 -0
  81. package/scripts/chromadb-auto-loader.sh +128 -0
  82. package/scripts/chromadb-context-loader.js +479 -0
  83. package/scripts/claude-chromadb-hook.js +460 -0
  84. package/scripts/claude-code-wrapper.sh +66 -0
  85. package/scripts/claude-linear-skill.js +455 -0
  86. package/scripts/claude-pre-commit.sh +302 -0
  87. package/scripts/claude-sm-autostart.js +532 -0
  88. package/scripts/claude-sm-setup.sh +367 -0
  89. package/scripts/claude-with-chromadb.sh +69 -0
  90. package/scripts/claude-worktree-manager.sh +323 -0
  91. package/scripts/claude-worktree-monitor.sh +371 -0
  92. package/scripts/claude-worktree-setup.sh +327 -0
  93. package/scripts/clean-linear-backlog.js +273 -0
  94. package/scripts/cleanup-old-sessions.sh +57 -0
  95. package/scripts/codex-wrapper.sh +88 -0
  96. package/scripts/create-sandbox.sh +269 -0
  97. package/scripts/debug-linear-update.js +174 -0
  98. package/scripts/delete-linear-tasks.js +167 -0
  99. package/scripts/deploy.sh +89 -0
  100. package/scripts/deployment/railway.sh +352 -0
  101. package/scripts/deployment/test-deployment.js +194 -0
  102. package/scripts/detect-and-rehydrate.js +162 -0
  103. package/scripts/detect-and-rehydrate.mjs +165 -0
  104. package/scripts/development/create-demo-tasks.js +143 -0
  105. package/scripts/development/debug-frame-test.js +16 -0
  106. package/scripts/development/demo-auto-sync.js +128 -0
  107. package/scripts/development/fix-all-imports.js +213 -0
  108. package/scripts/development/fix-imports.js +229 -0
  109. package/scripts/development/fix-lint-loop.cjs +103 -0
  110. package/scripts/development/fix-project-id.ts +161 -0
  111. package/scripts/development/fix-strict-mode-issues.ts +291 -0
  112. package/scripts/development/reorganize-structure.sh +228 -0
  113. package/scripts/development/test-persistence-direct.js +148 -0
  114. package/scripts/development/test-persistence.js +114 -0
  115. package/scripts/development/test-tasks.js +93 -0
  116. package/scripts/development/update-imports.js +212 -0
  117. package/scripts/fetch-linear-status.js +125 -0
  118. package/scripts/git-hooks/README.md +310 -0
  119. package/scripts/git-hooks/branch-context-manager.sh +342 -0
  120. package/scripts/git-hooks/post-checkout-stackmemory.sh +63 -0
  121. package/scripts/git-hooks/post-commit-stackmemory.sh +305 -0
  122. package/scripts/git-hooks/pre-commit-stackmemory.sh +275 -0
  123. package/scripts/hooks/cleanup-shell.sh +130 -0
  124. package/scripts/hooks/task-complete.sh +114 -0
  125. package/scripts/initialize.ts +129 -0
  126. package/scripts/install-claude-hooks-auto.js +104 -0
  127. package/scripts/install-claude-hooks.sh +133 -0
  128. package/scripts/install-global.sh +296 -0
  129. package/scripts/install.sh +235 -0
  130. package/scripts/linear-auto-sync.js +262 -0
  131. package/scripts/linear-auto-sync.sh +161 -0
  132. package/scripts/linear-sync-daemon.js +150 -0
  133. package/scripts/linear-task-review.js +237 -0
  134. package/scripts/list-linear-tasks.ts +178 -0
  135. package/scripts/mcp-proxy.js +66 -0
  136. package/scripts/opencode-wrapper.sh +85 -0
  137. package/scripts/publish-local.js +74 -0
  138. package/scripts/query-chromadb.ts +201 -0
  139. package/scripts/railway-env-setup.sh +39 -0
  140. package/scripts/reconcile-local-tasks.js +170 -0
  141. package/scripts/recreate-frames-db.js +89 -0
  142. package/scripts/setup/claude-integration.js +138 -0
  143. package/scripts/setup/configure-alias.js +125 -0
  144. package/scripts/setup/configure-codex-alias.js +161 -0
  145. package/scripts/setup/configure-opencode-alias.js +175 -0
  146. package/scripts/setup-claude-integration.js +204 -0
  147. package/scripts/setup-claude-integration.sh +183 -0
  148. package/scripts/setup-railway-deployment.sh +37 -0
  149. package/scripts/setup.sh +31 -0
  150. package/scripts/show-linear-summary.ts +172 -0
  151. package/scripts/stackmemory-auto-handoff.sh +231 -0
  152. package/scripts/stackmemory-daemon.sh +40 -0
  153. package/scripts/start-linear-sync-daemon.sh +141 -0
  154. package/scripts/start-temporal-paradox.sh +214 -0
  155. package/scripts/status.ts +159 -0
  156. package/scripts/sync-and-clean-tasks.js +258 -0
  157. package/scripts/sync-frames-from-railway.js +228 -0
  158. package/scripts/sync-linear-graphql.js +303 -0
  159. package/scripts/sync-linear-tasks.js +186 -0
  160. package/scripts/test-auto-triggers.sh +57 -0
  161. package/scripts/test-browser-mcp.js +74 -0
  162. package/scripts/test-chromadb-full.js +115 -0
  163. package/scripts/test-chromadb-hooks.sh +28 -0
  164. package/scripts/test-chromadb-sync.ts +245 -0
  165. package/scripts/test-cli-security.js +293 -0
  166. package/scripts/test-hooks-persistence.sh +220 -0
  167. package/scripts/test-installation-scenarios.sh +359 -0
  168. package/scripts/test-installation.sh +224 -0
  169. package/scripts/test-mcp.js +163 -0
  170. package/scripts/test-pre-publish-quick.sh +75 -0
  171. package/scripts/test-quality-gates.sh +263 -0
  172. package/scripts/test-railway-db.js +222 -0
  173. package/scripts/test-redis-storage.ts +490 -0
  174. package/scripts/test-rlm-basic.sh +122 -0
  175. package/scripts/test-rlm-comprehensive.sh +260 -0
  176. package/scripts/test-rlm-e2e.sh +268 -0
  177. package/scripts/test-rlm-simple.js +90 -0
  178. package/scripts/test-rlm.js +110 -0
  179. package/scripts/test-session-handoff.sh +165 -0
  180. package/scripts/test-shell-integration.sh +275 -0
  181. package/scripts/testing/ab-test-runner.ts +508 -0
  182. package/scripts/testing/collect-metrics.ts +457 -0
  183. package/scripts/testing/quick-effectiveness-demo.js +187 -0
  184. package/scripts/testing/real-performance-test.js +422 -0
  185. package/scripts/testing/run-effectiveness-tests.sh +176 -0
  186. package/scripts/testing/scripts/testing/ab-test-runner.js +363 -0
  187. package/scripts/testing/scripts/testing/collect-metrics.js +292 -0
  188. package/scripts/testing/simple-effectiveness-test.js +310 -0
  189. package/scripts/testing/src/core/context/context-bridge.js +253 -0
  190. package/scripts/testing/src/core/context/frame-manager.js +746 -0
  191. package/scripts/testing/src/core/context/shared-context-layer.js +437 -0
  192. package/scripts/testing/src/core/database/database-adapter.js +54 -0
  193. package/scripts/testing/src/core/errors/index.js +291 -0
  194. package/scripts/testing/src/core/errors/recovery.js +268 -0
  195. package/scripts/testing/src/core/monitoring/logger.js +145 -0
  196. package/scripts/testing/src/core/retrieval/context-retriever.js +516 -0
  197. package/scripts/testing/src/core/session/index.js +1 -0
  198. package/scripts/testing/src/core/session/session-manager.js +323 -0
  199. package/scripts/testing/src/core/trace/cli-trace-wrapper.js +140 -0
  200. package/scripts/testing/src/core/trace/db-trace-wrapper.js +251 -0
  201. package/scripts/testing/src/core/trace/debug-trace.js +398 -0
  202. package/scripts/testing/src/core/trace/index.js +120 -0
  203. package/scripts/testing/src/core/trace/linear-api-wrapper.js +204 -0
  204. package/scripts/update-linear-status.js +268 -0
  205. package/scripts/update-linear-tasks-fixed.js +284 -0
  206. package/scripts/verify-railway-schema.ts +35 -0
  207. package/templates/claude-hooks/hooks.json +5 -0
  208. package/templates/claude-hooks/on-clear.js +56 -0
  209. package/templates/claude-hooks/on-startup.js +56 -0
  210. package/templates/claude-hooks/tool-use-trace.js +67 -0
  211. package/dist/features/tui/components/analytics-panel.js +0 -157
  212. package/dist/features/tui/components/analytics-panel.js.map +0 -7
  213. package/dist/features/tui/components/frame-visualizer.js +0 -377
  214. package/dist/features/tui/components/frame-visualizer.js.map +0 -7
  215. package/dist/features/tui/components/pr-tracker.js +0 -135
  216. package/dist/features/tui/components/pr-tracker.js.map +0 -7
  217. package/dist/features/tui/components/session-monitor.js +0 -299
  218. package/dist/features/tui/components/session-monitor.js.map +0 -7
  219. package/dist/features/tui/components/subagent-fleet.js +0 -395
  220. package/dist/features/tui/components/subagent-fleet.js.map +0 -7
  221. package/dist/features/tui/components/task-board.js +0 -1139
  222. package/dist/features/tui/components/task-board.js.map +0 -7
  223. package/dist/features/tui/index.js +0 -408
  224. package/dist/features/tui/index.js.map +0 -7
  225. package/dist/features/tui/services/data-service.js +0 -641
  226. package/dist/features/tui/services/data-service.js.map +0 -7
  227. package/dist/features/tui/services/linear-task-reader.js +0 -102
  228. package/dist/features/tui/services/linear-task-reader.js.map +0 -7
  229. package/dist/features/tui/services/websocket-client.js +0 -162
  230. package/dist/features/tui/services/websocket-client.js.map +0 -7
  231. package/dist/features/tui/terminal-compat.js +0 -220
  232. package/dist/features/tui/terminal-compat.js.map +0 -7
  233. package/dist/features/tui/types.js +0 -1
  234. package/dist/features/tui/types.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/skills/claude-skills.ts"],
4
- "sourcesContent": ["/**\n * Claude Skills for StackMemory\n * Custom skills that integrate with Claude Code to enhance workflow\n */\n\nimport {\n FrameHandoffManager,\n type HandoffMetadata,\n} from '../core/context/frame-handoff-manager.js';\nimport { DualStackManager } from '../core/context/dual-stack-manager.js';\nimport { SQLiteAdapter } from '../core/database/sqlite-adapter.js';\nimport { ContextRetriever } from '../core/retrieval/context-retriever.js';\nimport { logger } from '../core/monitoring/logger.js';\nimport {\n RepoIngestionSkill,\n type RepoIngestionOptions,\n} from './repo-ingestion-skill.js';\nimport { DashboardLauncherSkill } from './dashboard-launcher.js';\nimport {\n RecursiveAgentOrchestrator,\n type RLMOptions,\n} from './recursive-agent-orchestrator.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport type { Frame } from '../core/context/frame-manager.js';\n\n// Type definitions for Dig skill\ninterface Pattern {\n type: string;\n frequency: number;\n examples: string[];\n}\n\ninterface Decision {\n timestamp: string;\n decision: string;\n context: string;\n}\n\ninterface TimelineEntry {\n timestamp: string;\n event: string;\n description: string;\n}\n\nexport interface SkillContext {\n projectId: string;\n userId: string;\n dualStackManager: DualStackManager;\n handoffManager: FrameHandoffManager;\n contextRetriever: ContextRetriever;\n database: SQLiteAdapter;\n}\n\nexport interface SkillResult {\n success: boolean;\n message: string;\n data?: unknown;\n action?: string;\n}\n\n/**\n * Skill 1: Frame Handoff Orchestrator\n * Streamlines frame handoffs between team members\n */\nexport class HandoffSkill {\n constructor(private context: SkillContext) {}\n\n async execute(\n targetUser: string,\n message: string,\n options?: {\n frames?: string[];\n priority?: 'low' | 'medium' | 'high' | 'critical';\n autoDetect?: boolean;\n }\n ): Promise<SkillResult> {\n try {\n const activeStack = this.context.dualStackManager.getActiveStack();\n\n // Auto-detect frames if not specified\n let framesToHandoff = options?.frames || [];\n if (options?.autoDetect !== false && framesToHandoff.length === 0) {\n // Get recent frames that are completed or have errors\n const allFrames = await activeStack.getAllFrames();\n // Filter for completed frames OR frames with errors (not both conditions required)\n const relevantFrames = allFrames.filter(\n (f) =>\n f.state === 'completed' ||\n (f.outputs &&\n Array.isArray(f.outputs) &&\n f.outputs.some((o) => o.type === 'error'))\n );\n framesToHandoff = relevantFrames\n .slice(-5) // Last 5 relevant frames\n .map((f) => f.frameId);\n }\n\n if (framesToHandoff.length === 0) {\n return {\n success: false,\n message:\n 'No frames to handoff. Specify frames or complete some work first.',\n };\n }\n\n // Generate comprehensive handoff summary\n const frameDetails = await Promise.all(\n framesToHandoff.map((id) => activeStack.getFrame(id))\n );\n\n const summary = this.generateHandoffSummary(frameDetails, message);\n\n // Create handoff metadata\n const metadata: HandoffMetadata = {\n initiatedAt: new Date(),\n initiatorId: this.context.userId,\n targetUserId: targetUser,\n frameContext: {\n totalFrames: framesToHandoff.length,\n frameTypes: [\n ...new Set(frameDetails.map((f) => f?.type || 'unknown')),\n ],\n estimatedSize: JSON.stringify(frameDetails).length,\n dependencies: this.extractDependencies(frameDetails),\n },\n businessContext: {\n priority: options?.priority || 'medium',\n stakeholders: [targetUser],\n },\n };\n\n // Get target stack (shared or create new)\n const availableStacks =\n await this.context.dualStackManager.getAvailableStacks();\n let targetStackId = availableStacks.find(\n (s) => s.type === 'shared'\n )?.stackId;\n\n if (!targetStackId) {\n targetStackId = await this.context.dualStackManager.createSharedStack(\n 'team',\n `Handoff: ${message.slice(0, 50)}`,\n this.context.userId\n );\n }\n\n // Initiate handoff\n const handoffId = await this.context.handoffManager.initiateHandoff(\n targetStackId,\n framesToHandoff,\n metadata,\n targetUser,\n summary\n );\n\n // Create action items for recipient\n const actionItems = this.generateActionItems(frameDetails);\n\n return {\n success: true,\n message: `Handoff initiated to @${targetUser}`,\n data: {\n handoffId,\n frameCount: framesToHandoff.length,\n priority: options?.priority || 'medium',\n actionItems,\n targetStack: targetStackId,\n },\n action: `Notified ${targetUser}. Handoff ID: ${handoffId}`,\n };\n } catch (error: unknown) {\n logger.error('Handoff skill error:', error);\n return {\n success: false,\n message: `Failed to initiate handoff: ${error.message}`,\n };\n }\n }\n\n private generateHandoffSummary(frames: Frame[], message: string): string {\n const completed = frames.filter((f) => f?.state === 'completed').length;\n const blocked = frames.filter((f) =>\n f?.outputs?.some((o) => o.type === 'error')\n ).length;\n\n return `\n## Handoff Summary\n**Message**: ${message}\n**Frames**: ${frames.length} total (${completed} completed, ${blocked} blocked)\n\n### Work Completed:\n${frames\n .filter((f) => f?.state === 'completed')\n .map((f) => `- ${f.name}: ${f.digest_deterministic?.summary || 'No summary'}`)\n .join('\\n')}\n\n### Attention Required:\n${\n frames\n .filter((f) => f?.outputs?.some((o) => o.type === 'error'))\n .map(\n (f) =>\n `- ${f.name}: ${f.outputs.find((o) => o.type === 'error')?.content || 'Error'}`\n )\n .join('\\n') || 'None'\n}\n\n### Context:\n${frames\n .map((f) => f?.digest_ai?.context || '')\n .filter(Boolean)\n .join('\\n')}\n `.trim();\n }\n\n private extractDependencies(frames: Frame[]): string[] {\n const deps = new Set<string>();\n frames.forEach((frame) => {\n if (frame?.inputs?.dependencies) {\n if (Array.isArray(frame.inputs.dependencies)) {\n frame.inputs.dependencies.forEach((d) => deps.add(d));\n }\n }\n // Extract from outputs\n if (frame?.outputs) {\n frame.outputs.forEach((output) => {\n if (output.type === 'dependency') {\n deps.add(output.content);\n }\n });\n }\n });\n return Array.from(deps);\n }\n\n private generateActionItems(frames: Frame[]): string[] {\n const items: string[] = [];\n\n frames.forEach((frame) => {\n // Check for TODOs in outputs\n if (frame?.outputs) {\n frame.outputs.forEach((output) => {\n if (output.type === 'todo' || output.content?.includes('TODO')) {\n items.push(output.content);\n }\n });\n }\n\n // Check for errors that need resolution\n if (frame?.outputs?.some((o) => o.type === 'error')) {\n items.push(`Resolve error in ${frame.name}`);\n }\n\n // Check for pending tests - look in multiple places\n if (\n frame?.inputs?.tests === 'pending' ||\n frame?.type === 'implementation' ||\n (frame?.name && frame.name.toLowerCase().includes('implementation'))\n ) {\n items.push(`Write tests for ${frame.name}`);\n }\n });\n\n return items;\n }\n}\n\n/**\n * Skill 7: Recovery Checkpoint Manager\n * Create and manage recovery points\n */\nexport class CheckpointSkill {\n private checkpointDir: string;\n\n constructor(private context: SkillContext) {\n this.checkpointDir = path.join(\n os.homedir(),\n '.stackmemory',\n 'checkpoints',\n context.projectId\n );\n fs.mkdirSync(this.checkpointDir, { recursive: true });\n }\n\n async create(\n description: string,\n options?: {\n autoDetectRisky?: boolean;\n includeFiles?: string[];\n metadata?: Record<string, unknown>;\n }\n ): Promise<SkillResult> {\n try {\n const timestamp = Date.now();\n const checkpointId = `checkpoint-${timestamp}-${Math.random().toString(36).slice(2, 8)}`;\n\n // Get current context\n const activeStack = this.context.dualStackManager.getActiveStack();\n const currentContext = this.context.dualStackManager.getCurrentContext();\n const allFrames = await activeStack.getAllFrames();\n\n // Create checkpoint data\n const checkpoint = {\n id: checkpointId,\n timestamp,\n description,\n context: {\n stackId: currentContext.stackId,\n stackType: currentContext.type,\n userId: this.context.userId,\n projectId: this.context.projectId,\n },\n frames: allFrames,\n metadata: {\n ...options?.metadata,\n frameCount: allFrames.length,\n activeFrames: allFrames.filter((f) => f.state === 'active').length,\n completedFrames: allFrames.filter((f) => f.state === 'completed')\n .length,\n },\n files: options?.includeFiles || [],\n };\n\n // Save checkpoint\n const checkpointPath = path.join(\n this.checkpointDir,\n `${checkpointId}.json`\n );\n fs.writeFileSync(checkpointPath, JSON.stringify(checkpoint, null, 2));\n\n // Save file backups if specified\n if (options?.includeFiles && options.includeFiles.length > 0) {\n const filesDir = path.join(this.checkpointDir, checkpointId, 'files');\n fs.mkdirSync(filesDir, { recursive: true });\n\n for (const file of options.includeFiles) {\n if (fs.existsSync(file)) {\n const basename = path.basename(file);\n const backupPath = path.join(filesDir, basename);\n fs.copyFileSync(file, backupPath);\n }\n }\n }\n\n // Auto-detect risky operations\n if (options?.autoDetectRisky) {\n const riskyPatterns = [\n 'migration',\n 'database',\n 'deploy',\n 'production',\n 'delete',\n 'remove',\n 'drop',\n 'migrate', // Add more specific pattern\n ];\n\n const isRisky = allFrames.some((frame) => {\n const nameMatches =\n frame.name &&\n riskyPatterns.some((pattern) =>\n frame.name.toLowerCase().includes(pattern)\n );\n const commandMatches =\n frame.inputs?.command &&\n riskyPatterns.some((pattern) =>\n frame.inputs.command.toLowerCase().includes(pattern)\n );\n return nameMatches || commandMatches;\n });\n\n if (isRisky) {\n checkpoint.metadata.riskyOperation = true;\n checkpoint.metadata.autoCheckpoint = true;\n }\n }\n\n // Update the checkpoint data after risky operation detection\n fs.writeFileSync(checkpointPath, JSON.stringify(checkpoint, null, 2));\n\n logger.info(`Created checkpoint: ${checkpointId}`);\n\n return {\n success: true,\n message: `Checkpoint created: ${description}`,\n data: {\n checkpointId,\n timestamp: new Date(timestamp).toISOString(),\n frameCount: checkpoint.metadata.frameCount,\n location: checkpointPath,\n },\n action: `Saved checkpoint ${checkpointId}`,\n };\n } catch (error: unknown) {\n logger.error('Checkpoint creation error:', error);\n return {\n success: false,\n message: `Failed to create checkpoint: ${error.message}`,\n };\n }\n }\n\n async restore(checkpointId: string): Promise<SkillResult> {\n try {\n const checkpointPath = path.join(\n this.checkpointDir,\n `${checkpointId}.json`\n );\n\n if (!fs.existsSync(checkpointPath)) {\n // Try to find by partial ID\n const files = fs.readdirSync(this.checkpointDir);\n const match = files.find((f) => f.includes(checkpointId));\n if (match) {\n checkpointId = match.replace('.json', '');\n } else {\n return {\n success: false,\n message: `Checkpoint not found: ${checkpointId}`,\n };\n }\n }\n\n const checkpoint = JSON.parse(fs.readFileSync(checkpointPath, 'utf-8'));\n\n // Switch to checkpoint's stack\n await this.context.dualStackManager.switchToStack(\n checkpoint.context.stackId\n );\n\n // Restore frames (this is a simplified version - real implementation would be more complex)\n // const activeStack = this.context.dualStackManager.getActiveStack();\n\n // Clear current frames and restore from checkpoint\n // Note: This is a conceptual implementation - actual frame restoration\n // would need more sophisticated state management\n\n // Restore files if they exist\n const filesDir = path.join(this.checkpointDir, checkpointId, 'files');\n if (fs.existsSync(filesDir)) {\n const files = fs.readdirSync(filesDir);\n for (const file of files) {\n const backupPath = path.join(filesDir, file);\n const originalPath = checkpoint.files.find(\n (f) => path.basename(f) === file\n );\n if (originalPath && fs.existsSync(backupPath)) {\n fs.copyFileSync(backupPath, originalPath);\n }\n }\n }\n\n logger.info(`Restored checkpoint: ${checkpointId}`);\n\n return {\n success: true,\n message: `Restored to checkpoint: ${checkpoint.description}`,\n data: {\n checkpointId,\n timestamp: new Date(checkpoint.timestamp).toISOString(),\n frameCount: checkpoint.metadata.frameCount,\n filesRestored: checkpoint.files.length,\n },\n action: `Restored checkpoint from ${new Date(checkpoint.timestamp).toLocaleString()}`,\n };\n } catch (error: unknown) {\n logger.error('Checkpoint restoration error:', error);\n return {\n success: false,\n message: `Failed to restore checkpoint: ${error.message}`,\n };\n }\n }\n\n async list(options?: { limit?: number; since?: Date }): Promise<SkillResult> {\n try {\n const files = fs\n .readdirSync(this.checkpointDir)\n .filter((f) => f.endsWith('.json'))\n .map((f) => {\n const checkpointPath = path.join(this.checkpointDir, f);\n const checkpoint = JSON.parse(\n fs.readFileSync(checkpointPath, 'utf-8')\n );\n return checkpoint;\n })\n .filter((c) => !options?.since || c.timestamp > options.since.getTime())\n .sort((a, b) => b.timestamp - a.timestamp)\n .slice(0, options?.limit || 10);\n\n return {\n success: true,\n message: `Found ${files.length} checkpoints`,\n data: files.map((c) => ({\n id: c.id,\n description: c.description,\n timestamp: new Date(c.timestamp).toISOString(),\n frameCount: c.metadata.frameCount,\n risky: c.metadata.riskyOperation || false,\n })),\n };\n } catch (error: unknown) {\n logger.error('Checkpoint list error:', error);\n return {\n success: false,\n message: `Failed to list checkpoints: ${error.message}`,\n };\n }\n }\n\n async diff(checkpoint1: string, checkpoint2: string): Promise<SkillResult> {\n try {\n const cp1 = await this.loadCheckpoint(checkpoint1);\n const cp2 = await this.loadCheckpoint(checkpoint2);\n\n if (!cp1 || !cp2) {\n return {\n success: false,\n message: 'One or both checkpoints not found',\n };\n }\n\n const diff = {\n timeDiff: Math.abs(cp2.timestamp - cp1.timestamp),\n framesDiff: cp2.frames.length - cp1.frames.length,\n newFrames: cp2.frames.filter(\n (f2) => !cp1.frames.some((f1) => f1.frameId === f2.frameId)\n ),\n removedFrames: cp1.frames.filter(\n (f1) => !cp2.frames.some((f2) => f2.frameId === f1.frameId)\n ),\n modifiedFrames: cp2.frames.filter((f2) => {\n const f1 = cp1.frames.find((f) => f.frameId === f2.frameId);\n return f1 && JSON.stringify(f1) !== JSON.stringify(f2);\n }),\n };\n\n return {\n success: true,\n message: `Diff between ${cp1.description} and ${cp2.description}`,\n data: {\n timeDiff: `${Math.round(diff.timeDiff / 1000 / 60)} minutes`,\n framesDiff:\n diff.framesDiff > 0 ? `+${diff.framesDiff}` : `${diff.framesDiff}`,\n newFrames: diff.newFrames.length,\n removedFrames: diff.removedFrames.length,\n modifiedFrames: diff.modifiedFrames.length,\n details: diff,\n },\n };\n } catch (error: unknown) {\n logger.error('Checkpoint diff error:', error);\n return {\n success: false,\n message: `Failed to diff checkpoints: ${error.message}`,\n };\n }\n }\n\n private async loadCheckpoint(checkpointId: string): Promise<unknown> {\n const checkpointPath = path.join(\n this.checkpointDir,\n `${checkpointId}.json`\n );\n if (fs.existsSync(checkpointPath)) {\n return JSON.parse(fs.readFileSync(checkpointPath, 'utf-8'));\n }\n\n // Try partial match\n const files = fs.readdirSync(this.checkpointDir);\n const match = files.find((f) => f.includes(checkpointId));\n if (match) {\n const path = path.join(this.checkpointDir, match);\n return JSON.parse(fs.readFileSync(path, 'utf-8'));\n }\n\n return null;\n }\n}\n\n/**\n * Skill 2: Context Archaeologist\n * Deep historical context retrieval across sessions\n */\nexport class ArchaeologistSkill {\n constructor(private context: SkillContext) {}\n\n async dig(\n query: string,\n options?: {\n depth?: string; // e.g., \"6months\", \"30days\", \"all\"\n patterns?: boolean;\n decisions?: boolean;\n timeline?: boolean;\n }\n ): Promise<SkillResult> {\n try {\n // Parse depth\n const depth = this.parseDepth(options?.depth || '30days');\n const since = new Date(Date.now() - depth);\n\n // Use context retriever for semantic search\n const results = await this.context.contextRetriever.retrieve({\n query,\n projectId: this.context.projectId,\n limit: 50,\n minScore: 0.3,\n });\n\n // Filter by date if specified\n const filtered = results.filter(\n (r) => !depth || new Date(r.timestamp) > since\n );\n\n // Extract patterns if requested\n let patterns: Pattern[] = [];\n if (options?.patterns) {\n patterns = this.extractPatterns(filtered);\n }\n\n // Extract decisions if requested\n let decisions: Decision[] = [];\n if (options?.decisions) {\n decisions = this.extractDecisions(filtered);\n }\n\n // Generate timeline if requested\n let timeline: TimelineEntry[] = [];\n if (options?.timeline) {\n timeline = this.generateTimeline(filtered);\n }\n\n // Find most relevant context\n const topResults = filtered.slice(0, 10);\n const summary = this.generateArchaeologySummary(\n topResults,\n patterns,\n decisions,\n timeline\n );\n\n return {\n success: true,\n message: `Found ${filtered.length} relevant results`,\n data: {\n totalResults: filtered.length,\n timeRange: {\n from: since.toISOString(),\n to: new Date().toISOString(),\n },\n topResults: topResults.map((r) => ({\n frameId: r.frameId,\n score: r.score,\n timestamp: r.timestamp,\n summary: r.content.slice(0, 100) + '...',\n })),\n patterns,\n decisions,\n timeline,\n summary,\n },\n action: `Analyzed ${filtered.length} frames from ${options?.depth || '30days'} of history`,\n };\n } catch (error: unknown) {\n logger.error('Archaeology skill error:', error);\n return {\n success: false,\n message: `Failed to dig through context: ${error.message}`,\n };\n }\n }\n\n private parseDepth(depth: string): number {\n const match = depth.match(/^(\\d+)(days?|weeks?|months?|years?|all)$/i);\n if (!match) {\n return 30 * 24 * 60 * 60 * 1000; // Default 30 days\n }\n\n const [, num, unit] = match;\n const value = parseInt(num);\n\n switch (unit.toLowerCase()) {\n case 'day':\n case 'days':\n return value * 24 * 60 * 60 * 1000;\n case 'week':\n case 'weeks':\n return value * 7 * 24 * 60 * 60 * 1000;\n case 'month':\n case 'months':\n return value * 30 * 24 * 60 * 60 * 1000;\n case 'year':\n case 'years':\n return value * 365 * 24 * 60 * 60 * 1000;\n case 'all':\n return Number.MAX_SAFE_INTEGER;\n default:\n return 30 * 24 * 60 * 60 * 1000;\n }\n }\n\n private extractPatterns(results: Frame[]): Pattern[] {\n const patterns: Map<string, number> = new Map();\n\n // Common patterns to look for\n const patternTypes = [\n { regex: /test.*then.*implement/i, name: 'TDD' },\n { regex: /refactor/i, name: 'Refactoring' },\n { regex: /debug|fix|error|bug/i, name: 'Debugging' },\n { regex: /implement.*feature/i, name: 'Feature Development' },\n { regex: /review|code review/i, name: 'Code Review' },\n { regex: /deploy|release/i, name: 'Deployment' },\n { regex: /optimize|performance/i, name: 'Optimization' },\n ];\n\n results.forEach((result) => {\n patternTypes.forEach((pattern) => {\n if (pattern.regex.test(result.content)) {\n patterns.set(pattern.name, (patterns.get(pattern.name) || 0) + 1);\n }\n });\n });\n\n return Array.from(patterns.entries())\n .map(([name, count]) => ({ name, count }))\n .sort((a, b) => b.count - a.count);\n }\n\n private extractDecisions(results: Frame[]): Decision[] {\n const decisions: Decision[] = [];\n\n // Keywords that indicate decisions\n const decisionKeywords = [\n 'decided',\n 'chose',\n 'selected',\n 'will use',\n 'going with',\n 'approach',\n 'strategy',\n 'solution',\n ];\n\n results.forEach((result) => {\n const content = result.content.toLowerCase();\n if (decisionKeywords.some((keyword) => content.includes(keyword))) {\n // Extract sentence containing the decision\n const sentences = result.content.split(/[.!?]+/);\n const decisionSentence = sentences.find((s) =>\n decisionKeywords.some((k) => s.toLowerCase().includes(k))\n );\n\n if (decisionSentence) {\n decisions.push({\n frameId: result.frameId,\n timestamp: result.timestamp,\n decision: decisionSentence.trim(),\n context: result.content.slice(0, 200),\n });\n }\n }\n });\n\n return decisions.slice(0, 10); // Top 10 decisions\n }\n\n private generateTimeline(results: Frame[]): TimelineEntry[] {\n // Group by day\n const timeline: Map<string, Frame[]> = new Map();\n\n results.forEach((result) => {\n const date = new Date(result.timestamp).toDateString();\n if (!timeline.has(date)) {\n timeline.set(date, []);\n }\n const dateItems = timeline.get(date);\n if (dateItems) {\n dateItems.push(result);\n }\n });\n\n return Array.from(timeline.entries())\n .map(([date, items]) => ({\n date,\n itemCount: items.length,\n highlights: items.slice(0, 3).map((item) => ({\n frameId: item.frameId,\n summary: item.content.slice(0, 50) + '...',\n })),\n }))\n .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());\n }\n\n private generateArchaeologySummary(\n results: Frame[],\n patterns: Pattern[],\n decisions: Decision[],\n timeline: TimelineEntry[]\n ): string {\n let summary = '## Context Archaeology Report\\n\\n';\n\n if (results.length > 0) {\n summary += `### Most Relevant Context (${results.length} results)\\n`;\n results.slice(0, 3).forEach((r) => {\n summary += `- **${new Date(r.timestamp).toLocaleDateString()}**: ${r.content.slice(0, 100)}...\\n`;\n });\n summary += '\\n';\n }\n\n if (patterns.length > 0) {\n summary += `### Detected Patterns\\n`;\n patterns.slice(0, 5).forEach((p) => {\n summary += `- ${p.name}: ${p.count} occurrences\\n`;\n });\n summary += '\\n';\n }\n\n if (decisions.length > 0) {\n summary += `### Key Decisions\\n`;\n decisions.slice(0, 5).forEach((d) => {\n summary += `- **${new Date(d.timestamp).toLocaleDateString()}**: ${d.decision}\\n`;\n });\n summary += '\\n';\n }\n\n if (timeline.length > 0) {\n summary += `### Activity Timeline\\n`;\n timeline.slice(0, 5).forEach((t) => {\n summary += `- **${t.date}**: ${t.itemCount} activities\\n`;\n });\n }\n\n return summary;\n }\n}\n\n/**\n * Main Claude Skills Manager\n */\nexport class ClaudeSkillsManager {\n private handoffSkill: HandoffSkill;\n private checkpointSkill: CheckpointSkill;\n private archaeologistSkill: ArchaeologistSkill;\n private dashboardLauncher: DashboardLauncherSkill;\n private repoIngestionSkill: RepoIngestionSkill | null = null;\n private rlmOrchestrator: RecursiveAgentOrchestrator | null = null;\n\n constructor(private context: SkillContext) {\n this.handoffSkill = new HandoffSkill(context);\n this.checkpointSkill = new CheckpointSkill(context);\n this.archaeologistSkill = new ArchaeologistSkill(context);\n\n // Initialize dashboard launcher (lazy import to avoid circular deps)\n import('./dashboard-launcher.js').then((module) => {\n this.dashboardLauncher = new module.DashboardLauncherSkill();\n // Auto-launch on session start\n this.dashboardLauncher.launch().catch((error: unknown) => {\n logger.warn('Dashboard auto-launch failed:', error);\n });\n });\n\n // Initialize repo ingestion skill if ChromaDB is configured\n const chromaConfig = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n collectionName: process.env['CHROMADB_COLLECTION'] || 'stackmemory_repos',\n };\n\n if (chromaConfig.apiKey && chromaConfig.tenant) {\n this.repoIngestionSkill = new RepoIngestionSkill(\n chromaConfig,\n context.userId,\n process.env['CHROMADB_TEAM_ID']\n );\n this.repoIngestionSkill.initialize().catch((error: unknown) => {\n logger.warn('Repo ingestion skill initialization failed:', error);\n });\n }\n\n // Initialize RLM Orchestrator\n // Import dynamically to avoid circular dependencies\n import('../features/tasks/linear-task-manager.js')\n .then((module) => {\n const taskStore = new module.LinearTaskManager();\n\n import('../core/context/frame-manager.js').then((frameModule) => {\n const frameManager = new frameModule.FrameManager();\n\n this.rlmOrchestrator = new RecursiveAgentOrchestrator(\n frameManager,\n context.dualStackManager,\n context.contextRetriever,\n taskStore\n );\n\n logger.info('RLM Orchestrator initialized');\n });\n })\n .catch((error: unknown) => {\n logger.warn('RLM Orchestrator initialization failed:', error);\n });\n }\n\n async executeSkill(\n skillName: string,\n args: string[],\n options?: Record<string, unknown>\n ): Promise<SkillResult> {\n switch (skillName) {\n case 'handoff':\n return this.handoffSkill.execute(args[0], args[1], options);\n\n case 'checkpoint':\n const subcommand = args[0];\n switch (subcommand) {\n case 'create':\n return this.checkpointSkill.create(args[1], options);\n case 'restore':\n return this.checkpointSkill.restore(args[1]);\n case 'list':\n return this.checkpointSkill.list(options);\n case 'diff':\n return this.checkpointSkill.diff(args[1], args[2]);\n default:\n return {\n success: false,\n message: `Unknown checkpoint subcommand: ${subcommand}`,\n };\n }\n\n case 'dig':\n return this.archaeologistSkill.dig(args[0], options);\n\n case 'lint':\n // Linting task using RLM orchestrator with linting agent\n if (!this.rlmOrchestrator) {\n return {\n success: false,\n message:\n 'RLM Orchestrator not initialized. Please wait a moment and try again.',\n };\n }\n\n const lintPath = args[0] || process.cwd();\n const lintOptions = {\n ...options,\n // Force use of linting agent\n agents: ['linting'],\n maxParallel: 1,\n reviewStages: 1,\n verboseLogging: true,\n } as RLMOptions;\n\n const lintTask = `Perform comprehensive linting on ${lintPath}: Check for syntax errors, type issues, formatting violations, security vulnerabilities, performance anti-patterns, and unused code. Provide actionable fixes.`;\n\n try {\n const result = await this.rlmOrchestrator.execute(\n lintTask,\n { path: lintPath, ...options },\n lintOptions\n );\n\n return {\n success: result.success,\n message: `Linting ${result.success ? 'completed' : 'failed'}`,\n data: {\n issuesFound: result.issuesFound,\n issuesFixed: result.issuesFixed,\n duration: `${result.duration}ms`,\n totalTokens: result.totalTokens,\n details: result.rootNode,\n },\n };\n } catch (error) {\n return {\n success: false,\n message: `Linting failed: ${error.message}`,\n };\n }\n\n case 'rlm':\n if (!this.rlmOrchestrator) {\n return {\n success: false,\n message:\n 'RLM Orchestrator not initialized. Please wait a moment and try again.',\n };\n }\n return this.rlmOrchestrator.execute(args[0], options as RLMOptions);\n\n case 'repo':\n case 'ingest':\n if (!this.repoIngestionSkill) {\n return {\n success: false,\n message:\n 'Repo ingestion skill not initialized. Please configure ChromaDB.',\n };\n }\n\n const repoCommand = args[0];\n switch (repoCommand) {\n case 'ingest':\n const repoPath = args[1] || process.cwd();\n const repoName = args[2] || path.basename(repoPath);\n return await this.repoIngestionSkill.ingestRepository(\n repoPath,\n repoName,\n options as RepoIngestionOptions\n );\n\n case 'update':\n const updatePath = args[1] || process.cwd();\n const updateName = args[2] || path.basename(updatePath);\n return await this.repoIngestionSkill.updateRepository(\n updatePath,\n updateName,\n options as RepoIngestionOptions\n );\n\n case 'search':\n const query = args[1];\n if (!query) {\n return {\n success: false,\n message: 'Search query required',\n };\n }\n const results = await this.repoIngestionSkill.searchCode(query, {\n repoName: options?.repoName as string,\n language: options?.language as string,\n limit: options?.limit as number,\n includeContext: options?.includeContext as boolean,\n });\n return {\n success: true,\n message: `Found ${results.length} results`,\n data: results,\n };\n\n case 'stats':\n const stats = await this.repoIngestionSkill.getRepoStats(args[1]);\n return {\n success: true,\n message: 'Repository statistics',\n data: stats,\n };\n\n default:\n return {\n success: false,\n message: `Unknown repo command: ${repoCommand}. Use: ingest, update, search, or stats`,\n };\n }\n\n case 'dashboard':\n const dashboardCmd = args[0];\n if (!this.dashboardLauncher) {\n return {\n success: false,\n message: 'Dashboard launcher not yet initialized',\n };\n }\n switch (dashboardCmd) {\n case 'launch':\n await this.dashboardLauncher.launch();\n return {\n success: true,\n message: 'Dashboard launched',\n action: 'open-browser',\n };\n case 'stop':\n await this.dashboardLauncher.stop();\n return {\n success: true,\n message: 'Dashboard stopped',\n };\n default:\n await this.dashboardLauncher.launch();\n return {\n success: true,\n message: 'Dashboard launched',\n action: 'open-browser',\n };\n }\n\n case 'recursive':\n if (!this.rlmOrchestrator) {\n return {\n success: false,\n message:\n 'RLM Orchestrator not initialized. Please wait a moment and try again.',\n };\n }\n\n const task = args.join(' ') || 'Analyze and improve the current code';\n const rlmOptions = options as RLMOptions;\n\n try {\n logger.info('Starting RLM execution', { task });\n\n const result = await this.rlmOrchestrator.execute(\n task,\n {\n files: rlmOptions.files || [],\n query: task,\n },\n rlmOptions\n );\n\n return {\n success: result.success,\n message: `RLM execution ${result.success ? 'completed' : 'failed'}`,\n data: {\n duration: `${result.duration}ms`,\n totalTokens: result.totalTokens,\n totalCost: `$${result.totalCost.toFixed(2)}`,\n testsGenerated: result.testsGenerated,\n improvements: result.improvements.length,\n issuesFound: result.issuesFound,\n issuesFixed: result.issuesFixed,\n executionTree: result.rootNode,\n },\n };\n } catch (error) {\n logger.error('RLM execution error:', error);\n return {\n success: false,\n message: `RLM execution failed: ${error.message}`,\n };\n }\n\n default:\n return {\n success: false,\n message: `Unknown skill: ${skillName}`,\n };\n }\n }\n\n getAvailableSkills(): string[] {\n const skills = ['handoff', 'checkpoint', 'dig', 'dashboard'];\n if (this.repoIngestionSkill) {\n skills.push('repo');\n }\n if (this.rlmOrchestrator) {\n skills.push('rlm', 'lint');\n }\n return skills;\n }\n\n getSkillHelp(skillName: string): string {\n switch (skillName) {\n case 'handoff':\n return `\n/handoff @user \"message\" [--priority high] [--frames frame1,frame2]\nStreamline frame handoffs between team members\n`;\n\n case 'checkpoint':\n return `\n/checkpoint create \"description\" [--files file1,file2] [--auto-detect-risky]\n/checkpoint restore <id>\n/checkpoint list [--limit 10] [--since \"2024-01-01\"]\n/checkpoint diff <id1> <id2>\nCreate and manage recovery points\n`;\n\n case 'dig':\n return `\n/dig \"query\" [--depth 6months] [--patterns] [--decisions] [--timeline]\nDeep historical context retrieval across sessions\n`;\n\n case 'lint':\n return `\n/lint [path] [options]\nPerform comprehensive code linting and quality checks\n\nAutomatically checks for:\n- Syntax errors and type issues\n- Code formatting and style violations \n- Security vulnerabilities\n- Performance anti-patterns\n- Unused imports and dead code\n- Code smells and complexity issues\n\nUsage:\n stackmemory skills lint # Lint current directory\n stackmemory skills lint src/ # Lint specific directory\n stackmemory skills lint src/file.ts # Lint specific file\n\nOptions:\n --fix Automatically fix issues where possible\n --format Focus on formatting issues\n --security Focus on security vulnerabilities\n --performance Focus on performance issues\n --verbose Show detailed output\n\nExamples:\n stackmemory skills lint --fix\n stackmemory skills lint src/ --security --verbose\n`;\n\n case 'rlm':\n return `\n/rlm \"task description\" [options]\nExecute complex tasks with recursive agent orchestration\n\nOptions:\n --max-parallel <n> Max concurrent subagents (default: 5)\n --max-recursion <n> Max recursion depth (default: 4)\n --max-tokens-per-agent <n> Token budget per agent (default: 30000)\n --review-stages <n> Review iterations (default: 3)\n --quality-threshold <n> Target quality 0-1 (default: 0.85)\n --test-mode <mode> unit/integration/e2e/all (default: all)\n --verbose Show all operations\n --timeout-per-agent <s> Timeout in seconds (default: 300)\n\nExamples:\n stackmemory skills rlm \"Generate tests for API endpoints\"\n stackmemory skills rlm \"Refactor auth system\" --quality-threshold 0.95\n`;\n\n case 'dashboard':\n return `\n/dashboard [launch|stop]\nLaunch the StackMemory web dashboard for real-time monitoring\n- launch: Start the web dashboard and open in browser (default)\n- stop: Stop the dashboard server\nAuto-launches on new sessions when configured\n`;\n\n case 'repo':\n return `\n/repo ingest [path] [name] [--incremental] [--include-tests] [--include-docs]\n/repo update [path] [name] [--force-update]\n/repo search \"query\" [--repo-name name] [--language lang] [--limit n]\n/repo stats [repo-name]\n\nIngest and search code repositories in ChromaDB:\n- ingest: Index a new repository (defaults to current directory)\n- update: Update an existing repository with changes\n- search: Semantic search across ingested code\n- stats: View statistics about ingested repositories\n\nOptions:\n- --incremental: Only process changed files\n- --include-tests: Include test files in indexing\n- --include-docs: Include documentation files\n- --force-update: Force re-indexing of all files\n- --language: Filter search by programming language\n- --limit: Maximum search results (default: 20)\n`;\n\n case 'recursive':\n return `\n/rlm \"task description\" [options]\n\nRecursive Language Model orchestration using Claude Code's Task tool:\n- Decomposes complex tasks into parallel/sequential subtasks\n- Spawns specialized Claude subagents for each task type\n- Automatic test generation and multi-stage review\n- Handles large codebases through intelligent chunking\n\nSubagent Types:\n- Planning: Task decomposition and strategy\n- Code: Implementation and refactoring\n- Testing: Comprehensive test generation (unit/integration/E2E)\n- Linting: Code quality and formatting\n- Review: Multi-stage code review and quality scoring\n- Improve: Implement review suggestions\n- Context: Information retrieval\n- Publish: NPM/GitHub releases\n\nOptions:\n- --max-parallel N: Max concurrent subagents (default: 5)\n- --max-recursion N: Max recursion depth (default: 4)\n- --review-stages N: Number of review iterations (default: 3)\n- --quality-threshold N: Target quality score 0-1 (default: 0.85)\n- --test-mode [unit|integration|e2e|all]: Test generation mode (default: all)\n- --verbose: Show all recursive operations\n\nExamples:\n/rlm \"Refactor the authentication system with full test coverage\"\n/rlm \"Generate comprehensive tests for the API endpoints\" --test-mode integration\n/rlm \"Review and improve code quality\" --review-stages 5 --quality-threshold 0.95\n`;\n\n default:\n return `Unknown skill: ${skillName}`;\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Claude Skills for StackMemory\n * Custom skills that integrate with Claude Code to enhance workflow\n */\n\nimport {\n FrameHandoffManager,\n type HandoffMetadata,\n} from '../core/context/frame-handoff-manager.js';\nimport { DualStackManager } from '../core/context/dual-stack-manager.js';\nimport { SQLiteAdapter } from '../core/database/sqlite-adapter.js';\nimport { ContextRetriever } from '../core/retrieval/context-retriever.js';\nimport type { FrameManager } from '../core/context/frame-manager.js';\nimport { logger } from '../core/monitoring/logger.js';\nimport {\n RepoIngestionSkill,\n type RepoIngestionOptions,\n} from './repo-ingestion-skill.js';\nimport { DashboardLauncherSkill } from './dashboard-launcher.js';\nimport {\n RecursiveAgentOrchestrator,\n type RLMOptions,\n} from './recursive-agent-orchestrator.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport type { Frame } from '../core/context/frame-manager.js';\n\n// Type definitions for Dig skill\ninterface Pattern {\n type: string;\n frequency: number;\n examples: string[];\n}\n\ninterface Decision {\n timestamp: string;\n decision: string;\n context: string;\n}\n\ninterface TimelineEntry {\n timestamp: string;\n event: string;\n description: string;\n}\n\nexport interface SkillContext {\n projectId: string;\n userId: string;\n dualStackManager: DualStackManager;\n handoffManager: FrameHandoffManager;\n contextRetriever: ContextRetriever;\n database: SQLiteAdapter;\n frameManager?: FrameManager;\n}\n\nexport interface SkillResult {\n success: boolean;\n message: string;\n data?: unknown;\n action?: string;\n}\n\n/**\n * Skill 1: Frame Handoff Orchestrator\n * Streamlines frame handoffs between team members\n */\nexport class HandoffSkill {\n constructor(private context: SkillContext) {}\n\n async execute(\n targetUser: string,\n message: string,\n options?: {\n frames?: string[];\n priority?: 'low' | 'medium' | 'high' | 'critical';\n autoDetect?: boolean;\n }\n ): Promise<SkillResult> {\n try {\n const activeStack = this.context.dualStackManager.getActiveStack();\n\n // Auto-detect frames if not specified\n let framesToHandoff = options?.frames || [];\n if (options?.autoDetect !== false && framesToHandoff.length === 0) {\n // Get recent frames that are completed or have errors\n const allFrames = await activeStack.getAllFrames();\n // Filter for completed frames OR frames with errors (not both conditions required)\n const relevantFrames = allFrames.filter(\n (f) =>\n f.state === 'completed' ||\n (f.outputs &&\n Array.isArray(f.outputs) &&\n f.outputs.some((o) => o.type === 'error'))\n );\n framesToHandoff = relevantFrames\n .slice(-5) // Last 5 relevant frames\n .map((f) => f.frameId);\n }\n\n if (framesToHandoff.length === 0) {\n return {\n success: false,\n message:\n 'No frames to handoff. Specify frames or complete some work first.',\n };\n }\n\n // Generate comprehensive handoff summary\n const frameDetails = await Promise.all(\n framesToHandoff.map((id) => activeStack.getFrame(id))\n );\n\n const summary = this.generateHandoffSummary(frameDetails, message);\n\n // Create handoff metadata\n const metadata: HandoffMetadata = {\n initiatedAt: new Date(),\n initiatorId: this.context.userId,\n targetUserId: targetUser,\n frameContext: {\n totalFrames: framesToHandoff.length,\n frameTypes: [\n ...new Set(frameDetails.map((f) => f?.type || 'unknown')),\n ],\n estimatedSize: JSON.stringify(frameDetails).length,\n dependencies: this.extractDependencies(frameDetails),\n },\n businessContext: {\n priority: options?.priority || 'medium',\n stakeholders: [targetUser],\n },\n };\n\n // Get target stack (shared or create new)\n const availableStacks =\n await this.context.dualStackManager.getAvailableStacks();\n let targetStackId = availableStacks.find(\n (s) => s.type === 'shared'\n )?.stackId;\n\n if (!targetStackId) {\n targetStackId = await this.context.dualStackManager.createSharedStack(\n 'team',\n `Handoff: ${message.slice(0, 50)}`,\n this.context.userId\n );\n }\n\n // Initiate handoff\n const handoffId = await this.context.handoffManager.initiateHandoff(\n targetStackId,\n framesToHandoff,\n metadata,\n targetUser,\n summary\n );\n\n // Create action items for recipient\n const actionItems = this.generateActionItems(frameDetails);\n\n return {\n success: true,\n message: `Handoff initiated to @${targetUser}`,\n data: {\n handoffId,\n frameCount: framesToHandoff.length,\n priority: options?.priority || 'medium',\n actionItems,\n targetStack: targetStackId,\n },\n action: `Notified ${targetUser}. Handoff ID: ${handoffId}`,\n };\n } catch (error: unknown) {\n logger.error('Handoff skill error:', error);\n return {\n success: false,\n message: `Failed to initiate handoff: ${error.message}`,\n };\n }\n }\n\n private generateHandoffSummary(frames: Frame[], message: string): string {\n const completed = frames.filter((f) => f?.state === 'completed').length;\n const blocked = frames.filter((f) =>\n f?.outputs?.some((o) => o.type === 'error')\n ).length;\n\n return `\n## Handoff Summary\n**Message**: ${message}\n**Frames**: ${frames.length} total (${completed} completed, ${blocked} blocked)\n\n### Work Completed:\n${frames\n .filter((f) => f?.state === 'completed')\n .map((f) => `- ${f.name}: ${f.digest_deterministic?.summary || 'No summary'}`)\n .join('\\n')}\n\n### Attention Required:\n${\n frames\n .filter((f) => f?.outputs?.some((o) => o.type === 'error'))\n .map(\n (f) =>\n `- ${f.name}: ${f.outputs.find((o) => o.type === 'error')?.content || 'Error'}`\n )\n .join('\\n') || 'None'\n}\n\n### Context:\n${frames\n .map((f) => f?.digest_ai?.context || '')\n .filter(Boolean)\n .join('\\n')}\n `.trim();\n }\n\n private extractDependencies(frames: Frame[]): string[] {\n const deps = new Set<string>();\n frames.forEach((frame) => {\n if (frame?.inputs?.dependencies) {\n if (Array.isArray(frame.inputs.dependencies)) {\n frame.inputs.dependencies.forEach((d) => deps.add(d));\n }\n }\n // Extract from outputs\n if (frame?.outputs) {\n frame.outputs.forEach((output) => {\n if (output.type === 'dependency') {\n deps.add(output.content);\n }\n });\n }\n });\n return Array.from(deps);\n }\n\n private generateActionItems(frames: Frame[]): string[] {\n const items: string[] = [];\n\n frames.forEach((frame) => {\n // Check for TODOs in outputs\n if (frame?.outputs) {\n frame.outputs.forEach((output) => {\n if (output.type === 'todo' || output.content?.includes('TODO')) {\n items.push(output.content);\n }\n });\n }\n\n // Check for errors that need resolution\n if (frame?.outputs?.some((o) => o.type === 'error')) {\n items.push(`Resolve error in ${frame.name}`);\n }\n\n // Check for pending tests - look in multiple places\n if (\n frame?.inputs?.tests === 'pending' ||\n frame?.type === 'implementation' ||\n (frame?.name && frame.name.toLowerCase().includes('implementation'))\n ) {\n items.push(`Write tests for ${frame.name}`);\n }\n });\n\n return items;\n }\n}\n\n/**\n * Skill 7: Recovery Checkpoint Manager\n * Create and manage recovery points\n */\nexport class CheckpointSkill {\n private checkpointDir: string;\n\n constructor(private context: SkillContext) {\n this.checkpointDir = path.join(\n os.homedir(),\n '.stackmemory',\n 'checkpoints',\n context.projectId\n );\n fs.mkdirSync(this.checkpointDir, { recursive: true });\n }\n\n async create(\n description: string,\n options?: {\n autoDetectRisky?: boolean;\n includeFiles?: string[];\n metadata?: Record<string, unknown>;\n }\n ): Promise<SkillResult> {\n try {\n const timestamp = Date.now();\n const checkpointId = `checkpoint-${timestamp}-${Math.random().toString(36).slice(2, 8)}`;\n\n // Get current context\n const activeStack = this.context.dualStackManager.getActiveStack();\n const currentContext = this.context.dualStackManager.getCurrentContext();\n const allFrames = await activeStack.getAllFrames();\n\n // Create checkpoint data\n const checkpoint = {\n id: checkpointId,\n timestamp,\n description,\n context: {\n stackId: currentContext.stackId,\n stackType: currentContext.type,\n userId: this.context.userId,\n projectId: this.context.projectId,\n },\n frames: allFrames,\n metadata: {\n ...options?.metadata,\n frameCount: allFrames.length,\n activeFrames: allFrames.filter((f) => f.state === 'active').length,\n completedFrames: allFrames.filter((f) => f.state === 'completed')\n .length,\n },\n files: options?.includeFiles || [],\n };\n\n // Save checkpoint\n const checkpointPath = path.join(\n this.checkpointDir,\n `${checkpointId}.json`\n );\n fs.writeFileSync(checkpointPath, JSON.stringify(checkpoint, null, 2));\n\n // Save file backups if specified\n if (options?.includeFiles && options.includeFiles.length > 0) {\n const filesDir = path.join(this.checkpointDir, checkpointId, 'files');\n fs.mkdirSync(filesDir, { recursive: true });\n\n for (const file of options.includeFiles) {\n if (fs.existsSync(file)) {\n const basename = path.basename(file);\n const backupPath = path.join(filesDir, basename);\n fs.copyFileSync(file, backupPath);\n }\n }\n }\n\n // Auto-detect risky operations\n if (options?.autoDetectRisky) {\n const riskyPatterns = [\n 'migration',\n 'database',\n 'deploy',\n 'production',\n 'delete',\n 'remove',\n 'drop',\n 'migrate', // Add more specific pattern\n ];\n\n const isRisky = allFrames.some((frame) => {\n const nameMatches =\n frame.name &&\n riskyPatterns.some((pattern) =>\n frame.name.toLowerCase().includes(pattern)\n );\n const commandMatches =\n frame.inputs?.command &&\n riskyPatterns.some((pattern) =>\n frame.inputs.command.toLowerCase().includes(pattern)\n );\n return nameMatches || commandMatches;\n });\n\n if (isRisky) {\n checkpoint.metadata.riskyOperation = true;\n checkpoint.metadata.autoCheckpoint = true;\n }\n }\n\n // Update the checkpoint data after risky operation detection\n fs.writeFileSync(checkpointPath, JSON.stringify(checkpoint, null, 2));\n\n logger.info(`Created checkpoint: ${checkpointId}`);\n\n return {\n success: true,\n message: `Checkpoint created: ${description}`,\n data: {\n checkpointId,\n timestamp: new Date(timestamp).toISOString(),\n frameCount: checkpoint.metadata.frameCount,\n location: checkpointPath,\n },\n action: `Saved checkpoint ${checkpointId}`,\n };\n } catch (error: unknown) {\n logger.error('Checkpoint creation error:', error);\n return {\n success: false,\n message: `Failed to create checkpoint: ${error.message}`,\n };\n }\n }\n\n async restore(checkpointId: string): Promise<SkillResult> {\n try {\n const checkpointPath = path.join(\n this.checkpointDir,\n `${checkpointId}.json`\n );\n\n if (!fs.existsSync(checkpointPath)) {\n // Try to find by partial ID\n const files = fs.readdirSync(this.checkpointDir);\n const match = files.find((f) => f.includes(checkpointId));\n if (match) {\n checkpointId = match.replace('.json', '');\n } else {\n return {\n success: false,\n message: `Checkpoint not found: ${checkpointId}`,\n };\n }\n }\n\n const checkpoint = JSON.parse(fs.readFileSync(checkpointPath, 'utf-8'));\n\n // Switch to checkpoint's stack\n await this.context.dualStackManager.switchToStack(\n checkpoint.context.stackId\n );\n\n // Restore frames (this is a simplified version - real implementation would be more complex)\n // const activeStack = this.context.dualStackManager.getActiveStack();\n\n // Clear current frames and restore from checkpoint\n // Note: This is a conceptual implementation - actual frame restoration\n // would need more sophisticated state management\n\n // Restore files if they exist\n const filesDir = path.join(this.checkpointDir, checkpointId, 'files');\n if (fs.existsSync(filesDir)) {\n const files = fs.readdirSync(filesDir);\n for (const file of files) {\n const backupPath = path.join(filesDir, file);\n const originalPath = checkpoint.files.find(\n (f) => path.basename(f) === file\n );\n if (originalPath && fs.existsSync(backupPath)) {\n fs.copyFileSync(backupPath, originalPath);\n }\n }\n }\n\n logger.info(`Restored checkpoint: ${checkpointId}`);\n\n return {\n success: true,\n message: `Restored to checkpoint: ${checkpoint.description}`,\n data: {\n checkpointId,\n timestamp: new Date(checkpoint.timestamp).toISOString(),\n frameCount: checkpoint.metadata.frameCount,\n filesRestored: checkpoint.files.length,\n },\n action: `Restored checkpoint from ${new Date(checkpoint.timestamp).toLocaleString()}`,\n };\n } catch (error: unknown) {\n logger.error('Checkpoint restoration error:', error);\n return {\n success: false,\n message: `Failed to restore checkpoint: ${error.message}`,\n };\n }\n }\n\n async list(options?: { limit?: number; since?: Date }): Promise<SkillResult> {\n try {\n const files = fs\n .readdirSync(this.checkpointDir)\n .filter((f) => f.endsWith('.json'))\n .map((f) => {\n const checkpointPath = path.join(this.checkpointDir, f);\n const checkpoint = JSON.parse(\n fs.readFileSync(checkpointPath, 'utf-8')\n );\n return checkpoint;\n })\n .filter((c) => !options?.since || c.timestamp > options.since.getTime())\n .sort((a, b) => b.timestamp - a.timestamp)\n .slice(0, options?.limit || 10);\n\n return {\n success: true,\n message: `Found ${files.length} checkpoints`,\n data: files.map((c) => ({\n id: c.id,\n description: c.description,\n timestamp: new Date(c.timestamp).toISOString(),\n frameCount: c.metadata.frameCount,\n risky: c.metadata.riskyOperation || false,\n })),\n };\n } catch (error: unknown) {\n logger.error('Checkpoint list error:', error);\n return {\n success: false,\n message: `Failed to list checkpoints: ${error.message}`,\n };\n }\n }\n\n async diff(checkpoint1: string, checkpoint2: string): Promise<SkillResult> {\n try {\n const cp1 = await this.loadCheckpoint(checkpoint1);\n const cp2 = await this.loadCheckpoint(checkpoint2);\n\n if (!cp1 || !cp2) {\n return {\n success: false,\n message: 'One or both checkpoints not found',\n };\n }\n\n const diff = {\n timeDiff: Math.abs(cp2.timestamp - cp1.timestamp),\n framesDiff: cp2.frames.length - cp1.frames.length,\n newFrames: cp2.frames.filter(\n (f2) => !cp1.frames.some((f1) => f1.frameId === f2.frameId)\n ),\n removedFrames: cp1.frames.filter(\n (f1) => !cp2.frames.some((f2) => f2.frameId === f1.frameId)\n ),\n modifiedFrames: cp2.frames.filter((f2) => {\n const f1 = cp1.frames.find((f) => f.frameId === f2.frameId);\n return f1 && JSON.stringify(f1) !== JSON.stringify(f2);\n }),\n };\n\n return {\n success: true,\n message: `Diff between ${cp1.description} and ${cp2.description}`,\n data: {\n timeDiff: `${Math.round(diff.timeDiff / 1000 / 60)} minutes`,\n framesDiff:\n diff.framesDiff > 0 ? `+${diff.framesDiff}` : `${diff.framesDiff}`,\n newFrames: diff.newFrames.length,\n removedFrames: diff.removedFrames.length,\n modifiedFrames: diff.modifiedFrames.length,\n details: diff,\n },\n };\n } catch (error: unknown) {\n logger.error('Checkpoint diff error:', error);\n return {\n success: false,\n message: `Failed to diff checkpoints: ${error.message}`,\n };\n }\n }\n\n private async loadCheckpoint(checkpointId: string): Promise<unknown> {\n const checkpointPath = path.join(\n this.checkpointDir,\n `${checkpointId}.json`\n );\n if (fs.existsSync(checkpointPath)) {\n return JSON.parse(fs.readFileSync(checkpointPath, 'utf-8'));\n }\n\n // Try partial match\n const files = fs.readdirSync(this.checkpointDir);\n const match = files.find((f) => f.includes(checkpointId));\n if (match) {\n const path = path.join(this.checkpointDir, match);\n return JSON.parse(fs.readFileSync(path, 'utf-8'));\n }\n\n return null;\n }\n}\n\n/**\n * Skill 2: Context Archaeologist\n * Deep historical context retrieval across sessions\n */\nexport class ArchaeologistSkill {\n constructor(private context: SkillContext) {}\n\n async dig(\n query: string,\n options?: {\n depth?: string; // e.g., \"6months\", \"30days\", \"all\"\n patterns?: boolean;\n decisions?: boolean;\n timeline?: boolean;\n }\n ): Promise<SkillResult> {\n try {\n // Parse depth\n const depth = this.parseDepth(options?.depth || '30days');\n const since = new Date(Date.now() - depth);\n\n // Use context retriever for semantic search\n const results = await this.context.contextRetriever.retrieve({\n query,\n projectId: this.context.projectId,\n limit: 50,\n minScore: 0.3,\n });\n\n // Filter by date if specified\n const filtered = results.filter(\n (r) => !depth || new Date(r.timestamp) > since\n );\n\n // Extract patterns if requested\n let patterns: Pattern[] = [];\n if (options?.patterns) {\n patterns = this.extractPatterns(filtered);\n }\n\n // Extract decisions if requested\n let decisions: Decision[] = [];\n if (options?.decisions) {\n decisions = this.extractDecisions(filtered);\n }\n\n // Generate timeline if requested\n let timeline: TimelineEntry[] = [];\n if (options?.timeline) {\n timeline = this.generateTimeline(filtered);\n }\n\n // Find most relevant context\n const topResults = filtered.slice(0, 10);\n const summary = this.generateArchaeologySummary(\n topResults,\n patterns,\n decisions,\n timeline\n );\n\n return {\n success: true,\n message: `Found ${filtered.length} relevant results`,\n data: {\n totalResults: filtered.length,\n timeRange: {\n from: since.toISOString(),\n to: new Date().toISOString(),\n },\n topResults: topResults.map((r) => ({\n frameId: r.frameId,\n score: r.score,\n timestamp: r.timestamp,\n summary: r.content.slice(0, 100) + '...',\n })),\n patterns,\n decisions,\n timeline,\n summary,\n },\n action: `Analyzed ${filtered.length} frames from ${options?.depth || '30days'} of history`,\n };\n } catch (error: unknown) {\n logger.error('Archaeology skill error:', error);\n return {\n success: false,\n message: `Failed to dig through context: ${error.message}`,\n };\n }\n }\n\n private parseDepth(depth: string): number {\n const match = depth.match(/^(\\d+)(days?|weeks?|months?|years?|all)$/i);\n if (!match) {\n return 30 * 24 * 60 * 60 * 1000; // Default 30 days\n }\n\n const [, num, unit] = match;\n const value = parseInt(num);\n\n switch (unit.toLowerCase()) {\n case 'day':\n case 'days':\n return value * 24 * 60 * 60 * 1000;\n case 'week':\n case 'weeks':\n return value * 7 * 24 * 60 * 60 * 1000;\n case 'month':\n case 'months':\n return value * 30 * 24 * 60 * 60 * 1000;\n case 'year':\n case 'years':\n return value * 365 * 24 * 60 * 60 * 1000;\n case 'all':\n return Number.MAX_SAFE_INTEGER;\n default:\n return 30 * 24 * 60 * 60 * 1000;\n }\n }\n\n private extractPatterns(results: Frame[]): Pattern[] {\n const patterns: Map<string, number> = new Map();\n\n // Common patterns to look for\n const patternTypes = [\n { regex: /test.*then.*implement/i, name: 'TDD' },\n { regex: /refactor/i, name: 'Refactoring' },\n { regex: /debug|fix|error|bug/i, name: 'Debugging' },\n { regex: /implement.*feature/i, name: 'Feature Development' },\n { regex: /review|code review/i, name: 'Code Review' },\n { regex: /deploy|release/i, name: 'Deployment' },\n { regex: /optimize|performance/i, name: 'Optimization' },\n ];\n\n results.forEach((result) => {\n patternTypes.forEach((pattern) => {\n if (pattern.regex.test(result.content)) {\n patterns.set(pattern.name, (patterns.get(pattern.name) || 0) + 1);\n }\n });\n });\n\n return Array.from(patterns.entries())\n .map(([name, count]) => ({ name, count }))\n .sort((a, b) => b.count - a.count);\n }\n\n private extractDecisions(results: Frame[]): Decision[] {\n const decisions: Decision[] = [];\n\n // Keywords that indicate decisions\n const decisionKeywords = [\n 'decided',\n 'chose',\n 'selected',\n 'will use',\n 'going with',\n 'approach',\n 'strategy',\n 'solution',\n ];\n\n results.forEach((result) => {\n const content = result.content.toLowerCase();\n if (decisionKeywords.some((keyword) => content.includes(keyword))) {\n // Extract sentence containing the decision\n const sentences = result.content.split(/[.!?]+/);\n const decisionSentence = sentences.find((s) =>\n decisionKeywords.some((k) => s.toLowerCase().includes(k))\n );\n\n if (decisionSentence) {\n decisions.push({\n frameId: result.frameId,\n timestamp: result.timestamp,\n decision: decisionSentence.trim(),\n context: result.content.slice(0, 200),\n });\n }\n }\n });\n\n return decisions.slice(0, 10); // Top 10 decisions\n }\n\n private generateTimeline(results: Frame[]): TimelineEntry[] {\n // Group by day\n const timeline: Map<string, Frame[]> = new Map();\n\n results.forEach((result) => {\n const date = new Date(result.timestamp).toDateString();\n if (!timeline.has(date)) {\n timeline.set(date, []);\n }\n const dateItems = timeline.get(date);\n if (dateItems) {\n dateItems.push(result);\n }\n });\n\n return Array.from(timeline.entries())\n .map(([date, items]) => ({\n date,\n itemCount: items.length,\n highlights: items.slice(0, 3).map((item) => ({\n frameId: item.frameId,\n summary: item.content.slice(0, 50) + '...',\n })),\n }))\n .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());\n }\n\n private generateArchaeologySummary(\n results: Frame[],\n patterns: Pattern[],\n decisions: Decision[],\n timeline: TimelineEntry[]\n ): string {\n let summary = '## Context Archaeology Report\\n\\n';\n\n if (results.length > 0) {\n summary += `### Most Relevant Context (${results.length} results)\\n`;\n results.slice(0, 3).forEach((r) => {\n summary += `- **${new Date(r.timestamp).toLocaleDateString()}**: ${r.content.slice(0, 100)}...\\n`;\n });\n summary += '\\n';\n }\n\n if (patterns.length > 0) {\n summary += `### Detected Patterns\\n`;\n patterns.slice(0, 5).forEach((p) => {\n summary += `- ${p.name}: ${p.count} occurrences\\n`;\n });\n summary += '\\n';\n }\n\n if (decisions.length > 0) {\n summary += `### Key Decisions\\n`;\n decisions.slice(0, 5).forEach((d) => {\n summary += `- **${new Date(d.timestamp).toLocaleDateString()}**: ${d.decision}\\n`;\n });\n summary += '\\n';\n }\n\n if (timeline.length > 0) {\n summary += `### Activity Timeline\\n`;\n timeline.slice(0, 5).forEach((t) => {\n summary += `- **${t.date}**: ${t.itemCount} activities\\n`;\n });\n }\n\n return summary;\n }\n}\n\n/**\n * Main Claude Skills Manager\n */\nexport class ClaudeSkillsManager {\n private handoffSkill: HandoffSkill;\n private checkpointSkill: CheckpointSkill;\n private archaeologistSkill: ArchaeologistSkill;\n private dashboardLauncher: DashboardLauncherSkill;\n private repoIngestionSkill: RepoIngestionSkill | null = null;\n private rlmOrchestrator: RecursiveAgentOrchestrator | null = null;\n\n constructor(private context: SkillContext) {\n this.handoffSkill = new HandoffSkill(context);\n this.checkpointSkill = new CheckpointSkill(context);\n this.archaeologistSkill = new ArchaeologistSkill(context);\n\n // Initialize dashboard launcher (lazy import to avoid circular deps)\n import('./dashboard-launcher.js').then((module) => {\n this.dashboardLauncher = new module.DashboardLauncherSkill();\n // Don't auto-launch dashboard to avoid startup errors\n // User can manually launch with 'stackmemory skills dashboard launch'\n logger.info('Dashboard launcher initialized (manual launch required)');\n });\n\n // Initialize repo ingestion skill if ChromaDB is configured\n const chromaConfig = {\n apiKey: process.env['CHROMADB_API_KEY'] || '',\n tenant: process.env['CHROMADB_TENANT'] || '',\n database: process.env['CHROMADB_DATABASE'] || 'stackmemory',\n collectionName: process.env['CHROMADB_COLLECTION'] || 'stackmemory_repos',\n };\n\n if (chromaConfig.apiKey && chromaConfig.tenant) {\n this.repoIngestionSkill = new RepoIngestionSkill(\n chromaConfig,\n context.userId,\n process.env['CHROMADB_TEAM_ID']\n );\n this.repoIngestionSkill.initialize().catch((error: unknown) => {\n logger.warn('Repo ingestion skill initialization failed:', error);\n });\n }\n\n // Initialize RLM Orchestrator\n // Import dynamically to avoid circular dependencies\n import('../features/tasks/linear-task-manager.js')\n .then((module) => {\n const taskStore = new module.LinearTaskManager();\n\n // Use frameManager from context if available\n const frameManager = context.frameManager;\n if (!frameManager) {\n throw new Error(\n 'FrameManager not provided in context - required for RLM orchestrator'\n );\n }\n\n this.rlmOrchestrator = new RecursiveAgentOrchestrator(\n frameManager,\n context.dualStackManager,\n context.contextRetriever,\n taskStore\n );\n\n logger.info('RLM Orchestrator initialized');\n })\n .catch((error: unknown) => {\n logger.warn('RLM Orchestrator initialization failed:', error);\n });\n }\n\n async executeSkill(\n skillName: string,\n args: string[],\n options?: Record<string, unknown>\n ): Promise<SkillResult> {\n switch (skillName) {\n case 'handoff':\n return this.handoffSkill.execute(args[0], args[1], options);\n\n case 'checkpoint':\n const subcommand = args[0];\n switch (subcommand) {\n case 'create':\n return this.checkpointSkill.create(args[1], options);\n case 'restore':\n return this.checkpointSkill.restore(args[1]);\n case 'list':\n return this.checkpointSkill.list(options);\n case 'diff':\n return this.checkpointSkill.diff(args[1], args[2]);\n default:\n return {\n success: false,\n message: `Unknown checkpoint subcommand: ${subcommand}`,\n };\n }\n\n case 'dig':\n return this.archaeologistSkill.dig(args[0], options);\n\n case 'lint':\n // Linting task using RLM orchestrator with linting agent\n if (!this.rlmOrchestrator) {\n return {\n success: false,\n message:\n 'RLM Orchestrator not initialized. Please wait a moment and try again.',\n };\n }\n\n const lintPath = args[0] || process.cwd();\n const lintOptions = {\n ...options,\n // Force use of linting agent\n agents: ['linting'],\n maxParallel: 1,\n reviewStages: 1,\n verboseLogging: true,\n } as RLMOptions;\n\n const lintTask = `Perform comprehensive linting on ${lintPath}: Check for syntax errors, type issues, formatting violations, security vulnerabilities, performance anti-patterns, and unused code. Provide actionable fixes.`;\n\n try {\n const result = await this.rlmOrchestrator.execute(\n lintTask,\n { path: lintPath, ...options },\n lintOptions\n );\n\n return {\n success: result.success,\n message: `Linting ${result.success ? 'completed' : 'failed'}`,\n data: {\n issuesFound: result.issuesFound,\n issuesFixed: result.issuesFixed,\n duration: `${result.duration}ms`,\n totalTokens: result.totalTokens,\n details: result.rootNode,\n },\n };\n } catch (error) {\n return {\n success: false,\n message: `Linting failed: ${error.message}`,\n };\n }\n\n case 'rlm':\n if (!this.rlmOrchestrator) {\n return {\n success: false,\n message:\n 'RLM Orchestrator not initialized. Please wait a moment and try again.',\n };\n }\n return this.rlmOrchestrator.execute(args[0], options as RLMOptions);\n\n case 'repo':\n case 'ingest':\n if (!this.repoIngestionSkill) {\n return {\n success: false,\n message:\n 'Repo ingestion skill not initialized. Please configure ChromaDB.',\n };\n }\n\n const repoCommand = args[0];\n switch (repoCommand) {\n case 'ingest':\n const repoPath = args[1] || process.cwd();\n const repoName = args[2] || path.basename(repoPath);\n return await this.repoIngestionSkill.ingestRepository(\n repoPath,\n repoName,\n options as RepoIngestionOptions\n );\n\n case 'update':\n const updatePath = args[1] || process.cwd();\n const updateName = args[2] || path.basename(updatePath);\n return await this.repoIngestionSkill.updateRepository(\n updatePath,\n updateName,\n options as RepoIngestionOptions\n );\n\n case 'search':\n const query = args[1];\n if (!query) {\n return {\n success: false,\n message: 'Search query required',\n };\n }\n const results = await this.repoIngestionSkill.searchCode(query, {\n repoName: options?.repoName as string,\n language: options?.language as string,\n limit: options?.limit as number,\n includeContext: options?.includeContext as boolean,\n });\n return {\n success: true,\n message: `Found ${results.length} results`,\n data: results,\n };\n\n case 'stats':\n const stats = await this.repoIngestionSkill.getRepoStats(args[1]);\n return {\n success: true,\n message: 'Repository statistics',\n data: stats,\n };\n\n default:\n return {\n success: false,\n message: `Unknown repo command: ${repoCommand}. Use: ingest, update, search, or stats`,\n };\n }\n\n case 'dashboard':\n const dashboardCmd = args[0];\n if (!this.dashboardLauncher) {\n return {\n success: false,\n message: 'Dashboard launcher not yet initialized',\n };\n }\n switch (dashboardCmd) {\n case 'launch':\n await this.dashboardLauncher.launch();\n return {\n success: true,\n message: 'Dashboard launched',\n action: 'open-browser',\n };\n case 'stop':\n await this.dashboardLauncher.stop();\n return {\n success: true,\n message: 'Dashboard stopped',\n };\n default:\n await this.dashboardLauncher.launch();\n return {\n success: true,\n message: 'Dashboard launched',\n action: 'open-browser',\n };\n }\n\n case 'recursive':\n if (!this.rlmOrchestrator) {\n return {\n success: false,\n message:\n 'RLM Orchestrator not initialized. Please wait a moment and try again.',\n };\n }\n\n const task = args.join(' ') || 'Analyze and improve the current code';\n const rlmOptions = options as RLMOptions;\n\n try {\n logger.info('Starting RLM execution', { task });\n\n const result = await this.rlmOrchestrator.execute(\n task,\n {\n files: rlmOptions.files || [],\n query: task,\n },\n rlmOptions\n );\n\n return {\n success: result.success,\n message: `RLM execution ${result.success ? 'completed' : 'failed'}`,\n data: {\n duration: `${result.duration}ms`,\n totalTokens: result.totalTokens,\n totalCost: `$${result.totalCost.toFixed(2)}`,\n testsGenerated: result.testsGenerated,\n improvements: result.improvements.length,\n issuesFound: result.issuesFound,\n issuesFixed: result.issuesFixed,\n executionTree: result.rootNode,\n },\n };\n } catch (error) {\n logger.error('RLM execution error:', error);\n return {\n success: false,\n message: `RLM execution failed: ${error.message}`,\n };\n }\n\n default:\n return {\n success: false,\n message: `Unknown skill: ${skillName}`,\n };\n }\n }\n\n getAvailableSkills(): string[] {\n const skills = ['handoff', 'checkpoint', 'dig', 'dashboard'];\n if (this.repoIngestionSkill) {\n skills.push('repo');\n }\n if (this.rlmOrchestrator) {\n skills.push('rlm', 'lint');\n }\n return skills;\n }\n\n getSkillHelp(skillName: string): string {\n switch (skillName) {\n case 'handoff':\n return `\n/handoff @user \"message\" [--priority high] [--frames frame1,frame2]\nStreamline frame handoffs between team members\n`;\n\n case 'checkpoint':\n return `\n/checkpoint create \"description\" [--files file1,file2] [--auto-detect-risky]\n/checkpoint restore <id>\n/checkpoint list [--limit 10] [--since \"2024-01-01\"]\n/checkpoint diff <id1> <id2>\nCreate and manage recovery points\n`;\n\n case 'dig':\n return `\n/dig \"query\" [--depth 6months] [--patterns] [--decisions] [--timeline]\nDeep historical context retrieval across sessions\n`;\n\n case 'lint':\n return `\n/lint [path] [options]\nPerform comprehensive code linting and quality checks\n\nAutomatically checks for:\n- Syntax errors and type issues\n- Code formatting and style violations \n- Security vulnerabilities\n- Performance anti-patterns\n- Unused imports and dead code\n- Code smells and complexity issues\n\nUsage:\n stackmemory skills lint # Lint current directory\n stackmemory skills lint src/ # Lint specific directory\n stackmemory skills lint src/file.ts # Lint specific file\n\nOptions:\n --fix Automatically fix issues where possible\n --format Focus on formatting issues\n --security Focus on security vulnerabilities\n --performance Focus on performance issues\n --verbose Show detailed output\n\nExamples:\n stackmemory skills lint --fix\n stackmemory skills lint src/ --security --verbose\n`;\n\n case 'rlm':\n return `\n/rlm \"task description\" [options]\nExecute complex tasks with recursive agent orchestration\n\nOptions:\n --max-parallel <n> Max concurrent subagents (default: 5)\n --max-recursion <n> Max recursion depth (default: 4)\n --max-tokens-per-agent <n> Token budget per agent (default: 30000)\n --review-stages <n> Review iterations (default: 3)\n --quality-threshold <n> Target quality 0-1 (default: 0.85)\n --test-mode <mode> unit/integration/e2e/all (default: all)\n --verbose Show all operations\n --timeout-per-agent <s> Timeout in seconds (default: 300)\n\nExamples:\n stackmemory skills rlm \"Generate tests for API endpoints\"\n stackmemory skills rlm \"Refactor auth system\" --quality-threshold 0.95\n`;\n\n case 'dashboard':\n return `\n/dashboard [launch|stop]\nLaunch the StackMemory web dashboard for real-time monitoring\n- launch: Start the web dashboard and open in browser (default)\n- stop: Stop the dashboard server\nAuto-launches on new sessions when configured\n`;\n\n case 'repo':\n return `\n/repo ingest [path] [name] [--incremental] [--include-tests] [--include-docs]\n/repo update [path] [name] [--force-update]\n/repo search \"query\" [--repo-name name] [--language lang] [--limit n]\n/repo stats [repo-name]\n\nIngest and search code repositories in ChromaDB:\n- ingest: Index a new repository (defaults to current directory)\n- update: Update an existing repository with changes\n- search: Semantic search across ingested code\n- stats: View statistics about ingested repositories\n\nOptions:\n- --incremental: Only process changed files\n- --include-tests: Include test files in indexing\n- --include-docs: Include documentation files\n- --force-update: Force re-indexing of all files\n- --language: Filter search by programming language\n- --limit: Maximum search results (default: 20)\n`;\n\n case 'recursive':\n return `\n/rlm \"task description\" [options]\n\nRecursive Language Model orchestration using Claude Code's Task tool:\n- Decomposes complex tasks into parallel/sequential subtasks\n- Spawns specialized Claude subagents for each task type\n- Automatic test generation and multi-stage review\n- Handles large codebases through intelligent chunking\n\nSubagent Types:\n- Planning: Task decomposition and strategy\n- Code: Implementation and refactoring\n- Testing: Comprehensive test generation (unit/integration/E2E)\n- Linting: Code quality and formatting\n- Review: Multi-stage code review and quality scoring\n- Improve: Implement review suggestions\n- Context: Information retrieval\n- Publish: NPM/GitHub releases\n\nOptions:\n- --max-parallel N: Max concurrent subagents (default: 5)\n- --max-recursion N: Max recursion depth (default: 4)\n- --review-stages N: Number of review iterations (default: 3)\n- --quality-threshold N: Target quality score 0-1 (default: 0.85)\n- --test-mode [unit|integration|e2e|all]: Test generation mode (default: all)\n- --verbose: Show all recursive operations\n\nExamples:\n/rlm \"Refactor the authentication system with full test coverage\"\n/rlm \"Generate comprehensive tests for the API endpoints\" --test-mode integration\n/rlm \"Review and improve code quality\" --review-stages 5 --quality-threshold 0.95\n`;\n\n default:\n return `Unknown skill: ${skillName}`;\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["path"]
7
7
  }
@@ -195,7 +195,7 @@ class RecursiveAgentOrchestrator {
195
195
  options: opts
196
196
  });
197
197
  try {
198
- const rootFrame = await this.createExecutionFrame(executionId, task);
198
+ const rootFrameId = await this.createExecutionFrame(executionId, task);
199
199
  const rootNode = await this.planTask(task, context, opts);
200
200
  this.activeExecutions.set(executionId, rootNode);
201
201
  if (opts.verboseLogging) {
@@ -219,7 +219,7 @@ class RecursiveAgentOrchestrator {
219
219
  issuesFixed: this.countIssuesFixed(rootNode)
220
220
  };
221
221
  this.executionHistory.push(result);
222
- await this.updateExecutionFrame(rootFrame, result);
222
+ await this.updateExecutionFrame(rootFrameId, result);
223
223
  logger.info("RLM execution completed", {
224
224
  executionId,
225
225
  success: result.success,
@@ -370,12 +370,18 @@ class RecursiveAgentOrchestrator {
370
370
  reviewNode.result = reviewResponse.result;
371
371
  reviewNode.status = reviewResponse.success ? "completed" : "failed";
372
372
  const reviewResult = reviewResponse.result;
373
- currentQuality = reviewResult.quality;
374
- improvements.push(...reviewResult.suggestions);
373
+ currentQuality = reviewResult.quality || 0.5;
374
+ if (reviewResult.suggestions && Array.isArray(reviewResult.suggestions)) {
375
+ improvements.push(...reviewResult.suggestions);
376
+ } else {
377
+ improvements.push(
378
+ `Stage ${stage}: Review completed with quality ${currentQuality}`
379
+ );
380
+ }
375
381
  logger.info(`Review stage ${stage} complete`, {
376
382
  quality: currentQuality,
377
- issues: reviewResult.issues.length,
378
- suggestions: reviewResult.suggestions.length
383
+ issues: reviewResult.issues?.length || 0,
384
+ suggestions: reviewResult.suggestions?.length || 0
379
385
  });
380
386
  if (currentQuality >= qualityThreshold) {
381
387
  logger.info(
@@ -413,20 +419,21 @@ class RecursiveAgentOrchestrator {
413
419
  return `rlm-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
414
420
  }
415
421
  async createExecutionFrame(executionId, task) {
416
- return this.frameManager.pushFrame({
422
+ return this.frameManager.createFrame({
417
423
  name: `RLM: ${task.slice(0, 50)}`,
418
- type: "rlm-execution",
419
- metadata: { executionId }
424
+ type: "task",
425
+ inputs: { executionId, task, type: "rlm-execution" }
420
426
  });
421
427
  }
422
- async updateExecutionFrame(frame, result) {
423
- frame.outputs = [
424
- {
425
- type: "rlm-result",
426
- content: JSON.stringify(result, null, 2)
427
- }
428
- ];
429
- frame.state = result.success ? "completed" : "failed";
428
+ async updateExecutionFrame(frameId, result) {
429
+ this.frameManager.closeFrame(frameId, {
430
+ type: "rlm-result",
431
+ content: JSON.stringify(result, null, 2),
432
+ success: result.success,
433
+ duration: result.duration,
434
+ totalTokens: result.totalTokens,
435
+ totalCost: result.totalCost
436
+ });
430
437
  }
431
438
  logExecutionTree(node, depth = 0) {
432
439
  const indent = " ".repeat(depth);
@@ -452,7 +459,9 @@ class RecursiveAgentOrchestrator {
452
459
  };
453
460
  }
454
461
  injectTestGenerationNodes(node, _mode) {
455
- if (!node.children) return;
462
+ if (!node.children) {
463
+ node.children = [];
464
+ }
456
465
  const testNode = {
457
466
  id: `${node.id}-test`,
458
467
  type: "task",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/skills/recursive-agent-orchestrator.ts"],
4
- "sourcesContent": ["/**\n * Recursive Language Model (RLM) Orchestrator for StackMemory\n *\n * Implements recursive task decomposition with parallel Claude API execution\n * Based on \"Recursive Language Models\" paper concepts\n *\n * Key Features:\n * - Parallel subagent execution via Claude API\n * - Automatic test generation and validation\n * - Multi-stage code review and improvement\n * - Large codebase processing through chunking\n * - Full operation transparency\n */\n\nimport { logger } from '../core/monitoring/logger.js';\nimport { FrameManager } from '../core/context/frame-manager.js';\nimport { DualStackManager } from '../core/context/dual-stack-manager.js';\nimport { ContextRetriever } from '../core/retrieval/context-retriever.js';\nimport { LinearTaskManager } from '../features/tasks/linear-task-manager.js';\nimport { ParallelExecutor } from '../core/execution/parallel-executor.js';\nimport { RecursiveContextManager } from '../core/context/recursive-context-manager.js';\nimport { ClaudeCodeSubagentClient } from '../integrations/claude-code/subagent-client.js';\nimport type { Frame } from '../core/context/frame-manager.js';\n\n// Subagent types\nexport type SubagentType =\n | 'planning'\n | 'code'\n | 'testing'\n | 'linting'\n | 'review'\n | 'context'\n | 'publish'\n | 'improve';\n\n// Subagent configuration\nexport interface SubagentConfig {\n type: SubagentType;\n model:\n | 'claude-3-5-sonnet-latest'\n | 'claude-3-5-haiku-latest'\n | 'claude-3-opus-latest';\n maxTokens: number;\n temperature: number;\n systemPrompt: string;\n capabilities: string[];\n}\n\n// Task decomposition node\nexport interface TaskNode {\n id: string;\n type: 'task' | 'parallel' | 'sequential';\n description: string;\n agent: SubagentType;\n dependencies: string[];\n context: Record<string, unknown>;\n children?: TaskNode[];\n status: 'pending' | 'running' | 'completed' | 'failed';\n result?: unknown;\n error?: Error;\n attempts: number;\n startTime?: Date;\n endTime?: Date;\n tokens?: number;\n cost?: number;\n}\n\n// Execution result\nexport interface ExecutionResult {\n success: boolean;\n rootNode: TaskNode;\n totalTokens: number;\n totalCost: number;\n duration: number;\n improvements: string[];\n testsGenerated: number;\n issuesFound: number;\n issuesFixed: number;\n}\n\n// RLM Options\nexport interface RLMOptions {\n maxParallel?: number;\n maxRecursionDepth?: number;\n maxTokensPerAgent?: number;\n maxTotalCost?: number;\n timeoutPerAgent?: number;\n retryFailedAgents?: boolean;\n shareContextRealtime?: boolean;\n testGenerationMode?: 'unit' | 'integration' | 'e2e' | 'all';\n reviewStages?: number;\n qualityThreshold?: number;\n verboseLogging?: boolean;\n}\n\n/**\n * Main RLM Orchestrator\n */\nexport class RecursiveAgentOrchestrator {\n private frameManager: FrameManager;\n private contextRetriever: ContextRetriever;\n private taskStore: LinearTaskManager;\n private parallelExecutor: ParallelExecutor;\n private contextManager: RecursiveContextManager;\n private subagentClient: ClaudeCodeSubagentClient;\n\n // Subagent configurations\n private subagentConfigs: Map<SubagentType, SubagentConfig>;\n\n // Execution tracking\n private activeExecutions: Map<string, TaskNode> = new Map();\n private executionHistory: ExecutionResult[] = [];\n\n // Default options\n private defaultOptions: Required<RLMOptions> = {\n maxParallel: 5,\n maxRecursionDepth: 4,\n maxTokensPerAgent: 30000,\n maxTotalCost: 50.0, // Quality over cost\n timeoutPerAgent: 300,\n retryFailedAgents: true,\n shareContextRealtime: true,\n testGenerationMode: 'all',\n reviewStages: 3, // Multi-stage review\n qualityThreshold: 0.85,\n verboseLogging: true, // Full transparency\n };\n\n constructor(\n frameManager: FrameManager,\n dualStackManager: DualStackManager,\n contextRetriever: ContextRetriever,\n taskStore: LinearTaskManager\n ) {\n this.frameManager = frameManager;\n this.contextRetriever = contextRetriever;\n this.taskStore = taskStore;\n\n // Initialize components\n this.parallelExecutor = new ParallelExecutor(\n this.defaultOptions.maxParallel\n );\n this.contextManager = new RecursiveContextManager(\n dualStackManager,\n contextRetriever\n );\n this.subagentClient = new ClaudeCodeSubagentClient();\n\n // Initialize subagent configurations\n this.subagentConfigs = this.initializeSubagentConfigs();\n\n logger.info('RLM Orchestrator initialized', {\n maxParallel: this.defaultOptions.maxParallel,\n maxRecursion: this.defaultOptions.maxRecursionDepth,\n reviewStages: this.defaultOptions.reviewStages,\n });\n }\n\n /**\n * Initialize subagent configurations with specialized prompts\n */\n private initializeSubagentConfigs(): Map<SubagentType, SubagentConfig> {\n const configs = new Map<SubagentType, SubagentConfig>();\n\n // Planning Agent - Task decomposer\n configs.set('planning', {\n type: 'planning',\n model: 'claude-3-5-sonnet-latest',\n maxTokens: 20000,\n temperature: 0.3,\n systemPrompt: `You are a Planning Agent specializing in task decomposition.\n Analyze complex tasks and break them into parallel and sequential subtasks.\n Create detailed execution plans with clear dependencies.\n Consider edge cases and potential failures.\n Output structured task trees with agent assignments.`,\n capabilities: ['decompose', 'analyze', 'strategize', 'prioritize'],\n });\n\n // Code Agent - Implementation specialist\n configs.set('code', {\n type: 'code',\n model: 'claude-3-5-sonnet-latest',\n maxTokens: 30000,\n temperature: 0.2,\n systemPrompt: `You are a Code Agent specializing in implementation.\n Write clean, maintainable, production-ready code.\n Follow project conventions and best practices.\n Include comprehensive error handling.\n Document complex logic with clear comments.`,\n capabilities: ['implement', 'refactor', 'optimize', 'document'],\n });\n\n // Testing Agent - Test generation and validation\n configs.set('testing', {\n type: 'testing',\n model: 'claude-3-5-sonnet-latest', // High quality for test generation\n maxTokens: 25000,\n temperature: 0.1,\n systemPrompt: `You are a Testing Agent specializing in test generation and validation.\n Generate comprehensive test suites including:\n - Unit tests for all functions/methods\n - Integration tests for API endpoints\n - E2E tests for critical user flows\n - Edge cases and error scenarios\n Ensure 100% code coverage where possible.\n Validate that all tests pass and are meaningful.`,\n capabilities: [\n 'generate-tests',\n 'validate',\n 'coverage-analysis',\n 'test-execution',\n ],\n });\n\n // Linting Agent - Code quality enforcer\n configs.set('linting', {\n type: 'linting',\n model: 'claude-3-5-haiku-latest',\n maxTokens: 15000,\n temperature: 0,\n systemPrompt: `You are a Linting Agent specializing in code quality.\n Check for:\n - Syntax errors and type issues\n - Code formatting and style violations\n - Security vulnerabilities\n - Performance anti-patterns\n - Unused imports and dead code\n Provide actionable fixes for all issues found.`,\n capabilities: ['lint', 'format', 'type-check', 'security-scan'],\n });\n\n // Review Agent - Multi-stage code reviewer\n configs.set('review', {\n type: 'review',\n model: 'claude-3-5-sonnet-latest',\n maxTokens: 25000,\n temperature: 0.2,\n systemPrompt: `You are a Review Agent specializing in multi-stage code review.\n Perform thorough reviews focusing on:\n - Architecture and design patterns\n - Code quality and maintainability\n - Performance implications\n - Security considerations\n - Test coverage adequacy\n Suggest specific improvements with examples.\n Rate quality on a 0-1 scale.`,\n capabilities: [\n 'review',\n 'critique',\n 'suggest-improvements',\n 'quality-scoring',\n ],\n });\n\n // Improvement Agent - Code enhancer\n configs.set('improve', {\n type: 'improve',\n model: 'claude-3-5-sonnet-latest',\n maxTokens: 30000,\n temperature: 0.3,\n systemPrompt: `You are an Improvement Agent specializing in code enhancement.\n Take reviewed code and implement suggested improvements:\n - Refactor for better architecture\n - Optimize performance bottlenecks\n - Enhance error handling\n - Improve code clarity and documentation\n - Add missing test cases\n Ensure all improvements maintain backward compatibility.`,\n capabilities: ['enhance', 'refactor', 'optimize', 'polish'],\n });\n\n // Context Agent - Information retriever\n configs.set('context', {\n type: 'context',\n model: 'claude-3-5-haiku-latest',\n maxTokens: 10000,\n temperature: 0,\n systemPrompt: `You are a Context Agent specializing in information retrieval.\n Search and retrieve relevant context from:\n - Project codebase and documentation\n - Previous frame history\n - Similar implementations\n - Best practices and patterns\n Provide concise, relevant context for other agents.`,\n capabilities: ['search', 'retrieve', 'summarize', 'contextualize'],\n });\n\n // Publish Agent - Release and deployment\n configs.set('publish', {\n type: 'publish',\n model: 'claude-3-5-haiku-latest',\n maxTokens: 15000,\n temperature: 0,\n systemPrompt: `You are a Publish Agent specializing in release management.\n Handle:\n - NPM package publishing\n - GitHub releases and tagging\n - Documentation updates\n - Changelog generation\n - Deployment automation\n Ensure all release steps are properly sequenced.`,\n capabilities: ['publish-npm', 'github-release', 'deploy', 'document'],\n });\n\n return configs;\n }\n\n /**\n * Execute a task with recursive decomposition\n */\n async execute(\n task: string,\n context: Record<string, unknown>,\n options?: RLMOptions\n ): Promise<ExecutionResult> {\n const opts = { ...this.defaultOptions, ...options };\n const executionId = this.generateExecutionId();\n const startTime = Date.now();\n\n logger.info('Starting RLM execution', {\n executionId,\n task: task.slice(0, 100),\n options: opts,\n });\n\n try {\n // Create root frame for execution\n const rootFrame = await this.createExecutionFrame(executionId, task);\n\n // Step 1: Planning - Decompose task into subtasks\n const rootNode = await this.planTask(task, context, opts);\n this.activeExecutions.set(executionId, rootNode);\n\n // Log execution tree for transparency\n if (opts.verboseLogging) {\n this.logExecutionTree(rootNode);\n }\n\n // Step 2: Execute task tree recursively with parallelization\n await this.executeTaskTree(rootNode, context, opts, 0);\n\n // Step 3: Multi-stage review and improvement\n const improvements = await this.performMultiStageReview(\n rootNode,\n opts.reviewStages,\n opts.qualityThreshold\n );\n\n // Step 4: Aggregate results\n const result: ExecutionResult = {\n success: rootNode.status === 'completed',\n rootNode,\n totalTokens: this.calculateTotalTokens(rootNode),\n totalCost: this.calculateTotalCost(rootNode),\n duration: Date.now() - startTime,\n improvements,\n testsGenerated: this.countGeneratedTests(rootNode),\n issuesFound: this.countIssuesFound(rootNode),\n issuesFixed: this.countIssuesFixed(rootNode),\n };\n\n // Store execution history\n this.executionHistory.push(result);\n\n // Update frame with results\n await this.updateExecutionFrame(rootFrame, result);\n\n logger.info('RLM execution completed', {\n executionId,\n success: result.success,\n duration: result.duration,\n totalCost: result.totalCost,\n testsGenerated: result.testsGenerated,\n improvements: improvements.length,\n });\n\n return result;\n } catch (error) {\n logger.error('RLM execution failed', { executionId, error });\n throw error;\n } finally {\n this.activeExecutions.delete(executionId);\n }\n }\n\n /**\n * Plan task decomposition\n */\n private async planTask(\n task: string,\n context: Record<string, unknown>,\n options: Required<RLMOptions>\n ): Promise<TaskNode> {\n // Call planning agent using Claude Code Task tool\n const response = await this.subagentClient.executeSubagent({\n type: 'planning',\n task: task,\n context: {\n ...context,\n requirements: options,\n },\n });\n\n // Parse response into task tree\n const taskTree = this.parseTaskTree(JSON.stringify(response.result));\n\n // Add automatic test generation nodes\n this.injectTestGenerationNodes(taskTree, options.testGenerationMode);\n\n // Add review stages\n this.injectReviewStages(taskTree, options.reviewStages);\n\n return taskTree;\n }\n\n /**\n * Execute task tree recursively with parallelization\n */\n private async executeTaskTree(\n node: TaskNode,\n context: Record<string, unknown>,\n options: Required<RLMOptions>,\n depth: number\n ): Promise<void> {\n // Check recursion depth\n if (depth >= options.maxRecursionDepth) {\n logger.warn('Max recursion depth reached', { nodeId: node.id, depth });\n node.status = 'failed';\n node.error = new Error('Max recursion depth exceeded');\n return;\n }\n\n // Log execution start for transparency\n if (options.verboseLogging) {\n logger.info(`Executing node: ${node.description}`, {\n id: node.id,\n type: node.type,\n agent: node.agent,\n depth,\n });\n }\n\n node.status = 'running';\n node.startTime = new Date();\n\n try {\n if (node.type === 'parallel' && node.children) {\n // Execute children in parallel\n await this.parallelExecutor.executeParallel(\n node.children,\n async (child) => {\n await this.executeTaskTree(child, context, options, depth + 1);\n }\n );\n } else if (node.type === 'sequential' && node.children) {\n // Execute children sequentially\n for (const child of node.children) {\n await this.executeTaskTree(child, context, options, depth + 1);\n\n // Pass results to next child\n if (child.result) {\n context[`${child.id}_result`] = child.result;\n }\n }\n } else {\n // Leaf node - execute with appropriate agent\n await this.executeLeafNode(node, context, options);\n }\n\n node.status = 'completed';\n } catch (error) {\n logger.error(`Node execution failed: ${node.description}`, { error });\n\n if (options.retryFailedAgents && node.attempts < 3) {\n node.attempts++;\n logger.info(`Retrying node: ${node.description}`, {\n attempt: node.attempts,\n });\n await this.executeTaskTree(node, context, options, depth);\n } else {\n node.status = 'failed';\n node.error = error as Error;\n }\n } finally {\n node.endTime = new Date();\n\n // Log completion for transparency\n if (options.verboseLogging) {\n const duration =\n node.endTime.getTime() - (node.startTime?.getTime() ?? 0);\n logger.info(`Completed node: ${node.description}`, {\n id: node.id,\n status: node.status,\n duration,\n tokens: node.tokens,\n cost: node.cost,\n });\n }\n }\n }\n\n /**\n * Execute a leaf node with the appropriate agent\n */\n private async executeLeafNode(\n node: TaskNode,\n context: Record<string, unknown>,\n options: Required<RLMOptions>\n ): Promise<void> {\n const agentConfig = this.subagentConfigs.get(node.agent);\n if (!agentConfig) {\n throw new Error(`Unknown agent type: ${node.agent}`);\n }\n\n // Prepare agent-specific context\n const agentContext = await this.contextManager.prepareAgentContext(\n node.agent,\n context,\n options.maxTokensPerAgent\n );\n\n // Build task description for agent\n const taskDescription = this.buildAgentPrompt(node, agentContext);\n\n // Call agent via Claude Code Task tool\n const response = await this.subagentClient.executeSubagent({\n type: node.agent,\n task: taskDescription,\n context: agentContext,\n });\n\n // Process agent response\n node.result = response.result;\n node.tokens =\n response.tokens || this.estimateTokens(JSON.stringify(response));\n node.cost = this.calculateNodeCost(node.tokens, agentConfig.model);\n\n // Share results with other agents if real-time sharing is enabled\n if (options.shareContextRealtime) {\n await this.shareAgentResults(node);\n }\n }\n\n /**\n * Perform multi-stage review and improvement\n */\n private async performMultiStageReview(\n rootNode: TaskNode,\n stages: number,\n qualityThreshold: number\n ): Promise<string[]> {\n const improvements: string[] = [];\n let currentQuality = 0;\n\n for (let stage = 1; stage <= stages; stage++) {\n logger.info(`Starting review stage ${stage}/${stages}`);\n\n // Review stage\n const reviewNode: TaskNode = {\n id: `review-stage-${stage}`,\n type: 'task',\n description: `Review stage ${stage}`,\n agent: 'review',\n dependencies: [],\n context: { rootNode, stage },\n status: 'pending',\n attempts: 0,\n };\n\n // Execute review via Claude Code subagent\n const reviewResponse = await this.subagentClient.executeSubagent({\n type: 'review',\n task: `Review stage ${stage}: Analyze code quality and suggest improvements`,\n context: { rootNode, stage },\n });\n\n reviewNode.result = reviewResponse.result;\n reviewNode.status = reviewResponse.success ? 'completed' : 'failed';\n\n const reviewResult = reviewResponse.result as {\n quality: number;\n issues: string[];\n suggestions: string[];\n };\n\n currentQuality = reviewResult.quality;\n improvements.push(...reviewResult.suggestions);\n\n logger.info(`Review stage ${stage} complete`, {\n quality: currentQuality,\n issues: reviewResult.issues.length,\n suggestions: reviewResult.suggestions.length,\n });\n\n // If quality meets threshold, stop\n if (currentQuality >= qualityThreshold) {\n logger.info(\n `Quality threshold met: ${currentQuality} >= ${qualityThreshold}`\n );\n break;\n }\n\n // Improvement stage\n if (stage < stages) {\n const improveNode: TaskNode = {\n id: `improve-stage-${stage}`,\n type: 'task',\n description: `Improvement stage ${stage}`,\n agent: 'improve',\n dependencies: [reviewNode.id],\n context: { reviewResult, rootNode },\n status: 'pending',\n attempts: 0,\n };\n\n // Execute improvement via Claude Code subagent\n const improveResponse = await this.subagentClient.executeSubagent({\n type: 'improve',\n task: `Improvement stage ${stage}: Implement suggested improvements`,\n context: { reviewResult, rootNode },\n });\n\n improveNode.result = improveResponse.result;\n improveNode.status = improveResponse.success ? 'completed' : 'failed';\n\n // Apply improvements to root node\n this.applyImprovements(rootNode, improveNode.result);\n }\n }\n\n return improvements;\n }\n\n /**\n * Helper methods\n */\n\n private generateExecutionId(): string {\n return `rlm-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n private async createExecutionFrame(\n executionId: string,\n task: string\n ): Promise<Frame> {\n return this.frameManager.pushFrame({\n name: `RLM: ${task.slice(0, 50)}`,\n type: 'rlm-execution',\n metadata: { executionId },\n });\n }\n\n private async updateExecutionFrame(\n frame: Frame,\n result: ExecutionResult\n ): Promise<void> {\n frame.outputs = [\n {\n type: 'rlm-result',\n content: JSON.stringify(result, null, 2),\n },\n ];\n frame.state = result.success ? 'completed' : 'failed';\n }\n\n private logExecutionTree(node: TaskNode, depth: number = 0): void {\n const indent = ' '.repeat(depth);\n const status =\n node.status === 'completed'\n ? '\u2713'\n : node.status === 'failed'\n ? '\u2717'\n : node.status === 'running'\n ? '\u27F3'\n : '\u25CB';\n\n console.log(`${indent}${status} ${node.description} [${node.agent}]`);\n\n if (node.children) {\n for (const child of node.children) {\n this.logExecutionTree(child, depth + 1);\n }\n }\n }\n\n private parseTaskTree(_response: string): TaskNode {\n // Parse LLM response into structured task tree\n // This would need sophisticated parsing logic\n // For now, return a mock structure\n return {\n id: 'root',\n type: 'sequential',\n description: 'Root task',\n agent: 'planning',\n dependencies: [],\n context: {},\n status: 'pending',\n attempts: 0,\n children: [],\n };\n }\n\n private injectTestGenerationNodes(node: TaskNode, _mode: string): void {\n // Inject test generation nodes based on mode\n if (!node.children) return;\n\n const testNode: TaskNode = {\n id: `${node.id}-test`,\n type: 'task',\n description: `Generate ${_mode} tests for ${node.description}`,\n agent: 'testing',\n dependencies: [node.id],\n context: { testMode: _mode },\n status: 'pending',\n attempts: 0,\n };\n\n node.children.push(testNode);\n }\n\n private injectReviewStages(_node: TaskNode, _stages: number): void {\n // Inject review stages into task tree\n // Implementation would add review nodes at appropriate points\n }\n\n private buildAgentPrompt(\n node: TaskNode,\n context: Record<string, unknown>\n ): string {\n return `\n Task: ${node.description}\n \n Context:\n ${JSON.stringify(context, null, 2)}\n \n Previous Results:\n ${JSON.stringify(\n node.dependencies.map((id) => this.activeExecutions.get(id)?.result),\n null,\n 2\n )}\n \n Please complete this task following your specialized role.\n `;\n }\n\n private estimateTokens(text: string): number {\n // Rough estimation: 1 token \u2248 4 characters\n return Math.ceil(text.length / 4);\n }\n\n private async shareAgentResults(_node: TaskNode): Promise<void> {\n // Share results with other agents via Redis or shared context\n logger.debug('Sharing agent results', { nodeId: _node.id });\n }\n\n private applyImprovements(_rootNode: TaskNode, improvements: unknown): void {\n // Apply improvements to the task tree\n logger.debug('Applying improvements', { improvements });\n }\n\n private calculateTotalTokens(node: TaskNode): number {\n let total = node.tokens || 0;\n if (node.children) {\n for (const child of node.children) {\n total += this.calculateTotalTokens(child);\n }\n }\n return total;\n }\n\n private calculateTotalCost(node: TaskNode): number {\n let total = node.cost || 0;\n if (node.children) {\n for (const child of node.children) {\n total += this.calculateTotalCost(child);\n }\n }\n return total;\n }\n\n private calculateNodeCost(tokens: number, model: string): number {\n // Pricing per 1M tokens (approximate)\n const pricing: Record<string, number> = {\n 'claude-3-5-sonnet-latest': 15.0,\n 'claude-3-5-haiku-latest': 1.0,\n 'claude-3-opus-latest': 75.0,\n };\n return (tokens / 1000000) * (pricing[model] || 10);\n }\n\n private countGeneratedTests(node: TaskNode): number {\n let count = 0;\n if (node.agent === 'testing' && node.result?.tests) {\n count += node.result.tests.length;\n }\n if (node.children) {\n for (const child of node.children) {\n count += this.countGeneratedTests(child);\n }\n }\n return count;\n }\n\n private countIssuesFound(node: TaskNode): number {\n let count = 0;\n if (\n (node.agent === 'review' || node.agent === 'linting') &&\n node.result?.issues\n ) {\n count += node.result.issues.length;\n }\n if (node.children) {\n for (const child of node.children) {\n count += this.countIssuesFound(child);\n }\n }\n return count;\n }\n\n private countIssuesFixed(node: TaskNode): number {\n let count = 0;\n if (node.agent === 'improve' && node.result?.fixed) {\n count += node.result.fixed.length;\n }\n if (node.children) {\n for (const child of node.children) {\n count += this.countIssuesFixed(child);\n }\n }\n return count;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Recursive Language Model (RLM) Orchestrator for StackMemory\n *\n * Implements recursive task decomposition with parallel Claude API execution\n * Based on \"Recursive Language Models\" paper concepts\n *\n * Key Features:\n * - Parallel subagent execution via Claude API\n * - Automatic test generation and validation\n * - Multi-stage code review and improvement\n * - Large codebase processing through chunking\n * - Full operation transparency\n */\n\nimport { logger } from '../core/monitoring/logger.js';\nimport { FrameManager } from '../core/context/frame-manager.js';\nimport { DualStackManager } from '../core/context/dual-stack-manager.js';\nimport { ContextRetriever } from '../core/retrieval/context-retriever.js';\nimport { LinearTaskManager } from '../features/tasks/linear-task-manager.js';\nimport { ParallelExecutor } from '../core/execution/parallel-executor.js';\nimport { RecursiveContextManager } from '../core/context/recursive-context-manager.js';\nimport { ClaudeCodeSubagentClient } from '../integrations/claude-code/subagent-client.js';\n\n// Subagent types\nexport type SubagentType =\n | 'planning'\n | 'code'\n | 'testing'\n | 'linting'\n | 'review'\n | 'context'\n | 'publish'\n | 'improve';\n\n// Subagent configuration\nexport interface SubagentConfig {\n type: SubagentType;\n model:\n | 'claude-3-5-sonnet-latest'\n | 'claude-3-5-haiku-latest'\n | 'claude-3-opus-latest';\n maxTokens: number;\n temperature: number;\n systemPrompt: string;\n capabilities: string[];\n}\n\n// Task decomposition node\nexport interface TaskNode {\n id: string;\n type: 'task' | 'parallel' | 'sequential';\n description: string;\n agent: SubagentType;\n dependencies: string[];\n context: Record<string, unknown>;\n children?: TaskNode[];\n status: 'pending' | 'running' | 'completed' | 'failed';\n result?: unknown;\n error?: Error;\n attempts: number;\n startTime?: Date;\n endTime?: Date;\n tokens?: number;\n cost?: number;\n}\n\n// Execution result\nexport interface ExecutionResult {\n success: boolean;\n rootNode: TaskNode;\n totalTokens: number;\n totalCost: number;\n duration: number;\n improvements: string[];\n testsGenerated: number;\n issuesFound: number;\n issuesFixed: number;\n}\n\n// RLM Options\nexport interface RLMOptions {\n maxParallel?: number;\n maxRecursionDepth?: number;\n maxTokensPerAgent?: number;\n maxTotalCost?: number;\n timeoutPerAgent?: number;\n retryFailedAgents?: boolean;\n shareContextRealtime?: boolean;\n testGenerationMode?: 'unit' | 'integration' | 'e2e' | 'all';\n reviewStages?: number;\n qualityThreshold?: number;\n verboseLogging?: boolean;\n}\n\n/**\n * Main RLM Orchestrator\n */\nexport class RecursiveAgentOrchestrator {\n private frameManager: FrameManager;\n private contextRetriever: ContextRetriever;\n private taskStore: LinearTaskManager;\n private parallelExecutor: ParallelExecutor;\n private contextManager: RecursiveContextManager;\n private subagentClient: ClaudeCodeSubagentClient;\n\n // Subagent configurations\n private subagentConfigs: Map<SubagentType, SubagentConfig>;\n\n // Execution tracking\n private activeExecutions: Map<string, TaskNode> = new Map();\n private executionHistory: ExecutionResult[] = [];\n\n // Default options\n private defaultOptions: Required<RLMOptions> = {\n maxParallel: 5,\n maxRecursionDepth: 4,\n maxTokensPerAgent: 30000,\n maxTotalCost: 50.0, // Quality over cost\n timeoutPerAgent: 300,\n retryFailedAgents: true,\n shareContextRealtime: true,\n testGenerationMode: 'all',\n reviewStages: 3, // Multi-stage review\n qualityThreshold: 0.85,\n verboseLogging: true, // Full transparency\n };\n\n constructor(\n frameManager: FrameManager,\n dualStackManager: DualStackManager,\n contextRetriever: ContextRetriever,\n taskStore: LinearTaskManager\n ) {\n this.frameManager = frameManager;\n this.contextRetriever = contextRetriever;\n this.taskStore = taskStore;\n\n // Initialize components\n this.parallelExecutor = new ParallelExecutor(\n this.defaultOptions.maxParallel\n );\n this.contextManager = new RecursiveContextManager(\n dualStackManager,\n contextRetriever\n );\n this.subagentClient = new ClaudeCodeSubagentClient();\n\n // Initialize subagent configurations\n this.subagentConfigs = this.initializeSubagentConfigs();\n\n logger.info('RLM Orchestrator initialized', {\n maxParallel: this.defaultOptions.maxParallel,\n maxRecursion: this.defaultOptions.maxRecursionDepth,\n reviewStages: this.defaultOptions.reviewStages,\n });\n }\n\n /**\n * Initialize subagent configurations with specialized prompts\n */\n private initializeSubagentConfigs(): Map<SubagentType, SubagentConfig> {\n const configs = new Map<SubagentType, SubagentConfig>();\n\n // Planning Agent - Task decomposer\n configs.set('planning', {\n type: 'planning',\n model: 'claude-3-5-sonnet-latest',\n maxTokens: 20000,\n temperature: 0.3,\n systemPrompt: `You are a Planning Agent specializing in task decomposition.\n Analyze complex tasks and break them into parallel and sequential subtasks.\n Create detailed execution plans with clear dependencies.\n Consider edge cases and potential failures.\n Output structured task trees with agent assignments.`,\n capabilities: ['decompose', 'analyze', 'strategize', 'prioritize'],\n });\n\n // Code Agent - Implementation specialist\n configs.set('code', {\n type: 'code',\n model: 'claude-3-5-sonnet-latest',\n maxTokens: 30000,\n temperature: 0.2,\n systemPrompt: `You are a Code Agent specializing in implementation.\n Write clean, maintainable, production-ready code.\n Follow project conventions and best practices.\n Include comprehensive error handling.\n Document complex logic with clear comments.`,\n capabilities: ['implement', 'refactor', 'optimize', 'document'],\n });\n\n // Testing Agent - Test generation and validation\n configs.set('testing', {\n type: 'testing',\n model: 'claude-3-5-sonnet-latest', // High quality for test generation\n maxTokens: 25000,\n temperature: 0.1,\n systemPrompt: `You are a Testing Agent specializing in test generation and validation.\n Generate comprehensive test suites including:\n - Unit tests for all functions/methods\n - Integration tests for API endpoints\n - E2E tests for critical user flows\n - Edge cases and error scenarios\n Ensure 100% code coverage where possible.\n Validate that all tests pass and are meaningful.`,\n capabilities: [\n 'generate-tests',\n 'validate',\n 'coverage-analysis',\n 'test-execution',\n ],\n });\n\n // Linting Agent - Code quality enforcer\n configs.set('linting', {\n type: 'linting',\n model: 'claude-3-5-haiku-latest',\n maxTokens: 15000,\n temperature: 0,\n systemPrompt: `You are a Linting Agent specializing in code quality.\n Check for:\n - Syntax errors and type issues\n - Code formatting and style violations\n - Security vulnerabilities\n - Performance anti-patterns\n - Unused imports and dead code\n Provide actionable fixes for all issues found.`,\n capabilities: ['lint', 'format', 'type-check', 'security-scan'],\n });\n\n // Review Agent - Multi-stage code reviewer\n configs.set('review', {\n type: 'review',\n model: 'claude-3-5-sonnet-latest',\n maxTokens: 25000,\n temperature: 0.2,\n systemPrompt: `You are a Review Agent specializing in multi-stage code review.\n Perform thorough reviews focusing on:\n - Architecture and design patterns\n - Code quality and maintainability\n - Performance implications\n - Security considerations\n - Test coverage adequacy\n Suggest specific improvements with examples.\n Rate quality on a 0-1 scale.`,\n capabilities: [\n 'review',\n 'critique',\n 'suggest-improvements',\n 'quality-scoring',\n ],\n });\n\n // Improvement Agent - Code enhancer\n configs.set('improve', {\n type: 'improve',\n model: 'claude-3-5-sonnet-latest',\n maxTokens: 30000,\n temperature: 0.3,\n systemPrompt: `You are an Improvement Agent specializing in code enhancement.\n Take reviewed code and implement suggested improvements:\n - Refactor for better architecture\n - Optimize performance bottlenecks\n - Enhance error handling\n - Improve code clarity and documentation\n - Add missing test cases\n Ensure all improvements maintain backward compatibility.`,\n capabilities: ['enhance', 'refactor', 'optimize', 'polish'],\n });\n\n // Context Agent - Information retriever\n configs.set('context', {\n type: 'context',\n model: 'claude-3-5-haiku-latest',\n maxTokens: 10000,\n temperature: 0,\n systemPrompt: `You are a Context Agent specializing in information retrieval.\n Search and retrieve relevant context from:\n - Project codebase and documentation\n - Previous frame history\n - Similar implementations\n - Best practices and patterns\n Provide concise, relevant context for other agents.`,\n capabilities: ['search', 'retrieve', 'summarize', 'contextualize'],\n });\n\n // Publish Agent - Release and deployment\n configs.set('publish', {\n type: 'publish',\n model: 'claude-3-5-haiku-latest',\n maxTokens: 15000,\n temperature: 0,\n systemPrompt: `You are a Publish Agent specializing in release management.\n Handle:\n - NPM package publishing\n - GitHub releases and tagging\n - Documentation updates\n - Changelog generation\n - Deployment automation\n Ensure all release steps are properly sequenced.`,\n capabilities: ['publish-npm', 'github-release', 'deploy', 'document'],\n });\n\n return configs;\n }\n\n /**\n * Execute a task with recursive decomposition\n */\n async execute(\n task: string,\n context: Record<string, unknown>,\n options?: RLMOptions\n ): Promise<ExecutionResult> {\n const opts = { ...this.defaultOptions, ...options };\n const executionId = this.generateExecutionId();\n const startTime = Date.now();\n\n logger.info('Starting RLM execution', {\n executionId,\n task: task.slice(0, 100),\n options: opts,\n });\n\n try {\n // Create root frame for execution\n const rootFrameId = await this.createExecutionFrame(executionId, task);\n\n // Step 1: Planning - Decompose task into subtasks\n const rootNode = await this.planTask(task, context, opts);\n this.activeExecutions.set(executionId, rootNode);\n\n // Log execution tree for transparency\n if (opts.verboseLogging) {\n this.logExecutionTree(rootNode);\n }\n\n // Step 2: Execute task tree recursively with parallelization\n await this.executeTaskTree(rootNode, context, opts, 0);\n\n // Step 3: Multi-stage review and improvement\n const improvements = await this.performMultiStageReview(\n rootNode,\n opts.reviewStages,\n opts.qualityThreshold\n );\n\n // Step 4: Aggregate results\n const result: ExecutionResult = {\n success: rootNode.status === 'completed',\n rootNode,\n totalTokens: this.calculateTotalTokens(rootNode),\n totalCost: this.calculateTotalCost(rootNode),\n duration: Date.now() - startTime,\n improvements,\n testsGenerated: this.countGeneratedTests(rootNode),\n issuesFound: this.countIssuesFound(rootNode),\n issuesFixed: this.countIssuesFixed(rootNode),\n };\n\n // Store execution history\n this.executionHistory.push(result);\n\n // Update frame with results\n await this.updateExecutionFrame(rootFrameId, result);\n\n logger.info('RLM execution completed', {\n executionId,\n success: result.success,\n duration: result.duration,\n totalCost: result.totalCost,\n testsGenerated: result.testsGenerated,\n improvements: improvements.length,\n });\n\n return result;\n } catch (error) {\n logger.error('RLM execution failed', { executionId, error });\n throw error;\n } finally {\n this.activeExecutions.delete(executionId);\n }\n }\n\n /**\n * Plan task decomposition\n */\n private async planTask(\n task: string,\n context: Record<string, unknown>,\n options: Required<RLMOptions>\n ): Promise<TaskNode> {\n // Call planning agent using Claude Code Task tool\n const response = await this.subagentClient.executeSubagent({\n type: 'planning',\n task: task,\n context: {\n ...context,\n requirements: options,\n },\n });\n\n // Parse response into task tree\n const taskTree = this.parseTaskTree(JSON.stringify(response.result));\n\n // Add automatic test generation nodes\n this.injectTestGenerationNodes(taskTree, options.testGenerationMode);\n\n // Add review stages\n this.injectReviewStages(taskTree, options.reviewStages);\n\n return taskTree;\n }\n\n /**\n * Execute task tree recursively with parallelization\n */\n private async executeTaskTree(\n node: TaskNode,\n context: Record<string, unknown>,\n options: Required<RLMOptions>,\n depth: number\n ): Promise<void> {\n // Check recursion depth\n if (depth >= options.maxRecursionDepth) {\n logger.warn('Max recursion depth reached', { nodeId: node.id, depth });\n node.status = 'failed';\n node.error = new Error('Max recursion depth exceeded');\n return;\n }\n\n // Log execution start for transparency\n if (options.verboseLogging) {\n logger.info(`Executing node: ${node.description}`, {\n id: node.id,\n type: node.type,\n agent: node.agent,\n depth,\n });\n }\n\n node.status = 'running';\n node.startTime = new Date();\n\n try {\n if (node.type === 'parallel' && node.children) {\n // Execute children in parallel\n await this.parallelExecutor.executeParallel(\n node.children,\n async (child) => {\n await this.executeTaskTree(child, context, options, depth + 1);\n }\n );\n } else if (node.type === 'sequential' && node.children) {\n // Execute children sequentially\n for (const child of node.children) {\n await this.executeTaskTree(child, context, options, depth + 1);\n\n // Pass results to next child\n if (child.result) {\n context[`${child.id}_result`] = child.result;\n }\n }\n } else {\n // Leaf node - execute with appropriate agent\n await this.executeLeafNode(node, context, options);\n }\n\n node.status = 'completed';\n } catch (error) {\n logger.error(`Node execution failed: ${node.description}`, { error });\n\n if (options.retryFailedAgents && node.attempts < 3) {\n node.attempts++;\n logger.info(`Retrying node: ${node.description}`, {\n attempt: node.attempts,\n });\n await this.executeTaskTree(node, context, options, depth);\n } else {\n node.status = 'failed';\n node.error = error as Error;\n }\n } finally {\n node.endTime = new Date();\n\n // Log completion for transparency\n if (options.verboseLogging) {\n const duration =\n node.endTime.getTime() - (node.startTime?.getTime() ?? 0);\n logger.info(`Completed node: ${node.description}`, {\n id: node.id,\n status: node.status,\n duration,\n tokens: node.tokens,\n cost: node.cost,\n });\n }\n }\n }\n\n /**\n * Execute a leaf node with the appropriate agent\n */\n private async executeLeafNode(\n node: TaskNode,\n context: Record<string, unknown>,\n options: Required<RLMOptions>\n ): Promise<void> {\n const agentConfig = this.subagentConfigs.get(node.agent);\n if (!agentConfig) {\n throw new Error(`Unknown agent type: ${node.agent}`);\n }\n\n // Prepare agent-specific context\n const agentContext = await this.contextManager.prepareAgentContext(\n node.agent,\n context,\n options.maxTokensPerAgent\n );\n\n // Build task description for agent\n const taskDescription = this.buildAgentPrompt(node, agentContext);\n\n // Call agent via Claude Code Task tool\n const response = await this.subagentClient.executeSubagent({\n type: node.agent,\n task: taskDescription,\n context: agentContext,\n });\n\n // Process agent response\n node.result = response.result;\n node.tokens =\n response.tokens || this.estimateTokens(JSON.stringify(response));\n node.cost = this.calculateNodeCost(node.tokens, agentConfig.model);\n\n // Share results with other agents if real-time sharing is enabled\n if (options.shareContextRealtime) {\n await this.shareAgentResults(node);\n }\n }\n\n /**\n * Perform multi-stage review and improvement\n */\n private async performMultiStageReview(\n rootNode: TaskNode,\n stages: number,\n qualityThreshold: number\n ): Promise<string[]> {\n const improvements: string[] = [];\n let currentQuality = 0;\n\n for (let stage = 1; stage <= stages; stage++) {\n logger.info(`Starting review stage ${stage}/${stages}`);\n\n // Review stage\n const reviewNode: TaskNode = {\n id: `review-stage-${stage}`,\n type: 'task',\n description: `Review stage ${stage}`,\n agent: 'review',\n dependencies: [],\n context: { rootNode, stage },\n status: 'pending',\n attempts: 0,\n };\n\n // Execute review via Claude Code subagent\n const reviewResponse = await this.subagentClient.executeSubagent({\n type: 'review',\n task: `Review stage ${stage}: Analyze code quality and suggest improvements`,\n context: { rootNode, stage },\n });\n\n reviewNode.result = reviewResponse.result;\n reviewNode.status = reviewResponse.success ? 'completed' : 'failed';\n\n const reviewResult = reviewResponse.result as {\n quality: number;\n issues: string[];\n suggestions: string[];\n };\n\n currentQuality = reviewResult.quality || 0.5; // Default quality if missing\n\n // Safely handle suggestions array\n if (reviewResult.suggestions && Array.isArray(reviewResult.suggestions)) {\n improvements.push(...reviewResult.suggestions);\n } else {\n // Fallback for mock/test results\n improvements.push(\n `Stage ${stage}: Review completed with quality ${currentQuality}`\n );\n }\n\n logger.info(`Review stage ${stage} complete`, {\n quality: currentQuality,\n issues: reviewResult.issues?.length || 0,\n suggestions: reviewResult.suggestions?.length || 0,\n });\n\n // If quality meets threshold, stop\n if (currentQuality >= qualityThreshold) {\n logger.info(\n `Quality threshold met: ${currentQuality} >= ${qualityThreshold}`\n );\n break;\n }\n\n // Improvement stage\n if (stage < stages) {\n const improveNode: TaskNode = {\n id: `improve-stage-${stage}`,\n type: 'task',\n description: `Improvement stage ${stage}`,\n agent: 'improve',\n dependencies: [reviewNode.id],\n context: { reviewResult, rootNode },\n status: 'pending',\n attempts: 0,\n };\n\n // Execute improvement via Claude Code subagent\n const improveResponse = await this.subagentClient.executeSubagent({\n type: 'improve',\n task: `Improvement stage ${stage}: Implement suggested improvements`,\n context: { reviewResult, rootNode },\n });\n\n improveNode.result = improveResponse.result;\n improveNode.status = improveResponse.success ? 'completed' : 'failed';\n\n // Apply improvements to root node\n this.applyImprovements(rootNode, improveNode.result);\n }\n }\n\n return improvements;\n }\n\n /**\n * Helper methods\n */\n\n private generateExecutionId(): string {\n return `rlm-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n private async createExecutionFrame(\n executionId: string,\n task: string\n ): Promise<string> {\n return this.frameManager.createFrame({\n name: `RLM: ${task.slice(0, 50)}`,\n type: 'task',\n inputs: { executionId, task, type: 'rlm-execution' },\n });\n }\n\n private async updateExecutionFrame(\n frameId: string,\n result: ExecutionResult\n ): Promise<void> {\n // Close the frame with the execution result\n this.frameManager.closeFrame(frameId, {\n type: 'rlm-result',\n content: JSON.stringify(result, null, 2),\n success: result.success,\n duration: result.duration,\n totalTokens: result.totalTokens,\n totalCost: result.totalCost,\n });\n }\n\n private logExecutionTree(node: TaskNode, depth: number = 0): void {\n const indent = ' '.repeat(depth);\n const status =\n node.status === 'completed'\n ? '\u2713'\n : node.status === 'failed'\n ? '\u2717'\n : node.status === 'running'\n ? '\u27F3'\n : '\u25CB';\n\n console.log(`${indent}${status} ${node.description} [${node.agent}]`);\n\n if (node.children) {\n for (const child of node.children) {\n this.logExecutionTree(child, depth + 1);\n }\n }\n }\n\n private parseTaskTree(_response: string): TaskNode {\n // Parse LLM response into structured task tree\n // This would need sophisticated parsing logic\n // For now, return a mock structure\n return {\n id: 'root',\n type: 'sequential',\n description: 'Root task',\n agent: 'planning',\n dependencies: [],\n context: {},\n status: 'pending',\n attempts: 0,\n children: [],\n };\n }\n\n private injectTestGenerationNodes(node: TaskNode, _mode: string): void {\n // Inject test generation nodes based on mode\n // Initialize children array if it doesn't exist\n if (!node.children) {\n node.children = [];\n }\n\n const testNode: TaskNode = {\n id: `${node.id}-test`,\n type: 'task',\n description: `Generate ${_mode} tests for ${node.description}`,\n agent: 'testing',\n dependencies: [node.id],\n context: { testMode: _mode },\n status: 'pending',\n attempts: 0,\n };\n\n node.children.push(testNode);\n }\n\n private injectReviewStages(_node: TaskNode, _stages: number): void {\n // Inject review stages into task tree\n // Implementation would add review nodes at appropriate points\n }\n\n private buildAgentPrompt(\n node: TaskNode,\n context: Record<string, unknown>\n ): string {\n return `\n Task: ${node.description}\n \n Context:\n ${JSON.stringify(context, null, 2)}\n \n Previous Results:\n ${JSON.stringify(\n node.dependencies.map((id) => this.activeExecutions.get(id)?.result),\n null,\n 2\n )}\n \n Please complete this task following your specialized role.\n `;\n }\n\n private estimateTokens(text: string): number {\n // Rough estimation: 1 token \u2248 4 characters\n return Math.ceil(text.length / 4);\n }\n\n private async shareAgentResults(_node: TaskNode): Promise<void> {\n // Share results with other agents via Redis or shared context\n logger.debug('Sharing agent results', { nodeId: _node.id });\n }\n\n private applyImprovements(_rootNode: TaskNode, improvements: unknown): void {\n // Apply improvements to the task tree\n logger.debug('Applying improvements', { improvements });\n }\n\n private calculateTotalTokens(node: TaskNode): number {\n let total = node.tokens || 0;\n if (node.children) {\n for (const child of node.children) {\n total += this.calculateTotalTokens(child);\n }\n }\n return total;\n }\n\n private calculateTotalCost(node: TaskNode): number {\n let total = node.cost || 0;\n if (node.children) {\n for (const child of node.children) {\n total += this.calculateTotalCost(child);\n }\n }\n return total;\n }\n\n private calculateNodeCost(tokens: number, model: string): number {\n // Pricing per 1M tokens (approximate)\n const pricing: Record<string, number> = {\n 'claude-3-5-sonnet-latest': 15.0,\n 'claude-3-5-haiku-latest': 1.0,\n 'claude-3-opus-latest': 75.0,\n };\n return (tokens / 1000000) * (pricing[model] || 10);\n }\n\n private countGeneratedTests(node: TaskNode): number {\n let count = 0;\n if (node.agent === 'testing' && node.result?.tests) {\n count += node.result.tests.length;\n }\n if (node.children) {\n for (const child of node.children) {\n count += this.countGeneratedTests(child);\n }\n }\n return count;\n }\n\n private countIssuesFound(node: TaskNode): number {\n let count = 0;\n if (\n (node.agent === 'review' || node.agent === 'linting') &&\n node.result?.issues\n ) {\n count += node.result.issues.length;\n }\n if (node.children) {\n for (const child of node.children) {\n count += this.countIssuesFound(child);\n }\n }\n return count;\n }\n\n private countIssuesFixed(node: TaskNode): number {\n let count = 0;\n if (node.agent === 'improve' && node.result?.fixed) {\n count += node.result.fixed.length;\n }\n if (node.children) {\n for (const child of node.children) {\n count += this.countIssuesFixed(child);\n }\n }\n return count;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }