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,2021 @@
1
+ # ============================================================
2
+ # Multi-Agent Parallel Scheduler
3
+ # ============================================================
4
+ # 啟動多個 Claude Agent 並行開發
5
+ # - 自動分配無衝突的任務給多個 Agent
6
+ # - 使用路徑鎖定防止衝突
7
+ # - 每個 Agent 在獨立 Branch 工作
8
+ # ============================================================
9
+
10
+ param(
11
+ [int]$MaxAgents = 3, # 最大並行 Agent 數量
12
+ [int]$PollIntervalSeconds = 30, # 輪詢間隔
13
+ [int]$TaskTimeoutMinutes = 60, # 單任務超時
14
+ [switch]$DryRun, # 模擬運行(不實際啟動)
15
+ [switch]$SingleRun, # 單次運行(不循環)
16
+ [string]$WorkingDirectory, # 工作目錄
17
+ [switch]$nopause, # 從 Tauri 調用時使用(跳過暫停)
18
+ [switch]$Standalone # 獨立模式:忽略 Dashboard heartbeat,適合開發 Tauri 本身時使用
19
+ )
20
+
21
+ # Helper function to normalize Windows extended path format (\\?\)
22
+ function Get-NormalizedPath {
23
+ param([string]$Path)
24
+ if ($Path -and $Path.StartsWith("\\?\")) {
25
+ return $Path.Substring(4)
26
+ }
27
+ return $Path
28
+ }
29
+
30
+ # Use KENAZ_PROJECT_PATH env var if WorkingDirectory not specified
31
+ if (-not $WorkingDirectory) {
32
+ if ($env:KENAZ_PROJECT_PATH) {
33
+ $WorkingDirectory = $env:KENAZ_PROJECT_PATH
34
+ } else {
35
+ $WorkingDirectory = (Get-Location).Path
36
+ }
37
+ }
38
+
39
+ # Normalize WorkingDirectory to handle \\?\ prefix from Tauri
40
+ $WorkingDirectory = Get-NormalizedPath $WorkingDirectory
41
+
42
+ # === STARTUP DEBUG LOG ===
43
+ # Write startup info to a debug file for troubleshooting Tauri execution issues
44
+ $StartupDebugFile = Join-Path $WorkingDirectory "multi_agent_startup.log"
45
+
46
+ # Helper function to append to debug log
47
+ function Write-DebugLog {
48
+ param([string]$Message, [string]$Level = "INFO")
49
+ $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
50
+ $logLine = "[$timestamp] [$Level] $Message"
51
+ try {
52
+ Add-Content -Path $StartupDebugFile -Value $logLine -Encoding UTF8 -ErrorAction SilentlyContinue
53
+ } catch { }
54
+ if ($Level -eq "ERROR") {
55
+ Write-Host $logLine -ForegroundColor Red
56
+ }
57
+ }
58
+
59
+ try {
60
+ $startupInfo = @"
61
+ === Multi-Agent Scheduler Startup ===
62
+ Time: $(Get-Date -Format "yyyy-MM-dd HH:mm:ss")
63
+ WorkingDirectory (raw param): $($PSBoundParameters['WorkingDirectory'])
64
+ WorkingDirectory (normalized): $WorkingDirectory
65
+ KENAZ_PROJECT_PATH env: $($env:KENAZ_PROJECT_PATH)
66
+ Script Path: $($MyInvocation.MyCommand.Path)
67
+ Script Directory: $(Split-Path -Parent $MyInvocation.MyCommand.Path)
68
+ PowerShell Version: $($PSVersionTable.PSVersion)
69
+ OS: $($PSVersionTable.OS)
70
+ Platform: $($PSVersionTable.Platform)
71
+ Arguments: $($args -join ' ')
72
+ nopause: $nopause
73
+ DryRun: $DryRun
74
+ SingleRun: $SingleRun
75
+ Standalone: $Standalone
76
+ MaxAgents: $MaxAgents
77
+ PollIntervalSeconds: $PollIntervalSeconds
78
+ TaskTimeoutMinutes: $TaskTimeoutMinutes
79
+
80
+ === Path Checks ===
81
+ WorkingDirectory exists: $(Test-Path $WorkingDirectory)
82
+ dev folder exists: $(Test-Path (Join-Path $WorkingDirectory 'dev'))
83
+ dev/pipeline exists: $(Test-Path (Join-Path $WorkingDirectory 'dev\pipeline'))
84
+ dev/scripts exists: $(Test-Path (Join-Path $WorkingDirectory 'dev\scripts'))
85
+ TASK_QUEUE.json exists: $(Test-Path (Join-Path $WorkingDirectory 'dev\pipeline\TASK_QUEUE.json'))
86
+
87
+ === Environment Variables ===
88
+ PATH (first 500 chars): $($env:PATH.Substring(0, [Math]::Min(500, $env:PATH.Length)))
89
+
90
+ === Execution Log ===
91
+ "@
92
+ # Ensure directory exists
93
+ $debugDir = Split-Path $StartupDebugFile -Parent
94
+ if (-not (Test-Path $debugDir)) {
95
+ New-Item -ItemType Directory -Path $debugDir -Force | Out-Null
96
+ }
97
+ Set-Content -Path $StartupDebugFile -Value $startupInfo -Encoding UTF8
98
+ Write-Host "[DEBUG] Startup log written to: $StartupDebugFile" -ForegroundColor DarkGray
99
+ } catch {
100
+ Write-Host "[DEBUG] Failed to write startup log: $_" -ForegroundColor Yellow
101
+ }
102
+ # === END STARTUP DEBUG LOG ===
103
+
104
+ # 檢測是否在交互式控制台
105
+ $script:IsInteractiveConsole = $false
106
+ try {
107
+ $null = [Console]::CursorTop
108
+ $script:IsInteractiveConsole = $true
109
+ } catch {
110
+ $script:IsInteractiveConsole = $false
111
+ }
112
+
113
+ # Standalone 模式(忽略 Dashboard heartbeat)
114
+ $script:StandaloneMode = $Standalone
115
+
116
+ # 在 Standalone 模式下,刪除舊的 heartbeat 文件避免混淆
117
+ if ($Standalone) {
118
+ $heartbeatPath = Join-Path $WorkingDirectory "dev\pipeline\DASHBOARD_HEARTBEAT.json"
119
+ if (Test-Path $heartbeatPath) {
120
+ Remove-Item $heartbeatPath -Force -ErrorAction SilentlyContinue
121
+ Write-Host "[STANDALONE] Removed old heartbeat file" -ForegroundColor Magenta
122
+ }
123
+ }
124
+
125
+ # 配置
126
+ $LogFile = Join-Path $WorkingDirectory "dev\pipeline\logs\multi_agent_$(Get-Date -Format 'yyyy-MM-dd').log"
127
+ $TaskQueueFile = Join-Path $WorkingDirectory "dev\pipeline\TASK_QUEUE.json"
128
+ $LockStateFile = Join-Path $WorkingDirectory "dev\pipeline\LOCK_STATE.json"
129
+ $AgentStateFile = Join-Path $WorkingDirectory "dev\pipeline\AGENT_STATE.json"
130
+ $HeartbeatFile = Join-Path $WorkingDirectory "dev\pipeline\DASHBOARD_HEARTBEAT.json"
131
+
132
+ # Heartbeat timeout disabled - only stop on explicit "closing" signal
133
+
134
+ # 確保目錄存在
135
+ $LogDir = Split-Path $LogFile -Parent
136
+ if (-not (Test-Path $LogDir)) {
137
+ New-Item -ItemType Directory -Path $LogDir -Force | Out-Null
138
+ }
139
+
140
+ # ============================================================
141
+ # 工具函數
142
+ # ============================================================
143
+
144
+ function Write-Log {
145
+ param([string]$Message, [string]$Level = "INFO")
146
+ $Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
147
+ $LogMessage = "[$Timestamp] [$Level] $Message"
148
+
149
+ switch ($Level) {
150
+ "ERROR" { Write-Host $LogMessage -ForegroundColor Red }
151
+ "WARN" { Write-Host $LogMessage -ForegroundColor Yellow }
152
+ "SUCCESS" { Write-Host $LogMessage -ForegroundColor Green }
153
+ default { Write-Host $LogMessage }
154
+ }
155
+
156
+ Add-Content -Path $LogFile -Value $LogMessage -Encoding UTF8
157
+ }
158
+
159
+ function Write-FileWithRetry {
160
+ param(
161
+ [string]$Path,
162
+ [string]$Content,
163
+ [int]$MaxRetries = 5,
164
+ [int]$RetryDelayMs = 200
165
+ )
166
+
167
+ $attempt = 0
168
+ while ($attempt -lt $MaxRetries) {
169
+ try {
170
+ $Content | Set-Content $Path -Encoding UTF8 -ErrorAction Stop
171
+ return $true
172
+ } catch [System.IO.IOException] {
173
+ $attempt++
174
+ if ($attempt -lt $MaxRetries) {
175
+ Start-Sleep -Milliseconds $RetryDelayMs
176
+ $RetryDelayMs = $RetryDelayMs * 2 # Exponential backoff
177
+ } else {
178
+ Write-Log "Failed to write to $Path after $MaxRetries retries: $_" "ERROR"
179
+ throw $_
180
+ }
181
+ }
182
+ }
183
+ return $false
184
+ }
185
+
186
+ function Stop-ProcessTree {
187
+ param([int]$ProcessId)
188
+
189
+ # Use taskkill with /T flag to kill the process tree
190
+ # This ensures all child processes are also terminated
191
+ try {
192
+ $null = taskkill /PID $ProcessId /T /F 2>&1
193
+ Write-Log "Terminated process tree for PID $ProcessId" "INFO"
194
+ return $true
195
+ } catch {
196
+ Write-Log "Failed to terminate process tree for PID $ProcessId : $_" "WARN"
197
+ return $false
198
+ }
199
+ }
200
+
201
+ function Stop-OrphanClaudeProcesses {
202
+ # Find and terminate orphan Claude processes that are not tracked by this scheduler
203
+ # SAFETY: Only terminates processes that:
204
+ # 1. Are NOT in TrackedProcessIds
205
+ # 2. Have a command line containing "--dangerously-skip-permissions" (scheduler-launched agents)
206
+ # This prevents accidentally killing user's IDE Claude sessions
207
+ param(
208
+ [hashtable]$TrackedProcessIds = @{},
209
+ [switch]$Force # Force cleanup even without command line check (dangerous!)
210
+ )
211
+
212
+ $claudeProcesses = Get-Process -Name "claude" -ErrorAction SilentlyContinue
213
+
214
+ if (-not $claudeProcesses) {
215
+ return 0
216
+ }
217
+
218
+ $orphanCount = 0
219
+ foreach ($proc in $claudeProcesses) {
220
+ # Skip if this process is being tracked
221
+ if ($TrackedProcessIds.ContainsKey($proc.Id)) {
222
+ continue
223
+ }
224
+
225
+ # Safety check: only kill processes launched by scheduler (have --dangerously-skip-permissions flag)
226
+ if (-not $Force) {
227
+ try {
228
+ $cmdLine = (Get-CimInstance Win32_Process -Filter "ProcessId = $($proc.Id)" -ErrorAction SilentlyContinue).CommandLine
229
+ if (-not $cmdLine -or $cmdLine -notmatch "--dangerously-skip-permissions") {
230
+ # This is likely a user's IDE session, skip it
231
+ continue
232
+ }
233
+ } catch {
234
+ # If we can't check command line, don't kill to be safe
235
+ continue
236
+ }
237
+ }
238
+
239
+ try {
240
+ Write-Log "Found orphan Claude agent process (PID: $($proc.Id), Started: $($proc.StartTime))" "WARN"
241
+ Stop-ProcessTree -ProcessId $proc.Id
242
+ $orphanCount++
243
+ } catch {
244
+ Write-Log "Failed to stop orphan process $($proc.Id): $_" "ERROR"
245
+ }
246
+ }
247
+
248
+ return $orphanCount
249
+ }
250
+
251
+ # ============================================================
252
+ # Smart Agent Dispatch Functions
253
+ # ============================================================
254
+
255
+ function Get-AgentType {
256
+ param(
257
+ [string]$TaskId,
258
+ [string]$TaskTitle,
259
+ [string[]]$ScopePaths,
260
+ [string]$ExplicitType = $null
261
+ )
262
+
263
+ # If explicit type is specified, use it
264
+ if ($ExplicitType) {
265
+ return $ExplicitType
266
+ }
267
+
268
+ $titleLower = $TaskTitle.ToLower()
269
+
270
+ # Keyword matching for agent type (English only for PowerShell compatibility)
271
+ $designerKeywords = @('ui', 'ux', 'layout', 'style', 'design', 'css', 'theme', 'color', 'visual', 'icon')
272
+ $backendKeywords = @('api', 'database', 'backend', 'endpoint', 'server', 'sql', 'migration', 'supabase', 'postgres')
273
+ $qaKeywords = @('test', 'qa', 'quality', 'unit test', 'e2e', 'spec', 'coverage', 'assert')
274
+ $sreKeywords = @('deploy', 'ci/cd', 'monitoring', 'infrastructure', 'docker', 'kubernetes', 'devops', 'pipeline')
275
+ $frontendKeywords = @('component', 'react', 'frontend', 'tsx', 'jsx', 'hook', 'state', 'page', 'dashboard')
276
+
277
+ # Check keywords in title
278
+ foreach ($kw in $designerKeywords) {
279
+ if ($titleLower.Contains($kw)) { return "designer" }
280
+ }
281
+ foreach ($kw in $backendKeywords) {
282
+ if ($titleLower.Contains($kw)) { return "backend" }
283
+ }
284
+ foreach ($kw in $qaKeywords) {
285
+ if ($titleLower.Contains($kw)) { return "qa" }
286
+ }
287
+ foreach ($kw in $sreKeywords) {
288
+ if ($titleLower.Contains($kw)) { return "sre" }
289
+ }
290
+ foreach ($kw in $frontendKeywords) {
291
+ if ($titleLower.Contains($kw)) { return "developer" }
292
+ }
293
+
294
+ # Scope path matching
295
+ foreach ($path in $ScopePaths) {
296
+ $pathLower = $path.ToLower()
297
+ if ($pathLower -match "api/" -or $pathLower -match "backend/") {
298
+ return "backend"
299
+ }
300
+ if ($pathLower -match "components/" -or $pathLower -match "src/" -or $pathLower -match "dashboard/") {
301
+ return "developer"
302
+ }
303
+ if ($pathLower -match "tests/" -or $pathLower -match "spec/") {
304
+ return "qa"
305
+ }
306
+ if ($pathLower -match "deploy/" -or $pathLower -match "infra/") {
307
+ return "sre"
308
+ }
309
+ }
310
+
311
+ # Default to dev_agent
312
+ return "dev"
313
+ }
314
+
315
+ function Get-SkillPath {
316
+ param([string]$AgentType)
317
+
318
+ $skillPaths = @{
319
+ "developer" = ".claude/skills/developer/SKILL.md"
320
+ "backend" = ".claude/skills/backend_engineer/SKILL.md"
321
+ "designer" = ".claude/skills/designer/SKILL.md"
322
+ "qa" = ".claude/skills/qa_engineer/SKILL.md"
323
+ "sre" = ".claude/skills/sre_agent/SKILL.md"
324
+ "dev" = ".claude/skills/dev_agent/SKILL.md"
325
+ "frontend" = ".claude/skills/frontend_agent/SKILL.md"
326
+ "architect" = ".claude/skills/architect_agent/SKILL.md"
327
+ }
328
+
329
+ if ($skillPaths.ContainsKey($AgentType)) {
330
+ return $skillPaths[$AgentType]
331
+ }
332
+
333
+ # Default to dev_agent
334
+ return ".claude/skills/dev_agent/SKILL.md"
335
+ }
336
+
337
+ function Get-AgentDisplayName {
338
+ param([string]$AgentType)
339
+
340
+ $displayNames = @{
341
+ "developer" = "Frontend Developer"
342
+ "backend" = "Backend Engineer"
343
+ "designer" = "UI/UX Designer"
344
+ "qa" = "QA Engineer"
345
+ "sre" = "SRE Agent"
346
+ "dev" = "Dev Agent"
347
+ "frontend" = "Frontend Agent"
348
+ "architect" = "Architect"
349
+ }
350
+
351
+ if ($displayNames.ContainsKey($AgentType)) {
352
+ return $displayNames[$AgentType]
353
+ }
354
+
355
+ return "Dev Agent"
356
+ }
357
+
358
+ function Get-TaskQueue {
359
+ if (-not (Test-Path $TaskQueueFile)) {
360
+ return $null
361
+ }
362
+
363
+ try {
364
+ $content = Get-Content $TaskQueueFile -Raw -Encoding UTF8
365
+ return $content | ConvertFrom-Json
366
+ } catch {
367
+ Write-Log "Failed to read task queue: $_" "ERROR"
368
+ return $null
369
+ }
370
+ }
371
+
372
+ function Get-LockState {
373
+ if (-not (Test-Path $LockStateFile)) {
374
+ return @{ locks = @() }
375
+ }
376
+
377
+ try {
378
+ $content = Get-Content $LockStateFile -Raw -Encoding UTF8
379
+ return $content | ConvertFrom-Json
380
+ } catch {
381
+ return @{ locks = @() }
382
+ }
383
+ }
384
+
385
+ function Save-LockState {
386
+ param($State)
387
+
388
+ try {
389
+ $State | Add-Member -NotePropertyName "last_updated" -NotePropertyValue (Get-Date -Format "o") -Force
390
+ $jsonContent = $State | ConvertTo-Json -Depth 10
391
+ Write-FileWithRetry -Path $LockStateFile -Content $jsonContent
392
+ } catch {
393
+ Write-Log "Failed to save lock state: $_" "WARN"
394
+ # Don't propagate - allow scheduler to continue
395
+ }
396
+ }
397
+
398
+ function Get-AgentState {
399
+ if (-not (Test-Path $AgentStateFile)) {
400
+ return @{ agents = @() }
401
+ }
402
+
403
+ try {
404
+ $content = Get-Content $AgentStateFile -Raw -Encoding UTF8
405
+ return $content | ConvertFrom-Json
406
+ } catch {
407
+ return @{ agents = @() }
408
+ }
409
+ }
410
+
411
+ function Save-AgentState {
412
+ param($State)
413
+
414
+ try {
415
+ $State | Add-Member -NotePropertyName "last_updated" -NotePropertyValue (Get-Date -Format "o") -Force
416
+ $jsonContent = $State | ConvertTo-Json -Depth 10
417
+ Write-FileWithRetry -Path $AgentStateFile -Content $jsonContent
418
+ } catch {
419
+ Write-Log "Failed to save agent state: $_" "WARN"
420
+ # Don't propagate - allow scheduler to continue
421
+ }
422
+ }
423
+
424
+ function Test-DashboardHeartbeat {
425
+ # Check if dashboard is still alive via heartbeat file
426
+ # Stop agents when:
427
+ # 1. Dashboard explicitly sends "closing" signal
428
+ # 2. Heartbeat file hasn't been updated for too long (crash detection)
429
+ #
430
+ # NOTE: In Standalone mode, heartbeat is ignored entirely
431
+
432
+ # Standalone mode - always return alive
433
+ if ($script:StandaloneMode) {
434
+ return @{ Alive = $true; Reason = "Standalone mode (heartbeat ignored)" }
435
+ }
436
+
437
+ $HeartbeatTimeoutSeconds = 120 # 2 minutes - if no heartbeat update, assume crashed
438
+
439
+ if (-not (Test-Path $HeartbeatFile)) {
440
+ # No heartbeat file - assume running without dashboard (CLI mode)
441
+ return @{ Alive = $true; Reason = "No heartbeat file (CLI mode)" }
442
+ }
443
+
444
+ try {
445
+ $content = Get-Content $HeartbeatFile -Raw -Encoding UTF8
446
+ $heartbeat = $content | ConvertFrom-Json
447
+
448
+ # Check if dashboard is explicitly closing
449
+ if ($heartbeat.status -eq "closing") {
450
+ return @{ Alive = $false; Reason = "Dashboard closing" }
451
+ }
452
+
453
+ # Check heartbeat timeout (crash detection)
454
+ if ($heartbeat.timestamp) {
455
+ $lastHeartbeat = [DateTime]::Parse($heartbeat.timestamp)
456
+ $elapsed = (Get-Date) - $lastHeartbeat
457
+ if ($elapsed.TotalSeconds -gt $HeartbeatTimeoutSeconds) {
458
+ return @{
459
+ Alive = $false
460
+ Reason = "Dashboard heartbeat timeout ($([int]$elapsed.TotalSeconds)s > ${HeartbeatTimeoutSeconds}s)"
461
+ }
462
+ }
463
+ }
464
+
465
+ return @{ Alive = $true; SessionId = $heartbeat.session_id }
466
+ } catch {
467
+ # Failed to read/parse - check file modification time as fallback
468
+ try {
469
+ $fileInfo = Get-Item $HeartbeatFile
470
+ $elapsed = (Get-Date) - $fileInfo.LastWriteTime
471
+ if ($elapsed.TotalSeconds -gt $HeartbeatTimeoutSeconds) {
472
+ return @{
473
+ Alive = $false
474
+ Reason = "Dashboard heartbeat file stale ($([int]$elapsed.TotalSeconds)s)"
475
+ }
476
+ }
477
+ } catch { }
478
+ return @{ Alive = $true; Reason = "Heartbeat check fallback" }
479
+ }
480
+ }
481
+
482
+ function Add-AgentToState {
483
+ param(
484
+ [string]$AgentId,
485
+ [string]$TaskId,
486
+ [string]$TaskTitle,
487
+ [string]$Branch,
488
+ [string]$Status = "working",
489
+ [string]$AgentType = "dev_agent"
490
+ )
491
+
492
+ $agentState = Get-AgentState
493
+ $agents = [System.Collections.ArrayList]@()
494
+ if ($agentState.agents) {
495
+ $agents = [System.Collections.ArrayList]@($agentState.agents)
496
+ }
497
+
498
+ # Remove existing entry if any
499
+ $agents = [System.Collections.ArrayList]@($agents | Where-Object { $_.id -ne $AgentId })
500
+
501
+ # Map internal agent type to dashboard-compatible type
502
+ $dashboardType = switch ($AgentType) {
503
+ "developer" { "developer" }
504
+ "backend" { "backend_engineer" }
505
+ "designer" { "designer" }
506
+ "qa" { "qa_engineer" }
507
+ "sre" { "sre_agent" }
508
+ "frontend" { "frontend_agent" }
509
+ "architect" { "architect_agent" }
510
+ default { "dev_agent" }
511
+ }
512
+
513
+ # Debug: Log type mapping for troubleshooting
514
+ Write-Log "Type mapping: AgentType='$AgentType' -> dashboardType='$dashboardType'" "INFO"
515
+
516
+ # Add new agent entry (format compatible with dashboard)
517
+ $agents.Add(@{
518
+ id = $AgentId
519
+ type = $dashboardType
520
+ status = $Status
521
+ current_task = $TaskId
522
+ current_operation = $TaskTitle
523
+ branch = $Branch
524
+ started_at = (Get-Date -Format "o")
525
+ task_id = $TaskId
526
+ task_title = $TaskTitle
527
+ }) | Out-Null
528
+
529
+ $agentState.agents = $agents
530
+ Save-AgentState $agentState
531
+ $displayName = Get-AgentDisplayName -AgentType $AgentType
532
+ Write-Log "Added agent $AgentId ($displayName) to AGENT_STATE.json (task: $TaskId)"
533
+ }
534
+
535
+ function Remove-AgentFromState {
536
+ param([string]$AgentId)
537
+
538
+ $agentState = Get-AgentState
539
+ if ($agentState.agents) {
540
+ $newAgents = @($agentState.agents | Where-Object { $_.id -ne $AgentId })
541
+ $agentState.agents = $newAgents
542
+ Save-AgentState $agentState
543
+ Write-Log "Removed agent $AgentId from AGENT_STATE.json"
544
+ }
545
+ }
546
+
547
+ # Clean exit function - ensures AGENT_STATE.json is updated before exit
548
+ # PowerShell's `exit` doesn't trigger `finally` blocks, so we need this
549
+ function Stop-SchedulerCleanly {
550
+ param(
551
+ [int]$ExitCode = 0,
552
+ [string]$Reason = "Normal exit"
553
+ )
554
+
555
+ Write-Log "Scheduler stopping: $Reason"
556
+
557
+ # Terminate all active agents if any
558
+ if ($script:activeAgents -and $script:activeAgents.Count -gt 0) {
559
+ foreach ($agentId in @($script:activeAgents.Keys)) {
560
+ $agent = $script:activeAgents[$agentId]
561
+ if ($agent.Process -and -not $agent.Process.HasExited) {
562
+ Write-Log "Terminating agent $agentId (PID: $($agent.Process.Id))"
563
+ Stop-ProcessTree -ProcessId $agent.Process.Id
564
+ }
565
+ Remove-AgentLocks -AgentId $agentId
566
+ Remove-AgentFromState -AgentId $agentId
567
+ }
568
+ $script:activeAgents.Clear()
569
+ }
570
+
571
+ # Update AGENT_STATE.json to show scheduler is stopped
572
+ $agentState = @{
573
+ agents = @()
574
+ scheduler = @{
575
+ status = "stopped"
576
+ stopped_at = (Get-Date -Format "o")
577
+ }
578
+ last_updated = (Get-Date -Format "o")
579
+ }
580
+ Save-AgentState $agentState
581
+ Write-Log "AGENT_STATE.json updated: scheduler stopped"
582
+
583
+ exit $ExitCode
584
+ }
585
+
586
+ function Test-PathConflict {
587
+ param(
588
+ [string[]]$RequestedPaths,
589
+ $LockState
590
+ )
591
+
592
+ foreach ($reqPath in $RequestedPaths) {
593
+ foreach ($lock in $LockState.locks) {
594
+ $lockPath = $lock.path
595
+
596
+ # 檢查路徑衝突
597
+ if ($reqPath.StartsWith($lockPath) -or $lockPath.StartsWith($reqPath) -or $reqPath -eq $lockPath) {
598
+ return @{
599
+ Conflict = $true
600
+ ConflictingPath = $lockPath
601
+ HeldBy = $lock.agent_id
602
+ Task = $lock.task_id
603
+ }
604
+ }
605
+ }
606
+ }
607
+
608
+ return @{ Conflict = $false }
609
+ }
610
+
611
+ function Get-ReadyTasks {
612
+ param($Queue)
613
+
614
+ $readyTasks = @()
615
+ $completedIds = @()
616
+
617
+ # 收集已完成任務 ID(queue 內)
618
+ foreach ($task in $Queue.tasks) {
619
+ if ($task.status -eq "completed") {
620
+ $completedIds += $task.id
621
+ }
622
+ }
623
+
624
+ # 收集已完成且被移除的任務 ID(completed/ 目錄內的 YAML)
625
+ $completedDir = Join-Path $WorkingDirectory "dev/pipeline/completed"
626
+ if (Test-Path $completedDir) {
627
+ Get-ChildItem -Path $completedDir -Filter "TASK_*.yaml" | ForEach-Object {
628
+ if ($_.Name -match "^(TASK_\d+)") {
629
+ $completedId = $Matches[1]
630
+ if ($completedId -notin $completedIds) {
631
+ $completedIds += $completedId
632
+ }
633
+ }
634
+ }
635
+ }
636
+
637
+ # 找出可執行的任務
638
+ foreach ($task in $Queue.tasks) {
639
+ if ($task.status -ne "pending") {
640
+ continue
641
+ }
642
+
643
+ # 檢查依賴
644
+ $depsOk = $true
645
+ if ($task.dependencies) {
646
+ foreach ($dep in $task.dependencies) {
647
+ if ($dep -notin $completedIds) {
648
+ $depsOk = $false
649
+ break
650
+ }
651
+ }
652
+ }
653
+
654
+ if ($depsOk) {
655
+ $readyTasks += $task
656
+ }
657
+ }
658
+
659
+ # 按優先級排序 (P0 > P1 > P2 > P3)
660
+ $priorityOrder = @{ "P0" = 0; "P1" = 1; "P2" = 2; "P3" = 3 }
661
+ $readyTasks = $readyTasks | Sort-Object { $priorityOrder[$_.priority] }
662
+
663
+ return $readyTasks
664
+ }
665
+
666
+ function New-AgentId {
667
+ return "agent_$(Get-Date -Format 'HHmmss')_$([guid]::NewGuid().ToString().Substring(0,4))"
668
+ }
669
+
670
+ function Start-AgentWorker {
671
+ param(
672
+ [string]$AgentId,
673
+ [string]$TaskId,
674
+ [string]$TaskTitle,
675
+ [string[]]$ScopePaths,
676
+ [string]$AgentType = "dev"
677
+ )
678
+
679
+ $displayName = Get-AgentDisplayName -AgentType $AgentType
680
+ $skillPath = Get-SkillPath -AgentType $AgentType
681
+ Write-Log "Starting $displayName ($AgentId) for task $TaskId" "SUCCESS"
682
+ Write-Log " Skill: $skillPath" "INFO"
683
+
684
+ if ($DryRun) {
685
+ Write-Log "[DRY RUN] Would start: claude -p '/agent-worker --task $TaskId --agent $AgentId'" "WARN"
686
+ return $null
687
+ }
688
+
689
+ # Check if task has a resumable branch (from previous interrupted session)
690
+ $queue = Get-TaskQueue
691
+ $resumeBranch = $null
692
+ if ($queue) {
693
+ $taskObj = $queue.tasks | Where-Object { $_.id -eq $TaskId } | Select-Object -First 1
694
+ if ($taskObj -and $taskObj.resume_branch) {
695
+ $resumeBranch = $taskObj.resume_branch
696
+ }
697
+ }
698
+
699
+ # 決定使用的 Branch
700
+ $branchName = if ($resumeBranch) {
701
+ Write-Log "Resuming task from existing branch: $resumeBranch" "INFO"
702
+ $resumeBranch
703
+ } else {
704
+ "task-$($TaskId.ToLower())-$AgentId"
705
+ }
706
+
707
+ try {
708
+ Push-Location $WorkingDirectory
709
+
710
+ if ($resumeBranch) {
711
+ # Resume: checkout existing branch
712
+ $null = git checkout $resumeBranch 2>$null
713
+ if ($LASTEXITCODE -ne 0) {
714
+ Write-Log "Failed to checkout resume branch, creating new one" "WARN"
715
+ $branchName = "task-$($TaskId.ToLower())-$AgentId"
716
+ $null = git checkout main 2>$null
717
+ if ($LASTEXITCODE -ne 0) { $null = git checkout master 2>$null }
718
+ $null = git checkout -b $branchName 2>$null
719
+ }
720
+ } else {
721
+ # New task: create new branch from main
722
+ $currentBranch = git rev-parse --abbrev-ref HEAD 2>$null
723
+ if ($currentBranch -ne "main" -and $currentBranch -ne "master") {
724
+ $null = git checkout main 2>$null
725
+ if ($LASTEXITCODE -ne 0) {
726
+ $null = git checkout master 2>$null
727
+ }
728
+ }
729
+ # 創建任務分支
730
+ $null = git checkout -b $branchName 2>$null
731
+ }
732
+
733
+ Pop-Location
734
+ } catch {
735
+ Write-Log "Failed to setup branch: $_" "ERROR"
736
+ Pop-Location
737
+ return $null
738
+ }
739
+
740
+ # 啟動 Claude Agent Worker
741
+ $prompt = "/agent-worker --task $TaskId --agent $AgentId --branch $branchName"
742
+
743
+ # Create log file for this agent's output
744
+ $logDir = Join-Path $WorkingDirectory "dev\pipeline\logs"
745
+ if (-not (Test-Path $logDir)) { New-Item -ItemType Directory -Path $logDir -Force | Out-Null }
746
+ $agentLogFile = Join-Path $logDir "agent_${AgentId}.log"
747
+
748
+ try {
749
+ # Use cmd.exe /c to invoke claude (npm global installs create .cmd scripts on Windows)
750
+ # This ensures proper execution regardless of how claude was installed
751
+ $process = Start-Process -FilePath "cmd.exe" `
752
+ -ArgumentList "/c", "claude", "--dangerously-skip-permissions", "-p", "`"$prompt`"" `
753
+ -WorkingDirectory $WorkingDirectory `
754
+ -PassThru `
755
+ -NoNewWindow `
756
+ -RedirectStandardOutput $agentLogFile `
757
+ -RedirectStandardError "${agentLogFile}.err"
758
+
759
+ Write-Log "Agent $AgentId started (PID: $($process.Id))"
760
+ Write-Log "Agent log: $agentLogFile"
761
+
762
+ $result = @{
763
+ Process = $process
764
+ AgentId = $AgentId
765
+ TaskId = $TaskId
766
+ Branch = $branchName
767
+ StartTime = Get-Date
768
+ LogFile = $agentLogFile
769
+ }
770
+ return $result
771
+ } catch {
772
+ Write-Log "Failed to start agent: $_" "ERROR"
773
+ return $null
774
+ }
775
+ }
776
+
777
+ function Update-TaskStatus {
778
+ param(
779
+ [string]$TaskId,
780
+ [string]$Status,
781
+ [string]$AgentId = $null,
782
+ [string]$Branch = $null
783
+ )
784
+
785
+ $queue = Get-TaskQueue
786
+ if (-not $queue) { return }
787
+
788
+ foreach ($task in $queue.tasks) {
789
+ if ($task.id -eq $TaskId) {
790
+ $task.status = $Status
791
+
792
+ if ($Status -eq "in_progress") {
793
+ $task | Add-Member -NotePropertyName "started_at" -NotePropertyValue (Get-Date -Format "o") -Force
794
+ if ($AgentId) {
795
+ $task | Add-Member -NotePropertyName "assigned_agent" -NotePropertyValue $AgentId -Force
796
+ }
797
+ if ($Branch) {
798
+ $task | Add-Member -NotePropertyName "branch" -NotePropertyValue $Branch -Force
799
+ }
800
+ # Clear resume_branch marker now that agent has started
801
+ if ($task.PSObject.Properties["resume_branch"]) {
802
+ $task.PSObject.Properties.Remove("resume_branch")
803
+ }
804
+ } elseif ($Status -eq "completed") {
805
+ $task | Add-Member -NotePropertyName "completed_at" -NotePropertyValue (Get-Date -Format "o") -Force
806
+ }
807
+
808
+ break
809
+ }
810
+ }
811
+
812
+ try {
813
+ $queue | Add-Member -NotePropertyName "last_updated" -NotePropertyValue (Get-Date -Format "o") -Force
814
+ $jsonContent = $queue | ConvertTo-Json -Depth 10
815
+ Write-FileWithRetry -Path $TaskQueueFile -Content $jsonContent
816
+ } catch {
817
+ Write-Log "Failed to update task queue for ${TaskId}: $_" "WARN"
818
+ # Don't propagate - allow scheduler to continue
819
+ }
820
+ }
821
+
822
+ function Move-TaskToCompleted {
823
+ param([string]$TaskId)
824
+
825
+ $tasksDir = Join-Path $WorkingDirectory "dev\pipeline\tasks"
826
+ $completedDir = Join-Path $WorkingDirectory "dev\pipeline\completed"
827
+
828
+ # Ensure completed directory exists
829
+ if (-not (Test-Path $completedDir)) {
830
+ New-Item -ItemType Directory -Path $completedDir -Force | Out-Null
831
+ }
832
+
833
+ # Find and move task file (support both .md and .yaml formats)
834
+ $taskFile = Get-ChildItem -Path $tasksDir -Filter "${TaskId}_*" -ErrorAction SilentlyContinue |
835
+ Where-Object { $_.Extension -in @('.md', '.yaml', '.yml') } |
836
+ Select-Object -First 1
837
+ if ($taskFile) {
838
+ $destPath = Join-Path $completedDir $taskFile.Name
839
+ Move-Item -Path $taskFile.FullName -Destination $destPath -Force
840
+ Write-Log "Moved task file to completed: $($taskFile.Name)" "INFO"
841
+ }
842
+
843
+ # TASK_084: Remove completed task from TASK_QUEUE.json to prevent pollution
844
+ # This prevents completed tasks from being re-added to the queue by sync script
845
+ try {
846
+ $TaskQueueFile = Join-Path $WorkingDirectory "dev\pipeline\TASK_QUEUE.json"
847
+ if (Test-Path $TaskQueueFile) {
848
+ $queue = Get-Content $TaskQueueFile -Raw -Encoding UTF8 | ConvertFrom-Json
849
+ $beforeCount = $queue.tasks.Count
850
+ $queue.tasks = $queue.tasks | Where-Object { $_.id -ne $TaskId }
851
+ $afterCount = $queue.tasks.Count
852
+
853
+ if ($beforeCount -ne $afterCount) {
854
+ # Recalculate statistics
855
+ $queue.statistics.total = $queue.tasks.Count
856
+ $queue.statistics.pending = ($queue.tasks | Where-Object { $_.status -eq "pending" }).Count
857
+ $queue.statistics.in_progress = ($queue.tasks | Where-Object { $_.status -eq "in_progress" }).Count
858
+ $queue.statistics.blocked = ($queue.tasks | Where-Object { $_.status -eq "blocked" }).Count
859
+ $queue.statistics.completed = 0 # No completed tasks in queue anymore
860
+ $queue.statistics.cancelled = ($queue.tasks | Where-Object { $_.status -eq "cancelled" }).Count
861
+ $queue.last_updated = (Get-Date -Format "o")
862
+
863
+ $jsonContent = $queue | ConvertTo-Json -Depth 10
864
+ Write-FileWithRetry -Path $TaskQueueFile -Content $jsonContent
865
+ Write-Log "Removed ${TaskId} from TASK_QUEUE.json (cleanup to prevent pollution)" "INFO"
866
+ }
867
+ }
868
+ } catch {
869
+ Write-Log "Failed to remove ${TaskId} from TASK_QUEUE.json: $_" "WARN"
870
+ # Don't propagate - task file was already moved
871
+ }
872
+ }
873
+
874
+ # ============================================================
875
+ # 任務檔案備份(啟動時執行)
876
+ # ============================================================
877
+
878
+ function Backup-TaskFiles {
879
+ # Backup tasks/ folder before starting scheduler
880
+ # This prevents loss of task files if scheduler crashes or misbehaves
881
+
882
+ $tasksDir = Join-Path $WorkingDirectory "dev\pipeline\tasks"
883
+ $backupDir = Join-Path $WorkingDirectory "dev\pipeline\backups"
884
+
885
+ if (-not (Test-Path $tasksDir)) {
886
+ Write-Log "Tasks directory not found, skipping backup" "WARN"
887
+ return $null
888
+ }
889
+
890
+ $taskFiles = Get-ChildItem -Path $tasksDir -File -ErrorAction SilentlyContinue
891
+ if (-not $taskFiles -or $taskFiles.Count -eq 0) {
892
+ Write-Log "No task files to backup" "INFO"
893
+ return $null
894
+ }
895
+
896
+ # Create backup directory with timestamp
897
+ $timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
898
+ $backupPath = Join-Path $backupDir "tasks_$timestamp"
899
+
900
+ try {
901
+ if (-not (Test-Path $backupDir)) {
902
+ New-Item -ItemType Directory -Path $backupDir -Force | Out-Null
903
+ }
904
+
905
+ # Copy entire tasks folder
906
+ Copy-Item -Path $tasksDir -Destination $backupPath -Recurse -Force
907
+
908
+ $backupCount = (Get-ChildItem -Path $backupPath -File -ErrorAction SilentlyContinue).Count
909
+ Write-Log "Backed up $backupCount task file(s) to: $backupPath" "SUCCESS"
910
+
911
+ # Clean up old backups (keep last 5)
912
+ $oldBackups = Get-ChildItem -Path $backupDir -Directory -Filter "tasks_*" |
913
+ Sort-Object CreationTime -Descending |
914
+ Select-Object -Skip 5
915
+
916
+ foreach ($old in $oldBackups) {
917
+ Remove-Item -Path $old.FullName -Recurse -Force -ErrorAction SilentlyContinue
918
+ Write-Log "Removed old backup: $($old.Name)" "INFO"
919
+ }
920
+
921
+ return $backupPath
922
+ } catch {
923
+ Write-Log "Failed to backup task files: $_" "ERROR"
924
+ return $null
925
+ }
926
+ }
927
+
928
+ # ============================================================
929
+ # 改進的 Exit Code 偵測
930
+ # ============================================================
931
+
932
+ function Test-AgentSuccess {
933
+ param(
934
+ [int]$ExitCode,
935
+ [string]$LogFile,
936
+ [string]$Branch,
937
+ [string]$TaskId
938
+ )
939
+
940
+ # Priority 1: Exit code 0 is always success
941
+ if ($ExitCode -eq 0) {
942
+ return @{ Success = $true; Reason = "Exit code 0" }
943
+ }
944
+
945
+ # Priority 2: Check for commits in branch (actual work done)
946
+ if ($Branch) {
947
+ try {
948
+ Push-Location $WorkingDirectory
949
+
950
+ # Check if branch exists
951
+ $null = git rev-parse --verify $Branch 2>$null
952
+ if ($LASTEXITCODE -eq 0) {
953
+ # Determine main branch
954
+ $mainBranch = "main"
955
+ $null = git rev-parse --verify main 2>$null
956
+ if ($LASTEXITCODE -ne 0) { $mainBranch = "master" }
957
+
958
+ # Count commits ahead of main
959
+ $commitsAhead = git rev-list --count "${mainBranch}..${Branch}" 2>$null
960
+ if ($LASTEXITCODE -eq 0 -and [int]$commitsAhead -gt 0) {
961
+ # Check if any commit message contains the task ID
962
+ $commitMessages = git log --oneline "${mainBranch}..${Branch}" 2>$null
963
+ if ($commitMessages -match $TaskId) {
964
+ Pop-Location
965
+ return @{
966
+ Success = $true
967
+ Reason = "Branch has $commitsAhead commit(s) with $TaskId"
968
+ }
969
+ }
970
+ }
971
+ }
972
+
973
+ Pop-Location
974
+ } catch {
975
+ Pop-Location
976
+ }
977
+ }
978
+
979
+ # Priority 3: Check log file for success indicators
980
+ if ($LogFile -and (Test-Path $LogFile)) {
981
+ try {
982
+ $logContent = Get-Content $LogFile -Raw -ErrorAction SilentlyContinue
983
+ if ($logContent) {
984
+ # Multiple success patterns
985
+ $successPatterns = @(
986
+ "Status:\s*SUCCESS",
987
+ "TASK_\d+\s+is\s+now\s+complete",
988
+ "Task.*completed\s+successfully",
989
+ "^\s*##\s+TASK_\d+\s+Summary",
990
+ "\[SUCCESS\].*completed",
991
+ "All\s+\d+\s+tests\s+pass"
992
+ )
993
+
994
+ foreach ($pattern in $successPatterns) {
995
+ if ($logContent -match $pattern) {
996
+ return @{
997
+ Success = $true
998
+ Reason = "Log matches success pattern: $pattern"
999
+ }
1000
+ }
1001
+ }
1002
+
1003
+ # Check for failure patterns (explicit failures)
1004
+ $failurePatterns = @(
1005
+ "API Error:\s*5\d\d",
1006
+ "FATAL\s+ERROR",
1007
+ "Build\s+failed",
1008
+ "Compilation\s+error"
1009
+ )
1010
+
1011
+ foreach ($pattern in $failurePatterns) {
1012
+ if ($logContent -match $pattern) {
1013
+ return @{
1014
+ Success = $false
1015
+ Reason = "Log matches failure pattern: $pattern"
1016
+ }
1017
+ }
1018
+ }
1019
+ }
1020
+ } catch {
1021
+ # Ignore log read errors
1022
+ }
1023
+ }
1024
+
1025
+ # Default: If exit code is null/unknown and no definitive indicators, check branch again
1026
+ if ($null -eq $ExitCode -or $ExitCode -eq "") {
1027
+ # One more check: if branch exists with commits, consider it partial success
1028
+ if ($Branch) {
1029
+ try {
1030
+ Push-Location $WorkingDirectory
1031
+ $null = git rev-parse --verify $Branch 2>$null
1032
+ if ($LASTEXITCODE -eq 0) {
1033
+ $commitsAhead = git rev-list --count "main..${Branch}" 2>$null
1034
+ if ($LASTEXITCODE -ne 0) {
1035
+ $commitsAhead = git rev-list --count "master..${Branch}" 2>$null
1036
+ }
1037
+ if ($LASTEXITCODE -eq 0 -and [int]$commitsAhead -gt 0) {
1038
+ Pop-Location
1039
+ return @{
1040
+ Success = $true
1041
+ Reason = "Exit null but branch has $commitsAhead commit(s) - assuming success"
1042
+ }
1043
+ }
1044
+ }
1045
+ Pop-Location
1046
+ } catch {
1047
+ Pop-Location
1048
+ }
1049
+ }
1050
+
1051
+ return @{
1052
+ Success = $false
1053
+ Reason = "Exit code null with no success indicators"
1054
+ }
1055
+ }
1056
+
1057
+ return @{
1058
+ Success = $false
1059
+ Reason = "Exit code $ExitCode (non-zero)"
1060
+ }
1061
+ }
1062
+
1063
+ function Update-ProgressFile {
1064
+ param(
1065
+ [string]$TaskId,
1066
+ [string]$TaskTitle,
1067
+ [string]$Action
1068
+ )
1069
+
1070
+ $progressFile = Join-Path $WorkingDirectory "dev\pipeline\PROGRESS.md"
1071
+ if (-not (Test-Path $progressFile)) { return }
1072
+
1073
+ $content = Get-Content $progressFile -Raw -Encoding UTF8
1074
+ $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm"
1075
+
1076
+ # Update Last Update section
1077
+ $content = $content -replace '(?ms)(## Last Update\r?\n-.*?Time.*?:)[^\r\n]*', "`$1 $timestamp"
1078
+ $content = $content -replace '(?ms)(## Last Update\r?\n.*?Agent.*?:)[^\r\n]*', "`$1 Multi-Agent Scheduler"
1079
+ $content = $content -replace '(?ms)(## Last Update\r?\n.*?Session.*?:)[^\r\n]*', "`$1 $TaskId $Action"
1080
+
1081
+ # Update statistics based on current queue
1082
+ $queue = Get-TaskQueue
1083
+ if ($queue) {
1084
+ $total = $queue.tasks.Count
1085
+ $completed = @($queue.tasks | Where-Object { $_.status -eq "completed" }).Count
1086
+ $inProgress = @($queue.tasks | Where-Object { $_.status -eq "in_progress" }).Count
1087
+ $pending = @($queue.tasks | Where-Object { $_.status -eq "pending" }).Count
1088
+ $blocked = @($queue.tasks | Where-Object { $_.status -eq "blocked" }).Count
1089
+
1090
+ $completedPct = if ($total -gt 0) { [math]::Round($completed / $total * 100) } else { 0 }
1091
+ $inProgressPct = if ($total -gt 0) { [math]::Round($inProgress / $total * 100) } else { 0 }
1092
+ $pendingPct = if ($total -gt 0) { [math]::Round($pending / $total * 100) } else { 0 }
1093
+ $blockedPct = if ($total -gt 0) { [math]::Round($blocked / $total * 100) } else { 0 }
1094
+
1095
+ $statsBlock = @"
1096
+ Total Tasks: $total
1097
+ Completed: $completed ($completedPct%)
1098
+ In Progress: $inProgress ($inProgressPct%)
1099
+ Pending: $pending ($pendingPct%)
1100
+ Blocked: $blocked ($blockedPct%)
1101
+ "@
1102
+ $content = $content -replace '(?ms)(### Overall Progress\r?\n```\r?\n).*?(```)', "`$1$statsBlock`n`$2"
1103
+ }
1104
+
1105
+ # Add to change history
1106
+ $dateStr = Get-Date -Format "yyyy-MM-dd"
1107
+ $historyEntry = "| $dateStr | $Action | $TaskId - $TaskTitle |"
1108
+ $content = $content -replace '(\| 2026-01-29 \| Tasks Created \|[^\r\n]*)', "`$1`n$historyEntry"
1109
+
1110
+ Set-Content $progressFile -Value $content -Encoding UTF8
1111
+ Write-Log "Updated PROGRESS.md" "INFO"
1112
+ }
1113
+
1114
+ function Add-PathLocks {
1115
+ param(
1116
+ [string]$AgentId,
1117
+ [string]$TaskId,
1118
+ [string[]]$Paths
1119
+ )
1120
+
1121
+ $lockState = Get-LockState
1122
+ $locks = [System.Collections.ArrayList]@($lockState.locks)
1123
+
1124
+ foreach ($path in $Paths) {
1125
+ $locks.Add(@{
1126
+ path = $path
1127
+ agent_id = $AgentId
1128
+ task_id = $TaskId
1129
+ lock_type = if ($path.EndsWith("/")) { "directory" } else { "file" }
1130
+ acquired_at = (Get-Date -Format "o")
1131
+ }) | Out-Null
1132
+ }
1133
+
1134
+ $lockState.locks = $locks
1135
+ Save-LockState $lockState
1136
+
1137
+ Write-Log "Acquired locks for $AgentId on $($Paths.Count) paths"
1138
+ }
1139
+
1140
+ function Remove-AgentLocks {
1141
+ param([string]$AgentId)
1142
+
1143
+ $lockState = Get-LockState
1144
+ $newLocks = $lockState.locks | Where-Object { $_.agent_id -ne $AgentId }
1145
+ $lockState.locks = @($newLocks)
1146
+ Save-LockState $lockState
1147
+
1148
+ Write-Log "Released locks for $AgentId"
1149
+ }
1150
+
1151
+ # ============================================================
1152
+ # 狀態一致性檢查與清理(啟動時執行)
1153
+ # ============================================================
1154
+
1155
+ function Clear-StaleState {
1156
+ # CRITICAL: Clear all stale state from previous sessions at startup
1157
+ # This function runs BEFORE consistency check to ensure clean slate
1158
+ #
1159
+ # Why: When scheduler restarts, any existing locks/agents from previous
1160
+ # crashed sessions are invalid and must be cleared immediately
1161
+
1162
+ Write-Log "Cleaning stale state from previous sessions..." "INFO"
1163
+ $cleaned = @()
1164
+
1165
+ # 1. Clear ALL locks - new scheduler session means fresh state
1166
+ try {
1167
+ $lockState = Get-LockState
1168
+ if ($lockState.locks -and $lockState.locks.Count -gt 0) {
1169
+ $lockCount = $lockState.locks.Count
1170
+ $lockDetails = @($lockState.locks | ForEach-Object { "$($_.task_id):$($_.path)" })
1171
+ Write-Log "Found $lockCount stale lock(s) from previous session:" "WARN"
1172
+ foreach ($detail in $lockDetails) {
1173
+ Write-Log " - $detail" "WARN"
1174
+ }
1175
+
1176
+ # Clear all locks
1177
+ Save-LockState @{ locks = @() }
1178
+ $cleaned += "Cleared $lockCount stale lock(s)"
1179
+ }
1180
+ } catch {
1181
+ Write-Log "Error clearing locks: $_" "ERROR"
1182
+ # Force reset
1183
+ try {
1184
+ Save-LockState @{ locks = @() }
1185
+ $cleaned += "Force reset LOCK_STATE.json"
1186
+ } catch { }
1187
+ }
1188
+
1189
+ # 2. Clear stale agents from AGENT_STATE.json
1190
+ try {
1191
+ $agentState = Get-AgentState
1192
+ if ($agentState.agents -and $agentState.agents.Count -gt 0) {
1193
+ $agentCount = $agentState.agents.Count
1194
+ $agentDetails = @($agentState.agents | ForEach-Object { "$($_.id):$($_.current_task)" })
1195
+ Write-Log "Found $agentCount stale agent(s) from previous session:" "WARN"
1196
+ foreach ($detail in $agentDetails) {
1197
+ Write-Log " - $detail" "WARN"
1198
+ }
1199
+
1200
+ # Clear agents but preserve scheduler info
1201
+ $agentState.agents = @()
1202
+ Save-AgentState $agentState
1203
+ $cleaned += "Cleared $agentCount stale agent(s)"
1204
+ }
1205
+ } catch {
1206
+ Write-Log "Error clearing agents: $_" "ERROR"
1207
+ }
1208
+
1209
+ # 3. Reset in_progress tasks to pending (check branch progress first)
1210
+ try {
1211
+ $queue = Get-TaskQueue
1212
+ if ($queue -and $queue.tasks) {
1213
+ $inProgressTasks = @($queue.tasks | Where-Object { $_.status -eq "in_progress" })
1214
+ if ($inProgressTasks.Count -gt 0) {
1215
+ Write-Log "Found $($inProgressTasks.Count) in_progress task(s) to check:" "WARN"
1216
+ $resetCount = 0
1217
+ $resumeCount = 0
1218
+
1219
+ foreach ($task in $queue.tasks) {
1220
+ if ($task.status -eq "in_progress") {
1221
+ $hasProgress = $false
1222
+ $branchName = $task.branch
1223
+
1224
+ # Check if branch exists and has commits ahead of main
1225
+ if ($branchName) {
1226
+ try {
1227
+ Push-Location $WorkingDirectory
1228
+
1229
+ # Check if branch exists
1230
+ $null = git rev-parse --verify $branchName 2>$null
1231
+ if ($LASTEXITCODE -eq 0) {
1232
+ # Check for commits ahead of main/master
1233
+ $mainBranch = "main"
1234
+ $null = git rev-parse --verify main 2>$null
1235
+ if ($LASTEXITCODE -ne 0) { $mainBranch = "master" }
1236
+
1237
+ $commitsAhead = git rev-list --count "${mainBranch}..${branchName}" 2>$null
1238
+ if ($LASTEXITCODE -eq 0 -and [int]$commitsAhead -gt 0) {
1239
+ $hasProgress = $true
1240
+ Write-Log " - $($task.id): $($task.title) - branch has $commitsAhead commit(s), will RESUME" "SUCCESS"
1241
+ }
1242
+ }
1243
+
1244
+ Pop-Location
1245
+ } catch {
1246
+ Pop-Location
1247
+ }
1248
+ }
1249
+
1250
+ # Reset task to pending
1251
+ $task.status = "pending"
1252
+
1253
+ # Clear stale assignment info
1254
+ if ($task.PSObject.Properties["assigned_agent"]) {
1255
+ $task.PSObject.Properties.Remove("assigned_agent")
1256
+ }
1257
+ if ($task.PSObject.Properties["started_at"]) {
1258
+ $task.PSObject.Properties.Remove("started_at")
1259
+ }
1260
+
1261
+ if ($hasProgress) {
1262
+ # Keep branch for resume
1263
+ $task | Add-Member -NotePropertyName "resume_branch" -NotePropertyValue $branchName -Force
1264
+ if ($task.PSObject.Properties["branch"]) {
1265
+ $task.PSObject.Properties.Remove("branch")
1266
+ }
1267
+ $resumeCount++
1268
+ } else {
1269
+ # Full reset - no progress to preserve
1270
+ if (-not $hasProgress) {
1271
+ Write-Log " - $($task.id): $($task.title) - no progress, will RESET" "WARN"
1272
+ }
1273
+ if ($task.PSObject.Properties["branch"]) {
1274
+ $task.PSObject.Properties.Remove("branch")
1275
+ }
1276
+ if ($task.PSObject.Properties["resume_branch"]) {
1277
+ $task.PSObject.Properties.Remove("resume_branch")
1278
+ }
1279
+ $resetCount++
1280
+ }
1281
+ }
1282
+ }
1283
+
1284
+ # Save updated queue
1285
+ $queue.last_updated = (Get-Date -Format "o")
1286
+ $jsonContent = $queue | ConvertTo-Json -Depth 10
1287
+ Write-FileWithRetry -Path $TaskQueueFile -Content $jsonContent
1288
+
1289
+ if ($resetCount -gt 0) {
1290
+ $cleaned += "Reset $resetCount task(s) with no progress"
1291
+ }
1292
+ if ($resumeCount -gt 0) {
1293
+ $cleaned += "Will resume $resumeCount task(s) with branch progress"
1294
+ }
1295
+ }
1296
+ }
1297
+ } catch {
1298
+ Write-Log "Error resetting tasks: $_" "ERROR"
1299
+ }
1300
+
1301
+ # Report
1302
+ if ($cleaned.Count -gt 0) {
1303
+ Write-Log "Stale state cleanup completed:" "SUCCESS"
1304
+ foreach ($item in $cleaned) {
1305
+ Write-Log " - $item" "SUCCESS"
1306
+ }
1307
+ } else {
1308
+ Write-Log "No stale state found - clean startup" "SUCCESS"
1309
+ }
1310
+
1311
+ return $cleaned
1312
+ }
1313
+
1314
+ function Test-StateConsistency {
1315
+ # Comprehensive state consistency check at scheduler startup
1316
+ # This prevents issues from previous crashed sessions
1317
+ # NOTE: Clear-StaleState should be called BEFORE this function
1318
+
1319
+ $issues = @()
1320
+ $fixed = @()
1321
+
1322
+ # 1. Validate TASK_QUEUE.json
1323
+ Write-Log "Checking state consistency..." "INFO"
1324
+
1325
+ try {
1326
+ $queue = Get-TaskQueue
1327
+ if (-not $queue) {
1328
+ $issues += "TASK_QUEUE.json is missing or invalid"
1329
+ # Will be recreated by sync script
1330
+ }
1331
+ } catch {
1332
+ $issues += "TASK_QUEUE.json parse error: $_"
1333
+ }
1334
+
1335
+ # 2. Validate LOCK_STATE.json (should be empty after Clear-StaleState)
1336
+ try {
1337
+ $lockState = Get-LockState
1338
+ if ($lockState.locks -and $lockState.locks.Count -gt 0) {
1339
+ # This shouldn't happen after Clear-StaleState, but handle it
1340
+ $issues += "Unexpected locks remain after cleanup: $($lockState.locks.Count)"
1341
+ Save-LockState @{ locks = @() }
1342
+ $fixed += "Force cleared remaining locks"
1343
+ }
1344
+ } catch {
1345
+ $issues += "LOCK_STATE.json error: $_"
1346
+ try {
1347
+ Save-LockState @{ locks = @() }
1348
+ $fixed += "Reset LOCK_STATE.json"
1349
+ } catch { }
1350
+ }
1351
+
1352
+ # 3. Validate AGENT_STATE.json (should have no agents after Clear-StaleState)
1353
+ try {
1354
+ $agentState = Get-AgentState
1355
+ if ($agentState.agents -and $agentState.agents.Count -gt 0) {
1356
+ $issues += "Unexpected agents remain after cleanup: $($agentState.agents.Count)"
1357
+ }
1358
+ } catch {
1359
+ $issues += "AGENT_STATE.json error: $_"
1360
+ }
1361
+
1362
+ # 4. Check for tasks stuck in in_progress (should be none after Clear-StaleState)
1363
+ if ($queue -and $queue.tasks) {
1364
+ $stuckTasks = @($queue.tasks | Where-Object { $_.status -eq "in_progress" })
1365
+ if ($stuckTasks.Count -gt 0) {
1366
+ $issues += "Unexpected in_progress tasks after cleanup: $($stuckTasks.Count)"
1367
+ }
1368
+ }
1369
+
1370
+ # Report
1371
+ if ($issues.Count -gt 0) {
1372
+ Write-Log "State consistency issues found:" "WARN"
1373
+ foreach ($issue in $issues) {
1374
+ Write-Log " - $issue" "WARN"
1375
+ }
1376
+ }
1377
+
1378
+ if ($fixed.Count -gt 0) {
1379
+ Write-Log "Auto-fixed issues:" "SUCCESS"
1380
+ foreach ($fix in $fixed) {
1381
+ Write-Log " - $fix" "SUCCESS"
1382
+ }
1383
+ }
1384
+
1385
+ if ($issues.Count -eq 0 -and $fixed.Count -eq 0) {
1386
+ Write-Log "State consistency check passed" "SUCCESS"
1387
+ }
1388
+
1389
+ return @{
1390
+ Issues = $issues
1391
+ Fixed = $fixed
1392
+ HasCriticalIssues = ($issues | Where-Object { $_ -match "parse error|invalid" }).Count -gt 0
1393
+ }
1394
+ }
1395
+
1396
+ # ============================================================
1397
+ # 主循環
1398
+ # ============================================================
1399
+
1400
+ Clear-Host
1401
+ Write-Host ""
1402
+ Write-Host "============================================================" -ForegroundColor Cyan
1403
+ Write-Host " Multi-Agent Parallel Scheduler" -ForegroundColor Cyan
1404
+ Write-Host "============================================================" -ForegroundColor Cyan
1405
+ Write-Host " Max Parallel Agents: $MaxAgents"
1406
+ Write-Host " Poll Interval: ${PollIntervalSeconds}s"
1407
+ Write-Host " Task Timeout: ${TaskTimeoutMinutes}min"
1408
+ Write-Host " Working Dir: $WorkingDirectory"
1409
+ if ($DryRun) { Write-Host " Mode: DRY RUN" -ForegroundColor Yellow }
1410
+ if ($Standalone) { Write-Host " Mode: STANDALONE (heartbeat ignored)" -ForegroundColor Magenta }
1411
+ Write-Host "============================================================" -ForegroundColor Cyan
1412
+ Write-Host ""
1413
+
1414
+ # ============================================================
1415
+ # Prerequisite Checks
1416
+ # ============================================================
1417
+ Write-Host "[CHECK] Running prerequisite checks..." -ForegroundColor Yellow
1418
+ Write-DebugLog "Starting prerequisite checks"
1419
+
1420
+ # Check 1: Claude CLI installed
1421
+ try {
1422
+ $claudeCmd = Get-Command "claude" -ErrorAction SilentlyContinue
1423
+ $claudeInstalled = $null -ne $claudeCmd
1424
+ if ($claudeCmd) {
1425
+ Write-DebugLog "Claude CLI found at: $($claudeCmd.Source)"
1426
+ }
1427
+ } catch {
1428
+ $claudeInstalled = $false
1429
+ Write-DebugLog "Error checking Claude CLI: $_" "ERROR"
1430
+ }
1431
+
1432
+ if (-not $claudeInstalled) {
1433
+ $errorMsg = "Claude CLI not found in PATH"
1434
+ Write-DebugLog $errorMsg "ERROR"
1435
+ Write-Host ""
1436
+ Write-Host "============================================================" -ForegroundColor Red
1437
+ Write-Host " ERROR: Claude CLI not found!" -ForegroundColor Red
1438
+ Write-Host "============================================================" -ForegroundColor Red
1439
+ Write-Host ""
1440
+ Write-Host " Multi-Agent mode requires Claude CLI to be installed."
1441
+ Write-Host ""
1442
+ Write-Host " To install:" -ForegroundColor White
1443
+ Write-Host " npm install -g @anthropic-ai/claude-code" -ForegroundColor Cyan
1444
+ Write-Host ""
1445
+ Write-Host " After installation, restart your terminal and try again."
1446
+ Write-Host ""
1447
+ Write-Host "============================================================" -ForegroundColor Red
1448
+ Write-DebugLog "Exiting with code 1 - Claude CLI not found"
1449
+ exit 1
1450
+ }
1451
+ Write-Host " [OK] Claude CLI found" -ForegroundColor Green
1452
+ Write-DebugLog "Claude CLI check passed"
1453
+
1454
+ # Check 2: Working directory exists
1455
+ if (-not (Test-Path $WorkingDirectory)) {
1456
+ $errorMsg = "Working directory not found: $WorkingDirectory"
1457
+ Write-DebugLog $errorMsg "ERROR"
1458
+ Write-DebugLog "Exiting with code 1 - working directory not found"
1459
+ Write-Host " [ERROR] $errorMsg" -ForegroundColor Red
1460
+ exit 1
1461
+ }
1462
+ Write-Host " [OK] Working directory exists" -ForegroundColor Green
1463
+ Write-DebugLog "Working directory check passed: $WorkingDirectory"
1464
+
1465
+ # Check 3: dev/pipeline directory exists
1466
+ $pipelineDir = Join-Path $WorkingDirectory "dev\pipeline"
1467
+ if (-not (Test-Path $pipelineDir)) {
1468
+ $errorMsg = "Pipeline directory not found: $pipelineDir - Run Initialize Project first"
1469
+ Write-DebugLog $errorMsg "ERROR"
1470
+ Write-DebugLog "Exiting with code 1 - pipeline directory not found"
1471
+ Write-Host " [ERROR] $errorMsg" -ForegroundColor Red
1472
+ exit 1
1473
+ }
1474
+ Write-Host " [OK] Pipeline directory exists" -ForegroundColor Green
1475
+ Write-DebugLog "Pipeline directory check passed"
1476
+
1477
+ # Check 4: Task queue file exists (will be created by sync if needed)
1478
+ $TaskQueueFile = Join-Path $WorkingDirectory "dev\pipeline\TASK_QUEUE.json"
1479
+ if (-not (Test-Path $TaskQueueFile)) {
1480
+ Write-Host " [WARN] Task queue not found, will be created by sync" -ForegroundColor Yellow
1481
+ Write-DebugLog "Task queue file not found, will attempt sync" "WARN"
1482
+ }
1483
+
1484
+ Write-Host "[CHECK] Prerequisites passed" -ForegroundColor Green
1485
+ Write-DebugLog "All prerequisite checks passed"
1486
+ Write-Host ""
1487
+
1488
+ # Auto-sync task queue from markdown files
1489
+ Write-Host "[SYNC] Syncing task queue from markdown files..." -ForegroundColor Yellow
1490
+ Write-DebugLog "Starting task queue sync"
1491
+
1492
+ # Look for sync script in the same directory as this script (not in user's project)
1493
+ $scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
1494
+ Write-DebugLog "Script directory (raw): $scriptDir"
1495
+
1496
+ # Normalize path to handle \\?\ prefix from Tauri
1497
+ if ($scriptDir -and $scriptDir.StartsWith("\\?\")) {
1498
+ $scriptDir = $scriptDir.Substring(4)
1499
+ Write-DebugLog "Script directory (normalized): $scriptDir"
1500
+ }
1501
+
1502
+ $syncScript = Join-Path $scriptDir "sync_task_queue.ps1"
1503
+ Write-DebugLog "Looking for sync script at: $syncScript"
1504
+
1505
+ if (Test-Path $syncScript) {
1506
+ Write-DebugLog "Found sync script, executing..."
1507
+ try {
1508
+ & $syncScript -WorkingDirectory $WorkingDirectory -Quiet | Out-Null
1509
+ Write-Host "[SYNC] Task queue synced successfully" -ForegroundColor Green
1510
+ Write-DebugLog "Task queue sync completed successfully"
1511
+ } catch {
1512
+ Write-DebugLog "Sync script execution failed: $_" "ERROR"
1513
+ Write-Host "[SYNC] Sync failed: $_" -ForegroundColor Red
1514
+ }
1515
+ } else {
1516
+ Write-DebugLog "Sync script not found at primary location, trying fallback..."
1517
+ # Fallback: check in user's working directory (for manual runs)
1518
+ $syncScriptFallback = Join-Path $WorkingDirectory "dev\scripts\sync_task_queue.ps1"
1519
+ Write-DebugLog "Fallback sync script path: $syncScriptFallback"
1520
+
1521
+ if (Test-Path $syncScriptFallback) {
1522
+ Write-DebugLog "Found fallback sync script, executing..."
1523
+ try {
1524
+ & $syncScriptFallback -WorkingDirectory $WorkingDirectory -Quiet | Out-Null
1525
+ Write-Host "[SYNC] Task queue synced successfully" -ForegroundColor Green
1526
+ Write-DebugLog "Task queue sync completed successfully (fallback)"
1527
+ } catch {
1528
+ Write-DebugLog "Fallback sync script execution failed: $_" "ERROR"
1529
+ Write-Host "[SYNC] Sync failed: $_" -ForegroundColor Red
1530
+ }
1531
+ } else {
1532
+ Write-DebugLog "No sync script found at either location" "WARN"
1533
+ Write-Host "[SYNC] sync_task_queue.ps1 not found, skipping auto-sync" -ForegroundColor Yellow
1534
+ }
1535
+ }
1536
+ Write-Host ""
1537
+
1538
+ Write-Log "Multi-Agent Scheduler started (MaxAgents=$MaxAgents)"
1539
+
1540
+ # Backup task files before starting (prevent data loss)
1541
+ $backupResult = Backup-TaskFiles
1542
+ if ($backupResult) {
1543
+ Write-DebugLog "Task files backed up to: $backupResult"
1544
+ }
1545
+
1546
+ # CRITICAL: Clean stale state from previous sessions FIRST
1547
+ # This ensures locks, agents, and tasks are reset before any checks
1548
+ $null = Clear-StaleState
1549
+
1550
+ # Run state consistency check (should find no issues after cleanup)
1551
+ $consistencyResult = Test-StateConsistency
1552
+ if ($consistencyResult.HasCriticalIssues) {
1553
+ Write-Log "Critical state issues detected. Running sync to repair..." "WARN"
1554
+ if (Test-Path $syncScript) {
1555
+ & $syncScript -WorkingDirectory $WorkingDirectory -Force -Quiet | Out-Null
1556
+ Write-Log "Forced sync completed" "SUCCESS"
1557
+ }
1558
+ }
1559
+
1560
+ # NOTE: Removed orphan Claude process cleanup
1561
+ # The previous logic was dangerous - it would terminate ALL Claude processes
1562
+ # including user's active VSCode Claude extension sessions.
1563
+ # If cleanup is needed, user should manually terminate processes before starting scheduler.
1564
+ Write-Log "Scheduler ready (stale state cleaned)"
1565
+
1566
+ # Check if there are any pending tasks before starting the main loop
1567
+ $queue = Get-TaskQueue
1568
+ if ($queue) {
1569
+ $pendingTasks = @($queue.tasks | Where-Object { $_.status -eq "pending" })
1570
+ $completedTasks = @($queue.tasks | Where-Object { $_.status -eq "completed" })
1571
+ $totalTasks = $queue.tasks.Count
1572
+
1573
+ if ($pendingTasks.Count -eq 0) {
1574
+ Write-Host ""
1575
+ Write-Host "============================================================" -ForegroundColor Yellow
1576
+ Write-Host " No pending tasks found!" -ForegroundColor Yellow
1577
+ Write-Host "============================================================" -ForegroundColor Yellow
1578
+ Write-Host ""
1579
+ Write-Host " Task Queue Status:"
1580
+ Write-Host " Total: $totalTasks"
1581
+ Write-Host " Completed: $($completedTasks.Count)"
1582
+ Write-Host " Pending: 0"
1583
+ Write-Host ""
1584
+ Write-Host " To add tasks, you can:" -ForegroundColor White
1585
+ Write-Host " 1. Run /product to generate PRD and tasks" -ForegroundColor Cyan
1586
+ Write-Host " 2. Add task files to dev/pipeline/tasks/" -ForegroundColor Cyan
1587
+ Write-Host " 3. Use /dev to start development manually" -ForegroundColor Cyan
1588
+ Write-Host ""
1589
+ Write-Host "============================================================" -ForegroundColor Yellow
1590
+
1591
+ if ($SingleRun) {
1592
+ Stop-SchedulerCleanly -ExitCode 0 -Reason "No pending tasks (SingleRun mode)"
1593
+ }
1594
+
1595
+ Write-Log "No pending tasks. Scheduler will wait for new tasks..."
1596
+ } else {
1597
+ Write-Log "Found $($pendingTasks.Count) pending task(s) out of $totalTasks total" "SUCCESS"
1598
+ }
1599
+ } else {
1600
+ Write-Host ""
1601
+ Write-Host "============================================================" -ForegroundColor Red
1602
+ Write-Host " ERROR: Task queue not found or invalid!" -ForegroundColor Red
1603
+ Write-Host "============================================================" -ForegroundColor Red
1604
+ Write-Host ""
1605
+ Write-Host " Expected file: $TaskQueueFile"
1606
+ Write-Host ""
1607
+ Write-Host " Run Initialize Project first to create the task queue."
1608
+ Write-Host ""
1609
+ Write-DebugLog "Task queue not found or invalid: $TaskQueueFile" "ERROR"
1610
+ Write-DebugLog "Exiting with code 1 - task queue missing"
1611
+ exit 1
1612
+ }
1613
+
1614
+ # Clear stale agents and set scheduler status
1615
+ $schedulerState = @{
1616
+ agents = @()
1617
+ scheduler = @{
1618
+ status = "running"
1619
+ max_agents = $MaxAgents
1620
+ started_at = (Get-Date -Format "o")
1621
+ }
1622
+ last_updated = (Get-Date -Format "o")
1623
+ }
1624
+ Save-AgentState $schedulerState
1625
+ Write-Log "Scheduler status set to 'running' in AGENT_STATE.json"
1626
+
1627
+ # 活躍 Agent 追蹤
1628
+ $activeAgents = @{}
1629
+
1630
+ # 同步計數器(每 5 次輪詢同步一次新任務)
1631
+ $syncCounter = 0
1632
+ $SyncIntervalCycles = 5
1633
+
1634
+ # 保存狀態行位置(用於同一行更新,僅在交互式控制台)
1635
+ $statusLineRow = 0
1636
+ if ($script:IsInteractiveConsole) {
1637
+ $statusLineRow = [Console]::CursorTop
1638
+ }
1639
+
1640
+ Write-DebugLog "Entering main scheduler loop"
1641
+
1642
+ try {
1643
+ while ($true) {
1644
+ # Check if scheduler was stopped via API (AGENT_STATE.json status)
1645
+ $agentState = Get-AgentState
1646
+ if ($agentState.scheduler.status -eq "stopped") {
1647
+ Write-Log "Scheduler stop requested via API - shutting down..." "WARN"
1648
+
1649
+ # Terminate all active agents
1650
+ foreach ($agentId in $activeAgents.Keys) {
1651
+ $agent = $activeAgents[$agentId]
1652
+ if (-not $agent.Process.HasExited) {
1653
+ Write-Log "Terminating agent $agentId (stop requested, PID: $($agent.Process.Id))"
1654
+ Stop-ProcessTree -ProcessId $agent.Process.Id
1655
+ }
1656
+ Remove-AgentLocks -AgentId $agentId
1657
+ Remove-AgentFromState -AgentId $agentId
1658
+ }
1659
+ $activeAgents.Clear()
1660
+
1661
+ Write-Log "All agents terminated. Scheduler exiting." "SUCCESS"
1662
+ Stop-SchedulerCleanly -ExitCode 0 -Reason "Scheduler stop requested via API"
1663
+ }
1664
+
1665
+ # Check dashboard heartbeat - stop all agents if dashboard is closed
1666
+ $heartbeatStatus = Test-DashboardHeartbeat
1667
+ if (-not $heartbeatStatus.Alive) {
1668
+ Write-Log "Dashboard disconnected: $($heartbeatStatus.Reason)" "WARN"
1669
+ Write-Log "Stopping all agents due to dashboard disconnection..." "WARN"
1670
+
1671
+ # Terminate all active agents
1672
+ foreach ($agentId in $activeAgents.Keys) {
1673
+ $agent = $activeAgents[$agentId]
1674
+ if (-not $agent.Process.HasExited) {
1675
+ Write-Log "Terminating agent $agentId (dashboard closed, PID: $($agent.Process.Id))"
1676
+ # Use process tree termination to ensure all child processes are killed
1677
+ Stop-ProcessTree -ProcessId $agent.Process.Id
1678
+ }
1679
+ Remove-AgentLocks -AgentId $agentId
1680
+ Remove-AgentFromState -AgentId $agentId
1681
+
1682
+ # Reset task to pending for retry
1683
+ Update-TaskStatus -TaskId $agent.TaskId -Status "pending"
1684
+ }
1685
+ $activeAgents.Clear()
1686
+
1687
+ # If dashboard explicitly closed, exit immediately
1688
+ if ($heartbeatStatus.Reason -match "closing") {
1689
+ Write-Log "Dashboard explicitly closed. Scheduler exiting." "SUCCESS"
1690
+ Stop-SchedulerCleanly -ExitCode 0 -Reason "Dashboard explicitly closed"
1691
+ }
1692
+
1693
+ # Wait for dashboard to reconnect (max 60 seconds)
1694
+ $reconnectTimeout = 60
1695
+ $waited = 0
1696
+ Write-Log "Waiting up to ${reconnectTimeout}s for dashboard to reconnect..." "INFO"
1697
+ while (-not (Test-DashboardHeartbeat).Alive -and $waited -lt $reconnectTimeout) {
1698
+ Start-Sleep -Seconds 5
1699
+ $waited += 5
1700
+ Write-Host "." -NoNewline
1701
+ }
1702
+ Write-Host ""
1703
+
1704
+ if (-not (Test-DashboardHeartbeat).Alive) {
1705
+ Write-Log "Dashboard did not reconnect within ${reconnectTimeout}s. Scheduler exiting." "WARN"
1706
+ Stop-SchedulerCleanly -ExitCode 0 -Reason "Dashboard did not reconnect within timeout"
1707
+ }
1708
+
1709
+ Write-Log "Dashboard reconnected! Resuming scheduler..." "SUCCESS"
1710
+ }
1711
+
1712
+ # 定期同步新任務(每 5 個輪詢週期,或 Scheduler 空閒時)
1713
+ $syncCounter++
1714
+ $shouldSync = ($syncCounter -ge $SyncIntervalCycles) -or ($activeAgents.Count -eq 0)
1715
+ if ($shouldSync) {
1716
+ $syncCounter = 0
1717
+ if (Test-Path $syncScript) {
1718
+ & $syncScript -WorkingDirectory $WorkingDirectory -Quiet | Out-Null
1719
+ # 不輸出日誌,避免洗版
1720
+ }
1721
+ }
1722
+
1723
+ # 檢查已完成的 Agent
1724
+ $completedAgents = @()
1725
+ foreach ($agentId in $activeAgents.Keys) {
1726
+ $agent = $activeAgents[$agentId]
1727
+
1728
+ if ($agent.Process.HasExited) {
1729
+ $exitCode = $agent.Process.ExitCode
1730
+ $durationMin = [math]::Round(((Get-Date) - $agent.StartTime).TotalMinutes, 1)
1731
+
1732
+ # Use improved success detection
1733
+ $successResult = Test-AgentSuccess -ExitCode $exitCode -LogFile $agent.LogFile -Branch $agent.Branch -TaskId $agent.TaskId
1734
+ $isSuccess = $successResult.Success
1735
+
1736
+ if ($isSuccess -and $successResult.Reason -ne "Exit code 0") {
1737
+ Write-Log "Success detected via: $($successResult.Reason)" "INFO"
1738
+ }
1739
+
1740
+ if ($isSuccess) {
1741
+ Write-Log "Agent $agentId completed task $($agent.TaskId) successfully ($durationMin min)" "SUCCESS"
1742
+
1743
+ # Get task title before updating status
1744
+ $queue = Get-TaskQueue
1745
+ $taskTitle = ""
1746
+ foreach ($t in $queue.tasks) {
1747
+ if ($t.id -eq $agent.TaskId) {
1748
+ $taskTitle = $t.title
1749
+ break
1750
+ }
1751
+ }
1752
+
1753
+ Update-TaskStatus -TaskId $agent.TaskId -Status "completed"
1754
+
1755
+ # Move task file to completed folder
1756
+ Move-TaskToCompleted -TaskId $agent.TaskId
1757
+
1758
+ # Update PROGRESS.md
1759
+ Update-ProgressFile -TaskId $agent.TaskId -TaskTitle $taskTitle -Action "Completed"
1760
+
1761
+ # Merge task branch to main
1762
+ try {
1763
+ Push-Location $WorkingDirectory
1764
+ git checkout main 2>$null
1765
+ git merge $agent.Branch -m "Merge $($agent.TaskId): Completed by $agentId" 2>$null
1766
+ git branch -d $agent.Branch 2>$null
1767
+ Pop-Location
1768
+ Write-Log "Merged branch $($agent.Branch) to main" "SUCCESS"
1769
+ } catch {
1770
+ Pop-Location
1771
+ Write-Log "Failed to merge branch: $_" "WARN"
1772
+ }
1773
+ } else {
1774
+ $exitCodeStr = if ($null -eq $exitCode -or $exitCode -eq "") { "null" } else { $exitCode }
1775
+ Write-Log "Agent $agentId failed task $($agent.TaskId) after $durationMin min (exit: $exitCodeStr)" "ERROR"
1776
+ Write-Log "Failure reason: $($successResult.Reason)" "ERROR"
1777
+
1778
+ # Read error log for debugging
1779
+ if ($agent.LogFile -and (Test-Path "$($agent.LogFile).err")) {
1780
+ $errContent = Get-Content "$($agent.LogFile).err" -Raw -ErrorAction SilentlyContinue
1781
+ if ($errContent -and $errContent.Trim().Length -gt 0) {
1782
+ Write-Log "Agent error: $($errContent.Substring(0, [Math]::Min(500, $errContent.Length)))" "ERROR"
1783
+ }
1784
+ }
1785
+
1786
+ # Check if there's partial work done (branch with commits) - mark for resume instead of full reset
1787
+ $hasPartialWork = $false
1788
+ if ($agent.Branch) {
1789
+ try {
1790
+ Push-Location $WorkingDirectory
1791
+ $null = git rev-parse --verify $agent.Branch 2>$null
1792
+ if ($LASTEXITCODE -eq 0) {
1793
+ $mainBranch = "main"
1794
+ $null = git rev-parse --verify main 2>$null
1795
+ if ($LASTEXITCODE -ne 0) { $mainBranch = "master" }
1796
+ $commitsAhead = git rev-list --count "${mainBranch}..$($agent.Branch)" 2>$null
1797
+ if ($LASTEXITCODE -eq 0 -and [int]$commitsAhead -gt 0) {
1798
+ $hasPartialWork = $true
1799
+ Write-Log "Branch $($agent.Branch) has $commitsAhead commit(s) - marking for resume" "INFO"
1800
+ }
1801
+ }
1802
+ Pop-Location
1803
+ } catch {
1804
+ Pop-Location
1805
+ }
1806
+ }
1807
+
1808
+ # Reset task to pending for retry, potentially with resume info
1809
+ if ($hasPartialWork) {
1810
+ $queue = Get-TaskQueue
1811
+ if ($queue) {
1812
+ foreach ($t in $queue.tasks) {
1813
+ if ($t.id -eq $agent.TaskId) {
1814
+ $t.status = "pending"
1815
+ $t | Add-Member -NotePropertyName "resume_branch" -NotePropertyValue $agent.Branch -Force
1816
+ if ($t.PSObject.Properties["assigned_agent"]) {
1817
+ $t.PSObject.Properties.Remove("assigned_agent")
1818
+ }
1819
+ break
1820
+ }
1821
+ }
1822
+ $queue.last_updated = (Get-Date -Format "o")
1823
+ $jsonContent = $queue | ConvertTo-Json -Depth 10
1824
+ Write-FileWithRetry -Path $TaskQueueFile -Content $jsonContent
1825
+ }
1826
+ } else {
1827
+ Update-TaskStatus -TaskId $agent.TaskId -Status "pending"
1828
+ }
1829
+ }
1830
+
1831
+ # 釋放鎖
1832
+ Remove-AgentLocks -AgentId $agentId
1833
+ $completedAgents += $agentId
1834
+ } else {
1835
+ # 檢查超時
1836
+ $elapsed = ((Get-Date) - $agent.StartTime).TotalMinutes
1837
+ if ($elapsed -gt $TaskTimeoutMinutes) {
1838
+ Write-Log "Agent $agentId timed out on task $($agent.TaskId) (PID: $($agent.Process.Id))" "WARN"
1839
+ # Use process tree termination to ensure all child processes are killed
1840
+ Stop-ProcessTree -ProcessId $agent.Process.Id
1841
+ Remove-AgentLocks -AgentId $agentId
1842
+ $completedAgents += $agentId
1843
+ }
1844
+ }
1845
+ }
1846
+
1847
+ # 清理已完成的 Agent
1848
+ foreach ($agentId in $completedAgents) {
1849
+ $activeAgents.Remove($agentId)
1850
+ # 從 AGENT_STATE.json 移除 (for dashboard)
1851
+ Remove-AgentFromState -AgentId $agentId
1852
+ }
1853
+
1854
+ # 檢查是否可以啟動新 Agent
1855
+ $availableSlots = $MaxAgents - $activeAgents.Count
1856
+
1857
+ if ($availableSlots -gt 0) {
1858
+ $queue = Get-TaskQueue
1859
+
1860
+ if ($queue) {
1861
+ $readyTasks = Get-ReadyTasks -Queue $queue
1862
+ $lockState = Get-LockState
1863
+
1864
+ # Only log when there are ready tasks to potentially launch
1865
+ if ($readyTasks.Count -gt 0) {
1866
+ Write-Host "" # New line before log message
1867
+ Write-Log "Found $($readyTasks.Count) ready task(s), checking availability..."
1868
+ }
1869
+
1870
+ foreach ($task in $readyTasks) {
1871
+ if ($availableSlots -le 0) { break }
1872
+
1873
+ # 跳過已經在執行的任務
1874
+ $alreadyRunning = $false
1875
+ foreach ($agent in $activeAgents.Values) {
1876
+ if ($agent.TaskId -eq $task.id) {
1877
+ $alreadyRunning = $true
1878
+ break
1879
+ }
1880
+ }
1881
+ if ($alreadyRunning) { continue }
1882
+
1883
+ # 取得任務 scope
1884
+ $scopePaths = @()
1885
+ # 優先使用 scope_paths(新格式)
1886
+ if ($task.scope_paths) {
1887
+ $scopePaths += $task.scope_paths
1888
+ }
1889
+ # 向下相容:檢查舊格式 scope.paths / scope.files
1890
+ elseif ($task.scope) {
1891
+ if ($task.scope.paths) { $scopePaths += $task.scope.paths }
1892
+ if ($task.scope.files) { $scopePaths += $task.scope.files }
1893
+ }
1894
+
1895
+ # 如果沒有定義 scope,使用預設路徑
1896
+ if ($scopePaths.Count -eq 0) {
1897
+ $scopePaths = @("src/")
1898
+ }
1899
+
1900
+ # 檢查路徑衝突
1901
+ $conflict = Test-PathConflict -RequestedPaths $scopePaths -LockState $lockState
1902
+
1903
+ if ($conflict.Conflict) {
1904
+ Write-Log "Task $($task.id) conflicts with $($conflict.HeldBy) on $($conflict.ConflictingPath)" "WARN"
1905
+ continue
1906
+ }
1907
+
1908
+ # Determine agent type (smart dispatch)
1909
+ $explicitType = $null
1910
+ if ($task.agent_type) {
1911
+ $explicitType = $task.agent_type
1912
+ }
1913
+ $agentType = Get-AgentType -TaskId $task.id -TaskTitle $task.title -ScopePaths $scopePaths -ExplicitType $explicitType
1914
+
1915
+ # 啟動 Agent
1916
+ $agentId = New-AgentId
1917
+ $agentInfo = Start-AgentWorker -AgentId $agentId -TaskId $task.id -TaskTitle $task.title -ScopePaths $scopePaths -AgentType $agentType
1918
+
1919
+ if ($agentInfo -and $agentInfo -is [hashtable]) {
1920
+ try {
1921
+ # Store agent type in agent info for later reference
1922
+ $agentInfo.AgentType = $agentType
1923
+
1924
+ # 加入鎖
1925
+ Add-PathLocks -AgentId $agentId -TaskId $task.id -Paths $scopePaths
1926
+
1927
+ # 更新任務狀態
1928
+ Update-TaskStatus -TaskId $task.id -Status "in_progress" -AgentId $agentId -Branch $agentInfo.Branch
1929
+
1930
+ # 更新 AGENT_STATE.json (for dashboard) with agent type
1931
+ Add-AgentToState -AgentId $agentId -TaskId $task.id -TaskTitle $task.title -Branch $agentInfo.Branch -Status "working" -AgentType $agentType
1932
+
1933
+ # 追蹤 Agent (CRITICAL: must happen for cleanup to work)
1934
+ $activeAgents[$agentId] = $agentInfo
1935
+ $availableSlots--
1936
+
1937
+ $displayName = Get-AgentDisplayName -AgentType $agentType
1938
+ Write-Log "Launched $displayName ($agentId) for $($task.id): $($task.title)"
1939
+ } catch {
1940
+ Write-Log "Error setting up agent $agentId for task $($task.id): $_" "ERROR"
1941
+ # Agent process was started but setup failed - must still track it for cleanup
1942
+ if ($agentInfo.Process -and -not $agentInfo.Process.HasExited) {
1943
+ $activeAgents[$agentId] = $agentInfo
1944
+ Write-Log "Agent $agentId still tracked for cleanup despite setup error" "WARN"
1945
+ }
1946
+ # Release any locks that were acquired
1947
+ Remove-AgentLocks -AgentId $agentId
1948
+ }
1949
+ }
1950
+ }
1951
+ }
1952
+ }
1953
+
1954
+ # 顯示狀態 (更新同一行,避免洗版)
1955
+ $timestamp = Get-Date -Format "HH:mm:ss"
1956
+ $statusLine = "[$timestamp] Agents: $($activeAgents.Count)/$MaxAgents"
1957
+ if ($activeAgents.Count -gt 0) {
1958
+ $agentInfo = @()
1959
+ foreach ($agent in $activeAgents.Values) {
1960
+ $elapsedMin = [math]::Round(((Get-Date) - $agent.StartTime).TotalMinutes, 1)
1961
+ $agentInfo += "$($agent.TaskId)($elapsedMin min)"
1962
+ }
1963
+ $statusLine += " | " + ($agentInfo -join ", ")
1964
+ } else {
1965
+ $statusLine += " | Waiting for tasks..."
1966
+ }
1967
+ # 顯示狀態(交互式用同行更新,非交互式用普通輸出)
1968
+ if ($script:IsInteractiveConsole) {
1969
+ [Console]::SetCursorPosition(0, $statusLineRow)
1970
+ [Console]::ForegroundColor = [ConsoleColor]::Cyan
1971
+ [Console]::Write($statusLine.PadRight(100))
1972
+ [Console]::ResetColor()
1973
+ } else {
1974
+ Write-Host $statusLine -ForegroundColor Cyan
1975
+ }
1976
+
1977
+ if ($SingleRun -and $activeAgents.Count -eq 0) {
1978
+ Write-Log "Single run completed, no active agents"
1979
+ break
1980
+ }
1981
+
1982
+ # 等待下一個輪詢週期
1983
+ Start-Sleep -Seconds $PollIntervalSeconds
1984
+ }
1985
+ } catch {
1986
+ $errorMsg = "FATAL ERROR in main loop: $_"
1987
+ Write-DebugLog $errorMsg "ERROR"
1988
+ Write-DebugLog "Stack trace: $($_.ScriptStackTrace)" "ERROR"
1989
+ Write-Log $errorMsg "ERROR"
1990
+ throw
1991
+ } finally {
1992
+ # 清理:終止所有 Agent 並釋放鎖
1993
+ Write-Log "Shutting down scheduler..."
1994
+ Write-DebugLog "Entering finally block - cleanup starting"
1995
+
1996
+ foreach ($agentId in $activeAgents.Keys) {
1997
+ $agent = $activeAgents[$agentId]
1998
+ if (-not $agent.Process.HasExited) {
1999
+ Write-Log "Terminating agent $agentId (PID: $($agent.Process.Id))"
2000
+ Write-DebugLog "Terminating agent $agentId (PID: $($agent.Process.Id))"
2001
+ # Use process tree termination to ensure all child processes are killed
2002
+ Stop-ProcessTree -ProcessId $agent.Process.Id
2003
+ }
2004
+ Remove-AgentLocks -AgentId $agentId
2005
+ }
2006
+
2007
+ # 清理 AGENT_STATE.json - 移除所有 agents 並設置 scheduler 為 stopped
2008
+ $agentState = @{
2009
+ agents = @()
2010
+ scheduler = @{
2011
+ status = "stopped"
2012
+ stopped_at = (Get-Date -Format "o")
2013
+ }
2014
+ last_updated = (Get-Date -Format "o")
2015
+ }
2016
+ Save-AgentState $agentState
2017
+ Write-Log "Cleared AGENT_STATE.json and set scheduler to 'stopped'"
2018
+ Write-DebugLog "Cleanup completed, scheduler stopped"
2019
+
2020
+ Write-Log "Scheduler stopped"
2021
+ }