@hivehub/rulebook 2.1.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +840 -661
  3. package/dist/agents/claude-code.d.ts +0 -0
  4. package/dist/agents/claude-code.d.ts.map +0 -0
  5. package/dist/agents/claude-code.js +0 -0
  6. package/dist/agents/claude-code.js.map +0 -0
  7. package/dist/agents/cursor-agent.d.ts +0 -0
  8. package/dist/agents/cursor-agent.d.ts.map +0 -0
  9. package/dist/agents/cursor-agent.js +0 -0
  10. package/dist/agents/cursor-agent.js.map +0 -0
  11. package/dist/agents/gemini-cli.d.ts +0 -0
  12. package/dist/agents/gemini-cli.d.ts.map +0 -0
  13. package/dist/agents/gemini-cli.js +0 -0
  14. package/dist/agents/gemini-cli.js.map +0 -0
  15. package/dist/agents/ralph-parser.d.ts +52 -0
  16. package/dist/agents/ralph-parser.d.ts.map +1 -0
  17. package/dist/agents/ralph-parser.js +246 -0
  18. package/dist/agents/ralph-parser.js.map +1 -0
  19. package/dist/cli/commands.d.ts +35 -0
  20. package/dist/cli/commands.d.ts.map +1 -1
  21. package/dist/cli/commands.js +669 -28
  22. package/dist/cli/commands.js.map +1 -1
  23. package/dist/cli/docs-prompts.d.ts +0 -0
  24. package/dist/cli/docs-prompts.d.ts.map +0 -0
  25. package/dist/cli/docs-prompts.js +0 -0
  26. package/dist/cli/docs-prompts.js.map +0 -0
  27. package/dist/cli/prompts.d.ts +0 -0
  28. package/dist/cli/prompts.d.ts.map +0 -0
  29. package/dist/cli/prompts.js +0 -0
  30. package/dist/cli/prompts.js.map +0 -0
  31. package/dist/core/agent-manager.d.ts +0 -0
  32. package/dist/core/agent-manager.d.ts.map +0 -0
  33. package/dist/core/agent-manager.js +0 -0
  34. package/dist/core/agent-manager.js.map +0 -0
  35. package/dist/core/auto-fixer.d.ts +0 -0
  36. package/dist/core/auto-fixer.d.ts.map +0 -0
  37. package/dist/core/auto-fixer.js +0 -0
  38. package/dist/core/auto-fixer.js.map +0 -0
  39. package/dist/core/changelog-generator.d.ts +0 -0
  40. package/dist/core/changelog-generator.d.ts.map +0 -0
  41. package/dist/core/changelog-generator.js +0 -0
  42. package/dist/core/changelog-generator.js.map +0 -0
  43. package/dist/core/claude-mcp.d.ts +32 -0
  44. package/dist/core/claude-mcp.d.ts.map +1 -0
  45. package/dist/core/claude-mcp.js +92 -0
  46. package/dist/core/claude-mcp.js.map +1 -0
  47. package/dist/core/cli-bridge.d.ts +0 -0
  48. package/dist/core/cli-bridge.d.ts.map +0 -0
  49. package/dist/core/cli-bridge.js +0 -0
  50. package/dist/core/cli-bridge.js.map +0 -0
  51. package/dist/core/config-manager.d.ts +13 -2
  52. package/dist/core/config-manager.d.ts.map +1 -1
  53. package/dist/core/config-manager.js +209 -10
  54. package/dist/core/config-manager.js.map +1 -1
  55. package/dist/core/coverage-checker.d.ts +0 -0
  56. package/dist/core/coverage-checker.d.ts.map +0 -0
  57. package/dist/core/coverage-checker.js +0 -0
  58. package/dist/core/coverage-checker.js.map +0 -0
  59. package/dist/core/custom-templates.d.ts +0 -0
  60. package/dist/core/custom-templates.d.ts.map +0 -0
  61. package/dist/core/custom-templates.js +0 -0
  62. package/dist/core/custom-templates.js.map +0 -0
  63. package/dist/core/dependency-checker.d.ts +0 -0
  64. package/dist/core/dependency-checker.d.ts.map +0 -0
  65. package/dist/core/dependency-checker.js +0 -0
  66. package/dist/core/dependency-checker.js.map +0 -0
  67. package/dist/core/detector.d.ts +0 -0
  68. package/dist/core/detector.d.ts.map +0 -0
  69. package/dist/core/detector.js +0 -0
  70. package/dist/core/detector.js.map +0 -0
  71. package/dist/core/docs-generator.d.ts +0 -0
  72. package/dist/core/docs-generator.d.ts.map +0 -0
  73. package/dist/core/docs-generator.js +0 -0
  74. package/dist/core/docs-generator.js.map +0 -0
  75. package/dist/core/generator.d.ts +0 -0
  76. package/dist/core/generator.d.ts.map +1 -1
  77. package/dist/core/generator.js +181 -49
  78. package/dist/core/generator.js.map +1 -1
  79. package/dist/core/gitignore-generator.d.ts +0 -0
  80. package/dist/core/gitignore-generator.d.ts.map +0 -0
  81. package/dist/core/gitignore-generator.js +0 -0
  82. package/dist/core/gitignore-generator.js.map +0 -0
  83. package/dist/core/health-scorer.d.ts +0 -0
  84. package/dist/core/health-scorer.d.ts.map +0 -0
  85. package/dist/core/health-scorer.js +0 -0
  86. package/dist/core/health-scorer.js.map +0 -0
  87. package/dist/core/iteration-tracker.d.ts +57 -0
  88. package/dist/core/iteration-tracker.d.ts.map +1 -0
  89. package/dist/core/iteration-tracker.js +209 -0
  90. package/dist/core/iteration-tracker.js.map +1 -0
  91. package/dist/core/logger.d.ts +0 -0
  92. package/dist/core/logger.d.ts.map +0 -0
  93. package/dist/core/logger.js +0 -0
  94. package/dist/core/logger.js.map +0 -0
  95. package/dist/core/merger.d.ts +0 -0
  96. package/dist/core/merger.d.ts.map +0 -0
  97. package/dist/core/merger.js +0 -0
  98. package/dist/core/merger.js.map +0 -0
  99. package/dist/core/migrator.d.ts +13 -0
  100. package/dist/core/migrator.d.ts.map +1 -1
  101. package/dist/core/migrator.js +76 -9
  102. package/dist/core/migrator.js.map +1 -1
  103. package/dist/core/minimal-scaffolder.d.ts +0 -0
  104. package/dist/core/minimal-scaffolder.d.ts.map +0 -0
  105. package/dist/core/minimal-scaffolder.js +0 -0
  106. package/dist/core/minimal-scaffolder.js.map +0 -0
  107. package/dist/core/modern-console.d.ts +0 -0
  108. package/dist/core/modern-console.d.ts.map +0 -0
  109. package/dist/core/modern-console.js +0 -0
  110. package/dist/core/modern-console.js.map +0 -0
  111. package/dist/core/openspec-manager.d.ts +0 -0
  112. package/dist/core/openspec-manager.d.ts.map +0 -0
  113. package/dist/core/openspec-manager.js +0 -0
  114. package/dist/core/openspec-manager.js.map +0 -0
  115. package/dist/core/openspec-migrator.d.ts +1 -1
  116. package/dist/core/openspec-migrator.d.ts.map +1 -1
  117. package/dist/core/openspec-migrator.js +14 -7
  118. package/dist/core/openspec-migrator.js.map +1 -1
  119. package/dist/core/prd-generator.d.ts +36 -0
  120. package/dist/core/prd-generator.d.ts.map +1 -0
  121. package/dist/core/prd-generator.js +137 -0
  122. package/dist/core/prd-generator.js.map +1 -0
  123. package/dist/core/ralph-manager.d.ts +75 -0
  124. package/dist/core/ralph-manager.d.ts.map +1 -0
  125. package/dist/core/ralph-manager.js +276 -0
  126. package/dist/core/ralph-manager.js.map +1 -0
  127. package/dist/core/skills-manager.d.ts +0 -0
  128. package/dist/core/skills-manager.d.ts.map +0 -0
  129. package/dist/core/skills-manager.js +0 -0
  130. package/dist/core/skills-manager.js.map +0 -0
  131. package/dist/core/task-manager.d.ts +0 -0
  132. package/dist/core/task-manager.d.ts.map +0 -0
  133. package/dist/core/task-manager.js +0 -0
  134. package/dist/core/task-manager.js.map +0 -0
  135. package/dist/core/test-task-manager.d.ts +0 -0
  136. package/dist/core/test-task-manager.d.ts.map +0 -0
  137. package/dist/core/test-task-manager.js +0 -0
  138. package/dist/core/test-task-manager.js.map +0 -0
  139. package/dist/core/validator.d.ts +0 -0
  140. package/dist/core/validator.d.ts.map +0 -0
  141. package/dist/core/validator.js +0 -0
  142. package/dist/core/validator.js.map +0 -0
  143. package/dist/core/version-bumper.d.ts +0 -0
  144. package/dist/core/version-bumper.d.ts.map +0 -0
  145. package/dist/core/version-bumper.js +0 -0
  146. package/dist/core/version-bumper.js.map +0 -0
  147. package/dist/core/watcher.d.ts +0 -0
  148. package/dist/core/watcher.d.ts.map +0 -0
  149. package/dist/core/watcher.js +0 -0
  150. package/dist/core/watcher.js.map +0 -0
  151. package/dist/core/workflow-generator.d.ts +0 -0
  152. package/dist/core/workflow-generator.d.ts.map +0 -0
  153. package/dist/core/workflow-generator.js +297 -261
  154. package/dist/core/workflow-generator.js.map +1 -1
  155. package/dist/index.d.ts +0 -0
  156. package/dist/index.d.ts.map +0 -0
  157. package/dist/index.js +85 -1
  158. package/dist/index.js.map +1 -1
  159. package/dist/mcp/rulebook-server.d.ts +0 -0
  160. package/dist/mcp/rulebook-server.d.ts.map +1 -1
  161. package/dist/mcp/rulebook-server.js +484 -74
  162. package/dist/mcp/rulebook-server.js.map +1 -1
  163. package/dist/memory/hnsw-index.d.ts +63 -0
  164. package/dist/memory/hnsw-index.d.ts.map +1 -0
  165. package/dist/memory/hnsw-index.js +421 -0
  166. package/dist/memory/hnsw-index.js.map +1 -0
  167. package/dist/memory/memory-cache.d.ts +33 -0
  168. package/dist/memory/memory-cache.d.ts.map +1 -0
  169. package/dist/memory/memory-cache.js +85 -0
  170. package/dist/memory/memory-cache.js.map +1 -0
  171. package/dist/memory/memory-hooks.d.ts +48 -0
  172. package/dist/memory/memory-hooks.d.ts.map +1 -0
  173. package/dist/memory/memory-hooks.js +250 -0
  174. package/dist/memory/memory-hooks.js.map +1 -0
  175. package/dist/memory/memory-manager.d.ts +56 -0
  176. package/dist/memory/memory-manager.d.ts.map +1 -0
  177. package/dist/memory/memory-manager.js +216 -0
  178. package/dist/memory/memory-manager.js.map +1 -0
  179. package/dist/memory/memory-search.d.ts +42 -0
  180. package/dist/memory/memory-search.d.ts.map +1 -0
  181. package/dist/memory/memory-search.js +166 -0
  182. package/dist/memory/memory-search.js.map +1 -0
  183. package/dist/memory/memory-store.d.ts +59 -0
  184. package/dist/memory/memory-store.d.ts.map +1 -0
  185. package/dist/memory/memory-store.js +394 -0
  186. package/dist/memory/memory-store.js.map +1 -0
  187. package/dist/memory/memory-types.d.ts +70 -0
  188. package/dist/memory/memory-types.d.ts.map +1 -0
  189. package/dist/memory/memory-types.js +7 -0
  190. package/dist/memory/memory-types.js.map +1 -0
  191. package/dist/memory/memory-vectorizer.d.ts +29 -0
  192. package/dist/memory/memory-vectorizer.d.ts.map +1 -0
  193. package/dist/memory/memory-vectorizer.js +104 -0
  194. package/dist/memory/memory-vectorizer.js.map +1 -0
  195. package/dist/types.d.ts +77 -0
  196. package/dist/types.d.ts.map +1 -1
  197. package/dist/types.js +0 -0
  198. package/dist/types.js.map +0 -0
  199. package/dist/utils/file-system.d.ts +0 -0
  200. package/dist/utils/file-system.d.ts.map +0 -0
  201. package/dist/utils/file-system.js +0 -0
  202. package/dist/utils/file-system.js.map +0 -0
  203. package/dist/utils/git-hooks.d.ts +0 -0
  204. package/dist/utils/git-hooks.d.ts.map +0 -0
  205. package/dist/utils/git-hooks.js +0 -0
  206. package/dist/utils/git-hooks.js.map +0 -0
  207. package/dist/utils/rulesignore.d.ts +0 -0
  208. package/dist/utils/rulesignore.d.ts.map +0 -0
  209. package/dist/utils/rulesignore.js +0 -0
  210. package/dist/utils/rulesignore.js.map +0 -0
  211. package/package.json +25 -25
  212. package/templates/cli/AIDER.md +0 -0
  213. package/templates/cli/AMAZON_Q.md +0 -0
  214. package/templates/cli/AUGGIE.md +0 -0
  215. package/templates/cli/CLAUDE.md +85 -0
  216. package/templates/cli/CLAUDE_CODE.md +0 -0
  217. package/templates/cli/CLINE.md +69 -2
  218. package/templates/cli/CODEBUDDY.md +0 -0
  219. package/templates/cli/CODEIUM.md +0 -0
  220. package/templates/cli/CODEX.md +0 -0
  221. package/templates/cli/CONTINUE.md +0 -0
  222. package/templates/cli/CURSOR_CLI.md +37 -3
  223. package/templates/cli/FACTORY.md +0 -0
  224. package/templates/cli/GEMINI.md +0 -0
  225. package/templates/cli/KILOCODE.md +0 -0
  226. package/templates/cli/OPENCODE.md +0 -0
  227. package/templates/cli/_GENERIC_TEMPLATE.md +0 -0
  228. package/templates/cli/gemini-extension.json +0 -0
  229. package/templates/commands/rulebook-memory-save.md +48 -0
  230. package/templates/commands/rulebook-memory-search.md +47 -0
  231. package/templates/commands/rulebook-task-apply.md +2 -2
  232. package/templates/commands/rulebook-task-archive.md +2 -2
  233. package/templates/commands/rulebook-task-create.md +2 -2
  234. package/templates/commands/rulebook-task-list.md +2 -2
  235. package/templates/commands/rulebook-task-show.md +2 -2
  236. package/templates/commands/rulebook-task-validate.md +2 -2
  237. package/templates/core/AGENT_AUTOMATION.md +142 -38
  238. package/templates/core/DAG.md +0 -0
  239. package/templates/core/DOCUMENTATION_RULES.md +0 -0
  240. package/templates/core/QUALITY_ENFORCEMENT.md +0 -0
  241. package/templates/core/RALPH.md +430 -0
  242. package/templates/core/RULEBOOK.md +20 -1
  243. package/templates/frameworks/ANGULAR.md +0 -0
  244. package/templates/frameworks/DJANGO.md +0 -0
  245. package/templates/frameworks/ELECTRON.md +0 -0
  246. package/templates/frameworks/FLASK.md +0 -0
  247. package/templates/frameworks/FLUTTER.md +0 -0
  248. package/templates/frameworks/JQUERY.md +0 -0
  249. package/templates/frameworks/LARAVEL.md +0 -0
  250. package/templates/frameworks/NESTJS.md +0 -0
  251. package/templates/frameworks/NEXTJS.md +0 -0
  252. package/templates/frameworks/NUXT.md +0 -0
  253. package/templates/frameworks/RAILS.md +0 -0
  254. package/templates/frameworks/REACT.md +0 -0
  255. package/templates/frameworks/REACT_NATIVE.md +0 -0
  256. package/templates/frameworks/SPRING.md +0 -0
  257. package/templates/frameworks/SYMFONY.md +0 -0
  258. package/templates/frameworks/VUE.md +0 -0
  259. package/templates/frameworks/ZEND.md +0 -0
  260. package/templates/git/CI_CD_PATTERNS.md +4 -4
  261. package/templates/git/GITHUB_ACTIONS.md +3 -3
  262. package/templates/git/GITLAB_CI.md +4 -4
  263. package/templates/git/GIT_WORKFLOW.md +0 -0
  264. package/templates/git/SECRETS_MANAGEMENT.md +4 -4
  265. package/templates/hooks/COMMIT_MSG.md +4 -4
  266. package/templates/hooks/POST_CHECKOUT.md +3 -3
  267. package/templates/hooks/PREPARE_COMMIT_MSG.md +3 -3
  268. package/templates/hooks/PRE_COMMIT.md +4 -4
  269. package/templates/hooks/PRE_PUSH.md +4 -4
  270. package/templates/hooks/csharp-pre-commit.sh +0 -0
  271. package/templates/hooks/csharp-pre-push.sh +0 -0
  272. package/templates/hooks/dart-pre-commit.sh +0 -0
  273. package/templates/hooks/dart-pre-push.sh +0 -0
  274. package/templates/hooks/elixir-pre-commit.sh +0 -0
  275. package/templates/hooks/elixir-pre-push.sh +0 -0
  276. package/templates/hooks/erlang-pre-commit.sh +0 -0
  277. package/templates/hooks/erlang-pre-push.sh +0 -0
  278. package/templates/hooks/go-pre-commit.sh +0 -0
  279. package/templates/hooks/go-pre-push.sh +0 -0
  280. package/templates/hooks/haskell-pre-commit.sh +0 -0
  281. package/templates/hooks/haskell-pre-push.sh +0 -0
  282. package/templates/hooks/java-pre-commit.sh +0 -0
  283. package/templates/hooks/java-pre-push.sh +0 -0
  284. package/templates/hooks/kotlin-pre-commit.sh +0 -0
  285. package/templates/hooks/kotlin-pre-push.sh +0 -0
  286. package/templates/hooks/php-pre-commit.sh +0 -0
  287. package/templates/hooks/php-pre-push.sh +0 -0
  288. package/templates/hooks/python-pre-commit.sh +0 -0
  289. package/templates/hooks/python-pre-push.sh +0 -0
  290. package/templates/hooks/ruby-pre-commit.sh +0 -0
  291. package/templates/hooks/ruby-pre-push.sh +0 -0
  292. package/templates/hooks/rust-pre-commit.sh +0 -0
  293. package/templates/hooks/rust-pre-push.sh +0 -0
  294. package/templates/hooks/scala-pre-commit.sh +0 -0
  295. package/templates/hooks/scala-pre-push.sh +0 -0
  296. package/templates/hooks/swift-pre-commit.sh +0 -0
  297. package/templates/hooks/swift-pre-push.sh +0 -0
  298. package/templates/hooks/typescript-pre-commit.sh +0 -0
  299. package/templates/hooks/typescript-pre-push.sh +0 -0
  300. package/templates/ides/COPILOT.md +0 -0
  301. package/templates/ides/CURSOR.md +0 -0
  302. package/templates/ides/JETBRAINS_AI.md +0 -0
  303. package/templates/ides/REPLIT.md +0 -0
  304. package/templates/ides/TABNINE.md +0 -0
  305. package/templates/ides/VSCODE.md +0 -0
  306. package/templates/ides/WINDSURF.md +0 -0
  307. package/templates/ides/ZED.md +0 -0
  308. package/templates/languages/ADA.md +0 -0
  309. package/templates/languages/C.md +0 -0
  310. package/templates/languages/CPP.md +0 -0
  311. package/templates/languages/CSHARP.md +0 -0
  312. package/templates/languages/DART.md +0 -0
  313. package/templates/languages/ELIXIR.md +0 -0
  314. package/templates/languages/ERLANG.md +0 -0
  315. package/templates/languages/GO.md +0 -0
  316. package/templates/languages/HASKELL.md +0 -0
  317. package/templates/languages/JAVA.md +0 -0
  318. package/templates/languages/JAVASCRIPT.md +0 -0
  319. package/templates/languages/JULIA.md +0 -0
  320. package/templates/languages/KOTLIN.md +0 -0
  321. package/templates/languages/LISP.md +0 -0
  322. package/templates/languages/LUA.md +0 -0
  323. package/templates/languages/OBJECTIVEC.md +0 -0
  324. package/templates/languages/PHP.md +0 -0
  325. package/templates/languages/PYTHON.md +0 -0
  326. package/templates/languages/R.md +0 -0
  327. package/templates/languages/RUBY.md +0 -0
  328. package/templates/languages/RUST.md +0 -0
  329. package/templates/languages/SAS.md +0 -0
  330. package/templates/languages/SCALA.md +0 -0
  331. package/templates/languages/SOLIDITY.md +0 -0
  332. package/templates/languages/SQL.md +0 -0
  333. package/templates/languages/SWIFT.md +0 -0
  334. package/templates/languages/TYPESCRIPT.md +0 -0
  335. package/templates/languages/ZIG.md +0 -0
  336. package/templates/modules/ATLASSIAN.md +0 -0
  337. package/templates/modules/CONTEXT7.md +0 -0
  338. package/templates/modules/FIGMA.md +0 -0
  339. package/templates/modules/GITHUB_MCP.md +0 -0
  340. package/templates/modules/GRAFANA.md +0 -0
  341. package/templates/modules/MEMORY.md +126 -0
  342. package/templates/modules/NOTION.md +0 -0
  343. package/templates/modules/PLAYWRIGHT.md +0 -0
  344. package/templates/modules/RULEBOOK_MCP.md +0 -0
  345. package/templates/modules/SERENA.md +0 -0
  346. package/templates/modules/SUPABASE.md +0 -0
  347. package/templates/modules/SYNAP.md +0 -0
  348. package/templates/modules/VECTORIZER.md +0 -0
  349. package/templates/services/AZURE_BLOB.md +0 -0
  350. package/templates/services/CASSANDRA.md +0 -0
  351. package/templates/services/DYNAMODB.md +0 -0
  352. package/templates/services/ELASTICSEARCH.md +0 -0
  353. package/templates/services/GCS.md +0 -0
  354. package/templates/services/INFLUXDB.md +0 -0
  355. package/templates/services/KAFKA.md +0 -0
  356. package/templates/services/MARIADB.md +0 -0
  357. package/templates/services/MEMCACHED.md +0 -0
  358. package/templates/services/MINIO.md +0 -0
  359. package/templates/services/MONGODB.md +0 -0
  360. package/templates/services/MYSQL.md +0 -0
  361. package/templates/services/NEO4J.md +0 -0
  362. package/templates/services/ORACLE.md +0 -0
  363. package/templates/services/POSTGRESQL.md +0 -0
  364. package/templates/services/RABBITMQ.md +0 -0
  365. package/templates/services/REDIS.md +0 -0
  366. package/templates/services/S3.md +0 -0
  367. package/templates/services/SQLITE.md +0 -0
  368. package/templates/services/SQLSERVER.md +0 -0
  369. package/templates/skills/cli/aider/SKILL.md +59 -0
  370. package/templates/skills/cli/amazon-q/SKILL.md +35 -0
  371. package/templates/skills/cli/auggie/SKILL.md +42 -0
  372. package/templates/skills/cli/claude/SKILL.md +42 -0
  373. package/templates/skills/cli/claude-code/SKILL.md +146 -0
  374. package/templates/skills/cli/cline/SKILL.md +42 -0
  375. package/templates/skills/cli/codebuddy/SKILL.md +30 -0
  376. package/templates/skills/cli/codeium/SKILL.md +30 -0
  377. package/templates/skills/cli/codex/SKILL.md +31 -0
  378. package/templates/skills/cli/continue/SKILL.md +44 -0
  379. package/templates/skills/cli/cursor-cli/SKILL.md +38 -0
  380. package/templates/skills/cli/factory/SKILL.md +28 -0
  381. package/templates/skills/cli/gemini/SKILL.md +45 -0
  382. package/templates/skills/cli/kilocode/SKILL.md +28 -0
  383. package/templates/skills/cli/opencode/SKILL.md +28 -0
  384. package/templates/skills/core/agent-automation/SKILL.md +194 -0
  385. package/templates/skills/core/dag/SKILL.md +314 -0
  386. package/templates/skills/core/documentation-rules/SKILL.md +47 -0
  387. package/templates/skills/core/quality-enforcement/SKILL.md +78 -0
  388. package/templates/skills/core/rulebook/SKILL.md +0 -0
  389. package/templates/skills/frameworks/angular/SKILL.md +46 -0
  390. package/templates/skills/frameworks/django/SKILL.md +93 -0
  391. package/templates/skills/frameworks/electron/SKILL.md +157 -0
  392. package/templates/skills/frameworks/flask/SKILL.md +48 -0
  393. package/templates/skills/frameworks/flutter/SKILL.md +65 -0
  394. package/templates/skills/frameworks/jquery/SKILL.md +42 -0
  395. package/templates/skills/frameworks/laravel/SKILL.md +48 -0
  396. package/templates/skills/frameworks/nestjs/SKILL.md +53 -0
  397. package/templates/skills/frameworks/nextjs/SKILL.md +137 -0
  398. package/templates/skills/frameworks/nuxt/SKILL.md +50 -0
  399. package/templates/skills/frameworks/rails/SKILL.md +76 -0
  400. package/templates/skills/frameworks/react/SKILL.md +48 -0
  401. package/templates/skills/frameworks/react-native/SKILL.md +57 -0
  402. package/templates/skills/frameworks/spring/SKILL.md +49 -0
  403. package/templates/skills/frameworks/symfony/SKILL.md +46 -0
  404. package/templates/skills/frameworks/vue/SKILL.md +46 -0
  405. package/templates/skills/frameworks/zend/SKILL.md +45 -0
  406. package/templates/skills/ides/copilot/SKILL.md +47 -0
  407. package/templates/skills/ides/cursor/SKILL.md +53 -0
  408. package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -0
  409. package/templates/skills/ides/replit/SKILL.md +46 -0
  410. package/templates/skills/ides/tabnine/SKILL.md +39 -0
  411. package/templates/skills/ides/vscode/SKILL.md +50 -0
  412. package/templates/skills/ides/windsurf/SKILL.md +46 -0
  413. package/templates/skills/ides/zed/SKILL.md +42 -0
  414. package/templates/skills/languages/ada/SKILL.md +68 -0
  415. package/templates/skills/languages/c/SKILL.md +343 -0
  416. package/templates/skills/languages/cpp/SKILL.md +753 -0
  417. package/templates/skills/languages/csharp/SKILL.md +427 -0
  418. package/templates/skills/languages/dart/SKILL.md +342 -0
  419. package/templates/skills/languages/elixir/SKILL.md +464 -0
  420. package/templates/skills/languages/erlang/SKILL.md +371 -0
  421. package/templates/skills/languages/go/SKILL.md +655 -0
  422. package/templates/skills/languages/haskell/SKILL.md +187 -0
  423. package/templates/skills/languages/java/SKILL.md +617 -0
  424. package/templates/skills/languages/javascript/SKILL.md +641 -0
  425. package/templates/skills/languages/julia/SKILL.md +107 -0
  426. package/templates/skills/languages/kotlin/SKILL.md +521 -0
  427. package/templates/skills/languages/lisp/SKILL.md +110 -0
  428. package/templates/skills/languages/lua/SKILL.md +84 -0
  429. package/templates/skills/languages/objectivec/SKILL.md +100 -0
  430. package/templates/skills/languages/php/SKILL.md +426 -0
  431. package/templates/skills/languages/python/SKILL.md +692 -0
  432. package/templates/skills/languages/r/SKILL.md +360 -0
  433. package/templates/skills/languages/ruby/SKILL.md +431 -0
  434. package/templates/skills/languages/rust/SKILL.md +487 -0
  435. package/templates/skills/languages/sas/SKILL.md +83 -0
  436. package/templates/skills/languages/scala/SKILL.md +358 -0
  437. package/templates/skills/languages/solidity/SKILL.md +590 -0
  438. package/templates/skills/languages/sql/SKILL.md +147 -0
  439. package/templates/skills/languages/swift/SKILL.md +476 -0
  440. package/templates/skills/languages/typescript/SKILL.md +0 -0
  441. package/templates/skills/languages/zig/SKILL.md +275 -0
  442. package/templates/skills/modules/atlassian/SKILL.md +265 -0
  443. package/templates/skills/modules/context7/SKILL.md +64 -0
  444. package/templates/skills/modules/figma/SKILL.md +277 -0
  445. package/templates/skills/modules/github-mcp/SKILL.md +74 -0
  446. package/templates/skills/modules/grafana/SKILL.md +338 -0
  447. package/templates/skills/modules/memory/SKILL.md +73 -0
  448. package/templates/skills/modules/notion/SKILL.md +257 -0
  449. package/templates/skills/modules/playwright/SKILL.md +100 -0
  450. package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -0
  451. package/templates/skills/modules/serena/SKILL.md +347 -0
  452. package/templates/skills/modules/supabase/SKILL.md +233 -0
  453. package/templates/skills/modules/synap/SKILL.md +79 -0
  454. package/templates/skills/modules/vectorizer/SKILL.md +73 -0
  455. package/templates/skills/services/azure-blob/SKILL.md +194 -0
  456. package/templates/skills/services/cassandra/SKILL.md +249 -0
  457. package/templates/skills/services/dynamodb/SKILL.md +318 -0
  458. package/templates/skills/services/elasticsearch/SKILL.md +357 -0
  459. package/templates/skills/services/gcs/SKILL.md +188 -0
  460. package/templates/skills/services/influxdb/SKILL.md +275 -0
  461. package/templates/skills/services/kafka/SKILL.md +351 -0
  462. package/templates/skills/services/mariadb/SKILL.md +193 -0
  463. package/templates/skills/services/memcached/SKILL.md +252 -0
  464. package/templates/skills/services/minio/SKILL.md +211 -0
  465. package/templates/skills/services/mongodb/SKILL.md +278 -0
  466. package/templates/skills/services/mysql/SKILL.md +368 -0
  467. package/templates/skills/services/neo4j/SKILL.md +257 -0
  468. package/templates/skills/services/oracle/SKILL.md +300 -0
  469. package/templates/skills/services/postgresql/SKILL.md +336 -0
  470. package/templates/skills/services/rabbitmq/SKILL.md +296 -0
  471. package/templates/skills/services/redis/SKILL.md +302 -0
  472. package/templates/skills/services/s3/SKILL.md +308 -0
  473. package/templates/skills/services/sqlite/SKILL.md +304 -0
  474. package/templates/skills/services/sqlserver/SKILL.md +304 -0
  475. package/templates/skills/workflows/ralph/SETUP.md +228 -0
  476. package/templates/skills/workflows/ralph/SKILL.md +309 -0
  477. package/templates/skills/workflows/ralph/install.sh +87 -0
  478. package/templates/skills/workflows/ralph/manifest.json +158 -0
  479. package/templates/workflows/codespell.yml +0 -0
  480. package/templates/workflows/cpp-lint.yml +0 -0
  481. package/templates/workflows/cpp-publish.yml +0 -0
  482. package/templates/workflows/cpp-test.yml +0 -0
  483. package/templates/workflows/dotnet-lint.yml +0 -0
  484. package/templates/workflows/dotnet-publish.yml +0 -0
  485. package/templates/workflows/dotnet-test.yml +0 -0
  486. package/templates/workflows/elixir-lint.yml +0 -0
  487. package/templates/workflows/elixir-publish.yml +0 -0
  488. package/templates/workflows/elixir-test.yml +0 -0
  489. package/templates/workflows/erlang-lint.yml +0 -0
  490. package/templates/workflows/erlang-test.yml +0 -0
  491. package/templates/workflows/go-lint.yml +0 -0
  492. package/templates/workflows/go-publish.yml +0 -0
  493. package/templates/workflows/go-test.yml +0 -0
  494. package/templates/workflows/java-lint.yml +0 -0
  495. package/templates/workflows/java-publish.yml +0 -0
  496. package/templates/workflows/java-test.yml +0 -0
  497. package/templates/workflows/kotlin-lint.yml +0 -0
  498. package/templates/workflows/kotlin-publish.yml +0 -0
  499. package/templates/workflows/kotlin-test.yml +0 -0
  500. package/templates/workflows/php-lint.yml +0 -0
  501. package/templates/workflows/php-publish.yml +0 -0
  502. package/templates/workflows/php-test.yml +0 -0
  503. package/templates/workflows/python-lint.yml +0 -0
  504. package/templates/workflows/python-publish.yml +0 -0
  505. package/templates/workflows/python-test.yml +0 -0
  506. package/templates/workflows/rust-lint.yml +0 -0
  507. package/templates/workflows/rust-publish.yml +0 -0
  508. package/templates/workflows/rust-test.yml +0 -0
  509. package/templates/workflows/solidity-lint.yml +0 -0
  510. package/templates/workflows/solidity-test.yml +0 -0
  511. package/templates/workflows/swift-lint.yml +0 -0
  512. package/templates/workflows/swift-publish.yml +0 -0
  513. package/templates/workflows/swift-test.yml +0 -0
  514. package/templates/workflows/typescript-lint.yml +0 -0
  515. package/templates/workflows/typescript-publish.yml +0 -0
  516. package/templates/workflows/typescript-test.yml +0 -0
  517. package/templates/workflows/zig-lint.yml +0 -0
  518. package/templates/workflows/zig-test.yml +0 -0
  519. package/dist/core/modern-console-new.d.ts +0 -81
  520. package/dist/core/modern-console-new.d.ts.map +0 -1
  521. package/dist/core/modern-console-new.js +0 -340
  522. package/dist/core/modern-console-new.js.map +0 -1
  523. package/dist/mcp/handlers/archive-task.d.ts +0 -17
  524. package/dist/mcp/handlers/archive-task.d.ts.map +0 -1
  525. package/dist/mcp/handlers/archive-task.js +0 -36
  526. package/dist/mcp/handlers/archive-task.js.map +0 -1
  527. package/dist/mcp/handlers/create-task.d.ts +0 -17
  528. package/dist/mcp/handlers/create-task.d.ts.map +0 -1
  529. package/dist/mcp/handlers/create-task.js +0 -56
  530. package/dist/mcp/handlers/create-task.js.map +0 -1
  531. package/dist/mcp/handlers/list-tasks.d.ts +0 -22
  532. package/dist/mcp/handlers/list-tasks.d.ts.map +0 -1
  533. package/dist/mcp/handlers/list-tasks.js +0 -42
  534. package/dist/mcp/handlers/list-tasks.js.map +0 -1
  535. package/dist/mcp/handlers/show-task.d.ts +0 -25
  536. package/dist/mcp/handlers/show-task.d.ts.map +0 -1
  537. package/dist/mcp/handlers/show-task.js +0 -43
  538. package/dist/mcp/handlers/show-task.js.map +0 -1
  539. package/dist/mcp/handlers/update-task.d.ts +0 -17
  540. package/dist/mcp/handlers/update-task.d.ts.map +0 -1
  541. package/dist/mcp/handlers/update-task.js +0 -35
  542. package/dist/mcp/handlers/update-task.js.map +0 -1
  543. package/dist/mcp/handlers/validate-task.d.ts +0 -15
  544. package/dist/mcp/handlers/validate-task.d.ts.map +0 -1
  545. package/dist/mcp/handlers/validate-task.js +0 -27
  546. package/dist/mcp/handlers/validate-task.js.map +0 -1
  547. package/dist/mcp/rulebook-config.d.ts +0 -22
  548. package/dist/mcp/rulebook-config.d.ts.map +0 -1
  549. package/dist/mcp/rulebook-config.js +0 -65
  550. package/dist/mcp/rulebook-config.js.map +0 -1
@@ -5,7 +5,7 @@ import { promptProjectConfig, promptSimplifiedConfig, promptMergeStrategy } from
5
5
  import { generateFullAgents } from '../core/generator.js';
6
6
  import { mergeFullAgents } from '../core/merger.js';
7
7
  import { generateWorkflows, generateIDEFiles, generateAICLIFiles, } from '../core/workflow-generator.js';
8
- import { writeFile, createBackup, readFile, fileExists } from '../utils/file-system.js';
8
+ import { writeFile, createBackup } from '../utils/file-system.js';
9
9
  import { existsSync } from 'fs';
10
10
  import { parseRulesIgnore } from '../utils/rulesignore.js';
11
11
  import { installGitHooks } from '../utils/git-hooks.js';
@@ -179,6 +179,10 @@ export async function initCommand(options) {
179
179
  // Save project configuration to .rulebook
180
180
  const { createConfigManager } = await import('../core/config-manager.js');
181
181
  const configManager = createConfigManager(cwd);
182
+ // Migrate old directory structure to new consolidated structure
183
+ const dirMigrationSpinner = ora('Migrating directory structure...').start();
184
+ await configManager.migrateDirectoryStructure(cwd);
185
+ dirMigrationSpinner.succeed('Directory structure migrated');
182
186
  // Auto-detect and enable skills based on project detection (v2.0)
183
187
  let enabledSkills = [];
184
188
  try {
@@ -202,6 +206,8 @@ export async function initCommand(options) {
202
206
  catch {
203
207
  // Skills system not available or error - continue without skills
204
208
  }
209
+ // Load existing config to preserve ralph and memory settings
210
+ const existingConfig = await configManager.loadConfig();
205
211
  await configManager.updateConfig({
206
212
  languages: config.languages,
207
213
  frameworks: config.frameworks,
@@ -210,11 +216,24 @@ export async function initCommand(options) {
210
216
  modular: config.modular ?? true,
211
217
  rulebookDir: config.rulebookDir || 'rulebook',
212
218
  skills: enabledSkills.length > 0 ? { enabled: enabledSkills } : undefined,
219
+ ralph: existingConfig.ralph,
220
+ memory: existingConfig.memory,
213
221
  });
214
222
  // Generate or merge AGENTS.md
215
223
  const agentsPath = path.join(cwd, 'AGENTS.md');
216
224
  let finalContent;
217
225
  if (detection.existingAgents) {
226
+ // Migrate flat layout to specs/ subdirectory if needed
227
+ {
228
+ const { hasFlatLayout, migrateFlatToSpecs } = await import('../core/migrator.js');
229
+ const rulebookDirForMigration = config.rulebookDir || 'rulebook';
230
+ if (await hasFlatLayout(cwd, rulebookDirForMigration)) {
231
+ const { migratedFiles } = await migrateFlatToSpecs(cwd, rulebookDirForMigration);
232
+ if (migratedFiles.length > 0) {
233
+ console.log(chalk.gray(` Migrated ${migratedFiles.length} file(s) to /${rulebookDirForMigration}/specs/`));
234
+ }
235
+ }
236
+ }
218
237
  const strategy = options.yes ? 'merge' : await promptMergeStrategy();
219
238
  if (strategy === 'merge') {
220
239
  const mergeSpinner = ora('Merging with existing AGENTS.md...').start();
@@ -292,6 +311,29 @@ export async function initCommand(options) {
292
311
  cliSpinner.info('AI CLI files already exist (skipped)');
293
312
  }
294
313
  }
314
+ // Auto-setup Claude Code integration (MCP + skills)
315
+ if (!minimalMode) {
316
+ const claudeSpinner = ora('Checking Claude Code integration...').start();
317
+ try {
318
+ const { setupClaudeCodeIntegration } = await import('../core/claude-mcp.js');
319
+ const result = await setupClaudeCodeIntegration(cwd);
320
+ if (result.detected) {
321
+ claudeSpinner.succeed('Claude Code integration configured');
322
+ if (result.mcpConfigured) {
323
+ console.log(chalk.gray(' • MCP server added to .mcp.json'));
324
+ }
325
+ if (result.skillsInstalled.length > 0) {
326
+ console.log(chalk.gray(` • ${result.skillsInstalled.length} skills installed to .claude/commands/`));
327
+ }
328
+ }
329
+ else {
330
+ claudeSpinner.info('Claude Code not detected (skipped)');
331
+ }
332
+ }
333
+ catch {
334
+ claudeSpinner.info('Claude Code integration skipped');
335
+ }
336
+ }
295
337
  if (minimalMode && minimalArtifacts.length > 0) {
296
338
  console.log(chalk.green('\n✅ Essentials created:'));
297
339
  for (const artifact of minimalArtifacts) {
@@ -1121,22 +1163,18 @@ export async function updateCommand(options) {
1121
1163
  console.log(chalk.gray('\nℹ Git hooks were not installed during update. Re-run "rulebook update" later or install them manually if you change your mind.'));
1122
1164
  }
1123
1165
  const agentsPath = path.join(cwd, 'AGENTS.md');
1124
- const rulebookPath = path.join(cwd, '.rulebook');
1166
+ // Load existing config using ConfigManager
1167
+ const { createConfigManager } = await import('../core/config-manager.js');
1168
+ const configManager = createConfigManager(cwd);
1169
+ const existingConfig = await configManager.loadConfig();
1125
1170
  let existingMode;
1126
1171
  let existingLightMode;
1127
- if (await fileExists(rulebookPath)) {
1128
- try {
1129
- const currentConfig = JSON.parse(await readFile(rulebookPath));
1130
- if (currentConfig && (currentConfig.mode === 'minimal' || currentConfig.mode === 'full')) {
1131
- existingMode = currentConfig.mode;
1132
- }
1133
- if (currentConfig && currentConfig.lightMode !== undefined) {
1134
- existingLightMode = currentConfig.lightMode;
1135
- }
1172
+ if (existingConfig) {
1173
+ if (existingConfig && (existingConfig.mode === 'minimal' || existingConfig.mode === 'full')) {
1174
+ existingMode = existingConfig.mode;
1136
1175
  }
1137
- catch {
1138
- existingMode = undefined;
1139
- existingLightMode = undefined;
1176
+ if (existingConfig && existingConfig.lightMode !== undefined) {
1177
+ existingLightMode = existingConfig.lightMode;
1140
1178
  }
1141
1179
  }
1142
1180
  const minimalMode = options.minimal ?? existingMode === 'minimal';
@@ -1200,10 +1238,10 @@ export async function updateCommand(options) {
1200
1238
  console.log(chalk.yellow(` - ${error}`));
1201
1239
  }
1202
1240
  }
1203
- // Remove /rulebook/OPENSPEC.md if exists
1241
+ // Remove /rulebook/specs/OPENSPEC.md if exists
1204
1242
  const removed = await removeOpenSpecRulebookFile(cwd, rulebookDir);
1205
1243
  if (removed) {
1206
- console.log(chalk.gray(' Removed /rulebook/OPENSPEC.md'));
1244
+ console.log(chalk.gray(' Removed /rulebook/specs/OPENSPEC.md'));
1207
1245
  }
1208
1246
  // Remove OpenSpec commands from .cursor/commands/
1209
1247
  const { removeOpenSpecCommands } = await import('../core/openspec-migrator.js');
@@ -1307,12 +1345,11 @@ export async function updateCommand(options) {
1307
1345
  }
1308
1346
  }
1309
1347
  }
1310
- // Save project configuration to .rulebook
1311
- const { createConfigManager } = await import('../core/config-manager.js');
1312
- const configManager = createConfigManager(cwd);
1313
- // Load existing config to preserve skills
1314
- const existingConfig = await configManager.loadConfig();
1348
+ // Migration already done via configManager.loadConfig() -> migrateConfig() -> migrateDirectoryStructure()
1349
+ // No need to call it again here
1350
+ // Load existing config to preserve skills and ralph settings (already loaded above)
1315
1351
  const existingSkills = existingConfig.skills?.enabled || [];
1352
+ const existingRalph = existingConfig.ralph;
1316
1353
  // Auto-detect skills based on project detection (v2.0)
1317
1354
  let detectedSkills = [];
1318
1355
  try {
@@ -1351,7 +1388,24 @@ export async function updateCommand(options) {
1351
1388
  modular: config.modular ?? true,
1352
1389
  rulebookDir: config.rulebookDir || 'rulebook',
1353
1390
  skills: detectedSkills.length > 0 ? { enabled: detectedSkills } : undefined,
1391
+ ralph: existingRalph,
1392
+ memory: existingConfig.memory,
1354
1393
  });
1394
+ // Migrate flat layout to specs/ subdirectory if needed
1395
+ {
1396
+ const { hasFlatLayout, migrateFlatToSpecs } = await import('../core/migrator.js');
1397
+ const rulebookDirForMigration = config.rulebookDir || 'rulebook';
1398
+ if (await hasFlatLayout(cwd, rulebookDirForMigration)) {
1399
+ const migrationSpinner = ora('Migrating rulebook files to specs/ subdirectory...').start();
1400
+ const { migratedFiles } = await migrateFlatToSpecs(cwd, rulebookDirForMigration);
1401
+ if (migratedFiles.length > 0) {
1402
+ migrationSpinner.succeed(`Migrated ${migratedFiles.length} file(s) to /${rulebookDirForMigration}/specs/`);
1403
+ }
1404
+ else {
1405
+ migrationSpinner.info('No files to migrate');
1406
+ }
1407
+ }
1408
+ }
1355
1409
  // Merge with existing AGENTS.md (with migration support)
1356
1410
  const mergeSpinner = ora('Updating AGENTS.md with latest templates...').start();
1357
1411
  config.modular = config.modular ?? true; // Enable modular by default
@@ -1406,19 +1460,68 @@ export async function updateCommand(options) {
1406
1460
  projectId: path.basename(cwd),
1407
1461
  mode: minimalMode ? 'minimal' : 'full',
1408
1462
  features: rulebookFeatures,
1409
- coverageThreshold: 95,
1410
- language: 'en',
1411
- outputLanguage: 'en',
1412
- cliTools: [],
1413
- maxParallelTasks: 5,
1414
- timeouts: {
1463
+ coverageThreshold: existingConfig.coverageThreshold ?? 95,
1464
+ language: existingConfig.language ?? 'en',
1465
+ outputLanguage: existingConfig.outputLanguage ?? 'en',
1466
+ cliTools: existingConfig.cliTools ?? [],
1467
+ maxParallelTasks: existingConfig.maxParallelTasks ?? 5,
1468
+ timeouts: existingConfig.timeouts ?? {
1415
1469
  taskExecution: 3600000,
1416
1470
  cliResponse: 180000,
1417
1471
  testRun: 600000,
1418
1472
  },
1473
+ ...(existingConfig.memory ? { memory: existingConfig.memory } : {}),
1474
+ ...(existingConfig.ralph ? { ralph: existingConfig.ralph } : {}),
1475
+ ...(existingConfig.skills ? { skills: existingConfig.skills } : {}),
1419
1476
  };
1420
- await writeFile(rulebookPath, JSON.stringify(rulebookConfig, null, 2));
1477
+ await configManager.saveConfig(rulebookConfig);
1421
1478
  configSpinner.succeed('.rulebook configuration updated');
1479
+ // Auto-setup Claude Code integration (MCP + skills)
1480
+ const claudeSpinner = ora('Checking Claude Code integration...').start();
1481
+ try {
1482
+ const { setupClaudeCodeIntegration } = await import('../core/claude-mcp.js');
1483
+ const result = await setupClaudeCodeIntegration(cwd);
1484
+ if (result.detected) {
1485
+ claudeSpinner.succeed('Claude Code integration updated');
1486
+ if (result.mcpConfigured) {
1487
+ console.log(chalk.gray(' • MCP server added to .mcp.json'));
1488
+ }
1489
+ if (result.skillsInstalled.length > 0) {
1490
+ console.log(chalk.gray(` • ${result.skillsInstalled.length} skills updated in .claude/commands/`));
1491
+ }
1492
+ }
1493
+ else {
1494
+ claudeSpinner.info('Claude Code not detected (skipped)');
1495
+ }
1496
+ }
1497
+ catch {
1498
+ claudeSpinner.info('Claude Code integration skipped');
1499
+ }
1500
+ // Migrate memory directory if old structure exists
1501
+ try {
1502
+ await migrateMemoryDirectory();
1503
+ }
1504
+ catch {
1505
+ // Silently skip if migration fails
1506
+ }
1507
+ // Install plugin in Claude Code
1508
+ try {
1509
+ await setupClaudeCodePlugin();
1510
+ }
1511
+ catch {
1512
+ // Silently skip if plugin installation fails
1513
+ }
1514
+ // Clean up any accidental duplicate directories
1515
+ try {
1516
+ const fsPromises = await import('fs/promises');
1517
+ const accidentalDir = path.join(cwd, '.rulebook', '.rulebook');
1518
+ if (existsSync(accidentalDir)) {
1519
+ await fsPromises.rm(accidentalDir, { recursive: true, force: true });
1520
+ }
1521
+ }
1522
+ catch {
1523
+ // Ignore cleanup errors
1524
+ }
1422
1525
  // Success message
1423
1526
  console.log(chalk.bold.green('\n✅ Update complete!\n'));
1424
1527
  console.log(chalk.white('Updated components:'));
@@ -1728,4 +1831,542 @@ export async function skillSearchCommand(query) {
1728
1831
  process.exit(1);
1729
1832
  }
1730
1833
  }
1834
+ // ============================================
1835
+ // Memory Commands (v2.2)
1836
+ // ============================================
1837
+ export async function memorySearchCommand(query, options) {
1838
+ const ora = (await import('ora')).default;
1839
+ const chalk = (await import('chalk')).default;
1840
+ const spinner = ora('Searching memories...').start();
1841
+ try {
1842
+ const { createConfigManager } = await import('../core/config-manager.js');
1843
+ const cwd = process.cwd();
1844
+ const configManager = createConfigManager(cwd);
1845
+ const config = await configManager.loadConfig();
1846
+ if (!config.memory?.enabled) {
1847
+ spinner.fail('Memory system is not enabled. Run: rulebook config --set memory.enabled=true');
1848
+ return;
1849
+ }
1850
+ const { createMemoryManager } = await import('../memory/memory-manager.js');
1851
+ const manager = createMemoryManager(cwd, config.memory);
1852
+ const results = await manager.searchMemories({
1853
+ query,
1854
+ mode: options.mode || 'hybrid',
1855
+ type: options.type,
1856
+ limit: options.limit ? parseInt(options.limit) : 20,
1857
+ });
1858
+ spinner.succeed(`Found ${results.length} memories`);
1859
+ if (results.length === 0) {
1860
+ console.log(chalk.yellow('\nNo memories found for that query.'));
1861
+ }
1862
+ else {
1863
+ console.log('');
1864
+ for (const r of results) {
1865
+ const typeColor = r.type === 'bugfix' ? chalk.red : r.type === 'feature' ? chalk.green : chalk.blue;
1866
+ console.log(` ${typeColor(r.type.padEnd(12))} ${chalk.white(r.title)} ${chalk.gray(`[${r.matchType}] ${r.score.toFixed(3)}`)}`);
1867
+ }
1868
+ }
1869
+ await manager.close();
1870
+ }
1871
+ catch (error) {
1872
+ spinner.fail('Search failed');
1873
+ console.error(chalk.red(String(error)));
1874
+ process.exit(1);
1875
+ }
1876
+ }
1877
+ export async function memorySaveCommand(text, options) {
1878
+ const ora = (await import('ora')).default;
1879
+ const chalk = (await import('chalk')).default;
1880
+ const spinner = ora('Saving memory...').start();
1881
+ try {
1882
+ const { createConfigManager } = await import('../core/config-manager.js');
1883
+ const cwd = process.cwd();
1884
+ const configManager = createConfigManager(cwd);
1885
+ const config = await configManager.loadConfig();
1886
+ if (!config.memory?.enabled) {
1887
+ spinner.fail('Memory system is not enabled. Run: rulebook config --set memory.enabled=true');
1888
+ return;
1889
+ }
1890
+ const { createMemoryManager } = await import('../memory/memory-manager.js');
1891
+ const { classifyMemory } = await import('../memory/memory-hooks.js');
1892
+ const manager = createMemoryManager(cwd, config.memory);
1893
+ const type = (options.type || classifyMemory(text));
1894
+ const title = options.title || text.slice(0, 80);
1895
+ const tags = options.tags ? options.tags.split(',').map((t) => t.trim()) : [];
1896
+ const memory = await manager.saveMemory({ type, title, content: text, tags });
1897
+ spinner.succeed(`Memory saved: ${chalk.cyan(memory.id)}`);
1898
+ console.log(chalk.gray(` Type: ${memory.type} | Title: ${memory.title}`));
1899
+ await manager.close();
1900
+ }
1901
+ catch (error) {
1902
+ spinner.fail('Save failed');
1903
+ console.error(chalk.red(String(error)));
1904
+ process.exit(1);
1905
+ }
1906
+ }
1907
+ export async function memoryListCommand(options) {
1908
+ const ora = (await import('ora')).default;
1909
+ const chalk = (await import('chalk')).default;
1910
+ const spinner = ora('Loading memories...').start();
1911
+ try {
1912
+ const { createConfigManager } = await import('../core/config-manager.js');
1913
+ const cwd = process.cwd();
1914
+ const configManager = createConfigManager(cwd);
1915
+ const config = await configManager.loadConfig();
1916
+ if (!config.memory?.enabled) {
1917
+ spinner.fail('Memory system is not enabled.');
1918
+ return;
1919
+ }
1920
+ const { createMemoryManager } = await import('../memory/memory-manager.js');
1921
+ const manager = createMemoryManager(cwd, config.memory);
1922
+ const stats = await manager.getStats();
1923
+ const exported = await manager.exportMemories('json');
1924
+ const memories = JSON.parse(exported).slice(0, options.limit ? parseInt(options.limit) : 20);
1925
+ spinner.succeed(`${stats.memoryCount} memories total`);
1926
+ if (memories.length === 0) {
1927
+ console.log(chalk.yellow('\nNo memories stored yet.'));
1928
+ }
1929
+ else {
1930
+ console.log('');
1931
+ for (const m of memories) {
1932
+ const date = new Date(m.createdAt).toLocaleDateString();
1933
+ const typeColor = m.type === 'bugfix' ? chalk.red : m.type === 'feature' ? chalk.green : chalk.blue;
1934
+ console.log(` ${chalk.gray(date)} ${typeColor(m.type.padEnd(12))} ${chalk.white(m.title)}`);
1935
+ }
1936
+ }
1937
+ await manager.close();
1938
+ }
1939
+ catch (error) {
1940
+ spinner.fail('Failed to list memories');
1941
+ console.error(chalk.red(String(error)));
1942
+ process.exit(1);
1943
+ }
1944
+ }
1945
+ export async function memoryStatsCommand() {
1946
+ const ora = (await import('ora')).default;
1947
+ const chalk = (await import('chalk')).default;
1948
+ const spinner = ora('Loading stats...').start();
1949
+ try {
1950
+ const { createConfigManager } = await import('../core/config-manager.js');
1951
+ const cwd = process.cwd();
1952
+ const configManager = createConfigManager(cwd);
1953
+ const config = await configManager.loadConfig();
1954
+ if (!config.memory?.enabled) {
1955
+ spinner.fail('Memory system is not enabled.');
1956
+ return;
1957
+ }
1958
+ const { createMemoryManager } = await import('../memory/memory-manager.js');
1959
+ const manager = createMemoryManager(cwd, config.memory);
1960
+ const stats = await manager.getStats();
1961
+ spinner.succeed('Memory statistics');
1962
+ const sizeMB = (stats.dbSizeBytes / 1024 / 1024).toFixed(2);
1963
+ const maxMB = (stats.maxSizeBytes / 1024 / 1024).toFixed(0);
1964
+ const usage = stats.usagePercent.toFixed(1);
1965
+ const bar = '█'.repeat(Math.floor(stats.usagePercent / 5)) + '░'.repeat(20 - Math.floor(stats.usagePercent / 5));
1966
+ console.log(`\n Memories: ${chalk.cyan(stats.memoryCount)}`);
1967
+ console.log(` Sessions: ${chalk.cyan(stats.sessionCount)}`);
1968
+ console.log(` DB Size: ${chalk.cyan(sizeMB + ' MB')} / ${maxMB} MB`);
1969
+ console.log(` Usage: [${stats.usagePercent > 80 ? chalk.red(bar) : chalk.green(bar)}] ${usage}%`);
1970
+ console.log(` Health: ${stats.indexHealth === 'good' ? chalk.green(stats.indexHealth) : chalk.yellow(stats.indexHealth)}`);
1971
+ await manager.close();
1972
+ }
1973
+ catch (error) {
1974
+ spinner.fail('Failed to load stats');
1975
+ console.error(chalk.red(String(error)));
1976
+ process.exit(1);
1977
+ }
1978
+ }
1979
+ export async function memoryCleanupCommand(options) {
1980
+ const ora = (await import('ora')).default;
1981
+ const chalk = (await import('chalk')).default;
1982
+ const spinner = ora('Running cleanup...').start();
1983
+ try {
1984
+ const { createConfigManager } = await import('../core/config-manager.js');
1985
+ const cwd = process.cwd();
1986
+ const configManager = createConfigManager(cwd);
1987
+ const config = await configManager.loadConfig();
1988
+ if (!config.memory?.enabled) {
1989
+ spinner.fail('Memory system is not enabled.');
1990
+ return;
1991
+ }
1992
+ const { createMemoryManager } = await import('../memory/memory-manager.js');
1993
+ const manager = createMemoryManager(cwd, config.memory);
1994
+ const result = await manager.cleanup(options.force || false);
1995
+ if (result.evictedCount > 0) {
1996
+ const freedMB = (result.freedBytes / 1024 / 1024).toFixed(2);
1997
+ spinner.succeed(`Cleaned up ${result.evictedCount} memories (freed ${freedMB} MB)`);
1998
+ }
1999
+ else {
2000
+ spinner.succeed('No cleanup needed');
2001
+ }
2002
+ await manager.close();
2003
+ }
2004
+ catch (error) {
2005
+ spinner.fail('Cleanup failed');
2006
+ console.error(chalk.red(String(error)));
2007
+ process.exit(1);
2008
+ }
2009
+ }
2010
+ export async function memoryExportCommand(options) {
2011
+ const ora = (await import('ora')).default;
2012
+ const chalk = (await import('chalk')).default;
2013
+ const spinner = ora('Exporting memories...').start();
2014
+ try {
2015
+ const { createConfigManager } = await import('../core/config-manager.js');
2016
+ const cwd = process.cwd();
2017
+ const configManager = createConfigManager(cwd);
2018
+ const config = await configManager.loadConfig();
2019
+ if (!config.memory?.enabled) {
2020
+ spinner.fail('Memory system is not enabled.');
2021
+ return;
2022
+ }
2023
+ const { createMemoryManager } = await import('../memory/memory-manager.js');
2024
+ const manager = createMemoryManager(cwd, config.memory);
2025
+ const format = (options.format || 'json');
2026
+ const exported = await manager.exportMemories(format);
2027
+ const count = format === 'json' ? JSON.parse(exported).length : exported.split('\n').length - 1;
2028
+ if (options.output) {
2029
+ const { writeFile } = await import('fs/promises');
2030
+ await writeFile(options.output, exported);
2031
+ spinner.succeed(`Exported ${count} memories to ${chalk.cyan(options.output)}`);
2032
+ }
2033
+ else {
2034
+ spinner.succeed(`Exported ${count} memories`);
2035
+ console.log(exported);
2036
+ }
2037
+ await manager.close();
2038
+ }
2039
+ catch (error) {
2040
+ spinner.fail('Export failed');
2041
+ console.error(chalk.red(String(error)));
2042
+ process.exit(1);
2043
+ }
2044
+ }
2045
+ // Ralph Autonomous Loop Commands (v3.0)
2046
+ export async function ralphInitCommand() {
2047
+ const oraModule = await import('ora');
2048
+ const ora = oraModule.default;
2049
+ const spinner = ora('Initializing Ralph autonomous loop...').start();
2050
+ try {
2051
+ const cwd = process.cwd();
2052
+ const { Logger } = await import('../core/logger.js');
2053
+ const { RalphManager } = await import('../core/ralph-manager.js');
2054
+ const { PRDGenerator } = await import('../core/prd-generator.js');
2055
+ const { createConfigManager } = await import('../core/config-manager.js');
2056
+ const logger = new Logger(cwd);
2057
+ const configManager = createConfigManager(cwd);
2058
+ const config = await configManager.loadConfig();
2059
+ // Create managers
2060
+ const ralphManager = new RalphManager(cwd, logger);
2061
+ const prdGenerator = new PRDGenerator(cwd, logger);
2062
+ // Initialize Ralph
2063
+ const maxIterations = config.ralph?.maxIterations || 10;
2064
+ const tool = (config.ralph?.tool || 'claude');
2065
+ await ralphManager.initialize(maxIterations, tool);
2066
+ // Generate PRD from rulebook tasks
2067
+ const prd = await prdGenerator.generatePRD(path.basename(cwd));
2068
+ // Save PRD
2069
+ const prdPath = path.join(cwd, '.rulebook', 'ralph', 'prd.json');
2070
+ await writeFile(prdPath, JSON.stringify(prd, null, 2));
2071
+ spinner.succeed(`Ralph initialized: ${prd.userStories.length} user stories loaded`);
2072
+ console.log(`\n 📋 PRD: ${prdPath}`);
2073
+ console.log(` 🔄 Max iterations: ${maxIterations}`);
2074
+ console.log(` 🤖 AI Tool: ${tool}`);
2075
+ console.log(`\n Run: ${chalk.bold('rulebook ralph run')}\n`);
2076
+ }
2077
+ catch (error) {
2078
+ spinner.fail('Ralph initialization failed');
2079
+ console.error(chalk.red(String(error)));
2080
+ process.exit(1);
2081
+ }
2082
+ }
2083
+ export async function ralphRunCommand(options) {
2084
+ const oraModule = await import('ora');
2085
+ const ora = oraModule.default;
2086
+ const spinner = ora('Starting Ralph autonomous loop...').start();
2087
+ try {
2088
+ const cwd = process.cwd();
2089
+ const { Logger } = await import('../core/logger.js');
2090
+ const { RalphManager } = await import('../core/ralph-manager.js');
2091
+ const { createConfigManager } = await import('../core/config-manager.js');
2092
+ const logger = new Logger(cwd);
2093
+ const configManager = createConfigManager(cwd);
2094
+ const config = await configManager.loadConfig();
2095
+ const ralphManager = new RalphManager(cwd, logger);
2096
+ const maxIterations = options.maxIterations || config.ralph?.maxIterations || 10;
2097
+ const tool = options.tool || config.ralph?.tool || 'claude';
2098
+ await ralphManager.initialize(maxIterations, tool);
2099
+ spinner.text = 'Ralph loop running (Ctrl+C to pause)...';
2100
+ let iterationCount = 0;
2101
+ while (ralphManager.canContinue()) {
2102
+ iterationCount++;
2103
+ const task = await ralphManager.getNextTask();
2104
+ if (!task) {
2105
+ break;
2106
+ }
2107
+ spinner.text = `Iteration ${iterationCount}: ${task.title}...`;
2108
+ // In production, would execute agent here
2109
+ // For now, just mark story as complete
2110
+ await ralphManager.markStoryComplete(task.id);
2111
+ // Simulate iteration result (placeholder)
2112
+ const result = {
2113
+ iteration: iterationCount,
2114
+ timestamp: new Date().toISOString(),
2115
+ task_id: task.id,
2116
+ task_title: task.title,
2117
+ status: 'success',
2118
+ ai_tool: tool,
2119
+ execution_time_ms: 5000,
2120
+ quality_checks: { type_check: true, lint: true, tests: true, coverage_met: true },
2121
+ output_summary: `Completed ${task.title}`,
2122
+ git_commit: undefined,
2123
+ learnings: [],
2124
+ errors: [],
2125
+ metadata: { context_loss_count: 0, parsed_completion: true },
2126
+ };
2127
+ await ralphManager.recordIteration(result);
2128
+ }
2129
+ const stats = await ralphManager.getTaskStats();
2130
+ spinner.succeed(`Ralph loop complete: ${stats.completed}/${stats.total} tasks completed`);
2131
+ console.log(`\n ✅ Iterations: ${iterationCount}`);
2132
+ console.log(` 📊 Completed: ${stats.completed}/${stats.total}`);
2133
+ console.log(`\n View history: ${chalk.bold('rulebook ralph history')}\n`);
2134
+ }
2135
+ catch (error) {
2136
+ spinner.fail('Ralph loop failed');
2137
+ console.error(chalk.red(String(error)));
2138
+ process.exit(1);
2139
+ }
2140
+ }
2141
+ export async function ralphStatusCommand() {
2142
+ const oraModule = await import('ora');
2143
+ const ora = oraModule.default;
2144
+ const spinner = ora('Loading Ralph status...').start();
2145
+ try {
2146
+ const cwd = process.cwd();
2147
+ const { Logger } = await import('../core/logger.js');
2148
+ const { RalphManager } = await import('../core/ralph-manager.js');
2149
+ const logger = new Logger(cwd);
2150
+ const ralphManager = new RalphManager(cwd, logger);
2151
+ const status = await ralphManager.getStatus();
2152
+ if (!status) {
2153
+ spinner.fail('Ralph not initialized');
2154
+ console.log(`\n Run: ${chalk.bold('rulebook ralph init')}\n`);
2155
+ return;
2156
+ }
2157
+ spinner.stop();
2158
+ console.log(`\n ${chalk.bold('Ralph Loop Status')}`);
2159
+ console.log(` Iteration: ${status.current_iteration}/${status.max_iterations}`);
2160
+ console.log(` Tasks: ${status.completed_tasks}/${status.total_tasks}`);
2161
+ console.log(` Status: ${status.paused ? chalk.yellow('PAUSED') : chalk.green('RUNNING')}`);
2162
+ console.log(` AI Tool: ${status.tool}`);
2163
+ console.log(` Started: ${new Date(status.started_at).toLocaleString()}`);
2164
+ console.log();
2165
+ }
2166
+ catch (error) {
2167
+ spinner.fail('Failed to load status');
2168
+ console.error(chalk.red(String(error)));
2169
+ process.exit(1);
2170
+ }
2171
+ }
2172
+ export async function ralphHistoryCommand(options) {
2173
+ const oraModule = await import('ora');
2174
+ const ora = oraModule.default;
2175
+ const spinner = ora('Loading iteration history...').start();
2176
+ try {
2177
+ const cwd = process.cwd();
2178
+ const { Logger } = await import('../core/logger.js');
2179
+ const { IterationTracker } = await import('../core/iteration-tracker.js');
2180
+ const logger = new Logger(cwd);
2181
+ const tracker = new IterationTracker(cwd, logger);
2182
+ const limit = options.limit || 10;
2183
+ const history = await tracker.getHistory(limit);
2184
+ if (history.length === 0) {
2185
+ spinner.fail('No iteration history found');
2186
+ return;
2187
+ }
2188
+ spinner.stop();
2189
+ console.log(`\n ${chalk.bold('Recent Iterations')} (${history.length})\n`);
2190
+ for (const iter of history) {
2191
+ const statusIcon = iter.status === 'success' ? chalk.green('✓') : iter.status === 'partial' ? chalk.yellow('◐') : chalk.red('✗');
2192
+ console.log(` ${statusIcon} Iteration ${iter.iteration}: ${iter.task_title}`);
2193
+ console.log(` Status: ${iter.status} | Duration: ${(iter.duration_ms || 0) / 1000}s`);
2194
+ console.log(` Checks: type=${iter.quality_checks.type_check ? '✓' : '✗'} lint=${iter.quality_checks.lint ? '✓' : '✗'} tests=${iter.quality_checks.tests ? '✓' : '✗'}`);
2195
+ if (iter.git_commit) {
2196
+ console.log(` Commit: ${iter.git_commit}`);
2197
+ }
2198
+ console.log();
2199
+ }
2200
+ // Show statistics
2201
+ const stats = await tracker.getStatistics();
2202
+ console.log(` ${chalk.bold('Statistics')}`);
2203
+ console.log(` Total: ${stats.total_iterations} | Success: ${stats.successful_iterations} | Failed: ${stats.failed_iterations}`);
2204
+ console.log(` Success rate: ${(stats.success_rate * 100).toFixed(1)}%`);
2205
+ console.log(` Avg duration: ${stats.average_duration_ms}ms\n`);
2206
+ }
2207
+ catch (error) {
2208
+ spinner.fail('Failed to load history');
2209
+ console.error(chalk.red(String(error)));
2210
+ process.exit(1);
2211
+ }
2212
+ }
2213
+ export async function ralphPauseCommand() {
2214
+ const oraModule = await import('ora');
2215
+ const ora = oraModule.default;
2216
+ const spinner = ora('Pausing Ralph loop...').start();
2217
+ try {
2218
+ const cwd = process.cwd();
2219
+ const { Logger } = await import('../core/logger.js');
2220
+ const { RalphManager } = await import('../core/ralph-manager.js');
2221
+ const logger = new Logger(cwd);
2222
+ const ralphManager = new RalphManager(cwd, logger);
2223
+ await ralphManager.pause();
2224
+ spinner.succeed('Ralph loop paused');
2225
+ console.log(`\n Resume with: ${chalk.bold('rulebook ralph resume')}\n`);
2226
+ }
2227
+ catch (error) {
2228
+ spinner.fail('Failed to pause');
2229
+ console.error(chalk.red(String(error)));
2230
+ process.exit(1);
2231
+ }
2232
+ }
2233
+ export async function ralphResumeCommand() {
2234
+ const oraModule = await import('ora');
2235
+ const ora = oraModule.default;
2236
+ const spinner = ora('Resuming Ralph loop...').start();
2237
+ try {
2238
+ const cwd = process.cwd();
2239
+ const { Logger } = await import('../core/logger.js');
2240
+ const { RalphManager } = await import('../core/ralph-manager.js');
2241
+ const logger = new Logger(cwd);
2242
+ const ralphManager = new RalphManager(cwd, logger);
2243
+ await ralphManager.resume();
2244
+ spinner.succeed('Ralph loop resumed');
2245
+ console.log(`\n Continue loop: ${chalk.bold('rulebook ralph run')}\n`);
2246
+ }
2247
+ catch (error) {
2248
+ spinner.fail('Failed to resume');
2249
+ console.error(chalk.red(String(error)));
2250
+ process.exit(1);
2251
+ }
2252
+ }
2253
+ export async function setupClaudeCodePlugin() {
2254
+ const oraModule = await import('ora');
2255
+ const ora = oraModule.default;
2256
+ const spinner = ora('Setting up Claude Code plugin...').start();
2257
+ try {
2258
+ const { readFile } = await import('../utils/file-system.js');
2259
+ const os = await import('os');
2260
+ const fs = await import('fs/promises');
2261
+ // Get plugin info from .claude-plugin/plugin.json
2262
+ const cwd = process.cwd();
2263
+ const pluginJsonPath = path.join(cwd, '.claude-plugin', 'plugin.json');
2264
+ const pluginJson = JSON.parse(await readFile(pluginJsonPath));
2265
+ // Get Claude Code plugins directory
2266
+ const homeDir = os.homedir();
2267
+ const pluginsDir = path.join(homeDir, '.claude', 'plugins');
2268
+ const installCountsPath = path.join(pluginsDir, 'install-counts-cache.json');
2269
+ const installedPluginsPath = path.join(pluginsDir, 'installed_plugins.json');
2270
+ // Create plugins directory if it doesn't exist
2271
+ await fs.mkdir(pluginsDir, { recursive: true });
2272
+ // Load or create installed_plugins.json
2273
+ let installedPlugins = {
2274
+ version: 2,
2275
+ plugins: {},
2276
+ };
2277
+ if (existsSync(installedPluginsPath)) {
2278
+ const content = await readFile(installedPluginsPath);
2279
+ installedPlugins = JSON.parse(content);
2280
+ }
2281
+ // Add rulebook plugin
2282
+ const pluginKey = `rulebook@hivehub`;
2283
+ const version = pluginJson.version || '3.1.0';
2284
+ const installPath = path.join(pluginsDir, 'cache', 'hivehub', 'rulebook', version);
2285
+ if (!installedPlugins.plugins[pluginKey]) {
2286
+ installedPlugins.plugins[pluginKey] = [];
2287
+ }
2288
+ // Check if already installed
2289
+ const existing = installedPlugins.plugins[pluginKey].find((p) => p.version === version);
2290
+ if (!existing) {
2291
+ installedPlugins.plugins[pluginKey].push({
2292
+ scope: 'user',
2293
+ installPath: installPath,
2294
+ version: version,
2295
+ installedAt: new Date().toISOString(),
2296
+ lastUpdated: new Date().toISOString(),
2297
+ });
2298
+ }
2299
+ // Save installed_plugins.json
2300
+ await fs.writeFile(installedPluginsPath, JSON.stringify(installedPlugins, null, 2));
2301
+ // Update install-counts-cache.json
2302
+ let installCounts = {};
2303
+ if (existsSync(installCountsPath)) {
2304
+ const content = await readFile(installCountsPath);
2305
+ installCounts = JSON.parse(content);
2306
+ }
2307
+ installCounts[pluginKey] = (installCounts[pluginKey] || 0) + 1;
2308
+ await fs.writeFile(installCountsPath, JSON.stringify(installCounts, null, 2));
2309
+ spinner.succeed('Claude Code plugin installed');
2310
+ console.log(`\n ${chalk.green('✓')} Plugin: ${pluginKey} v${version}`);
2311
+ console.log(` ${chalk.gray('Installed to:')} ${installPath}`);
2312
+ console.log(`\n ${chalk.blue('Note:')} Restart Claude Code to load the plugin.\n`);
2313
+ }
2314
+ catch (error) {
2315
+ spinner.fail('Failed to install plugin');
2316
+ console.error(chalk.red(String(error)));
2317
+ process.exit(1);
2318
+ }
2319
+ }
2320
+ export async function migrateMemoryDirectory() {
2321
+ const oraModule = await import('ora');
2322
+ const ora = oraModule.default;
2323
+ const spinner = ora('Migrating memory directory structure...').start();
2324
+ try {
2325
+ const { createConfigManager } = await import('../core/config-manager.js');
2326
+ const fs = await import('fs');
2327
+ const fsPromises = fs.promises;
2328
+ const cwd = process.cwd();
2329
+ const oldDir = path.join(cwd, '.rulebook-memory');
2330
+ const rulebookDir = path.join(cwd, '.rulebook');
2331
+ const newDir = path.join(rulebookDir, 'memory');
2332
+ // Check if old directory exists
2333
+ if (!existsSync(oldDir)) {
2334
+ spinner.info('No old memory directory found (.rulebook-memory)');
2335
+ return;
2336
+ }
2337
+ // Create .rulebook directory if it doesn't exist
2338
+ if (!existsSync(rulebookDir)) {
2339
+ await fsPromises.mkdir(rulebookDir, { recursive: true });
2340
+ }
2341
+ // Create memory subdirectory
2342
+ await fsPromises.mkdir(newDir, { recursive: true });
2343
+ // Copy files from old to new
2344
+ const files = await fsPromises.readdir(oldDir);
2345
+ for (const file of files) {
2346
+ const oldPath = path.join(oldDir, file);
2347
+ const newPath = path.join(newDir, file);
2348
+ await fsPromises.copyFile(oldPath, newPath);
2349
+ }
2350
+ // Remove old directory
2351
+ await fsPromises.rm(oldDir, { recursive: true, force: true });
2352
+ // Update config to use new path
2353
+ const configManager = createConfigManager(cwd);
2354
+ const existingConfig = await configManager.loadConfig();
2355
+ if (existingConfig.memory) {
2356
+ existingConfig.memory.dbPath = '.rulebook/memory/memory.db';
2357
+ }
2358
+ await configManager.updateConfig(existingConfig);
2359
+ spinner.succeed('Memory directory migrated');
2360
+ console.log(`\n ${chalk.green('✓')} Migrated to: ${newDir}`);
2361
+ console.log(` ${chalk.gray('Old directory removed: .rulebook-memory')}\n`);
2362
+ }
2363
+ catch (error) {
2364
+ const oraModule = await import('ora');
2365
+ const ora = oraModule.default;
2366
+ const spinner2 = ora();
2367
+ spinner2.fail('Failed to migrate memory directory');
2368
+ console.error(chalk.red(String(error)));
2369
+ process.exit(1);
2370
+ }
2371
+ }
1731
2372
  //# sourceMappingURL=commands.js.map