@hivehub/rulebook 5.5.1 → 5.7.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 (342) hide show
  1. package/.claude/commands/rulebook-learn-capture.md +41 -48
  2. package/.claude/commands/rulebook-learn-list.md +13 -13
  3. package/README.md +332 -394
  4. package/dist/cli/commands/context-intelligence.d.ts +0 -1
  5. package/dist/cli/commands/context-intelligence.d.ts.map +1 -1
  6. package/dist/cli/commands/context-intelligence.js +12 -33
  7. package/dist/cli/commands/context-intelligence.js.map +1 -1
  8. package/dist/cli/commands/index.d.ts +4 -7
  9. package/dist/cli/commands/index.d.ts.map +1 -1
  10. package/dist/cli/commands/index.js +4 -7
  11. package/dist/cli/commands/index.js.map +1 -1
  12. package/dist/cli/commands/init.d.ts.map +1 -1
  13. package/dist/cli/commands/init.js +40 -81
  14. package/dist/cli/commands/init.js.map +1 -1
  15. package/dist/cli/commands/mcp.d.ts +0 -1
  16. package/dist/cli/commands/mcp.d.ts.map +1 -1
  17. package/dist/cli/commands/mcp.js +1 -7
  18. package/dist/cli/commands/mcp.js.map +1 -1
  19. package/dist/cli/commands/memory.d.ts +7 -1
  20. package/dist/cli/commands/memory.d.ts.map +1 -1
  21. package/dist/cli/commands/memory.js +51 -57
  22. package/dist/cli/commands/memory.js.map +1 -1
  23. package/dist/cli/commands/misc.d.ts +1 -15
  24. package/dist/cli/commands/misc.d.ts.map +1 -1
  25. package/dist/cli/commands/misc.js +36 -215
  26. package/dist/cli/commands/misc.js.map +1 -1
  27. package/dist/cli/commands/plans.d.ts +0 -6
  28. package/dist/cli/commands/plans.d.ts.map +1 -1
  29. package/dist/cli/commands/plans.js +9 -77
  30. package/dist/cli/commands/plans.js.map +1 -1
  31. package/dist/cli/commands/skills.js +6 -6
  32. package/dist/cli/commands/skills.js.map +1 -1
  33. package/dist/cli/commands/task.js +4 -4
  34. package/dist/cli/commands/task.js.map +1 -1
  35. package/dist/cli/commands/update.d.ts.map +1 -1
  36. package/dist/cli/commands/update.js +122 -52
  37. package/dist/cli/commands/update.js.map +1 -1
  38. package/dist/cli/prompts.d.ts.map +1 -1
  39. package/dist/cli/prompts.js +1 -78
  40. package/dist/cli/prompts.js.map +1 -1
  41. package/dist/core/claude/claude-mcp.d.ts +59 -0
  42. package/dist/core/claude/claude-mcp.d.ts.map +1 -0
  43. package/dist/core/claude/claude-mcp.js +220 -0
  44. package/dist/core/claude/claude-mcp.js.map +1 -0
  45. package/dist/core/claude/claude-md-generator.d.ts +52 -0
  46. package/dist/core/claude/claude-md-generator.d.ts.map +1 -0
  47. package/dist/core/claude/claude-md-generator.js +104 -0
  48. package/dist/core/claude/claude-md-generator.js.map +1 -0
  49. package/dist/core/claude/claude-settings-manager.d.ts +44 -0
  50. package/dist/core/claude/claude-settings-manager.d.ts.map +1 -0
  51. package/dist/core/claude/claude-settings-manager.js +194 -0
  52. package/dist/core/claude/claude-settings-manager.js.map +1 -0
  53. package/dist/core/claude-settings-manager.d.ts.map +1 -1
  54. package/dist/core/claude-settings-manager.js +9 -3
  55. package/dist/core/claude-settings-manager.js.map +1 -1
  56. package/dist/core/console/cli-bridge.d.ts +113 -0
  57. package/dist/core/console/cli-bridge.d.ts.map +1 -0
  58. package/dist/core/console/cli-bridge.js +1094 -0
  59. package/dist/core/console/cli-bridge.js.map +1 -0
  60. package/dist/core/detect/detector.d.ts +35 -0
  61. package/dist/core/detect/detector.d.ts.map +1 -0
  62. package/dist/core/detect/detector.js +541 -0
  63. package/dist/core/detect/detector.js.map +1 -0
  64. package/dist/core/docs/docs-generator.d.ts +9 -0
  65. package/dist/core/docs/docs-generator.d.ts.map +1 -0
  66. package/dist/core/docs/docs-generator.js +531 -0
  67. package/dist/core/docs/docs-generator.js.map +1 -0
  68. package/dist/core/docs/mcp-reference-generator.d.ts +13 -0
  69. package/dist/core/docs/mcp-reference-generator.d.ts.map +1 -0
  70. package/dist/core/docs/mcp-reference-generator.js +66 -0
  71. package/dist/core/docs/mcp-reference-generator.js.map +1 -0
  72. package/dist/core/generators/generator.d.ts +54 -0
  73. package/dist/core/generators/generator.d.ts.map +1 -0
  74. package/dist/core/generators/generator.js +1041 -0
  75. package/dist/core/generators/generator.js.map +1 -0
  76. package/dist/core/generators/gitignore-generator.d.ts +13 -0
  77. package/dist/core/generators/gitignore-generator.d.ts.map +1 -0
  78. package/dist/core/generators/gitignore-generator.js +307 -0
  79. package/dist/core/generators/gitignore-generator.js.map +1 -0
  80. package/dist/core/generators/minimal-scaffolder.d.ts +8 -0
  81. package/dist/core/generators/minimal-scaffolder.d.ts.map +1 -0
  82. package/dist/core/generators/minimal-scaffolder.js +51 -0
  83. package/dist/core/generators/minimal-scaffolder.js.map +1 -0
  84. package/dist/core/generators/rules-generator.d.ts +73 -0
  85. package/dist/core/generators/rules-generator.d.ts.map +1 -0
  86. package/dist/core/generators/rules-generator.js +202 -0
  87. package/dist/core/generators/rules-generator.js.map +1 -0
  88. package/dist/core/generators/workflow-generator.d.ts +15 -0
  89. package/dist/core/generators/workflow-generator.d.ts.map +1 -0
  90. package/dist/core/generators/workflow-generator.js +390 -0
  91. package/dist/core/generators/workflow-generator.js.map +1 -0
  92. package/dist/core/ide/multi-tool-generator.d.ts +59 -0
  93. package/dist/core/ide/multi-tool-generator.d.ts.map +1 -0
  94. package/dist/core/ide/multi-tool-generator.js +157 -0
  95. package/dist/core/ide/multi-tool-generator.js.map +1 -0
  96. package/dist/core/ide/opencode-generator.d.ts +72 -0
  97. package/dist/core/ide/opencode-generator.d.ts.map +1 -0
  98. package/dist/core/ide/opencode-generator.js +450 -0
  99. package/dist/core/ide/opencode-generator.js.map +1 -0
  100. package/dist/core/merger.d.ts +1 -1
  101. package/dist/core/merger.d.ts.map +1 -1
  102. package/dist/core/merger.js +5 -5
  103. package/dist/core/merger.js.map +1 -1
  104. package/dist/core/migrator.d.ts +0 -1
  105. package/dist/core/migrator.d.ts.map +1 -1
  106. package/dist/core/migrator.js +4 -29
  107. package/dist/core/migrator.js.map +1 -1
  108. package/dist/core/quality/coverage-checker.d.ts +14 -0
  109. package/dist/core/quality/coverage-checker.d.ts.map +1 -0
  110. package/dist/core/quality/coverage-checker.js +176 -0
  111. package/dist/core/quality/coverage-checker.js.map +1 -0
  112. package/dist/core/quality/dependency-checker.d.ts +21 -0
  113. package/dist/core/quality/dependency-checker.d.ts.map +1 -0
  114. package/dist/core/quality/dependency-checker.js +247 -0
  115. package/dist/core/quality/dependency-checker.js.map +1 -0
  116. package/dist/core/quality/doctor.d.ts +19 -0
  117. package/dist/core/quality/doctor.d.ts.map +1 -0
  118. package/dist/core/quality/doctor.js +163 -0
  119. package/dist/core/quality/doctor.js.map +1 -0
  120. package/dist/core/quality/validator.d.ts +21 -0
  121. package/dist/core/quality/validator.d.ts.map +1 -0
  122. package/dist/core/quality/validator.js +177 -0
  123. package/dist/core/quality/validator.js.map +1 -0
  124. package/dist/core/ralph-scripts.d.ts.map +1 -1
  125. package/dist/core/ralph-scripts.js +7 -6
  126. package/dist/core/ralph-scripts.js.map +1 -1
  127. package/dist/core/skills/skills-manager.d.ts +126 -0
  128. package/dist/core/skills/skills-manager.d.ts.map +1 -0
  129. package/dist/core/skills/skills-manager.js +630 -0
  130. package/dist/core/skills/skills-manager.js.map +1 -0
  131. package/dist/core/state/config-manager.d.ts +86 -0
  132. package/dist/core/state/config-manager.d.ts.map +1 -0
  133. package/dist/core/state/config-manager.js +562 -0
  134. package/dist/core/state/config-manager.js.map +1 -0
  135. package/dist/core/state/override-manager.d.ts +23 -0
  136. package/dist/core/state/override-manager.d.ts.map +1 -0
  137. package/dist/core/state/override-manager.js +82 -0
  138. package/dist/core/state/override-manager.js.map +1 -0
  139. package/dist/core/state/state-writer.d.ts +34 -0
  140. package/dist/core/state/state-writer.d.ts.map +1 -0
  141. package/dist/core/state/state-writer.js +78 -0
  142. package/dist/core/state/state-writer.js.map +1 -0
  143. package/dist/core/state/version-bumper.d.ts +19 -0
  144. package/dist/core/state/version-bumper.d.ts.map +1 -0
  145. package/dist/core/state/version-bumper.js +180 -0
  146. package/dist/core/state/version-bumper.js.map +1 -0
  147. package/dist/core/tasks/decision-manager.d.ts +25 -0
  148. package/dist/core/tasks/decision-manager.d.ts.map +1 -0
  149. package/dist/core/tasks/decision-manager.js +183 -0
  150. package/dist/core/tasks/decision-manager.js.map +1 -0
  151. package/dist/core/tasks/knowledge-manager.d.ts +24 -0
  152. package/dist/core/tasks/knowledge-manager.d.ts.map +1 -0
  153. package/dist/core/tasks/knowledge-manager.js +173 -0
  154. package/dist/core/tasks/knowledge-manager.js.map +1 -0
  155. package/dist/core/tasks/learn-manager.d.ts +27 -0
  156. package/dist/core/tasks/learn-manager.d.ts.map +1 -0
  157. package/dist/core/tasks/learn-manager.js +121 -0
  158. package/dist/core/tasks/learn-manager.js.map +1 -0
  159. package/dist/core/tasks/plans-manager.d.ts +46 -0
  160. package/dist/core/tasks/plans-manager.d.ts.map +1 -0
  161. package/dist/core/tasks/plans-manager.js +158 -0
  162. package/dist/core/tasks/plans-manager.js.map +1 -0
  163. package/dist/core/tasks/task-manager.d.ts +127 -0
  164. package/dist/core/tasks/task-manager.d.ts.map +1 -0
  165. package/dist/core/tasks/task-manager.js +607 -0
  166. package/dist/core/tasks/task-manager.js.map +1 -0
  167. package/dist/core/workspace/project-worker.d.ts +6 -6
  168. package/dist/core/workspace/project-worker.d.ts.map +1 -1
  169. package/dist/core/workspace/project-worker.js +6 -6
  170. package/dist/core/workspace/project-worker.js.map +1 -1
  171. package/dist/index.d.ts +1 -1
  172. package/dist/index.d.ts.map +1 -1
  173. package/dist/index.js +19 -176
  174. package/dist/index.js.map +1 -1
  175. package/dist/mcp/rulebook-server.d.ts.map +1 -1
  176. package/dist/mcp/rulebook-server.js +16 -960
  177. package/dist/mcp/rulebook-server.js.map +1 -1
  178. package/dist/memory/file-search.d.ts +43 -0
  179. package/dist/memory/file-search.d.ts.map +1 -0
  180. package/dist/memory/file-search.js +228 -0
  181. package/dist/memory/file-search.js.map +1 -0
  182. package/dist/memory/file-store.d.ts +99 -0
  183. package/dist/memory/file-store.d.ts.map +1 -0
  184. package/dist/memory/file-store.js +615 -0
  185. package/dist/memory/file-store.js.map +1 -0
  186. package/dist/memory/legacy-migrator.d.ts +27 -0
  187. package/dist/memory/legacy-migrator.d.ts.map +1 -0
  188. package/dist/memory/legacy-migrator.js +185 -0
  189. package/dist/memory/legacy-migrator.js.map +1 -0
  190. package/dist/memory/memory-manager.d.ts +25 -24
  191. package/dist/memory/memory-manager.d.ts.map +1 -1
  192. package/dist/memory/memory-manager.js +97 -140
  193. package/dist/memory/memory-manager.js.map +1 -1
  194. package/dist/memory/memory-types.d.ts +1 -1
  195. package/dist/memory/memory-types.d.ts.map +1 -1
  196. package/dist/types.d.ts +8 -119
  197. package/dist/types.d.ts.map +1 -1
  198. package/dist/utils/file-system.d.ts +22 -0
  199. package/dist/utils/file-system.d.ts.map +1 -1
  200. package/dist/utils/file-system.js +31 -0
  201. package/dist/utils/file-system.js.map +1 -1
  202. package/dist/utils/git-hooks.d.ts.map +1 -1
  203. package/dist/utils/git-hooks.js +3 -2
  204. package/dist/utils/git-hooks.js.map +1 -1
  205. package/package.json +2 -6
  206. package/templates/agents/context-intelligence.md +50 -52
  207. package/templates/cli/OPENCODE.md +85 -18
  208. package/templates/commands/rulebook-learn-capture.md +41 -48
  209. package/templates/commands/rulebook-learn-list.md +13 -13
  210. package/templates/core/AGENTS_LEAN.md +0 -14
  211. package/templates/hooks/check-context-and-handoff.sh +74 -76
  212. package/templates/hooks/enforce-pre-tool.sh +70 -0
  213. package/templates/hooks/enforce-team-for-background-agents.sh +55 -55
  214. package/templates/hooks/on-compact-reinject.sh +34 -34
  215. package/templates/hooks/resume-from-handoff.sh +61 -61
  216. package/templates/hooks/terse-activate.sh +197 -197
  217. package/templates/hooks/terse-mode-tracker.sh +190 -187
  218. package/templates/ides/OPENCODE.md +63 -0
  219. package/templates/skills/cli/opencode/SKILL.md +82 -28
  220. package/.claude/commands/ralph-config.md +0 -112
  221. package/.claude/commands/ralph-history.md +0 -110
  222. package/.claude/commands/ralph-init.md +0 -72
  223. package/.claude/commands/ralph-pause-resume.md +0 -105
  224. package/.claude/commands/ralph-run.md +0 -101
  225. package/.claude/commands/ralph-status.md +0 -76
  226. package/templates/core/RALPH.md +0 -471
  227. package/templates/frameworks/ANGULAR.md +0 -36
  228. package/templates/frameworks/DJANGO.md +0 -83
  229. package/templates/frameworks/ELECTRON.md +0 -147
  230. package/templates/frameworks/FLASK.md +0 -38
  231. package/templates/frameworks/FLUTTER.md +0 -55
  232. package/templates/frameworks/JQUERY.md +0 -32
  233. package/templates/frameworks/LARAVEL.md +0 -38
  234. package/templates/frameworks/NESTJS.md +0 -43
  235. package/templates/frameworks/NEXTJS.md +0 -127
  236. package/templates/frameworks/NUXT.md +0 -40
  237. package/templates/frameworks/RAILS.md +0 -66
  238. package/templates/frameworks/REACT.md +0 -38
  239. package/templates/frameworks/REACT_NATIVE.md +0 -47
  240. package/templates/frameworks/SPRING.md +0 -39
  241. package/templates/frameworks/SYMFONY.md +0 -36
  242. package/templates/frameworks/VUE.md +0 -36
  243. package/templates/frameworks/ZEND.md +0 -35
  244. package/templates/hooks/enforce-mcp-for-tasks.sh +0 -31
  245. package/templates/hooks/enforce-no-deferred.sh +0 -21
  246. package/templates/hooks/enforce-no-shortcuts.sh +0 -31
  247. package/templates/ides/COPILOT.md +0 -37
  248. package/templates/ides/CURSOR.md +0 -43
  249. package/templates/ides/JETBRAINS_AI.md +0 -35
  250. package/templates/ides/REPLIT.md +0 -36
  251. package/templates/ides/TABNINE.md +0 -29
  252. package/templates/ides/VSCODE.md +0 -40
  253. package/templates/ides/WINDSURF.md +0 -36
  254. package/templates/ides/ZED.md +0 -32
  255. package/templates/ides/cursor-mdc/go.mdc +0 -24
  256. package/templates/ides/cursor-mdc/python.mdc +0 -24
  257. package/templates/ides/cursor-mdc/quality.mdc +0 -25
  258. package/templates/ides/cursor-mdc/ralph.mdc +0 -39
  259. package/templates/ides/cursor-mdc/rulebook.mdc +0 -38
  260. package/templates/ides/cursor-mdc/rust.mdc +0 -24
  261. package/templates/ides/cursor-mdc/typescript.mdc +0 -25
  262. package/templates/ralph/ralph-history.bat +0 -4
  263. package/templates/ralph/ralph-history.sh +0 -5
  264. package/templates/ralph/ralph-init.bat +0 -5
  265. package/templates/ralph/ralph-init.sh +0 -5
  266. package/templates/ralph/ralph-pause.bat +0 -5
  267. package/templates/ralph/ralph-pause.sh +0 -5
  268. package/templates/ralph/ralph-run.bat +0 -5
  269. package/templates/ralph/ralph-run.sh +0 -5
  270. package/templates/ralph/ralph-status.bat +0 -4
  271. package/templates/ralph/ralph-status.sh +0 -5
  272. package/templates/services/AZURE_BLOB.md +0 -184
  273. package/templates/services/CASSANDRA.md +0 -239
  274. package/templates/services/DATADOG.md +0 -26
  275. package/templates/services/DOCKER.md +0 -124
  276. package/templates/services/DOCKER_COMPOSE.md +0 -168
  277. package/templates/services/DYNAMODB.md +0 -308
  278. package/templates/services/ELASTICSEARCH.md +0 -347
  279. package/templates/services/GCS.md +0 -178
  280. package/templates/services/HELM.md +0 -194
  281. package/templates/services/INFLUXDB.md +0 -265
  282. package/templates/services/KAFKA.md +0 -341
  283. package/templates/services/KUBERNETES.md +0 -208
  284. package/templates/services/MARIADB.md +0 -183
  285. package/templates/services/MEMCACHED.md +0 -242
  286. package/templates/services/MINIO.md +0 -201
  287. package/templates/services/MONGODB.md +0 -268
  288. package/templates/services/MYSQL.md +0 -358
  289. package/templates/services/NEO4J.md +0 -247
  290. package/templates/services/OPENTELEMETRY.md +0 -25
  291. package/templates/services/ORACLE.md +0 -290
  292. package/templates/services/PINO.md +0 -24
  293. package/templates/services/POSTGRESQL.md +0 -326
  294. package/templates/services/PROMETHEUS.md +0 -33
  295. package/templates/services/RABBITMQ.md +0 -286
  296. package/templates/services/REDIS.md +0 -292
  297. package/templates/services/S3.md +0 -298
  298. package/templates/services/SENTRY.md +0 -23
  299. package/templates/services/SQLITE.md +0 -294
  300. package/templates/services/SQLSERVER.md +0 -294
  301. package/templates/services/WINSTON.md +0 -30
  302. package/templates/skills/frameworks/angular/SKILL.md +0 -46
  303. package/templates/skills/frameworks/django/SKILL.md +0 -93
  304. package/templates/skills/frameworks/electron/SKILL.md +0 -157
  305. package/templates/skills/frameworks/flask/SKILL.md +0 -48
  306. package/templates/skills/frameworks/flutter/SKILL.md +0 -65
  307. package/templates/skills/frameworks/jquery/SKILL.md +0 -42
  308. package/templates/skills/frameworks/laravel/SKILL.md +0 -48
  309. package/templates/skills/frameworks/nestjs/SKILL.md +0 -53
  310. package/templates/skills/frameworks/nextjs/SKILL.md +0 -137
  311. package/templates/skills/frameworks/nuxt/SKILL.md +0 -50
  312. package/templates/skills/frameworks/rails/SKILL.md +0 -76
  313. package/templates/skills/frameworks/react/SKILL.md +0 -48
  314. package/templates/skills/frameworks/react-native/SKILL.md +0 -57
  315. package/templates/skills/frameworks/spring/SKILL.md +0 -49
  316. package/templates/skills/frameworks/symfony/SKILL.md +0 -46
  317. package/templates/skills/frameworks/vue/SKILL.md +0 -46
  318. package/templates/skills/frameworks/zend/SKILL.md +0 -45
  319. package/templates/skills/services/azure-blob/SKILL.md +0 -194
  320. package/templates/skills/services/cassandra/SKILL.md +0 -249
  321. package/templates/skills/services/dynamodb/SKILL.md +0 -318
  322. package/templates/skills/services/elasticsearch/SKILL.md +0 -357
  323. package/templates/skills/services/gcs/SKILL.md +0 -188
  324. package/templates/skills/services/influxdb/SKILL.md +0 -275
  325. package/templates/skills/services/kafka/SKILL.md +0 -351
  326. package/templates/skills/services/mariadb/SKILL.md +0 -193
  327. package/templates/skills/services/memcached/SKILL.md +0 -252
  328. package/templates/skills/services/minio/SKILL.md +0 -211
  329. package/templates/skills/services/mongodb/SKILL.md +0 -278
  330. package/templates/skills/services/mysql/SKILL.md +0 -368
  331. package/templates/skills/services/neo4j/SKILL.md +0 -257
  332. package/templates/skills/services/oracle/SKILL.md +0 -300
  333. package/templates/skills/services/postgresql/SKILL.md +0 -336
  334. package/templates/skills/services/rabbitmq/SKILL.md +0 -296
  335. package/templates/skills/services/redis/SKILL.md +0 -302
  336. package/templates/skills/services/s3/SKILL.md +0 -308
  337. package/templates/skills/services/sqlite/SKILL.md +0 -304
  338. package/templates/skills/services/sqlserver/SKILL.md +0 -304
  339. package/templates/skills/workflows/ralph/SETUP.md +0 -228
  340. package/templates/skills/workflows/ralph/SKILL.md +0 -309
  341. package/templates/skills/workflows/ralph/install.sh +0 -87
  342. package/templates/skills/workflows/ralph/manifest.json +0 -158
@@ -0,0 +1,202 @@
1
+ import path from 'path';
2
+ import { readFile, writeFile, fileExists, ensureDir } from '../../utils/file-system.js';
3
+ import { getTemplatesDir } from './generator.js';
4
+ /**
5
+ * v5.3.0 `.claude/rules/` generator.
6
+ *
7
+ * For every detected language that rulebook ships a template for, emit
8
+ * `.claude/rules/<language>.md` with YAML `paths:` frontmatter. These are
9
+ * Anthropic's path-scoped rules (loaded only when Claude reads a file
10
+ * matching the glob), so they cost zero context budget outside of the
11
+ * relevant file types.
12
+ *
13
+ * Files generated by rulebook carry a sentinel comment immediately after
14
+ * the frontmatter. On `rulebook update`, any `.claude/rules/*.md` without
15
+ * the sentinel is treated as user-authored and left alone. This lets users
16
+ * adopt a generated rule file as their own by simply deleting the sentinel
17
+ * comment line.
18
+ */
19
+ export const RULES_DIR = '.claude/rules';
20
+ export const GENERATED_SENTINEL = 'Generated by @hivehub/rulebook v5.3.0';
21
+ /**
22
+ * Languages with shipped rule templates. Adding a new entry here requires a
23
+ * matching `templates/rules/<slug>.md` file.
24
+ */
25
+ export const SUPPORTED_RULE_LANGUAGES = [
26
+ 'typescript',
27
+ 'javascript',
28
+ 'rust',
29
+ 'python',
30
+ 'go',
31
+ 'cpp',
32
+ 'java',
33
+ 'csharp',
34
+ ];
35
+ /**
36
+ * Generic (non-language) rules shipped by rulebook v5.3.0.
37
+ * These are always emitted regardless of detection result.
38
+ */
39
+ export const ALWAYS_ON_RULES = [
40
+ 'full-task-no-questions',
41
+ 'multi-agent-teams',
42
+ 'consult-analysis-before-implementing',
43
+ 'respect-handoff-trigger',
44
+ 'diagnostic-first',
45
+ 'fail-twice-escalate',
46
+ ];
47
+ /**
48
+ * Detected languages from the `detector.ts` pipeline may use aliases
49
+ * (e.g. `"c"` — which rulebook treats as C/C++ and routes to the `cpp`
50
+ * template). Map them here.
51
+ */
52
+ const LANGUAGE_ALIASES = {
53
+ c: 'cpp',
54
+ 'c++': 'cpp',
55
+ cs: 'csharp',
56
+ 'c#': 'csharp',
57
+ ts: 'typescript',
58
+ js: 'javascript',
59
+ py: 'python',
60
+ rs: 'rust',
61
+ };
62
+ export function getRulesDir(projectRoot) {
63
+ return path.join(projectRoot, RULES_DIR);
64
+ }
65
+ export function getRulePath(projectRoot, language) {
66
+ return path.join(getRulesDir(projectRoot), `${language}.md`);
67
+ }
68
+ /**
69
+ * Normalize a detected language string to a supported rule template slug.
70
+ * Returns null if rulebook does not ship a template for it.
71
+ */
72
+ export function resolveRuleLanguage(detected) {
73
+ const lower = detected.toLowerCase().trim();
74
+ if (SUPPORTED_RULE_LANGUAGES.includes(lower)) {
75
+ return lower;
76
+ }
77
+ return LANGUAGE_ALIASES[lower] ?? null;
78
+ }
79
+ /**
80
+ * Read a language rule template from the package's `templates/rules/`
81
+ * directory.
82
+ */
83
+ export async function readRuleTemplate(language) {
84
+ const templatePath = path.join(getTemplatesDir(), 'rules', `${language}.md`);
85
+ if (!(await fileExists(templatePath))) {
86
+ throw new Error(`Rule template not found at ${templatePath}`);
87
+ }
88
+ return await readFile(templatePath);
89
+ }
90
+ /**
91
+ * Check whether an existing rule file was generated by rulebook. Returns
92
+ * true only if the canonical sentinel comment is present. User files that
93
+ * the user "adopted" by deleting the sentinel return false and are
94
+ * preserved across updates.
95
+ */
96
+ export function hasGeneratedSentinel(content) {
97
+ return content.includes(GENERATED_SENTINEL);
98
+ }
99
+ /**
100
+ * Generate `.claude/rules/<language>.md` for every detected language that
101
+ * has a shipped template. User-authored rules (no sentinel) are preserved.
102
+ */
103
+ export async function generateRules(projectRoot, detection) {
104
+ const rulesDir = getRulesDir(projectRoot);
105
+ await ensureDir(rulesDir);
106
+ const result = {
107
+ written: [],
108
+ preserved: [],
109
+ unsupported: [],
110
+ };
111
+ // Deduplicate: a project might detect both "typescript" and "javascript";
112
+ // we emit both rules since both apply. But if two detection entries map
113
+ // to the same template slug, only write once.
114
+ const seen = new Set();
115
+ for (const entry of detection.languages) {
116
+ const slug = resolveRuleLanguage(entry.language);
117
+ if (!slug) {
118
+ result.unsupported.push(entry.language);
119
+ continue;
120
+ }
121
+ if (seen.has(slug))
122
+ continue;
123
+ seen.add(slug);
124
+ const targetPath = getRulePath(projectRoot, slug);
125
+ if (await fileExists(targetPath)) {
126
+ const existing = await readFile(targetPath);
127
+ if (!hasGeneratedSentinel(existing)) {
128
+ // User-owned file — never touch it.
129
+ result.preserved.push(targetPath);
130
+ continue;
131
+ }
132
+ }
133
+ const template = await readRuleTemplate(slug);
134
+ await writeFile(targetPath, template);
135
+ result.written.push(targetPath);
136
+ }
137
+ // Always-on rules (not language-scoped) — emit if sentinel-based skip allows
138
+ for (const ruleName of ALWAYS_ON_RULES) {
139
+ const targetPath = path.join(rulesDir, `${ruleName}.md`);
140
+ if (await fileExists(targetPath)) {
141
+ const existing = await readFile(targetPath);
142
+ if (!hasGeneratedSentinel(existing)) {
143
+ result.preserved.push(targetPath);
144
+ continue;
145
+ }
146
+ }
147
+ const templatePath = path.join(getTemplatesDir(), 'rules', `${ruleName}.md`);
148
+ if (await fileExists(templatePath)) {
149
+ const template = await readFile(templatePath);
150
+ await writeFile(targetPath, template);
151
+ result.written.push(targetPath);
152
+ }
153
+ }
154
+ return result;
155
+ }
156
+ export async function listRulesWithSource(projectRoot) {
157
+ const rulesDir = getRulesDir(projectRoot);
158
+ if (!(await fileExists(rulesDir)))
159
+ return [];
160
+ const { promises: fs } = await import('fs');
161
+ const entries = await fs.readdir(rulesDir, { withFileTypes: true });
162
+ const results = [];
163
+ for (const entry of entries) {
164
+ if (!entry.isFile() || !entry.name.endsWith('.md'))
165
+ continue;
166
+ const filePath = path.join(rulesDir, entry.name);
167
+ const content = await readFile(filePath);
168
+ const source = hasGeneratedSentinel(content) ? 'generated' : 'user';
169
+ results.push({
170
+ name: entry.name.replace(/\.md$/, ''),
171
+ path: filePath,
172
+ source,
173
+ paths: extractPathsFrontmatter(content),
174
+ });
175
+ }
176
+ results.sort((a, b) => a.name.localeCompare(b.name));
177
+ return results;
178
+ }
179
+ /**
180
+ * Extract the `paths:` field from a YAML frontmatter block at the top of a
181
+ * markdown file. Returns null if no frontmatter or no `paths:` field.
182
+ * Intentionally simple — handles the exact shape the shipped templates use,
183
+ * not arbitrary YAML. Callers that need full YAML support should use a real
184
+ * parser.
185
+ */
186
+ function extractPathsFrontmatter(content) {
187
+ // Handle both LF and CRLF line endings (Windows writes CRLF)
188
+ const normalized = content.replace(/\r\n/g, '\n');
189
+ const match = normalized.match(/^---\n([\s\S]*?)\n---/);
190
+ if (!match)
191
+ return null;
192
+ const frontmatter = match[1];
193
+ const pathsMatch = frontmatter.match(/^paths:\s*\n((?:\s*-\s+.+\n?)+)/m);
194
+ if (!pathsMatch)
195
+ return null;
196
+ const lines = pathsMatch[1].split('\n').filter((l) => l.trim().startsWith('-'));
197
+ return lines.map((l) => l
198
+ .replace(/^\s*-\s+/, '')
199
+ .replace(/^["']|["']$/g, '')
200
+ .trim());
201
+ }
202
+ //# sourceMappingURL=rules-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-generator.js","sourceRoot":"","sources":["../../../src/core/generators/rules-generator.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAExF,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC;AACzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,uCAAuC,CAAC;AAE1E;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,YAAY;IACZ,YAAY;IACZ,MAAM;IACN,QAAQ;IACR,IAAI;IACJ,KAAK;IACL,MAAM;IACN,QAAQ;CACA,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,wBAAwB;IACxB,mBAAmB;IACnB,sCAAsC;IACtC,yBAAyB;IACzB,kBAAkB;IAClB,qBAAqB;CACb,CAAC;AAIX;;;;GAIG;AACH,MAAM,gBAAgB,GAA0C;IAC9D,CAAC,EAAE,KAAK;IACR,KAAK,EAAE,KAAK;IACZ,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;IACd,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,MAAM;CACX,CAAC;AAWF,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,QAA+B;IAC9E,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,wBAAwB,CAAC,QAAQ,CAAC,KAA8B,CAAC,EAAE,CAAC;QACtE,OAAO,KAA8B,CAAC;IACxC,CAAC;IACD,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAA+B;IACpE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;IAC7E,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAmB,EACnB,SAA6C;IAE7C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE1B,MAAM,MAAM,GAA0B;QACpC,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,EAAE;QACb,WAAW,EAAE,EAAE;KAChB,CAAC;IAEF,0EAA0E;IAC1E,wEAAwE;IACxE,8CAA8C;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE9C,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxC,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEf,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAElD,IAAI,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC5C,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,oCAAoC;gBACpC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClC,SAAS;YACX,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,6EAA6E;IAC7E,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;QACzD,IAAI,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC5C,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClC,SAAS;YACX,CAAC;QACH,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;QAC7E,IAAI,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC9C,MAAM,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IAC3D,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7C,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,MAAM,GAAyB,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACrC,IAAI,EAAE,QAAQ;YACd,MAAM;YACN,KAAK,EAAE,uBAAuB,CAAC,OAAO,CAAC;SACxC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,uBAAuB,CAAC,OAAe;IAC9C,6DAA6D;IAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACzE,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrB,CAAC;SACE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,IAAI,EAAE,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ProjectConfig } from '../../types.js';
2
+ export declare function generateWorkflows(config: ProjectConfig, targetDir?: string, options?: {
3
+ mode?: 'full' | 'minimal';
4
+ }): Promise<string[]>;
5
+ export declare function generateIDEFiles(config: ProjectConfig, targetDir?: string): Promise<string[]>;
6
+ /**
7
+ * Generate Cursor commands from templates
8
+ */
9
+ export declare function generateCursorCommands(targetDir: string): Promise<string[]>;
10
+ /**
11
+ * Generate AI CLI configuration files (CLAUDE.md, CODEX.md, GEMINI.md, gemini-extension.json)
12
+ * These files help AI CLI tools understand project standards
13
+ */
14
+ export declare function generateAICLIFiles(config: ProjectConfig, targetDir?: string): Promise<string[]>;
15
+ //# sourceMappingURL=workflow-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-generator.d.ts","sourceRoot":"","sources":["../../../src/core/generators/workflow-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAWpD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,MAAsB,EACjC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAO,GAC1C,OAAO,CAAC,MAAM,EAAE,CAAC,CA4DnB;AAsBD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,MAAsB,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBnB;AAsKD;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmCjF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,MAAsB,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC,CA+BnB"}
@@ -0,0 +1,390 @@
1
+ import path from 'path';
2
+ import { readFile, writeFile, ensureDir, fileExists } from '../../utils/file-system.js';
3
+ import { fileURLToPath } from 'url';
4
+ import { dirname } from 'path';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+ function getTemplatesDir() {
8
+ return path.join(__dirname, '..', '..', '..', 'templates');
9
+ }
10
+ export async function generateWorkflows(config, targetDir = process.cwd(), options = {}) {
11
+ const generatedFiles = [];
12
+ const workflowsDir = path.join(targetDir, '.github', 'workflows');
13
+ await ensureDir(workflowsDir);
14
+ const templatesDir = path.join(getTemplatesDir(), 'workflows');
15
+ const mode = options.mode ?? 'full';
16
+ // Generate language-specific workflows
17
+ for (const language of config.languages) {
18
+ if (language === 'rust') {
19
+ // Copy Rust workflows
20
+ const rustTest = await copyWorkflow(templatesDir, 'rust-test.yml', workflowsDir);
21
+ generatedFiles.push(rustTest);
22
+ if (mode === 'full') {
23
+ const rustLint = await copyWorkflow(templatesDir, 'rust-lint.yml', workflowsDir);
24
+ generatedFiles.push(rustLint);
25
+ }
26
+ }
27
+ else if (language === 'typescript') {
28
+ // Copy TypeScript workflows
29
+ const tsTest = await copyWorkflow(templatesDir, 'typescript-test.yml', workflowsDir);
30
+ generatedFiles.push(tsTest);
31
+ if (mode === 'full') {
32
+ const tsLint = await copyWorkflow(templatesDir, 'typescript-lint.yml', workflowsDir);
33
+ generatedFiles.push(tsLint);
34
+ }
35
+ }
36
+ else if (language === 'python') {
37
+ // Copy Python workflows
38
+ const pyTest = await copyWorkflow(templatesDir, 'python-test.yml', workflowsDir);
39
+ generatedFiles.push(pyTest);
40
+ if (mode === 'full') {
41
+ const pyLint = await copyWorkflow(templatesDir, 'python-lint.yml', workflowsDir);
42
+ generatedFiles.push(pyLint);
43
+ }
44
+ }
45
+ else if (language === 'go') {
46
+ // Copy Go workflows
47
+ const goTest = await copyWorkflow(templatesDir, 'go-test.yml', workflowsDir);
48
+ generatedFiles.push(goTest);
49
+ if (mode === 'full') {
50
+ const goLint = await copyWorkflow(templatesDir, 'go-lint.yml', workflowsDir);
51
+ generatedFiles.push(goLint);
52
+ }
53
+ }
54
+ else if (language === 'java') {
55
+ // Copy Java workflows
56
+ const javaTest = await copyWorkflow(templatesDir, 'java-test.yml', workflowsDir);
57
+ generatedFiles.push(javaTest);
58
+ if (mode === 'full') {
59
+ const javaLint = await copyWorkflow(templatesDir, 'java-lint.yml', workflowsDir);
60
+ generatedFiles.push(javaLint);
61
+ }
62
+ }
63
+ }
64
+ if (mode === 'full') {
65
+ // Always add codespell in full mode
66
+ const codespell = await copyWorkflow(templatesDir, 'codespell.yml', workflowsDir);
67
+ generatedFiles.push(codespell);
68
+ }
69
+ return generatedFiles;
70
+ }
71
+ async function copyWorkflow(templatesDir, workflowFile, targetDir) {
72
+ const sourcePath = path.join(templatesDir, workflowFile);
73
+ const targetPath = path.join(targetDir, workflowFile);
74
+ // Check if workflow already exists
75
+ if (await fileExists(targetPath)) {
76
+ // Skip if exists, don't overwrite
77
+ return targetPath;
78
+ }
79
+ const content = await readFile(sourcePath);
80
+ await writeFile(targetPath, content);
81
+ return targetPath;
82
+ }
83
+ export async function generateIDEFiles(config, targetDir = process.cwd()) {
84
+ const generatedFiles = [];
85
+ for (const ide of config.ides) {
86
+ if (ide === 'cursor') {
87
+ const cursorRulesPath = await generateCursorRules(config, targetDir);
88
+ if (cursorRulesPath)
89
+ generatedFiles.push(cursorRulesPath);
90
+ // Generate Cursor commands
91
+ const cursorCommands = await generateCursorCommands(targetDir);
92
+ generatedFiles.push(...cursorCommands);
93
+ }
94
+ else if (ide === 'windsurf') {
95
+ const windsurfRulesPath = await generateWindsurfRules(config, targetDir);
96
+ if (windsurfRulesPath)
97
+ generatedFiles.push(windsurfRulesPath);
98
+ }
99
+ else if (ide === 'vscode') {
100
+ const vscodeFiles = await generateVSCodeConfig(config, targetDir);
101
+ generatedFiles.push(...vscodeFiles);
102
+ }
103
+ else if (ide === 'copilot') {
104
+ const copilotPath = await generateCopilotInstructions(config, targetDir);
105
+ if (copilotPath)
106
+ generatedFiles.push(copilotPath);
107
+ }
108
+ }
109
+ return generatedFiles;
110
+ }
111
+ async function generateCursorRules(config, targetDir) {
112
+ const targetPath = path.join(targetDir, '.cursorrules');
113
+ // Don't overwrite if exists
114
+ if (await fileExists(targetPath)) {
115
+ return null;
116
+ }
117
+ const content = `This project uses @hivellm/rulebook standards.
118
+
119
+ CRITICAL RULES:
120
+ 1. Always reference @AGENTS.md before coding
121
+ 2. Write tests first (${config.coverageThreshold}%+ coverage required)
122
+ 3. Run quality checks before committing:
123
+ - Type check / Compiler check
124
+ - Linter (no warnings allowed)
125
+ - All tests (100% pass rate)
126
+ - Coverage check
127
+ 4. Update docs/ when implementing features
128
+ 5. Follow strict documentation structure
129
+
130
+ Language-specific rules are in @AGENTS.md.
131
+ Module-specific patterns are in @AGENTS.md.
132
+
133
+ When in doubt, ask to review @AGENTS.md first.
134
+ `;
135
+ await writeFile(targetPath, content);
136
+ return targetPath;
137
+ }
138
+ async function generateWindsurfRules(config, targetDir) {
139
+ const targetPath = path.join(targetDir, '.windsurfrules');
140
+ if (await fileExists(targetPath)) {
141
+ return null;
142
+ }
143
+ const content = `# Project Standards
144
+
145
+ This project uses @hivellm/rulebook for standardization.
146
+
147
+ ## Critical Rules
148
+
149
+ 1. **Always check @AGENTS.md** before generating code
150
+ 2. **Tests first**: Minimum ${config.coverageThreshold}% coverage required
151
+ 3. **Quality gates**: All must pass before commit
152
+ - Type checking
153
+ - Linting (zero warnings)
154
+ - All tests (100% pass)
155
+ - Coverage verification
156
+ 4. **Documentation**: Update /docs/ with all changes
157
+ 5. **Structure**: Follow strict documentation layout
158
+
159
+ ## Language Rules
160
+
161
+ See @AGENTS.md for:
162
+ ${config.languages.map((lang) => `- ${lang.charAt(0).toUpperCase() + lang.slice(1)}: Language-specific standards`).join('\n')}
163
+
164
+ ## Module Patterns
165
+
166
+ ${config.modules.length > 0 ? `See @AGENTS.md for:\n${config.modules.map((mod) => `- ${mod.charAt(0).toUpperCase() + mod.slice(1)}: Module-specific patterns`).join('\n')}` : 'No modules configured'}
167
+ `;
168
+ await writeFile(targetPath, content);
169
+ return targetPath;
170
+ }
171
+ async function generateVSCodeConfig(config, targetDir) {
172
+ const vscodeDir = path.join(targetDir, '.vscode');
173
+ await ensureDir(vscodeDir);
174
+ const generatedFiles = [];
175
+ // Generate settings.json
176
+ const settingsPath = path.join(vscodeDir, 'settings.json');
177
+ if (!(await fileExists(settingsPath))) {
178
+ const settings = {
179
+ 'editor.formatOnSave': true,
180
+ 'editor.codeActionsOnSave': {
181
+ 'source.fixAll.eslint': true,
182
+ 'source.organizeImports': true,
183
+ },
184
+ 'editor.rulers': [100],
185
+ 'files.eol': '\n',
186
+ 'github.copilot.enable': {
187
+ '*': true,
188
+ },
189
+ };
190
+ await writeFile(settingsPath, JSON.stringify(settings, null, 2));
191
+ generatedFiles.push(settingsPath);
192
+ }
193
+ // Generate copilot-instructions.md
194
+ const copilotPath = path.join(vscodeDir, 'copilot-instructions.md');
195
+ if (!(await fileExists(copilotPath))) {
196
+ const instructions = `# GitHub Copilot Instructions
197
+
198
+ This project follows @hivellm/rulebook standards defined in AGENTS.md.
199
+
200
+ Read and follow AGENTS.md for all code generation.
201
+
202
+ Minimum test coverage: ${config.coverageThreshold}%
203
+ `;
204
+ await writeFile(copilotPath, instructions);
205
+ generatedFiles.push(copilotPath);
206
+ }
207
+ return generatedFiles;
208
+ }
209
+ async function generateCopilotInstructions(config, targetDir) {
210
+ const githubDir = path.join(targetDir, '.github');
211
+ await ensureDir(githubDir);
212
+ const targetPath = path.join(githubDir, 'copilot-instructions.md');
213
+ if (await fileExists(targetPath)) {
214
+ return null;
215
+ }
216
+ const content = `# GitHub Copilot Instructions
217
+
218
+ This project follows @hivellm/rulebook standards defined in AGENTS.md.
219
+
220
+ ## Code Generation Rules
221
+
222
+ 1. **Always follow AGENTS.md** for all code generation
223
+ 2. **Tests required**: Minimum ${config.coverageThreshold}% coverage for all new code
224
+ 3. **Quality checks**: Code must pass all checks before commit:
225
+ - Type checking / Compilation
226
+ - Linting (zero warnings)
227
+ - All tests passing
228
+ - Coverage threshold met
229
+ 4. **Documentation**: Update /docs/ with all changes
230
+ 5. **Structure**: Follow project structure from AGENTS.md
231
+
232
+ ## Language-Specific Standards
233
+
234
+ ${config.languages.map((lang) => `### ${lang.charAt(0).toUpperCase() + lang.slice(1)}\nSee AGENTS.md for ${lang} standards`).join('\n\n')}
235
+
236
+ ## Testing Patterns
237
+
238
+ - Tests in /tests directory
239
+ - Test-driven development
240
+ - Edge cases and error paths
241
+ - Integration tests where appropriate
242
+ `;
243
+ await writeFile(targetPath, content);
244
+ return targetPath;
245
+ }
246
+ /**
247
+ * Generate Cursor commands from templates
248
+ */
249
+ export async function generateCursorCommands(targetDir) {
250
+ const commandsDir = path.join(targetDir, '.cursor', 'commands');
251
+ await ensureDir(commandsDir);
252
+ const templatesDir = path.join(getTemplatesDir(), 'commands');
253
+ const generatedFiles = [];
254
+ // List of command templates to copy
255
+ const commandTemplates = [
256
+ 'rulebook-task-create.md',
257
+ 'rulebook-task-list.md',
258
+ 'rulebook-task-show.md',
259
+ 'rulebook-task-validate.md',
260
+ 'rulebook-task-archive.md',
261
+ 'rulebook-task-apply.md',
262
+ ];
263
+ for (const template of commandTemplates) {
264
+ const sourcePath = path.join(templatesDir, template);
265
+ const targetPath = path.join(commandsDir, template);
266
+ // Skip if already exists (don't overwrite user customizations)
267
+ if (await fileExists(targetPath)) {
268
+ continue;
269
+ }
270
+ // Check if template exists
271
+ if (await fileExists(sourcePath)) {
272
+ const content = await readFile(sourcePath);
273
+ await writeFile(targetPath, content);
274
+ generatedFiles.push(targetPath);
275
+ }
276
+ }
277
+ return generatedFiles;
278
+ }
279
+ /**
280
+ * Generate AI CLI configuration files (CLAUDE.md, CODEX.md, GEMINI.md, gemini-extension.json)
281
+ * These files help AI CLI tools understand project standards
282
+ */
283
+ export async function generateAICLIFiles(config, targetDir = process.cwd()) {
284
+ const generatedFiles = [];
285
+ // CLAUDE.md is generated by `src/core/claude-md-generator.ts` (v5.3.0
286
+ // @import format) — no longer produced here.
287
+ // Generate CODEX.md for Codex CLI
288
+ const codexPath = path.join(targetDir, 'CODEX.md');
289
+ if (!(await fileExists(codexPath))) {
290
+ const codexContent = generateCodexMdContent(config);
291
+ await writeFile(codexPath, codexContent);
292
+ generatedFiles.push(codexPath);
293
+ }
294
+ // Generate GEMINI.md for Gemini CLI
295
+ const geminiPath = path.join(targetDir, 'GEMINI.md');
296
+ if (!(await fileExists(geminiPath))) {
297
+ const geminiContent = generateGeminiMdContent(config);
298
+ await writeFile(geminiPath, geminiContent);
299
+ generatedFiles.push(geminiPath);
300
+ }
301
+ // Generate gemini-extension.json for Gemini CLI extension
302
+ const geminiExtPath = path.join(targetDir, 'gemini-extension.json');
303
+ if (!(await fileExists(geminiExtPath))) {
304
+ const geminiExtContent = generateGeminiExtensionContent(config, targetDir);
305
+ await writeFile(geminiExtPath, JSON.stringify(geminiExtContent, null, 2));
306
+ generatedFiles.push(geminiExtPath);
307
+ }
308
+ return generatedFiles;
309
+ }
310
+ function generateCodexMdContent(config) {
311
+ const languages = config.languages.map((l) => l.charAt(0).toUpperCase() + l.slice(1)).join(', ');
312
+ return `# CODEX.md
313
+
314
+ Instructions for OpenAI Codex and compatible tools.
315
+
316
+ ## Project Standards
317
+
318
+ This project uses @hivehub/rulebook. Follow AGENTS.md for all code generation.
319
+
320
+ **Languages**: ${languages || 'Not specified'}
321
+ **Test Coverage**: ${config.coverageThreshold}%+
322
+
323
+ ## Rules
324
+
325
+ 1. Read AGENTS.md before generating code
326
+ 2. Write tests first (TDD approach)
327
+ 3. Maintain ${config.coverageThreshold}%+ test coverage
328
+ 4. Run quality checks before committing
329
+ 5. Follow language-specific patterns from AGENTS.md
330
+
331
+ ## Quick Reference
332
+
333
+ - Standards: See AGENTS.md
334
+ - Modular rules: See /rulebook/ directory
335
+ - Documentation: See /docs/ directory
336
+ - Tests: See /tests/ directory
337
+
338
+ Always reference AGENTS.md for consistent code generation.
339
+ `;
340
+ }
341
+ function generateGeminiMdContent(config) {
342
+ const languages = config.languages.map((l) => l.charAt(0).toUpperCase() + l.slice(1)).join(', ');
343
+ return `# GEMINI.md
344
+
345
+ Instructions for Google Gemini CLI and API.
346
+
347
+ ## Project Configuration
348
+
349
+ This project uses @hivehub/rulebook standards defined in AGENTS.md.
350
+
351
+ **Languages**: ${languages || 'Not specified'}
352
+ **Coverage Requirement**: ${config.coverageThreshold}%
353
+
354
+ ## Development Guidelines
355
+
356
+ 1. **Check AGENTS.md first** - Contains all project standards
357
+ 2. **Test-driven development** - Write tests before implementation
358
+ 3. **Quality gates** - All code must pass:
359
+ - Type checking
360
+ - Linting (zero warnings)
361
+ - Tests (100% pass rate)
362
+ - Coverage (${config.coverageThreshold}%+)
363
+ 4. **Documentation** - Update /docs/ for all features
364
+
365
+ ## Project Structure
366
+
367
+ - \`AGENTS.md\` - AI agent directives and standards
368
+ - \`/rulebook/\` - Modular rule definitions
369
+ - \`/docs/\` - Documentation
370
+ - \`/tests/\` - Test files
371
+
372
+ For detailed standards, see AGENTS.md.
373
+ `;
374
+ }
375
+ function generateGeminiExtensionContent(config, targetDir) {
376
+ return {
377
+ name: path.basename(targetDir),
378
+ version: '1.0.0',
379
+ description: 'Gemini CLI extension for project standards',
380
+ main: 'GEMINI.md',
381
+ includes: ['AGENTS.md', '.rulebook/**/*.md', 'docs/**/*.md'],
382
+ excludes: ['node_modules/**', 'dist/**', '.git/**'],
383
+ settings: {
384
+ coverageThreshold: config.coverageThreshold,
385
+ languages: config.languages,
386
+ strictMode: true,
387
+ },
388
+ };
389
+ }
390
+ //# sourceMappingURL=workflow-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-generator.js","sourceRoot":"","sources":["../../../src/core/generators/workflow-generator.ts"],"names":[],"mappings":"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"}