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.
- package/CHANGELOG.md +49 -0
- package/README-CN.md +4 -2
- package/README.md +23 -4
- package/package.json +17 -2
- package/src/generator.js +19 -6
- package/src/index.js +531 -38
- package/src/prompts.js +4 -4
- package/src/ui/dist/assets/AgentsRoute-BGGs90wH.js +7 -0
- package/src/ui/dist/assets/Assistant-Bold-gm-uSS1B.woff2 +0 -0
- package/src/ui/dist/assets/Assistant-Medium-DrcxCXg3.woff2 +0 -0
- package/src/ui/dist/assets/Assistant-Regular-DVxZuzxb.woff2 +0 -0
- package/src/ui/dist/assets/Assistant-SemiBold-SCI4bEL9.woff2 +0 -0
- package/src/ui/dist/assets/Combination-DhBLEmof.js +42 -0
- package/src/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/src/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/src/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/src/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/src/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/src/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/src/ui/dist/assets/RolesRoute-DnodCSz0.js +2 -0
- package/src/ui/dist/assets/RuntimePicker-CucD8TGn.js +7 -0
- package/src/ui/dist/assets/SettingsRoute-DquMWjac.js +2 -0
- package/src/ui/dist/assets/TaskList-Bxc0Uktx.js +7 -0
- package/src/ui/dist/assets/TerminalDrawer-CDusYltc.js +36 -0
- package/src/ui/dist/assets/WorkflowRoute-BN8yHmUs.css +1 -0
- package/src/ui/dist/assets/WorkflowRoute-D-0wVDpY.js +334 -0
- package/src/ui/dist/assets/abnfDiagram-VRR7QNED-zkRKkaxO.js +2 -0
- package/src/ui/dist/assets/apl-B4CMkyY2.js +2 -0
- package/src/ui/dist/assets/ar-SA-G6X2FPQ2-BiHaArx5.js +11 -0
- package/src/ui/dist/assets/arc-CBnLtOFO.js +2 -0
- package/src/ui/dist/assets/architectureDiagram-ZJ3FMSHR-DWXRXsh1.js +37 -0
- package/src/ui/dist/assets/asciiarmor-Df11BRmG.js +2 -0
- package/src/ui/dist/assets/asn1-EdZsLKOL.js +2 -0
- package/src/ui/dist/assets/asterisk-B-8jnY81.js +2 -0
- package/src/ui/dist/assets/az-AZ-76LH7QW2-CiT05voO.js +2 -0
- package/src/ui/dist/assets/bg-BG-XCXSNQG7-L-UM9tNf.js +6 -0
- package/src/ui/dist/assets/blockDiagram-677ZJIJ3-BIyh3Bry.js +133 -0
- package/src/ui/dist/assets/bn-BD-2XOGV67Q-NdgbA0bC.js +6 -0
- package/src/ui/dist/assets/brainfuck-C4LP7Hcl.js +2 -0
- package/src/ui/dist/assets/c4Diagram-LMCZKHZV-CA54vWWM.js +11 -0
- package/src/ui/dist/assets/ca-ES-6MX7JW3Y-BKZZsQ5J.js +9 -0
- package/src/ui/dist/assets/channel-Da_-zcAu.js +2 -0
- package/src/ui/dist/assets/chunk-2Q5K7J3B-DE4cxr1v.js +2 -0
- package/src/ui/dist/assets/chunk-32BRIVSS-i7FwbEU9.js +2 -0
- package/src/ui/dist/assets/chunk-5VM5RSS4-BhIcOYSu.js +16 -0
- package/src/ui/dist/assets/chunk-EX3LRPZG-Ci9zZRIs.js +232 -0
- package/src/ui/dist/assets/chunk-JWPE2WC7-BFdkcz-G.js +2 -0
- package/src/ui/dist/assets/chunk-MOJQB5TN-Dzmapl_S.js +89 -0
- package/src/ui/dist/assets/chunk-RYQCIY6F-RTmp7FOy.js +2 -0
- package/src/ui/dist/assets/chunk-V7JOEXUC-DInU3v3D.js +207 -0
- package/src/ui/dist/assets/chunk-VR4S4FIN-BHoyGBQO.js +2 -0
- package/src/ui/dist/assets/chunk-XXDRQBXY-DfeLZNZx.js +2 -0
- package/src/ui/dist/assets/classDiagram-OUVF2IWQ-FKbUS0bu.js +2 -0
- package/src/ui/dist/assets/classDiagram-v2-EOCWNBFH-FKbUS0bu.js +2 -0
- package/src/ui/dist/assets/clike-B9uivgTg.js +2 -0
- package/src/ui/dist/assets/clojure-BMjYHr_A.js +2 -0
- package/src/ui/dist/assets/cmake-BQqOBYOt.js +2 -0
- package/src/ui/dist/assets/cobol-CWcv1MsR.js +2 -0
- package/src/ui/dist/assets/coffeescript-S37ZYGWr.js +2 -0
- package/src/ui/dist/assets/commonlisp-DBKNyK5s.js +2 -0
- package/src/ui/dist/assets/cose-bilkent-JH36ORCC-_5PUJ615.js +2 -0
- package/src/ui/dist/assets/crystal-SjHAIU92.js +2 -0
- package/src/ui/dist/assets/cs-CZ-2BRQDIVT-DnkfnhDU.js +12 -0
- package/src/ui/dist/assets/css-BnMrqG3P.js +2 -0
- package/src/ui/dist/assets/cynefin-VYW2F7L2-CmkcFv-b.js +179 -0
- package/src/ui/dist/assets/cynefinDiagram-TSTJHNR4-D72VZn8H.js +63 -0
- package/src/ui/dist/assets/cypher-C_CwsFkJ.js +2 -0
- package/src/ui/dist/assets/cytoscape.esm-DTSO7Bv0.js +332 -0
- package/src/ui/dist/assets/d-pRatUO7H.js +2 -0
- package/src/ui/dist/assets/da-DK-5WZEPLOC-C54tQUgd.js +6 -0
- package/src/ui/dist/assets/dagre-VKFMJZFB-0BsAkrmo.js +5 -0
- package/src/ui/dist/assets/de-DE-XR44H4JA-DGfZlR10.js +9 -0
- package/src/ui/dist/assets/defaultLocale-DX6XiGOO.js +2 -0
- package/src/ui/dist/assets/diagram-FQU43EPY-C1ZJDOca.js +4 -0
- package/src/ui/dist/assets/diagram-G47NLZAW-D3pr3FSP.js +25 -0
- package/src/ui/dist/assets/diagram-NH7WQ7WH-Bwry0NV-.js +25 -0
- package/src/ui/dist/assets/diagram-OA4YK3LP-L6g09cmV.js +31 -0
- package/src/ui/dist/assets/diagram-WEI45ONY-Bh1puYVX.js +42 -0
- package/src/ui/dist/assets/diff-DbItnlRl.js +2 -0
- package/src/ui/dist/assets/directory-open-01563666-DWU9wJ6I.js +2 -0
- package/src/ui/dist/assets/directory-open-4ed118d0-CunoC1EB.js +2 -0
- package/src/ui/dist/assets/dockerfile-BKs6k2Af.js +2 -0
- package/src/ui/dist/assets/dtd-DF_7sFjM.js +2 -0
- package/src/ui/dist/assets/dylan-DwRh75JA.js +2 -0
- package/src/ui/dist/assets/ebnf-CDyGwa7X.js +2 -0
- package/src/ui/dist/assets/ebnfDiagram-CCIWWBDH-BC_mBRR5.js +2 -0
- package/src/ui/dist/assets/ecl-Cabwm37j.js +2 -0
- package/src/ui/dist/assets/eiffel-CnydiIhH.js +2 -0
- package/src/ui/dist/assets/el-GR-BZB4AONW-DsnwWweL.js +11 -0
- package/src/ui/dist/assets/elm-vLlmbW-K.js +2 -0
- package/src/ui/dist/assets/erDiagram-Q63AITRT-Bkxam36l.js +86 -0
- package/src/ui/dist/assets/erlang-BNw1qcRV.js +2 -0
- package/src/ui/dist/assets/es-ES-U4NZUMDT-CRxBcQgC.js +10 -0
- package/src/ui/dist/assets/eu-ES-A7QVB2H4-CTd_E7YR.js +12 -0
- package/src/ui/dist/assets/excalidraw-default-bMWIgNCy.svg +1 -0
- package/src/ui/dist/assets/fa-IR-HGAKTJCU-DO56k7eG.js +9 -0
- package/src/ui/dist/assets/factor-kuTfRLto.js +2 -0
- package/src/ui/dist/assets/fcl-Kvtd6kyn.js +2 -0
- package/src/ui/dist/assets/fi-FI-Z5N7JZ37-DEDCF9WB.js +7 -0
- package/src/ui/dist/assets/file-open-002ab408-DIuFHtCF.js +2 -0
- package/src/ui/dist/assets/file-open-7c801643-684qeFg4.js +2 -0
- package/src/ui/dist/assets/file-save-3189631c-C1wFhQhH.js +2 -0
- package/src/ui/dist/assets/file-save-745eba88-Bb9F9Kg7.js +2 -0
- package/src/ui/dist/assets/flowDiagram-23GEKE2U-C3SAEao7.js +157 -0
- package/src/ui/dist/assets/forth-Ffai-XNe.js +2 -0
- package/src/ui/dist/assets/fortran-DYz_wnZ1.js +2 -0
- package/src/ui/dist/assets/fr-FR-RHASNOE6-DE2nPyDt.js +10 -0
- package/src/ui/dist/assets/ganttDiagram-NO4QXBWP-U-J_Xi-_.js +293 -0
- package/src/ui/dist/assets/gas-Bneqetm1.js +2 -0
- package/src/ui/dist/assets/gherkin-heZmZLOM.js +2 -0
- package/src/ui/dist/assets/gitGraphDiagram-IHSO6WYX-BADVbD-a.js +107 -0
- package/src/ui/dist/assets/gl-ES-HMX3MZ6V-mCqVgQHC.js +11 -0
- package/src/ui/dist/assets/graph-C9eacEi8.js +2 -0
- package/src/ui/dist/assets/groovy-D9Dt4D0W.js +2 -0
- package/src/ui/dist/assets/haskell-Cw1EW3IL.js +2 -0
- package/src/ui/dist/assets/haxe-H-WmDvRZ.js +2 -0
- package/src/ui/dist/assets/he-IL-6SHJWFNN-KnaLrCzw.js +11 -0
- package/src/ui/dist/assets/hi-IN-IWLTKZ5I-wuqiaaWt.js +5 -0
- package/src/ui/dist/assets/http-DBlCnlav.js +2 -0
- package/src/ui/dist/assets/hu-HU-A5ZG7DT2-DLg_zm22.js +8 -0
- package/src/ui/dist/assets/id-ID-SAP4L64H-MB2mXqcR.js +11 -0
- package/src/ui/dist/assets/idl-BEugSyMb.js +2 -0
- package/src/ui/dist/assets/image-blob-reduce.esm-HwCm7IZ0.js +8 -0
- package/src/ui/dist/assets/index-39SJtrt0.js +2 -0
- package/src/ui/dist/assets/index-BQ0LIrW-.js +2 -0
- package/src/ui/dist/assets/index-BcAUh2Nm.css +1 -0
- package/src/ui/dist/assets/index-BcThOK-i.js +331 -0
- package/src/ui/dist/assets/index-BnxV3k_S.js +3 -0
- package/src/ui/dist/assets/index-C7MZBHbT.js +117 -0
- package/src/ui/dist/assets/index-CCvKI2rM.js +2 -0
- package/src/ui/dist/assets/index-CZvmcCab.js +8 -0
- package/src/ui/dist/assets/index-Cp3hLKNl.js +2 -0
- package/src/ui/dist/assets/index-D7ayFxcx.js +2 -0
- package/src/ui/dist/assets/index-DAYxSQGU.js +2 -0
- package/src/ui/dist/assets/index-DD-HeMV0.css +1 -0
- package/src/ui/dist/assets/index-DPMxd3Qn.js +2 -0
- package/src/ui/dist/assets/index-DSe2jx3k.js +4 -0
- package/src/ui/dist/assets/index-DUirCkgW.js +2 -0
- package/src/ui/dist/assets/index-DaKPQ2hN.js +159 -0
- package/src/ui/dist/assets/index-DzpuR0Jg.js +2 -0
- package/src/ui/dist/assets/index-POndwsCI.js +2 -0
- package/src/ui/dist/assets/index-R8NM9I_9.js +2 -0
- package/src/ui/dist/assets/index-TCDuDhBj.js +2 -0
- package/src/ui/dist/assets/index-TckzASdM.js +2 -0
- package/src/ui/dist/assets/index-Yi5ytFFr.js +2 -0
- package/src/ui/dist/assets/infoDiagram-FWYZ7A6U-CiGBlFqH.js +3 -0
- package/src/ui/dist/assets/init-Gi6I4Gst.js +2 -0
- package/src/ui/dist/assets/ishikawaDiagram-FXEZZL3T-B1aheRbz.js +71 -0
- package/src/ui/dist/assets/it-IT-JPQ66NNP-DT3HSU7X.js +12 -0
- package/src/ui/dist/assets/ja-JP-DBVTYXUO-CsfJjjWt.js +9 -0
- package/src/ui/dist/assets/javascript-iXu5QeM3.js +2 -0
- package/src/ui/dist/assets/journeyDiagram-5HDEW3XC-DtnJPxub.js +140 -0
- package/src/ui/dist/assets/julia-DuME0IfC.js +2 -0
- package/src/ui/dist/assets/kaa-6HZHGXH3-DQz-1-Gn.js +2 -0
- package/src/ui/dist/assets/kab-KAB-ZGHBKWFO-CaH-LSoK.js +9 -0
- package/src/ui/dist/assets/kanban-definition-HUTT4EX6-CZatSm3e.js +90 -0
- package/src/ui/dist/assets/katex-C5jXJg4s.js +258 -0
- package/src/ui/dist/assets/kk-KZ-P5N5QNE5-BMXmcm55.js +2 -0
- package/src/ui/dist/assets/km-KH-HSX4SM5Z-ZeoJNBpN.js +12 -0
- package/src/ui/dist/assets/ko-KR-MTYHY66A-BeaLRKph.js +10 -0
- package/src/ui/dist/assets/ku-TR-6OUDTVRD-B_28KrkR.js +10 -0
- package/src/ui/dist/assets/layout-DEXfKzaS.js +2 -0
- package/src/ui/dist/assets/linear-CpEDnQRC.js +2 -0
- package/src/ui/dist/assets/livescript-BwQOo05w.js +2 -0
- package/src/ui/dist/assets/lt-LT-XHIRWOB4-BxDcnUhp.js +4 -0
- package/src/ui/dist/assets/lua-VAEuO923.js +2 -0
- package/src/ui/dist/assets/lv-LV-5QDEKY6T-DpKDl1_y.js +8 -0
- package/src/ui/dist/assets/map-Czzmt4hB.js +2 -0
- package/src/ui/dist/assets/mathematica-DTrFuWx2.js +2 -0
- package/src/ui/dist/assets/mbox-CNhZ1qSd.js +2 -0
- package/src/ui/dist/assets/mermaidLoader-CBO31t0J.js +305 -0
- package/src/ui/dist/assets/mermaidLoader-CEK31ho9.css +1 -0
- package/src/ui/dist/assets/mindmap-definition-LN4V7U3C-CQ0TccEr.js +97 -0
- package/src/ui/dist/assets/mirc-CjQqDB4T.js +2 -0
- package/src/ui/dist/assets/mllike-CXdrOF99.js +2 -0
- package/src/ui/dist/assets/modelica-Dc1JOy9r.js +2 -0
- package/src/ui/dist/assets/mr-IN-CRQNXWMA-BKCZT58p.js +14 -0
- package/src/ui/dist/assets/mscgen-BA5vi2Kp.js +2 -0
- package/src/ui/dist/assets/mumps-BT43cFF4.js +2 -0
- package/src/ui/dist/assets/my-MM-5M5IBNSE-D34k0G9T.js +2 -0
- package/src/ui/dist/assets/nb-NO-T6EIAALU-DXr_KW8J.js +11 -0
- package/src/ui/dist/assets/nginx-DdIZxoE0.js +2 -0
- package/src/ui/dist/assets/nl-NL-IS3SIHDZ-C1L0aVDR.js +9 -0
- package/src/ui/dist/assets/nn-NO-6E72VCQL-CLWVSxbZ.js +9 -0
- package/src/ui/dist/assets/nsis-LdVXkNf5.js +2 -0
- package/src/ui/dist/assets/ntriples-BfvgReVJ.js +2 -0
- package/src/ui/dist/assets/oc-FR-POXYY2M6-nf8_J3eR.js +9 -0
- package/src/ui/dist/assets/octave-Ck1zUtKM.js +2 -0
- package/src/ui/dist/assets/ordinal-Cboi1Yqb.js +2 -0
- package/src/ui/dist/assets/oz-BzwKVEFT.js +2 -0
- package/src/ui/dist/assets/pa-IN-N4M65BXN-CAMJ-xd6.js +5 -0
- package/src/ui/dist/assets/pascal--L3eBynH.js +2 -0
- package/src/ui/dist/assets/pegDiagram-2B236MQR-Bj2RcmRd.js +2 -0
- package/src/ui/dist/assets/percentages-BXMCSKIN-s9yWFdr6.js +160 -0
- package/src/ui/dist/assets/perl-CdXCOZ3F.js +2 -0
- package/src/ui/dist/assets/pica-BGv_AhAB.js +8 -0
- package/src/ui/dist/assets/pieDiagram-ENE6RG2P-obpzz8dC.js +40 -0
- package/src/ui/dist/assets/pig-CevX1Tat.js +2 -0
- package/src/ui/dist/assets/pl-PL-T2D74RX3-DKJ5H85v.js +10 -0
- package/src/ui/dist/assets/powershell-CFHJl5sT.js +2 -0
- package/src/ui/dist/assets/properties-C78fOPTZ.js +2 -0
- package/src/ui/dist/assets/protobuf-ChK-085T.js +2 -0
- package/src/ui/dist/assets/{proxy-D0vUbds5.js → proxy-BSmwef4H.js} +2 -2
- package/src/ui/dist/assets/pt-BR-5N22H2LF-B5kow-kN.js +10 -0
- package/src/ui/dist/assets/pt-PT-UZXXM6DQ-B2G34fso.js +10 -0
- package/src/ui/dist/assets/pug-DeIclll2.js +2 -0
- package/src/ui/dist/assets/puppet-DMA9R1ak.js +2 -0
- package/src/ui/dist/assets/python-BuPzkPfP.js +2 -0
- package/src/ui/dist/assets/q-pXgVlZs6.js +2 -0
- package/src/ui/dist/assets/quadrantDiagram-ABIIQ3AL-Cl-T7NkJ.js +8 -0
- package/src/ui/dist/assets/r-B6wPVr8A.js +2 -0
- package/src/ui/dist/assets/railroadDiagram-RFXS5EU6-DMq82RHg.js +2 -0
- package/src/ui/dist/assets/{refresh-cw-JNmExijd.js → refresh-cw-CbFd7guV.js} +2 -2
- package/src/ui/dist/assets/requirementDiagram-TGXJPOKE-tGInMDgU.js +85 -0
- package/src/ui/dist/assets/ro-RO-JPDTUUEW-BwLdZW91.js +12 -0
- package/src/ui/dist/assets/roundRect-0PYZxl1G.js +2 -0
- package/src/ui/dist/assets/rpm-CTu-6PCP.js +2 -0
- package/src/ui/dist/assets/ru-RU-B4JR7IUQ-DpdAgIJc.js +10 -0
- package/src/ui/dist/assets/ruby-B2Rjki9n.js +2 -0
- package/src/ui/dist/assets/runtimeBrand-BoKPimsz.js +2 -0
- package/src/ui/dist/assets/sankeyDiagram-HTMAVEWB-C7X-ET4m.js +41 -0
- package/src/ui/dist/assets/sas-B4kiWyti.js +2 -0
- package/src/ui/dist/assets/save-D1CXHwBw.js +12 -0
- package/src/ui/dist/assets/scheme-C41bIUwD.js +2 -0
- package/src/ui/dist/assets/sequenceDiagram-DBY2YBRQ-Bn24i_nY.js +163 -0
- package/src/ui/dist/assets/settings-2-DtSNAAcU.js +22 -0
- package/src/ui/dist/assets/shell-CjFT_Tl9.js +2 -0
- package/src/ui/dist/assets/shield-check-BVbJ8T_N.js +7 -0
- package/src/ui/dist/assets/si-LK-N5RQ5JYF-naJaUy5u.js +2 -0
- package/src/ui/dist/assets/sieve-C3Gn_uJK.js +2 -0
- package/src/ui/dist/assets/simple-mode-GW_nhZxv.js +2 -0
- package/src/ui/dist/assets/sizeCapture-X5ZJPWSS-DAQHfm82.js +2 -0
- package/src/ui/dist/assets/sk-SK-C5VTKIMK-1NPz1J_d.js +7 -0
- package/src/ui/dist/assets/sl-SI-NN7IZMDC-D8RfmNQw.js +7 -0
- package/src/ui/dist/assets/smalltalk-CnHTOXQT.js +2 -0
- package/src/ui/dist/assets/solr-DehyRSwq.js +2 -0
- package/src/ui/dist/assets/sparql-DkYu6x3z.js +2 -0
- package/src/ui/dist/assets/spreadsheet-BCZA_wO0.js +2 -0
- package/src/ui/dist/assets/sql-D0XecflT.js +2 -0
- package/src/ui/dist/assets/stateDiagram-2N3HPSRC-Ck48D1ck.js +2 -0
- package/src/ui/dist/assets/stateDiagram-v2-6OUMAXLB-CdfRCJAJ.js +2 -0
- package/src/ui/dist/assets/stex-C3f8Ysf7.js +2 -0
- package/src/ui/dist/assets/style-C3QI7VPf.css +1 -0
- package/src/ui/dist/assets/stylus-B533Al4x.js +2 -0
- package/src/ui/dist/assets/subset-shared.chunk-eAtLHmbi.js +85 -0
- package/src/ui/dist/assets/subset-worker.chunk-DeHCTnTk.js +2 -0
- package/src/ui/dist/assets/sv-SE-XGPEYMSR-BeOYCU-8.js +11 -0
- package/src/ui/dist/assets/swift-BzpIVaGY.js +2 -0
- package/src/ui/dist/assets/swimlanes-5IMT3BWC-DOy22UjP.js +3 -0
- package/src/ui/dist/assets/swimlanesDiagram-G3AALYLV-sicPbVOg.js +9 -0
- package/src/ui/dist/assets/ta-IN-2NMHFXQM-CtS68WDd.js +10 -0
- package/src/ui/dist/assets/tcl-DVfN8rqt.js +2 -0
- package/src/ui/dist/assets/{terminal-BBQvnOAK.js → terminal-DEby5Y_P.js} +2 -2
- package/src/ui/dist/assets/terminalControl-BkFeDVXo.js +134 -0
- package/src/ui/dist/assets/textile-CnDTJFAw.js +2 -0
- package/src/ui/dist/assets/th-TH-HPSO5L25-DCHY9-Co.js +3 -0
- package/src/ui/dist/assets/tiddlywiki-DO-Gjzrf.js +2 -0
- package/src/ui/dist/assets/tiki-DGYXhP31.js +2 -0
- package/src/ui/dist/assets/timeline-definition-FHXFAJF6-DVkG72qO.js +121 -0
- package/src/ui/dist/assets/toml-Bm5Em-hy.js +2 -0
- package/src/ui/dist/assets/tr-TR-DEFEU3FU-y5-vjTv8.js +8 -0
- package/src/ui/dist/assets/troff-wAsdV37c.js +2 -0
- package/src/ui/dist/assets/ttcn-CfJYG6tj.js +2 -0
- package/src/ui/dist/assets/ttcn-cfg-B9xdYoR4.js +2 -0
- package/src/ui/dist/assets/turtle-B1tBg_DP.js +2 -0
- package/src/ui/dist/assets/uk-UA-QMV73CPH-BRbR5It6.js +7 -0
- package/src/ui/dist/assets/useReducedMotion-D07XP52Q.js +12 -0
- package/src/ui/dist/assets/vb-CmGdzxic.js +2 -0
- package/src/ui/dist/assets/vbscript-BuJXcnF6.js +2 -0
- package/src/ui/dist/assets/velocity-D8B20fx6.js +2 -0
- package/src/ui/dist/assets/vennDiagram-L72KCM5P-DwMwBlf-.js +35 -0
- package/src/ui/dist/assets/verilog-C6RDOZhf.js +2 -0
- package/src/ui/dist/assets/vhdl-lSbBsy5d.js +2 -0
- package/src/ui/dist/assets/vi-VN-M7AON7JQ-s6wSBv2s.js +6 -0
- package/src/ui/dist/assets/wardleyDiagram-EHGQE667-CNuuvzEg.js +79 -0
- package/src/ui/dist/assets/webidl-ZXfAyPTL.js +2 -0
- package/src/ui/dist/assets/{x-DoIOGAJz.js → x-B84wq78k.js} +2 -2
- package/src/ui/dist/assets/xquery-DzFWVndE.js +2 -0
- package/src/ui/dist/assets/xychartDiagram-FW5EYKEG-dUpZxmn6.js +8 -0
- package/src/ui/dist/assets/yacas-BJ4BC0dw.js +2 -0
- package/src/ui/dist/assets/z80-Hz9HOZM7.js +2 -0
- package/src/ui/dist/assets/zh-CN-LNUGB5OW-Cu_-POQN.js +11 -0
- package/src/ui/dist/assets/zh-HK-E62DVLB3-BCx4W4qZ.js +2 -0
- package/src/ui/dist/assets/zh-TW-RAJ6MFWO-02wx_Mrj.js +10 -0
- package/src/ui/dist/icons/excalidraw.svg +1 -0
- package/src/ui/dist/icons/markdown.svg +1 -0
- package/src/ui/dist/index.html +2 -2
- package/src/ui/package.json +10 -0
- package/src/ui/playwright.config.ts +36 -0
- package/src/ui/pnpm-workspace.yaml +2 -0
- package/src/ui/public/icons/excalidraw.svg +1 -0
- package/src/ui/public/icons/markdown.svg +1 -0
- package/src/ui/tsconfig.json +2 -1
- package/src/ui/vite.config.ts +1 -0
- package/src/wf-ui-server/__tests__/a2a-store.test.mjs +432 -15
- package/src/wf-ui-server/__tests__/action-registry-loader.test.mjs +156 -0
- package/src/wf-ui-server/__tests__/claude-stream-json.test.mjs +397 -0
- package/src/wf-ui-server/__tests__/codex-appserver.test.mjs +392 -0
- package/src/wf-ui-server/__tests__/component-node-api.test.mjs +881 -0
- package/src/wf-ui-server/__tests__/component-node-store.test.mjs +401 -0
- package/src/wf-ui-server/__tests__/control-plane-acceptance.test.mjs +2027 -0
- package/src/wf-ui-server/__tests__/control-plane-cli-smoke.test.mjs +1014 -0
- package/src/wf-ui-server/__tests__/dispatch-lifecycle.test.mjs +330 -0
- package/src/wf-ui-server/__tests__/effort-compatibility-red-092.test.mjs +151 -0
- package/src/wf-ui-server/__tests__/graph-layout-agent-tree.test.mjs +254 -0
- package/src/wf-ui-server/__tests__/graph-layout-tidy.test.mjs +260 -0
- package/src/wf-ui-server/__tests__/graph-layout.test.mjs +84 -0
- package/src/wf-ui-server/__tests__/node-config-api.test.mjs +384 -0
- package/src/wf-ui-server/__tests__/opencode-server.test.mjs +526 -0
- package/src/wf-ui-server/__tests__/peer-capsule.test.mjs +2 -2
- package/src/wf-ui-server/__tests__/pty-adapter.test.mjs +71 -1
- package/src/wf-ui-server/__tests__/runtime-config.test.mjs +3 -3
- package/src/wf-ui-server/__tests__/runtime-detector.test.mjs +21 -0
- package/src/wf-ui-server/__tests__/runtime-review.test.mjs +828 -0
- package/src/wf-ui-server/__tests__/server.integration.test.mjs +1463 -11
- package/src/wf-ui-server/__tests__/session-cleanup.test.mjs +159 -0
- package/src/wf-ui-server/__tests__/session-registry.test.mjs +52 -3
- package/src/wf-ui-server/__tests__/settings.test.mjs +12 -2
- package/src/wf-ui-server/__tests__/spawn-gate.test.mjs +78 -0
- package/src/wf-ui-server/__tests__/task-group-parser.test.mjs +120 -0
- package/src/wf-ui-server/__tests__/task-group-tag.test.mjs +264 -0
- package/src/wf-ui-server/__tests__/task-parser.test.mjs +49 -3
- package/src/wf-ui-server/__tests__/terminal-context-hardening.test.mjs +122 -0
- package/src/wf-ui-server/__tests__/terminal-context.test.mjs +164 -0
- package/src/wf-ui-server/__tests__/terminal-store.test.mjs +4 -4
- package/src/wf-ui-server/__tests__/wf-browser-api.test.mjs +599 -0
- package/src/wf-ui-server/__tests__/wf-browser-store.test.mjs +184 -0
- package/src/wf-ui-server/__tests__/workflow-action-registry.test.mjs +282 -0
- package/src/wf-ui-server/__tests__/workflow-agent-communication.test.mjs +411 -0
- package/src/wf-ui-server/__tests__/workflow-agent-context.test.mjs +323 -0
- package/src/wf-ui-server/__tests__/workflow-agent-cooperation-permissions.test.mjs +318 -0
- package/src/wf-ui-server/__tests__/workflow-agent-messages-structured.test.mjs +458 -0
- package/src/wf-ui-server/__tests__/workflow-agent-routing.test.mjs +434 -0
- package/src/wf-ui-server/__tests__/workflow-agent-runtime.test.mjs +324 -0
- package/src/wf-ui-server/__tests__/workflow-api-integration.test.mjs +263 -0
- package/src/wf-ui-server/__tests__/workflow-api-phase3.test.mjs +1213 -0
- package/src/wf-ui-server/__tests__/workflow-claude-materialize.test.mjs +209 -0
- package/src/wf-ui-server/__tests__/workflow-cli-registry-manuals.test.mjs +173 -0
- package/src/wf-ui-server/__tests__/workflow-cli-surface.test.mjs +176 -0
- package/src/wf-ui-server/__tests__/workflow-codex-resume-id.test.mjs +556 -0
- package/src/wf-ui-server/__tests__/workflow-cooperation-enforcement.test.mjs +553 -0
- package/src/wf-ui-server/__tests__/workflow-depth-resume-dock.test.mjs +846 -0
- package/src/wf-ui-server/__tests__/workflow-display-node.test.mjs +150 -0
- package/src/wf-ui-server/__tests__/workflow-edge-update.test.mjs +296 -0
- package/src/wf-ui-server/__tests__/workflow-file-cache-lock-watch.test.mjs +380 -0
- package/src/wf-ui-server/__tests__/workflow-file-formats.test.mjs +994 -0
- package/src/wf-ui-server/__tests__/workflow-file-node-actions.test.mjs +294 -0
- package/src/wf-ui-server/__tests__/workflow-goal-actions.test.mjs +357 -0
- package/src/wf-ui-server/__tests__/workflow-goal-task-autoclose.test.mjs +256 -0
- package/src/wf-ui-server/__tests__/workflow-graceful-stop.test.mjs +108 -0
- package/src/wf-ui-server/__tests__/workflow-graph-undo.test.mjs +524 -0
- package/src/wf-ui-server/__tests__/workflow-layout.test.mjs +732 -0
- package/src/wf-ui-server/__tests__/workflow-magnetic-topology.test.mjs +222 -0
- package/src/wf-ui-server/__tests__/workflow-markdown-lock.test.mjs +359 -0
- package/src/wf-ui-server/__tests__/workflow-mcp-hub.test.mjs +174 -0
- package/src/wf-ui-server/__tests__/workflow-node-manual-schema.test.mjs +241 -0
- package/src/wf-ui-server/__tests__/workflow-node-runtime.test.mjs +1991 -0
- package/src/wf-ui-server/__tests__/workflow-node-store-utils.test.mjs +125 -0
- package/src/wf-ui-server/__tests__/workflow-registry-drift.test.mjs +296 -0
- package/src/wf-ui-server/__tests__/workflow-resource-handle-four-side.test.mjs +217 -0
- package/src/wf-ui-server/__tests__/workflow-role-profile.test.mjs +234 -0
- package/src/wf-ui-server/__tests__/workflow-set-model.test.mjs +261 -0
- package/src/wf-ui-server/__tests__/workflow-skill-group-context-enabled.test.mjs +131 -0
- package/src/wf-ui-server/__tests__/workflow-skill-group-enable-disable.test.mjs +186 -0
- package/src/wf-ui-server/__tests__/workflow-skills-hub.test.mjs +125 -0
- package/src/wf-ui-server/__tests__/workflow-state-reconcile.test.mjs +139 -0
- package/src/wf-ui-server/__tests__/workflow-subagent-strategy-matrix.test.mjs +529 -0
- package/src/wf-ui-server/__tests__/workflow-team-flow.test.mjs +278 -0
- package/src/wf-ui-server/__tests__/workflow-terminal-control-live.test.mjs +294 -0
- package/src/wf-ui-server/__tests__/workflow-terminal-control.test.mjs +631 -0
- package/src/wf-ui-server/__tests__/workflow-timer-wakeup.test.mjs +318 -0
- package/src/wf-ui-server/__tests__/workflow-unified-resume.test.mjs +537 -0
- package/src/wf-ui-server/__tests__/workspace-api-hardening.test.mjs +187 -0
- package/src/wf-ui-server/__tests__/workspace-api.test.mjs +382 -0
- package/src/wf-ui-server/__tests__/workspace-reveal.test.mjs +138 -0
- package/src/wf-ui-server/__tests__/workspace-store-hardening.test.mjs +255 -0
- package/src/wf-ui-server/__tests__/workspace-store.test.mjs +208 -0
- package/src/wf-ui-server/__tests__/ws-events.integration.test.mjs +52 -25
- package/src/wf-ui-server/__tests__/ws-terminal.integration.test.mjs +12 -6
- package/src/wf-ui-server/__tests__/ws-wf-browser.integration.test.mjs +488 -0
- package/src/wf-ui-server/a2a-store.mjs +3007 -89
- package/src/wf-ui-server/action-registry.mjs +277 -0
- package/src/wf-ui-server/bridge-store.mjs +276 -0
- package/src/wf-ui-server/chat-driver.mjs +220 -0
- package/src/wf-ui-server/chat-store.mjs +109 -0
- package/src/wf-ui-server/claude-transcript-materializer.mjs +235 -0
- package/src/wf-ui-server/codex-update-prompt.mjs +53 -0
- package/src/wf-ui-server/component-node-store.mjs +689 -0
- package/src/wf-ui-server/composition-api.mjs +436 -0
- package/src/wf-ui-server/control-plane-token.mjs +17 -0
- package/src/wf-ui-server/dispatch-contract.mjs +150 -0
- package/src/wf-ui-server/drivers/claude-stream-json.mjs +371 -0
- package/src/wf-ui-server/drivers/codex-appserver.mjs +513 -0
- package/src/wf-ui-server/drivers/opencode-server.mjs +486 -0
- package/src/wf-ui-server/excalidraw-svg.mjs +141 -0
- package/src/wf-ui-server/file-format-adapters.mjs +511 -0
- package/src/wf-ui-server/file-watcher.mjs +215 -0
- package/src/wf-ui-server/graph-layout.mjs +778 -0
- package/src/wf-ui-server/harness-env.mjs +46 -0
- package/src/wf-ui-server/json-store-utils.mjs +48 -0
- package/src/wf-ui-server/model-capability.mjs +773 -0
- package/src/wf-ui-server/node-config-store.mjs +233 -0
- package/src/wf-ui-server/node-store-utils.mjs +88 -0
- package/src/wf-ui-server/peer-capsule.mjs +56 -1
- package/src/wf-ui-server/pty-adapter.mjs +513 -11
- package/src/wf-ui-server/reveal-foreground.mjs +69 -0
- package/src/wf-ui-server/runtime-detector.mjs +52 -6
- package/src/wf-ui-server/server.mjs +5613 -403
- package/src/wf-ui-server/session-cleanup.mjs +363 -0
- package/src/wf-ui-server/session-registry.mjs +179 -3
- package/src/wf-ui-server/settings.mjs +25 -0
- package/src/wf-ui-server/spawn-gate.mjs +46 -0
- package/src/wf-ui-server/task-parser.mjs +88 -3
- package/src/wf-ui-server/terminal-store.mjs +225 -11
- package/src/wf-ui-server/timer-wakeup-scheduler.mjs +226 -0
- package/src/wf-ui-server/wf-browser-store.mjs +733 -0
- package/src/wf-ui-server/workflow-agent-context.mjs +1731 -0
- package/src/wf-ui-server/workflow-capability-node-store.mjs +676 -0
- package/src/wf-ui-server/workflow-event-node-store.mjs +623 -0
- package/src/wf-ui-server/workflow-goal-node-store.mjs +328 -0
- package/src/wf-ui-server/workflow-graph-store.mjs +623 -0
- package/src/wf-ui-server/workflow-mcp-hub.mjs +286 -0
- package/src/wf-ui-server/workflow-node-runtime.mjs +1767 -0
- package/src/wf-ui-server/workflow-node-settings-store.mjs +339 -0
- package/src/wf-ui-server/workflow-node-types/agent-node.mjs +920 -0
- package/src/wf-ui-server/workflow-node-types/display-node.mjs +151 -0
- package/src/wf-ui-server/workflow-node-types/excalidraw-node.mjs +145 -0
- package/src/wf-ui-server/workflow-node-types/file-node.mjs +484 -0
- package/src/wf-ui-server/workflow-node-types/github-trigger-node.mjs +207 -0
- package/src/wf-ui-server/workflow-node-types/goal-node.mjs +491 -0
- package/src/wf-ui-server/workflow-node-types/markdown-node.mjs +225 -0
- package/src/wf-ui-server/workflow-node-types/mcp-connector-node.mjs +71 -0
- package/src/wf-ui-server/workflow-node-types/role-profile-store.mjs +191 -0
- package/src/wf-ui-server/workflow-node-types/skill-group-node.mjs +98 -0
- package/src/wf-ui-server/workflow-node-types/timer-node.mjs +607 -0
- package/src/wf-ui-server/workflow-ontology.mjs +681 -0
- package/src/wf-ui-server/workflow-operation-store.mjs +115 -0
- package/src/wf-ui-server/workflow-skills-hub.mjs +366 -0
- package/src/wf-ui-server/workflow-skills-market.mjs +723 -0
- package/src/wf-ui-server/workspace-store.mjs +951 -0
- package/src/wf-ui-server/ws-chat.mjs +299 -0
- package/src/wf-ui-server/ws-events.mjs +45 -20
- package/src/wf-ui-server/ws-terminal.mjs +165 -22
- package/src/wf-ui-server/ws-wf-browser.mjs +419 -0
- package/templates/common/.claude/agents/review-manager.md +33 -29
- package/templates/common/.claude/commands/wf-browser.md +1 -1
- package/templates/common/.claude/commands/wf-help.md +5 -3
- package/templates/common/.claude/commands/wf-init.md +44 -0
- package/templates/common/.claude/commands/wf-learn.md +34 -8
- package/templates/common/.claude/commands/wf-max.md +19 -9
- package/templates/common/.claude/commands/wf-review.md +3 -3
- package/templates/common/.claude/commands/wf-search.md +55 -0
- package/templates/common/.claude/commands/wf-task-archive.md +5 -4
- package/templates/common/.claude/commands/wf-task-list.md +6 -3
- package/templates/common/.claude/commands/wf-task-record.md +10 -2
- package/templates/common/.claude/commands/wf-ui.md +12 -5
- package/templates/common/.claude/commands/wf-update.md +4 -0
- package/templates/common/.claude/commands/wf.md +12 -1
- package/templates/common/.claude/rules/ecc/common.md +10 -1
- package/templates/common/.claude/skills/wf/SKILL.md +36 -0
- package/templates/common/.claude/skills/wf-browser/SKILL.md +427 -122
- package/templates/common/.claude/skills/wf-browser/references/BROWSER_CONTROL_PATTERNS.md +43 -0
- package/templates/common/.claude/skills/wf-init/SKILL.md +33 -0
- package/templates/common/.claude/skills/wf-learn/SKILL.md +106 -26
- package/templates/common/.claude/skills/wf-max/SKILL.md +45 -11
- package/templates/common/.claude/skills/wf-review/SKILL.md +26 -54
- package/templates/common/.claude/skills/wf-search/SKILL.md +122 -0
- package/templates/common/.claude/skills/wf-search/references/evidence-contract.md +77 -0
- package/templates/common/.claude/skills/wf-search/references/policies/compare.md +38 -0
- package/templates/common/.claude/skills/wf-search/references/policies/fact.md +39 -0
- package/templates/common/.claude/skills/wf-search/references/policies/troubleshoot.md +39 -0
- package/templates/common/.claude/skills/wf-search/references/policies/verify.md +44 -0
- package/templates/common/.claude/skills/wf-search/references/source-routing.md +40 -0
- package/templates/common/.claude/skills/wf-search/references/tool-adapters.md +38 -0
- package/templates/common/.claude/skills/wf-ui/SKILL.md +146 -12
- package/templates/common/.claude/skills/wf-update/SKILL.md +5 -1
- package/templates/common/.harness-version +188 -85
- package/templates/common/.opencode/agents/review-manager.md +31 -27
- package/templates/common/.opencode/commands/wf-browser.md +1 -1
- package/templates/common/.opencode/commands/wf-help.md +5 -3
- package/templates/common/.opencode/commands/wf-init.md +44 -0
- package/templates/common/.opencode/commands/wf-learn.md +34 -8
- package/templates/common/.opencode/commands/wf-max.md +19 -9
- package/templates/common/.opencode/commands/wf-review.md +3 -3
- package/templates/common/.opencode/commands/wf-search.md +55 -0
- package/templates/common/.opencode/commands/wf-task-archive.md +5 -7
- package/templates/common/.opencode/commands/wf-task-list.md +6 -6
- package/templates/common/.opencode/commands/wf-task-record.md +10 -5
- package/templates/common/.opencode/commands/wf-ui.md +12 -5
- package/templates/common/.opencode/commands/wf-update.md +4 -0
- package/templates/common/.opencode/commands/wf.md +12 -1
- package/templates/common/CLAUDE.md +61 -3
- package/templates/common/Harness/MEMORY.md +8 -5
- package/templates/common/Harness/README.md +14 -10
- package/templates/common/Harness/a2a/action-registry.json +4397 -0
- package/templates/common/Harness/a2a/role-graph.json +16 -3
- package/templates/common/Harness/a2a/skills/terminal-control.json +45 -1
- package/templates/common/Harness/a2a/skills/wf-ui-map.json +50 -0
- package/templates/common/Harness/a2a/skills/workflow-agent-node.json +143 -0
- package/templates/common/Harness/a2a/skills/workflow-context.json +95 -0
- package/templates/common/Harness/a2a/skills/workflow-diagram-node.json +60 -0
- package/templates/common/Harness/a2a/skills/workflow-display-node.json +69 -0
- package/templates/common/Harness/a2a/skills/workflow-file-node.json +92 -0
- package/templates/common/Harness/a2a/skills/workflow-goal-node.json +76 -0
- package/templates/common/Harness/a2a/skills/workflow-markdown-node.json +79 -0
- package/templates/common/Harness/a2a/skills/workflow-mcp-connector-node.json +59 -0
- package/templates/common/Harness/a2a/skills/workflow-node-actions.json +105 -0
- package/templates/common/Harness/a2a/skills/workflow-node-map.json +71 -0
- package/templates/common/Harness/a2a/skills/workflow-ontology.json +54 -0
- package/templates/common/Harness/a2a/skills/workflow-resource-node.json +68 -0
- package/templates/common/Harness/a2a/skills/workflow-skill-group-node.json +56 -0
- package/templates/common/Harness/a2a/skills/workflow-timer-node.json +81 -0
- package/templates/common/Harness/a2a/workflows.json +33 -0
- package/templates/common/Harness/ownership.manifest.json +263 -2
- package/templates/common/Harness/project/architecture.md +499 -0
- package/templates/common/Harness/research/README.md +20 -0
- package/templates/common/Harness/scripts/README.md +70 -6
- package/templates/common/Harness/scripts/a2a-terminal.mjs +12 -4
- package/templates/common/Harness/scripts/context-budget.mjs +7 -3
- package/templates/common/Harness/scripts/lib/memory-context.mjs +400 -0
- package/templates/common/Harness/scripts/lib/path-scope.mjs +77 -0
- package/templates/common/Harness/scripts/lib/research-policy.mjs +99 -0
- package/templates/common/Harness/scripts/lib/wf-search.mjs +189 -0
- package/templates/common/Harness/scripts/memory-context.mjs +63 -0
- package/templates/common/Harness/scripts/research-policy.mjs +27 -0
- package/templates/common/Harness/scripts/task-context.mjs +547 -0
- package/templates/common/Harness/scripts/task-group-index.mjs +242 -0
- package/templates/common/Harness/scripts/task-state.mjs +659 -95
- package/templates/common/Harness/scripts/validate-harness.mjs +70 -28
- package/templates/common/Harness/scripts/wf-auto-update-prompt.mjs +24 -0
- package/templates/common/Harness/scripts/wf-remove.mjs +10 -0
- package/templates/common/Harness/scripts/wf-search.mjs +10 -0
- package/templates/common/Harness/scripts/wf-ui-control.mjs +3144 -0
- package/templates/common/Harness/scripts/wf-update-check.mjs +274 -51
- package/templates/common/Harness/scripts/wf-update-runner.mjs +53 -16
- package/templates/common/Harness/settings.json +10 -0
- package/templates/common/Harness/specs/guides/SETUP.md +4 -3
- package/templates/common/Harness/specs/protocols/HARNESS_BRIDGE.md +429 -48
- package/templates/common/Harness/specs/protocols/MEMORY_PROTOCOL.md +24 -0
- package/templates/common/Harness/specs/protocols/TASK_ARCHIVE.md +14 -11
- package/templates/common/Harness/specs/runtime/command-surface.json +28 -0
- package/templates/common/Harness/specs/runtime/context-loading.md +6 -0
- package/templates/common/Harness/specs/runtime/dispatch.md +9 -1
- package/templates/common/Harness/specs/runtime/subagents.md +20 -5
- package/templates/common/Harness/specs/workflows/WF-AUTO-SPARK.md +19 -0
- package/templates/common/Harness/specs/workflows/WF-AUTO.md +21 -0
- package/templates/common/Harness/specs/workflows/WF-KERNEL.md +4 -2
- package/templates/common/Harness/specs/workflows/WF-MAX.md +39 -12
- package/templates/common/Harness/specs/workflows/WF-STATE.md +62 -14
- package/templates/common/Harness/specs/workflows/WF.md +32 -0
- package/templates/common/Harness/tasks/INDEX.json +7 -0
- package/templates/common/Harness/tasks/INDEX.md +12 -0
- package/templates/common/Harness/tasks/_template/PLAN.md +6 -0
- package/templates/common/Harness/tasks/_template/PROGRESS.md +5 -0
- package/templates/common/Harness/tasks/_template/STATE.json +22 -0
- package/templates/common/Harness/templates/TEST_PLAN.template.md +5 -4
- package/templates/common/Harness/templates/UI_CONTRACT.template.md +7 -5
- package/templates/common/Harness/wf-browser/README.md +69 -0
- package/templates/common/README.md +17 -0
- package/src/ui/dist/assets/AgentsRoute-CuSKYmFu.js +0 -17
- package/src/ui/dist/assets/AgentsRoute-CuSKYmFu.js.map +0 -1
- package/src/ui/dist/assets/RolesRoute-DOzTYVRm.js +0 -7
- package/src/ui/dist/assets/RolesRoute-DOzTYVRm.js.map +0 -1
- package/src/ui/dist/assets/SettingsRoute-DPU7jSQm.js +0 -12
- package/src/ui/dist/assets/SettingsRoute-DPU7jSQm.js.map +0 -1
- package/src/ui/dist/assets/TaskList-BN4r8s1i.js +0 -50
- package/src/ui/dist/assets/TaskList-BN4r8s1i.js.map +0 -1
- package/src/ui/dist/assets/TerminalDrawer-Cej4PxsH.js +0 -74
- package/src/ui/dist/assets/TerminalDrawer-Cej4PxsH.js.map +0 -1
- package/src/ui/dist/assets/WorkflowRoute-BnuhLJ6X.css +0 -1
- package/src/ui/dist/assets/WorkflowRoute-C-clKe-j.js +0 -39
- package/src/ui/dist/assets/WorkflowRoute-C-clKe-j.js.map +0 -1
- package/src/ui/dist/assets/index-BOVYWntB.js +0 -117
- package/src/ui/dist/assets/index-BOVYWntB.js.map +0 -1
- package/src/ui/dist/assets/index-DaUObq0H.css +0 -1
- package/src/ui/dist/assets/maximize-2-LNrr_rKr.js +0 -7
- package/src/ui/dist/assets/maximize-2-LNrr_rKr.js.map +0 -1
- package/src/ui/dist/assets/plus-QuTJyoT3.js +0 -7
- package/src/ui/dist/assets/plus-QuTJyoT3.js.map +0 -1
- package/src/ui/dist/assets/proxy-D0vUbds5.js.map +0 -1
- package/src/ui/dist/assets/refresh-cw-JNmExijd.js.map +0 -1
- package/src/ui/dist/assets/terminal-BBQvnOAK.js.map +0 -1
- package/src/ui/dist/assets/useReducedMotion-BqmH0Tf7.js +0 -7
- package/src/ui/dist/assets/useReducedMotion-BqmH0Tf7.js.map +0 -1
- package/src/ui/dist/assets/x-DoIOGAJz.js.map +0 -1
- package/src/ui/pnpm-lock.yaml +0 -1582
- package/src/ui/src/App.tsx +0 -86
- package/src/ui/src/api.ts +0 -93
- package/src/ui/src/components/AgentsRoute.tsx +0 -503
- package/src/ui/src/components/Footer.tsx +0 -69
- package/src/ui/src/components/Header.tsx +0 -175
- package/src/ui/src/components/LoadingView.tsx +0 -22
- package/src/ui/src/components/RolesRoute.tsx +0 -169
- package/src/ui/src/components/SettingsRoute.tsx +0 -166
- package/src/ui/src/components/TaskList.tsx +0 -388
- package/src/ui/src/components/TerminalDrawer.tsx +0 -611
- package/src/ui/src/components/WorkflowRoute.tsx +0 -670
- package/src/ui/src/hooks/useReducedMotion.ts +0 -17
- package/src/ui/src/hooks/useServerConnection.ts +0 -114
- package/src/ui/src/index.css +0 -281
- package/src/ui/src/main.tsx +0 -11
- package/src/ui/src/types.ts +0 -108
- /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(),
|
|
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(),
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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({
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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 => {
|
|
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
|
|
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 &&
|
|
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)
|
|
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)
|
|
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)
|
|
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
|
}
|