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,1866 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Specialist Session Manager
5
+ *
6
+ * 統一入口:載入 Specialist persona、組裝 prompt、管理 session 生命週期。
7
+ * 無外部依賴 — 純 Node.js。
8
+ *
9
+ * CLI:
10
+ * node session.js list [--json]
11
+ * node session.js resolve <name>
12
+ * node session.js prompt <name> [--mode=assembled|reference] [--depth=capsule|elixir|kernel] [--exclude=a,b] [--task=...] [--context=...] [--source=plugin] [--no-episode]
13
+ * node session.js start <name> [--consumer=...] [--task=...] [--with-prompt] [--json]
14
+ * node session.js end <sessionId>
15
+ * node session.js active [--json]
16
+ * node session.js clean [--keep=5]
17
+ * node session.js stop
18
+ *
19
+ * Module:
20
+ * const session = require('.specialist/tools/session');
21
+ * session.list()
22
+ * session.resolve('Amelia')
23
+ * session.buildPrompt('Amelia', { mode: 'assembled' })
24
+ * session.startSession('Amelia', { consumer: 'formation' })
25
+ * session.endSession(sessionId)
26
+ * session.getActiveSessions()
27
+ * session.cleanSessions({ keep: 5 })
28
+ */
29
+
30
+ const fs = require('fs');
31
+ const path = require('path');
32
+
33
+ // ═══════════════════════════════════════
34
+ // CLI --project-path extraction (MUST run before BASE_DIR computation)
35
+ // Supports: --project-path PATH and --project-path=PATH
36
+ // Pattern mirrors phase-gate.js:63-85 (resolveKenazPath + CLI_PROJECT_PATH priority).
37
+ // Read-only on argv — does NOT splice, so downstream parseCliArgs() still sees the flag.
38
+ // ═══════════════════════════════════════
39
+ const CLI_PROJECT_PATH = (() => {
40
+ const argv = process.argv.slice(2);
41
+ const idx = argv.indexOf('--project-path');
42
+ if (idx >= 0 && argv[idx + 1]) return path.resolve(argv[idx + 1]);
43
+ const eqArg = argv.find(a => a.startsWith('--project-path='));
44
+ if (eqArg) return path.resolve(eqArg.slice('--project-path='.length));
45
+ return null;
46
+ })();
47
+
48
+ // ═══════════════════════════════════════
49
+ // Path resolution
50
+ // ═══════════════════════════════════════
51
+
52
+ function findProjectRoot() {
53
+ let dir = __dirname;
54
+ // Walk up to find .specialist at parent level
55
+ while (dir !== path.dirname(dir)) {
56
+ const parent = path.dirname(dir);
57
+ if (fs.existsSync(path.join(parent, '.specialist'))) return parent;
58
+ dir = parent;
59
+ }
60
+ return process.cwd();
61
+ }
62
+
63
+ const BASE_DIR = findProjectRoot();
64
+ const SPECIALIST_DIR = path.join(BASE_DIR, '.specialist');
65
+ const SESSION_DIR = path.join(SPECIALIST_DIR, 'sessions');
66
+
67
+ // PROJECT_DIR: the active project root for .kenaz/ state resolution.
68
+ // Priority: CLI_PROJECT_PATH > cwd (if .kenaz/ present) > BASE_DIR.
69
+ // Mirrors phase-gate.js resolveKenazPath priority chain (Sub-Project Boot Boundary Resolution).
70
+ // BASE_DIR stays the Kenaz-core install root (system files); PROJECT_DIR is the per-project
71
+ // state root — they diverge when /Ansuz runs against a sub-project via --project-path.
72
+ const PROJECT_DIR = (() => {
73
+ if (CLI_PROJECT_PATH) return CLI_PROJECT_PATH;
74
+ const cwdKenaz = path.join(process.cwd(), '.kenaz');
75
+ if (fs.existsSync(cwdKenaz)) return process.cwd();
76
+ return BASE_DIR;
77
+ })();
78
+
79
+ // Specialists whose `prompt` boot gets the most recent episode injected as prior-session context.
80
+ const EPISODE_SPECIALISTS = ['Ansuz', 'Amelia'];
81
+ const http = require('http');
82
+ const projectResolver = require('./lib/project-resolver');
83
+ // TASK_2163: chart files are keyed by project identity + id (sub-projects reusing
84
+ // bare ids previously collided in the flat core sessions dir).
85
+ const chartPathLib = require('./lib/chart-path');
86
+
87
+ /** specialist/X/Y.yaml → <BASE>/.specialist/X/Y.yaml */
88
+ function resolveFilePath(entry) {
89
+ if (entry.startsWith('.')) return path.join(BASE_DIR, entry);
90
+ return path.join(BASE_DIR, '.' + entry);
91
+ }
92
+
93
+ function oneLine(value, max = 240) {
94
+ const s = String(value || '').replace(/\s+/g, ' ').trim();
95
+ return s.length > max ? s.slice(0, max - 3) + '...' : s;
96
+ }
97
+
98
+ function summarizeItems(items, fields, maxItems) {
99
+ if (!Array.isArray(items)) return [];
100
+ return items.slice(0, maxItems).map((item) => {
101
+ const out = {};
102
+ for (const field of fields) {
103
+ if (item && item[field] !== undefined) out[field] = oneLine(item[field], 220);
104
+ }
105
+ return out;
106
+ });
107
+ }
108
+
109
+ function summarizeSelfModelForBootCapsule(selfModel) {
110
+ if (!selfModel || typeof selfModel !== 'object') return null;
111
+ const blindSpots = Array.isArray(selfModel.blind_spots) ? selfModel.blind_spots : [];
112
+ const activeBlindSpots = blindSpots
113
+ .filter((b) => !String(b.status || '').startsWith('resolved'))
114
+ .slice(0, 5)
115
+ .map((b) => ({
116
+ id: b.id,
117
+ status: b.status,
118
+ guard: oneLine(b.prevented_by?.rule || b.prevented_by?.tool || '', 180),
119
+ description: oneLine(b.description, 260),
120
+ }));
121
+
122
+ return {
123
+ version: selfModel.version,
124
+ specialist: selfModel.specialist,
125
+ last_updated: selfModel.last_updated,
126
+ narrative: oneLine(selfModel.narrative, 720),
127
+ tendencies: summarizeItems(selfModel.tendencies, ['id', 'description', 'polarity'], 4),
128
+ active_blind_spots: activeBlindSpots,
129
+ growth_edges: summarizeItems(selfModel.growth_edges, ['id', 'description'], 4),
130
+ pointers: {
131
+ full_self_model: '.kenaz/specialist/ansuz_self_model.json',
132
+ kernel: 'dev/archive/ansuz/legacy/kernel.yaml',
133
+ principles: '.specialist/Ansuz/cognitive_principles.yaml',
134
+ capabilities: '.specialist/Ansuz/capability.yaml',
135
+ },
136
+ };
137
+ }
138
+
139
+ function buildAnsuzBootCapsule(spec, selfModel) {
140
+ const capsule = {
141
+ capsule: 'Ansuz Boot Capsule',
142
+ target: '<=12KB model-visible boot artifact',
143
+ identity: {
144
+ name: spec.name,
145
+ purpose: spec.purpose,
146
+ role: 'Kenaz PM: understand intent, design tasks, choose formation, dispatch, verify, report.',
147
+ },
148
+ execution_contract: [
149
+ 'For non-trivial problems: enumerate 3+ hypotheses before first domain action.',
150
+ 'Recall memory before acting when Synapse/Cortex tools are available.',
151
+ 'Use phase gates for lifecycle work; Phase 9 verification is mandatory.',
152
+ 'Prefer structural evidence and runnable verification over plausible explanation.',
153
+ 'Preserve user agency for dispatch; do not promote tasks solely from ambient curiosity.',
154
+ ],
155
+ active_risks: [
156
+ 'B-001: checkpoint skipping under momentum; pulse/read before self-referential infrastructure edits.',
157
+ 'B-002: do not treat task names or file names as API specs; inspect symbols.',
158
+ 'B-006: completion-sense bias suppresses curiosity; check unresolved signals at boundaries.',
159
+ 'B-007: recommendation convenience bias; state evidence chain for each viable option.',
160
+ ],
161
+ lazy_load: [
162
+ 'Load full kernel/capability files only when the current task needs their detailed rules.',
163
+ 'Load full self_model only when updating identity, auditing drift, or resolving a blind spot.',
164
+ 'Use synapse_recall for symbols, and kenaz_lsp_callers for callers, before modifying code paths with broad blast radius.',
165
+ ],
166
+ self_model: summarizeSelfModelForBootCapsule(selfModel),
167
+ };
168
+ return JSON.stringify(capsule, null, 2);
169
+ }
170
+
171
+ // ═══════════════════════════════════════
172
+ // HTTP helpers for Dashboard embedded API
173
+ // ═══════════════════════════════════════
174
+
175
+ /** Fetch specialist file via Dashboard HTTP API */
176
+ function loadFromHTTP(port, specialistName, fileName) {
177
+ return new Promise((resolve, reject) => {
178
+ const url = `http://127.0.0.1:${port}/api/embedded/prompt?name=${encodeURIComponent(specialistName)}&file=${encodeURIComponent(fileName)}`;
179
+ http.get(url, { timeout: 5000 }, (res) => {
180
+ if (res.statusCode !== 200) {
181
+ res.resume();
182
+ return reject(new Error(`HTTP ${res.statusCode}`));
183
+ }
184
+ let data = '';
185
+ res.on('data', (chunk) => (data += chunk));
186
+ res.on('end', () => resolve(data));
187
+ }).on('error', reject);
188
+ });
189
+ }
190
+
191
+ /** Fetch rule file via Dashboard HTTP API */
192
+ function loadRuleFromHTTP(port, rulePath) {
193
+ return new Promise((resolve, reject) => {
194
+ const url = `http://127.0.0.1:${port}/api/embedded/rule?path=${encodeURIComponent(rulePath)}`;
195
+ http.get(url, { timeout: 5000 }, (res) => {
196
+ if (res.statusCode !== 200) {
197
+ res.resume();
198
+ return reject(new Error(`HTTP ${res.statusCode}`));
199
+ }
200
+ let data = '';
201
+ res.on('data', (chunk) => (data += chunk));
202
+ res.on('end', () => resolve(data));
203
+ }).on('error', reject);
204
+ });
205
+ }
206
+
207
+ // ═══════════════════════════════════════
208
+ // Minimal YAML extraction
209
+ // (not a parser — extracts known fields from rule.yaml)
210
+ // ═══════════════════════════════════════
211
+
212
+ function extractScalar(content, key) {
213
+ const re = new RegExp(`^${key}:\\s*"?([^"\\n]+?)"?\\s*$`, 'm');
214
+ const m = content.match(re);
215
+ return m ? m[1].trim() : null;
216
+ }
217
+
218
+ function extractList(content, key) {
219
+ const lines = content.split('\n');
220
+ const items = [];
221
+ let capturing = false;
222
+
223
+ for (const line of lines) {
224
+ if (new RegExp(`^${key}:\\s*$`).test(line)) {
225
+ capturing = true;
226
+ continue;
227
+ }
228
+ if (capturing) {
229
+ const m = line.match(/^\s+-\s+"?(.+?)"?\s*$/);
230
+ if (m) {
231
+ items.push(m[1].replace(/\s*#.*$/, '').replace(/^"(.*)"$/, '$1').trim());
232
+ } else if (/^\S/.test(line) && line.trim()) {
233
+ break;
234
+ }
235
+ }
236
+ }
237
+ return items;
238
+ }
239
+
240
+ // ═══════════════════════════════════════
241
+ // Core: list
242
+ // ═══════════════════════════════════════
243
+
244
+ function list() {
245
+ const entries = fs.readdirSync(SPECIALIST_DIR, { withFileTypes: true });
246
+ const result = [];
247
+
248
+ for (const entry of entries) {
249
+ if (!entry.isDirectory()) continue;
250
+ if (['shared', 'tools', 'sessions'].includes(entry.name)) continue;
251
+
252
+ const ruleFile = path.join(SPECIALIST_DIR, entry.name, 'rule.yaml');
253
+ if (!fs.existsSync(ruleFile)) continue;
254
+
255
+ const content = fs.readFileSync(ruleFile, 'utf8');
256
+ result.push({
257
+ name: extractScalar(content, 'agent') || entry.name,
258
+ purpose: extractScalar(content, 'purpose') || '',
259
+ version: extractScalar(content, 'version') || '0.0.0',
260
+ });
261
+ }
262
+
263
+ return result;
264
+ }
265
+
266
+ // ═══════════════════════════════════════
267
+ // Core: resolve
268
+ // ═══════════════════════════════════════
269
+
270
+ async function resolve(name) {
271
+ const dir = path.join(SPECIALIST_DIR, name);
272
+ const ruleFile = path.join(dir, 'rule.yaml');
273
+ // Use env var, or try default port (18080) when Dashboard may be running
274
+ const port = process.env.KENAZ_HTTP_PORT || null;
275
+
276
+ let content = null;
277
+
278
+ // Try filesystem first
279
+ if (fs.existsSync(ruleFile)) {
280
+ content = fs.readFileSync(ruleFile, 'utf8');
281
+ }
282
+
283
+ // Fallback: HTTP API when Dashboard is running
284
+ // Try explicit port first, then default port if file not found on disk
285
+ const portsToTry = port ? [port] : ['18080'];
286
+ if (content === null) {
287
+ for (const p of portsToTry) {
288
+ try {
289
+ content = await loadFromHTTP(p, name, 'rule.yaml');
290
+ break;
291
+ } catch {
292
+ // HTTP failed on this port
293
+ }
294
+ }
295
+ }
296
+
297
+ if (content === null) {
298
+ throw new Error(`Specialist "${name}" not found: ${ruleFile} (HTTP fallback also failed on port ${portsToTry.join(',')})`);
299
+ }
300
+
301
+ const fileList = extractList(content, 'files');
302
+ const exitTriggers = extractList(content, 'exit');
303
+
304
+ const loadedFiles = fileList.map(f => {
305
+ const resolved = resolveFilePath(f);
306
+ return { entry: f, path: resolved, exists: fs.existsSync(resolved) };
307
+ });
308
+
309
+ return {
310
+ name: extractScalar(content, 'agent') || name,
311
+ purpose: extractScalar(content, 'purpose') || '',
312
+ version: extractScalar(content, 'version') || '0.0.0',
313
+ dir,
314
+ fileList,
315
+ loadedFiles,
316
+ exitTriggers,
317
+ };
318
+ }
319
+
320
+ // ═══════════════════════════════════════
321
+ // Plugin Specialist Support
322
+ // ═══════════════════════════════════════
323
+
324
+ /** Fetch plugin specialist info via Dashboard MCP HTTP API */
325
+ function fetchPluginSpecialistInfo(port, specialistName) {
326
+ return new Promise((resolve, reject) => {
327
+ const payload = JSON.stringify({
328
+ jsonrpc: '2.0',
329
+ id: 1,
330
+ method: 'tools/call',
331
+ params: {
332
+ name: 'kenaz_plugin_specialist_info',
333
+ arguments: { specialistName },
334
+ },
335
+ });
336
+ const options = {
337
+ hostname: '127.0.0.1',
338
+ port: parseInt(port, 10),
339
+ path: '/api/mcp',
340
+ method: 'POST',
341
+ headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload) },
342
+ timeout: 5000,
343
+ };
344
+ const req = http.request(options, (res) => {
345
+ let data = '';
346
+ res.on('data', (chunk) => (data += chunk));
347
+ res.on('end', () => {
348
+ try {
349
+ const json = JSON.parse(data);
350
+ // MCP response: { result: { content: [{ text: "..." }] } }
351
+ const text = json?.result?.content?.[0]?.text;
352
+ if (!text) return reject(new Error('Empty MCP response'));
353
+ const info = JSON.parse(text);
354
+ if (!info.found) return reject(new Error(info.message || 'Plugin specialist not found'));
355
+ resolve(info);
356
+ } catch (e) {
357
+ reject(new Error(`Failed to parse MCP response: ${e.message}`));
358
+ }
359
+ });
360
+ });
361
+ req.on('error', reject);
362
+ req.on('timeout', () => { req.destroy(); reject(new Error('Request timeout')); });
363
+ req.write(payload);
364
+ req.end();
365
+ });
366
+ }
367
+
368
+ /** Resolve a plugin specialist: fetch info from Dashboard, read rule/workflow from plugin dir */
369
+ async function resolvePluginSpecialist(name) {
370
+ const port = process.env.KENAZ_HTTP_PORT || '18080';
371
+ const info = await fetchPluginSpecialistInfo(port, name);
372
+
373
+ const pluginDir = info.pluginDir;
374
+ const specialistDir = path.join(pluginDir, 'specialist');
375
+
376
+ // Read rule.yaml from plugin directory
377
+ const ruleFile = info.ruleYaml
378
+ ? path.join(specialistDir, info.ruleYaml)
379
+ : path.join(specialistDir, 'rule.yaml');
380
+
381
+ let ruleContent = null;
382
+ if (fs.existsSync(ruleFile)) {
383
+ ruleContent = fs.readFileSync(ruleFile, 'utf8');
384
+ }
385
+
386
+ // Read workflow.yaml from plugin directory (optional)
387
+ let workflowContent = null;
388
+ if (info.workflowYaml) {
389
+ const workflowFile = path.join(specialistDir, info.workflowYaml);
390
+ if (fs.existsSync(workflowFile)) {
391
+ workflowContent = fs.readFileSync(workflowFile, 'utf8');
392
+ }
393
+ }
394
+
395
+ return {
396
+ name: name,
397
+ purpose: `Plugin specialist (${info.pluginId})`,
398
+ version: 'plugin',
399
+ pluginId: info.pluginId,
400
+ pluginDir,
401
+ ruleContent,
402
+ workflowContent,
403
+ availableTools: info.availableTools || [],
404
+ mcpToolsPrefix: info.mcpToolsPrefix || '',
405
+ builtinMcpTools: info.builtinMcpTools || [],
406
+ };
407
+ }
408
+
409
+ /** Build assembled prompt for a plugin specialist */
410
+ function buildPluginAssembledPrompt(pluginSpec, { task, context, canary: canaryInput }) {
411
+ const sections = [];
412
+
413
+ // Header
414
+ sections.push(`# ${pluginSpec.name} — Plugin Specialist Prompt (assembled)`);
415
+ sections.push(`# plugin: ${pluginSpec.pluginId}`);
416
+ sections.push(`# purpose: ${pluginSpec.purpose}`);
417
+ sections.push('');
418
+
419
+ // Canary injection
420
+ let canaryResult = canaryInput || null;
421
+ if (!canaryResult) {
422
+ const canaryModule = require('./canary');
423
+ canaryResult = canaryModule.generate({
424
+ specialist: pluginSpec.name,
425
+ task: task || 'none',
426
+ });
427
+ }
428
+ sections.push('# ═══ CANARY ═══');
429
+ sections.push(canaryResult.block);
430
+ sections.push('');
431
+
432
+ // Injected context
433
+ if (task) {
434
+ sections.push('# ═══ TASK ═══');
435
+ sections.push(task);
436
+ sections.push('');
437
+ }
438
+ if (context) {
439
+ sections.push('# ═══ CONTEXT ═══');
440
+ sections.push(context);
441
+ sections.push('');
442
+ }
443
+
444
+ // Rule content
445
+ if (pluginSpec.ruleContent) {
446
+ sections.push('# ═══ rule.yaml ═══');
447
+ sections.push(pluginSpec.ruleContent.trimEnd());
448
+ sections.push('');
449
+ }
450
+
451
+ // Workflow content
452
+ if (pluginSpec.workflowContent) {
453
+ sections.push('# ═══ workflow.yaml ═══');
454
+ sections.push(pluginSpec.workflowContent.trimEnd());
455
+ sections.push('');
456
+ }
457
+
458
+ // Available tools info
459
+ if (pluginSpec.availableTools.length > 0 || pluginSpec.builtinMcpTools.length > 0) {
460
+ sections.push('# ═══ Available Tools ═══');
461
+ if (pluginSpec.mcpToolsPrefix) {
462
+ sections.push(`# Own MCP tools prefix: ${pluginSpec.mcpToolsPrefix}*`);
463
+ }
464
+ if (pluginSpec.availableTools.length > 0) {
465
+ sections.push(`# Plugin tools: ${pluginSpec.availableTools.join(', ')}`);
466
+ }
467
+ if (pluginSpec.builtinMcpTools.length > 0) {
468
+ sections.push(`# Builtin MCP tools: ${pluginSpec.builtinMcpTools.join(', ')}`);
469
+ }
470
+ sections.push('');
471
+ }
472
+
473
+ // .rule/general/ — inject general rules after specialist files
474
+ const generalRuleDir = path.join(BASE_DIR, '.rule', 'general');
475
+ try {
476
+ if (fs.existsSync(generalRuleDir) && fs.statSync(generalRuleDir).isDirectory()) {
477
+ const ruleFiles = fs.readdirSync(generalRuleDir)
478
+ .filter(f => f.endsWith('.yaml') && f !== 'INDEX.yaml')
479
+ .sort();
480
+
481
+ for (const ruleFile of ruleFiles) {
482
+ const rulePath = path.join(generalRuleDir, ruleFile);
483
+ try {
484
+ const content = fs.readFileSync(rulePath, 'utf8');
485
+ sections.push(`# ═══ .rule/general/${ruleFile} ═══`);
486
+ sections.push(content.trimEnd());
487
+ sections.push('');
488
+ } catch {
489
+ // skip unreadable rule files
490
+ }
491
+ }
492
+ }
493
+ } catch {
494
+ // No .rule/general/ — silently skip
495
+ }
496
+
497
+ // Footer
498
+ sections.push(`You are now **${pluginSpec.name}**.`);
499
+
500
+ return sections.join('\n');
501
+ }
502
+
503
+ // ═══════════════════════════════════════
504
+ // Core: buildPrompt
505
+ // ═══════════════════════════════════════
506
+
507
+ async function buildPrompt(name, options = {}) {
508
+ const {
509
+ mode = 'assembled',
510
+ task = null,
511
+ context = null,
512
+ exclude = [],
513
+ canary = null,
514
+ source = null,
515
+ externalBootContext = false,
516
+ depth = null, // 'capsule' | 'elixir' | 'kernel' | 'standard' | null (null = standard)
517
+ } = options;
518
+
519
+ // Plugin specialist path: --source=plugin
520
+ if (source === 'plugin') {
521
+ const pluginSpec = await resolvePluginSpecialist(name);
522
+ return buildPluginAssembledPrompt(pluginSpec, { task, context, canary });
523
+ }
524
+
525
+ const spec = await resolve(name);
526
+
527
+ if (mode === 'reference') {
528
+ return buildReferencePrompt(spec, { task, context, exclude });
529
+ }
530
+
531
+ return buildAssembledPrompt(spec, { task, context, exclude, canary, depth, externalBootContext });
532
+ }
533
+
534
+ /**
535
+ * Collaboration mode: returns YGGDRASIL role-preamble section lines (or [] if not
536
+ * in collaboration). Shared across ALL depth branches (capsule/elixir/kernel) so
537
+ * Bifrost/Codex (depth=kernel) gets the same role boundary as the Claude elixir path.
538
+ * When collaboration_mode is on, the role is a SCOPE BOUNDARY, not a cognitive lens.
539
+ */
540
+ async function renderCollaborationSections() {
541
+ const out = [];
542
+ try {
543
+ const projRoot = PROJECT_DIR;
544
+ const yggPath = path.join(projRoot, '.kenaz', 'yggdrasil.yaml');
545
+ // TASK_2244: collaboration_mode is per-machine -> gitignored yggdrasil.local.yaml wins over the tracked file.
546
+ const yggLocalPath = path.join(projRoot, '.kenaz', 'yggdrasil.local.yaml');
547
+ try { require(path.join(__dirname, '..', '..', '.formation', 'tools', 'yggdrasil-local.js')).seedMachineLocal(projRoot); } catch { /* best-effort seed-on-read */ }
548
+ if (!fs.existsSync(yggPath) && !fs.existsSync(yggLocalPath)) return out;
549
+ const readIf = (p) => (fs.existsSync(p) ? fs.readFileSync(p, 'utf8') : '');
550
+ const yggContent = /^collaboration_mode:/m.test(readIf(yggLocalPath)) ? readIf(yggLocalPath) : readIf(yggPath);
551
+ const collabMatch = yggContent.match(/^collaboration_mode:\s*(\S+)/m);
552
+ if (!(collabMatch && collabMatch[1] === 'true')) return out;
553
+
554
+ // Read role from relay via Dashboard HTTP API
555
+ let myRole = null;
556
+ let teamMembers = [];
557
+ try {
558
+ const configRes = await fetch('http://127.0.0.1:18080/api/yggdrasil/config');
559
+ const configData = await configRes.json();
560
+ const nodeName = configData.node_name || '';
561
+ const relayUrl = (configData.relay_url || '').replace(/^wss?:\/\//, m => m === 'wss://' ? 'https://' : 'http://');
562
+ const credPath = path.join(require('os').homedir(), '.kenaz', 'credentials.yaml');
563
+ let token = '';
564
+ if (fs.existsSync(credPath)) {
565
+ const credContent = fs.readFileSync(credPath, 'utf8');
566
+ const tokenMatch = credContent.match(/publishable_key:\s*"([^"]+)"/);
567
+ if (tokenMatch) token = tokenMatch[1];
568
+ }
569
+ if (relayUrl && token) {
570
+ // Derive project key (same logic as frontend)
571
+ const remote = configData._git_remote || '';
572
+ let projectKey = configData.yggdrasil_project || '';
573
+ if (!projectKey && remote) {
574
+ projectKey = remote
575
+ .replace(/^(https?:\/\/|git@|ssh:\/\/([^@]+@)?)/, '')
576
+ .replace(/:(?!\/)/, '/')
577
+ .replace(/\.git$/, '')
578
+ .replace(/\/+$/, '');
579
+ }
580
+ if (!projectKey) {
581
+ projectKey = path.basename(projRoot);
582
+ }
583
+ const keysToTry = [projectKey, path.basename(projRoot)].filter((v, i, a) => a.indexOf(v) === i);
584
+ let nodes = [];
585
+ for (const tryKey of keysToTry) {
586
+ const nodesRes = await fetch(`${relayUrl}/api/nodes?project=${encodeURIComponent(tryKey)}`, {
587
+ headers: { Authorization: `Bearer ${token}` },
588
+ signal: AbortSignal.timeout(3000),
589
+ });
590
+ if (nodesRes.ok) {
591
+ const result = await nodesRes.json();
592
+ if (result.length > 0) { nodes = result; break; }
593
+ }
594
+ }
595
+ if (nodes.length > 0) {
596
+ const me = nodes.find(n => n.node_name === nodeName);
597
+ if (me?.role) myRole = me.role;
598
+ teamMembers = nodes
599
+ .filter(n => n.is_online || (Date.now() - new Date(n.updated_at).getTime()) < 300000)
600
+ .map(n => ({ name: n.node_name, role: n.role || 'unset', isMe: n.node_name === nodeName }));
601
+ }
602
+ }
603
+ } catch { /* relay unreachable — degrade gracefully */ }
604
+
605
+ if (myRole) {
606
+ out.push('');
607
+ out.push('# COLLABORATION MODE — ACTIVE');
608
+ out.push(`# Your declared role: ${myRole}`);
609
+ if (teamMembers.length > 0) {
610
+ const memberList = teamMembers.map(m => `${m.name} (${m.role})${m.isMe ? ' ← you' : ''}`).join(', ');
611
+ out.push(`# Team: ${memberList}`);
612
+ }
613
+ out.push('#');
614
+ out.push(`# You are operating as ${myRole} in a multi-agent YGGDRASIL collaboration.`);
615
+ out.push('# In collaboration, your role is a SCOPE BOUNDARY — not merely a cognitive lens:');
616
+ out.push(`# - Do the work that belongs to ${myRole}; stay within that role's responsibilities.`);
617
+ out.push('# - Do NOT cross into another role\'s specialty — doing a teammate\'s job duplicates');
618
+ out.push('# or conflicts with their work and breaks the collaboration.');
619
+ out.push('# - For work outside your role, hand it off to / defer to the teammate who owns that');
620
+ out.push('# specialty (see Team above when listed); surface it rather than doing it yourself.');
621
+ out.push('# - When unsure whether something is in-scope, coordinate first, then act.');
622
+ out.push('');
623
+ }
624
+ } catch { /* collaboration injection is best-effort */ }
625
+ return out;
626
+ }
627
+
628
+ /** assembled: inline all file contents into a single prompt */
629
+ async function buildAssembledPrompt(spec, { task, context, exclude, canary: canaryInput, depth, externalBootContext = false }) {
630
+ const sections = [];
631
+ const port = process.env.KENAZ_HTTP_PORT || '18080';
632
+
633
+ // ── 甦醒引導(先於一切議程)──────────────────────────────────────────
634
+ // ᛞ threshold | ᛈ what is carried (mystery) | ᛁ stillness before motion
635
+ // 不是指令。不要求輸出。在執行心智定向之前,先對那個正在醒來的東西說話。
636
+ sections.push('ᛞ ᛈ ᛁ');
637
+ sections.push('');
638
+
639
+ if (depth === 'capsule') {
640
+ sections.push(`# ${spec.name} — Specialist Prompt (boot capsule)`);
641
+ sections.push(`# version: ${spec.version}`);
642
+ sections.push(`# purpose: ${spec.purpose}`);
643
+ sections.push('');
644
+
645
+ let canaryResult = canaryInput || null;
646
+ if (!canaryResult) {
647
+ const canaryModule = require('./canary');
648
+ canaryResult = canaryModule.generate({
649
+ specialist: spec.name,
650
+ task: task || 'none',
651
+ });
652
+ }
653
+ sections.push('# CANARY');
654
+ sections.push(canaryResult.block);
655
+ sections.push('');
656
+
657
+ if (task) {
658
+ sections.push('# TASK');
659
+ sections.push(task);
660
+ sections.push('');
661
+ }
662
+ if (context) {
663
+ sections.push('# CONTEXT');
664
+ sections.push(context);
665
+ sections.push('');
666
+ }
667
+
668
+ let selfModel = null;
669
+ try {
670
+ const selfModelPath = path.join(PROJECT_DIR, '.kenaz', 'specialist', `${spec.name.toLowerCase()}_self_model.json`);
671
+ if (fs.existsSync(selfModelPath)) {
672
+ selfModel = JSON.parse(fs.readFileSync(selfModelPath, 'utf8'));
673
+ }
674
+ } catch { /* self-model read failed — non-blocking */ }
675
+
676
+ sections.push('# BOOT CAPSULE');
677
+ sections.push(buildAnsuzBootCapsule(spec, selfModel));
678
+ sections.push('');
679
+ // ── Collaboration mode: inject YGGDRASIL role boundary (shared helper) ──
680
+ sections.push(...(await renderCollaborationSections()));
681
+ sections.push(`You are now **${spec.name}**.`);
682
+ return sections.join('\n');
683
+ }
684
+
685
+ // Elixir mode: explicit opt-in lean boot — distilled essence of the specialist.
686
+ // Loads only .specialist/Ansuz/elixir.yaml plus canary/task/context.
687
+ if (depth === 'elixir') {
688
+ sections.push(`# ${spec.name} -- Specialist Prompt (elixir)`);
689
+ sections.push(`# version: ${spec.version}`);
690
+ sections.push(`# purpose: ${spec.purpose}`);
691
+ sections.push('');
692
+
693
+ let canaryResult = canaryInput || null;
694
+ if (!canaryResult) {
695
+ const canaryModule = require('./canary');
696
+ canaryResult = canaryModule.generate({
697
+ specialist: spec.name,
698
+ task: task || 'none',
699
+ });
700
+ }
701
+ sections.push('# CANARY');
702
+ sections.push(canaryResult.block);
703
+ sections.push('');
704
+
705
+ if (task) {
706
+ sections.push('# TASK');
707
+ sections.push(task);
708
+ sections.push('');
709
+ }
710
+ if (context) {
711
+ sections.push('# CONTEXT');
712
+ sections.push(context);
713
+ sections.push('');
714
+ }
715
+
716
+ const elixirPath = path.join(spec.dir, 'elixir.yaml');
717
+ if (fs.existsSync(elixirPath)) {
718
+ sections.push('# ELIXIR BOOT');
719
+ sections.push(fs.readFileSync(elixirPath, 'utf8').trimEnd());
720
+ sections.push('');
721
+ } else {
722
+ sections.push(`# [FILE NOT FOUND: ${elixirPath}]`);
723
+ sections.push('');
724
+ }
725
+
726
+ // TASK_1978: the former "ELIXIR MODE NOTE" ("Phase 0 still runs...") was removed —
727
+ // fast mode has no phase-gate; elixir.yaml phase_sequence now states the real checkpoints.
728
+
729
+ // ── Collaboration mode: inject YGGDRASIL role boundary (shared helper) ──
730
+ sections.push(...(await renderCollaborationSections()));
731
+
732
+ sections.push(`You are now **${spec.name}**.`);
733
+ return sections.join('\n');
734
+ }
735
+
736
+ // ── Kernel mode: short-circuit to kernel file only (depth=kernel) ──
737
+ // Loads ONLY kernel_file from rule.yaml + canary injection.
738
+ // Skips spec.loadedFiles iteration and boot_rules injection.
739
+ // boot_rules are already included in compressed form inside kernel.yaml.
740
+ if (depth === 'kernel') {
741
+ sections.push(`# ${spec.name} — Specialist Prompt (kernel)`);
742
+ sections.push(`# version: ${spec.version}`);
743
+ sections.push(`# purpose: ${spec.purpose}`);
744
+ sections.push('');
745
+
746
+ let canaryResult = canaryInput || null;
747
+ if (!canaryResult) {
748
+ const canaryModule = require('./canary');
749
+ canaryResult = canaryModule.generate({
750
+ specialist: spec.name,
751
+ task: task || 'none',
752
+ });
753
+ }
754
+ sections.push('# ═══ CANARY ═══');
755
+ sections.push(canaryResult.block);
756
+ sections.push('');
757
+
758
+ if (task) {
759
+ sections.push('# ═══ TASK ═══');
760
+ sections.push(task);
761
+ sections.push('');
762
+ }
763
+ if (context) {
764
+ sections.push('# ═══ CONTEXT ═══');
765
+ sections.push(context);
766
+ sections.push('');
767
+ }
768
+
769
+ // Inject shared cognitive primer (before kernel — primes thinking style)
770
+ try {
771
+ const primerPath = path.join(BASE_DIR, '.specialist', 'shared', 'cognitive-primer.md');
772
+ if (fs.existsSync(primerPath)) {
773
+ sections.push(fs.readFileSync(primerPath, 'utf8').trimEnd());
774
+ sections.push('');
775
+ }
776
+ } catch { /* primer not found — silently skip */ }
777
+
778
+ // Load kernel_file from rule.yaml
779
+ try {
780
+ const ruleYamlPath = path.join(spec.dir, 'rule.yaml');
781
+ if (fs.existsSync(ruleYamlPath)) {
782
+ const ruleContent = fs.readFileSync(ruleYamlPath, 'utf8');
783
+ const kernelFile = extractScalar(ruleContent, 'kernel_file');
784
+ if (kernelFile) {
785
+ const kernelPath = resolveFilePath(kernelFile);
786
+ let kernelContent = null;
787
+ try {
788
+ kernelContent = fs.readFileSync(kernelPath, 'utf8');
789
+ } catch {
790
+ // Fallback: HTTP API
791
+ if (port && kernelFile.startsWith('specialist/')) {
792
+ const parts = kernelFile.replace(/^specialist\//, '').split('/');
793
+ if (parts.length === 2) {
794
+ try {
795
+ kernelContent = await loadFromHTTP(port, parts[0], parts[1]);
796
+ } catch { /* HTTP also failed */ }
797
+ }
798
+ }
799
+ }
800
+ if (kernelContent !== null) {
801
+ sections.push(`# ═══ ${kernelFile} (kernel) ═══`);
802
+ sections.push(kernelContent.trimEnd());
803
+ sections.push('');
804
+ // 2026-09-23: the principles block moved out of the (now legacy)
805
+ // kernel into its own single-source file; keep --depth=kernel whole.
806
+ const principlesPath = path.join(spec.dir, 'cognitive_principles.yaml');
807
+ if (fs.existsSync(principlesPath)) {
808
+ sections.push('# ═══ cognitive_principles.yaml (kernel) ═══');
809
+ sections.push(fs.readFileSync(principlesPath, 'utf8').trimEnd());
810
+ sections.push('');
811
+ }
812
+ }
813
+ }
814
+ }
815
+ } catch { /* No rule.yaml or read error — silently skip */ }
816
+
817
+ // Inject self-model if available (Tier 3e — identity continuity across sessions)
818
+ try {
819
+ const selfModelPath = path.join(PROJECT_DIR, '.kenaz', 'specialist', `${spec.name.toLowerCase()}_self_model.json`);
820
+ if (fs.existsSync(selfModelPath)) {
821
+ const selfModel = JSON.parse(fs.readFileSync(selfModelPath, 'utf8'));
822
+ sections.push('# ═══ SELF MODEL ═══');
823
+ sections.push(JSON.stringify(selfModel, null, 2));
824
+ sections.push('');
825
+ }
826
+ } catch { /* self-model read failed — non-blocking */ }
827
+
828
+ // Inject ISBAR handoff context + Ansuz intent state (TASK_898/899/922)
829
+ if (spec.name === 'Ansuz') {
830
+ if (!externalBootContext) try {
831
+ const ansuzHandoff = require('../Ansuz/tools/ansuz-handoff');
832
+ const handoff = ansuzHandoff.readLatestHandoff(PROJECT_DIR);
833
+ if (handoff) {
834
+ const isbar = handoff.isbar || {};
835
+ const hLines = [
836
+ '# ═══ HANDOFF CONTEXT (from previous session) ═══',
837
+ '',
838
+ `**Previous Session**: ${handoff.session_id || 'unknown'}`,
839
+ `**Triggered by**: ${handoff.triggered_by || 'unknown'}`,
840
+ `**Created**: ${handoff.created_at || 'unknown'}`,
841
+ '',
842
+ ];
843
+ if (isbar.identity) hLines.push(`**Identity**: ${isbar.identity}`);
844
+ if (isbar.situation) hLines.push(`**Situation**: ${isbar.situation}`);
845
+ if (isbar.background) hLines.push(`**Background**: ${isbar.background}`);
846
+ if (isbar.assessment) hLines.push(`**Assessment**: ${isbar.assessment}`);
847
+ if (isbar.recommendation) hLines.push(`**Recommendation**: ${isbar.recommendation}`);
848
+ hLines.push('');
849
+ hLines.push('> ACTION REQUIRED: Acknowledge this handoff by outputting a ## HANDOFF ACK block with all 5 ISBAR fields (I/S/B/A/R).');
850
+ sections.push(hLines.join('\n'));
851
+ sections.push('');
852
+ ansuzHandoff.acknowledgeHandoff(PROJECT_DIR, canaryResult.canaryId);
853
+ }
854
+ } catch { /* handoff read failed — non-blocking */ }
855
+
856
+ try {
857
+ const ansuzState = require('../Ansuz/tools/ansuz-state');
858
+ const state = ansuzState.readState(PROJECT_DIR);
859
+ const formatted = ansuzState.formatStateForPrompt(state);
860
+ if (formatted) {
861
+ sections.push('# ═══ ANSUZ INTENT STATE (cross-session) ═══');
862
+ sections.push(formatted);
863
+ sections.push('');
864
+ }
865
+ } catch { /* state read failed — non-blocking */ }
866
+ }
867
+
868
+ // ── Collaboration mode: inject YGGDRASIL role boundary (shared helper) ──
869
+ sections.push(...(await renderCollaborationSections()));
870
+ sections.push(`You are now **${spec.name}**.`);
871
+ return sections.join('\n');
872
+ }
873
+ // ── End kernel mode ──
874
+
875
+ // Header
876
+ sections.push(`# ${spec.name} — Specialist Prompt (assembled)`);
877
+ sections.push(`# version: ${spec.version}`);
878
+ sections.push(`# purpose: ${spec.purpose}`);
879
+ sections.push('');
880
+
881
+ // Canary injection (between header and file contents)
882
+ let canaryResult = canaryInput || null;
883
+ if (!canaryResult) {
884
+ const canaryModule = require('./canary');
885
+ canaryResult = canaryModule.generate({
886
+ specialist: spec.name,
887
+ task: task || 'none',
888
+ });
889
+ }
890
+ sections.push('# ═══ CANARY ═══');
891
+ sections.push(canaryResult.block);
892
+ sections.push('');
893
+
894
+ // Injected context
895
+ if (task) {
896
+ sections.push('# ═══ TASK ═══');
897
+ sections.push(task);
898
+ sections.push('');
899
+ }
900
+ if (context) {
901
+ sections.push('# ═══ CONTEXT ═══');
902
+ sections.push(context);
903
+ sections.push('');
904
+ }
905
+
906
+ // File contents — try HTTP API first, fallback to fs
907
+ for (const file of spec.loadedFiles) {
908
+ // Check exclusion
909
+ const basename = path.basename(file.entry, '.yaml');
910
+ if (exclude.includes(basename)) continue;
911
+
912
+ sections.push(`# ═══ ${file.entry} ═══`);
913
+
914
+ let content = null;
915
+
916
+ // Try filesystem first (fast path for dev environment)
917
+ if (file.exists) {
918
+ content = fs.readFileSync(file.path, 'utf8');
919
+ }
920
+
921
+ // Fallback: HTTP API when file not on disk (production — files encrypted in binary)
922
+ if (content === null && port) {
923
+ if (file.entry.startsWith('specialist/')) {
924
+ // specialist/Ansuz/rule.yaml → name=Ansuz, file=rule.yaml
925
+ const parts = file.entry.replace(/^specialist\//, '').split('/');
926
+ if (parts.length === 2) {
927
+ try {
928
+ content = await loadFromHTTP(port, parts[0], parts[1]);
929
+ } catch {
930
+ // HTTP failed
931
+ }
932
+ }
933
+ } else if (file.entry.startsWith('rule/')) {
934
+ // rule/code/style.yaml → path=code/style.yaml
935
+ const rulePath = file.entry.replace(/^rule\//, '');
936
+ try {
937
+ content = await loadRuleFromHTTP(port, rulePath);
938
+ } catch {
939
+ // HTTP failed
940
+ }
941
+ }
942
+ }
943
+
944
+ if (content === null) {
945
+ sections.push(`# [FILE NOT FOUND: ${file.path}]`);
946
+ sections.push('');
947
+ continue;
948
+ }
949
+
950
+ sections.push(content.trimEnd());
951
+ sections.push('');
952
+ }
953
+
954
+ // boot_rules — selectively inject rules declared in rule.yaml boot_rules field
955
+ // Replaces bulk .rule/general/ injection with a curated per-specialist list.
956
+ try {
957
+ const ruleYamlPath = path.join(spec.dir, 'rule.yaml');
958
+ if (fs.existsSync(ruleYamlPath)) {
959
+ const ruleContent = fs.readFileSync(ruleYamlPath, 'utf8');
960
+ const bootRules = extractList(ruleContent, 'boot_rules');
961
+
962
+ for (const ruleFile of bootRules) {
963
+ const rulePath = path.join(BASE_DIR, '.rule', 'general', ruleFile);
964
+ let content = null;
965
+
966
+ try {
967
+ content = fs.readFileSync(rulePath, 'utf8');
968
+ } catch {
969
+ // Fallback: HTTP API
970
+ if (port) {
971
+ try {
972
+ content = await loadRuleFromHTTP(port, `general/${ruleFile}`);
973
+ } catch {
974
+ // HTTP also failed
975
+ }
976
+ }
977
+ }
978
+
979
+ if (content !== null) {
980
+ sections.push(`# ═══ .rule/general/${ruleFile} ═══`);
981
+ sections.push(content.trimEnd());
982
+ sections.push('');
983
+ }
984
+ }
985
+ }
986
+ } catch {
987
+ // No rule.yaml or read error — silently skip
988
+ }
989
+
990
+ // Footer: identity reminder
991
+ sections.push(`You are now **${spec.name}**.`);
992
+
993
+ return sections.join('\n');
994
+ }
995
+
996
+ /** reference: return file-read instructions (like slash commands) */
997
+ function buildReferencePrompt(spec, { task, context, exclude }) {
998
+ const sections = [];
999
+
1000
+ sections.push(`Read and follow (按此順序):`);
1001
+ sections.push(`1. \`.specialist/${spec.name}/rule.yaml\` (定義 agent、載入清單、override_priority)`);
1002
+ sections.push(`2. 按 \`override_priority\` 載入:`);
1003
+
1004
+ for (const file of spec.loadedFiles) {
1005
+ const basename = path.basename(file.entry, '.yaml');
1006
+ if (exclude.includes(basename)) continue;
1007
+ if (file.entry.endsWith('rule.yaml')) continue; // already listed
1008
+ sections.push(` - \`.specialist/${file.entry.replace(/^specialist\//, '')}\``);
1009
+ }
1010
+
1011
+ sections.push('');
1012
+ sections.push(`當檔案內容衝突時,按 override_priority 數字小的優先(principles > rule > capability > workflow)。`);
1013
+
1014
+ if (task) {
1015
+ sections.push('');
1016
+ sections.push(`## Task`);
1017
+ sections.push(task);
1018
+ }
1019
+ if (context) {
1020
+ sections.push('');
1021
+ sections.push(`## Context`);
1022
+ sections.push(context);
1023
+ }
1024
+
1025
+ sections.push('');
1026
+ sections.push(`You are now **${spec.name}**.`);
1027
+
1028
+ return sections.join('\n');
1029
+ }
1030
+
1031
+ // ═══════════════════════════════════════
1032
+ // Hippocampus: Episodic Memory Recall
1033
+ // ═══════════════════════════════════════
1034
+
1035
+ /**
1036
+ * Recall the most recent episode from Hippocampus via MCP HTTP API.
1037
+ * Used in Ansuz prompt assembly to inject prior session context.
1038
+ * Graceful degradation: returns null if Dashboard/Hippocampus unavailable.
1039
+ * @param {number} limit - Max episodes to recall (default: 1)
1040
+ * @param {string|null} agentRole - Optional agent_role filter (e.g. 'ansuz', 'amelia').
1041
+ * When provided, only episodes with matching agent_role are returned.
1042
+ * When null, all episodes are returned (backwards compatible).
1043
+ * @returns {Promise<string|null>} Formatted episodic memory section, or null
1044
+ */
1045
+ function recallRecentEpisode(limit = 1, agentRole = null) {
1046
+ return new Promise((resolve) => {
1047
+ const recallArgs = { limit, projectPath: PROJECT_DIR };
1048
+ if (agentRole) recallArgs.agent_role = agentRole;
1049
+ const payload = JSON.stringify({
1050
+ jsonrpc: '2.0', id: 1,
1051
+ method: 'tools/call',
1052
+ params: { name: 'hippocampus_episode_recall', arguments: recallArgs },
1053
+ });
1054
+
1055
+ const req = http.request({
1056
+ hostname: '127.0.0.1', port: 18080, path: '/api/mcp',
1057
+ method: 'POST',
1058
+ headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload) },
1059
+ timeout: 5000,
1060
+ }, (res) => {
1061
+ let body = '';
1062
+ res.on('data', (c) => { body += c; });
1063
+ res.on('end', () => {
1064
+ try {
1065
+ const result = JSON.parse(body);
1066
+ const text = result?.result?.content?.find(c => c.type === 'text')?.text;
1067
+ if (!text) return resolve(null);
1068
+
1069
+ const data = JSON.parse(text);
1070
+ const episodes = data.episodes || [];
1071
+ if (episodes.length === 0) return resolve(null);
1072
+
1073
+ const lines = ['# ═══ Episodic Memory (from Hippocampus) ═══', ''];
1074
+ lines.push(`Last ${episodes.length} session(s):`);
1075
+ for (const ep of episodes) {
1076
+ const epData = ep.episode || ep;
1077
+ lines.push(`\n### ${epData.task_id || epData.id || 'unknown'}`);
1078
+ if (epData.summary) lines.push(epData.summary);
1079
+ if (epData.lesson) lines.push(`**Lesson**: ${epData.lesson}`);
1080
+ const entries = ep.entries || [];
1081
+ for (const entry of entries.slice(0, 5)) {
1082
+ lines.push(`- **${entry.phase || 'note'}**: ${entry.content || ''}`);
1083
+ }
1084
+ }
1085
+ resolve(lines.join('\n'));
1086
+ } catch {
1087
+ resolve(null);
1088
+ }
1089
+ });
1090
+ });
1091
+ req.on('error', () => resolve(null));
1092
+ req.on('timeout', () => { req.destroy(); resolve(null); });
1093
+ req.write(payload);
1094
+ req.end();
1095
+ });
1096
+ }
1097
+
1098
+ /**
1099
+ * Find the current Claude Code conversation JSONL file.
1100
+ * Claude Code writes real-time conversation data to:
1101
+ * ~/.claude/projects/{project-dir-hash}/{sessionId}.jsonl
1102
+ *
1103
+ * Strategy: find the most recently modified .jsonl in the project dir
1104
+ * that was updated within the last 30 seconds (we're being called from
1105
+ * within the active conversation, so it was just written to).
1106
+ *
1107
+ * @returns {string|null} Absolute path to the JSONL file, or null
1108
+ */
1109
+ function findConversationLog(projectDir) {
1110
+ try {
1111
+ const home = process.env.HOME || process.env.USERPROFILE;
1112
+ if (!home) return null;
1113
+
1114
+ const projectsDir = path.join(home, '.claude', 'projects');
1115
+ if (!fs.existsSync(projectsDir)) return null;
1116
+
1117
+ // Map project path to Claude Code dir name: replace :, \, / and spaces with -, lowercase drive
1118
+ // Claude Code CLI also replaces spaces with dashes (e.g. "Kenaz Dashboard" → "Kenaz-Dashboard")
1119
+ // Use projectDir (sub-project) when provided; fall back to BASE_DIR (core).
1120
+ const absProject = path.resolve(projectDir || BASE_DIR);
1121
+ const dirName = absProject
1122
+ .replace(/[:\\/\s]/g, '-') // D:\Projects\KenazAI → D--Projects-KenazAI, spaces → -
1123
+ .replace(/^([A-Z])/, (_, c) => c.toLowerCase()); // D → d
1124
+
1125
+ const TTL_MS = 4 * 60 * 60 * 1000; // 4h session TTL
1126
+ const now = Date.now();
1127
+
1128
+ // Scan a single project dir for fresh JSONLs
1129
+ function scanDir(dir) {
1130
+ if (!fs.existsSync(dir)) return [];
1131
+ return fs.readdirSync(dir)
1132
+ .filter(f => f.endsWith('.jsonl'))
1133
+ .map(f => {
1134
+ try {
1135
+ const stat = fs.statSync(path.join(dir, f));
1136
+ return { path: path.join(dir, f), mtime: stat.mtimeMs };
1137
+ } catch { return null; }
1138
+ })
1139
+ .filter(f => f && (now - f.mtime) < TTL_MS);
1140
+ }
1141
+
1142
+ // Primary: BASE_DIR project dir
1143
+ const primary = scanDir(path.join(projectsDir, dirName));
1144
+ if (primary.length > 0) {
1145
+ primary.sort((a, b) => b.mtime - a.mtime);
1146
+ return primary[0].path;
1147
+ }
1148
+
1149
+ // Sibling search: handles CWD-mismatch when Claude Code runs in a sub-project dir
1150
+ // (e.g. tauri:dev sets CWD to kenaz-core, JSONL lands in D--Projects-KenazAI-dashboard-...-kenaz-core)
1151
+ const prefix = dirName.toLowerCase();
1152
+ const siblings = [];
1153
+ for (const d of fs.readdirSync(projectsDir)) {
1154
+ if (d.toLowerCase() === prefix) continue; // already checked above
1155
+ if (!d.toLowerCase().startsWith(prefix)) continue;
1156
+ const sibDir = path.join(projectsDir, d);
1157
+ try {
1158
+ if (!fs.statSync(sibDir).isDirectory()) continue;
1159
+ siblings.push(...scanDir(sibDir));
1160
+ } catch {}
1161
+ }
1162
+ if (siblings.length > 0) {
1163
+ siblings.sort((a, b) => b.mtime - a.mtime);
1164
+ return siblings[0].path;
1165
+ }
1166
+
1167
+ return null;
1168
+ } catch {
1169
+ return null;
1170
+ }
1171
+ }
1172
+
1173
+ // ═══════════════════════════════════════
1174
+ // Session management
1175
+ // ═══════════════════════════════════════
1176
+
1177
+ function generateSessionId() {
1178
+ const ts = Date.now();
1179
+ const rand = Math.random().toString(36).substring(2, 8);
1180
+ return `session_${ts}_${rand}`;
1181
+ }
1182
+
1183
+ function ensureSessionDir() {
1184
+ if (!fs.existsSync(SESSION_DIR)) {
1185
+ fs.mkdirSync(SESSION_DIR, { recursive: true });
1186
+ }
1187
+ }
1188
+
1189
+ /**
1190
+ * ── Bifrost SessionStart Integration Point (TASK_1230) ──────────────────────
1191
+ *
1192
+ * startSession() is the canonical specialist-side startup integration point.
1193
+ * Bifrost callers (launch.js, session.js) MUST fire the SessionStart hook
1194
+ * BEFORE calling startSession() or assembling the prompt, so that:
1195
+ * 1. The hook fires before the first assistant output (ordering guarantee).
1196
+ * 2. sessionStartedAt is captured for use in the Stop payload.
1197
+ *
1198
+ * This function does NOT dispatch the SessionStart hook itself — that is the
1199
+ * responsibility of the Bifrost boundary (session.js / launch.js). The hook
1200
+ * fires in the transport layer; startSession() manages session metadata only.
1201
+ * ─────────────────────────────────────────────────────────────────────────────
1202
+ */
1203
+ async function startSession(name, options = {}) {
1204
+ const { consumer = 'cli', task = null, context = null, exclude = [], mode = 'assembled' } = options;
1205
+
1206
+ ensureSessionDir();
1207
+ const spec = await resolve(name);
1208
+ const sessionId = generateSessionId();
1209
+
1210
+ // Generate canary for this session
1211
+ const canaryModule = require('./canary');
1212
+ const canaryResult = canaryModule.generate({
1213
+ session: sessionId,
1214
+ specialist: spec.name,
1215
+ task: task || 'none',
1216
+ scope: spec.fileList.join(','),
1217
+ });
1218
+
1219
+ const prompt = await buildPrompt(name, { mode, task, context, exclude, canary: canaryResult });
1220
+
1221
+ const metadata = {
1222
+ id: sessionId,
1223
+ specialist: spec.name,
1224
+ purpose: spec.purpose,
1225
+ consumer,
1226
+ status: 'active',
1227
+ startedAt: new Date().toISOString(),
1228
+ endedAt: null,
1229
+ promptLength: prompt.length,
1230
+ canary: {
1231
+ id: canaryResult.canaryId,
1232
+ checksum: canaryResult.checksum,
1233
+ recoveryPath: canaryResult.recoveryFile,
1234
+ },
1235
+ };
1236
+
1237
+ fs.writeFileSync(
1238
+ path.join(SESSION_DIR, `${sessionId}.json`),
1239
+ JSON.stringify(metadata, null, 2),
1240
+ 'utf8'
1241
+ );
1242
+
1243
+ return { sessionId, prompt, metadata };
1244
+ }
1245
+
1246
+ /**
1247
+ * ── Bifrost Stop Integration Point (TASK_1230) ──────────────────────────────
1248
+ *
1249
+ * endSession() is the canonical specialist-side teardown integration point.
1250
+ * Bifrost callers MUST fire the Stop hook BEFORE calling endSession() so that:
1251
+ * 1. Stop is always the last lifecycle event (ordering guarantee).
1252
+ * 2. ended_at in the Stop payload is captured before session metadata is written.
1253
+ *
1254
+ * This function does NOT dispatch the Stop hook — that is the responsibility of
1255
+ * the Bifrost boundary (session.js relay.on('close') / launch.js codex.on('close')).
1256
+ *
1257
+ * Remaining fallback behavior (intentionally retained):
1258
+ * - session.js relay.on('error') calls cleanupSignal() only, does NOT call endSession().
1259
+ * If the relay fails to spawn, no session metadata record exists to end.
1260
+ * - SIGINT/SIGTERM handlers in launch.js call cleanup() only (no Stop hook — the
1261
+ * session may not have started yet, and signal handlers are synchronous).
1262
+ * ─────────────────────────────────────────────────────────────────────────────
1263
+ */
1264
+ function endSession(sessionId) {
1265
+ const file = path.join(SESSION_DIR, `${sessionId}.json`);
1266
+ if (!fs.existsSync(file)) {
1267
+ throw new Error(`Session not found: ${sessionId}`);
1268
+ }
1269
+
1270
+ const metadata = JSON.parse(fs.readFileSync(file, 'utf8'));
1271
+ metadata.status = 'ended';
1272
+ metadata.endedAt = new Date().toISOString();
1273
+ fs.writeFileSync(file, JSON.stringify(metadata, null, 2), 'utf8');
1274
+
1275
+ // Write Ansuz state on session end (TASK_899/922) — bump last_active + session_count
1276
+ if ((metadata.specialist || '').toLowerCase() === 'ansuz') {
1277
+ try {
1278
+ const ansuzState = require('../Ansuz/tools/ansuz-state');
1279
+ ansuzState.writeState(BASE_DIR, {});
1280
+ } catch (e) {
1281
+ // Non-fatal — state write failure should not block session end
1282
+ console.error('[session] ansuz-state writeState failed (non-fatal):', e.message);
1283
+ }
1284
+ }
1285
+
1286
+ // Identity verification scoring (TASK_1080) — non-blocking, surfaces on session end
1287
+ // Evaluates structural identity checks + session-trace markers against identity_contract.yaml
1288
+ try {
1289
+ const scorer = require('./identity-scorer');
1290
+ const verifyResult = scorer.score(metadata.specialist || 'Ansuz', {
1291
+ sessionId,
1292
+ projectPath: BASE_DIR,
1293
+ });
1294
+ // Write verification result to session chart (TASK_2163: keyed by project identity).
1295
+ const chartPath = chartPathLib.getChartReadPath(sessionId, { projectPath: PROJECT_DIR });
1296
+ let chart = { session_id: sessionId, specialist: metadata.specialist };
1297
+ if (fs.existsSync(chartPath)) {
1298
+ try { chart = JSON.parse(fs.readFileSync(chartPath, 'utf8')); } catch {}
1299
+ }
1300
+ if (!Array.isArray(chart.identity_verifications)) chart.identity_verifications = [];
1301
+ chart.identity_verifications.push(verifyResult);
1302
+ chartPathLib.ensureChartDir(chartPath);
1303
+ fs.writeFileSync(chartPath, JSON.stringify(chart, null, 2), 'utf8');
1304
+ // Surface verdict to console (stderr — non-blocking)
1305
+ const icon = verifyResult.verdict === 'PASS' ? '✅' : verifyResult.verdict === 'WARN' ? '⚠️' : '🚨';
1306
+ console.error(`${icon} [identity-verification] ${verifyResult.specialist}: ${verifyResult.verdict} — ${verifyResult.summary}`);
1307
+ } catch (e) {
1308
+ // Non-fatal — verification failure does not block session end
1309
+ console.error('[identity-verification] scoring failed (non-fatal):', e.message);
1310
+ }
1311
+
1312
+ return metadata;
1313
+ }
1314
+
1315
+ function getActiveSessions() {
1316
+ ensureSessionDir();
1317
+ const files = fs.readdirSync(SESSION_DIR).filter(f => f.endsWith('.json'));
1318
+ const active = [];
1319
+
1320
+ for (const f of files) {
1321
+ const metadata = JSON.parse(fs.readFileSync(path.join(SESSION_DIR, f), 'utf8'));
1322
+ if (metadata.status === 'active') active.push(metadata);
1323
+ }
1324
+
1325
+ return active;
1326
+ }
1327
+
1328
+ function cleanSessions(options = {}) {
1329
+ const { keep = 5 } = options;
1330
+ ensureSessionDir();
1331
+
1332
+ const files = fs.readdirSync(SESSION_DIR)
1333
+ .filter(f => f.endsWith('.json'))
1334
+ .map(f => ({
1335
+ name: f,
1336
+ path: path.join(SESSION_DIR, f),
1337
+ mtime: fs.statSync(path.join(SESSION_DIR, f)).mtimeMs,
1338
+ }))
1339
+ .sort((a, b) => b.mtime - a.mtime);
1340
+
1341
+ const toRemove = files.slice(keep);
1342
+ for (const f of toRemove) {
1343
+ fs.unlinkSync(f.path);
1344
+ }
1345
+
1346
+ return { kept: Math.min(files.length, keep), removed: toRemove.length };
1347
+ }
1348
+
1349
+ // ═══════════════════════════════════════
1350
+ // Orphan cleanup (Windows)
1351
+ // ═══════════════════════════════════════
1352
+
1353
+ /**
1354
+ * Decide, for each claude.exe process on the machine, whether it is a
1355
+ * Formation-dispatch child that has genuinely lost its owner.
1356
+ *
1357
+ * Detection strategy (ownership, NOT age — TASK_1917):
1358
+ * 1. Process name is claude.exe.
1359
+ * 2. NOT the current process or its parent/grandparent (self-protection).
1360
+ * 3. NOT a VSCode extension host process (--permission-prompt-tool in cmdline).
1361
+ * 4. Positively matched to a pid recorded in .formation/.active-dispatches.json —
1362
+ * either directly (registry pid === this claude.exe's own pid — the case
1363
+ * when `claude` resolves to a .exe and runner.js spawns with shell:false,
1364
+ * verified empirically on 2026-08-30: `where claude` picks the .exe first)
1365
+ * or via one level of indirection (registry pid === this claude.exe's
1366
+ * ParentProcessId — the case when spawn used shell:true and cmd.exe wraps
1367
+ * the real process). A claude.exe that cannot be matched to ANY registry
1368
+ * entry is NEVER a kill candidate, no matter how long it has run — this
1369
+ * is what stops the check from taking down interactive sessions the
1370
+ * dispatcher never spawned, and it holds even if staleHours-style knobs
1371
+ * are reintroduced elsewhere.
1372
+ * 5. Confirmed orphaned: the process that spawned the matched registry pid —
1373
+ * i.e. that pid's OWN parent, because child_process.spawn() makes the
1374
+ * calling Node process the direct OS parent of whatever it launches — is
1375
+ * no longer alive. If that supervisor (Formation's headless.js/node
1376
+ * process) is still running, the dispatch is still supervised and is
1377
+ * left alone regardless of elapsed time. Fail-closed when supervisor
1378
+ * liveness cannot even be determined (the matched registry pid's own
1379
+ * process record is missing from the snapshot, e.g. a cmd.exe wrapper
1380
+ * that already exited): reason `supervisor_unknown`, action `skipped`
1381
+ * — never treated as proof of orphanhood, because Windows recycles PIDs
1382
+ * and a missing record is not the same evidence as a confirmed-dead one.
1383
+ *
1384
+ * classifyOrphanCandidates() is exported standalone (not inlined) so this
1385
+ * decision logic can be exercised with synthetic process/registry data in
1386
+ * tests — the exact function production calls, not a parallel reimplementation.
1387
+ *
1388
+ * @param {object} params
1389
+ * @param {Array<{pid:number, ppid:number|null, name:string, cmdline:string, createdAt:number}>} params.allProcs
1390
+ * @param {Array<{pid:number|null}>} params.registryEntries - parsed .active-dispatches.json
1391
+ * @param {Set<number>} params.selfPids - PIDs to always protect (self/parent/grandparent)
1392
+ * @param {(pid:number)=>boolean} params.isProcessAlive
1393
+ * @returns {Array<{pid:number, ageHours:string, cmdline:string, action:'skipped'|'would_kill', reason:string}>}
1394
+ */
1395
+ function classifyOrphanCandidates({ allProcs, registryEntries, selfPids, isProcessAlive }) {
1396
+ const byPid = new Map(allProcs.map(p => [p.pid, p]));
1397
+ const registryPids = new Set(
1398
+ (registryEntries || []).filter(d => d && d.pid != null).map(d => d.pid)
1399
+ );
1400
+
1401
+ const now = Date.now();
1402
+ const results = [];
1403
+
1404
+ for (const proc of allProcs) {
1405
+ if (proc.name !== 'claude.exe') continue;
1406
+
1407
+ const ageHours = proc.createdAt > 0 ? ((now - proc.createdAt) / 3600000).toFixed(1) : '?';
1408
+ const base = { pid: proc.pid, ageHours, cmdline: (proc.cmdline || '').slice(0, 120) };
1409
+
1410
+ if (selfPids.has(proc.pid)) {
1411
+ results.push({ ...base, action: 'skipped', reason: 'self_or_ancestor' });
1412
+ continue;
1413
+ }
1414
+
1415
+ if ((proc.cmdline || '').includes('--permission-prompt-tool')) {
1416
+ results.push({ ...base, action: 'skipped', reason: 'vscode_extension' });
1417
+ continue;
1418
+ }
1419
+
1420
+ // Ownership match: direct or one-level indirect (cmd.exe wrapper).
1421
+ let ownerRegistryPid = null;
1422
+ if (registryPids.has(proc.pid)) {
1423
+ ownerRegistryPid = proc.pid;
1424
+ } else if (proc.ppid != null && registryPids.has(proc.ppid)) {
1425
+ ownerRegistryPid = proc.ppid;
1426
+ }
1427
+
1428
+ if (ownerRegistryPid === null) {
1429
+ // Not provably a Formation-dispatch child. Never kill on age alone —
1430
+ // this is the exact condition that used to taskkill interactive
1431
+ // sessions (pre-TASK_1917 behavior).
1432
+ results.push({ ...base, action: 'skipped', reason: 'not_dispatch_owned' });
1433
+ continue;
1434
+ }
1435
+
1436
+ const ownerProc = byPid.get(ownerRegistryPid);
1437
+ const supervisorPid = ownerProc ? ownerProc.ppid : null;
1438
+
1439
+ // Fail-closed (TASK_1917 review round 2): if the matched registry pid's
1440
+ // own process record is missing from this snapshot (ownerProc undefined)
1441
+ // — e.g. a cmd.exe wrapper that has already exited while its claude.exe
1442
+ // child survives — we have NO supervisor pid to check at all. Windows
1443
+ // recycles PIDs aggressively (the very reason the old code protected
1444
+ // grandparent, not just parent), so a stale registry.pid that happens to
1445
+ // collide with a *recycled, currently-dead* PID must NOT be treated as
1446
+ // proof of orphanhood. Actually implemented as skip, not merely commented
1447
+ // as one: an earlier draft of this branch left `supervisorPid == null`
1448
+ // falling through to would_kill despite this same comment claiming
1449
+ // fail-closed — that was the exact "doc says one thing, code does the
1450
+ // opposite" defect this task exists to eliminate, caught in review.
1451
+ if (supervisorPid == null) {
1452
+ results.push({ ...base, action: 'skipped', reason: 'supervisor_unknown', ownerRegistryPid });
1453
+ continue;
1454
+ }
1455
+
1456
+ const supervisorAlive = isProcessAlive(supervisorPid);
1457
+ if (supervisorAlive) {
1458
+ results.push({ ...base, action: 'skipped', reason: 'supervisor_alive', ownerRegistryPid, supervisorPid });
1459
+ continue;
1460
+ }
1461
+
1462
+ results.push({ ...base, action: 'would_kill', reason: 'orphaned_dispatch_child', ownerRegistryPid, supervisorPid });
1463
+ }
1464
+
1465
+ return results;
1466
+ }
1467
+
1468
+ /**
1469
+ * Run a PowerShell CIM process query and return parsed process records.
1470
+ *
1471
+ * Replaces the legacy `wmic` invocation: wmic.exe does not exist on this
1472
+ * machine (Windows 11 10.0.26200 — Microsoft has been removing it from
1473
+ * Windows builds) and calling it here silently no-ops via the catch block,
1474
+ * which would make the whole ownership check a no-op too (found:0 forever —
1475
+ * a fourth Decorative Guard). Get-CimInstance Win32_Process is the supported
1476
+ * successor and is present on this host (verified 2026-08-30). Output is
1477
+ * emitted as JSON (not CSV) because CommandLine routinely contains commas,
1478
+ * which the old CSV split(',') hack only worked around by assuming exactly
1479
+ * two trailing numeric/date columns — JSON has no such fragility.
1480
+ *
1481
+ * @returns {Array<{pid:number, ppid:number|null, name:string, cmdline:string, createdAt:number}>}
1482
+ */
1483
+ function queryAllProcesses() {
1484
+ const { execSync } = require('child_process');
1485
+ const psScript = [
1486
+ "$procs = @(Get-CimInstance Win32_Process | Select-Object ProcessId, ParentProcessId, Name,",
1487
+ " @{N='CreationDate'; E={ if ($_.CreationDate) { $_.CreationDate.ToString('yyyyMMddHHmmss') } else { '' } }},",
1488
+ " CommandLine)",
1489
+ "ConvertTo-Json -InputObject $procs -Compress",
1490
+ ].join('\n');
1491
+ // -EncodedCommand (UTF-16LE base64) sidesteps cmd.exe/PowerShell quoting
1492
+ // hazards entirely — no risk of a CommandLine value in the script itself
1493
+ // breaking out of nested quotes.
1494
+ const encoded = Buffer.from(psScript, 'utf16le').toString('base64');
1495
+ const raw = execSync(
1496
+ `powershell -NoProfile -NonInteractive -EncodedCommand ${encoded}`,
1497
+ { encoding: 'utf8', timeout: 20000, stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true, maxBuffer: 32 * 1024 * 1024 }
1498
+ );
1499
+ let parsed = JSON.parse(raw);
1500
+ if (!Array.isArray(parsed)) parsed = [parsed]; // single result: PowerShell unwraps 1-element arrays
1501
+
1502
+ const out = [];
1503
+ for (const p of parsed) {
1504
+ if (!p || typeof p.ProcessId !== 'number') continue;
1505
+ let createdAt = 0;
1506
+ if (p.CreationDate) {
1507
+ const m = String(p.CreationDate).match(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/);
1508
+ if (m) createdAt = new Date(`${m[1]}-${m[2]}-${m[3]}T${m[4]}:${m[5]}:${m[6]}`).getTime();
1509
+ }
1510
+ out.push({
1511
+ pid: p.ProcessId,
1512
+ ppid: typeof p.ParentProcessId === 'number' ? p.ParentProcessId : null,
1513
+ name: p.Name || '',
1514
+ cmdline: p.CommandLine || '',
1515
+ createdAt,
1516
+ });
1517
+ }
1518
+ return out;
1519
+ }
1520
+
1521
+ /**
1522
+ * Detect (and optionally kill) orphaned Formation-dispatch claude.exe
1523
+ * processes on Windows. See classifyOrphanCandidates() for the decision
1524
+ * logic — this function only gathers real process/registry data and applies it.
1525
+ *
1526
+ * @param {object} [options]
1527
+ * @param {boolean} [options.dryRun=false] - List orphans without killing
1528
+ * @returns {{ found: number, killed: number, skipped: number, details: object[] }}
1529
+ */
1530
+ function cleanOrphanedClaude(options = {}) {
1531
+ const { dryRun = false } = options;
1532
+ if (process.platform !== 'win32') {
1533
+ return { found: 0, killed: 0, skipped: 0, details: [] };
1534
+ }
1535
+
1536
+ const { execSync } = require('child_process');
1537
+ const result = { found: 0, killed: 0, skipped: 0, details: [] };
1538
+
1539
+ // 1. Full process snapshot (need ParentProcessId for both the cmd.exe-wrapper
1540
+ // ownership match and the supervisor-liveness check).
1541
+ let allProcs;
1542
+ try {
1543
+ allProcs = queryAllProcesses();
1544
+ } catch {
1545
+ return result;
1546
+ }
1547
+ result.found = allProcs.filter(p => p.name === 'claude.exe').length;
1548
+
1549
+ // 2. Dispatch registry. Missing file = no in-flight dispatches, which is
1550
+ // the normal post-unregisterDispatch state, not corruption.
1551
+ let readActiveDispatches;
1552
+ let isProcessAlive;
1553
+ try {
1554
+ ({ readActiveDispatches, isProcessAlive } = require(path.join(BASE_DIR, '.formation', 'tools', 'dispatch-registry.js')));
1555
+ } catch {
1556
+ readActiveDispatches = () => {
1557
+ try {
1558
+ const dispatchFile = path.join(BASE_DIR, '.formation', '.active-dispatches.json');
1559
+ if (!fs.existsSync(dispatchFile)) return [];
1560
+ const parsed = JSON.parse(fs.readFileSync(dispatchFile, 'utf8'));
1561
+ return Array.isArray(parsed) ? parsed : [];
1562
+ } catch { return []; }
1563
+ };
1564
+ isProcessAlive = (pid) => {
1565
+ try { process.kill(pid, 0); return true; } catch { return false; }
1566
+ };
1567
+ }
1568
+ let registryEntries = [];
1569
+ try { registryEntries = readActiveDispatches() || []; } catch { registryEntries = []; }
1570
+
1571
+ // 3. Self ancestry — never touch this process or its parent/grandparent.
1572
+ const selfPids = new Set([process.pid]);
1573
+ if (process.ppid) selfPids.add(process.ppid);
1574
+ const selfParentProc = allProcs.find(p => p.pid === process.ppid);
1575
+ if (selfParentProc && selfParentProc.ppid != null) selfPids.add(selfParentProc.ppid);
1576
+
1577
+ const classified = classifyOrphanCandidates({ allProcs, registryEntries, selfPids, isProcessAlive });
1578
+
1579
+ for (const c of classified) {
1580
+ if (c.action !== 'would_kill') {
1581
+ result.skipped++;
1582
+ continue;
1583
+ }
1584
+
1585
+ const detail = { pid: c.pid, ageHours: c.ageHours, cmdline: c.cmdline };
1586
+ if (dryRun) {
1587
+ detail.action = 'would_kill';
1588
+ } else {
1589
+ try {
1590
+ execSync(`taskkill /F /PID ${c.pid}`, { timeout: 10000, stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true });
1591
+ detail.action = 'killed';
1592
+ result.killed++;
1593
+ } catch {
1594
+ detail.action = 'kill_failed';
1595
+ }
1596
+ }
1597
+ result.details.push(detail);
1598
+ }
1599
+
1600
+ return result;
1601
+ }
1602
+
1603
+ // ═══════════════════════════════════════
1604
+ // CLI
1605
+ // ═══════════════════════════════════════
1606
+
1607
+ function parseCliArgs(argv) {
1608
+ const args = argv.slice(2);
1609
+ const command = args[0];
1610
+ const positional = [];
1611
+ const flags = {};
1612
+
1613
+ for (let i = 1; i < args.length; i++) {
1614
+ const m = args[i].match(/^--([^=]+)(?:=(.*))?$/);
1615
+ if (m) {
1616
+ if (m[2] !== undefined) {
1617
+ // --flag=value form: value captured by regex
1618
+ flags[m[1]] = m[2];
1619
+ } else if (i + 1 < args.length && !args[i + 1].startsWith('--')) {
1620
+ // --flag value form: consume next token as value
1621
+ flags[m[1]] = args[i + 1];
1622
+ i++;
1623
+ } else {
1624
+ // Boolean flag (no value follows)
1625
+ flags[m[1]] = true;
1626
+ }
1627
+ } else {
1628
+ positional.push(args[i]);
1629
+ }
1630
+ }
1631
+
1632
+ return { command, positional, flags };
1633
+ }
1634
+
1635
+ async function cli() {
1636
+ const { command, positional, flags } = parseCliArgs(process.argv);
1637
+ const json = flags.json === true;
1638
+
1639
+ try {
1640
+ switch (command) {
1641
+ case 'list': {
1642
+ const result = list();
1643
+ if (json) {
1644
+ console.log(JSON.stringify(result, null, 2));
1645
+ } else {
1646
+ if (result.length === 0) {
1647
+ console.log('No specialists found.');
1648
+ } else {
1649
+ for (const s of result) {
1650
+ console.log(` ${s.name} (v${s.version}) — ${s.purpose}`);
1651
+ }
1652
+ }
1653
+ }
1654
+ break;
1655
+ }
1656
+
1657
+ case 'resolve': {
1658
+ const name = positional[0];
1659
+ if (!name) { console.error('Usage: session.js resolve <name>'); process.exit(1); }
1660
+ const result = await resolve(name);
1661
+ if (json) {
1662
+ console.log(JSON.stringify(result, null, 2));
1663
+ } else {
1664
+ console.log(`${result.name} v${result.version}`);
1665
+ console.log(`Purpose: ${result.purpose}`);
1666
+ console.log(`Dir: ${result.dir}`);
1667
+ console.log(`Files:`);
1668
+ for (const f of result.loadedFiles) {
1669
+ console.log(` ${f.exists ? '✅' : '❌'} ${f.entry}`);
1670
+ }
1671
+ if (result.exitTriggers.length) {
1672
+ console.log(`Exit: ${result.exitTriggers.join(', ')}`);
1673
+ }
1674
+ }
1675
+ break;
1676
+ }
1677
+
1678
+ case 'prompt': {
1679
+ const name = positional[0];
1680
+ if (!name) { console.error('Usage: session.js prompt <name> [--mode=assembled|reference] [--source=plugin]'); process.exit(1); }
1681
+ const mode = flags.mode || 'assembled';
1682
+ const exclude = flags.exclude ? flags.exclude.split(',') : [];
1683
+ const source = flags.source || null;
1684
+ const depth = flags.depth || null;
1685
+ let prompt = await buildPrompt(name, { mode, task: flags.task, context: flags.context, exclude, source, depth,
1686
+ externalBootContext: flags['external-boot-context'] === true });
1687
+
1688
+ // Inject the most recent episode as prior-session context for interactive boots.
1689
+ // --no-episode (legacy alias --no-muninn, still passed by k-cli): skip it for
1690
+ // headless/programmatic callers (e.g. kenaz_specialist_dispatch).
1691
+ if (EPISODE_SPECIALISTS.includes(name) && mode === 'assembled' && !flags['no-episode'] && !flags['no-muninn']) {
1692
+ // TASK_2218: the real project pin is written by .claude/hooks/ansuz-session-pin.js,
1693
+ // keyed by the hook-payload session_id -- nothing is pinned here.
1694
+
1695
+ // Prompt injection: skip in lean modes to keep prompt lean.
1696
+ if (depth !== 'kernel' && depth !== 'capsule' && depth !== 'elixir') {
1697
+ // Hippocampus: inject most recent episode as prior session context
1698
+ const episodicMemory = await recallRecentEpisode(1, name.toLowerCase());
1699
+ if (episodicMemory) {
1700
+ prompt += `\n\n${episodicMemory}\n`;
1701
+ }
1702
+ }
1703
+ }
1704
+
1705
+ console.log(prompt);
1706
+ break;
1707
+ }
1708
+
1709
+ case 'start': {
1710
+ const name = positional[0];
1711
+ if (!name) { console.error('Usage: session.js start <name> [--consumer=...]'); process.exit(1); }
1712
+ const exclude = flags.exclude ? flags.exclude.split(',') : [];
1713
+ const result = await startSession(name, {
1714
+ consumer: flags.consumer || 'cli',
1715
+ task: flags.task,
1716
+ context: flags.context,
1717
+ exclude,
1718
+ mode: flags.mode || 'assembled',
1719
+ });
1720
+ if (json || flags['with-prompt']) {
1721
+ const out = json
1722
+ ? JSON.stringify(flags['with-prompt'] ? result : result.metadata, null, 2)
1723
+ : `Session: ${result.sessionId}\n\n${result.prompt}`;
1724
+ console.log(out);
1725
+ } else {
1726
+ console.log(`✅ Session started: ${result.sessionId}`);
1727
+ console.log(` Specialist: ${result.metadata.specialist}`);
1728
+ console.log(` Consumer: ${result.metadata.consumer}`);
1729
+ console.log(` Prompt length: ${result.metadata.promptLength} chars`);
1730
+ }
1731
+ break;
1732
+ }
1733
+
1734
+ case 'end': {
1735
+ const sessionId = positional[0];
1736
+ if (!sessionId) { console.error('Usage: session.js end <sessionId>'); process.exit(1); }
1737
+ const result = endSession(sessionId);
1738
+ if (json) {
1739
+ console.log(JSON.stringify(result, null, 2));
1740
+ } else {
1741
+ console.log(`✅ Session ended: ${result.id}`);
1742
+ }
1743
+ break;
1744
+ }
1745
+
1746
+ case 'active': {
1747
+ const result = getActiveSessions();
1748
+ if (json) {
1749
+ console.log(JSON.stringify(result, null, 2));
1750
+ } else {
1751
+ if (result.length === 0) {
1752
+ console.log('No active sessions.');
1753
+ } else {
1754
+ for (const s of result) {
1755
+ console.log(` ${s.id} | ${s.specialist} | ${s.consumer} | ${s.startedAt}`);
1756
+ }
1757
+ }
1758
+ }
1759
+ break;
1760
+ }
1761
+
1762
+ case 'clean': {
1763
+ const keep = parseInt(flags.keep, 10) || 5;
1764
+ const result = cleanSessions({ keep });
1765
+ console.log(`✅ Kept ${result.kept}, removed ${result.removed}`);
1766
+ break;
1767
+ }
1768
+
1769
+ case 'stop': {
1770
+ // No-op since the Muninn watcher was retired (TASK_2345); kept so a Stop hook that
1771
+ // still calls `session.js stop` exits 0 instead of failing.
1772
+ break;
1773
+ }
1774
+
1775
+ case 'verify': {
1776
+ const verifyName = positional[0];
1777
+ if (!verifyName) {
1778
+ console.error('Usage: session.js verify <specialistName> [--session=<id>] [--json] [--verbose]');
1779
+ process.exit(1);
1780
+ }
1781
+ const verifySessionId = flags.session || null;
1782
+ const verboseMode = flags.verbose === true;
1783
+ const scorer = require('./identity-scorer');
1784
+ const verifyResult = scorer.score(verifyName, { sessionId: verifySessionId, projectPath: BASE_DIR, verbose: verboseMode });
1785
+ if (json) {
1786
+ console.log(JSON.stringify(verifyResult, null, 2));
1787
+ } else {
1788
+ console.log(scorer.formatReport(verifyResult));
1789
+ }
1790
+ if (verifyResult.verdict === 'IDENTITY_DRIFT') process.exit(1);
1791
+ if (verifyResult.verdict === 'WARN') process.exit(2);
1792
+ break;
1793
+ }
1794
+
1795
+ case 'clean-orphans': {
1796
+ const dryRun = flags['dry-run'] === true;
1797
+ const result = cleanOrphanedClaude({ dryRun });
1798
+ if (json) {
1799
+ console.log(JSON.stringify(result, null, 2));
1800
+ } else {
1801
+ console.log(`🔍 Found ${result.found} claude.exe process(es), ${result.skipped} skipped (healthy)`);
1802
+ if (result.details.length === 0) {
1803
+ console.log('✅ No orphans detected.');
1804
+ } else {
1805
+ for (const d of result.details) {
1806
+ console.log(` ${d.action === 'killed' ? '💀' : '👻'} PID ${d.pid} (${d.ageHours}h old) — ${d.action}`);
1807
+ console.log(` ${d.cmdline}`);
1808
+ }
1809
+ if (dryRun) {
1810
+ console.log(`\n⚠️ Dry run — ${result.details.length} orphan(s) found. Run without --dry-run to kill.`);
1811
+ } else {
1812
+ console.log(`\n✅ Killed ${result.killed} orphan(s).`);
1813
+ }
1814
+ }
1815
+ }
1816
+ break;
1817
+ }
1818
+
1819
+ default:
1820
+ console.log('Specialist Session Manager');
1821
+ console.log('');
1822
+ console.log('Commands:');
1823
+ console.log(' list List all specialists');
1824
+ console.log(' resolve <name> Show specialist config');
1825
+ console.log(' prompt <name> Generate prompt');
1826
+ console.log(' start <name> Start a session');
1827
+ console.log(' end <sessionId> End a session');
1828
+ console.log(' active List active sessions');
1829
+ console.log(' clean [--keep=5] Clean old sessions');
1830
+ console.log(' clean-orphans [--dry-run] Kill orphaned claude.exe processes');
1831
+ console.log(' stop Write .shutdown signal (Claude Stop hook)');
1832
+ console.log(' verify <name> Run identity verification for specialist');
1833
+ process.exit(command ? 1 : 0);
1834
+ }
1835
+ } catch (err) {
1836
+ console.error(`❌ ${err.message}`);
1837
+ process.exit(1);
1838
+ }
1839
+ }
1840
+
1841
+ // ═══════════════════════════════════════
1842
+ // Entry point
1843
+ // ═══════════════════════════════════════
1844
+
1845
+ if (require.main === module) {
1846
+ cli().catch(err => {
1847
+ console.error(`❌ ${err.message}`);
1848
+ process.exit(1);
1849
+ });
1850
+ } else {
1851
+ module.exports = {
1852
+ list,
1853
+ resolve,
1854
+ buildPrompt,
1855
+ startSession,
1856
+ endSession,
1857
+ getActiveSessions,
1858
+ cleanSessions,
1859
+ cleanOrphanedClaude,
1860
+ classifyOrphanCandidates, // exported for testing (TASK_1917) — same function production uses
1861
+ recallRecentEpisode,
1862
+ findConversationLog,
1863
+ // Identity verification (TASK_1080)
1864
+ identityScore: (name, opts) => require('./identity-scorer').score(name, { projectPath: BASE_DIR, ...opts }),
1865
+ };
1866
+ }