kenaz 0.3.3 → 0.3.5

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 (413) hide show
  1. package/core/.agents/skills/typesafe-ai/LICENSE +21 -21
  2. package/core/.agents/skills/typesafe-ai/SKILL.md +149 -149
  3. package/core/.claude/commands/Ansuz.md +14 -2
  4. package/core/.claude/hooks/__tests__/task-2395-project-registration.test.js +84 -0
  5. package/core/.claude/hooks/handoff-staleness.js +2 -2
  6. package/core/.claude/hooks/session-init.ps1 +49 -49
  7. package/core/.claude/hooks/turn-context.js +50 -2
  8. package/core/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -26
  9. package/core/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -97
  10. package/core/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -101
  11. package/core/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -31
  12. package/core/.claude/skills/ui-ux-pro-max/data/products.csv +96 -96
  13. package/core/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  14. package/core/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  15. package/core/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  16. package/core/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  17. package/core/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  18. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  19. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  20. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  21. package/core/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  22. package/core/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  23. package/core/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  24. package/core/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  25. package/core/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  26. package/core/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  27. package/core/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -68
  28. package/core/.claude/skills/ui-ux-pro-max/data/typography.csv +57 -57
  29. package/core/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
  30. package/core/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  31. package/core/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
  32. package/core/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -253
  33. package/core/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
  34. package/core/.claude/skills/ui-ux-pro-max/scripts/search.py +106 -106
  35. package/core/.collaboration/core/task-api.js +1 -4
  36. package/core/.formation/README.md +21 -146
  37. package/core/.formation/bifrost/codex-doctor.js +37 -2
  38. package/core/.formation/bifrost/codex-doctor.test.js +18 -0
  39. package/core/.formation/bifrost/launch.js +1 -1
  40. package/core/.formation/bifrost/openai/codex-hook-shim.js +6 -0
  41. package/core/.formation/bifrost/openai/codex-hook-shim.test.js +11 -1
  42. package/core/.formation/bifrost/setup-codex.js +3 -0
  43. package/core/.formation/spec/task_operations.parity.test.js +0 -1
  44. package/core/.formation/tests/hello.txt +2 -2
  45. package/core/.formation/tools/dashboard-models-chain.test.js +0 -6
  46. package/core/.formation/tools/dispatch-detail/cross-project-worktree.md +1 -9
  47. package/core/.formation/tools/dispatch-detail/worktree-subagent-mode.md +2 -2
  48. package/core/.formation/tools/dispatch.js +28 -549
  49. package/core/.formation/tools/mcp-allowlist.test.js +0 -1
  50. package/core/.formation/tools/post-complete/task2345.test.js +0 -5
  51. package/core/.formation/tools/pre-dispatch-snapshot.test.js +0 -100
  52. package/core/.formation/tools/prompt.js +29 -1623
  53. package/core/.formation/tools/prompt.test.js +26 -594
  54. package/core/.kenaz/knowledge/ladybug_2c51da1e_shadow_file_frame_group.patch +163 -163
  55. package/core/.kenaz/knowledge/ladybug_30cf85690e_shadow_page_read_during_checkpoint.patch +393 -393
  56. package/core/.kenaz/knowledge/ladybug_7a17858d3a_node_group_delete_lock.patch +102 -102
  57. package/core/.kenaz/knowledge/ladybug_926a0ba1_column_checkpoint.patch +412 -412
  58. package/core/.kenaz/knowledge/ladybug_a346c4c4b6_pk_index_header_pages.patch +144 -144
  59. package/core/.kenaz/knowledge/ladybug_ba5f38815b_csr_node_group.patch +86 -86
  60. package/core/.kenaz/muninn_episode_write.ps1 +17 -17
  61. package/core/.kenaz/specialist/field_report_watermark.json +1 -1
  62. package/core/.kenaz/specialist/memory_guard_fired.json +1 -1
  63. package/core/.kenaz/specialist/memory_guard_trigger_cache.json +1 -1
  64. package/core/.kenaz/specialist/t1777_probe.txt +1 -1
  65. package/core/.matrix/index.matrix +5 -5
  66. package/core/.specialist/tools/__tests__/freya-cli-contract.test.js +0 -1
  67. package/core/KENAZ_CORE_VERSION +1 -1
  68. package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +355 -355
  69. package/core/dev/JEV_INTEGRATION_PLAN.md +189 -189
  70. package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +13 -13
  71. package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +9 -9
  72. package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +14 -14
  73. package/core/dev/design/matrix_v2_EXAMPLE.matrix +67 -67
  74. package/core/dev/jev-eval/ACTIVE_CORRECTION.md +52 -52
  75. package/core/dev/jev-eval/CONTEXT_REVIEW.md +31 -31
  76. package/core/dev/jev-eval/EVALUATION_STATUS.md +39 -39
  77. package/core/dev/jev-eval/HISTORICAL_CORPUS.md +33 -33
  78. package/core/dev/jev-eval/README.md +99 -99
  79. package/core/dev/jev-eval/THALAMUS_RANKING.md +58 -58
  80. package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +32 -32
  81. package/core/dev/jev-eval/reports/context-review-2026-09-20.json +48 -48
  82. package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +52 -52
  83. package/core/dev/pipeline/SELF_ENHANCEMENT_STATUS.json.bak +47 -47
  84. package/core/dev/pipeline/tasks/.gitkeep +1 -1
  85. package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +27 -27
  86. package/core/dev/scripts/init_git.sh +0 -0
  87. package/core/dev/scripts/init_project.sh +0 -0
  88. package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +536 -536
  89. package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +1978 -1978
  90. package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +140 -140
  91. package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +173 -173
  92. package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +168 -168
  93. package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +126 -126
  94. package/core/dev/scripts/multi_agent_scheduler.sh +0 -0
  95. package/core/dev/scripts/run_once.sh +0 -0
  96. package/core/dev/scripts/setup_mcp.sh +0 -0
  97. package/core/dev/scripts/setup_rag.sh +0 -0
  98. package/core/dev/scripts/start_dev_agent.sh +0 -0
  99. package/core/dev/scripts/start_multi_agent.sh +0 -0
  100. package/core/dev/scripts/sync_task_queue.sh +0 -0
  101. package/core/plugins/kenaz/commands/Amelia.md +1 -1
  102. package/core/plugins/kenaz/commands/Ansuz.md +15 -3
  103. package/core/plugins/kenaz/scripts/kenaz-mode.js +11 -1
  104. package/core/plugins/kenaz/scripts/sync.js +6 -2
  105. package/core/plugins/kenaz/scripts/ygg.js +13 -1
  106. package/core/plugins/kenaz/skills/product_manager/SKILL.md +12 -12
  107. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/charts.csv +26 -26
  108. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/colors.csv +97 -97
  109. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/icons.csv +101 -101
  110. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/landing.csv +31 -31
  111. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/products.csv +96 -96
  112. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  113. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  114. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  115. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  116. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  117. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  118. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  119. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  120. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  121. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  122. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  123. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  124. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  125. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  126. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/styles.csv +68 -68
  127. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/typography.csv +57 -57
  128. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
  129. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  130. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
  131. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/core.py +253 -253
  132. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
  133. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/search.py +106 -106
  134. package/lib/cli.js +11 -4
  135. package/package.json +11 -7
  136. package/vendor/install-kenaz-cli.js +18 -7
  137. package/core/.formation/tools/broadcast.js +0 -103
  138. package/core/.formation/tools/dispatch-dryrun.test.js +0 -54
  139. package/core/.formation/tools/dispatch-notifier.js +0 -84
  140. package/core/.formation/tools/formations.js +0 -1203
  141. package/core/.formation/tools/headless-branch-recovery.test.js +0 -64
  142. package/core/.formation/tools/headless-dryrun.test.js +0 -79
  143. package/core/.formation/tools/headless-v2.js +0 -659
  144. package/core/.formation/tools/headless.js +0 -1071
  145. package/core/.formation/tools/legacy-scheduler.js +0 -1994
  146. package/core/.formation/tools/logger.js +0 -273
  147. package/core/.formation/tools/memory-loader.js +0 -422
  148. package/core/.formation/tools/process-state.js +0 -33
  149. package/core/.formation/tools/remote-conflict.js +0 -98
  150. package/core/.formation/tools/runner.js +0 -1332
  151. package/core/.formation/tools/task-utils.js +0 -344
  152. package/core/.formation/tools/task2028-headless-worktree.test.js +0 -112
  153. package/core/.formation/tools/tests/headless-mcp-args-plumbing.test.js +0 -123
  154. package/core/.formation/tools/worktree-leak.test.js +0 -162
  155. package/core/k-cli/dist/alaya/run.js +0 -91
  156. package/core/k-cli/dist/core/output.js +0 -24
  157. package/core/k-cli/dist/core/process.js +0 -38
  158. package/core/k-cli/dist/core/project.js +0 -80
  159. package/core/k-cli/dist/core/spawn.js +0 -268
  160. package/core/k-cli/dist/core/types.js +0 -2
  161. package/core/k-cli/dist/dashboard/update.js +0 -53
  162. package/core/k-cli/dist/dashboard/version.js +0 -20
  163. package/core/k-cli/dist/dispatch/run.js +0 -241
  164. package/core/k-cli/dist/dispatch/status.js +0 -103
  165. package/core/k-cli/dist/index.js +0 -283
  166. package/core/k-cli/dist/project/initialize.js +0 -301
  167. package/core/k-cli/dist/project/install.js +0 -89
  168. package/core/k-cli/dist/project/status.js +0 -138
  169. package/core/k-cli/dist/specialist/list.js +0 -100
  170. package/core/k-cli/dist/specialist/run.js +0 -93
  171. package/core/k-cli/dist/task/create.js +0 -194
  172. package/core/k-cli/dist/task/delete.js +0 -98
  173. package/core/k-cli/dist/task/get.js +0 -55
  174. package/core/k-cli/dist/task/list.js +0 -58
  175. package/core/k-cli/dist/task/submit.js +0 -156
  176. package/core/k-cli/dist/ygg/run.js +0 -51
  177. package/core/k-cli/node_modules/.bin/yaml +0 -16
  178. package/core/k-cli/node_modules/.bin/yaml.cmd +0 -17
  179. package/core/k-cli/node_modules/.bin/yaml.ps1 +0 -28
  180. package/core/k-cli/node_modules/.package-lock.json +0 -23
  181. package/core/k-cli/node_modules/yaml/LICENSE +0 -13
  182. package/core/k-cli/node_modules/yaml/README.md +0 -172
  183. package/core/k-cli/node_modules/yaml/bin.mjs +0 -11
  184. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-collection.js +0 -88
  185. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-doc.js +0 -43
  186. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-node.js +0 -109
  187. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-scalar.js +0 -86
  188. package/core/k-cli/node_modules/yaml/browser/dist/compose/composer.js +0 -217
  189. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-map.js +0 -115
  190. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +0 -198
  191. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +0 -49
  192. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-end.js +0 -37
  193. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +0 -207
  194. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +0 -223
  195. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-props.js +0 -146
  196. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-contains-newline.js +0 -34
  197. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +0 -26
  198. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +0 -15
  199. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-map-includes.js +0 -13
  200. package/core/k-cli/node_modules/yaml/browser/dist/doc/Document.js +0 -335
  201. package/core/k-cli/node_modules/yaml/browser/dist/doc/anchors.js +0 -71
  202. package/core/k-cli/node_modules/yaml/browser/dist/doc/applyReviver.js +0 -55
  203. package/core/k-cli/node_modules/yaml/browser/dist/doc/createNode.js +0 -88
  204. package/core/k-cli/node_modules/yaml/browser/dist/doc/directives.js +0 -176
  205. package/core/k-cli/node_modules/yaml/browser/dist/errors.js +0 -57
  206. package/core/k-cli/node_modules/yaml/browser/dist/index.js +0 -17
  207. package/core/k-cli/node_modules/yaml/browser/dist/log.js +0 -11
  208. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Alias.js +0 -114
  209. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Collection.js +0 -147
  210. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Node.js +0 -38
  211. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Pair.js +0 -36
  212. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Scalar.js +0 -24
  213. package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLMap.js +0 -144
  214. package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +0 -113
  215. package/core/k-cli/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +0 -63
  216. package/core/k-cli/node_modules/yaml/browser/dist/nodes/identity.js +0 -36
  217. package/core/k-cli/node_modules/yaml/browser/dist/nodes/toJS.js +0 -37
  218. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-scalar.js +0 -214
  219. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-stringify.js +0 -61
  220. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-visit.js +0 -97
  221. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst.js +0 -98
  222. package/core/k-cli/node_modules/yaml/browser/dist/parse/lexer.js +0 -717
  223. package/core/k-cli/node_modules/yaml/browser/dist/parse/line-counter.js +0 -39
  224. package/core/k-cli/node_modules/yaml/browser/dist/parse/parser.js +0 -967
  225. package/core/k-cli/node_modules/yaml/browser/dist/public-api.js +0 -102
  226. package/core/k-cli/node_modules/yaml/browser/dist/schema/Schema.js +0 -37
  227. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/map.js +0 -17
  228. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/null.js +0 -15
  229. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/seq.js +0 -17
  230. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/string.js +0 -14
  231. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/bool.js +0 -19
  232. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/float.js +0 -43
  233. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/int.js +0 -38
  234. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/schema.js +0 -23
  235. package/core/k-cli/node_modules/yaml/browser/dist/schema/json/schema.js +0 -62
  236. package/core/k-cli/node_modules/yaml/browser/dist/schema/tags.js +0 -96
  237. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +0 -58
  238. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +0 -26
  239. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +0 -46
  240. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +0 -71
  241. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +0 -64
  242. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +0 -74
  243. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +0 -78
  244. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +0 -39
  245. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +0 -93
  246. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +0 -101
  247. package/core/k-cli/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +0 -146
  248. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringify.js +0 -129
  249. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +0 -153
  250. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyComment.js +0 -20
  251. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +0 -85
  252. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +0 -24
  253. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyPair.js +0 -150
  254. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyString.js +0 -336
  255. package/core/k-cli/node_modules/yaml/browser/dist/util.js +0 -11
  256. package/core/k-cli/node_modules/yaml/browser/dist/visit.js +0 -233
  257. package/core/k-cli/node_modules/yaml/browser/index.js +0 -5
  258. package/core/k-cli/node_modules/yaml/browser/package.json +0 -3
  259. package/core/k-cli/node_modules/yaml/dist/cli.d.ts +0 -8
  260. package/core/k-cli/node_modules/yaml/dist/cli.mjs +0 -201
  261. package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.d.ts +0 -11
  262. package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.js +0 -90
  263. package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.d.ts +0 -7
  264. package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.js +0 -45
  265. package/core/k-cli/node_modules/yaml/dist/compose/compose-node.d.ts +0 -29
  266. package/core/k-cli/node_modules/yaml/dist/compose/compose-node.js +0 -112
  267. package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.d.ts +0 -5
  268. package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.js +0 -88
  269. package/core/k-cli/node_modules/yaml/dist/compose/composer.d.ts +0 -63
  270. package/core/k-cli/node_modules/yaml/dist/compose/composer.js +0 -222
  271. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.d.ts +0 -6
  272. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.js +0 -117
  273. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +0 -11
  274. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.js +0 -200
  275. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +0 -6
  276. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.js +0 -51
  277. package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.d.ts +0 -6
  278. package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.js +0 -39
  279. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +0 -7
  280. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.js +0 -209
  281. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +0 -10
  282. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.js +0 -225
  283. package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.d.ts +0 -23
  284. package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.js +0 -148
  285. package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.d.ts +0 -2
  286. package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.js +0 -36
  287. package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +0 -2
  288. package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.js +0 -28
  289. package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +0 -3
  290. package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.js +0 -17
  291. package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.d.ts +0 -4
  292. package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.js +0 -15
  293. package/core/k-cli/node_modules/yaml/dist/doc/Document.d.ts +0 -141
  294. package/core/k-cli/node_modules/yaml/dist/doc/Document.js +0 -337
  295. package/core/k-cli/node_modules/yaml/dist/doc/anchors.d.ts +0 -24
  296. package/core/k-cli/node_modules/yaml/dist/doc/anchors.js +0 -76
  297. package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.d.ts +0 -9
  298. package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.js +0 -57
  299. package/core/k-cli/node_modules/yaml/dist/doc/createNode.d.ts +0 -17
  300. package/core/k-cli/node_modules/yaml/dist/doc/createNode.js +0 -90
  301. package/core/k-cli/node_modules/yaml/dist/doc/directives.d.ts +0 -49
  302. package/core/k-cli/node_modules/yaml/dist/doc/directives.js +0 -178
  303. package/core/k-cli/node_modules/yaml/dist/errors.d.ts +0 -21
  304. package/core/k-cli/node_modules/yaml/dist/errors.js +0 -62
  305. package/core/k-cli/node_modules/yaml/dist/index.d.ts +0 -25
  306. package/core/k-cli/node_modules/yaml/dist/index.js +0 -50
  307. package/core/k-cli/node_modules/yaml/dist/log.d.ts +0 -3
  308. package/core/k-cli/node_modules/yaml/dist/log.js +0 -19
  309. package/core/k-cli/node_modules/yaml/dist/nodes/Alias.d.ts +0 -29
  310. package/core/k-cli/node_modules/yaml/dist/nodes/Alias.js +0 -116
  311. package/core/k-cli/node_modules/yaml/dist/nodes/Collection.d.ts +0 -73
  312. package/core/k-cli/node_modules/yaml/dist/nodes/Collection.js +0 -151
  313. package/core/k-cli/node_modules/yaml/dist/nodes/Node.d.ts +0 -53
  314. package/core/k-cli/node_modules/yaml/dist/nodes/Node.js +0 -40
  315. package/core/k-cli/node_modules/yaml/dist/nodes/Pair.d.ts +0 -22
  316. package/core/k-cli/node_modules/yaml/dist/nodes/Pair.js +0 -39
  317. package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.d.ts +0 -43
  318. package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.js +0 -27
  319. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.d.ts +0 -53
  320. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.js +0 -147
  321. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +0 -60
  322. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.js +0 -115
  323. package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +0 -4
  324. package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.js +0 -65
  325. package/core/k-cli/node_modules/yaml/dist/nodes/identity.d.ts +0 -23
  326. package/core/k-cli/node_modules/yaml/dist/nodes/identity.js +0 -53
  327. package/core/k-cli/node_modules/yaml/dist/nodes/toJS.d.ts +0 -29
  328. package/core/k-cli/node_modules/yaml/dist/nodes/toJS.js +0 -39
  329. package/core/k-cli/node_modules/yaml/dist/options.d.ts +0 -350
  330. package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.d.ts +0 -64
  331. package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.js +0 -218
  332. package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.d.ts +0 -8
  333. package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.js +0 -63
  334. package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.d.ts +0 -39
  335. package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.js +0 -99
  336. package/core/k-cli/node_modules/yaml/dist/parse/cst.d.ts +0 -109
  337. package/core/k-cli/node_modules/yaml/dist/parse/cst.js +0 -112
  338. package/core/k-cli/node_modules/yaml/dist/parse/lexer.d.ts +0 -87
  339. package/core/k-cli/node_modules/yaml/dist/parse/lexer.js +0 -719
  340. package/core/k-cli/node_modules/yaml/dist/parse/line-counter.d.ts +0 -22
  341. package/core/k-cli/node_modules/yaml/dist/parse/line-counter.js +0 -41
  342. package/core/k-cli/node_modules/yaml/dist/parse/parser.d.ts +0 -84
  343. package/core/k-cli/node_modules/yaml/dist/parse/parser.js +0 -972
  344. package/core/k-cli/node_modules/yaml/dist/public-api.d.ts +0 -44
  345. package/core/k-cli/node_modules/yaml/dist/public-api.js +0 -107
  346. package/core/k-cli/node_modules/yaml/dist/schema/Schema.d.ts +0 -17
  347. package/core/k-cli/node_modules/yaml/dist/schema/Schema.js +0 -39
  348. package/core/k-cli/node_modules/yaml/dist/schema/common/map.d.ts +0 -2
  349. package/core/k-cli/node_modules/yaml/dist/schema/common/map.js +0 -19
  350. package/core/k-cli/node_modules/yaml/dist/schema/common/null.d.ts +0 -4
  351. package/core/k-cli/node_modules/yaml/dist/schema/common/null.js +0 -17
  352. package/core/k-cli/node_modules/yaml/dist/schema/common/seq.d.ts +0 -2
  353. package/core/k-cli/node_modules/yaml/dist/schema/common/seq.js +0 -19
  354. package/core/k-cli/node_modules/yaml/dist/schema/common/string.d.ts +0 -2
  355. package/core/k-cli/node_modules/yaml/dist/schema/common/string.js +0 -16
  356. package/core/k-cli/node_modules/yaml/dist/schema/core/bool.d.ts +0 -4
  357. package/core/k-cli/node_modules/yaml/dist/schema/core/bool.js +0 -21
  358. package/core/k-cli/node_modules/yaml/dist/schema/core/float.d.ts +0 -4
  359. package/core/k-cli/node_modules/yaml/dist/schema/core/float.js +0 -47
  360. package/core/k-cli/node_modules/yaml/dist/schema/core/int.d.ts +0 -4
  361. package/core/k-cli/node_modules/yaml/dist/schema/core/int.js +0 -42
  362. package/core/k-cli/node_modules/yaml/dist/schema/core/schema.d.ts +0 -1
  363. package/core/k-cli/node_modules/yaml/dist/schema/core/schema.js +0 -25
  364. package/core/k-cli/node_modules/yaml/dist/schema/json/schema.d.ts +0 -2
  365. package/core/k-cli/node_modules/yaml/dist/schema/json/schema.js +0 -64
  366. package/core/k-cli/node_modules/yaml/dist/schema/json-schema.d.ts +0 -69
  367. package/core/k-cli/node_modules/yaml/dist/schema/tags.d.ts +0 -48
  368. package/core/k-cli/node_modules/yaml/dist/schema/tags.js +0 -99
  369. package/core/k-cli/node_modules/yaml/dist/schema/types.d.ts +0 -92
  370. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +0 -2
  371. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.js +0 -70
  372. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +0 -7
  373. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.js +0 -29
  374. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +0 -4
  375. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.js +0 -50
  376. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +0 -5
  377. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.js +0 -76
  378. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +0 -9
  379. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.js +0 -68
  380. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +0 -22
  381. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.js +0 -77
  382. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +0 -10
  383. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +0 -82
  384. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +0 -1
  385. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.js +0 -41
  386. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +0 -28
  387. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.js +0 -96
  388. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +0 -6
  389. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +0 -105
  390. package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +0 -34
  391. package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.js +0 -151
  392. package/core/k-cli/node_modules/yaml/dist/stringify/stringify.d.ts +0 -21
  393. package/core/k-cli/node_modules/yaml/dist/stringify/stringify.js +0 -132
  394. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +0 -17
  395. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.js +0 -155
  396. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.d.ts +0 -10
  397. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.js +0 -24
  398. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +0 -4
  399. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.js +0 -87
  400. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +0 -2
  401. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.js +0 -26
  402. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.d.ts +0 -3
  403. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.js +0 -152
  404. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.d.ts +0 -9
  405. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.js +0 -338
  406. package/core/k-cli/node_modules/yaml/dist/test-events.d.ts +0 -4
  407. package/core/k-cli/node_modules/yaml/dist/test-events.js +0 -134
  408. package/core/k-cli/node_modules/yaml/dist/util.d.ts +0 -16
  409. package/core/k-cli/node_modules/yaml/dist/util.js +0 -28
  410. package/core/k-cli/node_modules/yaml/dist/visit.d.ts +0 -102
  411. package/core/k-cli/node_modules/yaml/dist/visit.js +0 -236
  412. package/core/k-cli/node_modules/yaml/package.json +0 -97
  413. package/core/k-cli/node_modules/yaml/util.js +0 -2
@@ -1,106 +1,106 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- """
4
- UI/UX Pro Max Search - BM25 search engine for UI/UX style guides
5
- Usage: python search.py "<query>" [--domain <domain>] [--stack <stack>] [--max-results 3]
6
- python search.py "<query>" --design-system [-p "Project Name"]
7
- python search.py "<query>" --design-system --persist [-p "Project Name"] [--page "dashboard"]
8
-
9
- Domains: style, prompt, color, chart, landing, product, ux, typography
10
- Stacks: html-tailwind, react, nextjs
11
-
12
- Persistence (Master + Overrides pattern):
13
- --persist Save design system to design-system/MASTER.md
14
- --page Also create a page-specific override file in design-system/pages/
15
- """
16
-
17
- import argparse
18
- from core import CSV_CONFIG, AVAILABLE_STACKS, MAX_RESULTS, search, search_stack
19
- from design_system import generate_design_system, persist_design_system
20
-
21
-
22
- def format_output(result):
23
- """Format results for Claude consumption (token-optimized)"""
24
- if "error" in result:
25
- return f"Error: {result['error']}"
26
-
27
- output = []
28
- if result.get("stack"):
29
- output.append(f"## UI Pro Max Stack Guidelines")
30
- output.append(f"**Stack:** {result['stack']} | **Query:** {result['query']}")
31
- else:
32
- output.append(f"## UI Pro Max Search Results")
33
- output.append(f"**Domain:** {result['domain']} | **Query:** {result['query']}")
34
- output.append(f"**Source:** {result['file']} | **Found:** {result['count']} results\n")
35
-
36
- for i, row in enumerate(result['results'], 1):
37
- output.append(f"### Result {i}")
38
- for key, value in row.items():
39
- value_str = str(value)
40
- if len(value_str) > 300:
41
- value_str = value_str[:300] + "..."
42
- output.append(f"- **{key}:** {value_str}")
43
- output.append("")
44
-
45
- return "\n".join(output)
46
-
47
-
48
- if __name__ == "__main__":
49
- parser = argparse.ArgumentParser(description="UI Pro Max Search")
50
- parser.add_argument("query", help="Search query")
51
- parser.add_argument("--domain", "-d", choices=list(CSV_CONFIG.keys()), help="Search domain")
52
- parser.add_argument("--stack", "-s", choices=AVAILABLE_STACKS, help="Stack-specific search (html-tailwind, react, nextjs)")
53
- parser.add_argument("--max-results", "-n", type=int, default=MAX_RESULTS, help="Max results (default: 3)")
54
- parser.add_argument("--json", action="store_true", help="Output as JSON")
55
- # Design system generation
56
- parser.add_argument("--design-system", "-ds", action="store_true", help="Generate complete design system recommendation")
57
- parser.add_argument("--project-name", "-p", type=str, default=None, help="Project name for design system output")
58
- parser.add_argument("--format", "-f", choices=["ascii", "markdown"], default="ascii", help="Output format for design system")
59
- # Persistence (Master + Overrides pattern)
60
- parser.add_argument("--persist", action="store_true", help="Save design system to design-system/MASTER.md (creates hierarchical structure)")
61
- parser.add_argument("--page", type=str, default=None, help="Create page-specific override file in design-system/pages/")
62
- parser.add_argument("--output-dir", "-o", type=str, default=None, help="Output directory for persisted files (default: current directory)")
63
-
64
- args = parser.parse_args()
65
-
66
- # Design system takes priority
67
- if args.design_system:
68
- result = generate_design_system(
69
- args.query,
70
- args.project_name,
71
- args.format,
72
- persist=args.persist,
73
- page=args.page,
74
- output_dir=args.output_dir
75
- )
76
- print(result)
77
-
78
- # Print persistence confirmation
79
- if args.persist:
80
- project_slug = args.project_name.lower().replace(' ', '-') if args.project_name else "default"
81
- print("\n" + "=" * 60)
82
- print(f"✅ Design system persisted to design-system/{project_slug}/")
83
- print(f" 📄 design-system/{project_slug}/MASTER.md (Global Source of Truth)")
84
- if args.page:
85
- page_filename = args.page.lower().replace(' ', '-')
86
- print(f" 📄 design-system/{project_slug}/pages/{page_filename}.md (Page Overrides)")
87
- print("")
88
- print(f"📖 Usage: When building a page, check design-system/{project_slug}/pages/[page].md first.")
89
- print(f" If exists, its rules override MASTER.md. Otherwise, use MASTER.md.")
90
- print("=" * 60)
91
- # Stack search
92
- elif args.stack:
93
- result = search_stack(args.query, args.stack, args.max_results)
94
- if args.json:
95
- import json
96
- print(json.dumps(result, indent=2, ensure_ascii=False))
97
- else:
98
- print(format_output(result))
99
- # Domain search
100
- else:
101
- result = search(args.query, args.domain, args.max_results)
102
- if args.json:
103
- import json
104
- print(json.dumps(result, indent=2, ensure_ascii=False))
105
- else:
106
- print(format_output(result))
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ UI/UX Pro Max Search - BM25 search engine for UI/UX style guides
5
+ Usage: python search.py "<query>" [--domain <domain>] [--stack <stack>] [--max-results 3]
6
+ python search.py "<query>" --design-system [-p "Project Name"]
7
+ python search.py "<query>" --design-system --persist [-p "Project Name"] [--page "dashboard"]
8
+
9
+ Domains: style, prompt, color, chart, landing, product, ux, typography
10
+ Stacks: html-tailwind, react, nextjs
11
+
12
+ Persistence (Master + Overrides pattern):
13
+ --persist Save design system to design-system/MASTER.md
14
+ --page Also create a page-specific override file in design-system/pages/
15
+ """
16
+
17
+ import argparse
18
+ from core import CSV_CONFIG, AVAILABLE_STACKS, MAX_RESULTS, search, search_stack
19
+ from design_system import generate_design_system, persist_design_system
20
+
21
+
22
+ def format_output(result):
23
+ """Format results for Claude consumption (token-optimized)"""
24
+ if "error" in result:
25
+ return f"Error: {result['error']}"
26
+
27
+ output = []
28
+ if result.get("stack"):
29
+ output.append(f"## UI Pro Max Stack Guidelines")
30
+ output.append(f"**Stack:** {result['stack']} | **Query:** {result['query']}")
31
+ else:
32
+ output.append(f"## UI Pro Max Search Results")
33
+ output.append(f"**Domain:** {result['domain']} | **Query:** {result['query']}")
34
+ output.append(f"**Source:** {result['file']} | **Found:** {result['count']} results\n")
35
+
36
+ for i, row in enumerate(result['results'], 1):
37
+ output.append(f"### Result {i}")
38
+ for key, value in row.items():
39
+ value_str = str(value)
40
+ if len(value_str) > 300:
41
+ value_str = value_str[:300] + "..."
42
+ output.append(f"- **{key}:** {value_str}")
43
+ output.append("")
44
+
45
+ return "\n".join(output)
46
+
47
+
48
+ if __name__ == "__main__":
49
+ parser = argparse.ArgumentParser(description="UI Pro Max Search")
50
+ parser.add_argument("query", help="Search query")
51
+ parser.add_argument("--domain", "-d", choices=list(CSV_CONFIG.keys()), help="Search domain")
52
+ parser.add_argument("--stack", "-s", choices=AVAILABLE_STACKS, help="Stack-specific search (html-tailwind, react, nextjs)")
53
+ parser.add_argument("--max-results", "-n", type=int, default=MAX_RESULTS, help="Max results (default: 3)")
54
+ parser.add_argument("--json", action="store_true", help="Output as JSON")
55
+ # Design system generation
56
+ parser.add_argument("--design-system", "-ds", action="store_true", help="Generate complete design system recommendation")
57
+ parser.add_argument("--project-name", "-p", type=str, default=None, help="Project name for design system output")
58
+ parser.add_argument("--format", "-f", choices=["ascii", "markdown"], default="ascii", help="Output format for design system")
59
+ # Persistence (Master + Overrides pattern)
60
+ parser.add_argument("--persist", action="store_true", help="Save design system to design-system/MASTER.md (creates hierarchical structure)")
61
+ parser.add_argument("--page", type=str, default=None, help="Create page-specific override file in design-system/pages/")
62
+ parser.add_argument("--output-dir", "-o", type=str, default=None, help="Output directory for persisted files (default: current directory)")
63
+
64
+ args = parser.parse_args()
65
+
66
+ # Design system takes priority
67
+ if args.design_system:
68
+ result = generate_design_system(
69
+ args.query,
70
+ args.project_name,
71
+ args.format,
72
+ persist=args.persist,
73
+ page=args.page,
74
+ output_dir=args.output_dir
75
+ )
76
+ print(result)
77
+
78
+ # Print persistence confirmation
79
+ if args.persist:
80
+ project_slug = args.project_name.lower().replace(' ', '-') if args.project_name else "default"
81
+ print("\n" + "=" * 60)
82
+ print(f"✅ Design system persisted to design-system/{project_slug}/")
83
+ print(f" 📄 design-system/{project_slug}/MASTER.md (Global Source of Truth)")
84
+ if args.page:
85
+ page_filename = args.page.lower().replace(' ', '-')
86
+ print(f" 📄 design-system/{project_slug}/pages/{page_filename}.md (Page Overrides)")
87
+ print("")
88
+ print(f"📖 Usage: When building a page, check design-system/{project_slug}/pages/[page].md first.")
89
+ print(f" If exists, its rules override MASTER.md. Otherwise, use MASTER.md.")
90
+ print("=" * 60)
91
+ # Stack search
92
+ elif args.stack:
93
+ result = search_stack(args.query, args.stack, args.max_results)
94
+ if args.json:
95
+ import json
96
+ print(json.dumps(result, indent=2, ensure_ascii=False))
97
+ else:
98
+ print(format_output(result))
99
+ # Domain search
100
+ else:
101
+ result = search(args.query, args.domain, args.max_results)
102
+ if args.json:
103
+ import json
104
+ print(json.dumps(result, indent=2, ensure_ascii=False))
105
+ else:
106
+ print(format_output(result))
@@ -2111,8 +2111,7 @@ class TaskAPI {
2111
2111
  // TASK_2264: decide up front whether post-complete (below) will measure 'after' in-process.
2112
2112
  // TASK_2288 single-winner rule: whenever a post-complete run is expected for this completion,
2113
2113
  // post-complete's own measurement is the ONE 'after' capture (it runs after merge and feeds the
2114
- // verdict), so moveTask must not also spawn one. Expected = in-process (below) OR the caller
2115
- // (headless.js / scheduler, signalled by FORMATION_HEADLESS / FORMATION_SCHEDULER) runs it itself.
2114
+ // verdict), so moveTask must not also spawn one. Expected = in-process (below).
2116
2115
  // moveTask's detached capture stays the sole one only when nobody measures: --skip-post-complete.
2117
2116
  const postCompleteRuns = !options.skipPostComplete;
2118
2117
  const result = await this.moveTask(taskId, 'done', updatedTask, { skipHealthAfter: postCompleteRuns });
@@ -2135,8 +2134,6 @@ class TaskAPI {
2135
2134
  }
2136
2135
 
2137
2136
  // 自動執行 post-complete(除非明確跳過)
2138
- // - FORMATION_SCHEDULER: 由 scheduler 統一管理,避免重複執行
2139
- // - FORMATION_HEADLESS: 由 headless.js onDone 統一執行,避免並行 agent git 衝突
2140
2137
  if (postCompleteRuns) {
2141
2138
  try {
2142
2139
  const { postComplete } = require('../../.formation/tools/post-complete.js');
@@ -1,16 +1,10 @@
1
1
  # Formation System
2
2
 
3
- Agent 部署陣型系統。根據任務規模選擇適當的陣型。
3
+ Subagent 調度。唯一的 live 路徑:`dispatch.js --dispatch-mode=subagent` 印出 JSON(`promptText` + `agentParams`),由 Ansuz 交給 Agent tool(或 `--harness=codex` 的 Codex `spawn_agent`)執行。
4
4
 
5
- ## 陣型一覽
5
+ Headless(`claude -p`、`kenaz_dispatch`)、Squad、Legion、Legacy scheduler 已退役;`squad/`、`legion/` 的 YAML 只是歷史定義,`dispatch.js` 遇到會直接報錯結束。
6
6
 
7
- ```
8
- Unit → Solo → Squad → Legion
9
- 1×1 1×N N×1 Native Team
10
- 最輕量 最靈活 真並行 最重火力
11
- ```
12
-
13
- ---
7
+ ## 陣型
14
8
 
15
9
  ### Unit
16
10
 
@@ -18,138 +12,37 @@ Unit → Solo → Squad → Legion
18
12
 
19
13
  派出一個 subagent 執行單一任務,完成後回報結果。不切換角色、不協作,純粹的「去做這件事」。
20
14
 
21
- - 機制:`Task` 工具,單次調用
22
- - 成本:最低
23
15
  - 適用:明確的單一任務、Bug 修復、檔案修改、腳本執行
24
-
25
- ---
16
+ - 可用 skill:`do`、`think`、`plan`
26
17
 
27
18
  ### Solo
28
19
 
29
20
  **1 agent, N perspectives** — 單人多視角自主切換。
30
21
 
31
- 派出一個 subagent,同時裝備多個專業視角。Agent 根據分析過程中的需要,自主決定何時切換到哪個視角。不是輪流發言,是一個人用不同鏡頭看同一件事。
22
+ 一個 subagent,同時裝備多個專業視角,由 agent 自主決定何時切換。
32
23
 
33
- - 機制:`dispatch.js --formation=solo`,prompt 中載入所有 `perspectives`
34
- - 成本:低(單次 subagent 調用)
24
+ - 機制:`dispatch.js --formation=solo`
35
25
  - 適用:策略分析、程式碼審查、方案評估、設計決策
36
26
  - 可用 skill:`strategy`(策略分析)、`diagnosis`(問題診斷)
37
27
 
38
- ```
39
- 範例:Solo + Strategy
40
- → [技術專家] 分析架構影響
41
- → 發現成本問題 → [產品策略師] 評估 ROI
42
- → 發現安全疑慮 → [風險分析師] 識別風險
43
- → 綜合判斷,產出結論
44
- (視角切換由 agent 自主決定,非固定順序)
45
- ```
46
-
47
- ---
48
-
49
- ### Squad
50
-
51
- **N agents, 1 task** — 多 agent 並行協作。
52
-
53
- 同時派出多個 subagent,各自負責任務的不同部分,並行執行後整合成果。成員之間不能互相通訊(那是 Legion 的事),各自獨立完成後由 lead 整合。
54
-
55
- - 機制:`dispatch.js --formation=squad`,並行啟動多個 Claude 進程
56
- - 成本:中等(隨 agent 數量線性增長)
57
- - 適用:並行子任務開發、跨模組批量修改、多區域同步掃蕩
58
- - 可用 skill:`blitz`(通用並行拆分)、`sweep`(同規則多範圍掃蕩)
59
-
60
- **核心約束**:
61
- - 成員之間 **不通訊**,只靠 `shared_context`(啟動前定義的共享約定)協調
62
- - 每個成員的 `scope_paths` 不得重疊(避免檔案衝突)
63
- - 如果子任務之間有依賴關係,不適合用 Squad
64
-
65
- ```
66
- 範例 1:Squad + blitz(並行拆分)
67
- ├── [part_1] → 實作模組 A 的功能
68
- ├── [part_2] → 實作模組 B 的功能
69
- └── [part_3] → 實作模組 C 的功能
70
- → lead 整合驗證,統一提交
71
-
72
- 範例 2:Squad + sweep(同規則掃蕩)
73
- ├── [zone_1] → 重構 cmd_modules/ 下的模組
74
- ├── [zone_2] → 重構 components/ 下的元件
75
- └── [zone_3] → 重構 lib/ 下的工具函數
76
- → lead 驗證一致性,統一提交
77
- ```
78
-
79
- ---
80
-
81
- ### Legion
82
-
83
- **Native Team** — 即時溝通的完整團隊。
84
-
85
- 使用 Claude Code 原生的 TeamCreate 機制,建立持久化團隊。成員之間可互相通訊、即時協調。Legion 的核心價值不是「更多人」,而是「即時溝通」— 只在成員的工作互相影響、需要即時協調時使用。
86
-
87
- - 機制:`TeamCreate` + `SendMessage`
88
- - 成本:最高(持久化 context + 通訊開銷)
89
- - 適用:有順序依賴、回饋循環、或高度耦合的複雜任務
90
- - 可用 skill:`forge`(順序流水線)、`hive`(網狀即時協調)
91
-
92
- **核心價值**(Squad 做不到的事):
93
- - 即時通知「我改了 X,你要更新」
94
- - 回饋循環(review → fix → re-review)
95
- - 順序依賴(A 做完 B 才開始)
96
- - 動態調整(做到一半改方向)
97
-
98
- ```
99
- 範例 1:Legion + forge(鍛造)
100
- Designer ──→ Implementer(s) ──→ Reviewer
101
- ↑ 回饋修正 ←──────────────────↓
102
- → 設計 → 打造 → 淬煉,有序且有品質把關
103
-
104
- 範例 2:Legion + hive(蜂巢)
105
- Worker A ←→ Worker B
106
- ↕ ↕
107
- Worker C ←→ Worker D
108
- → 所有人即時互聯,任何變更即時同步
109
- ```
110
-
111
- ---
112
-
113
- ## 選擇指南
114
-
115
- | 問自己 | 答案 | 陣型 |
116
- |--------|------|------|
117
- | 任務簡單、目標明確? | Yes | **Unit** |
118
- | 需要多角度分析? | Yes | **Solo** |
119
- | 需要同時做多件事? | Yes | **Squad** |
120
- | 有順序依賴或回饋循環? | Yes | **Legion** (forge) |
121
- | 工作高度耦合、需即時協調? | Yes | **Legion** (hive) |
122
-
123
28
  ---
124
29
 
125
30
  ## 啟動方式
126
31
 
127
- ### Headless Mode(推薦)
128
-
129
- 由 Formation Lead 配好任務後直接呼叫,subagent 不問問題:
130
-
131
32
  ```bash
132
- # Unit: 單一任務
133
- node .formation/tools/headless.js --skill=do --task="修正按鈕顏色"
33
+ # Unit
34
+ node .formation/tools/dispatch.js --skill=do --task=TASK_172 --dispatch-mode=subagent
134
35
 
135
- # Solo: 多視角分析
136
- node .formation/tools/headless.js --formation=solo --skill=strategy --task="評估快取方案"
36
+ # Solo
37
+ node .formation/tools/dispatch.js --formation=solo --skill=strategy --task=TASK_172 --dispatch-mode=subagent
137
38
 
138
- # Squad: 並行執行
139
- node .formation/tools/headless.js --formation=squad --skill=blitz --task=TASK_201
140
-
141
- # Legion: Agent Teams 即時協作
142
- node .formation/tools/headless.js --formation=legion --skill=forge --task=TASK_202
143
-
144
- # Dry run(只看 prompt,不啟動)
145
- node .formation/tools/headless.js --formation=legion --skill=forge --task=TASK_202 --dry-run
39
+ # Codex harness / 子專案 / 只看 payload 不產生副作用
40
+ node .formation/tools/dispatch.js --skill=do --task=TASK_172 --dispatch-mode=subagent --harness=codex
41
+ node .formation/tools/dispatch.js --skill=do --task=TASK_172 --dispatch-mode=subagent --project-path <path>
42
+ node .formation/tools/dispatch.js --skill=do --task=TASK_172 --dispatch-mode=subagent --dry-run
146
43
  ```
147
44
 
148
- ### Dispatch Mode(互動式)
149
-
150
- ```bash
151
- node .formation/tools/dispatch.js --skill=do --task=TASK_172
152
- ```
45
+ 缺 `--dispatch-mode=subagent`、或指定 squad/legion skill,都會以非零 exit code 結束並印出原因。
153
46
 
154
47
  ---
155
48
 
@@ -158,31 +51,13 @@ node .formation/tools/dispatch.js --skill=do --task=TASK_172
158
51
  ```
159
52
  .formation/
160
53
  ├── README.md # 本文件
161
- ├── lead.yaml # Formation Lead(陣型選擇器)
54
+ ├── lead.yaml # Formation Lead
162
55
  ├── tools/
163
- │ ├── headless.js # ⭐ 無頭啟動器(所有陣型)
164
- │ ├── dispatch.js # CLI 入口(互動式)
56
+ │ ├── dispatch.js # CLI 入口(--dispatch-mode=subagent)
165
57
  │ ├── loader.js # YAML/Task 載入
166
- │ ├── prompt.js # Prompt 組裝(unit/solo/squad/legion)
167
- │ ├── runner.js # Claude 進程管理(single + parallel)
168
- │ ├── logger.js # Log 格式化
58
+ │ ├── prompt.js # Subagent prompt 組裝 + 傳輸前綴
59
+ │ ├── post-complete.js # 完成後 merge / 驗證
169
60
  │ └── utils.js # 工具函數
170
- ├── logs/ # ⭐ 執行日誌(按陣型分目錄)
171
- │ ├── unit/
172
- │ ├── solo/
173
- │ ├── squad/
174
- │ └── legion/
175
- ├── unit/ # Unit 陣型定義
176
- │ ├── do.yaml # 執行者
177
- │ ├── think.yaml # 分析者
178
- │ └── plan.yaml # 規劃者
179
- ├── solo/ # Solo 陣型定義(含視角集)
180
- │ ├── strategy.yaml # 策略分析(6 視角)
181
- │ └── diagnosis.yaml # 問題診斷(4 視角)
182
- ├── squad/ # Squad 陣型定義(含協作模板)
183
- │ ├── blitz.yaml # 通用並行拆分
184
- │ └── sweep.yaml # 同規則多範圍掃蕩
185
- └── legion/ # Legion 陣型定義(含溝通模式)
186
- ├── forge.yaml # 順序流水線(設計→打造→淬煉)
187
- └── hive.yaml # 網狀即時協調(全連接)
61
+ ├── unit/ # do / think / plan
62
+ └── solo/ # strategy / diagnosis
188
63
  ```
@@ -40,12 +40,47 @@ function writeIfChanged(f, text) {
40
40
  return 'written';
41
41
  }
42
42
 
43
+ // Global Codex instructions (~/.codex/AGENTS.md, read by every Codex session): a marked Kenaz block,
44
+ // so Codex agents know how to report Kenaz problems (wish / field report) like Claude's /Ansuz does.
45
+ // Only the text between the markers is ours; the user's own content is never touched.
46
+ const AGENTS_BEGIN = '<!-- kenaz:begin (managed by kenaz install; edits here are overwritten) -->';
47
+ const AGENTS_END = '<!-- kenaz:end -->';
48
+ function agentsBlock() {
49
+ return [AGENTS_BEGIN, '## Kenaz',
50
+ '- Kenaz tools come from the `kenaz-dashboard` MCP server (kenaz-server on 127.0.0.1:18080); `$kenaz status|init|ygg ...` runs the Kenaz CLI (needs network access to 127.0.0.1).',
51
+ '- When Kenaz itself blocks or degrades the work (a tool/hook/install/peer/dispatch failure, wrong data, missing capability), call `kenaz_wish_create` BEFORE working around it:',
52
+ ' projectPath = this project; scope = `kenaz` (Kenaz problem) or `project`; wish_type = `bug` | `feature` | `question`;',
53
+ ' content = one-line repro + expected vs actual + versions (`npx kenaz doctor` lines) + session id. Never paste keys or tokens.',
54
+ ' A scope=kenaz wish is sent to the Kenaz team as a field report. Report each problem once, then finish the work with the workaround and tell the user the wish was filed.',
55
+ AGENTS_END].join('\n');
56
+ }
57
+ function withoutAgentsBlock(text) {
58
+ const a = text.indexOf(AGENTS_BEGIN), b = text.indexOf(AGENTS_END);
59
+ if (a < 0 || b < a) return text;
60
+ return (text.slice(0, a) + text.slice(b + AGENTS_END.length)).replace(/\n{3,}/g, '\n\n').trim() + '\n';
61
+ }
62
+ function installAgentsBlock() {
63
+ const f = path.join(codexHome(), 'AGENTS.md');
64
+ const cur = fs.existsSync(f) ? fs.readFileSync(f, 'utf8') : '';
65
+ const base = withoutAgentsBlock(cur).trim();
66
+ return writeIfChanged(f, (base ? base + '\n\n' : '') + agentsBlock() + '\n');
67
+ }
68
+ function removeAgentsBlock(dryRun) {
69
+ const f = path.join(codexHome(), 'AGENTS.md');
70
+ if (!fs.existsSync(f)) return 'absent';
71
+ const cur = fs.readFileSync(f, 'utf8');
72
+ if (!cur.includes(AGENTS_BEGIN)) return 'absent';
73
+ if (!dryRun) { const rest = withoutAgentsBlock(cur); if (rest.trim()) fs.writeFileSync(f, rest); else fs.rmSync(f, { force: true }); }
74
+ return 'removed';
75
+ }
76
+
43
77
  function installPrompts(core) {
44
78
  const f = path.join(codexHome(), 'prompts', 'kenaz.md');
45
79
  const skill = path.join(codexHome(), 'skills', 'kenaz', 'SKILL.md');
46
80
  const a = writeIfChanged(f, promptText(core));
47
81
  const b = writeIfChanged(skill, skillText(core));
48
- return { file: f, skill, action: a === 'unchanged' && b === 'unchanged' ? 'unchanged' : 'written' };
82
+ const c = installAgentsBlock();
83
+ return { file: f, skill, action: [a, b, c].every((x) => x === 'unchanged') ? 'unchanged' : 'written' };
49
84
  }
50
85
 
51
86
  // Per event: is our shim registered, and does codex hold a trusted_hash for it (hooks.state)?
@@ -95,7 +130,7 @@ function diagnose() {
95
130
  return { trust, delivery_mode: deliveryMode(trust), ok: notes.length === 0, notes };
96
131
  }
97
132
 
98
- module.exports = { promptText, skillText, installPrompts, hookTrust, deliveryMode, diagnose, SHIM_REL, EVENTS };
133
+ module.exports = { promptText, skillText, installPrompts, installAgentsBlock, removeAgentsBlock, agentsBlock, hookTrust, deliveryMode, diagnose, SHIM_REL, EVENTS };
99
134
 
100
135
  if (require.main === module) {
101
136
  if (process.argv.includes('--install-prompts')) console.log(JSON.stringify(installPrompts()));
@@ -49,3 +49,21 @@ test('shim honours Kenaz mode: off silent, full control still runs', () => {
49
49
  assert.strictEqual(off.stderr.includes('event='), false);
50
50
  assert.ok(full.stderr.includes('event=SessionStart')); // control: hook does run when not off
51
51
  });
52
+
53
+ test('global AGENTS.md gets one managed Kenaz block (wish / field report guidance); user text kept; removal leaves the rest', () => {
54
+ const home = fs.mkdtempSync(path.join(os.tmpdir(), 'cx-agents-'));
55
+ process.env.CODEX_HOME = home;
56
+ const f = path.join(home, 'AGENTS.md');
57
+ fs.writeFileSync(f, '# My own Codex rules\nAlways be terse.\n');
58
+ D.installAgentsBlock();
59
+ D.installAgentsBlock(); // idempotent: still one block
60
+ const t = fs.readFileSync(f, 'utf8');
61
+ assert.match(t, /Always be terse\./);
62
+ assert.strictEqual(t.split('kenaz:begin').length - 1, 1);
63
+ assert.match(t, /kenaz_wish_create/);
64
+ assert.strictEqual(D.removeAgentsBlock(false), 'removed');
65
+ const after = fs.readFileSync(f, 'utf8');
66
+ assert.match(after, /Always be terse\./);
67
+ assert.doesNotMatch(after, /kenaz:begin|kenaz_wish_create/);
68
+ delete process.env.CODEX_HOME;
69
+ });
@@ -305,7 +305,7 @@ function writeOverride(prompt, bootContext) {
305
305
 
306
306
  fs.writeFileSync(OVERRIDE_PATH, content, 'utf8');
307
307
 
308
- // Write adapter signal file so headless.js knows to route through Bifröst
308
+ // Write adapter signal file (read by session.js and the Dashboard bifrost-active route)
309
309
  const signalPath = path.join(ROOT, '.formation', '.bifrost-active');
310
310
  fs.writeFileSync(signalPath, JSON.stringify({ adapter: 'openai', specialist: SPECIALIST, pid: process.pid, started: new Date().toISOString() }));
311
311
 
@@ -123,6 +123,11 @@ async function main() {
123
123
  try { mode = require(path.resolve(ROOT, 'plugins/kenaz/hooks/mode.js')).resolveMode(p.cwd || process.cwd()); } catch {}
124
124
  if (mode === 'off') process.exit(0);
125
125
  console.error('[codex-hook-shim] event=' + ev);
126
+ // Register this project with kenaz-server (idempotent, no-op when known): Codex sessions never run
127
+ // the Claude turn-context hook, so a Codex-only machine stayed out of its room (field report).
128
+ const registering = (ev === 'SessionStart' || ev === 'UserPromptSubmit')
129
+ ? (() => { try { const r = resolvePeerProjectRoot(p.cwd || process.cwd()); return r ? peerRequest('POST', '/api/projects/register', { projectPath: r }) : null; } catch { return null; } })()
130
+ : null;
126
131
  const payload = normalizeHookPayload(p);
127
132
  if (ev === 'UserPromptSubmit') {
128
133
  payload.specialist = p.specialist || payload.specialist;
@@ -164,6 +169,7 @@ async function main() {
164
169
  }).catch(() => {}).finally(() => process.exit(0));
165
170
  return; // exit handled by finally above
166
171
  }
172
+ if (registering) await registering; // bounded by PEER_TIMEOUT_MS; fail-open
167
173
  process.exit(0);
168
174
  }
169
175
 
@@ -33,7 +33,17 @@ async function fixture({ project, cwd = path.resolve('hook-cwd'), reject = false
33
33
  readFileSync: () => { throw new Error('no real state reads'); },
34
34
  };
35
35
  // TASK_2299 peer pull deps; no KENAZ_PEER_PULL in these fixtures, so no request is expected.
36
- if (id === 'http') return { request: () => { effects.http.push('request'); assert.fail('unexpected peer request'); } };
36
+ // The only request allowed here is the idempotent project registration (SessionStart /
37
+ // UserPromptSubmit); the fake fails it at once, like a server that is down (fail-open).
38
+ if (id === 'http') return { request: (opts) => {
39
+ if (opts && opts.method === 'POST' && opts.path === '/api/projects/register') {
40
+ effects.http.push('register');
41
+ const handlers = {};
42
+ const req = { on: (ev, fn) => { handlers[ev] = fn; return req; }, destroy: () => {}, end: () => { if (handlers.error) handlers.error(new Error('down')); } };
43
+ return req;
44
+ }
45
+ effects.http.push('request'); assert.fail('unexpected peer request');
46
+ } };
37
47
  if (id.endsWith('_peer-project-root.js')) return { resolvePeerProjectRoot: dir => dir };
38
48
  if (id === 'child_process') return { execFileSync: () => assert.fail('unexpected child') };
39
49
  effects.modules.push(id);
@@ -231,6 +231,9 @@ function uninstall(options = {}) {
231
231
  if (res.hooks === 'removed' && !dryRun) fs.writeFileSync(cfg, out.join('\n').replace(/\n{3,}/g, '\n\n'), 'utf8');
232
232
  const prompt = path.join(getCodexHome(), 'prompts', 'kenaz.md');
233
233
  if (fs.existsSync(prompt)) { res.prompt = 'removed'; if (!dryRun) fs.rmSync(prompt, { force: true }); }
234
+ const skillDir = path.join(getCodexHome(), 'skills', 'kenaz');
235
+ if (fs.existsSync(skillDir)) { res.skill = 'removed'; if (!dryRun) fs.rmSync(skillDir, { recursive: true, force: true }); }
236
+ try { res.agents_md = require('./codex-doctor').removeAgentsBlock(dryRun); } catch (_) { /* doctor optional */ }
234
237
  log((dryRun ? 'dry-run: ' : '') + 'codex uninstall ' + JSON.stringify(res));
235
238
  return { success: true, ...res };
236
239
  }
@@ -28,7 +28,6 @@ const PROJECT_ROOT = path.resolve(SPEC_DIR, '../..');
28
28
  const FILES = {
29
29
  taskApi: path.join(PROJECT_ROOT, '.collaboration/core/task-api.js'),
30
30
  postComplete: path.join(PROJECT_ROOT, '.formation/tools/post-complete/staging.js'),
31
- headless: path.join(PROJECT_ROOT, '.formation/tools/headless.js'),
32
31
  kenazRs: path.join(PROJECT_ROOT, 'dashboard/src-tauri/src/infrastructure/http_server/routes/mcp_tools/kenaz.rs'),
33
32
  spec: path.join(SPEC_DIR, 'task_operations.yaml'),
34
33
  };
@@ -1,2 +1,2 @@
1
- Hello World
2
- Canary OK
1
+ Hello World
2
+ Canary OK
@@ -52,9 +52,3 @@ test('control: no project path / absent project file', () => {
52
52
  assert.equal(t.utils.loadDashboardModels(t.proj).dispatchModel, 'c'); // project file absent -> core
53
53
  } finally { fs.rmSync(t.base, { recursive: true, force: true }); }
54
54
  });
55
-
56
- test('headless.js derives dispatchModel and agent models from one loadDashboardModels object', () => {
57
- const src = fs.readFileSync(path.join(__dirname, 'headless.js'), 'utf8');
58
- assert.ok(!src.includes("'dashboard-models.json')"), 'no inline path loops left');
59
- assert.match(src, /const _dashboardModels = loadDashboardModels\(projectPath\)/);
60
- });
@@ -24,17 +24,9 @@ sub-project's shared main tree, which this dispatch must not touch. The
24
24
  pre-built worktree path given directly in this prefix is the only correct
25
25
  edit target; treat the Project Context path as informational only.
26
26
 
27
- ## Why Synapse calls use the main repo path, not the worktree path
28
-
29
- Synapse's index is keyed to the project's main repo path. Passing the
30
- worktree path as `projectPath` would either miss the existing index entirely
31
- or fragment it across a path that will not exist after the worktree is
32
- cleaned up. Always pass the main repo path shown in this prefix.
33
-
34
27
  ## Shared rules
35
28
 
36
29
  Every rule in `.formation/tools/dispatch-detail/worktree-subagent-mode.md`
37
30
  (commit-first with telemetry excludes, no long builds, no sleep polling, no
38
31
  taskkill by image name, single-task only, no task-api complete) applies here
39
- identically — the only difference is which absolute path is the edit target
40
- and which path Synapse calls use.
32
+ identically — the only difference is which absolute path is the edit target.
@@ -27,8 +27,8 @@ that worktree hangs waiting for a lock nothing will ever release.
27
27
 
28
28
  ## Why no long builds / full test suites
29
29
 
30
- Bash foreground calls cap at 10 minutes; a cold Rust build (kuzu's CMake
31
- alone can run 10+ minutes) gets killed mid-compile. Running it backgrounded
30
+ Bash foreground calls cap at 10 minutes; a cold Rust build
31
+ (can run 10+ minutes) gets killed mid-compile. Running it backgrounded
32
32
  instead just produces the orphan-lock problem above, because the previous
33
33
  rule (no resuming later) means you have nothing to do but end the turn while
34
34
  it's still running. The main thread (Ansuz) has a warm cache, can poll