@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
@@ -1,197 +1,197 @@
1
- #!/usr/bin/env bash
2
- # Claude Code SessionStart hook for rulebook-terse (v5.4.0).
3
- #
4
- # Resolves the active intensity mode, writes it to the project-local
5
- # flag file via a symlink-safe path, reads the installed SKILL.md,
6
- # filters the intensity table + example rows down to the active
7
- # level only, and emits the filtered body to stdout — Claude Code
8
- # injects SessionStart stdout as hidden `additionalContext`.
9
- #
10
- # Contract matches `.rulebook/specs/RULEBOOK_TERSE.md`. Silent-fails
11
- # on every filesystem error so a broken hook never blocks session
12
- # start.
13
- #
14
- # Configuration resolution (first match wins):
15
- # 1. RULEBOOK_TERSE_MODE env var
16
- # 2. $PROJECT_ROOT/.rulebook/rulebook.json → terse.defaultMode
17
- # 3. $XDG_CONFIG_HOME/rulebook/config.json → terse.defaultMode
18
- # 4. ~/.config/rulebook/config.json → terse.defaultMode
19
- # 5. "terse"
20
-
21
- set -u
22
-
23
- # Hook input may arrive on stdin as JSON — read it if present so we
24
- # can resolve PROJECT_ROOT from the `cwd` field (Claude Code may
25
- # invoke the hook from a sub-directory of the project).
26
- input=""
27
- if [ ! -t 0 ]; then
28
- input="$(cat)"
29
- fi
30
-
31
- PROJECT_ROOT=""
32
- if [ -n "$input" ]; then
33
- PROJECT_ROOT="$(printf '%s' "$input" | node -e "
34
- try {
35
- const data = JSON.parse(require('fs').readFileSync(0, 'utf8'));
36
- process.stdout.write(data.cwd || '');
37
- } catch { }
38
- " 2>/dev/null || true)"
39
- fi
40
- [ -z "$PROJECT_ROOT" ] && PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
41
-
42
- FLAG_PATH="${PROJECT_ROOT}/.rulebook/.terse-mode"
43
- CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/rulebook"
44
- USER_CONFIG="${CONFIG_DIR}/config.json"
45
- PROJECT_CONFIG="${PROJECT_ROOT}/.rulebook/rulebook.json"
46
-
47
- VALID_MODES_RE='^(off|brief|terse|ultra|commit|review)$'
48
-
49
- resolve_mode() {
50
- # 1. Env var
51
- if [ -n "${RULEBOOK_TERSE_MODE:-}" ]; then
52
- local m="$(printf '%s' "$RULEBOOK_TERSE_MODE" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]')"
53
- if [[ "$m" =~ $VALID_MODES_RE ]]; then
54
- printf '%s' "$m"
55
- return
56
- fi
57
- fi
58
-
59
- # 2. Project config
60
- if [ -f "$PROJECT_CONFIG" ]; then
61
- local m
62
- m="$(node -e "
63
- try {
64
- const cfg = JSON.parse(require('fs').readFileSync(process.argv[1], 'utf8'));
65
- if (cfg.terse && cfg.terse.defaultMode) process.stdout.write(String(cfg.terse.defaultMode));
66
- } catch { }
67
- " "$PROJECT_CONFIG" 2>/dev/null | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]' || true)"
68
- if [ -n "$m" ] && [[ "$m" =~ $VALID_MODES_RE ]]; then
69
- printf '%s' "$m"
70
- return
71
- fi
72
- fi
73
-
74
- # 3. User config
75
- if [ -f "$USER_CONFIG" ]; then
76
- local m
77
- m="$(node -e "
78
- try {
79
- const cfg = JSON.parse(require('fs').readFileSync(process.argv[1], 'utf8'));
80
- if (cfg.terse && cfg.terse.defaultMode) process.stdout.write(String(cfg.terse.defaultMode));
81
- } catch { }
82
- " "$USER_CONFIG" 2>/dev/null | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]' || true)"
83
- if [ -n "$m" ] && [[ "$m" =~ $VALID_MODES_RE ]]; then
84
- printf '%s' "$m"
85
- return
86
- fi
87
- fi
88
-
89
- printf 'terse'
90
- }
91
-
92
- # Symlink-safe flag-file write. Refuses if target or parent is a
93
- # symlink; creates with 0600 via umask + atomic temp+rename.
94
- safe_write_flag() {
95
- local content="$1"
96
- local dir
97
- dir="$(dirname "$FLAG_PATH")"
98
-
99
- mkdir -p "$dir" 2>/dev/null || return 0
100
-
101
- # Refuse if parent is itself a symlink.
102
- [ -L "$dir" ] && return 0
103
- # Refuse if target already exists as a symlink.
104
- [ -L "$FLAG_PATH" ] && return 0
105
-
106
- local tmp
107
- tmp="$(mktemp "$dir/.terse-mode.XXXXXX" 2>/dev/null)" || return 0
108
- {
109
- umask 077
110
- printf '%s' "$content" > "$tmp" 2>/dev/null || { rm -f "$tmp"; return 0; }
111
- }
112
- chmod 600 "$tmp" 2>/dev/null || true
113
- mv -f "$tmp" "$FLAG_PATH" 2>/dev/null || rm -f "$tmp"
114
- }
115
-
116
- mode="$(resolve_mode)"
117
-
118
- # "off" → unlink the flag and exit cleanly (no hidden-context emission).
119
- if [ "$mode" = "off" ]; then
120
- rm -f "$FLAG_PATH" 2>/dev/null || true
121
- exit 0
122
- fi
123
-
124
- safe_write_flag "$mode"
125
-
126
- # Locate the SKILL.md. Prefer the installed copy; fall back to the
127
- # repo-local template when running inside the Rulebook source tree.
128
- SKILL_PATHS=(
129
- "${PROJECT_ROOT}/.claude/skills/rulebook-terse/SKILL.md"
130
- "${PROJECT_ROOT}/templates/skills/core/rulebook-terse/SKILL.md"
131
- )
132
-
133
- skill_body=""
134
- for p in "${SKILL_PATHS[@]}"; do
135
- if [ -f "$p" ]; then
136
- skill_body="$(cat "$p" 2>/dev/null || true)"
137
- break
138
- fi
139
- done
140
-
141
- # Emit the payload. When no SKILL.md is found, fall back to a
142
- # minimal hardcoded ruleset — matches the Caveman pattern for
143
- # standalone installs without templates.
144
- if [ -z "$skill_body" ]; then
145
- cat <<EOF
146
- RULEBOOK-TERSE MODE ACTIVE — level: ${mode}
147
-
148
- ## Persistence
149
- ACTIVE EVERY RESPONSE once set. Off only via "/rulebook-terse off", "normal mode", or session end.
150
-
151
- ## Rules
152
- Drop filler (just, really, basically), pleasantries, hedging. Keep technical terms exact. Code blocks byte-for-byte unchanged.
153
-
154
- ## Auto-Clarity
155
- Full prose for: security warnings, destructive-op confirmations, quality-gate failures, multi-step sequences, user confusion.
156
-
157
- ## Boundaries
158
- Code/tests/commits/specs: unchanged.
159
- EOF
160
- exit 0
161
- fi
162
-
163
- # Header + filtered body. Filtering:
164
- # - Strip YAML frontmatter (everything up through the second `---`).
165
- # - Intensity-table rows `| **<level>** | ...` — keep only the active one.
166
- # - Example lines `- **<level>**: "..."` — keep only the active one.
167
- # - All other lines pass through unchanged.
168
- #
169
- # Uses `node -e` for portability — BSD awk (macOS default) does not
170
- # support the 3-arg `match(str, re, array)` form that gawk ships with.
171
- printf 'RULEBOOK-TERSE MODE ACTIVE — level: %s\n\n' "$mode"
172
-
173
- printf '%s' "$skill_body" | node -e "
174
- let body = '';
175
- process.stdin.setEncoding('utf8');
176
- process.stdin.on('data', (c) => { body += c; });
177
- process.stdin.on('end', () => {
178
- const active = process.argv[1];
179
- // Strip YAML frontmatter.
180
- const stripped = body.replace(/^---\s*\n[\s\S]*?\n---\s*\n/, '');
181
- const out = [];
182
- for (const line of stripped.split('\n')) {
183
- const tableRow = line.match(/^\s*\|\s*\*\*([^*]+)\*\*\s*\|/);
184
- if (tableRow) {
185
- if (tableRow[1] === active) out.push(line);
186
- continue;
187
- }
188
- const exampleLine = line.match(/^\s*-\s*\*\*([^*]+)\*\*\s*:/);
189
- if (exampleLine) {
190
- if (exampleLine[1] === active) out.push(line);
191
- continue;
192
- }
193
- out.push(line);
194
- }
195
- process.stdout.write(out.join('\n'));
196
- });
197
- " "$mode"
1
+ #!/usr/bin/env bash
2
+ # Claude Code SessionStart hook for rulebook-terse (v5.4.0).
3
+ #
4
+ # Resolves the active intensity mode, writes it to the project-local
5
+ # flag file via a symlink-safe path, reads the installed SKILL.md,
6
+ # filters the intensity table + example rows down to the active
7
+ # level only, and emits the filtered body to stdout — Claude Code
8
+ # injects SessionStart stdout as hidden `additionalContext`.
9
+ #
10
+ # Contract matches `.rulebook/specs/RULEBOOK_TERSE.md`. Silent-fails
11
+ # on every filesystem error so a broken hook never blocks session
12
+ # start.
13
+ #
14
+ # Configuration resolution (first match wins):
15
+ # 1. RULEBOOK_TERSE_MODE env var
16
+ # 2. $PROJECT_ROOT/.rulebook/rulebook.json → terse.defaultMode
17
+ # 3. $XDG_CONFIG_HOME/rulebook/config.json → terse.defaultMode
18
+ # 4. ~/.config/rulebook/config.json → terse.defaultMode
19
+ # 5. "terse"
20
+
21
+ set -u
22
+
23
+ # Hook input may arrive on stdin as JSON — read it if present so we
24
+ # can resolve PROJECT_ROOT from the `cwd` field (Claude Code may
25
+ # invoke the hook from a sub-directory of the project).
26
+ input=""
27
+ if [ ! -t 0 ]; then
28
+ input="$(cat)"
29
+ fi
30
+
31
+ PROJECT_ROOT=""
32
+ if [ -n "$input" ]; then
33
+ PROJECT_ROOT="$(printf '%s' "$input" | node -e "
34
+ try {
35
+ const data = JSON.parse(require('fs').readFileSync(0, 'utf8'));
36
+ process.stdout.write(data.cwd || '');
37
+ } catch { }
38
+ " 2>/dev/null || true)"
39
+ fi
40
+ [ -z "$PROJECT_ROOT" ] && PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
41
+
42
+ FLAG_PATH="${PROJECT_ROOT}/.rulebook/.terse-mode"
43
+ CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/rulebook"
44
+ USER_CONFIG="${CONFIG_DIR}/config.json"
45
+ PROJECT_CONFIG="${PROJECT_ROOT}/.rulebook/rulebook.json"
46
+
47
+ VALID_MODES_RE='^(off|brief|terse|ultra|commit|review)$'
48
+
49
+ resolve_mode() {
50
+ # 1. Env var
51
+ if [ -n "${RULEBOOK_TERSE_MODE:-}" ]; then
52
+ local m="$(printf '%s' "$RULEBOOK_TERSE_MODE" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]')"
53
+ if [[ "$m" =~ $VALID_MODES_RE ]]; then
54
+ printf '%s' "$m"
55
+ return
56
+ fi
57
+ fi
58
+
59
+ # 2. Project config
60
+ if [ -f "$PROJECT_CONFIG" ]; then
61
+ local m
62
+ m="$(node -e "
63
+ try {
64
+ const cfg = JSON.parse(require('fs').readFileSync(process.argv[1], 'utf8'));
65
+ if (cfg.terse && cfg.terse.defaultMode) process.stdout.write(String(cfg.terse.defaultMode));
66
+ } catch { }
67
+ " "$PROJECT_CONFIG" 2>/dev/null | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]' || true)"
68
+ if [ -n "$m" ] && [[ "$m" =~ $VALID_MODES_RE ]]; then
69
+ printf '%s' "$m"
70
+ return
71
+ fi
72
+ fi
73
+
74
+ # 3. User config
75
+ if [ -f "$USER_CONFIG" ]; then
76
+ local m
77
+ m="$(node -e "
78
+ try {
79
+ const cfg = JSON.parse(require('fs').readFileSync(process.argv[1], 'utf8'));
80
+ if (cfg.terse && cfg.terse.defaultMode) process.stdout.write(String(cfg.terse.defaultMode));
81
+ } catch { }
82
+ " "$USER_CONFIG" 2>/dev/null | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]' || true)"
83
+ if [ -n "$m" ] && [[ "$m" =~ $VALID_MODES_RE ]]; then
84
+ printf '%s' "$m"
85
+ return
86
+ fi
87
+ fi
88
+
89
+ printf 'terse'
90
+ }
91
+
92
+ # Symlink-safe flag-file write. Refuses if target or parent is a
93
+ # symlink; creates with 0600 via umask + atomic temp+rename.
94
+ safe_write_flag() {
95
+ local content="$1"
96
+ local dir
97
+ dir="$(dirname "$FLAG_PATH")"
98
+
99
+ mkdir -p "$dir" 2>/dev/null || return 0
100
+
101
+ # Refuse if parent is itself a symlink.
102
+ [ -L "$dir" ] && return 0
103
+ # Refuse if target already exists as a symlink.
104
+ [ -L "$FLAG_PATH" ] && return 0
105
+
106
+ local tmp
107
+ tmp="$(mktemp "$dir/.terse-mode.XXXXXX" 2>/dev/null)" || return 0
108
+ {
109
+ umask 077
110
+ printf '%s' "$content" > "$tmp" 2>/dev/null || { rm -f "$tmp"; return 0; }
111
+ }
112
+ chmod 600 "$tmp" 2>/dev/null || true
113
+ mv -f "$tmp" "$FLAG_PATH" 2>/dev/null || rm -f "$tmp"
114
+ }
115
+
116
+ mode="$(resolve_mode)"
117
+
118
+ # "off" → unlink the flag and exit cleanly (no hidden-context emission).
119
+ if [ "$mode" = "off" ]; then
120
+ rm -f "$FLAG_PATH" 2>/dev/null || true
121
+ exit 0
122
+ fi
123
+
124
+ safe_write_flag "$mode"
125
+
126
+ # Locate the SKILL.md. Prefer the installed copy; fall back to the
127
+ # repo-local template when running inside the Rulebook source tree.
128
+ SKILL_PATHS=(
129
+ "${PROJECT_ROOT}/.claude/skills/rulebook-terse/SKILL.md"
130
+ "${PROJECT_ROOT}/templates/skills/core/rulebook-terse/SKILL.md"
131
+ )
132
+
133
+ skill_body=""
134
+ for p in "${SKILL_PATHS[@]}"; do
135
+ if [ -f "$p" ]; then
136
+ skill_body="$(cat "$p" 2>/dev/null || true)"
137
+ break
138
+ fi
139
+ done
140
+
141
+ # Emit the payload. When no SKILL.md is found, fall back to a
142
+ # minimal hardcoded ruleset — matches the Caveman pattern for
143
+ # standalone installs without templates.
144
+ if [ -z "$skill_body" ]; then
145
+ cat <<EOF
146
+ RULEBOOK-TERSE MODE ACTIVE — level: ${mode}
147
+
148
+ ## Persistence
149
+ ACTIVE EVERY RESPONSE once set. Off only via "/rulebook-terse off", "normal mode", or session end.
150
+
151
+ ## Rules
152
+ Drop filler (just, really, basically), pleasantries, hedging. Keep technical terms exact. Code blocks byte-for-byte unchanged.
153
+
154
+ ## Auto-Clarity
155
+ Full prose for: security warnings, destructive-op confirmations, quality-gate failures, multi-step sequences, user confusion.
156
+
157
+ ## Boundaries
158
+ Code/tests/commits/specs: unchanged.
159
+ EOF
160
+ exit 0
161
+ fi
162
+
163
+ # Header + filtered body. Filtering:
164
+ # - Strip YAML frontmatter (everything up through the second `---`).
165
+ # - Intensity-table rows `| **<level>** | ...` — keep only the active one.
166
+ # - Example lines `- **<level>**: "..."` — keep only the active one.
167
+ # - All other lines pass through unchanged.
168
+ #
169
+ # Uses `node -e` for portability — BSD awk (macOS default) does not
170
+ # support the 3-arg `match(str, re, array)` form that gawk ships with.
171
+ printf 'RULEBOOK-TERSE MODE ACTIVE — level: %s\n\n' "$mode"
172
+
173
+ printf '%s' "$skill_body" | node -e "
174
+ let body = '';
175
+ process.stdin.setEncoding('utf8');
176
+ process.stdin.on('data', (c) => { body += c; });
177
+ process.stdin.on('end', () => {
178
+ const active = process.argv[1];
179
+ // Strip YAML frontmatter.
180
+ const stripped = body.replace(/^---\s*\n[\s\S]*?\n---\s*\n/, '');
181
+ const out = [];
182
+ for (const line of stripped.split('\n')) {
183
+ const tableRow = line.match(/^\s*\|\s*\*\*([^*]+)\*\*\s*\|/);
184
+ if (tableRow) {
185
+ if (tableRow[1] === active) out.push(line);
186
+ continue;
187
+ }
188
+ const exampleLine = line.match(/^\s*-\s*\*\*([^*]+)\*\*\s*:/);
189
+ if (exampleLine) {
190
+ if (exampleLine[1] === active) out.push(line);
191
+ continue;
192
+ }
193
+ out.push(line);
194
+ }
195
+ process.stdout.write(out.join('\n'));
196
+ });
197
+ " "$mode"