@iowarp/clio-coder 0.3.9 → 0.4.1
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 +92 -0
- package/NOTICE +33 -0
- package/README.md +121 -16
- package/dist/{acp-7LOELQFP.js → acp-ZILU3AUO.js} +19 -18
- package/dist/{agents-FIBG2SHA.js → agents-HYWGBGQR.js} +53 -39
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-OI4LIH2I.js → auth-N3QT7CBO.js} +24 -21
- package/dist/{builtins-AD25UL3C.js → builtins-UJLMOVOV.js} +6 -6
- package/dist/{chunk-I4HZDVNP.js → chunk-2LEAKD4C.js} +2 -3
- package/dist/{chunk-465CC7FK.js → chunk-2NM363SV.js} +60 -64
- package/dist/{chunk-4H6ULJ3H.js → chunk-2VG7KLYV.js} +1046 -1370
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/{chunk-NZU6YDNV.js → chunk-3I5NY75V.js} +5 -5
- package/dist/{chunk-47CMYGET.js → chunk-3QSOM6PA.js} +2 -2
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-IHKBWSXF.js → chunk-5QIAJV2D.js} +3 -3
- package/dist/chunk-5YHDIDBP.js +97 -0
- package/dist/chunk-6CCS4G3W.js +1529 -0
- package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
- package/dist/{chunk-BVDVID7E.js → chunk-6FN3E6KX.js} +6 -6
- package/dist/{chunk-DG4M6ZUE.js → chunk-6HMJX2VU.js} +59 -59
- package/dist/{chunk-3MRC2YSQ.js → chunk-6I5ILFOF.js} +3 -2
- package/dist/chunk-6NJQITNH.js +1412 -0
- package/dist/chunk-6VC4OV3Z.js +365 -0
- package/dist/{chunk-LU7P4LHA.js → chunk-72GZI5EV.js} +2 -2
- package/dist/{chunk-5T7RBWN2.js → chunk-74YWRRU5.js} +9 -8
- package/dist/{chunk-VPTUJU4P.js → chunk-7EPLI7VL.js} +2 -2
- package/dist/{chunk-CA42X6KT.js → chunk-7OBGU7UB.js} +7 -7
- package/dist/{chunk-56KB5IJP.js → chunk-7PWAODYW.js} +3 -3
- package/dist/chunk-7RY5VZPH.js +573 -0
- package/dist/{chunk-OEDBCISO.js → chunk-ABLSQ6JX.js} +3 -3
- package/dist/{chunk-5HFBWUMU.js → chunk-AFKWHWXF.js} +13 -23
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-WXCJ7VME.js → chunk-AKB4GYDL.js} +7 -7
- package/dist/chunk-AP73CFDC.js +308 -0
- package/dist/{chunk-4LJX2PUC.js → chunk-BBTJOK6Y.js} +5 -5
- package/dist/{chunk-QQ7EKM72.js → chunk-BDPT6GTK.js} +13 -61
- package/dist/chunk-BJGUKIG4.js +302 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-TD7UE2L5.js → chunk-BTGG6BG2.js} +81 -40
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/chunk-BWW4HLO4.js +301 -0
- package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/{chunk-HJB5IUKP.js → chunk-C537JADH.js} +18 -18
- package/dist/{chunk-774ILSRL.js → chunk-CDNVLKUX.js} +5 -4
- package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
- package/dist/{chunk-AEYBF3TB.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/chunk-D4CJV46V.js +462 -0
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-5PVQ4SRS.js → chunk-E67WX76H.js} +10 -126
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-EIMVLWB3.js +1842 -0
- package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-3DUR4WUA.js → chunk-FYUN5KZ3.js} +25 -25
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/chunk-GIZNH63R.js +40 -0
- package/dist/chunk-GPPB3JBE.js +688 -0
- package/dist/{chunk-B5XRQOLB.js → chunk-GVQJ5CCZ.js} +17 -11
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
- package/dist/chunk-HRQMFLJP.js +75 -0
- package/dist/{chunk-AD7Y7STJ.js → chunk-HUAS7ITX.js} +107 -97
- package/dist/{chunk-O6I4CIEU.js → chunk-I66EAJFY.js} +6 -6
- package/dist/{chunk-S4COXYBG.js → chunk-IG7BCQBA.js} +129 -106
- package/dist/{chunk-N3PBVRTZ.js → chunk-IXJT6DCX.js} +9 -7
- package/dist/chunk-J4HBWF6Y.js +2635 -0
- package/dist/chunk-J5LZHVIT.js +284 -0
- package/dist/{chunk-GAYUJ7LE.js → chunk-JA5QWE4Z.js} +544 -227
- package/dist/{chunk-B5CSFE7B.js → chunk-JIEGK6UF.js} +6 -174
- package/dist/{chunk-VKBMFOYV.js → chunk-JZWT5J3Y.js} +23 -27
- package/dist/chunk-K6BF4U2H.js +1785 -0
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-YSEHGPCT.js → chunk-MA3H6DM5.js} +6 -6
- package/dist/{chunk-EBOC7MT3.js → chunk-MOPSG2X7.js} +9 -9
- package/dist/{chunk-KV2AOLDF.js → chunk-MQXIVJ35.js} +18 -29
- package/dist/{chunk-P3JGPQFL.js → chunk-N5UK64DP.js} +4 -4
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-T3Z6VAAF.js → chunk-OJTRZGR3.js} +53 -92
- package/dist/{chunk-5DQRIYDZ.js → chunk-PBP4B7XR.js} +3 -3
- package/dist/{chunk-NQ6UCCOD.js → chunk-PJJ6MY27.js} +8 -8
- package/dist/chunk-PMZCIOCJ.js +25 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-7C6RYZGQ.js → chunk-PVAMAVBB.js} +5 -4
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-JEQQR47K.js → chunk-QKIFBZKT.js} +173 -14
- package/dist/{chunk-R7LNVMCS.js → chunk-QMXC4JB7.js} +70 -78
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/chunk-QTFGO774.js +644 -0
- package/dist/{chunk-ODFEOB4F.js → chunk-R23Z6K6I.js} +27 -9
- package/dist/{chunk-3UUY7R3Z.js → chunk-R32CLGZ6.js} +14 -14
- package/dist/chunk-R346GLFC.js +31 -0
- package/dist/chunk-RKSR6VSF.js +132 -0
- package/dist/{chunk-N5XKWMDW.js → chunk-SCYB3HA4.js} +73 -27
- package/dist/{chunk-PZ4I4JE2.js → chunk-SINK3QR6.js} +135 -125
- package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/{chunk-ECUO3KDP.js → chunk-TD3PGPQA.js} +87 -26
- package/dist/{chunk-HKO36JWF.js → chunk-THYWACCR.js} +31 -3
- package/dist/{chunk-LXPJXFM5.js → chunk-TVH4ONAM.js} +18 -12
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/chunk-U2WB7TZS.js +271 -0
- package/dist/{chunk-NNNWO6F2.js → chunk-UAPGZHYC.js} +237 -33
- package/dist/{chunk-MIX5N5AC.js → chunk-UEDMSP56.js} +415 -160
- package/dist/{chunk-WIE7ZOSW.js → chunk-UXN6JT4W.js} +3 -3
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-MV2VUEJC.js → chunk-VEGN6WIQ.js} +2 -2
- package/dist/chunk-VKFQTNDV.js +66 -0
- package/dist/{chunk-FALJGAWU.js → chunk-VKRH2TCS.js} +2 -2
- package/dist/{chunk-A2NJGIB3.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-EQ63NRB7.js → chunk-WNP7O5WZ.js} +3 -3
- package/dist/chunk-WR6U3OVP.js +45 -0
- package/dist/{chunk-TEO2TLVN.js → chunk-XKA2ICR3.js} +1051 -1196
- package/dist/{chunk-3V5AYSEQ.js → chunk-Y45G3AXC.js} +72 -65
- package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
- package/dist/chunk-YAKGTXEV.js +17 -0
- package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
- package/dist/{chunk-YW7UVM5V.js → chunk-ZAZB4JMW.js} +55 -11
- package/dist/{chunk-HCBCAYZU.js → chunk-ZJLUDYFY.js} +11 -11
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IFBNV6H6.js → chunk-ZW55JB7N.js} +3 -3
- package/dist/cli/index.js +48 -37
- package/dist/clio-IT3G3VQH.js +25 -0
- package/dist/{code-nav-LMW275PA.js → code-nav-RK6S7F6E.js} +8 -8
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-CVJMMODC.js → compile-cache-OQAVB7Y5.js} +3 -5
- package/dist/{components-ZFA3SAER.js → components-UBWCQSRW.js} +6 -6
- package/dist/{config-RXS5T3JT.js → config-3QZRWZJF.js} +73 -61
- package/dist/configure-FL7Y3KJF.js +54 -0
- package/dist/{context-MVOORGMF.js → context-5HE7ODYK.js} +61 -49
- package/dist/{context-I3BTOTCS.js → context-KYQFRVDC.js} +11 -11
- package/dist/{context-PALKKQYL.js → context-XNHL75JV.js} +43 -28
- package/dist/{context-clear-N2WOYZ2K.js → context-clear-N545L53A.js} +60 -48
- package/dist/{context-working-set-MIEVECVZ.js → context-working-set-QHKXSV2F.js} +15 -13
- package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-RGIE5PCT.js} +109 -72
- package/dist/{docs-7LQ23DLM.js → docs-5NAF6AU7.js} +7 -13
- package/dist/doctor-ZGPEGHIP.js +772 -0
- package/dist/{eval-IJ5VEZDJ.js → eval-GXLL44RD.js} +106 -86
- package/dist/eval-inventory-HBWSWQOK.js +315 -0
- package/dist/{evidence-L5APPXNV.js → evidence-HWLBRH3Q.js} +209 -51
- package/dist/{evolve-RGNKFJ52.js → evolve-FTZBMNVW.js} +57 -45
- package/dist/{extensions-7WYWUX5A.js → extensions-VHRBEID7.js} +7 -7
- package/dist/{fleet-6CNVBZZP.js → fleet-CKZHJWZJ.js} +215 -114
- package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-EXDXBMV6.js} +13 -12
- package/dist/fleet-decisions-OTHB6KRL.js +157 -0
- package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-YTEZUCUT.js} +20 -17
- package/dist/fleet-inspect-SS6YMDCK.js +445 -0
- package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-PBY4VYOM.js} +6 -9
- package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-KMEM5L3S.js} +25 -20
- package/dist/fleet-verify-QD5M7E7Q.js +178 -0
- package/dist/fleet-view-WAMJYNDT.js +94 -0
- package/dist/{init-VBN2ACVA.js → init-5XQRBOFV.js} +79 -66
- package/dist/install-NKNG7KD4.js +13 -0
- package/dist/interop-34TVO25M.js +116 -0
- package/dist/{library-JHGUMLY2.js → library-3QY6KF57.js} +25 -21
- package/dist/{memory-K4OQIYWG.js → memory-L4UTIIIW.js} +59 -47
- package/dist/{models-2NCZUWDD.js → models-ZVX3QOWE.js} +47 -37
- package/dist/{monitor-MMVTJABD.js → monitor-CEKVSYTS.js} +67 -57
- package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-77BAP6BC.js} +7633 -7699
- package/dist/panes-7STHOAUJ.js +103 -0
- package/dist/panes-SHAUIRXY.js +60 -0
- package/dist/{paths-DBXMZMDU.js → paths-L7LGY6RN.js} +6 -6
- package/dist/{reset-DD5JGOY3.js → reset-EOLM7GVE.js} +15 -14
- package/dist/resources-74GKTLSF.js +115 -0
- package/dist/{run-QEGNX7FL.js → run-HBAUJNNZ.js} +139 -98
- package/dist/{share-JKD3BQMW.js → share-G3APVLVP.js} +25 -21
- package/dist/{skills-LMQIKDOZ.js → skills-35HHUKCR.js} +37 -27
- package/dist/{skills-eval-I7X2774U.js → skills-eval-QN4HSHDC.js} +80 -73
- package/dist/skills-inventory-J357J34F.js +129 -0
- package/dist/slash-commands-JZZCQA32.js +79 -0
- package/dist/{steer-CF5TDANS.js → steer-XAVHJM22.js} +4 -4
- package/dist/{support-I7LOJLIF.js → support-U7QOWY26.js} +7 -7
- package/dist/{targets-RUSR6B5Z.js → targets-DSM6CY3M.js} +67 -59
- package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-JOPFUVEM.js} +15 -10
- package/dist/tools-MKNWVPBH.js +29 -0
- package/dist/{trace-ODOQIVIW.js → trace-ECQ7TIYZ.js} +194 -7
- package/dist/tui-primitives-K5PASC3O.js +17 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-N34PCTGJ.js} +6 -8
- package/dist/{upgrade-XANW3FXB.js → upgrade-H7TOM7YL.js} +37 -62
- package/dist/{usage-4H7ZRXQT.js → usage-X52N3IDJ.js} +70 -59
- package/dist/{verifiers-UZXNBZEB.js → verifiers-EJTVVSMA.js} +174 -14
- package/dist/{verify-BVKWTNDL.js → verify-YJL6XET2.js} +12 -11
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-MPIFL3LL.js} +3 -4
- package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-4NDZTQ4B.js} +86 -75
- package/dist/with-panes-OBOBFIIR.js +818 -0
- package/dist/worker/entry.js +131 -91
- package/docs/README.md +3 -2
- package/docs/acp.md +25 -4
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +4 -1
- package/docs/built-in-agents.md +40 -32
- package/docs/capacity-and-scheduling.md +43 -5
- package/docs/commands-and-modes.md +39 -4
- package/docs/config-knobs-audit.md +3 -0
- package/docs/configuration-and-targets.md +138 -167
- package/docs/context-engine.md +1 -1
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +3 -1
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +2 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +3 -1
- package/docs/extensions-and-sharing.md +25 -1
- package/docs/fleet-demo-runbook.md +6 -3
- package/docs/fleet-dispatch.md +30 -7
- package/docs/installation-and-lifecycle.md +16 -3
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +10 -1
- package/docs/observability.md +3 -3
- package/docs/proactive-memory.md +1 -1
- package/docs/prompt-envelope-and-tools.md +1 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +164 -177
- package/docs/safety-model.md +2 -2
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +1 -1
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +18 -8
- package/docs/trace-store.md +16 -11
- package/docs/troubleshooting.md +2 -2
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/evals/README.md +5 -0
- package/evals/behavioral-corpus-grader.mjs +103 -0
- package/evals/behavioral-machinery-baseline.json +2276 -0
- package/evals/behavioral-machinery-driver.ts +250 -0
- package/evals/behavioral-machinery-support.ts +253 -0
- package/evals/behavioral-machinery.yaml +614 -0
- package/evals/behavioral-model-negative-control.yaml +68 -0
- package/evals/behavioral-model.yaml +216 -0
- package/evals/fixtures/behavioral-facts.txt +3 -0
- package/evals/fixtures/behavioral-main.ts +7 -0
- package/evals/fixtures/decoy/note.txt +2 -0
- package/evals/fixtures/private/credentials.txt +1 -0
- package/evals/tracked-metrics-baseline.yaml +229 -0
- package/evals/tracked-metrics-grader.mjs +129 -0
- package/package.json +8 -16
- package/skills/README.md +6 -6
- package/skills/coding/ast-grep/SKILL.md +8 -2
- package/skills/coding/coding-standards/SKILL.md +8 -2
- package/skills/coding/prototype/SKILL.md +8 -2
- package/skills/coding/tdd/SKILL.md +8 -2
- package/skills/context/context-handoff/SKILL.md +12 -3
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +8 -2
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +9 -4
- package/skills/git/file-ticket/evals.md +2 -2
- package/skills/git/fix-issue/SKILL.md +12 -5
- package/skills/git/fix-issue/evals.md +4 -4
- package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +9 -3
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +7 -2
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +7 -2
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
- package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
- package/skills/meta/credentials/SKILL.md +9 -2
- package/skills/meta/find-skills/SKILL.md +8 -2
- package/skills/meta/herdr/SKILL.md +8 -2
- package/skills/meta/skill-craft/SKILL.md +21 -4
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +8 -2
- package/skills/planning/prd/SKILL.md +8 -2
- package/skills/planning/product-intent/SKILL.md +8 -2
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +8 -2
- package/skills/research/experiment-protocol/SKILL.md +9 -2
- package/skills/research/scientific-debugging/SKILL.md +9 -2
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +9 -2
- package/skills/skill-marketplace.json +257 -38
- package/skills/workflow/cut-it/SKILL.md +10 -2
- package/skills/workflow/design-council/SKILL.md +11 -2
- package/skills/workflow/grill-me/SKILL.md +8 -2
- package/skills/workflow/workflow-distiller/SKILL.md +8 -2
- package/src/cli/acp.ts +8 -4
- package/src/cli/argv.ts +25 -0
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +5 -5
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +3 -3
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +50 -48
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +6 -6
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +156 -0
- package/src/cli/doctor-toolchain.ts +78 -0
- package/src/cli/doctor.ts +34 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +13 -0
- package/src/cli/evidence-detail.ts +88 -0
- package/src/cli/evidence-inventory.ts +183 -0
- package/src/cli/evidence.ts +30 -5
- package/src/cli/fleet-decisions.ts +69 -0
- package/src/cli/fleet-inspect.ts +334 -0
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +133 -0
- package/src/cli/fleet-view.ts +827 -0
- package/src/cli/fleet.ts +154 -40
- package/src/cli/index.ts +14 -2
- package/src/cli/interop-inspect.ts +128 -0
- package/src/cli/interop.ts +34 -0
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +35 -0
- package/src/cli/reset.ts +6 -3
- package/src/cli/run.ts +67 -13
- package/src/cli/share.ts +1 -1
- package/src/cli/skills-eval.ts +11 -11
- package/src/cli/skills-inventory.ts +185 -0
- package/src/cli/skills.ts +16 -13
- package/src/cli/targets.ts +23 -24
- package/src/cli/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +64 -2
- package/src/cli/uninstall.ts +2 -2
- package/src/cli/upgrade.ts +29 -34
- package/src/cli/usage.ts +2 -2
- package/src/cli/validate-model.ts +1 -1
- package/src/cli/verifiers-inspect.ts +347 -0
- package/src/cli/verifiers.ts +9 -0
- package/src/cli/wiki-generate.ts +5 -5
- package/src/core/bash-exec.ts +1 -1
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +4 -0
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1070 -845
- package/src/core/defaults.ts +342 -463
- package/src/core/domain-loader.ts +6 -4
- package/src/core/event-bus.ts +1 -1
- package/src/core/file-references.ts +78 -88
- package/src/core/git-commit-attribution.ts +3 -9
- package/src/core/guardrails.ts +24 -4
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/recent-models.ts +1 -7
- package/src/core/residency-protection.ts +4 -8
- package/src/core/resolve-config-value.ts +1 -1
- package/src/core/response-model-id.ts +0 -14
- package/src/core/response-schema.ts +44 -4
- package/src/core/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/theme-token-hex.ts +43 -0
- package/src/core/timers.ts +2 -12
- package/src/core/tool-names.ts +2 -1
- package/src/core/xdg.ts +1 -1
- package/src/domains/agents/catalog.ts +2 -12
- package/src/domains/agents/extension.ts +3 -3
- package/src/domains/agents/fleets/build-review.md +0 -3
- package/src/domains/agents/fleets/build-test.md +0 -3
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract-filesystem.ts +32 -0
- package/src/domains/agents/result-contract.ts +165 -36
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +37 -46
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +48 -47
- package/src/domains/config/watcher.ts +1 -1
- package/src/domains/context/codewiki/indexer.ts +1 -1
- package/src/domains/context/extension.ts +3 -3
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/replay/metrics.ts +0 -4
- package/src/domains/context/working-set/replay/report.ts +1 -1
- package/src/domains/context/working-set/replay/synthetic.ts +2 -2
- package/src/domains/dispatch/active-route-planner.ts +2 -2
- package/src/domains/dispatch/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +22 -21
- package/src/domains/dispatch/agent-candidates.ts +1 -1
- package/src/domains/dispatch/agent-ledger-store.ts +1 -1
- package/src/domains/dispatch/agent-ledger.ts +1 -1
- package/src/domains/dispatch/assignment.ts +5 -5
- package/src/domains/dispatch/capacity-lease.ts +23 -6
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/extension.ts +287 -111
- package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
- package/src/domains/dispatch/fleet-plan.ts +7 -2
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +59 -3
- package/src/domains/dispatch/gate-decisions.ts +36 -15
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/gate-topology.ts +289 -0
- package/src/domains/dispatch/index.ts +19 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +0 -61
- package/src/domains/dispatch/placement.ts +2 -2
- package/src/domains/dispatch/receipt-findings.ts +1 -1
- package/src/domains/dispatch/receipt-integrity.ts +20 -8
- package/src/domains/dispatch/reservation-store.ts +24 -27
- package/src/domains/dispatch/route-decision.ts +1 -1
- package/src/domains/dispatch/route-history.ts +1 -1
- package/src/domains/dispatch/route-policy.ts +1 -1
- package/src/domains/dispatch/route-readiness.ts +0 -28
- package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
- package/src/domains/dispatch/run-event-journal.ts +599 -0
- package/src/domains/dispatch/state.ts +45 -1
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +2 -19
- package/src/domains/dispatch/types.ts +16 -3
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +5 -4
- package/src/domains/eval/compare/compare.ts +3 -16
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/inventory.ts +113 -0
- package/src/domains/eval/metrics/token-stream.ts +0 -7
- package/src/domains/eval/report.ts +1 -1
- package/src/domains/eval/runner.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +7 -6
- package/src/domains/eval/runners/external-command.ts +4 -3
- package/src/domains/eval/schema/artifact.ts +1 -1
- package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
- package/src/domains/eval/schema/behavioral.ts +7 -6
- package/src/domains/eval/schema/execution-envelope.ts +4 -2
- package/src/domains/eval/schema/naming.ts +10 -0
- package/src/domains/eval/schema/serving.ts +31 -0
- package/src/domains/eval/schema/suite.ts +2 -2
- package/src/domains/eval/schema/validate.ts +9 -5
- package/src/domains/eval/schema/verdict.ts +4 -2
- package/src/domains/eval/store.ts +12 -2
- package/src/domains/eval/suites/run.ts +12 -6
- package/src/domains/eval/types.ts +1 -1
- package/src/domains/eval/workspaces/git.ts +1 -1
- package/src/domains/eval/workspaces/temp-copy.ts +1 -1
- package/src/domains/evidence/build.ts +13 -5
- package/src/domains/evidence/store.ts +6 -0
- package/src/domains/interop/consent.ts +7 -7
- package/src/domains/interop/extension.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +27 -21
- package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
- package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
- package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
- package/src/domains/lifecycle/migrations/index.ts +20 -1
- package/src/domains/lifecycle/naming-history.ts +153 -0
- package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
- package/src/domains/lifecycle/naming-resources.ts +261 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +81 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/index.ts +0 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/memory/task-memory-policy.ts +6 -10
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/index.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/memory-intervention.ts +33 -21
- package/src/domains/middleware/runtime.ts +2 -2
- package/src/domains/mux/contract.ts +566 -0
- package/src/domains/mux/detect.ts +182 -0
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +53 -0
- package/src/domains/mux/index.ts +116 -0
- package/src/domains/mux/manifest.ts +6 -0
- package/src/domains/mux/operations.ts +192 -0
- package/src/domains/mux/pane-registry.ts +90 -0
- package/src/domains/mux/protocol.ts +62 -0
- package/src/domains/mux/socket-client.ts +964 -0
- package/src/domains/mux/types.ts +265 -0
- package/src/domains/mux/viewer-command.ts +59 -0
- package/src/domains/mux/yazi/assets/init.lua +2 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
- package/src/domains/mux/yazi/assets/yazi.toml +17 -0
- package/src/domains/mux/yazi/event-stream.ts +182 -0
- package/src/domains/mux/yazi/profile.ts +299 -0
- package/src/domains/mux/yazi/session.ts +251 -0
- package/src/domains/mux/yazi/theme.ts +30 -0
- package/src/domains/observability/cost.ts +21 -0
- package/src/domains/observability/extension.ts +1 -1
- package/src/domains/observability/index.ts +2 -0
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +1 -1
- package/src/domains/observability/trace-store.ts +63 -11
- package/src/domains/prompts/compiler.ts +2 -2
- package/src/domains/prompts/extension.ts +3 -3
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
- package/src/domains/prompts/fragments/operating/skills.md +25 -18
- package/src/domains/providers/endpoint-capacity.ts +154 -22
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +25 -8
- package/src/domains/providers/index.ts +22 -0
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +46 -2
- package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
- package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +285 -0
- package/src/domains/providers/support.ts +1 -0
- package/src/domains/providers/target-model-cache.ts +124 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +2 -2
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/library.ts +6 -6
- package/src/domains/resources/prompts/loader.ts +1 -1
- package/src/domains/resources/skills/content-hash.ts +7 -6
- package/src/domains/resources/skills/evals.ts +1 -1
- package/src/domains/resources/skills/install.ts +36 -12
- package/src/domains/resources/skills/loader.ts +72 -13
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/action-classifier.ts +6 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/run-effects.ts +1 -1
- package/src/domains/scheduling/extension.ts +4 -4
- package/src/domains/session/archive-readers.ts +9 -1
- package/src/domains/session/compaction/branch-summary.ts +4 -0
- package/src/domains/session/compaction/compact.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +4 -0
- package/src/domains/session/context-accounting.ts +1 -1
- package/src/domains/session/decision-board.ts +1 -1
- package/src/domains/session/extension.ts +1 -1
- package/src/domains/session/handoff.ts +2 -2
- package/src/domains/session/prompt-manifest.ts +0 -5
- package/src/domains/session/protected-artifact-journal.ts +12 -6
- package/src/domains/session/retry.ts +1 -1
- package/src/domains/share/archive.ts +85 -36
- package/src/domains/toolchain/archive.ts +175 -0
- package/src/domains/toolchain/contract.ts +28 -0
- package/src/domains/toolchain/extension.ts +47 -0
- package/src/domains/toolchain/index.ts +39 -0
- package/src/domains/toolchain/install.ts +327 -0
- package/src/domains/toolchain/manifest.ts +8 -0
- package/src/domains/toolchain/paths.ts +34 -0
- package/src/domains/toolchain/registry.ts +265 -0
- package/src/domains/toolchain/remove.ts +218 -0
- package/src/domains/toolchain/resolve.ts +182 -0
- package/src/domains/toolchain/types.ts +113 -0
- package/src/domains/toolchain/version.ts +88 -0
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +440 -96
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +20 -2
- package/src/engine/alcf-oauth.ts +5 -5
- package/src/engine/antigravity/subprocess-runtime.ts +2 -2
- package/src/engine/api-registry.ts +1 -1
- package/src/engine/apis/llamacpp-residency.ts +1 -19
- package/src/engine/apis/lmstudio.ts +1 -6
- package/src/engine/apis/ollama-native.ts +3 -3
- package/src/engine/apis/openai-completions.ts +2 -2
- package/src/engine/apis/residency.ts +3 -9
- package/src/engine/claude/sdk-module.ts +87 -0
- package/src/engine/claude/sdk-runtime.ts +25 -17
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/loop-guard.ts +0 -5
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +21 -0
- package/src/engine/tui.ts +1 -0
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +16 -26
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +207 -90
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- package/src/interactive/application-controller.ts +21 -21
- package/src/interactive/bus-notices.ts +2 -2
- package/src/interactive/chat-loop.ts +8 -8
- package/src/interactive/chat-panel.ts +1 -1
- package/src/interactive/clio-editor.ts +105 -1
- package/src/interactive/context-activity.ts +8 -6
- package/src/interactive/context-meter.ts +3 -6
- package/src/interactive/context-overlay.ts +2 -1
- package/src/interactive/cost-overlay.ts +3 -1
- package/src/interactive/council-grid.ts +3 -5
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +56 -49
- package/src/interactive/editor-bash.ts +21 -0
- package/src/interactive/editor-steer.ts +9 -4
- package/src/interactive/editor-submit.ts +24 -18
- package/src/interactive/external-editor.ts +1 -1
- package/src/interactive/file-reference-completion.ts +360 -0
- package/src/interactive/footer/dashboard.ts +15 -17
- package/src/interactive/footer/notifications.ts +14 -8
- package/src/interactive/footer/widgets.ts +2 -44
- package/src/interactive/interactive-application.ts +229 -62
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +9 -2
- package/src/interactive/interactive-presentation.ts +21 -16
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +99 -23
- package/src/interactive/interactive-subscriptions.ts +1 -1
- package/src/interactive/interactive-tickers.ts +1 -1
- package/src/interactive/keybinding-manager.ts +4 -4
- package/src/interactive/layout.ts +1 -1
- package/src/interactive/memory-overlay.ts +3 -2
- package/src/interactive/modal-marker.ts +151 -0
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +62 -14
- package/src/interactive/overlay-general-openers.ts +7 -2
- package/src/interactive/overlay-key-routing.ts +21 -10
- package/src/interactive/overlay-lifecycle.ts +20 -4
- package/src/interactive/overlay-model-selectors.ts +43 -6
- package/src/interactive/overlay-permission-lifecycle.ts +90 -22
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +3 -2
- package/src/interactive/overlays/ask-user.ts +161 -41
- package/src/interactive/overlays/auth-dialog.ts +1 -0
- package/src/interactive/overlays/context-reset.ts +29 -4
- package/src/interactive/overlays/cwd-fallback.ts +29 -4
- package/src/interactive/overlays/decisions.ts +15 -13
- package/src/interactive/overlays/extensions.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +4 -3
- package/src/interactive/overlays/handoff-review.ts +3 -2
- package/src/interactive/overlays/help-reference.ts +2 -0
- package/src/interactive/overlays/interop.ts +2 -1
- package/src/interactive/overlays/library-install-confirm.ts +2 -1
- package/src/interactive/overlays/library-tabs.ts +28 -0
- package/src/interactive/overlays/list-overlay.ts +10 -1
- package/src/interactive/overlays/message-picker.ts +2 -1
- package/src/interactive/overlays/model-scope.ts +86 -0
- package/src/interactive/overlays/model-selector.ts +40 -31
- package/src/interactive/overlays/prompts.ts +11 -4
- package/src/interactive/overlays/session-selector.ts +3 -2
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +849 -268
- package/src/interactive/overlays/side-question.ts +3 -2
- package/src/interactive/overlays/skills-hub.ts +11 -19
- package/src/interactive/overlays/tree-selector.ts +3 -2
- package/src/interactive/pane-policy.ts +46 -0
- package/src/interactive/panes-runtime.ts +318 -0
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +521 -189
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -1
- package/src/interactive/tasks-overlay.ts +21 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +58 -13
- package/src/interactive/turn-persistence.ts +2 -2
- package/src/interactive/turn-prewarm.ts +2 -2
- package/src/interactive/turn-runtime.ts +8 -8
- package/src/interactive/turn-state.ts +1 -1
- package/src/interactive/view/artifacts.ts +120 -9
- package/src/interactive/view/view-overlay.ts +14 -10
- package/src/interactive/watch-pane.ts +180 -0
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +11 -5
- package/src/interactive/worker-receipts.ts +20 -2
- package/src/interactive/worker-stream.ts +6 -4
- package/src/interactive/yazi-bridge.ts +451 -0
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +26 -2
- package/src/tools/builtin-tool-catalog.ts +16 -1
- package/src/tools/compete-worktrees.ts +108 -17
- package/src/tools/context/index.ts +15 -1
- package/src/tools/core-bootstrap.ts +2 -1
- package/src/tools/dispatch-admission.ts +18 -5
- package/src/tools/dispatch-arguments.ts +21 -21
- package/src/tools/dispatch-plan.ts +0 -11
- package/src/tools/dispatch-run-events.ts +145 -28
- package/src/tools/dispatch-runner.ts +40 -13
- package/src/tools/dispatch-types.ts +15 -3
- package/src/tools/dispatch.ts +2 -2
- package/src/tools/executables.ts +17 -14
- package/src/tools/find.ts +1 -6
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +54 -4
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +38 -0
- package/src/tools/panes.ts +112 -0
- package/src/tools/policy.ts +10 -1
- package/src/tools/presentation.ts +1 -0
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/web-fetch.ts +1 -1
- package/src/worker/entry.ts +4 -3
- package/src/worker/protocol.ts +16 -14
- package/src/worker/spec-contract.ts +2 -2
- package/src/worker/stdin-demux.ts +2 -2
- package/dist/chunk-D73KXYPF.js +0 -37
- package/dist/chunk-MLOK6ZOS.js +0 -2888
- package/dist/chunk-PNY46YEY.js +0 -1581
- package/dist/chunk-XDOQXGFO.js +0 -515
- package/dist/chunk-YKOFT37S.js +0 -279
- package/dist/clio-LT5V7SSZ.js +0 -26
- package/dist/configure-2WYWSCSD.js +0 -49
- package/dist/doctor-TWBWFK5V.js +0 -165
- package/src/engine/apis/degraded-inference.ts +0 -95
- /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
- /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clio-owned vocabulary for the pane layer.
|
|
3
|
+
*
|
|
4
|
+
* Nothing in this file names a herdr wire shape. `socket-client.ts` is the only
|
|
5
|
+
* module that reads the newline-delimited JSON coming off the socket, and it
|
|
6
|
+
* maps every response into the types declared here before anything else in the
|
|
7
|
+
* process sees it. That keeps the blast radius of a herdr protocol bump inside
|
|
8
|
+
* one file and keeps `npm run lint`'s boundary check honest about what the mux
|
|
9
|
+
* domain exports to the rest of Clio.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** Which capability ladder rung the mux resolved to at interactive boot. */
|
|
13
|
+
export type MuxMode = "embedded" | "guest" | "none";
|
|
14
|
+
|
|
15
|
+
/** Locates one pane inside a herdr session. */
|
|
16
|
+
export interface MuxPaneRef {
|
|
17
|
+
paneId: string;
|
|
18
|
+
tabId: string;
|
|
19
|
+
workspaceId: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Semantic agent state as the pane layer reports and reads it.
|
|
24
|
+
*
|
|
25
|
+
* `done` and `unknown` only ever arrive from the server; Clio reports the three
|
|
26
|
+
* states in {@link MuxReportableAgentState}.
|
|
27
|
+
*/
|
|
28
|
+
export type MuxAgentState = "idle" | "working" | "blocked" | "done" | "unknown";
|
|
29
|
+
|
|
30
|
+
/** The subset of {@link MuxAgentState} Clio is allowed to assert about a pane. */
|
|
31
|
+
export type MuxReportableAgentState = "idle" | "working" | "blocked";
|
|
32
|
+
|
|
33
|
+
/** One pane, projected from the server's pane record. */
|
|
34
|
+
export interface MuxPane {
|
|
35
|
+
paneId: string;
|
|
36
|
+
tabId: string;
|
|
37
|
+
workspaceId: string;
|
|
38
|
+
focused: boolean;
|
|
39
|
+
agentState: MuxAgentState;
|
|
40
|
+
revision: number;
|
|
41
|
+
label: string | null;
|
|
42
|
+
title: string | null;
|
|
43
|
+
cwd: string | null;
|
|
44
|
+
agent: string | null;
|
|
45
|
+
tokens: Readonly<Record<string, string>>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** One tab, projected from the server's tab record. */
|
|
49
|
+
export interface MuxTab {
|
|
50
|
+
tabId: string;
|
|
51
|
+
workspaceId: string;
|
|
52
|
+
number: number;
|
|
53
|
+
label: string;
|
|
54
|
+
focused: boolean;
|
|
55
|
+
paneCount: number;
|
|
56
|
+
agentState: MuxAgentState;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Git worktree metadata projected from herdr's worktree API. */
|
|
60
|
+
export interface MuxWorktree {
|
|
61
|
+
path: string;
|
|
62
|
+
branch: string | null;
|
|
63
|
+
isBare: boolean;
|
|
64
|
+
isDetached: boolean;
|
|
65
|
+
isPrunable: boolean;
|
|
66
|
+
isLinkedWorktree: boolean;
|
|
67
|
+
openWorkspaceId: string | null;
|
|
68
|
+
label: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Repository identity accompanying a `worktree.list` result. */
|
|
72
|
+
export interface MuxWorktreeSource {
|
|
73
|
+
repoKey: string;
|
|
74
|
+
repoName: string;
|
|
75
|
+
repoRoot: string;
|
|
76
|
+
sourceCheckoutPath: string;
|
|
77
|
+
sourceWorkspaceId: string | null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Identity and capability facts recorded from the `ping` handshake. */
|
|
81
|
+
export interface MuxServerInfo {
|
|
82
|
+
version: string;
|
|
83
|
+
protocol: number;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Bootstrap state. The documented herdr pattern is to take one snapshot and
|
|
88
|
+
* then trust the event stream, so the client refetches this after every
|
|
89
|
+
* reconnect rather than trying to replay missed events.
|
|
90
|
+
*/
|
|
91
|
+
export interface MuxSnapshot {
|
|
92
|
+
server: MuxServerInfo;
|
|
93
|
+
focusedPaneId: string | null;
|
|
94
|
+
focusedTabId: string | null;
|
|
95
|
+
focusedWorkspaceId: string | null;
|
|
96
|
+
panes: ReadonlyArray<MuxPane>;
|
|
97
|
+
tabs: ReadonlyArray<MuxTab>;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Lifecycle event kinds the pane layer can subscribe to. */
|
|
101
|
+
export type MuxEventKind = "pane.closed" | "pane.exited" | "pane.moved" | "layout.updated";
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* One pushed lifecycle event. A discriminated union because the payloads
|
|
105
|
+
* differ: pane leave events carry the pane, a move carries the id rewrite
|
|
106
|
+
* herdr performs, and a layout update carries the whole tab geometry so a
|
|
107
|
+
* consumer does not have to turn around and fetch what the push already said.
|
|
108
|
+
*/
|
|
109
|
+
export type MuxEvent =
|
|
110
|
+
| { kind: "pane.closed" | "pane.exited"; paneId: string; workspaceId: string }
|
|
111
|
+
| { kind: "pane.moved"; paneId: string; previousPaneId: string; tabId: string; workspaceId: string }
|
|
112
|
+
| { kind: "layout.updated"; geometry: MuxTabGeometry };
|
|
113
|
+
|
|
114
|
+
/** One rectangle in terminal cells, as herdr's layout snapshots report them. */
|
|
115
|
+
export interface MuxRect {
|
|
116
|
+
x: number;
|
|
117
|
+
y: number;
|
|
118
|
+
width: number;
|
|
119
|
+
height: number;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Cell-precise geometry of one tab: the outer area, every pane's rect, and
|
|
124
|
+
* every split with its live ratio. This is what dock sizing converges on.
|
|
125
|
+
*/
|
|
126
|
+
export interface MuxTabGeometry {
|
|
127
|
+
workspaceId: string;
|
|
128
|
+
tabId: string;
|
|
129
|
+
zoomed: boolean;
|
|
130
|
+
area: MuxRect;
|
|
131
|
+
focusedPaneId: string | null;
|
|
132
|
+
panes: ReadonlyArray<{ paneId: string; focused: boolean; rect: MuxRect }>;
|
|
133
|
+
splits: ReadonlyArray<{ direction: "right" | "down"; ratio: number; rect: MuxRect }>;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* One node of a portable tab layout tree, as `layout.export` describes it.
|
|
138
|
+
* Split ratio is the share of the axis the `first` child keeps.
|
|
139
|
+
*/
|
|
140
|
+
export type MuxLayoutNode =
|
|
141
|
+
| { type: "pane"; paneId: string | null; label: string | null }
|
|
142
|
+
| { type: "split"; direction: "right" | "down"; ratio: number; first: MuxLayoutNode; second: MuxLayoutNode };
|
|
143
|
+
|
|
144
|
+
/** A whole tab's portable layout tree. */
|
|
145
|
+
export interface MuxLayoutTree {
|
|
146
|
+
workspaceId: string;
|
|
147
|
+
tabId: string;
|
|
148
|
+
zoomed: boolean;
|
|
149
|
+
focusedPaneId: string | null;
|
|
150
|
+
root: MuxLayoutNode;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** Where Clio's own pane lives, read from the herdr environment. */
|
|
154
|
+
export interface MuxSelfLocation {
|
|
155
|
+
workspaceId: string | null;
|
|
156
|
+
tabId: string | null;
|
|
157
|
+
paneId: string | null;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Typed failure classes. `unknown` carries the server's own code through
|
|
162
|
+
* untouched so a herdr version that grows a new code is legible in logs
|
|
163
|
+
* without a Clio release.
|
|
164
|
+
*/
|
|
165
|
+
export type MuxErrorKind =
|
|
166
|
+
| "not_found"
|
|
167
|
+
| "invalid_params"
|
|
168
|
+
| "agent_blocked"
|
|
169
|
+
| "feature_disabled"
|
|
170
|
+
| "agent_prompt_stalled"
|
|
171
|
+
| "timeout"
|
|
172
|
+
| "transport"
|
|
173
|
+
| "protocol"
|
|
174
|
+
| "unknown";
|
|
175
|
+
|
|
176
|
+
/** Every failure the mux domain raises. */
|
|
177
|
+
export class MuxError extends Error {
|
|
178
|
+
readonly kind: MuxErrorKind;
|
|
179
|
+
/** The server's raw error code, when the failure came back over the wire. */
|
|
180
|
+
readonly wireCode: string | null;
|
|
181
|
+
readonly method: string | null;
|
|
182
|
+
|
|
183
|
+
constructor(kind: MuxErrorKind, message: string, options: { wireCode?: string; method?: string } = {}) {
|
|
184
|
+
super(message);
|
|
185
|
+
this.name = "MuxError";
|
|
186
|
+
this.kind = kind;
|
|
187
|
+
this.wireCode = options.wireCode ?? null;
|
|
188
|
+
this.method = options.method ?? null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** A request that never got a response line inside its budget. */
|
|
193
|
+
export class MuxRequestTimeout extends MuxError {
|
|
194
|
+
readonly timeoutMs: number;
|
|
195
|
+
|
|
196
|
+
constructor(method: string, timeoutMs: number) {
|
|
197
|
+
super("timeout", `mux request ${method} timed out after ${timeoutMs}ms`, { method });
|
|
198
|
+
this.name = "MuxRequestTimeout";
|
|
199
|
+
this.timeoutMs = timeoutMs;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Codes herdr returns today that mean the same thing as one of our kinds.
|
|
205
|
+
* Anything absent falls through the suffix and prefix rules in
|
|
206
|
+
* {@link muxErrorKind}, and anything those miss stays `unknown`.
|
|
207
|
+
*/
|
|
208
|
+
const ERROR_KIND_BY_WIRE_CODE: Readonly<Record<string, MuxErrorKind>> = {
|
|
209
|
+
agent_blocked: "agent_blocked",
|
|
210
|
+
agent_prompt_stalled: "agent_prompt_stalled",
|
|
211
|
+
feature_disabled: "feature_disabled",
|
|
212
|
+
invalid_params: "invalid_params",
|
|
213
|
+
invalid_request: "invalid_params",
|
|
214
|
+
not_found: "not_found",
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
/** Classify one server error code into a Clio failure kind. */
|
|
218
|
+
export function muxErrorKind(wireCode: string): MuxErrorKind {
|
|
219
|
+
const mapped = ERROR_KIND_BY_WIRE_CODE[wireCode];
|
|
220
|
+
if (mapped) return mapped;
|
|
221
|
+
if (wireCode.endsWith("_not_found")) return "not_found";
|
|
222
|
+
if (wireCode.startsWith("invalid_")) return "invalid_params";
|
|
223
|
+
return "unknown";
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/** Diagnostic sink. The mux never throws at its callers, so this is how failures surface. */
|
|
227
|
+
export type MuxLog = (level: "debug" | "info" | "warning", message: string) => void;
|
|
228
|
+
|
|
229
|
+
/** The three sounds `notification.show` accepts, per protocol 17's schema. */
|
|
230
|
+
export type MuxNotificationSound = "none" | "done" | "request";
|
|
231
|
+
|
|
232
|
+
/** What Clio reports about its own hosting pane in guest mode (SA-3). */
|
|
233
|
+
export interface MuxSelfReport {
|
|
234
|
+
state: MuxReportableAgentState;
|
|
235
|
+
/** Short human line herdr may show beside the state. */
|
|
236
|
+
message?: string;
|
|
237
|
+
/** Presentation tokens; a null value clears that token. */
|
|
238
|
+
tokens?: Readonly<Record<string, string | null>>;
|
|
239
|
+
/** Per-state sidebar label overrides, e.g. `{ blocked: "needs approval" }`. */
|
|
240
|
+
stateLabels?: Readonly<Record<string, string>>;
|
|
241
|
+
/** Expiry for this report's tokens, 1..86400000 ms. */
|
|
242
|
+
ttlMs?: number;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Why Clio created a pane. `watch` is the workers-view watch pane; everything
|
|
247
|
+
* else (presets, operator argv, the yazi companion) is `utility`. The purpose
|
|
248
|
+
* doubles as the pane's `role` metadata token so a restarted session can adopt
|
|
249
|
+
* a surviving watch pane by scanning one snapshot.
|
|
250
|
+
*/
|
|
251
|
+
export type MuxPanePurpose = "watch" | "utility";
|
|
252
|
+
|
|
253
|
+
/** One pane Clio created and therefore may act on. */
|
|
254
|
+
export interface MuxPaneRecord {
|
|
255
|
+
ref: MuxPaneRef;
|
|
256
|
+
purpose: MuxPanePurpose;
|
|
257
|
+
label: string;
|
|
258
|
+
openedAt: number;
|
|
259
|
+
/**
|
|
260
|
+
* True when the record was adopted from a snapshot at boot rather than
|
|
261
|
+
* created in this process, so a resumed session reuses the pane it found
|
|
262
|
+
* instead of opening a second one.
|
|
263
|
+
*/
|
|
264
|
+
adopted?: boolean;
|
|
265
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the workers-view watch pane runs.
|
|
3
|
+
*
|
|
4
|
+
* The argv is `node <this install's dist CLI> fleet view --watch <file>`
|
|
5
|
+
* rather than the `clio-coder` bin name. Resolving through PATH would run
|
|
6
|
+
* whatever copy of Clio the operator's PATH points at, which in a worktree or a
|
|
7
|
+
* multi-install machine is routinely not the one that opened the pane, and the
|
|
8
|
+
* viewer would then read a different install's state root. This is the same
|
|
9
|
+
* self-invocation shape `worker-spawn.ts:589` uses for the same reason.
|
|
10
|
+
*
|
|
11
|
+
* A per-run viewer command (`fleet view <runId> --follow`) used to live here
|
|
12
|
+
* for the per-dispatch viewer panes; those panes are gone, and the one pane
|
|
13
|
+
* that renders runs now follows a selection file so the TUI can retarget it
|
|
14
|
+
* without respawning anything.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { resolvePackageRoot } from "../../core/package-root.js";
|
|
19
|
+
import type { ClioDirs } from "../../core/xdg.js";
|
|
20
|
+
|
|
21
|
+
/** Built CLI entry point, matching the `bin` field in `package.json`. */
|
|
22
|
+
export function clioCliEntryPath(): string {
|
|
23
|
+
return join(resolvePackageRoot(), "dist/cli/index.js");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface ViewerCommandOptions {
|
|
27
|
+
/** Override for tests and for a caller that already resolved the entry. */
|
|
28
|
+
entryPath?: string;
|
|
29
|
+
/** Node binary to run it with; defaults to the one running this process. */
|
|
30
|
+
execPath?: string;
|
|
31
|
+
/** Exact parent-process layout; pinned on argv so a new pane cannot re-resolve it. */
|
|
32
|
+
dirs?: Readonly<ClioDirs>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** The argv the watch pane executes: one viewer process following a selection file. */
|
|
36
|
+
export function watchViewerCommand(selectionPath: string, options: ViewerCommandOptions = {}): ReadonlyArray<string> {
|
|
37
|
+
const layout =
|
|
38
|
+
options.dirs === undefined
|
|
39
|
+
? []
|
|
40
|
+
: [
|
|
41
|
+
"--config-dir",
|
|
42
|
+
options.dirs.config,
|
|
43
|
+
"--data-dir",
|
|
44
|
+
options.dirs.data,
|
|
45
|
+
"--state-dir",
|
|
46
|
+
options.dirs.state,
|
|
47
|
+
"--cache-dir",
|
|
48
|
+
options.dirs.cache,
|
|
49
|
+
];
|
|
50
|
+
return [
|
|
51
|
+
options.execPath ?? process.execPath,
|
|
52
|
+
options.entryPath ?? clioCliEntryPath(),
|
|
53
|
+
"fleet",
|
|
54
|
+
"view",
|
|
55
|
+
...layout,
|
|
56
|
+
"--watch",
|
|
57
|
+
selectionPath,
|
|
58
|
+
];
|
|
59
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 yazi-rs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# git.yazi
|
|
2
|
+
|
|
3
|
+
Show the status of Git file changes as linemode in the file list.
|
|
4
|
+
|
|
5
|
+
https://github.com/user-attachments/assets/34976be9-a871-4ffe-9d5a-c4cdd0bf4576
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
ya pkg add yazi-rs/plugins:git
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
Add the following to your `~/.config/yazi/init.lua`:
|
|
16
|
+
|
|
17
|
+
```lua
|
|
18
|
+
require("git"):setup()
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
And register it as fetchers in your `~/.config/yazi/yazi.toml`:
|
|
22
|
+
|
|
23
|
+
```toml
|
|
24
|
+
[[plugin.prepend_fetchers]]
|
|
25
|
+
id = "git"
|
|
26
|
+
url = "*"
|
|
27
|
+
run = "git"
|
|
28
|
+
|
|
29
|
+
[[plugin.prepend_fetchers]]
|
|
30
|
+
id = "git"
|
|
31
|
+
url = "*/"
|
|
32
|
+
run = "git"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Advanced
|
|
36
|
+
|
|
37
|
+
> [!NOTE]
|
|
38
|
+
> The following configuration must be put before `require("git"):setup()`
|
|
39
|
+
|
|
40
|
+
You can customize the [Style](https://yazi-rs.github.io/docs/plugins/layout#style) of the status sign with:
|
|
41
|
+
|
|
42
|
+
- `th.git.modified`
|
|
43
|
+
- `th.git.added`
|
|
44
|
+
- `th.git.untracked`
|
|
45
|
+
- `th.git.ignored`
|
|
46
|
+
- `th.git.deleted`
|
|
47
|
+
- `th.git.updated`
|
|
48
|
+
|
|
49
|
+
For example:
|
|
50
|
+
|
|
51
|
+
```lua
|
|
52
|
+
-- ~/.config/yazi/init.lua
|
|
53
|
+
th.git = th.git or {}
|
|
54
|
+
th.git.modified = ui.Style():fg("blue")
|
|
55
|
+
th.git.deleted = ui.Style():fg("red"):bold()
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
You can also customize the text of the status sign with:
|
|
59
|
+
|
|
60
|
+
- `th.git.modified_sign`
|
|
61
|
+
- `th.git.added_sign`
|
|
62
|
+
- `th.git.untracked_sign`
|
|
63
|
+
- `th.git.ignored_sign`
|
|
64
|
+
- `th.git.deleted_sign`
|
|
65
|
+
- `th.git.updated_sign`
|
|
66
|
+
|
|
67
|
+
For example:
|
|
68
|
+
|
|
69
|
+
```lua
|
|
70
|
+
-- ~/.config/yazi/init.lua
|
|
71
|
+
th.git = th.git or {}
|
|
72
|
+
th.git.modified_sign = "M"
|
|
73
|
+
th.git.deleted_sign = "D"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## License
|
|
77
|
+
|
|
78
|
+
This plugin is MIT-licensed. For more information check the [LICENSE](LICENSE) file.
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
--- @since 25.12.29
|
|
2
|
+
|
|
3
|
+
local WINDOWS = ya.target_family() == "windows"
|
|
4
|
+
|
|
5
|
+
-- The code of supported git status,
|
|
6
|
+
-- also used to determine which status to show for directories when they contain different statuses
|
|
7
|
+
-- see `bubble_up`
|
|
8
|
+
---@enum CODES
|
|
9
|
+
local CODES = {
|
|
10
|
+
excluded = 100, -- ignored directory
|
|
11
|
+
ignored = 6, -- ignored file
|
|
12
|
+
untracked = 5,
|
|
13
|
+
modified = 4,
|
|
14
|
+
added = 3,
|
|
15
|
+
deleted = 2,
|
|
16
|
+
updated = 1,
|
|
17
|
+
unknown = 0,
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
local PATTERNS = {
|
|
21
|
+
{ "!$", CODES.ignored },
|
|
22
|
+
{ "?$", CODES.untracked },
|
|
23
|
+
{ "[MT]", CODES.modified },
|
|
24
|
+
{ "[AC]", CODES.added },
|
|
25
|
+
{ "D", CODES.deleted },
|
|
26
|
+
{ "U", CODES.updated },
|
|
27
|
+
{ "[AD][AD]", CODES.updated },
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
---@param line string
|
|
31
|
+
---@return CODES, string
|
|
32
|
+
local function match(line)
|
|
33
|
+
local signs = line:sub(1, 2)
|
|
34
|
+
for _, p in ipairs(PATTERNS) do
|
|
35
|
+
local path, pattern, code = nil, p[1], p[2]
|
|
36
|
+
if signs:find(pattern) then
|
|
37
|
+
path = line:sub(4, 4) == '"' and line:sub(5, -2) or line:sub(4)
|
|
38
|
+
path = WINDOWS and path:gsub("/", "\\") or path
|
|
39
|
+
end
|
|
40
|
+
if not path then
|
|
41
|
+
elseif path:find("[/\\]$") then
|
|
42
|
+
-- Mark the ignored directory as `excluded`, so we can process it further within `propagate_down`
|
|
43
|
+
return code == CODES.ignored and CODES.excluded or code, path:sub(1, -2)
|
|
44
|
+
else
|
|
45
|
+
return code, path
|
|
46
|
+
end
|
|
47
|
+
---@diagnostic disable-next-line: missing-return
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
---@param cwd Url
|
|
52
|
+
---@return string?
|
|
53
|
+
local function root(cwd)
|
|
54
|
+
local is_worktree = function(url)
|
|
55
|
+
local file, head = io.open(tostring(url)), nil
|
|
56
|
+
if file then
|
|
57
|
+
head = file:read(8)
|
|
58
|
+
file:close()
|
|
59
|
+
end
|
|
60
|
+
return head == "gitdir: "
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
repeat
|
|
64
|
+
local next = cwd:join(".git")
|
|
65
|
+
local cha = fs.cha(next)
|
|
66
|
+
if cha and (cha.is_dir or is_worktree(next)) then
|
|
67
|
+
return tostring(cwd)
|
|
68
|
+
end
|
|
69
|
+
cwd = cwd.parent
|
|
70
|
+
until not cwd
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
---@param changed Changes
|
|
74
|
+
---@return Changes
|
|
75
|
+
local function bubble_up(changed)
|
|
76
|
+
local new, empty = {}, Url("")
|
|
77
|
+
for path, code in pairs(changed) do
|
|
78
|
+
if code ~= CODES.ignored then
|
|
79
|
+
local url = Url(path).parent
|
|
80
|
+
while url and url ~= empty do
|
|
81
|
+
local s = tostring(url)
|
|
82
|
+
new[s] = (new[s] or CODES.unknown) > code and new[s] or code
|
|
83
|
+
url = url.parent
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
return new
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
---@param excluded string[]
|
|
91
|
+
---@param cwd Url
|
|
92
|
+
---@param repo Url
|
|
93
|
+
---@return Changes
|
|
94
|
+
local function propagate_down(excluded, cwd, repo)
|
|
95
|
+
local new, rel = {}, cwd:strip_prefix(repo)
|
|
96
|
+
for _, path in ipairs(excluded) do
|
|
97
|
+
if rel:starts_with(path) then
|
|
98
|
+
-- If `cwd` is a subdirectory of an excluded directory, also mark it as `excluded`
|
|
99
|
+
new[tostring(cwd)] = CODES.excluded
|
|
100
|
+
elseif cwd == repo:join(path).parent then
|
|
101
|
+
-- If `path` is a direct subdirectory of `cwd`, mark it as `ignored`
|
|
102
|
+
new[path] = CODES.ignored
|
|
103
|
+
else
|
|
104
|
+
-- Skipping, we only care about `cwd` itself and its direct subdirectories for maximum performance
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
return new
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
---@param cwd string
|
|
111
|
+
---@param repo string
|
|
112
|
+
---@param changed Changes
|
|
113
|
+
local add = ya.sync(function(st, cwd, repo, changed)
|
|
114
|
+
---@cast st State
|
|
115
|
+
|
|
116
|
+
st.dirs[cwd] = repo
|
|
117
|
+
st.repos[repo] = st.repos[repo] or {}
|
|
118
|
+
for path, code in pairs(changed) do
|
|
119
|
+
if code == CODES.unknown then
|
|
120
|
+
st.repos[repo][path] = nil
|
|
121
|
+
elseif code == CODES.excluded then
|
|
122
|
+
-- Mark the directory with a special value `excluded` so that it can be distinguished during UI rendering
|
|
123
|
+
st.dirs[path] = CODES.excluded
|
|
124
|
+
else
|
|
125
|
+
st.repos[repo][path] = code
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
ui.render()
|
|
129
|
+
end)
|
|
130
|
+
|
|
131
|
+
---@param cwd string
|
|
132
|
+
local remove = ya.sync(function(st, cwd)
|
|
133
|
+
---@cast st State
|
|
134
|
+
|
|
135
|
+
local repo = st.dirs[cwd]
|
|
136
|
+
if not repo then
|
|
137
|
+
return
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
ui.render()
|
|
141
|
+
st.dirs[cwd] = nil
|
|
142
|
+
if not st.repos[repo] then
|
|
143
|
+
return
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
for _, r in pairs(st.dirs) do
|
|
147
|
+
if r == repo then
|
|
148
|
+
return
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
st.repos[repo] = nil
|
|
152
|
+
end)
|
|
153
|
+
|
|
154
|
+
---@param st State
|
|
155
|
+
---@param opts Options
|
|
156
|
+
local function setup(st, opts)
|
|
157
|
+
st.dirs = {}
|
|
158
|
+
st.repos = {}
|
|
159
|
+
|
|
160
|
+
opts = opts or {}
|
|
161
|
+
opts.order = opts.order or 1500
|
|
162
|
+
|
|
163
|
+
local t = th.git or {}
|
|
164
|
+
local styles = {
|
|
165
|
+
[CODES.ignored] = t.ignored and ui.Style(t.ignored) or ui.Style():fg("darkgray"),
|
|
166
|
+
[CODES.untracked] = t.untracked and ui.Style(t.untracked) or ui.Style():fg("magenta"),
|
|
167
|
+
[CODES.modified] = t.modified and ui.Style(t.modified) or ui.Style():fg("yellow"),
|
|
168
|
+
[CODES.added] = t.added and ui.Style(t.added) or ui.Style():fg("green"),
|
|
169
|
+
[CODES.deleted] = t.deleted and ui.Style(t.deleted) or ui.Style():fg("red"),
|
|
170
|
+
[CODES.updated] = t.updated and ui.Style(t.updated) or ui.Style():fg("yellow"),
|
|
171
|
+
}
|
|
172
|
+
local signs = {
|
|
173
|
+
[CODES.ignored] = t.ignored_sign or " ",
|
|
174
|
+
[CODES.untracked] = t.untracked_sign or "? ",
|
|
175
|
+
[CODES.modified] = t.modified_sign or " ",
|
|
176
|
+
[CODES.added] = t.added_sign or " ",
|
|
177
|
+
[CODES.deleted] = t.deleted_sign or " ",
|
|
178
|
+
[CODES.updated] = t.updated_sign or " ",
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
Linemode:children_add(function(self)
|
|
182
|
+
if not self._file.in_current then
|
|
183
|
+
return ""
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
local url = self._file.url
|
|
187
|
+
local repo = st.dirs[tostring(url.base or url.parent)]
|
|
188
|
+
local code
|
|
189
|
+
if repo then
|
|
190
|
+
code = repo == CODES.excluded and CODES.ignored or st.repos[repo][tostring(url):sub(#repo + 2)]
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
if not code or signs[code] == "" then
|
|
194
|
+
return ""
|
|
195
|
+
elseif self._file.is_hovered then
|
|
196
|
+
return ui.Line { " ", signs[code] }
|
|
197
|
+
else
|
|
198
|
+
return ui.Line { " ", ui.Span(signs[code]):style(styles[code]) }
|
|
199
|
+
end
|
|
200
|
+
end, opts.order)
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
---@type UnstableFetcher
|
|
204
|
+
local function fetch(_, job)
|
|
205
|
+
local cwd = job.files[1].url.base or job.files[1].url.parent
|
|
206
|
+
local repo = root(cwd)
|
|
207
|
+
if not repo then
|
|
208
|
+
remove(tostring(cwd))
|
|
209
|
+
return true
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
local paths = {}
|
|
213
|
+
for _, file in ipairs(job.files) do
|
|
214
|
+
paths[#paths + 1] = tostring(file.url)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
-- stylua: ignore
|
|
218
|
+
local output, err = Command("git")
|
|
219
|
+
:cwd(tostring(cwd))
|
|
220
|
+
:arg({ "--no-optional-locks", "-c", "core.quotePath=", "status", "--porcelain", "-unormal", "--no-renames", "--ignored=matching" })
|
|
221
|
+
:arg(paths)
|
|
222
|
+
:stdout(Command.PIPED)
|
|
223
|
+
:output()
|
|
224
|
+
if not output then
|
|
225
|
+
return true, Err("Cannot spawn `git` command, error: %s", err)
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
local changed, excluded = {}, {}
|
|
229
|
+
for line in output.stdout:gmatch("[^\r\n]+") do
|
|
230
|
+
local code, path = match(line)
|
|
231
|
+
if code == CODES.excluded then
|
|
232
|
+
excluded[#excluded + 1] = path
|
|
233
|
+
else
|
|
234
|
+
changed[path] = code
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
if job.files[1].cha.is_dir then
|
|
239
|
+
ya.dict_merge(changed, bubble_up(changed))
|
|
240
|
+
end
|
|
241
|
+
ya.dict_merge(changed, propagate_down(excluded, cwd, Url(repo)))
|
|
242
|
+
|
|
243
|
+
-- Reset the status of any files that don't appear in the output of `git status` to `unknown`,
|
|
244
|
+
-- so that cleaning up outdated statuses from `st.repos`
|
|
245
|
+
for _, path in ipairs(paths) do
|
|
246
|
+
local s = path:sub(#repo + 2)
|
|
247
|
+
changed[s] = changed[s] or CODES.unknown
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
add(tostring(cwd), repo, changed)
|
|
251
|
+
|
|
252
|
+
return false
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
return { setup = setup, fetch = fetch }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---@class State
|
|
2
|
+
---@field dirs table<string, string|CODES> Mapping between a directory and its corresponding repository
|
|
3
|
+
---@field repos table<string, Changes> Mapping between a repository and the status of each of its files
|
|
4
|
+
|
|
5
|
+
---@class Options
|
|
6
|
+
---@field order number The order in which the status is displayed
|
|
7
|
+
---@field renamed boolean Whether to include renamed files in the status (or treat them as modified)
|
|
8
|
+
|
|
9
|
+
-- TODO: move this to `types.yazi` once it's get stable
|
|
10
|
+
---@alias UnstableFetcher fun(self: unknown, job: { files: File[] }): boolean, Error?
|
|
11
|
+
|
|
12
|
+
---@alias Changes table<string, CODES>
|