@nurix/etna 0.19.42 → 0.19.44

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 (378) hide show
  1. package/bin/etna.js +47 -6
  2. package/data/harness-index.json +5 -1
  3. package/data/harnesses/apollo/.prettierignore +29 -0
  4. package/data/harnesses/apollo/.prettierrc.json +3 -0
  5. package/data/harnesses/apollo/.vscode/settings.json +19 -0
  6. package/data/harnesses/apollo/CLAUDE.md +162 -0
  7. package/data/harnesses/apollo/agents/brainstorm.md +144 -0
  8. package/data/harnesses/apollo/agents/change-review.md +251 -0
  9. package/data/harnesses/apollo/agents/lld-mode.md +56 -0
  10. package/data/harnesses/apollo/agents/maintenance.md +231 -0
  11. package/data/harnesses/apollo/agents/performance-review.md +223 -0
  12. package/data/harnesses/apollo/agents/retro.md +46 -0
  13. package/data/harnesses/apollo/codex/agents/brainstorm.toml +142 -0
  14. package/data/harnesses/apollo/codex/agents/change-review.toml +249 -0
  15. package/data/harnesses/apollo/codex/agents/lld-mode.toml +52 -0
  16. package/data/harnesses/apollo/codex/agents/maintenance.toml +228 -0
  17. package/data/harnesses/apollo/codex/agents/performance-review.toml +222 -0
  18. package/data/harnesses/apollo/codex/agents/retro.toml +45 -0
  19. package/data/harnesses/apollo/docs/README.md +28 -0
  20. package/data/harnesses/apollo/docs/history/CHANGELOG.md +26 -0
  21. package/data/harnesses/apollo/docs/history/backlog.md +19 -0
  22. package/data/harnesses/apollo/docs/memory/main.md +15 -0
  23. package/data/harnesses/apollo/docs/structure.md +54 -0
  24. package/data/harnesses/apollo/harness.json +18 -0
  25. package/data/harnesses/{code → apollo}/hooks/generate-ownership-index.mjs +1 -1
  26. package/data/harnesses/apollo/hooks/hooks.json +16 -0
  27. package/data/harnesses/apollo/rules/changelog.md +19 -0
  28. package/data/harnesses/apollo/rules/database.md +123 -0
  29. package/data/harnesses/apollo/rules/express.md +33 -0
  30. package/data/harnesses/apollo/rules/frontend.md +32 -0
  31. package/data/harnesses/apollo/rules/general.md +62 -0
  32. package/data/harnesses/apollo/rules/nomenclature.md +34 -0
  33. package/data/harnesses/apollo/rules/pnpm.md +57 -0
  34. package/data/harnesses/apollo/rules/testing.md +23 -0
  35. package/data/harnesses/apollo/rules/verification.md +67 -0
  36. package/data/harnesses/apollo/skills/boundary/SKILL.md +71 -0
  37. package/data/harnesses/apollo/skills/boundary/references/index.md +16 -0
  38. package/data/harnesses/apollo/skills/boundary/references/mechanisms.md +99 -0
  39. package/data/harnesses/apollo/skills/boundary/references/packs/async-messaging.md +81 -0
  40. package/data/harnesses/apollo/skills/boundary/references/packs/auth.md +93 -0
  41. package/data/harnesses/apollo/skills/boundary/references/packs/build-config-runtime.md +93 -0
  42. package/data/harnesses/apollo/skills/boundary/references/packs/cloudflare.md +93 -0
  43. package/data/harnesses/apollo/skills/boundary/references/packs/frontend.md +93 -0
  44. package/data/harnesses/apollo/skills/boundary/references/packs/generic-tail.md +55 -0
  45. package/data/harnesses/apollo/skills/boundary/references/packs/persistence.md +93 -0
  46. package/data/harnesses/apollo/skills/boundary/references/packs/wire-api.md +87 -0
  47. package/data/harnesses/apollo/skills/brainstorm/README.md +56 -0
  48. package/data/harnesses/apollo/skills/brainstorm/SKILL.md +173 -0
  49. package/data/harnesses/apollo/skills/brainstorm/references/doctrine.md +98 -0
  50. package/data/harnesses/apollo/skills/brainstorm/references/harvest.md +86 -0
  51. package/data/harnesses/apollo/skills/brainstorm/references/session-schema.md +186 -0
  52. package/data/harnesses/apollo/skills/brainstorm/scripts/detector.mjs +460 -0
  53. package/data/harnesses/apollo/skills/design/SKILL.md +100 -0
  54. package/data/harnesses/apollo/skills/design/components/charts.md +76 -0
  55. package/data/harnesses/apollo/skills/design/components/collections.md +132 -0
  56. package/data/harnesses/apollo/skills/design/components/feedback.md +47 -0
  57. package/data/harnesses/apollo/skills/design/components/hooks.md +35 -0
  58. package/data/harnesses/apollo/skills/design/components/index.md +143 -0
  59. package/data/harnesses/apollo/skills/design/components/inputs.md +327 -0
  60. package/data/harnesses/apollo/skills/design/components/layout.md +52 -0
  61. package/data/harnesses/apollo/skills/design/components/media.md +66 -0
  62. package/data/harnesses/apollo/skills/design/components/motion.md +82 -0
  63. package/data/harnesses/apollo/skills/design/components/navigation.md +29 -0
  64. package/data/harnesses/apollo/skills/design/components/overlays.md +72 -0
  65. package/data/harnesses/apollo/skills/design/components/setup.md +40 -0
  66. package/data/harnesses/apollo/skills/design/components/typography.md +46 -0
  67. package/data/harnesses/apollo/skills/design/components/utils.md +37 -0
  68. package/data/harnesses/apollo/skills/design/data/blueprints/browse.md +38 -0
  69. package/data/harnesses/apollo/skills/design/data/blueprints/creation-flow.md +38 -0
  70. package/data/harnesses/apollo/skills/design/data/blueprints/dashboard.md +38 -0
  71. package/data/harnesses/apollo/skills/design/data/blueprints/grid.md +38 -0
  72. package/data/harnesses/apollo/skills/design/data/blueprints/queue.md +38 -0
  73. package/data/harnesses/apollo/skills/design/data/blueprints/record-detail.md +38 -0
  74. package/data/harnesses/apollo/skills/design/data/blueprints/settings.md +38 -0
  75. package/data/harnesses/apollo/skills/design/data/chart-styling/Readme.md +33 -0
  76. package/data/harnesses/apollo/skills/design/data/chart-styling/carbon-accessible-alert-semantic.md +19 -0
  77. package/data/harnesses/apollo/skills/design/data/chart-styling/carbon-monochrome-sequential-trend.md +19 -0
  78. package/data/harnesses/apollo/skills/design/data/chart-styling/datadog-classic-six-aligned.md +19 -0
  79. package/data/harnesses/apollo/skills/design/data/chart-styling/datawrapper-tiered-gray-hierarchy.md +19 -0
  80. package/data/harnesses/apollo/skills/design/data/chart-styling/econ-red-rule-horizontal.md +19 -0
  81. package/data/harnesses/apollo/skills/design/data/chart-styling/financial-diverging-threshold-overlay.md +19 -0
  82. package/data/harnesses/apollo/skills/design/data/chart-styling/ft-vocabulary-ranked-muted.md +19 -0
  83. package/data/harnesses/apollo/skills/design/data/chart-styling/grafana-dark-threshold-bands.md +19 -0
  84. package/data/harnesses/apollo/skills/design/data/chart-styling/material-rounded-explicit-label.md +19 -0
  85. package/data/harnesses/apollo/skills/design/data/chart-styling/nyt-ghost-grid-direct-label.md +19 -0
  86. package/data/harnesses/apollo/skills/design/data/chart-styling/plot-currentcolor-inherit.md +19 -0
  87. package/data/harnesses/apollo/skills/design/data/chart-styling/saas-gradient-glow-area.md +19 -0
  88. package/data/harnesses/apollo/skills/design/data/chart-styling/shadcn-composable-css-vars.md +19 -0
  89. package/data/harnesses/apollo/skills/design/data/charts/census.csv +58 -0
  90. package/data/harnesses/apollo/skills/design/data/checklists/browse.md +21 -0
  91. package/data/harnesses/apollo/skills/design/data/checklists/creation-flow.md +20 -0
  92. package/data/harnesses/apollo/skills/design/data/checklists/dashboard.md +21 -0
  93. package/data/harnesses/apollo/skills/design/data/checklists/grid.md +21 -0
  94. package/data/harnesses/apollo/skills/design/data/checklists/queue.md +21 -0
  95. package/data/harnesses/apollo/skills/design/data/checklists/record-detail.md +21 -0
  96. package/data/harnesses/apollo/skills/design/data/checklists/settings.md +21 -0
  97. package/data/harnesses/apollo/skills/design/data/chrome/board-column.md +68 -0
  98. package/data/harnesses/apollo/skills/design/data/chrome/data-table.md +63 -0
  99. package/data/harnesses/apollo/skills/design/data/chrome/side-panel.md +60 -0
  100. package/data/harnesses/apollo/skills/design/data/chrome/sidebar.md +78 -0
  101. package/data/harnesses/apollo/skills/design/data/chrome/stat-cards.md +62 -0
  102. package/data/harnesses/apollo/skills/design/data/chrome/topbar.md +65 -0
  103. package/data/harnesses/apollo/skills/design/data/color/accent-presets.md +90 -0
  104. package/data/harnesses/apollo/skills/design/data/color/aesop-earth-mute.md +91 -0
  105. package/data/harnesses/apollo/skills/design/data/color/arc-peach-play.md +90 -0
  106. package/data/harnesses/apollo/skills/design/data/color/attio-hunter-teal.md +90 -0
  107. package/data/harnesses/apollo/skills/design/data/color/carbon-cyan-signal.md +90 -0
  108. package/data/harnesses/apollo/skills/design/data/color/clay-parchment.md +90 -0
  109. package/data/harnesses/apollo/skills/design/data/color/duolingo-feather.md +90 -0
  110. package/data/harnesses/apollo/skills/design/data/color/geist-mono-signal.md +90 -0
  111. package/data/harnesses/apollo/skills/design/data/color/linear-graphite-violet.md +90 -0
  112. package/data/harnesses/apollo/skills/design/data/color/mercury-onyx-cobalt.md +90 -0
  113. package/data/harnesses/apollo/skills/design/data/color/notion-paper-ink.md +90 -0
  114. package/data/harnesses/apollo/skills/design/data/color/radix-slate-iris.md +90 -0
  115. package/data/harnesses/apollo/skills/design/data/color/raycast-void-spectrum.md +90 -0
  116. package/data/harnesses/apollo/skills/design/data/color/spectrum-celery-fuchsia.md +90 -0
  117. package/data/harnesses/apollo/skills/design/data/color/stripe-blurple-ruby.md +90 -0
  118. package/data/harnesses/apollo/skills/design/data/color/superhuman-cod-picton.md +89 -0
  119. package/data/harnesses/apollo/skills/design/data/corpora/operations-review/companies.csv +15 -0
  120. package/data/harnesses/apollo/skills/design/data/corpora/operations-review/corpus.md +87 -0
  121. package/data/harnesses/apollo/skills/design/data/corpora/operations-review/people.csv +25 -0
  122. package/data/harnesses/apollo/skills/design/data/corpora/procurement-approvals/companies.csv +15 -0
  123. package/data/harnesses/apollo/skills/design/data/corpora/procurement-approvals/corpus.md +83 -0
  124. package/data/harnesses/apollo/skills/design/data/corpora/procurement-approvals/people.csv +25 -0
  125. package/data/harnesses/apollo/skills/design/data/corpora/revenue-analytics/companies.csv +15 -0
  126. package/data/harnesses/apollo/skills/design/data/corpora/revenue-analytics/corpus.md +89 -0
  127. package/data/harnesses/apollo/skills/design/data/corpora/revenue-analytics/people.csv +25 -0
  128. package/data/harnesses/apollo/skills/design/data/elevation/ant-design-directional-shadow.md +19 -0
  129. package/data/harnesses/apollo/skills/design/data/elevation/apple-liquid-glass-material.md +18 -0
  130. package/data/harnesses/apollo/skills/design/data/elevation/atlassian-surface-shadow-pairing.md +20 -0
  131. package/data/harnesses/apollo/skills/design/data/elevation/fluent-2-key-ambient-ramp.md +20 -0
  132. package/data/harnesses/apollo/skills/design/data/elevation/github-primer-sparing-shadow.md +19 -0
  133. package/data/harnesses/apollo/skills/design/data/elevation/ibm-carbon-layer-and-border.md +19 -0
  134. package/data/harnesses/apollo/skills/design/data/elevation/linear-dark-surface-ladder.md +17 -0
  135. package/data/harnesses/apollo/skills/design/data/elevation/material-2-key-ambient-dp-ramp.md +19 -0
  136. package/data/harnesses/apollo/skills/design/data/elevation/material-3-tonal-elevation.md +21 -0
  137. package/data/harnesses/apollo/skills/design/data/elevation/neobrutalist-hard-offset.md +19 -0
  138. package/data/harnesses/apollo/skills/design/data/elevation/neumorphic-soft-dual-shadow.md +18 -0
  139. package/data/harnesses/apollo/skills/design/data/elevation/notion-warm-minimal-hairline.md +17 -0
  140. package/data/harnesses/apollo/skills/design/data/elevation/polaris-elevation-inset-bevel.md +21 -0
  141. package/data/harnesses/apollo/skills/design/data/elevation/radix-themes-alpha-ring-scale.md +19 -0
  142. package/data/harnesses/apollo/skills/design/data/elevation/shadcn-neutral-derived-radius.md +19 -0
  143. package/data/harnesses/apollo/skills/design/data/elevation/stripe-brand-tinted-dual-shadow.md +18 -0
  144. package/data/harnesses/apollo/skills/design/data/elevation/tailwind-default-utility-scale.md +19 -0
  145. package/data/harnesses/apollo/skills/design/data/elevation/vercel-geist-shadow-as-border.md +20 -0
  146. package/data/harnesses/apollo/skills/design/data/gradients/amber-attention-fill.md +16 -0
  147. package/data/harnesses/apollo/skills/design/data/gradients/cloud-shadow-wash.md +16 -0
  148. package/data/harnesses/apollo/skills/design/data/gradients/confident-lavender-wash.md +16 -0
  149. package/data/harnesses/apollo/skills/design/data/gradients/ember-ship-flare.md +18 -0
  150. package/data/harnesses/apollo/skills/design/data/gradients/full-metal-wash.md +16 -0
  151. package/data/harnesses/apollo/skills/design/data/gradients/indigo-ruby-cta-band.md +18 -0
  152. package/data/harnesses/apollo/skills/design/data/gradients/linear-graphite-wash.md +18 -0
  153. package/data/harnesses/apollo/skills/design/data/gradients/marble-quartz-wash.md +16 -0
  154. package/data/harnesses/apollo/skills/design/data/gradients/midnight-aurora-panel.md +16 -0
  155. package/data/harnesses/apollo/skills/design/data/gradients/neutral-volume-fill.md +16 -0
  156. package/data/harnesses/apollo/skills/design/data/gradients/revenue-uptrend-fill.md +16 -0
  157. package/data/harnesses/apollo/skills/design/data/gradients/risk-decline-fill.md +16 -0
  158. package/data/harnesses/apollo/skills/design/data/gradients/signal-blue-develop.md +18 -0
  159. package/data/harnesses/apollo/skills/design/data/gradients/slate-mist-wash.md +16 -0
  160. package/data/harnesses/apollo/skills/design/data/gradients/stripe-atmosphere-mesh.md +18 -0
  161. package/data/harnesses/apollo/skills/design/data/gradients/teal-signal-accent.md +16 -0
  162. package/data/harnesses/apollo/skills/design/data/gradients/violet-magenta-promo.md +16 -0
  163. package/data/harnesses/apollo/skills/design/data/iconography.md +199 -0
  164. package/data/harnesses/apollo/skills/design/data/motion/accordion-expand.md +18 -0
  165. package/data/harnesses/apollo/skills/design/data/motion/destructive-hold-confirm.md +18 -0
  166. package/data/harnesses/apollo/skills/design/data/motion/drag-dismiss-momentum.md +18 -0
  167. package/data/harnesses/apollo/skills/design/data/motion/empty-state-arrive.md +18 -0
  168. package/data/harnesses/apollo/skills/design/data/motion/hover-lift.md +18 -0
  169. package/data/harnesses/apollo/skills/design/data/motion/modal-center-arrive.md +18 -0
  170. package/data/harnesses/apollo/skills/design/data/motion/number-ticker-roll.md +18 -0
  171. package/data/harnesses/apollo/skills/design/data/motion/onboarding-bounce.md +18 -0
  172. package/data/harnesses/apollo/skills/design/data/motion/panel-slide.md +18 -0
  173. package/data/harnesses/apollo/skills/design/data/motion/press-feedback.md +18 -0
  174. package/data/harnesses/apollo/skills/design/data/motion/progress-linear-loop.md +18 -0
  175. package/data/harnesses/apollo/skills/design/data/motion/route-crossfade.md +18 -0
  176. package/data/harnesses/apollo/skills/design/data/motion/rubber-band-overscroll.md +18 -0
  177. package/data/harnesses/apollo/skills/design/data/motion/skeleton-shimmer.md +18 -0
  178. package/data/harnesses/apollo/skills/design/data/motion/stagger-arrive.md +18 -0
  179. package/data/harnesses/apollo/skills/design/data/motion/toast-enter-stack.md +18 -0
  180. package/data/harnesses/apollo/skills/design/data/motion/tooltip-chain-instant.md +18 -0
  181. package/data/harnesses/apollo/skills/design/data/motion/trigger-anchored-reveal.md +18 -0
  182. package/data/harnesses/apollo/skills/design/data/tells.csv +34 -0
  183. package/data/harnesses/apollo/skills/design/data/typography/anton-work-sans.md +17 -0
  184. package/data/harnesses/apollo/skills/design/data/typography/archivo-black-archivo.md +17 -0
  185. package/data/harnesses/apollo/skills/design/data/typography/bitter-karla.md +17 -0
  186. package/data/harnesses/apollo/skills/design/data/typography/dm-serif-dm-sans.md +17 -0
  187. package/data/harnesses/apollo/skills/design/data/typography/fraunces-inter.md +17 -0
  188. package/data/harnesses/apollo/skills/design/data/typography/geist-geist-mono.md +17 -0
  189. package/data/harnesses/apollo/skills/design/data/typography/hubot-sans-mona-sans.md +17 -0
  190. package/data/harnesses/apollo/skills/design/data/typography/ibm-plex-sans-operator-single-family.md +17 -0
  191. package/data/harnesses/apollo/skills/design/data/typography/instrument-serif-instrument-sans.md +17 -0
  192. package/data/harnesses/apollo/skills/design/data/typography/inter-operator-single-family.md +17 -0
  193. package/data/harnesses/apollo/skills/design/data/typography/libre-baskerville-libre-franklin.md +17 -0
  194. package/data/harnesses/apollo/skills/design/data/typography/newsreader-inter.md +17 -0
  195. package/data/harnesses/apollo/skills/design/data/typography/playfair-display-source-sans.md +17 -0
  196. package/data/harnesses/apollo/skills/design/data/typography/public-sans-operator-single-family.md +17 -0
  197. package/data/harnesses/apollo/skills/design/data/typography/sohne-inter-fintech.md +17 -0
  198. package/data/harnesses/apollo/skills/design/data/typography/source-serif-source-sans.md +17 -0
  199. package/data/harnesses/apollo/skills/design/data/typography/space-grotesk-work-sans-space-mono.md +17 -0
  200. package/data/harnesses/apollo/skills/design/data/typography/spectral-manrope.md +17 -0
  201. package/data/harnesses/apollo/skills/design/data/voices/bright-collaborator.md +29 -0
  202. package/data/harnesses/apollo/skills/design/data/voices/direct-operator.md +29 -0
  203. package/data/harnesses/apollo/skills/design/data/voices/earnest-helper.md +29 -0
  204. package/data/harnesses/apollo/skills/design/data/voices/editorial-composed.md +29 -0
  205. package/data/harnesses/apollo/skills/design/data/voices/quiet-concierge.md +29 -0
  206. package/data/harnesses/apollo/skills/design/data/voices/warm-guide.md +29 -0
  207. package/data/harnesses/apollo/skills/design/design-md/SCHEMA.md +179 -0
  208. package/data/harnesses/apollo/skills/design/design-md/index.csv +67 -0
  209. package/data/harnesses/apollo/skills/design/design-md/library/airbnb.md +207 -0
  210. package/data/harnesses/apollo/skills/design/design-md/library/airtable.md +205 -0
  211. package/data/harnesses/apollo/skills/design/design-md/library/anthropic-claude.md +203 -0
  212. package/data/harnesses/apollo/skills/design/design-md/library/apple.md +206 -0
  213. package/data/harnesses/apollo/skills/design/design-md/library/binance.md +210 -0
  214. package/data/harnesses/apollo/skills/design/design-md/library/bmw.md +210 -0
  215. package/data/harnesses/apollo/skills/design/design-md/library/cal.md +209 -0
  216. package/data/harnesses/apollo/skills/design/design-md/library/clay.md +204 -0
  217. package/data/harnesses/apollo/skills/design/design-md/library/clickhouse.md +205 -0
  218. package/data/harnesses/apollo/skills/design/design-md/library/cohere.md +205 -0
  219. package/data/harnesses/apollo/skills/design/design-md/library/coinbase.md +198 -0
  220. package/data/harnesses/apollo/skills/design/design-md/library/composio.md +198 -0
  221. package/data/harnesses/apollo/skills/design/design-md/library/cursor.md +197 -0
  222. package/data/harnesses/apollo/skills/design/design-md/library/elevenlabs.md +199 -0
  223. package/data/harnesses/apollo/skills/design/design-md/library/expo.md +200 -0
  224. package/data/harnesses/apollo/skills/design/design-md/library/figma.md +199 -0
  225. package/data/harnesses/apollo/skills/design/design-md/library/framer.md +202 -0
  226. package/data/harnesses/apollo/skills/design/design-md/library/hashicorp.md +205 -0
  227. package/data/harnesses/apollo/skills/design/design-md/library/ibm.md +205 -0
  228. package/data/harnesses/apollo/skills/design/design-md/library/intercom.md +204 -0
  229. package/data/harnesses/apollo/skills/design/design-md/library/kraken.md +200 -0
  230. package/data/harnesses/apollo/skills/design/design-md/library/linear-app.md +198 -0
  231. package/data/harnesses/apollo/skills/design/design-md/library/lovable.md +199 -0
  232. package/data/harnesses/apollo/skills/design/design-md/library/meta.md +204 -0
  233. package/data/harnesses/apollo/skills/design/design-md/library/minimax.md +204 -0
  234. package/data/harnesses/apollo/skills/design/design-md/library/mintlify.md +210 -0
  235. package/data/harnesses/apollo/skills/design/design-md/library/miro.md +209 -0
  236. package/data/harnesses/apollo/skills/design/design-md/library/mistral-ai.md +201 -0
  237. package/data/harnesses/apollo/skills/design/design-md/library/mongodb.md +201 -0
  238. package/data/harnesses/apollo/skills/design/design-md/library/notion.md +204 -0
  239. package/data/harnesses/apollo/skills/design/design-md/library/nvidia.md +215 -0
  240. package/data/harnesses/apollo/skills/design/design-md/library/ollama.md +213 -0
  241. package/data/harnesses/apollo/skills/design/design-md/library/opencode-ai.md +216 -0
  242. package/data/harnesses/apollo/skills/design/design-md/library/posthog.md +218 -0
  243. package/data/harnesses/apollo/skills/design/design-md/library/raycast.md +214 -0
  244. package/data/harnesses/apollo/skills/design/design-md/library/replicate.md +202 -0
  245. package/data/harnesses/apollo/skills/design/design-md/library/resend.md +203 -0
  246. package/data/harnesses/apollo/skills/design/design-md/library/revolut.md +203 -0
  247. package/data/harnesses/apollo/skills/design/design-md/library/runwayml.md +203 -0
  248. package/data/harnesses/apollo/skills/design/design-md/library/sanity.md +200 -0
  249. package/data/harnesses/apollo/skills/design/design-md/library/sentry.md +201 -0
  250. package/data/harnesses/apollo/skills/design/design-md/library/shopify.md +202 -0
  251. package/data/harnesses/apollo/skills/design/design-md/library/slack.md +202 -0
  252. package/data/harnesses/apollo/skills/design/design-md/library/spacex.md +206 -0
  253. package/data/harnesses/apollo/skills/design/design-md/library/spotify.md +206 -0
  254. package/data/harnesses/apollo/skills/design/design-md/library/stripe.md +196 -0
  255. package/data/harnesses/apollo/skills/design/design-md/library/supabase.md +196 -0
  256. package/data/harnesses/apollo/skills/design/design-md/library/superhuman.md +194 -0
  257. package/data/harnesses/apollo/skills/design/design-md/library/tesla.md +198 -0
  258. package/data/harnesses/apollo/skills/design/design-md/library/theverge.md +199 -0
  259. package/data/harnesses/apollo/skills/design/design-md/library/together-ai.md +193 -0
  260. package/data/harnesses/apollo/skills/design/design-md/library/uber.md +195 -0
  261. package/data/harnesses/apollo/skills/design/design-md/library/vercel.md +195 -0
  262. package/data/harnesses/apollo/skills/design/design-md/library/voltagent.md +197 -0
  263. package/data/harnesses/apollo/skills/design/design-md/library/warp.md +196 -0
  264. package/data/harnesses/apollo/skills/design/design-md/library/webflow.md +197 -0
  265. package/data/harnesses/apollo/skills/design/design-md/library/wired.md +197 -0
  266. package/data/harnesses/apollo/skills/design/design-md/library/wise.md +198 -0
  267. package/data/harnesses/apollo/skills/design/design-md/library/x-ai.md +199 -0
  268. package/data/harnesses/apollo/skills/design/design-md/library/zapier.md +198 -0
  269. package/data/harnesses/apollo/skills/design/design-md/nurix.md +214 -0
  270. package/data/harnesses/apollo/skills/design/design-md/variants/editorial-luxury.md +184 -0
  271. package/data/harnesses/apollo/skills/design/design-md/variants/expressive-saas.md +216 -0
  272. package/data/harnesses/apollo/skills/design/design-md/variants/quiet-premium.md +211 -0
  273. package/data/harnesses/apollo/skills/design/design-md/variants/terse-dense-operator.md +212 -0
  274. package/data/harnesses/apollo/skills/design/design-md/variants/warm-approachable.md +216 -0
  275. package/data/harnesses/apollo/skills/design/references/compose.md +23 -0
  276. package/data/harnesses/apollo/skills/design/references/content.md +28 -0
  277. package/data/harnesses/apollo/skills/design/references/emission.md +21 -0
  278. package/data/harnesses/apollo/skills/design/references/existing-apps.md +27 -0
  279. package/data/harnesses/apollo/skills/design/references/intake.md +36 -0
  280. package/data/harnesses/apollo/skills/design/references/object-pass.md +24 -0
  281. package/data/harnesses/apollo/skills/design/references/ship-gate.md +29 -0
  282. package/data/harnesses/apollo/skills/design/references/ux-patterns/Readme.md +195 -0
  283. package/data/harnesses/apollo/skills/design/references/ux-patterns/ai-layer.md +49 -0
  284. package/data/harnesses/apollo/skills/design/references/ux-patterns/attributes-lifecycle.md +43 -0
  285. package/data/harnesses/apollo/skills/design/references/ux-patterns/container-choice.md +44 -0
  286. package/data/harnesses/apollo/skills/design/references/ux-patterns/creation-paths.md +46 -0
  287. package/data/harnesses/apollo/skills/design/references/ux-patterns/dashboards.md +42 -0
  288. package/data/harnesses/apollo/skills/design/references/ux-patterns/modes.md +42 -0
  289. package/data/harnesses/apollo/skills/design/references/ux-patterns/object-model.md +46 -0
  290. package/data/harnesses/apollo/skills/design/references/ux-patterns/page-archetype.md +48 -0
  291. package/data/harnesses/apollo/skills/design/references/ux-patterns/promotion-demotion.md +37 -0
  292. package/data/harnesses/apollo/skills/design/references/ux-patterns/settings.md +42 -0
  293. package/data/harnesses/apollo/skills/design/references/ux-patterns/standard-pages.md +46 -0
  294. package/data/harnesses/apollo/skills/design/references/ux-patterns/state-matrix.md +41 -0
  295. package/data/harnesses/apollo/skills/design/references/ux-patterns/table-mechanics.md +48 -0
  296. package/data/harnesses/apollo/skills/design/references/ux-patterns/verbs.md +45 -0
  297. package/data/harnesses/apollo/skills/design/references/ux-patterns/viewer-context.md +40 -0
  298. package/data/harnesses/apollo/skills/design/scripts/README-validator.md +27 -0
  299. package/data/harnesses/apollo/skills/design/scripts/select-chart.mjs +596 -0
  300. package/data/harnesses/apollo/skills/design/scripts/validate-design-md.mjs +1198 -0
  301. package/data/harnesses/apollo/skills/documentation/SKILL.md +134 -0
  302. package/data/harnesses/apollo/skills/documentation/references/examples.md +279 -0
  303. package/data/harnesses/apollo/skills/documentation/references/frontmatter.md +44 -0
  304. package/data/harnesses/apollo/skills/documentation/references/instruction-style.md +49 -0
  305. package/data/harnesses/apollo/skills/documentation/references/style-guide.md +351 -0
  306. package/data/harnesses/apollo/skills/documentation/references/untemplated.md +38 -0
  307. package/data/harnesses/apollo/skills/documentation/scripts/doc-lint.mjs +140 -0
  308. package/data/harnesses/apollo/skills/documentation/templates/Readme.md +34 -0
  309. package/data/harnesses/apollo/skills/documentation/templates/api-reference.md +20 -0
  310. package/data/harnesses/apollo/skills/documentation/templates/architecture-decision.md +121 -0
  311. package/data/harnesses/apollo/skills/documentation/templates/backlog.md +33 -0
  312. package/data/harnesses/apollo/skills/documentation/templates/behavioral-checklist.md +79 -0
  313. package/data/harnesses/apollo/skills/documentation/templates/bookkeeping.md +18 -0
  314. package/data/harnesses/apollo/skills/documentation/templates/changelog-entry.md +57 -0
  315. package/data/harnesses/apollo/skills/documentation/templates/changelog-index.md +41 -0
  316. package/data/harnesses/apollo/skills/documentation/templates/docs-readme.md +72 -0
  317. package/data/harnesses/apollo/skills/documentation/templates/domain-model.md +30 -0
  318. package/data/harnesses/apollo/skills/documentation/templates/environment-registry.md +15 -0
  319. package/data/harnesses/apollo/skills/documentation/templates/feature.md +149 -0
  320. package/data/harnesses/apollo/skills/documentation/templates/glossary.md +11 -0
  321. package/data/harnesses/apollo/skills/documentation/templates/journal.md +13 -0
  322. package/data/harnesses/apollo/skills/documentation/templates/memory-main.md +25 -0
  323. package/data/harnesses/apollo/skills/documentation/templates/migration-runbook.md +34 -0
  324. package/data/harnesses/apollo/skills/documentation/templates/non-goals.md +11 -0
  325. package/data/harnesses/apollo/skills/documentation/templates/operations-procedure.md +36 -0
  326. package/data/harnesses/apollo/skills/documentation/templates/plan.md +74 -0
  327. package/data/harnesses/apollo/skills/documentation/templates/protected-files.md +37 -0
  328. package/data/harnesses/apollo/skills/documentation/templates/root-readme.md +104 -0
  329. package/data/harnesses/apollo/skills/documentation/templates/security-overview.md +27 -0
  330. package/data/harnesses/apollo/skills/documentation/templates/structure.md +65 -0
  331. package/data/harnesses/apollo/skills/documentation/templates/system-overview.md +32 -0
  332. package/data/harnesses/apollo/skills/documentation/templates/testing-strategy.md +29 -0
  333. package/data/harnesses/apollo/skills/test-plan/SKILL.md +85 -0
  334. package/data/harnesses/apollo/skills/workflow-mapper/SKILL.md +451 -0
  335. package/data/harnesses/apollo/skills/workflow-mapper/references/patterns.md +214 -0
  336. package/data/harnesses/code/agents/bookkeeper.md +27 -0
  337. package/data/harnesses/code/agents/maintenance.md +5 -3
  338. package/data/harnesses/code/codex/agents/maintenance.toml +2 -2
  339. package/data/harnesses/code/harness.json +3 -2
  340. package/data/harnesses/code/hooks/awareness.mjs +370 -0
  341. package/data/harnesses/code/hooks/check-bookkeeping-clean.mjs +19 -0
  342. package/data/harnesses/code/hooks/check-changelog-presence.mjs +48 -0
  343. package/data/harnesses/code/hooks/check-completion-integrity.mjs +68 -0
  344. package/data/harnesses/code/hooks/check-ownership.mjs +22 -0
  345. package/data/harnesses/code/hooks/compliance.mjs +332 -0
  346. package/data/harnesses/code/hooks/hooks.json +16 -10
  347. package/data/harnesses/code/hooks/lib/frozen.mjs +58 -0
  348. package/data/harnesses/code/hooks/lib/ownership.mjs +223 -0
  349. package/data/harnesses/code/hooks/lib/state.mjs +156 -0
  350. package/data/harnesses/code/skills/boundary/SKILL.md +3 -1
  351. package/data/harnesses/code/skills/documentation/SKILL.md +2 -0
  352. package/data/harnesses/code/skills/documentation/templates/Readme.md +2 -0
  353. package/data/harnesses/code/skills/documentation/templates/bookkeeping.md +18 -0
  354. package/data/harnesses/code/skills/documentation/templates/journal.md +13 -0
  355. package/data/harnesses/code/skills/documentation/templates/plan.md +3 -0
  356. package/data/harnesses/code/skills/test-plan/SKILL.md +2 -0
  357. package/data/harnesses/delivery/agents/maintenance.md +5 -3
  358. package/data/harnesses/delivery/codex/agents/maintenance.toml +2 -2
  359. package/data/harnesses/delivery/harness.json +3 -2
  360. package/data/harnesses/delivery/skills/documentation/SKILL.md +2 -0
  361. package/data/harnesses/delivery/skills/documentation/templates/Readme.md +2 -0
  362. package/data/harnesses/delivery/skills/documentation/templates/bookkeeping.md +18 -0
  363. package/data/harnesses/delivery/skills/documentation/templates/journal.md +13 -0
  364. package/data/harnesses/delivery/skills/documentation/templates/plan.md +3 -0
  365. package/data/harnesses/discover/harness.json +2 -1
  366. package/data/harnesses/discussion/harness.json +1 -0
  367. package/data/harnesses/etna/agents/maintenance.md +5 -3
  368. package/data/harnesses/etna/codex/agents/maintenance.toml +2 -2
  369. package/data/harnesses/etna/harness.json +3 -2
  370. package/data/harnesses/etna/skills/boundary/SKILL.md +3 -1
  371. package/data/harnesses/etna/skills/documentation/SKILL.md +2 -0
  372. package/data/harnesses/etna/skills/documentation/templates/Readme.md +2 -0
  373. package/data/harnesses/etna/skills/documentation/templates/bookkeeping.md +18 -0
  374. package/data/harnesses/etna/skills/documentation/templates/journal.md +13 -0
  375. package/data/harnesses/etna/skills/documentation/templates/plan.md +3 -0
  376. package/data/harnesses/hr/harness.json +1 -0
  377. package/data/harnesses/kb-agi/harness.json +1 -0
  378. package/package.json +2 -2
@@ -27,7 +27,7 @@ Decide the mode once, up front, from the version marker — then run.
27
27
  2. Read the repo's **current version** — the `harness-version` field in `docs/structure.md` frontmatter (a semver).
28
28
  - **Absent** ⇒ the repo is unharnessed ⇒ **baseline mode** (reconcile from nothing), then audit.
29
29
  - **Behind on major** ⇒ **baseline mode** (reconcile across the gap), then audit.
30
- - **Behind on minor/patch** ⇒ **probe before deciding.** Run the Step B2 detection pass read-only: if any old-shape artifact in the fold table is present, **or** any **scaffolded file** in the target tree is missing (`docs/README.md`, `docs/structure.md`, `docs/history/CHANGELOG.md`, `docs/history/backlog.md`, `docs/memory/index.md`), the shape *did* change ⇒ **baseline mode**. Only when the probe finds nothing ⇒ re-stamp the version (no reshape), then audit.
30
+ - **Behind on minor/patch** ⇒ **probe before deciding.** Run the Step B2 detection pass read-only: if any old-shape artifact in the fold table is present, **or** any **scaffolded file** in the target tree is missing (`docs/README.md`, `docs/structure.md`, `docs/history/CHANGELOG.md`, `docs/history/backlog.md`, `docs/memory/main.md`), the shape *did* change ⇒ **baseline mode**. Only when the probe finds nothing ⇒ re-stamp the version (no reshape), then audit.
31
31
 
32
32
  > **Never probe on a missing folder.** Git does not track empty directories, so an unused folder is absent on every clone — reading that as drift puts the repo in baseline mode *forever* and contradicts this agent's own idempotency guarantee. Only the five scaffolded files above are shape signals; every folder in the target tree is created on first use.
33
33
  - **Equal to installed** ⇒ **audit only** (the default spine).
@@ -115,7 +115,7 @@ For unowned code paths:
115
115
 
116
116
  ### Step 6: Report & update tracking
117
117
 
118
- 1. Update `docs/structure.md` Health Log with today's date and summary — **append to the end**, never date-sorted into the middle. Rows are positional: one may say "the row above is…", and an inserted row silently breaks that reference.
118
+ 1. Update `docs/structure.md` Health Log with today's date and summary — **append to the end**, never date-sorted into the middle. Rows are positional: one may say "the row above is…", and an inserted row silently breaks that reference. A Health Log entry is a **generated row, not a narrative essay**: one line — date · counts (stale docs fixed, dead globs, unowned paths, backlog items created) · links to anything that needs a human.
119
119
  2. Update `docs/memory/maintenance.md` with last review date, stale docs fixed, unowned paths, backlog items created.
120
120
  3. Report findings: stale docs, broken ownership, unowned code, architecture drift, backlog health.
121
121
 
@@ -137,6 +137,7 @@ docs/
137
137
  ├── features/ # Feature specs — the only first-class doc unit (flat; ownership in each doc's `owns:` frontmatter)
138
138
  │ └── {group}/ # browse-only subfolder for grouping; NEVER a module; may carry a Readme.md
139
139
  ├── operations/ # Setup, development, deployment, CI/CD
140
+ │ └── bookkeeping.md # the shared doc-sync work queue (hook-appended, bookkeeper-drained, walled at commit) — author-created, never scaffolded; treat rows as live work, never as drift
140
141
  ├── research/ # In-progress brainstorm sessions ({topic}-brainstorm/; legacy -brainstorming/) + standing research; Readme.md is the index
141
142
  │ └── {topic}-brainstorm/ # created by the `brainstorm` skill; moves to history/brainstorms/ on a passed harvest
142
143
  ├── history/
@@ -144,11 +145,12 @@ docs/
144
145
  │ ├── changelog/ # Individual entries (YYYY-MM-DD-{three-words}.md; written at commit time)
145
146
  │ ├── plans/ # Implementation plans (Status field required)
146
147
  │ ├── migrations/ # One-shot migration/upgrade runbooks (YYYY-MM-DD-{slug}.md; outcome-stamped then frozen)
148
+ │ ├── journal.md # Append-only mid-execution knowledge capture (one line per fact; resolves by landing in its owning doc) — author-created, never scaffolded
147
149
  │ ├── brainstorms/ # Harvested brainstorm sessions ({topic}/) — user decides kept (committed) or deleted; Readme.md is the index
148
150
  │ ├── research/ # Deep-research records ({topic}/ — README.md synthesis + findings.md + sources.md); frozen, cited, owns no code
149
151
  │ └── backlog.md ✱ # Tracked work items by priority (P0-P3)
150
152
  ├── memory/
151
- │ └── index.md ✱ # plus main.md, {agent}.md — project knowledge + per-agent strategy memory
153
+ │ └── main.md ✱ # plus {agent}.md — project knowledge + per-agent strategy memory
152
154
  └── tests/ # Behavioral test checklists ({feature}.md, step → **Assert**), derived at plan Completion via the `documentation` skill; author-maintained
153
155
  ```
154
156
 
@@ -25,7 +25,7 @@ Decide the mode once, up front, from the version marker — then run.
25
25
  2. Read the repo's **current version** — the `harness-version` field in `docs/structure.md` frontmatter (a semver).
26
26
  - **Absent** ⇒ the repo is unharnessed ⇒ **baseline mode** (reconcile from nothing), then audit.
27
27
  - **Behind on major** ⇒ **baseline mode** (reconcile across the gap), then audit.
28
- - **Behind on minor/patch** ⇒ **probe before deciding.** Run the Step B2 detection pass read-only: if any old-shape artifact in the fold table is present, **or** any **scaffolded file** in the target tree is missing (`docs/README.md`, `docs/structure.md`, `docs/history/CHANGELOG.md`, `docs/history/backlog.md`, `docs/memory/index.md`), the shape *did* change ⇒ **baseline mode**. Only when the probe finds nothing ⇒ re-stamp the version (no reshape), then audit.
28
+ - **Behind on minor/patch** ⇒ **probe before deciding.** Run the Step B2 detection pass read-only: if any old-shape artifact in the fold table is present, **or** any **scaffolded file** in the target tree is missing (`docs/README.md`, `docs/structure.md`, `docs/history/CHANGELOG.md`, `docs/history/backlog.md`, `docs/memory/main.md`), the shape *did* change ⇒ **baseline mode**. Only when the probe finds nothing ⇒ re-stamp the version (no reshape), then audit.
29
29
 
30
30
  > **Never probe on a missing folder.** Git does not track empty directories, so an unused folder is absent on every clone — reading that as drift puts the repo in baseline mode *forever* and contradicts this agent's own idempotency guarantee. Only the five scaffolded files above are shape signals; every folder in the target tree is created on first use.
31
31
  - **Equal to installed** ⇒ **audit only** (the default spine).
@@ -146,7 +146,7 @@ docs/
146
146
  │ ├── research/ # Deep-research records ({topic}/ — README.md synthesis + findings.md + sources.md); frozen, cited, owns no code
147
147
  │ └── backlog.md ✱ # Tracked work items by priority (P0-P3)
148
148
  ├── memory/
149
- │ └── index.md ✱ # plus main.md, {agent}.md — project knowledge + per-agent strategy memory
149
+ │ └── main.md ✱ # plus {agent}.md — project knowledge + per-agent strategy memory
150
150
  └── tests/ # Behavioral test checklists ({feature}.md, step → **Assert**), derived at plan Completion via the `documentation` skill; author-maintained
151
151
  ```
152
152
 
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "harness": "code",
3
3
  "name": "code",
4
- "version": "3.5.8",
4
+ "version": "3.5.10",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
8
8
  ".vscode/settings.json"
9
9
  ],
10
- "digest": "5dafd73481fb"
10
+ "seeds": [],
11
+ "digest": "552c88cf99bf"
11
12
  }
@@ -0,0 +1,370 @@
1
+ // harness/code/hooks/awareness.mjs — the inform-never-block hook module.
2
+ // SessionStart: inject the session context block, the ownership index, and a budget-capped drift
3
+ // banner (full report → .claude/state/drift-report.md). PostToolUse (Edit|Write|MultiEdit|Bash):
4
+ // the silent detector — record file→doc touches, append machine-recomputable findings as auto:
5
+ // rows to docs/operations/bookkeeping.md. Never narrates into the session, never blocks, exits 0
6
+ // on every path: everything here is a convenience, absent on any failure.
7
+
8
+ import fs from "node:fs";
9
+ import path from "node:path";
10
+ import { spawnSync } from "node:child_process";
11
+ import {
12
+ readStdin,
13
+ resolveProjectDir,
14
+ buildIndex,
15
+ scanFeatureDocs,
16
+ owningDocs,
17
+ listRepoFiles,
18
+ deadGlobs,
19
+ globToRegExp,
20
+ frontmatter,
21
+ } from "./lib/ownership.mjs";
22
+ import {
23
+ readQueue,
24
+ countRows,
25
+ formatAutoRow,
26
+ appendRows,
27
+ resolveRows,
28
+ unexpiredWaivers,
29
+ stateDir,
30
+ recordTouched,
31
+ } from "./lib/state.mjs";
32
+
33
+ const today = () => new Date().toISOString().slice(0, 10);
34
+
35
+ function readSafe(file) {
36
+ try {
37
+ return fs.readFileSync(file, "utf8");
38
+ } catch (e) {
39
+ return "";
40
+ }
41
+ }
42
+
43
+ function readJsonSafe(file) {
44
+ try {
45
+ return JSON.parse(fs.readFileSync(file, "utf8"));
46
+ } catch (e) {
47
+ return null;
48
+ }
49
+ }
50
+
51
+ // ---------------------------------------------------------------------------
52
+ // SessionStart
53
+ // ---------------------------------------------------------------------------
54
+
55
+ function detectPackageManager(projectDir) {
56
+ const lockfiles = [
57
+ ["pnpm-lock.yaml", "pnpm"],
58
+ ["package-lock.json", "npm"],
59
+ ["yarn.lock", "yarn"],
60
+ ["bun.lockb", "bun"],
61
+ ["bun.lock", "bun"],
62
+ ];
63
+ for (const [file, manager] of lockfiles) {
64
+ if (fs.existsSync(path.join(projectDir, file))) return `${manager} (${file} found)`;
65
+ }
66
+ return null;
67
+ }
68
+
69
+ function harnessLine(projectDir) {
70
+ const marker = readJsonSafe(path.join(projectDir, ".claude", "harness.json"));
71
+ if (!marker || !marker.version) return null;
72
+ const structure = readSafe(path.join(projectDir, "docs", "structure.md"));
73
+ const stamped = (/harness-version:\s*([\w.-]+)/.exec(frontmatter(structure) || structure) || [])[1];
74
+ const state =
75
+ stamped === marker.version
76
+ ? "reconciled"
77
+ : stamped
78
+ ? `stamped ${stamped} — behind: run maintenance`
79
+ : "unstamped — run maintenance";
80
+ return `Harness: installed ${marker.version} · docs/structure.md ${state}`;
81
+ }
82
+
83
+ function memoryLine(projectDir) {
84
+ const dir = path.join(projectDir, "docs", "memory");
85
+ let entries;
86
+ try {
87
+ entries = fs.readdirSync(dir).filter((f) => f.endsWith(".md"));
88
+ } catch (e) {
89
+ return null;
90
+ }
91
+ return entries.length ? `Memory: ${entries.map((f) => `docs/memory/${f}`).join(", ")}` : null;
92
+ }
93
+
94
+ function openPlanLines(projectDir) {
95
+ const dir = path.join(projectDir, "docs", "history", "plans");
96
+ let entries;
97
+ try {
98
+ entries = fs.readdirSync(dir).filter((f) => f.endsWith(".md"));
99
+ } catch (e) {
100
+ return [];
101
+ }
102
+ const lines = [];
103
+ for (const file of entries) {
104
+ const text = readSafe(path.join(dir, file));
105
+ const status = (/^\*\*Status:\*\*\s*(.+)$/m.exec(text) || [])[1]?.trim();
106
+ if (!status || /Complete|Abandoned/.test(status)) continue;
107
+ const gates = (/^\*\*Gates:\*\*\s*(.+)$/m.exec(text) || [])[1]?.trim();
108
+ const ledgerRows = (text.match(/^\|\s*\d+\s*\|/gm) || []).length;
109
+ const parts = [`Open plan: ${file} (${status}`];
110
+ if (gates) parts.push(` · Gates: ${gates}`);
111
+ if (ledgerRows) parts.push(` · ledger: ${ledgerRows} rows`);
112
+ lines.push(parts.join("") + ")");
113
+ }
114
+ return lines;
115
+ }
116
+
117
+ // Compute drift facts once; write the full report, return the one-line banner.
118
+ function driftBanner(projectDir) {
119
+ const repoFiles = listRepoFiles(projectDir);
120
+ const dead = deadGlobs(projectDir, repoFiles);
121
+ const queueRows = readQueue(projectDir);
122
+ const counts = countRows(queueRows);
123
+ const waivers = unexpiredWaivers(queueRows, "dead-glob", today());
124
+ const unwaivedDead = dead.filter((d) => !waivers.some((w) => w.body.includes(d.glob)));
125
+
126
+ // Docs older than the code they own (doc mtime < newest owned-file mtime).
127
+ const staleDocs = [];
128
+ for (const entry of scanFeatureDocs(projectDir)) {
129
+ let docTime;
130
+ try {
131
+ docTime = fs.statSync(path.join(projectDir, entry.doc)).mtimeMs;
132
+ } catch (e) {
133
+ continue;
134
+ }
135
+ const res = entry.owns.map((g) => globToRegExp(g));
136
+ let newest = 0;
137
+ for (const file of repoFiles) {
138
+ if (!res.some((re) => re.test(file))) continue;
139
+ try {
140
+ newest = Math.max(newest, fs.statSync(path.join(projectDir, file)).mtimeMs);
141
+ } catch (e) {
142
+ /* deleted between walk and stat */
143
+ }
144
+ }
145
+ if (newest > docTime) staleDocs.push(entry.doc);
146
+ }
147
+
148
+ const report = [
149
+ `# Drift report — generated ${new Date().toISOString()}`,
150
+ "",
151
+ `## Dead owns: globs (${dead.length}, ${dead.length - unwaivedDead.length} waived)`,
152
+ ...dead.map((d) => `- ${d.glob} → ${d.doc}${unwaivedDead.includes(d) ? "" : " (waived)"}`),
153
+ "",
154
+ `## Docs older than owned code (${staleDocs.length})`,
155
+ ...staleDocs.map((d) => `- ${d}`),
156
+ "",
157
+ `## Bookkeeping queue (${counts.unresolved} unresolved: ${counts.auto} auto · ${counts.note} note · ${counts.needsSession} needs-session · ${counts.waived} waived)`,
158
+ ].join("\n");
159
+ try {
160
+ fs.writeFileSync(path.join(stateDir(projectDir), "drift-report.md"), report + "\n");
161
+ } catch (e) {
162
+ /* report is a convenience */
163
+ }
164
+
165
+ if (dead.length === 0 && staleDocs.length === 0 && counts.unresolved === 0) return null;
166
+ const waivedNote = dead.length
167
+ ? unwaivedDead.length === 0
168
+ ? " (all waived)"
169
+ : ` (${unwaivedDead.length} UNWAIVED)`
170
+ : "";
171
+ return (
172
+ `Drift: ${dead.length} dead owns: glob(s)${waivedNote} · ${staleDocs.length} doc(s) older than owned code · ` +
173
+ `bookkeeping: ${counts.unresolved} unresolved row(s) — full report: .claude/state/drift-report.md`
174
+ );
175
+ }
176
+
177
+ function sessionStart(projectDir) {
178
+ const lines = [];
179
+ const pm = detectPackageManager(projectDir);
180
+ if (pm) lines.push(`Package manager: ${pm}`);
181
+ const harness = harnessLine(projectDir);
182
+ if (harness) lines.push(harness);
183
+ const memory = memoryLine(projectDir);
184
+ if (memory) lines.push(memory);
185
+ lines.push(...openPlanLines(projectDir).slice(0, 4));
186
+ try {
187
+ const drift = driftBanner(projectDir);
188
+ if (drift) lines.push(drift);
189
+ } catch (e) {
190
+ /* the banner is optional; the index below still injects */
191
+ }
192
+ const block = lines.length
193
+ ? "# Session context (generated — a convenience, never a gate)\n" + lines.slice(0, 10).join("\n")
194
+ : "";
195
+ const index = buildIndex(projectDir);
196
+ const context = [block, index].filter(Boolean).join("\n\n");
197
+ if (!context) return;
198
+ process.stdout.write(
199
+ JSON.stringify({
200
+ hookSpecificOutput: { hookEventName: "SessionStart", additionalContext: context },
201
+ })
202
+ );
203
+ }
204
+
205
+ // ---------------------------------------------------------------------------
206
+ // PostToolUse — the silent detector
207
+ // ---------------------------------------------------------------------------
208
+
209
+ const SOURCE_EXT = /\.(m?[jt]sx?|py|rs|go|rb|java|kt|swift|c|h|cpp|hpp|cs|sh|sql|css|scss|vue|svelte)$/;
210
+
211
+ function relIfInside(projectDir, filePath) {
212
+ if (!filePath) return null;
213
+ const rel = path.relative(projectDir, path.resolve(projectDir, filePath));
214
+ if (rel.startsWith("..") || path.isAbsolute(rel)) return null;
215
+ return rel.split(path.sep).join("/");
216
+ }
217
+
218
+ // Spawn the installed doc-lint over one file; returns finding lines (empty when absent/clean).
219
+ function docLint(projectDir, rel) {
220
+ const script = path.join(projectDir, ".claude", "skills", "documentation", "scripts", "doc-lint.mjs");
221
+ if (!fs.existsSync(script)) return [];
222
+ const res = spawnSync("node", [script, rel], { cwd: projectDir, encoding: "utf8", timeout: 5000 });
223
+ const out = `${res.stdout || ""}`;
224
+ return out.split("\n").filter((line) => /:\d+ \[(block|warn)\]/.test(line));
225
+ }
226
+
227
+ // True when a source file's first lines carry its repo-relative path (the header-comment rule).
228
+ function hasHeaderComment(projectDir, rel) {
229
+ const head = readSafe(path.join(projectDir, rel)).split("\n").slice(0, 5).join("\n");
230
+ return head.includes(rel) || head.includes(path.basename(rel));
231
+ }
232
+
233
+ function detectorForFile(projectDir, rel, meta, rows) {
234
+ const owners = owningDocs(projectDir, rel);
235
+ recordTouched(projectDir, rel, owners.map((o) => o.doc));
236
+
237
+ if (rel.endsWith(".md")) {
238
+ // An edited doc resolves any doc-implicated row that pointed at it.
239
+ resolveRows(projectDir, (row) => row.kind === "auto" && row.body.includes("doc-implicated") && row.body.includes(rel));
240
+ if (rel.startsWith("docs/")) {
241
+ const findings = docLint(projectDir, rel);
242
+ if (findings.length) {
243
+ rows.push(
244
+ formatAutoRow({
245
+ ...meta,
246
+ kind: "doc-lint",
247
+ description: `${rel} has ${findings.length} doc-lint finding(s)`,
248
+ action: `fix or doc-lint-disable with reason`,
249
+ })
250
+ );
251
+ }
252
+ }
253
+ const segment = rel.split("/")[1];
254
+ if (rel.startsWith("docs/") && segment && !segment.endsWith(".md")) {
255
+ const structure = readSafe(path.join(projectDir, "docs", "structure.md"));
256
+ if (structure && !structure.includes(`${segment}/`) && !structure.includes(`docs/${segment}`)) {
257
+ rows.push(
258
+ formatAutoRow({
259
+ ...meta,
260
+ kind: "doc-placement",
261
+ description: `${rel} sits in a folder absent from docs/structure.md's authority map`,
262
+ action: "move the doc per the add-a-doc table, or record the new folder in structure.md",
263
+ })
264
+ );
265
+ }
266
+ }
267
+ if (rel.startsWith("docs/features/") && !readSafe(path.join(projectDir, "docs", "README.md")).includes(path.basename(rel))) {
268
+ rows.push(
269
+ formatAutoRow({
270
+ ...meta,
271
+ kind: "index-row-missing",
272
+ description: `${rel} is not linked from docs/README.md`,
273
+ action: "add its row to the Features index",
274
+ })
275
+ );
276
+ }
277
+ return;
278
+ }
279
+
280
+ if (SOURCE_EXT.test(rel)) {
281
+ if (!hasHeaderComment(projectDir, rel)) {
282
+ rows.push(
283
+ formatAutoRow({
284
+ ...meta,
285
+ kind: "header-missing",
286
+ description: `${rel} lacks its file-path header comment`,
287
+ action: "add the header comment",
288
+ })
289
+ );
290
+ }
291
+ for (const owner of owners) {
292
+ rows.push(
293
+ formatAutoRow({
294
+ ...meta,
295
+ kind: "doc-implicated",
296
+ description: `${rel} changed; owning doc ${owner.doc} may need an update (doc-implicated: ${owner.doc})`,
297
+ action: "update the doc or delete this row if no documented behavior changed",
298
+ })
299
+ );
300
+ }
301
+ if (/(schema|init\.sql|migration|auth|webhook|\benv\b|wrangler)/i.test(rel)) {
302
+ rows.push(
303
+ formatAutoRow({
304
+ ...meta,
305
+ kind: "boundary-scan-suggested",
306
+ description: `${rel} is contract-heavy`,
307
+ action: "run the boundary skill scoped to the diff",
308
+ })
309
+ );
310
+ }
311
+ }
312
+ }
313
+
314
+ function detectRenames(projectDir, command, meta, rows) {
315
+ if (!/\bgit mv\b|\bmv\b/.test(command || "")) return;
316
+ for (const { glob, doc } of deadGlobs(projectDir)) {
317
+ rows.push(
318
+ formatAutoRow({
319
+ ...meta,
320
+ kind: "dead-glob",
321
+ description: `owns: glob \`${glob}\` in ${doc} matches no files`,
322
+ action: `update the doc's owns: frontmatter`,
323
+ })
324
+ );
325
+ }
326
+ }
327
+
328
+ function postToolUse(projectDir, payload) {
329
+ const meta = {
330
+ date: today(),
331
+ sessionId: payload.session_id,
332
+ transcriptPath: payload.transcript_path,
333
+ ts: new Date().toISOString(),
334
+ };
335
+ const input = payload.tool_input || {};
336
+ const rows = [];
337
+ if (payload.tool_name === "Bash") {
338
+ detectRenames(projectDir, input.command, meta, rows);
339
+ } else {
340
+ const rel = relIfInside(projectDir, input.file_path || input.notebook_path);
341
+ if (rel) detectorForFile(projectDir, rel, meta, rows);
342
+ // Editing a feature doc's frontmatter can orphan globs the same way a rename can.
343
+ if (rel && rel.startsWith("docs/features/")) detectRenames(projectDir, "git mv", meta, rows);
344
+ }
345
+ appendRows(projectDir, rows);
346
+ }
347
+
348
+ // ---------------------------------------------------------------------------
349
+
350
+ function main() {
351
+ const raw = readStdin();
352
+ let payload = {};
353
+ try {
354
+ payload = raw ? JSON.parse(raw) : {};
355
+ } catch (e) {
356
+ payload = {};
357
+ }
358
+ const projectDir = resolveProjectDir(payload);
359
+ const event = payload.hook_event_name || "SessionStart";
360
+ if (event === "PostToolUse") postToolUse(projectDir, payload);
361
+ else sessionStart(projectDir);
362
+ }
363
+
364
+ try {
365
+ main();
366
+ } catch (e) {
367
+ // Inform-only module: on any failure, inject nothing, write nothing, never block.
368
+ } finally {
369
+ process.exit(0);
370
+ }
@@ -0,0 +1,19 @@
1
+ // harness/code/hooks/check-bookkeeping-clean.mjs — CI backstop: no unresolved bookkeeping rows
2
+ // (auto:/note:/needs-session:) may reach the remote. waived: rows pass — they are the recorded,
3
+ // PR-reviewable exceptions. Exit 1 when unresolved rows exist.
4
+
5
+ import { readQueue, countRows } from "./lib/state.mjs";
6
+
7
+ const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
8
+ const counts = countRows(readQueue(projectDir));
9
+
10
+ if (counts.unresolved === 0) {
11
+ console.log(`check-bookkeeping-clean: OK (${counts.waived} waived row(s))`);
12
+ process.exit(0);
13
+ }
14
+ console.error(
15
+ `check-bookkeeping-clean: ${counts.unresolved} unresolved row(s) in docs/operations/bookkeeping.md ` +
16
+ `(${counts.auto} auto, ${counts.note} note, ${counts.needsSession} needs-session). ` +
17
+ "Drain them (bookkeeper agent), resolve them, or convert to waived: with reason + expires=."
18
+ );
19
+ process.exit(1);
@@ -0,0 +1,48 @@
1
+ // harness/code/hooks/check-changelog-presence.mjs — CI backstop: the commit under test (HEAD)
2
+ // carries a docs/history/changelog/ entry unless it is exempt by the changelog rule's closed list,
3
+ // judged mechanically: lockfile-only, harness-file-only, pure renames, changelog housekeeping,
4
+ // or a bot author. Exit 1 when a non-exempt HEAD stages no entry.
5
+
6
+ import { spawnSync } from "node:child_process";
7
+ import path from "node:path";
8
+
9
+ const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
10
+
11
+ function git(args) {
12
+ const res = spawnSync("git", args, { cwd: projectDir, encoding: "utf8" });
13
+ return res.status === 0 ? (res.stdout || "").trim() : null;
14
+ }
15
+
16
+ const nameStatus = git(["diff-tree", "--root", "--no-commit-id", "--name-status", "-r", "HEAD"]) || "";
17
+ const entries = nameStatus
18
+ .split("\n")
19
+ .filter(Boolean)
20
+ .map((line) => {
21
+ const [status, ...files] = line.split("\t");
22
+ return { status, file: files[files.length - 1] };
23
+ });
24
+
25
+ const LOCKFILES = /^(pnpm-lock\.yaml|package-lock\.json|yarn\.lock|bun\.lockb?|Cargo\.lock)$/;
26
+ const exemptFile = (f) =>
27
+ LOCKFILES.test(path.basename(f)) ||
28
+ f.startsWith(".claude/") ||
29
+ f === "AGENTS.md" ||
30
+ f === "CLAUDE.md" ||
31
+ f.startsWith("docs/history/changelog/") ||
32
+ f === "docs/history/CHANGELOG.md";
33
+
34
+ const author = git(["log", "-1", "--format=%an <%ae>"]) || "";
35
+ const isBot = /\[bot\]|actions@github\.com/i.test(author);
36
+ const allRenames = entries.length > 0 && entries.every((e) => e.status.startsWith("R"));
37
+ const allExempt = entries.length === 0 || entries.every((e) => exemptFile(e.file));
38
+ const hasEntry = entries.some((e) => e.file.startsWith("docs/history/changelog/") && e.file.endsWith(".md"));
39
+
40
+ if (isBot || allRenames || allExempt || hasEntry) {
41
+ console.log("check-changelog-presence: OK");
42
+ process.exit(0);
43
+ }
44
+ console.error(
45
+ "check-changelog-presence: HEAD is a non-exempt commit carrying no docs/history/changelog/ entry. " +
46
+ "Every non-exempt commit ships its entry inside it (exempt: release/bot, lockfile-only, pure renames, changelog housekeeping)."
47
+ );
48
+ process.exit(1);
@@ -0,0 +1,68 @@
1
+ // harness/code/hooks/check-completion-integrity.mjs — CI backstop for plan completion. Scope:
2
+ // plans in the Gates: format only (legacy plans predate the contract and are history). A Complete
3
+ // plan must show a fully discharged surface: no unchecked Done Criteria boxes, the Spec'd LLD
4
+ // flipped active, and the behavioral checklist present. An Abandoned plan must reference the
5
+ // backlog (undischarged obligations outlive the frozen file there). Exit 1 on any violation.
6
+
7
+ import fs from "node:fs";
8
+ import path from "node:path";
9
+ import { frontmatter, field } from "./lib/ownership.mjs";
10
+
11
+ const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
12
+ const plansDir = path.join(projectDir, "docs", "history", "plans");
13
+
14
+ function readSafe(file) {
15
+ try {
16
+ return fs.readFileSync(file, "utf8");
17
+ } catch (e) {
18
+ return "";
19
+ }
20
+ }
21
+
22
+ let failures = 0;
23
+ const fail = (msg) => {
24
+ failures += 1;
25
+ console.error(`check-completion-integrity: ${msg}`);
26
+ };
27
+
28
+ let plans = [];
29
+ try {
30
+ plans = fs.readdirSync(plansDir).filter((f) => f.endsWith(".md"));
31
+ } catch (e) {
32
+ plans = [];
33
+ }
34
+
35
+ for (const file of plans) {
36
+ const text = readSafe(path.join(plansDir, file));
37
+ if (!/^\*\*Gates:\*\*/m.test(text)) continue; // legacy plan — out of contract
38
+ const status = (/^\*\*Status:\*\*\s*(\S+)/m.exec(text) || [])[1];
39
+
40
+ if (status === "Complete") {
41
+ const unchecked = (text.match(/^- \[ \]/gm) || []).length;
42
+ if (unchecked > 0) fail(`${file} is Complete with ${unchecked} unchecked Done Criteria box(es)`);
43
+
44
+ const spec = (/^\*\*Spec:\*\*\s*\[[^\]]*\]\(([^)]+)\)/m.exec(text) || [])[1];
45
+ if (spec) {
46
+ const specPath = path.resolve(plansDir, spec);
47
+ const specText = readSafe(specPath);
48
+ const specStatus = (field(frontmatter(specText), "status") || "").toString();
49
+ if (specText && specStatus !== "active") {
50
+ fail(`${file} is Complete but its Spec LLD is status: ${specStatus || "unknown"} (expected active)`);
51
+ }
52
+ const feature = path.basename(specPath, ".md");
53
+ if (!fs.existsSync(path.join(projectDir, "docs", "tests", `${feature}.md`))) {
54
+ fail(`${file} is Complete but docs/tests/${feature}.md (the behavioral checklist) is missing`);
55
+ }
56
+ }
57
+ }
58
+
59
+ if (status === "Abandoned" && !/backlog/i.test(text)) {
60
+ fail(`${file} is Abandoned without referencing the backlog — undischarged obligations must outlive the frozen plan`);
61
+ }
62
+ }
63
+
64
+ if (failures === 0) {
65
+ console.log("check-completion-integrity: OK");
66
+ process.exit(0);
67
+ }
68
+ process.exit(1);
@@ -0,0 +1,22 @@
1
+ // harness/code/hooks/check-ownership.mjs — CI backstop: every owns: glob must match at least one
2
+ // file, unless an unexpired `waived:` dead-glob row in docs/operations/bookkeeping.md covers it
3
+ // (the waiver names the glob verbatim). Exit 1 on any unwaived dead glob.
4
+
5
+ import { deadGlobs } from "./lib/ownership.mjs";
6
+ import { readQueue, unexpiredWaivers } from "./lib/state.mjs";
7
+
8
+ const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
9
+ const today = new Date().toISOString().slice(0, 10);
10
+
11
+ const dead = deadGlobs(projectDir);
12
+ const waivers = unexpiredWaivers(readQueue(projectDir), "dead-glob", today);
13
+ const unwaived = dead.filter((d) => !waivers.some((w) => w.body.includes(d.glob)));
14
+
15
+ if (unwaived.length === 0) {
16
+ console.log(`check-ownership: OK (${dead.length} dead glob(s), all waived or none)`);
17
+ process.exit(0);
18
+ }
19
+ console.error(`check-ownership: ${unwaived.length} unwaived dead owns: glob(s):`);
20
+ for (const d of unwaived) console.error(` ${d.glob} → ${d.doc}`);
21
+ console.error("Fix the owning doc's owns: frontmatter, or add a `waived:` dead-glob row with reason + expires=.");
22
+ process.exit(1);