oh-my-claude-sisyphus 3.6.1 → 3.6.2

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 (300) hide show
  1. package/commands/psm.md +180 -0
  2. package/dist/__tests__/analytics/analytics-summary.test.d.ts +2 -0
  3. package/dist/__tests__/analytics/analytics-summary.test.d.ts.map +1 -0
  4. package/dist/__tests__/analytics/analytics-summary.test.js +267 -0
  5. package/dist/__tests__/analytics/analytics-summary.test.js.map +1 -0
  6. package/dist/__tests__/analytics/cost-estimator.test.d.ts +2 -0
  7. package/dist/__tests__/analytics/cost-estimator.test.d.ts.map +1 -0
  8. package/dist/__tests__/analytics/cost-estimator.test.js +212 -0
  9. package/dist/__tests__/analytics/cost-estimator.test.js.map +1 -0
  10. package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts +7 -0
  11. package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts.map +1 -0
  12. package/dist/__tests__/hooks/auto-slash-command/executor.test.js +374 -0
  13. package/dist/__tests__/hooks/auto-slash-command/executor.test.js.map +1 -0
  14. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts +2 -0
  15. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts.map +1 -0
  16. package/dist/__tests__/hud/auto-tracking.integration.test.js +12 -0
  17. package/dist/__tests__/hud/auto-tracking.integration.test.js.map +1 -0
  18. package/dist/__tests__/learned-skills/config.test.d.ts +2 -0
  19. package/dist/__tests__/learned-skills/config.test.d.ts.map +1 -0
  20. package/dist/__tests__/learned-skills/config.test.js +37 -0
  21. package/dist/__tests__/learned-skills/config.test.js.map +1 -0
  22. package/dist/__tests__/learned-skills/detector.test.d.ts +2 -0
  23. package/dist/__tests__/learned-skills/detector.test.d.ts.map +1 -0
  24. package/dist/__tests__/learned-skills/detector.test.js +99 -0
  25. package/dist/__tests__/learned-skills/detector.test.js.map +1 -0
  26. package/dist/__tests__/learned-skills/finder.test.d.ts +2 -0
  27. package/dist/__tests__/learned-skills/finder.test.d.ts.map +1 -0
  28. package/dist/__tests__/learned-skills/finder.test.js +59 -0
  29. package/dist/__tests__/learned-skills/finder.test.js.map +1 -0
  30. package/dist/__tests__/learned-skills/loader.test.d.ts +2 -0
  31. package/dist/__tests__/learned-skills/loader.test.d.ts.map +1 -0
  32. package/dist/__tests__/learned-skills/loader.test.js +69 -0
  33. package/dist/__tests__/learned-skills/loader.test.js.map +1 -0
  34. package/dist/__tests__/learned-skills/parser.test.d.ts +2 -0
  35. package/dist/__tests__/learned-skills/parser.test.d.ts.map +1 -0
  36. package/dist/__tests__/learned-skills/parser.test.js +81 -0
  37. package/dist/__tests__/learned-skills/parser.test.js.map +1 -0
  38. package/dist/__tests__/learned-skills/validator.test.d.ts +2 -0
  39. package/dist/__tests__/learned-skills/validator.test.d.ts.map +1 -0
  40. package/dist/__tests__/learned-skills/validator.test.js +85 -0
  41. package/dist/__tests__/learned-skills/validator.test.js.map +1 -0
  42. package/dist/agents/codex-agents.d.ts +20 -0
  43. package/dist/agents/codex-agents.d.ts.map +1 -0
  44. package/dist/agents/codex-agents.js +36 -0
  45. package/dist/agents/codex-agents.js.map +1 -0
  46. package/dist/agents/document-writer.d.ts +11 -0
  47. package/dist/agents/document-writer.d.ts.map +1 -0
  48. package/dist/agents/document-writer.js +209 -0
  49. package/dist/agents/document-writer.js.map +1 -0
  50. package/dist/agents/frontend-engineer.d.ts +11 -0
  51. package/dist/agents/frontend-engineer.d.ts.map +1 -0
  52. package/dist/agents/frontend-engineer.js +115 -0
  53. package/dist/agents/frontend-engineer.js.map +1 -0
  54. package/dist/agents/librarian.d.ts +12 -0
  55. package/dist/agents/librarian.d.ts.map +1 -0
  56. package/dist/agents/librarian.js +103 -0
  57. package/dist/agents/librarian.js.map +1 -0
  58. package/dist/agents/metis.d.ts +12 -0
  59. package/dist/agents/metis.d.ts.map +1 -0
  60. package/dist/agents/metis.js +117 -0
  61. package/dist/agents/metis.js.map +1 -0
  62. package/dist/agents/momus.d.ts +12 -0
  63. package/dist/agents/momus.d.ts.map +1 -0
  64. package/dist/agents/momus.js +128 -0
  65. package/dist/agents/momus.js.map +1 -0
  66. package/dist/agents/multimodal-looker.d.ts +11 -0
  67. package/dist/agents/multimodal-looker.d.ts.map +1 -0
  68. package/dist/agents/multimodal-looker.js +70 -0
  69. package/dist/agents/multimodal-looker.js.map +1 -0
  70. package/dist/agents/oracle.d.ts +13 -0
  71. package/dist/agents/oracle.d.ts.map +1 -0
  72. package/dist/agents/oracle.js +191 -0
  73. package/dist/agents/oracle.js.map +1 -0
  74. package/dist/agents/orchestrator-sisyphus.d.ts +11 -0
  75. package/dist/agents/orchestrator-sisyphus.d.ts.map +1 -0
  76. package/dist/agents/orchestrator-sisyphus.js +115 -0
  77. package/dist/agents/orchestrator-sisyphus.js.map +1 -0
  78. package/dist/agents/prometheus.d.ts +12 -0
  79. package/dist/agents/prometheus.d.ts.map +1 -0
  80. package/dist/agents/prometheus.js +195 -0
  81. package/dist/agents/prometheus.js.map +1 -0
  82. package/dist/agents/sisyphus-junior.d.ts +12 -0
  83. package/dist/agents/sisyphus-junior.d.ts.map +1 -0
  84. package/dist/agents/sisyphus-junior.js +93 -0
  85. package/dist/agents/sisyphus-junior.js.map +1 -0
  86. package/dist/cli/analytics.js +0 -0
  87. package/dist/cli/components/CostDashboard.d.ts +15 -0
  88. package/dist/cli/components/CostDashboard.d.ts.map +1 -0
  89. package/dist/cli/components/CostDashboard.js +15 -0
  90. package/dist/cli/components/CostDashboard.js.map +1 -0
  91. package/dist/cli/components/LiveStats.d.ts +16 -0
  92. package/dist/cli/components/LiveStats.d.ts.map +1 -0
  93. package/dist/cli/components/LiveStats.js +16 -0
  94. package/dist/cli/components/LiveStats.js.map +1 -0
  95. package/dist/cli/components/SessionBrowser.d.ts +14 -0
  96. package/dist/cli/components/SessionBrowser.d.ts.map +1 -0
  97. package/dist/cli/components/SessionBrowser.js +14 -0
  98. package/dist/cli/components/SessionBrowser.js.map +1 -0
  99. package/dist/cli/index.js +0 -0
  100. package/dist/cli/tui.d.ts +21 -0
  101. package/dist/cli/tui.d.ts.map +1 -0
  102. package/dist/cli/tui.js +21 -0
  103. package/dist/cli/tui.js.map +1 -0
  104. package/dist/hooks/autopilot/signals.d.ts +20 -0
  105. package/dist/hooks/autopilot/signals.d.ts.map +1 -0
  106. package/dist/hooks/autopilot/signals.js +75 -0
  107. package/dist/hooks/autopilot/signals.js.map +1 -0
  108. package/dist/hooks/autopilot/summary.d.ts +27 -0
  109. package/dist/hooks/autopilot/summary.d.ts.map +1 -0
  110. package/dist/hooks/autopilot/summary.js +160 -0
  111. package/dist/hooks/autopilot/summary.js.map +1 -0
  112. package/dist/hooks/autopilot/transition.d.ts +39 -0
  113. package/dist/hooks/autopilot/transition.d.ts.map +1 -0
  114. package/dist/hooks/autopilot/transition.js +216 -0
  115. package/dist/hooks/autopilot/transition.js.map +1 -0
  116. package/dist/hooks/context-window-limit-recovery/constants.d.ts +28 -0
  117. package/dist/hooks/context-window-limit-recovery/constants.d.ts.map +1 -0
  118. package/dist/hooks/context-window-limit-recovery/constants.js +85 -0
  119. package/dist/hooks/context-window-limit-recovery/constants.js.map +1 -0
  120. package/dist/hooks/context-window-limit-recovery/index.d.ts +62 -0
  121. package/dist/hooks/context-window-limit-recovery/index.d.ts.map +1 -0
  122. package/dist/hooks/context-window-limit-recovery/index.js +201 -0
  123. package/dist/hooks/context-window-limit-recovery/index.js.map +1 -0
  124. package/dist/hooks/context-window-limit-recovery/parser.d.ts +31 -0
  125. package/dist/hooks/context-window-limit-recovery/parser.d.ts.map +1 -0
  126. package/dist/hooks/context-window-limit-recovery/parser.js +241 -0
  127. package/dist/hooks/context-window-limit-recovery/parser.js.map +1 -0
  128. package/dist/hooks/context-window-limit-recovery/types.d.ts +84 -0
  129. package/dist/hooks/context-window-limit-recovery/types.d.ts.map +1 -0
  130. package/dist/hooks/context-window-limit-recovery/types.js +34 -0
  131. package/dist/hooks/context-window-limit-recovery/types.js.map +1 -0
  132. package/dist/hooks/edit-error-recovery/index.d.ts +62 -0
  133. package/dist/hooks/edit-error-recovery/index.d.ts.map +1 -0
  134. package/dist/hooks/edit-error-recovery/index.js +89 -0
  135. package/dist/hooks/edit-error-recovery/index.js.map +1 -0
  136. package/dist/hooks/learned-skills/config.d.ts +53 -0
  137. package/dist/hooks/learned-skills/config.d.ts.map +1 -0
  138. package/dist/hooks/learned-skills/config.js +103 -0
  139. package/dist/hooks/learned-skills/config.js.map +1 -0
  140. package/dist/hooks/learned-skills/constants.d.ts +24 -0
  141. package/dist/hooks/learned-skills/constants.d.ts.map +1 -0
  142. package/dist/hooks/learned-skills/constants.js +26 -0
  143. package/dist/hooks/learned-skills/constants.js.map +1 -0
  144. package/dist/hooks/learned-skills/detection-hook.d.ts +39 -0
  145. package/dist/hooks/learned-skills/detection-hook.d.ts.map +1 -0
  146. package/dist/hooks/learned-skills/detection-hook.js +83 -0
  147. package/dist/hooks/learned-skills/detection-hook.js.map +1 -0
  148. package/dist/hooks/learned-skills/detector.d.ts +30 -0
  149. package/dist/hooks/learned-skills/detector.d.ts.map +1 -0
  150. package/dist/hooks/learned-skills/detector.js +150 -0
  151. package/dist/hooks/learned-skills/detector.js.map +1 -0
  152. package/dist/hooks/learned-skills/finder.d.ts +21 -0
  153. package/dist/hooks/learned-skills/finder.d.ts.map +1 -0
  154. package/dist/hooks/learned-skills/finder.js +117 -0
  155. package/dist/hooks/learned-skills/finder.js.map +1 -0
  156. package/dist/hooks/learned-skills/index.d.ts +62 -0
  157. package/dist/hooks/learned-skills/index.d.ts.map +1 -0
  158. package/dist/hooks/learned-skills/index.js +137 -0
  159. package/dist/hooks/learned-skills/index.js.map +1 -0
  160. package/dist/hooks/learned-skills/loader.d.ts +20 -0
  161. package/dist/hooks/learned-skills/loader.d.ts.map +1 -0
  162. package/dist/hooks/learned-skills/loader.js +107 -0
  163. package/dist/hooks/learned-skills/loader.js.map +1 -0
  164. package/dist/hooks/learned-skills/parser.d.ts +21 -0
  165. package/dist/hooks/learned-skills/parser.d.ts.map +1 -0
  166. package/dist/hooks/learned-skills/parser.js +190 -0
  167. package/dist/hooks/learned-skills/parser.js.map +1 -0
  168. package/dist/hooks/learned-skills/promotion.d.ts +29 -0
  169. package/dist/hooks/learned-skills/promotion.d.ts.map +1 -0
  170. package/dist/hooks/learned-skills/promotion.js +87 -0
  171. package/dist/hooks/learned-skills/promotion.js.map +1 -0
  172. package/dist/hooks/learned-skills/types.d.ts +109 -0
  173. package/dist/hooks/learned-skills/types.d.ts.map +1 -0
  174. package/dist/hooks/learned-skills/types.js +8 -0
  175. package/dist/hooks/learned-skills/types.js.map +1 -0
  176. package/dist/hooks/learned-skills/validator.d.ts +15 -0
  177. package/dist/hooks/learned-skills/validator.d.ts.map +1 -0
  178. package/dist/hooks/learned-skills/validator.js +87 -0
  179. package/dist/hooks/learned-skills/validator.js.map +1 -0
  180. package/dist/hooks/learned-skills/writer.d.ts +27 -0
  181. package/dist/hooks/learned-skills/writer.d.ts.map +1 -0
  182. package/dist/hooks/learned-skills/writer.js +126 -0
  183. package/dist/hooks/learned-skills/writer.js.map +1 -0
  184. package/dist/hooks/mnemosyne/config.d.ts +53 -0
  185. package/dist/hooks/mnemosyne/config.d.ts.map +1 -0
  186. package/dist/hooks/mnemosyne/config.js +103 -0
  187. package/dist/hooks/mnemosyne/config.js.map +1 -0
  188. package/dist/hooks/mnemosyne/constants.d.ts +24 -0
  189. package/dist/hooks/mnemosyne/constants.d.ts.map +1 -0
  190. package/dist/hooks/mnemosyne/constants.js +26 -0
  191. package/dist/hooks/mnemosyne/constants.js.map +1 -0
  192. package/dist/hooks/mnemosyne/detection-hook.d.ts +39 -0
  193. package/dist/hooks/mnemosyne/detection-hook.d.ts.map +1 -0
  194. package/dist/hooks/mnemosyne/detection-hook.js +83 -0
  195. package/dist/hooks/mnemosyne/detection-hook.js.map +1 -0
  196. package/dist/hooks/mnemosyne/detector.d.ts +30 -0
  197. package/dist/hooks/mnemosyne/detector.d.ts.map +1 -0
  198. package/dist/hooks/mnemosyne/detector.js +150 -0
  199. package/dist/hooks/mnemosyne/detector.js.map +1 -0
  200. package/dist/hooks/mnemosyne/finder.d.ts +21 -0
  201. package/dist/hooks/mnemosyne/finder.d.ts.map +1 -0
  202. package/dist/hooks/mnemosyne/finder.js +117 -0
  203. package/dist/hooks/mnemosyne/finder.js.map +1 -0
  204. package/dist/hooks/mnemosyne/index.d.ts +62 -0
  205. package/dist/hooks/mnemosyne/index.d.ts.map +1 -0
  206. package/dist/hooks/mnemosyne/index.js +137 -0
  207. package/dist/hooks/mnemosyne/index.js.map +1 -0
  208. package/dist/hooks/mnemosyne/loader.d.ts +20 -0
  209. package/dist/hooks/mnemosyne/loader.d.ts.map +1 -0
  210. package/dist/hooks/mnemosyne/loader.js +113 -0
  211. package/dist/hooks/mnemosyne/loader.js.map +1 -0
  212. package/dist/hooks/mnemosyne/parser.d.ts +21 -0
  213. package/dist/hooks/mnemosyne/parser.d.ts.map +1 -0
  214. package/dist/hooks/mnemosyne/parser.js +190 -0
  215. package/dist/hooks/mnemosyne/parser.js.map +1 -0
  216. package/dist/hooks/mnemosyne/promotion.d.ts +29 -0
  217. package/dist/hooks/mnemosyne/promotion.d.ts.map +1 -0
  218. package/dist/hooks/mnemosyne/promotion.js +87 -0
  219. package/dist/hooks/mnemosyne/promotion.js.map +1 -0
  220. package/dist/hooks/mnemosyne/types.d.ts +109 -0
  221. package/dist/hooks/mnemosyne/types.d.ts.map +1 -0
  222. package/dist/hooks/mnemosyne/types.js +8 -0
  223. package/dist/hooks/mnemosyne/types.js.map +1 -0
  224. package/dist/hooks/mnemosyne/validator.d.ts +15 -0
  225. package/dist/hooks/mnemosyne/validator.d.ts.map +1 -0
  226. package/dist/hooks/mnemosyne/validator.js +87 -0
  227. package/dist/hooks/mnemosyne/validator.js.map +1 -0
  228. package/dist/hooks/mnemosyne/writer.d.ts +27 -0
  229. package/dist/hooks/mnemosyne/writer.d.ts.map +1 -0
  230. package/dist/hooks/mnemosyne/writer.js +126 -0
  231. package/dist/hooks/mnemosyne/writer.js.map +1 -0
  232. package/dist/hooks/ralph-loop/index.d.ts +116 -0
  233. package/dist/hooks/ralph-loop/index.d.ts.map +1 -0
  234. package/dist/hooks/ralph-loop/index.js +322 -0
  235. package/dist/hooks/ralph-loop/index.js.map +1 -0
  236. package/dist/hooks/ralph-prd/index.d.ts +130 -0
  237. package/dist/hooks/ralph-prd/index.d.ts.map +1 -0
  238. package/dist/hooks/ralph-prd/index.js +310 -0
  239. package/dist/hooks/ralph-prd/index.js.map +1 -0
  240. package/dist/hooks/ralph-progress/index.d.ts +102 -0
  241. package/dist/hooks/ralph-progress/index.d.ts.map +1 -0
  242. package/dist/hooks/ralph-progress/index.js +408 -0
  243. package/dist/hooks/ralph-progress/index.js.map +1 -0
  244. package/dist/hooks/ralph-verifier/index.d.ts +72 -0
  245. package/dist/hooks/ralph-verifier/index.d.ts.map +1 -0
  246. package/dist/hooks/ralph-verifier/index.js +223 -0
  247. package/dist/hooks/ralph-verifier/index.js.map +1 -0
  248. package/dist/hooks/session-recovery/constants.d.ts +56 -0
  249. package/dist/hooks/session-recovery/constants.d.ts.map +1 -0
  250. package/dist/hooks/session-recovery/constants.js +78 -0
  251. package/dist/hooks/session-recovery/constants.js.map +1 -0
  252. package/dist/hooks/session-recovery/index.d.ts +53 -0
  253. package/dist/hooks/session-recovery/index.d.ts.map +1 -0
  254. package/dist/hooks/session-recovery/index.js +321 -0
  255. package/dist/hooks/session-recovery/index.js.map +1 -0
  256. package/dist/hooks/session-recovery/storage.d.ts +76 -0
  257. package/dist/hooks/session-recovery/storage.d.ts.map +1 -0
  258. package/dist/hooks/session-recovery/storage.js +383 -0
  259. package/dist/hooks/session-recovery/storage.js.map +1 -0
  260. package/dist/hooks/session-recovery/types.d.ts +145 -0
  261. package/dist/hooks/session-recovery/types.d.ts.map +1 -0
  262. package/dist/hooks/session-recovery/types.js +8 -0
  263. package/dist/hooks/session-recovery/types.js.map +1 -0
  264. package/dist/hooks/sisyphus-orchestrator/constants.d.ts +23 -0
  265. package/dist/hooks/sisyphus-orchestrator/constants.d.ts.map +1 -0
  266. package/dist/hooks/sisyphus-orchestrator/constants.js +142 -0
  267. package/dist/hooks/sisyphus-orchestrator/constants.js.map +1 -0
  268. package/dist/hooks/sisyphus-orchestrator/index.d.ts +113 -0
  269. package/dist/hooks/sisyphus-orchestrator/index.d.ts.map +1 -0
  270. package/dist/hooks/sisyphus-orchestrator/index.js +309 -0
  271. package/dist/hooks/sisyphus-orchestrator/index.js.map +1 -0
  272. package/dist/hooks/subagent-tracker/index.d.ts +83 -0
  273. package/dist/hooks/subagent-tracker/index.d.ts.map +1 -0
  274. package/dist/hooks/subagent-tracker/index.js +207 -0
  275. package/dist/hooks/subagent-tracker/index.js.map +1 -0
  276. package/dist/hooks/ultraqa-loop/index.d.ts +94 -0
  277. package/dist/hooks/ultraqa-loop/index.d.ts.map +1 -0
  278. package/dist/hooks/ultraqa-loop/index.js +216 -0
  279. package/dist/hooks/ultraqa-loop/index.js.map +1 -0
  280. package/dist/hooks/ultrawork-state/index.d.ts +62 -0
  281. package/dist/hooks/ultrawork-state/index.d.ts.map +1 -0
  282. package/dist/hooks/ultrawork-state/index.js +208 -0
  283. package/dist/hooks/ultrawork-state/index.js.map +1 -0
  284. package/dist/hud/sisyphus-state.d.ts +31 -0
  285. package/dist/hud/sisyphus-state.d.ts.map +1 -0
  286. package/dist/hud/sisyphus-state.js +163 -0
  287. package/dist/hud/sisyphus-state.js.map +1 -0
  288. package/docs/design/project-session-manager.md +1033 -0
  289. package/package.json +1 -1
  290. package/skills/project-session-manager/SKILL.md +410 -0
  291. package/skills/project-session-manager/lib/config.sh +86 -0
  292. package/skills/project-session-manager/lib/parse.sh +121 -0
  293. package/skills/project-session-manager/lib/session.sh +132 -0
  294. package/skills/project-session-manager/lib/tmux.sh +103 -0
  295. package/skills/project-session-manager/lib/worktree.sh +171 -0
  296. package/skills/project-session-manager/psm.sh +629 -0
  297. package/skills/project-session-manager/templates/feature.md +56 -0
  298. package/skills/project-session-manager/templates/issue-fix.md +57 -0
  299. package/skills/project-session-manager/templates/pr-review.md +65 -0
  300. package/skills/project-session-manager/templates/projects.json +19 -0
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Skill Writer
3
+ *
4
+ * Writes skill files to disk with proper formatting.
5
+ */
6
+ import { writeFileSync, existsSync } from 'fs';
7
+ import { join } from 'path';
8
+ import { ensureSkillsDir, getSkillsDir } from './finder.js';
9
+ import { generateSkillFrontmatter } from './parser.js';
10
+ import { validateExtractionRequest } from './validator.js';
11
+ import { DEBUG_ENABLED } from './constants.js';
12
+ /**
13
+ * Generate a unique skill ID.
14
+ */
15
+ function generateSkillId() {
16
+ const timestamp = Date.now().toString(36);
17
+ const random = Math.random().toString(36).slice(2, 6);
18
+ return `skill-${timestamp}-${random}`;
19
+ }
20
+ /**
21
+ * Sanitize a string for use as filename.
22
+ */
23
+ function sanitizeFilename(name) {
24
+ return name
25
+ .toLowerCase()
26
+ .replace(/[^a-z0-9]+/g, '-')
27
+ .replace(/^-+|-+$/g, '')
28
+ .slice(0, 50);
29
+ }
30
+ /**
31
+ * Write a new skill from extraction request.
32
+ */
33
+ export function writeSkill(request, projectRoot, skillName) {
34
+ // Validate first
35
+ const validation = validateExtractionRequest(request);
36
+ if (!validation.valid) {
37
+ return {
38
+ success: false,
39
+ error: `Quality validation failed: ${validation.missingFields.join(', ')}`,
40
+ validation,
41
+ };
42
+ }
43
+ // Ensure directory exists
44
+ if (!ensureSkillsDir(request.targetScope, projectRoot || undefined)) {
45
+ return {
46
+ success: false,
47
+ error: `Failed to create skills directory for scope: ${request.targetScope}`,
48
+ validation,
49
+ };
50
+ }
51
+ // Generate metadata
52
+ const metadata = {
53
+ id: generateSkillId(),
54
+ name: skillName,
55
+ description: request.problem.slice(0, 200),
56
+ source: 'extracted',
57
+ createdAt: new Date().toISOString(),
58
+ triggers: request.triggers,
59
+ tags: request.tags,
60
+ quality: validation.score,
61
+ usageCount: 0,
62
+ };
63
+ // Generate content
64
+ const frontmatter = generateSkillFrontmatter(metadata);
65
+ const content = `${frontmatter}
66
+
67
+ # Problem
68
+
69
+ ${request.problem}
70
+
71
+ # Solution
72
+
73
+ ${request.solution}
74
+ `;
75
+ // Write to file
76
+ const filename = `${sanitizeFilename(skillName)}.md`;
77
+ const skillsDir = getSkillsDir(request.targetScope, projectRoot || undefined);
78
+ const filePath = join(skillsDir, filename);
79
+ // Check for duplicates
80
+ if (existsSync(filePath)) {
81
+ return {
82
+ success: false,
83
+ error: `Skill file already exists: ${filename}`,
84
+ validation,
85
+ };
86
+ }
87
+ try {
88
+ writeFileSync(filePath, content);
89
+ return {
90
+ success: true,
91
+ path: filePath,
92
+ validation,
93
+ };
94
+ }
95
+ catch (e) {
96
+ if (DEBUG_ENABLED) {
97
+ console.error('[learned-skills] Error writing skill file:', e);
98
+ }
99
+ return {
100
+ success: false,
101
+ error: `Failed to write skill file: ${e}`,
102
+ validation,
103
+ };
104
+ }
105
+ }
106
+ /**
107
+ * Check if a skill with similar triggers already exists.
108
+ */
109
+ export function checkDuplicateTriggers(triggers, projectRoot) {
110
+ // Import dynamically to avoid circular dependency
111
+ const { loadAllSkills } = require('./loader.js');
112
+ const skills = loadAllSkills(projectRoot);
113
+ const normalizedTriggers = new Set(triggers.map(t => t.toLowerCase()));
114
+ for (const skill of skills) {
115
+ const skillTriggers = skill.metadata.triggers.map((t) => t.toLowerCase());
116
+ const overlap = skillTriggers.filter((t) => normalizedTriggers.has(t));
117
+ if (overlap.length >= triggers.length * 0.5) {
118
+ return {
119
+ isDuplicate: true,
120
+ existingSkillId: skill.metadata.id,
121
+ };
122
+ }
123
+ }
124
+ return { isDuplicate: false };
125
+ }
126
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/hooks/learned-skills/writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Mnemosyne Configuration
3
+ *
4
+ * Handles configuration loading and validation.
5
+ */
6
+ export interface MnemosyneConfig {
7
+ /** Feature enabled/disabled */
8
+ enabled: boolean;
9
+ /** Detection configuration */
10
+ detection: {
11
+ /** Enable auto-detection */
12
+ enabled: boolean;
13
+ /** Confidence threshold for prompting (0-100) */
14
+ promptThreshold: number;
15
+ /** Cooldown between prompts (messages) */
16
+ promptCooldown: number;
17
+ };
18
+ /** Quality gate configuration */
19
+ quality: {
20
+ /** Minimum score to accept (0-100) */
21
+ minScore: number;
22
+ /** Minimum problem length */
23
+ minProblemLength: number;
24
+ /** Minimum solution length */
25
+ minSolutionLength: number;
26
+ };
27
+ /** Storage configuration */
28
+ storage: {
29
+ /** Maximum skills per scope */
30
+ maxSkillsPerScope: number;
31
+ /** Auto-prune old skills */
32
+ autoPrune: boolean;
33
+ /** Days before auto-prune (if enabled) */
34
+ pruneDays: number;
35
+ };
36
+ }
37
+ /**
38
+ * Load configuration from disk.
39
+ */
40
+ export declare function loadConfig(): MnemosyneConfig;
41
+ /**
42
+ * Save configuration to disk.
43
+ */
44
+ export declare function saveConfig(config: Partial<MnemosyneConfig>): boolean;
45
+ /**
46
+ * Get a specific config value.
47
+ */
48
+ export declare function getConfigValue<K extends keyof MnemosyneConfig>(key: K): MnemosyneConfig[K];
49
+ /**
50
+ * Update a specific config value.
51
+ */
52
+ export declare function setConfigValue<K extends keyof MnemosyneConfig>(key: K, value: MnemosyneConfig[K]): boolean;
53
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/hooks/mnemosyne/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,SAAS,EAAE;QACT,4BAA4B;QAC5B,OAAO,EAAE,OAAO,CAAC;QACjB,iDAAiD;QACjD,eAAe,EAAE,MAAM,CAAC;QACxB,0CAA0C;QAC1C,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,iCAAiC;IACjC,OAAO,EAAE;QACP,sCAAsC;QACtC,QAAQ,EAAE,MAAM,CAAC;QACjB,6BAA6B;QAC7B,gBAAgB,EAAE,MAAM,CAAC;QACzB,8BAA8B;QAC9B,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,4BAA4B;IAC5B,OAAO,EAAE;QACP,+BAA+B;QAC/B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,4BAA4B;QAC5B,SAAS,EAAE,OAAO,CAAC;QACnB,0CAA0C;QAC1C,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAuBD;;GAEG;AACH,wBAAgB,UAAU,IAAI,eAAe,CAe5C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAgBpE;AA0BD;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,eAAe,EAC5D,GAAG,EAAE,CAAC,GACL,eAAe,CAAC,CAAC,CAAC,CAGpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,eAAe,EAC5D,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GACxB,OAAO,CAIT"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Mnemosyne Configuration
3
+ *
4
+ * Handles configuration loading and validation.
5
+ */
6
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
7
+ import { join } from 'path';
8
+ import { homedir } from 'os';
9
+ import { DEBUG_ENABLED } from './constants.js';
10
+ const DEFAULT_CONFIG = {
11
+ enabled: true,
12
+ detection: {
13
+ enabled: true,
14
+ promptThreshold: 60,
15
+ promptCooldown: 5,
16
+ },
17
+ quality: {
18
+ minScore: 50,
19
+ minProblemLength: 10,
20
+ minSolutionLength: 20,
21
+ },
22
+ storage: {
23
+ maxSkillsPerScope: 100,
24
+ autoPrune: false,
25
+ pruneDays: 90,
26
+ },
27
+ };
28
+ const CONFIG_PATH = join(homedir(), '.claude', 'sisyphus', 'mnemosyne.json');
29
+ /**
30
+ * Load configuration from disk.
31
+ */
32
+ export function loadConfig() {
33
+ if (!existsSync(CONFIG_PATH)) {
34
+ return DEFAULT_CONFIG;
35
+ }
36
+ try {
37
+ const content = readFileSync(CONFIG_PATH, 'utf-8');
38
+ const loaded = JSON.parse(content);
39
+ return mergeConfig(DEFAULT_CONFIG, loaded);
40
+ }
41
+ catch (error) {
42
+ if (DEBUG_ENABLED) {
43
+ console.error('[mnemosyne] Error loading config:', error);
44
+ }
45
+ return DEFAULT_CONFIG;
46
+ }
47
+ }
48
+ /**
49
+ * Save configuration to disk.
50
+ */
51
+ export function saveConfig(config) {
52
+ const merged = mergeConfig(DEFAULT_CONFIG, config);
53
+ try {
54
+ const dir = join(homedir(), '.claude', 'sisyphus');
55
+ if (!existsSync(dir)) {
56
+ mkdirSync(dir, { recursive: true });
57
+ }
58
+ writeFileSync(CONFIG_PATH, JSON.stringify(merged, null, 2));
59
+ return true;
60
+ }
61
+ catch (error) {
62
+ if (DEBUG_ENABLED) {
63
+ console.error('[mnemosyne] Error saving config:', error);
64
+ }
65
+ return false;
66
+ }
67
+ }
68
+ /**
69
+ * Merge partial config with defaults.
70
+ */
71
+ function mergeConfig(defaults, partial) {
72
+ return {
73
+ enabled: partial.enabled ?? defaults.enabled,
74
+ detection: {
75
+ ...defaults.detection,
76
+ ...partial.detection,
77
+ },
78
+ quality: {
79
+ ...defaults.quality,
80
+ ...partial.quality,
81
+ },
82
+ storage: {
83
+ ...defaults.storage,
84
+ ...partial.storage,
85
+ },
86
+ };
87
+ }
88
+ /**
89
+ * Get a specific config value.
90
+ */
91
+ export function getConfigValue(key) {
92
+ const config = loadConfig();
93
+ return config[key];
94
+ }
95
+ /**
96
+ * Update a specific config value.
97
+ */
98
+ export function setConfigValue(key, value) {
99
+ const config = loadConfig();
100
+ config[key] = value;
101
+ return saveConfig(config);
102
+ }
103
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/hooks/mnemosyne/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Learned Skills Constants
3
+ */
4
+ /** User-level skills directory (read by skill-injector.mjs hook) */
5
+ export declare const USER_SKILLS_DIR: string;
6
+ /** Project-level skills subdirectory */
7
+ export declare const PROJECT_SKILLS_SUBDIR = ".sisyphus/skills";
8
+ /** Valid skill file extension */
9
+ export declare const SKILL_EXTENSION = ".md";
10
+ /** Feature flag key for enabling/disabling */
11
+ export declare const FEATURE_FLAG_KEY = "mnemosyne.enabled";
12
+ /** Default feature flag value */
13
+ export declare const FEATURE_FLAG_DEFAULT = true;
14
+ /** Maximum skill content length (characters) */
15
+ export declare const MAX_SKILL_CONTENT_LENGTH = 4000;
16
+ /** Minimum quality score for auto-injection */
17
+ export declare const MIN_QUALITY_SCORE = 50;
18
+ /** Required metadata fields */
19
+ export declare const REQUIRED_METADATA_FIELDS: string[];
20
+ /** Maximum skills to inject per session */
21
+ export declare const MAX_SKILLS_PER_SESSION = 10;
22
+ /** Debug mode enabled */
23
+ export declare const DEBUG_ENABLED: boolean;
24
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/hooks/mnemosyne/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,oEAAoE;AACpE,eAAO,MAAM,eAAe,QAA2D,CAAC;AAExF,wCAAwC;AACxC,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAExD,iCAAiC;AACjC,eAAO,MAAM,eAAe,QAAQ,CAAC;AAErC,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AAEpD,iCAAiC;AACjC,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,gDAAgD;AAChD,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,+CAA+C;AAC/C,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,+BAA+B;AAC/B,eAAO,MAAM,wBAAwB,UAAsD,CAAC;AAE5F,2CAA2C;AAC3C,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,yBAAyB;AACzB,eAAO,MAAM,aAAa,SAAqC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Learned Skills Constants
3
+ */
4
+ import { join } from 'path';
5
+ import { homedir } from 'os';
6
+ /** User-level skills directory (read by skill-injector.mjs hook) */
7
+ export const USER_SKILLS_DIR = join(homedir(), '.claude', 'skills', 'sisyphus-learned');
8
+ /** Project-level skills subdirectory */
9
+ export const PROJECT_SKILLS_SUBDIR = '.sisyphus/skills';
10
+ /** Valid skill file extension */
11
+ export const SKILL_EXTENSION = '.md';
12
+ /** Feature flag key for enabling/disabling */
13
+ export const FEATURE_FLAG_KEY = 'mnemosyne.enabled';
14
+ /** Default feature flag value */
15
+ export const FEATURE_FLAG_DEFAULT = true;
16
+ /** Maximum skill content length (characters) */
17
+ export const MAX_SKILL_CONTENT_LENGTH = 4000;
18
+ /** Minimum quality score for auto-injection */
19
+ export const MIN_QUALITY_SCORE = 50;
20
+ /** Required metadata fields */
21
+ export const REQUIRED_METADATA_FIELDS = ['id', 'name', 'description', 'triggers', 'source'];
22
+ /** Maximum skills to inject per session */
23
+ export const MAX_SKILLS_PER_SESSION = 10;
24
+ /** Debug mode enabled */
25
+ export const DEBUG_ENABLED = process.env.SISYPHUS_DEBUG === '1';
26
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/hooks/mnemosyne/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,oEAAoE;AACpE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AAExF,wCAAwC;AACxC,MAAM,CAAC,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AAExD,iCAAiC;AACjC,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AAErC,8CAA8C;AAC9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEpD,iCAAiC;AACjC,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAEzC,gDAAgD;AAChD,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C,+CAA+C;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,+BAA+B;AAC/B,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAE5F,2CAA2C;AAC3C,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,yBAAyB;AACzB,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Detection Hook
3
+ *
4
+ * Integrates skill detection into the message flow.
5
+ */
6
+ import type { DetectionResult } from './detector.js';
7
+ /**
8
+ * Configuration for detection behavior.
9
+ */
10
+ export interface DetectionConfig {
11
+ /** Minimum confidence to prompt (0-100) */
12
+ promptThreshold: number;
13
+ /** Cooldown between prompts (messages) */
14
+ promptCooldown: number;
15
+ /** Enable/disable auto-detection */
16
+ enabled: boolean;
17
+ }
18
+ /**
19
+ * Process assistant response for skill detection.
20
+ * Returns prompt text if extraction should be suggested, null otherwise.
21
+ */
22
+ export declare function processResponseForDetection(assistantMessage: string, userMessage: string | undefined, sessionId: string, config?: Partial<DetectionConfig>): string | null;
23
+ /**
24
+ * Get the last detection result for a session.
25
+ */
26
+ export declare function getLastDetection(sessionId: string): DetectionResult | null;
27
+ /**
28
+ * Clear detection state for a session.
29
+ */
30
+ export declare function clearDetectionState(sessionId: string): void;
31
+ /**
32
+ * Get detection statistics for a session.
33
+ */
34
+ export declare function getDetectionStats(sessionId: string): {
35
+ messagesSincePrompt: number;
36
+ promptedCount: number;
37
+ lastDetection: DetectionResult | null;
38
+ };
39
+ //# sourceMappingURL=detection-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detection-hook.d.ts","sourceRoot":"","sources":["../../../src/hooks/mnemosyne/detection-hook.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;CAClB;AAiCD;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACpC,MAAM,GAAG,IAAI,CA2Bf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAE1E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG;IACpD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,eAAe,GAAG,IAAI,CAAC;CACvC,CAcA"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Detection Hook
3
+ *
4
+ * Integrates skill detection into the message flow.
5
+ */
6
+ import { detectExtractableMoment, shouldPromptExtraction, generateExtractionPrompt } from './detector.js';
7
+ import { isMnemosyneEnabled } from './index.js';
8
+ const DEFAULT_CONFIG = {
9
+ promptThreshold: 60,
10
+ promptCooldown: 5,
11
+ enabled: true,
12
+ };
13
+ const sessionStates = new Map();
14
+ /**
15
+ * Get or create session state.
16
+ */
17
+ function getSessionState(sessionId) {
18
+ if (!sessionStates.has(sessionId)) {
19
+ sessionStates.set(sessionId, {
20
+ messagesSincePrompt: 0,
21
+ lastDetection: null,
22
+ promptedCount: 0,
23
+ });
24
+ }
25
+ return sessionStates.get(sessionId);
26
+ }
27
+ /**
28
+ * Process assistant response for skill detection.
29
+ * Returns prompt text if extraction should be suggested, null otherwise.
30
+ */
31
+ export function processResponseForDetection(assistantMessage, userMessage, sessionId, config = {}) {
32
+ const mergedConfig = { ...DEFAULT_CONFIG, ...config };
33
+ if (!mergedConfig.enabled || !isMnemosyneEnabled()) {
34
+ return null;
35
+ }
36
+ const state = getSessionState(sessionId);
37
+ state.messagesSincePrompt++;
38
+ // Check cooldown
39
+ if (state.messagesSincePrompt < mergedConfig.promptCooldown) {
40
+ return null;
41
+ }
42
+ // Detect extractable moment
43
+ const detection = detectExtractableMoment(assistantMessage, userMessage);
44
+ state.lastDetection = detection;
45
+ // Check if we should prompt
46
+ if (shouldPromptExtraction(detection, mergedConfig.promptThreshold)) {
47
+ state.messagesSincePrompt = 0;
48
+ state.promptedCount++;
49
+ return generateExtractionPrompt(detection);
50
+ }
51
+ return null;
52
+ }
53
+ /**
54
+ * Get the last detection result for a session.
55
+ */
56
+ export function getLastDetection(sessionId) {
57
+ return sessionStates.get(sessionId)?.lastDetection || null;
58
+ }
59
+ /**
60
+ * Clear detection state for a session.
61
+ */
62
+ export function clearDetectionState(sessionId) {
63
+ sessionStates.delete(sessionId);
64
+ }
65
+ /**
66
+ * Get detection statistics for a session.
67
+ */
68
+ export function getDetectionStats(sessionId) {
69
+ const state = sessionStates.get(sessionId);
70
+ if (!state) {
71
+ return {
72
+ messagesSincePrompt: 0,
73
+ promptedCount: 0,
74
+ lastDetection: null,
75
+ };
76
+ }
77
+ return {
78
+ messagesSincePrompt: state.messagesSincePrompt,
79
+ promptedCount: state.promptedCount,
80
+ lastDetection: state.lastDetection,
81
+ };
82
+ }
83
+ //# sourceMappingURL=detection-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detection-hook.js","sourceRoot":"","sources":["../../../src/hooks/mnemosyne/detection-hook.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAC1G,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAehD,MAAM,cAAc,GAAoB;IACtC,eAAe,EAAE,EAAE;IACnB,cAAc,EAAE,CAAC;IACjB,OAAO,EAAE,IAAI;CACd,CAAC;AAWF,MAAM,aAAa,GAAG,IAAI,GAAG,EAAiC,CAAC;AAE/D;;GAEG;AACH,SAAS,eAAe,CAAC,SAAiB;IACxC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE;YAC3B,mBAAmB,EAAE,CAAC;YACtB,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,CAAC;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,aAAa,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,gBAAwB,EACxB,WAA+B,EAC/B,SAAiB,EACjB,SAAmC,EAAE;IAErC,MAAM,YAAY,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAEtD,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IACzC,KAAK,CAAC,mBAAmB,EAAE,CAAC;IAE5B,iBAAiB;IACjB,IAAI,KAAK,CAAC,mBAAmB,GAAG,YAAY,CAAC,cAAc,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4BAA4B;IAC5B,MAAM,SAAS,GAAG,uBAAuB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;IACzE,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;IAEhC,4BAA4B;IAC5B,IAAI,sBAAsB,CAAC,SAAS,EAAE,YAAY,CAAC,eAAe,CAAC,EAAE,CAAC;QACpE,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC9B,KAAK,CAAC,aAAa,EAAE,CAAC;QACtB,OAAO,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,aAAa,IAAI,IAAI,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IAKjD,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,mBAAmB,EAAE,CAAC;YACtB,aAAa,EAAE,CAAC;YAChB,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,aAAa,EAAE,KAAK,CAAC,aAAa;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Extractable Moment Detector
3
+ *
4
+ * Detects patterns in conversation that indicate a skill could be extracted.
5
+ */
6
+ export interface DetectionResult {
7
+ /** Whether an extractable moment was detected */
8
+ detected: boolean;
9
+ /** Confidence score (0-100) */
10
+ confidence: number;
11
+ /** Type of pattern detected */
12
+ patternType: 'problem-solution' | 'technique' | 'workaround' | 'optimization' | 'best-practice';
13
+ /** Suggested trigger keywords */
14
+ suggestedTriggers: string[];
15
+ /** Reason for detection */
16
+ reason: string;
17
+ }
18
+ /**
19
+ * Detect if a message contains an extractable skill moment.
20
+ */
21
+ export declare function detectExtractableMoment(assistantMessage: string, userMessage?: string): DetectionResult;
22
+ /**
23
+ * Check if detection confidence meets threshold for prompting.
24
+ */
25
+ export declare function shouldPromptExtraction(detection: DetectionResult, threshold?: number): boolean;
26
+ /**
27
+ * Generate a prompt for skill extraction confirmation.
28
+ */
29
+ export declare function generateExtractionPrompt(detection: DetectionResult): string;
30
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../../src/hooks/mnemosyne/detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,QAAQ,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,WAAW,EAAE,kBAAkB,GAAG,WAAW,GAAG,YAAY,GAAG,cAAc,GAAG,eAAe,CAAC;IAChG,iCAAiC;IACjC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AA2ED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,MAAM,EACxB,WAAW,CAAC,EAAE,MAAM,GACnB,eAAe,CAiDjB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,eAAe,EAC1B,SAAS,GAAE,MAAW,GACrB,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,CAiB3E"}