create-harness-vibe-coding 0.8.19 → 0.9.3

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 (656) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README-CN.md +4 -2
  3. package/README.md +23 -4
  4. package/package.json +17 -2
  5. package/src/generator.js +19 -6
  6. package/src/index.js +531 -38
  7. package/src/prompts.js +4 -4
  8. package/src/ui/dist/assets/AgentsRoute-BGGs90wH.js +7 -0
  9. package/src/ui/dist/assets/Assistant-Bold-gm-uSS1B.woff2 +0 -0
  10. package/src/ui/dist/assets/Assistant-Medium-DrcxCXg3.woff2 +0 -0
  11. package/src/ui/dist/assets/Assistant-Regular-DVxZuzxb.woff2 +0 -0
  12. package/src/ui/dist/assets/Assistant-SemiBold-SCI4bEL9.woff2 +0 -0
  13. package/src/ui/dist/assets/Combination-DhBLEmof.js +42 -0
  14. package/src/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  15. package/src/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  16. package/src/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  17. package/src/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  18. package/src/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  19. package/src/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  20. package/src/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  21. package/src/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  22. package/src/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  23. package/src/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  24. package/src/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  25. package/src/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  26. package/src/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  27. package/src/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  28. package/src/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  29. package/src/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  30. package/src/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  31. package/src/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  32. package/src/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  33. package/src/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  34. package/src/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  35. package/src/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  36. package/src/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  37. package/src/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  38. package/src/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  39. package/src/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  40. package/src/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  41. package/src/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  42. package/src/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  43. package/src/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  44. package/src/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  45. package/src/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  46. package/src/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  47. package/src/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  48. package/src/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  49. package/src/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  50. package/src/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  51. package/src/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  52. package/src/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  53. package/src/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  54. package/src/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  55. package/src/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  56. package/src/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  57. package/src/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  58. package/src/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  59. package/src/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  60. package/src/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  61. package/src/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  62. package/src/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  63. package/src/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  64. package/src/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  65. package/src/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  66. package/src/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  67. package/src/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  68. package/src/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  69. package/src/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  70. package/src/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  71. package/src/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  72. package/src/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  73. package/src/ui/dist/assets/RolesRoute-DnodCSz0.js +2 -0
  74. package/src/ui/dist/assets/RuntimePicker-CucD8TGn.js +7 -0
  75. package/src/ui/dist/assets/SettingsRoute-DquMWjac.js +2 -0
  76. package/src/ui/dist/assets/TaskList-Bxc0Uktx.js +7 -0
  77. package/src/ui/dist/assets/TerminalDrawer-CDusYltc.js +36 -0
  78. package/src/ui/dist/assets/WorkflowRoute-BN8yHmUs.css +1 -0
  79. package/src/ui/dist/assets/WorkflowRoute-D-0wVDpY.js +334 -0
  80. package/src/ui/dist/assets/abnfDiagram-VRR7QNED-zkRKkaxO.js +2 -0
  81. package/src/ui/dist/assets/apl-B4CMkyY2.js +2 -0
  82. package/src/ui/dist/assets/ar-SA-G6X2FPQ2-BiHaArx5.js +11 -0
  83. package/src/ui/dist/assets/arc-CBnLtOFO.js +2 -0
  84. package/src/ui/dist/assets/architectureDiagram-ZJ3FMSHR-DWXRXsh1.js +37 -0
  85. package/src/ui/dist/assets/asciiarmor-Df11BRmG.js +2 -0
  86. package/src/ui/dist/assets/asn1-EdZsLKOL.js +2 -0
  87. package/src/ui/dist/assets/asterisk-B-8jnY81.js +2 -0
  88. package/src/ui/dist/assets/az-AZ-76LH7QW2-CiT05voO.js +2 -0
  89. package/src/ui/dist/assets/bg-BG-XCXSNQG7-L-UM9tNf.js +6 -0
  90. package/src/ui/dist/assets/blockDiagram-677ZJIJ3-BIyh3Bry.js +133 -0
  91. package/src/ui/dist/assets/bn-BD-2XOGV67Q-NdgbA0bC.js +6 -0
  92. package/src/ui/dist/assets/brainfuck-C4LP7Hcl.js +2 -0
  93. package/src/ui/dist/assets/c4Diagram-LMCZKHZV-CA54vWWM.js +11 -0
  94. package/src/ui/dist/assets/ca-ES-6MX7JW3Y-BKZZsQ5J.js +9 -0
  95. package/src/ui/dist/assets/channel-Da_-zcAu.js +2 -0
  96. package/src/ui/dist/assets/chunk-2Q5K7J3B-DE4cxr1v.js +2 -0
  97. package/src/ui/dist/assets/chunk-32BRIVSS-i7FwbEU9.js +2 -0
  98. package/src/ui/dist/assets/chunk-5VM5RSS4-BhIcOYSu.js +16 -0
  99. package/src/ui/dist/assets/chunk-EX3LRPZG-Ci9zZRIs.js +232 -0
  100. package/src/ui/dist/assets/chunk-JWPE2WC7-BFdkcz-G.js +2 -0
  101. package/src/ui/dist/assets/chunk-MOJQB5TN-Dzmapl_S.js +89 -0
  102. package/src/ui/dist/assets/chunk-RYQCIY6F-RTmp7FOy.js +2 -0
  103. package/src/ui/dist/assets/chunk-V7JOEXUC-DInU3v3D.js +207 -0
  104. package/src/ui/dist/assets/chunk-VR4S4FIN-BHoyGBQO.js +2 -0
  105. package/src/ui/dist/assets/chunk-XXDRQBXY-DfeLZNZx.js +2 -0
  106. package/src/ui/dist/assets/classDiagram-OUVF2IWQ-FKbUS0bu.js +2 -0
  107. package/src/ui/dist/assets/classDiagram-v2-EOCWNBFH-FKbUS0bu.js +2 -0
  108. package/src/ui/dist/assets/clike-B9uivgTg.js +2 -0
  109. package/src/ui/dist/assets/clojure-BMjYHr_A.js +2 -0
  110. package/src/ui/dist/assets/cmake-BQqOBYOt.js +2 -0
  111. package/src/ui/dist/assets/cobol-CWcv1MsR.js +2 -0
  112. package/src/ui/dist/assets/coffeescript-S37ZYGWr.js +2 -0
  113. package/src/ui/dist/assets/commonlisp-DBKNyK5s.js +2 -0
  114. package/src/ui/dist/assets/cose-bilkent-JH36ORCC-_5PUJ615.js +2 -0
  115. package/src/ui/dist/assets/crystal-SjHAIU92.js +2 -0
  116. package/src/ui/dist/assets/cs-CZ-2BRQDIVT-DnkfnhDU.js +12 -0
  117. package/src/ui/dist/assets/css-BnMrqG3P.js +2 -0
  118. package/src/ui/dist/assets/cynefin-VYW2F7L2-CmkcFv-b.js +179 -0
  119. package/src/ui/dist/assets/cynefinDiagram-TSTJHNR4-D72VZn8H.js +63 -0
  120. package/src/ui/dist/assets/cypher-C_CwsFkJ.js +2 -0
  121. package/src/ui/dist/assets/cytoscape.esm-DTSO7Bv0.js +332 -0
  122. package/src/ui/dist/assets/d-pRatUO7H.js +2 -0
  123. package/src/ui/dist/assets/da-DK-5WZEPLOC-C54tQUgd.js +6 -0
  124. package/src/ui/dist/assets/dagre-VKFMJZFB-0BsAkrmo.js +5 -0
  125. package/src/ui/dist/assets/de-DE-XR44H4JA-DGfZlR10.js +9 -0
  126. package/src/ui/dist/assets/defaultLocale-DX6XiGOO.js +2 -0
  127. package/src/ui/dist/assets/diagram-FQU43EPY-C1ZJDOca.js +4 -0
  128. package/src/ui/dist/assets/diagram-G47NLZAW-D3pr3FSP.js +25 -0
  129. package/src/ui/dist/assets/diagram-NH7WQ7WH-Bwry0NV-.js +25 -0
  130. package/src/ui/dist/assets/diagram-OA4YK3LP-L6g09cmV.js +31 -0
  131. package/src/ui/dist/assets/diagram-WEI45ONY-Bh1puYVX.js +42 -0
  132. package/src/ui/dist/assets/diff-DbItnlRl.js +2 -0
  133. package/src/ui/dist/assets/directory-open-01563666-DWU9wJ6I.js +2 -0
  134. package/src/ui/dist/assets/directory-open-4ed118d0-CunoC1EB.js +2 -0
  135. package/src/ui/dist/assets/dockerfile-BKs6k2Af.js +2 -0
  136. package/src/ui/dist/assets/dtd-DF_7sFjM.js +2 -0
  137. package/src/ui/dist/assets/dylan-DwRh75JA.js +2 -0
  138. package/src/ui/dist/assets/ebnf-CDyGwa7X.js +2 -0
  139. package/src/ui/dist/assets/ebnfDiagram-CCIWWBDH-BC_mBRR5.js +2 -0
  140. package/src/ui/dist/assets/ecl-Cabwm37j.js +2 -0
  141. package/src/ui/dist/assets/eiffel-CnydiIhH.js +2 -0
  142. package/src/ui/dist/assets/el-GR-BZB4AONW-DsnwWweL.js +11 -0
  143. package/src/ui/dist/assets/elm-vLlmbW-K.js +2 -0
  144. package/src/ui/dist/assets/erDiagram-Q63AITRT-Bkxam36l.js +86 -0
  145. package/src/ui/dist/assets/erlang-BNw1qcRV.js +2 -0
  146. package/src/ui/dist/assets/es-ES-U4NZUMDT-CRxBcQgC.js +10 -0
  147. package/src/ui/dist/assets/eu-ES-A7QVB2H4-CTd_E7YR.js +12 -0
  148. package/src/ui/dist/assets/excalidraw-default-bMWIgNCy.svg +1 -0
  149. package/src/ui/dist/assets/fa-IR-HGAKTJCU-DO56k7eG.js +9 -0
  150. package/src/ui/dist/assets/factor-kuTfRLto.js +2 -0
  151. package/src/ui/dist/assets/fcl-Kvtd6kyn.js +2 -0
  152. package/src/ui/dist/assets/fi-FI-Z5N7JZ37-DEDCF9WB.js +7 -0
  153. package/src/ui/dist/assets/file-open-002ab408-DIuFHtCF.js +2 -0
  154. package/src/ui/dist/assets/file-open-7c801643-684qeFg4.js +2 -0
  155. package/src/ui/dist/assets/file-save-3189631c-C1wFhQhH.js +2 -0
  156. package/src/ui/dist/assets/file-save-745eba88-Bb9F9Kg7.js +2 -0
  157. package/src/ui/dist/assets/flowDiagram-23GEKE2U-C3SAEao7.js +157 -0
  158. package/src/ui/dist/assets/forth-Ffai-XNe.js +2 -0
  159. package/src/ui/dist/assets/fortran-DYz_wnZ1.js +2 -0
  160. package/src/ui/dist/assets/fr-FR-RHASNOE6-DE2nPyDt.js +10 -0
  161. package/src/ui/dist/assets/ganttDiagram-NO4QXBWP-U-J_Xi-_.js +293 -0
  162. package/src/ui/dist/assets/gas-Bneqetm1.js +2 -0
  163. package/src/ui/dist/assets/gherkin-heZmZLOM.js +2 -0
  164. package/src/ui/dist/assets/gitGraphDiagram-IHSO6WYX-BADVbD-a.js +107 -0
  165. package/src/ui/dist/assets/gl-ES-HMX3MZ6V-mCqVgQHC.js +11 -0
  166. package/src/ui/dist/assets/graph-C9eacEi8.js +2 -0
  167. package/src/ui/dist/assets/groovy-D9Dt4D0W.js +2 -0
  168. package/src/ui/dist/assets/haskell-Cw1EW3IL.js +2 -0
  169. package/src/ui/dist/assets/haxe-H-WmDvRZ.js +2 -0
  170. package/src/ui/dist/assets/he-IL-6SHJWFNN-KnaLrCzw.js +11 -0
  171. package/src/ui/dist/assets/hi-IN-IWLTKZ5I-wuqiaaWt.js +5 -0
  172. package/src/ui/dist/assets/http-DBlCnlav.js +2 -0
  173. package/src/ui/dist/assets/hu-HU-A5ZG7DT2-DLg_zm22.js +8 -0
  174. package/src/ui/dist/assets/id-ID-SAP4L64H-MB2mXqcR.js +11 -0
  175. package/src/ui/dist/assets/idl-BEugSyMb.js +2 -0
  176. package/src/ui/dist/assets/image-blob-reduce.esm-HwCm7IZ0.js +8 -0
  177. package/src/ui/dist/assets/index-39SJtrt0.js +2 -0
  178. package/src/ui/dist/assets/index-BQ0LIrW-.js +2 -0
  179. package/src/ui/dist/assets/index-BcAUh2Nm.css +1 -0
  180. package/src/ui/dist/assets/index-BcThOK-i.js +331 -0
  181. package/src/ui/dist/assets/index-BnxV3k_S.js +3 -0
  182. package/src/ui/dist/assets/index-C7MZBHbT.js +117 -0
  183. package/src/ui/dist/assets/index-CCvKI2rM.js +2 -0
  184. package/src/ui/dist/assets/index-CZvmcCab.js +8 -0
  185. package/src/ui/dist/assets/index-Cp3hLKNl.js +2 -0
  186. package/src/ui/dist/assets/index-D7ayFxcx.js +2 -0
  187. package/src/ui/dist/assets/index-DAYxSQGU.js +2 -0
  188. package/src/ui/dist/assets/index-DD-HeMV0.css +1 -0
  189. package/src/ui/dist/assets/index-DPMxd3Qn.js +2 -0
  190. package/src/ui/dist/assets/index-DSe2jx3k.js +4 -0
  191. package/src/ui/dist/assets/index-DUirCkgW.js +2 -0
  192. package/src/ui/dist/assets/index-DaKPQ2hN.js +159 -0
  193. package/src/ui/dist/assets/index-DzpuR0Jg.js +2 -0
  194. package/src/ui/dist/assets/index-POndwsCI.js +2 -0
  195. package/src/ui/dist/assets/index-R8NM9I_9.js +2 -0
  196. package/src/ui/dist/assets/index-TCDuDhBj.js +2 -0
  197. package/src/ui/dist/assets/index-TckzASdM.js +2 -0
  198. package/src/ui/dist/assets/index-Yi5ytFFr.js +2 -0
  199. package/src/ui/dist/assets/infoDiagram-FWYZ7A6U-CiGBlFqH.js +3 -0
  200. package/src/ui/dist/assets/init-Gi6I4Gst.js +2 -0
  201. package/src/ui/dist/assets/ishikawaDiagram-FXEZZL3T-B1aheRbz.js +71 -0
  202. package/src/ui/dist/assets/it-IT-JPQ66NNP-DT3HSU7X.js +12 -0
  203. package/src/ui/dist/assets/ja-JP-DBVTYXUO-CsfJjjWt.js +9 -0
  204. package/src/ui/dist/assets/javascript-iXu5QeM3.js +2 -0
  205. package/src/ui/dist/assets/journeyDiagram-5HDEW3XC-DtnJPxub.js +140 -0
  206. package/src/ui/dist/assets/julia-DuME0IfC.js +2 -0
  207. package/src/ui/dist/assets/kaa-6HZHGXH3-DQz-1-Gn.js +2 -0
  208. package/src/ui/dist/assets/kab-KAB-ZGHBKWFO-CaH-LSoK.js +9 -0
  209. package/src/ui/dist/assets/kanban-definition-HUTT4EX6-CZatSm3e.js +90 -0
  210. package/src/ui/dist/assets/katex-C5jXJg4s.js +258 -0
  211. package/src/ui/dist/assets/kk-KZ-P5N5QNE5-BMXmcm55.js +2 -0
  212. package/src/ui/dist/assets/km-KH-HSX4SM5Z-ZeoJNBpN.js +12 -0
  213. package/src/ui/dist/assets/ko-KR-MTYHY66A-BeaLRKph.js +10 -0
  214. package/src/ui/dist/assets/ku-TR-6OUDTVRD-B_28KrkR.js +10 -0
  215. package/src/ui/dist/assets/layout-DEXfKzaS.js +2 -0
  216. package/src/ui/dist/assets/linear-CpEDnQRC.js +2 -0
  217. package/src/ui/dist/assets/livescript-BwQOo05w.js +2 -0
  218. package/src/ui/dist/assets/lt-LT-XHIRWOB4-BxDcnUhp.js +4 -0
  219. package/src/ui/dist/assets/lua-VAEuO923.js +2 -0
  220. package/src/ui/dist/assets/lv-LV-5QDEKY6T-DpKDl1_y.js +8 -0
  221. package/src/ui/dist/assets/map-Czzmt4hB.js +2 -0
  222. package/src/ui/dist/assets/mathematica-DTrFuWx2.js +2 -0
  223. package/src/ui/dist/assets/mbox-CNhZ1qSd.js +2 -0
  224. package/src/ui/dist/assets/mermaidLoader-CBO31t0J.js +305 -0
  225. package/src/ui/dist/assets/mermaidLoader-CEK31ho9.css +1 -0
  226. package/src/ui/dist/assets/mindmap-definition-LN4V7U3C-CQ0TccEr.js +97 -0
  227. package/src/ui/dist/assets/mirc-CjQqDB4T.js +2 -0
  228. package/src/ui/dist/assets/mllike-CXdrOF99.js +2 -0
  229. package/src/ui/dist/assets/modelica-Dc1JOy9r.js +2 -0
  230. package/src/ui/dist/assets/mr-IN-CRQNXWMA-BKCZT58p.js +14 -0
  231. package/src/ui/dist/assets/mscgen-BA5vi2Kp.js +2 -0
  232. package/src/ui/dist/assets/mumps-BT43cFF4.js +2 -0
  233. package/src/ui/dist/assets/my-MM-5M5IBNSE-D34k0G9T.js +2 -0
  234. package/src/ui/dist/assets/nb-NO-T6EIAALU-DXr_KW8J.js +11 -0
  235. package/src/ui/dist/assets/nginx-DdIZxoE0.js +2 -0
  236. package/src/ui/dist/assets/nl-NL-IS3SIHDZ-C1L0aVDR.js +9 -0
  237. package/src/ui/dist/assets/nn-NO-6E72VCQL-CLWVSxbZ.js +9 -0
  238. package/src/ui/dist/assets/nsis-LdVXkNf5.js +2 -0
  239. package/src/ui/dist/assets/ntriples-BfvgReVJ.js +2 -0
  240. package/src/ui/dist/assets/oc-FR-POXYY2M6-nf8_J3eR.js +9 -0
  241. package/src/ui/dist/assets/octave-Ck1zUtKM.js +2 -0
  242. package/src/ui/dist/assets/ordinal-Cboi1Yqb.js +2 -0
  243. package/src/ui/dist/assets/oz-BzwKVEFT.js +2 -0
  244. package/src/ui/dist/assets/pa-IN-N4M65BXN-CAMJ-xd6.js +5 -0
  245. package/src/ui/dist/assets/pascal--L3eBynH.js +2 -0
  246. package/src/ui/dist/assets/pegDiagram-2B236MQR-Bj2RcmRd.js +2 -0
  247. package/src/ui/dist/assets/percentages-BXMCSKIN-s9yWFdr6.js +160 -0
  248. package/src/ui/dist/assets/perl-CdXCOZ3F.js +2 -0
  249. package/src/ui/dist/assets/pica-BGv_AhAB.js +8 -0
  250. package/src/ui/dist/assets/pieDiagram-ENE6RG2P-obpzz8dC.js +40 -0
  251. package/src/ui/dist/assets/pig-CevX1Tat.js +2 -0
  252. package/src/ui/dist/assets/pl-PL-T2D74RX3-DKJ5H85v.js +10 -0
  253. package/src/ui/dist/assets/powershell-CFHJl5sT.js +2 -0
  254. package/src/ui/dist/assets/properties-C78fOPTZ.js +2 -0
  255. package/src/ui/dist/assets/protobuf-ChK-085T.js +2 -0
  256. package/src/ui/dist/assets/{proxy-D0vUbds5.js → proxy-BSmwef4H.js} +2 -2
  257. package/src/ui/dist/assets/pt-BR-5N22H2LF-B5kow-kN.js +10 -0
  258. package/src/ui/dist/assets/pt-PT-UZXXM6DQ-B2G34fso.js +10 -0
  259. package/src/ui/dist/assets/pug-DeIclll2.js +2 -0
  260. package/src/ui/dist/assets/puppet-DMA9R1ak.js +2 -0
  261. package/src/ui/dist/assets/python-BuPzkPfP.js +2 -0
  262. package/src/ui/dist/assets/q-pXgVlZs6.js +2 -0
  263. package/src/ui/dist/assets/quadrantDiagram-ABIIQ3AL-Cl-T7NkJ.js +8 -0
  264. package/src/ui/dist/assets/r-B6wPVr8A.js +2 -0
  265. package/src/ui/dist/assets/railroadDiagram-RFXS5EU6-DMq82RHg.js +2 -0
  266. package/src/ui/dist/assets/{refresh-cw-JNmExijd.js → refresh-cw-CbFd7guV.js} +2 -2
  267. package/src/ui/dist/assets/requirementDiagram-TGXJPOKE-tGInMDgU.js +85 -0
  268. package/src/ui/dist/assets/ro-RO-JPDTUUEW-BwLdZW91.js +12 -0
  269. package/src/ui/dist/assets/roundRect-0PYZxl1G.js +2 -0
  270. package/src/ui/dist/assets/rpm-CTu-6PCP.js +2 -0
  271. package/src/ui/dist/assets/ru-RU-B4JR7IUQ-DpdAgIJc.js +10 -0
  272. package/src/ui/dist/assets/ruby-B2Rjki9n.js +2 -0
  273. package/src/ui/dist/assets/runtimeBrand-BoKPimsz.js +2 -0
  274. package/src/ui/dist/assets/sankeyDiagram-HTMAVEWB-C7X-ET4m.js +41 -0
  275. package/src/ui/dist/assets/sas-B4kiWyti.js +2 -0
  276. package/src/ui/dist/assets/save-D1CXHwBw.js +12 -0
  277. package/src/ui/dist/assets/scheme-C41bIUwD.js +2 -0
  278. package/src/ui/dist/assets/sequenceDiagram-DBY2YBRQ-Bn24i_nY.js +163 -0
  279. package/src/ui/dist/assets/settings-2-DtSNAAcU.js +22 -0
  280. package/src/ui/dist/assets/shell-CjFT_Tl9.js +2 -0
  281. package/src/ui/dist/assets/shield-check-BVbJ8T_N.js +7 -0
  282. package/src/ui/dist/assets/si-LK-N5RQ5JYF-naJaUy5u.js +2 -0
  283. package/src/ui/dist/assets/sieve-C3Gn_uJK.js +2 -0
  284. package/src/ui/dist/assets/simple-mode-GW_nhZxv.js +2 -0
  285. package/src/ui/dist/assets/sizeCapture-X5ZJPWSS-DAQHfm82.js +2 -0
  286. package/src/ui/dist/assets/sk-SK-C5VTKIMK-1NPz1J_d.js +7 -0
  287. package/src/ui/dist/assets/sl-SI-NN7IZMDC-D8RfmNQw.js +7 -0
  288. package/src/ui/dist/assets/smalltalk-CnHTOXQT.js +2 -0
  289. package/src/ui/dist/assets/solr-DehyRSwq.js +2 -0
  290. package/src/ui/dist/assets/sparql-DkYu6x3z.js +2 -0
  291. package/src/ui/dist/assets/spreadsheet-BCZA_wO0.js +2 -0
  292. package/src/ui/dist/assets/sql-D0XecflT.js +2 -0
  293. package/src/ui/dist/assets/stateDiagram-2N3HPSRC-Ck48D1ck.js +2 -0
  294. package/src/ui/dist/assets/stateDiagram-v2-6OUMAXLB-CdfRCJAJ.js +2 -0
  295. package/src/ui/dist/assets/stex-C3f8Ysf7.js +2 -0
  296. package/src/ui/dist/assets/style-C3QI7VPf.css +1 -0
  297. package/src/ui/dist/assets/stylus-B533Al4x.js +2 -0
  298. package/src/ui/dist/assets/subset-shared.chunk-eAtLHmbi.js +85 -0
  299. package/src/ui/dist/assets/subset-worker.chunk-DeHCTnTk.js +2 -0
  300. package/src/ui/dist/assets/sv-SE-XGPEYMSR-BeOYCU-8.js +11 -0
  301. package/src/ui/dist/assets/swift-BzpIVaGY.js +2 -0
  302. package/src/ui/dist/assets/swimlanes-5IMT3BWC-DOy22UjP.js +3 -0
  303. package/src/ui/dist/assets/swimlanesDiagram-G3AALYLV-sicPbVOg.js +9 -0
  304. package/src/ui/dist/assets/ta-IN-2NMHFXQM-CtS68WDd.js +10 -0
  305. package/src/ui/dist/assets/tcl-DVfN8rqt.js +2 -0
  306. package/src/ui/dist/assets/{terminal-BBQvnOAK.js → terminal-DEby5Y_P.js} +2 -2
  307. package/src/ui/dist/assets/terminalControl-BkFeDVXo.js +134 -0
  308. package/src/ui/dist/assets/textile-CnDTJFAw.js +2 -0
  309. package/src/ui/dist/assets/th-TH-HPSO5L25-DCHY9-Co.js +3 -0
  310. package/src/ui/dist/assets/tiddlywiki-DO-Gjzrf.js +2 -0
  311. package/src/ui/dist/assets/tiki-DGYXhP31.js +2 -0
  312. package/src/ui/dist/assets/timeline-definition-FHXFAJF6-DVkG72qO.js +121 -0
  313. package/src/ui/dist/assets/toml-Bm5Em-hy.js +2 -0
  314. package/src/ui/dist/assets/tr-TR-DEFEU3FU-y5-vjTv8.js +8 -0
  315. package/src/ui/dist/assets/troff-wAsdV37c.js +2 -0
  316. package/src/ui/dist/assets/ttcn-CfJYG6tj.js +2 -0
  317. package/src/ui/dist/assets/ttcn-cfg-B9xdYoR4.js +2 -0
  318. package/src/ui/dist/assets/turtle-B1tBg_DP.js +2 -0
  319. package/src/ui/dist/assets/uk-UA-QMV73CPH-BRbR5It6.js +7 -0
  320. package/src/ui/dist/assets/useReducedMotion-D07XP52Q.js +12 -0
  321. package/src/ui/dist/assets/vb-CmGdzxic.js +2 -0
  322. package/src/ui/dist/assets/vbscript-BuJXcnF6.js +2 -0
  323. package/src/ui/dist/assets/velocity-D8B20fx6.js +2 -0
  324. package/src/ui/dist/assets/vennDiagram-L72KCM5P-DwMwBlf-.js +35 -0
  325. package/src/ui/dist/assets/verilog-C6RDOZhf.js +2 -0
  326. package/src/ui/dist/assets/vhdl-lSbBsy5d.js +2 -0
  327. package/src/ui/dist/assets/vi-VN-M7AON7JQ-s6wSBv2s.js +6 -0
  328. package/src/ui/dist/assets/wardleyDiagram-EHGQE667-CNuuvzEg.js +79 -0
  329. package/src/ui/dist/assets/webidl-ZXfAyPTL.js +2 -0
  330. package/src/ui/dist/assets/{x-DoIOGAJz.js → x-B84wq78k.js} +2 -2
  331. package/src/ui/dist/assets/xquery-DzFWVndE.js +2 -0
  332. package/src/ui/dist/assets/xychartDiagram-FW5EYKEG-dUpZxmn6.js +8 -0
  333. package/src/ui/dist/assets/yacas-BJ4BC0dw.js +2 -0
  334. package/src/ui/dist/assets/z80-Hz9HOZM7.js +2 -0
  335. package/src/ui/dist/assets/zh-CN-LNUGB5OW-Cu_-POQN.js +11 -0
  336. package/src/ui/dist/assets/zh-HK-E62DVLB3-BCx4W4qZ.js +2 -0
  337. package/src/ui/dist/assets/zh-TW-RAJ6MFWO-02wx_Mrj.js +10 -0
  338. package/src/ui/dist/icons/excalidraw.svg +1 -0
  339. package/src/ui/dist/icons/markdown.svg +1 -0
  340. package/src/ui/dist/index.html +2 -2
  341. package/src/ui/package.json +10 -0
  342. package/src/ui/playwright.config.ts +36 -0
  343. package/src/ui/pnpm-workspace.yaml +2 -0
  344. package/src/ui/public/icons/excalidraw.svg +1 -0
  345. package/src/ui/public/icons/markdown.svg +1 -0
  346. package/src/ui/tsconfig.json +2 -1
  347. package/src/ui/vite.config.ts +1 -0
  348. package/src/wf-ui-server/__tests__/a2a-store.test.mjs +432 -15
  349. package/src/wf-ui-server/__tests__/action-registry-loader.test.mjs +156 -0
  350. package/src/wf-ui-server/__tests__/claude-stream-json.test.mjs +397 -0
  351. package/src/wf-ui-server/__tests__/codex-appserver.test.mjs +392 -0
  352. package/src/wf-ui-server/__tests__/component-node-api.test.mjs +881 -0
  353. package/src/wf-ui-server/__tests__/component-node-store.test.mjs +401 -0
  354. package/src/wf-ui-server/__tests__/control-plane-acceptance.test.mjs +2027 -0
  355. package/src/wf-ui-server/__tests__/control-plane-cli-smoke.test.mjs +1014 -0
  356. package/src/wf-ui-server/__tests__/dispatch-lifecycle.test.mjs +330 -0
  357. package/src/wf-ui-server/__tests__/effort-compatibility-red-092.test.mjs +151 -0
  358. package/src/wf-ui-server/__tests__/graph-layout-agent-tree.test.mjs +254 -0
  359. package/src/wf-ui-server/__tests__/graph-layout-tidy.test.mjs +260 -0
  360. package/src/wf-ui-server/__tests__/graph-layout.test.mjs +84 -0
  361. package/src/wf-ui-server/__tests__/node-config-api.test.mjs +384 -0
  362. package/src/wf-ui-server/__tests__/opencode-server.test.mjs +526 -0
  363. package/src/wf-ui-server/__tests__/peer-capsule.test.mjs +2 -2
  364. package/src/wf-ui-server/__tests__/pty-adapter.test.mjs +71 -1
  365. package/src/wf-ui-server/__tests__/runtime-config.test.mjs +3 -3
  366. package/src/wf-ui-server/__tests__/runtime-detector.test.mjs +21 -0
  367. package/src/wf-ui-server/__tests__/runtime-review.test.mjs +828 -0
  368. package/src/wf-ui-server/__tests__/server.integration.test.mjs +1463 -11
  369. package/src/wf-ui-server/__tests__/session-cleanup.test.mjs +159 -0
  370. package/src/wf-ui-server/__tests__/session-registry.test.mjs +52 -3
  371. package/src/wf-ui-server/__tests__/settings.test.mjs +12 -2
  372. package/src/wf-ui-server/__tests__/spawn-gate.test.mjs +78 -0
  373. package/src/wf-ui-server/__tests__/task-group-parser.test.mjs +120 -0
  374. package/src/wf-ui-server/__tests__/task-group-tag.test.mjs +264 -0
  375. package/src/wf-ui-server/__tests__/task-parser.test.mjs +49 -3
  376. package/src/wf-ui-server/__tests__/terminal-context-hardening.test.mjs +122 -0
  377. package/src/wf-ui-server/__tests__/terminal-context.test.mjs +164 -0
  378. package/src/wf-ui-server/__tests__/terminal-store.test.mjs +4 -4
  379. package/src/wf-ui-server/__tests__/wf-browser-api.test.mjs +599 -0
  380. package/src/wf-ui-server/__tests__/wf-browser-store.test.mjs +184 -0
  381. package/src/wf-ui-server/__tests__/workflow-action-registry.test.mjs +282 -0
  382. package/src/wf-ui-server/__tests__/workflow-agent-communication.test.mjs +411 -0
  383. package/src/wf-ui-server/__tests__/workflow-agent-context.test.mjs +323 -0
  384. package/src/wf-ui-server/__tests__/workflow-agent-cooperation-permissions.test.mjs +318 -0
  385. package/src/wf-ui-server/__tests__/workflow-agent-messages-structured.test.mjs +458 -0
  386. package/src/wf-ui-server/__tests__/workflow-agent-routing.test.mjs +434 -0
  387. package/src/wf-ui-server/__tests__/workflow-agent-runtime.test.mjs +324 -0
  388. package/src/wf-ui-server/__tests__/workflow-api-integration.test.mjs +263 -0
  389. package/src/wf-ui-server/__tests__/workflow-api-phase3.test.mjs +1213 -0
  390. package/src/wf-ui-server/__tests__/workflow-claude-materialize.test.mjs +209 -0
  391. package/src/wf-ui-server/__tests__/workflow-cli-registry-manuals.test.mjs +173 -0
  392. package/src/wf-ui-server/__tests__/workflow-cli-surface.test.mjs +176 -0
  393. package/src/wf-ui-server/__tests__/workflow-codex-resume-id.test.mjs +556 -0
  394. package/src/wf-ui-server/__tests__/workflow-cooperation-enforcement.test.mjs +553 -0
  395. package/src/wf-ui-server/__tests__/workflow-depth-resume-dock.test.mjs +846 -0
  396. package/src/wf-ui-server/__tests__/workflow-display-node.test.mjs +150 -0
  397. package/src/wf-ui-server/__tests__/workflow-edge-update.test.mjs +296 -0
  398. package/src/wf-ui-server/__tests__/workflow-file-cache-lock-watch.test.mjs +380 -0
  399. package/src/wf-ui-server/__tests__/workflow-file-formats.test.mjs +994 -0
  400. package/src/wf-ui-server/__tests__/workflow-file-node-actions.test.mjs +294 -0
  401. package/src/wf-ui-server/__tests__/workflow-goal-actions.test.mjs +357 -0
  402. package/src/wf-ui-server/__tests__/workflow-goal-task-autoclose.test.mjs +256 -0
  403. package/src/wf-ui-server/__tests__/workflow-graceful-stop.test.mjs +108 -0
  404. package/src/wf-ui-server/__tests__/workflow-graph-undo.test.mjs +524 -0
  405. package/src/wf-ui-server/__tests__/workflow-layout.test.mjs +732 -0
  406. package/src/wf-ui-server/__tests__/workflow-magnetic-topology.test.mjs +222 -0
  407. package/src/wf-ui-server/__tests__/workflow-markdown-lock.test.mjs +359 -0
  408. package/src/wf-ui-server/__tests__/workflow-mcp-hub.test.mjs +174 -0
  409. package/src/wf-ui-server/__tests__/workflow-node-manual-schema.test.mjs +241 -0
  410. package/src/wf-ui-server/__tests__/workflow-node-runtime.test.mjs +1991 -0
  411. package/src/wf-ui-server/__tests__/workflow-node-store-utils.test.mjs +125 -0
  412. package/src/wf-ui-server/__tests__/workflow-registry-drift.test.mjs +296 -0
  413. package/src/wf-ui-server/__tests__/workflow-resource-handle-four-side.test.mjs +217 -0
  414. package/src/wf-ui-server/__tests__/workflow-role-profile.test.mjs +234 -0
  415. package/src/wf-ui-server/__tests__/workflow-set-model.test.mjs +261 -0
  416. package/src/wf-ui-server/__tests__/workflow-skill-group-context-enabled.test.mjs +131 -0
  417. package/src/wf-ui-server/__tests__/workflow-skill-group-enable-disable.test.mjs +186 -0
  418. package/src/wf-ui-server/__tests__/workflow-skills-hub.test.mjs +125 -0
  419. package/src/wf-ui-server/__tests__/workflow-state-reconcile.test.mjs +139 -0
  420. package/src/wf-ui-server/__tests__/workflow-subagent-strategy-matrix.test.mjs +529 -0
  421. package/src/wf-ui-server/__tests__/workflow-team-flow.test.mjs +278 -0
  422. package/src/wf-ui-server/__tests__/workflow-terminal-control-live.test.mjs +294 -0
  423. package/src/wf-ui-server/__tests__/workflow-terminal-control.test.mjs +631 -0
  424. package/src/wf-ui-server/__tests__/workflow-timer-wakeup.test.mjs +318 -0
  425. package/src/wf-ui-server/__tests__/workflow-unified-resume.test.mjs +537 -0
  426. package/src/wf-ui-server/__tests__/workspace-api-hardening.test.mjs +187 -0
  427. package/src/wf-ui-server/__tests__/workspace-api.test.mjs +382 -0
  428. package/src/wf-ui-server/__tests__/workspace-reveal.test.mjs +138 -0
  429. package/src/wf-ui-server/__tests__/workspace-store-hardening.test.mjs +255 -0
  430. package/src/wf-ui-server/__tests__/workspace-store.test.mjs +208 -0
  431. package/src/wf-ui-server/__tests__/ws-events.integration.test.mjs +52 -25
  432. package/src/wf-ui-server/__tests__/ws-terminal.integration.test.mjs +12 -6
  433. package/src/wf-ui-server/__tests__/ws-wf-browser.integration.test.mjs +488 -0
  434. package/src/wf-ui-server/a2a-store.mjs +3007 -89
  435. package/src/wf-ui-server/action-registry.mjs +277 -0
  436. package/src/wf-ui-server/bridge-store.mjs +276 -0
  437. package/src/wf-ui-server/chat-driver.mjs +220 -0
  438. package/src/wf-ui-server/chat-store.mjs +109 -0
  439. package/src/wf-ui-server/claude-transcript-materializer.mjs +235 -0
  440. package/src/wf-ui-server/codex-update-prompt.mjs +53 -0
  441. package/src/wf-ui-server/component-node-store.mjs +689 -0
  442. package/src/wf-ui-server/composition-api.mjs +436 -0
  443. package/src/wf-ui-server/control-plane-token.mjs +17 -0
  444. package/src/wf-ui-server/dispatch-contract.mjs +150 -0
  445. package/src/wf-ui-server/drivers/claude-stream-json.mjs +371 -0
  446. package/src/wf-ui-server/drivers/codex-appserver.mjs +513 -0
  447. package/src/wf-ui-server/drivers/opencode-server.mjs +486 -0
  448. package/src/wf-ui-server/excalidraw-svg.mjs +141 -0
  449. package/src/wf-ui-server/file-format-adapters.mjs +511 -0
  450. package/src/wf-ui-server/file-watcher.mjs +215 -0
  451. package/src/wf-ui-server/graph-layout.mjs +778 -0
  452. package/src/wf-ui-server/harness-env.mjs +46 -0
  453. package/src/wf-ui-server/json-store-utils.mjs +48 -0
  454. package/src/wf-ui-server/model-capability.mjs +773 -0
  455. package/src/wf-ui-server/node-config-store.mjs +233 -0
  456. package/src/wf-ui-server/node-store-utils.mjs +88 -0
  457. package/src/wf-ui-server/peer-capsule.mjs +56 -1
  458. package/src/wf-ui-server/pty-adapter.mjs +513 -11
  459. package/src/wf-ui-server/reveal-foreground.mjs +69 -0
  460. package/src/wf-ui-server/runtime-detector.mjs +52 -6
  461. package/src/wf-ui-server/server.mjs +5613 -403
  462. package/src/wf-ui-server/session-cleanup.mjs +363 -0
  463. package/src/wf-ui-server/session-registry.mjs +179 -3
  464. package/src/wf-ui-server/settings.mjs +25 -0
  465. package/src/wf-ui-server/spawn-gate.mjs +46 -0
  466. package/src/wf-ui-server/task-parser.mjs +88 -3
  467. package/src/wf-ui-server/terminal-store.mjs +225 -11
  468. package/src/wf-ui-server/timer-wakeup-scheduler.mjs +226 -0
  469. package/src/wf-ui-server/wf-browser-store.mjs +733 -0
  470. package/src/wf-ui-server/workflow-agent-context.mjs +1731 -0
  471. package/src/wf-ui-server/workflow-capability-node-store.mjs +676 -0
  472. package/src/wf-ui-server/workflow-event-node-store.mjs +623 -0
  473. package/src/wf-ui-server/workflow-goal-node-store.mjs +328 -0
  474. package/src/wf-ui-server/workflow-graph-store.mjs +623 -0
  475. package/src/wf-ui-server/workflow-mcp-hub.mjs +286 -0
  476. package/src/wf-ui-server/workflow-node-runtime.mjs +1767 -0
  477. package/src/wf-ui-server/workflow-node-settings-store.mjs +339 -0
  478. package/src/wf-ui-server/workflow-node-types/agent-node.mjs +920 -0
  479. package/src/wf-ui-server/workflow-node-types/display-node.mjs +151 -0
  480. package/src/wf-ui-server/workflow-node-types/excalidraw-node.mjs +145 -0
  481. package/src/wf-ui-server/workflow-node-types/file-node.mjs +484 -0
  482. package/src/wf-ui-server/workflow-node-types/github-trigger-node.mjs +207 -0
  483. package/src/wf-ui-server/workflow-node-types/goal-node.mjs +491 -0
  484. package/src/wf-ui-server/workflow-node-types/markdown-node.mjs +225 -0
  485. package/src/wf-ui-server/workflow-node-types/mcp-connector-node.mjs +71 -0
  486. package/src/wf-ui-server/workflow-node-types/role-profile-store.mjs +191 -0
  487. package/src/wf-ui-server/workflow-node-types/skill-group-node.mjs +98 -0
  488. package/src/wf-ui-server/workflow-node-types/timer-node.mjs +607 -0
  489. package/src/wf-ui-server/workflow-ontology.mjs +681 -0
  490. package/src/wf-ui-server/workflow-operation-store.mjs +115 -0
  491. package/src/wf-ui-server/workflow-skills-hub.mjs +366 -0
  492. package/src/wf-ui-server/workflow-skills-market.mjs +723 -0
  493. package/src/wf-ui-server/workspace-store.mjs +951 -0
  494. package/src/wf-ui-server/ws-chat.mjs +299 -0
  495. package/src/wf-ui-server/ws-events.mjs +45 -20
  496. package/src/wf-ui-server/ws-terminal.mjs +165 -22
  497. package/src/wf-ui-server/ws-wf-browser.mjs +419 -0
  498. package/templates/common/.claude/agents/review-manager.md +33 -29
  499. package/templates/common/.claude/commands/wf-browser.md +1 -1
  500. package/templates/common/.claude/commands/wf-help.md +5 -3
  501. package/templates/common/.claude/commands/wf-init.md +44 -0
  502. package/templates/common/.claude/commands/wf-learn.md +34 -8
  503. package/templates/common/.claude/commands/wf-max.md +19 -9
  504. package/templates/common/.claude/commands/wf-review.md +3 -3
  505. package/templates/common/.claude/commands/wf-search.md +55 -0
  506. package/templates/common/.claude/commands/wf-task-archive.md +5 -4
  507. package/templates/common/.claude/commands/wf-task-list.md +6 -3
  508. package/templates/common/.claude/commands/wf-task-record.md +10 -2
  509. package/templates/common/.claude/commands/wf-ui.md +12 -5
  510. package/templates/common/.claude/commands/wf-update.md +4 -0
  511. package/templates/common/.claude/commands/wf.md +12 -1
  512. package/templates/common/.claude/rules/ecc/common.md +10 -1
  513. package/templates/common/.claude/skills/wf/SKILL.md +36 -0
  514. package/templates/common/.claude/skills/wf-browser/SKILL.md +427 -122
  515. package/templates/common/.claude/skills/wf-browser/references/BROWSER_CONTROL_PATTERNS.md +43 -0
  516. package/templates/common/.claude/skills/wf-init/SKILL.md +33 -0
  517. package/templates/common/.claude/skills/wf-learn/SKILL.md +106 -26
  518. package/templates/common/.claude/skills/wf-max/SKILL.md +45 -11
  519. package/templates/common/.claude/skills/wf-review/SKILL.md +26 -54
  520. package/templates/common/.claude/skills/wf-search/SKILL.md +122 -0
  521. package/templates/common/.claude/skills/wf-search/references/evidence-contract.md +77 -0
  522. package/templates/common/.claude/skills/wf-search/references/policies/compare.md +38 -0
  523. package/templates/common/.claude/skills/wf-search/references/policies/fact.md +39 -0
  524. package/templates/common/.claude/skills/wf-search/references/policies/troubleshoot.md +39 -0
  525. package/templates/common/.claude/skills/wf-search/references/policies/verify.md +44 -0
  526. package/templates/common/.claude/skills/wf-search/references/source-routing.md +40 -0
  527. package/templates/common/.claude/skills/wf-search/references/tool-adapters.md +38 -0
  528. package/templates/common/.claude/skills/wf-ui/SKILL.md +146 -12
  529. package/templates/common/.claude/skills/wf-update/SKILL.md +5 -1
  530. package/templates/common/.harness-version +188 -85
  531. package/templates/common/.opencode/agents/review-manager.md +31 -27
  532. package/templates/common/.opencode/commands/wf-browser.md +1 -1
  533. package/templates/common/.opencode/commands/wf-help.md +5 -3
  534. package/templates/common/.opencode/commands/wf-init.md +44 -0
  535. package/templates/common/.opencode/commands/wf-learn.md +34 -8
  536. package/templates/common/.opencode/commands/wf-max.md +19 -9
  537. package/templates/common/.opencode/commands/wf-review.md +3 -3
  538. package/templates/common/.opencode/commands/wf-search.md +55 -0
  539. package/templates/common/.opencode/commands/wf-task-archive.md +5 -7
  540. package/templates/common/.opencode/commands/wf-task-list.md +6 -6
  541. package/templates/common/.opencode/commands/wf-task-record.md +10 -5
  542. package/templates/common/.opencode/commands/wf-ui.md +12 -5
  543. package/templates/common/.opencode/commands/wf-update.md +4 -0
  544. package/templates/common/.opencode/commands/wf.md +12 -1
  545. package/templates/common/CLAUDE.md +61 -3
  546. package/templates/common/Harness/MEMORY.md +8 -5
  547. package/templates/common/Harness/README.md +14 -10
  548. package/templates/common/Harness/a2a/action-registry.json +4397 -0
  549. package/templates/common/Harness/a2a/role-graph.json +16 -3
  550. package/templates/common/Harness/a2a/skills/terminal-control.json +45 -1
  551. package/templates/common/Harness/a2a/skills/wf-ui-map.json +50 -0
  552. package/templates/common/Harness/a2a/skills/workflow-agent-node.json +143 -0
  553. package/templates/common/Harness/a2a/skills/workflow-context.json +95 -0
  554. package/templates/common/Harness/a2a/skills/workflow-diagram-node.json +60 -0
  555. package/templates/common/Harness/a2a/skills/workflow-display-node.json +69 -0
  556. package/templates/common/Harness/a2a/skills/workflow-file-node.json +92 -0
  557. package/templates/common/Harness/a2a/skills/workflow-goal-node.json +76 -0
  558. package/templates/common/Harness/a2a/skills/workflow-markdown-node.json +79 -0
  559. package/templates/common/Harness/a2a/skills/workflow-mcp-connector-node.json +59 -0
  560. package/templates/common/Harness/a2a/skills/workflow-node-actions.json +105 -0
  561. package/templates/common/Harness/a2a/skills/workflow-node-map.json +71 -0
  562. package/templates/common/Harness/a2a/skills/workflow-ontology.json +54 -0
  563. package/templates/common/Harness/a2a/skills/workflow-resource-node.json +68 -0
  564. package/templates/common/Harness/a2a/skills/workflow-skill-group-node.json +56 -0
  565. package/templates/common/Harness/a2a/skills/workflow-timer-node.json +81 -0
  566. package/templates/common/Harness/a2a/workflows.json +33 -0
  567. package/templates/common/Harness/ownership.manifest.json +263 -2
  568. package/templates/common/Harness/project/architecture.md +499 -0
  569. package/templates/common/Harness/research/README.md +20 -0
  570. package/templates/common/Harness/scripts/README.md +70 -6
  571. package/templates/common/Harness/scripts/a2a-terminal.mjs +12 -4
  572. package/templates/common/Harness/scripts/context-budget.mjs +7 -3
  573. package/templates/common/Harness/scripts/lib/memory-context.mjs +400 -0
  574. package/templates/common/Harness/scripts/lib/path-scope.mjs +77 -0
  575. package/templates/common/Harness/scripts/lib/research-policy.mjs +99 -0
  576. package/templates/common/Harness/scripts/lib/wf-search.mjs +189 -0
  577. package/templates/common/Harness/scripts/memory-context.mjs +63 -0
  578. package/templates/common/Harness/scripts/research-policy.mjs +27 -0
  579. package/templates/common/Harness/scripts/task-context.mjs +547 -0
  580. package/templates/common/Harness/scripts/task-group-index.mjs +242 -0
  581. package/templates/common/Harness/scripts/task-state.mjs +659 -95
  582. package/templates/common/Harness/scripts/validate-harness.mjs +70 -28
  583. package/templates/common/Harness/scripts/wf-auto-update-prompt.mjs +24 -0
  584. package/templates/common/Harness/scripts/wf-remove.mjs +10 -0
  585. package/templates/common/Harness/scripts/wf-search.mjs +10 -0
  586. package/templates/common/Harness/scripts/wf-ui-control.mjs +3144 -0
  587. package/templates/common/Harness/scripts/wf-update-check.mjs +274 -51
  588. package/templates/common/Harness/scripts/wf-update-runner.mjs +53 -16
  589. package/templates/common/Harness/settings.json +10 -0
  590. package/templates/common/Harness/specs/guides/SETUP.md +4 -3
  591. package/templates/common/Harness/specs/protocols/HARNESS_BRIDGE.md +429 -48
  592. package/templates/common/Harness/specs/protocols/MEMORY_PROTOCOL.md +24 -0
  593. package/templates/common/Harness/specs/protocols/TASK_ARCHIVE.md +14 -11
  594. package/templates/common/Harness/specs/runtime/command-surface.json +28 -0
  595. package/templates/common/Harness/specs/runtime/context-loading.md +6 -0
  596. package/templates/common/Harness/specs/runtime/dispatch.md +9 -1
  597. package/templates/common/Harness/specs/runtime/subagents.md +20 -5
  598. package/templates/common/Harness/specs/workflows/WF-AUTO-SPARK.md +19 -0
  599. package/templates/common/Harness/specs/workflows/WF-AUTO.md +21 -0
  600. package/templates/common/Harness/specs/workflows/WF-KERNEL.md +4 -2
  601. package/templates/common/Harness/specs/workflows/WF-MAX.md +39 -12
  602. package/templates/common/Harness/specs/workflows/WF-STATE.md +62 -14
  603. package/templates/common/Harness/specs/workflows/WF.md +32 -0
  604. package/templates/common/Harness/tasks/INDEX.json +7 -0
  605. package/templates/common/Harness/tasks/INDEX.md +12 -0
  606. package/templates/common/Harness/tasks/_template/PLAN.md +6 -0
  607. package/templates/common/Harness/tasks/_template/PROGRESS.md +5 -0
  608. package/templates/common/Harness/tasks/_template/STATE.json +22 -0
  609. package/templates/common/Harness/templates/TEST_PLAN.template.md +5 -4
  610. package/templates/common/Harness/templates/UI_CONTRACT.template.md +7 -5
  611. package/templates/common/Harness/wf-browser/README.md +69 -0
  612. package/templates/common/README.md +17 -0
  613. package/src/ui/dist/assets/AgentsRoute-CuSKYmFu.js +0 -17
  614. package/src/ui/dist/assets/AgentsRoute-CuSKYmFu.js.map +0 -1
  615. package/src/ui/dist/assets/RolesRoute-DOzTYVRm.js +0 -7
  616. package/src/ui/dist/assets/RolesRoute-DOzTYVRm.js.map +0 -1
  617. package/src/ui/dist/assets/SettingsRoute-DPU7jSQm.js +0 -12
  618. package/src/ui/dist/assets/SettingsRoute-DPU7jSQm.js.map +0 -1
  619. package/src/ui/dist/assets/TaskList-BN4r8s1i.js +0 -50
  620. package/src/ui/dist/assets/TaskList-BN4r8s1i.js.map +0 -1
  621. package/src/ui/dist/assets/TerminalDrawer-Cej4PxsH.js +0 -74
  622. package/src/ui/dist/assets/TerminalDrawer-Cej4PxsH.js.map +0 -1
  623. package/src/ui/dist/assets/WorkflowRoute-BnuhLJ6X.css +0 -1
  624. package/src/ui/dist/assets/WorkflowRoute-C-clKe-j.js +0 -39
  625. package/src/ui/dist/assets/WorkflowRoute-C-clKe-j.js.map +0 -1
  626. package/src/ui/dist/assets/index-BOVYWntB.js +0 -117
  627. package/src/ui/dist/assets/index-BOVYWntB.js.map +0 -1
  628. package/src/ui/dist/assets/index-DaUObq0H.css +0 -1
  629. package/src/ui/dist/assets/maximize-2-LNrr_rKr.js +0 -7
  630. package/src/ui/dist/assets/maximize-2-LNrr_rKr.js.map +0 -1
  631. package/src/ui/dist/assets/plus-QuTJyoT3.js +0 -7
  632. package/src/ui/dist/assets/plus-QuTJyoT3.js.map +0 -1
  633. package/src/ui/dist/assets/proxy-D0vUbds5.js.map +0 -1
  634. package/src/ui/dist/assets/refresh-cw-JNmExijd.js.map +0 -1
  635. package/src/ui/dist/assets/terminal-BBQvnOAK.js.map +0 -1
  636. package/src/ui/dist/assets/useReducedMotion-BqmH0Tf7.js +0 -7
  637. package/src/ui/dist/assets/useReducedMotion-BqmH0Tf7.js.map +0 -1
  638. package/src/ui/dist/assets/x-DoIOGAJz.js.map +0 -1
  639. package/src/ui/pnpm-lock.yaml +0 -1582
  640. package/src/ui/src/App.tsx +0 -86
  641. package/src/ui/src/api.ts +0 -93
  642. package/src/ui/src/components/AgentsRoute.tsx +0 -503
  643. package/src/ui/src/components/Footer.tsx +0 -69
  644. package/src/ui/src/components/Header.tsx +0 -175
  645. package/src/ui/src/components/LoadingView.tsx +0 -22
  646. package/src/ui/src/components/RolesRoute.tsx +0 -169
  647. package/src/ui/src/components/SettingsRoute.tsx +0 -166
  648. package/src/ui/src/components/TaskList.tsx +0 -388
  649. package/src/ui/src/components/TerminalDrawer.tsx +0 -611
  650. package/src/ui/src/components/WorkflowRoute.tsx +0 -670
  651. package/src/ui/src/hooks/useReducedMotion.ts +0 -17
  652. package/src/ui/src/hooks/useServerConnection.ts +0 -114
  653. package/src/ui/src/index.css +0 -281
  654. package/src/ui/src/main.tsx +0 -11
  655. package/src/ui/src/types.ts +0 -108
  656. /package/src/ui/dist/assets/{TerminalDrawer-6GBZ9nXN.css → terminalControl-6GBZ9nXN.css} +0 -0
@@ -15,9 +15,9 @@
15
15
  * --full-plan and --verbose are aliases.
16
16
  */
17
17
 
18
- import { readFileSync, writeFileSync, existsSync, mkdirSync, lstatSync, unlinkSync } from 'fs';
18
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, lstatSync, unlinkSync, renameSync, readdirSync, rmSync, openSync, closeSync, mkdtempSync } from 'fs';
19
19
  import { createHash } from 'crypto';
20
- import { resolve, dirname, sep } from 'path';
20
+ import { resolve, dirname, sep, join, relative } from 'path';
21
21
  import { fileURLToPath } from 'url';
22
22
  import { gunzipSync } from 'zlib';
23
23
 
@@ -35,6 +35,111 @@ const TEMPLATE_SUBPATH = 'templates/common/';
35
35
  const DEFAULT_SOURCE_BASE = `${RAW_GITHUB}/main/${TEMPLATE_SUBPATH}`;
36
36
  const LEGACY_SOURCE_BASE = `${LEGACY_RAW_GITHUB}/main/${TEMPLATE_SUBPATH}`;
37
37
  const npmPackageCache = new Map();
38
+ const DEFAULT_UPDATE_TIMEOUT_MS = 120000;
39
+ const UPDATE_TIMEOUT_EXIT = 3;
40
+ const UPDATE_TEMP_ROOT = resolve(ROOT, 'Harness', '.temp', '.wf-update');
41
+ let updateDeadlineAt = 0;
42
+ let updateLock = null;
43
+
44
+ function timeoutError(timeoutMs = DEFAULT_UPDATE_TIMEOUT_MS) {
45
+ const error = new Error(`Update exceeded the ${timeoutMs}ms deadline.`);
46
+ error.code = 'UPDATE_TIMEOUT';
47
+ return error;
48
+ }
49
+
50
+ function exitCodeForError(error) {
51
+ return error?.code === 'UPDATE_TIMEOUT' ? UPDATE_TIMEOUT_EXIT : 1;
52
+ }
53
+
54
+ function boundedTimeout(timeoutMs) {
55
+ if (!updateDeadlineAt) return timeoutMs;
56
+ const remaining = updateDeadlineAt - Date.now();
57
+ if (remaining <= 0) throw timeoutError();
58
+ return Math.min(timeoutMs, remaining);
59
+ }
60
+
61
+ function isProcessAlive(pid) {
62
+ if (!Number.isInteger(pid) || pid <= 0) return false;
63
+ try {
64
+ process.kill(pid, 0);
65
+ return true;
66
+ } catch {
67
+ return false;
68
+ }
69
+ }
70
+
71
+ function transactionEntries() {
72
+ if (!existsSync(UPDATE_TEMP_ROOT)) return [];
73
+ return readdirSync(UPDATE_TEMP_ROOT, { withFileTypes: true })
74
+ .filter(entry => entry.isDirectory() && entry.name.startsWith('run-'))
75
+ .map(entry => join(UPDATE_TEMP_ROOT, entry.name));
76
+ }
77
+
78
+ function recoverTransaction(transactionDir) {
79
+ const journalPath = join(transactionDir, 'journal.json');
80
+ if (!existsSync(journalPath)) {
81
+ rmSync(transactionDir, { recursive: true, force: true });
82
+ return;
83
+ }
84
+ let journal;
85
+ try {
86
+ journal = JSON.parse(readFileSync(journalPath, 'utf8'));
87
+ } catch {
88
+ rmSync(transactionDir, { recursive: true, force: true });
89
+ return;
90
+ }
91
+
92
+ for (const move of [...(journal.moves || [])].reverse()) {
93
+ const from = safePath(move.from);
94
+ const backup = move.backup;
95
+ if (from && backup && existsSync(backup) && !existsSync(from)) renameSync(backup, from);
96
+ }
97
+ for (const entry of [...(journal.files || [])].reverse()) {
98
+ const dest = safePath(entry.file);
99
+ if (!dest) continue;
100
+ if (existsSync(dest)) unlinkSync(dest);
101
+ if (entry.backup && existsSync(entry.backup)) renameSync(entry.backup, dest);
102
+ }
103
+ rmSync(transactionDir, { recursive: true, force: true });
104
+ }
105
+
106
+ function acquireUpdateLock() {
107
+ mkdirSync(UPDATE_TEMP_ROOT, { recursive: true });
108
+ const lockPath = join(UPDATE_TEMP_ROOT, 'lock.json');
109
+ const staleRuns = transactionEntries();
110
+ let existing = null;
111
+ if (existsSync(lockPath)) {
112
+ try { existing = JSON.parse(readFileSync(lockPath, 'utf8')); } catch { existing = null; }
113
+ if (existing && isProcessAlive(existing.pid)) {
114
+ const error = new Error(`Another Harness update is running (pid ${existing.pid}).`);
115
+ error.code = 'UPDATE_LOCKED';
116
+ throw error;
117
+ }
118
+ unlinkSync(lockPath);
119
+ }
120
+ // Recover orphaned transactions even when the process died after removing
121
+ // its lock. This keeps the temp area self-healing and prevents stale files
122
+ // from accumulating in the user's project.
123
+ for (const run of staleRuns) recoverTransaction(run);
124
+ const fd = openSync(lockPath, 'wx');
125
+ writeFileSync(fd, JSON.stringify({ pid: process.pid, startedAt: new Date().toISOString() }) + '\n', 'utf8');
126
+ closeSync(fd);
127
+ updateLock = lockPath;
128
+ }
129
+
130
+ function releaseUpdateLock() {
131
+ if (updateLock && existsSync(updateLock)) {
132
+ try { unlinkSync(updateLock); } catch {}
133
+ }
134
+ updateLock = null;
135
+ if (existsSync(UPDATE_TEMP_ROOT)) {
136
+ try {
137
+ if (readdirSync(UPDATE_TEMP_ROOT).length === 0) rmSync(UPDATE_TEMP_ROOT, { recursive: true, force: true });
138
+ } catch {}
139
+ }
140
+ }
141
+
142
+ process.once('exit', releaseUpdateLock);
38
143
 
39
144
  // Tier classification
40
145
 
@@ -43,6 +148,7 @@ const PRESERVE_PATTERNS = [
43
148
  /^Harness\/PROGRESS\.md$/,
44
149
  /^Harness\/tasks\//,
45
150
  /^Harness\/memory\//,
151
+ /^Harness\/research\/search\//,
46
152
  /^Harness\/research\/PRD\.md$/,
47
153
  /^Harness\/research\/research-results\.md$/,
48
154
  /^Harness\/architecture\.md$/,
@@ -104,6 +210,85 @@ function safePath(file) {
104
210
  return resolved;
105
211
  }
106
212
 
213
+ function writeTransactionJournal(transactionDir, journal) {
214
+ writeFileSync(join(transactionDir, 'journal.json'), JSON.stringify(journal, null, 2) + '\n', 'utf8');
215
+ }
216
+
217
+ function stagePath(transactionDir, dest) {
218
+ const rel = relative(ROOT, dest);
219
+ return join(transactionDir, 'stage', ...rel.split(/[\\/]+/));
220
+ }
221
+
222
+ function applyPreparedTransaction(preparedWrites, moved) {
223
+ if (preparedWrites.length === 0 && moved.length === 0) return 0;
224
+ const transactionDir = mkdtempSync(join(UPDATE_TEMP_ROOT, 'run-'));
225
+ const journal = {
226
+ schemaVersion: 1,
227
+ pid: process.pid,
228
+ startedAt: new Date().toISOString(),
229
+ files: preparedWrites.map((prepared, index) => ({
230
+ file: prepared.file,
231
+ stage: stagePath(transactionDir, prepared.dest),
232
+ backup: join(transactionDir, 'backup', String(index)),
233
+ hadOriginal: false,
234
+ committed: false,
235
+ })),
236
+ moves: [],
237
+ };
238
+ let committed = 0;
239
+
240
+ try {
241
+ for (const [index, prepared] of preparedWrites.entries()) {
242
+ const entry = journal.files[index];
243
+ mkdirSync(dirname(entry.stage), { recursive: true });
244
+ writeFileSync(entry.stage, prepared.content, 'utf8');
245
+ }
246
+ writeTransactionJournal(transactionDir, journal);
247
+
248
+ for (const [index, prepared] of preparedWrites.entries()) {
249
+ const entry = journal.files[index];
250
+ if (prepared.mustNotExist && existsSync(prepared.dest)) {
251
+ throw new Error(`File created since plan: ${prepared.file} - treating as CONFLICT`);
252
+ }
253
+ if (existsSync(prepared.dest)) {
254
+ if (lstatSync(prepared.dest).isSymbolicLink()) throw new Error(`Symlink rejected: ${prepared.file}`);
255
+ mkdirSync(dirname(entry.backup), { recursive: true });
256
+ renameSync(prepared.dest, entry.backup);
257
+ entry.hadOriginal = true;
258
+ writeTransactionJournal(transactionDir, journal);
259
+ }
260
+ mkdirSync(dirname(prepared.dest), { recursive: true });
261
+ renameSync(entry.stage, prepared.dest);
262
+ entry.committed = true;
263
+ committed += 1;
264
+ writeTransactionJournal(transactionDir, journal);
265
+ }
266
+
267
+ for (const movedEntry of moved) {
268
+ const from = safePath(movedEntry.from);
269
+ if (!from || !existsSync(from)) continue;
270
+ if (lstatSync(from).isSymbolicLink()) throw new Error(`Symlink rejected: ${movedEntry.from}`);
271
+ const currentHash = sha256File(from);
272
+ if (currentHash && currentHash !== movedEntry.storedHash) {
273
+ throw new Error(`Legacy moved file changed before cleanup: ${movedEntry.from}`);
274
+ }
275
+ const backup = join(transactionDir, 'moved', String(journal.moves.length));
276
+ mkdirSync(dirname(backup), { recursive: true });
277
+ const move = { from: movedEntry.from, backup };
278
+ journal.moves.push(move);
279
+ writeTransactionJournal(transactionDir, journal);
280
+ renameSync(from, backup);
281
+ writeTransactionJournal(transactionDir, journal);
282
+ }
283
+
284
+ rmSync(transactionDir, { recursive: true, force: true });
285
+ return committed;
286
+ } catch (error) {
287
+ try { recoverTransaction(transactionDir); } catch {}
288
+ throw error;
289
+ }
290
+ }
291
+
107
292
  /** Canonical normalization for classification matching. */
108
293
  function canonicalPath(file) {
109
294
  return file.replace(/\\/g, '/').replace(/\/+/g, '/');
@@ -349,24 +534,36 @@ async function fetchRemote(url, timeoutMs = 30000) {
349
534
  return readFileSync(fileURLToPath(url), 'utf-8');
350
535
  }
351
536
 
537
+ const effectiveTimeout = boundedTimeout(timeoutMs);
352
538
  const controller = new AbortController();
353
- const timer = setTimeout(() => controller.abort(), timeoutMs);
539
+ const timer = setTimeout(() => controller.abort(), effectiveTimeout);
354
540
  try {
355
541
  const res = await fetch(url, { signal: controller.signal });
356
542
  if (!res.ok) throw new Error(`HTTP ${res.status}: ${url}`);
357
543
  return res.text();
544
+ } catch (error) {
545
+ if (error?.name === 'AbortError' && updateDeadlineAt && Date.now() >= updateDeadlineAt) {
546
+ throw timeoutError();
547
+ }
548
+ throw error;
358
549
  } finally {
359
550
  clearTimeout(timer);
360
551
  }
361
552
  }
362
553
 
363
554
  async function fetchBytes(url, timeoutMs = 30000) {
555
+ const effectiveTimeout = boundedTimeout(timeoutMs);
364
556
  const controller = new AbortController();
365
- const timer = setTimeout(() => controller.abort(), timeoutMs);
557
+ const timer = setTimeout(() => controller.abort(), effectiveTimeout);
366
558
  try {
367
559
  const res = await fetch(url, { signal: controller.signal, headers: { 'User-Agent': 'harness-wf-update-check' } });
368
560
  if (!res.ok) throw new Error(`HTTP ${res.status}: ${url}`);
369
561
  return Buffer.from(await res.arrayBuffer());
562
+ } catch (error) {
563
+ if (error?.name === 'AbortError' && updateDeadlineAt && Date.now() >= updateDeadlineAt) {
564
+ throw timeoutError();
565
+ }
566
+ throw error;
370
567
  } finally {
371
568
  clearTimeout(timer);
372
569
  }
@@ -477,23 +674,12 @@ async function createUrlSource(sourceBase, { stable = false } = {}) {
477
674
 
478
675
  async function resolveGithubReleaseSource() {
479
676
  try {
480
- const controller = new AbortController();
481
- const timer = setTimeout(() => controller.abort(), 15000);
482
- let res;
483
- try {
484
- res = await fetch(GITHUB_LATEST_STABLE, {
485
- signal: controller.signal,
486
- headers: { Accept: 'application/vnd.github+json', 'User-Agent': 'harness-wf-update-check' },
487
- });
488
- } finally {
489
- clearTimeout(timer);
490
- }
491
- if (!res.ok) throw new Error(`HTTP ${res.status}`);
492
- const data = JSON.parse(await res.text());
677
+ const data = JSON.parse(await fetchRemote(GITHUB_LATEST_STABLE, 15000));
493
678
  const tag = data && data.tag_name;
494
679
  if (!tag || data.prerelease) return null;
495
680
  return await createUrlSource(`${RAW_GITHUB}/${tag}/${TEMPLATE_SUBPATH}`, { stable: true });
496
- } catch {
681
+ } catch (error) {
682
+ if (error?.code === 'UPDATE_TIMEOUT') throw error;
497
683
  return null;
498
684
  }
499
685
  }
@@ -507,6 +693,7 @@ async function resolveUpdateSource(explicitSource) {
507
693
  try {
508
694
  return await createNpmSource('latest');
509
695
  } catch (e) {
696
+ if (e?.code === 'UPDATE_TIMEOUT') throw e;
510
697
  errors.push(`npm latest: ${e.message}`);
511
698
  }
512
699
 
@@ -517,12 +704,14 @@ async function resolveUpdateSource(explicitSource) {
517
704
  try {
518
705
  return await createUrlSource(DEFAULT_SOURCE_BASE, { stable: false });
519
706
  } catch (e) {
707
+ if (e?.code === 'UPDATE_TIMEOUT') throw e;
520
708
  errors.push(`GitHub canonical main: ${e.message}`);
521
709
  }
522
710
 
523
711
  try {
524
712
  return await createUrlSource(LEGACY_SOURCE_BASE, { stable: false });
525
713
  } catch (e) {
714
+ if (e?.code === 'UPDATE_TIMEOUT') throw e;
526
715
  errors.push(`GitHub legacy mirror: ${e.message}`);
527
716
  }
528
717
 
@@ -545,6 +734,26 @@ async function main() {
545
734
  const effectiveIgnoreVersion = ignoreVersion || repairMode;
546
735
  const allowDowngrade = args.includes('--allow-downgrade');
547
736
  const allowPrerelease = args.includes('--include-prerelease');
737
+ const timeoutRaw = readFlagValue(args, '--timeout-ms') || process.env.WF_UPDATE_TIMEOUT_MS;
738
+ const parsedTimeout = Number.parseInt(timeoutRaw || String(DEFAULT_UPDATE_TIMEOUT_MS), 10);
739
+ const timeoutMs = Number.isFinite(parsedTimeout) && parsedTimeout > 0 ? parsedTimeout : DEFAULT_UPDATE_TIMEOUT_MS;
740
+ updateDeadlineAt = Date.now() + timeoutMs;
741
+ const mutationRequested = apply || applySafe || finalize || acceptLocal.length > 0 || acceptMerged.length > 0 || acceptTemplate.length > 0;
742
+ if (mutationRequested) {
743
+ try {
744
+ acquireUpdateLock();
745
+ } catch (error) {
746
+ const payload = {
747
+ status: error.code === 'UPDATE_LOCKED' ? 'locked' : 'error',
748
+ code: error.code || 'UPDATE_LOCK_FAILED',
749
+ message: error.message,
750
+ };
751
+ if (jsonOut) console.log(JSON.stringify(payload, null, 2));
752
+ else console.error(`ERROR: ${payload.message}`);
753
+ process.exitCode = error.code === 'UPDATE_LOCKED' ? 4 : 1;
754
+ return;
755
+ }
756
+ }
548
757
  const explicitSource = readFlagValue(args, '--source-base') || process.env.WF_SOURCE_BASE;
549
758
  let source;
550
759
  let sourceBase;
@@ -555,6 +764,17 @@ async function main() {
555
764
  sourceBase = source.label;
556
765
  sourceStable = Boolean(source.stable);
557
766
  } catch (e) {
767
+ if (e?.code === 'UPDATE_TIMEOUT') {
768
+ const payload = {
769
+ status: 'timeout',
770
+ code: 'UPDATE_TIMEOUT',
771
+ message: e.message,
772
+ };
773
+ if (jsonOut) console.log(JSON.stringify(payload, null, 2));
774
+ else console.error(`ERROR: ${payload.message}`);
775
+ process.exitCode = UPDATE_TIMEOUT_EXIT;
776
+ return;
777
+ }
558
778
  sourceErrors = e.sourceErrors || [e.message];
559
779
  }
560
780
 
@@ -807,7 +1027,7 @@ async function main() {
807
1027
  };
808
1028
  }
809
1029
 
810
- async function applyTemplateFile(file) {
1030
+ async function prepareTemplateFile(file) {
811
1031
  const remoteHash = remoteChecksums[file];
812
1032
  if (!remoteHash) throw new Error(`No remote checksum for ${file}`);
813
1033
  const dest = safePath(file);
@@ -817,10 +1037,7 @@ async function main() {
817
1037
  const normalized = content.replace(/\r\n/g, '\n');
818
1038
  const fetchedHash = sha256(normalized);
819
1039
  if (fetchedHash !== remoteHash) throw new Error(`Hash mismatch: ${file}`);
820
- mkdirSync(dirname(dest), { recursive: true });
821
- writeFileSync(dest, normalized, 'utf-8');
822
- localVersion.checksums[file] = remoteHash;
823
- delete localVersion.acceptedConflicts[file];
1040
+ return { file, dest, content: normalized, remoteHash };
824
1041
  }
825
1042
 
826
1043
  function recordLocalDecision(file, decision, appliedAt) {
@@ -857,20 +1074,34 @@ async function main() {
857
1074
  }
858
1075
 
859
1076
  let decisionMetadataDirty = false;
1077
+ let timedOut = false;
860
1078
  if (acceptLocal.length || acceptMerged.length || acceptTemplate.length) {
861
1079
  const appliedAt = new Date().toISOString();
862
1080
  try {
1081
+ localVersion.checksums = localVersion.checksums || {};
1082
+ localVersion.acceptedConflicts = localVersion.acceptedConflicts || {};
863
1083
  for (const file of acceptLocal) recordLocalDecision(file, 'accept-local', appliedAt);
864
1084
  for (const file of acceptMerged) recordLocalDecision(file, 'accept-merged', appliedAt);
865
- for (const file of acceptTemplate) await applyTemplateFile(file);
1085
+ const templateWrites = [];
1086
+ for (const file of acceptTemplate) templateWrites.push(await prepareTemplateFile(file));
1087
+ applyPreparedTransaction(templateWrites, []);
1088
+ for (const template of templateWrites) {
1089
+ localVersion.checksums[template.file] = template.remoteHash;
1090
+ delete localVersion.acceptedConflicts[template.file];
1091
+ }
866
1092
  decisionMetadataDirty = true;
867
1093
  } catch (e) {
1094
+ timedOut = e?.code === 'UPDATE_TIMEOUT';
868
1095
  if (jsonOut) {
869
- console.log(JSON.stringify({ status: 'error', message: e.message }, null, 2));
1096
+ console.log(JSON.stringify({
1097
+ status: timedOut ? 'timeout' : 'error',
1098
+ ...(timedOut ? { code: 'UPDATE_TIMEOUT' } : {}),
1099
+ message: e.message,
1100
+ }, null, 2));
870
1101
  } else {
871
1102
  console.error(`ERROR: ${e.message}`);
872
1103
  }
873
- process.exitCode = 1;
1104
+ process.exitCode = exitCodeForError(e);
874
1105
  return;
875
1106
  }
876
1107
  }
@@ -1119,6 +1350,7 @@ async function main() {
1119
1350
  }
1120
1351
  return { ok: true, prepared: { file: entry.file, dest, content: normalized, mustNotExist } };
1121
1352
  } catch (e) {
1353
+ if (e?.code === 'UPDATE_TIMEOUT') timedOut = true;
1122
1354
  return { ok: false, message: ` x Failed: ${entry.file} - ${e.message}` };
1123
1355
  }
1124
1356
  }
@@ -1151,33 +1383,13 @@ async function main() {
1151
1383
  }
1152
1384
  }
1153
1385
 
1154
- // All-or-nothing apply invariant: every prepared file above was hash-validated
1155
- // against its manifest checksum before ANY writeFileSync below. The version
1156
- // file is advanced only when failed === 0, so a failed apply leaves version
1157
- // tracking unchanged and is safe to re-run with --apply-safe. A mid-loop
1158
- // writeFileSync throw (disk failure) is the only partial-disk edge case;
1159
- // re-running --apply-safe reconciles it.
1160
1386
  let applied = 0;
1161
1387
  if (failed === 0) {
1162
1388
  try {
1163
- for (const prepared of preparedWrites) {
1164
- mkdirSync(dirname(prepared.dest), { recursive: true });
1165
- writeFileSync(prepared.dest, prepared.content, 'utf-8');
1166
- applied++;
1167
- }
1168
- for (const moved of plan.moved) {
1169
- const from = safePath(moved.from);
1170
- if (!from) throw new Error(`Traversal rejected: ${moved.from}`);
1171
- if (!existsSync(from)) continue;
1172
- if (lstatSync(from).isSymbolicLink()) throw new Error(`Symlink rejected: ${moved.from}`);
1173
- const currentHash = sha256File(from);
1174
- if (currentHash && currentHash !== moved.storedHash) {
1175
- throw new Error(`Legacy moved file changed before cleanup: ${moved.from}`);
1176
- }
1177
- unlinkSync(from);
1178
- }
1389
+ applied = applyPreparedTransaction(preparedWrites, plan.moved);
1179
1390
  } catch (e) {
1180
- console.error(` x Failed while writing prepared files - ${e.message}`);
1391
+ if (e?.code === 'UPDATE_TIMEOUT') timedOut = true;
1392
+ console.error(` x Failed while committing update transaction - ${e.message}`);
1181
1393
  failed++;
1182
1394
  }
1183
1395
  }
@@ -1190,6 +1402,7 @@ async function main() {
1190
1402
  for (const c of plan.created) localVersion.checksums[c.file] = c.remoteHash;
1191
1403
  for (const a of plan.adopted) localVersion.checksums[a.file] = a.remoteHash;
1192
1404
  localVersion.sources = localVersion.sources || {};
1405
+ localVersion.acceptedConflicts = localVersion.acceptedConflicts || {};
1193
1406
  for (const u of plan.updated) localVersion.sources[u.file] = remoteSources[u.file] || u.file;
1194
1407
  for (const c of plan.created) localVersion.sources[c.file] = remoteSources[c.file] || c.file;
1195
1408
  for (const a of plan.adopted) localVersion.sources[a.file] = remoteSources[a.file] || a.file;
@@ -1229,7 +1442,7 @@ async function main() {
1229
1442
  }
1230
1443
  } else {
1231
1444
  console.log(`${failed} failures. NO files were version-tracked. Fix and re-run.`);
1232
- process.exitCode = 1;
1445
+ process.exitCode = timedOut ? UPDATE_TIMEOUT_EXIT : 1;
1233
1446
  }
1234
1447
  }
1235
1448
 
@@ -1267,4 +1480,14 @@ async function main() {
1267
1480
  return plan;
1268
1481
  }
1269
1482
 
1270
- main().catch(e => { console.error(e); process.exit(1); });
1483
+ main().catch(e => {
1484
+ const timedOut = e?.code === 'UPDATE_TIMEOUT';
1485
+ const payload = {
1486
+ status: timedOut ? 'timeout' : 'error',
1487
+ code: e?.code || 'UPDATE_ERROR',
1488
+ message: e?.message || String(e),
1489
+ };
1490
+ if (process.argv.includes('--json')) console.log(JSON.stringify(payload, null, 2));
1491
+ else console.error(`ERROR: ${payload.message}`);
1492
+ process.exit(timedOut ? UPDATE_TIMEOUT_EXIT : 1);
1493
+ });
@@ -9,6 +9,8 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
9
  const SCRIPT_ROOT = path.resolve(__dirname, '..', '..');
10
10
  const rawArgs = process.argv.slice(2);
11
11
  const JSON_OUT = rawArgs.includes('--json');
12
+ const DEFAULT_UPDATE_TIMEOUT_MS = 120000;
13
+ const UPDATE_TIMEOUT_EXIT = 3;
12
14
 
13
15
  function readFlagValue(args, flagName) {
14
16
  const idx = args.indexOf(flagName);
@@ -159,14 +161,28 @@ function discoverTargets(projectRoot) {
159
161
  return dedupeTargets(targets);
160
162
  }
161
163
 
162
- function runNode(root, scriptPath, args, { parseJson = false } = {}) {
164
+ function parseTimeoutMs(args) {
165
+ const raw = readFlagValue(args, '--timeout-ms') || process.env.WF_UPDATE_TIMEOUT_MS;
166
+ if (!raw) return DEFAULT_UPDATE_TIMEOUT_MS;
167
+ const parsed = Number.parseInt(raw, 10);
168
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_UPDATE_TIMEOUT_MS;
169
+ }
170
+
171
+ function remainingTimeout(deadlineAt) {
172
+ return Math.max(1, deadlineAt - Date.now());
173
+ }
174
+
175
+ function runNode(root, scriptPath, args, { parseJson = false, timeoutMs = DEFAULT_UPDATE_TIMEOUT_MS } = {}) {
163
176
  const result = spawnSync(process.execPath, [scriptPath, ...args], {
164
177
  cwd: root,
165
178
  encoding: 'utf8',
166
179
  env: process.env,
180
+ timeout: timeoutMs,
181
+ killSignal: 'SIGTERM',
167
182
  });
168
183
  const stdout = result.stdout || '';
169
184
  const stderr = result.stderr || '';
185
+ const timedOut = result.error?.code === 'ETIMEDOUT';
170
186
  let json = null;
171
187
  if (parseJson && stdout.trim()) {
172
188
  try {
@@ -175,10 +191,18 @@ function runNode(root, scriptPath, args, { parseJson = false } = {}) {
175
191
  json = { rawOutput: stdout };
176
192
  }
177
193
  }
194
+ if (timedOut && !json) {
195
+ json = {
196
+ status: 'timeout',
197
+ code: 'UPDATE_TIMEOUT',
198
+ message: `Update command exceeded the ${timeoutMs}ms deadline.`,
199
+ };
200
+ }
178
201
  return {
179
- status: result.status ?? 1,
202
+ status: timedOut ? UPDATE_TIMEOUT_EXIT : (result.status ?? 1),
180
203
  stdout,
181
204
  stderr,
205
+ ...(timedOut ? { timedOut: true, errorCode: 'UPDATE_TIMEOUT' } : {}),
182
206
  ...(parseJson ? { json } : {}),
183
207
  };
184
208
  }
@@ -199,10 +223,10 @@ function withRepair(args) {
199
223
  return wantsRepair(args) ? args : [...args, '--repair'];
200
224
  }
201
225
 
202
- function runUpdateForTarget(target, forwardArgs) {
226
+ function runUpdateForTarget(target, forwardArgs, deadlineAt) {
203
227
  const parseJson = forwardArgs.includes('--json');
204
228
  const script = updateScriptPath(target.root);
205
- const first = runNode(target.root, script, forwardArgs, { parseJson });
229
+ const first = runNode(target.root, script, forwardArgs, { parseJson, timeoutMs: remainingTimeout(deadlineAt) });
206
230
  const runs = [{ command: `node Harness/scripts/wf-update-check.mjs ${forwardArgs.join(' ')}`.trim(), ...first }];
207
231
  let effective = first;
208
232
 
@@ -213,7 +237,7 @@ function runUpdateForTarget(target, forwardArgs) {
213
237
  && !wantsRepair(forwardArgs)
214
238
  ) {
215
239
  const repairArgs = withRepair(forwardArgs);
216
- const repair = runNode(target.root, script, repairArgs, { parseJson });
240
+ const repair = runNode(target.root, script, repairArgs, { parseJson, timeoutMs: remainingTimeout(deadlineAt) });
217
241
  runs.push({ command: `node Harness/scripts/wf-update-check.mjs ${repairArgs.join(' ')}`.trim(), ...repair });
218
242
  effective = repair;
219
243
  }
@@ -221,7 +245,7 @@ function runUpdateForTarget(target, forwardArgs) {
221
245
  return { ...target, update: effective, runs };
222
246
  }
223
247
 
224
- function runPostUpdate(target, forwardArgs) {
248
+ function runPostUpdate(target, forwardArgs, deadlineAt) {
225
249
  const post = [];
226
250
  const apply = wantsApply(forwardArgs);
227
251
  const syncScript = syncScriptPath(target.root);
@@ -229,23 +253,23 @@ function runPostUpdate(target, forwardArgs) {
229
253
  const syncArgs = apply ? ['--apply', '--json'] : ['--json'];
230
254
  post.push({
231
255
  step: 'sync-host-global',
232
- ...runNode(target.root, syncScript, syncArgs, { parseJson: true }),
256
+ ...runNode(target.root, syncScript, syncArgs, { parseJson: true, timeoutMs: remainingTimeout(deadlineAt) }),
233
257
  });
234
258
  }
235
259
  if (apply && fs.existsSync(validateScriptPath(target.root))) {
236
260
  post.push({
237
261
  step: 'validate',
238
- ...runNode(target.root, validateScriptPath(target.root), [], { parseJson: false }),
262
+ ...runNode(target.root, validateScriptPath(target.root), [], { parseJson: false, timeoutMs: remainingTimeout(deadlineAt) }),
239
263
  });
240
264
  post.push({
241
265
  step: 'manifest-audit',
242
- ...runNode(target.root, validateScriptPath(target.root), ['--manifest-audit'], { parseJson: false }),
266
+ ...runNode(target.root, validateScriptPath(target.root), ['--manifest-audit'], { parseJson: false, timeoutMs: remainingTimeout(deadlineAt) }),
243
267
  });
244
268
  }
245
- if (apply && target.scope !== 'global' && fs.existsSync(scanCleanScriptPath(target.root))) {
269
+ if (apply && fs.existsSync(scanCleanScriptPath(target.root))) {
246
270
  post.push({
247
271
  step: 'scan-clean',
248
- ...runNode(target.root, scanCleanScriptPath(target.root), ['--json'], { parseJson: true }),
272
+ ...runNode(target.root, scanCleanScriptPath(target.root), ['--json'], { parseJson: true, timeoutMs: remainingTimeout(deadlineAt) }),
249
273
  });
250
274
  }
251
275
  return post;
@@ -274,6 +298,7 @@ function main() {
274
298
  const projectRoot = path.resolve(readFlagValue(rawArgs, '--project') || process.cwd());
275
299
  const forwardArgs = stripFlagWithValue(rawArgs, '--project');
276
300
  const effectiveArgs = JSON_OUT ? ensureJsonArg(forwardArgs) : forwardArgs;
301
+ const deadlineAt = Date.now() + parseTimeoutMs(rawArgs);
277
302
  const targets = discoverTargets(projectRoot);
278
303
 
279
304
  if (targets.length === 0) {
@@ -291,18 +316,26 @@ function main() {
291
316
  }
292
317
 
293
318
  const updatedTargets = targets.map(target => {
294
- const withUpdate = runUpdateForTarget(target, effectiveArgs);
319
+ const withUpdate = runUpdateForTarget(target, effectiveArgs, deadlineAt);
295
320
  return {
296
321
  ...withUpdate,
297
- post: runPostUpdate(withUpdate, effectiveArgs),
322
+ post: runPostUpdate(withUpdate, effectiveArgs, deadlineAt),
298
323
  };
299
324
  });
300
325
 
301
326
  const failures = [];
302
327
  for (const target of updatedTargets) {
303
- if (target.update.status !== 0) failures.push(`${target.scope}: update exit ${target.update.status}`);
328
+ if (target.update.status !== 0) {
329
+ failures.push(target.update.timedOut
330
+ ? `${target.scope}: update timeout`
331
+ : `${target.scope}: update exit ${target.update.status}`);
332
+ }
304
333
  for (const post of target.post || []) {
305
- if (post.status !== 0) failures.push(`${target.scope}: ${post.step} exit ${post.status}`);
334
+ if (post.status !== 0) {
335
+ failures.push(post.timedOut
336
+ ? `${target.scope}: ${post.step} timeout`
337
+ : `${target.scope}: ${post.step} exit ${post.status}`);
338
+ }
306
339
  }
307
340
  }
308
341
 
@@ -319,7 +352,11 @@ function main() {
319
352
 
320
353
  if (JSON_OUT) console.log(JSON.stringify(result, null, 2));
321
354
  else printText(result);
322
- if (failures.length) process.exitCode = 1;
355
+ if (failures.length) {
356
+ const timedOut = updatedTargets.some(target => target.update.timedOut
357
+ || (target.post || []).some(post => post.timedOut));
358
+ process.exitCode = timedOut ? UPDATE_TIMEOUT_EXIT : 1;
359
+ }
323
360
  }
324
361
 
325
362
  main();
@@ -74,5 +74,15 @@
74
74
  "theme": "auto",
75
75
  "language": "zh",
76
76
  "reducedMotion": false
77
+ },
78
+ "cleanup": {
79
+ "enabled": true,
80
+ "autoPruneOnStartup": true,
81
+ "autoPruneIntervalHours": 6,
82
+ "autoPruneStoppedSessions": false,
83
+ "stoppedSessionRetentionDays": 14,
84
+ "keepStoppedSessions": 20,
85
+ "includeTaskSessions": false,
86
+ "detachedLogRetentionHours": 24
77
87
  }
78
88
  }