@iowarp/clio-coder 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +131 -0
- package/CONTRIBUTING.md +59 -36
- package/README.md +407 -375
- package/SECURITY.md +2 -1
- package/dist/{acp-G5WJBNCT.js → acp-TMDQZDIG.js} +14 -14
- package/dist/{agents-FMV2Q5G4.js → agents-5N5NG3XG.js} +45 -34
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-3IDSJEIK.js → auth-Z5CCBXKQ.js} +22 -21
- package/dist/{builtins-XCZWXSC7.js → builtins-K6TNDT24.js} +6 -6
- package/dist/{chunk-GR5G2PVF.js → chunk-2HFQNRV3.js} +15 -10
- package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
- package/dist/{chunk-HJJTYUHX.js → chunk-2NHR3NAY.js} +168 -1406
- package/dist/chunk-2X4RYJTJ.js +39 -0
- package/dist/{chunk-UXMFQ54G.js → chunk-2Z2IKEXI.js} +39 -43
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/chunk-34BHNEE3.js +1846 -0
- package/dist/{chunk-YJX4SHTD.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
- package/dist/chunk-3KIPBMUA.js +308 -0
- package/dist/chunk-3M6DQK6S.js +362 -0
- package/dist/{chunk-BPKCPIL7.js → chunk-462T4EGZ.js} +3 -3
- package/dist/{chunk-QLFS5GO2.js → chunk-4JDLP6ZS.js} +44 -37
- package/dist/{chunk-LDQ2ZF2M.js → chunk-4O6MANBS.js} +6 -6
- package/dist/{chunk-O6TL7WWY.js → chunk-54ODD65L.js} +6 -6
- package/dist/{chunk-JDG2WCRO.js → chunk-5KW52TEP.js} +5 -5
- package/dist/{chunk-NHLBIGRH.js → chunk-5PFYMY2V.js} +41 -18
- package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
- package/dist/chunk-77QIVUZB.js +1334 -0
- package/dist/{chunk-HWHKMHUA.js → chunk-7BHIY2MW.js} +9 -15
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-VAZSBTKF.js → chunk-AZ4WMN4W.js} +2 -2
- package/dist/{chunk-B7OBL7PK.js → chunk-B74PXLU7.js} +21 -11
- package/dist/{chunk-CY6FY24N.js → chunk-B7HM5Z7T.js} +15 -15
- package/dist/{chunk-ULC6OTWO.js → chunk-BO7Y52RY.js} +88 -27
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/{chunk-DQITNCXG.js → chunk-BYMNWQ7O.js} +149 -159
- package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
- package/dist/{chunk-Z4TXYIEG.js → chunk-CRFOIAX3.js} +10 -10
- package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/{chunk-3BT2XMV4.js → chunk-CYZW7JHJ.js} +53 -60
- package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-X3YGUTOB.js → chunk-DYHAXKHD.js} +90 -62
- package/dist/{chunk-QBJA7R7N.js → chunk-DZAW46HP.js} +3 -3
- package/dist/{chunk-MLKNTWH2.js → chunk-DZEK6CJN.js} +22 -22
- package/dist/{chunk-K5C3NCBD.js → chunk-E7GT7O5N.js} +5 -5
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-F2I26BDK.js +66 -0
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-32KWKNSF.js → chunk-FVDGR2ZL.js} +4 -4
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-SJ5ZKQ4S.js → chunk-HIICAHCJ.js} +2 -2
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-WZR7K7ZX.js → chunk-HKMD33FO.js} +32 -83
- package/dist/chunk-HLAFFSEK.js +360 -0
- package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
- package/dist/{chunk-KFZI4NIL.js → chunk-I64IFBLB.js} +152 -31
- package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
- package/dist/{chunk-BUMFYQFY.js → chunk-I66ZTYNP.js} +543 -267
- package/dist/{chunk-2OQE55CK.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-GKF55TAZ.js → chunk-IDNA72AH.js} +104 -3
- package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
- package/dist/{chunk-J4W7KFM7.js → chunk-IKSLQ4XV.js} +5439 -3475
- package/dist/{chunk-6DB53AJS.js → chunk-IMXMHHMQ.js} +171 -30
- package/dist/{chunk-AB44T6BB.js → chunk-JBCS7CRR.js} +8 -7
- package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
- package/dist/{chunk-SP2RXXYO.js → chunk-JWJGP5DQ.js} +10 -10
- package/dist/{chunk-HZHHCK24.js → chunk-KKOJXO6R.js} +527 -325
- package/dist/chunk-KPXDY6QF.js +47 -0
- package/dist/{chunk-LQ3DZAMX.js → chunk-LJID3DYZ.js} +8 -2
- package/dist/{chunk-7MCTRUCE.js → chunk-M2DAX4F6.js} +2 -2
- package/dist/{chunk-VEO4AP2K.js → chunk-M2WXEHER.js} +4 -3
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-YDFRH54B.js → chunk-MCMZMDAC.js} +4 -4
- package/dist/{chunk-J5Q24KAG.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/chunk-NMJXSHBJ.js +283 -0
- package/dist/{chunk-VYMXRQI6.js → chunk-O3YUNJZ2.js} +88 -100
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-Z2RR6MAK.js → chunk-P75RZCJW.js} +28 -6
- package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
- package/dist/{chunk-DYJP44XW.js → chunk-PGF63K6I.js} +2 -2
- package/dist/chunk-PJX3WQUQ.js +42 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-2JDWVJND.js → chunk-Q4XWMHX6.js} +5 -7
- package/dist/{chunk-W5VSYASO.js → chunk-QQLGQY2A.js} +46 -87
- package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
- package/dist/{chunk-C2LTL2W6.js → chunk-RLYRBIYQ.js} +463 -180
- package/dist/{chunk-4ZG3XFUR.js → chunk-S66XZJOF.js} +14 -23
- package/dist/{chunk-I5VEOC6I.js → chunk-SSEYRH53.js} +13 -14
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-CODPRO7Q.js → chunk-TPEQIQIE.js} +7 -7
- package/dist/{chunk-QLL7ILRG.js → chunk-UBRFI4HS.js} +1151 -614
- package/dist/{chunk-O4XIVISU.js → chunk-UH347SHR.js} +227 -47
- package/dist/{chunk-OQBA45DZ.js → chunk-UH632ZYL.js} +2 -2
- package/dist/chunk-UXCU4E3T.js +303 -0
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-IQ7KR472.js → chunk-VIA6RFQZ.js} +8 -13
- package/dist/{chunk-V5DHCITQ.js → chunk-VKPAQYEB.js} +49 -19
- package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-3XML7CDN.js → chunk-W4YEMFBX.js} +3 -3
- package/dist/{chunk-U77AMWDL.js → chunk-W6NIE6OW.js} +44 -23
- package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
- package/dist/{chunk-QREDIESB.js → chunk-X7IARSHT.js} +15 -9
- package/dist/{chunk-3URVFKWK.js → chunk-XE3PCIXH.js} +5 -5
- package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
- package/dist/{chunk-F4CKPOEQ.js → chunk-XOXV5GKE.js} +119 -38
- package/dist/chunk-XQRY4DTA.js +657 -0
- package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
- package/dist/{chunk-NQQH3YT7.js → chunk-YJISEZKC.js} +3 -3
- package/dist/{chunk-X75E3D2N.js → chunk-ZGNYYXQ6.js} +18 -16
- package/dist/{chunk-LY4S7GJC.js → chunk-ZNT2M6TG.js} +20 -18
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IBEBSCYA.js → chunk-ZW4HH5JJ.js} +43 -34
- package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
- package/dist/cli/index.js +38 -37
- package/dist/{clio-2JXHBBY5.js → clio-7VB377CC.js} +12 -13
- package/dist/{code-nav-3YYRMYNF.js → code-nav-YVLCYA7V.js} +86 -18
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
- package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
- package/dist/{config-QZPCMYSO.js → config-4HVOS65E.js} +112 -63
- package/dist/{configure-TEGEBYCA.js → configure-PIWO7B24.js} +25 -22
- package/dist/{context-E6H5RNMC.js → context-IYEHL3WQ.js} +53 -47
- package/dist/{context-GSXUE4CT.js → context-KQYIWPWT.js} +68 -42
- package/dist/{context-AV7OEZ4D.js → context-N6ZE3LGJ.js} +11 -11
- package/dist/{context-clear-SHIBYK6T.js → context-clear-G4OGZJDS.js} +53 -47
- package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-BWLF6LJP.js} +12 -11
- package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-2QQAITS3.js} +67 -58
- package/dist/{docs-23KQS3XK.js → docs-PD3EXDKU.js} +20 -25
- package/dist/doctor-LHBD36VU.js +773 -0
- package/dist/{eval-TFBYQH4H.js → eval-C45FYRJ6.js} +68 -49
- package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-6DEJPLBF.js} +7 -8
- package/dist/{evidence-ERGESKGN.js → evidence-6SHONYAF.js} +50 -44
- package/dist/{evolve-VDXTSYCJ.js → evolve-KRKMV72X.js} +49 -43
- package/dist/{extensions-7BGBHN57.js → extensions-KPZ2UHBB.js} +8 -6
- package/dist/{fleet-2RRVDF2V.js → fleet-IVTCKDHT.js} +93 -79
- package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EDWL3IT7.js} +10 -9
- package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-YP3YEFGK.js} +6 -6
- package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-ZFWKHY2M.js} +19 -15
- package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-FVUNCBML.js} +50 -45
- package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-UN5XED4R.js} +5 -9
- package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-XOWC4HSX.js} +22 -17
- package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-UN3SODEL.js} +48 -43
- package/dist/fleet-view-TWHJKCN6.js +96 -0
- package/dist/{init-DN2WWLFE.js → init-T2QORQ3Y.js} +72 -66
- package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
- package/dist/{interop-OZBKXAYL.js → interop-IN5I2A66.js} +13 -11
- package/dist/{library-YWZG7IMW.js → library-LSCATDLZ.js} +23 -18
- package/dist/{memory-I4C4HMLW.js → memory-HYOKAGGJ.js} +51 -45
- package/dist/{models-CEYXJBO6.js → models-2GPMFYCM.js} +42 -33
- package/dist/{monitor-NZ6GCI3P.js → monitor-E4ASVUJH.js} +56 -50
- package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-DDMPR3PY.js} +2676 -1507
- package/dist/{panes-KY6W3V2E.js → panes-E3RUXOW5.js} +5 -5
- package/dist/panes-IXKLOKA2.js +75 -0
- package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
- package/dist/{reset-DQ6FGCSH.js → reset-OAQP3W4O.js} +7 -8
- package/dist/{resources-BB3MVJMD.js → resources-OTRSN34L.js} +23 -17
- package/dist/{run-H2GQDUER.js → run-5DEYH5QK.js} +95 -84
- package/dist/{share-GTJN6A5O.js → share-IHWTLO3M.js} +26 -19
- package/dist/{skills-L55TEW6R.js → skills-IYMXMKW4.js} +25 -20
- package/dist/{skills-eval-XVXPH2JI.js → skills-eval-DROHSJAR.js} +63 -65
- package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-D7X4L4ZX.js} +21 -16
- package/dist/{slash-commands-ZSGASKJC.js → slash-commands-QBM7UZ3B.js} +38 -33
- package/dist/{steer-RZGSCY4R.js → steer-Z5DO23FJ.js} +3 -3
- package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
- package/dist/{targets-NCPZ644J.js → targets-P2FUC4IL.js} +64 -61
- package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-YREJ3JX2.js} +15 -10
- package/dist/{tools-DAF3DI3C.js → tools-5B7RO6MV.js} +10 -8
- package/dist/{trace-FYVW2MQA.js → trace-YMGMUM6A.js} +101 -8
- package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
- package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
- package/dist/{upgrade-3XPP6OQL.js → upgrade-PXK3S2YM.js} +36 -61
- package/dist/{usage-3NLHGTU2.js → usage-ME5MPXGX.js} +58 -53
- package/dist/{verifiers-SSQONKRT.js → verifiers-BVZ7IWOO.js} +10 -9
- package/dist/{verify-3U6J7FZI.js → verify-5K7ZKQFC.js} +9 -8
- package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPARV2K7.js} +2 -3
- package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-F5W5QTYY.js} +74 -70
- package/dist/{with-panes-MKB46MPQ.js → with-panes-BYOJCLAM.js} +78 -246
- package/dist/worker/entry.js +83 -63
- package/docs/README.md +176 -81
- package/docs/{acp.md → architecture/acp.md} +36 -20
- package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
- package/docs/{architecture.md → architecture/architecture.md} +43 -22
- package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
- package/docs/architecture/artifact-versions.md +90 -0
- package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
- package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
- package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
- package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
- package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
- package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
- package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
- package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
- package/docs/{observability.md → architecture/observability.md} +26 -13
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
- package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
- package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
- package/docs/architecture/time-conventions.md +125 -0
- package/docs/{trace-store.md → architecture/trace-store.md} +26 -13
- package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
- package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
- package/docs/{built-in-agents.md → guide/built-in-agents.md} +70 -46
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +73 -62
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -444
- package/docs/guide/configuration-reference.md +1158 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +31 -27
- package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +8 -3
- package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
- package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +47 -49
- package/docs/{glossary.md → guide/glossary.md} +14 -11
- package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +45 -14
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +10 -5
- package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +13 -10
- package/docs/history/release-cut-checklist.md +207 -0
- package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
- package/docs/process/documentation-coverage.md +100 -0
- package/docs/process/documentation-guide.md +187 -0
- package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
- package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
- package/docs/{evolution.md → process/evolution.md} +2 -2
- package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +17 -10
- package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
- package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
- package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
- 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 +13 -21
- package/skills/README.md +51 -42
- package/skills/coding/ast-grep/SKILL.md +9 -3
- package/skills/coding/coding-standards/SKILL.md +9 -3
- package/skills/coding/prototype/SKILL.md +9 -3
- package/skills/coding/tdd/SKILL.md +9 -3
- package/skills/context/context-handoff/SKILL.md +13 -4
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +9 -3
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +10 -5
- 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 +9 -3
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +10 -4
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +8 -3
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +8 -3
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +22 -12
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +5 -4
- package/skills/meta/clio-coder-test/SKILL.md +146 -0
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +10 -5
- package/skills/meta/clio-coder-test/references/harness.md +102 -0
- package/skills/meta/clio-coder-test/references/test-map.md +96 -0
- package/skills/meta/credentials/SKILL.md +10 -3
- package/skills/meta/find-skills/SKILL.md +9 -3
- package/skills/meta/herdr/SKILL.md +9 -3
- package/skills/meta/skill-craft/SKILL.md +39 -16
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +9 -3
- package/skills/planning/prd/SKILL.md +9 -3
- package/skills/planning/product-intent/SKILL.md +9 -3
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +9 -3
- package/skills/research/experiment-protocol/SKILL.md +10 -3
- package/skills/research/scientific-debugging/SKILL.md +10 -3
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +10 -3
- package/skills/skill-marketplace.json +285 -66
- package/skills/workflow/cut-it/SKILL.md +11 -3
- package/skills/workflow/design-council/SKILL.md +12 -3
- package/skills/workflow/grill-me/SKILL.md +9 -3
- package/skills/workflow/workflow-distiller/SKILL.md +9 -3
- package/src/cli/acp.ts +2 -2
- package/src/cli/args.ts +2 -2
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +6 -6
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +68 -15
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +27 -31
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +28 -20
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +46 -14
- package/src/cli/doctor-toolchain.ts +31 -10
- package/src/cli/doctor.ts +15 -1
- package/src/cli/eval-inventory.ts +8 -8
- package/src/cli/eval.ts +1 -2
- package/src/cli/evidence-detail.ts +1 -1
- package/src/cli/evidence-inventory.ts +1 -1
- package/src/cli/extensions.ts +2 -1
- package/src/cli/fleet-decisions.ts +1 -1
- package/src/cli/fleet-inspect.ts +1 -1
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +1 -1
- package/src/cli/fleet-view.ts +40 -23
- package/src/cli/fleet.ts +9 -6
- package/src/cli/index.ts +2 -1
- package/src/cli/internal-dispatch.ts +3 -4
- package/src/cli/interop-inspect.ts +2 -2
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +19 -5
- package/src/cli/reset.ts +1 -1
- package/src/cli/run.ts +13 -17
- package/src/cli/share.ts +6 -2
- package/src/cli/skills-eval.ts +14 -14
- package/src/cli/targets.ts +25 -30
- package/src/cli/trace-inspect.ts +1 -1
- package/src/cli/trace.ts +96 -4
- 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 +1 -1
- package/src/cli/wiki-generate.ts +6 -6
- package/src/core/artifact-paths.ts +1 -1
- package/src/core/bash-exec.ts +132 -87
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +51 -6
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1066 -886
- package/src/core/defaults.ts +326 -530
- package/src/core/dispatch-outcome.ts +16 -0
- 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 +33 -52
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/prompt-hint.ts +9 -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/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/timers.ts +2 -12
- package/src/domains/agents/builtins/architect.md +2 -3
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +2 -2
- package/src/domains/agents/builtins/documenter.md +2 -2
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/oracle.md +1 -1
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +2 -2
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +14 -26
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +26 -4
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract.ts +1 -1
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +35 -47
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +56 -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 -6
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/path-index.ts +1 -0
- 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/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/capability-match.ts +10 -0
- package/src/domains/dispatch/capacity-lease.ts +2 -5
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/extension.ts +169 -82
- package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +0 -7
- package/src/domains/dispatch/gate-decisions.ts +25 -14
- package/src/domains/dispatch/host-verification.ts +435 -39
- package/src/domains/dispatch/intent-requirements.ts +10 -0
- package/src/domains/dispatch/intent.ts +18 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +220 -70
- 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 +0 -23
- 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.ts +9 -19
- package/src/domains/dispatch/state.ts +2 -3
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +47 -40
- package/src/domains/dispatch/types.ts +58 -6
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +10 -4
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- 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/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 +20 -3
- 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/trust-status.ts +10 -1
- package/src/domains/extensions/contract.ts +15 -1
- package/src/domains/extensions/discovery.ts +238 -41
- package/src/domains/extensions/extension.ts +105 -6
- package/src/domains/extensions/index.ts +24 -0
- package/src/domains/extensions/integrity.ts +189 -0
- package/src/domains/extensions/manager.ts +17 -1
- package/src/domains/extensions/resource-path.ts +27 -0
- package/src/domains/extensions/resources.ts +18 -38
- package/src/domains/extensions/snapshot-store.ts +39 -0
- package/src/domains/extensions/snapshot.ts +180 -0
- package/src/domains/extensions/state.ts +385 -57
- package/src/domains/extensions/types.ts +118 -1
- 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-extension-install-digests.ts +27 -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 +22 -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 +276 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +86 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/middleware/contract.ts +26 -0
- package/src/domains/middleware/extension.ts +24 -24
- package/src/domains/middleware/hook-receipts.ts +27 -4
- package/src/domains/middleware/hooks-io.ts +65 -32
- package/src/domains/middleware/hooks.ts +64 -0
- package/src/domains/middleware/index.ts +35 -4
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +30 -2
- package/src/domains/middleware/snapshot.ts +20 -7
- package/src/domains/mux/contract.ts +195 -25
- package/src/domains/mux/detect.ts +23 -6
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +7 -1
- package/src/domains/mux/index.ts +21 -1
- package/src/domains/mux/operations.ts +72 -5
- package/src/domains/mux/protocol.ts +19 -6
- package/src/domains/mux/socket-client.ts +167 -19
- package/src/domains/mux/types.ts +49 -6
- package/src/domains/mux/yazi/assets/yazi.toml +2 -2
- package/src/domains/mux/yazi/event-stream.ts +6 -4
- package/src/domains/mux/yazi/profile.ts +1 -1
- package/src/domains/mux/yazi/session.ts +79 -7
- package/src/domains/mux/yazi/theme.ts +117 -17
- package/src/domains/observability/contract.ts +10 -11
- package/src/domains/observability/extension.ts +12 -4
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +15 -91
- package/src/domains/observability/trace-store.ts +65 -19
- package/src/domains/prompts/compiler.ts +75 -55
- package/src/domains/prompts/contract.ts +15 -3
- package/src/domains/prompts/extension.ts +100 -12
- package/src/domains/prompts/fragments/identity/clio-worker.md +2 -4
- package/src/domains/prompts/fragments/identity/clio.md +6 -12
- package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
- package/src/domains/prompts/fragments/operating/contract.md +7 -15
- package/src/domains/prompts/fragments/operating/delegation.md +32 -34
- package/src/domains/prompts/fragments/operating/skills.md +11 -18
- package/src/domains/prompts/fragments/operating/worker.md +1 -8
- package/src/domains/providers/extension.ts +5 -5
- package/src/domains/providers/index.ts +1 -1
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +99 -23
- 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} +671 -106
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtime-resolution.ts +31 -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 +9 -4
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
- package/src/domains/providers/types/cost-provenance.ts +19 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +87 -39
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- 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 +41 -18
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/call-target.ts +1 -1
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/loop-detector.ts +7 -4
- 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/session/task-board.ts +10 -9
- package/src/domains/share/archive.ts +249 -43
- package/src/domains/toolchain/install.ts +1 -1
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +89 -35
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +1 -1
- 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 +4 -23
- package/src/engine/apis/lmstudio.ts +4 -9
- package/src/engine/apis/ollama-native.ts +9 -9
- package/src/engine/apis/openai-completions.ts +30 -27
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +10 -35
- package/src/engine/claude/sdk-module.ts +1 -12
- package/src/engine/claude/sdk-runtime.ts +6 -6
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/gemma-channel-filter.ts +19 -0
- package/src/engine/loop-guard.ts +92 -17
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +1 -1
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +54 -24
- package/src/engine/worker-tools.ts +3 -1
- package/src/entry/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +163 -120
- package/src/interactive/application-controller.ts +23 -22
- package/src/interactive/bus-notices.ts +10 -3
- package/src/interactive/chat-loop-messages.ts +3 -13
- package/src/interactive/chat-loop.ts +18 -9
- package/src/interactive/chat-panel.ts +37 -14
- package/src/interactive/chat-renderer.ts +71 -7
- 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 +1 -1
- package/src/interactive/cost-overlay.ts +1 -1
- package/src/interactive/council-grid.ts +2 -2
- package/src/interactive/dispatch-board.ts +36 -44
- 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 +15 -44
- package/src/interactive/interactive-application.ts +116 -61
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +6 -2
- package/src/interactive/interactive-presentation.ts +22 -17
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +65 -17
- 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 +2 -2
- package/src/interactive/modal-marker.ts +2 -21
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/overlay-frame.ts +4 -12
- package/src/interactive/overlay-general-openers.ts +6 -2
- package/src/interactive/overlay-key-routing.ts +7 -7
- package/src/interactive/overlay-lifecycle.ts +1 -1
- package/src/interactive/overlay-model-selectors.ts +3 -3
- package/src/interactive/overlays/agents.ts +2 -2
- package/src/interactive/overlays/ask-user.ts +25 -11
- package/src/interactive/overlays/context-reset.ts +28 -4
- package/src/interactive/overlays/cwd-fallback.ts +28 -4
- package/src/interactive/overlays/decisions.ts +4 -2
- package/src/interactive/overlays/extensions.ts +9 -1
- package/src/interactive/overlays/fleet-run-approval.ts +3 -3
- package/src/interactive/overlays/handoff-review.ts +2 -2
- package/src/interactive/overlays/help-reference.ts +13 -0
- package/src/interactive/overlays/interop.ts +1 -1
- package/src/interactive/overlays/library-install-confirm.ts +1 -1
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/overlays/model-selector.ts +39 -31
- package/src/interactive/overlays/prompts.ts +10 -4
- package/src/interactive/overlays/session-selector.ts +2 -2
- package/src/interactive/overlays/settings.ts +360 -303
- package/src/interactive/overlays/side-question.ts +2 -2
- package/src/interactive/overlays/skills-hub.ts +8 -8
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/panes-runtime.ts +145 -43
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/prompt-cache-identity.ts +88 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +401 -190
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -24
- package/src/interactive/tasks-overlay.ts +20 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/turn-context.ts +41 -26
- 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 +12 -9
- package/src/interactive/view/view-overlay.ts +13 -10
- package/src/interactive/watch-pane.ts +38 -10
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +4 -4
- package/src/interactive/worker-receipts.ts +1 -1
- package/src/interactive/worker-stream.ts +1 -4
- package/src/interactive/yazi-bridge.ts +72 -11
- package/src/tools/agent-tools.ts +30 -1
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +6 -6
- package/src/tools/bash.ts +2 -2
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +52 -22
- package/src/tools/codewiki/code-nav-surface.ts +6 -0
- package/src/tools/codewiki/code-nav.ts +99 -13
- package/src/tools/compete-worktrees.ts +27 -17
- package/src/tools/context/docs-engine.ts +20 -7
- package/src/tools/context/index.ts +44 -13
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-admission.ts +4 -2
- package/src/tools/dispatch-arguments.ts +6 -2
- package/src/tools/dispatch-plan.ts +48 -15
- package/src/tools/dispatch-run-events.ts +13 -11
- package/src/tools/dispatch-runner.ts +11 -6
- package/src/tools/dispatch-schema.ts +338 -0
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +9 -254
- package/src/tools/find.ts +1 -6
- package/src/tools/ledger.ts +3 -5
- package/src/tools/monitor-surface.ts +5 -13
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +4 -5
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +4 -11
- package/src/tools/panes.ts +4 -2
- package/src/tools/policy.ts +15 -2
- package/src/tools/read.ts +5 -6
- package/src/tools/registry.ts +30 -7
- package/src/tools/result-shaping.ts +18 -14
- package/src/tools/steer-surface.ts +1 -1
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/tasks.ts +1 -1
- package/src/tools/truncate.ts +6 -5
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/verify/surface.ts +6 -12
- package/src/tools/web-fetch-surface.ts +1 -3
- 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-36EJLSQQ.js +0 -814
- package/dist/chunk-GXNLGKAB.js +0 -571
- package/dist/chunk-K7VKOLQQ.js +0 -15
- package/dist/chunk-PMZCIOCJ.js +0 -25
- package/dist/chunk-SUCTJL45.js +0 -45
- package/dist/chunk-SUW5DORT.js +0 -819
- package/dist/chunk-TZ3SGWZZ.js +0 -48
- package/dist/chunk-UOV2BYIW.js +0 -107
- package/dist/chunk-VFA6GDY5.js +0 -1625
- package/dist/doctor-QOA5FNY5.js +0 -313
- package/dist/fleet-view-ZCON35AG.js +0 -102
- package/dist/panes-HMABYVO4.js +0 -58
- package/docs/artifact-versions.md +0 -67
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/release-cut-checklist.md +0 -193
- package/docs/time-conventions.md +0 -101
- package/skills/meta/clio-test/SKILL.md +0 -133
- package/skills/meta/clio-test/references/harness.md +0 -126
- package/skills/meta/clio-test/references/test-map.md +0 -69
- package/src/engine/apis/degraded-inference.ts +0 -95
package/src/tools/agent-tools.ts
CHANGED
|
@@ -296,6 +296,35 @@ function errorMessage(err: unknown): string {
|
|
|
296
296
|
return err instanceof Error ? err.message : String(err);
|
|
297
297
|
}
|
|
298
298
|
|
|
299
|
+
/**
|
|
300
|
+
* The parameter schema as the provider should see it.
|
|
301
|
+
*
|
|
302
|
+
* TypeBox 1.x annotates every schema it builds with string-keyed markers
|
|
303
|
+
* (`~unsafe` on `Type.Unsafe`, `~optional` on `Type.Optional`, and so on).
|
|
304
|
+
* Unlike the older symbol keys they survive `JSON.stringify`, so each enum
|
|
305
|
+
* field reached the model as `{"~unsafe": null, "~optional": true, ...}`:
|
|
306
|
+
* 44 junk keys on the default surface, and a small model has no way to know
|
|
307
|
+
* that `"~unsafe": null` means nothing. Validation does not need them
|
|
308
|
+
* (`Value.Check` answers identically with and without), so the copy handed
|
|
309
|
+
* to the agent loop drops every `~`-prefixed key. Symbol keys are copied
|
|
310
|
+
* through untouched because pi-ai picks its coercion path by the TypeBox
|
|
311
|
+
* kind symbol on the root schema.
|
|
312
|
+
*/
|
|
313
|
+
function wireParameterSchema<T>(schema: T): T {
|
|
314
|
+
if (Array.isArray(schema)) return schema.map((entry) => wireParameterSchema(entry)) as T;
|
|
315
|
+
if (typeof schema !== "object" || schema === null) return schema;
|
|
316
|
+
const source = schema as Record<PropertyKey, unknown>;
|
|
317
|
+
const out: Record<PropertyKey, unknown> = {};
|
|
318
|
+
for (const key of Object.keys(source)) {
|
|
319
|
+
if (key.startsWith("~")) continue;
|
|
320
|
+
out[key] = wireParameterSchema(source[key]);
|
|
321
|
+
}
|
|
322
|
+
for (const symbol of Object.getOwnPropertySymbols(source)) {
|
|
323
|
+
out[symbol] = source[symbol];
|
|
324
|
+
}
|
|
325
|
+
return out as T;
|
|
326
|
+
}
|
|
327
|
+
|
|
299
328
|
function toAgentTool(
|
|
300
329
|
spec: ToolSpec,
|
|
301
330
|
registry: ToolRegistry,
|
|
@@ -305,7 +334,7 @@ function toAgentTool(
|
|
|
305
334
|
const tool: AgentTool<TSchema> = {
|
|
306
335
|
name: spec.name,
|
|
307
336
|
description: spec.description,
|
|
308
|
-
parameters: spec.parameters,
|
|
337
|
+
parameters: wireParameterSchema(spec.parameters),
|
|
309
338
|
label: spec.metadata?.uiLabel ?? spec.name,
|
|
310
339
|
async execute(
|
|
311
340
|
toolCallId: string,
|
package/src/tools/artifact.ts
CHANGED
|
@@ -20,7 +20,7 @@ import type { ToolResult, ToolSpec } from "./registry.js";
|
|
|
20
20
|
* tree holds files a human asked for, and everything Clio generates on its own
|
|
21
21
|
* belongs in the gitignored project directory. An explicit `path` still writes
|
|
22
22
|
* wherever the caller says, inside the workspace. See core/artifact-paths.ts
|
|
23
|
-
* and docs/artifact-placement.md.
|
|
23
|
+
* and docs/architecture/artifact-placement.md.
|
|
24
24
|
*
|
|
25
25
|
* Skills are not artifacts: a skill is a SKILL.md folder written with the
|
|
26
26
|
* ordinary write tool and validated by the skills loader on load. The
|
|
@@ -83,7 +83,7 @@ async function writeTerminalArtifact(
|
|
|
83
83
|
export function createArtifactTool(deps: ArtifactToolDeps = {}): ToolSpec {
|
|
84
84
|
return {
|
|
85
85
|
name: ToolNames.Artifact,
|
|
86
|
-
description: `Write a named artifact: kind=plan|review|report writes a terminal Markdown document and completes the turn. Without an explicit path it lands in ${CLIO_ARTIFACT_DIR}/ (PLAN.md, REVIEW.md, REPORT.md); pass path only when the user asked for a file at a specific place.`,
|
|
86
|
+
description: `Write a named artifact: kind=plan|review|report writes a terminal Markdown document and completes the turn, so close the task board (tasks done/block/drop) before writing it. Without an explicit path it lands in ${CLIO_ARTIFACT_DIR}/ (PLAN.md, REVIEW.md, REPORT.md); pass path only when the user asked for a file at a specific place.`,
|
|
87
87
|
parameters: Type.Object({
|
|
88
88
|
kind: StringEnum(ARTIFACT_KINDS, { description: "Artifact kind." }),
|
|
89
89
|
content: Type.String({ description: "Full Markdown body." }),
|
package/src/tools/ask-user.ts
CHANGED
|
@@ -92,13 +92,13 @@ export interface AskUserToolDeps {
|
|
|
92
92
|
export const askUserParameters = Type.Object({
|
|
93
93
|
action: Type.Optional(
|
|
94
94
|
StringEnum(["ask", "complete"], {
|
|
95
|
-
description: "ask presents a round of questions; complete
|
|
95
|
+
description: "ask presents a round of questions; complete records the decisions, once, before final prose.",
|
|
96
96
|
}),
|
|
97
97
|
),
|
|
98
98
|
mode: Type.Optional(
|
|
99
99
|
StringEnum(["round", "single_question"], {
|
|
100
100
|
description:
|
|
101
|
-
"
|
|
101
|
+
"round (default) accepts 1 to 4 tightly related questions; single_question accepts exactly one, for interviews.",
|
|
102
102
|
}),
|
|
103
103
|
),
|
|
104
104
|
questions: Type.Optional(
|
|
@@ -135,7 +135,7 @@ export const askUserParameters = Type.Object({
|
|
|
135
135
|
exposure: Type.Optional(
|
|
136
136
|
StringEnum(["local", "outward"], {
|
|
137
137
|
description:
|
|
138
|
-
"
|
|
138
|
+
"local (default) stays inside the workspace; outward publishes or sends something the operator cannot take back (issue, PR, comment, push, release) and parks for the operator at auto-edit.",
|
|
139
139
|
}),
|
|
140
140
|
),
|
|
141
141
|
});
|
|
@@ -261,7 +261,7 @@ function normalizeDecisions(value: unknown): { decisions?: AskUserDecision[]; er
|
|
|
261
261
|
return { decisions };
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
-
|
|
264
|
+
function normalizeAskUserCall(args: Record<string, unknown>): { call?: AskUserCall; error?: string } {
|
|
265
265
|
const rawAction = trimOptionalString(args.action)?.toLowerCase() ?? "ask";
|
|
266
266
|
if (rawAction !== "ask" && rawAction !== "complete") {
|
|
267
267
|
return { error: "action must be ask or complete" };
|
|
@@ -499,7 +499,7 @@ async function persistAskUserTranscript(
|
|
|
499
499
|
await mkdir(dir, { recursive: true });
|
|
500
500
|
if (!policy.transcriptPath) policy.transcriptPath = path.join(dir, transcriptFileName(policy));
|
|
501
501
|
const transcript = {
|
|
502
|
-
schema: "clio.ask_user.interview.v1",
|
|
502
|
+
schema: "clio-coder.ask_user.interview.v1",
|
|
503
503
|
id: policy.id,
|
|
504
504
|
status: policy.status,
|
|
505
505
|
startedAt: policy.startedAt,
|
|
@@ -595,7 +595,7 @@ async function completeInterview(
|
|
|
595
595
|
return okInterviewResult(policy, event);
|
|
596
596
|
}
|
|
597
597
|
|
|
598
|
-
|
|
598
|
+
async function finalizeAskUserInterview(
|
|
599
599
|
policy: AskUserToolPolicy,
|
|
600
600
|
reason: string,
|
|
601
601
|
options?: ToolInvokeOptions,
|
package/src/tools/bash.ts
CHANGED
|
@@ -48,7 +48,7 @@ export const BASH_DEFAULT_RESULT_DISPOSITION: ToolResultDisposition = {
|
|
|
48
48
|
};
|
|
49
49
|
|
|
50
50
|
/** Pure, idempotent normalization used by registry admission and direct calls. */
|
|
51
|
-
|
|
51
|
+
function normalizeBashArguments(args: Record<string, unknown>): Record<string, unknown> {
|
|
52
52
|
return args.output_policy === undefined ? { ...args, output_policy: "bounded" } : args;
|
|
53
53
|
}
|
|
54
54
|
|
|
@@ -163,7 +163,7 @@ export const bashTool: ToolSpec = {
|
|
|
163
163
|
cwd: Type.Optional(
|
|
164
164
|
Type.String({
|
|
165
165
|
description:
|
|
166
|
-
"Omit
|
|
166
|
+
"Omit unless the command must run in a subdirectory of the workspace root, given as a relative path; outside the root is blocked.",
|
|
167
167
|
}),
|
|
168
168
|
),
|
|
169
169
|
timeout_ms: Type.Optional(Type.Number({ description: "Timeout in milliseconds." })),
|
package/src/tools/bootstrap.ts
CHANGED
|
@@ -10,6 +10,7 @@ import type { CompeteMuxWorktrees } from "./compete-worktrees.js";
|
|
|
10
10
|
import { assertRegisteredBuiltinTools, type CoreToolBootstrapDeps, registerCoreTools } from "./core-bootstrap.js";
|
|
11
11
|
import { createDispatchRunEventRegistry, createDispatchTool } from "./dispatch.js";
|
|
12
12
|
import type { DispatchBackgroundRegistry } from "./dispatch-background.js";
|
|
13
|
+
import type { DispatchSchemaComposition } from "./dispatch-schema.js";
|
|
13
14
|
import { lazyTool } from "./lazy-tool.js";
|
|
14
15
|
import { monitorToolSurface } from "./monitor-surface.js";
|
|
15
16
|
import { panesToolSurface } from "./panes-surface.js";
|
|
@@ -27,6 +28,8 @@ export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
|
|
|
27
28
|
getAutonomy?: () => AutonomyLevel;
|
|
28
29
|
getCostCeilingUsd?: () => number;
|
|
29
30
|
getWorkerRosters?: () => WorkerRosters;
|
|
31
|
+
/** Which optional `dispatch` schema blocks this session advertises; absent means every block. */
|
|
32
|
+
getDispatchSchemaComposition?: () => DispatchSchemaComposition;
|
|
30
33
|
dispatchBackground?: DispatchBackgroundRegistry;
|
|
31
34
|
/** Optional herdr worktree lifecycle for compete candidates. */
|
|
32
35
|
competeMuxWorktrees?: CompeteMuxWorktrees;
|
|
@@ -61,6 +64,7 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
|
|
|
61
64
|
...(deps.getAutonomy ? { getAutonomy: deps.getAutonomy } : {}),
|
|
62
65
|
...(deps.getCostCeilingUsd ? { getCostCeilingUsd: deps.getCostCeilingUsd } : {}),
|
|
63
66
|
...(deps.getWorkerRosters ? { getWorkerRosters: deps.getWorkerRosters } : {}),
|
|
67
|
+
...(deps.getDispatchSchemaComposition ? { getSchemaComposition: deps.getDispatchSchemaComposition } : {}),
|
|
64
68
|
...(deps.dispatchBackground ? { background: deps.dispatchBackground } : {}),
|
|
65
69
|
...(deps.competeMuxWorktrees ? { competeWorktrees: { mux: deps.competeMuxWorktrees } } : {}),
|
|
66
70
|
};
|
|
@@ -4,7 +4,13 @@ import { BASH_DEFAULT_RESULT_DISPOSITION } from "./bash.js";
|
|
|
4
4
|
import { OBSERVATION_POLICY_SLACK_BYTES, OBSERVE_SELF_CAPS } from "./observation.js";
|
|
5
5
|
import { toolPresentationPolicy } from "./presentation.js";
|
|
6
6
|
import { readMaxBytes } from "./read.js";
|
|
7
|
-
import
|
|
7
|
+
import {
|
|
8
|
+
resolveToolPromptHint,
|
|
9
|
+
type ToolMetadata,
|
|
10
|
+
type ToolPromptHintRole,
|
|
11
|
+
type ToolSourceInfo,
|
|
12
|
+
type ToolSpec,
|
|
13
|
+
} from "./registry.js";
|
|
8
14
|
|
|
9
15
|
function withSourceInfo<T extends ToolSpec>(spec: T, sourceInfo: ToolSourceInfo): T {
|
|
10
16
|
return { ...spec, sourceInfo };
|
|
@@ -83,7 +89,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
83
89
|
resultSizePolicy: observePolicy(OBSERVE_SELF_CAPS.codeNav, "Raise limit or use a narrower mode/query."),
|
|
84
90
|
costLatency: "local_fast",
|
|
85
91
|
promptHint:
|
|
86
|
-
"Use code_nav for
|
|
92
|
+
"Use code_nav with source=workspace (default) for project code and source=clio for Clio's shipped code map; modes: symbol, path, entries, outline, deps, dependents, wiki (workspace only).",
|
|
87
93
|
},
|
|
88
94
|
[ToolNames.Context]: {
|
|
89
95
|
objective: "Return workspace, bundled-docs, or skill context.",
|
|
@@ -94,8 +100,14 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
94
100
|
"Use a narrower query or scope to inspect omitted content.",
|
|
95
101
|
),
|
|
96
102
|
costLatency: "local_fast",
|
|
97
|
-
promptHint:
|
|
98
|
-
|
|
103
|
+
promptHint: {
|
|
104
|
+
session:
|
|
105
|
+
'On an explicit pending skill request, first load exactly that skill with context(scope="skills", name=<skill>). Follow a [Marketplace] reminder\'s exact ask_user options. Recall needed [evicted ...] content with context(scope="recall", ref=...).',
|
|
106
|
+
worker:
|
|
107
|
+
'This worker has no operator skill-activation channel; do not load or suggest skills. Recall needed [evicted ...] content with context(scope="recall", ref=...).',
|
|
108
|
+
boundWorker:
|
|
109
|
+
'Load only the harness-activated recipe-bound skills named in the persona, and only when they match the assigned task. This worker cannot install or suggest marketplace skills. Recall needed [evicted ...] content with context(scope="recall", ref=...).',
|
|
110
|
+
},
|
|
99
111
|
},
|
|
100
112
|
[ToolNames.CredentialPresent]: {
|
|
101
113
|
objective: "Check whether a credential key is present without returning its value.",
|
|
@@ -135,7 +147,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
135
147
|
resultDisposition: BASH_DEFAULT_RESULT_DISPOSITION,
|
|
136
148
|
costLatency: "local_slow",
|
|
137
149
|
promptHint:
|
|
138
|
-
"
|
|
150
|
+
"bash output_policy: omit for a bounded tail; summary for noisy commands; metadata-only when only the outcome matters; full only when the output is known to fit.",
|
|
139
151
|
},
|
|
140
152
|
[ToolNames.Git]: {
|
|
141
153
|
objective: "Read-only git inspection: status, diff, or log.",
|
|
@@ -167,9 +179,8 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
167
179
|
},
|
|
168
180
|
costLatency: "local_fast",
|
|
169
181
|
promptHint:
|
|
170
|
-
'
|
|
171
|
-
|
|
172
|
-
'(what proves it works), and use "block" with a reason instead of silently stalling.',
|
|
182
|
+
'For a request with three or more distinct steps, declare the board before the first edit: tasks(action="plan") with a title and the task list. ' +
|
|
183
|
+
"start one task before working it, close it with done plus an evidence note, and block with a reason instead of stalling.",
|
|
173
184
|
},
|
|
174
185
|
[ToolNames.Ledger]: {
|
|
175
186
|
objective: "Coordinate with the peer workers of this dispatch through typed claims, findings, and reviews.",
|
|
@@ -191,9 +202,10 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
191
202
|
resultSizePolicy: summaryPolicy(
|
|
192
203
|
"Use the dispatch receipt paths or ask a narrower worker follow-up for omitted output.",
|
|
193
204
|
),
|
|
205
|
+
// No hint: the Tool Contract's inventory line already says when
|
|
206
|
+
// dispatch(list:true) is the right answer, and the Fleet section says
|
|
207
|
+
// everything else about routing.
|
|
194
208
|
costLatency: "agent",
|
|
195
|
-
promptHint:
|
|
196
|
-
"Call dispatch with list:true only when the operator asks about agents, workers, or the fleet; never use it to inventory direct tools.",
|
|
197
209
|
},
|
|
198
210
|
[ToolNames.Monitor]: {
|
|
199
211
|
objective: "Inspect dispatched runs: state, recent events, receipts.",
|
|
@@ -226,7 +238,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
226
238
|
},
|
|
227
239
|
costLatency: "local_fast",
|
|
228
240
|
promptHint:
|
|
229
|
-
'When the operator asks to see a dispatched agent ("show me the tester"), call panes
|
|
241
|
+
'When the operator asks to see a dispatched agent ("show me the tester"), call panes(action="show", target=<agent id>).',
|
|
230
242
|
},
|
|
231
243
|
// RETRIEVE: network-class.
|
|
232
244
|
[ToolNames.WebFetch]: {
|
|
@@ -252,7 +264,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
252
264
|
},
|
|
253
265
|
costLatency: "local_slow",
|
|
254
266
|
promptHint:
|
|
255
|
-
'Use ask_user only when blocked on a decision the request does not answer
|
|
267
|
+
'Use ask_user only when blocked on a decision the request does not answer, never about something the operator already stated: one question per round in interviews, up to four related questions otherwise, recommended option first, then action="complete" with the decisions before final prose.',
|
|
256
268
|
},
|
|
257
269
|
// ARTIFACT: terminal writers.
|
|
258
270
|
[ToolNames.Artifact]: {
|
|
@@ -264,15 +276,21 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
264
276
|
},
|
|
265
277
|
};
|
|
266
278
|
|
|
267
|
-
/** Canonical,
|
|
268
|
-
export function toolPromptHintsForNames(
|
|
269
|
-
|
|
279
|
+
/** Canonical, role-aware prompt hints for an already-admitted tool set. */
|
|
280
|
+
export function toolPromptHintsForNames(
|
|
281
|
+
names: ReadonlyArray<ToolName>,
|
|
282
|
+
role: ToolPromptHintRole = "session",
|
|
283
|
+
): ReadonlyArray<{ tool: string; hint: string }> {
|
|
284
|
+
const seenTools = new Set<string>();
|
|
285
|
+
const seenHints = new Set<string>();
|
|
270
286
|
const hints: Array<{ tool: string; hint: string }> = [];
|
|
271
287
|
for (const name of [...names].sort()) {
|
|
272
|
-
if (
|
|
273
|
-
|
|
274
|
-
const hint = TOOL_METADATA[name]?.promptHint
|
|
275
|
-
if (hint
|
|
288
|
+
if (seenTools.has(name)) continue;
|
|
289
|
+
seenTools.add(name);
|
|
290
|
+
const hint = resolveToolPromptHint(TOOL_METADATA[name]?.promptHint, role);
|
|
291
|
+
if (!hint || seenHints.has(hint)) continue;
|
|
292
|
+
seenHints.add(hint);
|
|
293
|
+
hints.push({ tool: name, hint });
|
|
276
294
|
}
|
|
277
295
|
return hints;
|
|
278
296
|
}
|
|
@@ -282,9 +300,21 @@ export function toolPromptHintsForNames(names: ReadonlyArray<ToolName>): Readonl
|
|
|
282
300
|
// live panel (which has no registry) answer the fold question identically.
|
|
283
301
|
function withBuiltinMetadata<T extends ToolSpec>(spec: T): T {
|
|
284
302
|
const metadata = TOOL_METADATA[spec.name];
|
|
285
|
-
return
|
|
286
|
-
|
|
287
|
-
|
|
303
|
+
if (!metadata) return spec;
|
|
304
|
+
// The read cap is a guardrail (`safety.limits.readBytesPerCall`) installed
|
|
305
|
+
// from settings after this module loads, so the table's import-time value
|
|
306
|
+
// is the default, not the operator's. Recompute the policy cap when the tool
|
|
307
|
+
// is registered; the drift check in policy.ts compares against the live cap
|
|
308
|
+
// and a settings file raising the read cap used to fail boot.
|
|
309
|
+
const resultSizePolicy =
|
|
310
|
+
spec.name === ToolNames.Read
|
|
311
|
+
? observePolicy(readMaxBytes(), metadata.resultSizePolicy?.followUpHint ?? "")
|
|
312
|
+
: metadata.resultSizePolicy;
|
|
313
|
+
return withMetadata(spec, {
|
|
314
|
+
...metadata,
|
|
315
|
+
...(resultSizePolicy ? { resultSizePolicy } : {}),
|
|
316
|
+
presentation: toolPresentationPolicy(spec.name, undefined),
|
|
317
|
+
});
|
|
288
318
|
}
|
|
289
319
|
|
|
290
320
|
export function builtin<T extends ToolSpec>(spec: T, sourceInfo: ToolSourceInfo): T {
|
|
@@ -12,6 +12,12 @@ export const codeNavToolSurface = {
|
|
|
12
12
|
description:
|
|
13
13
|
"Navigate the indexed codewiki: mode=symbol finds files by symbol, path finds files by glob/regex/substring, entries lists likely entry points, outline lists file symbols, deps lists imports, and dependents lists importers. mode=wiki without query lists generated Markdown wiki pages; with query it resolves a page id/title and returns its summary plus a path to open with read. For Clio's bundled product docs use context scope=docs.",
|
|
14
14
|
parameters: Type.Object({
|
|
15
|
+
source: Type.Optional(
|
|
16
|
+
StringEnum(["workspace", "clio"], {
|
|
17
|
+
description: "Code map source (default workspace).",
|
|
18
|
+
default: "workspace",
|
|
19
|
+
}),
|
|
20
|
+
),
|
|
15
21
|
mode: StringEnum(["symbol", "path", "entries", "outline", "deps", "dependents", "wiki"], {
|
|
16
22
|
description: "Lookup mode.",
|
|
17
23
|
}),
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
-
import { join, normalize } from "node:path";
|
|
2
|
+
import { isAbsolute, join, normalize, relative, resolve } from "node:path";
|
|
3
|
+
import { resolvePackageRoot } from "../../core/package-root.js";
|
|
3
4
|
import { ToolNames } from "../../core/tool-names.js";
|
|
5
|
+
import { parseCodewikiRaw } from "../../domains/context/codewiki/artifact.js";
|
|
4
6
|
import type { Codewiki, CodewikiFile, CodewikiSymbol } from "../../domains/context/codewiki/schema.js";
|
|
5
7
|
import { listWikiPages } from "../../domains/context/wiki/layout.js";
|
|
6
8
|
import { readWikiMeta } from "../../domains/context/wiki/meta.js";
|
|
@@ -22,6 +24,14 @@ import {
|
|
|
22
24
|
import { loadCodewikiForTool, renderJson } from "./shared.js";
|
|
23
25
|
|
|
24
26
|
const REGEX_SYNTAX_HINTS = /\.\*|\.\+|\^|\$|\\[dDwWsSbB]|\(\?:|\(\?=|\(\?!/;
|
|
27
|
+
const CLIO_CODEWIKI_RELATIVE_PATH = join("dist", "assets", "codewiki.json");
|
|
28
|
+
|
|
29
|
+
type CodeNavSource = "workspace" | "clio";
|
|
30
|
+
|
|
31
|
+
interface LoadedNavSource {
|
|
32
|
+
codewiki: Codewiki;
|
|
33
|
+
entryRoot: string | null;
|
|
34
|
+
}
|
|
25
35
|
|
|
26
36
|
interface NavIndex {
|
|
27
37
|
filesById: Map<string, CodewikiFile>;
|
|
@@ -42,6 +52,62 @@ interface NavPayload {
|
|
|
42
52
|
}
|
|
43
53
|
|
|
44
54
|
const navIndexCache = new WeakMap<Codewiki, NavIndex>();
|
|
55
|
+
let clioCodewikiCache: { packageRoot: string; codewiki: Codewiki } | null = null;
|
|
56
|
+
|
|
57
|
+
function packageRootResolvedPath(packageRoot: string, indexedPath: string): string {
|
|
58
|
+
const resolved = resolve(packageRoot, indexedPath);
|
|
59
|
+
const rel = relative(packageRoot, resolved);
|
|
60
|
+
if (
|
|
61
|
+
rel.length === 0 ||
|
|
62
|
+
rel === ".." ||
|
|
63
|
+
rel.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) ||
|
|
64
|
+
isAbsolute(rel)
|
|
65
|
+
) {
|
|
66
|
+
throw new Error(`invalid package-root-relative path in bundled code map: ${indexedPath}`);
|
|
67
|
+
}
|
|
68
|
+
return resolved;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function packageRootResolvedCodewiki(packageRoot: string, codewiki: Codewiki): Codewiki {
|
|
72
|
+
return {
|
|
73
|
+
...codewiki,
|
|
74
|
+
files: codewiki.files.map((file) => ({
|
|
75
|
+
...file,
|
|
76
|
+
path: packageRootResolvedPath(packageRoot, file.path),
|
|
77
|
+
})),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function loadClioCodewikiForTool(): { ok: true; loaded: LoadedNavSource } | { ok: false; message: string } {
|
|
82
|
+
try {
|
|
83
|
+
const packageRoot = resolvePackageRoot();
|
|
84
|
+
if (clioCodewikiCache?.packageRoot === packageRoot) {
|
|
85
|
+
return { ok: true, loaded: { codewiki: clioCodewikiCache.codewiki, entryRoot: packageRoot } };
|
|
86
|
+
}
|
|
87
|
+
const artifactPath = join(packageRoot, CLIO_CODEWIKI_RELATIVE_PATH);
|
|
88
|
+
const parsed = parseCodewikiRaw(readFileSync(artifactPath, "utf8"));
|
|
89
|
+
if (!parsed) throw new Error("bundled artifact is not a valid codewiki");
|
|
90
|
+
const codewiki = packageRootResolvedCodewiki(packageRoot, parsed);
|
|
91
|
+
clioCodewikiCache = { packageRoot, codewiki };
|
|
92
|
+
return { ok: true, loaded: { codewiki, entryRoot: packageRoot } };
|
|
93
|
+
} catch (err) {
|
|
94
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
95
|
+
return {
|
|
96
|
+
ok: false,
|
|
97
|
+
message: `code_nav: bundled Clio code map unavailable at ${CLIO_CODEWIKI_RELATIVE_PATH}: ${message}`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async function loadNavSource(
|
|
103
|
+
source: CodeNavSource,
|
|
104
|
+
): Promise<{ ok: true; loaded: LoadedNavSource } | { ok: false; message: string }> {
|
|
105
|
+
if (source === "clio") return loadClioCodewikiForTool();
|
|
106
|
+
const loaded = await loadCodewikiForTool();
|
|
107
|
+
return loaded.ok
|
|
108
|
+
? { ok: true, loaded: { codewiki: loaded.codewiki, entryRoot: null } }
|
|
109
|
+
: { ok: false, message: loaded.message };
|
|
110
|
+
}
|
|
45
111
|
|
|
46
112
|
function regexFromPattern(pattern: string): RegExp | null {
|
|
47
113
|
if (pattern.startsWith("/") && pattern.lastIndexOf("/") > 0) {
|
|
@@ -73,7 +139,7 @@ function regexFromPattern(pattern: string): RegExp | null {
|
|
|
73
139
|
return null;
|
|
74
140
|
}
|
|
75
141
|
|
|
76
|
-
function readPackageEntryPaths(cwd: string): Set<string> {
|
|
142
|
+
function readPackageEntryPaths(cwd: string, resolveFromRoot: boolean): Set<string> {
|
|
77
143
|
const out = new Set<string>();
|
|
78
144
|
const pkgPath = join(cwd, "package.json");
|
|
79
145
|
if (!existsSync(pkgPath)) return out;
|
|
@@ -85,11 +151,15 @@ function readPackageEntryPaths(cwd: string): Set<string> {
|
|
|
85
151
|
}
|
|
86
152
|
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return out;
|
|
87
153
|
const pkg = parsed as Record<string, unknown>;
|
|
88
|
-
|
|
89
|
-
|
|
154
|
+
const add = (value: string): void => {
|
|
155
|
+
const normalized = normalizeEntryPath(value);
|
|
156
|
+
out.add(resolveFromRoot ? packageRootResolvedPath(cwd, normalized) : normalized);
|
|
157
|
+
};
|
|
158
|
+
if (typeof pkg.main === "string") add(pkg.main);
|
|
159
|
+
if (typeof pkg.bin === "string") add(pkg.bin);
|
|
90
160
|
if (typeof pkg.bin === "object" && pkg.bin !== null && !Array.isArray(pkg.bin)) {
|
|
91
161
|
for (const value of Object.values(pkg.bin)) {
|
|
92
|
-
if (typeof value === "string")
|
|
162
|
+
if (typeof value === "string") add(value);
|
|
93
163
|
}
|
|
94
164
|
}
|
|
95
165
|
return out;
|
|
@@ -243,9 +313,9 @@ function runPath(index: NavIndex, query: string, limit: number): NavPayload {
|
|
|
243
313
|
};
|
|
244
314
|
}
|
|
245
315
|
|
|
246
|
-
function runEntries(index: NavIndex, limit: number): NavPayload {
|
|
247
|
-
const cwd = process.cwd();
|
|
248
|
-
const packageEntries = readPackageEntryPaths(cwd);
|
|
316
|
+
function runEntries(index: NavIndex, limit: number, entryRoot: string | null): NavPayload {
|
|
317
|
+
const cwd = entryRoot ?? process.cwd();
|
|
318
|
+
const packageEntries = readPackageEntryPaths(cwd, entryRoot !== null);
|
|
249
319
|
const candidates = [...index.filesByPath.values()].filter(
|
|
250
320
|
(file) => file.lang !== "config" && (file.role === "entry" || packageEntries.has(file.path)),
|
|
251
321
|
);
|
|
@@ -488,10 +558,24 @@ function parseLimit(value: unknown, fallback: number): number {
|
|
|
488
558
|
export const codeNavTool: ToolSpec = {
|
|
489
559
|
...codeNavToolSurface,
|
|
490
560
|
async run(args, options): Promise<ToolResult> {
|
|
561
|
+
const rawSource = args.source;
|
|
562
|
+
if (rawSource !== undefined && rawSource !== "workspace" && rawSource !== "clio") {
|
|
563
|
+
return {
|
|
564
|
+
kind: "error",
|
|
565
|
+
message: `code_nav: source must be workspace or clio; got '${String(rawSource)}'`,
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
const source: CodeNavSource = rawSource === "clio" ? "clio" : "workspace";
|
|
491
569
|
const mode = typeof args.mode === "string" ? args.mode : "";
|
|
492
|
-
|
|
570
|
+
if (source === "clio" && mode === "wiki") {
|
|
571
|
+
return {
|
|
572
|
+
kind: "error",
|
|
573
|
+
message: "code_nav: source=clio does not provide mode=wiki; use context scope=docs for Clio documentation",
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
const loaded = await loadNavSource(source);
|
|
493
577
|
if (!loaded.ok) return { kind: "error", message: loaded.message };
|
|
494
|
-
const index = navIndexFor(loaded.codewiki);
|
|
578
|
+
const index = navIndexFor(loaded.loaded.codewiki);
|
|
495
579
|
const query = typeof args.query === "string" ? args.query.trim() : "";
|
|
496
580
|
const limit = parseLimit(args.limit, mode === "entries" ? DEFAULT_ENTRY_LIMIT : DEFAULT_LIMIT);
|
|
497
581
|
const reservation = reserveObservation(OBSERVE_SELF_CAPS.codeNav, options);
|
|
@@ -506,15 +590,17 @@ export const codeNavTool: ToolSpec = {
|
|
|
506
590
|
}
|
|
507
591
|
const close = (nav: NavPayload | ToolResult): ToolResult => {
|
|
508
592
|
if ("kind" in nav) return nav;
|
|
593
|
+
const next = source === "clio" && nav.next !== undefined ? `source=clio ${nav.next}` : nav.next;
|
|
594
|
+
const payload = next === nav.next ? nav.payload : { ...nav.payload, next };
|
|
509
595
|
return finalizeObservation({
|
|
510
596
|
tool: ToolNames.CodeNav,
|
|
511
597
|
unit: "results",
|
|
512
598
|
format: "json",
|
|
513
|
-
output: renderJson(
|
|
599
|
+
output: renderJson(payload),
|
|
514
600
|
shownCount: nav.shownCount,
|
|
515
601
|
totalCount: nav.totalCount,
|
|
516
602
|
truncated: nav.shownCount < nav.totalCount,
|
|
517
|
-
...(
|
|
603
|
+
...(next !== undefined ? { next } : {}),
|
|
518
604
|
reservation,
|
|
519
605
|
...(options ? { options } : {}),
|
|
520
606
|
});
|
|
@@ -527,7 +613,7 @@ export const codeNavTool: ToolSpec = {
|
|
|
527
613
|
if (query.length === 0) return { kind: "error", message: "code_nav: mode=path requires query" };
|
|
528
614
|
return close(runPath(index, query, limit));
|
|
529
615
|
}
|
|
530
|
-
if (mode === "entries") return close(runEntries(index, limit));
|
|
616
|
+
if (mode === "entries") return close(runEntries(index, limit, loaded.loaded.entryRoot));
|
|
531
617
|
if (mode === "outline") {
|
|
532
618
|
if (query.length === 0) return { kind: "error", message: "code_nav: mode=outline requires query path" };
|
|
533
619
|
return close(runOutline(index, query, limit));
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Scratch git worktrees for the compete dispatch topology.
|
|
3
3
|
*
|
|
4
4
|
* Each candidate builds in its own worktree on its own branch
|
|
5
|
-
* (`clio/compete/<group>/<n>`), created from the repository HEAD under
|
|
5
|
+
* (`clio-coder/compete/<group>/<n>`), created from the repository HEAD under
|
|
6
6
|
* `<root>/.clio-coder/worktrees/<group>/candidate-<n>`. The path sits inside the
|
|
7
7
|
* project root because remote fleet nodes share the filesystem and doctor
|
|
8
8
|
* preflight verifies path parity only for the project root; `.clio-coder/` is
|
|
@@ -127,8 +127,9 @@ export interface CompeteRunAdmission {
|
|
|
127
127
|
|
|
128
128
|
const COMPETE_PARENT_SEGMENTS = [".clio-coder", "worktrees"] as const;
|
|
129
129
|
const COMPETE_MANIFEST_FILE = ".clio-coder-compete-owner.json";
|
|
130
|
-
const COMPETE_MANIFEST_KIND = "clio-compete-group";
|
|
131
|
-
const
|
|
130
|
+
const COMPETE_MANIFEST_KIND = "clio-coder-compete-group";
|
|
131
|
+
const LEGACY_COMPETE_MANIFEST_KIND = "clio-compete-group";
|
|
132
|
+
const COMPETE_COMMIT_IDENTITY = "clio-coder-compete";
|
|
132
133
|
|
|
133
134
|
const SAFE_GROUP = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
|
|
134
135
|
const PROCESS_EXIT_GRACE_MS = 750;
|
|
@@ -324,7 +325,7 @@ function isCanonicalDirectoryAt(path: string): boolean {
|
|
|
324
325
|
* `relative()` makes the decision by path segment, so `/group-a2` can never
|
|
325
326
|
* be mistaken for a child of `/group-a` as it can with textual startsWith.
|
|
326
327
|
*/
|
|
327
|
-
|
|
328
|
+
function isCanonicalPathInside(parent: string, candidate: string): boolean {
|
|
328
329
|
return isCanonicalWorktreePathInside(parent, candidate);
|
|
329
330
|
}
|
|
330
331
|
|
|
@@ -333,7 +334,7 @@ function manifestFromUnknown(value: unknown): CompeteGroupManifest | null {
|
|
|
333
334
|
const manifest = value as Record<string, unknown>;
|
|
334
335
|
if (
|
|
335
336
|
manifest.version !== 2 ||
|
|
336
|
-
manifest.kind !== COMPETE_MANIFEST_KIND ||
|
|
337
|
+
(manifest.kind !== COMPETE_MANIFEST_KIND && manifest.kind !== LEGACY_COMPETE_MANIFEST_KIND) ||
|
|
337
338
|
typeof manifest.root !== "string" ||
|
|
338
339
|
typeof manifest.group !== "string" ||
|
|
339
340
|
typeof manifest.token !== "string" ||
|
|
@@ -417,10 +418,14 @@ export function isGitRepository(root: string): boolean {
|
|
|
417
418
|
}
|
|
418
419
|
}
|
|
419
420
|
|
|
420
|
-
function competeBranch(group: string, index: number): string {
|
|
421
|
+
function competeBranch(group: string, index: number, legacy = false): string {
|
|
421
422
|
validateGroup(group);
|
|
422
423
|
if (!Number.isInteger(index) || index < 1) throw new Error(`invalid compete candidate index ${index}`);
|
|
423
|
-
return
|
|
424
|
+
return `${legacy ? "clio" : "clio-coder"}/compete/${group}/${index}`;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
function competeBranchMatches(branch: string, group: string, index: number): boolean {
|
|
428
|
+
return branch === competeBranch(group, index) || branch === competeBranch(group, index, true);
|
|
424
429
|
}
|
|
425
430
|
|
|
426
431
|
/** Claim the group before creating a branch or candidate worktree. */
|
|
@@ -549,11 +554,7 @@ export function markCompeteGroupWinnerPreserved(
|
|
|
549
554
|
* baseline is a parameter rather than HEAD so every candidate in a compete
|
|
550
555
|
* transaction starts from the same approved state.
|
|
551
556
|
*/
|
|
552
|
-
|
|
553
|
-
ownership: CompeteGroupOwnership,
|
|
554
|
-
index: number,
|
|
555
|
-
baseline: string,
|
|
556
|
-
): CandidateWorktree {
|
|
557
|
+
function createCandidateWorktree(ownership: CompeteGroupOwnership, index: number, baseline: string): CandidateWorktree {
|
|
557
558
|
assertOwnership(ownership);
|
|
558
559
|
const branch = competeBranch(ownership.group, index);
|
|
559
560
|
const path = join(ownership.directory, `candidate-${index}`);
|
|
@@ -589,7 +590,7 @@ export async function createCandidateWorktreeMapped(
|
|
|
589
590
|
branch,
|
|
590
591
|
base: baseline,
|
|
591
592
|
path,
|
|
592
|
-
label: `clio compete ${ownership.group} candidate ${index}`,
|
|
593
|
+
label: `clio-coder compete ${ownership.group} candidate ${index}`,
|
|
593
594
|
focus: false,
|
|
594
595
|
})
|
|
595
596
|
.catch(() => null);
|
|
@@ -652,7 +653,7 @@ function exactGroupBranches(root: string, group: string): string[] {
|
|
|
652
653
|
const parts = branch.split("/");
|
|
653
654
|
return (
|
|
654
655
|
parts.length === 4 &&
|
|
655
|
-
parts[0] === "clio" &&
|
|
656
|
+
(parts[0] === "clio-coder" || parts[0] === "clio") &&
|
|
656
657
|
parts[1] === "compete" &&
|
|
657
658
|
parts[2] === group &&
|
|
658
659
|
/^\d+$/.test(parts[3] ?? "")
|
|
@@ -660,6 +661,16 @@ function exactGroupBranches(root: string, group: string): string[] {
|
|
|
660
661
|
});
|
|
661
662
|
}
|
|
662
663
|
|
|
664
|
+
/** Resolve a current candidate branch while retaining indefinite read support for released refs. */
|
|
665
|
+
export function competeBranchForCandidate(root: string, group: string, index: number): string {
|
|
666
|
+
const branches = exactGroupBranches(root, group);
|
|
667
|
+
return (
|
|
668
|
+
branches.find((branch) => branch === competeBranch(group, index)) ??
|
|
669
|
+
branches.find((branch) => branch === competeBranch(group, index, true)) ??
|
|
670
|
+
competeBranch(group, index)
|
|
671
|
+
);
|
|
672
|
+
}
|
|
673
|
+
|
|
663
674
|
function removeRegisteredWorktree(root: string, path: string): void {
|
|
664
675
|
try {
|
|
665
676
|
git(root, ["worktree", "remove", "--force", path]);
|
|
@@ -676,10 +687,9 @@ function removeCandidateWorktree(
|
|
|
676
687
|
): void {
|
|
677
688
|
assertOwnership(ownership);
|
|
678
689
|
const expectedPath = join(ownership.directory, `candidate-${worktree.index}`);
|
|
679
|
-
const expectedBranch = competeBranch(ownership.group, worktree.index);
|
|
680
690
|
if (
|
|
681
691
|
resolve(worktree.path) !== resolve(expectedPath) ||
|
|
682
|
-
worktree.branch
|
|
692
|
+
!competeBranchMatches(worktree.branch, ownership.group, worktree.index) ||
|
|
683
693
|
!isCanonicalPathInside(ownership.directory, worktree.path)
|
|
684
694
|
) {
|
|
685
695
|
throw new Error(`candidate ${worktree.index} does not belong to compete group ${ownership.group}`);
|
|
@@ -819,8 +829,8 @@ export function settleRecoveredCompeteDecision(
|
|
|
819
829
|
cleanupWorktreeGroup(ownership);
|
|
820
830
|
return null;
|
|
821
831
|
}
|
|
822
|
-
const winnerBranch = competeBranch(group, winnerIndex);
|
|
823
832
|
const branches = exactGroupBranches(ownership.root, group);
|
|
833
|
+
const winnerBranch = competeBranchForCandidate(ownership.root, group, winnerIndex);
|
|
824
834
|
const winnerPath = join(ownership.directory, `candidate-${winnerIndex}`);
|
|
825
835
|
if (
|
|
826
836
|
!branches.includes(winnerBranch) ||
|