kenaz 0.0.0-stage → 0.3.2

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 (1641) hide show
  1. package/bin/kenaz.js +3 -0
  2. package/core/.agents/skills/remotion-best-practices/SKILL.md +61 -0
  3. package/core/.agents/skills/remotion-best-practices/rules/3d.md +86 -0
  4. package/core/.agents/skills/remotion-best-practices/rules/animations.md +27 -0
  5. package/core/.agents/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  6. package/core/.agents/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  7. package/core/.agents/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +103 -0
  8. package/core/.agents/skills/remotion-best-practices/rules/assets.md +78 -0
  9. package/core/.agents/skills/remotion-best-practices/rules/audio-visualization.md +198 -0
  10. package/core/.agents/skills/remotion-best-practices/rules/audio.md +169 -0
  11. package/core/.agents/skills/remotion-best-practices/rules/calculate-metadata.md +134 -0
  12. package/core/.agents/skills/remotion-best-practices/rules/can-decode.md +81 -0
  13. package/core/.agents/skills/remotion-best-practices/rules/charts.md +120 -0
  14. package/core/.agents/skills/remotion-best-practices/rules/compositions.md +154 -0
  15. package/core/.agents/skills/remotion-best-practices/rules/display-captions.md +184 -0
  16. package/core/.agents/skills/remotion-best-practices/rules/extract-frames.md +229 -0
  17. package/core/.agents/skills/remotion-best-practices/rules/ffmpeg.md +38 -0
  18. package/core/.agents/skills/remotion-best-practices/rules/fonts.md +152 -0
  19. package/core/.agents/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
  20. package/core/.agents/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  21. package/core/.agents/skills/remotion-best-practices/rules/get-video-duration.md +60 -0
  22. package/core/.agents/skills/remotion-best-practices/rules/gifs.md +141 -0
  23. package/core/.agents/skills/remotion-best-practices/rules/images.md +134 -0
  24. package/core/.agents/skills/remotion-best-practices/rules/import-srt-captions.md +69 -0
  25. package/core/.agents/skills/remotion-best-practices/rules/light-leaks.md +73 -0
  26. package/core/.agents/skills/remotion-best-practices/rules/lottie.md +70 -0
  27. package/core/.agents/skills/remotion-best-practices/rules/maps.md +412 -0
  28. package/core/.agents/skills/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
  29. package/core/.agents/skills/remotion-best-practices/rules/measuring-text.md +140 -0
  30. package/core/.agents/skills/remotion-best-practices/rules/parameters.md +109 -0
  31. package/core/.agents/skills/remotion-best-practices/rules/sequencing.md +118 -0
  32. package/core/.agents/skills/remotion-best-practices/rules/sfx.md +30 -0
  33. package/core/.agents/skills/remotion-best-practices/rules/subtitles.md +36 -0
  34. package/core/.agents/skills/remotion-best-practices/rules/tailwind.md +11 -0
  35. package/core/.agents/skills/remotion-best-practices/rules/text-animations.md +20 -0
  36. package/core/.agents/skills/remotion-best-practices/rules/timing.md +179 -0
  37. package/core/.agents/skills/remotion-best-practices/rules/transcribe-captions.md +70 -0
  38. package/core/.agents/skills/remotion-best-practices/rules/transitions.md +197 -0
  39. package/core/.agents/skills/remotion-best-practices/rules/transparent-videos.md +106 -0
  40. package/core/.agents/skills/remotion-best-practices/rules/trimming.md +51 -0
  41. package/core/.agents/skills/remotion-best-practices/rules/videos.md +171 -0
  42. package/core/.agents/skills/remotion-best-practices/rules/voiceover.md +99 -0
  43. package/core/.agents/skills/supabase-postgres-best-practices/AGENTS.md +90 -0
  44. package/core/.agents/skills/supabase-postgres-best-practices/CLAUDE.md +1 -0
  45. package/core/.agents/skills/supabase-postgres-best-practices/SKILL.md +64 -0
  46. package/core/.agents/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  47. package/core/.agents/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  48. package/core/.agents/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  49. package/core/.agents/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  50. package/core/.agents/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  51. package/core/.agents/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  52. package/core/.agents/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  53. package/core/.agents/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  54. package/core/.agents/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  55. package/core/.agents/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  56. package/core/.agents/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  57. package/core/.agents/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  58. package/core/.agents/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  59. package/core/.agents/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  60. package/core/.agents/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  61. package/core/.agents/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  62. package/core/.agents/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  63. package/core/.agents/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  64. package/core/.agents/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  65. package/core/.agents/skills/supabase-postgres-best-practices/references/query-index-types.md +45 -0
  66. package/core/.agents/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  67. package/core/.agents/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  68. package/core/.agents/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  69. package/core/.agents/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  70. package/core/.agents/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  71. package/core/.agents/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  72. package/core/.agents/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  73. package/core/.agents/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  74. package/core/.agents/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  75. package/core/.agents/skills/supabase-postgres-best-practices/references/security-rls-performance.md +57 -0
  76. package/core/.agents/skills/typesafe-ai/LICENSE +21 -0
  77. package/core/.agents/skills/typesafe-ai/SKILL.md +149 -0
  78. package/core/.agents/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  79. package/core/.agents/skills/vercel-react-best-practices/SKILL.md +136 -0
  80. package/core/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  81. package/core/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  82. package/core/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  83. package/core/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  84. package/core/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  85. package/core/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  86. package/core/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  87. package/core/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  88. package/core/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  89. package/core/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  90. package/core/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  91. package/core/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  92. package/core/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  93. package/core/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  94. package/core/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  95. package/core/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  96. package/core/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  97. package/core/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  98. package/core/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  99. package/core/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  100. package/core/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  101. package/core/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  102. package/core/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  103. package/core/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  104. package/core/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  105. package/core/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  106. package/core/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  107. package/core/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  108. package/core/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  109. package/core/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  110. package/core/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  111. package/core/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  112. package/core/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  113. package/core/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  114. package/core/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  115. package/core/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  116. package/core/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  117. package/core/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  118. package/core/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  119. package/core/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  120. package/core/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  121. package/core/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  122. package/core/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  123. package/core/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  124. package/core/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  125. package/core/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  126. package/core/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  127. package/core/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  128. package/core/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  129. package/core/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  130. package/core/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  131. package/core/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  132. package/core/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  133. package/core/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  134. package/core/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  135. package/core/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  136. package/core/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  137. package/core/.claude/agents/pcb-reviewer.md +146 -0
  138. package/core/.claude/commands/Amelia.md +5 -0
  139. package/core/.claude/commands/Ansuz.md +38 -0
  140. package/core/.claude/commands/Huginn.md +25 -0
  141. package/core/.claude/commands/agent-worker.md +168 -0
  142. package/core/.claude/commands/architect.md +24 -0
  143. package/core/.claude/commands/archive.md +24 -0
  144. package/core/.claude/commands/canary.md +17 -0
  145. package/core/.claude/commands/incident.md +15 -0
  146. package/core/.claude/commands/init.md +112 -0
  147. package/core/.claude/commands/legacy_dev.md +18 -0
  148. package/core/.claude/commands/product-review.md +131 -0
  149. package/core/.claude/commands/review.md +14 -0
  150. package/core/.claude/commands/security.md +15 -0
  151. package/core/.claude/commands/spec.md +22 -0
  152. package/core/.claude/commands/strategy.md +141 -0
  153. package/core/.claude/commands/sunny.md +1 -0
  154. package/core/.claude/commands//347/224/242/345/223/201.md +15 -0
  155. package/core/.claude/commands//347/224/242/345/223/201/346/252/242/350/246/226.md +129 -0
  156. package/core/.claude/commands//350/250/255/350/250/210.md +14 -0
  157. package/core/.claude/commands//350/251/225/344/274/260.md +16 -0
  158. package/core/.claude/commands//351/200/262/345/272/246.md +15 -0
  159. package/core/.claude/hooks/__tests__/substrate.test.js +122 -0
  160. package/core/.claude/hooks/__tests__/task-1866-cli-guard.test.js +193 -0
  161. package/core/.claude/hooks/__tests__/task-1977-dedupe-guard.test.js +125 -0
  162. package/core/.claude/hooks/__tests__/task-2087-mark-landed-idempotent.test.js +128 -0
  163. package/core/.claude/hooks/__tests__/task-2253-null-tip-marker-reuse.test.js +84 -0
  164. package/core/.claude/hooks/__tests__/task-2381-project-guard-walkup.test.js +53 -0
  165. package/core/.claude/hooks/_ansuz-conversation.js +183 -0
  166. package/core/.claude/hooks/_ansuz-conversation.test.js +90 -0
  167. package/core/.claude/hooks/_dedupe-guard.js +75 -0
  168. package/core/.claude/hooks/_peer-project-root.js +113 -0
  169. package/core/.claude/hooks/_peer-project-root.test.js +121 -0
  170. package/core/.claude/hooks/_peer-waiting-line.js +27 -0
  171. package/core/.claude/hooks/_project-guard.js +45 -0
  172. package/core/.claude/hooks/_run-user-prompt.js +134 -0
  173. package/core/.claude/hooks/_run-user-prompt.test.js +80 -0
  174. package/core/.claude/hooks/_session-identity.js +62 -0
  175. package/core/.claude/hooks/_session-pin.js +34 -0
  176. package/core/.claude/hooks/_session-pin.test.js +89 -0
  177. package/core/.claude/hooks/_signal-fence.js +17 -0
  178. package/core/.claude/hooks/_substrate-paths.js +95 -0
  179. package/core/.claude/hooks/_user-scope.js +23 -0
  180. package/core/.claude/hooks/ansuz-session-pin-via-turn-context.test.js +52 -0
  181. package/core/.claude/hooks/ansuz-session-pin.js +171 -0
  182. package/core/.claude/hooks/ansuz-session-pin.test.js +140 -0
  183. package/core/.claude/hooks/context-check.js +51 -0
  184. package/core/.claude/hooks/core-resolve.js +230 -0
  185. package/core/.claude/hooks/daemon-outbox-hook.js +139 -0
  186. package/core/.claude/hooks/fatigue-check.js +52 -0
  187. package/core/.claude/hooks/handoff-snapshot-on-commit.js +154 -0
  188. package/core/.claude/hooks/handoff-snapshot-on-decision.js +188 -0
  189. package/core/.claude/hooks/handoff-snapshot-on-question.js +158 -0
  190. package/core/.claude/hooks/handoff-staleness.js +197 -0
  191. package/core/.claude/hooks/jev-thalamus-context.js +17 -0
  192. package/core/.claude/hooks/jev-thalamus-context.test.js +41 -0
  193. package/core/.claude/hooks/lease-release.js +119 -0
  194. package/core/.claude/hooks/lease-touch.js +96 -0
  195. package/core/.claude/hooks/memory-guard.js +723 -0
  196. package/core/.claude/hooks/memory-guard.test.js +574 -0
  197. package/core/.claude/hooks/reflex-feedback.js +5 -0
  198. package/core/.claude/hooks/session-init.ps1 +49 -0
  199. package/core/.claude/hooks/sound-event.js +70 -0
  200. package/core/.claude/hooks/sound-event.sh +37 -0
  201. package/core/.claude/hooks/stream-delta.js +169 -0
  202. package/core/.claude/hooks/synapse-first-investigation.js +326 -0
  203. package/core/.claude/hooks/synapse-first-investigation.test.js +126 -0
  204. package/core/.claude/hooks/task-bridge.js +33 -0
  205. package/core/.claude/hooks/turn-context-peer.test.js +115 -0
  206. package/core/.claude/hooks/turn-context-session-line.test.js +69 -0
  207. package/core/.claude/hooks/turn-context.js +215 -0
  208. package/core/.claude/hooks/worktree-create.js +1232 -0
  209. package/core/.claude/hooks/worktree-remove.js +181 -0
  210. package/core/.claude/no-hooks.settings.json +3 -0
  211. package/core/.claude/settings.json +180 -0
  212. package/core/.claude/skills/adapt/SKILL.md +199 -0
  213. package/core/.claude/skills/animate/SKILL.md +190 -0
  214. package/core/.claude/skills/architect_agent/SKILL.md +408 -0
  215. package/core/.claude/skills/assessment_agent/SKILL.md +289 -0
  216. package/core/.claude/skills/audit/SKILL.md +129 -0
  217. package/core/.claude/skills/backend_agent/SKILL.md +407 -0
  218. package/core/.claude/skills/backend_engineer/SKILL.md +788 -0
  219. package/core/.claude/skills/bolder/SKILL.md +132 -0
  220. package/core/.claude/skills/clarify/SKILL.md +180 -0
  221. package/core/.claude/skills/code_reviewer/SKILL.md +305 -0
  222. package/core/.claude/skills/code_reviewer/patterns.yaml +85 -0
  223. package/core/.claude/skills/colorize/SKILL.md +158 -0
  224. package/core/.claude/skills/critique/SKILL.md +118 -0
  225. package/core/.claude/skills/delight/SKILL.md +317 -0
  226. package/core/.claude/skills/designer/SKILL.md +845 -0
  227. package/core/.claude/skills/dev_agent/SKILL.md +503 -0
  228. package/core/.claude/skills/developer/SKILL.md +792 -0
  229. package/core/.claude/skills/distill/SKILL.md +137 -0
  230. package/core/.claude/skills/extract/SKILL.md +95 -0
  231. package/core/.claude/skills/feature_agent/SKILL.md +303 -0
  232. package/core/.claude/skills/frontend-design/SKILL.md +127 -0
  233. package/core/.claude/skills/frontend-design/reference/color-and-contrast.md +132 -0
  234. package/core/.claude/skills/frontend-design/reference/interaction-design.md +123 -0
  235. package/core/.claude/skills/frontend-design/reference/motion-design.md +99 -0
  236. package/core/.claude/skills/frontend-design/reference/responsive-design.md +114 -0
  237. package/core/.claude/skills/frontend-design/reference/spatial-design.md +100 -0
  238. package/core/.claude/skills/frontend-design/reference/typography.md +131 -0
  239. package/core/.claude/skills/frontend-design/reference/ux-writing.md +107 -0
  240. package/core/.claude/skills/frontend_agent/SKILL.md +327 -0
  241. package/core/.claude/skills/harden/SKILL.md +358 -0
  242. package/core/.claude/skills/heimdall/SKILL.md +84 -0
  243. package/core/.claude/skills/huginn/SKILL.md +208 -0
  244. package/core/.claude/skills/incident_response/SKILL.md +315 -0
  245. package/core/.claude/skills/legacy_dev/SKILL.md +202 -0
  246. package/core/.claude/skills/normalize/SKILL.md +67 -0
  247. package/core/.claude/skills/onboard/SKILL.md +243 -0
  248. package/core/.claude/skills/optimization_agent/SKILL.md +340 -0
  249. package/core/.claude/skills/optimize/SKILL.md +269 -0
  250. package/core/.claude/skills/pcb-review/SKILL.md +39 -0
  251. package/core/.claude/skills/polish/SKILL.md +202 -0
  252. package/core/.claude/skills/product_manager/SKILL.md +1091 -0
  253. package/core/.claude/skills/qa_engineer/SKILL.md +1269 -0
  254. package/core/.claude/skills/quieter/SKILL.md +118 -0
  255. package/core/.claude/skills/remotion-best-practices/SKILL.md +61 -0
  256. package/core/.claude/skills/remotion-best-practices/rules/3d.md +86 -0
  257. package/core/.claude/skills/remotion-best-practices/rules/animations.md +27 -0
  258. package/core/.claude/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  259. package/core/.claude/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  260. package/core/.claude/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +103 -0
  261. package/core/.claude/skills/remotion-best-practices/rules/assets.md +78 -0
  262. package/core/.claude/skills/remotion-best-practices/rules/audio-visualization.md +198 -0
  263. package/core/.claude/skills/remotion-best-practices/rules/audio.md +169 -0
  264. package/core/.claude/skills/remotion-best-practices/rules/calculate-metadata.md +134 -0
  265. package/core/.claude/skills/remotion-best-practices/rules/can-decode.md +81 -0
  266. package/core/.claude/skills/remotion-best-practices/rules/charts.md +120 -0
  267. package/core/.claude/skills/remotion-best-practices/rules/compositions.md +154 -0
  268. package/core/.claude/skills/remotion-best-practices/rules/display-captions.md +184 -0
  269. package/core/.claude/skills/remotion-best-practices/rules/extract-frames.md +229 -0
  270. package/core/.claude/skills/remotion-best-practices/rules/ffmpeg.md +38 -0
  271. package/core/.claude/skills/remotion-best-practices/rules/fonts.md +152 -0
  272. package/core/.claude/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
  273. package/core/.claude/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  274. package/core/.claude/skills/remotion-best-practices/rules/get-video-duration.md +60 -0
  275. package/core/.claude/skills/remotion-best-practices/rules/gifs.md +141 -0
  276. package/core/.claude/skills/remotion-best-practices/rules/images.md +134 -0
  277. package/core/.claude/skills/remotion-best-practices/rules/import-srt-captions.md +69 -0
  278. package/core/.claude/skills/remotion-best-practices/rules/light-leaks.md +73 -0
  279. package/core/.claude/skills/remotion-best-practices/rules/lottie.md +70 -0
  280. package/core/.claude/skills/remotion-best-practices/rules/maps.md +412 -0
  281. package/core/.claude/skills/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
  282. package/core/.claude/skills/remotion-best-practices/rules/measuring-text.md +140 -0
  283. package/core/.claude/skills/remotion-best-practices/rules/parameters.md +109 -0
  284. package/core/.claude/skills/remotion-best-practices/rules/sequencing.md +118 -0
  285. package/core/.claude/skills/remotion-best-practices/rules/sfx.md +30 -0
  286. package/core/.claude/skills/remotion-best-practices/rules/subtitles.md +36 -0
  287. package/core/.claude/skills/remotion-best-practices/rules/tailwind.md +11 -0
  288. package/core/.claude/skills/remotion-best-practices/rules/text-animations.md +20 -0
  289. package/core/.claude/skills/remotion-best-practices/rules/timing.md +179 -0
  290. package/core/.claude/skills/remotion-best-practices/rules/transcribe-captions.md +70 -0
  291. package/core/.claude/skills/remotion-best-practices/rules/transitions.md +197 -0
  292. package/core/.claude/skills/remotion-best-practices/rules/transparent-videos.md +106 -0
  293. package/core/.claude/skills/remotion-best-practices/rules/trimming.md +51 -0
  294. package/core/.claude/skills/remotion-best-practices/rules/videos.md +171 -0
  295. package/core/.claude/skills/remotion-best-practices/rules/voiceover.md +99 -0
  296. package/core/.claude/skills/security_agent/SKILL.md +312 -0
  297. package/core/.claude/skills/spec_optimizer/SKILL.md +299 -0
  298. package/core/.claude/skills/sre_agent/SKILL.md +1347 -0
  299. package/core/.claude/skills/sunny/SKILL.md +74 -0
  300. package/core/.claude/skills/supabase-postgres-best-practices/AGENTS.md +90 -0
  301. package/core/.claude/skills/supabase-postgres-best-practices/CLAUDE.md +1 -0
  302. package/core/.claude/skills/supabase-postgres-best-practices/SKILL.md +64 -0
  303. package/core/.claude/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  304. package/core/.claude/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  305. package/core/.claude/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  306. package/core/.claude/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  307. package/core/.claude/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  308. package/core/.claude/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  309. package/core/.claude/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  310. package/core/.claude/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  311. package/core/.claude/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  312. package/core/.claude/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  313. package/core/.claude/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  314. package/core/.claude/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  315. package/core/.claude/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  316. package/core/.claude/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  317. package/core/.claude/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  318. package/core/.claude/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  319. package/core/.claude/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  320. package/core/.claude/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  321. package/core/.claude/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  322. package/core/.claude/skills/supabase-postgres-best-practices/references/query-index-types.md +45 -0
  323. package/core/.claude/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  324. package/core/.claude/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  325. package/core/.claude/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  326. package/core/.claude/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  327. package/core/.claude/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  328. package/core/.claude/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  329. package/core/.claude/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  330. package/core/.claude/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  331. package/core/.claude/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  332. package/core/.claude/skills/supabase-postgres-best-practices/references/security-rls-performance.md +57 -0
  333. package/core/.claude/skills/synapse_maintain/SKILL.md +84 -0
  334. package/core/.claude/skills/ui-ux-pro-max/SKILL.md +377 -0
  335. package/core/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -0
  336. package/core/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -0
  337. package/core/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -0
  338. package/core/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -0
  339. package/core/.claude/skills/ui-ux-pro-max/data/products.csv +97 -0
  340. package/core/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  341. package/core/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  342. package/core/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  343. package/core/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  344. package/core/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  345. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  346. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  347. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  348. package/core/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  349. package/core/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  350. package/core/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  351. package/core/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  352. package/core/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  353. package/core/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  354. package/core/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -0
  355. package/core/.claude/skills/ui-ux-pro-max/data/typography.csv +58 -0
  356. package/core/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  357. package/core/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  358. package/core/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  359. package/core/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -0
  360. package/core/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
  361. package/core/.claude/skills/ui-ux-pro-max/scripts/search.py +106 -0
  362. package/core/.claude/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  363. package/core/.claude/skills/vercel-react-best-practices/SKILL.md +136 -0
  364. package/core/.claude/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  365. package/core/.claude/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  366. package/core/.claude/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  367. package/core/.claude/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  368. package/core/.claude/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  369. package/core/.claude/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  370. package/core/.claude/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  371. package/core/.claude/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  372. package/core/.claude/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  373. package/core/.claude/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  374. package/core/.claude/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  375. package/core/.claude/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  376. package/core/.claude/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  377. package/core/.claude/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  378. package/core/.claude/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  379. package/core/.claude/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  380. package/core/.claude/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  381. package/core/.claude/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  382. package/core/.claude/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  383. package/core/.claude/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  384. package/core/.claude/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  385. package/core/.claude/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  386. package/core/.claude/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  387. package/core/.claude/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  388. package/core/.claude/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  389. package/core/.claude/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  390. package/core/.claude/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  391. package/core/.claude/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  392. package/core/.claude/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  393. package/core/.claude/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  394. package/core/.claude/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  395. package/core/.claude/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  396. package/core/.claude/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  397. package/core/.claude/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  398. package/core/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  399. package/core/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  400. package/core/.claude/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  401. package/core/.claude/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  402. package/core/.claude/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  403. package/core/.claude/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  404. package/core/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  405. package/core/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  406. package/core/.claude/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  407. package/core/.claude/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  408. package/core/.claude/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  409. package/core/.claude/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  410. package/core/.claude/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  411. package/core/.claude/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  412. package/core/.claude/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  413. package/core/.claude/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  414. package/core/.claude/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  415. package/core/.claude/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  416. package/core/.claude/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  417. package/core/.claude/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  418. package/core/.claude/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  419. package/core/.claude/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  420. package/core/.claude/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  421. package/core/.collaboration/README.md +258 -0
  422. package/core/.collaboration/cli/commands/assign.js +39 -0
  423. package/core/.collaboration/cli/commands/claim.js +33 -0
  424. package/core/.collaboration/cli/commands/complete.js +44 -0
  425. package/core/.collaboration/cli/commands/create.js +110 -0
  426. package/core/.collaboration/cli/commands/get.js +83 -0
  427. package/core/.collaboration/cli/commands/index.js +52 -0
  428. package/core/.collaboration/cli/commands/list.js +51 -0
  429. package/core/.collaboration/cli/commands/lock.js +45 -0
  430. package/core/.collaboration/cli/commands/rebuild.js +39 -0
  431. package/core/.collaboration/cli/commands/search.js +61 -0
  432. package/core/.collaboration/cli/commands/stats.js +61 -0
  433. package/core/.collaboration/cli/commands/transfer.js +41 -0
  434. package/core/.collaboration/cli/commands/unlock.js +48 -0
  435. package/core/.collaboration/cli/formatters/help-formatter.js +70 -0
  436. package/core/.collaboration/cli/formatters/index.js +7 -0
  437. package/core/.collaboration/cli/task-cli.js +46 -0
  438. package/core/.collaboration/cli/utils/arg-parser.js +74 -0
  439. package/core/.collaboration/cli/utils/git-user.js +25 -0
  440. package/core/.collaboration/cli/utils/index.js +9 -0
  441. package/core/.collaboration/cli/utils/output.js +10 -0
  442. package/core/.collaboration/config/default.yaml +189 -0
  443. package/core/.collaboration/core/conflict-resolver.js +461 -0
  444. package/core/.collaboration/core/conflict-resolver.test.js +389 -0
  445. package/core/.collaboration/core/id-generator.js +303 -0
  446. package/core/.collaboration/core/migrate-legacy.js +260 -0
  447. package/core/.collaboration/core/package.json +1 -0
  448. package/core/.collaboration/core/task-2257-estimated-hours.test.js +72 -0
  449. package/core/.collaboration/core/task-2260-dir-layout-move.test.js +60 -0
  450. package/core/.collaboration/core/task-2264-single-after-capture.test.js +61 -0
  451. package/core/.collaboration/core/task-2288-followups.test.js +121 -0
  452. package/core/.collaboration/core/task-api-json.js +211 -0
  453. package/core/.collaboration/core/task-api.js +3729 -0
  454. package/core/.collaboration/core/task-api.test.js +1268 -0
  455. package/core/.collaboration/docs/API.md +787 -0
  456. package/core/.collaboration/docs/ARCHITECTURE.md +596 -0
  457. package/core/.collaboration/docs/CLI.md +821 -0
  458. package/core/.collaboration/docs/FAQ.md +695 -0
  459. package/core/.collaboration/docs/MIGRATION.md +804 -0
  460. package/core/.collaboration/docs/examples/README.md +320 -0
  461. package/core/.collaboration/docs/examples/advanced-queries.js +261 -0
  462. package/core/.collaboration/docs/examples/basic-usage.js +184 -0
  463. package/core/.collaboration/docs/examples/team-workflow.js +352 -0
  464. package/core/.collaboration/hooks/README.md +70 -0
  465. package/core/.collaboration/hooks/config.json +10 -0
  466. package/core/.collaboration/hooks/install.js +400 -0
  467. package/core/.collaboration/hooks/post-merge.js +163 -0
  468. package/core/.collaboration/hooks/pre-commit.js +264 -0
  469. package/core/.collaboration/hooks/synapse-hook.js +486 -0
  470. package/core/.collaboration/hooks/synapse-hook.test.js +69 -0
  471. package/core/.failure/INDEX.yaml +231 -0
  472. package/core/.failure/agent-execution/FAIL-001-agent-no-output.yaml +391 -0
  473. package/core/.failure/agent-execution/FAIL-004_agent_platform_specific_commands.md +194 -0
  474. package/core/.failure/agent-execution/FAIL-005_background_agent_permission_denied.md +204 -0
  475. package/core/.failure/agent-execution/FAIL-007-pm-lead-wrong-team-invocation.yaml +0 -0
  476. package/core/.failure/agent-execution/FAIL-008-bypass-api-direct-yaml-write.yaml +94 -0
  477. package/core/.failure/agent-execution/FAIL-010-phase0-poem-format-skipped.yaml +28 -0
  478. package/core/.failure/agent-execution/FAIL-010-skipping-cognitive-checkpoint-after-verification.yaml +59 -0
  479. package/core/.failure/agent-execution/FAIL-012-grep-shortcut-during-investigation.yaml +85 -0
  480. package/core/.failure/agent-execution/FAIL-013-search-cwd-drift-and-case-mismatch.yaml +103 -0
  481. package/core/.failure/agent-execution/FAIL-014-shared-worktree-premature-death-verdict.yaml +35 -0
  482. package/core/.failure/agent-execution/FAIL-AUTO-TASK_1413.yaml +31 -0
  483. package/core/.failure/agent-execution/FAIL-AUTO-TASK_1427.yaml +41 -0
  484. package/core/.failure/agent-execution/FAIL-AUTO-TASK_904.yaml +30 -0
  485. package/core/.failure/agent-execution/README.md +68 -0
  486. package/core/.failure/architecture/FAIL-004_session_based_skill_recognition.md +128 -0
  487. package/core/.failure/architecture/FAIL-006-python-version-compatibility.yaml +445 -0
  488. package/core/.failure/architecture/README.md +87 -0
  489. package/core/.failure/code-quality/README.md +89 -0
  490. package/core/.failure/data-integrity/FAIL-002-json-bom.yaml +220 -0
  491. package/core/.failure/data-integrity/README.md +141 -0
  492. package/core/.failure/pipeline/FAIL-003-queue-pollution.yaml +335 -0
  493. package/core/.failure/pipeline/README.md +95 -0
  494. package/core/.failure/retired/FAIL-009-skipping-synapse-pulse-before-code-change.yaml +49 -0
  495. package/core/.failure/tools/README.md +230 -0
  496. package/core/.failure/tools/USAGE_GUIDE.md +323 -0
  497. package/core/.failure/tools/check_bom.js +101 -0
  498. package/core/.failure/tools/check_failures.ps1 +387 -0
  499. package/core/.failure/tools/fix_json.js +58 -0
  500. package/core/.failure/tools/log_failure.ps1 +474 -0
  501. package/core/.failure/tools/remove_bom.js +46 -0
  502. package/core/.failure/tools/validate_json.js +50 -0
  503. package/core/.formation/.episode-input.json +10 -0
  504. package/core/.formation/README.md +188 -0
  505. package/core/.formation/bifrost/CGDD_hook_lifecycle.js +575 -0
  506. package/core/.formation/bifrost/HOOK_PARITY_VERIFICATION.md +241 -0
  507. package/core/.formation/bifrost/README.md +71 -0
  508. package/core/.formation/bifrost/codex-doctor.js +106 -0
  509. package/core/.formation/bifrost/codex-doctor.test.js +51 -0
  510. package/core/.formation/bifrost/launch.js +510 -0
  511. package/core/.formation/bifrost/launch.test.js +217 -0
  512. package/core/.formation/bifrost/openai/codex-hook-shim.js +171 -0
  513. package/core/.formation/bifrost/openai/codex-hook-shim.test.js +107 -0
  514. package/core/.formation/bifrost/openai/models.json +36 -0
  515. package/core/.formation/bifrost/openai/relay.js +781 -0
  516. package/core/.formation/bifrost/openai/relay.test.js +71 -0
  517. package/core/.formation/bifrost/session.js +382 -0
  518. package/core/.formation/bifrost/session.test.js +121 -0
  519. package/core/.formation/bifrost/setup-codex.js +685 -0
  520. package/core/.formation/bifrost/setup-codex.test.js +102 -0
  521. package/core/.formation/bifrost/shared/ansuz-boot-policy.js +31 -0
  522. package/core/.formation/bifrost/shared/ansuz-boot-policy.test.js +40 -0
  523. package/core/.formation/bifrost/shared/boot-context.js +68 -0
  524. package/core/.formation/bifrost/shared/boot-context.test.js +67 -0
  525. package/core/.formation/bifrost/shared/codex-appserver.js +191 -0
  526. package/core/.formation/bifrost/shared/codex-injection.js +126 -0
  527. package/core/.formation/bifrost/shared/codex-session-registry.js +105 -0
  528. package/core/.formation/bifrost/shared/codex-session-registry.test.js +126 -0
  529. package/core/.formation/bifrost/shared/consolidate.js +286 -0
  530. package/core/.formation/bifrost/shared/stream-json.js +103 -0
  531. package/core/.formation/bifrost/shared/tools.js +278 -0
  532. package/core/.formation/bifrost/sync.js +142 -0
  533. package/core/.formation/briefs/scheduler-evolution.md +209 -0
  534. package/core/.formation/lead.yaml +118 -0
  535. package/core/.formation/legacy.bak/designer.yaml +57 -0
  536. package/core/.formation/legacy.bak/pm.yaml +57 -0
  537. package/core/.formation/legacy.bak/qa.yaml +57 -0
  538. package/core/.formation/legacy.bak/review.yaml +62 -0
  539. package/core/.formation/legacy.bak/scheduler.yaml +129 -0
  540. package/core/.formation/legacy.bak/sre.yaml +57 -0
  541. package/core/.formation/legion/forge.yaml +299 -0
  542. package/core/.formation/legion/hive.yaml +238 -0
  543. package/core/.formation/native/claude/README.md +61 -0
  544. package/core/.formation/native/claude/models.json +42 -0
  545. package/core/.formation/role-map.yaml +274 -0
  546. package/core/.formation/roles/_shared/modules/code_review.yaml +98 -0
  547. package/core/.formation/roles/_shared/modules/security.yaml +103 -0
  548. package/core/.formation/roles/_shared/modules/testing.yaml +14 -0
  549. package/core/.formation/roles/backend/role.yaml +93 -0
  550. package/core/.formation/roles/code_reviewer/role.yaml +102 -0
  551. package/core/.formation/roles/database_optimizer/role.yaml +107 -0
  552. package/core/.formation/roles/designer/role.yaml +66 -0
  553. package/core/.formation/roles/developer/role.yaml +75 -0
  554. package/core/.formation/roles/frontend/role.yaml +134 -0
  555. package/core/.formation/roles/incident_response/role.yaml +89 -0
  556. package/core/.formation/roles/qa/role.yaml +89 -0
  557. package/core/.formation/roles/security/role.yaml +87 -0
  558. package/core/.formation/roles/sre/role.yaml +66 -0
  559. package/core/.formation/skills/coordinator.yaml +52 -0
  560. package/core/.formation/solo/diagnosis.yaml +78 -0
  561. package/core/.formation/solo/strategy.yaml +121 -0
  562. package/core/.formation/spec/task_operations.parity.test.js +426 -0
  563. package/core/.formation/spec/task_operations.yaml +291 -0
  564. package/core/.formation/squad/blitz.yaml +192 -0
  565. package/core/.formation/squad/strategy-tribunal.yaml +354 -0
  566. package/core/.formation/squad/strategy.yaml +349 -0
  567. package/core/.formation/squad/sweep.yaml +208 -0
  568. package/core/.formation/tests/hello.txt +2 -0
  569. package/core/.formation/tools/__tests__/m1-claim-gate.test.js +175 -0
  570. package/core/.formation/tools/__tests__/m1-hmap-convid.test.js +216 -0
  571. package/core/.formation/tools/__tests__/release-lock.test.js +176 -0
  572. package/core/.formation/tools/__tests__/subagent-bifrost-guard.test.js +234 -0
  573. package/core/.formation/tools/__tests__/subagent-codex-harness.test.js +96 -0
  574. package/core/.formation/tools/__tests__/task-1863-claim-late-release.test.js +160 -0
  575. package/core/.formation/tools/__tests__/task-2265-singleton-identity.test.js +134 -0
  576. package/core/.formation/tools/__tests__/task-2281-singleton-readers.test.js +64 -0
  577. package/core/.formation/tools/__tests__/task2030-worktree-node-modules.test.js +221 -0
  578. package/core/.formation/tools/__tests__/task2067-worktree-branch-reuse.test.js +148 -0
  579. package/core/.formation/tools/alaya-gate.js +198 -0
  580. package/core/.formation/tools/analytics.js +172 -0
  581. package/core/.formation/tools/broadcast.js +103 -0
  582. package/core/.formation/tools/commit-sync.js +154 -0
  583. package/core/.formation/tools/coordinator.js +350 -0
  584. package/core/.formation/tools/dashboard-models-chain.test.js +60 -0
  585. package/core/.formation/tools/dispatch-cortex-context.test.js +52 -0
  586. package/core/.formation/tools/dispatch-detail/cross-project-worktree.md +40 -0
  587. package/core/.formation/tools/dispatch-detail/testing-module.md +53 -0
  588. package/core/.formation/tools/dispatch-detail/worktree-subagent-mode.md +72 -0
  589. package/core/.formation/tools/dispatch-dryrun.test.js +54 -0
  590. package/core/.formation/tools/dispatch-model-policy.test.js +165 -0
  591. package/core/.formation/tools/dispatch-notifier.js +84 -0
  592. package/core/.formation/tools/dispatch-registry.js +346 -0
  593. package/core/.formation/tools/dispatch.js +1931 -0
  594. package/core/.formation/tools/formations.js +1203 -0
  595. package/core/.formation/tools/forseti-verify.js +1170 -0
  596. package/core/.formation/tools/git-salvage.js +269 -0
  597. package/core/.formation/tools/guard-attribution.js +224 -0
  598. package/core/.formation/tools/headless-branch-recovery.test.js +64 -0
  599. package/core/.formation/tools/headless-dryrun.test.js +79 -0
  600. package/core/.formation/tools/headless-v2.js +659 -0
  601. package/core/.formation/tools/headless.js +1071 -0
  602. package/core/.formation/tools/integration.js +528 -0
  603. package/core/.formation/tools/jev-correction.js +214 -0
  604. package/core/.formation/tools/jev-correction.test.js +178 -0
  605. package/core/.formation/tools/legacy-scheduler.js +1994 -0
  606. package/core/.formation/tools/lib/exec-tree.js +92 -0
  607. package/core/.formation/tools/lib/exec-tree.test.js +82 -0
  608. package/core/.formation/tools/loader.js +190 -0
  609. package/core/.formation/tools/log-reader.js +232 -0
  610. package/core/.formation/tools/logger.js +273 -0
  611. package/core/.formation/tools/mcp-allowlist.test.js +40 -0
  612. package/core/.formation/tools/memory-loader.js +422 -0
  613. package/core/.formation/tools/merge-lock-heartbeat.test.js +35 -0
  614. package/core/.formation/tools/no-hooks.settings.json +3 -0
  615. package/core/.formation/tools/pool-status-push.js +121 -0
  616. package/core/.formation/tools/pool-status-push.test.js +165 -0
  617. package/core/.formation/tools/post-complete/bounded-http.js +102 -0
  618. package/core/.formation/tools/post-complete/bounded-http.test.js +130 -0
  619. package/core/.formation/tools/post-complete/cognitive.js +270 -0
  620. package/core/.formation/tools/post-complete/git-merge.js +2845 -0
  621. package/core/.formation/tools/post-complete/health.js +464 -0
  622. package/core/.formation/tools/post-complete/integration-gaps.js +98 -0
  623. package/core/.formation/tools/post-complete/outcome.js +874 -0
  624. package/core/.formation/tools/post-complete/staging.js +390 -0
  625. package/core/.formation/tools/post-complete/subagent-transcript-stats.js +460 -0
  626. package/core/.formation/tools/post-complete/subagent-transcript-stats.test.js +680 -0
  627. package/core/.formation/tools/post-complete/task1536.test.js +627 -0
  628. package/core/.formation/tools/post-complete/task1543.test.js +261 -0
  629. package/core/.formation/tools/post-complete/task1876.test.js +287 -0
  630. package/core/.formation/tools/post-complete/task1957.test.js +293 -0
  631. package/core/.formation/tools/post-complete/task1997.test.js +401 -0
  632. package/core/.formation/tools/post-complete/task2028.test.js +232 -0
  633. package/core/.formation/tools/post-complete/task2029.test.js +275 -0
  634. package/core/.formation/tools/post-complete/task2036.test.js +330 -0
  635. package/core/.formation/tools/post-complete/task2038.test.js +246 -0
  636. package/core/.formation/tools/post-complete/task2071.test.js +231 -0
  637. package/core/.formation/tools/post-complete/task2233.test.js +100 -0
  638. package/core/.formation/tools/post-complete/task2240.test.js +134 -0
  639. package/core/.formation/tools/post-complete/task2244.test.js +199 -0
  640. package/core/.formation/tools/post-complete/task2255.test.js +28 -0
  641. package/core/.formation/tools/post-complete/task2268.test.js +106 -0
  642. package/core/.formation/tools/post-complete/task2341.test.js +74 -0
  643. package/core/.formation/tools/post-complete/task2345.test.js +38 -0
  644. package/core/.formation/tools/post-complete/testing.js +482 -0
  645. package/core/.formation/tools/post-complete/wish.js +177 -0
  646. package/core/.formation/tools/post-complete/worktree-rescue.test.js +283 -0
  647. package/core/.formation/tools/post-complete.js +3660 -0
  648. package/core/.formation/tools/post-complete.test.js +1002 -0
  649. package/core/.formation/tools/pre-dispatch-snapshot.test.js +328 -0
  650. package/core/.formation/tools/process-state.js +33 -0
  651. package/core/.formation/tools/prompt.js +2183 -0
  652. package/core/.formation/tools/prompt.test.js +875 -0
  653. package/core/.formation/tools/remote-conflict.js +98 -0
  654. package/core/.formation/tools/revert-daemon-state.js +162 -0
  655. package/core/.formation/tools/route-audit.test.js +55 -0
  656. package/core/.formation/tools/runner.js +1332 -0
  657. package/core/.formation/tools/supabase-client.js +104 -0
  658. package/core/.formation/tools/task-sync.js +236 -0
  659. package/core/.formation/tools/task-utils.js +344 -0
  660. package/core/.formation/tools/task2028-headless-worktree.test.js +112 -0
  661. package/core/.formation/tools/test-drift.js +148 -0
  662. package/core/.formation/tools/tests/headless-mcp-args-plumbing.test.js +123 -0
  663. package/core/.formation/tools/tests/relay-mcp-overrides.test.js +112 -0
  664. package/core/.formation/tools/transcript-recorder.js +574 -0
  665. package/core/.formation/tools/utils-claude-cmd.test.js +28 -0
  666. package/core/.formation/tools/utils-worktree-config.test.js +44 -0
  667. package/core/.formation/tools/utils.js +1020 -0
  668. package/core/.formation/tools/verify-acceptance.js +585 -0
  669. package/core/.formation/tools/worktree-leak.test.js +162 -0
  670. package/core/.formation/tools/worktree-reclaim.js +259 -0
  671. package/core/.formation/tools/worktree-reclaim.test.js +182 -0
  672. package/core/.formation/tools/yggdrasil-local.js +97 -0
  673. package/core/.formation/unit/do.yaml +78 -0
  674. package/core/.formation/unit/heimdall.yaml +96 -0
  675. package/core/.formation/unit/plan.yaml +67 -0
  676. package/core/.formation/unit/think.yaml +58 -0
  677. package/core/.kenaz/MUNINN_SNAPSHOT9_EPISODE.json +32 -0
  678. package/core/.kenaz/MUNINN_SNAPSHOT9_RUNE.json +23 -0
  679. package/core/.kenaz/MUNINN_SNAPSHOT9_SUMMARY.md +89 -0
  680. package/core/.kenaz/ash_TASK_1428-20260507.json +14 -0
  681. package/core/.kenaz/cache/native-models/claude.json +42 -0
  682. package/core/.kenaz/claude-hooks-manifest.json +119 -0
  683. package/core/.kenaz/cortex.yaml +100 -0
  684. package/core/.kenaz/curator_state.json +7 -0
  685. package/core/.kenaz/dashboard-quick-prompts.json +9 -0
  686. package/core/.kenaz/designs/METAPLASTICITY_CONFIDENCE_DESIGN.md +537 -0
  687. package/core/.kenaz/designs/REFLEX_INITIATOR_DESIGN.md +501 -0
  688. package/core/.kenaz/designs/TASK_1385_handoff_mcp_design.md +426 -0
  689. package/core/.kenaz/designs/TASK_932_hippocampus_consolidation.md +103 -0
  690. package/core/.kenaz/designs/TASK_934_efe_signal_engine.md +97 -0
  691. package/core/.kenaz/designs/TASK_935_self_evolution_framework.md +154 -0
  692. package/core/.kenaz/designs/VISION_cognitive_architecture_roadmap.md +159 -0
  693. package/core/.kenaz/designs/metaplasticity_simulation_results.json +696 -0
  694. package/core/.kenaz/docs/INDEX.md +214 -0
  695. package/core/.kenaz/docs/README.md +290 -0
  696. package/core/.kenaz/docs/registry.json +962 -0
  697. package/core/.kenaz/docs/schema.json +144 -0
  698. package/core/.kenaz/docs/tools/GIT_HOOK_GUIDE.md +203 -0
  699. package/core/.kenaz/docs/tools/RAG_INTEGRATION_GUIDE.md +306 -0
  700. package/core/.kenaz/docs/tools/README.md +99 -0
  701. package/core/.kenaz/docs/tools/TIME_ESTIMATION_GUIDE.md +299 -0
  702. package/core/.kenaz/docs/tools/package-lock.json +618 -0
  703. package/core/.kenaz/docs/tools/package.json +34 -0
  704. package/core/.kenaz/docs/tools/src/cli.ts +365 -0
  705. package/core/.kenaz/docs/tools/src/field-extractor.ts +152 -0
  706. package/core/.kenaz/docs/tools/src/index.ts +14 -0
  707. package/core/.kenaz/docs/tools/src/registry.ts +664 -0
  708. package/core/.kenaz/docs/tools/src/search.ts +195 -0
  709. package/core/.kenaz/docs/tools/src/types.ts +88 -0
  710. package/core/.kenaz/docs/tools/test-git-hook.sh +79 -0
  711. package/core/.kenaz/docs/tools/tsconfig.json +20 -0
  712. package/core/.kenaz/docs/tools/verify.sh +106 -0
  713. package/core/.kenaz/episodes/SESSION_ansuz-prompt-1785087304784.yaml +68 -0
  714. package/core/.kenaz/huginn-exploration.json +8 -0
  715. package/core/.kenaz/knowledge/ladybug_2c51da1e_shadow_file_frame_group.patch +163 -0
  716. package/core/.kenaz/knowledge/ladybug_30cf85690e_shadow_page_read_during_checkpoint.patch +393 -0
  717. package/core/.kenaz/knowledge/ladybug_7a17858d3a_node_group_delete_lock.patch +102 -0
  718. package/core/.kenaz/knowledge/ladybug_926a0ba1_column_checkpoint.patch +412 -0
  719. package/core/.kenaz/knowledge/ladybug_a346c4c4b6_pk_index_header_pages.patch +144 -0
  720. package/core/.kenaz/knowledge/ladybug_ba5f38815b_csr_node_group.patch +86 -0
  721. package/core/.kenaz/main-memory/README.md +230 -0
  722. package/core/.kenaz/main-memory/kenaz/cortex/001_cortex_overview.md +168 -0
  723. package/core/.kenaz/main-memory/kenaz/cortex/001_rag_engine_overview.md +30 -0
  724. package/core/.kenaz/main-memory/kenaz/memory-system/001_three_tier_architecture.md +361 -0
  725. package/core/.kenaz/main-memory/kenaz/pipeline/001_task_execution_flow.md +117 -0
  726. package/core/.kenaz/main-memory/kenaz/pipeline/001_task_granularity.md +154 -0
  727. package/core/.kenaz/main-memory/kenaz/pipeline/002_team_priority.md +51 -0
  728. package/core/.kenaz/main-memory/kenaz/pipeline/003_feature_id_system.md +46 -0
  729. package/core/.kenaz/main-memory/kenaz/rules/001_gen_007_self_containment.md +108 -0
  730. package/core/.kenaz/main-memory/kenaz/rules/001_rule_priority_system.md +121 -0
  731. package/core/.kenaz/main-memory/kenaz/rules/002_agt_006_pre_check.md +0 -0
  732. package/core/.kenaz/main-memory/kenaz/rules/003_ppl_002_task_archival.md +48 -0
  733. package/core/.kenaz/main-memory/kenaz/system/001_dual_track_task_system.md +197 -0
  734. package/core/.kenaz/main-memory/knowledge/patterns/001_json_bom_issue.md +78 -0
  735. package/core/.kenaz/main-memory/knowledge/patterns/001_leader_worker_pattern.md +0 -0
  736. package/core/.kenaz/main-memory/knowledge/patterns/002_scope_path_conflict.md +115 -0
  737. package/core/.kenaz/main-memory/knowledge/patterns/002_task_dependency_resolution.md +223 -0
  738. package/core/.kenaz/main-memory/knowledge/patterns/003_question_protocol.md +242 -0
  739. package/core/.kenaz/main-memory/knowledge/patterns/004_user_insight_value.md +111 -0
  740. package/core/.kenaz/main-memory/knowledge/patterns/005_file_lock_pattern.md +274 -0
  741. package/core/.kenaz/main-memory/knowledge/references/001_ppl_rules.md +28 -0
  742. package/core/.kenaz/main-memory/knowledge/solutions/001_json_bom_issue.md +137 -0
  743. package/core/.kenaz/main-memory/knowledge/solutions/001_team_invocation.md +0 -0
  744. package/core/.kenaz/main-memory/knowledge/solutions/002_passive_monitoring.md +0 -0
  745. package/core/.kenaz/main-memory/knowledge/solutions/003_windows_file_race_condition.md +239 -0
  746. package/core/.kenaz/main-memory/registry.json +326 -0
  747. package/core/.kenaz/main-memory/version.yaml +58 -0
  748. package/core/.kenaz/muninn_episode_write.ps1 +17 -0
  749. package/core/.kenaz/muninn_snapshot11_rune_candidates.md +63 -0
  750. package/core/.kenaz/muninn_snapshot1_rune_candidates.md +49 -0
  751. package/core/.kenaz/orphan_audit_2026-05.md +181 -0
  752. package/core/.kenaz/ownership.yaml +155 -0
  753. package/core/.kenaz/peer.yaml +72 -0
  754. package/core/.kenaz/project.yaml +62 -0
  755. package/core/.kenaz/rune_ansuz_literature_validation_strategy.md +40 -0
  756. package/core/.kenaz/rune_efe_active_inference_validation.md +36 -0
  757. package/core/.kenaz/rune_yggdrasil_filesystem_scoped_project.md +41 -0
  758. package/core/.kenaz/rune_yggdrasil_project_identity_folder_name.md +41 -0
  759. package/core/.kenaz/rune_yggdrasil_relay_protocol_project_mismatch.md +39 -0
  760. package/core/.kenaz/runes_TASK_1428.json +57 -0
  761. package/core/.kenaz/specialist/ansuz_motivational_state.schema.json +138 -0
  762. package/core/.kenaz/specialist/ansuz_rules.yaml +241 -0
  763. package/core/.kenaz/specialist/ansuz_session_handoff.schema.json +128 -0
  764. package/core/.kenaz/specialist/chart_TASK_1657.json +50 -0
  765. package/core/.kenaz/specialist/cognitive-hub-e2e.test.js +494 -0
  766. package/core/.kenaz/specialist/daemon-manifest.yaml +168 -0
  767. package/core/.kenaz/specialist/empty_ac_audit_report.md +63 -0
  768. package/core/.kenaz/specialist/episode_muninn_completion_1785056865691.json +91 -0
  769. package/core/.kenaz/specialist/field_report_watermark.json +1 -0
  770. package/core/.kenaz/specialist/gc1826_driver.js +118 -0
  771. package/core/.kenaz/specialist/heimdall_proposal_1017c07f.json +13 -0
  772. package/core/.kenaz/specialist/heimdall_proposal_3dfaa8b9.json +12 -0
  773. package/core/.kenaz/specialist/heimdall_proposal_57af18f9.json +15 -0
  774. package/core/.kenaz/specialist/heimdall_proposal_57b1aa1b.json +14 -0
  775. package/core/.kenaz/specialist/heimdall_proposal_5a3c9473.json +13 -0
  776. package/core/.kenaz/specialist/identity_verdicts/TASK_1073.json +75 -0
  777. package/core/.kenaz/specialist/identity_verdicts/TASK_TEST.json +77 -0
  778. package/core/.kenaz/specialist/memory_guard_fired.json +1 -0
  779. package/core/.kenaz/specialist/memory_guard_trigger_cache.json +1 -0
  780. package/core/.kenaz/specialist/memory_source_priority.yaml +260 -0
  781. package/core/.kenaz/specialist/motivational_state.schema.json +62 -0
  782. package/core/.kenaz/specialist/prompt_1775.txt +317 -0
  783. package/core/.kenaz/specialist/prompt_1776.txt +326 -0
  784. package/core/.kenaz/specialist/prompt_1791.txt +320 -0
  785. package/core/.kenaz/specialist/prompt_1792.txt +320 -0
  786. package/core/.kenaz/specialist/prompt_1795.txt +281 -0
  787. package/core/.kenaz/specialist/prompt_1813.txt +332 -0
  788. package/core/.kenaz/specialist/prompt_1814.txt +401 -0
  789. package/core/.kenaz/specialist/prompt_1815.txt +394 -0
  790. package/core/.kenaz/specialist/prompt_1816.txt +437 -0
  791. package/core/.kenaz/specialist/prompt_1818.txt +361 -0
  792. package/core/.kenaz/specialist/prompt_1819.txt +421 -0
  793. package/core/.kenaz/specialist/prompt_1821.txt +345 -0
  794. package/core/.kenaz/specialist/prompt_1822.txt +313 -0
  795. package/core/.kenaz/specialist/prompt_1824.txt +348 -0
  796. package/core/.kenaz/specialist/prompt_1826.txt +388 -0
  797. package/core/.kenaz/specialist/retired_organs/README.md +58 -0
  798. package/core/.kenaz/specialist/rune_calibration_poc.md +175 -0
  799. package/core/.kenaz/specialist/rune_efe_salience_gap.md +21 -0
  800. package/core/.kenaz/specialist/rune_ember_autonomous_dispatch_gate.md +24 -0
  801. package/core/.kenaz/specialist/rune_post_dispatch_verification_pattern.md +31 -0
  802. package/core/.kenaz/specialist/rune_surprise_proxy_improvement.md +28 -0
  803. package/core/.kenaz/specialist/rune_worktree_dispatch_pattern.md +31 -0
  804. package/core/.kenaz/specialist/rune_yaml_filter_desync_fix.md +26 -0
  805. package/core/.kenaz/specialist/rune_yggdrasil_project_identity_folder_name.md +24 -0
  806. package/core/.kenaz/specialist/sessions/chart_TASK_1599.json +41 -0
  807. package/core/.kenaz/specialist/sessions/hmap_028aa781-aad2-48c0-9a61-5540565d4a7f.json +5 -0
  808. package/core/.kenaz/specialist/sessions/hmap_20210387-0c64-400c-9d0a-53042a0cbd89.json +5 -0
  809. package/core/.kenaz/specialist/sessions/hmap_c1375c5d-fd9f-44bd-a83e-353ecbb0392f.json +5 -0
  810. package/core/.kenaz/specialist/sessions/scratch_028aa781-aad2-48c0-9a61-5540565d4a7f.json +6 -0
  811. package/core/.kenaz/specialist/sessions/scratch_0acc0fb3-24f9-453f-9e92-6ef1cdf03a7c.json +6 -0
  812. package/core/.kenaz/specialist/sessions/scratch_20210387-0c64-400c-9d0a-53042a0cbd89.json +6 -0
  813. package/core/.kenaz/specialist/sessions/scratch_2f10623e-b7a1-4647-905e-9dc7c4d99f9c.json +6 -0
  814. package/core/.kenaz/specialist/sessions/scratch_5a38b62d-608a-488c-82f0-7e47e95e0905.json +6 -0
  815. package/core/.kenaz/specialist/sessions/scratch_5d9758ef-d9b6-4ffe-a017-3ed26d0a313b.json +6 -0
  816. package/core/.kenaz/specialist/sessions/scratch_c1375c5d-fd9f-44bd-a83e-353ecbb0392f.json +6 -0
  817. package/core/.kenaz/specialist/sessions/scratch_c9f3c711-b73d-4fcd-ad2a-7b2bc024ee77.json +6 -0
  818. package/core/.kenaz/specialist/sessions/scratch_e72e5274-1c81-4655-a05a-f87d1ecb2917.json +6 -0
  819. package/core/.kenaz/specialist/sessions/scratch_f740cdbe-f756-41fc-98fb-2b1413d51901.json +6 -0
  820. package/core/.kenaz/specialist/t1777_probe.txt +1 -0
  821. package/core/.kenaz/specialist/task1825_update.json +43 -0
  822. package/core/.kenaz/specialist/task1827_update.json +43 -0
  823. package/core/.kenaz/specialist/task1828_update.json +43 -0
  824. package/core/.kenaz/specialist/taskgen/consolidation_i.json +38 -0
  825. package/core/.kenaz/specialist/taskgen/csharp_a.json +44 -0
  826. package/core/.kenaz/specialist/taskgen/csharp_b.json +40 -0
  827. package/core/.kenaz/specialist/taskgen/embedding_e.json +34 -0
  828. package/core/.kenaz/specialist/taskgen/hygiene_fg.json +39 -0
  829. package/core/.kenaz/specialist/taskgen/pathology_h.json +36 -0
  830. package/core/.kenaz/specialist/taskgen/unity_noise_d.json +38 -0
  831. package/core/.kenaz/specialist/taskgen/visibility_c.json +38 -0
  832. package/core/.kenaz/specialist/verify_1837.js +302 -0
  833. package/core/.kenaz/specialist/verify_1838.js +124 -0
  834. package/core/.kenaz/tmp/heimdall_proposal_fc7e0944.json +10 -0
  835. package/core/.kenaz/tmp_heimdall_proposal_8d3e392.json +13 -0
  836. package/core/.kenaz/tmp_props.json +1 -0
  837. package/core/.kenaz/tmp_sounddrop_t1_prompt.txt +371 -0
  838. package/core/.kenaz/user_model.schema.json +107 -0
  839. package/core/.matrix/README.md +257 -0
  840. package/core/.matrix/index.matrix +5 -0
  841. package/core/.mcp.json +8 -0
  842. package/core/.prefrontal/.gitkeep +0 -0
  843. package/core/.prefrontal/proposals/.gitkeep +0 -0
  844. package/core/.rule/INDEX.yaml +99 -0
  845. package/core/.rule/MECHANIZED.md +61 -0
  846. package/core/.rule/code/README.md +211 -0
  847. package/core/.rule/code/backend.yaml +294 -0
  848. package/core/.rule/code/checklist.yaml +258 -0
  849. package/core/.rule/code/maintainability.yaml +227 -0
  850. package/core/.rule/code/naming.yaml +106 -0
  851. package/core/.rule/code/principles.yaml +71 -0
  852. package/core/.rule/code/reusability.yaml +192 -0
  853. package/core/.rule/code/structure.yaml +218 -0
  854. package/core/.rule/code/style.yaml +197 -0
  855. package/core/.rule/design/ui.yaml +79 -0
  856. package/core/.rule/general/agent-workflow.yaml +572 -0
  857. package/core/.rule/general/cortex-memory-recall.yaml +446 -0
  858. package/core/.rule/general/cortex-tools.yaml +181 -0
  859. package/core/.rule/general/cross-platform.yaml +107 -0
  860. package/core/.rule/general/ddx-synapse-stack.yaml +162 -0
  861. package/core/.rule/general/file-size-threshold.yaml +45 -0
  862. package/core/.rule/general/identity-contract.schema.yaml +251 -0
  863. package/core/.rule/general/memory-language.yaml +67 -0
  864. package/core/.rule/general/memory-source-priority.yaml +207 -0
  865. package/core/.rule/general/pipeline.yaml +246 -0
  866. package/core/.rule/general/principles.yaml +77 -0
  867. package/core/.rule/general/project-self-containment.yaml +253 -0
  868. package/core/.rule/general/rust-verify-target.yaml +80 -0
  869. package/core/.rule/general/specialist-identity-contract.yaml +153 -0
  870. package/core/.rule/general/sunny-access-control.yaml +60 -0
  871. package/core/.rule/general/synapse-code-intelligence.yaml +375 -0
  872. package/core/.rule/general/synapse-cognitive-fusion.yaml +301 -0
  873. package/core/.rule/general/system-invariants.yaml +248 -0
  874. package/core/.rule/general/task-pool-routing.yaml +102 -0
  875. package/core/.rule/general/worktree-isolation.yaml +79 -0
  876. package/core/.rule/pipeline/PPL-002-completed-task-archival.yaml +528 -0
  877. package/core/.rule/pipeline/auto-update.yaml +282 -0
  878. package/core/.rule/pipeline/task-execution.yaml +368 -0
  879. package/core/.rule/tools/check-permissions.js +197 -0
  880. package/core/.specialist/Amelia/README.md +329 -0
  881. package/core/.specialist/Amelia/capability.yaml +386 -0
  882. package/core/.specialist/Amelia/knowledge.yaml +217 -0
  883. package/core/.specialist/Amelia/principles.yaml +10 -0
  884. package/core/.specialist/Amelia/rule.yaml +79 -0
  885. package/core/.specialist/Amelia/workflow.yaml +241 -0
  886. package/core/.specialist/Ansuz/HEURISTIC_BOOT_ROUTING.md +39 -0
  887. package/core/.specialist/Ansuz/ROUTING.md +35 -0
  888. package/core/.specialist/Ansuz/RULES.md +79 -0
  889. package/core/.specialist/Ansuz/SYSTEM_DOC.md +611 -0
  890. package/core/.specialist/Ansuz/VERIFY.md +38 -0
  891. package/core/.specialist/Ansuz/capability.yaml +338 -0
  892. package/core/.specialist/Ansuz/cognitive_principles.yaml +62 -0
  893. package/core/.specialist/Ansuz/concepts/agent_types.yaml +22 -0
  894. package/core/.specialist/Ansuz/concepts/autonomous_agenda.yaml +170 -0
  895. package/core/.specialist/Ansuz/concepts/autonomy_contract.yaml +126 -0
  896. package/core/.specialist/Ansuz/concepts/boot_ritual.yaml +107 -0
  897. package/core/.specialist/Ansuz/concepts/boot_rules_summary.yaml +16 -0
  898. package/core/.specialist/Ansuz/concepts/capability_pointers.yaml +21 -0
  899. package/core/.specialist/Ansuz/concepts/cognitive_fluency_contract.yaml +264 -0
  900. package/core/.specialist/Ansuz/concepts/cognitive_systems_competence_map.yaml +14 -0
  901. package/core/.specialist/Ansuz/concepts/cognitive_systems_hippocampus.yaml +14 -0
  902. package/core/.specialist/Ansuz/concepts/cognitive_systems_overview.yaml +27 -0
  903. package/core/.specialist/Ansuz/concepts/cognitive_systems_serendipity.yaml +14 -0
  904. package/core/.specialist/Ansuz/concepts/cognitive_systems_turn_context.yaml +13 -0
  905. package/core/.specialist/Ansuz/concepts/commitment_layer.yaml +150 -0
  906. package/core/.specialist/Ansuz/concepts/completion_tracking.yaml +29 -0
  907. package/core/.specialist/Ansuz/concepts/deep_knowledge_pointers.yaml +28 -0
  908. package/core/.specialist/Ansuz/concepts/evolvable_guardrails.yaml +20 -0
  909. package/core/.specialist/Ansuz/concepts/fatigue_handoff.yaml +84 -0
  910. package/core/.specialist/Ansuz/concepts/formation_quick_ref.yaml +28 -0
  911. package/core/.specialist/Ansuz/concepts/guardrails_immutable.yaml +31 -0
  912. package/core/.specialist/Ansuz/concepts/identity.yaml +48 -0
  913. package/core/.specialist/Ansuz/concepts/interaction_protocol.yaml +42 -0
  914. package/core/.specialist/Ansuz/concepts/meta_evolvable_tier.yaml +28 -0
  915. package/core/.specialist/Ansuz/concepts/mindset.yaml +18 -0
  916. package/core/.specialist/Ansuz/concepts/phase9_verification.yaml +21 -0
  917. package/core/.specialist/Ansuz/concepts/phase_protocol.yaml +66 -0
  918. package/core/.specialist/Ansuz/concepts/principles.yaml +65 -0
  919. package/core/.specialist/Ansuz/concepts/self_evolution_overview.yaml +53 -0
  920. package/core/.specialist/Ansuz/concepts/task_first_protocol.yaml +7 -0
  921. package/core/.specialist/Ansuz/concepts/task_pool.yaml +119 -0
  922. package/core/.specialist/Ansuz/concepts/task_system.yaml +22 -0
  923. package/core/.specialist/Ansuz/concepts/write_verification.yaml +26 -0
  924. package/core/.specialist/Ansuz/core.yaml +224 -0
  925. package/core/.specialist/Ansuz/decisions/ADR-requirement-graph-layer.md +390 -0
  926. package/core/.specialist/Ansuz/elixir.yaml +70 -0
  927. package/core/.specialist/Ansuz/exo_cortex_tools.yaml +13 -0
  928. package/core/.specialist/Ansuz/experiments/boot_ablation_replay.js +197 -0
  929. package/core/.specialist/Ansuz/guards/blind_spot_guards.yaml +28 -0
  930. package/core/.specialist/Ansuz/guards/lesson_guards.yaml +203 -0
  931. package/core/.specialist/Ansuz/identity_contract.yaml +375 -0
  932. package/core/.specialist/Ansuz/knowledge.yaml +284 -0
  933. package/core/.specialist/Ansuz/modules/amelia_review.yaml +112 -0
  934. package/core/.specialist/Ansuz/modules/ddx.yaml +47 -0
  935. package/core/.specialist/Ansuz/modules/design_checks.yaml +47 -0
  936. package/core/.specialist/Ansuz/modules/identity_verification.yaml +119 -0
  937. package/core/.specialist/Ansuz/modules/loop_guard.yaml +36 -0
  938. package/core/.specialist/Ansuz/modules/prevention.yaml +84 -0
  939. package/core/.specialist/Ansuz/modules/prophecy.yaml +95 -0
  940. package/core/.specialist/Ansuz/modules/pulse_empty.yaml +36 -0
  941. package/core/.specialist/Ansuz/modules/qa_intake.yaml +29 -0
  942. package/core/.specialist/Ansuz/modules/recall.yaml +45 -0
  943. package/core/.specialist/Ansuz/principles.yaml +31 -0
  944. package/core/.specialist/Ansuz/research/EMBER_architecture_comparison.md +142 -0
  945. package/core/.specialist/Ansuz/rule.yaml +97 -0
  946. package/core/.specialist/Ansuz/self_model_seed.backup.json +100 -0
  947. package/core/.specialist/Ansuz/self_model_seed.json +100 -0
  948. package/core/.specialist/Ansuz/self_model_seed.sha256 +1 -0
  949. package/core/.specialist/Ansuz/tools/ansuz-handoff-snapshot.js +626 -0
  950. package/core/.specialist/Ansuz/tools/ansuz-handoff.js +437 -0
  951. package/core/.specialist/Ansuz/tools/ansuz-sdk-runner.js +1254 -0
  952. package/core/.specialist/Ansuz/tools/ansuz-sdk-runner.test.js +137 -0
  953. package/core/.specialist/Ansuz/tools/ansuz-state.js +288 -0
  954. package/core/.specialist/Ansuz/tools/bootstrap-anchors.js +289 -0
  955. package/core/.specialist/Ansuz/tools/handoff-freshness-milestone.test.js +73 -0
  956. package/core/.specialist/Ansuz/tools/handoff-resolver.js +207 -0
  957. package/core/.specialist/Ansuz/tools/handoff-session-identity.test.js +333 -0
  958. package/core/.specialist/Ansuz/tools/handoff-snapshot-args.test.js +25 -0
  959. package/core/.specialist/Ansuz/tools/install-claude-hooks.js +354 -0
  960. package/core/.specialist/Ansuz/tools/install-claude-hooks.test.js +110 -0
  961. package/core/.specialist/Ansuz/tools/package.json +16 -0
  962. package/core/.specialist/Ansuz/tools/preservation-coordinator.js +504 -0
  963. package/core/.specialist/Ansuz/tools/verify-and-land.js +1012 -0
  964. package/core/.specialist/Ansuz/tools/verify-and-land.test.js +1099 -0
  965. package/core/.specialist/Ansuz/workflow.yaml +1273 -0
  966. package/core/.specialist/Forseti/capability.yaml +210 -0
  967. package/core/.specialist/Forseti/core.yaml +176 -0
  968. package/core/.specialist/Forseti/principles.yaml +88 -0
  969. package/core/.specialist/Forseti/rule.yaml +86 -0
  970. package/core/.specialist/Heimdall/SKILL.md +65 -0
  971. package/core/.specialist/Heimdall/capability.yaml +134 -0
  972. package/core/.specialist/Heimdall/core.yaml +275 -0
  973. package/core/.specialist/Heimdall/principles.yaml +66 -0
  974. package/core/.specialist/Heimdall/rule.yaml +68 -0
  975. package/core/.specialist/Huginn/capability.yaml +234 -0
  976. package/core/.specialist/Huginn/core.yaml +482 -0
  977. package/core/.specialist/Huginn/principles.yaml +57 -0
  978. package/core/.specialist/Huginn/rule.yaml +121 -0
  979. package/core/.specialist/REFLECTION_TO_CONTROL.md +347 -0
  980. package/core/.specialist/ansuz_session_handoff.json +96 -0
  981. package/core/.specialist/experiments/rg_benchmark.js +523 -0
  982. package/core/.specialist/experiments/rg_benchmark_results.json +27 -0
  983. package/core/.specialist/shared/cognitive-primer.md +15 -0
  984. package/core/.specialist/shared/guard_schema.json +290 -0
  985. package/core/.specialist/shared/principles.yaml +213 -0
  986. package/core/.specialist/tests/runtime-discovery/README.md +224 -0
  987. package/core/.specialist/tests/runtime-discovery/active-project-polling.test.js +495 -0
  988. package/core/.specialist/tests/runtime-discovery/port-binding.test.js +418 -0
  989. package/core/.specialist/tests/runtime-discovery/resolver-priority.test.js +693 -0
  990. package/core/.specialist/tests/runtime-discovery/resolver-skip-on-invalid.test.js +467 -0
  991. package/core/.specialist/tests/runtime-discovery/resolver-symmetry.test.js +679 -0
  992. package/core/.specialist/tests/runtime-discovery/tail-cli-project-path.test.js +231 -0
  993. package/core/.specialist/tools/MEMORY_RECALL_TRIGGERS.md +156 -0
  994. package/core/.specialist/tools/README.md +129 -0
  995. package/core/.specialist/tools/__tests__/freya-cli-contract.test.js +156 -0
  996. package/core/.specialist/tools/__tests__/task-1863-boot-lease-reuse.test.js +99 -0
  997. package/core/.specialist/tools/__tests__/task-1917-orphan-detection.test.js +175 -0
  998. package/core/.specialist/tools/__tests__/task-1977-banner-cap.test.js +129 -0
  999. package/core/.specialist/tools/__tests__/task-1983-lease-project-path.test.js +96 -0
  1000. package/core/.specialist/tools/__tests__/task-2218-boot-session-id.test.js +118 -0
  1001. package/core/.specialist/tools/__tests__/task-2222-session-identity-interleave.test.js +203 -0
  1002. package/core/.specialist/tools/__tests__/task-2246-reap-honesty.test.js +96 -0
  1003. package/core/.specialist/tools/__tests__/task-2254-handoff-archive-contract.test.js +60 -0
  1004. package/core/.specialist/tools/__tests__/task-2272-open-card-status-quote.test.js +26 -0
  1005. package/core/.specialist/tools/__tests__/task-2374-usage-counter.test.js +34 -0
  1006. package/core/.specialist/tools/ansuz-boot-fast.js +1120 -0
  1007. package/core/.specialist/tools/ansuz-boot-fast.test.js +705 -0
  1008. package/core/.specialist/tools/canary.js +501 -0
  1009. package/core/.specialist/tools/context-injection.js +395 -0
  1010. package/core/.specialist/tools/design-reasoning.js +493 -0
  1011. package/core/.specialist/tools/discovery-fixtures.js +308 -0
  1012. package/core/.specialist/tools/discovery-runner.js +460 -0
  1013. package/core/.specialist/tools/failure-detector.js +1132 -0
  1014. package/core/.specialist/tools/identity-scorer.js +714 -0
  1015. package/core/.specialist/tools/jev-optional-context.js +107 -0
  1016. package/core/.specialist/tools/jev-optional-context.test.js +152 -0
  1017. package/core/.specialist/tools/lesson-guard.js +1084 -0
  1018. package/core/.specialist/tools/lib/chart-path.js +159 -0
  1019. package/core/.specialist/tools/lib/chart-path.test.js +171 -0
  1020. package/core/.specialist/tools/lib/project-resolver.js +200 -0
  1021. package/core/.specialist/tools/lib/project-resolver.test.js +241 -0
  1022. package/core/.specialist/tools/memory-action-log.js +839 -0
  1023. package/core/.specialist/tools/phase-gate.js +3754 -0
  1024. package/core/.specialist/tools/phase-gate.test.js +85 -0
  1025. package/core/.specialist/tools/phase9-policy.test.js +109 -0
  1026. package/core/.specialist/tools/precompute-runner.js +444 -0
  1027. package/core/.specialist/tools/prompt-files.test.js +169 -0
  1028. package/core/.specialist/tools/replay-detectors.js +290 -0
  1029. package/core/.specialist/tools/rule-engine.js +621 -0
  1030. package/core/.specialist/tools/session-boot-ownership.test.js +117 -0
  1031. package/core/.specialist/tools/session-project-state.test.js +65 -0
  1032. package/core/.specialist/tools/session.js +1866 -0
  1033. package/core/.specialist/tools/stream-lease.js +263 -0
  1034. package/core/.specialist/tools/task-bridge-jev.test.js +170 -0
  1035. package/core/.specialist/tools/task-bridge.js +765 -0
  1036. package/core/.specialist/tools/verify-identity.js +453 -0
  1037. package/core/.specialist/tools/wish-mandate-delivery.test.js +76 -0
  1038. package/core/.system/README.md +555 -0
  1039. package/core/.system/agent-skills/README.md +724 -0
  1040. package/core/.system/archive/README.md +499 -0
  1041. package/core/.system/assessment/README.md +645 -0
  1042. package/core/.system/cli-tools/README.md +724 -0
  1043. package/core/.system/collaboration/KNOWLEDGE.md +65 -0
  1044. package/core/.system/collaboration/README.md +570 -0
  1045. package/core/.system/cortex/MODULES.md +1046 -0
  1046. package/core/.system/dashboard/FRONTEND.md +812 -0
  1047. package/core/.system/dashboard/README.md +737 -0
  1048. package/core/.system/external-skills/README.md +522 -0
  1049. package/core/.system/failure/README.md +723 -0
  1050. package/core/.system/formation/LEGACY_SKILLS.md +972 -0
  1051. package/core/.system/formation/POST_COMPLETE.md +600 -0
  1052. package/core/.system/formation/README.md +1092 -0
  1053. package/core/.system/formation/TOOLS_REFERENCE.md +1145 -0
  1054. package/core/.system/githooks/README.md +846 -0
  1055. package/core/.system/kenaz/README.md +787 -0
  1056. package/core/.system/memory/README.md +716 -0
  1057. package/core/.system/pipeline/README.md +712 -0
  1058. package/core/.system/rule/README.md +794 -0
  1059. package/core/.system/specialist/README.md +669 -0
  1060. package/core/.system/specialist/STRUCTURE.md +262 -0
  1061. package/core/.system/sunny/README.md +476 -0
  1062. package/core/.system/sunny/RULES.json +89 -0
  1063. package/core/.system/sunny/knowledge/INDEX.md +37 -0
  1064. package/core/.system/sunny/knowledge/agent-teams-api.md +0 -0
  1065. package/core/.system/sunny/knowledge/ansuz-specialist.md +500 -0
  1066. package/core/.system/sunny/knowledge/claude-cli-spawn.md +177 -0
  1067. package/core/.system/sunny/knowledge/collaboration-api.md +925 -0
  1068. package/core/.system/sunny/teammates/README.md +107 -0
  1069. package/core/.system/sunny/teammates/how_to_use.yaml +101 -0
  1070. package/core/.system/sunny/teammates/tools/headless/launcher.js +318 -0
  1071. package/core/.system/sunny/teammates/tools/powershell/launcher.js +241 -0
  1072. package/core/.system/sunny/teammates/tools/powershell/start.bat +50 -0
  1073. package/core/.system/sunny/teammates/tools/utils/env.js +96 -0
  1074. package/core/.system/sunny/teammates/tools/utils/format-output.js +329 -0
  1075. package/core/.system/sunny/tools.json +101 -0
  1076. package/core/.vendor/js-yaml.cjs +2795 -0
  1077. package/core/.vendor/require-yaml.cjs +8 -0
  1078. package/core/CLAUDE.md +172 -0
  1079. package/core/KENAZ_CORE_VERSION +1 -0
  1080. package/core/dev/ALAYA_FIELD_FEEDBACK_DESIGN.md +126 -0
  1081. package/core/dev/ANSUZ_SCAFFOLD_DIET_2026-09-20.md +231 -0
  1082. package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +355 -0
  1083. package/core/dev/ANSUZ_WORKFLOW_MODERNIZATION.md +143 -0
  1084. package/core/dev/CORTEX_META_GRAPH_ASSESSMENT.md +99 -0
  1085. package/core/dev/FREYA_DOWNSTREAM_BUGS_2026-09-19.md +44 -0
  1086. package/core/dev/GLOBAL_MEMORY_IDENTITY_CONSOLIDATION.md +263 -0
  1087. package/core/dev/GUARD_EFFECTIVENESS_DESIGN.md +180 -0
  1088. package/core/dev/HEALTH_GATE_VARIANCE_ASSESSMENT.md +271 -0
  1089. package/core/dev/HOOK_DIET_2026-09-21.md +126 -0
  1090. package/core/dev/JEV_INTEGRATION_PLAN.md +189 -0
  1091. package/core/dev/KENAZ_AGENT_CONNECT_v1_SPEC.md +139 -0
  1092. package/core/dev/MOBILE_DESIGN_SPEC.md +569 -0
  1093. package/core/dev/MULTI_ANSUZ_SPEC.md +136 -0
  1094. package/core/dev/MUNINN_RETIREMENT.md +115 -0
  1095. package/core/dev/PHASE3_ATTRIBUTION_POPULATION_DIAGNOSIS.md +211 -0
  1096. package/core/dev/PHASE3_P3-2B_TASKLEVEL_PROBE.md +83 -0
  1097. package/core/dev/PHASE3_P3-2_POPULATION_DISJOINTNESS.md +83 -0
  1098. package/core/dev/PHASE3_P3-2_REMEASURE_REPORT.md +231 -0
  1099. package/core/dev/PREDICTION_GROUNDING_DESIGN.md +376 -0
  1100. package/core/dev/PRODUCT_SPEC.md +317 -0
  1101. package/core/dev/PRODUCT_SPEC_FOR_AI_tepmlate.md +716 -0
  1102. package/core/dev/PROJECT_REGISTRY_DUPLICATE_ASSESSMENT.md +86 -0
  1103. package/core/dev/STARTUP_TIMELINE_TASK_1995.md +181 -0
  1104. package/core/dev/SYNAPSE_WORKER_PER_PROJECT.md +881 -0
  1105. package/core/dev/TASK_1680_P3-3_DISPATCH_SPEC.md +96 -0
  1106. package/core/dev/TASK_1684_CALIBRATION_IMPACT_ANALYSIS.md +170 -0
  1107. package/core/dev/TASK_1684_FORK_A_GOODHART_DESIGN.md +171 -0
  1108. package/core/dev/TASK_1684_P3_2_REMEASURE_VALIDATION.md +262 -0
  1109. package/core/dev/TASK_1903_SIGNAL_AUC_MEASUREMENT.md +207 -0
  1110. package/core/dev/TASK_1904_BRANCH_INTEGRITY_AUDIT.md +146 -0
  1111. package/core/dev/ansuz-eval/README.md +38 -0
  1112. package/core/dev/ansuz-eval/build-fixtures.js +87 -0
  1113. package/core/dev/ansuz-eval/grade.js +96 -0
  1114. package/core/dev/ansuz-eval/grader.test.js +117 -0
  1115. package/core/dev/ansuz-eval/tasks.md +32 -0
  1116. package/core/dev/archive/ansuz/BOOT_FULL.md +141 -0
  1117. package/core/dev/archive/ansuz/agents/ansuz-boot.md +176 -0
  1118. package/core/dev/archive/ansuz/designs/alaya-passive-surfacing.md +84 -0
  1119. package/core/dev/archive/ansuz/designs/cc_memory_indexing.md +307 -0
  1120. package/core/dev/archive/ansuz/designs/check_guard.md +322 -0
  1121. package/core/dev/archive/ansuz/designs/consequence_loop.md +227 -0
  1122. package/core/dev/archive/ansuz/designs/mcp_kuzudb_lock_architecture.md +312 -0
  1123. package/core/dev/archive/ansuz/designs/phase0_git_enrichment.md +278 -0
  1124. package/core/dev/archive/ansuz/designs/refactor_mcp_tools_synapse.md +490 -0
  1125. package/core/dev/archive/ansuz/designs/semantic_markdown_extraction.md +167 -0
  1126. package/core/dev/archive/ansuz/designs/task_1372_prompt_injects_into.md +193 -0
  1127. package/core/dev/archive/ansuz/designs/thought_stack.md +286 -0
  1128. package/core/dev/archive/ansuz/investigations/reachability_unified_api_2026-04-11.md +330 -0
  1129. package/core/dev/archive/ansuz/investigations/synapse_orphans_indexing_bug_2026-04-11.md +352 -0
  1130. package/core/dev/archive/ansuz/investigations/synapse_orphans_reindex_verification_2026-04-11.md +48 -0
  1131. package/core/dev/archive/ansuz/investigations/synapse_orphans_verification_2026-04-11.md +170 -0
  1132. package/core/dev/archive/ansuz/legacy/kernel.yaml +399 -0
  1133. package/core/dev/archive/ansuz/legacy/phases/phase_0.yaml +418 -0
  1134. package/core/dev/archive/ansuz/legacy/phases/phase_1.yaml +376 -0
  1135. package/core/dev/archive/ansuz/legacy/phases/phase_10.yaml +35 -0
  1136. package/core/dev/archive/ansuz/legacy/phases/phase_11.yaml +582 -0
  1137. package/core/dev/archive/ansuz/legacy/phases/phase_2.yaml +94 -0
  1138. package/core/dev/archive/ansuz/legacy/phases/phase_3.yaml +274 -0
  1139. package/core/dev/archive/ansuz/legacy/phases/phase_4.yaml +67 -0
  1140. package/core/dev/archive/ansuz/legacy/phases/phase_5.yaml +32 -0
  1141. package/core/dev/archive/ansuz/legacy/phases/phase_6.yaml +91 -0
  1142. package/core/dev/archive/ansuz/legacy/phases/phase_7.yaml +58 -0
  1143. package/core/dev/archive/ansuz/legacy/phases/phase_8.yaml +146 -0
  1144. package/core/dev/archive/ansuz/legacy/phases/phase_9.yaml +424 -0
  1145. package/core/dev/archive/ansuz/specs/INDEX_bifrost_hook_parity.yaml +92 -0
  1146. package/core/dev/archive/ansuz/specs/active-inference-formation.yaml +453 -0
  1147. package/core/dev/archive/ansuz/specs/brief_TASK_1228_userpromptsubmit.yaml +191 -0
  1148. package/core/dev/archive/ansuz/specs/brief_TASK_1229_pretooluse_posttooluse.yaml +250 -0
  1149. package/core/dev/archive/ansuz/specs/brief_TASK_1230_sessionstart_stop.yaml +301 -0
  1150. package/core/dev/archive/ansuz/specs/brief_TASK_1231_verification.yaml +272 -0
  1151. package/core/dev/design/PHASE4_DESIGN.md +559 -0
  1152. package/core/dev/design/dashboard_docs_integration_PLAN.md +388 -0
  1153. package/core/dev/design/matrix_format_ABBREVIATIONS.md +655 -0
  1154. package/core/dev/design/matrix_format_DESIGN_SPEC.md +601 -0
  1155. package/core/dev/design/matrix_format_DISCUSSION_SUMMARY.md +484 -0
  1156. package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +13 -0
  1157. package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +9 -0
  1158. package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +14 -0
  1159. package/core/dev/design/matrix_format_SYNTAX_BNF.md +754 -0
  1160. package/core/dev/design/matrix_format_TOKEN_COMPARISON.md +484 -0
  1161. package/core/dev/design/matrix_v2_COGNITIVE_DESIGN.md +503 -0
  1162. package/core/dev/design/matrix_v2_DISCUSSION_SUMMARY.md +414 -0
  1163. package/core/dev/design/matrix_v2_EXAMPLE.matrix +67 -0
  1164. package/core/dev/designs/EXPANDABLE_CARD_DESIGN_SPEC.md +509 -0
  1165. package/core/dev/jev-eval/ACTIVE_CORRECTION.md +52 -0
  1166. package/core/dev/jev-eval/ANNOTATION_GUIDE.md +68 -0
  1167. package/core/dev/jev-eval/BASELINE_COMPARISON.md +45 -0
  1168. package/core/dev/jev-eval/CONTEXT_REVIEW.md +31 -0
  1169. package/core/dev/jev-eval/EVALUATION_STATUS.md +39 -0
  1170. package/core/dev/jev-eval/HISTORICAL_CORPUS.md +33 -0
  1171. package/core/dev/jev-eval/PACKAGING_VERIFICATION.md +42 -0
  1172. package/core/dev/jev-eval/README.md +101 -0
  1173. package/core/dev/jev-eval/THALAMUS_RANKING.md +58 -0
  1174. package/core/dev/jev-eval/VALIDATION_PROGRESS.md +54 -0
  1175. package/core/dev/jev-eval/cli.mjs +50 -0
  1176. package/core/dev/jev-eval/context.mjs +183 -0
  1177. package/core/dev/jev-eval/corpus.mjs +186 -0
  1178. package/core/dev/jev-eval/fixtures/conversation-review.seed.jsonl +6 -0
  1179. package/core/dev/jev-eval/fixtures/synthetic.jsonl +11 -0
  1180. package/core/dev/jev-eval/metrics.mjs +67 -0
  1181. package/core/dev/jev-eval/muninn-baseline.mjs +119 -0
  1182. package/core/dev/jev-eval/providers.mjs +95 -0
  1183. package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +32 -0
  1184. package/core/dev/jev-eval/reports/context-review-2026-09-20.json +48 -0
  1185. package/core/dev/jev-eval/reports/conversation-review.pending.json +151 -0
  1186. package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +52 -0
  1187. package/core/dev/jev-eval/reports/length-probe-2026-09-20.json +133 -0
  1188. package/core/dev/jev-eval/reports/live-smoke-2026-09-20.json +616 -0
  1189. package/core/dev/jev-eval/reports/muninn-baseline-2026-09-20.json +52 -0
  1190. package/core/dev/jev-eval/reports/resilience-2026-09-20.json +520 -0
  1191. package/core/dev/jev-eval/reports/rules-baseline.json +197 -0
  1192. package/core/dev/jev-eval/reports/synthetic-review.pending.json +357 -0
  1193. package/core/dev/jev-eval/resilience.mjs +71 -0
  1194. package/core/dev/jev-eval/review.mjs +78 -0
  1195. package/core/dev/jev-eval/schema.mjs +87 -0
  1196. package/core/dev/jev-eval/test/context.test.mjs +95 -0
  1197. package/core/dev/jev-eval/test/corpus.test.mjs +102 -0
  1198. package/core/dev/jev-eval/test/eval.test.mjs +146 -0
  1199. package/core/dev/jev-eval/test/muninn-baseline.test.mjs +71 -0
  1200. package/core/dev/jev-eval/test/resilience.test.mjs +72 -0
  1201. package/core/dev/jev-eval/test/review.test.mjs +61 -0
  1202. package/core/dev/pipeline/LOCK_STATE.json +4 -0
  1203. package/core/dev/pipeline/OPTIMIZATION_PROPOSALS.json +32 -0
  1204. package/core/dev/pipeline/PHASE3_PLANNING_SUMMARY.md +338 -0
  1205. package/core/dev/pipeline/PIPELINE_CONFIG.json +46 -0
  1206. package/core/dev/pipeline/PROGRESS.md +113 -0
  1207. package/core/dev/pipeline/PROGRESS_template.md +860 -0
  1208. package/core/dev/pipeline/QA_REPORT_F008.md +431 -0
  1209. package/core/dev/pipeline/QA_REPORT_LOCAL_CLAUDE_DIAGNOSIS.md +583 -0
  1210. package/core/dev/pipeline/README.md +210 -0
  1211. package/core/dev/pipeline/SELF_ENHANCEMENT_STATUS.json.bak +47 -0
  1212. package/core/dev/pipeline/TASK_QUEUE.json +192 -0
  1213. package/core/dev/pipeline/WORKFLOW_GUIDE.md +824 -0
  1214. package/core/dev/pipeline/archived/TASK_015_tauri_init.yaml +53 -0
  1215. package/core/dev/pipeline/archived/TASK_016_tauri_commands.yaml +54 -0
  1216. package/core/dev/pipeline/archived/TASK_017_rust_pty.yaml +54 -0
  1217. package/core/dev/pipeline/archived/TASK_018_tauri_bundle.yaml +53 -0
  1218. package/core/dev/pipeline/archived/TASK_019_release_workflow.yaml +56 -0
  1219. package/core/dev/pipeline/archived/TASK_020_update_ui.yaml +54 -0
  1220. package/core/dev/pipeline/archived/TASK_021_update_notification_ui.yaml +55 -0
  1221. package/core/dev/pipeline/archived/TASK_022_remove_node_pty.yaml +65 -0
  1222. package/core/dev/pipeline/archived/TASK_023_api_routes_migration.yaml +86 -0
  1223. package/core/dev/pipeline/archived/TASK_024_feature_id_system.yaml +51 -0
  1224. package/core/dev/pipeline/archived/TASK_025_executable_acceptance.yaml +66 -0
  1225. package/core/dev/pipeline/archived/TASK_026_spec_versioning.yaml +56 -0
  1226. package/core/dev/pipeline/archived/TASK_027_drift_detection.yaml +60 -0
  1227. package/core/dev/pipeline/archived/TASK_028_tauri_pty_manager.yaml +60 -0
  1228. package/core/dev/pipeline/archived/TASK_029_tauri_pty_commands.yaml +62 -0
  1229. package/core/dev/pipeline/archived/TASK_030_frontend_session_adapter.yaml +54 -0
  1230. package/core/dev/pipeline/archived/TASK_031_terminal_tauri_events.yaml +56 -0
  1231. package/core/dev/pipeline/archived/TASK_041_scheduler_data_models.yaml +54 -0
  1232. package/core/dev/pipeline/archived/TASK_042_path_lock_manager.yaml +53 -0
  1233. package/core/dev/pipeline/archived/TASK_043_process_manager.yaml +57 -0
  1234. package/core/dev/pipeline/archived/TASK_044_git_integration.yaml +85 -0
  1235. package/core/dev/pipeline/archived/TASK_045_task_queue_manager.yaml +54 -0
  1236. package/core/dev/pipeline/archived/TASK_046_scheduler_dispatcher.yaml +60 -0
  1237. package/core/dev/pipeline/archived/TASK_047_tauri_scheduler_commands.yaml +55 -0
  1238. package/core/dev/pipeline/archived/TASK_048_realtime_status_push.yaml +92 -0
  1239. package/core/dev/pipeline/archived/TASK_049_frontend_scheduler_integration.yaml +58 -0
  1240. package/core/dev/pipeline/archived/TASK_050_error_recovery.yaml +56 -0
  1241. package/core/dev/pipeline/archived/TASK_051_optimization_proposals_backend.yaml +53 -0
  1242. package/core/dev/pipeline/archived/TASK_052_optimization_proposals_ui.yaml +58 -0
  1243. package/core/dev/pipeline/archived/TASK_053_optimization_proposals_diff_view.yaml +54 -0
  1244. package/core/dev/pipeline/archived/TASK_054_multi_project_scheduler_state.yaml +76 -0
  1245. package/core/dev/pipeline/archived/TASK_055_scheduler_api_project_scope.yaml +64 -0
  1246. package/core/dev/pipeline/archived/TASK_056_frontend_scheduler_project_scope.yaml +62 -0
  1247. package/core/dev/pipeline/archived/TASK_057_scheduler_module_structure.yaml +54 -0
  1248. package/core/dev/pipeline/archived/TASK_058_scheduler_models_extract.yaml +51 -0
  1249. package/core/dev/pipeline/archived/TASK_059_scheduler_core_extract.yaml +51 -0
  1250. package/core/dev/pipeline/archived/TASK_060_scheduler_commands_extract.yaml +51 -0
  1251. package/core/dev/pipeline/archived/TASK_061_scheduler_specialized_commands.yaml +53 -0
  1252. package/core/dev/pipeline/archived/TASK_062_process_manager_module_structure.yaml +56 -0
  1253. package/core/dev/pipeline/archived/TASK_063_process_manager_core_extract.yaml +56 -0
  1254. package/core/dev/pipeline/archived/TASK_064_recovery_module_structure.yaml +57 -0
  1255. package/core/dev/pipeline/archived/TASK_065_recovery_core_extract.yaml +56 -0
  1256. package/core/dev/pipeline/archived/TASK_066_self_enhancement_scheduler_models.yaml +60 -0
  1257. package/core/dev/pipeline/archived/TASK_067_agents_section_quick_actions.yaml +53 -0
  1258. package/core/dev/pipeline/archived/TASK_067_self_enhancement_scheduler_core.yaml +65 -0
  1259. package/core/dev/pipeline/archived/TASK_068_agent_workflow_rule_enhancement.yaml +46 -0
  1260. package/core/dev/pipeline/archived/TASK_068_self_enhancement_tauri_commands.yaml +61 -0
  1261. package/core/dev/pipeline/archived/TASK_069_agent_wizard_responsive.yaml +46 -0
  1262. package/core/dev/pipeline/archived/TASK_069_self_enhancement_ui.yaml +62 -0
  1263. package/core/dev/pipeline/archived/TASK_070_preview_panel_redesign.yaml +62 -0
  1264. package/core/dev/pipeline/archived/TASK_070_self_enhancement_integration.yaml +57 -0
  1265. package/core/dev/pipeline/archived/TASK_071_preview_panel_qa.yaml +98 -0
  1266. package/core/dev/pipeline/archived/TASK_071_single_agent_config.yaml +57 -0
  1267. package/core/dev/pipeline/archived/TASK_072_preview_modal_esc_fix.yaml +71 -0
  1268. package/core/dev/pipeline/archived/TASK_072_product_review_module.yaml +57 -0
  1269. package/core/dev/pipeline/archived/TASK_073_agents_page_component_refactor.yaml +68 -0
  1270. package/core/dev/pipeline/archived/TASK_073_rename_single_agent.yaml +64 -0
  1271. package/core/dev/pipeline/archived/TASK_074_preview_mode_ui_diagnosis.yaml +71 -0
  1272. package/core/dev/pipeline/archived/TASK_074_single_agent_ui_toggle.yaml +56 -0
  1273. package/core/dev/pipeline/archived/TASK_075_agents_page_component_refactor.yaml +69 -0
  1274. package/core/dev/pipeline/archived/TASK_075_single_agent_integration_test.yaml +75 -0
  1275. package/core/dev/pipeline/archived/TASK_076_preview_mode_ui_diagnosis.yaml +70 -0
  1276. package/core/dev/pipeline/archived/TASK_076_single_agent_continuous_mode.yaml +65 -0
  1277. package/core/dev/pipeline/archived/TASK_077_failure_directory_structure.yaml +51 -0
  1278. package/core/dev/pipeline/archived/TASK_077_single_agent_typescript_types.yaml +59 -0
  1279. package/core/dev/pipeline/archived/TASK_078_fail_001_agent_no_output.yaml +53 -0
  1280. package/core/dev/pipeline/archived/TASK_078_single_agent_ui_simplify.yaml +74 -0
  1281. package/core/dev/pipeline/archived/TASK_079_dashboard_rwd_responsive.yaml +63 -0
  1282. package/core/dev/pipeline/archived/TASK_079_fail_002_json_bom.yaml +56 -0
  1283. package/core/dev/pipeline/archived/TASK_080_fail_003_queue_pollution.yaml +56 -0
  1284. package/core/dev/pipeline/archived/TASK_080_http_server_module.yaml +55 -0
  1285. package/core/dev/pipeline/archived/TASK_081_failure_logging_tools.yaml +57 -0
  1286. package/core/dev/pipeline/archived/TASK_081_http_api_routes.yaml +62 -0
  1287. package/core/dev/pipeline/archived/TASK_082_frontend_api_adapter.yaml +51 -0
  1288. package/core/dev/pipeline/archived/TASK_082_integrate_failure_to_workflow.yaml +60 -0
  1289. package/core/dev/pipeline/archived/TASK_083_cleanup_nextjs_api.yaml +48 -0
  1290. package/core/dev/pipeline/archived/TASK_083_task_queue_cleanup.yaml +67 -0
  1291. package/core/dev/pipeline/archived/TASK_084_rust_dead_code_cleanup.yaml +66 -0
  1292. package/core/dev/pipeline/archived/TASK_084_scheduler_sync_logic_fix.yaml +68 -0
  1293. package/core/dev/pipeline/archived/TASK_085_http_api_web_mode_fixes.yaml +46 -0
  1294. package/core/dev/pipeline/archived/TASK_085_memory_consolidation_0204_0205.yaml +98 -0
  1295. package/core/dev/pipeline/archived/TASK_086_collapsible_preview_panel.yaml +161 -0
  1296. package/core/dev/pipeline/archived/TASK_086_web_mode_feature_parity.yaml +62 -0
  1297. package/core/dev/pipeline/archived/TASK_087_manual_memory_archival.yaml +163 -0
  1298. package/core/dev/pipeline/archived/TASK_087_mobile_http_control.yaml +68 -0
  1299. package/core/dev/pipeline/archived/TASK_088_fail_003_to_ppl_002_rule.yaml +63 -0
  1300. package/core/dev/pipeline/archived/TASK_088_mobile_http_qa.yaml +121 -0
  1301. package/core/dev/pipeline/archived/TASK_089_agent_collaboration_topic.yaml +60 -0
  1302. package/core/dev/pipeline/archived/TASK_089_web_mode_monitor_fix.yaml +58 -0
  1303. package/core/dev/pipeline/archived/TASK_090_cli_detection_fix.yaml +61 -0
  1304. package/core/dev/pipeline/archived/TASK_090_ui_ux_lessons_topic.yaml +63 -0
  1305. package/core/dev/pipeline/archived/TASK_091_expandable_card_design.yaml +56 -0
  1306. package/core/dev/pipeline/archived/TASK_091_move_agent_section_components.yaml +65 -0
  1307. package/core/dev/pipeline/archived/TASK_092_expandable_card_component.yaml +60 -0
  1308. package/core/dev/pipeline/archived/TASK_092_refactor_agent_create_wizard.yaml +84 -0
  1309. package/core/dev/pipeline/archived/TASK_093_taskcard_detail_integration.yaml +57 -0
  1310. package/core/dev/pipeline/archived/TASK_093_update_barrel_exports_test.yaml +84 -0
  1311. package/core/dev/pipeline/archived/TASK_094_ai_agent_generation_enhancement.yaml +115 -0
  1312. package/core/dev/pipeline/archived/TASK_094_proposalcard_detail_integration.yaml +55 -0
  1313. package/core/dev/pipeline/archived/TASK_095_preview_fixes.yaml +129 -0
  1314. package/core/dev/pipeline/archived/TASK_095_single_agent_task_selector.yaml +60 -0
  1315. package/core/dev/pipeline/archived/TASK_096_agents_page_ux_improvements.yaml +163 -0
  1316. package/core/dev/pipeline/archived/TASK_096_single_agent_status_sync.yaml +60 -0
  1317. package/core/dev/pipeline/archived/TASK_097_local_claude_error_logging.yaml +59 -0
  1318. package/core/dev/pipeline/archived/TASK_097_single_agent_monitor_events.yaml +59 -0
  1319. package/core/dev/pipeline/archived/TASK_098_product_manager_team_phase2.yaml +60 -0
  1320. package/core/dev/pipeline/archived/TASK_098_single_agent_refactor_test.yaml +58 -0
  1321. package/core/dev/pipeline/archived/TASK_099_backend_team_creation.yaml +258 -0
  1322. package/core/dev/pipeline/archived/TASK_100_frontend_team_creation.yaml +61 -0
  1323. package/core/dev/pipeline/archived/TASK_101_orchestrator_system.yaml +403 -0
  1324. package/core/dev/pipeline/archived/TASK_102_designer_sre_teams.yaml +90 -0
  1325. package/core/dev/pipeline/archived/TASK_103_integration_testing.yaml +86 -0
  1326. package/core/dev/pipeline/archived/TASK_128_integration_testing.yaml +83 -0
  1327. package/core/dev/pipeline/archived/TASK_134_cortex_v2_phase3_file_watcher.yaml +65 -0
  1328. package/core/dev/pipeline/archived/TASK_134_team_http_api.yaml +96 -0
  1329. package/core/dev/pipeline/archived/TASK_135_cortex_v2_phase3_git_monitor.yaml +63 -0
  1330. package/core/dev/pipeline/archived/TASK_136_cortex_v2_phase3_change_analyzer.yaml +69 -0
  1331. package/core/dev/pipeline/archived/TASK_137_cortex_v2_phase3_cache_invalidator.yaml +67 -0
  1332. package/core/dev/pipeline/archived/TASK_137_team_orchestrator_integration.yaml +93 -0
  1333. package/core/dev/pipeline/archived/TASK_138_cortex_v2_phase3_distributed_cache.yaml +68 -0
  1334. package/core/dev/pipeline/archived/TASK_138_matrix_folder_structure.yaml +61 -0
  1335. package/core/dev/pipeline/archived/TASK_139_cortex_v2_phase3_cache_prewarming.yaml +65 -0
  1336. package/core/dev/pipeline/archived/TASK_146_unified_documentation.yaml +141 -0
  1337. package/core/dev/pipeline/archived/TASK_147_pipeline_execution_rules.yaml +76 -0
  1338. package/core/dev/pipeline/archived/TASK_148_update_claude_md.yaml +77 -0
  1339. package/core/dev/pipeline/archived/TASK_149_fix_nextjs_mdx_serialization.yaml +63 -0
  1340. package/core/dev/pipeline/archived/TASK_149_update_team_docs.yaml +77 -0
  1341. package/core/dev/pipeline/archived/TASK_150_pipeline_workflow_guide.yaml +82 -0
  1342. package/core/dev/pipeline/archived/TASK_164_fix_smart_context_switch.yaml +49 -0
  1343. package/core/dev/pipeline/archived/TASK_165_ctags_symbol_index.yaml +53 -0
  1344. package/core/dev/pipeline/archived/TASK_166_symbol_search_mcp_tool.yaml +48 -0
  1345. package/core/dev/pipeline/archived/TASK_167_llm_module_summary.yaml +55 -0
  1346. package/core/dev/pipeline/archived/TASK_168_map_reduce_context.yaml +51 -0
  1347. package/core/dev/pipeline/archived/TASK_169_v2_integration_testing.yaml +52 -0
  1348. package/core/dev/pipeline/backups/archive_2026-02-04T22-07-22/TASK_QUEUE_backup.json +95 -0
  1349. package/core/dev/pipeline/docs/multi-agent-coordination.md +446 -0
  1350. package/core/dev/pipeline/docs/overview.md +406 -0
  1351. package/core/dev/pipeline/docs/task-management.md +412 -0
  1352. package/core/dev/pipeline/docs/workflows.md +32 -0
  1353. package/core/dev/pipeline/orchestrator/schemas/task_queue_schema.json +58 -0
  1354. package/core/dev/pipeline/orchestrator/schemas/task_schema.json +139 -0
  1355. package/core/dev/pipeline/plans/PLAN_task_cli_refactor.md +281 -0
  1356. package/core/dev/pipeline/tasks/.gitkeep +1 -0
  1357. package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +27 -0
  1358. package/core/dev/plans/CLI_FIRST_INSTALL_FLOW.md +128 -0
  1359. package/core/dev/plans/FORMATION_RETIREMENT_PLAN.md +313 -0
  1360. package/core/dev/plans/KUZU_REPLACEMENT_PLAN.md +126 -0
  1361. package/core/dev/schemas/PRODUCT_SPEC.example.yaml +382 -0
  1362. package/core/dev/schemas/PRODUCT_SPEC.schema.json +800 -0
  1363. package/core/dev/schemas/README.md +517 -0
  1364. package/core/dev/schemas/TASK.schema.json +226 -0
  1365. package/core/dev/schemas/dataflows_ground_truth.yaml +173 -0
  1366. package/core/dev/schemas/dataflows_spec.yaml +160 -0
  1367. package/core/dev/schemas/extends_ground_truth.yaml +66 -0
  1368. package/core/dev/schemas/extends_spec.yaml +121 -0
  1369. package/core/dev/schemas/implements_ground_truth.yaml +77 -0
  1370. package/core/dev/schemas/implements_spec.yaml +140 -0
  1371. package/core/dev/scripts/CRASH_DIAGNOSIS.md +47 -0
  1372. package/core/dev/scripts/README.md +142 -0
  1373. package/core/dev/scripts/RUN_ONCE.bat +40 -0
  1374. package/core/dev/scripts/START_DEV_AGENT.bat +63 -0
  1375. package/core/dev/scripts/START_MULTI_AGENT.bat +80 -0
  1376. package/core/dev/scripts/check-alaya-report-isolation.js +255 -0
  1377. package/core/dev/scripts/check-file-size.js +268 -0
  1378. package/core/dev/scripts/ci-feedback.js +251 -0
  1379. package/core/dev/scripts/clean-verify-targets.js +132 -0
  1380. package/core/dev/scripts/cleanup-queue.js +184 -0
  1381. package/core/dev/scripts/cleanup_queue.js +86 -0
  1382. package/core/dev/scripts/dev_agent_scheduler.ps1 +536 -0
  1383. package/core/dev/scripts/dispatch-stats.js +384 -0
  1384. package/core/dev/scripts/dispatch-stats.test.js +162 -0
  1385. package/core/dev/scripts/gc-agent-worktrees.js +461 -0
  1386. package/core/dev/scripts/gc-agent-worktrees.test.js +48 -0
  1387. package/core/dev/scripts/hooks/README.md +148 -0
  1388. package/core/dev/scripts/init_git.ps1 +396 -0
  1389. package/core/dev/scripts/init_git.sh +337 -0
  1390. package/core/dev/scripts/init_project.ps1 +851 -0
  1391. package/core/dev/scripts/init_project.sh +477 -0
  1392. package/core/dev/scripts/js-yaml-resolution.test.js +48 -0
  1393. package/core/dev/scripts/kenaz-session.js +354 -0
  1394. package/core/dev/scripts/kenaz-session.test.js +234 -0
  1395. package/core/dev/scripts/legacy/README.md +39 -0
  1396. package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +536 -0
  1397. package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +1978 -0
  1398. package/core/dev/scripts/matrix/CLI_README.md +214 -0
  1399. package/core/dev/scripts/matrix/README.md +310 -0
  1400. package/core/dev/scripts/matrix/package-lock.json +4266 -0
  1401. package/core/dev/scripts/matrix/package.json +55 -0
  1402. package/core/dev/scripts/matrix/src/abbreviations.ts +295 -0
  1403. package/core/dev/scripts/matrix/src/cli/commands/convert.ts +211 -0
  1404. package/core/dev/scripts/matrix/src/cli/commands/create.ts +95 -0
  1405. package/core/dev/scripts/matrix/src/cli/commands/delete.ts +102 -0
  1406. package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +140 -0
  1407. package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +173 -0
  1408. package/core/dev/scripts/matrix/src/cli/commands/query.ts +261 -0
  1409. package/core/dev/scripts/matrix/src/cli/commands/read.ts +77 -0
  1410. package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +168 -0
  1411. package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +126 -0
  1412. package/core/dev/scripts/matrix/src/cli/commands/update.ts +147 -0
  1413. package/core/dev/scripts/matrix/src/cli/commands/validate.ts +275 -0
  1414. package/core/dev/scripts/matrix/src/cli/index.ts +350 -0
  1415. package/core/dev/scripts/matrix/src/cli/utils/file-handler.ts +72 -0
  1416. package/core/dev/scripts/matrix/src/cli/utils/logger.ts +65 -0
  1417. package/core/dev/scripts/matrix/src/index.ts +62 -0
  1418. package/core/dev/scripts/matrix/src/indexer/tag-indexer.ts +165 -0
  1419. package/core/dev/scripts/matrix/src/parser.ts +281 -0
  1420. package/core/dev/scripts/matrix/src/serializer.ts +151 -0
  1421. package/core/dev/scripts/matrix/src/validator.ts +301 -0
  1422. package/core/dev/scripts/matrix/tests/abbreviations.test.ts +122 -0
  1423. package/core/dev/scripts/matrix/tests/cli.test.ts +177 -0
  1424. package/core/dev/scripts/matrix/tests/convert.test.ts +143 -0
  1425. package/core/dev/scripts/matrix/tests/parser.test.ts +203 -0
  1426. package/core/dev/scripts/matrix/tests/query.test.ts +85 -0
  1427. package/core/dev/scripts/matrix/tests/serializer.test.ts +197 -0
  1428. package/core/dev/scripts/matrix/tests/validate.test.ts +141 -0
  1429. package/core/dev/scripts/matrix/tests/validator.test.ts +167 -0
  1430. package/core/dev/scripts/matrix/tsconfig.json +20 -0
  1431. package/core/dev/scripts/matrix/types/index.d.ts +111 -0
  1432. package/core/dev/scripts/matrix/types/index.d.ts.map +1 -0
  1433. package/core/dev/scripts/matrix/types/index.js +8 -0
  1434. package/core/dev/scripts/matrix/types/index.js.map +1 -0
  1435. package/core/dev/scripts/matrix/types/index.ts +124 -0
  1436. package/core/dev/scripts/memory-guard-eval.js +330 -0
  1437. package/core/dev/scripts/memory-usage-report.js +152 -0
  1438. package/core/dev/scripts/migrate-task-dependencies.js +198 -0
  1439. package/core/dev/scripts/multi_agent_scheduler.ps1 +2021 -0
  1440. package/core/dev/scripts/multi_agent_scheduler.sh +1344 -0
  1441. package/core/dev/scripts/probe/ansuz-scaffold-ablation.js +579 -0
  1442. package/core/dev/scripts/probe/ansuz-scaffold-ablation.test.js +244 -0
  1443. package/core/dev/scripts/probe/hippocampus-concurrency.js +247 -0
  1444. package/core/dev/scripts/probe/hook-latency-probe.js +315 -0
  1445. package/core/dev/scripts/probe/hook-latency-probe.test.js +105 -0
  1446. package/core/dev/scripts/probe/prediction-signal-auc.js +483 -0
  1447. package/core/dev/scripts/probe/prediction-signal-auc.test.js +200 -0
  1448. package/core/dev/scripts/reset_tasks.js +99 -0
  1449. package/core/dev/scripts/run-rust-tests.js +207 -0
  1450. package/core/dev/scripts/run-rust-tests.test.js +154 -0
  1451. package/core/dev/scripts/run_once.sh +47 -0
  1452. package/core/dev/scripts/rust-verify-worktree.js +591 -0
  1453. package/core/dev/scripts/rust-verify-worktree.test.js +574 -0
  1454. package/core/dev/scripts/seh_probe.rs +26 -0
  1455. package/core/dev/scripts/setup_mcp.ps1 +192 -0
  1456. package/core/dev/scripts/setup_mcp.sh +159 -0
  1457. package/core/dev/scripts/setup_rag.ps1 +304 -0
  1458. package/core/dev/scripts/setup_rag.sh +230 -0
  1459. package/core/dev/scripts/start_dev_agent.sh +137 -0
  1460. package/core/dev/scripts/start_multi_agent.sh +41 -0
  1461. package/core/dev/scripts/sync_task_queue.ps1 +505 -0
  1462. package/core/dev/scripts/sync_task_queue.sh +392 -0
  1463. package/core/dev/scripts/task1961/RUNBOOK.md +300 -0
  1464. package/core/dev/scripts/task1961/fixtures/never-listens.server.js +54 -0
  1465. package/core/dev/scripts/task1961/fixtures/slow-serve.server.js +134 -0
  1466. package/core/dev/scripts/task1961/run-fixture.js +659 -0
  1467. package/core/dev/scripts/task1961/selftest.js +247 -0
  1468. package/core/dev/scripts/test-pty-ws-tunnel.js +229 -0
  1469. package/core/dev/scripts/validate_pipeline.js +197 -0
  1470. package/core/dev/scripts/verify-isbar-capture.js +100 -0
  1471. package/core/dev/scripts/verify-target-dir.js +69 -0
  1472. package/core/dev/scripts/verify-task-1839.js +141 -0
  1473. package/core/dev/specs/agent-connect/PROTOCOL.md +177 -0
  1474. package/core/dev/specs/agent-connect/SDK_GUIDE.md +915 -0
  1475. package/core/dev/specs/agent-connect/examples/minimal-site/README.md +137 -0
  1476. package/core/dev/specs/agent-connect/examples/minimal-site/package.json +12 -0
  1477. package/core/dev/specs/agent-connect/examples/minimal-site/public/index.html +116 -0
  1478. package/core/dev/specs/agent-connect/examples/minimal-site/public/install-redirect.js +73 -0
  1479. package/core/dev/specs/agent-connect/examples/minimal-site/server.js +516 -0
  1480. package/core/dev/specs/agent-connect/examples/minimal-site/test/smoke.test.mjs +263 -0
  1481. package/core/dev/specs/agent-connect/history/DEFECT_REPORT_kenaz-agent-hub_2026-09-09_v0.4-empty-prompt-no-first-turn.md +77 -0
  1482. package/core/dev/specs/agent-connect/history/DEFECT_REPORT_kenaz-agent-hub_2026-09-09_v0.4-prompt-mojibake.md +90 -0
  1483. package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-07.md +61 -0
  1484. package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-08_relay-v1-conformance.md +76 -0
  1485. package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-09_v0.4-session-channel.md +87 -0
  1486. package/core/dev/specs/agent-connect/history/FLOWPIX_REPLY_agent-hub_2026-09-08_relay-v1-answers.md +68 -0
  1487. package/core/dev/specs/agent-connect/history/FLOWPIX_bridge_CONTRACT.md +642 -0
  1488. package/core/dev/specs/agent-connect/history/FLOWPIX_spikes_relay_spike_relay.mjs +244 -0
  1489. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-07.md +77 -0
  1490. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_direction-change-v0.3.md +44 -0
  1491. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_relay-v1-answers-ack.md +37 -0
  1492. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_relay-v1-conformance.md +56 -0
  1493. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_annotations-install-coldstart.md +44 -0
  1494. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_empty-prompt-first-turn.md +56 -0
  1495. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_prompt-mojibake-fixed.md +48 -0
  1496. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_session-channel.md +57 -0
  1497. package/core/dev/specs/agent-connect/history/PROTOCOL_v0.3_snapshot.md +379 -0
  1498. package/core/dev/specs/agent-connect/history/README.md +47 -0
  1499. package/core/dev/specs/peer/CODEX_INTERACTIVE_PUSH.md +65 -0
  1500. package/core/dev/specs/peer/CODEX_PEER_PULL_SPIKE.md +54 -0
  1501. package/core/dev/specs/peer/MODS_SPIKE.md +133 -0
  1502. package/core/dev/specs/peer/PER_PROJECT_ADDRESSING.md +143 -0
  1503. package/core/dev/specs/peer/SWARM_PROTOCOLS.md +256 -0
  1504. package/core/dev/specs/peer/codex-hook-shim-peer.test.js +101 -0
  1505. package/core/dev/specs/peer/codex-push-launcher.test.js +142 -0
  1506. package/core/dev/specs/peer/setup-codex-hooks.test.js +22 -0
  1507. package/core/dev/specs/peer-ansuz/DELIVERY_SPIKE.md +397 -0
  1508. package/core/dev/specs/peer-ansuz/DESIGN.md +109 -0
  1509. package/core/dev/specs/peer-ansuz/spike/claude_poke.js +129 -0
  1510. package/core/dev/specs/peer-ansuz/spike/claude_session_start_hook.js +37 -0
  1511. package/core/dev/specs/peer-ansuz/spike/claude_settings_hook.json +14 -0
  1512. package/core/dev/specs/peer-ansuz/spike/codex_appserver_client.js +105 -0
  1513. package/core/dev/specs/peer-ansuz/spike/codex_appserver_query.js +29 -0
  1514. package/core/dev/specs/peer-ansuz/spike/extract_timeline.js +26 -0
  1515. package/core/dev/specs/synapse/SYMBOL_IDENTITY.md +305 -0
  1516. package/core/dev/spikes/A4-cypher-varlen.md +176 -0
  1517. package/core/dev/spikes/bloat-rounds.sh +25 -0
  1518. package/core/dev/spikes/mods/clean-claude.js +9 -0
  1519. package/core/dev/spikes/mods/drive-probe.js +29 -0
  1520. package/core/dev/spikes/mods/e2e-peer.js +71 -0
  1521. package/core/dev/spikes/mods/evidence/e2e-peer-control.json +17 -0
  1522. package/core/dev/spikes/mods/evidence/e2e-peer-mod.json +17 -0
  1523. package/core/dev/spikes/mods/evidence/probe-006a6e65-d807-4bc1-b648-fd7d1edfe0b4.jsonl +4 -0
  1524. package/core/dev/spikes/mods/evidence/probe-cebdf1f7-f9c4-47a8-83cd-7c0786177404.jsonl +12 -0
  1525. package/core/dev/spikes/mods/evidence/probe-eb21147d-10ce-4c32-93ed-37ca37d88d5a.jsonl +11 -0
  1526. package/core/dev/spikes/mods/evidence/stream-cebdf1f7.jsonl +18 -0
  1527. package/core/dev/spikes/mods/kenaz-mod-probe/.claude-plugin/plugin.json +1 -0
  1528. package/core/dev/spikes/mods/kenaz-mod-probe/hooks/hooks.json +1 -0
  1529. package/core/dev/spikes/mods/kenaz-mod-probe/hooks/register.ts +65 -0
  1530. package/core/dev/spikes/mods/kenaz-mod-probe/tsconfig.json +3 -0
  1531. package/core/k-cli/README.md +423 -0
  1532. package/core/k-cli/package.json +21 -0
  1533. package/core/k-cli/templates/k-cli.md +91 -0
  1534. package/core/k-cli/test/TEST_SPEC.md +134 -0
  1535. package/core/k-cli/test/run.sh +469 -0
  1536. package/core/plugins/kenaz/.claude-plugin/plugin.json +1 -0
  1537. package/core/plugins/kenaz/.mcp.json +5 -0
  1538. package/core/plugins/kenaz/INVENTORY.md +48 -0
  1539. package/core/plugins/kenaz/README.md +55 -0
  1540. package/core/plugins/kenaz/commands/Amelia.md +5 -0
  1541. package/core/plugins/kenaz/commands/Ansuz.md +38 -0
  1542. package/core/plugins/kenaz/commands/architect.md +24 -0
  1543. package/core/plugins/kenaz/commands/incident.md +15 -0
  1544. package/core/plugins/kenaz/commands/kenaz.md +12 -0
  1545. package/core/plugins/kenaz/commands/review.md +14 -0
  1546. package/core/plugins/kenaz/commands/security.md +15 -0
  1547. package/core/plugins/kenaz/commands/spec.md +22 -0
  1548. package/core/plugins/kenaz/commands/strategy.md +141 -0
  1549. package/core/plugins/kenaz/commands//347/224/242/345/223/201.md +15 -0
  1550. package/core/plugins/kenaz/commands//350/250/255/350/250/210.md +14 -0
  1551. package/core/plugins/kenaz/commands//350/251/225/344/274/260.md +16 -0
  1552. package/core/plugins/kenaz/guidance.md +5 -0
  1553. package/core/plugins/kenaz/hooks/core-resolve.js +230 -0
  1554. package/core/plugins/kenaz/hooks/hooks.json +31 -0
  1555. package/core/plugins/kenaz/hooks/kenaz-hook.js +112 -0
  1556. package/core/plugins/kenaz/hooks/mode.js +39 -0
  1557. package/core/plugins/kenaz/scripts/kenaz-mode.js +46 -0
  1558. package/core/plugins/kenaz/scripts/kenaz.test.js +123 -0
  1559. package/core/plugins/kenaz/scripts/sync.js +45 -0
  1560. package/core/plugins/kenaz/scripts/ygg.js +157 -0
  1561. package/core/plugins/kenaz/skills/adapt/SKILL.md +199 -0
  1562. package/core/plugins/kenaz/skills/animate/SKILL.md +190 -0
  1563. package/core/plugins/kenaz/skills/architect_agent/SKILL.md +408 -0
  1564. package/core/plugins/kenaz/skills/assessment_agent/SKILL.md +289 -0
  1565. package/core/plugins/kenaz/skills/audit/SKILL.md +129 -0
  1566. package/core/plugins/kenaz/skills/backend_agent/SKILL.md +407 -0
  1567. package/core/plugins/kenaz/skills/backend_engineer/SKILL.md +788 -0
  1568. package/core/plugins/kenaz/skills/bolder/SKILL.md +132 -0
  1569. package/core/plugins/kenaz/skills/clarify/SKILL.md +180 -0
  1570. package/core/plugins/kenaz/skills/code_reviewer/SKILL.md +305 -0
  1571. package/core/plugins/kenaz/skills/code_reviewer/patterns.yaml +85 -0
  1572. package/core/plugins/kenaz/skills/colorize/SKILL.md +158 -0
  1573. package/core/plugins/kenaz/skills/critique/SKILL.md +118 -0
  1574. package/core/plugins/kenaz/skills/delight/SKILL.md +317 -0
  1575. package/core/plugins/kenaz/skills/designer/SKILL.md +845 -0
  1576. package/core/plugins/kenaz/skills/dev_agent/SKILL.md +503 -0
  1577. package/core/plugins/kenaz/skills/developer/SKILL.md +792 -0
  1578. package/core/plugins/kenaz/skills/distill/SKILL.md +137 -0
  1579. package/core/plugins/kenaz/skills/extract/SKILL.md +95 -0
  1580. package/core/plugins/kenaz/skills/feature_agent/SKILL.md +303 -0
  1581. package/core/plugins/kenaz/skills/frontend-design/SKILL.md +127 -0
  1582. package/core/plugins/kenaz/skills/frontend-design/reference/color-and-contrast.md +132 -0
  1583. package/core/plugins/kenaz/skills/frontend-design/reference/interaction-design.md +123 -0
  1584. package/core/plugins/kenaz/skills/frontend-design/reference/motion-design.md +99 -0
  1585. package/core/plugins/kenaz/skills/frontend-design/reference/responsive-design.md +114 -0
  1586. package/core/plugins/kenaz/skills/frontend-design/reference/spatial-design.md +100 -0
  1587. package/core/plugins/kenaz/skills/frontend-design/reference/typography.md +131 -0
  1588. package/core/plugins/kenaz/skills/frontend-design/reference/ux-writing.md +107 -0
  1589. package/core/plugins/kenaz/skills/frontend_agent/SKILL.md +327 -0
  1590. package/core/plugins/kenaz/skills/harden/SKILL.md +358 -0
  1591. package/core/plugins/kenaz/skills/incident_response/SKILL.md +315 -0
  1592. package/core/plugins/kenaz/skills/normalize/SKILL.md +67 -0
  1593. package/core/plugins/kenaz/skills/onboard/SKILL.md +243 -0
  1594. package/core/plugins/kenaz/skills/optimize/SKILL.md +269 -0
  1595. package/core/plugins/kenaz/skills/polish/SKILL.md +202 -0
  1596. package/core/plugins/kenaz/skills/product_manager/SKILL.md +1091 -0
  1597. package/core/plugins/kenaz/skills/qa_engineer/SKILL.md +1269 -0
  1598. package/core/plugins/kenaz/skills/quieter/SKILL.md +118 -0
  1599. package/core/plugins/kenaz/skills/security_agent/SKILL.md +312 -0
  1600. package/core/plugins/kenaz/skills/spec_optimizer/SKILL.md +299 -0
  1601. package/core/plugins/kenaz/skills/sre_agent/SKILL.md +1347 -0
  1602. package/core/plugins/kenaz/skills/ui-ux-pro-max/SKILL.md +377 -0
  1603. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/charts.csv +26 -0
  1604. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/colors.csv +97 -0
  1605. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/icons.csv +101 -0
  1606. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/landing.csv +31 -0
  1607. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/products.csv +97 -0
  1608. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  1609. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  1610. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  1611. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  1612. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  1613. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  1614. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  1615. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  1616. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  1617. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  1618. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  1619. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  1620. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  1621. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  1622. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/styles.csv +68 -0
  1623. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/typography.csv +58 -0
  1624. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  1625. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  1626. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  1627. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/core.py +253 -0
  1628. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
  1629. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/search.py +106 -0
  1630. package/core/plugins/kenaz-peer/.claude-plugin/plugin.json +1 -0
  1631. package/core/plugins/kenaz-peer/hooks/hooks.json +1 -0
  1632. package/core/plugins/kenaz-peer/hooks/register.test.ts +62 -0
  1633. package/core/plugins/kenaz-peer/hooks/register.ts +146 -0
  1634. package/core/plugins/kenaz-peer/tsconfig.json +3 -0
  1635. package/lib/cli.js +251 -0
  1636. package/lib/cli.test.js +59 -0
  1637. package/lib/dashboard.js +80 -0
  1638. package/lib/dashboard.test.js +59 -0
  1639. package/package.json +28 -4
  1640. package/vendor/install-kenaz-cli.js +268 -0
  1641. package/README.md +0 -3
@@ -0,0 +1,1232 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * worktree-create.js — Claude Code `WorktreeCreate` hook.
6
+ *
7
+ * PROBLEM (TASK_1586): The Agent/Task tool's `isolation: "worktree"` creates the
8
+ * isolated worktree from the SESSION cwd's git repo. In production the Kenaz
9
+ * dashboard launches the interactive session with cwd = kenaz-core (a bundled
10
+ * file COPY — NOT a git checkout), while the user's actual project is a separate
11
+ * git repo. The harness then fails: "not in a git repository".
12
+ *
13
+ * FIX: when configured as a WorktreeCreate hook, the harness DELEGATES worktree
14
+ * creation entirely to this script (it no longer runs `git worktree add` itself).
15
+ * This script:
16
+ * - Branch 1 (dev / same-repo): session cwd IS a git repo → create the worktree
17
+ * in that repo at the harness-proposed path (faithful passthrough).
18
+ * - Branch 2 (production): session cwd is NOT a git repo → resolve the active
19
+ * project from ~/.kenaz/projects.json (same source as Rust get_current_project)
20
+ * and create the worktree inside THAT git repo.
21
+ * - No git target resolvable → exit non-zero with a readable message so the
22
+ * dispatch degrades cleanly instead of surfacing a raw harness error.
23
+ *
24
+ * Contract (code.claude.com/docs hooks.md):
25
+ * stdin JSON: { session_id, transcript_path, cwd, hook_event_name,
26
+ * worktree_path (proposed, ignorable), isolation_reason }
27
+ * env: CLAUDE_PROJECT_DIR, CLAUDE_SESSION_ID
28
+ * stdout: the chosen worktree path (exit 0). Path is fully hook-controlled
29
+ * and MAY live in a different git repo than cwd.
30
+ * non-zero: blocks worktree creation.
31
+ *
32
+ * Cross-platform (GEN-009): pure node + git CLI, path.join, no shell.
33
+ *
34
+ * Hardening history:
35
+ * TASK_1586 -- Branch 2 production redirect (non-git cwd -> projects.json target)
36
+ * TASK_1639 -- remove --force idempotency removed; uniquify loop added
37
+ * TASK_1647 -- longpaths flag; failed-add rollback; lock-resilient GC; shorter paths
38
+ * TASK_1777 -- sibling placement OUTSIDE the repo tree: the harness worktree-
39
+ * isolation guard denies Edit/Write on any path under the shared
40
+ * checkout; a worktree nested at <repo>/.formation/worktrees/wt-*
41
+ * is entirely inside the shared checkout, so isolated agents could
42
+ * not use Edit/Write at all (absolute fwd/back-slash AND relative
43
+ * path forms all denied — verified empirically in TASK_1777).
44
+ * TASK_1827 -- landed-marker GC: ancestry / patch-equivalence inference is
45
+ * PROVEN WRONG on a known-answer control (ansuz-wt-68ed9c57-12936
46
+ * was file-scoped-checkout merged and fully verified, yet both
47
+ * `git cherry` and `merge-base --is-ancestor` still reported it
48
+ * unmerged — file-scoped checkout + fresh commit changes the
49
+ * patch-id parent context, and ancestry never held to begin
50
+ * with). The merger is the only party that KNOWS the work landed,
51
+ * so the merger records it: post-complete writes a landed marker
52
+ * on verified merge success, and the main thread's manual
53
+ * file-scoped merges use `mark-landed` (CLI below). GC reclaims
54
+ * ONLY worktrees with a landed marker — no inference, no bypass.
55
+ *
56
+ * CLI subcommands (TASK_1827/TASK_1876; no args = normal WorktreeCreate hook mode):
57
+ * node .claude/hooks/worktree-create.js mark-landed <wt-name|path|branch> [--task TASK_X] [--repo <path>] [--by <who>]
58
+ * node .claude/hooks/worktree-create.js gc [--dry-run] [--repo <path>]
59
+ * node .claude/hooks/worktree-create.js gc --review [--repo <path>]
60
+ * node .claude/hooks/worktree-create.js gc --approve <wt-name...> | --approve --all [--repo <path>]
61
+ *
62
+ * TASK_1876 — the automatic half of the contract above now actually runs:
63
+ * post-complete's direct-commit fast-path (the dominant merge-confirmation
64
+ * point under subagent-default dispatch) calls appendLandedMarker with
65
+ * via=post-complete-direct-commit; gc reports a `marker-starved: N` stderr
66
+ * count on every run; gc --review/--approve give the backlog an
67
+ * evidence-based batch path that reclaims through this same GC (never a
68
+ * second deletion implementation).
69
+ */
70
+
71
+ const fs = require('fs');
72
+ const path = require('path');
73
+ const os = require('os');
74
+ const { execFileSync } = require('child_process');
75
+ // TASK_2057: shared __kenaz_core__ token resolver (same file, no cross-dir
76
+ // require needed here -- ansuz-boot-fast.js reaches this same module from
77
+ // .specialist/tools/).
78
+ const { resolveVirtualPath } = require('./core-resolve.js');
79
+ // TASK_2163: chart files are keyed by project identity + task id. Loaded
80
+ // lazily and guarded (Ansuz review): this hook also runs from the installed
81
+ // kenaz-core copy, and a load failure at module scope would break EVERY
82
+ // worktree creation over a cleanup heuristic.
83
+ function chartReadPath(repo, id) {
84
+ try {
85
+ return require('../../.specialist/tools/lib/chart-path.js').getChartReadPath(id, { projectPath: repo });
86
+ } catch {
87
+ return path.join(repo, '.specialist', 'sessions', 'chart_' + id + '.json');
88
+ }
89
+ }
90
+
91
+ function readStdin() {
92
+ try { return fs.readFileSync(0, 'utf8'); } catch { return ''; }
93
+ }
94
+
95
+ /**
96
+ * Run a git command in `repo`.
97
+ * Always passes `-c core.longpaths=true` so Windows long-path checkouts work
98
+ * on repos that have not set core.longpaths globally. On macOS/Linux the flag is
99
+ * a no-op (GEN-009). We do NOT write to any git config file here.
100
+ */
101
+ function git(repo, args) {
102
+ return execFileSync('git', ['-C', repo, '-c', 'core.longpaths=true', ...args], {
103
+ stdio: ['ignore', 'pipe', 'pipe'],
104
+ }).toString().trim();
105
+ }
106
+
107
+ function isGitRepo(dir) {
108
+ if (!dir) return false;
109
+ try {
110
+ return execFileSync('git', ['-C', dir, 'rev-parse', '--is-inside-work-tree'], {
111
+ stdio: ['ignore', 'pipe', 'ignore'],
112
+ }).toString().trim() === 'true';
113
+ } catch { return false; }
114
+ }
115
+
116
+ function gitTopLevel(dir) {
117
+ try { return git(dir, ['rev-parse', '--show-toplevel']); } catch { return null; }
118
+ }
119
+
120
+ /** Resolve the active project's git repo from ~/.kenaz/projects.json (mirrors Rust get_current_project). */
121
+ function resolveTargetRepo() {
122
+ try {
123
+ const home = process.env.HOME || os.homedir();
124
+ const raw = fs.readFileSync(path.join(home, '.kenaz', 'projects.json'), 'utf8');
125
+ const pj = JSON.parse(raw);
126
+ const proj = (pj.projects || []).find((p) => p.id === pj.currentProjectId);
127
+ // TASK_2057: the core entry's path is the literal token "__kenaz_core__",
128
+ // not a real path (dev/PROJECT_REGISTRY_DUPLICATE_ASSESSMENT.md) --
129
+ // resolve it before probing isGitRepo, or this always failed for core.
130
+ const resolvedPath = proj && proj.path ? resolveVirtualPath(proj.path) : null;
131
+ if (resolvedPath && isGitRepo(resolvedPath)) return gitTopLevel(resolvedPath);
132
+ } catch { /* fall through */ }
133
+ return null;
134
+ }
135
+
136
+ /**
137
+ * Garbage-collect stale sibling agent worktrees in BOTH base dirs:
138
+ * - sibling (current, TASK_1777): <repoParent>/.kenaz-worktrees/<repoName>
139
+ * - legacy in-repo (pre-TASK_1777 husks): <repo>/.formation/worktrees
140
+ *
141
+ * The harness does NOT reliably fire WorktreeRemove on subagent completion when a
142
+ * WorktreeCreate hook is configured (observed: worktree persists post-completion),
143
+ * so worktrees would otherwise accumulate across sessions. This sweep bounds that.
144
+ *
145
+ * TASK_1826: two GC-eligible naming families (anything else — e.g. squad
146
+ * `<sessionId>-<memberId>` detached worktrees — is never touched):
147
+ * wt-<sid8>-<pid> → branch ansuz-wt-<sid8>-<pid> (Agent tool, this hook)
148
+ * task_<taskid> → branch task/<taskid> (Formation setupUnitWorktree)
149
+ * Branch derivation differs per family; never apply one family's string
150
+ * surgery to the other.
151
+ *
152
+ * SAFETY (TASK_1827 — reclaim is a strict CONJUNCTION, no bypass):
153
+ * A sibling is removed ONLY when ALL hold:
154
+ * - it is not the worktree we are about to (re)create (keepPath),
155
+ * - its directory mtime is older than GC_MIN_AGE_MS (won't touch a concurrently
156
+ * live session's fresh worktree). NEVER shorten this — it is the only guard
157
+ * against deleting a live concurrent session's worktree,
158
+ * - it has a LANDED MARKER in the ledger (written by post-complete on verified
159
+ * merge success, or by the `mark-landed` CLI after a manual file-scoped
160
+ * merge). Missing marker → ALWAYS kept, with a diagnostic. Ancestry /
161
+ * patch-equivalence inference is NOT used: both were disproven on a
162
+ * known-answer control (see file header),
163
+ * - if the branch still exists, its tip matches the tip recorded in the
164
+ * marker (commits made AFTER the landing were never verified → keep),
165
+ * - it has no uncommitted change outside the daemon-noise allowlist —
166
+ * evaluated ONLY when the directory is a FUNCTIONING standalone worktree
167
+ * (its `rev-parse --show-toplevel` resolves to itself). A husk whose .git
168
+ * link is already gone resolves to the PARENT repo (or errors on a pruned
169
+ * gitdir), so its porcelain would describe the wrong tree entirely
170
+ * (TASK_1826); a husk cannot host a live agent, so with a landed marker it
171
+ * is reclaimable as-is.
172
+ * Every keep decision emits a stderr diagnostic naming the condition and the
173
+ * file(s) responsible — silent retention left users unable to see why 19 of
174
+ * 21 worktrees never collected.
175
+ */
176
+ const GC_MIN_AGE_MS = 2 * 60 * 60 * 1000; // 2h
177
+
178
+ // ── TASK_1827: landed-marker ledger ─────────────────────────────────────────
179
+ // Format: append-only JSONL, one entry per landing event:
180
+ // { v:1, branch, worktree, task, tip, via, by, at }
181
+ // WHY THIS FORM (over the alternatives):
182
+ // - vs in-worktree marker file: dies with the worktree (no audit trail),
183
+ // dirties the worktree's porcelain, and is unreachable on husks / the
184
+ // worktree_missing post-complete path.
185
+ // - vs git refs (refs/kenaz-landed/*): not hand-editable, needs git plumbing
186
+ // to inspect/revoke, and cannot carry who/why/when metadata legibly.
187
+ // - JSONL in-repo: human-readable, greppable, revocable by deleting a line,
188
+ // survives worktree deletion, readable with zero infrastructure (no
189
+ // dashboard). Located under .formation/worktrees/ which is wholesale
190
+ // gitignored (line ".formation/worktrees/"), so the ledger itself never
191
+ // shows up as git-status noise — the exact failure mode this card fights.
192
+ function landedLedgerPath(repo) {
193
+ return path.join(repo, '.formation', 'worktrees', 'landed-ledger.jsonl');
194
+ }
195
+
196
+ function appendLandedMarker(repo, { branch, worktree, task, tip, via, by }) {
197
+ const entry = {
198
+ v: 1,
199
+ branch: branch || null,
200
+ worktree: worktree || null,
201
+ task: task || null,
202
+ tip: tip || null,
203
+ via: via || 'unknown',
204
+ by: by || null,
205
+ at: new Date().toISOString(),
206
+ };
207
+ const ledger = landedLedgerPath(repo);
208
+ fs.mkdirSync(path.dirname(ledger), { recursive: true });
209
+ fs.appendFileSync(ledger, JSON.stringify(entry) + '\n');
210
+ return entry;
211
+ }
212
+
213
+ /** Read the ledger into lookup maps. Later entries win. Bad lines are skipped. */
214
+ function readLandedIndex(repo) {
215
+ const byBranch = new Map();
216
+ const byName = new Map();
217
+ try {
218
+ const raw = fs.readFileSync(landedLedgerPath(repo), 'utf8');
219
+ for (const line of raw.split('\n')) {
220
+ const t = line.trim();
221
+ if (!t) continue;
222
+ try {
223
+ const e = JSON.parse(t);
224
+ if (e && e.branch) byBranch.set(e.branch, e);
225
+ if (e && e.worktree) byName.set(e.worktree, e);
226
+ } catch { /* skip malformed line — revocation by hand-editing is allowed */ }
227
+ }
228
+ } catch { /* no ledger yet */ }
229
+ return { byBranch, byName };
230
+ }
231
+
232
+ /** Branch derivation per naming family (TASK_1826). Unknown families → null. */
233
+ function deriveBranchForName(name) {
234
+ if (name.startsWith('wt-')) return 'ansuz-wt-' + name.slice(3);
235
+ if (name.startsWith('task_')) return 'task/' + name.slice(5);
236
+ return null;
237
+ }
238
+
239
+ // ── TASK_1827: daemon-noise classification for dirty paths ──────────────────
240
+ // The tracked/untracked dichotomy CANNOT separate the two observed specimens
241
+ // (ansuz_project_pins.json = daemon state, TASK_1739_HANDOFF.md = agent
242
+ // deliverable — BOTH untracked). Discrimination is therefore an explicit
243
+ // path allowlist of known daemon/harness writers, read from
244
+ // .kenaz/specialist/daemon-manifest.yaml: state_files + static_paths +
245
+ // gc_disposable_paths (new GC-only section). Everything NOT on the list —
246
+ // tracked source, untracked deliverables like HANDOFF docs — is real work and
247
+ // blocks reclaim. Rejected alternatives: glob heuristics ("*.jsonl is noise")
248
+ // would eat real agent logs; age-based rules say nothing about a file's
249
+ // nature; tracked/untracked fails both specimens above. commit_exclude_files
250
+ // (user configs, TASK_1818) are deliberately NOT noise: user-authored bytes
251
+ // are never discardable.
252
+ // thrift: flat-list YAML subset parser (the manifest is flat lists only);
253
+ // switch to .vendor/js-yaml.cjs if the manifest ever gains nesting.
254
+ const GC_NOISE_MANIFEST_SECTIONS = ['state_files', 'static_paths', 'gc_disposable_paths'];
255
+
256
+ function loadGcNoisePaths(repo) {
257
+ const out = [];
258
+ try {
259
+ const raw = fs.readFileSync(path.join(repo, '.kenaz', 'specialist', 'daemon-manifest.yaml'), 'utf8');
260
+ let section = null;
261
+ for (const line of raw.split('\n')) {
262
+ const key = line.match(/^([A-Za-z0-9_]+):\s*(#.*)?$/);
263
+ if (key) { section = key[1]; continue; }
264
+ if (!GC_NOISE_MANIFEST_SECTIONS.includes(section)) continue;
265
+ const item = line.match(/^\s*-\s*(.+?)\s*$/);
266
+ if (!item) continue;
267
+ let v = item[1];
268
+ if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) {
269
+ v = v.slice(1, -1);
270
+ }
271
+ if (v && !v.startsWith('#')) out.push(v.replace(/\\/g, '/'));
272
+ }
273
+ } catch { /* manifest unreadable → empty noise set → ALL dirt kept (safe direction) */ }
274
+ return out;
275
+ }
276
+
277
+ function isNoisePath(relPath, noisePaths) {
278
+ const p = relPath.replace(/\\/g, '/');
279
+ for (const n of noisePaths) {
280
+ if (n.endsWith('/')) { if (p.startsWith(n)) return true; }
281
+ else if (n.endsWith('*')) {
282
+ // TASK_1840: trailing-* prefix match for filenames with a variable part
283
+ // (e.g. .kenaz/specialist/progress_note_* matches
284
+ // progress_note_TASK_1793.json). Same-directory ONLY: the remainder must
285
+ // not contain '/', so a wildcard entry can never silently cover a whole
286
+ // subtree the way a '/'-suffixed directory entry does.
287
+ const rest = p.slice(n.length - 1);
288
+ if (p.startsWith(n.slice(0, -1)) && !rest.includes('/')) return true;
289
+ }
290
+ else if (p === n) return true;
291
+ }
292
+ return false;
293
+ }
294
+
295
+ // ── TASK_1840: progress-note landed gate ────────────────────────────────────
296
+ // Agents write .kenaz/specialist/progress_note_<TASK_ID>.json in their worktree
297
+ // AFTER the final commit (per the dispatch prompt), leaving permanent dirt that
298
+ // made the worktree unreclaimable forever. The manifest wildcard entry makes
299
+ // the path expressible, but the LOCAL copy is only disposable when the note is
300
+ // CONFIRMED merged into the core chart (phase-gate.js `note` appends it to
301
+ // <repo>/.specialist/sessions/chart_<TASK_ID>.json -> progress_notes[]).
302
+ // Returns: null = not a progress-note path (no gating applies),
303
+ // true = note landed in the core chart (disposable),
304
+ // false = not confirmed landed -> treated as REAL work (keep).
305
+ // Unknown/unreadable chart -> false (safe direction: keep).
306
+ // TASK_2163: chart-path.js resolves the REAL core sessions dir regardless of
307
+ // what `repo` is (it walks up from its own file location, not from `repo`),
308
+ // and keys the chart by `repo` as project identity -- core repo -> flat
309
+ // legacy filename (unchanged), sub-project repo -> the keyed subdirectory
310
+ // that sub-project's phase-gate/etc. runs actually wrote to (getChartReadPath
311
+ // also falls back to the pre-fix flat path, so charts written before this
312
+ // fix still resolve). Previously this hand-built path.join(repo,
313
+ // '.specialist', 'sessions', ...) directly, which could only ever succeed
314
+ // for the core repo (sub-projects have no .specialist/ of their own).
315
+ const PROGRESS_NOTE_RE = /^\.kenaz\/specialist\/progress_note_(.+?)(?:\.json)?$/;
316
+
317
+ function isLandedProgressNote(repo, relPath) {
318
+ const m = relPath.replace(/\\/g, '/').match(PROGRESS_NOTE_RE);
319
+ if (!m) return null;
320
+ if (!repo) return false;
321
+ try {
322
+ const chart = JSON.parse(fs.readFileSync(
323
+ chartReadPath(repo, m[1]), 'utf8'));
324
+ return Array.isArray(chart.progress_notes) && chart.progress_notes.length > 0;
325
+ } catch { return false; }
326
+ }
327
+
328
+ /**
329
+ * Classify a worktree's `status --porcelain` output into daemon noise vs real
330
+ * work. Returns { real: string[], noise: string[] }. Uses its own raw git call
331
+ * (NOT the trimming git() helper — trimming eats the leading space of the
332
+ * first " M path" line) with core.quotePath=false so CJK paths stay literal.
333
+ */
334
+ function classifyWorktreeDirt(worktreeDir, noisePaths, repo) {
335
+ const raw = execFileSync('git', ['-C', worktreeDir, '-c', 'core.longpaths=true',
336
+ '-c', 'core.quotePath=false', 'status', '--porcelain'],
337
+ { stdio: ['ignore', 'pipe', 'pipe'] }).toString();
338
+ const real = [];
339
+ const noise = [];
340
+ for (const line of raw.split('\n')) {
341
+ if (!line.trim()) continue;
342
+ let rel = line.slice(3);
343
+ const arrow = rel.indexOf(' -> '); // rename: judge the destination path
344
+ if (arrow >= 0) rel = rel.slice(arrow + 4);
345
+ rel = rel.replace(/\\/g, '/');
346
+ // TASK_1840: a noise-matched progress note is disposable ONLY when its
347
+ // content is confirmed merged into the core chart. false = keep as real
348
+ // work; null = not a progress note, the plain noise-list verdict stands.
349
+ const noisy = isNoisePath(rel, noisePaths)
350
+ && isLandedProgressNote(repo, rel) !== false;
351
+ (noisy ? noise : real).push(rel);
352
+ }
353
+ return { real, noise };
354
+ }
355
+
356
+ function gcStaleWorktrees(repo, keepPath, opts) {
357
+ const dryRun = !!(opts && opts.dryRun);
358
+ // TASK_1827 follow-up: KEEP diagnostics are opt-in (verbose), because this GC
359
+ // also runs inline in WorktreeCreate hook mode, whose ONLY contract is "write
360
+ // the worktree path to stdout". Emitting one line per kept worktree there made
361
+ // the harness fail every dispatch with "hook succeeded but returned no worktree
362
+ // path" — 21 kept worktrees produced 21 lines around the single line that
363
+ // matters. Reclaim/failure notices below stay unconditional: they report an
364
+ // action actually taken, and there is at most a handful per run.
365
+ // Run `node .claude/hooks/worktree-create.js gc --dry-run` for the full report.
366
+ const verbose = !!(opts && opts.verbose);
367
+ const notice = (msg) => process.stderr.write('[worktree-create] gc: ' + msg + '\n');
368
+ const diag = (msg) => { if (verbose) notice(msg); };
369
+ // TASK_1876: count (and optionally collect) worktrees kept at the
370
+ // missing-marker conjunct. Before this, the structural gap "the merger never
371
+ // records landings" was invisible unless someone ran --dry-run AND read 30
372
+ // per-tree diag lines; measured result: 30/31 worktrees accumulated silently.
373
+ // The count is emitted UNCONDITIONALLY as ONE stderr line (see below) so the
374
+ // gap reads 0 when healthy and non-zero the moment the auto path degrades.
375
+ let markerStarved = 0;
376
+ let reclaimedCount = 0;
377
+ const starvedOut = (opts && opts.collectStarved) || null;
378
+ try {
379
+ const wtDirs = [
380
+ siblingWorktreeBase(repo), // sibling layout (TASK_1777)
381
+ path.join(repo, '.formation', 'worktrees'), // legacy in-repo layout (old husks)
382
+ ];
383
+ const landed = readLandedIndex(repo);
384
+ const noisePaths = loadGcNoisePaths(repo);
385
+ const keep = path.resolve(keepPath).replace(/\\/g, '/').toLowerCase();
386
+ const now = Date.now();
387
+ for (const wtDir of wtDirs) {
388
+ if (!fs.existsSync(wtDir)) continue;
389
+ for (const name of fs.readdirSync(wtDir)) {
390
+ // Two GC-eligible naming families (TASK_1826). Unknown names (e.g. squad
391
+ // `<sessionId>-<memberId>` detached worktrees) are never touched.
392
+ // NOTE: .claude/worktrees/agent-* (harness-owned) is deliberately OUTSIDE
393
+ // both base dirs and must never be added here — deleting a live one kills
394
+ // a running agent (TASK_1827 exclusion).
395
+ const branch = deriveBranchForName(name);
396
+ if (!branch) continue;
397
+ const p = path.join(wtDir, name);
398
+ const rp = path.resolve(p).replace(/\\/g, '/').toLowerCase();
399
+ if (rp === keep) continue;
400
+ let st;
401
+ try { st = fs.statSync(p); } catch { continue; }
402
+ if (!st.isDirectory()) continue;
403
+ if (now - st.mtimeMs < GC_MIN_AGE_MS) {
404
+ // Too fresh — maybe a live concurrent session. Not inspected further
405
+ // (no git command is run against it).
406
+ const ageMin = Math.round((now - st.mtimeMs) / 60000);
407
+ diag(name + ' kept — too fresh (mtime ' + ageMin + 'm < 2h), not inspected');
408
+ continue;
409
+ }
410
+ // CONJUNCT (TASK_1827): landed marker. The merger records the landing;
411
+ // GC never infers it. Missing marker → keep, no bypass.
412
+ const marker = landed.byBranch.get(branch) || landed.byName.get(name);
413
+ if (!marker) {
414
+ markerStarved += 1;
415
+ if (starvedOut) starvedOut.push({ name, branch, dir: p, baseDir: wtDir });
416
+ diag(name + ' kept — no landed marker for branch ' + branch
417
+ + ' (merge not recorded; after verifying the work landed, run:'
418
+ + ' node .claude/hooks/worktree-create.js mark-landed ' + name + ')');
419
+ continue;
420
+ }
421
+ // Marker staleness: if the branch still exists and its tip moved past
422
+ // what was recorded at landing time, the newer commits were never
423
+ // verified as landed — keep. (Not inference: just checking the recorded
424
+ // fact still describes the current branch state.)
425
+ let tip = null;
426
+ try {
427
+ tip = git(repo, ['rev-parse', '--verify', '--quiet', 'refs/heads/' + branch]);
428
+ } catch { tip = null; } // branch already deleted — normal post-merge state
429
+ // TASK_2253: a null-tip marker (written after the branch was already
430
+ // deleted) cannot vouch for a branch that exists NOW — a re-dispatch may
431
+ // have reused the name with unverified commits. Staleness unverifiable →
432
+ // keep (safe direction); `git branch -D` below never runs on this path.
433
+ if (tip && !marker.tip) {
434
+ diag(name + ' kept — branch ' + branch + ' exists (tip ' + tip.slice(0, 8)
435
+ + ') but landed marker has no tip, so staleness cannot be verified'
436
+ + ' (branch name may have been reused). After verifying the work landed, re-run:'
437
+ + ' node .claude/hooks/worktree-create.js mark-landed ' + name);
438
+ continue;
439
+ }
440
+ if (tip && marker.tip && tip !== marker.tip) {
441
+ diag(name + ' kept — branch ' + branch + ' tip ' + tip.slice(0, 8)
442
+ + ' differs from landed-marker tip ' + String(marker.tip).slice(0, 8)
443
+ + ' (commits after landing were never verified)');
444
+ continue;
445
+ }
446
+ // Is this directory a FUNCTIONING standalone worktree? A husk whose .git
447
+ // link is gone resolves `--show-toplevel` upward to the PARENT repo (or
448
+ // errors on a pruned gitdir), so running `status --porcelain` there would
449
+ // report the parent repo's dirt — the wrong tree entirely (observed on 4
450
+ // real husks in KenazAI core, TASK_1826).
451
+ let topLevel = null;
452
+ try { topLevel = git(p, ['rev-parse', '--show-toplevel']); } catch { topLevel = null; }
453
+ const isOwnWorktree = topLevel !== null
454
+ && path.resolve(topLevel).replace(/\\/g, '/').toLowerCase() === rp;
455
+ let huskNote = '';
456
+ if (isOwnWorktree) {
457
+ // CONJUNCT: no uncommitted change outside the daemon-noise allowlist.
458
+ // Tracked source modifications and untracked deliverables (e.g.
459
+ // TASK_XXXX_HANDOFF.md) are real work → keep, naming the files.
460
+ let dirt = null;
461
+ try { dirt = classifyWorktreeDirt(p, noisePaths, repo); } catch { dirt = null; }
462
+ if (dirt === null) {
463
+ diag(name + ' kept — cannot read git status (unable to judge dirtiness)');
464
+ continue;
465
+ }
466
+ if (dirt.real.length > 0) {
467
+ const shown = dirt.real.slice(0, 5).join(', ')
468
+ + (dirt.real.length > 5 ? ' (+' + (dirt.real.length - 5) + ' more)' : '');
469
+ diag(name + ' kept — uncommitted non-daemon change(s): ' + shown);
470
+ continue;
471
+ }
472
+ if (dirt.noise.length > 0) {
473
+ diag(name + ' dirty only with daemon noise (' + dirt.noise.slice(0, 5).join(', ')
474
+ + (dirt.noise.length > 5 ? ', …' : '') + ') — noise does not block reclaim');
475
+ }
476
+ } else {
477
+ // Unlinked husk: no functioning .git link → a live agent cannot be
478
+ // using it (no git op works there). Dirtiness is unknowable, but the
479
+ // landed marker (checked above) asserts the work landed — reclaimable.
480
+ huskNote = ' [unlinked husk: '
481
+ + (topLevel === null ? 'broken .git link' : 'no own .git — resolves to parent repo') + ']';
482
+ }
483
+ // All conjuncts hold: landed marker present (tip unchanged), old enough,
484
+ // not keepPath, no real uncommitted work.
485
+ if (dryRun) {
486
+ diag(name + ' RECLAIMABLE (dry-run — not removed) — landed ' + marker.at
487
+ + ' via ' + (marker.via || 'unknown') + huskNote);
488
+ continue;
489
+ }
490
+ // TASK_1844: drop node_modules junctions/symlinks FIRST — Git for
491
+ // Windows recurses through junctions on delete and would empty the MAIN
492
+ // checkout's node_modules (measured; see unlinkNodeModulesLinks). This
493
+ // also covers pre-TASK_1844 worktrees where agents hand-built junctions.
494
+ unlinkNodeModulesLinks(p);
495
+ // Lock-resilient removal: try git remove --force, fall back to fs.rmSync
496
+ // with retries, then prune. If still locked -> log to stderr (observable)
497
+ // but never throw (GC must remain non-blocking).
498
+ let removed = false;
499
+ try {
500
+ git(repo, ['worktree', 'remove', '--force', p]);
501
+ removed = true;
502
+ } catch { /* git locked -- fall through to fs fallback */ }
503
+ if (!removed) {
504
+ try {
505
+ fs.rmSync(p, { recursive: true, force: true, maxRetries: 3, retryDelay: 200 });
506
+ try { git(repo, ['worktree', 'prune']); } catch { /* best-effort */ }
507
+ removed = true;
508
+ } catch {
509
+ // Still locked -- emit a single observable diagnostic line and skip.
510
+ notice(name + ' locked, skipped');
511
+ }
512
+ }
513
+ if (removed) {
514
+ try { git(repo, ['branch', '-D', branch]); } catch { /* already gone or unregistered */ }
515
+ reclaimedCount += 1;
516
+ notice(name + ' reclaimed — landed ' + marker.at + ' via ' + (marker.via || 'unknown') + huskNote);
517
+ }
518
+ }
519
+ }
520
+ // TASK_1876 (R4): ALWAYS report the marker-starved count — one line, stderr
521
+ // only (C1: hook-mode stdout carries exactly the worktree path, nothing
522
+ // else; that contract broke every dispatch once before, see the verbose
523
+ // comment above). Both values are reachable: 0 when every eligible tree
524
+ // has a marker, N when the recording duty is being missed — a signal
525
+ // pinned at one value would be no signal.
526
+ notice('marker-starved: ' + markerStarved
527
+ + ' worktree(s) kept only because no landed marker was recorded'
528
+ + (markerStarved > 0
529
+ ? ' — run: node .claude/hooks/worktree-create.js gc --review'
530
+ : ''));
531
+ if (!dryRun) {
532
+ try { git(repo, ['worktree', 'prune']); } catch { /* skip */ }
533
+ }
534
+ return { markerStarved, reclaimed: reclaimedCount };
535
+ } catch { /* GC is best-effort — never block creation */ }
536
+ // Unknown outcome (mid-sweep failure) is null, NOT a healthy-looking zero.
537
+ return null;
538
+ }
539
+
540
+ function emit(p) { process.stdout.write(String(p).replace(/\\/g, '/') + '\n'); process.exit(0); }
541
+ function fail(msg) { process.stderr.write('[worktree-create] ' + msg + '\n'); process.exit(1); }
542
+
543
+ /**
544
+ * Build a short worktree directory name using only the first 8 chars of the
545
+ * session UUID. Format: wt-<sid8>-<pid> (e.g. wt-b19fbb34-23468).
546
+ * The pid suffix keeps concurrent subagents that share a session_id unique.
547
+ * Collision recovery is handled by the uniquify loop below.
548
+ */
549
+ function makeWtName(sessionId, pid) {
550
+ const sid8 = sessionId.slice(0, 8);
551
+ return 'wt-' + sid8 + '-' + pid;
552
+ }
553
+
554
+ /**
555
+ * Sibling worktree base dir: <repoParent>/.kenaz-worktrees/<repoName>.
556
+ *
557
+ * TASK_1777: worktrees MUST live OUTSIDE the repo tree. The harness
558
+ * worktree-isolation guard denies Edit/Write on any path under the shared
559
+ * checkout; a worktree nested inside the repo has every one of its paths also
560
+ * under the shared checkout, so the guard denied ALL agent Edit/Write calls
561
+ * (agents were forced to fall back to Bash patch scripts). Sibling placement
562
+ * is the only layout the guard accepts. Bonus: shorter paths (MAX_PATH).
563
+ */
564
+ function siblingWorktreeBase(repo) {
565
+ return path.join(path.dirname(repo), '.kenaz-worktrees', path.basename(repo));
566
+ }
567
+
568
+ // ── TASK_1844: node_modules provisioning ────────────────────────────────────
569
+ // A fresh worktree is a bare checkout: zero node_modules. Every frontend-ish
570
+ // dispatch then re-invented dependency access ad hoc (measured: 5-7 wasted tool
571
+ // calls per task — locate main-repo tsc → link node_modules → verify junction →
572
+ // retry). Fix: at creation time, link each of the main checkout's node_modules
573
+ // dirs into the worktree so `npx tsc --noEmit` etc. work immediately.
574
+ //
575
+ // Mechanism: fs.symlinkSync with type 'junction' on Windows (junctions need NO
576
+ // admin privilege, unlike real directory symlinks which EPERM for non-elevated
577
+ // users), plain directory symlink on macOS/Linux (type arg is ignored there).
578
+ // GEN-008/GEN-009: locations are discovered by scanning the repo (no hardcoded
579
+ // package dirs), pure node + git CLI, no shell.
580
+ //
581
+ // Trade-off (accepted): all worktrees SHARE the main checkout's node_modules.
582
+ // Read-only consumers (tsc, eslint, next lint) are safe under parallel
583
+ // dispatch; an agent running `npm install` inside a worktree would mutate the
584
+ // shared store — same exposure the previous ad-hoc junction workaround had,
585
+ // and dispatch prompts forbid minute-scale installs anyway.
586
+ //
587
+ // Failure policy (requirement 5): a bare worktree beats a failed dispatch —
588
+ // every error here is a stderr warning, never a hook failure, and NEVER
589
+ // touches stdout (see emit() contract).
590
+
591
+ // Descend at most this many directory levels below the repo root when looking
592
+ // for node_modules (deepest real specimen: .specialist/Ansuz/tools/node_modules
593
+ // at depth 3). Dot-dirs ARE descended (that specimen lives in one).
594
+ const NODE_MODULES_SCAN_DEPTH = 3;
595
+ // Never descend into these: VCS internals, dependency stores themselves, and
596
+ // build outputs whose node_modules are artifacts (dashboard/.next/standalone,
597
+ // target/debug/nextjs-server) that no in-worktree tool resolves against.
598
+ const NODE_MODULES_SCAN_PRUNE = new Set([
599
+ '.git', 'node_modules', '.next', 'target', 'dist', 'build', 'out',
600
+ 'vendor', 'worktrees', '.kenaz-worktrees',
601
+ ]);
602
+
603
+ /**
604
+ * Return repo-relative paths ('' = root) of every directory that directly
605
+ * contains a node_modules dir, up to NODE_MODULES_SCAN_DEPTH levels deep.
606
+ */
607
+ function findNodeModulesParents(repo) {
608
+ const found = [];
609
+ const walk = (dir, rel, depth) => {
610
+ let entries;
611
+ try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }
612
+ for (const ent of entries) {
613
+ if (!ent.isDirectory()) continue;
614
+ if (ent.name === 'node_modules') { found.push(rel); continue; }
615
+ if (NODE_MODULES_SCAN_PRUNE.has(ent.name)) continue;
616
+ if (depth + 1 <= NODE_MODULES_SCAN_DEPTH) {
617
+ walk(path.join(dir, ent.name), rel ? rel + '/' + ent.name : ent.name, depth + 1);
618
+ }
619
+ }
620
+ };
621
+ walk(repo, '', 0);
622
+ return found;
623
+ }
624
+
625
+ /**
626
+ * Ensure `relPath` (posix-style, relative to the worktree root) is git-ignored
627
+ * INSIDE the worktree — otherwise `git status` drowns in dependency files and
628
+ * `git add -A` sweeps the whole store into a commit (TASK_1819: 392-file
629
+ * incident). Repos that already ignore node_modules pass the check-ignore fast
630
+ * path; otherwise the pattern is appended to the worktree's PRIVATE exclude
631
+ * file (rev-parse --git-path info/exclude → .git/worktrees/<name>/info/exclude),
632
+ * which is per-worktree state and never touches tracked files or the shared
633
+ * .git/info/exclude. Throws on failure — caller skips creating that link.
634
+ */
635
+ function ensureWorktreeIgnores(worktreePath, relPath) {
636
+ try {
637
+ execFileSync('git', ['-C', worktreePath, 'check-ignore', '-q', '--', relPath],
638
+ { stdio: ['ignore', 'ignore', 'ignore'] });
639
+ return; // exit 0 → already ignored (repo .gitignore covers it)
640
+ } catch { /* not ignored → add per-worktree exclude */ }
641
+ const gp = execFileSync('git', ['-C', worktreePath, 'rev-parse', '--git-path', 'info/exclude'],
642
+ { stdio: ['ignore', 'pipe', 'pipe'] }).toString().trim();
643
+ const excludeFile = path.isAbsolute(gp) ? gp : path.resolve(worktreePath, gp);
644
+ fs.mkdirSync(path.dirname(excludeFile), { recursive: true });
645
+ fs.appendFileSync(excludeFile, '/' + relPath + '/\n');
646
+ }
647
+
648
+ /**
649
+ * Unlink node_modules junctions/symlinks inside `root` (a worktree about to be
650
+ * removed). MUST run before any `git worktree remove`: Git for Windows RECURSES
651
+ * THROUGH junctions when deleting and EMPTIES THE LINK TARGET — measured
652
+ * 2026-08-13 (TASK_1844 control test): a junction into the source repo's
653
+ * node_modules + `git worktree remove --force` → source node_modules wiped.
654
+ * Node's fs.rmSync({recursive}) in contrast unlinks the reparse point without
655
+ * traversal (also measured, populated-target control). Only the link itself is
656
+ * removed here; a REAL node_modules directory (agent ran a package manager) is
657
+ * left for the normal removal path. Best-effort: never throws.
658
+ */
659
+ function unlinkNodeModulesLinks(root) {
660
+ const walk = (dir, depth) => {
661
+ let entries;
662
+ try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }
663
+ for (const ent of entries) {
664
+ const p = path.join(dir, ent.name);
665
+ if (ent.name === 'node_modules') {
666
+ try {
667
+ if (fs.lstatSync(p).isSymbolicLink()) {
668
+ try { fs.unlinkSync(p); } catch { fs.rmdirSync(p); }
669
+ }
670
+ } catch { /* best-effort */ }
671
+ continue;
672
+ }
673
+ let isDir = false;
674
+ try { const st = fs.lstatSync(p); isDir = st.isDirectory() && !st.isSymbolicLink(); }
675
+ catch { continue; }
676
+ if (!isDir || NODE_MODULES_SCAN_PRUNE.has(ent.name)) continue;
677
+ if (depth + 1 <= NODE_MODULES_SCAN_DEPTH) walk(p, depth + 1);
678
+ }
679
+ };
680
+ walk(root, 0);
681
+ }
682
+
683
+ /**
684
+ * Link every discovered <repo>/<rel>/node_modules into the worktree at
685
+ * <worktree>/<rel>/node_modules. Per-entry and overall failures degrade to
686
+ * stderr warnings (requirement 5). A repo with no node_modules (requirement 4:
687
+ * non-frontend projects) yields an empty list and this is a no-op.
688
+ */
689
+ function linkNodeModules(repo, worktreePath) {
690
+ const warn = (msg) => process.stderr.write('[worktree-create] node_modules: ' + msg + '\n');
691
+ let parents;
692
+ try { parents = findNodeModulesParents(repo); } catch (e) {
693
+ warn('scan failed (' + ((e && e.message) || 'unknown') + ') — worktree stays bare');
694
+ return;
695
+ }
696
+ for (const rel of parents) {
697
+ const target = path.join(repo, rel, 'node_modules');
698
+ const linkParent = rel ? path.join(worktreePath, rel) : worktreePath;
699
+ const linkPath = path.join(linkParent, 'node_modules');
700
+ try {
701
+ // Parent dir absent from the checkout = the package dir holds no tracked
702
+ // files (pure build artifact in the main repo) → nothing there needs deps.
703
+ if (!fs.existsSync(linkParent)) continue;
704
+ // Already present (including a broken pre-existing link) → leave it alone.
705
+ let exists = false;
706
+ try { fs.lstatSync(linkPath); exists = true; } catch { exists = false; }
707
+ if (exists) continue;
708
+ // Ignore-cover BEFORE linking: if we cannot guarantee git ignores the
709
+ // link, not linking is the safer state (see ensureWorktreeIgnores).
710
+ ensureWorktreeIgnores(worktreePath, rel ? rel + '/node_modules' : 'node_modules');
711
+ // Windows: 'junction' works without elevation (real dir symlinks EPERM
712
+ // for non-admin users). POSIX: the type argument is ignored by node and a
713
+ // normal directory symlink is created.
714
+ fs.symlinkSync(target, linkPath, process.platform === 'win32' ? 'junction' : 'dir');
715
+ } catch (e) {
716
+ warn('link skipped for "' + (rel || '.') + '": ' + ((e && e.message) || 'unknown'));
717
+ }
718
+ }
719
+ }
720
+
721
+ function main() {
722
+ // TASK_1866: hook mode MUST receive the harness's WorktreeCreate JSON object
723
+ // on stdin. Without this gate, main() fabricated a session id ('session'
724
+ // fallback) and silently built a wt-session-<pid> worktree whenever someone
725
+ // merely inspected the module via `node -e "require(...)"` — which IS the
726
+ // settings.json hook wiring, so require.main === undefined lands here.
727
+ // Observed three times on 2026-08-13 (TASK_1840 agent wt-session-7028, main
728
+ // thread ansuz-wt-session-11624, main thread --help wt-session-17644).
729
+ // The criterion is deliberately "stdin parses to a JSON object", NOT a TTY
730
+ // heuristic: the real harness always pipes the hook JSON, while under a test
731
+ // harness stdin may be neither a TTY nor carry data. The stdin JSON contract
732
+ // itself (file header) is unchanged.
733
+ let input = null;
734
+ try { input = JSON.parse(readStdin()); } catch { input = null; }
735
+ if (input === null || typeof input !== 'object' || Array.isArray(input)) {
736
+ fail('hook mode requires the WorktreeCreate JSON object on stdin '
737
+ + '({ session_id, cwd, ... }) — refusing to fabricate a session id and '
738
+ + 'create a worktree without one. If you only meant to inspect this '
739
+ + 'module, require() it from a script file: `node -e "require(...)"` '
740
+ + 'runs the REAL hook flow.');
741
+ }
742
+
743
+ const rawId = input.session_id || process.env.CLAUDE_SESSION_ID || 'session';
744
+ const sessionId = String(rawId).replace(/[^A-Za-z0-9_-]/g, '_').slice(0, 64);
745
+ const cwd = input.cwd || process.env.CLAUDE_PROJECT_DIR || process.cwd();
746
+
747
+ // Branch 1: session cwd is a git repo (dev / same-repo) → faithful passthrough.
748
+ // Branch 2: cwd not git (production) → redirect into the active project's repo.
749
+ let repo = isGitRepo(cwd) ? gitTopLevel(cwd) : null;
750
+ let worktreePath;
751
+
752
+ if (repo) {
753
+ // TASK_1777: ALWAYS place the worktree in the sibling base dir OUTSIDE the
754
+ // repo tree — never at the harness-proposed in-repo path (which would make
755
+ // the isolation guard deny every Edit/Write the agent attempts). The
756
+ // proposed basename is discarded too: the short synthesized name enforces
757
+ // the wt-<sid8>-<pid> naming contract that GC and branch naming rely on.
758
+ worktreePath = path.join(siblingWorktreeBase(repo), makeWtName(sessionId, process.pid));
759
+ } else {
760
+ repo = resolveTargetRepo();
761
+ if (!repo) {
762
+ fail('session cwd is not a git repo and no git target project is resolvable from '
763
+ + '~/.kenaz/projects.json (currentProjectId) — cannot create an isolated worktree');
764
+ }
765
+ // Ignore the proposed path (it points under the non-git cwd); place in the
766
+ // target repo's sibling worktree base (TASK_1777 — see siblingWorktreeBase).
767
+ // pid suffix: concurrent subagents in one session share session_id; the pid
768
+ // makes each hook invocation's synthesized path unique without a TOCTOU race.
769
+ worktreePath = path.join(siblingWorktreeBase(repo), makeWtName(sessionId, process.pid));
770
+ }
771
+
772
+ // Uniquify the path: concurrent subagents in one session share session_id,
773
+ // so the synthesized path (and sometimes the proposed one) collides. NEVER
774
+ // claim an existing path — the old `worktree remove --force` "idempotency"
775
+ // here destroyed live sibling agents' worktrees mid-task (TASK_1639). Suffix
776
+ // until free instead.
777
+ {
778
+ const base = worktreePath;
779
+ let n = 1;
780
+ while (fs.existsSync(worktreePath)) {
781
+ n += 1;
782
+ worktreePath = `${base}-${n}`;
783
+ if (n > 50) { worktreePath = `${base}-${Date.now().toString(36)}`; break; }
784
+ }
785
+ }
786
+
787
+ // Branch derives from the (unique) worktree dir name — NOT the bare session
788
+ // id — keeping gcStaleWorktrees' dirname-based derivation aligned with what
789
+ // we create. If a husk from a destroyed worktree left the branch behind,
790
+ // suffix rather than delete: never touch refs a live sibling might own.
791
+ const wtName = path.basename(worktreePath)
792
+ .replace(/^wt-/, '')
793
+ .replace(/[^A-Za-z0-9_-]/g, '_')
794
+ .slice(0, 64);
795
+ let branch = `ansuz-wt-${wtName}`;
796
+ {
797
+ const taken = (b) => {
798
+ try {
799
+ execFileSync('git', ['-C', repo, 'rev-parse', '--verify', '--quiet', 'refs/heads/' + b],
800
+ { stdio: ['ignore', 'pipe', 'ignore'] });
801
+ return true;
802
+ } catch { return false; }
803
+ };
804
+ const base = branch;
805
+ let n = 1;
806
+ while (taken(branch)) {
807
+ n += 1;
808
+ branch = `${base}-${n}`;
809
+ if (n > 50) { branch = `${base}-${Date.now().toString(36)}`; break; }
810
+ }
811
+ }
812
+
813
+ // Best-effort GC of stale, clean, merged sibling worktrees (compensates for the
814
+ // harness not reliably firing WorktreeRemove on subagent completion).
815
+ gcStaleWorktrees(repo, worktreePath);
816
+
817
+ try {
818
+ fs.mkdirSync(path.dirname(worktreePath), { recursive: true });
819
+ // Path and branch are guaranteed fresh above — no destructive cleanup here.
820
+ // (The old remove --force/branch -D "idempotency" at this spot destroyed
821
+ // concurrent siblings' live worktrees.) Prune only drops registrations
822
+ // whose directories are already gone.
823
+ try { git(repo, ['worktree', 'prune']); } catch { /* none */ }
824
+ git(repo, ['worktree', 'add', '-b', branch, worktreePath, 'HEAD']);
825
+ } catch (e) {
826
+ const detail = e && e.stderr ? e.stderr.toString().trim() : (e && e.message) || 'unknown error';
827
+
828
+ // Rollback (a): remove via git
829
+ try { git(repo, ['worktree', 'remove', '--force', worktreePath]); } catch { /* best-effort */ }
830
+ // Rollback (b): filesystem rm with retries
831
+ try {
832
+ fs.rmSync(worktreePath, { recursive: true, force: true, maxRetries: 3 });
833
+ } catch { /* best-effort */ }
834
+ // Rollback (c): prune stale registrations
835
+ try { git(repo, ['worktree', 'prune']); } catch { /* best-effort */ }
836
+ // Rollback (d): delete only the branch we created this invocation
837
+ try { git(repo, ['branch', '-D', branch]); } catch { /* may not exist if add never started */ }
838
+
839
+ fail('git worktree add failed in ' + repo + ': ' + detail);
840
+ }
841
+
842
+ // TASK_1844: make the main checkout's node_modules available inside the
843
+ // worktree (junction on Windows / symlink on POSIX). Strictly best-effort:
844
+ // any failure is a stderr warning and the hook still emits the path — a bare
845
+ // worktree beats a failed dispatch. Millisecond-scale (links only, never any
846
+ // package-manager install on this critical path).
847
+ try { linkNodeModules(repo, worktreePath); } catch (e) {
848
+ process.stderr.write('[worktree-create] node_modules provisioning failed: '
849
+ + ((e && e.message) || 'unknown') + '\n');
850
+ }
851
+
852
+ emit(worktreePath);
853
+ }
854
+
855
+ // ── TASK_1827: CLI subcommands ──────────────────────────────────────────────
856
+
857
+ function _cliParseFlags(args) {
858
+ const flags = {};
859
+ const positional = [];
860
+ for (let i = 0; i < args.length; i++) {
861
+ const a = args[i];
862
+ if (a === '--dry-run') flags.dryRun = true;
863
+ else if (a === '--repo') flags.repo = args[++i];
864
+ else if (a === '--task') flags.task = args[++i];
865
+ else if (a === '--by') flags.by = args[++i];
866
+ else if (a === '--tip') flags.tip = args[++i];
867
+ else if (a === '--review') flags.review = true; // TASK_1876
868
+ else if (a === '--approve') flags.approve = true; // TASK_1876
869
+ else if (a === '--all') flags.all = true; // TASK_1876
870
+ else positional.push(a);
871
+ }
872
+ return { flags, positional };
873
+ }
874
+
875
+ function _cliResolveRepo(flags) {
876
+ const start = flags.repo || process.cwd();
877
+ if (!isGitRepo(start)) fail('not a git repo: ' + start + ' (use --repo <path>)');
878
+ return gitTopLevel(start);
879
+ }
880
+
881
+ /**
882
+ * mark-landed <worktree-name|worktree-path|branch> [--task TASK_X] [--repo <path>] [--by <who>] [--tip <sha>]
883
+ *
884
+ * The MANUAL merge path (TASK_1827): after the main thread lands a worktree's
885
+ * work via file-scoped checkout (where ancestry and patch-id both lie — see
886
+ * file header), it records the fact here. GC then treats the worktree as
887
+ * reclaimable once the remaining safety conjuncts hold.
888
+ */
889
+ function cliMarkLanded(args) {
890
+ const { flags, positional } = _cliParseFlags(args);
891
+ const target = positional[0];
892
+ if (!target) {
893
+ fail('usage: mark-landed <wt-name|wt-path|branch> [--task TASK_X] [--repo <path>] [--by <who>] [--tip <sha>]');
894
+ }
895
+ const repo = _cliResolveRepo(flags);
896
+ // Resolve target → { worktree name, branch }. Accepts a worktree directory
897
+ // path, a worktree dir name (wt-* / task_*), or a branch (ansuz-wt-* / task/*).
898
+ let name = target;
899
+ try {
900
+ if (fs.existsSync(target) && fs.statSync(target).isDirectory()) name = path.basename(target);
901
+ } catch { /* treat as name/branch */ }
902
+ let branch = null;
903
+ let worktree = null;
904
+ if (name.startsWith('ansuz-wt-')) { branch = name; worktree = 'wt-' + name.slice('ansuz-wt-'.length); }
905
+ else if (name.startsWith('task/')) { branch = name; worktree = 'task_' + name.slice('task/'.length); }
906
+ else {
907
+ branch = deriveBranchForName(name);
908
+ worktree = branch ? name : null;
909
+ }
910
+ if (!branch) {
911
+ fail('cannot derive a branch from "' + target + '" — expected wt-*/task_* worktree name, '
912
+ + 'ansuz-wt-*/task/* branch, or a worktree directory path');
913
+ }
914
+ let tip = flags.tip || null;
915
+ if (!tip) {
916
+ try { tip = git(repo, ['rev-parse', '--verify', '--quiet', 'refs/heads/' + branch]); }
917
+ catch { tip = null; } // branch already deleted — marker still valid
918
+ }
919
+ // TASK_2087: idempotent like post-complete's recordLanding (git-merge.js) —
920
+ // if the ledger already has this branch at the same tip (both non-null),
921
+ // every unconditional verify-and-land re-run of this CLI would otherwise
922
+ // append a redundant duplicate line for the same landing event.
923
+ const existing = readLandedIndex(repo).byBranch.get(branch);
924
+ if (existing && existing.tip && tip && existing.tip === tip) {
925
+ process.stdout.write('[worktree-create] mark-landed: already recorded (via '
926
+ + existing.via + ', by ' + existing.by + ') — skipped\n');
927
+ process.exit(0);
928
+ }
929
+ const entry = appendLandedMarker(repo, {
930
+ branch,
931
+ worktree,
932
+ task: flags.task || null,
933
+ tip,
934
+ via: 'manual-cli',
935
+ by: flags.by || (function () { try { return os.userInfo().username; } catch { return null; } })(),
936
+ });
937
+ process.stdout.write('[worktree-create] mark-landed: recorded ' + JSON.stringify(entry) + '\n');
938
+ process.stdout.write('[worktree-create] ledger: ' + landedLedgerPath(repo).replace(/\\/g, '/') + '\n');
939
+ process.exit(0);
940
+ }
941
+
942
+ // ── TASK_1876: gc --review / --approve — the marker-starved backlog path ────
943
+ // Measured 2026-08-21: 30 of 31 accumulated worktrees had no landed marker, so
944
+ // the safe path (gc) could reclaim nothing, and the only path that COULD
945
+ // reclaim them (manual deletion) bypasses unlinkNodeModulesLinks and empties
946
+ // the main checkout's node_modules (happened that same day: 189 .bin shims
947
+ // wiped, npm rebuild required). This flow gives humans an evidence-based batch
948
+ // decision, then reclaims through the ONE existing GC path.
949
+ //
950
+ // Design boundary (TASK_1827, respected): none of the evidence below feeds the
951
+ // GC's reclaim conjunction — the HUMAN's approval writes the marker (exactly
952
+ // like mark-landed), and evidence can only make batch approval MORE
953
+ // conservative (unique content ⇒ refuse), never reclaim without a marker.
954
+
955
+ /** Marker-starved candidates exactly as the GC sees them (single source). */
956
+ function _collectStarvedCandidates(repo) {
957
+ const starved = [];
958
+ // dryRun guarantees read-only enumeration; collectStarved receives every
959
+ // worktree kept at the missing-marker conjunct.
960
+ gcStaleWorktrees(repo, path.join(repo, '.__gc_cli_no_keep__'), { dryRun: true, collectStarved: starved });
961
+ return starved;
962
+ }
963
+
964
+ /** Look up a task's status directory across both task-system layouts. */
965
+ function _findTaskStatus(repo, taskId) {
966
+ for (const base of ['.kenaz/tasks', '.collaboration/tasks']) {
967
+ const baseDir = path.join(repo, base);
968
+ let dirs;
969
+ try { dirs = fs.readdirSync(baseDir, { withFileTypes: true }); } catch { continue; }
970
+ for (const d of dirs) {
971
+ if (!d.isDirectory()) continue;
972
+ for (const variant of [taskId + '.yaml', taskId.toLowerCase() + '.yaml']) {
973
+ if (fs.existsSync(path.join(baseDir, d.name, variant))) return d.name;
974
+ }
975
+ }
976
+ }
977
+ return null;
978
+ }
979
+
980
+ /**
981
+ * Evidence for one marker-starved candidate. All git access is read-only.
982
+ * `unique` states:
983
+ * 'none' — tip fully reachable from the user branch (trivially landed)
984
+ * 'landed' — branch-unique commits exist, but every file they touched is
985
+ * byte-identical between the two tips (the file-scoped-merge
986
+ * signature: patch-id/ancestry lie, content already on main)
987
+ * 'unique' — branch-touched file(s) whose content the user branch does NOT
988
+ * have (uniqueFiles names them)
989
+ * 'unknown' — no resolvable tip (branch deleted + husk) or git failure
990
+ */
991
+ function _gatherStarvedEvidence(repo, cand, noisePaths, userBranch) {
992
+ const ev = {
993
+ name: cand.name, branch: cand.branch, dir: cand.dir,
994
+ tip: null, tipSource: null, tasks: [], taskStatuses: {},
995
+ unique: 'unknown', uniqueFiles: [], uniqueCommits: 0,
996
+ dirt: 'unknown', dirtReal: null, approvable: false, reason: '',
997
+ };
998
+ // task_<id> family: the task id is in the name itself.
999
+ if (cand.name.startsWith('task_')) ev.tasks.push(cand.name.slice(5).toUpperCase());
1000
+ try { ev.tip = git(repo, ['rev-parse', '--verify', '--quiet', 'refs/heads/' + cand.branch]); ev.tipSource = 'branch'; }
1001
+ catch { ev.tip = null; }
1002
+ // Functioning standalone worktree? (same discrimination the GC uses)
1003
+ let topLevel = null;
1004
+ try { topLevel = git(cand.dir, ['rev-parse', '--show-toplevel']); } catch { topLevel = null; }
1005
+ const isOwn = topLevel !== null
1006
+ && path.resolve(topLevel).replace(/\\/g, '/').toLowerCase()
1007
+ === path.resolve(cand.dir).replace(/\\/g, '/').toLowerCase();
1008
+ if (!ev.tip && isOwn) {
1009
+ // Branch already deleted but the worktree still functions: its own HEAD is
1010
+ // the recorded state of the work.
1011
+ try { ev.tip = git(cand.dir, ['rev-parse', 'HEAD']); ev.tipSource = 'worktree-HEAD'; } catch { ev.tip = null; }
1012
+ }
1013
+ if (isOwn) {
1014
+ try {
1015
+ const dirt = classifyWorktreeDirt(cand.dir, noisePaths, repo);
1016
+ ev.dirtReal = dirt.real.length > 0;
1017
+ ev.dirt = dirt.real.length > 0
1018
+ ? 'REAL uncommitted: ' + dirt.real.slice(0, 5).join(', ') + (dirt.real.length > 5 ? ' …' : '')
1019
+ : (dirt.noise.length > 0 ? 'daemon-noise only' : 'clean');
1020
+ } catch { ev.dirt = 'unreadable'; ev.dirtReal = null; }
1021
+ } else {
1022
+ ev.dirt = 'husk (no functioning .git link — cannot host live work)';
1023
+ ev.dirtReal = false;
1024
+ }
1025
+ if (ev.tip && userBranch) {
1026
+ try {
1027
+ const logRaw = git(repo, ['log', '--pretty=format:%H%x09%s', userBranch + '..' + ev.tip, '--']);
1028
+ const lines = logRaw ? logRaw.split('\n').filter((l) => l.trim()) : [];
1029
+ ev.uniqueCommits = lines.length;
1030
+ for (const l of lines) {
1031
+ const m = l.match(/TASK_\d+/i);
1032
+ if (m && !ev.tasks.includes(m[0].toUpperCase())) ev.tasks.push(m[0].toUpperCase());
1033
+ }
1034
+ if (lines.length === 0) {
1035
+ ev.unique = 'none';
1036
+ } else {
1037
+ // Files touched by branch-unique commits ∩ files whose content differs
1038
+ // between the two TIPS (two-dot diff — deliberately NOT patch-id or
1039
+ // ancestry, which both lie under file-scoped merges). Intersection in
1040
+ // JS avoids command-line length limits on large branches.
1041
+ const touchedRaw = git(repo, ['log', '--name-only', '--pretty=format:', userBranch + '..' + ev.tip, '--']);
1042
+ const touched = new Set((touchedRaw || '').split('\n').map((s) => s.trim()).filter(Boolean));
1043
+ const diffRaw = git(repo, ['diff', '--name-only', userBranch, ev.tip]);
1044
+ const differing = (diffRaw || '').split('\n').map((s) => s.trim()).filter(Boolean);
1045
+ ev.uniqueFiles = differing.filter((f) => touched.has(f));
1046
+ ev.unique = ev.uniqueFiles.length === 0 ? 'landed' : 'unique';
1047
+ }
1048
+ } catch { ev.unique = 'unknown'; }
1049
+ }
1050
+ for (const t of ev.tasks) ev.taskStatuses[t] = _findTaskStatus(repo, t);
1051
+ // Verdict — evidence can only REFUSE, never auto-reclaim (see block comment).
1052
+ if ((ev.unique === 'landed' || ev.unique === 'none') && ev.dirtReal === false) {
1053
+ ev.approvable = true;
1054
+ ev.reason = ev.unique === 'landed'
1055
+ ? 'branch-touched files byte-identical to ' + userBranch
1056
+ : 'all commits reachable from ' + userBranch;
1057
+ } else if (ev.unique === 'unique') {
1058
+ ev.reason = 'UNIQUE content ' + userBranch + ' does not have: '
1059
+ + ev.uniqueFiles.slice(0, 5).join(', ') + (ev.uniqueFiles.length > 5 ? ' …' : '');
1060
+ } else if (ev.dirtReal) {
1061
+ ev.reason = 'uncommitted non-daemon changes (' + ev.dirt + ')';
1062
+ } else {
1063
+ ev.reason = 'content unverifiable (no resolvable tip) — after manual verification use: '
1064
+ + 'node .claude/hooks/worktree-create.js mark-landed ' + cand.name;
1065
+ }
1066
+ return ev;
1067
+ }
1068
+
1069
+ function _cliGcReviewOrApprove(repo, flags, positional) {
1070
+ const out = (m) => process.stdout.write(m + '\n');
1071
+ let userBranch = null;
1072
+ try { userBranch = git(repo, ['rev-parse', '--abbrev-ref', 'HEAD']); } catch { userBranch = null; }
1073
+ const noisePaths = loadGcNoisePaths(repo);
1074
+ const candidates = _collectStarvedCandidates(repo);
1075
+ if (candidates.length === 0) {
1076
+ out('[worktree-create] gc review: no marker-starved worktrees — nothing to review.');
1077
+ process.exit(0);
1078
+ }
1079
+ const evidence = candidates.map((c) => _gatherStarvedEvidence(repo, c, noisePaths, userBranch));
1080
+ if (flags.review) {
1081
+ out('[worktree-create] gc review: ' + evidence.length
1082
+ + ' worktree(s) kept ONLY because no landed marker was recorded (vs ' + (userBranch || '?') + '):');
1083
+ for (const ev of evidence) {
1084
+ out('');
1085
+ out(' ' + ev.name + ' branch=' + ev.branch
1086
+ + (ev.tip ? ' tip=' + ev.tip.slice(0, 8) + ' (' + ev.tipSource + ')' : ' (branch deleted, no tip)'));
1087
+ out(' task: ' + (ev.tasks.length
1088
+ ? ev.tasks.map((t) => t + (ev.taskStatuses[t] ? ' [' + ev.taskStatuses[t] + ']' : ' [not found]')).join(', ')
1089
+ : 'none identifiable'));
1090
+ out(' content: ' + (ev.unique === 'landed' ? 'landed — ' + ev.reason
1091
+ : ev.unique === 'none' ? 'landed — ' + ev.reason
1092
+ : ev.unique === 'unique' ? ev.reason
1093
+ : 'unknown — ' + ev.reason)
1094
+ + (ev.uniqueCommits ? ' (' + ev.uniqueCommits + ' branch-unique commit(s))' : ''));
1095
+ out(' worktree: ' + ev.dirt);
1096
+ out(' batch-approvable: ' + (ev.approvable ? 'yes' : 'NO — ' + ev.reason));
1097
+ }
1098
+ const ok = evidence.filter((e) => e.approvable).map((e) => e.name);
1099
+ out('');
1100
+ out(ok.length
1101
+ ? 'batch approval: node .claude/hooks/worktree-create.js gc --approve ' + ok.join(' ')
1102
+ + ' (or --approve --all for every batch-approvable candidate)'
1103
+ : 'no candidate qualifies for batch approval — resolve each individually (mark-landed after manual verification).');
1104
+ process.exit(0);
1105
+ }
1106
+ // --approve
1107
+ const byName = new Map(evidence.map((e) => [e.name, e]));
1108
+ const requested = flags.all
1109
+ ? evidence.filter((e) => e.approvable).map((e) => e.name)
1110
+ : positional;
1111
+ if (requested.length === 0) {
1112
+ fail('gc --approve needs worktree names (or --all for every batch-approvable candidate); '
1113
+ + 'run gc --review first');
1114
+ }
1115
+ const by = (function () { try { return os.userInfo().username; } catch { return null; } })();
1116
+ let approved = 0;
1117
+ let refused = 0;
1118
+ for (const nm of requested) {
1119
+ const ev = byName.get(nm);
1120
+ if (!ev) { out('SKIPPED ' + nm + ' — not a marker-starved candidate (already marked, too fresh, or unknown)'); refused += 1; continue; }
1121
+ if (!ev.approvable) { out('REFUSED ' + nm + ' — ' + ev.reason); refused += 1; continue; }
1122
+ appendLandedMarker(repo, {
1123
+ branch: ev.branch, worktree: ev.name, task: ev.tasks[0] || null,
1124
+ tip: ev.tip, via: 'gc-batch-review', by,
1125
+ });
1126
+ out('APPROVED ' + nm + ' — marker written (' + ev.reason + ')');
1127
+ approved += 1;
1128
+ }
1129
+ if (approved > 0) {
1130
+ // Reclaim through the ONE existing path. gcStaleWorktrees runs
1131
+ // unlinkNodeModulesLinks before every removal (TASK_1844: git recurses
1132
+ // through junctions and empties the MAIN checkout's node_modules —
1133
+ // measured twice). Batch reclaim must never grow a second deletion
1134
+ // implementation (TASK_1839 drift lesson) — approval only writes markers.
1135
+ gcStaleWorktrees(repo, path.join(repo, '.__gc_cli_no_keep__'), { verbose: true });
1136
+ }
1137
+ out('[worktree-create] gc approve: ' + approved + ' approved, ' + refused + ' refused/skipped');
1138
+ process.exit(refused > 0 ? 2 : 0);
1139
+ }
1140
+
1141
+ /**
1142
+ * gc [--dry-run] [--review] [--approve <wt-name...>|--approve --all] [--repo <path>]
1143
+ * Runs the same GC as the WorktreeCreate hook. --dry-run is strictly read-only:
1144
+ * no removal, no branch -D, no `worktree prune`.
1145
+ * --review / --approve (TASK_1876): evidence-based batch handling of worktrees
1146
+ * kept only for a missing landed marker — see _cliGcReviewOrApprove.
1147
+ */
1148
+ function cliGc(args) {
1149
+ const { flags, positional } = _cliParseFlags(args);
1150
+ const repo = _cliResolveRepo(flags);
1151
+ if (flags.review || flags.approve) {
1152
+ _cliGcReviewOrApprove(repo, flags, positional);
1153
+ return; // unreachable (process.exit inside) — defensive
1154
+ }
1155
+ process.stderr.write('[worktree-create] gc: repo=' + repo.replace(/\\/g, '/')
1156
+ + (flags.dryRun ? ' (DRY-RUN — read-only)' : '') + '\n');
1157
+ // keepPath: a token that can never collide with a real worktree dir.
1158
+ // verbose: the CLI is where the per-worktree "why was this kept" report belongs
1159
+ // (hook mode stays quiet — see the comment on gcStaleWorktrees).
1160
+ gcStaleWorktrees(repo, path.join(repo, '.__gc_cli_no_keep__'), { dryRun: !!flags.dryRun, verbose: true });
1161
+ process.exit(0);
1162
+ }
1163
+
1164
+ // Exports are unconditional: post-complete/git-merge.js requires this file for
1165
+ // appendLandedMarker, and it must get them no matter how we were started.
1166
+ module.exports = {
1167
+ runHook: main,
1168
+ GC_MIN_AGE_MS,
1169
+ landedLedgerPath,
1170
+ appendLandedMarker,
1171
+ readLandedIndex,
1172
+ deriveBranchForName,
1173
+ loadGcNoisePaths,
1174
+ isNoisePath,
1175
+ isLandedProgressNote,
1176
+ classifyWorktreeDirt,
1177
+ gcStaleWorktrees,
1178
+ siblingWorktreeBase,
1179
+ findNodeModulesParents,
1180
+ linkNodeModules,
1181
+ unlinkNodeModulesLinks,
1182
+ };
1183
+
1184
+ // Entry dispatch. Three distinct ways this file is started, and they must NOT be
1185
+ // collapsed — conflating them is what broke every worktree dispatch once the CLI
1186
+ // subcommands were added:
1187
+ //
1188
+ // require.main === module `node worktree-create.js [gc|mark-landed]` — CLI
1189
+ // require.main === undefined `node -e "require(...)"` — how settings.json wires
1190
+ // the WorktreeCreate hook. There is no main module
1191
+ // under `node -e`. The hook flow MUST run here; the
1192
+ // earlier `require.main === module` guard sent this
1193
+ // case to the exports-only branch, so the process
1194
+ // exited 0 having written nothing, and the harness
1195
+ // reported "hook succeeded but returned no worktree
1196
+ // path" on every single dispatch.
1197
+ // require.main === <other> required as a library (post-complete/git-merge.js
1198
+ // for appendLandedMarker, tests). Exports only —
1199
+ // running main() here would create a worktree in the
1200
+ // middle of a merge.
1201
+ if (require.main === module) {
1202
+ // TASK_1866: explicit subcommand whitelist. Anything unrecognized (--help,
1203
+ // typos, stray flags) used to fall through to main(), which built a real
1204
+ // worktree and exited 0 — a query for usage silently mutated the repo.
1205
+ // Whitelist: 'mark-landed' | 'gc' | <no args>. Everything else → usage, exit 1.
1206
+ //
1207
+ // <no args> intentionally still runs main() (manual hook invocation, e.g.
1208
+ // `echo <json> | node worktree-create.js` for testing): verified 2026-08-13
1209
+ // that NO caller depends on argument-less CLI invocation (grepped
1210
+ // .claude/settings.json, .formation/, .specialist/, dev/scripts/ — the hook
1211
+ // is wired via `node -e "require(...)"`, git-merge.js requires this file as
1212
+ // a library, and all documented CLI usage is gc/mark-landed). It is safe
1213
+ // regardless: main()'s stdin gate rejects it with exit 1 unless a valid
1214
+ // WorktreeCreate JSON object is piped in.
1215
+ const sub = process.argv[2];
1216
+ if (sub === 'mark-landed') cliMarkLanded(process.argv.slice(3));
1217
+ else if (sub === 'gc') cliGc(process.argv.slice(3));
1218
+ else if (sub === undefined) main();
1219
+ else {
1220
+ process.stderr.write(
1221
+ '[worktree-create] unknown subcommand: ' + sub + '\n'
1222
+ + 'usage:\n'
1223
+ + ' node .claude/hooks/worktree-create.js mark-landed <wt-name|wt-path|branch> [--task TASK_X] [--repo <path>] [--by <who>] [--tip <sha>]\n'
1224
+ + ' node .claude/hooks/worktree-create.js gc [--dry-run] [--repo <path>]\n'
1225
+ + ' node .claude/hooks/worktree-create.js gc --review [--repo <path>]\n'
1226
+ + ' node .claude/hooks/worktree-create.js gc --approve <wt-name...> | --approve --all [--repo <path>]\n'
1227
+ + ' (no args: WorktreeCreate hook flow — requires the hook JSON object on stdin)\n');
1228
+ process.exit(1);
1229
+ }
1230
+ } else if (require.main === undefined) {
1231
+ main(); // WorktreeCreate hook mode (stdin JSON contract unchanged; stdin gate inside main)
1232
+ }