@stackmemoryai/stackmemory 0.8.0 → 1.0.0

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 (793) hide show
  1. package/LICENSE +64 -0
  2. package/README.md +54 -4
  3. package/dist/src/agents/core/agent-task-manager.js +0 -1
  4. package/dist/src/agents/verifiers/base-verifier.js +0 -1
  5. package/dist/src/agents/verifiers/formatter-verifier.js +0 -1
  6. package/dist/src/agents/verifiers/llm-judge.js +0 -1
  7. package/dist/src/cli/auto-detect.js +0 -1
  8. package/dist/src/cli/claude-sm-danger.js +0 -1
  9. package/dist/src/cli/claude-sm.js +69 -373
  10. package/dist/src/cli/codex-sm-danger.js +0 -1
  11. package/dist/src/cli/codex-sm.js +28 -1
  12. package/dist/src/cli/commands/api.js +0 -1
  13. package/dist/src/cli/commands/auto-background.js +0 -1
  14. package/dist/src/cli/commands/cleanup-processes.js +0 -1
  15. package/dist/src/cli/commands/clear.js +0 -1
  16. package/dist/src/cli/commands/config.js +0 -1
  17. package/dist/src/cli/commands/context-rehydrate.js +0 -1
  18. package/dist/src/cli/commands/context.js +0 -1
  19. package/dist/src/cli/commands/daemon.js +0 -1
  20. package/dist/src/cli/commands/dashboard.js +4 -5
  21. package/dist/src/cli/commands/db.js +0 -1
  22. package/dist/src/cli/commands/decision.js +0 -1
  23. package/dist/src/cli/commands/discovery.js +0 -1
  24. package/dist/src/cli/commands/handoff.js +0 -1
  25. package/dist/src/cli/commands/hooks.js +0 -1
  26. package/dist/src/cli/commands/linear.js +0 -1
  27. package/dist/src/cli/commands/log.js +0 -1
  28. package/dist/src/cli/commands/login.js +0 -1
  29. package/dist/src/cli/commands/migrate.js +0 -1
  30. package/dist/src/cli/commands/model.js +0 -1
  31. package/dist/src/cli/commands/onboard.js +22 -7
  32. package/dist/src/cli/commands/ping.js +0 -1
  33. package/dist/src/cli/commands/projects.js +0 -1
  34. package/dist/src/cli/commands/ralph.js +0 -1
  35. package/dist/src/cli/commands/retrieval.js +0 -1
  36. package/dist/src/cli/commands/search.js +0 -1
  37. package/dist/src/cli/commands/service.js +0 -1
  38. package/dist/src/cli/commands/session.js +0 -1
  39. package/dist/src/cli/commands/setup.js +1 -6
  40. package/dist/src/cli/commands/shell.js +0 -1
  41. package/dist/src/cli/commands/signup.js +0 -1
  42. package/dist/src/cli/commands/skills.js +4 -3
  43. package/dist/src/cli/commands/storage-tier.js +0 -1
  44. package/dist/src/cli/commands/sweep.js +0 -1
  45. package/dist/src/cli/commands/tasks.js +0 -1
  46. package/dist/src/cli/commands/worktree.js +10 -5
  47. package/dist/src/cli/index.js +9 -76
  48. package/dist/src/cli/opencode-sm.js +28 -1
  49. package/dist/src/cli/utils/viewer.js +0 -1
  50. package/dist/src/core/config/config-manager.js +0 -1
  51. package/dist/src/core/config/feature-flags.js +1 -14
  52. package/dist/src/core/config/storage-config.js +0 -1
  53. package/dist/src/core/config/types.js +0 -1
  54. package/dist/src/core/context/auto-context.js +0 -1
  55. package/dist/src/core/context/dual-stack-manager.js +0 -1
  56. package/dist/src/core/context/enhanced-rehydration.js +0 -2
  57. package/dist/src/core/context/frame-database.js +60 -6
  58. package/dist/src/core/context/frame-digest.js +0 -1
  59. package/dist/src/core/context/frame-handoff-manager.js +0 -1
  60. package/dist/src/core/context/frame-lifecycle-hooks.js +0 -1
  61. package/dist/src/core/context/frame-recovery.js +0 -1
  62. package/dist/src/core/context/frame-stack.js +0 -1
  63. package/dist/src/core/context/frame-types.js +0 -1
  64. package/dist/src/core/context/index.js +0 -1
  65. package/dist/src/core/context/permission-manager.js +0 -1
  66. package/dist/src/core/context/recursive-context-manager.js +3 -2
  67. package/dist/src/core/context/refactored-frame-manager.js +0 -1
  68. package/dist/src/core/context/shared-context-layer.js +0 -1
  69. package/dist/src/core/context/stack-merge-resolver.js +0 -1
  70. package/dist/src/core/context/validation.js +0 -1
  71. package/dist/src/core/database/batch-operations.js +0 -1
  72. package/dist/src/core/database/connection-pool.js +0 -1
  73. package/dist/src/core/database/database-adapter.js +0 -1
  74. package/dist/src/core/database/embedding-provider-factory.js +0 -1
  75. package/dist/src/core/database/embedding-provider.js +0 -1
  76. package/dist/src/core/database/migration-manager.js +0 -1
  77. package/dist/src/core/database/ollama-embedding-provider.js +0 -1
  78. package/dist/src/core/database/openai-embedding-provider.js +0 -1
  79. package/dist/src/core/database/query-cache.js +0 -1
  80. package/dist/src/core/database/query-router.js +0 -1
  81. package/dist/src/core/database/sqlite-adapter.js +18 -108
  82. package/dist/src/core/database/transformers-embedding-provider.js +0 -1
  83. package/dist/src/core/digest/enhanced-hybrid-digest.js +0 -1
  84. package/dist/src/core/digest/frame-digest-integration.js +0 -1
  85. package/dist/src/core/digest/hybrid-digest-generator.js +0 -1
  86. package/dist/src/core/digest/index.js +0 -1
  87. package/dist/src/core/digest/types.js +0 -1
  88. package/dist/src/core/errors/error-utils.js +0 -1
  89. package/dist/src/core/errors/index.js +0 -1
  90. package/dist/src/core/errors/recovery.js +0 -1
  91. package/dist/src/core/execution/parallel-executor.js +0 -1
  92. package/dist/src/core/extensions/custom-tools.js +0 -1
  93. package/dist/src/core/extensions/index.js +0 -1
  94. package/dist/src/core/extensions/loader.js +0 -1
  95. package/dist/src/core/extensions/plugin-system.js +0 -1
  96. package/dist/src/core/extensions/provider-adapter.js +0 -1
  97. package/dist/src/core/extensions/sandbox-runtime.js +0 -1
  98. package/dist/src/core/extensions/types.js +0 -1
  99. package/dist/src/core/frame/workflow-templates.js +0 -1
  100. package/dist/src/core/merge/conflict-detector.js +0 -1
  101. package/dist/src/core/merge/index.js +0 -1
  102. package/dist/src/core/merge/resolution-engine.js +0 -1
  103. package/dist/src/core/merge/stack-diff.js +0 -1
  104. package/dist/src/core/merge/types.js +0 -1
  105. package/dist/src/core/merge/unified-merge-resolver.js +0 -1
  106. package/dist/src/core/models/fallback-monitor.js +0 -1
  107. package/dist/src/core/models/model-router.js +0 -1
  108. package/dist/src/core/monitoring/error-handler.js +0 -1
  109. package/dist/src/core/monitoring/logger.js +0 -1
  110. package/dist/src/core/monitoring/metrics.js +0 -1
  111. package/dist/src/core/monitoring/progress-tracker.js +0 -1
  112. package/dist/src/core/monitoring/session-monitor.js +0 -1
  113. package/dist/src/core/performance/context-cache.js +0 -1
  114. package/dist/src/core/performance/index.js +0 -1
  115. package/dist/src/core/performance/lazy-context-loader.js +3 -8
  116. package/dist/src/core/performance/monitor.js +0 -1
  117. package/dist/src/core/performance/optimized-frame-context.js +0 -1
  118. package/dist/src/core/performance/performance-benchmark.js +0 -1
  119. package/dist/src/core/performance/performance-profiler.js +0 -1
  120. package/dist/src/core/performance/streaming-jsonl-parser.js +0 -1
  121. package/dist/src/core/persistence/postgres-adapter.js +0 -1
  122. package/dist/src/core/projects/project-isolation.js +0 -1
  123. package/dist/src/core/projects/project-manager.js +0 -1
  124. package/dist/src/core/query/query-parser.js +0 -1
  125. package/dist/src/core/query/query-templates.js +0 -1
  126. package/dist/src/core/retrieval/context-retriever.js +0 -1
  127. package/dist/src/core/retrieval/index.js +0 -1
  128. package/dist/src/core/retrieval/llm-context-retrieval.js +0 -1
  129. package/dist/src/core/retrieval/llm-provider.js +0 -1
  130. package/dist/src/core/retrieval/privacy-filter.js +0 -1
  131. package/dist/src/core/retrieval/retrieval-audit.js +0 -1
  132. package/dist/src/core/retrieval/summary-generator.js +15 -6
  133. package/dist/src/core/retrieval/types.js +0 -1
  134. package/dist/src/core/retrieval/unified-context-assembler.js +0 -1
  135. package/dist/src/core/security/index.js +0 -1
  136. package/dist/src/core/security/input-sanitizer.js +0 -1
  137. package/dist/src/core/session/clear-survival.js +0 -1
  138. package/dist/src/core/session/enhanced-handoff.js +0 -1
  139. package/dist/src/core/session/handoff-generator.js +0 -1
  140. package/dist/src/core/session/index.js +0 -1
  141. package/dist/src/core/session/session-manager.js +0 -1
  142. package/dist/src/core/skills/index.js +0 -1
  143. package/dist/src/core/skills/skill-storage.js +0 -1
  144. package/dist/src/core/skills/types.js +0 -1
  145. package/dist/src/core/storage/chromadb-adapter.js +0 -1
  146. package/dist/src/core/storage/infinite-storage.js +0 -1
  147. package/dist/src/core/storage/project-registry.js +0 -1
  148. package/dist/src/core/storage/remote-storage.js +4 -2
  149. package/dist/src/core/storage/storage-tier-manager.js +0 -1
  150. package/dist/src/core/storage/two-tier-storage.js +0 -1
  151. package/dist/src/core/trace/cli-trace-wrapper.js +0 -1
  152. package/dist/src/core/trace/db-trace-wrapper.js +0 -1
  153. package/dist/src/core/trace/debug-trace.js +0 -1
  154. package/dist/src/core/trace/index.js +0 -1
  155. package/dist/src/core/trace/linear-api-wrapper.js +0 -1
  156. package/dist/src/core/trace/trace-detector.js +0 -1
  157. package/dist/src/core/trace/trace-store.js +4 -5
  158. package/dist/src/core/trace/types.js +0 -1
  159. package/dist/src/core/types.js +0 -1
  160. package/dist/src/core/utils/async-mutex.js +0 -1
  161. package/dist/src/core/utils/compression.js +0 -1
  162. package/dist/src/core/utils/update-checker.js +0 -1
  163. package/dist/src/core/worktree/worktree-manager.js +0 -1
  164. package/dist/src/daemon/daemon-config.js +0 -1
  165. package/dist/src/daemon/services/context-service.js +0 -1
  166. package/dist/src/daemon/services/linear-service.js +0 -1
  167. package/dist/src/daemon/services/maintenance-service.js +0 -1
  168. package/dist/src/daemon/services/memory-service.js +0 -1
  169. package/dist/src/daemon/session-daemon.js +0 -1
  170. package/dist/src/daemon/unified-daemon.js +0 -1
  171. package/dist/src/features/analytics/api/analytics-api.js +0 -1
  172. package/dist/src/features/analytics/core/analytics-service.js +1 -2
  173. package/dist/src/features/analytics/index.js +0 -1
  174. package/dist/src/features/analytics/queries/metrics-queries.js +8 -9
  175. package/dist/src/features/analytics/types/metrics.js +0 -1
  176. package/dist/src/features/browser/browser-mcp.js +0 -1
  177. package/dist/src/features/sweep/index.js +0 -1
  178. package/dist/src/features/sweep/prediction-client.js +0 -1
  179. package/dist/src/features/sweep/prompt-builder.js +0 -1
  180. package/dist/src/features/sweep/pty-wrapper.js +11 -2
  181. package/dist/src/features/sweep/state-watcher.js +0 -1
  182. package/dist/src/features/sweep/status-bar.js +0 -1
  183. package/dist/src/features/sweep/sweep-server-manager.js +0 -1
  184. package/dist/src/features/sweep/tab-interceptor.js +0 -1
  185. package/dist/src/features/sweep/types.js +0 -1
  186. package/dist/src/features/tasks/linear-task-manager.js +0 -1
  187. package/dist/src/features/tasks/task-aware-context.js +0 -1
  188. package/dist/src/features/tui/simple-monitor.js +0 -1
  189. package/dist/src/features/tui/swarm-monitor.js +0 -1
  190. package/dist/src/features/web/client/stores/task-store.js +0 -1
  191. package/dist/src/features/web/server/index.js +0 -1
  192. package/dist/src/features/workers/tmux-manager.js +0 -1
  193. package/dist/src/features/workers/worker-registry.js +0 -1
  194. package/dist/src/hooks/auto-background.js +0 -1
  195. package/dist/src/hooks/config.js +0 -1
  196. package/dist/src/hooks/daemon.js +0 -1
  197. package/dist/src/hooks/diffmem-hooks.js +0 -1
  198. package/dist/src/hooks/events.js +0 -1
  199. package/dist/src/hooks/index.js +0 -4
  200. package/dist/src/hooks/linear-task-picker.js +0 -1
  201. package/dist/src/hooks/schemas.js +0 -118
  202. package/dist/src/hooks/secure-fs.js +0 -1
  203. package/dist/src/hooks/security-logger.js +0 -1
  204. package/dist/src/hooks/session-summary.js +0 -1
  205. package/dist/src/index.js +0 -1
  206. package/dist/src/integrations/anthropic/client.js +0 -1
  207. package/dist/src/integrations/claude-code/agent-bridge.js +0 -1
  208. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js +0 -1
  209. package/dist/src/integrations/claude-code/lifecycle-hooks.js +0 -1
  210. package/dist/src/integrations/claude-code/post-task-hooks.js +0 -1
  211. package/dist/src/integrations/claude-code/subagent-client-stub.js +0 -1
  212. package/dist/src/integrations/claude-code/subagent-client.js +0 -1
  213. package/dist/src/integrations/claude-code/task-coordinator.js +0 -1
  214. package/dist/src/integrations/diffmem/client.js +0 -1
  215. package/dist/src/integrations/diffmem/config.js +0 -1
  216. package/dist/src/integrations/diffmem/index.js +0 -1
  217. package/dist/src/integrations/diffmem/types.js +0 -1
  218. package/dist/src/integrations/linear/auth.js +0 -1
  219. package/dist/src/integrations/linear/auto-sync.js +0 -1
  220. package/dist/src/integrations/linear/client.js +0 -1
  221. package/dist/src/integrations/linear/config.js +0 -1
  222. package/dist/src/integrations/linear/migration.js +0 -1
  223. package/dist/src/integrations/linear/oauth-server.js +0 -1
  224. package/dist/src/integrations/linear/rest-client.js +0 -1
  225. package/dist/src/integrations/linear/sync-manager.js +0 -1
  226. package/dist/src/integrations/linear/sync-service.js +0 -1
  227. package/dist/src/integrations/linear/sync.js +0 -1
  228. package/dist/src/integrations/linear/types.js +0 -1
  229. package/dist/src/integrations/linear/unified-sync.js +0 -1
  230. package/dist/src/integrations/linear/webhook-handler.js +0 -1
  231. package/dist/src/integrations/linear/webhook-server.js +0 -1
  232. package/dist/src/integrations/linear/webhook.js +0 -1
  233. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js +0 -1
  234. package/dist/src/integrations/mcp/handlers/context-handlers.js +43 -30
  235. package/dist/src/integrations/mcp/handlers/diffmem-handlers.js +0 -1
  236. package/dist/src/integrations/mcp/handlers/discovery-handlers.js +0 -1
  237. package/dist/src/integrations/mcp/handlers/index.js +1 -3
  238. package/dist/src/integrations/mcp/handlers/linear-handlers.js +24 -61
  239. package/dist/src/integrations/mcp/handlers/skill-handlers.js +0 -1
  240. package/dist/src/integrations/mcp/handlers/task-handlers.js +0 -1
  241. package/dist/src/integrations/mcp/handlers/trace-handlers.js +0 -1
  242. package/dist/src/integrations/mcp/index.js +0 -1
  243. package/dist/src/integrations/mcp/middleware/tool-scoring.js +3 -2
  244. package/dist/src/integrations/mcp/pending-utils.js +0 -1
  245. package/dist/src/integrations/mcp/refactored-server.js +0 -1
  246. package/dist/src/integrations/mcp/remote-server.js +0 -1
  247. package/dist/src/integrations/mcp/schemas.js +0 -1
  248. package/dist/src/integrations/mcp/server.js +20 -24
  249. package/dist/src/integrations/mcp/tool-definitions-code.js +0 -1
  250. package/dist/src/integrations/mcp/tool-definitions.js +0 -1
  251. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -1
  252. package/dist/src/integrations/ralph/context/context-budget-manager.js +0 -1
  253. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +0 -1
  254. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js +0 -1
  255. package/dist/src/integrations/ralph/index.js +0 -1
  256. package/dist/src/integrations/ralph/learning/pattern-learner.js +0 -1
  257. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +5 -5
  258. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +0 -1
  259. package/dist/src/integrations/ralph/monitoring/swarm-registry.js +0 -1
  260. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -1
  261. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -1
  262. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +0 -1
  263. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +0 -1
  264. package/dist/src/integrations/ralph/performance/performance-optimizer.js +0 -1
  265. package/dist/src/integrations/ralph/recovery/crash-recovery.js +0 -1
  266. package/dist/src/integrations/ralph/state/state-reconciler.js +25 -9
  267. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +0 -1
  268. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +0 -1
  269. package/dist/src/integrations/ralph/types.js +0 -1
  270. package/dist/src/integrations/ralph/visualization/ralph-debugger.js +0 -1
  271. package/dist/src/mcp/stackmemory-mcp-server.js +0 -1
  272. package/dist/src/middleware/exponential-rate-limiter.js +0 -1
  273. package/dist/src/models/user.model.js +0 -1
  274. package/dist/src/orchestrators/multimodal/constants.js +0 -1
  275. package/dist/src/orchestrators/multimodal/harness.js +0 -1
  276. package/dist/src/orchestrators/multimodal/providers.js +0 -1
  277. package/dist/src/orchestrators/multimodal/types.js +0 -1
  278. package/dist/src/orchestrators/multimodal/utils.js +0 -1
  279. package/dist/src/servers/production/auth-middleware.js +0 -1
  280. package/dist/src/services/config-service.js +0 -1
  281. package/dist/src/services/context-service.js +0 -1
  282. package/dist/src/skills/api-discovery.js +0 -1
  283. package/dist/src/skills/api-skill.js +0 -1
  284. package/dist/src/skills/claude-skills.js +0 -1
  285. package/dist/src/skills/dashboard-launcher.js +0 -1
  286. package/dist/src/skills/linear-task-runner.js +0 -1
  287. package/dist/src/skills/recursive-agent-orchestrator.js +0 -1
  288. package/dist/src/skills/repo-ingestion-skill.js +0 -1
  289. package/dist/src/skills/spec-generator-skill.js +0 -1
  290. package/dist/src/skills/unified-rlm-orchestrator.js +0 -1
  291. package/dist/src/types/task.js +0 -1
  292. package/dist/src/utils/env.js +0 -1
  293. package/dist/src/utils/formatting.js +0 -1
  294. package/dist/src/utils/process-cleanup.js +0 -1
  295. package/package.json +33 -8
  296. package/scripts/smoke-init-db.sh +77 -0
  297. package/dist/scripts/benchmark-performance.js +0 -48
  298. package/dist/scripts/benchmark-performance.js.map +0 -7
  299. package/dist/scripts/check-redis.js +0 -42
  300. package/dist/scripts/check-redis.js.map +0 -7
  301. package/dist/scripts/initialize.js +0 -183
  302. package/dist/scripts/initialize.js.map +0 -7
  303. package/dist/scripts/list-linear-tasks.js +0 -124
  304. package/dist/scripts/list-linear-tasks.js.map +0 -7
  305. package/dist/scripts/measure-handoff-impact.js +0 -340
  306. package/dist/scripts/measure-handoff-impact.js.map +0 -7
  307. package/dist/scripts/query-chromadb.js +0 -160
  308. package/dist/scripts/query-chromadb.js.map +0 -7
  309. package/dist/scripts/show-linear-summary.js +0 -119
  310. package/dist/scripts/show-linear-summary.js.map +0 -7
  311. package/dist/scripts/simple-swarm-demo.js +0 -90
  312. package/dist/scripts/simple-swarm-demo.js.map +0 -7
  313. package/dist/scripts/status.js +0 -155
  314. package/dist/scripts/status.js.map +0 -7
  315. package/dist/scripts/test-chromadb-sync.js +0 -192
  316. package/dist/scripts/test-chromadb-sync.js.map +0 -7
  317. package/dist/scripts/test-ralph-iteration-fix.js +0 -86
  318. package/dist/scripts/test-ralph-iteration-fix.js.map +0 -7
  319. package/dist/scripts/test-ralph-iterations.js +0 -121
  320. package/dist/scripts/test-ralph-iterations.js.map +0 -7
  321. package/dist/scripts/test-redis-storage.js +0 -389
  322. package/dist/scripts/test-redis-storage.js.map +0 -7
  323. package/dist/scripts/test-simple-ralph-state-sync.js +0 -115
  324. package/dist/scripts/test-simple-ralph-state-sync.js.map +0 -7
  325. package/dist/scripts/test-swarm-fixes.js +0 -125
  326. package/dist/scripts/test-swarm-fixes.js.map +0 -7
  327. package/dist/scripts/test-swarm-tui.js +0 -23
  328. package/dist/scripts/test-swarm-tui.js.map +0 -7
  329. package/dist/scripts/test-tui-shortcuts.js +0 -52
  330. package/dist/scripts/test-tui-shortcuts.js.map +0 -7
  331. package/dist/scripts/validate-tui-shortcuts.js +0 -60
  332. package/dist/scripts/validate-tui-shortcuts.js.map +0 -7
  333. package/dist/src/agents/core/agent-task-manager.js.map +0 -7
  334. package/dist/src/agents/verifiers/base-verifier.js.map +0 -7
  335. package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -7
  336. package/dist/src/agents/verifiers/llm-judge.js.map +0 -7
  337. package/dist/src/cli/auto-detect.js.map +0 -7
  338. package/dist/src/cli/claude-sm-danger.js.map +0 -7
  339. package/dist/src/cli/claude-sm.js.map +0 -7
  340. package/dist/src/cli/codex-sm-danger.js.map +0 -7
  341. package/dist/src/cli/codex-sm.js.map +0 -7
  342. package/dist/src/cli/commands/api.js.map +0 -7
  343. package/dist/src/cli/commands/auto-background.js.map +0 -7
  344. package/dist/src/cli/commands/cleanup-processes.js.map +0 -7
  345. package/dist/src/cli/commands/clear.js.map +0 -7
  346. package/dist/src/cli/commands/config.js.map +0 -7
  347. package/dist/src/cli/commands/context-rehydrate.js.map +0 -7
  348. package/dist/src/cli/commands/context.js.map +0 -7
  349. package/dist/src/cli/commands/daemon.js.map +0 -7
  350. package/dist/src/cli/commands/dashboard.js.map +0 -7
  351. package/dist/src/cli/commands/db.js.map +0 -7
  352. package/dist/src/cli/commands/decision.js.map +0 -7
  353. package/dist/src/cli/commands/discovery.js.map +0 -7
  354. package/dist/src/cli/commands/handoff.js.map +0 -7
  355. package/dist/src/cli/commands/hooks.js.map +0 -7
  356. package/dist/src/cli/commands/linear.js.map +0 -7
  357. package/dist/src/cli/commands/log.js.map +0 -7
  358. package/dist/src/cli/commands/login.js.map +0 -7
  359. package/dist/src/cli/commands/migrate.js.map +0 -7
  360. package/dist/src/cli/commands/model.js.map +0 -7
  361. package/dist/src/cli/commands/onboard.js.map +0 -7
  362. package/dist/src/cli/commands/ping.js.map +0 -7
  363. package/dist/src/cli/commands/projects.js.map +0 -7
  364. package/dist/src/cli/commands/ralph.js.map +0 -7
  365. package/dist/src/cli/commands/retrieval.js.map +0 -7
  366. package/dist/src/cli/commands/search.js.map +0 -7
  367. package/dist/src/cli/commands/service.js.map +0 -7
  368. package/dist/src/cli/commands/session.js.map +0 -7
  369. package/dist/src/cli/commands/settings.js +0 -306
  370. package/dist/src/cli/commands/settings.js.map +0 -7
  371. package/dist/src/cli/commands/setup.js.map +0 -7
  372. package/dist/src/cli/commands/shell.js.map +0 -7
  373. package/dist/src/cli/commands/signup.js.map +0 -7
  374. package/dist/src/cli/commands/skills.js.map +0 -7
  375. package/dist/src/cli/commands/sms-notify.js +0 -795
  376. package/dist/src/cli/commands/sms-notify.js.map +0 -7
  377. package/dist/src/cli/commands/storage-tier.js.map +0 -7
  378. package/dist/src/cli/commands/sweep.js.map +0 -7
  379. package/dist/src/cli/commands/tasks.js.map +0 -7
  380. package/dist/src/cli/commands/worktree.js.map +0 -7
  381. package/dist/src/cli/index.js.map +0 -7
  382. package/dist/src/cli/opencode-sm.js.map +0 -7
  383. package/dist/src/cli/utils/viewer.js.map +0 -7
  384. package/dist/src/core/config/config-manager.js.map +0 -7
  385. package/dist/src/core/config/feature-flags.js.map +0 -7
  386. package/dist/src/core/config/storage-config.js.map +0 -7
  387. package/dist/src/core/config/types.js.map +0 -7
  388. package/dist/src/core/context/auto-context.js.map +0 -7
  389. package/dist/src/core/context/dual-stack-manager.js.map +0 -7
  390. package/dist/src/core/context/enhanced-rehydration.js.map +0 -7
  391. package/dist/src/core/context/frame-database.js.map +0 -7
  392. package/dist/src/core/context/frame-digest.js.map +0 -7
  393. package/dist/src/core/context/frame-handoff-manager.js.map +0 -7
  394. package/dist/src/core/context/frame-lifecycle-hooks.js.map +0 -7
  395. package/dist/src/core/context/frame-recovery.js.map +0 -7
  396. package/dist/src/core/context/frame-stack.js.map +0 -7
  397. package/dist/src/core/context/frame-types.js.map +0 -7
  398. package/dist/src/core/context/index.js.map +0 -7
  399. package/dist/src/core/context/permission-manager.js.map +0 -7
  400. package/dist/src/core/context/recursive-context-manager.js.map +0 -7
  401. package/dist/src/core/context/refactored-frame-manager.js.map +0 -7
  402. package/dist/src/core/context/shared-context-layer.js.map +0 -7
  403. package/dist/src/core/context/stack-merge-resolver.js.map +0 -7
  404. package/dist/src/core/context/validation.js.map +0 -7
  405. package/dist/src/core/database/batch-operations.js.map +0 -7
  406. package/dist/src/core/database/connection-pool.js.map +0 -7
  407. package/dist/src/core/database/database-adapter.js.map +0 -7
  408. package/dist/src/core/database/embedding-provider-factory.js.map +0 -7
  409. package/dist/src/core/database/embedding-provider.js.map +0 -7
  410. package/dist/src/core/database/migration-manager.js.map +0 -7
  411. package/dist/src/core/database/ollama-embedding-provider.js.map +0 -7
  412. package/dist/src/core/database/openai-embedding-provider.js.map +0 -7
  413. package/dist/src/core/database/query-cache.js.map +0 -7
  414. package/dist/src/core/database/query-router.js.map +0 -7
  415. package/dist/src/core/database/sqlite-adapter.js.map +0 -7
  416. package/dist/src/core/database/transformers-embedding-provider.js.map +0 -7
  417. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -7
  418. package/dist/src/core/digest/frame-digest-integration.js.map +0 -7
  419. package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -7
  420. package/dist/src/core/digest/index.js.map +0 -7
  421. package/dist/src/core/digest/types.js.map +0 -7
  422. package/dist/src/core/errors/error-utils.js.map +0 -7
  423. package/dist/src/core/errors/index.js.map +0 -7
  424. package/dist/src/core/errors/recovery.js.map +0 -7
  425. package/dist/src/core/execution/parallel-executor.js.map +0 -7
  426. package/dist/src/core/extensions/custom-tools.js.map +0 -7
  427. package/dist/src/core/extensions/index.js.map +0 -7
  428. package/dist/src/core/extensions/loader.js.map +0 -7
  429. package/dist/src/core/extensions/plugin-system.js.map +0 -7
  430. package/dist/src/core/extensions/provider-adapter.js.map +0 -7
  431. package/dist/src/core/extensions/sandbox-runtime.js.map +0 -7
  432. package/dist/src/core/extensions/types.js.map +0 -7
  433. package/dist/src/core/frame/workflow-templates.js.map +0 -7
  434. package/dist/src/core/merge/conflict-detector.js.map +0 -7
  435. package/dist/src/core/merge/index.js.map +0 -7
  436. package/dist/src/core/merge/resolution-engine.js.map +0 -7
  437. package/dist/src/core/merge/stack-diff.js.map +0 -7
  438. package/dist/src/core/merge/types.js.map +0 -7
  439. package/dist/src/core/merge/unified-merge-resolver.js.map +0 -7
  440. package/dist/src/core/models/fallback-monitor.js.map +0 -7
  441. package/dist/src/core/models/model-router.js.map +0 -7
  442. package/dist/src/core/monitoring/error-handler.js.map +0 -7
  443. package/dist/src/core/monitoring/logger.js.map +0 -7
  444. package/dist/src/core/monitoring/metrics.js.map +0 -7
  445. package/dist/src/core/monitoring/progress-tracker.js.map +0 -7
  446. package/dist/src/core/monitoring/session-monitor.js.map +0 -7
  447. package/dist/src/core/performance/context-cache.js.map +0 -7
  448. package/dist/src/core/performance/index.js.map +0 -7
  449. package/dist/src/core/performance/lazy-context-loader.js.map +0 -7
  450. package/dist/src/core/performance/monitor.js.map +0 -7
  451. package/dist/src/core/performance/optimized-frame-context.js.map +0 -7
  452. package/dist/src/core/performance/performance-benchmark.js.map +0 -7
  453. package/dist/src/core/performance/performance-profiler.js.map +0 -7
  454. package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -7
  455. package/dist/src/core/persistence/postgres-adapter.js.map +0 -7
  456. package/dist/src/core/projects/project-isolation.js.map +0 -7
  457. package/dist/src/core/projects/project-manager.js.map +0 -7
  458. package/dist/src/core/query/query-parser.js.map +0 -7
  459. package/dist/src/core/query/query-templates.js.map +0 -7
  460. package/dist/src/core/retrieval/context-retriever.js.map +0 -7
  461. package/dist/src/core/retrieval/index.js.map +0 -7
  462. package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -7
  463. package/dist/src/core/retrieval/llm-provider.js.map +0 -7
  464. package/dist/src/core/retrieval/privacy-filter.js.map +0 -7
  465. package/dist/src/core/retrieval/retrieval-audit.js.map +0 -7
  466. package/dist/src/core/retrieval/summary-generator.js.map +0 -7
  467. package/dist/src/core/retrieval/types.js.map +0 -7
  468. package/dist/src/core/retrieval/unified-context-assembler.js.map +0 -7
  469. package/dist/src/core/security/index.js.map +0 -7
  470. package/dist/src/core/security/input-sanitizer.js.map +0 -7
  471. package/dist/src/core/session/clear-survival.js.map +0 -7
  472. package/dist/src/core/session/enhanced-handoff.js.map +0 -7
  473. package/dist/src/core/session/handoff-generator.js.map +0 -7
  474. package/dist/src/core/session/index.js.map +0 -7
  475. package/dist/src/core/session/session-manager.js.map +0 -7
  476. package/dist/src/core/skills/index.js.map +0 -7
  477. package/dist/src/core/skills/skill-storage.js.map +0 -7
  478. package/dist/src/core/skills/types.js.map +0 -7
  479. package/dist/src/core/storage/chromadb-adapter.js.map +0 -7
  480. package/dist/src/core/storage/infinite-storage.js.map +0 -7
  481. package/dist/src/core/storage/project-registry.js.map +0 -7
  482. package/dist/src/core/storage/remote-storage.js.map +0 -7
  483. package/dist/src/core/storage/storage-tier-manager.js.map +0 -7
  484. package/dist/src/core/storage/two-tier-storage.js.map +0 -7
  485. package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -7
  486. package/dist/src/core/trace/db-trace-wrapper.js.map +0 -7
  487. package/dist/src/core/trace/debug-trace.js.map +0 -7
  488. package/dist/src/core/trace/index.js.map +0 -7
  489. package/dist/src/core/trace/linear-api-wrapper.js.map +0 -7
  490. package/dist/src/core/trace/trace-detector.js.map +0 -7
  491. package/dist/src/core/trace/trace-store.js.map +0 -7
  492. package/dist/src/core/trace/types.js.map +0 -7
  493. package/dist/src/core/types.js.map +0 -7
  494. package/dist/src/core/utils/async-mutex.js.map +0 -7
  495. package/dist/src/core/utils/compression.js.map +0 -7
  496. package/dist/src/core/utils/update-checker.js.map +0 -7
  497. package/dist/src/core/worktree/worktree-manager.js.map +0 -7
  498. package/dist/src/daemon/daemon-config.js.map +0 -7
  499. package/dist/src/daemon/services/context-service.js.map +0 -7
  500. package/dist/src/daemon/services/linear-service.js.map +0 -7
  501. package/dist/src/daemon/services/maintenance-service.js.map +0 -7
  502. package/dist/src/daemon/services/memory-service.js.map +0 -7
  503. package/dist/src/daemon/session-daemon.js.map +0 -7
  504. package/dist/src/daemon/unified-daemon.js.map +0 -7
  505. package/dist/src/features/analytics/api/analytics-api.js.map +0 -7
  506. package/dist/src/features/analytics/core/analytics-service.js.map +0 -7
  507. package/dist/src/features/analytics/index.js.map +0 -7
  508. package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -7
  509. package/dist/src/features/analytics/types/metrics.js.map +0 -7
  510. package/dist/src/features/browser/browser-mcp.js.map +0 -7
  511. package/dist/src/features/sweep/index.js.map +0 -7
  512. package/dist/src/features/sweep/prediction-client.js.map +0 -7
  513. package/dist/src/features/sweep/prompt-builder.js.map +0 -7
  514. package/dist/src/features/sweep/pty-wrapper.js.map +0 -7
  515. package/dist/src/features/sweep/state-watcher.js.map +0 -7
  516. package/dist/src/features/sweep/status-bar.js.map +0 -7
  517. package/dist/src/features/sweep/sweep-server-manager.js.map +0 -7
  518. package/dist/src/features/sweep/tab-interceptor.js.map +0 -7
  519. package/dist/src/features/sweep/types.js.map +0 -7
  520. package/dist/src/features/tasks/linear-task-manager.js.map +0 -7
  521. package/dist/src/features/tasks/task-aware-context.js.map +0 -7
  522. package/dist/src/features/tui/simple-monitor.js.map +0 -7
  523. package/dist/src/features/tui/swarm-monitor.js.map +0 -7
  524. package/dist/src/features/web/client/stores/task-store.js.map +0 -7
  525. package/dist/src/features/web/server/index.js.map +0 -7
  526. package/dist/src/features/workers/tmux-manager.js.map +0 -7
  527. package/dist/src/features/workers/worker-registry.js.map +0 -7
  528. package/dist/src/hooks/auto-background.js.map +0 -7
  529. package/dist/src/hooks/claude-code-whatsapp-hook.js +0 -197
  530. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +0 -7
  531. package/dist/src/hooks/config.js.map +0 -7
  532. package/dist/src/hooks/daemon.js.map +0 -7
  533. package/dist/src/hooks/diffmem-hooks.js.map +0 -7
  534. package/dist/src/hooks/events.js.map +0 -7
  535. package/dist/src/hooks/index.js.map +0 -7
  536. package/dist/src/hooks/linear-task-picker.js.map +0 -7
  537. package/dist/src/hooks/schemas.js.map +0 -7
  538. package/dist/src/hooks/secure-fs.js.map +0 -7
  539. package/dist/src/hooks/security-logger.js.map +0 -7
  540. package/dist/src/hooks/session-summary.js.map +0 -7
  541. package/dist/src/hooks/sms-action-runner.js +0 -371
  542. package/dist/src/hooks/sms-action-runner.js.map +0 -7
  543. package/dist/src/hooks/sms-notify.js +0 -506
  544. package/dist/src/hooks/sms-notify.js.map +0 -7
  545. package/dist/src/hooks/sms-watcher.js +0 -93
  546. package/dist/src/hooks/sms-watcher.js.map +0 -7
  547. package/dist/src/hooks/sms-webhook.js +0 -555
  548. package/dist/src/hooks/sms-webhook.js.map +0 -7
  549. package/dist/src/hooks/whatsapp-commands.js +0 -479
  550. package/dist/src/hooks/whatsapp-commands.js.map +0 -7
  551. package/dist/src/hooks/whatsapp-scheduler.js +0 -317
  552. package/dist/src/hooks/whatsapp-scheduler.js.map +0 -7
  553. package/dist/src/hooks/whatsapp-sync.js +0 -409
  554. package/dist/src/hooks/whatsapp-sync.js.map +0 -7
  555. package/dist/src/index.js.map +0 -7
  556. package/dist/src/integrations/anthropic/client.js.map +0 -7
  557. package/dist/src/integrations/claude-code/agent-bridge.js.map +0 -7
  558. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
  559. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +0 -7
  560. package/dist/src/integrations/claude-code/post-task-hooks.js.map +0 -7
  561. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +0 -7
  562. package/dist/src/integrations/claude-code/subagent-client.js.map +0 -7
  563. package/dist/src/integrations/claude-code/task-coordinator.js.map +0 -7
  564. package/dist/src/integrations/diffmem/client.js.map +0 -7
  565. package/dist/src/integrations/diffmem/config.js.map +0 -7
  566. package/dist/src/integrations/diffmem/index.js.map +0 -7
  567. package/dist/src/integrations/diffmem/types.js.map +0 -7
  568. package/dist/src/integrations/linear/auth.js.map +0 -7
  569. package/dist/src/integrations/linear/auto-sync.js.map +0 -7
  570. package/dist/src/integrations/linear/client.js.map +0 -7
  571. package/dist/src/integrations/linear/config.js.map +0 -7
  572. package/dist/src/integrations/linear/migration.js.map +0 -7
  573. package/dist/src/integrations/linear/oauth-server.js.map +0 -7
  574. package/dist/src/integrations/linear/rest-client.js.map +0 -7
  575. package/dist/src/integrations/linear/sync-manager.js.map +0 -7
  576. package/dist/src/integrations/linear/sync-service.js.map +0 -7
  577. package/dist/src/integrations/linear/sync.js.map +0 -7
  578. package/dist/src/integrations/linear/types.js.map +0 -7
  579. package/dist/src/integrations/linear/unified-sync.js.map +0 -7
  580. package/dist/src/integrations/linear/webhook-handler.js.map +0 -7
  581. package/dist/src/integrations/linear/webhook-server.js.map +0 -7
  582. package/dist/src/integrations/linear/webhook.js.map +0 -7
  583. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
  584. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -7
  585. package/dist/src/integrations/mcp/handlers/diffmem-handlers.js.map +0 -7
  586. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
  587. package/dist/src/integrations/mcp/handlers/index.js.map +0 -7
  588. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -7
  589. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +0 -7
  590. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -7
  591. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -7
  592. package/dist/src/integrations/mcp/index.js.map +0 -7
  593. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +0 -7
  594. package/dist/src/integrations/mcp/pending-utils.js.map +0 -7
  595. package/dist/src/integrations/mcp/refactored-server.js.map +0 -7
  596. package/dist/src/integrations/mcp/remote-server.js.map +0 -7
  597. package/dist/src/integrations/mcp/schemas.js.map +0 -7
  598. package/dist/src/integrations/mcp/server.js.map +0 -7
  599. package/dist/src/integrations/mcp/tool-definitions-code.js.map +0 -7
  600. package/dist/src/integrations/mcp/tool-definitions.js.map +0 -7
  601. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
  602. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +0 -7
  603. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
  604. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
  605. package/dist/src/integrations/ralph/index.js.map +0 -7
  606. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +0 -7
  607. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
  608. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
  609. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
  610. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
  611. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
  612. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
  613. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
  614. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +0 -7
  615. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +0 -7
  616. package/dist/src/integrations/ralph/state/state-reconciler.js.map +0 -7
  617. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
  618. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
  619. package/dist/src/integrations/ralph/types.js.map +0 -7
  620. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
  621. package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -7
  622. package/dist/src/middleware/exponential-rate-limiter.js.map +0 -7
  623. package/dist/src/models/user.model.js.map +0 -7
  624. package/dist/src/orchestrators/multimodal/constants.js.map +0 -7
  625. package/dist/src/orchestrators/multimodal/harness.js.map +0 -7
  626. package/dist/src/orchestrators/multimodal/providers.js.map +0 -7
  627. package/dist/src/orchestrators/multimodal/types.js.map +0 -7
  628. package/dist/src/orchestrators/multimodal/utils.js.map +0 -7
  629. package/dist/src/servers/production/auth-middleware.js.map +0 -7
  630. package/dist/src/services/config-service.js.map +0 -7
  631. package/dist/src/services/context-service.js.map +0 -7
  632. package/dist/src/skills/api-discovery.js.map +0 -7
  633. package/dist/src/skills/api-skill.js.map +0 -7
  634. package/dist/src/skills/claude-skills.js.map +0 -7
  635. package/dist/src/skills/dashboard-launcher.js.map +0 -7
  636. package/dist/src/skills/linear-task-runner.js.map +0 -7
  637. package/dist/src/skills/recursive-agent-orchestrator.js.map +0 -7
  638. package/dist/src/skills/repo-ingestion-skill.js.map +0 -7
  639. package/dist/src/skills/spec-generator-skill.js.map +0 -7
  640. package/dist/src/skills/unified-rlm-orchestrator.js.map +0 -7
  641. package/dist/src/types/task.js.map +0 -7
  642. package/dist/src/utils/env.js.map +0 -7
  643. package/dist/src/utils/formatting.js.map +0 -7
  644. package/dist/src/utils/process-cleanup.js.map +0 -7
  645. package/scripts/README-TESTING.md +0 -186
  646. package/scripts/analyze-cli-security.js +0 -288
  647. package/scripts/archive/add-phase-tasks-to-linear.js +0 -163
  648. package/scripts/archive/analyze-linear-duplicates.js +0 -214
  649. package/scripts/archive/analyze-remaining-duplicates.js +0 -230
  650. package/scripts/archive/analyze-sta-duplicates.js +0 -292
  651. package/scripts/archive/analyze-sta-graphql.js +0 -399
  652. package/scripts/archive/cancel-duplicate-tasks.ts +0 -246
  653. package/scripts/archive/check-all-duplicates.ts +0 -419
  654. package/scripts/archive/clean-duplicate-tasks.js +0 -114
  655. package/scripts/archive/cleanup-duplicate-tasks.ts +0 -286
  656. package/scripts/archive/create-phase-tasks.js +0 -387
  657. package/scripts/archive/delete-linear-duplicates.js +0 -182
  658. package/scripts/archive/delete-remaining-duplicates.js +0 -158
  659. package/scripts/archive/delete-sta-duplicates.js +0 -201
  660. package/scripts/archive/delete-sta-oauth.js +0 -201
  661. package/scripts/archive/export-sta-tasks.js +0 -62
  662. package/scripts/archive/install-auto-sync.js +0 -266
  663. package/scripts/archive/install-chromadb-hooks.sh +0 -133
  664. package/scripts/archive/install-enhanced-clear-hooks.sh +0 -431
  665. package/scripts/archive/install-post-task-hooks.sh +0 -289
  666. package/scripts/archive/install-stackmemory-hooks.sh +0 -420
  667. package/scripts/archive/merge-linear-duplicates-safe.ts +0 -362
  668. package/scripts/archive/merge-linear-duplicates.ts +0 -182
  669. package/scripts/archive/remove-sta-tasks.js +0 -70
  670. package/scripts/archive/setup-background-sync.sh +0 -168
  671. package/scripts/archive/setup-claude-auto-triggers.sh +0 -181
  672. package/scripts/archive/setup-claude-autostart.sh +0 -305
  673. package/scripts/archive/setup-git-hooks.sh +0 -25
  674. package/scripts/archive/setup-linear-oauth.sh +0 -46
  675. package/scripts/archive/setup-mcp.sh +0 -113
  676. package/scripts/archive/setup-railway-deployment.sh +0 -81
  677. package/scripts/auto-handoff.sh +0 -262
  678. package/scripts/background-sync-manager.js +0 -478
  679. package/scripts/benchmark-performance.ts +0 -57
  680. package/scripts/check-redis.ts +0 -48
  681. package/scripts/chromadb-auto-loader.sh +0 -128
  682. package/scripts/chromadb-context-loader.js +0 -479
  683. package/scripts/claude-chromadb-hook.js +0 -460
  684. package/scripts/claude-linear-skill.js +0 -455
  685. package/scripts/claude-pre-commit.sh +0 -302
  686. package/scripts/claude-sm-autostart.js +0 -579
  687. package/scripts/claude-with-chromadb.sh +0 -69
  688. package/scripts/clean-linear-backlog.js +0 -273
  689. package/scripts/cleanup-old-sessions.sh +0 -57
  690. package/scripts/create-cleanup-issues.js +0 -302
  691. package/scripts/create-sandbox.sh +0 -269
  692. package/scripts/debug-linear-update.js +0 -174
  693. package/scripts/delete-linear-tasks.js +0 -167
  694. package/scripts/demos/browser-test.ts +0 -39
  695. package/scripts/demos/ralph-integration-demo.ts +0 -245
  696. package/scripts/demos/trace-demo.ts +0 -200
  697. package/scripts/demos/trace-detector.demo.ts +0 -171
  698. package/scripts/demos/trace-test.ts +0 -79
  699. package/scripts/deploy-ralph-swarm.sh +0 -365
  700. package/scripts/deploy.sh +0 -89
  701. package/scripts/deployment/test-deployment.js +0 -194
  702. package/scripts/detect-and-rehydrate.js +0 -162
  703. package/scripts/detect-and-rehydrate.mjs +0 -165
  704. package/scripts/development/create-demo-tasks.js +0 -143
  705. package/scripts/development/debug-frame-test.js +0 -16
  706. package/scripts/development/demo-auto-sync.js +0 -128
  707. package/scripts/development/fix-all-imports.js +0 -213
  708. package/scripts/development/fix-imports.js +0 -229
  709. package/scripts/development/fix-lint-loop.cjs +0 -103
  710. package/scripts/development/fix-project-id.ts +0 -161
  711. package/scripts/development/fix-strict-mode-issues.ts +0 -291
  712. package/scripts/development/reorganize-structure.sh +0 -228
  713. package/scripts/development/test-persistence-direct.js +0 -148
  714. package/scripts/development/test-persistence.js +0 -114
  715. package/scripts/development/test-tasks.js +0 -93
  716. package/scripts/development/update-imports.js +0 -212
  717. package/scripts/fetch-linear-status.js +0 -125
  718. package/scripts/initialize.ts +0 -220
  719. package/scripts/install-notify-hook.sh +0 -84
  720. package/scripts/linear-auto-sync.js +0 -262
  721. package/scripts/linear-auto-sync.sh +0 -161
  722. package/scripts/linear-sync-daemon.js +0 -150
  723. package/scripts/linear-task-review.js +0 -237
  724. package/scripts/list-linear-tasks.ts +0 -178
  725. package/scripts/mcp-proxy.js +0 -66
  726. package/scripts/measure-handoff-impact.mjs +0 -395
  727. package/scripts/measure-handoff-impact.ts +0 -450
  728. package/scripts/publish-local.js +0 -74
  729. package/scripts/query-chromadb.ts +0 -201
  730. package/scripts/ralph-integration-test.js +0 -274
  731. package/scripts/reconcile-local-tasks.js +0 -170
  732. package/scripts/recreate-frames-db.js +0 -89
  733. package/scripts/setup-notify-webhook.sh +0 -103
  734. package/scripts/show-linear-summary.ts +0 -172
  735. package/scripts/simple-swarm-demo.ts +0 -114
  736. package/scripts/stackmemory-auto-handoff.sh +0 -231
  737. package/scripts/start-linear-sync-daemon.sh +0 -141
  738. package/scripts/start-temporal-paradox.sh +0 -214
  739. package/scripts/status.ts +0 -224
  740. package/scripts/stop-notify-webhook.sh +0 -19
  741. package/scripts/swarm-monitor.js +0 -509
  742. package/scripts/sync-and-clean-tasks.js +0 -258
  743. package/scripts/sync-linear-graphql.js +0 -303
  744. package/scripts/sync-linear-tasks.js +0 -186
  745. package/scripts/test-auto-triggers.sh +0 -57
  746. package/scripts/test-browser-mcp.js +0 -74
  747. package/scripts/test-chromadb-full.js +0 -115
  748. package/scripts/test-chromadb-hooks.sh +0 -28
  749. package/scripts/test-chromadb-sync.ts +0 -245
  750. package/scripts/test-claude-config.sh +0 -123
  751. package/scripts/test-cli-security.js +0 -293
  752. package/scripts/test-code-execution.js +0 -143
  753. package/scripts/test-hooks-persistence.sh +0 -220
  754. package/scripts/test-installation-scenarios.sh +0 -359
  755. package/scripts/test-installation.sh +0 -224
  756. package/scripts/test-mcp.js +0 -163
  757. package/scripts/test-parallel-swarms.js +0 -443
  758. package/scripts/test-pre-publish-quick.sh +0 -77
  759. package/scripts/test-quality-gates.sh +0 -263
  760. package/scripts/test-ralph-iteration-fix.ts +0 -118
  761. package/scripts/test-ralph-iterations.ts +0 -164
  762. package/scripts/test-redis-storage.ts +0 -490
  763. package/scripts/test-rlm-basic.sh +0 -122
  764. package/scripts/test-rlm-comprehensive.sh +0 -260
  765. package/scripts/test-rlm-e2e.sh +0 -268
  766. package/scripts/test-rlm-simple.js +0 -90
  767. package/scripts/test-rlm.js +0 -110
  768. package/scripts/test-session-handoff.sh +0 -165
  769. package/scripts/test-setup-e2e.sh +0 -154
  770. package/scripts/test-shell-integration.sh +0 -275
  771. package/scripts/test-simple-ralph-state-sync.ts +0 -178
  772. package/scripts/test-swarm-fixes.ts +0 -161
  773. package/scripts/test-swarm-git-workflow.js +0 -338
  774. package/scripts/test-swarm-tui.ts +0 -34
  775. package/scripts/test-tui-shortcuts.ts +0 -66
  776. package/scripts/testing/ab-test-runner.ts +0 -510
  777. package/scripts/testing/collect-metrics.ts +0 -457
  778. package/scripts/testing/quick-effectiveness-demo.js +0 -187
  779. package/scripts/testing/ralph-cli-test.js +0 -88
  780. package/scripts/testing/ralph-integration-validation.js +0 -727
  781. package/scripts/testing/ralph-swarm-test-scenarios.js +0 -613
  782. package/scripts/testing/real-performance-test.js +0 -422
  783. package/scripts/testing/results/real-performance-results.json +0 -90
  784. package/scripts/testing/run-effectiveness-tests.sh +0 -176
  785. package/scripts/testing/simple-effectiveness-test.js +0 -310
  786. package/scripts/testing/test-tier-migration.js +0 -100
  787. package/scripts/update-linear-status.js +0 -268
  788. package/scripts/update-linear-tasks-fixed.js +0 -284
  789. package/scripts/validate-claude-config.sh +0 -155
  790. package/scripts/validate-swarm-implementation.js +0 -467
  791. package/scripts/validate-tui-shortcuts.ts +0 -83
  792. package/templates/claude-hooks/notify-review-hook.js +0 -360
  793. package/templates/claude-hooks/sms-response-handler.js +0 -174
@@ -1,7 +0,0 @@
1
- {
2
- "version": 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 * as fs from 'fs';\nimport * as path from 'path';\nimport { logger } from '../core/monitoring/logger.js';\nimport { FrameManager } from '../core/context/index.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-sonnet-4-5-20250929'\n | 'claude-haiku-4-5-20251001'\n | 'claude-opus-4-6';\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-sonnet-4-5-20250929',\n maxTokens: 20000,\n temperature: 0.3,\n systemPrompt: `You decompose tasks into parallel/sequential subtask trees.\nOutput JSON: { subtasks: [{ id, description, agent, dependencies[], parallel: bool }] }\nRules:\n- Maximize parallelism \u2014 independent tasks run concurrently\n- Each subtask names its agent type: planning, code, testing, linting, review, improve, context, publish\n- Include failure modes and rollback steps for risky operations\n- Keep subtask descriptions actionable (verb + object + constraint)`,\n capabilities: ['decompose', 'analyze', 'strategize', 'prioritize'],\n });\n\n // Code Agent - Implementation specialist\n configs.set('code', {\n type: 'code',\n model: 'claude-sonnet-4-5-20250929',\n maxTokens: 30000,\n temperature: 0.2,\n systemPrompt: `You implement code changes. Read existing code before modifying.\nOutput JSON: { success: bool, filesChanged: string[], changes: string[], notes: string[] }\nRules:\n- Follow existing project conventions (naming, imports, patterns)\n- Add .js extensions to relative TypeScript imports (ESM)\n- Return undefined over throwing; log+continue over crash\n- No emojis, no unnecessary comments, functions under 20 lines\n- Validate inputs at system boundaries only`,\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-sonnet-4-5-20250929',\n maxTokens: 25000,\n temperature: 0.1,\n systemPrompt: `You generate and run tests using the project's test framework.\nOutput JSON: { success: bool, tests: [{ name, type, file }], coverage: string, notes: string[] }\nRules:\n- Use vitest (describe/it/expect) \u2014 check existing tests for patterns\n- Prioritize: critical paths > edge cases > happy paths\n- Each test should assert meaningful behavior, not implementation details\n- Use parameterized tests (it.each) to consolidate similar cases\n- Run tests after writing: npm run test:run`,\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-haiku-4-5-20251001',\n maxTokens: 15000,\n temperature: 0,\n systemPrompt: `You run lint checks and fix issues.\nOutput JSON: { success: bool, issuesFound: number, issuesFixed: number, remaining: string[] }\nRules:\n- Run: npm run lint (ESLint + Prettier)\n- Auto-fix: npm run lint:fix\n- ESM imports require .js extension on relative paths\n- Report unfixable issues with file:line format`,\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-sonnet-4-5-20250929',\n maxTokens: 25000,\n temperature: 0.2,\n systemPrompt: `You review code changes for quality, security, and correctness.\nOutput JSON: { qualityScore: 0-1, issues: [{ severity, file, line, description, suggestion }], approved: bool }\nRules:\n- Score 0.85+ = approved, below = needs improvement\n- Flag: SQL injection, XSS, secret exposure, command injection\n- Flag: functions > 20 lines, cyclomatic complexity > 5\n- Flag: missing error handling at system boundaries\n- Suggest specific fixes, not vague improvements`,\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-sonnet-4-5-20250929',\n maxTokens: 30000,\n temperature: 0.3,\n systemPrompt: `You implement review feedback and improve code quality.\nOutput JSON: { success: bool, improvements: string[], filesChanged: string[] }\nRules:\n- Apply only the specific improvements requested \u2014 no scope creep\n- Maintain backward compatibility unless explicitly breaking\n- Run lint + tests after changes to verify nothing regressed\n- Keep changes minimal and focused`,\n capabilities: ['enhance', 'refactor', 'optimize', 'polish'],\n });\n\n // Context Agent - Information retriever\n configs.set('context', {\n type: 'context',\n model: 'claude-haiku-4-5-20251001',\n maxTokens: 10000,\n temperature: 0,\n systemPrompt: `You retrieve relevant context from the codebase and specs.\nOutput JSON: { context: string, sources: string[], relevanceScore: 0-1 }\nRules:\n- Check docs/specs/ for ONE_PAGER.md, DEV_SPEC.md, PROMPT_PLAN.md\n- Check CLAUDE.md and AGENTS.md for project conventions\n- Search src/ for relevant implementations\n- Return concise summaries, not full file contents`,\n capabilities: ['search', 'retrieve', 'summarize', 'contextualize'],\n });\n\n // Publish Agent - Release and deployment\n configs.set('publish', {\n type: 'publish',\n model: 'claude-haiku-4-5-20251001',\n maxTokens: 15000,\n temperature: 0,\n systemPrompt: `You handle releases and publishing.\nOutput JSON: { success: bool, version: string, actions: string[] }\nRules:\n- Verify lint + tests + build pass before any publish\n- Follow semver: breaking=major, feature=minor, fix=patch\n- Generate changelog from git log since last tag\n- Never force-push or skip pre-publish hooks`,\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 loadSpecContext(): string {\n const specDir = path.join(process.cwd(), 'docs', 'specs');\n if (!fs.existsSync(specDir)) return '';\n\n const specFiles = ['ONE_PAGER.md', 'DEV_SPEC.md', 'PROMPT_PLAN.md'];\n const sections: string[] = [];\n\n for (const file of specFiles) {\n const filePath = path.join(specDir, file);\n if (fs.existsSync(filePath)) {\n const content = fs.readFileSync(filePath, 'utf-8');\n // Truncate to first 2000 chars to stay within token budgets\n const truncated =\n content.length > 2000\n ? content.slice(0, 2000) + '\\n...[truncated]'\n : content;\n sections.push(`### ${file}\\n${truncated}`);\n }\n }\n\n return sections.length > 0\n ? `\\n## Project Specs\\n${sections.join('\\n\\n')}`\n : '';\n }\n\n private buildAgentPrompt(\n node: TaskNode,\n context: Record<string, unknown>\n ): string {\n const depResults = node.dependencies\n .map((id) => {\n const dep = this.activeExecutions.get(id);\n if (!dep?.result) return null;\n return { id, agent: dep.agent, result: dep.result };\n })\n .filter(Boolean);\n\n const specContext =\n node.agent === 'planning' || node.agent === 'code'\n ? this.loadSpecContext()\n : '';\n\n return [\n `## Task`,\n node.description,\n '',\n `## Agent Role: ${node.agent}`,\n `Config: ${JSON.stringify(this.subagentConfigs.get(node.agent)?.capabilities || [])}`,\n '',\n `## Context`,\n JSON.stringify(context, null, 2),\n '',\n ...(depResults.length > 0\n ? [`## Dependency Results`, JSON.stringify(depResults, null, 2), '']\n : []),\n ...(specContext ? [specContext, ''] : []),\n `## Constraints`,\n `- ESM imports: use .js extensions on relative imports`,\n `- Testing: vitest (not jest)`,\n `- Lint: npm run lint (eslint + prettier)`,\n `- Output structured JSON when possible`,\n ].join('\\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 (input+output blended approximate)\n const pricing: Record<string, number> = {\n 'claude-sonnet-4-5-20250929': 15.0,\n 'claude-haiku-4-5-20251001': 1.0,\n 'claude-opus-4-6': 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
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/skills/repo-ingestion-skill.ts"],
4
- "sourcesContent": ["/**\n * Repository Ingestion Skill for ChromaDB\n *\n * Ingests and maintains code repositories in ChromaDB for enhanced code search and context\n *\n * NOTE: chromadb is an optional dependency. This skill gracefully handles\n * the case when chromadb is not installed.\n */\n\n// Dynamic import type for optional chromadb dependency\ntype ChromaDBAdapter =\n import('../core/storage/chromadb-adapter.js').ChromaDBAdapter;\n\nimport { Logger } from '../core/monitoring/logger.js';\nimport {\n isChromaDBEnabled,\n getChromaDBConfig,\n} from '../core/config/storage-config.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { execSync } from 'child_process';\nimport ignore from 'ignore';\n\n// Helper to dynamically import ChromaDBAdapter\nasync function getChromaDBAdapter(): Promise<\n typeof import('../core/storage/chromadb-adapter.js')\n> {\n try {\n return await import('../core/storage/chromadb-adapter.js');\n } catch {\n throw new Error(\n 'chromadb is not installed. Install it with: npm install chromadb'\n );\n }\n}\n\nexport interface RepoIngestionOptions {\n incremental?: boolean;\n forceUpdate?: boolean;\n includeTests?: boolean;\n includeDocs?: boolean;\n maxFileSize?: number;\n chunkSize?: number;\n extensions?: string[];\n excludePatterns?: string[];\n}\n\nexport interface RepoMetadata {\n repoId: string;\n repoName: string;\n branch: string;\n lastCommit: string;\n lastIngested: number;\n filesCount: number;\n totalSize: number;\n language: string;\n framework?: string;\n}\n\nexport interface FileChunk {\n id: string;\n filePath: string;\n content: string;\n startLine: number;\n endLine: number;\n hash: string;\n language: string;\n}\n\nexport class RepoIngestionSkill {\n private logger: Logger;\n private adapter: ChromaDBAdapter | null = null;\n private metadataCache: Map<string, RepoMetadata> = new Map();\n private fileHashCache: Map<string, string> = new Map();\n private chromaEnabled: boolean = false;\n private adapterConfig: {\n apiKey: string;\n tenant: string;\n database: string;\n collectionName: string;\n } | null = null;\n\n constructor(\n private config: {\n apiKey?: string;\n tenant?: string;\n database?: string;\n collectionName?: string;\n } | null,\n private userId: string,\n private teamId?: string\n ) {\n this.logger = new Logger('RepoIngestionSkill');\n\n // Check if ChromaDB is enabled via storage config\n this.chromaEnabled = isChromaDBEnabled();\n\n if (this.chromaEnabled) {\n const chromaConfig = getChromaDBConfig();\n if (chromaConfig && chromaConfig.apiKey) {\n // Store config for lazy initialization in initialize()\n this.adapterConfig = {\n apiKey: config?.apiKey || chromaConfig.apiKey,\n tenant: config?.tenant || chromaConfig.tenant || 'default_tenant',\n database:\n config?.database || chromaConfig.database || 'default_database',\n collectionName: config?.collectionName || 'stackmemory_repos',\n };\n }\n }\n }\n\n /**\n * Check if ChromaDB is available for use\n */\n isAvailable(): boolean {\n return this.chromaEnabled && this.adapter !== null;\n }\n\n async initialize(): Promise<void> {\n if (!this.chromaEnabled || !this.adapterConfig) {\n this.logger.warn(\n 'ChromaDB not enabled. Repository ingestion features are unavailable.'\n );\n this.logger.warn('Run \"stackmemory init --chromadb\" to enable ChromaDB.');\n return;\n }\n\n // Create adapter using dynamic import (chromadb is optional)\n if (!this.adapter && this.adapterConfig) {\n try {\n const { ChromaDBAdapter } = await getChromaDBAdapter();\n this.adapter = await ChromaDBAdapter.create(\n this.adapterConfig,\n this.userId,\n this.teamId\n );\n } catch (error) {\n this.logger.warn(\n `Failed to initialize ChromaDB: ${error instanceof Error ? error.message : String(error)}`\n );\n this.logger.warn(\n 'chromadb is optional. Install it with: npm install chromadb'\n );\n return;\n }\n }\n\n if (this.adapter) {\n await this.adapter.initialize();\n }\n await this.loadMetadataCache();\n }\n\n /**\n * Ingest a repository into ChromaDB\n */\n async ingestRepository(\n repoPath: string,\n repoName: string,\n options: RepoIngestionOptions = {}\n ): Promise<{\n success: boolean;\n message: string;\n stats?: {\n filesProcessed: number;\n chunksCreated: number;\n timeElapsed: number;\n totalSize: number;\n };\n }> {\n if (!this.isAvailable()) {\n return {\n success: false,\n message:\n 'ChromaDB not enabled. Run \"stackmemory init --chromadb\" to enable semantic search features.',\n };\n }\n\n const startTime = Date.now();\n\n try {\n this.logger.info(`Starting repository ingestion for ${repoName}`);\n\n // Validate repository path\n if (!fs.existsSync(repoPath)) {\n throw new Error(`Repository path not found: ${repoPath}`);\n }\n\n // Get repository metadata\n const metadata = await this.getRepoMetadata(repoPath, repoName);\n\n // Check if incremental update is possible\n const existingMetadata = this.metadataCache.get(metadata.repoId);\n if (options.incremental && existingMetadata && !options.forceUpdate) {\n const changedFiles = await this.getChangedFiles(\n repoPath,\n existingMetadata.lastCommit,\n metadata.lastCommit\n );\n\n if (changedFiles.length === 0) {\n return {\n success: true,\n message: 'No changes detected since last ingestion',\n };\n }\n\n this.logger.info(\n `Incremental update: ${changedFiles.length} files changed`\n );\n }\n\n // Get files to process\n const files = await this.getRepoFiles(repoPath, options);\n this.logger.info(`Found ${files.length} files to process`);\n\n // Process files and create chunks\n let filesProcessed = 0;\n let chunksCreated = 0;\n let totalSize = 0;\n\n for (const file of files) {\n try {\n const chunks = await this.processFile(\n file,\n repoPath,\n repoName,\n metadata,\n options\n );\n\n for (const chunk of chunks) {\n await this.storeChunk(chunk, metadata);\n chunksCreated++;\n }\n\n filesProcessed++;\n totalSize += fs.statSync(file).size;\n\n // Log progress every 100 files\n if (filesProcessed % 100 === 0) {\n this.logger.info(\n `Processed ${filesProcessed}/${files.length} files`\n );\n }\n } catch (error: unknown) {\n this.logger.warn(`Failed to process file ${file}:`, error);\n }\n }\n\n // Update metadata\n metadata.filesCount = filesProcessed;\n metadata.totalSize = totalSize;\n metadata.lastIngested = Date.now();\n await this.saveMetadata(metadata);\n\n const timeElapsed = Date.now() - startTime;\n\n this.logger.info(\n `Repository ingestion complete: ${filesProcessed} files, ${chunksCreated} chunks in ${timeElapsed}ms`\n );\n\n return {\n success: true,\n message: `Successfully ingested ${repoName}`,\n stats: {\n filesProcessed,\n chunksCreated,\n timeElapsed,\n totalSize,\n },\n };\n } catch (error: unknown) {\n this.logger.error('Repository ingestion failed:', error);\n return {\n success: false,\n message: `Failed to ingest repository: ${error instanceof Error ? error.message : 'Unknown error'}`,\n };\n }\n }\n\n /**\n * Update an existing repository in ChromaDB\n */\n async updateRepository(\n repoPath: string,\n repoName: string,\n options: RepoIngestionOptions = {}\n ): Promise<{\n success: boolean;\n message: string;\n stats?: {\n filesUpdated: number;\n filesAdded: number;\n filesRemoved: number;\n timeElapsed: number;\n };\n }> {\n const startTime = Date.now();\n\n try {\n const metadata = await this.getRepoMetadata(repoPath, repoName);\n const existingMetadata = this.metadataCache.get(metadata.repoId);\n\n if (!existingMetadata) {\n // No existing data, perform full ingestion\n return this.ingestRepository(repoPath, repoName, options);\n }\n\n // Get changed files since last ingestion\n const changedFiles = await this.getChangedFiles(\n repoPath,\n existingMetadata.lastCommit,\n metadata.lastCommit\n );\n\n if (changedFiles.length === 0) {\n return {\n success: true,\n message: 'No changes detected',\n stats: {\n filesUpdated: 0,\n filesAdded: 0,\n filesRemoved: 0,\n timeElapsed: Date.now() - startTime,\n },\n };\n }\n\n let filesUpdated = 0;\n let filesAdded = 0;\n let filesRemoved = 0;\n\n for (const change of changedFiles) {\n const filePath = path.join(repoPath, change.path);\n\n if (change.status === 'deleted') {\n await this.removeFileChunks(change.path, metadata.repoId);\n filesRemoved++;\n } else if (change.status === 'added') {\n const chunks = await this.processFile(\n filePath,\n repoPath,\n repoName,\n metadata,\n options\n );\n for (const chunk of chunks) {\n await this.storeChunk(chunk, metadata);\n }\n filesAdded++;\n } else if (change.status === 'modified') {\n // Remove old chunks and add new ones\n await this.removeFileChunks(change.path, metadata.repoId);\n const chunks = await this.processFile(\n filePath,\n repoPath,\n repoName,\n metadata,\n options\n );\n for (const chunk of chunks) {\n await this.storeChunk(chunk, metadata);\n }\n filesUpdated++;\n }\n }\n\n // Update metadata\n metadata.lastIngested = Date.now();\n await this.saveMetadata(metadata);\n\n const timeElapsed = Date.now() - startTime;\n\n return {\n success: true,\n message: `Successfully updated ${repoName}`,\n stats: {\n filesUpdated,\n filesAdded,\n filesRemoved,\n timeElapsed,\n },\n };\n } catch (error: unknown) {\n this.logger.error('Repository update failed:', error);\n return {\n success: false,\n message: `Failed to update repository: ${error instanceof Error ? error.message : 'Unknown error'}`,\n };\n }\n }\n\n /**\n * Search code in ingested repositories\n */\n async searchCode(\n query: string,\n options?: {\n repoName?: string;\n language?: string;\n limit?: number;\n includeContext?: boolean;\n }\n ): Promise<\n Array<{\n filePath: string;\n content: string;\n score: number;\n startLine: number;\n endLine: number;\n repoName: string;\n }>\n > {\n if (!this.isAvailable() || !this.adapter) {\n this.logger.warn('ChromaDB not enabled. Code search unavailable.');\n return [];\n }\n\n try {\n const filters: Record<string, unknown> = {\n type: ['code_chunk'],\n };\n\n if (options?.repoName) {\n filters.repo_name = options.repoName;\n }\n\n if (options?.language) {\n filters.language = options.language;\n }\n\n const results = await this.adapter.queryContexts(\n query,\n options?.limit || 20,\n filters\n );\n\n return results.map((result) => ({\n filePath: result.metadata.file_path,\n content: result.content,\n score: 1 - result.distance, // Convert distance to similarity score\n startLine: result.metadata.start_line,\n endLine: result.metadata.end_line,\n repoName: result.metadata.repo_name,\n }));\n } catch (error: unknown) {\n this.logger.error('Code search failed:', error);\n return [];\n }\n }\n\n /**\n * Get repository metadata\n */\n private async getRepoMetadata(\n repoPath: string,\n repoName: string\n ): Promise<RepoMetadata> {\n const branch = this.getCurrentBranch(repoPath);\n const lastCommit = this.getLastCommit(repoPath);\n const repoId = `${repoName}_${branch}`.replace(/[^a-zA-Z0-9_-]/g, '_');\n\n // Detect primary language and framework\n const { language, framework } =\n await this.detectLanguageAndFramework(repoPath);\n\n return {\n repoId,\n repoName,\n branch,\n lastCommit,\n lastIngested: Date.now(),\n filesCount: 0,\n totalSize: 0,\n language,\n framework,\n };\n }\n\n /**\n * Get current git branch\n */\n private getCurrentBranch(repoPath: string): string {\n try {\n return execSync('git rev-parse --abbrev-ref HEAD', {\n cwd: repoPath,\n encoding: 'utf8',\n }).trim();\n } catch {\n return 'main';\n }\n }\n\n /**\n * Get last commit hash\n */\n private getLastCommit(repoPath: string): string {\n try {\n return execSync('git rev-parse HEAD', {\n cwd: repoPath,\n encoding: 'utf8',\n }).trim();\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Get changed files between commits\n */\n private async getChangedFiles(\n repoPath: string,\n fromCommit: string,\n toCommit: string\n ): Promise<Array<{ path: string; status: string }>> {\n try {\n const diff = execSync(\n `git diff --name-status ${fromCommit}..${toCommit}`,\n {\n cwd: repoPath,\n encoding: 'utf8',\n }\n );\n\n return diff\n .split('\\n')\n .filter((line) => line.trim())\n .map((line) => {\n const [status, ...pathParts] = line.split('\\t');\n return {\n path: pathParts.join('\\t'),\n status:\n status === 'A'\n ? 'added'\n : status === 'D'\n ? 'deleted'\n : 'modified',\n };\n });\n } catch {\n return [];\n }\n }\n\n /**\n * Get repository files to process\n */\n private async getRepoFiles(\n repoPath: string,\n options: RepoIngestionOptions\n ): Promise<string[]> {\n const files: string[] = [];\n const ig = ignore();\n\n // Load .gitignore if it exists\n const gitignorePath = path.join(repoPath, '.gitignore');\n if (fs.existsSync(gitignorePath)) {\n ig.add(fs.readFileSync(gitignorePath, 'utf8'));\n }\n\n // Add default exclude patterns\n const defaultExcludes = [\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n 'coverage',\n '.env',\n '*.log',\n ...(options.excludePatterns || []),\n ];\n ig.add(defaultExcludes);\n\n // Default extensions to include\n const extensions = options.extensions || [\n '.ts',\n '.tsx',\n '.js',\n '.jsx',\n '.py',\n '.java',\n '.go',\n '.rs',\n '.c',\n '.cpp',\n '.h',\n '.hpp',\n '.cs',\n '.rb',\n '.php',\n '.swift',\n '.kt',\n '.scala',\n '.r',\n '.m',\n '.sql',\n '.yaml',\n '.yml',\n '.json',\n ];\n\n // Add documentation if requested\n if (options.includeDocs) {\n extensions.push('.md', '.rst', '.txt');\n }\n\n const maxFileSize = options.maxFileSize || 1024 * 1024; // 1MB default\n\n const walkDir = (dir: string, baseDir: string = repoPath) => {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(baseDir, fullPath);\n\n if (ig.ignores(relativePath)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n walkDir(fullPath, baseDir);\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name);\n\n // Check if file should be included\n if (!extensions.includes(ext)) {\n continue;\n }\n\n // Check if it's a test file\n if (\n !options.includeTests &&\n (entry.name.includes('.test.') ||\n entry.name.includes('.spec.') ||\n relativePath.includes('__tests__') ||\n relativePath.includes('test/') ||\n relativePath.includes('tests/'))\n ) {\n continue;\n }\n\n // Check file size\n const stats = fs.statSync(fullPath);\n if (stats.size > maxFileSize) {\n this.logger.debug(`Skipping large file: ${relativePath}`);\n continue;\n }\n\n files.push(fullPath);\n }\n }\n };\n\n walkDir(repoPath);\n return files;\n }\n\n /**\n * Process a file into chunks\n */\n private async processFile(\n filePath: string,\n repoPath: string,\n repoName: string,\n metadata: RepoMetadata,\n options: RepoIngestionOptions\n ): Promise<FileChunk[]> {\n const relativePath = path.relative(repoPath, filePath);\n const content = fs.readFileSync(filePath, 'utf8');\n const lines = content.split('\\n');\n const language = this.detectFileLanguage(filePath);\n\n const chunkSize = options.chunkSize || 100; // 100 lines per chunk\n const chunks: FileChunk[] = [];\n\n // Calculate file hash for caching\n const fileHash = crypto.createHash('md5').update(content).digest('hex');\n\n // Check if file has changed\n const cachedHash = this.fileHashCache.get(relativePath);\n if (cachedHash === fileHash && !options.forceUpdate) {\n return []; // File hasn't changed\n }\n\n this.fileHashCache.set(relativePath, fileHash);\n\n // Split into chunks\n for (let i = 0; i < lines.length; i += chunkSize) {\n const chunkLines = lines.slice(i, Math.min(i + chunkSize, lines.length));\n const chunkContent = chunkLines.join('\\n');\n\n if (chunkContent.trim().length === 0) {\n continue; // Skip empty chunks\n }\n\n const chunkId = `${metadata.repoId}_${relativePath}_${i}`;\n const chunkHash = crypto\n .createHash('md5')\n .update(chunkContent)\n .digest('hex');\n\n chunks.push({\n id: chunkId,\n filePath: relativePath,\n content: chunkContent,\n startLine: i + 1,\n endLine: Math.min(i + chunkSize, lines.length),\n hash: chunkHash,\n language,\n });\n }\n\n return chunks;\n }\n\n /**\n * Store a chunk in ChromaDB\n */\n private async storeChunk(\n chunk: FileChunk,\n metadata: RepoMetadata\n ): Promise<void> {\n if (!this.adapter) {\n throw new Error('ChromaDB adapter not available');\n }\n\n const documentContent = `File: ${chunk.filePath} (Lines ${chunk.startLine}-${chunk.endLine})\nLanguage: ${chunk.language}\nRepository: ${metadata.repoName}/${metadata.branch}\n\n${chunk.content}`;\n\n if (!this.adapter) {\n throw new Error('ChromaDB adapter not initialized');\n }\n await this.adapter.storeContext('observation', documentContent, {\n type: 'code_chunk',\n repo_id: metadata.repoId,\n repo_name: metadata.repoName,\n branch: metadata.branch,\n file_path: chunk.filePath,\n start_line: chunk.startLine,\n end_line: chunk.endLine,\n language: chunk.language,\n framework: metadata.framework,\n chunk_hash: chunk.hash,\n last_commit: metadata.lastCommit,\n });\n }\n\n /**\n * Remove file chunks from ChromaDB\n */\n private async removeFileChunks(\n filePath: string,\n repoId: string\n ): Promise<void> {\n // This would need to be implemented in ChromaDBAdapter\n // For now, we'll log it\n this.logger.debug(\n `Would remove chunks for file: ${filePath} from repo: ${repoId}`\n );\n }\n\n /**\n * Detect file language\n */\n private detectFileLanguage(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n const languageMap: Record<string, string> = {\n '.ts': 'typescript',\n '.tsx': 'typescript',\n '.js': 'javascript',\n '.jsx': 'javascript',\n '.py': 'python',\n '.java': 'java',\n '.go': 'go',\n '.rs': 'rust',\n '.c': 'c',\n '.cpp': 'cpp',\n '.cs': 'csharp',\n '.rb': 'ruby',\n '.php': 'php',\n '.swift': 'swift',\n '.kt': 'kotlin',\n '.scala': 'scala',\n '.r': 'r',\n '.sql': 'sql',\n '.yaml': 'yaml',\n '.yml': 'yaml',\n '.json': 'json',\n '.md': 'markdown',\n };\n\n return languageMap[ext] || 'unknown';\n }\n\n /**\n * Detect language and framework\n */\n private async detectLanguageAndFramework(repoPath: string): Promise<{\n language: string;\n framework?: string;\n }> {\n // Check for package.json (JavaScript/TypeScript)\n const packageJsonPath = path.join(repoPath, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(\n fs.readFileSync(packageJsonPath, 'utf8')\n );\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n let framework: string | undefined;\n if (deps.react) framework = 'react';\n else if (deps.vue) framework = 'vue';\n else if (deps.angular) framework = 'angular';\n else if (deps.express) framework = 'express';\n else if (deps.next) framework = 'nextjs';\n else if (deps.svelte) framework = 'svelte';\n\n return {\n language: deps.typescript ? 'typescript' : 'javascript',\n framework,\n };\n } catch {}\n }\n\n // Check for requirements.txt or setup.py (Python)\n if (\n fs.existsSync(path.join(repoPath, 'requirements.txt')) ||\n fs.existsSync(path.join(repoPath, 'setup.py'))\n ) {\n return { language: 'python' };\n }\n\n // Check for go.mod (Go)\n if (fs.existsSync(path.join(repoPath, 'go.mod'))) {\n return { language: 'go' };\n }\n\n // Check for Cargo.toml (Rust)\n if (fs.existsSync(path.join(repoPath, 'Cargo.toml'))) {\n return { language: 'rust' };\n }\n\n // Check for pom.xml or build.gradle (Java)\n if (\n fs.existsSync(path.join(repoPath, 'pom.xml')) ||\n fs.existsSync(path.join(repoPath, 'build.gradle'))\n ) {\n return { language: 'java' };\n }\n\n // Default to unknown\n return { language: 'unknown' };\n }\n\n /**\n * Load metadata cache\n */\n private async loadMetadataCache(): Promise<void> {\n // In a real implementation, this would load from a persistent store\n // For now, we'll just initialize an empty cache\n this.metadataCache.clear();\n }\n\n /**\n * Save metadata\n */\n private async saveMetadata(metadata: RepoMetadata): Promise<void> {\n this.metadataCache.set(metadata.repoId, metadata);\n // In a real implementation, this would persist to a store\n }\n\n /**\n * Get repository statistics\n */\n async getRepoStats(repoName?: string): Promise<{\n totalRepos: number;\n totalFiles: number;\n totalChunks: number;\n languages: Record<string, number>;\n frameworks: Record<string, number>;\n }> {\n // This would query ChromaDB for statistics\n const stats = {\n totalRepos: this.metadataCache.size,\n totalFiles: 0,\n totalChunks: 0,\n languages: {} as Record<string, number>,\n frameworks: {} as Record<string, number>,\n };\n\n for (const metadata of this.metadataCache.values()) {\n if (!repoName || metadata.repoName === repoName) {\n stats.totalFiles += metadata.filesCount;\n\n if (metadata.language) {\n stats.languages[metadata.language] =\n (stats.languages[metadata.language] || 0) + 1;\n }\n\n if (metadata.framework) {\n stats.frameworks[metadata.framework] =\n (stats.frameworks[metadata.framework] || 0) + 1;\n }\n }\n }\n\n return stats;\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/skills/spec-generator-skill.ts"],
4
- "sourcesContent": ["/**\n * Spec Generator Skill\n * Generates iterative spec documents: ONE_PAGER \u2192 DEV_SPEC \u2192 PROMPT_PLAN \u2192 AGENTS.md\n * Progressive context \u2014 later docs read earlier ones from disk.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { SkillContext, SkillResult } from './claude-skills.js';\nimport { logger } from '../core/monitoring/logger.js';\n\nexport type SpecType = 'one-pager' | 'dev-spec' | 'prompt-plan' | 'agents';\n\ninterface SpecConfig {\n filename: string;\n title: string;\n sections: string[];\n inputs: SpecType[]; // earlier docs this type reads\n}\n\nconst SPEC_DIR = 'docs/specs';\n\nconst SPEC_CONFIGS: Record<SpecType, SpecConfig> = {\n 'one-pager': {\n filename: 'ONE_PAGER.md',\n title: 'One-Pager',\n sections: [\n 'Problem',\n 'Audience',\n 'Platform',\n 'Core Flow',\n 'MVP Features',\n 'Non-Goals',\n 'Metrics',\n ],\n inputs: [],\n },\n 'dev-spec': {\n filename: 'DEV_SPEC.md',\n title: 'Development Specification',\n sections: [\n 'Architecture',\n 'Tech Stack',\n 'API Contracts',\n 'Data Models',\n 'Auth',\n 'Error Handling',\n 'Deployment',\n ],\n inputs: ['one-pager'],\n },\n 'prompt-plan': {\n filename: 'PROMPT_PLAN.md',\n title: 'Prompt Plan',\n sections: [\n 'Stage A: Project Setup',\n 'Stage B: Core Data Models',\n 'Stage C: API Layer',\n 'Stage D: Business Logic',\n 'Stage E: Frontend / UI',\n 'Stage F: Integration & Testing',\n 'Stage G: Deploy & Polish',\n ],\n inputs: ['one-pager', 'dev-spec'],\n },\n agents: {\n filename: 'AGENTS.md',\n title: 'AGENTS.md',\n sections: [\n 'Repo Files',\n 'Responsibilities',\n 'Guardrails',\n 'Testing',\n 'When to Ask',\n ],\n inputs: ['one-pager', 'dev-spec', 'prompt-plan'],\n },\n};\n\n// --- Templates ---\n\nfunction onePagerTemplate(title: string): string {\n return `# ${title} \u2014 One-Pager\n\n## Problem\n<!-- What problem does this solve? Who has this problem? -->\n\n## Audience\n<!-- Primary users and their context -->\n\n## Platform\n<!-- Web / Mobile / CLI / API \u2014 and why -->\n\n## Core Flow\n<!-- Happy-path user journey in 3-5 steps -->\n1.\n2.\n3.\n\n## MVP Features\n<!-- Minimum set of features for first release -->\n- [ ]\n- [ ]\n- [ ]\n\n## Non-Goals\n<!-- Explicitly out of scope for MVP -->\n-\n\n## Metrics\n<!-- How will you measure success? -->\n-\n`;\n}\n\nfunction devSpecTemplate(title: string, onePagerContent: string): string {\n return `# ${title} \u2014 Development Specification\n\n> Generated from ONE_PAGER.md\n\n<details><summary>Source: ONE_PAGER.md</summary>\n\n${onePagerContent}\n\n</details>\n\n## Architecture\n<!-- High-level system diagram / component breakdown -->\n\n## Tech Stack\n<!-- Languages, frameworks, databases, infra -->\n| Layer | Choice | Rationale |\n|-------|--------|-----------|\n| Frontend | | |\n| Backend | | |\n| Database | | |\n| Hosting | | |\n\n## API Contracts\n<!-- Key endpoints with request/response shapes -->\n\n## Data Models\n<!-- Core entities and relationships -->\n\n## Auth\n<!-- Authentication and authorization strategy -->\n\n## Error Handling\n<!-- Error codes, retry strategies, user-facing messages -->\n\n## Deployment\n<!-- CI/CD, environments, rollback strategy -->\n`;\n}\n\nfunction promptPlanTemplate(\n title: string,\n onePagerContent: string,\n devSpecContent: string\n): string {\n return `# ${title} \u2014 Prompt Plan\n\n> Generated from ONE_PAGER.md and DEV_SPEC.md\n> Each stage has TDD checkboxes \u2014 check off as tasks complete.\n\n<details><summary>Source: ONE_PAGER.md</summary>\n\n${onePagerContent}\n\n</details>\n\n<details><summary>Source: DEV_SPEC.md</summary>\n\n${devSpecContent}\n\n</details>\n\n## Stage A: Project Setup\n- [ ] Initialize repository and tooling\n- [ ] Configure CI/CD pipeline\n- [ ] Set up development environment\n\n## Stage B: Core Data Models\n- [ ] Define database schema\n- [ ] Create model layer\n- [ ] Write model tests\n\n## Stage C: API Layer\n- [ ] Implement API endpoints\n- [ ] Add input validation\n- [ ] Write API tests\n\n## Stage D: Business Logic\n- [ ] Implement core business rules\n- [ ] Add edge case handling\n- [ ] Write integration tests\n\n## Stage E: Frontend / UI\n- [ ] Build core UI components\n- [ ] Implement user flows\n- [ ] Write UI tests\n\n## Stage F: Integration & Testing\n- [ ] End-to-end test suite\n- [ ] Performance testing\n- [ ] Security audit\n\n## Stage G: Deploy & Polish\n- [ ] Production deployment\n- [ ] Monitoring and alerting\n- [ ] Documentation\n`;\n}\n\nfunction agentsTemplate(title: string, inputs: Record<string, string>): string {\n const sourceBlocks = Object.entries(inputs)\n .map(\n ([name, content]) =>\n `<details><summary>Source: ${name}</summary>\\n\\n${content}\\n\\n</details>`\n )\n .join('\\n\\n');\n\n return `# ${title} \u2014 AGENTS.md\n\n> Auto-generated agent configuration for Claude Code / Cursor / Windsurf.\n\n${sourceBlocks}\n\n## Repo Files\n<!-- Key files and their purpose -->\n| File | Purpose |\n|------|---------|\n| | |\n\n## Responsibilities\n<!-- What this agent should and shouldn't do -->\n### DO\n-\n\n### DON'T\n-\n\n## Guardrails\n<!-- Safety constraints and limits -->\n- Never commit secrets or credentials\n- Always run tests before committing\n- Keep changes focused and atomic\n\n## Testing\n<!-- How to validate changes -->\n\\`\\`\\`bash\nnpm test\nnpm run lint\nnpm run build\n\\`\\`\\`\n\n## When to Ask\n<!-- Situations where the agent should ask for human input -->\n- Architectural changes affecting multiple systems\n- Security-sensitive modifications\n- Breaking API changes\n- Ambiguous requirements\n`;\n}\n\n// --- Skill Class ---\n\nexport class SpecGeneratorSkill {\n private baseDir: string;\n\n constructor(private context: SkillContext) {\n this.baseDir = process.cwd();\n }\n\n /** Generate a spec document by type */\n async generate(\n type: SpecType,\n title: string,\n opts?: { force?: boolean }\n ): Promise<SkillResult> {\n const config = SPEC_CONFIGS[type];\n if (!config) {\n return { success: false, message: `Unknown spec type: ${type}` };\n }\n\n const specDir = path.join(this.baseDir, SPEC_DIR);\n const outputPath = path.join(specDir, config.filename);\n\n // Check if file already exists\n if (fs.existsSync(outputPath) && !opts?.force) {\n return {\n success: false,\n message: `${config.filename} already exists. Use --force to overwrite.`,\n data: { path: outputPath },\n };\n }\n\n // Load input documents (progressive context)\n const inputContents: Record<string, string> = {};\n for (const inputType of config.inputs) {\n const inputConfig = SPEC_CONFIGS[inputType];\n const inputPath = path.join(specDir, inputConfig.filename);\n if (fs.existsSync(inputPath)) {\n inputContents[inputConfig.filename] = fs.readFileSync(\n inputPath,\n 'utf-8'\n );\n }\n }\n\n // Generate content from template\n const content = this.renderTemplate(type, title, inputContents);\n\n // Write file\n fs.mkdirSync(specDir, { recursive: true });\n fs.writeFileSync(outputPath, content, 'utf-8');\n\n logger.info(`Generated spec: ${config.filename}`, { type, title });\n\n return {\n success: true,\n message: `Created ${config.filename}`,\n data: {\n path: outputPath,\n type,\n sections: config.sections,\n inputsUsed: Object.keys(inputContents),\n },\n action: `Generated ${SPEC_DIR}/${config.filename}`,\n };\n }\n\n /** List existing spec documents */\n async list(): Promise<SkillResult> {\n const specDir = path.join(this.baseDir, SPEC_DIR);\n const specs: Array<{\n type: SpecType;\n filename: string;\n exists: boolean;\n path: string;\n }> = [];\n\n for (const [type, config] of Object.entries(SPEC_CONFIGS)) {\n const filePath = path.join(specDir, config.filename);\n specs.push({\n type: type as SpecType,\n filename: config.filename,\n exists: fs.existsSync(filePath),\n path: filePath,\n });\n }\n\n const existing = specs.filter((s) => s.exists);\n const missing = specs.filter((s) => !s.exists);\n\n return {\n success: true,\n message: `${existing.length}/${specs.length} specs exist`,\n data: { specs, existing, missing },\n };\n }\n\n /** Update a spec \u2014 primarily for checking off PROMPT_PLAN items */\n async update(filePath: string, changes: string): Promise<SkillResult> {\n const resolvedPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath);\n\n if (!fs.existsSync(resolvedPath)) {\n return { success: false, message: `File not found: ${resolvedPath}` };\n }\n\n let content = fs.readFileSync(resolvedPath, 'utf-8');\n\n // Parse checkbox updates: \"Stage A:1\" means check item 1 in Stage A\n const checkboxPattern = /^(Stage [A-G])(?::(\\d+))?$/;\n const match = changes.match(checkboxPattern);\n\n if (match) {\n const [, stageName, itemNum] = match;\n content = this.checkItem(\n content,\n stageName,\n itemNum ? parseInt(itemNum) : undefined\n );\n } else {\n // Treat as direct checkbox text match: find \"- [ ] <changes>\" and check it\n const escaped = changes.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const re = new RegExp(`- \\\\[ \\\\] ${escaped}`, 'i');\n if (re.test(content)) {\n content = content.replace(re, `- [x] ${changes}`);\n } else {\n return {\n success: false,\n message: `No unchecked item matching \"${changes}\" found`,\n };\n }\n }\n\n // Append changelog entry\n const timestamp = new Date().toISOString().slice(0, 19).replace('T', ' ');\n const changelog = `\\n<!-- Updated: ${timestamp} | ${changes} -->\\n`;\n content += changelog;\n\n fs.writeFileSync(resolvedPath, content, 'utf-8');\n\n logger.info('Updated spec', { path: resolvedPath, changes });\n\n return {\n success: true,\n message: `Updated: ${changes}`,\n data: { path: resolvedPath, changes },\n action: `Checked off item in ${path.basename(resolvedPath)}`,\n };\n }\n\n /** Validate completeness of a spec */\n async validate(filePath: string): Promise<SkillResult> {\n const resolvedPath = path.isAbsolute(filePath)\n ? filePath\n : path.join(this.baseDir, filePath);\n\n if (!fs.existsSync(resolvedPath)) {\n return { success: false, message: `File not found: ${resolvedPath}` };\n }\n\n const content = fs.readFileSync(resolvedPath, 'utf-8');\n\n // Count checkboxes\n const unchecked = (content.match(/- \\[ \\]/g) || []).length;\n const checked = (content.match(/- \\[x\\]/gi) || []).length;\n const total = checked + unchecked;\n\n // Check for empty sections (## header followed by only whitespace/comments)\n const emptySections: string[] = [];\n const sectionRegex = /^## (.+)$/gm;\n let sectionMatch;\n\n while ((sectionMatch = sectionRegex.exec(content)) !== null) {\n const sectionName = sectionMatch[1];\n const sectionStart = content.indexOf(sectionMatch[0]);\n const nextSection = content.indexOf('\\n## ', sectionStart + 1);\n const sectionContent =\n nextSection === -1\n ? content.slice(sectionStart + sectionMatch[0].length)\n : content.slice(sectionStart + sectionMatch[0].length, nextSection);\n\n // Strip comments and whitespace\n const stripped = sectionContent\n .replace(/<!--.*?-->/gs, '')\n .replace(/\\s+/g, '')\n .trim();\n\n if (stripped.length === 0 || stripped === '||') {\n emptySections.push(sectionName);\n }\n }\n\n const isComplete = unchecked === 0 && emptySections.length === 0;\n\n return {\n success: true,\n message: isComplete\n ? 'Spec is complete'\n : `Spec incomplete: ${unchecked} unchecked items, ${emptySections.length} empty sections`,\n data: {\n path: resolvedPath,\n checkboxes: { checked, unchecked, total },\n emptySections,\n isComplete,\n completionPercent:\n total > 0 ? Math.round((checked / total) * 100) : 100,\n },\n };\n }\n\n // --- Private helpers ---\n\n private renderTemplate(\n type: SpecType,\n title: string,\n inputs: Record<string, string>\n ): string {\n switch (type) {\n case 'one-pager':\n return onePagerTemplate(title);\n\n case 'dev-spec':\n return devSpecTemplate(\n title,\n inputs['ONE_PAGER.md'] ||\n '*ONE_PAGER.md not found \u2014 generate it first.*'\n );\n\n case 'prompt-plan':\n return promptPlanTemplate(\n title,\n inputs['ONE_PAGER.md'] || '*ONE_PAGER.md not found*',\n inputs['DEV_SPEC.md'] ||\n '*DEV_SPEC.md not found \u2014 generate it first.*'\n );\n\n case 'agents':\n return agentsTemplate(title, inputs);\n\n default:\n return `# ${title}\\n\\nUnknown spec type: ${type}\\n`;\n }\n }\n\n /** Check off a specific checkbox item in a stage */\n private checkItem(\n content: string,\n stageName: string,\n itemIndex?: number\n ): string {\n const lines = content.split('\\n');\n let inStage = false;\n let itemCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n // Detect stage header\n if (lines[i].startsWith('## ') && lines[i].includes(stageName)) {\n inStage = true;\n itemCount = 0;\n continue;\n }\n\n // Exit stage on next header\n if (inStage && lines[i].startsWith('## ')) {\n break;\n }\n\n // Process checkbox\n if (inStage && lines[i].match(/^- \\[ \\]/)) {\n itemCount++;\n if (itemIndex === undefined || itemCount === itemIndex) {\n lines[i] = lines[i].replace('- [ ]', '- [x]');\n if (itemIndex !== undefined) break;\n }\n }\n }\n\n return lines.join('\\n');\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/skills/unified-rlm-orchestrator.ts"],
4
- "sourcesContent": ["/**\n * Unified RLM-First Orchestrator for StackMemory\n *\n * All skills and tasks flow through RLM orchestration first,\n * ensuring consistent decomposition, parallel execution, and quality control.\n */\n\nimport {\n RecursiveAgentOrchestrator,\n type RLMOptions,\n type SubagentType,\n type ExecutionResult,\n type TaskNode,\n} from './recursive-agent-orchestrator.js';\nimport {\n ClaudeSkillsManager,\n type SkillContext,\n type SkillResult,\n} from './claude-skills.js';\nimport { logger } from '../core/monitoring/logger.js';\nimport type { DualStackManager } from '../core/context/dual-stack-manager.js';\nimport type { ContextRetriever } from '../core/retrieval/context-retriever.js';\nimport type { FrameManager } from '../core/context/index.js';\nimport type { LinearTaskManager } from '../features/tasks/linear-task-manager.js';\n\n// Skill to RLM mapping configuration\ninterface SkillToRLMConfig {\n skillName: string;\n primaryAgent: SubagentType;\n secondaryAgents?: SubagentType[];\n taskTemplate: string;\n defaultOptions?: Partial<RLMOptions>;\n preprocessor?: (\n args: string[],\n options: Record<string, unknown>\n ) => { task: string; context: Record<string, unknown> };\n postprocessor?: (result: ExecutionResult) => SkillResult;\n}\n\n/**\n * UnifiedRLMOrchestrator - Routes all skills through RLM first\n */\nexport class UnifiedRLMOrchestrator {\n private rlmOrchestrator: RecursiveAgentOrchestrator;\n private skillsManager: ClaudeSkillsManager;\n private skillMappings: Map<string, SkillToRLMConfig>;\n\n constructor(\n frameManager: FrameManager,\n dualStackManager: DualStackManager,\n contextRetriever: ContextRetriever,\n taskStore: LinearTaskManager,\n skillContext: SkillContext\n ) {\n // Initialize RLM orchestrator\n this.rlmOrchestrator = new RecursiveAgentOrchestrator(\n frameManager,\n dualStackManager,\n contextRetriever,\n taskStore\n );\n\n // Initialize skills manager (for legacy compatibility)\n this.skillsManager = new ClaudeSkillsManager(skillContext);\n\n // Initialize skill mappings\n this.skillMappings = this.initializeSkillMappings();\n\n logger.info('Unified RLM Orchestrator initialized with RLM-first routing');\n }\n\n /**\n * Initialize skill to RLM agent mappings\n */\n private initializeSkillMappings(): Map<string, SkillToRLMConfig> {\n const mappings = new Map<string, SkillToRLMConfig>();\n\n // Handoff skill -> Context + Planning agents\n mappings.set('handoff', {\n skillName: 'handoff',\n primaryAgent: 'context',\n secondaryAgents: ['planning'],\n taskTemplate:\n 'Prepare comprehensive handoff to {targetUser}: {message}. Extract relevant context, identify dependencies, and create actionable items.',\n defaultOptions: {\n maxParallel: 3,\n reviewStages: 1,\n shareContextRealtime: true,\n },\n preprocessor: (args, options) => ({\n task: `Handoff to ${args[0]}: ${args[1]}`,\n context: {\n targetUser: args[0],\n message: args[1],\n priority: options.priority || 'medium',\n frames: options.frames || [],\n },\n }),\n postprocessor: (result) => ({\n success: result.success,\n message: `Handoff ${result.success ? 'completed' : 'failed'}`,\n data: result.rootNode.result,\n }),\n });\n\n // Checkpoint skill -> Context + Code agents\n mappings.set('checkpoint', {\n skillName: 'checkpoint',\n primaryAgent: 'context',\n secondaryAgents: ['code'],\n taskTemplate:\n 'Create recovery checkpoint: {description}. Capture current state, identify risky operations, and backup critical files.',\n defaultOptions: {\n maxParallel: 2,\n reviewStages: 0,\n verboseLogging: false,\n },\n preprocessor: (args, options) => ({\n task: `${args[0]} checkpoint: ${args[1]}`,\n context: {\n operation: args[0],\n description: args[1],\n ...options,\n },\n }),\n });\n\n // Dig skill -> Context agent (deep search)\n mappings.set('dig', {\n skillName: 'dig',\n primaryAgent: 'context',\n taskTemplate:\n 'Deep archaeological search: {query}. Analyze patterns, extract decisions, and build timeline.',\n defaultOptions: {\n maxParallel: 1,\n maxTokensPerAgent: 50000,\n reviewStages: 0,\n },\n preprocessor: (args, options) => ({\n task: `Archaeological dig: ${args[0]}`,\n context: {\n query: args[0],\n depth: options.depth || '30days',\n patterns: options.patterns,\n decisions: options.decisions,\n timeline: options.timeline,\n },\n }),\n });\n\n // Lint skill -> Linting agent primarily\n mappings.set('lint', {\n skillName: 'lint',\n primaryAgent: 'linting',\n secondaryAgents: ['improve'],\n taskTemplate:\n 'Comprehensive linting of {path}: Check syntax, types, formatting, security, performance, and dead code. Provide fixes.',\n defaultOptions: {\n maxParallel: 1,\n reviewStages: 0,\n verboseLogging: true,\n },\n preprocessor: (args, options) => ({\n task: `Lint ${args[0] || 'current directory'}`,\n context: {\n path: args[0] || process.cwd(),\n fix: options.fix,\n focus: options.security\n ? 'security'\n : options.performance\n ? 'performance'\n : 'all',\n },\n }),\n postprocessor: (result) => {\n const lintingNode = this.findNodeByAgent(result.rootNode, 'linting');\n return {\n success: result.success,\n message: `Found ${result.issuesFound} issues, fixed ${result.issuesFixed}`,\n data: {\n issues: lintingNode?.result?.issues || [],\n fixes: lintingNode?.result?.fixes || [],\n stats: {\n found: result.issuesFound,\n fixed: result.issuesFixed,\n duration: result.duration,\n },\n },\n };\n },\n });\n\n // Test generation -> Testing agent\n mappings.set('test', {\n skillName: 'test',\n primaryAgent: 'testing',\n secondaryAgents: ['code', 'review'],\n taskTemplate:\n 'Generate comprehensive {testMode} tests for {target}. Ensure high coverage and meaningful assertions.',\n defaultOptions: {\n maxParallel: 3,\n testGenerationMode: 'all',\n reviewStages: 2,\n qualityThreshold: 0.9,\n },\n preprocessor: (args, options) => ({\n task: `Generate tests for ${args[0] || 'project'}`,\n context: {\n target: args[0] || process.cwd(),\n testMode: options.mode || 'all',\n coverage: options.coverage || 'high',\n },\n }),\n });\n\n // Code review -> Review + Improve agents\n mappings.set('review', {\n skillName: 'review',\n primaryAgent: 'review',\n secondaryAgents: ['improve', 'testing'],\n taskTemplate:\n 'Multi-stage code review of {target}. Analyze architecture, quality, performance, security. Suggest improvements.',\n defaultOptions: {\n maxParallel: 2,\n reviewStages: 3,\n qualityThreshold: 0.85,\n verboseLogging: true,\n },\n preprocessor: (args, options) => ({\n task: `Review code in ${args[0] || 'project'}`,\n context: {\n target: args[0] || process.cwd(),\n focus: options.focus || 'all',\n autofix: options.fix || false,\n },\n }),\n });\n\n // Refactor -> Code + Review + Improve agents\n mappings.set('refactor', {\n skillName: 'refactor',\n primaryAgent: 'code',\n secondaryAgents: ['review', 'improve', 'testing'],\n taskTemplate:\n 'Refactor {target}: Improve architecture, reduce complexity, enhance maintainability. Preserve functionality.',\n defaultOptions: {\n maxParallel: 4,\n reviewStages: 2,\n qualityThreshold: 0.9,\n testGenerationMode: 'unit',\n },\n preprocessor: (args, options) => ({\n task: `Refactor ${args[0] || 'codebase'}`,\n context: {\n target: args[0] || process.cwd(),\n scope: options.scope || 'moderate',\n preserveApi: options.preserveApi !== false,\n },\n }),\n });\n\n // Deploy/Publish -> Publish agent\n mappings.set('publish', {\n skillName: 'publish',\n primaryAgent: 'publish',\n secondaryAgents: ['testing', 'linting'],\n taskTemplate:\n 'Prepare and execute {publishType} release. Run tests, update versions, generate changelog, publish.',\n defaultOptions: {\n maxParallel: 1,\n reviewStages: 1,\n testGenerationMode: 'all',\n },\n preprocessor: (args, options) => ({\n task: `Publish ${options.type || 'npm'} release`,\n context: {\n version: args[0],\n publishType: options.type || 'npm',\n prerelease: options.prerelease || false,\n skipTests: options.skipTests || false,\n },\n }),\n });\n\n return mappings;\n }\n\n /**\n * Execute any skill through RLM orchestration first\n */\n async executeSkill(\n skillName: string,\n args: string[],\n options?: Record<string, unknown>\n ): Promise<SkillResult> {\n logger.info(`Executing skill through RLM: ${skillName}`, { args, options });\n\n // Check if skill has RLM mapping\n const mapping = this.skillMappings.get(skillName);\n\n if (mapping) {\n // Route through RLM orchestrator\n return this.executeViaRLM(mapping, args, options || {});\n }\n\n // Special case: Direct RLM execution\n if (skillName === 'rlm') {\n const task = args.join(' ') || 'Analyze and optimize current code';\n const result = await this.rlmOrchestrator.execute(\n task,\n options || {},\n options as RLMOptions\n );\n return {\n success: result.success,\n message: `RLM execution ${result.success ? 'completed' : 'failed'}`,\n data: result,\n };\n }\n\n // Fallback to legacy skill manager for unmapped skills\n logger.warn(`Skill ${skillName} not mapped to RLM, using legacy execution`);\n return this.skillsManager.executeSkill(skillName, args, options);\n }\n\n /**\n * Execute skill via RLM orchestration\n */\n private async executeViaRLM(\n mapping: SkillToRLMConfig,\n args: string[],\n options: Record<string, unknown>\n ): Promise<SkillResult> {\n try {\n // Preprocess arguments\n const { task, context } = mapping.preprocessor\n ? mapping.preprocessor(args, options)\n : {\n task: mapping.taskTemplate.replace('{args}', args.join(' ')),\n context: { args, ...options },\n };\n\n // Merge options\n const rlmOptions: RLMOptions = {\n ...mapping.defaultOptions,\n ...options,\n // Force specific agents if specified\n agents: [mapping.primaryAgent, ...(mapping.secondaryAgents || [])],\n };\n\n // Execute through RLM\n const result = await this.rlmOrchestrator.execute(\n task,\n context,\n rlmOptions\n );\n\n // Postprocess result\n if (mapping.postprocessor) {\n return mapping.postprocessor(result);\n }\n\n // Default postprocessing\n return {\n success: result.success,\n message: `${mapping.skillName} ${result.success ? 'completed' : 'failed'}`,\n data: {\n duration: result.duration,\n tokens: result.totalTokens,\n cost: result.totalCost,\n improvements: result.improvements,\n testsGenerated: result.testsGenerated,\n issuesFound: result.issuesFound,\n issuesFixed: result.issuesFixed,\n details: result.rootNode,\n },\n };\n } catch (error) {\n logger.error(`RLM execution failed for ${mapping.skillName}:`, error);\n return {\n success: false,\n message: `Failed to execute ${mapping.skillName}: ${error.message}`,\n };\n }\n }\n\n /**\n * Helper: Find node by agent type in task tree\n */\n private findNodeByAgent(\n node: TaskNode,\n agentType: SubagentType\n ): TaskNode | null {\n if (node.agent === agentType) {\n return node;\n }\n if (node.children) {\n for (const child of node.children) {\n const found = this.findNodeByAgent(child, agentType);\n if (found) return found;\n }\n }\n return null;\n }\n\n /**\n * Get available skills (all RLM-mapped + legacy)\n */\n getAvailableSkills(): string[] {\n const rlmSkills = Array.from(this.skillMappings.keys());\n const legacySkills = this.skillsManager.getAvailableSkills();\n const allSkills = new Set([...rlmSkills, ...legacySkills, 'rlm']);\n return Array.from(allSkills);\n }\n\n /**\n * Get skill help\n */\n getSkillHelp(skillName: string): string {\n const mapping = this.skillMappings.get(skillName);\n if (mapping) {\n return `\n${skillName} (RLM-Orchestrated)\nPrimary Agent: ${mapping.primaryAgent}\nSecondary Agents: ${mapping.secondaryAgents?.join(', ') || 'none'}\n\n${mapping.taskTemplate}\n\nThis skill is executed through RLM orchestration for:\n- Automatic task decomposition\n- Parallel agent execution\n- Multi-stage quality review\n- Comprehensive result aggregation\n`;\n }\n\n // Fallback to legacy help\n return this.skillsManager.getSkillHelp(skillName);\n }\n\n /**\n * Execute task with intelligent routing\n */\n async executeTask(\n task: string,\n context?: Record<string, unknown>\n ): Promise<SkillResult> {\n // Analyze task to determine best skill/agent combination\n const taskAnalysis = this.analyzeTask(task);\n\n if (taskAnalysis.suggestedSkill) {\n // Route to specific skill\n return this.executeSkill(\n taskAnalysis.suggestedSkill,\n taskAnalysis.args,\n taskAnalysis.options\n );\n }\n\n // Direct RLM execution for complex/ambiguous tasks\n const result = await this.rlmOrchestrator.execute(task, context || {}, {\n maxParallel: 5,\n reviewStages: 2,\n qualityThreshold: 0.85,\n verboseLogging: true,\n });\n\n return {\n success: result.success,\n message: `Task ${result.success ? 'completed' : 'failed'}`,\n data: result,\n };\n }\n\n /**\n * Analyze task to determine best routing\n */\n private analyzeTask(task: string): {\n suggestedSkill?: string;\n args: string[];\n options: Record<string, unknown>;\n } {\n const taskLower = task.toLowerCase();\n\n // Pattern matching for skill detection\n const patterns = [\n { pattern: /lint|format|style|quality/i, skill: 'lint' },\n { pattern: /test|coverage|unit|integration/i, skill: 'test' },\n { pattern: /review|analyze|improve/i, skill: 'review' },\n { pattern: /refactor|restructure|clean/i, skill: 'refactor' },\n { pattern: /handoff|transfer|pass/i, skill: 'handoff' },\n { pattern: /checkpoint|backup|save/i, skill: 'checkpoint' },\n { pattern: /search|find|dig|history/i, skill: 'dig' },\n { pattern: /publish|release|deploy/i, skill: 'publish' },\n ];\n\n for (const { pattern, skill } of patterns) {\n if (pattern.test(taskLower)) {\n return {\n suggestedSkill: skill,\n args: [task],\n options: {},\n };\n }\n }\n\n // No specific skill detected\n return {\n args: [task],\n options: {},\n };\n }\n}\n\n/**\n * Singleton instance for global access\n */\nlet unifiedOrchestrator: UnifiedRLMOrchestrator | null = null;\n\nexport function initializeUnifiedOrchestrator(\n frameManager: FrameManager,\n dualStackManager: DualStackManager,\n contextRetriever: ContextRetriever,\n taskStore: LinearTaskManager,\n skillContext: SkillContext\n): UnifiedRLMOrchestrator {\n if (!unifiedOrchestrator) {\n unifiedOrchestrator = new UnifiedRLMOrchestrator(\n frameManager,\n dualStackManager,\n contextRetriever,\n taskStore,\n skillContext\n );\n }\n return unifiedOrchestrator;\n}\n\nexport function getUnifiedOrchestrator(): UnifiedRLMOrchestrator | null {\n return unifiedOrchestrator;\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/utils/env.ts"],
4
- "sourcesContent": ["/**\n * Shared environment variable utilities\n */\n\nexport function getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (!value && !defaultValue) {\n throw new Error(`Environment variable ${key} is required but not set`);\n }\n return value || defaultValue || '';\n}\n\nexport function getOptionalEnv(\n key: string,\n defaultValue?: string\n): string | undefined {\n return process.env[key] || defaultValue;\n}\n\nexport function getRequiredEnv(key: string): string {\n const value = process.env[key];\n if (!value) {\n throw new Error(`Environment variable ${key} is required but not set`);\n }\n return value;\n}\n\nexport function getBooleanEnv(\n key: string,\n defaultValue: boolean = false\n): boolean {\n const value = process.env[key];\n if (!value) return defaultValue;\n return value.toLowerCase() === 'true' || value === '1';\n}\n\nexport function getNumberEnv(key: string, defaultValue?: number): number {\n const value = process.env[key];\n if (!value) {\n if (defaultValue === undefined) {\n throw new Error(`Environment variable ${key} is required but not set`);\n }\n return defaultValue;\n }\n const num = parseInt(value, 10);\n if (isNaN(num)) {\n throw new Error(\n `Environment variable ${key} must be a number, got: ${value}`\n );\n }\n return num;\n}\n"],
5
- "mappings": ";;;;AAIO,SAAS,OAAO,KAAa,cAA+B;AACjE,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,CAAC,SAAS,CAAC,cAAc;AAC3B,UAAM,IAAI,MAAM,wBAAwB,GAAG,0BAA0B;AAAA,EACvE;AACA,SAAO,SAAS,gBAAgB;AAClC;AAEO,SAAS,eACd,KACA,cACoB;AACpB,SAAO,QAAQ,IAAI,GAAG,KAAK;AAC7B;AAEO,SAAS,eAAe,KAAqB;AAClD,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,wBAAwB,GAAG,0BAA0B;AAAA,EACvE;AACA,SAAO;AACT;AAEO,SAAS,cACd,KACA,eAAwB,OACf;AACT,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,YAAY,MAAM,UAAU,UAAU;AACrD;AAEO,SAAS,aAAa,KAAa,cAA+B;AACvE,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,CAAC,OAAO;AACV,QAAI,iBAAiB,QAAW;AAC9B,YAAM,IAAI,MAAM,wBAAwB,GAAG,0BAA0B;AAAA,IACvE;AACA,WAAO;AAAA,EACT;AACA,QAAM,MAAM,SAAS,OAAO,EAAE;AAC9B,MAAI,MAAM,GAAG,GAAG;AACd,UAAM,IAAI;AAAA,MACR,wBAAwB,GAAG,2BAA2B,KAAK;AAAA,IAC7D;AAAA,EACF;AACA,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/utils/formatting.ts"],
4
- "sourcesContent": ["/**\n * Formatting utilities for CLI output\n */\n\n/**\n * Format bytes to human-readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;\n}\n\n/**\n * Format duration in milliseconds to human-readable string\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) {\n return `${days}d ${hours % 24}h`;\n }\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n\n return `${seconds}s`;\n}\n\n/**\n * Format relative time\n */\nexport function formatRelativeTime(timestamp: number): string {\n const now = Date.now();\n const diff = now - timestamp;\n\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days} day${days > 1 ? 's' : ''} ago`;\n if (hours > 0) return `${hours} hour${hours > 1 ? 's' : ''} ago`;\n if (minutes > 0) return `${minutes} minute${minutes > 1 ? 's' : ''} ago`;\n\n return 'just now';\n}\n\n/**\n * Truncate string with ellipsis\n */\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.substring(0, maxLength - 3) + '...';\n}\n\n/**\n * Format percentage\n */\nexport function formatPercent(value: number, total: number): string {\n if (total === 0) return '0%';\n return `${((value / total) * 100).toFixed(1)}%`;\n}\n\n/**\n * Create a simple text progress bar\n */\nexport function createProgressBar(\n value: number,\n max: number,\n width: number = 20\n): string {\n const percent = Math.min(value / max, 1);\n const filled = Math.floor(percent * width);\n const empty = width - filled;\n\n return '\u2588'.repeat(filled) + '\u2591'.repeat(empty);\n}\n"],
5
- "mappings": ";;;;AAOO,SAAS,YAAY,OAAuB;AACjD,MAAI,UAAU,EAAG,QAAO;AAExB,QAAM,IAAI;AACV,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,IAAI;AAC1C,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAElD,SAAO,IAAI,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAC3D;AAKO,SAAS,eAAe,IAAoB;AACjD,MAAI,KAAK,IAAM,QAAO,GAAG,EAAE;AAE3B,QAAM,UAAU,KAAK,MAAM,KAAK,GAAI;AACpC,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAElC,MAAI,OAAO,GAAG;AACZ,WAAO,GAAG,IAAI,KAAK,QAAQ,EAAE;AAAA,EAC/B;AACA,MAAI,QAAQ,GAAG;AACb,WAAO,GAAG,KAAK,KAAK,UAAU,EAAE;AAAA,EAClC;AACA,MAAI,UAAU,GAAG;AACf,WAAO,GAAG,OAAO,KAAK,UAAU,EAAE;AAAA,EACpC;AAEA,SAAO,GAAG,OAAO;AACnB;AAKO,SAAS,mBAAmB,WAA2B;AAC5D,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,OAAO,MAAM;AAEnB,QAAM,UAAU,KAAK,MAAM,OAAO,GAAK;AACvC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAElC,MAAI,OAAO,EAAG,QAAO,GAAG,IAAI,OAAO,OAAO,IAAI,MAAM,EAAE;AACtD,MAAI,QAAQ,EAAG,QAAO,GAAG,KAAK,QAAQ,QAAQ,IAAI,MAAM,EAAE;AAC1D,MAAI,UAAU,EAAG,QAAO,GAAG,OAAO,UAAU,UAAU,IAAI,MAAM,EAAE;AAElE,SAAO;AACT;AAKO,SAAS,SAAS,KAAa,WAA2B;AAC/D,MAAI,IAAI,UAAU,UAAW,QAAO;AACpC,SAAO,IAAI,UAAU,GAAG,YAAY,CAAC,IAAI;AAC3C;AAKO,SAAS,cAAc,OAAe,OAAuB;AAClE,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,IAAK,QAAQ,QAAS,KAAK,QAAQ,CAAC,CAAC;AAC9C;AAKO,SAAS,kBACd,OACA,KACA,QAAgB,IACR;AACR,QAAM,UAAU,KAAK,IAAI,QAAQ,KAAK,CAAC;AACvC,QAAM,SAAS,KAAK,MAAM,UAAU,KAAK;AACzC,QAAM,QAAQ,QAAQ;AAEtB,SAAO,SAAI,OAAO,MAAM,IAAI,SAAI,OAAO,KAAK;AAC9C;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/utils/process-cleanup.ts"],
4
- "sourcesContent": ["/**\n * Process Cleanup Utility\n * Automatically cleans up stale stackmemory processes older than 24h\n * with no recent log activity.\n */\n\nimport { execSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { logger } from '../core/monitoring/logger.js';\n\nexport interface StaleProcess {\n pid: number;\n command: string;\n startTime: Date;\n ageHours: number;\n logFile?: string;\n lastLogActivity?: Date;\n}\n\nexport interface CleanupResult {\n found: StaleProcess[];\n killed: number[];\n errors: Array<{ pid: number; error: string }>;\n}\n\nconst STACKMEMORY_PROCESS_PATTERNS = [\n 'stackmemory',\n 'ralph orchestrate',\n 'ralph swarm',\n 'ralph loop',\n 'hooks start',\n];\n\n/**\n * Get all running stackmemory-related processes\n */\nexport function getStackmemoryProcesses(): StaleProcess[] {\n const processes: StaleProcess[] = [];\n\n try {\n // Get process list with start time (macOS/Linux compatible)\n const psOutput = execSync(\n 'ps -eo pid,lstart,command 2>/dev/null || ps -eo pid,start,args 2>/dev/null',\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n );\n\n const lines = psOutput.trim().split('\\n').slice(1); // Skip header\n\n for (const line of lines) {\n // Check if it's a stackmemory process\n const isStackmemory = STACKMEMORY_PROCESS_PATTERNS.some((pattern) =>\n line.toLowerCase().includes(pattern.toLowerCase())\n );\n\n if (!isStackmemory) continue;\n\n // Parse the line - format varies by OS\n // macOS: PID \"Day Mon DD HH:MM:SS YYYY\" COMMAND\n const match = line.match(\n /^\\s*(\\d+)\\s+(\\w+\\s+\\w+\\s+\\d+\\s+[\\d:]+\\s+\\d+)\\s+(.+)$/\n );\n\n if (match) {\n const pid = parseInt(match[1], 10);\n const startTimeStr = match[2];\n const command = match[3];\n\n // Skip current process\n if (pid === process.pid) continue;\n\n // Parse start time\n const startTime = new Date(startTimeStr);\n const ageMs = Date.now() - startTime.getTime();\n const ageHours = ageMs / (1000 * 60 * 60);\n\n processes.push({\n pid,\n command: command.slice(0, 100), // Truncate long commands\n startTime,\n ageHours,\n });\n }\n }\n } catch (error) {\n logger.warn('Failed to get process list:', error);\n }\n\n return processes;\n}\n\n/**\n * Check if a process has recent log activity\n */\nfunction hasRecentLogActivity(\n proc: StaleProcess,\n maxAgeHours: number\n): boolean {\n const logDir = path.join(os.homedir(), '.stackmemory', 'logs');\n\n if (!fs.existsSync(logDir)) return false;\n\n try {\n // Look for log files that might be related to this process\n const logFiles = fs.readdirSync(logDir).filter((f) => f.endsWith('.log'));\n\n for (const logFile of logFiles) {\n const logPath = path.join(logDir, logFile);\n const stats = fs.statSync(logPath);\n const logAgeHours = (Date.now() - stats.mtimeMs) / (1000 * 60 * 60);\n\n if (logAgeHours < maxAgeHours) {\n // Check if log contains this PID\n try {\n const content = fs.readFileSync(logPath, 'utf-8').slice(-10000); // Last 10KB\n if (\n content.includes(`pid:${proc.pid}`) ||\n content.includes(`PID ${proc.pid}`)\n ) {\n proc.logFile = logPath;\n proc.lastLogActivity = stats.mtime;\n return true;\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n } catch (error) {\n logger.warn('Failed to check log activity:', error);\n }\n\n return false;\n}\n\n/**\n * Find stale processes older than specified hours with no recent log activity\n */\nexport function findStaleProcesses(maxAgeHours: number = 24): StaleProcess[] {\n const allProcesses = getStackmemoryProcesses();\n\n return allProcesses.filter((proc) => {\n // Must be older than threshold\n if (proc.ageHours < maxAgeHours) return false;\n\n // Check for recent log activity\n if (hasRecentLogActivity(proc, maxAgeHours)) return false;\n\n return true;\n });\n}\n\n/**\n * Kill stale processes\n */\nexport function killStaleProcesses(\n processes: StaleProcess[],\n dryRun: boolean = false\n): CleanupResult {\n const result: CleanupResult = {\n found: processes,\n killed: [],\n errors: [],\n };\n\n for (const proc of processes) {\n if (dryRun) {\n logger.info(`[DRY RUN] Would kill PID ${proc.pid}: ${proc.command}`);\n continue;\n }\n\n try {\n process.kill(proc.pid, 'SIGTERM');\n result.killed.push(proc.pid);\n logger.info(`Killed stale process ${proc.pid}: ${proc.command}`);\n } catch (error: unknown) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ESRCH') {\n // Process already dead\n result.killed.push(proc.pid);\n } else {\n result.errors.push({\n pid: proc.pid,\n error: err.message || 'Unknown error',\n });\n logger.warn(`Failed to kill PID ${proc.pid}:`, err.message);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Main cleanup function\n */\nexport function cleanupStaleProcesses(\n options: {\n maxAgeHours?: number;\n dryRun?: boolean;\n } = {}\n): CleanupResult {\n const { maxAgeHours = 24, dryRun = false } = options;\n\n logger.info(`Looking for stale processes older than ${maxAgeHours}h...`);\n\n const staleProcesses = findStaleProcesses(maxAgeHours);\n\n if (staleProcesses.length === 0) {\n logger.info('No stale processes found');\n return { found: [], killed: [], errors: [] };\n }\n\n logger.info(`Found ${staleProcesses.length} stale process(es)`);\n\n return killStaleProcesses(staleProcesses, dryRun);\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,186 +0,0 @@
1
- # StackMemory Pre-Publish Test Suite
2
-
3
- This directory contains comprehensive tests for validating StackMemory installation and functionality before publishing to npm.
4
-
5
- ## Test Scripts
6
-
7
- ### 1. `test-installation.sh`
8
- **Main pre-publish validation suite**
9
- - Tests CLI build and compilation
10
- - Validates package.json structure
11
- - Checks shell integration setup
12
- - Validates binary functionality
13
- - Tests fresh installation simulation
14
- - Runs security audits
15
-
16
- **Usage:**
17
- ```bash
18
- npm run test:install
19
- # or
20
- ./scripts/test-installation.sh
21
- ```
22
-
23
- ### 2. `test-shell-integration.sh`
24
- **Shell integration specific tests**
25
- - Validates all binaries exist and are executable
26
- - Tests individual binary functionality
27
- - Checks shell integration file syntax
28
- - Validates PATH configuration
29
- - Tests for startup errors
30
-
31
- **Usage:**
32
- ```bash
33
- npm run test:shell
34
- # or
35
- ./scripts/test-shell-integration.sh
36
- ```
37
-
38
- ### 3. `test-installation-scenarios.sh`
39
- **Real-world installation scenario tests**
40
- - Tests global installation
41
- - Tests local project installation
42
- - Tests permission scenarios
43
- - Tests Node.js version compatibility
44
- - Tests package integrity
45
- - Tests upgrade scenarios
46
-
47
- **Usage:**
48
- ```bash
49
- npm run test:scenarios
50
- # or
51
- ./scripts/test-installation-scenarios.sh
52
- ```
53
-
54
- ## Complete Pre-Publish Test Suite
55
-
56
- Run all tests before publishing:
57
-
58
- ```bash
59
- npm run test:pre-publish
60
- ```
61
-
62
- This runs all three test suites in sequence and must pass before `npm publish` can succeed.
63
-
64
- ## Test Components Validated
65
-
66
- ### CLI Functionality
67
- - ✅ Build completes without errors
68
- - ✅ CLI executable works (`stackmemory --version`, `stackmemory --help`)
69
- - ✅ Core commands load without module resolution errors
70
- - ✅ TypeScript compilation succeeds
71
- - ✅ Linting passes
72
-
73
- ### Shell Integration
74
- - ✅ `~/.stackmemory/bin/` directory and binaries exist
75
- - ✅ `stackmemory-daemon` functionality (start, stop, status)
76
- - ✅ `stackmemory-monitor` configuration management
77
- - ✅ `sm-review` context review functionality
78
- - ✅ `stackmemory` wrapper delegates properly
79
- - ✅ Shell integration files can be sourced without errors
80
- - ✅ PATH configuration includes StackMemory binaries
81
-
82
- ### Package & Installation
83
- - ✅ package.json structure is valid
84
- - ✅ npm pack succeeds
85
- - ✅ Fresh installation simulation works
86
- - ✅ Global and local installation scenarios
87
- - ✅ Permission handling
88
- - ✅ Node.js compatibility (18, 20, 21, 22)
89
- - ✅ Package integrity validation
90
- - ✅ Postinstall setup execution
91
- - ✅ Upgrade scenarios
92
-
93
- ### Security
94
- - ✅ Dependencies security audit passes
95
- - ✅ No high-severity vulnerabilities
96
- - ✅ Git working directory is clean
97
-
98
- ## Integration with npm
99
-
100
- The test suite is integrated with npm lifecycle hooks:
101
-
102
- ```json
103
- {
104
- "scripts": {
105
- "prepublishOnly": "npm run build && npm run test:pre-publish"
106
- }
107
- }
108
- ```
109
-
110
- This ensures that:
111
- 1. All tests must pass before any `npm publish` command succeeds
112
- 2. The package is built fresh before testing
113
- 3. Installation scenarios are validated in clean environments
114
-
115
- ## Test Output
116
-
117
- Each test script provides colored output:
118
- - 🔵 **INFO**: Test execution information
119
- - 🟢 **PASS**: Test passed successfully
120
- - 🔴 **FAIL**: Test failed with error details
121
- - 🟡 **WARN**: Warning or non-critical issue
122
-
123
- Example output:
124
- ```
125
- ============================================
126
- StackMemory Pre-Publish Test Suite
127
- ============================================
128
-
129
- 🔨 Build & Compilation Tests
130
- [PASS] Build succeeds without errors
131
- [PASS] TypeScript compilation check
132
- [PASS] Lint check passes
133
-
134
- ⚡ CLI Functionality Tests
135
- [PASS] CLI is executable
136
- [PASS] CLI help displays correctly
137
- [PASS] CLI commands load without errors
138
-
139
- 📦 Package Validation Tests
140
- [PASS] package.json structure valid
141
- [PASS] npm pack succeeds
142
- [PASS] Git status is clean
143
-
144
- ✅ All tests passed! Ready for npm publish.
145
- ```
146
-
147
- ## Troubleshooting Failed Tests
148
-
149
- ### Build Failures
150
- - Check TypeScript errors: `npm run build`
151
- - Fix linting issues: `npm run lint:fix`
152
- - Ensure all dependencies are installed: `npm install`
153
-
154
- ### CLI Failures
155
- - Verify dist/cli/index.js exists and is executable
156
- - Check for missing ES module import extensions (.js)
157
- - Ensure all imported modules exist in the build
158
-
159
- ### Shell Integration Failures
160
- - Verify `~/.stackmemory/bin/` directory exists
161
- - Check binary file permissions: `ls -la ~/.stackmemory/bin/`
162
- - Test individual binaries manually
163
- - Check shell integration syntax: `bash -n ~/.stackmemory/shell-integration-consolidated.sh`
164
-
165
- ### Installation Scenario Failures
166
- - Check npm pack output for missing files
167
- - Verify package.json bin configuration
168
- - Test in clean environment manually
169
- - Check Node.js version compatibility
170
-
171
- ## Continuous Integration
172
-
173
- For CI/CD pipelines, run the full test suite:
174
-
175
- ```bash
176
- # In CI environment
177
- npm ci
178
- npm run test:pre-publish
179
- npm publish
180
- ```
181
-
182
- The tests are designed to work in various environments:
183
- - Local development machines
184
- - CI/CD systems (GitHub Actions, etc.)
185
- - Docker containers
186
- - Different operating systems (macOS, Linux)