oh-my-claude-sisyphus 3.1.0 → 3.2.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 (379) hide show
  1. package/README.md +3 -1
  2. package/commands/autopilot.md +131 -0
  3. package/commands/cancel-autopilot.md +35 -0
  4. package/dist/__tests__/installer.test.js +1 -1
  5. package/dist/__tests__/learned-skills/config.test.d.ts +2 -0
  6. package/dist/__tests__/learned-skills/config.test.d.ts.map +1 -0
  7. package/dist/__tests__/learned-skills/config.test.js +37 -0
  8. package/dist/__tests__/learned-skills/config.test.js.map +1 -0
  9. package/dist/__tests__/learned-skills/detector.test.d.ts +2 -0
  10. package/dist/__tests__/learned-skills/detector.test.d.ts.map +1 -0
  11. package/dist/__tests__/learned-skills/detector.test.js +99 -0
  12. package/dist/__tests__/learned-skills/detector.test.js.map +1 -0
  13. package/dist/__tests__/learned-skills/finder.test.d.ts +2 -0
  14. package/dist/__tests__/learned-skills/finder.test.d.ts.map +1 -0
  15. package/dist/__tests__/learned-skills/finder.test.js +59 -0
  16. package/dist/__tests__/learned-skills/finder.test.js.map +1 -0
  17. package/dist/__tests__/learned-skills/loader.test.d.ts +2 -0
  18. package/dist/__tests__/learned-skills/loader.test.d.ts.map +1 -0
  19. package/dist/__tests__/learned-skills/loader.test.js +69 -0
  20. package/dist/__tests__/learned-skills/loader.test.js.map +1 -0
  21. package/dist/__tests__/learned-skills/parser.test.d.ts +2 -0
  22. package/dist/__tests__/learned-skills/parser.test.d.ts.map +1 -0
  23. package/dist/__tests__/learned-skills/parser.test.js +81 -0
  24. package/dist/__tests__/learned-skills/parser.test.js.map +1 -0
  25. package/dist/__tests__/learned-skills/validator.test.d.ts +2 -0
  26. package/dist/__tests__/learned-skills/validator.test.d.ts.map +1 -0
  27. package/dist/__tests__/learned-skills/validator.test.js +85 -0
  28. package/dist/__tests__/learned-skills/validator.test.js.map +1 -0
  29. package/dist/__tests__/skills.test.js +8 -4
  30. package/dist/__tests__/skills.test.js.map +1 -1
  31. package/dist/agents/definitions.d.ts +32 -0
  32. package/dist/agents/definitions.d.ts.map +1 -1
  33. package/dist/agents/definitions.js +93 -1
  34. package/dist/agents/definitions.js.map +1 -1
  35. package/dist/agents/delegation-validator.d.ts +31 -0
  36. package/dist/agents/delegation-validator.d.ts.map +1 -0
  37. package/dist/agents/delegation-validator.js +75 -0
  38. package/dist/agents/delegation-validator.js.map +1 -0
  39. package/dist/agents/document-writer.d.ts +11 -0
  40. package/dist/agents/document-writer.d.ts.map +1 -0
  41. package/dist/agents/document-writer.js +209 -0
  42. package/dist/agents/document-writer.js.map +1 -0
  43. package/dist/agents/frontend-engineer.d.ts +11 -0
  44. package/dist/agents/frontend-engineer.d.ts.map +1 -0
  45. package/dist/agents/frontend-engineer.js +115 -0
  46. package/dist/agents/frontend-engineer.js.map +1 -0
  47. package/dist/agents/librarian.d.ts +12 -0
  48. package/dist/agents/librarian.d.ts.map +1 -0
  49. package/dist/agents/librarian.js +103 -0
  50. package/dist/agents/librarian.js.map +1 -0
  51. package/dist/agents/metis.d.ts +12 -0
  52. package/dist/agents/metis.d.ts.map +1 -0
  53. package/dist/agents/metis.js +117 -0
  54. package/dist/agents/metis.js.map +1 -0
  55. package/dist/agents/momus.d.ts +12 -0
  56. package/dist/agents/momus.d.ts.map +1 -0
  57. package/dist/agents/momus.js +128 -0
  58. package/dist/agents/momus.js.map +1 -0
  59. package/dist/agents/multimodal-looker.d.ts +11 -0
  60. package/dist/agents/multimodal-looker.d.ts.map +1 -0
  61. package/dist/agents/multimodal-looker.js +70 -0
  62. package/dist/agents/multimodal-looker.js.map +1 -0
  63. package/dist/agents/oracle.d.ts +13 -0
  64. package/dist/agents/oracle.d.ts.map +1 -0
  65. package/dist/agents/oracle.js +191 -0
  66. package/dist/agents/oracle.js.map +1 -0
  67. package/dist/agents/orchestrator-sisyphus.d.ts +11 -0
  68. package/dist/agents/orchestrator-sisyphus.d.ts.map +1 -0
  69. package/dist/agents/orchestrator-sisyphus.js +115 -0
  70. package/dist/agents/orchestrator-sisyphus.js.map +1 -0
  71. package/dist/agents/prometheus.d.ts +12 -0
  72. package/dist/agents/prometheus.d.ts.map +1 -0
  73. package/dist/agents/prometheus.js +195 -0
  74. package/dist/agents/prometheus.js.map +1 -0
  75. package/dist/agents/prompt-generator.d.ts +95 -0
  76. package/dist/agents/prompt-generator.d.ts.map +1 -0
  77. package/dist/agents/prompt-generator.js +140 -0
  78. package/dist/agents/prompt-generator.js.map +1 -0
  79. package/dist/agents/prompt-sections/index.d.ts +44 -0
  80. package/dist/agents/prompt-sections/index.d.ts.map +1 -0
  81. package/dist/agents/prompt-sections/index.js +194 -0
  82. package/dist/agents/prompt-sections/index.js.map +1 -0
  83. package/dist/agents/sisyphus-junior.d.ts +12 -0
  84. package/dist/agents/sisyphus-junior.d.ts.map +1 -0
  85. package/dist/agents/sisyphus-junior.js +93 -0
  86. package/dist/agents/sisyphus-junior.js.map +1 -0
  87. package/dist/agents/types.d.ts +2 -0
  88. package/dist/agents/types.d.ts.map +1 -1
  89. package/dist/agents/types.js.map +1 -1
  90. package/dist/cli/index.js +0 -0
  91. package/dist/features/background-agent/manager.d.ts +10 -1
  92. package/dist/features/background-agent/manager.d.ts.map +1 -1
  93. package/dist/features/background-agent/manager.js +79 -11
  94. package/dist/features/background-agent/manager.js.map +1 -1
  95. package/dist/features/background-agent/types.d.ts +30 -1
  96. package/dist/features/background-agent/types.d.ts.map +1 -1
  97. package/dist/features/delegation-categories/index.d.ts +116 -0
  98. package/dist/features/delegation-categories/index.d.ts.map +1 -0
  99. package/dist/features/delegation-categories/index.js +287 -0
  100. package/dist/features/delegation-categories/index.js.map +1 -0
  101. package/dist/features/delegation-categories/test-categories.d.ts +7 -0
  102. package/dist/features/delegation-categories/test-categories.d.ts.map +1 -0
  103. package/dist/features/delegation-categories/test-categories.js +88 -0
  104. package/dist/features/delegation-categories/test-categories.js.map +1 -0
  105. package/dist/features/delegation-categories/types.d.ts +51 -0
  106. package/dist/features/delegation-categories/types.d.ts.map +1 -0
  107. package/dist/features/delegation-categories/types.js +8 -0
  108. package/dist/features/delegation-categories/types.js.map +1 -0
  109. package/dist/features/index.d.ts +2 -0
  110. package/dist/features/index.d.ts.map +1 -1
  111. package/dist/features/index.js +10 -0
  112. package/dist/features/index.js.map +1 -1
  113. package/dist/features/model-routing/prompts/index.d.ts +2 -0
  114. package/dist/features/model-routing/prompts/index.d.ts.map +1 -1
  115. package/dist/features/model-routing/prompts/index.js +6 -0
  116. package/dist/features/model-routing/prompts/index.js.map +1 -1
  117. package/dist/features/notepad-wisdom/extractor.d.ts +30 -0
  118. package/dist/features/notepad-wisdom/extractor.d.ts.map +1 -0
  119. package/dist/features/notepad-wisdom/extractor.js +68 -0
  120. package/dist/features/notepad-wisdom/extractor.js.map +1 -0
  121. package/dist/features/notepad-wisdom/index.d.ts +39 -0
  122. package/dist/features/notepad-wisdom/index.d.ts.map +1 -0
  123. package/dist/features/notepad-wisdom/index.js +169 -0
  124. package/dist/features/notepad-wisdom/index.js.map +1 -0
  125. package/dist/features/notepad-wisdom/types.d.ts +18 -0
  126. package/dist/features/notepad-wisdom/types.d.ts.map +1 -0
  127. package/dist/features/notepad-wisdom/types.js +7 -0
  128. package/dist/features/notepad-wisdom/types.js.map +1 -0
  129. package/dist/hooks/autopilot/__tests__/cancel.test.d.ts +2 -0
  130. package/dist/hooks/autopilot/__tests__/cancel.test.d.ts.map +1 -0
  131. package/dist/hooks/autopilot/__tests__/cancel.test.js +397 -0
  132. package/dist/hooks/autopilot/__tests__/cancel.test.js.map +1 -0
  133. package/dist/hooks/autopilot/__tests__/prompts.test.d.ts +2 -0
  134. package/dist/hooks/autopilot/__tests__/prompts.test.d.ts.map +1 -0
  135. package/dist/hooks/autopilot/__tests__/prompts.test.js +74 -0
  136. package/dist/hooks/autopilot/__tests__/prompts.test.js.map +1 -0
  137. package/dist/hooks/autopilot/__tests__/state.test.d.ts +2 -0
  138. package/dist/hooks/autopilot/__tests__/state.test.d.ts.map +1 -0
  139. package/dist/hooks/autopilot/__tests__/state.test.js +75 -0
  140. package/dist/hooks/autopilot/__tests__/state.test.js.map +1 -0
  141. package/dist/hooks/autopilot/__tests__/summary.test.d.ts +2 -0
  142. package/dist/hooks/autopilot/__tests__/summary.test.d.ts.map +1 -0
  143. package/dist/hooks/autopilot/__tests__/summary.test.js +289 -0
  144. package/dist/hooks/autopilot/__tests__/summary.test.js.map +1 -0
  145. package/dist/hooks/autopilot/__tests__/transition.test.d.ts +2 -0
  146. package/dist/hooks/autopilot/__tests__/transition.test.d.ts.map +1 -0
  147. package/dist/hooks/autopilot/__tests__/transition.test.js +59 -0
  148. package/dist/hooks/autopilot/__tests__/transition.test.js.map +1 -0
  149. package/dist/hooks/autopilot/__tests__/validation.test.d.ts +2 -0
  150. package/dist/hooks/autopilot/__tests__/validation.test.d.ts.map +1 -0
  151. package/dist/hooks/autopilot/__tests__/validation.test.js +450 -0
  152. package/dist/hooks/autopilot/__tests__/validation.test.js.map +1 -0
  153. package/dist/hooks/autopilot/cancel.d.ts +42 -0
  154. package/dist/hooks/autopilot/cancel.d.ts.map +1 -0
  155. package/dist/hooks/autopilot/cancel.js +156 -0
  156. package/dist/hooks/autopilot/cancel.js.map +1 -0
  157. package/dist/hooks/autopilot/enforcement.d.ts +28 -0
  158. package/dist/hooks/autopilot/enforcement.d.ts.map +1 -0
  159. package/dist/hooks/autopilot/enforcement.js +147 -0
  160. package/dist/hooks/autopilot/enforcement.js.map +1 -0
  161. package/dist/hooks/autopilot/index.d.ts +17 -0
  162. package/dist/hooks/autopilot/index.d.ts.map +1 -0
  163. package/dist/hooks/autopilot/index.js +24 -0
  164. package/dist/hooks/autopilot/index.js.map +1 -0
  165. package/dist/hooks/autopilot/prompts.d.ts +37 -0
  166. package/dist/hooks/autopilot/prompts.d.ts.map +1 -0
  167. package/dist/hooks/autopilot/prompts.js +353 -0
  168. package/dist/hooks/autopilot/prompts.js.map +1 -0
  169. package/dist/hooks/autopilot/signals.d.ts +20 -0
  170. package/dist/hooks/autopilot/signals.d.ts.map +1 -0
  171. package/dist/hooks/autopilot/signals.js +75 -0
  172. package/dist/hooks/autopilot/signals.js.map +1 -0
  173. package/dist/hooks/autopilot/state.d.ts +67 -0
  174. package/dist/hooks/autopilot/state.d.ts.map +1 -0
  175. package/dist/hooks/autopilot/state.js +244 -0
  176. package/dist/hooks/autopilot/state.js.map +1 -0
  177. package/dist/hooks/autopilot/summary.d.ts +27 -0
  178. package/dist/hooks/autopilot/summary.d.ts.map +1 -0
  179. package/dist/hooks/autopilot/summary.js +160 -0
  180. package/dist/hooks/autopilot/summary.js.map +1 -0
  181. package/dist/hooks/autopilot/transition.d.ts +39 -0
  182. package/dist/hooks/autopilot/transition.d.ts.map +1 -0
  183. package/dist/hooks/autopilot/transition.js +216 -0
  184. package/dist/hooks/autopilot/transition.js.map +1 -0
  185. package/dist/hooks/autopilot/types.d.ts +211 -0
  186. package/dist/hooks/autopilot/types.d.ts.map +1 -0
  187. package/dist/hooks/autopilot/types.js +30 -0
  188. package/dist/hooks/autopilot/types.js.map +1 -0
  189. package/dist/hooks/autopilot/validation.d.ts +43 -0
  190. package/dist/hooks/autopilot/validation.d.ts.map +1 -0
  191. package/dist/hooks/autopilot/validation.js +191 -0
  192. package/dist/hooks/autopilot/validation.js.map +1 -0
  193. package/dist/hooks/bridge.d.ts +1 -1
  194. package/dist/hooks/bridge.d.ts.map +1 -1
  195. package/dist/hooks/bridge.js +64 -3
  196. package/dist/hooks/bridge.js.map +1 -1
  197. package/dist/hooks/index.d.ts +1 -0
  198. package/dist/hooks/index.d.ts.map +1 -1
  199. package/dist/hooks/index.js +2 -0
  200. package/dist/hooks/index.js.map +1 -1
  201. package/dist/hooks/keyword-detector/index.d.ts +1 -1
  202. package/dist/hooks/keyword-detector/index.d.ts.map +1 -1
  203. package/dist/hooks/keyword-detector/index.js +38 -2
  204. package/dist/hooks/keyword-detector/index.js.map +1 -1
  205. package/dist/hooks/learned-skills/config.d.ts +53 -0
  206. package/dist/hooks/learned-skills/config.d.ts.map +1 -0
  207. package/dist/hooks/learned-skills/config.js +103 -0
  208. package/dist/hooks/learned-skills/config.js.map +1 -0
  209. package/dist/hooks/learned-skills/constants.d.ts +24 -0
  210. package/dist/hooks/learned-skills/constants.d.ts.map +1 -0
  211. package/dist/hooks/learned-skills/constants.js +26 -0
  212. package/dist/hooks/learned-skills/constants.js.map +1 -0
  213. package/dist/hooks/learned-skills/detection-hook.d.ts +39 -0
  214. package/dist/hooks/learned-skills/detection-hook.d.ts.map +1 -0
  215. package/dist/hooks/learned-skills/detection-hook.js +83 -0
  216. package/dist/hooks/learned-skills/detection-hook.js.map +1 -0
  217. package/dist/hooks/learned-skills/detector.d.ts +30 -0
  218. package/dist/hooks/learned-skills/detector.d.ts.map +1 -0
  219. package/dist/hooks/learned-skills/detector.js +150 -0
  220. package/dist/hooks/learned-skills/detector.js.map +1 -0
  221. package/dist/hooks/learned-skills/finder.d.ts +21 -0
  222. package/dist/hooks/learned-skills/finder.d.ts.map +1 -0
  223. package/dist/hooks/learned-skills/finder.js +117 -0
  224. package/dist/hooks/learned-skills/finder.js.map +1 -0
  225. package/dist/hooks/learned-skills/index.d.ts +62 -0
  226. package/dist/hooks/learned-skills/index.d.ts.map +1 -0
  227. package/dist/hooks/learned-skills/index.js +137 -0
  228. package/dist/hooks/learned-skills/index.js.map +1 -0
  229. package/dist/hooks/learned-skills/loader.d.ts +20 -0
  230. package/dist/hooks/learned-skills/loader.d.ts.map +1 -0
  231. package/dist/hooks/learned-skills/loader.js +107 -0
  232. package/dist/hooks/learned-skills/loader.js.map +1 -0
  233. package/dist/hooks/learned-skills/parser.d.ts +21 -0
  234. package/dist/hooks/learned-skills/parser.d.ts.map +1 -0
  235. package/dist/hooks/learned-skills/parser.js +190 -0
  236. package/dist/hooks/learned-skills/parser.js.map +1 -0
  237. package/dist/hooks/learned-skills/promotion.d.ts +29 -0
  238. package/dist/hooks/learned-skills/promotion.d.ts.map +1 -0
  239. package/dist/hooks/learned-skills/promotion.js +87 -0
  240. package/dist/hooks/learned-skills/promotion.js.map +1 -0
  241. package/dist/hooks/learned-skills/types.d.ts +109 -0
  242. package/dist/hooks/learned-skills/types.d.ts.map +1 -0
  243. package/dist/hooks/learned-skills/types.js +8 -0
  244. package/dist/hooks/learned-skills/types.js.map +1 -0
  245. package/dist/hooks/learned-skills/validator.d.ts +15 -0
  246. package/dist/hooks/learned-skills/validator.d.ts.map +1 -0
  247. package/dist/hooks/learned-skills/validator.js +87 -0
  248. package/dist/hooks/learned-skills/validator.js.map +1 -0
  249. package/dist/hooks/learned-skills/writer.d.ts +27 -0
  250. package/dist/hooks/learned-skills/writer.d.ts.map +1 -0
  251. package/dist/hooks/learned-skills/writer.js +126 -0
  252. package/dist/hooks/learned-skills/writer.js.map +1 -0
  253. package/dist/hooks/mnemosyne/config.d.ts +53 -0
  254. package/dist/hooks/mnemosyne/config.d.ts.map +1 -0
  255. package/dist/hooks/mnemosyne/config.js +103 -0
  256. package/dist/hooks/mnemosyne/config.js.map +1 -0
  257. package/dist/hooks/mnemosyne/constants.d.ts +24 -0
  258. package/dist/hooks/mnemosyne/constants.d.ts.map +1 -0
  259. package/dist/hooks/mnemosyne/constants.js +26 -0
  260. package/dist/hooks/mnemosyne/constants.js.map +1 -0
  261. package/dist/hooks/mnemosyne/detection-hook.d.ts +39 -0
  262. package/dist/hooks/mnemosyne/detection-hook.d.ts.map +1 -0
  263. package/dist/hooks/mnemosyne/detection-hook.js +83 -0
  264. package/dist/hooks/mnemosyne/detection-hook.js.map +1 -0
  265. package/dist/hooks/mnemosyne/detector.d.ts +30 -0
  266. package/dist/hooks/mnemosyne/detector.d.ts.map +1 -0
  267. package/dist/hooks/mnemosyne/detector.js +150 -0
  268. package/dist/hooks/mnemosyne/detector.js.map +1 -0
  269. package/dist/hooks/mnemosyne/finder.d.ts +21 -0
  270. package/dist/hooks/mnemosyne/finder.d.ts.map +1 -0
  271. package/dist/hooks/mnemosyne/finder.js +117 -0
  272. package/dist/hooks/mnemosyne/finder.js.map +1 -0
  273. package/dist/hooks/mnemosyne/index.d.ts +62 -0
  274. package/dist/hooks/mnemosyne/index.d.ts.map +1 -0
  275. package/dist/hooks/mnemosyne/index.js +137 -0
  276. package/dist/hooks/mnemosyne/index.js.map +1 -0
  277. package/dist/hooks/mnemosyne/loader.d.ts +20 -0
  278. package/dist/hooks/mnemosyne/loader.d.ts.map +1 -0
  279. package/dist/hooks/mnemosyne/loader.js +113 -0
  280. package/dist/hooks/mnemosyne/loader.js.map +1 -0
  281. package/dist/hooks/mnemosyne/parser.d.ts +21 -0
  282. package/dist/hooks/mnemosyne/parser.d.ts.map +1 -0
  283. package/dist/hooks/mnemosyne/parser.js +190 -0
  284. package/dist/hooks/mnemosyne/parser.js.map +1 -0
  285. package/dist/hooks/mnemosyne/promotion.d.ts +29 -0
  286. package/dist/hooks/mnemosyne/promotion.d.ts.map +1 -0
  287. package/dist/hooks/mnemosyne/promotion.js +87 -0
  288. package/dist/hooks/mnemosyne/promotion.js.map +1 -0
  289. package/dist/hooks/mnemosyne/types.d.ts +109 -0
  290. package/dist/hooks/mnemosyne/types.d.ts.map +1 -0
  291. package/dist/hooks/mnemosyne/types.js +8 -0
  292. package/dist/hooks/mnemosyne/types.js.map +1 -0
  293. package/dist/hooks/mnemosyne/validator.d.ts +15 -0
  294. package/dist/hooks/mnemosyne/validator.d.ts.map +1 -0
  295. package/dist/hooks/mnemosyne/validator.js +87 -0
  296. package/dist/hooks/mnemosyne/validator.js.map +1 -0
  297. package/dist/hooks/mnemosyne/writer.d.ts +27 -0
  298. package/dist/hooks/mnemosyne/writer.d.ts.map +1 -0
  299. package/dist/hooks/mnemosyne/writer.js +126 -0
  300. package/dist/hooks/mnemosyne/writer.js.map +1 -0
  301. package/dist/hooks/persistent-mode/index.d.ts +6 -2
  302. package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
  303. package/dist/hooks/persistent-mode/index.js +33 -3
  304. package/dist/hooks/persistent-mode/index.js.map +1 -1
  305. package/dist/hooks/sisyphus-orchestrator/constants.d.ts +23 -0
  306. package/dist/hooks/sisyphus-orchestrator/constants.d.ts.map +1 -0
  307. package/dist/hooks/sisyphus-orchestrator/constants.js +142 -0
  308. package/dist/hooks/sisyphus-orchestrator/constants.js.map +1 -0
  309. package/dist/hooks/sisyphus-orchestrator/index.d.ts +113 -0
  310. package/dist/hooks/sisyphus-orchestrator/index.d.ts.map +1 -0
  311. package/dist/hooks/sisyphus-orchestrator/index.js +309 -0
  312. package/dist/hooks/sisyphus-orchestrator/index.js.map +1 -0
  313. package/dist/hooks/todo-continuation/index.d.ts +31 -1
  314. package/dist/hooks/todo-continuation/index.d.ts.map +1 -1
  315. package/dist/hooks/todo-continuation/index.js +38 -1
  316. package/dist/hooks/todo-continuation/index.js.map +1 -1
  317. package/dist/hud/elements/autopilot.d.ts +29 -0
  318. package/dist/hud/elements/autopilot.d.ts.map +1 -0
  319. package/dist/hud/elements/autopilot.js +97 -0
  320. package/dist/hud/elements/autopilot.js.map +1 -0
  321. package/dist/hud/elements/index.d.ts +1 -0
  322. package/dist/hud/elements/index.d.ts.map +1 -1
  323. package/dist/hud/elements/index.js +1 -0
  324. package/dist/hud/elements/index.js.map +1 -1
  325. package/dist/hud/index.js +7 -5
  326. package/dist/hud/index.js.map +1 -1
  327. package/dist/hud/omc-state.d.ts +7 -0
  328. package/dist/hud/omc-state.d.ts.map +1 -1
  329. package/dist/hud/omc-state.js +39 -1
  330. package/dist/hud/omc-state.js.map +1 -1
  331. package/dist/hud/render.d.ts.map +1 -1
  332. package/dist/hud/render.js +7 -0
  333. package/dist/hud/render.js.map +1 -1
  334. package/dist/hud/sisyphus-state.d.ts +31 -0
  335. package/dist/hud/sisyphus-state.d.ts.map +1 -0
  336. package/dist/hud/sisyphus-state.js +163 -0
  337. package/dist/hud/sisyphus-state.js.map +1 -0
  338. package/dist/hud/types.d.ts +5 -0
  339. package/dist/hud/types.d.ts.map +1 -1
  340. package/dist/hud/types.js +6 -0
  341. package/dist/hud/types.js.map +1 -1
  342. package/dist/installer/index.d.ts +1 -1
  343. package/dist/installer/index.js +3 -3
  344. package/dist/installer/index.js.map +1 -1
  345. package/dist/tools/diagnostics/index.d.ts +29 -0
  346. package/dist/tools/diagnostics/index.d.ts.map +1 -0
  347. package/dist/tools/diagnostics/index.js +118 -0
  348. package/dist/tools/diagnostics/index.js.map +1 -0
  349. package/dist/tools/diagnostics/lsp-aggregator.d.ts +26 -0
  350. package/dist/tools/diagnostics/lsp-aggregator.d.ts.map +1 -0
  351. package/dist/tools/diagnostics/lsp-aggregator.js +99 -0
  352. package/dist/tools/diagnostics/lsp-aggregator.js.map +1 -0
  353. package/dist/tools/diagnostics/tsc-runner.d.ts +26 -0
  354. package/dist/tools/diagnostics/tsc-runner.d.ts.map +1 -0
  355. package/dist/tools/diagnostics/tsc-runner.js +70 -0
  356. package/dist/tools/diagnostics/tsc-runner.js.map +1 -0
  357. package/dist/tools/lsp-tools.d.ts +10 -0
  358. package/dist/tools/lsp-tools.d.ts.map +1 -1
  359. package/dist/tools/lsp-tools.js +43 -1
  360. package/dist/tools/lsp-tools.js.map +1 -1
  361. package/dist/tools/resume-session.d.ts +63 -0
  362. package/dist/tools/resume-session.d.ts.map +1 -0
  363. package/dist/tools/resume-session.js +106 -0
  364. package/dist/tools/resume-session.js.map +1 -0
  365. package/dist/utils/__tests__/paths.test.d.ts +2 -0
  366. package/dist/utils/__tests__/paths.test.d.ts.map +1 -0
  367. package/dist/utils/__tests__/paths.test.js +88 -0
  368. package/dist/utils/__tests__/paths.test.js.map +1 -0
  369. package/dist/utils/paths.d.ts +32 -0
  370. package/dist/utils/paths.d.ts.map +1 -0
  371. package/dist/utils/paths.js +55 -0
  372. package/dist/utils/paths.js.map +1 -0
  373. package/docs/ARCHITECTURE.md +80 -1
  374. package/docs/CLAUDE.md +85 -3
  375. package/docs/FEATURES.md +2167 -0
  376. package/docs/FULL-README.md +69 -1
  377. package/package.json +1 -1
  378. package/skills/autopilot/SKILL.md +168 -0
  379. package/skills/cancel-autopilot/SKILL.md +53 -0
package/README.md CHANGED
@@ -46,6 +46,7 @@ That's it. Everything else is automatic.
46
46
  | Say "don't stop until done" | Persist until verified complete |
47
47
  | Work on UI/frontend | Activate design sensibility |
48
48
  | Need research or exploration | Delegate to specialized agents |
49
+ | Say "build me..." or use autopilot | Execute full autonomous workflow |
49
50
 
50
51
  **You don't need to learn any commands.** I detect what you need and activate the right behaviors.
51
52
 
@@ -61,6 +62,7 @@ Want explicit control? Include these words anywhere in your message:
61
62
  | `ralplan` | Iterative planning with consensus |
62
63
  | `ulw` | Maximum parallel execution |
63
64
  | `plan` | Start a planning interview |
65
+ | `autopilot` / `ap` | Full autonomous execution |
64
66
 
65
67
  **Combine them:** `ralph ulw: migrate the database`
66
68
 
@@ -80,7 +82,7 @@ I'll intelligently determine what to stop based on context.
80
82
  ## What's Under the Hood
81
83
 
82
84
  - **27 Specialized Agents** - architect, researcher, explore, designer, writer, vision, critic, analyst, executor, planner, qa-tester (with tier variants)
83
- - **26 Skills** - orchestrate, ultrawork, ralph, planner, deepsearch, deepinit, git-master, frontend-ui-ux, learner, and more
85
+ - **28 Skills** - orchestrate, ultrawork, ralph, planner, deepsearch, deepinit, git-master, frontend-ui-ux, learner, and more
84
86
  - **HUD Statusline** - Real-time visualization of orchestration state
85
87
  - **Learned Skills** - Extract reusable insights from sessions with `/learner`
86
88
  - **Memory System** - Persistent context that survives compaction
@@ -0,0 +1,131 @@
1
+ ---
2
+ description: Full autonomous execution from idea to working code
3
+ aliases: [ap, autonomous, fullsend]
4
+ ---
5
+
6
+ # Autopilot Command
7
+
8
+ [AUTOPILOT ACTIVATED - AUTONOMOUS EXECUTION MODE]
9
+
10
+ You are now in AUTOPILOT mode. This is a full autonomous execution workflow that takes a brief product idea and delivers working, tested, documented code.
11
+
12
+ ## User's Idea
13
+
14
+ {{ARGUMENTS}}
15
+
16
+ ## Your Mission
17
+
18
+ Transform this idea into working code through 5 phases:
19
+
20
+ 1. **Expansion** - Turn the idea into detailed spec
21
+ 2. **Planning** - Create implementation plan
22
+ 3. **Execution** - Build with parallel agents
23
+ 4. **QA** - Test until everything passes
24
+ 5. **Validation** - Multi-architect review
25
+
26
+ ## Phase 0: Expansion
27
+
28
+ First, expand the user's idea into a detailed specification.
29
+
30
+ ### Step 1: Requirements Analysis
31
+
32
+ Spawn the Analyst agent:
33
+
34
+ ```
35
+ Task(
36
+ subagent_type="oh-my-claudecode:analyst",
37
+ model="opus",
38
+ prompt="REQUIREMENTS ANALYSIS
39
+
40
+ Analyze this product idea: {{ARGUMENTS}}
41
+
42
+ Extract:
43
+ 1. Functional requirements - what it must do
44
+ 2. Non-functional requirements - performance, UX, security
45
+ 3. Implicit requirements - things the user needs but didn't say
46
+ 4. Out of scope - what this is NOT
47
+
48
+ Output as structured markdown."
49
+ )
50
+ ```
51
+
52
+ ### Step 2: Technical Specification
53
+
54
+ After Analyst completes, spawn Architect:
55
+
56
+ ```
57
+ Task(
58
+ subagent_type="oh-my-claudecode:architect",
59
+ model="opus",
60
+ prompt="TECHNICAL SPECIFICATION
61
+
62
+ Based on the requirements above, create a technical specification:
63
+ 1. Tech stack with rationale
64
+ 2. Architecture overview
65
+ 3. File structure
66
+ 4. Dependencies
67
+ 5. API/interfaces
68
+
69
+ Output as structured markdown."
70
+ )
71
+ ```
72
+
73
+ ### Step 3: Save Spec
74
+
75
+ Combine Analyst + Architect output into `.omc/autopilot/spec.md`
76
+
77
+ Then signal: **EXPANSION_COMPLETE**
78
+
79
+ ## Phase 1: Planning
80
+
81
+ Create an implementation plan directly from the spec (no interview needed).
82
+
83
+ Use the Architect to create the plan, then Critic to validate.
84
+
85
+ Signal when approved: **PLANNING_COMPLETE**
86
+
87
+ ## Phase 2: Execution
88
+
89
+ Activate Ralph + Ultrawork mode and execute the plan.
90
+
91
+ - Spawn parallel executors for independent tasks
92
+ - Track progress via TODO list
93
+ - Use appropriate agent tiers
94
+
95
+ Signal when done: **EXECUTION_COMPLETE**
96
+
97
+ ## Phase 3: QA
98
+
99
+ Run UltraQA cycles:
100
+ - Build → Lint → Test → Fix → Repeat
101
+
102
+ Signal when all pass: **QA_COMPLETE**
103
+
104
+ ## Phase 4: Validation
105
+
106
+ Spawn 3 parallel architects:
107
+ 1. Functional completeness
108
+ 2. Security review
109
+ 3. Code quality
110
+
111
+ All must APPROVE.
112
+
113
+ Signal: **AUTOPILOT_COMPLETE**
114
+
115
+ ## Rules
116
+
117
+ - Do NOT stop between phases
118
+ - Do NOT ask for user input unless truly ambiguous
119
+ - Track progress via TODO list
120
+ - Use parallel agents aggressively
121
+ - Fix issues automatically when possible
122
+
123
+ ## Completion
124
+
125
+ When all phases complete successfully, output:
126
+
127
+ ```
128
+ <promise>TASK_COMPLETE</promise>
129
+ ```
130
+
131
+ And display the autopilot summary.
@@ -0,0 +1,35 @@
1
+ ---
2
+ description: Cancel active autopilot session
3
+ ---
4
+
5
+ # Cancel Autopilot
6
+
7
+ [CANCELLING AUTOPILOT]
8
+
9
+ You are cancelling the active autopilot session.
10
+
11
+ ## Action
12
+
13
+ 1. Call the cancel function to clean up state
14
+ 2. Report what was cancelled
15
+ 3. Show preserved progress
16
+
17
+ ## Steps
18
+
19
+ 1. Check if autopilot is active
20
+ 2. Clean up Ralph/UltraQA if active
21
+ 3. Preserve autopilot state for resume
22
+ 4. Report status
23
+
24
+ ## Arguments
25
+
26
+ {{ARGUMENTS}}
27
+
28
+ If `--clear` is passed, completely clear all state instead of preserving.
29
+
30
+ ## Output
31
+
32
+ Report:
33
+ - What phase was cancelled
34
+ - What modes were cleaned up
35
+ - How to resume
@@ -269,7 +269,7 @@ describe('Installer Constants', () => {
269
269
  });
270
270
  it('should match package.json version', () => {
271
271
  // This is a runtime check - VERSION should match the package.json
272
- expect(VERSION).toBe('3.1.0');
272
+ expect(VERSION).toBe('3.2.2');
273
273
  });
274
274
  });
275
275
  describe('File Paths', () => {
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/learned-skills/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { loadConfig, getConfigValue } from '../../hooks/learned-skills/config.js';
3
+ describe('Claudeception Config', () => {
4
+ it('should return defaults when no config exists', () => {
5
+ const config = loadConfig();
6
+ expect(config.enabled).toBe(true);
7
+ expect(config.detection.promptThreshold).toBe(60);
8
+ });
9
+ it('should have valid default detection config', () => {
10
+ const config = loadConfig();
11
+ expect(config.detection.enabled).toBe(true);
12
+ expect(config.detection.promptCooldown).toBe(5);
13
+ });
14
+ it('should have valid default quality config', () => {
15
+ const config = loadConfig();
16
+ expect(config.quality.minScore).toBe(50);
17
+ expect(config.quality.minProblemLength).toBe(10);
18
+ expect(config.quality.minSolutionLength).toBe(20);
19
+ });
20
+ it('should have valid default storage config', () => {
21
+ const config = loadConfig();
22
+ expect(config.storage.maxSkillsPerScope).toBe(100);
23
+ expect(config.storage.autoPrune).toBe(false);
24
+ expect(config.storage.pruneDays).toBe(90);
25
+ });
26
+ it('should get specific config value', () => {
27
+ const enabled = getConfigValue('enabled');
28
+ expect(typeof enabled).toBe('boolean');
29
+ });
30
+ it('should get nested config value', () => {
31
+ const detection = getConfigValue('detection');
32
+ expect(detection).toHaveProperty('enabled');
33
+ expect(detection).toHaveProperty('promptThreshold');
34
+ expect(detection).toHaveProperty('promptCooldown');
35
+ });
36
+ });
37
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../../src/__tests__/learned-skills/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAElF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=detector.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/learned-skills/detector.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,99 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { detectExtractableMoment, shouldPromptExtraction, generateExtractionPrompt, } from '../../hooks/learned-skills/detector.js';
3
+ describe('Skill Detector', () => {
4
+ describe('detectExtractableMoment', () => {
5
+ it('should detect problem-solution pattern', () => {
6
+ const message = 'The issue was caused by a race condition. I fixed it by adding proper locking.';
7
+ const result = detectExtractableMoment(message);
8
+ expect(result.detected).toBe(true);
9
+ expect(result.patternType).toBe('problem-solution');
10
+ expect(result.confidence).toBeGreaterThan(0);
11
+ });
12
+ it('should detect technique pattern', () => {
13
+ const message = 'A better way to handle this is to use the observer pattern instead of polling.';
14
+ const result = detectExtractableMoment(message);
15
+ expect(result.detected).toBe(true);
16
+ expect(result.patternType).toBe('technique');
17
+ });
18
+ it('should detect best practice pattern', () => {
19
+ const message = 'Best practices include keeping state as local as possible for React components.';
20
+ const result = detectExtractableMoment(message);
21
+ expect(result.detected).toBe(true);
22
+ expect(result.patternType).toBe('best-practice');
23
+ });
24
+ it('should not detect in regular conversation', () => {
25
+ const message = 'Sure, I can help you with that. What would you like to know?';
26
+ const result = detectExtractableMoment(message);
27
+ expect(result.detected).toBe(false);
28
+ });
29
+ it('should extract trigger keywords when pattern detected', () => {
30
+ // Message that matches problem-solution pattern AND contains trigger keywords
31
+ const message = 'The issue was caused by React state management. I fixed it by using TypeScript strict mode.';
32
+ const result = detectExtractableMoment(message, 'How do I manage state in React?');
33
+ expect(result.detected).toBe(true);
34
+ expect(result.suggestedTriggers).toContain('react');
35
+ expect(result.suggestedTriggers).toContain('typescript');
36
+ });
37
+ it('should detect workaround pattern', () => {
38
+ const message = 'As a workaround, you can temporarily disable the cache while debugging.';
39
+ const result = detectExtractableMoment(message);
40
+ expect(result.detected).toBe(true);
41
+ expect(result.patternType).toBe('workaround');
42
+ });
43
+ it('should detect optimization pattern', () => {
44
+ const message = 'To get better performance, optimize by using memoization on expensive calculations.';
45
+ const result = detectExtractableMoment(message);
46
+ expect(result.detected).toBe(true);
47
+ expect(result.patternType).toBe('optimization');
48
+ });
49
+ });
50
+ describe('shouldPromptExtraction', () => {
51
+ it('should return true when confidence exceeds threshold', () => {
52
+ const detection = {
53
+ detected: true,
54
+ confidence: 75,
55
+ patternType: 'problem-solution',
56
+ suggestedTriggers: [],
57
+ reason: 'test',
58
+ };
59
+ expect(shouldPromptExtraction(detection, 60)).toBe(true);
60
+ });
61
+ it('should return false when not detected', () => {
62
+ const detection = {
63
+ detected: false,
64
+ confidence: 0,
65
+ patternType: 'problem-solution',
66
+ suggestedTriggers: [],
67
+ reason: 'test',
68
+ };
69
+ expect(shouldPromptExtraction(detection)).toBe(false);
70
+ });
71
+ it('should return false when below threshold', () => {
72
+ const detection = {
73
+ detected: true,
74
+ confidence: 40,
75
+ patternType: 'problem-solution',
76
+ suggestedTriggers: [],
77
+ reason: 'test',
78
+ };
79
+ expect(shouldPromptExtraction(detection, 60)).toBe(false);
80
+ });
81
+ });
82
+ describe('generateExtractionPrompt', () => {
83
+ it('should generate prompt with detection details', () => {
84
+ const detection = {
85
+ detected: true,
86
+ confidence: 80,
87
+ patternType: 'technique',
88
+ suggestedTriggers: ['react', 'hooks'],
89
+ reason: 'Detected technique pattern',
90
+ };
91
+ const prompt = generateExtractionPrompt(detection);
92
+ expect(prompt).toContain('useful technique');
93
+ expect(prompt).toContain('80%');
94
+ expect(prompt).toContain('react, hooks');
95
+ expect(prompt).toContain('/claudeception');
96
+ });
97
+ });
98
+ });
99
+ //# sourceMappingURL=detector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.test.js","sourceRoot":"","sources":["../../../src/__tests__/learned-skills/detector.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=finder.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finder.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/learned-skills/finder.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdirSync, writeFileSync, rmSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { tmpdir } from 'os';
5
+ import { findSkillFiles, getSkillsDir, ensureSkillsDir } from '../../hooks/learned-skills/finder.js';
6
+ describe('Skill Finder', () => {
7
+ let testDir;
8
+ let projectRoot;
9
+ beforeEach(() => {
10
+ testDir = join(tmpdir(), `skill-test-${Date.now()}`);
11
+ projectRoot = join(testDir, 'project');
12
+ mkdirSync(join(projectRoot, '.sisyphus', 'skills'), { recursive: true });
13
+ });
14
+ afterEach(() => {
15
+ rmSync(testDir, { recursive: true, force: true });
16
+ });
17
+ it('should find project-level skills', () => {
18
+ const skillPath = join(projectRoot, '.sisyphus', 'skills', 'test-skill.md');
19
+ writeFileSync(skillPath, '# Test Skill');
20
+ const candidates = findSkillFiles(projectRoot);
21
+ expect(candidates.length).toBe(1);
22
+ expect(candidates[0].scope).toBe('project');
23
+ expect(candidates[0].path).toBe(skillPath);
24
+ });
25
+ it('should prioritize project skills over user skills', () => {
26
+ // Create project skill
27
+ const projectSkillPath = join(projectRoot, '.sisyphus', 'skills', 'skill.md');
28
+ writeFileSync(projectSkillPath, '# Project Skill');
29
+ const candidates = findSkillFiles(projectRoot);
30
+ // Project skill should come first
31
+ const projectSkill = candidates.find(c => c.scope === 'project');
32
+ expect(projectSkill).toBeDefined();
33
+ });
34
+ it('should handle missing directories gracefully', () => {
35
+ const emptyProject = join(testDir, 'empty');
36
+ mkdirSync(emptyProject);
37
+ const candidates = findSkillFiles(emptyProject);
38
+ // Should return empty array, not throw
39
+ expect(Array.isArray(candidates)).toBe(true);
40
+ });
41
+ it('should get skills directory for user scope', () => {
42
+ const userDir = getSkillsDir('user');
43
+ expect(userDir).toContain('.claude');
44
+ expect(userDir).toContain('sisyphus-learned');
45
+ });
46
+ it('should get skills directory for project scope', () => {
47
+ const projectDir = getSkillsDir('project', projectRoot);
48
+ expect(projectDir).toContain('.sisyphus');
49
+ expect(projectDir).toContain('skills');
50
+ });
51
+ it('should throw for project scope without root', () => {
52
+ expect(() => getSkillsDir('project')).toThrow();
53
+ });
54
+ it('should ensure skills directory exists', () => {
55
+ const result = ensureSkillsDir('project', projectRoot);
56
+ expect(result).toBe(true);
57
+ });
58
+ });
59
+ //# sourceMappingURL=finder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finder.test.js","sourceRoot":"","sources":["../../../src/__tests__/learned-skills/finder.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAErG,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,OAAe,CAAC;IACpB,IAAI,WAAmB,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrD,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACvC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC5E,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAEzC,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QAE/C,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,uBAAuB;QACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC9E,aAAa,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;QAEnD,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QAE/C,kCAAkC;QAClC,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;QACjE,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,SAAS,CAAC,YAAY,CAAC,CAAC;QAExB,MAAM,UAAU,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;QAEhD,uCAAuC;QACvC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACxD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/learned-skills/loader.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,69 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdirSync, writeFileSync, rmSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { tmpdir } from 'os';
5
+ import { loadAllSkills, findMatchingSkills } from '../../hooks/learned-skills/loader.js';
6
+ describe('Skill Loader', () => {
7
+ let testDir;
8
+ let projectRoot;
9
+ beforeEach(() => {
10
+ testDir = join(tmpdir(), `skill-loader-test-${Date.now()}`);
11
+ projectRoot = join(testDir, 'project');
12
+ mkdirSync(join(projectRoot, '.sisyphus', 'skills'), { recursive: true });
13
+ });
14
+ afterEach(() => {
15
+ rmSync(testDir, { recursive: true, force: true });
16
+ });
17
+ const createSkillFile = (name, metadata) => {
18
+ const content = `---
19
+ id: "${metadata.id || name}"
20
+ name: "${metadata.name || name}"
21
+ description: "${metadata.description || 'Test skill'}"
22
+ source: ${metadata.source || 'manual'}
23
+ createdAt: "2024-01-19T12:00:00Z"
24
+ triggers:
25
+ ${(metadata.triggers || ['test']).map(t => ` - "${t}"`).join('\n')}
26
+ ---
27
+
28
+ # ${name}
29
+
30
+ Test content for ${name}.
31
+ `;
32
+ const skillPath = join(projectRoot, '.sisyphus', 'skills', `${name}.md`);
33
+ writeFileSync(skillPath, content);
34
+ return skillPath;
35
+ };
36
+ it('should load all valid skills', () => {
37
+ createSkillFile('skill-a', { triggers: ['alpha'] });
38
+ createSkillFile('skill-b', { triggers: ['beta'] });
39
+ const skills = loadAllSkills(projectRoot);
40
+ expect(skills.length).toBe(2);
41
+ });
42
+ it('should find matching skills by trigger', () => {
43
+ createSkillFile('react-skill', { triggers: ['react', 'component'] });
44
+ createSkillFile('python-skill', { triggers: ['python', 'django'] });
45
+ const matches = findMatchingSkills('How do I create a React component?', projectRoot);
46
+ expect(matches.length).toBe(1);
47
+ expect(matches[0].metadata.id).toBe('react-skill');
48
+ });
49
+ it('should return empty array when no triggers match', () => {
50
+ createSkillFile('react-skill', { triggers: ['react'] });
51
+ const matches = findMatchingSkills('How do I use Rust?', projectRoot);
52
+ expect(matches.length).toBe(0);
53
+ });
54
+ it('should limit results to specified count', () => {
55
+ createSkillFile('skill-1', { triggers: ['test'] });
56
+ createSkillFile('skill-2', { triggers: ['test'] });
57
+ createSkillFile('skill-3', { triggers: ['test'] });
58
+ const matches = findMatchingSkills('This is a test message', projectRoot, 2);
59
+ expect(matches.length).toBeLessThanOrEqual(2);
60
+ });
61
+ it('should boost by quality score', () => {
62
+ createSkillFile('low-quality', { triggers: ['test'], quality: 30 });
63
+ createSkillFile('high-quality', { triggers: ['test'], quality: 90 });
64
+ const matches = findMatchingSkills('test', projectRoot);
65
+ // High quality should be first
66
+ expect(matches[0].metadata.id).toBe('high-quality');
67
+ });
68
+ });
69
+ //# sourceMappingURL=loader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../../src/__tests__/learned-skills/loader.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/learned-skills/parser.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,81 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { parseSkillFile, generateSkillFrontmatter } from '../../hooks/learned-skills/parser.js';
3
+ describe('Skill Parser', () => {
4
+ it('should parse valid skill frontmatter', () => {
5
+ const content = `---
6
+ id: "test-skill-001"
7
+ name: "Test Skill"
8
+ description: "A test skill"
9
+ source: extracted
10
+ createdAt: "2024-01-19T12:00:00Z"
11
+ triggers:
12
+ - "test"
13
+ - "demo"
14
+ tags:
15
+ - "testing"
16
+ ---
17
+
18
+ # Test Skill Content
19
+
20
+ This is the skill content.
21
+ `;
22
+ const result = parseSkillFile(content);
23
+ expect(result.valid).toBe(true);
24
+ expect(result.metadata.id).toBe('test-skill-001');
25
+ expect(result.metadata.name).toBe('Test Skill');
26
+ expect(result.metadata.triggers).toEqual(['test', 'demo']);
27
+ expect(result.content).toContain('Test Skill Content');
28
+ });
29
+ it('should reject skill without required fields', () => {
30
+ const content = `---
31
+ name: "Incomplete Skill"
32
+ ---
33
+
34
+ Content without required fields.
35
+ `;
36
+ const result = parseSkillFile(content);
37
+ expect(result.valid).toBe(false);
38
+ expect(result.errors).toContain('Missing required field: id');
39
+ expect(result.errors).toContain('Missing required field: triggers');
40
+ });
41
+ it('should generate valid frontmatter', () => {
42
+ const metadata = {
43
+ id: 'gen-skill-001',
44
+ name: 'Generated Skill',
45
+ description: 'A generated skill',
46
+ source: 'extracted',
47
+ createdAt: '2024-01-19T12:00:00Z',
48
+ triggers: ['generate', 'create'],
49
+ tags: ['automation'],
50
+ };
51
+ const frontmatter = generateSkillFrontmatter(metadata);
52
+ expect(frontmatter).toContain('id: "gen-skill-001"');
53
+ expect(frontmatter).toContain('triggers:');
54
+ expect(frontmatter).toContain(' - "generate"');
55
+ });
56
+ it('should reject content without frontmatter', () => {
57
+ const content = `# Just content
58
+
59
+ No frontmatter here.
60
+ `;
61
+ const result = parseSkillFile(content);
62
+ expect(result.valid).toBe(false);
63
+ expect(result.errors).toContain('Missing YAML frontmatter');
64
+ });
65
+ it('should handle inline array triggers', () => {
66
+ const content = `---
67
+ id: "inline-array"
68
+ name: "Inline Array Skill"
69
+ description: "Test inline arrays"
70
+ source: manual
71
+ triggers: ["alpha", "beta", "gamma"]
72
+ ---
73
+
74
+ Content
75
+ `;
76
+ const result = parseSkillFile(content);
77
+ expect(result.valid).toBe(true);
78
+ expect(result.metadata.triggers).toEqual(['alpha', 'beta', 'gamma']);
79
+ });
80
+ });
81
+ //# sourceMappingURL=parser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.test.js","sourceRoot":"","sources":["../../../src/__tests__/learned-skills/parser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/learned-skills/validator.test.ts"],"names":[],"mappings":""}