@stackmemoryai/stackmemory 0.5.4 → 0.5.6

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 (494) hide show
  1. package/bin/claude-sm +6 -0
  2. package/bin/claude-smd +6 -0
  3. package/dist/agents/core/agent-task-manager.js +4 -0
  4. package/dist/agents/core/agent-task-manager.js.map +1 -1
  5. package/dist/agents/testing-agent.js +4 -0
  6. package/dist/agents/testing-agent.js.map +1 -1
  7. package/dist/agents/verifiers/base-verifier.js +4 -0
  8. package/dist/agents/verifiers/base-verifier.js.map +1 -1
  9. package/dist/agents/verifiers/formatter-verifier.js +4 -0
  10. package/dist/agents/verifiers/formatter-verifier.js.map +1 -1
  11. package/dist/agents/verifiers/llm-judge.js +4 -0
  12. package/dist/agents/verifiers/llm-judge.js.map +1 -1
  13. package/dist/cli/auto-detect.js +4 -0
  14. package/dist/cli/auto-detect.js.map +1 -1
  15. package/dist/cli/browser-test.js +4 -0
  16. package/dist/cli/browser-test.js.map +1 -1
  17. package/dist/cli/claude-sm-danger.js +21 -0
  18. package/dist/cli/claude-sm-danger.js.map +7 -0
  19. package/dist/cli/claude-sm.js +4 -0
  20. package/dist/cli/claude-sm.js.map +2 -2
  21. package/dist/cli/codex-sm.js +4 -0
  22. package/dist/cli/codex-sm.js.map +1 -1
  23. package/dist/cli/commands/api.js +232 -0
  24. package/dist/cli/commands/api.js.map +7 -0
  25. package/dist/cli/commands/cleanup-processes.js +68 -0
  26. package/dist/cli/commands/cleanup-processes.js.map +7 -0
  27. package/dist/cli/commands/clear.js +4 -0
  28. package/dist/cli/commands/clear.js.map +1 -1
  29. package/dist/cli/commands/config.js +4 -0
  30. package/dist/cli/commands/config.js.map +1 -1
  31. package/dist/cli/commands/context-rehydrate.js +4 -0
  32. package/dist/cli/commands/context-rehydrate.js.map +1 -1
  33. package/dist/cli/commands/context.js +4 -0
  34. package/dist/cli/commands/context.js.map +1 -1
  35. package/dist/cli/commands/dashboard.js +4 -0
  36. package/dist/cli/commands/dashboard.js.map +1 -1
  37. package/dist/cli/commands/db.js +4 -0
  38. package/dist/cli/commands/db.js.map +1 -1
  39. package/dist/cli/commands/decision.js +4 -0
  40. package/dist/cli/commands/decision.js.map +1 -1
  41. package/dist/cli/commands/handoff.js +4 -0
  42. package/dist/cli/commands/handoff.js.map +1 -1
  43. package/dist/cli/commands/hooks.js +298 -0
  44. package/dist/cli/commands/hooks.js.map +7 -0
  45. package/dist/cli/commands/linear-unified.js +4 -0
  46. package/dist/cli/commands/linear-unified.js.map +1 -1
  47. package/dist/cli/commands/linear.js +4 -0
  48. package/dist/cli/commands/linear.js.map +1 -1
  49. package/dist/cli/commands/log.js +4 -0
  50. package/dist/cli/commands/log.js.map +1 -1
  51. package/dist/cli/commands/login.js +4 -0
  52. package/dist/cli/commands/login.js.map +1 -1
  53. package/dist/cli/commands/migrate.js +4 -0
  54. package/dist/cli/commands/migrate.js.map +1 -1
  55. package/dist/cli/commands/monitor.js +4 -0
  56. package/dist/cli/commands/monitor.js.map +1 -1
  57. package/dist/cli/commands/onboard.js +4 -0
  58. package/dist/cli/commands/onboard.js.map +1 -1
  59. package/dist/cli/commands/projects.js +4 -0
  60. package/dist/cli/commands/projects.js.map +1 -1
  61. package/dist/cli/commands/quality.js +4 -0
  62. package/dist/cli/commands/quality.js.map +1 -1
  63. package/dist/cli/commands/ralph.js +4 -0
  64. package/dist/cli/commands/ralph.js.map +1 -1
  65. package/dist/cli/commands/search.js +4 -0
  66. package/dist/cli/commands/search.js.map +1 -1
  67. package/dist/cli/commands/service.js +4 -0
  68. package/dist/cli/commands/service.js.map +1 -1
  69. package/dist/cli/commands/session.js +4 -0
  70. package/dist/cli/commands/session.js.map +1 -1
  71. package/dist/cli/commands/shell.js +249 -0
  72. package/dist/cli/commands/shell.js.map +7 -0
  73. package/dist/cli/commands/signup.js +4 -0
  74. package/dist/cli/commands/signup.js.map +1 -1
  75. package/dist/cli/commands/skills.js +4 -0
  76. package/dist/cli/commands/skills.js.map +1 -1
  77. package/dist/cli/commands/storage-tier.js +4 -0
  78. package/dist/cli/commands/storage-tier.js.map +1 -1
  79. package/dist/cli/commands/storage.js +4 -0
  80. package/dist/cli/commands/storage.js.map +1 -1
  81. package/dist/cli/commands/sweep.js +5 -4
  82. package/dist/cli/commands/sweep.js.map +2 -2
  83. package/dist/cli/commands/tasks.js +4 -0
  84. package/dist/cli/commands/tasks.js.map +1 -1
  85. package/dist/cli/commands/test.js +4 -0
  86. package/dist/cli/commands/test.js.map +1 -1
  87. package/dist/cli/commands/workflow.js +4 -0
  88. package/dist/cli/commands/workflow.js.map +1 -1
  89. package/dist/cli/commands/worktree.js +4 -0
  90. package/dist/cli/commands/worktree.js.map +1 -1
  91. package/dist/cli/index.js +13 -1
  92. package/dist/cli/index.js.map +2 -2
  93. package/dist/cli/utils/viewer.js +4 -0
  94. package/dist/cli/utils/viewer.js.map +1 -1
  95. package/dist/core/analytics/team-analytics.js +4 -0
  96. package/dist/core/analytics/team-analytics.js.map +1 -1
  97. package/dist/core/config/config-manager.js +4 -0
  98. package/dist/core/config/config-manager.js.map +1 -1
  99. package/dist/core/config/storage-config.js +4 -0
  100. package/dist/core/config/storage-config.js.map +1 -1
  101. package/dist/core/config/types.js +4 -0
  102. package/dist/core/config/types.js.map +1 -1
  103. package/dist/core/context/auto-context.js +4 -0
  104. package/dist/core/context/auto-context.js.map +1 -1
  105. package/dist/core/context/compaction-handler.js +4 -0
  106. package/dist/core/context/compaction-handler.js.map +1 -1
  107. package/dist/core/context/context-bridge.js +4 -0
  108. package/dist/core/context/context-bridge.js.map +1 -1
  109. package/dist/core/context/dual-stack-manager.js +4 -0
  110. package/dist/core/context/dual-stack-manager.js.map +1 -1
  111. package/dist/core/context/enhanced-rehydration.js +4 -0
  112. package/dist/core/context/enhanced-rehydration.js.map +1 -1
  113. package/dist/core/context/frame-database.js +4 -0
  114. package/dist/core/context/frame-database.js.map +1 -1
  115. package/dist/core/context/frame-digest.js +4 -0
  116. package/dist/core/context/frame-digest.js.map +1 -1
  117. package/dist/core/context/frame-handoff-manager.js +4 -0
  118. package/dist/core/context/frame-handoff-manager.js.map +1 -1
  119. package/dist/core/context/frame-manager.js +4 -0
  120. package/dist/core/context/frame-manager.js.map +1 -1
  121. package/dist/core/context/frame-stack.js +4 -0
  122. package/dist/core/context/frame-stack.js.map +1 -1
  123. package/dist/core/context/frame-types.js +4 -0
  124. package/dist/core/context/incremental-gc.js +4 -0
  125. package/dist/core/context/incremental-gc.js.map +1 -1
  126. package/dist/core/context/index.js +4 -0
  127. package/dist/core/context/index.js.map +1 -1
  128. package/dist/core/context/model-aware-compaction.js +4 -0
  129. package/dist/core/context/model-aware-compaction.js.map +1 -1
  130. package/dist/core/context/permission-manager.js +4 -0
  131. package/dist/core/context/permission-manager.js.map +1 -1
  132. package/dist/core/context/recursive-context-manager.js +4 -0
  133. package/dist/core/context/recursive-context-manager.js.map +1 -1
  134. package/dist/core/context/refactored-frame-manager.js +4 -0
  135. package/dist/core/context/refactored-frame-manager.js.map +1 -1
  136. package/dist/core/context/shared-context-layer.js +4 -0
  137. package/dist/core/context/shared-context-layer.js.map +1 -1
  138. package/dist/core/context/stack-merge-resolver.js +4 -0
  139. package/dist/core/context/stack-merge-resolver.js.map +1 -1
  140. package/dist/core/context/validation.js +4 -0
  141. package/dist/core/context/validation.js.map +1 -1
  142. package/dist/core/database/batch-operations.js +4 -0
  143. package/dist/core/database/batch-operations.js.map +1 -1
  144. package/dist/core/database/connection-pool.js +4 -0
  145. package/dist/core/database/connection-pool.js.map +1 -1
  146. package/dist/core/database/database-adapter.js +4 -0
  147. package/dist/core/database/database-adapter.js.map +1 -1
  148. package/dist/core/database/migration-manager.js +4 -0
  149. package/dist/core/database/migration-manager.js.map +1 -1
  150. package/dist/core/database/paradedb-adapter.js +4 -0
  151. package/dist/core/database/paradedb-adapter.js.map +1 -1
  152. package/dist/core/database/query-cache.js +4 -0
  153. package/dist/core/database/query-cache.js.map +1 -1
  154. package/dist/core/database/query-router.js +4 -0
  155. package/dist/core/database/query-router.js.map +1 -1
  156. package/dist/core/database/sqlite-adapter.js +4 -0
  157. package/dist/core/database/sqlite-adapter.js.map +1 -1
  158. package/dist/core/digest/enhanced-hybrid-digest.js +4 -0
  159. package/dist/core/digest/enhanced-hybrid-digest.js.map +1 -1
  160. package/dist/core/digest/frame-digest-integration.js +4 -0
  161. package/dist/core/digest/frame-digest-integration.js.map +1 -1
  162. package/dist/core/digest/hybrid-digest-generator.js +4 -0
  163. package/dist/core/digest/hybrid-digest-generator.js.map +1 -1
  164. package/dist/core/digest/index.js +4 -0
  165. package/dist/core/digest/index.js.map +1 -1
  166. package/dist/core/digest/types.js +4 -0
  167. package/dist/core/digest/types.js.map +1 -1
  168. package/dist/core/errors/index.js +4 -0
  169. package/dist/core/errors/index.js.map +1 -1
  170. package/dist/core/errors/recovery.js +4 -0
  171. package/dist/core/errors/recovery.js.map +1 -1
  172. package/dist/core/execution/parallel-executor.js +4 -0
  173. package/dist/core/execution/parallel-executor.js.map +1 -1
  174. package/dist/core/frame/workflow-templates.js +4 -0
  175. package/dist/core/frame/workflow-templates.js.map +1 -1
  176. package/dist/core/merge/conflict-detector.js +4 -0
  177. package/dist/core/merge/conflict-detector.js.map +1 -1
  178. package/dist/core/merge/index.js +4 -0
  179. package/dist/core/merge/index.js.map +1 -1
  180. package/dist/core/merge/resolution-engine.js +4 -0
  181. package/dist/core/merge/resolution-engine.js.map +1 -1
  182. package/dist/core/merge/stack-diff.js +4 -0
  183. package/dist/core/merge/stack-diff.js.map +1 -1
  184. package/dist/core/merge/types.js +4 -0
  185. package/dist/core/monitoring/error-handler.js +4 -0
  186. package/dist/core/monitoring/error-handler.js.map +1 -1
  187. package/dist/core/monitoring/logger.js +4 -0
  188. package/dist/core/monitoring/logger.js.map +1 -1
  189. package/dist/core/monitoring/metrics.js +4 -0
  190. package/dist/core/monitoring/metrics.js.map +1 -1
  191. package/dist/core/monitoring/progress-tracker.js +4 -0
  192. package/dist/core/monitoring/progress-tracker.js.map +1 -1
  193. package/dist/core/monitoring/session-monitor.js +4 -0
  194. package/dist/core/monitoring/session-monitor.js.map +1 -1
  195. package/dist/core/performance/context-cache.js +4 -0
  196. package/dist/core/performance/context-cache.js.map +1 -1
  197. package/dist/core/performance/index.js +4 -0
  198. package/dist/core/performance/index.js.map +1 -1
  199. package/dist/core/performance/lazy-context-loader.js +4 -0
  200. package/dist/core/performance/lazy-context-loader.js.map +1 -1
  201. package/dist/core/performance/monitor.js +4 -0
  202. package/dist/core/performance/monitor.js.map +1 -1
  203. package/dist/core/performance/optimized-frame-context.js +4 -0
  204. package/dist/core/performance/optimized-frame-context.js.map +1 -1
  205. package/dist/core/performance/performance-benchmark.js +4 -0
  206. package/dist/core/performance/performance-benchmark.js.map +1 -1
  207. package/dist/core/performance/performance-profiler.js +4 -0
  208. package/dist/core/performance/performance-profiler.js.map +1 -1
  209. package/dist/core/performance/streaming-jsonl-parser.js +4 -0
  210. package/dist/core/performance/streaming-jsonl-parser.js.map +1 -1
  211. package/dist/core/persistence/postgres-adapter.js +4 -0
  212. package/dist/core/persistence/postgres-adapter.js.map +1 -1
  213. package/dist/core/projects/project-isolation.js +4 -0
  214. package/dist/core/projects/project-isolation.js.map +1 -1
  215. package/dist/core/projects/project-manager.js +4 -0
  216. package/dist/core/projects/project-manager.js.map +1 -1
  217. package/dist/core/query/query-parser.js +4 -0
  218. package/dist/core/query/query-parser.js.map +1 -1
  219. package/dist/core/query/query-templates.js +4 -0
  220. package/dist/core/query/query-templates.js.map +1 -1
  221. package/dist/core/retrieval/context-retriever.js +4 -0
  222. package/dist/core/retrieval/context-retriever.js.map +1 -1
  223. package/dist/core/retrieval/graph-retrieval.js +4 -0
  224. package/dist/core/retrieval/graph-retrieval.js.map +1 -1
  225. package/dist/core/retrieval/hierarchical-retrieval.js +4 -0
  226. package/dist/core/retrieval/hierarchical-retrieval.js.map +1 -1
  227. package/dist/core/retrieval/index.js +4 -0
  228. package/dist/core/retrieval/index.js.map +1 -1
  229. package/dist/core/retrieval/llm-context-retrieval.js +4 -0
  230. package/dist/core/retrieval/llm-context-retrieval.js.map +1 -1
  231. package/dist/core/retrieval/retrieval-benchmarks.js +4 -0
  232. package/dist/core/retrieval/retrieval-benchmarks.js.map +1 -1
  233. package/dist/core/retrieval/summary-generator.js +4 -0
  234. package/dist/core/retrieval/summary-generator.js.map +1 -1
  235. package/dist/core/retrieval/types.js +4 -0
  236. package/dist/core/retrieval/types.js.map +1 -1
  237. package/dist/core/session/clear-survival.js +4 -0
  238. package/dist/core/session/clear-survival.js.map +1 -1
  239. package/dist/core/session/enhanced-handoff.js +4 -0
  240. package/dist/core/session/enhanced-handoff.js.map +1 -1
  241. package/dist/core/session/handoff-generator.js +4 -0
  242. package/dist/core/session/handoff-generator.js.map +1 -1
  243. package/dist/core/session/index.js +4 -0
  244. package/dist/core/session/index.js.map +1 -1
  245. package/dist/core/session/session-manager.js +4 -0
  246. package/dist/core/session/session-manager.js.map +1 -1
  247. package/dist/core/skills/index.js +4 -0
  248. package/dist/core/skills/index.js.map +1 -1
  249. package/dist/core/skills/skill-storage.js +4 -0
  250. package/dist/core/skills/skill-storage.js.map +1 -1
  251. package/dist/core/skills/types.js +4 -0
  252. package/dist/core/skills/types.js.map +1 -1
  253. package/dist/core/storage/chromadb-adapter.js +4 -0
  254. package/dist/core/storage/chromadb-adapter.js.map +1 -1
  255. package/dist/core/storage/infinite-storage.js +4 -0
  256. package/dist/core/storage/infinite-storage.js.map +1 -1
  257. package/dist/core/storage/railway-optimized-storage.js +4 -0
  258. package/dist/core/storage/railway-optimized-storage.js.map +1 -1
  259. package/dist/core/storage/remote-storage.js +4 -0
  260. package/dist/core/storage/remote-storage.js.map +1 -1
  261. package/dist/core/storage/two-tier-storage.js +4 -0
  262. package/dist/core/storage/two-tier-storage.js.map +1 -1
  263. package/dist/core/trace/cli-trace-wrapper.js +4 -0
  264. package/dist/core/trace/cli-trace-wrapper.js.map +1 -1
  265. package/dist/core/trace/db-trace-wrapper.js +4 -0
  266. package/dist/core/trace/db-trace-wrapper.js.map +1 -1
  267. package/dist/core/trace/debug-trace.js +4 -0
  268. package/dist/core/trace/debug-trace.js.map +1 -1
  269. package/dist/core/trace/index.js +4 -0
  270. package/dist/core/trace/index.js.map +1 -1
  271. package/dist/core/trace/linear-api-wrapper.js +4 -0
  272. package/dist/core/trace/linear-api-wrapper.js.map +1 -1
  273. package/dist/core/trace/trace-demo.js +4 -0
  274. package/dist/core/trace/trace-demo.js.map +1 -1
  275. package/dist/core/trace/trace-detector.demo.js +4 -0
  276. package/dist/core/trace/trace-detector.demo.js.map +1 -1
  277. package/dist/core/trace/trace-detector.js +4 -0
  278. package/dist/core/trace/trace-detector.js.map +1 -1
  279. package/dist/core/trace/trace-store.js +4 -0
  280. package/dist/core/trace/trace-store.js.map +1 -1
  281. package/dist/core/trace/types.js +4 -0
  282. package/dist/core/trace/types.js.map +1 -1
  283. package/dist/core/types.js +4 -0
  284. package/dist/core/utils/compression.js +4 -0
  285. package/dist/core/utils/compression.js.map +1 -1
  286. package/dist/core/utils/update-checker.js +4 -0
  287. package/dist/core/utils/update-checker.js.map +1 -1
  288. package/dist/core/worktree/worktree-manager.js +4 -0
  289. package/dist/core/worktree/worktree-manager.js.map +1 -1
  290. package/dist/daemon/session-daemon.js +4 -0
  291. package/dist/daemon/session-daemon.js.map +1 -1
  292. package/dist/features/analytics/api/analytics-api.js +4 -0
  293. package/dist/features/analytics/api/analytics-api.js.map +1 -1
  294. package/dist/features/analytics/core/analytics-service.js +4 -0
  295. package/dist/features/analytics/core/analytics-service.js.map +1 -1
  296. package/dist/features/analytics/index.js +4 -0
  297. package/dist/features/analytics/index.js.map +1 -1
  298. package/dist/features/analytics/queries/metrics-queries.js +4 -0
  299. package/dist/features/analytics/queries/metrics-queries.js.map +1 -1
  300. package/dist/features/analytics/types/metrics.js +4 -0
  301. package/dist/features/browser/browser-mcp.js +4 -0
  302. package/dist/features/browser/browser-mcp.js.map +1 -1
  303. package/dist/features/tasks/linear-task-manager.js +4 -0
  304. package/dist/features/tasks/linear-task-manager.js.map +1 -1
  305. package/dist/features/tasks/task-aware-context.js +4 -0
  306. package/dist/features/tasks/task-aware-context.js.map +1 -1
  307. package/dist/features/tui/simple-monitor.js +4 -0
  308. package/dist/features/tui/simple-monitor.js.map +1 -1
  309. package/dist/features/tui/swarm-monitor.js +4 -0
  310. package/dist/features/tui/swarm-monitor.js.map +1 -1
  311. package/dist/features/web/client/stores/task-store.js +4 -0
  312. package/dist/features/web/client/stores/task-store.js.map +1 -1
  313. package/dist/features/web/server/index.js +4 -0
  314. package/dist/features/web/server/index.js.map +1 -1
  315. package/dist/hooks/config.js +150 -0
  316. package/dist/hooks/config.js.map +7 -0
  317. package/dist/hooks/daemon.js +364 -0
  318. package/dist/hooks/daemon.js.map +7 -0
  319. package/dist/hooks/events.js +55 -0
  320. package/dist/hooks/events.js.map +7 -0
  321. package/dist/hooks/index.js +8 -0
  322. package/dist/hooks/index.js.map +7 -0
  323. package/dist/index.js +4 -0
  324. package/dist/index.js.map +1 -1
  325. package/dist/integrations/anthropic/client.js +4 -0
  326. package/dist/integrations/anthropic/client.js.map +1 -1
  327. package/dist/integrations/claude-code/agent-bridge.js +4 -0
  328. package/dist/integrations/claude-code/agent-bridge.js.map +1 -1
  329. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +4 -0
  330. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +1 -1
  331. package/dist/integrations/claude-code/lifecycle-hooks.js +4 -0
  332. package/dist/integrations/claude-code/lifecycle-hooks.js.map +1 -1
  333. package/dist/integrations/claude-code/post-task-hooks.js +4 -0
  334. package/dist/integrations/claude-code/post-task-hooks.js.map +1 -1
  335. package/dist/integrations/claude-code/subagent-client-stub.js +4 -0
  336. package/dist/integrations/claude-code/subagent-client-stub.js.map +1 -1
  337. package/dist/integrations/claude-code/subagent-client.js +4 -0
  338. package/dist/integrations/claude-code/subagent-client.js.map +1 -1
  339. package/dist/integrations/claude-code/task-coordinator.js +4 -0
  340. package/dist/integrations/claude-code/task-coordinator.js.map +1 -1
  341. package/dist/integrations/linear/auth.js +4 -0
  342. package/dist/integrations/linear/auth.js.map +1 -1
  343. package/dist/integrations/linear/auto-sync.js +4 -0
  344. package/dist/integrations/linear/auto-sync.js.map +1 -1
  345. package/dist/integrations/linear/client.js +4 -0
  346. package/dist/integrations/linear/client.js.map +1 -1
  347. package/dist/integrations/linear/config.js +4 -0
  348. package/dist/integrations/linear/config.js.map +1 -1
  349. package/dist/integrations/linear/migration.js +4 -0
  350. package/dist/integrations/linear/migration.js.map +1 -1
  351. package/dist/integrations/linear/oauth-server.js +4 -0
  352. package/dist/integrations/linear/oauth-server.js.map +1 -1
  353. package/dist/integrations/linear/rest-client.js +4 -0
  354. package/dist/integrations/linear/rest-client.js.map +1 -1
  355. package/dist/integrations/linear/sync-manager.js +4 -0
  356. package/dist/integrations/linear/sync-manager.js.map +1 -1
  357. package/dist/integrations/linear/sync-service.js +4 -0
  358. package/dist/integrations/linear/sync-service.js.map +1 -1
  359. package/dist/integrations/linear/sync.js +4 -0
  360. package/dist/integrations/linear/sync.js.map +1 -1
  361. package/dist/integrations/linear/types.js +4 -0
  362. package/dist/integrations/linear/unified-sync.js +4 -0
  363. package/dist/integrations/linear/unified-sync.js.map +1 -1
  364. package/dist/integrations/linear/webhook-handler.js +4 -0
  365. package/dist/integrations/linear/webhook-handler.js.map +1 -1
  366. package/dist/integrations/linear/webhook-server.js +4 -0
  367. package/dist/integrations/linear/webhook-server.js.map +1 -1
  368. package/dist/integrations/linear/webhook.js +4 -0
  369. package/dist/integrations/linear/webhook.js.map +1 -1
  370. package/dist/integrations/mcp/handlers/code-execution-handlers.js +4 -0
  371. package/dist/integrations/mcp/handlers/code-execution-handlers.js.map +1 -1
  372. package/dist/integrations/mcp/handlers/context-handlers.js +4 -0
  373. package/dist/integrations/mcp/handlers/context-handlers.js.map +1 -1
  374. package/dist/integrations/mcp/handlers/index.js +4 -0
  375. package/dist/integrations/mcp/handlers/index.js.map +1 -1
  376. package/dist/integrations/mcp/handlers/linear-handlers.js +4 -0
  377. package/dist/integrations/mcp/handlers/linear-handlers.js.map +1 -1
  378. package/dist/integrations/mcp/handlers/skill-handlers.js +4 -0
  379. package/dist/integrations/mcp/handlers/skill-handlers.js.map +1 -1
  380. package/dist/integrations/mcp/handlers/task-handlers.js +4 -0
  381. package/dist/integrations/mcp/handlers/task-handlers.js.map +1 -1
  382. package/dist/integrations/mcp/handlers/trace-handlers.js +4 -0
  383. package/dist/integrations/mcp/handlers/trace-handlers.js.map +1 -1
  384. package/dist/integrations/mcp/index.js +4 -0
  385. package/dist/integrations/mcp/index.js.map +1 -1
  386. package/dist/integrations/mcp/middleware/tool-scoring.js +4 -0
  387. package/dist/integrations/mcp/middleware/tool-scoring.js.map +1 -1
  388. package/dist/integrations/mcp/refactored-server.js +4 -0
  389. package/dist/integrations/mcp/refactored-server.js.map +1 -1
  390. package/dist/integrations/mcp/server.js +4 -0
  391. package/dist/integrations/mcp/server.js.map +1 -1
  392. package/dist/integrations/mcp/tool-definitions-code.js +4 -0
  393. package/dist/integrations/mcp/tool-definitions-code.js.map +1 -1
  394. package/dist/integrations/mcp/tool-definitions.js +4 -0
  395. package/dist/integrations/mcp/tool-definitions.js.map +1 -1
  396. package/dist/integrations/mcp/trace-test.js +4 -0
  397. package/dist/integrations/mcp/trace-test.js.map +1 -1
  398. package/dist/integrations/pg-aiguide/embedding-provider.js +4 -0
  399. package/dist/integrations/pg-aiguide/embedding-provider.js.map +1 -1
  400. package/dist/integrations/pg-aiguide/semantic-search.js +4 -0
  401. package/dist/integrations/pg-aiguide/semantic-search.js.map +1 -1
  402. package/dist/integrations/pg-aiguide/timescale-analytics.js +4 -0
  403. package/dist/integrations/pg-aiguide/timescale-analytics.js.map +1 -1
  404. package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js +4 -0
  405. package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +1 -1
  406. package/dist/integrations/ralph/context/context-budget-manager.js +4 -0
  407. package/dist/integrations/ralph/context/context-budget-manager.js.map +1 -1
  408. package/dist/integrations/ralph/context/stackmemory-context-loader.js +4 -0
  409. package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +1 -1
  410. package/dist/integrations/ralph/coordination/enhanced-coordination.js +4 -0
  411. package/dist/integrations/ralph/coordination/enhanced-coordination.js.map +1 -1
  412. package/dist/integrations/ralph/index.js +4 -0
  413. package/dist/integrations/ralph/index.js.map +1 -1
  414. package/dist/integrations/ralph/learning/pattern-learner.js +4 -0
  415. package/dist/integrations/ralph/learning/pattern-learner.js.map +1 -1
  416. package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js +4 -0
  417. package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js.map +1 -1
  418. package/dist/integrations/ralph/monitoring/swarm-dashboard.js +4 -0
  419. package/dist/integrations/ralph/monitoring/swarm-dashboard.js.map +1 -1
  420. package/dist/integrations/ralph/monitoring/swarm-registry.js +4 -0
  421. package/dist/integrations/ralph/monitoring/swarm-registry.js.map +1 -1
  422. package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js +4 -0
  423. package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +1 -1
  424. package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js +4 -0
  425. package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js.map +1 -1
  426. package/dist/integrations/ralph/patterns/extended-coherence-sessions.js +4 -0
  427. package/dist/integrations/ralph/patterns/extended-coherence-sessions.js.map +1 -1
  428. package/dist/integrations/ralph/patterns/oracle-worker-pattern.js +4 -0
  429. package/dist/integrations/ralph/patterns/oracle-worker-pattern.js.map +1 -1
  430. package/dist/integrations/ralph/performance/performance-optimizer.js +4 -0
  431. package/dist/integrations/ralph/performance/performance-optimizer.js.map +1 -1
  432. package/dist/integrations/ralph/ralph-integration-demo.js +4 -0
  433. package/dist/integrations/ralph/ralph-integration-demo.js.map +1 -1
  434. package/dist/integrations/ralph/recovery/crash-recovery.js +4 -0
  435. package/dist/integrations/ralph/recovery/crash-recovery.js.map +1 -1
  436. package/dist/integrations/ralph/state/state-reconciler.js +4 -0
  437. package/dist/integrations/ralph/state/state-reconciler.js.map +1 -1
  438. package/dist/integrations/ralph/swarm/git-workflow-manager.js +4 -0
  439. package/dist/integrations/ralph/swarm/git-workflow-manager.js.map +1 -1
  440. package/dist/integrations/ralph/swarm/swarm-coordinator.js +4 -0
  441. package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +1 -1
  442. package/dist/integrations/ralph/types.js +4 -0
  443. package/dist/integrations/ralph/visualization/ralph-debugger.js +4 -0
  444. package/dist/integrations/ralph/visualization/ralph-debugger.js.map +1 -1
  445. package/dist/mcp/stackmemory-mcp-server.js +4 -0
  446. package/dist/mcp/stackmemory-mcp-server.js.map +1 -1
  447. package/dist/middleware/exponential-rate-limiter.js +4 -0
  448. package/dist/middleware/exponential-rate-limiter.js.map +1 -1
  449. package/dist/models/user.model.js +4 -0
  450. package/dist/models/user.model.js.map +1 -1
  451. package/dist/servers/production/auth-middleware.js +4 -0
  452. package/dist/servers/production/auth-middleware.js.map +1 -1
  453. package/dist/servers/railway/config.js +4 -0
  454. package/dist/servers/railway/config.js.map +1 -1
  455. package/dist/servers/railway/index-enhanced.js +4 -0
  456. package/dist/servers/railway/index-enhanced.js.map +1 -1
  457. package/dist/servers/railway/index.js +4 -0
  458. package/dist/servers/railway/index.js.map +1 -1
  459. package/dist/servers/railway/simple.js +4 -0
  460. package/dist/servers/railway/simple.js.map +1 -1
  461. package/dist/servers/railway/storage-test.js +4 -0
  462. package/dist/servers/railway/storage-test.js.map +1 -1
  463. package/dist/services/config-service.js +4 -0
  464. package/dist/services/config-service.js.map +1 -1
  465. package/dist/services/context-service.js +4 -0
  466. package/dist/services/context-service.js.map +1 -1
  467. package/dist/skills/api-discovery.js +353 -0
  468. package/dist/skills/api-discovery.js.map +7 -0
  469. package/dist/skills/api-skill.js +475 -0
  470. package/dist/skills/api-skill.js.map +7 -0
  471. package/dist/skills/claude-skills.js +53 -1
  472. package/dist/skills/claude-skills.js.map +2 -2
  473. package/dist/skills/dashboard-launcher.js +4 -0
  474. package/dist/skills/dashboard-launcher.js.map +1 -1
  475. package/dist/skills/recursive-agent-orchestrator.js +4 -0
  476. package/dist/skills/recursive-agent-orchestrator.js.map +1 -1
  477. package/dist/skills/repo-ingestion-skill.js +4 -0
  478. package/dist/skills/repo-ingestion-skill.js.map +1 -1
  479. package/dist/skills/security-secrets-scanner.js +4 -0
  480. package/dist/skills/security-secrets-scanner.js.map +1 -1
  481. package/dist/skills/unified-rlm-orchestrator.js +4 -0
  482. package/dist/skills/unified-rlm-orchestrator.js.map +1 -1
  483. package/dist/types/task.js +4 -0
  484. package/dist/utils/env.js +4 -0
  485. package/dist/utils/env.js.map +1 -1
  486. package/dist/utils/formatting.js +4 -0
  487. package/dist/utils/formatting.js.map +1 -1
  488. package/dist/utils/process-cleanup.js +136 -0
  489. package/dist/utils/process-cleanup.js.map +7 -0
  490. package/dist/validation/schemas.js +4 -0
  491. package/dist/validation/schemas.js.map +1 -1
  492. package/package.json +4 -2
  493. package/templates/shell/sweep-complete.zsh +116 -0
  494. package/templates/shell/sweep-suggest.js +161 -0
@@ -0,0 +1,475 @@
1
+ import { fileURLToPath as __fileURLToPath } from 'url';
2
+ import { dirname as __pathDirname } from 'path';
3
+ const __filename = __fileURLToPath(import.meta.url);
4
+ const __dirname = __pathDirname(__filename);
5
+ import { execSync } from "child_process";
6
+ import * as fs from "fs";
7
+ import * as path from "path";
8
+ import * as os from "os";
9
+ import { logger } from "../core/monitoring/logger.js";
10
+ class APISkill {
11
+ registryPath;
12
+ restishConfigPath;
13
+ registry;
14
+ constructor() {
15
+ this.registryPath = path.join(
16
+ os.homedir(),
17
+ ".stackmemory",
18
+ "api-registry.json"
19
+ );
20
+ this.restishConfigPath = process.platform === "darwin" ? path.join(
21
+ os.homedir(),
22
+ "Library",
23
+ "Application Support",
24
+ "restish",
25
+ "apis.json"
26
+ ) : path.join(os.homedir(), ".config", "restish", "apis.json");
27
+ this.registry = this.loadRegistry();
28
+ }
29
+ loadRegistry() {
30
+ try {
31
+ if (fs.existsSync(this.registryPath)) {
32
+ return JSON.parse(fs.readFileSync(this.registryPath, "utf-8"));
33
+ }
34
+ } catch (error) {
35
+ logger.warn("Failed to load API registry:", error);
36
+ }
37
+ return { apis: {}, version: "1.0.0" };
38
+ }
39
+ saveRegistry() {
40
+ const dir = path.dirname(this.registryPath);
41
+ if (!fs.existsSync(dir)) {
42
+ fs.mkdirSync(dir, { recursive: true });
43
+ }
44
+ fs.writeFileSync(this.registryPath, JSON.stringify(this.registry, null, 2));
45
+ }
46
+ /**
47
+ * Load restish config
48
+ */
49
+ loadRestishConfig() {
50
+ try {
51
+ if (fs.existsSync(this.restishConfigPath)) {
52
+ return JSON.parse(fs.readFileSync(this.restishConfigPath, "utf-8"));
53
+ }
54
+ } catch (error) {
55
+ logger.warn("Failed to load restish config:", error);
56
+ }
57
+ return {};
58
+ }
59
+ /**
60
+ * Save restish config
61
+ */
62
+ saveRestishConfig(config) {
63
+ const dir = path.dirname(this.restishConfigPath);
64
+ if (!fs.existsSync(dir)) {
65
+ fs.mkdirSync(dir, { recursive: true });
66
+ }
67
+ fs.writeFileSync(this.restishConfigPath, JSON.stringify(config, null, 2));
68
+ }
69
+ /**
70
+ * Check if restish is installed
71
+ */
72
+ checkRestish() {
73
+ try {
74
+ execSync("which restish", { stdio: "pipe" });
75
+ return true;
76
+ } catch {
77
+ return false;
78
+ }
79
+ }
80
+ /**
81
+ * Add/register a new API
82
+ */
83
+ async add(name, baseUrl, options) {
84
+ if (!this.checkRestish()) {
85
+ return {
86
+ success: false,
87
+ message: "restish not installed. Run: brew install restish"
88
+ };
89
+ }
90
+ try {
91
+ const restishConfig = this.loadRestishConfig();
92
+ const apiConfig = {
93
+ base: baseUrl
94
+ };
95
+ if (options?.spec) {
96
+ apiConfig.spec_files = [options.spec];
97
+ }
98
+ if (options?.authType === "api-key" && options?.envVar) {
99
+ apiConfig.profiles = {
100
+ default: {
101
+ headers: {
102
+ [options.headerName || "Authorization"]: `$${options.envVar}`
103
+ }
104
+ }
105
+ };
106
+ }
107
+ restishConfig[name] = apiConfig;
108
+ this.saveRestishConfig(restishConfig);
109
+ const config = {
110
+ name,
111
+ baseUrl,
112
+ specUrl: options?.spec,
113
+ authType: options?.authType || "none",
114
+ authConfig: {
115
+ headerName: options?.headerName || "Authorization",
116
+ envVar: options?.envVar
117
+ },
118
+ registeredAt: (/* @__PURE__ */ new Date()).toISOString()
119
+ };
120
+ if (options?.spec) {
121
+ config.specUrl = options.spec;
122
+ }
123
+ this.registry.apis[name] = config;
124
+ this.saveRegistry();
125
+ return {
126
+ success: true,
127
+ message: `API '${name}' registered successfully`,
128
+ data: {
129
+ name,
130
+ baseUrl,
131
+ authType: config.authType,
132
+ operations: config.operations?.length || "auto-discovered"
133
+ }
134
+ };
135
+ } catch (error) {
136
+ logger.error("Failed to add API:", error);
137
+ return {
138
+ success: false,
139
+ message: `Failed to register API: ${error.message}`
140
+ };
141
+ }
142
+ }
143
+ /**
144
+ * Discover available operations for an API
145
+ */
146
+ discoverOperations(apiName) {
147
+ try {
148
+ const output = execSync(`restish ${apiName} --help 2>&1`, {
149
+ encoding: "utf-8",
150
+ stdio: ["pipe", "pipe", "pipe"]
151
+ });
152
+ const operations = [];
153
+ const lines = output.split("\n");
154
+ let inCommands = false;
155
+ for (const line of lines) {
156
+ if (line.includes("Available Commands:")) {
157
+ inCommands = true;
158
+ continue;
159
+ }
160
+ if (inCommands && line.trim()) {
161
+ const match = line.match(/^\s+(\S+)/);
162
+ if (match && !line.includes("help")) {
163
+ operations.push(match[1]);
164
+ }
165
+ }
166
+ if (inCommands && line.includes("Flags:")) {
167
+ break;
168
+ }
169
+ }
170
+ return operations;
171
+ } catch {
172
+ return [];
173
+ }
174
+ }
175
+ /**
176
+ * List registered APIs
177
+ */
178
+ async list() {
179
+ const apis = Object.values(this.registry.apis);
180
+ if (apis.length === 0) {
181
+ return {
182
+ success: true,
183
+ message: "No APIs registered. Use /api add <name> <url> to register one.",
184
+ data: []
185
+ };
186
+ }
187
+ return {
188
+ success: true,
189
+ message: `${apis.length} API(s) registered`,
190
+ data: apis.map((api) => ({
191
+ name: api.name,
192
+ baseUrl: api.baseUrl,
193
+ authType: api.authType,
194
+ operations: api.operations?.length || "unknown",
195
+ registeredAt: api.registeredAt
196
+ }))
197
+ };
198
+ }
199
+ /**
200
+ * Show details for a specific API
201
+ */
202
+ async describe(apiName, operation) {
203
+ const api = this.registry.apis[apiName];
204
+ if (!api) {
205
+ try {
206
+ const output = execSync(`restish api show ${apiName}`, {
207
+ encoding: "utf-8",
208
+ stdio: ["pipe", "pipe", "pipe"]
209
+ });
210
+ return {
211
+ success: true,
212
+ message: `API '${apiName}' (from restish config)`,
213
+ data: { raw: output }
214
+ };
215
+ } catch {
216
+ return {
217
+ success: false,
218
+ message: `API '${apiName}' not found`
219
+ };
220
+ }
221
+ }
222
+ if (operation) {
223
+ try {
224
+ const output = execSync(`restish ${apiName} ${operation} --help`, {
225
+ encoding: "utf-8",
226
+ stdio: ["pipe", "pipe", "pipe"]
227
+ });
228
+ return {
229
+ success: true,
230
+ message: `Operation: ${apiName}.${operation}`,
231
+ data: {
232
+ operation,
233
+ help: output
234
+ }
235
+ };
236
+ } catch {
237
+ return {
238
+ success: false,
239
+ message: `Operation '${operation}' not found for API '${apiName}'`
240
+ };
241
+ }
242
+ }
243
+ const operations = this.discoverOperations(apiName);
244
+ api.operations = operations;
245
+ this.saveRegistry();
246
+ return {
247
+ success: true,
248
+ message: `API: ${apiName}`,
249
+ data: {
250
+ ...api,
251
+ operations
252
+ }
253
+ };
254
+ }
255
+ /**
256
+ * Execute an API operation
257
+ */
258
+ async exec(apiName, operation, params, options) {
259
+ if (!this.checkRestish()) {
260
+ return {
261
+ success: false,
262
+ message: "restish not installed. Run: brew install restish"
263
+ };
264
+ }
265
+ const api = this.registry.apis[apiName];
266
+ if (!api) {
267
+ return {
268
+ success: false,
269
+ message: `API '${apiName}' not registered. Use /api add first.`
270
+ };
271
+ }
272
+ const urlPath = operation.startsWith("/") ? operation : `/${operation}`;
273
+ const fullUrl = `${api.baseUrl}${urlPath}`;
274
+ const args = ["get", fullUrl];
275
+ if (options?.raw) {
276
+ args.push("--rsh-raw");
277
+ }
278
+ if (options?.filter) {
279
+ args.push("--rsh-filter", options.filter);
280
+ }
281
+ if (api?.authConfig?.envVar) {
282
+ const token = process.env[api.authConfig.envVar];
283
+ if (token) {
284
+ const headerName = api.authConfig.headerName || "Authorization";
285
+ args.push("-H", `${headerName}:${token}`);
286
+ }
287
+ }
288
+ if (options?.headers) {
289
+ for (const [key, value] of Object.entries(options.headers)) {
290
+ args.push("-H", `${key}:${value}`);
291
+ }
292
+ }
293
+ if (params) {
294
+ for (const [key, value] of Object.entries(params)) {
295
+ args.push("-q", `${key}=${String(value)}`);
296
+ }
297
+ }
298
+ args.push("-o", "json");
299
+ try {
300
+ logger.info(`Executing: restish ${args.join(" ")}`);
301
+ const output = execSync(`restish ${args.join(" ")}`, {
302
+ encoding: "utf-8",
303
+ stdio: ["pipe", "pipe", "pipe"],
304
+ env: process.env
305
+ });
306
+ let data;
307
+ try {
308
+ data = JSON.parse(output);
309
+ } catch {
310
+ data = output;
311
+ }
312
+ return {
313
+ success: true,
314
+ message: `${apiName} ${operation} executed`,
315
+ data
316
+ };
317
+ } catch (error) {
318
+ const stderr = error.stderr?.toString() || error.message;
319
+ logger.error(`API exec failed:`, stderr);
320
+ return {
321
+ success: false,
322
+ message: `API call failed: ${stderr}`
323
+ };
324
+ }
325
+ }
326
+ /**
327
+ * Configure authentication for an API
328
+ */
329
+ async auth(apiName, options) {
330
+ const api = this.registry.apis[apiName];
331
+ if (!api) {
332
+ return {
333
+ success: false,
334
+ message: `API '${apiName}' not registered. Use /api add first.`
335
+ };
336
+ }
337
+ if (options.token) {
338
+ const envVar = options.envVar || `${apiName.toUpperCase()}_API_KEY`;
339
+ process.env[envVar] = options.token;
340
+ api.authType = "api-key";
341
+ api.authConfig = {
342
+ ...api.authConfig,
343
+ envVar
344
+ };
345
+ this.saveRegistry();
346
+ return {
347
+ success: true,
348
+ message: `Auth configured for '${apiName}'. Token stored in ${envVar}`,
349
+ data: { envVar }
350
+ };
351
+ }
352
+ if (options.oauth) {
353
+ try {
354
+ const scopeArg = options.scopes ? `--scopes=${options.scopes.join(",")}` : "";
355
+ execSync(`restish api configure ${apiName} --auth=oauth2 ${scopeArg}`, {
356
+ stdio: "inherit"
357
+ });
358
+ api.authType = "oauth2";
359
+ this.saveRegistry();
360
+ return {
361
+ success: true,
362
+ message: `OAuth2 configured for '${apiName}'`
363
+ };
364
+ } catch (error) {
365
+ return {
366
+ success: false,
367
+ message: `OAuth setup failed: ${error.message}`
368
+ };
369
+ }
370
+ }
371
+ return {
372
+ success: false,
373
+ message: "Specify --token or --oauth"
374
+ };
375
+ }
376
+ /**
377
+ * Remove an API
378
+ */
379
+ async remove(apiName) {
380
+ if (!this.registry.apis[apiName]) {
381
+ return {
382
+ success: false,
383
+ message: `API '${apiName}' not found`
384
+ };
385
+ }
386
+ delete this.registry.apis[apiName];
387
+ this.saveRegistry();
388
+ return {
389
+ success: true,
390
+ message: `API '${apiName}' removed`
391
+ };
392
+ }
393
+ /**
394
+ * Sync API spec (refresh operations)
395
+ */
396
+ async sync(apiName) {
397
+ if (!this.checkRestish()) {
398
+ return {
399
+ success: false,
400
+ message: "restish not installed. Run: brew install restish"
401
+ };
402
+ }
403
+ try {
404
+ execSync(`restish api sync ${apiName}`, { stdio: "pipe" });
405
+ const operations = this.discoverOperations(apiName);
406
+ if (this.registry.apis[apiName]) {
407
+ this.registry.apis[apiName].operations = operations;
408
+ this.saveRegistry();
409
+ }
410
+ return {
411
+ success: true,
412
+ message: `API '${apiName}' synced`,
413
+ data: { operations }
414
+ };
415
+ } catch (error) {
416
+ return {
417
+ success: false,
418
+ message: `Sync failed: ${error.message}`
419
+ };
420
+ }
421
+ }
422
+ /**
423
+ * Get help for the API skill
424
+ */
425
+ getHelp() {
426
+ return `
427
+ /api - OpenAPI-based API access via Restish
428
+
429
+ Commands:
430
+ /api add <name> <url> [--spec <url>] [--auth-type api-key|oauth2]
431
+ Register a new API
432
+
433
+ /api list
434
+ List all registered APIs
435
+
436
+ /api describe <name> [operation]
437
+ Show API details or specific operation
438
+
439
+ /api exec <name> <operation> [--param value...]
440
+ Execute an API operation
441
+
442
+ /api auth <name> --token <token> [--env-var NAME]
443
+ Configure API authentication
444
+
445
+ /api auth <name> --oauth [--scopes scope1,scope2]
446
+ Configure OAuth2 authentication
447
+
448
+ /api sync <name>
449
+ Refresh API operations from spec
450
+
451
+ /api remove <name>
452
+ Remove a registered API
453
+
454
+ Examples:
455
+ /api add github https://api.github.com --spec https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json
456
+ /api auth github --token "$GITHUB_TOKEN"
457
+ /api exec github repos list-for-user --username octocat
458
+ /api exec github issues list --owner microsoft --repo vscode --state open
459
+
460
+ Built on restish (https://rest.sh) for automatic OpenAPI discovery.
461
+ `;
462
+ }
463
+ }
464
+ let apiSkillInstance = null;
465
+ function getAPISkill() {
466
+ if (!apiSkillInstance) {
467
+ apiSkillInstance = new APISkill();
468
+ }
469
+ return apiSkillInstance;
470
+ }
471
+ export {
472
+ APISkill,
473
+ getAPISkill
474
+ };
475
+ //# sourceMappingURL=api-skill.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/skills/api-skill.ts"],
4
+ "sourcesContent": ["/**\n * API Skill - OpenAPI-based API access via Restish\n *\n * Wraps the restish CLI to provide zero-code API integration\n * based on OpenAPI specifications.\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';\nimport type { SkillResult } from './claude-skills.js';\n\nexport interface APIConfig {\n name: string;\n baseUrl: string;\n specUrl?: string;\n authType: 'none' | 'api-key' | 'oauth2' | 'basic';\n authConfig?: {\n headerName?: string;\n queryParam?: string;\n envVar?: string;\n };\n registeredAt: string;\n operations?: string[];\n}\n\nexport interface APIRegistry {\n apis: Record<string, APIConfig>;\n version: string;\n}\n\nexport class APISkill {\n private registryPath: string;\n private restishConfigPath: string;\n private registry: APIRegistry;\n\n constructor() {\n this.registryPath = path.join(\n os.homedir(),\n '.stackmemory',\n 'api-registry.json'\n );\n // Platform-specific restish config path\n // Mac: ~/Library/Application Support/restish/apis.json\n // Linux: ~/.config/restish/apis.json\n // Windows: %AppData%/restish/apis.json\n this.restishConfigPath =\n process.platform === 'darwin'\n ? path.join(\n os.homedir(),\n 'Library',\n 'Application Support',\n 'restish',\n 'apis.json'\n )\n : path.join(os.homedir(), '.config', 'restish', 'apis.json');\n this.registry = this.loadRegistry();\n }\n\n private loadRegistry(): APIRegistry {\n try {\n if (fs.existsSync(this.registryPath)) {\n return JSON.parse(fs.readFileSync(this.registryPath, 'utf-8'));\n }\n } catch (error) {\n logger.warn('Failed to load API registry:', error);\n }\n return { apis: {}, version: '1.0.0' };\n }\n\n private saveRegistry(): void {\n const dir = path.dirname(this.registryPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(this.registryPath, JSON.stringify(this.registry, null, 2));\n }\n\n /**\n * Load restish config\n */\n private loadRestishConfig(): Record<string, unknown> {\n try {\n if (fs.existsSync(this.restishConfigPath)) {\n return JSON.parse(fs.readFileSync(this.restishConfigPath, 'utf-8'));\n }\n } catch (error) {\n logger.warn('Failed to load restish config:', error);\n }\n return {};\n }\n\n /**\n * Save restish config\n */\n private saveRestishConfig(config: Record<string, unknown>): void {\n const dir = path.dirname(this.restishConfigPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(this.restishConfigPath, JSON.stringify(config, null, 2));\n }\n\n /**\n * Check if restish is installed\n */\n private checkRestish(): boolean {\n try {\n execSync('which restish', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Add/register a new API\n */\n async add(\n name: string,\n baseUrl: string,\n options?: {\n spec?: string;\n authType?: 'none' | 'api-key' | 'oauth2' | 'basic';\n headerName?: string;\n envVar?: string;\n }\n ): Promise<SkillResult> {\n if (!this.checkRestish()) {\n return {\n success: false,\n message: 'restish not installed. Run: brew install restish',\n };\n }\n\n try {\n // Configure restish for this API by writing directly to config\n const restishConfig = this.loadRestishConfig();\n\n // Build restish API config\n const apiConfig: Record<string, unknown> = {\n base: baseUrl,\n };\n\n // Add spec URL if provided for auto-discovery\n if (options?.spec) {\n apiConfig.spec_files = [options.spec];\n }\n\n // Add auth config based on type\n if (options?.authType === 'api-key' && options?.envVar) {\n apiConfig.profiles = {\n default: {\n headers: {\n [options.headerName || 'Authorization']: `$${options.envVar}`,\n },\n },\n };\n }\n\n restishConfig[name] = apiConfig;\n this.saveRestishConfig(restishConfig);\n\n // Store in our registry\n const config: APIConfig = {\n name,\n baseUrl,\n specUrl: options?.spec,\n authType: options?.authType || 'none',\n authConfig: {\n headerName: options?.headerName || 'Authorization',\n envVar: options?.envVar,\n },\n registeredAt: new Date().toISOString(),\n };\n\n // Skip sync during add - it can be slow due to network requests\n // Users can manually sync with: stackmemory api sync <name>\n if (options?.spec) {\n config.specUrl = options.spec;\n }\n\n this.registry.apis[name] = config;\n this.saveRegistry();\n\n return {\n success: true,\n message: `API '${name}' registered successfully`,\n data: {\n name,\n baseUrl,\n authType: config.authType,\n operations: config.operations?.length || 'auto-discovered',\n },\n };\n } catch (error) {\n logger.error('Failed to add API:', error);\n return {\n success: false,\n message: `Failed to register API: ${error.message}`,\n };\n }\n }\n\n /**\n * Discover available operations for an API\n */\n private discoverOperations(apiName: string): string[] {\n try {\n const output = execSync(`restish ${apiName} --help 2>&1`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n // Parse operations from help output\n const operations: string[] = [];\n const lines = output.split('\\n');\n let inCommands = false;\n\n for (const line of lines) {\n if (line.includes('Available Commands:')) {\n inCommands = true;\n continue;\n }\n if (inCommands && line.trim()) {\n const match = line.match(/^\\s+(\\S+)/);\n if (match && !line.includes('help')) {\n operations.push(match[1]);\n }\n }\n if (inCommands && line.includes('Flags:')) {\n break;\n }\n }\n\n return operations;\n } catch {\n return [];\n }\n }\n\n /**\n * List registered APIs\n */\n async list(): Promise<SkillResult> {\n const apis = Object.values(this.registry.apis);\n\n if (apis.length === 0) {\n return {\n success: true,\n message:\n 'No APIs registered. Use /api add <name> <url> to register one.',\n data: [],\n };\n }\n\n return {\n success: true,\n message: `${apis.length} API(s) registered`,\n data: apis.map((api) => ({\n name: api.name,\n baseUrl: api.baseUrl,\n authType: api.authType,\n operations: api.operations?.length || 'unknown',\n registeredAt: api.registeredAt,\n })),\n };\n }\n\n /**\n * Show details for a specific API\n */\n async describe(apiName: string, operation?: string): Promise<SkillResult> {\n const api = this.registry.apis[apiName];\n\n if (!api) {\n // Try to get info directly from restish\n try {\n const output = execSync(`restish api show ${apiName}`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n return {\n success: true,\n message: `API '${apiName}' (from restish config)`,\n data: { raw: output },\n };\n } catch {\n return {\n success: false,\n message: `API '${apiName}' not found`,\n };\n }\n }\n\n if (operation) {\n // Get specific operation details\n try {\n const output = execSync(`restish ${apiName} ${operation} --help`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n return {\n success: true,\n message: `Operation: ${apiName}.${operation}`,\n data: {\n operation,\n help: output,\n },\n };\n } catch {\n return {\n success: false,\n message: `Operation '${operation}' not found for API '${apiName}'`,\n };\n }\n }\n\n // Get all operations\n const operations = this.discoverOperations(apiName);\n api.operations = operations;\n this.saveRegistry();\n\n return {\n success: true,\n message: `API: ${apiName}`,\n data: {\n ...api,\n operations,\n },\n };\n }\n\n /**\n * Execute an API operation\n */\n async exec(\n apiName: string,\n operation: string,\n params?: Record<string, unknown>,\n options?: {\n raw?: boolean;\n filter?: string;\n headers?: Record<string, string>;\n }\n ): Promise<SkillResult> {\n if (!this.checkRestish()) {\n return {\n success: false,\n message: 'restish not installed. Run: brew install restish',\n };\n }\n\n const api = this.registry.apis[apiName];\n if (!api) {\n return {\n success: false,\n message: `API '${apiName}' not registered. Use /api add first.`,\n };\n }\n\n // Build the URL path from operation\n // e.g., \"repos/owner/repo\" or \"/repos/owner/repo\"\n const urlPath = operation.startsWith('/') ? operation : `/${operation}`;\n const fullUrl = `${api.baseUrl}${urlPath}`;\n\n // Build command using direct URL (more reliable than API names)\n const args: string[] = ['get', fullUrl];\n\n // Add options\n if (options?.raw) {\n args.push('--rsh-raw');\n }\n if (options?.filter) {\n args.push('--rsh-filter', options.filter);\n }\n\n // Add headers (including auth)\n if (api?.authConfig?.envVar) {\n const token = process.env[api.authConfig.envVar];\n if (token) {\n const headerName = api.authConfig.headerName || 'Authorization';\n args.push('-H', `${headerName}:${token}`);\n }\n }\n\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n args.push('-H', `${key}:${value}`);\n }\n }\n\n // Add query parameters\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n args.push('-q', `${key}=${String(value)}`);\n }\n }\n\n // Output as JSON\n args.push('-o', 'json');\n\n try {\n logger.info(`Executing: restish ${args.join(' ')}`);\n\n const output = execSync(`restish ${args.join(' ')}`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n env: process.env,\n });\n\n // Try to parse as JSON\n let data: unknown;\n try {\n data = JSON.parse(output);\n } catch {\n data = output;\n }\n\n return {\n success: true,\n message: `${apiName} ${operation} executed`,\n data,\n };\n } catch (error) {\n const stderr = error.stderr?.toString() || error.message;\n logger.error(`API exec failed:`, stderr);\n\n return {\n success: false,\n message: `API call failed: ${stderr}`,\n };\n }\n }\n\n /**\n * Configure authentication for an API\n */\n async auth(\n apiName: string,\n options: {\n token?: string;\n envVar?: string;\n oauth?: boolean;\n scopes?: string[];\n }\n ): Promise<SkillResult> {\n const api = this.registry.apis[apiName];\n\n if (!api) {\n return {\n success: false,\n message: `API '${apiName}' not registered. Use /api add first.`,\n };\n }\n\n if (options.token) {\n // Store token in env var (don't save to disk for security)\n const envVar = options.envVar || `${apiName.toUpperCase()}_API_KEY`;\n process.env[envVar] = options.token;\n\n api.authType = 'api-key';\n api.authConfig = {\n ...api.authConfig,\n envVar,\n };\n this.saveRegistry();\n\n return {\n success: true,\n message: `Auth configured for '${apiName}'. Token stored in ${envVar}`,\n data: { envVar },\n };\n }\n\n if (options.oauth) {\n // Use restish's OAuth flow\n try {\n const scopeArg = options.scopes\n ? `--scopes=${options.scopes.join(',')}`\n : '';\n execSync(`restish api configure ${apiName} --auth=oauth2 ${scopeArg}`, {\n stdio: 'inherit',\n });\n\n api.authType = 'oauth2';\n this.saveRegistry();\n\n return {\n success: true,\n message: `OAuth2 configured for '${apiName}'`,\n };\n } catch (error) {\n return {\n success: false,\n message: `OAuth setup failed: ${error.message}`,\n };\n }\n }\n\n return {\n success: false,\n message: 'Specify --token or --oauth',\n };\n }\n\n /**\n * Remove an API\n */\n async remove(apiName: string): Promise<SkillResult> {\n if (!this.registry.apis[apiName]) {\n return {\n success: false,\n message: `API '${apiName}' not found`,\n };\n }\n\n delete this.registry.apis[apiName];\n this.saveRegistry();\n\n return {\n success: true,\n message: `API '${apiName}' removed`,\n };\n }\n\n /**\n * Sync API spec (refresh operations)\n */\n async sync(apiName: string): Promise<SkillResult> {\n if (!this.checkRestish()) {\n return {\n success: false,\n message: 'restish not installed. Run: brew install restish',\n };\n }\n\n try {\n execSync(`restish api sync ${apiName}`, { stdio: 'pipe' });\n\n const operations = this.discoverOperations(apiName);\n\n if (this.registry.apis[apiName]) {\n this.registry.apis[apiName].operations = operations;\n this.saveRegistry();\n }\n\n return {\n success: true,\n message: `API '${apiName}' synced`,\n data: { operations },\n };\n } catch (error) {\n return {\n success: false,\n message: `Sync failed: ${error.message}`,\n };\n }\n }\n\n /**\n * Get help for the API skill\n */\n getHelp(): string {\n return `\n/api - OpenAPI-based API access via Restish\n\nCommands:\n /api add <name> <url> [--spec <url>] [--auth-type api-key|oauth2]\n Register a new API\n\n /api list\n List all registered APIs\n\n /api describe <name> [operation]\n Show API details or specific operation\n\n /api exec <name> <operation> [--param value...]\n Execute an API operation\n\n /api auth <name> --token <token> [--env-var NAME]\n Configure API authentication\n\n /api auth <name> --oauth [--scopes scope1,scope2]\n Configure OAuth2 authentication\n\n /api sync <name>\n Refresh API operations from spec\n\n /api remove <name>\n Remove a registered API\n\nExamples:\n /api add github https://api.github.com --spec https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json\n /api auth github --token \"$GITHUB_TOKEN\"\n /api exec github repos list-for-user --username octocat\n /api exec github issues list --owner microsoft --repo vscode --state open\n\nBuilt on restish (https://rest.sh) for automatic OpenAPI discovery.\n`;\n }\n}\n\n// Singleton instance\nlet apiSkillInstance: APISkill | null = null;\n\nexport function getAPISkill(): APISkill {\n if (!apiSkillInstance) {\n apiSkillInstance = new APISkill();\n }\n return apiSkillInstance;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,3 +1,7 @@
1
+ import { fileURLToPath as __fileURLToPath } from 'url';
2
+ import { dirname as __pathDirname } from 'path';
3
+ const __filename = __fileURLToPath(import.meta.url);
4
+ const __dirname = __pathDirname(__filename);
1
5
  import { logger } from "../core/monitoring/logger.js";
2
6
  import {
3
7
  RepoIngestionSkill
@@ -5,6 +9,7 @@ import {
5
9
  import {
6
10
  RecursiveAgentOrchestrator
7
11
  } from "./recursive-agent-orchestrator.js";
12
+ import { getAPISkill } from "./api-skill.js";
8
13
  import * as fs from "fs";
9
14
  import * as path from "path";
10
15
  import * as os from "os";
@@ -604,6 +609,7 @@ class ClaudeSkillsManager {
604
609
  this.handoffSkill = new HandoffSkill(context);
605
610
  this.checkpointSkill = new CheckpointSkill(context);
606
611
  this.archaeologistSkill = new ArchaeologistSkill(context);
612
+ this.apiSkill = getAPISkill();
607
613
  import("./dashboard-launcher.js").then((module) => {
608
614
  this.dashboardLauncher = new module.DashboardLauncherSkill();
609
615
  logger.info("Dashboard launcher initialized (manual launch required)");
@@ -649,6 +655,7 @@ class ClaudeSkillsManager {
649
655
  dashboardLauncher;
650
656
  repoIngestionSkill = null;
651
657
  rlmOrchestrator = null;
658
+ apiSkill;
652
659
  async executeSkill(skillName, args, options) {
653
660
  switch (skillName) {
654
661
  case "handoff":
@@ -848,6 +855,49 @@ class ClaudeSkillsManager {
848
855
  message: `RLM execution failed: ${error.message}`
849
856
  };
850
857
  }
858
+ case "api":
859
+ const apiCmd = args[0];
860
+ switch (apiCmd) {
861
+ case "add":
862
+ return this.apiSkill.add(args[1], args[2], {
863
+ spec: options?.spec,
864
+ authType: options?.authType,
865
+ headerName: options?.headerName,
866
+ envVar: options?.envVar
867
+ });
868
+ case "list":
869
+ return this.apiSkill.list();
870
+ case "describe":
871
+ return this.apiSkill.describe(args[1], args[2]);
872
+ case "exec":
873
+ const execParams = {};
874
+ for (let i = 3; i < args.length; i += 2) {
875
+ if (args[i] && args[i + 1]) {
876
+ execParams[args[i].replace("--", "")] = args[i + 1];
877
+ }
878
+ }
879
+ return this.apiSkill.exec(args[1], args[2], execParams, {
880
+ raw: options?.raw,
881
+ filter: options?.filter
882
+ });
883
+ case "auth":
884
+ return this.apiSkill.auth(args[1], {
885
+ token: options?.token,
886
+ envVar: options?.envVar,
887
+ oauth: options?.oauth,
888
+ scopes: options?.scopes?.split(",")
889
+ });
890
+ case "sync":
891
+ return this.apiSkill.sync(args[1]);
892
+ case "remove":
893
+ return this.apiSkill.remove(args[1]);
894
+ case "help":
895
+ default:
896
+ return {
897
+ success: true,
898
+ message: this.apiSkill.getHelp()
899
+ };
900
+ }
851
901
  default:
852
902
  return {
853
903
  success: false,
@@ -856,7 +906,7 @@ class ClaudeSkillsManager {
856
906
  }
857
907
  }
858
908
  getAvailableSkills() {
859
- const skills = ["handoff", "checkpoint", "dig", "dashboard"];
909
+ const skills = ["handoff", "checkpoint", "dig", "dashboard", "api"];
860
910
  if (this.repoIngestionSkill) {
861
911
  skills.push("repo");
862
912
  }
@@ -995,6 +1045,8 @@ Examples:
995
1045
  /rlm "Generate comprehensive tests for the API endpoints" --test-mode integration
996
1046
  /rlm "Review and improve code quality" --review-stages 5 --quality-threshold 0.95
997
1047
  `;
1048
+ case "api":
1049
+ return this.apiSkill.getHelp();
998
1050
  default:
999
1051
  return `Unknown skill: ${skillName}`;
1000
1052
  }