@stackmemoryai/stackmemory 0.8.1 → 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 (788) hide show
  1. package/LICENSE +64 -0
  2. package/README.md +15 -3
  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 +0 -1
  10. package/dist/src/cli/codex-sm-danger.js +0 -1
  11. package/dist/src/cli/codex-sm.js +0 -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 +0 -1
  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 +0 -4
  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 +8 -5
  48. package/dist/src/cli/opencode-sm.js +0 -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 +0 -1
  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 +0 -1
  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 -1
  200. package/dist/src/hooks/linear-task-picker.js +0 -1
  201. package/dist/src/hooks/schemas.js +0 -1
  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 +32 -7
  296. package/dist/scripts/benchmark-performance.js +0 -48
  297. package/dist/scripts/benchmark-performance.js.map +0 -7
  298. package/dist/scripts/check-redis.js +0 -42
  299. package/dist/scripts/check-redis.js.map +0 -7
  300. package/dist/scripts/initialize.js +0 -183
  301. package/dist/scripts/initialize.js.map +0 -7
  302. package/dist/scripts/list-linear-tasks.js +0 -124
  303. package/dist/scripts/list-linear-tasks.js.map +0 -7
  304. package/dist/scripts/measure-handoff-impact.js +0 -340
  305. package/dist/scripts/measure-handoff-impact.js.map +0 -7
  306. package/dist/scripts/query-chromadb.js +0 -160
  307. package/dist/scripts/query-chromadb.js.map +0 -7
  308. package/dist/scripts/show-linear-summary.js +0 -119
  309. package/dist/scripts/show-linear-summary.js.map +0 -7
  310. package/dist/scripts/simple-swarm-demo.js +0 -90
  311. package/dist/scripts/simple-swarm-demo.js.map +0 -7
  312. package/dist/scripts/status.js +0 -155
  313. package/dist/scripts/status.js.map +0 -7
  314. package/dist/scripts/test-chromadb-sync.js +0 -192
  315. package/dist/scripts/test-chromadb-sync.js.map +0 -7
  316. package/dist/scripts/test-ralph-iteration-fix.js +0 -86
  317. package/dist/scripts/test-ralph-iteration-fix.js.map +0 -7
  318. package/dist/scripts/test-ralph-iterations.js +0 -121
  319. package/dist/scripts/test-ralph-iterations.js.map +0 -7
  320. package/dist/scripts/test-redis-storage.js +0 -389
  321. package/dist/scripts/test-redis-storage.js.map +0 -7
  322. package/dist/scripts/test-simple-ralph-state-sync.js +0 -115
  323. package/dist/scripts/test-simple-ralph-state-sync.js.map +0 -7
  324. package/dist/scripts/test-swarm-fixes.js +0 -125
  325. package/dist/scripts/test-swarm-fixes.js.map +0 -7
  326. package/dist/scripts/test-swarm-tui.js +0 -23
  327. package/dist/scripts/test-swarm-tui.js.map +0 -7
  328. package/dist/scripts/test-tui-shortcuts.js +0 -52
  329. package/dist/scripts/test-tui-shortcuts.js.map +0 -7
  330. package/dist/scripts/validate-tui-shortcuts.js +0 -60
  331. package/dist/scripts/validate-tui-shortcuts.js.map +0 -7
  332. package/dist/src/agents/core/agent-task-manager.js.map +0 -7
  333. package/dist/src/agents/verifiers/base-verifier.js.map +0 -7
  334. package/dist/src/agents/verifiers/formatter-verifier.js.map +0 -7
  335. package/dist/src/agents/verifiers/llm-judge.js.map +0 -7
  336. package/dist/src/cli/auto-detect.js.map +0 -7
  337. package/dist/src/cli/claude-sm-danger.js.map +0 -7
  338. package/dist/src/cli/claude-sm.js.map +0 -7
  339. package/dist/src/cli/codex-sm-danger.js.map +0 -7
  340. package/dist/src/cli/codex-sm.js.map +0 -7
  341. package/dist/src/cli/commands/api.js.map +0 -7
  342. package/dist/src/cli/commands/auto-background.js.map +0 -7
  343. package/dist/src/cli/commands/cleanup-processes.js.map +0 -7
  344. package/dist/src/cli/commands/clear.js.map +0 -7
  345. package/dist/src/cli/commands/config.js.map +0 -7
  346. package/dist/src/cli/commands/context-rehydrate.js.map +0 -7
  347. package/dist/src/cli/commands/context.js.map +0 -7
  348. package/dist/src/cli/commands/daemon.js.map +0 -7
  349. package/dist/src/cli/commands/dashboard.js.map +0 -7
  350. package/dist/src/cli/commands/db.js.map +0 -7
  351. package/dist/src/cli/commands/decision.js.map +0 -7
  352. package/dist/src/cli/commands/discovery.js.map +0 -7
  353. package/dist/src/cli/commands/handoff.js.map +0 -7
  354. package/dist/src/cli/commands/hooks.js.map +0 -7
  355. package/dist/src/cli/commands/linear.js.map +0 -7
  356. package/dist/src/cli/commands/log.js.map +0 -7
  357. package/dist/src/cli/commands/login.js.map +0 -7
  358. package/dist/src/cli/commands/migrate.js.map +0 -7
  359. package/dist/src/cli/commands/model.js.map +0 -7
  360. package/dist/src/cli/commands/onboard.js.map +0 -7
  361. package/dist/src/cli/commands/ping.js.map +0 -7
  362. package/dist/src/cli/commands/projects.js.map +0 -7
  363. package/dist/src/cli/commands/ralph.js.map +0 -7
  364. package/dist/src/cli/commands/retrieval.js.map +0 -7
  365. package/dist/src/cli/commands/search.js.map +0 -7
  366. package/dist/src/cli/commands/service.js.map +0 -7
  367. package/dist/src/cli/commands/session.js.map +0 -7
  368. package/dist/src/cli/commands/settings.js +0 -306
  369. package/dist/src/cli/commands/settings.js.map +0 -7
  370. package/dist/src/cli/commands/setup.js.map +0 -7
  371. package/dist/src/cli/commands/shell.js.map +0 -7
  372. package/dist/src/cli/commands/signup.js.map +0 -7
  373. package/dist/src/cli/commands/skills.js.map +0 -7
  374. package/dist/src/cli/commands/sms-notify.js +0 -795
  375. package/dist/src/cli/commands/sms-notify.js.map +0 -7
  376. package/dist/src/cli/commands/storage-tier.js.map +0 -7
  377. package/dist/src/cli/commands/sweep.js.map +0 -7
  378. package/dist/src/cli/commands/tasks.js.map +0 -7
  379. package/dist/src/cli/commands/worktree.js.map +0 -7
  380. package/dist/src/cli/index.js.map +0 -7
  381. package/dist/src/cli/opencode-sm.js.map +0 -7
  382. package/dist/src/cli/utils/viewer.js.map +0 -7
  383. package/dist/src/core/config/config-manager.js.map +0 -7
  384. package/dist/src/core/config/feature-flags.js.map +0 -7
  385. package/dist/src/core/config/storage-config.js.map +0 -7
  386. package/dist/src/core/config/types.js.map +0 -7
  387. package/dist/src/core/context/auto-context.js.map +0 -7
  388. package/dist/src/core/context/dual-stack-manager.js.map +0 -7
  389. package/dist/src/core/context/enhanced-rehydration.js.map +0 -7
  390. package/dist/src/core/context/frame-database.js.map +0 -7
  391. package/dist/src/core/context/frame-digest.js.map +0 -7
  392. package/dist/src/core/context/frame-handoff-manager.js.map +0 -7
  393. package/dist/src/core/context/frame-lifecycle-hooks.js.map +0 -7
  394. package/dist/src/core/context/frame-recovery.js.map +0 -7
  395. package/dist/src/core/context/frame-stack.js.map +0 -7
  396. package/dist/src/core/context/frame-types.js.map +0 -7
  397. package/dist/src/core/context/index.js.map +0 -7
  398. package/dist/src/core/context/permission-manager.js.map +0 -7
  399. package/dist/src/core/context/recursive-context-manager.js.map +0 -7
  400. package/dist/src/core/context/refactored-frame-manager.js.map +0 -7
  401. package/dist/src/core/context/shared-context-layer.js.map +0 -7
  402. package/dist/src/core/context/stack-merge-resolver.js.map +0 -7
  403. package/dist/src/core/context/validation.js.map +0 -7
  404. package/dist/src/core/database/batch-operations.js.map +0 -7
  405. package/dist/src/core/database/connection-pool.js.map +0 -7
  406. package/dist/src/core/database/database-adapter.js.map +0 -7
  407. package/dist/src/core/database/embedding-provider-factory.js.map +0 -7
  408. package/dist/src/core/database/embedding-provider.js.map +0 -7
  409. package/dist/src/core/database/migration-manager.js.map +0 -7
  410. package/dist/src/core/database/ollama-embedding-provider.js.map +0 -7
  411. package/dist/src/core/database/openai-embedding-provider.js.map +0 -7
  412. package/dist/src/core/database/query-cache.js.map +0 -7
  413. package/dist/src/core/database/query-router.js.map +0 -7
  414. package/dist/src/core/database/sqlite-adapter.js.map +0 -7
  415. package/dist/src/core/database/transformers-embedding-provider.js.map +0 -7
  416. package/dist/src/core/digest/enhanced-hybrid-digest.js.map +0 -7
  417. package/dist/src/core/digest/frame-digest-integration.js.map +0 -7
  418. package/dist/src/core/digest/hybrid-digest-generator.js.map +0 -7
  419. package/dist/src/core/digest/index.js.map +0 -7
  420. package/dist/src/core/digest/types.js.map +0 -7
  421. package/dist/src/core/errors/error-utils.js.map +0 -7
  422. package/dist/src/core/errors/index.js.map +0 -7
  423. package/dist/src/core/errors/recovery.js.map +0 -7
  424. package/dist/src/core/execution/parallel-executor.js.map +0 -7
  425. package/dist/src/core/extensions/custom-tools.js.map +0 -7
  426. package/dist/src/core/extensions/index.js.map +0 -7
  427. package/dist/src/core/extensions/loader.js.map +0 -7
  428. package/dist/src/core/extensions/plugin-system.js.map +0 -7
  429. package/dist/src/core/extensions/provider-adapter.js.map +0 -7
  430. package/dist/src/core/extensions/sandbox-runtime.js.map +0 -7
  431. package/dist/src/core/extensions/types.js.map +0 -7
  432. package/dist/src/core/frame/workflow-templates.js.map +0 -7
  433. package/dist/src/core/merge/conflict-detector.js.map +0 -7
  434. package/dist/src/core/merge/index.js.map +0 -7
  435. package/dist/src/core/merge/resolution-engine.js.map +0 -7
  436. package/dist/src/core/merge/stack-diff.js.map +0 -7
  437. package/dist/src/core/merge/types.js.map +0 -7
  438. package/dist/src/core/merge/unified-merge-resolver.js.map +0 -7
  439. package/dist/src/core/models/fallback-monitor.js.map +0 -7
  440. package/dist/src/core/models/model-router.js.map +0 -7
  441. package/dist/src/core/monitoring/error-handler.js.map +0 -7
  442. package/dist/src/core/monitoring/logger.js.map +0 -7
  443. package/dist/src/core/monitoring/metrics.js.map +0 -7
  444. package/dist/src/core/monitoring/progress-tracker.js.map +0 -7
  445. package/dist/src/core/monitoring/session-monitor.js.map +0 -7
  446. package/dist/src/core/performance/context-cache.js.map +0 -7
  447. package/dist/src/core/performance/index.js.map +0 -7
  448. package/dist/src/core/performance/lazy-context-loader.js.map +0 -7
  449. package/dist/src/core/performance/monitor.js.map +0 -7
  450. package/dist/src/core/performance/optimized-frame-context.js.map +0 -7
  451. package/dist/src/core/performance/performance-benchmark.js.map +0 -7
  452. package/dist/src/core/performance/performance-profiler.js.map +0 -7
  453. package/dist/src/core/performance/streaming-jsonl-parser.js.map +0 -7
  454. package/dist/src/core/persistence/postgres-adapter.js.map +0 -7
  455. package/dist/src/core/projects/project-isolation.js.map +0 -7
  456. package/dist/src/core/projects/project-manager.js.map +0 -7
  457. package/dist/src/core/query/query-parser.js.map +0 -7
  458. package/dist/src/core/query/query-templates.js.map +0 -7
  459. package/dist/src/core/retrieval/context-retriever.js.map +0 -7
  460. package/dist/src/core/retrieval/index.js.map +0 -7
  461. package/dist/src/core/retrieval/llm-context-retrieval.js.map +0 -7
  462. package/dist/src/core/retrieval/llm-provider.js.map +0 -7
  463. package/dist/src/core/retrieval/privacy-filter.js.map +0 -7
  464. package/dist/src/core/retrieval/retrieval-audit.js.map +0 -7
  465. package/dist/src/core/retrieval/summary-generator.js.map +0 -7
  466. package/dist/src/core/retrieval/types.js.map +0 -7
  467. package/dist/src/core/retrieval/unified-context-assembler.js.map +0 -7
  468. package/dist/src/core/security/index.js.map +0 -7
  469. package/dist/src/core/security/input-sanitizer.js.map +0 -7
  470. package/dist/src/core/session/clear-survival.js.map +0 -7
  471. package/dist/src/core/session/enhanced-handoff.js.map +0 -7
  472. package/dist/src/core/session/handoff-generator.js.map +0 -7
  473. package/dist/src/core/session/index.js.map +0 -7
  474. package/dist/src/core/session/session-manager.js.map +0 -7
  475. package/dist/src/core/skills/index.js.map +0 -7
  476. package/dist/src/core/skills/skill-storage.js.map +0 -7
  477. package/dist/src/core/skills/types.js.map +0 -7
  478. package/dist/src/core/storage/chromadb-adapter.js.map +0 -7
  479. package/dist/src/core/storage/infinite-storage.js.map +0 -7
  480. package/dist/src/core/storage/project-registry.js.map +0 -7
  481. package/dist/src/core/storage/remote-storage.js.map +0 -7
  482. package/dist/src/core/storage/storage-tier-manager.js.map +0 -7
  483. package/dist/src/core/storage/two-tier-storage.js.map +0 -7
  484. package/dist/src/core/trace/cli-trace-wrapper.js.map +0 -7
  485. package/dist/src/core/trace/db-trace-wrapper.js.map +0 -7
  486. package/dist/src/core/trace/debug-trace.js.map +0 -7
  487. package/dist/src/core/trace/index.js.map +0 -7
  488. package/dist/src/core/trace/linear-api-wrapper.js.map +0 -7
  489. package/dist/src/core/trace/trace-detector.js.map +0 -7
  490. package/dist/src/core/trace/trace-store.js.map +0 -7
  491. package/dist/src/core/trace/types.js.map +0 -7
  492. package/dist/src/core/types.js.map +0 -7
  493. package/dist/src/core/utils/async-mutex.js.map +0 -7
  494. package/dist/src/core/utils/compression.js.map +0 -7
  495. package/dist/src/core/utils/update-checker.js.map +0 -7
  496. package/dist/src/core/worktree/worktree-manager.js.map +0 -7
  497. package/dist/src/daemon/daemon-config.js.map +0 -7
  498. package/dist/src/daemon/services/context-service.js.map +0 -7
  499. package/dist/src/daemon/services/linear-service.js.map +0 -7
  500. package/dist/src/daemon/services/maintenance-service.js.map +0 -7
  501. package/dist/src/daemon/services/memory-service.js.map +0 -7
  502. package/dist/src/daemon/session-daemon.js.map +0 -7
  503. package/dist/src/daemon/unified-daemon.js.map +0 -7
  504. package/dist/src/features/analytics/api/analytics-api.js.map +0 -7
  505. package/dist/src/features/analytics/core/analytics-service.js.map +0 -7
  506. package/dist/src/features/analytics/index.js.map +0 -7
  507. package/dist/src/features/analytics/queries/metrics-queries.js.map +0 -7
  508. package/dist/src/features/analytics/types/metrics.js.map +0 -7
  509. package/dist/src/features/browser/browser-mcp.js.map +0 -7
  510. package/dist/src/features/sweep/index.js.map +0 -7
  511. package/dist/src/features/sweep/prediction-client.js.map +0 -7
  512. package/dist/src/features/sweep/prompt-builder.js.map +0 -7
  513. package/dist/src/features/sweep/pty-wrapper.js.map +0 -7
  514. package/dist/src/features/sweep/state-watcher.js.map +0 -7
  515. package/dist/src/features/sweep/status-bar.js.map +0 -7
  516. package/dist/src/features/sweep/sweep-server-manager.js.map +0 -7
  517. package/dist/src/features/sweep/tab-interceptor.js.map +0 -7
  518. package/dist/src/features/sweep/types.js.map +0 -7
  519. package/dist/src/features/tasks/linear-task-manager.js.map +0 -7
  520. package/dist/src/features/tasks/task-aware-context.js.map +0 -7
  521. package/dist/src/features/tui/simple-monitor.js.map +0 -7
  522. package/dist/src/features/tui/swarm-monitor.js.map +0 -7
  523. package/dist/src/features/web/client/stores/task-store.js.map +0 -7
  524. package/dist/src/features/web/server/index.js.map +0 -7
  525. package/dist/src/features/workers/tmux-manager.js.map +0 -7
  526. package/dist/src/features/workers/worker-registry.js.map +0 -7
  527. package/dist/src/hooks/auto-background.js.map +0 -7
  528. package/dist/src/hooks/claude-code-whatsapp-hook.js +0 -197
  529. package/dist/src/hooks/claude-code-whatsapp-hook.js.map +0 -7
  530. package/dist/src/hooks/config.js.map +0 -7
  531. package/dist/src/hooks/daemon.js.map +0 -7
  532. package/dist/src/hooks/diffmem-hooks.js.map +0 -7
  533. package/dist/src/hooks/events.js.map +0 -7
  534. package/dist/src/hooks/index.js.map +0 -7
  535. package/dist/src/hooks/linear-task-picker.js.map +0 -7
  536. package/dist/src/hooks/schemas.js.map +0 -7
  537. package/dist/src/hooks/secure-fs.js.map +0 -7
  538. package/dist/src/hooks/security-logger.js.map +0 -7
  539. package/dist/src/hooks/session-summary.js.map +0 -7
  540. package/dist/src/hooks/sms-action-runner.js +0 -371
  541. package/dist/src/hooks/sms-action-runner.js.map +0 -7
  542. package/dist/src/hooks/sms-notify.js +0 -506
  543. package/dist/src/hooks/sms-notify.js.map +0 -7
  544. package/dist/src/hooks/sms-watcher.js +0 -93
  545. package/dist/src/hooks/sms-watcher.js.map +0 -7
  546. package/dist/src/hooks/sms-webhook.js +0 -555
  547. package/dist/src/hooks/sms-webhook.js.map +0 -7
  548. package/dist/src/hooks/whatsapp-commands.js +0 -479
  549. package/dist/src/hooks/whatsapp-commands.js.map +0 -7
  550. package/dist/src/hooks/whatsapp-scheduler.js +0 -317
  551. package/dist/src/hooks/whatsapp-scheduler.js.map +0 -7
  552. package/dist/src/hooks/whatsapp-sync.js +0 -409
  553. package/dist/src/hooks/whatsapp-sync.js.map +0 -7
  554. package/dist/src/index.js.map +0 -7
  555. package/dist/src/integrations/anthropic/client.js.map +0 -7
  556. package/dist/src/integrations/claude-code/agent-bridge.js.map +0 -7
  557. package/dist/src/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
  558. package/dist/src/integrations/claude-code/lifecycle-hooks.js.map +0 -7
  559. package/dist/src/integrations/claude-code/post-task-hooks.js.map +0 -7
  560. package/dist/src/integrations/claude-code/subagent-client-stub.js.map +0 -7
  561. package/dist/src/integrations/claude-code/subagent-client.js.map +0 -7
  562. package/dist/src/integrations/claude-code/task-coordinator.js.map +0 -7
  563. package/dist/src/integrations/diffmem/client.js.map +0 -7
  564. package/dist/src/integrations/diffmem/config.js.map +0 -7
  565. package/dist/src/integrations/diffmem/index.js.map +0 -7
  566. package/dist/src/integrations/diffmem/types.js.map +0 -7
  567. package/dist/src/integrations/linear/auth.js.map +0 -7
  568. package/dist/src/integrations/linear/auto-sync.js.map +0 -7
  569. package/dist/src/integrations/linear/client.js.map +0 -7
  570. package/dist/src/integrations/linear/config.js.map +0 -7
  571. package/dist/src/integrations/linear/migration.js.map +0 -7
  572. package/dist/src/integrations/linear/oauth-server.js.map +0 -7
  573. package/dist/src/integrations/linear/rest-client.js.map +0 -7
  574. package/dist/src/integrations/linear/sync-manager.js.map +0 -7
  575. package/dist/src/integrations/linear/sync-service.js.map +0 -7
  576. package/dist/src/integrations/linear/sync.js.map +0 -7
  577. package/dist/src/integrations/linear/types.js.map +0 -7
  578. package/dist/src/integrations/linear/unified-sync.js.map +0 -7
  579. package/dist/src/integrations/linear/webhook-handler.js.map +0 -7
  580. package/dist/src/integrations/linear/webhook-server.js.map +0 -7
  581. package/dist/src/integrations/linear/webhook.js.map +0 -7
  582. package/dist/src/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
  583. package/dist/src/integrations/mcp/handlers/context-handlers.js.map +0 -7
  584. package/dist/src/integrations/mcp/handlers/diffmem-handlers.js.map +0 -7
  585. package/dist/src/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
  586. package/dist/src/integrations/mcp/handlers/index.js.map +0 -7
  587. package/dist/src/integrations/mcp/handlers/linear-handlers.js.map +0 -7
  588. package/dist/src/integrations/mcp/handlers/skill-handlers.js.map +0 -7
  589. package/dist/src/integrations/mcp/handlers/task-handlers.js.map +0 -7
  590. package/dist/src/integrations/mcp/handlers/trace-handlers.js.map +0 -7
  591. package/dist/src/integrations/mcp/index.js.map +0 -7
  592. package/dist/src/integrations/mcp/middleware/tool-scoring.js.map +0 -7
  593. package/dist/src/integrations/mcp/pending-utils.js.map +0 -7
  594. package/dist/src/integrations/mcp/refactored-server.js.map +0 -7
  595. package/dist/src/integrations/mcp/remote-server.js.map +0 -7
  596. package/dist/src/integrations/mcp/schemas.js.map +0 -7
  597. package/dist/src/integrations/mcp/server.js.map +0 -7
  598. package/dist/src/integrations/mcp/tool-definitions-code.js.map +0 -7
  599. package/dist/src/integrations/mcp/tool-definitions.js.map +0 -7
  600. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
  601. package/dist/src/integrations/ralph/context/context-budget-manager.js.map +0 -7
  602. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
  603. package/dist/src/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
  604. package/dist/src/integrations/ralph/index.js.map +0 -7
  605. package/dist/src/integrations/ralph/learning/pattern-learner.js.map +0 -7
  606. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
  607. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
  608. package/dist/src/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
  609. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
  610. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
  611. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
  612. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
  613. package/dist/src/integrations/ralph/performance/performance-optimizer.js.map +0 -7
  614. package/dist/src/integrations/ralph/recovery/crash-recovery.js.map +0 -7
  615. package/dist/src/integrations/ralph/state/state-reconciler.js.map +0 -7
  616. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
  617. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
  618. package/dist/src/integrations/ralph/types.js.map +0 -7
  619. package/dist/src/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
  620. package/dist/src/mcp/stackmemory-mcp-server.js.map +0 -7
  621. package/dist/src/middleware/exponential-rate-limiter.js.map +0 -7
  622. package/dist/src/models/user.model.js.map +0 -7
  623. package/dist/src/orchestrators/multimodal/constants.js.map +0 -7
  624. package/dist/src/orchestrators/multimodal/harness.js.map +0 -7
  625. package/dist/src/orchestrators/multimodal/providers.js.map +0 -7
  626. package/dist/src/orchestrators/multimodal/types.js.map +0 -7
  627. package/dist/src/orchestrators/multimodal/utils.js.map +0 -7
  628. package/dist/src/servers/production/auth-middleware.js.map +0 -7
  629. package/dist/src/services/config-service.js.map +0 -7
  630. package/dist/src/services/context-service.js.map +0 -7
  631. package/dist/src/skills/api-discovery.js.map +0 -7
  632. package/dist/src/skills/api-skill.js.map +0 -7
  633. package/dist/src/skills/claude-skills.js.map +0 -7
  634. package/dist/src/skills/dashboard-launcher.js.map +0 -7
  635. package/dist/src/skills/linear-task-runner.js.map +0 -7
  636. package/dist/src/skills/recursive-agent-orchestrator.js.map +0 -7
  637. package/dist/src/skills/repo-ingestion-skill.js.map +0 -7
  638. package/dist/src/skills/spec-generator-skill.js.map +0 -7
  639. package/dist/src/skills/unified-rlm-orchestrator.js.map +0 -7
  640. package/dist/src/types/task.js.map +0 -7
  641. package/dist/src/utils/env.js.map +0 -7
  642. package/dist/src/utils/formatting.js.map +0 -7
  643. package/dist/src/utils/process-cleanup.js.map +0 -7
  644. package/scripts/README-TESTING.md +0 -186
  645. package/scripts/analyze-cli-security.js +0 -288
  646. package/scripts/archive/add-phase-tasks-to-linear.js +0 -163
  647. package/scripts/archive/analyze-linear-duplicates.js +0 -214
  648. package/scripts/archive/analyze-remaining-duplicates.js +0 -230
  649. package/scripts/archive/analyze-sta-duplicates.js +0 -292
  650. package/scripts/archive/analyze-sta-graphql.js +0 -399
  651. package/scripts/archive/cancel-duplicate-tasks.ts +0 -246
  652. package/scripts/archive/check-all-duplicates.ts +0 -419
  653. package/scripts/archive/clean-duplicate-tasks.js +0 -114
  654. package/scripts/archive/cleanup-duplicate-tasks.ts +0 -286
  655. package/scripts/archive/create-phase-tasks.js +0 -387
  656. package/scripts/archive/delete-linear-duplicates.js +0 -182
  657. package/scripts/archive/delete-remaining-duplicates.js +0 -158
  658. package/scripts/archive/delete-sta-duplicates.js +0 -201
  659. package/scripts/archive/delete-sta-oauth.js +0 -201
  660. package/scripts/archive/export-sta-tasks.js +0 -62
  661. package/scripts/archive/install-auto-sync.js +0 -266
  662. package/scripts/archive/install-chromadb-hooks.sh +0 -133
  663. package/scripts/archive/install-enhanced-clear-hooks.sh +0 -431
  664. package/scripts/archive/install-post-task-hooks.sh +0 -289
  665. package/scripts/archive/install-stackmemory-hooks.sh +0 -420
  666. package/scripts/archive/merge-linear-duplicates-safe.ts +0 -362
  667. package/scripts/archive/merge-linear-duplicates.ts +0 -182
  668. package/scripts/archive/remove-sta-tasks.js +0 -70
  669. package/scripts/archive/setup-background-sync.sh +0 -168
  670. package/scripts/archive/setup-claude-auto-triggers.sh +0 -181
  671. package/scripts/archive/setup-claude-autostart.sh +0 -305
  672. package/scripts/archive/setup-git-hooks.sh +0 -25
  673. package/scripts/archive/setup-linear-oauth.sh +0 -46
  674. package/scripts/archive/setup-mcp.sh +0 -113
  675. package/scripts/archive/setup-railway-deployment.sh +0 -81
  676. package/scripts/auto-handoff.sh +0 -262
  677. package/scripts/background-sync-manager.js +0 -478
  678. package/scripts/benchmark-performance.ts +0 -57
  679. package/scripts/check-redis.ts +0 -48
  680. package/scripts/chromadb-auto-loader.sh +0 -128
  681. package/scripts/chromadb-context-loader.js +0 -479
  682. package/scripts/claude-chromadb-hook.js +0 -460
  683. package/scripts/claude-linear-skill.js +0 -455
  684. package/scripts/claude-pre-commit.sh +0 -302
  685. package/scripts/claude-sm-autostart.js +0 -579
  686. package/scripts/claude-with-chromadb.sh +0 -69
  687. package/scripts/clean-linear-backlog.js +0 -273
  688. package/scripts/cleanup-old-sessions.sh +0 -57
  689. package/scripts/create-cleanup-issues.js +0 -302
  690. package/scripts/create-sandbox.sh +0 -269
  691. package/scripts/debug-linear-update.js +0 -174
  692. package/scripts/delete-linear-tasks.js +0 -167
  693. package/scripts/demos/browser-test.ts +0 -39
  694. package/scripts/demos/ralph-integration-demo.ts +0 -245
  695. package/scripts/demos/trace-demo.ts +0 -200
  696. package/scripts/demos/trace-detector.demo.ts +0 -171
  697. package/scripts/demos/trace-test.ts +0 -79
  698. package/scripts/deploy-ralph-swarm.sh +0 -365
  699. package/scripts/deploy.sh +0 -89
  700. package/scripts/deployment/test-deployment.js +0 -194
  701. package/scripts/detect-and-rehydrate.js +0 -162
  702. package/scripts/detect-and-rehydrate.mjs +0 -165
  703. package/scripts/development/create-demo-tasks.js +0 -143
  704. package/scripts/development/debug-frame-test.js +0 -16
  705. package/scripts/development/demo-auto-sync.js +0 -128
  706. package/scripts/development/fix-all-imports.js +0 -213
  707. package/scripts/development/fix-imports.js +0 -229
  708. package/scripts/development/fix-lint-loop.cjs +0 -103
  709. package/scripts/development/fix-project-id.ts +0 -161
  710. package/scripts/development/fix-strict-mode-issues.ts +0 -291
  711. package/scripts/development/reorganize-structure.sh +0 -228
  712. package/scripts/development/test-persistence-direct.js +0 -148
  713. package/scripts/development/test-persistence.js +0 -114
  714. package/scripts/development/test-tasks.js +0 -93
  715. package/scripts/development/update-imports.js +0 -212
  716. package/scripts/fetch-linear-status.js +0 -125
  717. package/scripts/initialize.ts +0 -220
  718. package/scripts/linear-auto-sync.js +0 -262
  719. package/scripts/linear-auto-sync.sh +0 -161
  720. package/scripts/linear-sync-daemon.js +0 -150
  721. package/scripts/linear-task-review.js +0 -237
  722. package/scripts/list-linear-tasks.ts +0 -178
  723. package/scripts/mcp-proxy.js +0 -66
  724. package/scripts/measure-handoff-impact.mjs +0 -395
  725. package/scripts/measure-handoff-impact.ts +0 -450
  726. package/scripts/publish-local.js +0 -74
  727. package/scripts/query-chromadb.ts +0 -201
  728. package/scripts/ralph-integration-test.js +0 -274
  729. package/scripts/reconcile-local-tasks.js +0 -170
  730. package/scripts/recreate-frames-db.js +0 -89
  731. package/scripts/show-linear-summary.ts +0 -172
  732. package/scripts/simple-swarm-demo.ts +0 -114
  733. package/scripts/stackmemory-auto-handoff.sh +0 -231
  734. package/scripts/start-linear-sync-daemon.sh +0 -141
  735. package/scripts/start-temporal-paradox.sh +0 -214
  736. package/scripts/status.ts +0 -224
  737. package/scripts/stop-notify-webhook.sh +0 -19
  738. package/scripts/swarm-monitor.js +0 -509
  739. package/scripts/sync-and-clean-tasks.js +0 -258
  740. package/scripts/sync-linear-graphql.js +0 -303
  741. package/scripts/sync-linear-tasks.js +0 -186
  742. package/scripts/test-auto-triggers.sh +0 -57
  743. package/scripts/test-browser-mcp.js +0 -74
  744. package/scripts/test-chromadb-full.js +0 -115
  745. package/scripts/test-chromadb-hooks.sh +0 -28
  746. package/scripts/test-chromadb-sync.ts +0 -245
  747. package/scripts/test-claude-config.sh +0 -123
  748. package/scripts/test-cli-security.js +0 -293
  749. package/scripts/test-code-execution.js +0 -143
  750. package/scripts/test-hooks-persistence.sh +0 -220
  751. package/scripts/test-installation-scenarios.sh +0 -359
  752. package/scripts/test-installation.sh +0 -224
  753. package/scripts/test-mcp.js +0 -163
  754. package/scripts/test-parallel-swarms.js +0 -443
  755. package/scripts/test-pre-publish-quick.sh +0 -69
  756. package/scripts/test-quality-gates.sh +0 -263
  757. package/scripts/test-ralph-iteration-fix.ts +0 -118
  758. package/scripts/test-ralph-iterations.ts +0 -164
  759. package/scripts/test-redis-storage.ts +0 -490
  760. package/scripts/test-rlm-basic.sh +0 -122
  761. package/scripts/test-rlm-comprehensive.sh +0 -260
  762. package/scripts/test-rlm-e2e.sh +0 -268
  763. package/scripts/test-rlm-simple.js +0 -90
  764. package/scripts/test-rlm.js +0 -110
  765. package/scripts/test-session-handoff.sh +0 -165
  766. package/scripts/test-setup-e2e.sh +0 -154
  767. package/scripts/test-shell-integration.sh +0 -275
  768. package/scripts/test-simple-ralph-state-sync.ts +0 -178
  769. package/scripts/test-swarm-fixes.ts +0 -161
  770. package/scripts/test-swarm-git-workflow.js +0 -338
  771. package/scripts/test-swarm-tui.ts +0 -34
  772. package/scripts/test-tui-shortcuts.ts +0 -66
  773. package/scripts/testing/ab-test-runner.ts +0 -510
  774. package/scripts/testing/collect-metrics.ts +0 -457
  775. package/scripts/testing/quick-effectiveness-demo.js +0 -187
  776. package/scripts/testing/ralph-cli-test.js +0 -88
  777. package/scripts/testing/ralph-integration-validation.js +0 -727
  778. package/scripts/testing/ralph-swarm-test-scenarios.js +0 -613
  779. package/scripts/testing/real-performance-test.js +0 -422
  780. package/scripts/testing/results/real-performance-results.json +0 -90
  781. package/scripts/testing/run-effectiveness-tests.sh +0 -176
  782. package/scripts/testing/simple-effectiveness-test.js +0 -310
  783. package/scripts/testing/test-tier-migration.js +0 -100
  784. package/scripts/update-linear-status.js +0 -268
  785. package/scripts/update-linear-tasks-fixed.js +0 -284
  786. package/scripts/validate-claude-config.sh +0 -155
  787. package/scripts/validate-swarm-implementation.js +0 -467
  788. package/scripts/validate-tui-shortcuts.ts +0 -83
@@ -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": ";;;;AAMA,SAAS,gBAAgB;AACzB,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,SAAS,cAAc;AAiBvB,MAAM,+BAA+B;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,SAAS,0BAA0C;AACxD,QAAM,YAA4B,CAAC;AAEnC,MAAI;AAEF,UAAM,WAAW;AAAA,MACf;AAAA,MACA,EAAE,UAAU,SAAS,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE;AAAA,IACvD;AAEA,UAAM,QAAQ,SAAS,KAAK,EAAE,MAAM,IAAI,EAAE,MAAM,CAAC;AAEjD,eAAW,QAAQ,OAAO;AAExB,YAAM,gBAAgB,6BAA6B;AAAA,QAAK,CAAC,YACvD,KAAK,YAAY,EAAE,SAAS,QAAQ,YAAY,CAAC;AAAA,MACnD;AAEA,UAAI,CAAC,cAAe;AAIpB,YAAM,QAAQ,KAAK;AAAA,QACjB;AAAA,MACF;AAEA,UAAI,OAAO;AACT,cAAM,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE;AACjC,cAAM,eAAe,MAAM,CAAC;AAC5B,cAAM,UAAU,MAAM,CAAC;AAGvB,YAAI,QAAQ,QAAQ,IAAK;AAGzB,cAAM,YAAY,IAAI,KAAK,YAAY;AACvC,cAAM,QAAQ,KAAK,IAAI,IAAI,UAAU,QAAQ;AAC7C,cAAM,WAAW,SAAS,MAAO,KAAK;AAEtC,kBAAU,KAAK;AAAA,UACb;AAAA,UACA,SAAS,QAAQ,MAAM,GAAG,GAAG;AAAA;AAAA,UAC7B;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,KAAK,+BAA+B,KAAK;AAAA,EAClD;AAEA,SAAO;AACT;AAKA,SAAS,qBACP,MACA,aACS;AACT,QAAM,SAAS,KAAK,KAAK,GAAG,QAAQ,GAAG,gBAAgB,MAAM;AAE7D,MAAI,CAAC,GAAG,WAAW,MAAM,EAAG,QAAO;AAEnC,MAAI;AAEF,UAAM,WAAW,GAAG,YAAY,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,CAAC;AAExE,eAAW,WAAW,UAAU;AAC9B,YAAM,UAAU,KAAK,KAAK,QAAQ,OAAO;AACzC,YAAM,QAAQ,GAAG,SAAS,OAAO;AACjC,YAAM,eAAe,KAAK,IAAI,IAAI,MAAM,YAAY,MAAO,KAAK;AAEhE,UAAI,cAAc,aAAa;AAE7B,YAAI;AACF,gBAAM,UAAU,GAAG,aAAa,SAAS,OAAO,EAAE,MAAM,IAAM;AAC9D,cACE,QAAQ,SAAS,OAAO,KAAK,GAAG,EAAE,KAClC,QAAQ,SAAS,OAAO,KAAK,GAAG,EAAE,GAClC;AACA,iBAAK,UAAU;AACf,iBAAK,kBAAkB,MAAM;AAC7B,mBAAO;AAAA,UACT;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,KAAK,iCAAiC,KAAK;AAAA,EACpD;AAEA,SAAO;AACT;AAKO,SAAS,mBAAmB,cAAsB,IAAoB;AAC3E,QAAM,eAAe,wBAAwB;AAE7C,SAAO,aAAa,OAAO,CAAC,SAAS;AAEnC,QAAI,KAAK,WAAW,YAAa,QAAO;AAGxC,QAAI,qBAAqB,MAAM,WAAW,EAAG,QAAO;AAEpD,WAAO;AAAA,EACT,CAAC;AACH;AAKO,SAAS,mBACd,WACA,SAAkB,OACH;AACf,QAAM,SAAwB;AAAA,IAC5B,OAAO;AAAA,IACP,QAAQ,CAAC;AAAA,IACT,QAAQ,CAAC;AAAA,EACX;AAEA,aAAW,QAAQ,WAAW;AAC5B,QAAI,QAAQ;AACV,aAAO,KAAK,4BAA4B,KAAK,GAAG,KAAK,KAAK,OAAO,EAAE;AACnE;AAAA,IACF;AAEA,QAAI;AACF,cAAQ,KAAK,KAAK,KAAK,SAAS;AAChC,aAAO,OAAO,KAAK,KAAK,GAAG;AAC3B,aAAO,KAAK,wBAAwB,KAAK,GAAG,KAAK,KAAK,OAAO,EAAE;AAAA,IACjE,SAAS,OAAgB;AACvB,YAAM,MAAM;AACZ,UAAI,IAAI,SAAS,SAAS;AAExB,eAAO,OAAO,KAAK,KAAK,GAAG;AAAA,MAC7B,OAAO;AACL,eAAO,OAAO,KAAK;AAAA,UACjB,KAAK,KAAK;AAAA,UACV,OAAO,IAAI,WAAW;AAAA,QACxB,CAAC;AACD,eAAO,KAAK,sBAAsB,KAAK,GAAG,KAAK,IAAI,OAAO;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,sBACd,UAGI,CAAC,GACU;AACf,QAAM,EAAE,cAAc,IAAI,SAAS,MAAM,IAAI;AAE7C,SAAO,KAAK,0CAA0C,WAAW,MAAM;AAEvE,QAAM,iBAAiB,mBAAmB,WAAW;AAErD,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO,KAAK,0BAA0B;AACtC,WAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC7C;AAEA,SAAO,KAAK,SAAS,eAAe,MAAM,oBAAoB;AAE9D,SAAO,mBAAmB,gBAAgB,MAAM;AAClD;",
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)