@hivehub/rulebook 1.2.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 (379) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +539 -0
  3. package/dist/agents/claude-code.d.ts +69 -0
  4. package/dist/agents/claude-code.d.ts.map +1 -0
  5. package/dist/agents/claude-code.js +180 -0
  6. package/dist/agents/claude-code.js.map +1 -0
  7. package/dist/agents/cursor-agent.d.ts +184 -0
  8. package/dist/agents/cursor-agent.d.ts.map +1 -0
  9. package/dist/agents/cursor-agent.js +299 -0
  10. package/dist/agents/cursor-agent.js.map +1 -0
  11. package/dist/agents/gemini-cli.d.ts +69 -0
  12. package/dist/agents/gemini-cli.d.ts.map +1 -0
  13. package/dist/agents/gemini-cli.js +180 -0
  14. package/dist/agents/gemini-cli.js.map +1 -0
  15. package/dist/cli/commands.d.ts +57 -0
  16. package/dist/cli/commands.d.ts.map +1 -0
  17. package/dist/cli/commands.js +1370 -0
  18. package/dist/cli/commands.js.map +1 -0
  19. package/dist/cli/docs-prompts.d.ts +3 -0
  20. package/dist/cli/docs-prompts.d.ts.map +1 -0
  21. package/dist/cli/docs-prompts.js +45 -0
  22. package/dist/cli/docs-prompts.js.map +1 -0
  23. package/dist/cli/prompts.d.ts +6 -0
  24. package/dist/cli/prompts.d.ts.map +1 -0
  25. package/dist/cli/prompts.js +376 -0
  26. package/dist/cli/prompts.js.map +1 -0
  27. package/dist/core/agent-manager.d.ts +89 -0
  28. package/dist/core/agent-manager.d.ts.map +1 -0
  29. package/dist/core/agent-manager.js +546 -0
  30. package/dist/core/agent-manager.js.map +1 -0
  31. package/dist/core/auto-fixer.d.ts +14 -0
  32. package/dist/core/auto-fixer.d.ts.map +1 -0
  33. package/dist/core/auto-fixer.js +207 -0
  34. package/dist/core/auto-fixer.js.map +1 -0
  35. package/dist/core/changelog-generator.d.ts +44 -0
  36. package/dist/core/changelog-generator.d.ts.map +1 -0
  37. package/dist/core/changelog-generator.js +222 -0
  38. package/dist/core/changelog-generator.js.map +1 -0
  39. package/dist/core/cli-bridge.d.ts +113 -0
  40. package/dist/core/cli-bridge.d.ts.map +1 -0
  41. package/dist/core/cli-bridge.js +1094 -0
  42. package/dist/core/cli-bridge.js.map +1 -0
  43. package/dist/core/config-manager.d.ts +65 -0
  44. package/dist/core/config-manager.d.ts.map +1 -0
  45. package/dist/core/config-manager.js +266 -0
  46. package/dist/core/config-manager.js.map +1 -0
  47. package/dist/core/coverage-checker.d.ts +14 -0
  48. package/dist/core/coverage-checker.d.ts.map +1 -0
  49. package/dist/core/coverage-checker.js +176 -0
  50. package/dist/core/coverage-checker.js.map +1 -0
  51. package/dist/core/custom-templates.d.ts +27 -0
  52. package/dist/core/custom-templates.d.ts.map +1 -0
  53. package/dist/core/custom-templates.js +122 -0
  54. package/dist/core/custom-templates.js.map +1 -0
  55. package/dist/core/dependency-checker.d.ts +21 -0
  56. package/dist/core/dependency-checker.d.ts.map +1 -0
  57. package/dist/core/dependency-checker.js +247 -0
  58. package/dist/core/dependency-checker.js.map +1 -0
  59. package/dist/core/detector.d.ts +3 -0
  60. package/dist/core/detector.d.ts.map +1 -0
  61. package/dist/core/detector.js +1443 -0
  62. package/dist/core/detector.js.map +1 -0
  63. package/dist/core/docs-generator.d.ts +9 -0
  64. package/dist/core/docs-generator.d.ts.map +1 -0
  65. package/dist/core/docs-generator.js +531 -0
  66. package/dist/core/docs-generator.js.map +1 -0
  67. package/dist/core/generator.d.ts +16 -0
  68. package/dist/core/generator.d.ts.map +1 -0
  69. package/dist/core/generator.js +561 -0
  70. package/dist/core/generator.js.map +1 -0
  71. package/dist/core/gitignore-generator.d.ts +13 -0
  72. package/dist/core/gitignore-generator.d.ts.map +1 -0
  73. package/dist/core/gitignore-generator.js +307 -0
  74. package/dist/core/gitignore-generator.js.map +1 -0
  75. package/dist/core/health-scorer.d.ts +22 -0
  76. package/dist/core/health-scorer.d.ts.map +1 -0
  77. package/dist/core/health-scorer.js +395 -0
  78. package/dist/core/health-scorer.js.map +1 -0
  79. package/dist/core/logger.d.ts +116 -0
  80. package/dist/core/logger.d.ts.map +1 -0
  81. package/dist/core/logger.js +289 -0
  82. package/dist/core/logger.js.map +1 -0
  83. package/dist/core/merger.d.ts +6 -0
  84. package/dist/core/merger.d.ts.map +1 -0
  85. package/dist/core/merger.js +131 -0
  86. package/dist/core/merger.js.map +1 -0
  87. package/dist/core/migrator.d.ts +19 -0
  88. package/dist/core/migrator.d.ts.map +1 -0
  89. package/dist/core/migrator.js +102 -0
  90. package/dist/core/migrator.js.map +1 -0
  91. package/dist/core/minimal-scaffolder.d.ts +8 -0
  92. package/dist/core/minimal-scaffolder.d.ts.map +1 -0
  93. package/dist/core/minimal-scaffolder.js +51 -0
  94. package/dist/core/minimal-scaffolder.js.map +1 -0
  95. package/dist/core/modern-console-new.d.ts +81 -0
  96. package/dist/core/modern-console-new.d.ts.map +1 -0
  97. package/dist/core/modern-console-new.js +340 -0
  98. package/dist/core/modern-console-new.js.map +1 -0
  99. package/dist/core/modern-console.d.ts +99 -0
  100. package/dist/core/modern-console.d.ts.map +1 -0
  101. package/dist/core/modern-console.js +568 -0
  102. package/dist/core/modern-console.js.map +1 -0
  103. package/dist/core/openspec-manager.d.ts +133 -0
  104. package/dist/core/openspec-manager.d.ts.map +1 -0
  105. package/dist/core/openspec-manager.js +605 -0
  106. package/dist/core/openspec-manager.js.map +1 -0
  107. package/dist/core/openspec-migrator.d.ts +27 -0
  108. package/dist/core/openspec-migrator.d.ts.map +1 -0
  109. package/dist/core/openspec-migrator.js +255 -0
  110. package/dist/core/openspec-migrator.js.map +1 -0
  111. package/dist/core/task-manager.d.ts +65 -0
  112. package/dist/core/task-manager.d.ts.map +1 -0
  113. package/dist/core/task-manager.js +318 -0
  114. package/dist/core/task-manager.js.map +1 -0
  115. package/dist/core/test-task-manager.d.ts +49 -0
  116. package/dist/core/test-task-manager.d.ts.map +1 -0
  117. package/dist/core/test-task-manager.js +121 -0
  118. package/dist/core/test-task-manager.js.map +1 -0
  119. package/dist/core/validator.d.ts +21 -0
  120. package/dist/core/validator.d.ts.map +1 -0
  121. package/dist/core/validator.js +177 -0
  122. package/dist/core/validator.js.map +1 -0
  123. package/dist/core/version-bumper.d.ts +19 -0
  124. package/dist/core/version-bumper.d.ts.map +1 -0
  125. package/dist/core/version-bumper.js +180 -0
  126. package/dist/core/version-bumper.js.map +1 -0
  127. package/dist/core/watcher.d.ts +9 -0
  128. package/dist/core/watcher.d.ts.map +1 -0
  129. package/dist/core/watcher.js +22 -0
  130. package/dist/core/watcher.js.map +1 -0
  131. package/dist/core/workflow-generator.d.ts +10 -0
  132. package/dist/core/workflow-generator.d.ts.map +1 -0
  133. package/dist/core/workflow-generator.js +279 -0
  134. package/dist/core/workflow-generator.js.map +1 -0
  135. package/dist/index.d.ts +3 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +159 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/mcp/handlers/archive-task.d.ts +17 -0
  140. package/dist/mcp/handlers/archive-task.d.ts.map +1 -0
  141. package/dist/mcp/handlers/archive-task.js +36 -0
  142. package/dist/mcp/handlers/archive-task.js.map +1 -0
  143. package/dist/mcp/handlers/create-task.d.ts +17 -0
  144. package/dist/mcp/handlers/create-task.d.ts.map +1 -0
  145. package/dist/mcp/handlers/create-task.js +56 -0
  146. package/dist/mcp/handlers/create-task.js.map +1 -0
  147. package/dist/mcp/handlers/list-tasks.d.ts +22 -0
  148. package/dist/mcp/handlers/list-tasks.d.ts.map +1 -0
  149. package/dist/mcp/handlers/list-tasks.js +42 -0
  150. package/dist/mcp/handlers/list-tasks.js.map +1 -0
  151. package/dist/mcp/handlers/show-task.d.ts +25 -0
  152. package/dist/mcp/handlers/show-task.d.ts.map +1 -0
  153. package/dist/mcp/handlers/show-task.js +43 -0
  154. package/dist/mcp/handlers/show-task.js.map +1 -0
  155. package/dist/mcp/handlers/update-task.d.ts +17 -0
  156. package/dist/mcp/handlers/update-task.d.ts.map +1 -0
  157. package/dist/mcp/handlers/update-task.js +35 -0
  158. package/dist/mcp/handlers/update-task.js.map +1 -0
  159. package/dist/mcp/handlers/validate-task.d.ts +15 -0
  160. package/dist/mcp/handlers/validate-task.d.ts.map +1 -0
  161. package/dist/mcp/handlers/validate-task.js +27 -0
  162. package/dist/mcp/handlers/validate-task.js.map +1 -0
  163. package/dist/mcp/rulebook-config.d.ts +22 -0
  164. package/dist/mcp/rulebook-config.d.ts.map +1 -0
  165. package/dist/mcp/rulebook-config.js +65 -0
  166. package/dist/mcp/rulebook-config.js.map +1 -0
  167. package/dist/mcp/rulebook-server.d.ts +4 -0
  168. package/dist/mcp/rulebook-server.d.ts.map +1 -0
  169. package/dist/mcp/rulebook-server.js +246 -0
  170. package/dist/mcp/rulebook-server.js.map +1 -0
  171. package/dist/types.d.ts +190 -0
  172. package/dist/types.d.ts.map +1 -0
  173. package/dist/types.js +2 -0
  174. package/dist/types.js.map +1 -0
  175. package/dist/utils/file-system.d.ts +9 -0
  176. package/dist/utils/file-system.d.ts.map +1 -0
  177. package/dist/utils/file-system.js +51 -0
  178. package/dist/utils/file-system.js.map +1 -0
  179. package/dist/utils/git-hooks.d.ts +8 -0
  180. package/dist/utils/git-hooks.d.ts.map +1 -0
  181. package/dist/utils/git-hooks.js +440 -0
  182. package/dist/utils/git-hooks.js.map +1 -0
  183. package/dist/utils/rulesignore.d.ts +9 -0
  184. package/dist/utils/rulesignore.d.ts.map +1 -0
  185. package/dist/utils/rulesignore.js +42 -0
  186. package/dist/utils/rulesignore.js.map +1 -0
  187. package/package.json +106 -0
  188. package/templates/cli/AIDER.md +49 -0
  189. package/templates/cli/AMAZON_Q.md +25 -0
  190. package/templates/cli/AUGGIE.md +32 -0
  191. package/templates/cli/CLAUDE.md +32 -0
  192. package/templates/cli/CLAUDE_CODE.md +35 -0
  193. package/templates/cli/CLINE.md +32 -0
  194. package/templates/cli/CODEBUDDY.md +20 -0
  195. package/templates/cli/CODEIUM.md +20 -0
  196. package/templates/cli/CODEX.md +21 -0
  197. package/templates/cli/CONTINUE.md +34 -0
  198. package/templates/cli/CURSOR_CLI.md +28 -0
  199. package/templates/cli/FACTORY.md +18 -0
  200. package/templates/cli/GEMINI.md +35 -0
  201. package/templates/cli/KILOCODE.md +18 -0
  202. package/templates/cli/OPENCODE.md +18 -0
  203. package/templates/cli/_GENERIC_TEMPLATE.md +29 -0
  204. package/templates/commands/rulebook-task-apply.md +67 -0
  205. package/templates/commands/rulebook-task-archive.md +70 -0
  206. package/templates/commands/rulebook-task-create.md +93 -0
  207. package/templates/commands/rulebook-task-list.md +42 -0
  208. package/templates/commands/rulebook-task-show.md +52 -0
  209. package/templates/commands/rulebook-task-validate.md +53 -0
  210. package/templates/core/AGENT_AUTOMATION.md +184 -0
  211. package/templates/core/DAG.md +304 -0
  212. package/templates/core/DOCUMENTATION_RULES.md +37 -0
  213. package/templates/core/QUALITY_ENFORCEMENT.md +68 -0
  214. package/templates/core/RULEBOOK.md +1874 -0
  215. package/templates/frameworks/ANGULAR.md +36 -0
  216. package/templates/frameworks/DJANGO.md +83 -0
  217. package/templates/frameworks/ELECTRON.md +147 -0
  218. package/templates/frameworks/FLASK.md +38 -0
  219. package/templates/frameworks/FLUTTER.md +55 -0
  220. package/templates/frameworks/JQUERY.md +32 -0
  221. package/templates/frameworks/LARAVEL.md +38 -0
  222. package/templates/frameworks/NESTJS.md +43 -0
  223. package/templates/frameworks/NEXTJS.md +127 -0
  224. package/templates/frameworks/NUXT.md +40 -0
  225. package/templates/frameworks/RAILS.md +66 -0
  226. package/templates/frameworks/REACT.md +38 -0
  227. package/templates/frameworks/REACT_NATIVE.md +47 -0
  228. package/templates/frameworks/SPRING.md +39 -0
  229. package/templates/frameworks/SYMFONY.md +36 -0
  230. package/templates/frameworks/VUE.md +36 -0
  231. package/templates/frameworks/ZEND.md +35 -0
  232. package/templates/git/CI_CD_PATTERNS.md +661 -0
  233. package/templates/git/GITHUB_ACTIONS.md +728 -0
  234. package/templates/git/GITLAB_CI.md +730 -0
  235. package/templates/git/GIT_WORKFLOW.md +1157 -0
  236. package/templates/git/SECRETS_MANAGEMENT.md +585 -0
  237. package/templates/hooks/COMMIT_MSG.md +530 -0
  238. package/templates/hooks/POST_CHECKOUT.md +546 -0
  239. package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -0
  240. package/templates/hooks/PRE_COMMIT.md +414 -0
  241. package/templates/hooks/PRE_PUSH.md +601 -0
  242. package/templates/hooks/csharp-pre-commit.sh +23 -0
  243. package/templates/hooks/csharp-pre-push.sh +23 -0
  244. package/templates/hooks/dart-pre-commit.sh +30 -0
  245. package/templates/hooks/dart-pre-push.sh +25 -0
  246. package/templates/hooks/elixir-pre-commit.sh +32 -0
  247. package/templates/hooks/elixir-pre-push.sh +31 -0
  248. package/templates/hooks/erlang-pre-commit.sh +30 -0
  249. package/templates/hooks/erlang-pre-push.sh +37 -0
  250. package/templates/hooks/go-pre-commit.sh +40 -0
  251. package/templates/hooks/go-pre-push.sh +31 -0
  252. package/templates/hooks/haskell-pre-commit.sh +41 -0
  253. package/templates/hooks/haskell-pre-push.sh +37 -0
  254. package/templates/hooks/java-pre-commit.sh +34 -0
  255. package/templates/hooks/java-pre-push.sh +24 -0
  256. package/templates/hooks/kotlin-pre-commit.sh +32 -0
  257. package/templates/hooks/kotlin-pre-push.sh +16 -0
  258. package/templates/hooks/php-pre-commit.sh +36 -0
  259. package/templates/hooks/php-pre-push.sh +26 -0
  260. package/templates/hooks/python-pre-commit.sh +51 -0
  261. package/templates/hooks/python-pre-push.sh +25 -0
  262. package/templates/hooks/ruby-pre-commit.sh +33 -0
  263. package/templates/hooks/ruby-pre-push.sh +32 -0
  264. package/templates/hooks/rust-pre-commit.sh +30 -0
  265. package/templates/hooks/rust-pre-push.sh +30 -0
  266. package/templates/hooks/scala-pre-commit.sh +32 -0
  267. package/templates/hooks/scala-pre-push.sh +24 -0
  268. package/templates/hooks/swift-pre-commit.sh +25 -0
  269. package/templates/hooks/swift-pre-push.sh +23 -0
  270. package/templates/hooks/typescript-pre-commit.sh +37 -0
  271. package/templates/hooks/typescript-pre-push.sh +36 -0
  272. package/templates/ides/COPILOT.md +37 -0
  273. package/templates/ides/CURSOR.md +43 -0
  274. package/templates/ides/JETBRAINS_AI.md +35 -0
  275. package/templates/ides/REPLIT.md +36 -0
  276. package/templates/ides/TABNINE.md +29 -0
  277. package/templates/ides/VSCODE.md +40 -0
  278. package/templates/ides/WINDSURF.md +36 -0
  279. package/templates/ides/ZED.md +32 -0
  280. package/templates/languages/ADA.md +58 -0
  281. package/templates/languages/C.md +333 -0
  282. package/templates/languages/CPP.md +743 -0
  283. package/templates/languages/CSHARP.md +417 -0
  284. package/templates/languages/DART.md +332 -0
  285. package/templates/languages/ELIXIR.md +454 -0
  286. package/templates/languages/ERLANG.md +361 -0
  287. package/templates/languages/GO.md +645 -0
  288. package/templates/languages/HASKELL.md +177 -0
  289. package/templates/languages/JAVA.md +607 -0
  290. package/templates/languages/JAVASCRIPT.md +631 -0
  291. package/templates/languages/JULIA.md +97 -0
  292. package/templates/languages/KOTLIN.md +511 -0
  293. package/templates/languages/LISP.md +100 -0
  294. package/templates/languages/LUA.md +74 -0
  295. package/templates/languages/OBJECTIVEC.md +90 -0
  296. package/templates/languages/PHP.md +416 -0
  297. package/templates/languages/PYTHON.md +682 -0
  298. package/templates/languages/R.md +350 -0
  299. package/templates/languages/RUBY.md +421 -0
  300. package/templates/languages/RUST.md +477 -0
  301. package/templates/languages/SAS.md +73 -0
  302. package/templates/languages/SCALA.md +348 -0
  303. package/templates/languages/SOLIDITY.md +580 -0
  304. package/templates/languages/SQL.md +137 -0
  305. package/templates/languages/SWIFT.md +466 -0
  306. package/templates/languages/TYPESCRIPT.md +591 -0
  307. package/templates/languages/ZIG.md +265 -0
  308. package/templates/modules/ATLASSIAN.md +255 -0
  309. package/templates/modules/CONTEXT7.md +54 -0
  310. package/templates/modules/FIGMA.md +267 -0
  311. package/templates/modules/GITHUB_MCP.md +64 -0
  312. package/templates/modules/GRAFANA.md +328 -0
  313. package/templates/modules/NOTION.md +247 -0
  314. package/templates/modules/PLAYWRIGHT.md +90 -0
  315. package/templates/modules/RULEBOOK_MCP.md +156 -0
  316. package/templates/modules/SERENA.md +337 -0
  317. package/templates/modules/SUPABASE.md +223 -0
  318. package/templates/modules/SYNAP.md +69 -0
  319. package/templates/modules/VECTORIZER.md +63 -0
  320. package/templates/services/AZURE_BLOB.md +184 -0
  321. package/templates/services/CASSANDRA.md +239 -0
  322. package/templates/services/DYNAMODB.md +308 -0
  323. package/templates/services/ELASTICSEARCH.md +347 -0
  324. package/templates/services/GCS.md +178 -0
  325. package/templates/services/INFLUXDB.md +265 -0
  326. package/templates/services/KAFKA.md +341 -0
  327. package/templates/services/MARIADB.md +183 -0
  328. package/templates/services/MEMCACHED.md +242 -0
  329. package/templates/services/MINIO.md +201 -0
  330. package/templates/services/MONGODB.md +268 -0
  331. package/templates/services/MYSQL.md +358 -0
  332. package/templates/services/NEO4J.md +247 -0
  333. package/templates/services/ORACLE.md +290 -0
  334. package/templates/services/POSTGRESQL.md +326 -0
  335. package/templates/services/RABBITMQ.md +286 -0
  336. package/templates/services/REDIS.md +292 -0
  337. package/templates/services/S3.md +298 -0
  338. package/templates/services/SQLITE.md +294 -0
  339. package/templates/services/SQLSERVER.md +294 -0
  340. package/templates/workflows/codespell.yml +31 -0
  341. package/templates/workflows/cpp-lint.yml +47 -0
  342. package/templates/workflows/cpp-publish.yml +119 -0
  343. package/templates/workflows/cpp-test.yml +77 -0
  344. package/templates/workflows/dotnet-lint.yml +29 -0
  345. package/templates/workflows/dotnet-publish.yml +40 -0
  346. package/templates/workflows/dotnet-test.yml +41 -0
  347. package/templates/workflows/elixir-lint.yml +45 -0
  348. package/templates/workflows/elixir-publish.yml +49 -0
  349. package/templates/workflows/elixir-test.yml +54 -0
  350. package/templates/workflows/erlang-lint.yml +47 -0
  351. package/templates/workflows/erlang-test.yml +62 -0
  352. package/templates/workflows/go-lint.yml +39 -0
  353. package/templates/workflows/go-publish.yml +95 -0
  354. package/templates/workflows/go-test.yml +59 -0
  355. package/templates/workflows/java-lint.yml +60 -0
  356. package/templates/workflows/java-publish.yml +120 -0
  357. package/templates/workflows/java-test.yml +85 -0
  358. package/templates/workflows/kotlin-lint.yml +34 -0
  359. package/templates/workflows/kotlin-publish.yml +56 -0
  360. package/templates/workflows/kotlin-test.yml +48 -0
  361. package/templates/workflows/php-lint.yml +39 -0
  362. package/templates/workflows/php-publish.yml +50 -0
  363. package/templates/workflows/php-test.yml +54 -0
  364. package/templates/workflows/python-lint.yml +47 -0
  365. package/templates/workflows/python-publish.yml +91 -0
  366. package/templates/workflows/python-test.yml +59 -0
  367. package/templates/workflows/rust-lint.yml +54 -0
  368. package/templates/workflows/rust-publish.yml +66 -0
  369. package/templates/workflows/rust-test.yml +75 -0
  370. package/templates/workflows/solidity-lint.yml +41 -0
  371. package/templates/workflows/solidity-test.yml +47 -0
  372. package/templates/workflows/swift-lint.yml +32 -0
  373. package/templates/workflows/swift-publish.yml +58 -0
  374. package/templates/workflows/swift-test.yml +44 -0
  375. package/templates/workflows/typescript-lint.yml +61 -0
  376. package/templates/workflows/typescript-publish.yml +60 -0
  377. package/templates/workflows/typescript-test.yml +73 -0
  378. package/templates/workflows/zig-lint.yml +27 -0
  379. package/templates/workflows/zig-test.yml +40 -0
@@ -0,0 +1,289 @@
1
+ import { writeFile, existsSync, mkdirSync, readdir, unlink } from 'fs';
2
+ import { promisify } from 'util';
3
+ import { join } from 'path';
4
+ const writeFileAsync = promisify(writeFile);
5
+ const readdirAsync = promisify(readdir);
6
+ const unlinkAsync = promisify(unlink);
7
+ const LOGS_DIR = 'openspec/logs';
8
+ const MAX_LOG_AGE_DAYS = 30;
9
+ export class Logger {
10
+ logsPath;
11
+ currentLogFile;
12
+ logBuffer = [];
13
+ bufferSize = 10;
14
+ flushInterval = null;
15
+ constructor(projectRoot) {
16
+ this.logsPath = join(projectRoot, LOGS_DIR);
17
+ this.currentLogFile = join(this.logsPath, this.generateLogFileName());
18
+ this.initializeLogging();
19
+ }
20
+ /**
21
+ * Initialize logging directory and start flush interval
22
+ */
23
+ async initializeLogging() {
24
+ if (!existsSync(this.logsPath)) {
25
+ mkdirSync(this.logsPath, { recursive: true });
26
+ }
27
+ // Start periodic flush
28
+ this.flushInterval = setInterval(() => {
29
+ this.flush();
30
+ }, 5000); // Flush every 5 seconds
31
+ // Clean old logs on startup
32
+ await this.cleanOldLogs();
33
+ }
34
+ /**
35
+ * Generate log file name with timestamp
36
+ */
37
+ generateLogFileName() {
38
+ const now = new Date();
39
+ const timestamp = now.toISOString().replace(/[:.]/g, '-').slice(0, 19);
40
+ return `agent-${timestamp}.log`;
41
+ }
42
+ /**
43
+ * Log a message
44
+ */
45
+ log(level, message, context, taskId, duration) {
46
+ const entry = {
47
+ timestamp: new Date().toISOString(),
48
+ level,
49
+ message,
50
+ context,
51
+ taskId,
52
+ duration,
53
+ };
54
+ this.logBuffer.push(entry);
55
+ // Flush if buffer is full
56
+ if (this.logBuffer.length >= this.bufferSize) {
57
+ this.flush();
58
+ }
59
+ }
60
+ /**
61
+ * Log debug message
62
+ */
63
+ debug(message, context, taskId) {
64
+ this.log('debug', message, context, taskId);
65
+ }
66
+ /**
67
+ * Log info message
68
+ */
69
+ info(message, context, taskId) {
70
+ this.log('info', message, context, taskId);
71
+ }
72
+ /**
73
+ * Log warning message
74
+ */
75
+ warn(message, context, taskId) {
76
+ this.log('warn', message, context, taskId);
77
+ }
78
+ /**
79
+ * Log error message
80
+ */
81
+ error(message, context, taskId) {
82
+ this.log('error', message, context, taskId);
83
+ }
84
+ /**
85
+ * Log task start
86
+ */
87
+ taskStart(taskId, taskTitle) {
88
+ this.info(`Task started: ${taskTitle}`, { taskId, action: 'start' }, taskId);
89
+ }
90
+ /**
91
+ * Log task completion
92
+ */
93
+ taskComplete(taskId, taskTitle, duration) {
94
+ this.info(`Task completed: ${taskTitle}`, { taskId, action: 'complete', duration }, taskId);
95
+ }
96
+ /**
97
+ * Log task failure
98
+ */
99
+ taskFailed(taskId, taskTitle, error, duration) {
100
+ this.error(`Task failed: ${taskTitle}`, { taskId, action: 'failed', error, duration }, taskId);
101
+ }
102
+ /**
103
+ * Log CLI command execution
104
+ */
105
+ cliCommand(command, tool, taskId) {
106
+ this.debug(`CLI command: ${command}`, { tool, command }, taskId);
107
+ }
108
+ /**
109
+ * Log CLI response
110
+ */
111
+ cliResponse(tool, response, duration, taskId) {
112
+ this.debug(`CLI response from ${tool}`, { tool, responseLength: response.length, duration }, taskId);
113
+ }
114
+ /**
115
+ * Log test execution
116
+ */
117
+ testExecution(testType, result, duration, taskId) {
118
+ this.info(`Test ${testType}: ${result}`, { testType, result, duration }, taskId);
119
+ }
120
+ /**
121
+ * Log coverage check
122
+ */
123
+ coverageCheck(percentage, threshold, taskId) {
124
+ const status = percentage >= threshold ? 'passed' : 'failed';
125
+ this.info(`Coverage check: ${status}`, { percentage, threshold, status }, taskId);
126
+ }
127
+ /**
128
+ * Flush log buffer to file
129
+ */
130
+ async flush() {
131
+ if (this.logBuffer.length === 0) {
132
+ return;
133
+ }
134
+ try {
135
+ const entries = [...this.logBuffer];
136
+ this.logBuffer = [];
137
+ const logContent = entries.map((entry) => JSON.stringify(entry)).join('\n') + '\n';
138
+ await writeFileAsync(this.currentLogFile, logContent, { flag: 'a' });
139
+ }
140
+ catch (error) {
141
+ console.error('Failed to flush logs:', error);
142
+ }
143
+ }
144
+ /**
145
+ * Force flush and close logger
146
+ */
147
+ async close() {
148
+ if (this.flushInterval) {
149
+ clearInterval(this.flushInterval);
150
+ this.flushInterval = null;
151
+ }
152
+ await this.flush();
153
+ }
154
+ /**
155
+ * Clean old log files
156
+ */
157
+ async cleanOldLogs() {
158
+ try {
159
+ const files = await readdirAsync(this.logsPath);
160
+ const cutoffDate = new Date();
161
+ cutoffDate.setDate(cutoffDate.getDate() - MAX_LOG_AGE_DAYS);
162
+ for (const file of files) {
163
+ if (file.startsWith('agent-') && file.endsWith('.log')) {
164
+ const filePath = join(this.logsPath, file);
165
+ const stats = await import('fs').then((fs) => fs.promises.stat(filePath));
166
+ if (stats.mtime < cutoffDate) {
167
+ await unlinkAsync(filePath);
168
+ this.info(`Cleaned old log file: ${file}`);
169
+ }
170
+ }
171
+ }
172
+ }
173
+ catch (error) {
174
+ this.error('Failed to clean old logs', { error: String(error) });
175
+ }
176
+ }
177
+ /**
178
+ * Get recent log entries
179
+ */
180
+ async getRecentLogs(limit = 100) {
181
+ try {
182
+ const files = await readdirAsync(this.logsPath);
183
+ const logFiles = files
184
+ .filter((file) => file.startsWith('agent-') && file.endsWith('.log'))
185
+ .sort()
186
+ .reverse(); // Most recent first
187
+ const entries = [];
188
+ for (const file of logFiles) {
189
+ if (entries.length >= limit)
190
+ break;
191
+ const filePath = join(this.logsPath, file);
192
+ const content = await import('fs').then((fs) => fs.promises.readFile(filePath, 'utf-8'));
193
+ const lines = content
194
+ .trim()
195
+ .split('\n')
196
+ .filter((line) => line.trim());
197
+ for (const line of lines) {
198
+ if (entries.length >= limit)
199
+ break;
200
+ try {
201
+ const entry = JSON.parse(line);
202
+ entries.push(entry);
203
+ }
204
+ catch {
205
+ // Skip malformed entries
206
+ }
207
+ }
208
+ }
209
+ return entries.slice(0, limit);
210
+ }
211
+ catch (error) {
212
+ this.error('Failed to get recent logs', { error: String(error) });
213
+ return [];
214
+ }
215
+ }
216
+ /**
217
+ * Get logs for specific task
218
+ */
219
+ async getTaskLogs(taskId) {
220
+ const recentLogs = await this.getRecentLogs(1000);
221
+ return recentLogs.filter((entry) => entry.taskId === taskId);
222
+ }
223
+ /**
224
+ * Get logs by level
225
+ */
226
+ async getLogsByLevel(level, limit = 100) {
227
+ const recentLogs = await this.getRecentLogs(limit * 2);
228
+ return recentLogs.filter((entry) => entry.level === level).slice(0, limit);
229
+ }
230
+ /**
231
+ * Get error logs
232
+ */
233
+ async getErrorLogs(limit = 50) {
234
+ return this.getLogsByLevel('error', limit);
235
+ }
236
+ /**
237
+ * Generate log summary
238
+ */
239
+ async getLogSummary() {
240
+ const recentLogs = await this.getRecentLogs(1000);
241
+ const summary = {
242
+ totalEntries: recentLogs.length,
243
+ byLevel: {},
244
+ recentErrors: 0,
245
+ oldestEntry: undefined,
246
+ newestEntry: undefined,
247
+ };
248
+ for (const entry of recentLogs) {
249
+ summary.byLevel[entry.level] = (summary.byLevel[entry.level] || 0) + 1;
250
+ if (entry.level === 'error') {
251
+ summary.recentErrors++;
252
+ }
253
+ if (!summary.oldestEntry || entry.timestamp < summary.oldestEntry) {
254
+ summary.oldestEntry = entry.timestamp;
255
+ }
256
+ if (!summary.newestEntry || entry.timestamp > summary.newestEntry) {
257
+ summary.newestEntry = entry.timestamp;
258
+ }
259
+ }
260
+ return summary;
261
+ }
262
+ }
263
+ /**
264
+ * Create a new Logger instance
265
+ */
266
+ export function createLogger(projectRoot) {
267
+ return new Logger(projectRoot);
268
+ }
269
+ /**
270
+ * Global logger instance
271
+ */
272
+ let globalLogger = null;
273
+ /**
274
+ * Initialize global logger
275
+ */
276
+ export function initializeLogger(projectRoot) {
277
+ globalLogger = new Logger(projectRoot);
278
+ return globalLogger;
279
+ }
280
+ /**
281
+ * Get global logger instance
282
+ */
283
+ export function getLogger() {
284
+ if (!globalLogger) {
285
+ throw new Error('Logger not initialized. Call initializeLogger() first.');
286
+ }
287
+ return globalLogger;
288
+ }
289
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ExistingAgentsInfo, ProjectConfig } from '../types.js';
2
+ export declare function mergeAgents(existing: ExistingAgentsInfo, config: ProjectConfig): Promise<string>;
3
+ export declare function mergeLanguageRules(existing: ExistingAgentsInfo, language: string): Promise<string>;
4
+ export declare function mergeModuleRules(existing: ExistingAgentsInfo, module: string): Promise<string>;
5
+ export declare function mergeFullAgents(existing: ExistingAgentsInfo, config: ProjectConfig, projectRoot?: string): Promise<string>;
6
+ //# sourceMappingURL=merger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merger.d.ts","sourceRoot":"","sources":["../../src/core/merger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAc,MAAM,aAAa,CAAC;AAQjF,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,aAAa,EACrB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CA0DjB"}
@@ -0,0 +1,131 @@
1
+ import { generateAgentsContent, generateLanguageRules, generateModuleRules } from './generator.js';
2
+ import { hasEmbeddedTemplates, migrateEmbeddedTemplates, replaceEmbeddedWithReferences, } from './migrator.js';
3
+ export async function mergeAgents(existing, config) {
4
+ const lines = existing.content.split('\n');
5
+ const rulebookBlock = existing.blocks.find((b) => b.name === 'RULEBOOK');
6
+ // Generate new RULEBOOK content
7
+ const newRulebookContent = await generateAgentsContent(config);
8
+ if (rulebookBlock) {
9
+ // Replace existing RULEBOOK block
10
+ const beforeBlock = lines.slice(0, rulebookBlock.startLine).join('\n');
11
+ const afterBlock = lines.slice(rulebookBlock.endLine + 1).join('\n');
12
+ return [beforeBlock, newRulebookContent, afterBlock].join('\n').trim() + '\n';
13
+ }
14
+ else {
15
+ // Insert RULEBOOK at the beginning
16
+ return [newRulebookContent, '', existing.content].join('\n').trim() + '\n';
17
+ }
18
+ }
19
+ export async function mergeLanguageRules(existing, language) {
20
+ const lines = existing.content.split('\n');
21
+ const blockName = language.toUpperCase();
22
+ const languageBlock = existing.blocks.find((b) => b.name === blockName);
23
+ const newLanguageContent = await generateLanguageRules(language);
24
+ if (languageBlock) {
25
+ // Replace existing language block
26
+ const beforeBlock = lines.slice(0, languageBlock.startLine).join('\n');
27
+ const afterBlock = lines.slice(languageBlock.endLine + 1).join('\n');
28
+ return [beforeBlock, newLanguageContent, afterBlock].join('\n').trim() + '\n';
29
+ }
30
+ else {
31
+ // Append language block at the end
32
+ return [existing.content, '', newLanguageContent].join('\n').trim() + '\n';
33
+ }
34
+ }
35
+ export async function mergeModuleRules(existing, module) {
36
+ const lines = existing.content.split('\n');
37
+ const blockName = module.toUpperCase();
38
+ const moduleBlock = existing.blocks.find((b) => b.name === blockName);
39
+ const newModuleContent = await generateModuleRules(module);
40
+ if (moduleBlock) {
41
+ // Replace existing module block
42
+ const beforeBlock = lines.slice(0, moduleBlock.startLine).join('\n');
43
+ const afterBlock = lines.slice(moduleBlock.endLine + 1).join('\n');
44
+ return [beforeBlock, newModuleContent, afterBlock].join('\n').trim() + '\n';
45
+ }
46
+ else {
47
+ // Append module block at the end
48
+ return [existing.content, '', newModuleContent].join('\n').trim() + '\n';
49
+ }
50
+ }
51
+ export async function mergeFullAgents(existing, config, projectRoot) {
52
+ // Check if we need to migrate from embedded to modular
53
+ const needsMigration = hasEmbeddedTemplates(existing) && config.modular !== false;
54
+ if (needsMigration && projectRoot) {
55
+ // Migrate embedded templates to /rulebook/ directory
56
+ await migrateEmbeddedTemplates(existing, config, projectRoot);
57
+ // Generate new modular AGENTS.md with references
58
+ // This replaces the entire content with modular format
59
+ return await replaceEmbeddedWithReferences(config, projectRoot);
60
+ }
61
+ // Legacy merge behavior (for non-modular mode or when migration not needed)
62
+ let content = existing.content;
63
+ let currentExisting = { ...existing };
64
+ // Merge RULEBOOK section
65
+ content = await mergeAgents(currentExisting, config);
66
+ // Update existing info for next merge
67
+ currentExisting = {
68
+ ...currentExisting,
69
+ content,
70
+ blocks: parseBlocks(content),
71
+ };
72
+ // If modular mode, use generateModularAgents instead of merging blocks
73
+ if (config.modular !== false && projectRoot) {
74
+ const { generateModularAgents } = await import('./generator.js');
75
+ return await generateModularAgents(config, projectRoot);
76
+ }
77
+ // Legacy: Merge language rules (embedded)
78
+ for (const language of config.languages) {
79
+ content = await mergeLanguageRules(currentExisting, language);
80
+ // Update existing info for next merge
81
+ currentExisting = {
82
+ ...currentExisting,
83
+ content,
84
+ blocks: parseBlocks(content),
85
+ };
86
+ }
87
+ // Legacy: Merge module rules (embedded)
88
+ for (const module of config.modules) {
89
+ content = await mergeModuleRules(currentExisting, module);
90
+ // Update existing info for next merge
91
+ currentExisting = {
92
+ ...currentExisting,
93
+ content,
94
+ blocks: parseBlocks(content),
95
+ };
96
+ }
97
+ return content;
98
+ }
99
+ // Helper function to parse blocks
100
+ function parseBlocks(content) {
101
+ const blocks = [];
102
+ const lines = content.split('\n');
103
+ let currentBlock = null;
104
+ for (let i = 0; i < lines.length; i++) {
105
+ const line = lines[i];
106
+ const startMatch = line.match(/<!--\s*([A-Z_]+):START\s*-->/);
107
+ const endMatch = line.match(/<!--\s*([A-Z_]+):END\s*-->/);
108
+ if (startMatch) {
109
+ currentBlock = {
110
+ name: startMatch[1],
111
+ startLine: i,
112
+ content: [line],
113
+ };
114
+ }
115
+ else if (endMatch && currentBlock) {
116
+ currentBlock.content.push(line);
117
+ blocks.push({
118
+ name: currentBlock.name,
119
+ startLine: currentBlock.startLine,
120
+ endLine: i,
121
+ content: currentBlock.content.join('\n'),
122
+ });
123
+ currentBlock = null;
124
+ }
125
+ else if (currentBlock) {
126
+ currentBlock.content.push(line);
127
+ }
128
+ }
129
+ return blocks;
130
+ }
131
+ //# sourceMappingURL=merger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merger.js","sourceRoot":"","sources":["../../src/core/merger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACnG,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAA4B,EAC5B,MAAqB;IAErB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAEzE,gCAAgC;IAChC,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE/D,IAAI,aAAa,EAAE,CAAC;QAClB,kCAAkC;QAClC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,OAAO,CAAC,WAAW,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,mCAAmC;QACnC,OAAO,CAAC,kBAAkB,EAAE,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAA4B,EAC5B,QAAgB;IAEhB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAExE,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAEjE,IAAI,aAAa,EAAE,CAAC;QAClB,kCAAkC;QAClC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,OAAO,CAAC,WAAW,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,mCAAmC;QACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAA4B,EAC5B,MAAc;IAEd,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAEtE,MAAM,gBAAgB,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE3D,IAAI,WAAW,EAAE,CAAC;QAChB,gCAAgC;QAChC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,OAAO,CAAC,WAAW,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,iCAAiC;QACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAA4B,EAC5B,MAAqB,EACrB,WAAoB;IAEpB,uDAAuD;IACvD,MAAM,cAAc,GAAG,oBAAoB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC;IAElF,IAAI,cAAc,IAAI,WAAW,EAAE,CAAC;QAClC,qDAAqD;QACrD,MAAM,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAE9D,iDAAiD;QACjD,uDAAuD;QACvD,OAAO,MAAM,6BAA6B,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClE,CAAC;IAED,4EAA4E;IAC5E,IAAI,OAAO,GAAG,QAAQ,CAAC,OAAQ,CAAC;IAChC,IAAI,eAAe,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAEtC,yBAAyB;IACzB,OAAO,GAAG,MAAM,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAErD,sCAAsC;IACtC,eAAe,GAAG;QAChB,GAAG,eAAe;QAClB,OAAO;QACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;KAC7B,CAAC;IAEF,uEAAuE;IACvE,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,WAAW,EAAE,CAAC;QAC5C,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACjE,OAAO,MAAM,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC1D,CAAC;IAED,0CAA0C;IAC1C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,OAAO,GAAG,MAAM,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAE9D,sCAAsC;QACtC,eAAe,GAAG;YAChB,GAAG,eAAe;YAClB,OAAO;YACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;SAC7B,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAE1D,sCAAsC;QACtC,eAAe,GAAG;YAChB,GAAG,eAAe;YAClB,OAAO;YACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;SAC7B,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kCAAkC;AAClC,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,YAAY,GAAkE,IAAI,CAAC;IAEvF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAE1D,IAAI,UAAU,EAAE,CAAC;YACf,YAAY,GAAG;gBACb,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;gBACnB,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,CAAC,IAAI,CAAC;aAChB,CAAC;QACJ,CAAC;aAAM,IAAI,QAAQ,IAAI,YAAY,EAAE,CAAC;YACpC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,YAAY,CAAC,IAAI;gBACvB,SAAS,EAAE,YAAY,CAAC,SAAS;gBACjC,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;aACzC,CAAC,CAAC;YACH,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ExistingAgentsInfo, ProjectConfig } from '../types.js';
2
+ /**
3
+ * Detect if AGENTS.md contains embedded templates (legacy mode)
4
+ */
5
+ export declare function hasEmbeddedTemplates(existing: ExistingAgentsInfo): boolean;
6
+ /**
7
+ * Extract embedded template content and write to /rulebook/ directory
8
+ */
9
+ export declare function migrateEmbeddedTemplates(existing: ExistingAgentsInfo, config: ProjectConfig, projectRoot: string): Promise<{
10
+ extractedLanguages: string[];
11
+ extractedModules: string[];
12
+ extractedFrameworks: string[];
13
+ }>;
14
+ /**
15
+ * Replace embedded templates with references in AGENTS.md
16
+ * Uses generateModularAgents to ensure consistent format
17
+ */
18
+ export declare function replaceEmbeddedWithReferences(config: ProjectConfig, projectRoot: string): Promise<string>;
19
+ //# sourceMappingURL=migrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/core/migrator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQrE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAoB1E;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B,CAAC,CA4ED;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAIjB"}
@@ -0,0 +1,102 @@
1
+ import path from 'path';
2
+ import { writeFile, ensureDir } from '../utils/file-system.js';
3
+ import { generateLanguageRules, generateModuleRules, generateFrameworkRules, generateModularAgents, } from './generator.js';
4
+ /**
5
+ * Detect if AGENTS.md contains embedded templates (legacy mode)
6
+ */
7
+ export function hasEmbeddedTemplates(existing) {
8
+ if (!existing.content)
9
+ return false;
10
+ // Check for embedded language blocks (e.g., <!-- TYPESCRIPT:START -->)
11
+ const embeddedLanguagePattern = /<!--\s*(TYPESCRIPT|RUST|PYTHON|JAVASCRIPT|GO|JAVA|ELIXIR|CSHARP|PHP|SWIFT|KOTLIN|CPP|C|SOLIDITY|ZIG|ERLANG|DART|RUBY|SCALA|R|HASKELL|JULIA|LUA|ADA|SAS|LISP|OBJECTIVEC|SQL):START\s*-->/i;
12
+ // Check for embedded module blocks (e.g., <!-- OPENSPEC:START -->)
13
+ const embeddedModulePattern = /<!--\s*(VECTORIZER|SYNAP|CONTEXT7|GITHUB|PLAYWRIGHT|SUPABASE|NOTION|ATLASSIAN|SERENA|FIGMA|GRAFANA|AGENT_AUTOMATION):START\s*-->/i;
14
+ // Check for embedded framework blocks (e.g., <!-- REACT:START -->)
15
+ const embeddedFrameworkPattern = /<!--\s*(NESTJS|SPRING|LARAVEL|ANGULAR|REACT|VUE|NUXT|NEXTJS|DJANGO|RAILS|FLASK|SYMFONY|ZEND|JQUERY|REACTNATIVE|FLUTTER|ELECTRON):START\s*-->/i;
16
+ return (embeddedLanguagePattern.test(existing.content) ||
17
+ embeddedModulePattern.test(existing.content) ||
18
+ embeddedFrameworkPattern.test(existing.content));
19
+ }
20
+ /**
21
+ * Extract embedded template content and write to /rulebook/ directory
22
+ */
23
+ export async function migrateEmbeddedTemplates(existing, config, projectRoot) {
24
+ const rulebookDir = config.rulebookDir || 'rulebook';
25
+ const rulebookPath = path.join(projectRoot, rulebookDir);
26
+ await ensureDir(rulebookPath);
27
+ // Note: If files already exist, they will be overwritten
28
+ // This is intentional for migration - existing modular files take precedence
29
+ const extractedLanguages = [];
30
+ const extractedModules = [];
31
+ const extractedFrameworks = [];
32
+ if (!existing.content) {
33
+ return { extractedLanguages, extractedModules, extractedFrameworks };
34
+ }
35
+ // Extract language blocks
36
+ for (const language of config.languages) {
37
+ const blockName = language.toUpperCase();
38
+ const languageBlock = existing.blocks.find((b) => b.name === blockName);
39
+ if (languageBlock && languageBlock.content) {
40
+ // Write extracted content to /rulebook/[LANG].md
41
+ const filePath = path.join(rulebookPath, `${blockName}.md`);
42
+ await writeFile(filePath, languageBlock.content);
43
+ extractedLanguages.push(language);
44
+ }
45
+ else {
46
+ // Generate new template if not found
47
+ const langRules = await generateLanguageRules(language);
48
+ const filePath = path.join(rulebookPath, `${blockName}.md`);
49
+ await writeFile(filePath, langRules);
50
+ extractedLanguages.push(language);
51
+ }
52
+ }
53
+ // Extract module blocks
54
+ for (const module of config.modules) {
55
+ const blockName = module.toUpperCase();
56
+ const moduleBlock = existing.blocks.find((b) => b.name === blockName);
57
+ if (moduleBlock && moduleBlock.content) {
58
+ // Write extracted content to /rulebook/[MODULE].md
59
+ const filePath = path.join(rulebookPath, `${blockName}.md`);
60
+ await writeFile(filePath, moduleBlock.content);
61
+ extractedModules.push(module);
62
+ }
63
+ else {
64
+ // Generate new template if not found
65
+ const moduleRules = await generateModuleRules(module);
66
+ const filePath = path.join(rulebookPath, `${blockName}.md`);
67
+ await writeFile(filePath, moduleRules);
68
+ extractedModules.push(module);
69
+ }
70
+ }
71
+ // Extract framework blocks
72
+ if (config.frameworks) {
73
+ for (const framework of config.frameworks) {
74
+ const blockName = framework.toUpperCase();
75
+ const frameworkBlock = existing.blocks.find((b) => b.name === blockName);
76
+ if (frameworkBlock && frameworkBlock.content) {
77
+ // Write extracted content to /rulebook/[FRAMEWORK].md
78
+ const filePath = path.join(rulebookPath, `${blockName}.md`);
79
+ await writeFile(filePath, frameworkBlock.content);
80
+ extractedFrameworks.push(framework);
81
+ }
82
+ else {
83
+ // Generate new template if not found
84
+ const frameworkRules = await generateFrameworkRules(framework);
85
+ const filePath = path.join(rulebookPath, `${blockName}.md`);
86
+ await writeFile(filePath, frameworkRules);
87
+ extractedFrameworks.push(framework);
88
+ }
89
+ }
90
+ }
91
+ return { extractedLanguages, extractedModules, extractedFrameworks };
92
+ }
93
+ /**
94
+ * Replace embedded templates with references in AGENTS.md
95
+ * Uses generateModularAgents to ensure consistent format
96
+ */
97
+ export async function replaceEmbeddedWithReferences(config, projectRoot) {
98
+ // Use generateModularAgents to get the proper format with references
99
+ // This ensures consistency and handles all the reference generation
100
+ return await generateModularAgents(config, projectRoot);
101
+ }
102
+ //# sourceMappingURL=migrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrator.js","sourceRoot":"","sources":["../../src/core/migrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface MinimalScaffoldOptions {
2
+ projectName?: string;
3
+ description?: string;
4
+ license?: string;
5
+ }
6
+ export declare function scaffoldMinimalProject(projectDir: string, options?: MinimalScaffoldOptions): Promise<string[]>;
7
+ export {};
8
+ //# sourceMappingURL=minimal-scaffolder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimal-scaffolder.d.ts","sourceRoot":"","sources":["../../src/core/minimal-scaffolder.ts"],"names":[],"mappings":"AAIA,UAAU,sBAAsB;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,MAAM,EAAE,CAAC,CAwDnB"}
@@ -0,0 +1,51 @@
1
+ import path from 'path';
2
+ import { ensureDir, fileExists, writeFile } from '../utils/file-system.js';
3
+ import { generateDocsStructure } from './docs-generator.js';
4
+ export async function scaffoldMinimalProject(projectDir, options = {}) {
5
+ const generated = [];
6
+ const projectName = options.projectName || path.basename(projectDir);
7
+ const description = options.description || `${projectName} project bootstrapped with Rulebook minimal mode.`;
8
+ const licenseName = options.license || 'MIT';
9
+ // Generate concise docs structure and root README (minimal mode)
10
+ const docsFiles = await generateDocsStructure({
11
+ projectName,
12
+ description,
13
+ author: 'Project Team',
14
+ license: licenseName,
15
+ }, projectDir, 'minimal');
16
+ generated.push(...docsFiles);
17
+ // Ensure LICENSE exists (Apache-2.0 by default)
18
+ const licensePath = path.join(projectDir, 'LICENSE');
19
+ if (!(await fileExists(licensePath))) {
20
+ const licenseContent = `Apache License
21
+ Version 2.0, January 2004
22
+ http://www.apache.org/licenses/
23
+
24
+ Copyright ${new Date().getFullYear()} ${projectName}
25
+
26
+ Licensed under the Apache License, Version 2.0 (the "License");
27
+ you may not use this file except in compliance with the License.
28
+ You may obtain a copy of the License at
29
+
30
+ http://www.apache.org/licenses/LICENSE-2.0
31
+
32
+ Unless required by applicable law or agreed to in writing, software
33
+ distributed under the License is distributed on an "AS IS" BASIS,
34
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
35
+ See the License for the specific language governing permissions and
36
+ limitations under the License.
37
+ `;
38
+ await writeFile(licensePath, licenseContent);
39
+ generated.push(licensePath);
40
+ }
41
+ // Ensure tests directory exists with placeholder
42
+ const testsDir = path.join(projectDir, 'tests');
43
+ await ensureDir(testsDir);
44
+ const placeholderTest = path.join(testsDir, '.gitkeep');
45
+ if (!(await fileExists(placeholderTest))) {
46
+ await writeFile(placeholderTest, '');
47
+ generated.push(placeholderTest);
48
+ }
49
+ return Array.from(new Set(generated));
50
+ }
51
+ //# sourceMappingURL=minimal-scaffolder.js.map