@iowarp/clio-coder 0.4.3 → 0.4.4
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 +63 -0
- package/README.md +1 -1
- package/dist/{acp-H2NGRPWO.js → acp-WNAYYF4F.js} +4 -5
- package/dist/{agents-TL5LLUQP.js → agents-3OKXHLOI.js} +33 -31
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-E5SW4HMS.js → auth-VKNNMGPU.js} +10 -11
- package/dist/{builtins-IA7V7FUC.js → builtins-WGALA46I.js} +4 -4
- package/dist/{chunk-F5JHEYZM.js → chunk-23L32XTI.js} +10 -7
- package/dist/{chunk-DWUOQKRU.js → chunk-25QBEXRS.js} +2 -2
- package/dist/{chunk-LLDJM5XK.js → chunk-26QSH3EJ.js} +2 -2
- package/dist/{chunk-N2Z7HLVY.js → chunk-2ASED4PZ.js} +10 -10
- package/dist/{chunk-MCEPRMZW.js → chunk-2CU2H6KE.js} +2 -2
- package/dist/chunk-2DSOYNFC.js +108 -0
- package/dist/{chunk-LDJG7DW3.js → chunk-2ZSONWVL.js} +4 -4
- package/dist/{chunk-GI7YYQ3F.js → chunk-36CT5VVL.js} +324 -41
- package/dist/{chunk-4UVU7BJ5.js → chunk-3GY4F45V.js} +2 -2
- package/dist/{chunk-PUVDKJ2Y.js → chunk-3ODX73FK.js} +3 -5
- package/dist/{chunk-IUE3Y34X.js → chunk-3UNOLWNZ.js} +2 -2
- package/dist/{chunk-6PTFB5VS.js → chunk-3UUXNFEX.js} +8 -4
- package/dist/{chunk-2APPQIER.js → chunk-4M6Z5QVF.js} +4 -4
- package/dist/{chunk-K6BSR66V.js → chunk-4NSRCOYP.js} +4 -1
- package/dist/{chunk-JGRC33J2.js → chunk-54X7T7DK.js} +12 -3
- package/dist/{chunk-YQWYVTMC.js → chunk-5636DCO5.js} +4 -4
- package/dist/{chunk-7E7I3WLS.js → chunk-57XXR6DR.js} +23 -22
- package/dist/{chunk-7ZYNNDKC.js → chunk-5TUB6SLS.js} +2 -2
- package/dist/{chunk-VW6DOEDG.js → chunk-6OSVSQL5.js} +11 -2
- package/dist/{chunk-L47TF46W.js → chunk-6PAZTBPA.js} +14 -2
- package/dist/{chunk-XIVNBFZS.js → chunk-6Q3CYFD3.js} +34 -16
- package/dist/{chunk-RSJ25QSL.js → chunk-6QOTUPRG.js} +155 -36
- package/dist/{chunk-JKKCYP3C.js → chunk-6UINWWS6.js} +10 -4
- package/dist/{chunk-WBKFA554.js → chunk-72YIHOZQ.js} +2 -2
- package/dist/{chunk-PAJQJ7BS.js → chunk-75W7L2E2.js} +246 -697
- package/dist/{chunk-RRNP2ANY.js → chunk-7UGL4MB5.js} +4 -4
- package/dist/{chunk-EKCHAPYA.js → chunk-AUPNRN7C.js} +2 -2
- package/dist/{chunk-ZDN3Y73Y.js → chunk-BJVFZO5U.js} +6 -48
- package/dist/{chunk-IWT4SF4R.js → chunk-CUSRQKPU.js} +64 -2
- package/dist/{chunk-SKHCAU7K.js → chunk-DQOVN6KV.js} +3 -2
- package/dist/{chunk-ZWPRK62N.js → chunk-DT3LWJOB.js} +4 -4
- package/dist/chunk-DXKJURES.js +671 -0
- package/dist/{chunk-BEPZRGGU.js → chunk-EL24TAU4.js} +2 -2
- package/dist/{chunk-OML5D5V5.js → chunk-ELWDPP3Y.js} +5 -5
- package/dist/{chunk-NDINPTJ4.js → chunk-ELZVTCGV.js} +5 -4
- package/dist/chunk-EXLD33WO.js +381 -0
- package/dist/{chunk-IJNZMHLA.js → chunk-FEAXX7B6.js} +2 -2
- package/dist/{chunk-TM6LQDI3.js → chunk-FFUPXJC4.js} +74 -323
- package/dist/chunk-GX5WYQO4.js +59 -0
- package/dist/chunk-I2DWJ4GM.js +390 -0
- package/dist/{chunk-TXOTCRLG.js → chunk-I5FWO7L5.js} +5 -5
- package/dist/chunk-IRXAATOX.js +539 -0
- package/dist/chunk-IXIY2H4R.js +44 -0
- package/dist/{chunk-KK4JZPBQ.js → chunk-IZXGRF7P.js} +76 -10
- package/dist/{chunk-5TSRNF4G.js → chunk-JCI2ROMZ.js} +164 -6
- package/dist/{chunk-INY6HTFL.js → chunk-JEIYHLOR.js} +2 -2
- package/dist/{chunk-MUW2BDDH.js → chunk-JQLNNIKT.js} +2 -2
- package/dist/{chunk-XPWWI35G.js → chunk-JSD46VO2.js} +19 -8
- package/dist/{chunk-VA5FNYMT.js → chunk-JT2RFCC5.js} +39 -2
- package/dist/{chunk-V2ANDPVT.js → chunk-K6T2ZAMZ.js} +168 -6
- package/dist/{chunk-B4OAX3SI.js → chunk-KFV5L5SK.js} +13 -6
- package/dist/{chunk-JEQ3XTHC.js → chunk-LLXSDWXS.js} +2 -2
- package/dist/{chunk-E3TPLWFX.js → chunk-LTIKRKFL.js} +3 -3
- package/dist/{chunk-NIQJ66N4.js → chunk-N56KALIC.js} +17 -17
- package/dist/{chunk-JDAY6FIL.js → chunk-NAI6ZFCY.js} +13 -9
- package/dist/{chunk-AF4YM7Z4.js → chunk-NRO2BJRH.js} +2490 -2182
- package/dist/{chunk-WRBAGUNF.js → chunk-NXIMQY5W.js} +2 -2
- package/dist/{chunk-I7ZPNEJM.js → chunk-NXYCB2VD.js} +5 -5
- package/dist/chunk-ODGTEFFI.js +50 -0
- package/dist/{chunk-2VIKGWFZ.js → chunk-OEJSLEPW.js} +2 -2
- package/dist/{chunk-KKOJXO6R.js → chunk-OMQNJVKW.js} +4 -2
- package/dist/{chunk-54CBCGIR.js → chunk-Q4WO54TA.js} +132 -77
- package/dist/{chunk-B4VEBZKF.js → chunk-QUFRYSWI.js} +12 -6
- package/dist/{chunk-42FMPA75.js → chunk-QZWQA4DE.js} +2 -2
- package/dist/{chunk-HEQY7ZFI.js → chunk-RAY4OVGZ.js} +2 -2
- package/dist/{chunk-G76U63X4.js → chunk-RQCKCSRL.js} +7 -7
- package/dist/{chunk-64I3JVYM.js → chunk-RXTN6AKH.js} +2 -2
- package/dist/{chunk-UPZU6GE4.js → chunk-RZDWV63N.js} +3 -3
- package/dist/{chunk-2UH2KFUP.js → chunk-S6PYF2XF.js} +2 -2
- package/dist/{chunk-JSC3U7TI.js → chunk-TOIVGRUX.js} +2 -2
- package/dist/{chunk-7DRAWPTZ.js → chunk-TQAHXW6Y.js} +1 -1
- package/dist/{chunk-JIEGK6UF.js → chunk-U6TMQNSI.js} +48 -4
- package/dist/{chunk-AX2THNSA.js → chunk-UEPWCCTY.js} +4 -4
- package/dist/{chunk-QWGDJJYJ.js → chunk-USR47QNF.js} +4 -4
- package/dist/{chunk-Y3CBHOR6.js → chunk-V6HJFQZE.js} +2 -2
- package/dist/chunk-V76WTFTW.js +318 -0
- package/dist/{chunk-NMJXSHBJ.js → chunk-W54I7H25.js} +2 -2
- package/dist/{chunk-2UG5F4C5.js → chunk-XULDXHTN.js} +24 -12
- package/dist/chunk-XXYSBZIQ.js +283 -0
- package/dist/{chunk-MWUZBSAQ.js → chunk-Y55JBDO5.js} +331 -51
- package/dist/{chunk-W6RRQCPQ.js → chunk-YD5GIKET.js} +4 -4
- package/dist/{chunk-CE5AX47J.js → chunk-YECAMM3D.js} +2 -2
- package/dist/{chunk-WCXUNS7U.js → chunk-YNFKXPEC.js} +6 -6
- package/dist/cli/index.js +36 -35
- package/dist/{clio-CMMK4KRR.js → clio-QLICPCF5.js} +2 -2
- package/dist/{code-nav-MDZNQS33.js → code-nav-IJR2DBPR.js} +6 -6
- package/dist/{components-UCUQ4QXW.js → components-2TGAI2RC.js} +3 -4
- package/dist/{config-SVM5P5YI.js → config-IUA6OYNS.js} +52 -47
- package/dist/{configure-LE3IK2TJ.js → configure-VEPX4NMX.js} +14 -15
- package/dist/{context-VNCR7KAG.js → context-2DKHWH2T.js} +23 -23
- package/dist/{context-2OHRKS42.js → context-4MPR7WKB.js} +48 -42
- package/dist/{context-E3VC7RX5.js → context-BOYF5EJM.js} +11 -11
- package/dist/{context-clear-BW4O37TG.js → context-clear-S4ZJCQUX.js} +48 -42
- package/dist/{context-working-set-VDS25HXZ.js → context-working-set-3I3FYX6Y.js} +8 -8
- package/dist/detail-A7JAVSIG.js +98 -0
- package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-RJ5I2F2O.js} +71 -58
- package/dist/{docs-PD3EXDKU.js → docs-SPOV3BAN.js} +3 -5
- package/dist/{doctor-WNNVO6FY.js → doctor-DKICC2SN.js} +54 -31
- package/dist/{eval-7G7SGAYO.js → eval-OQOQUDHK.js} +47 -56
- package/dist/{evidence-VD6736FQ.js → evidence-4DQ25GUQ.js} +53 -150
- package/dist/evidence-4F5USFKH.js +208 -0
- package/dist/{evolve-AL3NGVRL.js → evolve-GSS52E5J.js} +44 -41
- package/dist/{extensions-MOVJ32NM.js → extensions-G7MFLYHT.js} +4 -5
- package/dist/{fleet-QZHUMAGI.js → fleet-Q37YHHAQ.js} +74 -68
- package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-G7E4N7SM.js} +14 -11
- package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-O7M6QBA2.js} +6 -6
- package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-TOUBW6OW.js} +13 -13
- package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-SW33JJNI.js} +43 -39
- package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-CV2655TW.js} +2 -3
- package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-KESZX2YH.js} +16 -16
- package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-UQPMTVE3.js} +42 -38
- package/dist/{fleet-view-SWBR3VGQ.js → fleet-view-MN2VG4MR.js} +43 -39
- package/dist/{init-J477LKZH.js → init-PXEXQSBF.js} +60 -54
- package/dist/{interop-3FCM6XLG.js → interop-ZG5T62U3.js} +6 -7
- package/dist/inventory-C26CFDRR.js +101 -0
- package/dist/{library-QUQEIUG6.js → library-B2W4N74O.js} +16 -17
- package/dist/{memory-SGGSEP65.js → memory-YCANYS5A.js} +45 -42
- package/dist/{models-HEKUAXXK.js → models-GERTU3YI.js} +20 -22
- package/dist/{monitor-HKU57TYQ.js → monitor-CPNIUULB.js} +50 -44
- package/dist/{orchestrator-VDFAEFAI.js → orchestrator-J4BSH4WQ.js} +491 -1182
- package/dist/{panes-DN2SSFOH.js → panes-BOHAEGYC.js} +3 -3
- package/dist/{panes-TALGNPZT.js → panes-NXSLDQZ2.js} +5 -6
- package/dist/{paths-NBMFAIEZ.js → paths-VSUWNC22.js} +3 -4
- package/dist/{reset-EAJFFJVB.js → reset-TNWTB5LU.js} +5 -6
- package/dist/{resources-OVKSEFVE.js → resources-4PXNMD5G.js} +14 -14
- package/dist/{run-7DP7ZF2J.js → run-D6XJ34CN.js} +79 -83
- package/dist/{share-WML67FT3.js → share-2NWMJJEE.js} +14 -15
- package/dist/{skills-SG662R2K.js → skills-KR7WON5G.js} +18 -19
- package/dist/{skills-eval-VVZEUU46.js → skills-eval-O2ZNOLDS.js} +49 -46
- package/dist/{skills-inventory-I2E23GET.js → skills-inventory-ZZOUBK7O.js} +14 -14
- package/dist/{slash-commands-S7MBJDQK.js → slash-commands-ZXPJD64J.js} +32 -23
- package/dist/{steer-2LQOMCPB.js → steer-XA25PSCS.js} +3 -3
- package/dist/{support-CC2UJBJ6.js → support-7EMVWYG2.js} +2 -2
- package/dist/{targets-4QC3HIEW.js → targets-OMH2XCSN.js} +25 -27
- package/dist/tasks-IPAGMEIX.js +36 -0
- package/dist/{terminal-lease-TUHIJ6Y2.js → terminal-lease-C2J3JYRE.js} +4 -4
- package/dist/{tools-TFGJICCU.js → tools-EFFEAIDP.js} +5 -6
- package/dist/{uninstall-5PEVOE5B.js → uninstall-HALS6BLF.js} +7 -8
- package/dist/{upgrade-M4WXY6KN.js → upgrade-MS72RJEP.js} +14 -11
- package/dist/{usage-N7ZNVLEM.js → usage-NHG6MCJM.js} +60 -51
- package/dist/{verifiers-DJTP4XX6.js → verifiers-7AUNVXDY.js} +150 -17
- package/dist/{verify-RWE4PPEK.js → verify-FWYGPKMR.js} +12 -10
- package/dist/{web-fetch-MPARV2K7.js → web-fetch-V4FKSDAV.js} +4 -4
- package/dist/{wiki-generate-C7IQOXSP.js → wiki-generate-743CIGJW.js} +63 -56
- package/dist/{with-panes-4GCGSL7J.js → with-panes-BDQEWBRT.js} +2 -2
- package/dist/worker/entry.js +36 -33
- package/docs/README.md +3 -2
- package/docs/architecture/acp.md +17 -0
- package/docs/architecture/artifact-versions.md +1 -1
- package/docs/architecture/dispatch-typed-intent.md +1 -1
- package/docs/architecture/evidence-and-memory.md +1 -1
- package/docs/architecture/observability.md +7 -1
- package/docs/architecture/prompt-envelope-and-tools.md +15 -5
- package/docs/architecture/safety-model.md +10 -17
- package/docs/architecture/tui-design.md +1 -1
- package/docs/guide/built-in-agents.md +8 -8
- package/docs/guide/commands-and-modes.md +17 -2
- package/docs/guide/configuration-and-targets.md +3 -1
- package/docs/guide/configuration-reference.md +10 -5
- package/docs/guide/environment-variables.md +2 -2
- package/docs/guide/tool-usage.md +78 -3
- package/docs/history/config-knobs-audit.md +2 -2
- package/docs/process/development-pipeline.md +6 -1
- package/docs/process/git-commit-provenance.md +15 -0
- package/docs/process/release-cut-checklist.md +207 -0
- package/docs/process/scientific-validation.md +18 -17
- package/evals/behavioral-machinery-support.ts +1 -0
- package/evals/behavioral-machinery.yaml +1 -1
- package/package.json +1 -1
- package/skills/coding/coding-standards/SKILL.md +14 -4
- package/skills/context/context-handoff/SKILL.md +3 -3
- package/skills/context/context-prime/SKILL.md +3 -3
- package/skills/planning/architecture/SKILL.md +5 -5
- package/skills/planning/backlog/SKILL.md +4 -4
- package/skills/planning/prd/SKILL.md +4 -3
- package/skills/planning/product-intent/SKILL.md +8 -8
- package/skills/planning/tech-spec/SKILL.md +4 -4
- package/skills/registry.yaml +32 -32
- package/skills/research/arxiv-literature/SKILL.md +3 -3
- package/skills/research/experiment-protocol/SKILL.md +3 -3
- package/skills/research/scientific-debugging/SKILL.md +3 -2
- package/skills/research/scientific-modernization/SKILL.md +3 -3
- package/skills/skill-marketplace.json +16 -16
- package/skills/workflow/cut-it/SKILL.md +3 -4
- package/skills/workflow/design-council/SKILL.md +5 -10
- package/skills/workflow/grill-me/SKILL.md +14 -15
- package/skills/workflow/workflow-distiller/SKILL.md +4 -4
- package/src/cli/args.ts +0 -8
- package/src/cli/configure.ts +2 -1
- package/src/cli/doctor-state-size.ts +1 -12
- package/src/cli/doctor-validation-contract.ts +28 -0
- package/src/cli/doctor.ts +5 -0
- package/src/cli/evidence-detail.ts +1 -75
- package/src/cli/evidence-inventory.ts +1 -167
- package/src/cli/index.ts +2 -0
- package/src/cli/run.ts +0 -2
- package/src/cli/targets.ts +1 -1
- package/src/cli/tasks.ts +84 -0
- package/src/cli/upgrade.ts +10 -5
- package/src/cli/usage.ts +6 -0
- package/src/cli/verifiers.ts +147 -1
- package/src/cli/wiki-generate.ts +1 -0
- package/src/core/commit-attribution.ts +41 -1
- package/src/core/git-commit-attribution.ts +46 -3
- package/src/core/run-overrides.ts +0 -5
- package/src/core/skill-activation.ts +3 -0
- package/src/core/tool-names.ts +5 -2
- package/src/domains/agents/builtins/architect.md +1 -1
- package/src/domains/agents/builtins/coder.md +1 -1
- package/src/domains/agents/builtins/documenter.md +1 -1
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/provenance.md +7 -7
- package/src/domains/agents/builtins/tester.md +1 -1
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +4 -3
- package/src/domains/context/extension.ts +31 -7
- package/src/domains/context/refresh.ts +3 -0
- package/src/domains/context/wiki/frontmatter.ts +5 -2
- package/src/domains/context/wiki/generate.ts +6 -0
- package/src/domains/context/wiki/prompts.ts +43 -0
- package/src/domains/dispatch/active-route-planner.ts +4 -0
- package/src/domains/dispatch/code-step.ts +11 -4
- package/src/domains/dispatch/contract.ts +31 -7
- package/src/domains/dispatch/execution-scheduler.ts +2 -0
- package/src/domains/dispatch/extension.ts +50 -27
- package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/host-verification.ts +114 -13
- package/src/domains/dispatch/intent.ts +28 -18
- package/src/domains/dispatch/orphan-recovery.ts +2 -0
- package/src/domains/dispatch/receipt-integrity.ts +4 -0
- package/src/domains/dispatch/reservation-store.ts +5 -3
- package/src/domains/dispatch/state.ts +15 -2
- package/src/domains/dispatch/types.ts +17 -2
- package/src/domains/eval/runners/clio-run.ts +12 -9
- package/src/domains/eval/runners/context-index.ts +2 -7
- package/src/domains/eval/runners/context-init.ts +3 -6
- package/src/domains/eval/runners/external-command.ts +29 -11
- package/src/domains/evidence/build.ts +102 -15
- package/src/domains/evidence/detail.ts +69 -0
- package/src/domains/evidence/eval.ts +13 -1
- package/src/domains/evidence/finish-contract-map.ts +5 -1
- package/src/domains/evidence/inventory.ts +167 -0
- package/src/domains/evidence/store.ts +16 -0
- package/src/domains/evidence/types.ts +12 -0
- package/src/domains/extensions/resources.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +20 -1
- package/src/domains/middleware/runtime.ts +7 -3
- package/src/domains/mux/detect.ts +3 -6
- package/src/domains/observability/accountability.ts +15 -1
- package/src/domains/observability/contract.ts +52 -7
- package/src/domains/observability/evidence-index.ts +10 -0
- package/src/domains/observability/extension.ts +9 -5
- package/src/domains/observability/projection.ts +394 -45
- package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
- package/src/domains/prompts/fragments/operating/contract.md +2 -0
- package/src/domains/prompts/fragments/wiki/page.md +8 -0
- package/src/domains/providers/model-discovery.ts +1 -4
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
- package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
- package/src/domains/providers/support.ts +1 -1
- package/src/domains/providers/types/runtime-descriptor.ts +1 -1
- package/src/domains/safety/action-classifier.ts +7 -0
- package/src/domains/safety/default-path-policy.ts +2 -0
- package/src/domains/safety/finish-contract-registration.ts +29 -14
- package/src/domains/safety/finish-contract.ts +252 -40
- package/src/domains/safety/index.ts +20 -1
- package/src/domains/safety/policy-engine.ts +26 -6
- package/src/domains/safety/rigor.ts +53 -39
- package/src/domains/safety/validation-contract.ts +388 -0
- package/src/domains/session/archive-readers.ts +10 -1
- package/src/domains/session/decision-board.ts +101 -2
- package/src/domains/session/entries.ts +44 -7
- package/src/domains/session/extension.ts +4 -4
- package/src/domains/session/handoff.ts +2 -1
- package/src/domains/session/manager.ts +2 -3
- package/src/domains/session/task-board.ts +14 -1
- package/src/domains/session/tree/fork.ts +1 -2
- package/src/domains/session/tree/navigator.ts +1 -1
- package/src/domains/user-tasks/acceptance.ts +56 -0
- package/src/domains/user-tasks/active-acceptance.ts +40 -0
- package/src/domains/user-tasks/store.ts +34 -3
- package/src/engine/acp/adapter.ts +24 -6
- package/src/engine/acp/server.ts +21 -4
- package/src/engine/acp/transport.ts +53 -8
- package/src/engine/acp/types.ts +4 -0
- package/src/engine/apis/ollama-native.ts +15 -0
- package/src/engine/claude/subprocess-runtime.ts +107 -60
- package/src/engine/external-subprocess.ts +12 -4
- package/src/entry/orchestrator.ts +11 -2
- package/src/interactive/dispatch-board.ts +46 -717
- package/src/interactive/fleet-run-preview.ts +2 -1
- package/src/interactive/interactive-application.ts +3 -2
- package/src/interactive/interactive-presentation.ts +55 -12
- package/src/interactive/interactive-slash-runtime.ts +2 -1
- package/src/interactive/oracle.ts +5 -2
- package/src/interactive/overlays/fleet-run-approval.ts +3 -2
- package/src/interactive/overlays/message-picker.ts +2 -2
- package/src/interactive/overlays/settings.ts +2 -2
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/renderers/branch-summary.ts +1 -1
- package/src/interactive/slash-autocomplete.ts +4 -6
- package/src/interactive/slash-commands.ts +25 -39
- package/src/interactive/slash-spec.ts +28 -0
- package/src/interactive/view/artifacts.ts +2 -0
- package/src/interactive/worker-stream.ts +7 -3
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +31 -0
- package/src/tools/compete-worktrees.ts +7 -1
- package/src/tools/core-bootstrap.ts +16 -0
- package/src/tools/decide.ts +136 -0
- package/src/tools/dispatch-admission.ts +21 -0
- package/src/tools/dispatch-plan.ts +5 -2
- package/src/tools/dispatch-runner.ts +15 -1
- package/src/tools/dispatch-types.ts +6 -0
- package/src/tools/evidence.ts +96 -0
- package/src/tools/limitation.ts +76 -0
- package/src/tools/policy.ts +9 -0
- package/src/tools/presentation.ts +3 -0
- package/src/tools/registry.ts +1 -1
- package/src/tools/result-shaping.ts +17 -5
- package/src/tools/task-worktree.ts +13 -3
- package/src/tools/tasks.ts +10 -1
- package/src/tools/verify/authoring.ts +170 -83
- package/src/tools/verify/catalog.ts +122 -5
- package/src/tools/verify/index.ts +2 -1
- package/src/tools/verify/numeric.ts +298 -0
- package/src/tools/verify/perf.ts +143 -0
- package/src/tools/verify/scripts.ts +229 -2
- package/dist/chunk-7DICMOS6.js +0 -313
- package/dist/chunk-RVG5JXAL.js +0 -41
- package/dist/chunk-T56WDKA5.js +0 -183
- package/dist/chunk-VPKWYKEY.js +0 -169
|
@@ -1,78 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Fixed machine-readable projection of one evidence bundle's trust record.
|
|
3
|
-
*
|
|
4
|
-
* `evidence inspect <id>` prints an operator record that quotes the task text,
|
|
5
|
-
* the bundle's file list, and per-finding prose. This is the same bundle read
|
|
6
|
-
* down to the one thing a GUI can carry safely and usefully: which runs the
|
|
7
|
-
* bundle covers, what verdict each run earned, and which axis produced it.
|
|
8
|
-
*
|
|
9
|
-
* Every value here comes from a closed vocabulary. The axis names, the axis
|
|
10
|
-
* states, and the verdicts are all enumerations the harness owns, so there is
|
|
11
|
-
* no free-form text on this surface at all, which is what lets it answer the
|
|
12
|
-
* question the inventory raises without reopening the boundary the inventory
|
|
13
|
-
* closed.
|
|
14
|
-
*
|
|
15
|
-
* Unlike the other fixed reads this one takes an identifier, because an
|
|
16
|
-
* operator names the bundle. The GUI host may only pass back an id it served
|
|
17
|
-
* inside its current bounded window; see `apps/workbench/artifact-allowlist.ts`.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import { clioDataDir } from "../core/xdg.js";
|
|
21
|
-
import {
|
|
22
|
-
inspectEvidence,
|
|
23
|
-
TRUST_STATUS_AXES,
|
|
24
|
-
type TrustStatusAxis,
|
|
25
|
-
type TrustVerdict,
|
|
26
|
-
trustVerdict,
|
|
27
|
-
} from "../domains/evidence/index.js";
|
|
28
|
-
|
|
29
|
-
export const EVIDENCE_DETAIL_MAX_RUNS = 16;
|
|
30
|
-
|
|
31
|
-
export interface EvidenceDetailRun {
|
|
32
|
-
readonly runId: string;
|
|
33
|
-
readonly verdict: TrustVerdict;
|
|
34
|
-
/** Every axis, always all six, so an absent axis is stated rather than missing. */
|
|
35
|
-
readonly axes: Readonly<Record<TrustStatusAxis, string>>;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface EvidenceDetailSnapshot {
|
|
39
|
-
readonly version: 1;
|
|
40
|
-
readonly generatedAt: string;
|
|
41
|
-
readonly evidenceId: string;
|
|
42
|
-
readonly sourceKind: "run" | "session" | "eval";
|
|
43
|
-
/** False when the bundle predates the canonical trust projection. */
|
|
44
|
-
readonly canonical: boolean;
|
|
45
|
-
readonly runs: readonly EvidenceDetailRun[];
|
|
46
|
-
readonly runsTruncated: boolean;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async function evidenceDetailSnapshot(
|
|
50
|
-
evidenceId: string,
|
|
51
|
-
now: () => number = Date.now,
|
|
52
|
-
dataDir: string = clioDataDir(),
|
|
53
|
-
): Promise<EvidenceDetailSnapshot> {
|
|
54
|
-
const inspected = await inspectEvidence(dataDir, evidenceId);
|
|
55
|
-
const all = inspected.trustStatus.runs;
|
|
56
|
-
const window = all.slice(0, EVIDENCE_DETAIL_MAX_RUNS);
|
|
57
|
-
return {
|
|
58
|
-
version: 1,
|
|
59
|
-
generatedAt: new Date(now()).toISOString(),
|
|
60
|
-
evidenceId: inspected.overview.evidenceId,
|
|
61
|
-
sourceKind: inspected.overview.source.kind,
|
|
62
|
-
canonical: inspected.trustStatus.projection === "canonical",
|
|
63
|
-
runs: window.map(
|
|
64
|
-
(run): EvidenceDetailRun => ({
|
|
65
|
-
runId: run.runId,
|
|
66
|
-
verdict: trustVerdict(run.status),
|
|
67
|
-
axes: Object.fromEntries(TRUST_STATUS_AXES.map((axis) => [axis, run.status[axis].state])) as Record<
|
|
68
|
-
TrustStatusAxis,
|
|
69
|
-
string
|
|
70
|
-
>,
|
|
71
|
-
}),
|
|
72
|
-
),
|
|
73
|
-
runsTruncated: all.length > window.length,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
1
|
+
import { evidenceDetailSnapshot } from "../domains/evidence/detail.js";
|
|
76
2
|
|
|
77
3
|
/**
|
|
78
4
|
* `clio-coder evidence inspect <id> --json`.
|
|
@@ -1,170 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Fixed machine-readable projection of recent evidence artifacts.
|
|
3
|
-
*
|
|
4
|
-
* `evidence list` is an operator table and `evidence inspect <id>` needs an id,
|
|
5
|
-
* so neither is a transport a GUI host can invoke blind. This command accepts
|
|
6
|
-
* no identifier, path, or limit, selects a bounded newest-first window itself,
|
|
7
|
-
* and emits provenance, tags, totals, and a trust verdict.
|
|
8
|
-
*
|
|
9
|
-
* An overview carries the working directories the runs executed in, the task
|
|
10
|
-
* text the operator typed, and the file names inside the bundle. None of that
|
|
11
|
-
* appears here. What does is the shape of the artifact and how far it can be
|
|
12
|
-
* trusted, which is what an operator picks a bundle by.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { clioDataDir } from "../core/xdg.js";
|
|
16
|
-
import {
|
|
17
|
-
EVIDENCE_TAGS,
|
|
18
|
-
type EvidenceOverview,
|
|
19
|
-
type EvidenceTag,
|
|
20
|
-
listEvidenceOverviews,
|
|
21
|
-
loadEvidenceTrustStatus,
|
|
22
|
-
type TrustVerdict,
|
|
23
|
-
trustVerdict,
|
|
24
|
-
} from "../domains/evidence/index.js";
|
|
25
|
-
import { sanitizeCallTargetText } from "../domains/safety/call-target.js";
|
|
26
|
-
import { truncateToWidth } from "../engine/tui-primitives.js";
|
|
27
|
-
|
|
28
|
-
export const EVIDENCE_INVENTORY_MAX_ARTIFACTS = 12;
|
|
29
|
-
export const EVIDENCE_INVENTORY_MAX_IDS = 8;
|
|
30
|
-
|
|
31
|
-
const IDENTITY_WIDTH = 128;
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Worst verdict first.
|
|
35
|
-
*
|
|
36
|
-
* An artifact covering several runs is only as trustworthy as its weakest run,
|
|
37
|
-
* so the fold takes the worst rather than the newest or the most common. A
|
|
38
|
-
* `compromised` run inside an otherwise clean bundle is the fact the operator
|
|
39
|
-
* needs, and averaging it away would be the one summary worth not printing.
|
|
40
|
-
*/
|
|
41
|
-
const VERDICT_SEVERITY: ReadonlyArray<TrustVerdict> = ["compromised", "unverified", "unknown", "grounded", "reviewed"];
|
|
42
|
-
|
|
43
|
-
export interface EvidenceInventoryArtifact {
|
|
44
|
-
readonly evidenceId: string;
|
|
45
|
-
readonly sourceKind: "run" | "session" | "eval";
|
|
46
|
-
readonly generatedAt: string;
|
|
47
|
-
readonly startedAt: string | null;
|
|
48
|
-
readonly endedAt: string | null;
|
|
49
|
-
readonly runIds: readonly string[];
|
|
50
|
-
readonly runIdsTruncated: boolean;
|
|
51
|
-
readonly agentIds: readonly string[];
|
|
52
|
-
readonly statuses: readonly string[];
|
|
53
|
-
readonly tags: readonly EvidenceTag[];
|
|
54
|
-
readonly totals: Readonly<{
|
|
55
|
-
runs: number;
|
|
56
|
-
receipts: number;
|
|
57
|
-
toolCalls: number;
|
|
58
|
-
toolErrors: number;
|
|
59
|
-
blockedToolCalls: number;
|
|
60
|
-
protectedArtifacts: number;
|
|
61
|
-
tokens: number;
|
|
62
|
-
costUsd: number;
|
|
63
|
-
wallTimeMs: number;
|
|
64
|
-
}>;
|
|
65
|
-
/** Secret-shaped values the builder replaced across the bundle's exports. */
|
|
66
|
-
readonly redactionCount: number;
|
|
67
|
-
readonly trust: Readonly<{
|
|
68
|
-
verdict: TrustVerdict;
|
|
69
|
-
/** Runs whose canonical trust status the bundle actually recorded. */
|
|
70
|
-
runsCovered: number;
|
|
71
|
-
/** True when the bundle predates the canonical trust projection. */
|
|
72
|
-
historical: boolean;
|
|
73
|
-
}>;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export interface EvidenceInventorySnapshot {
|
|
77
|
-
readonly version: 1;
|
|
78
|
-
readonly generatedAt: string;
|
|
79
|
-
readonly artifacts: readonly EvidenceInventoryArtifact[];
|
|
80
|
-
readonly truncated: boolean;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function bounded(value: string, width: number): string {
|
|
84
|
-
const sanitized = sanitizeCallTargetText(value);
|
|
85
|
-
if (sanitized.length === 0) return "unavailable";
|
|
86
|
-
return sanitizeCallTargetText(truncateToWidth(sanitized, width, "…", false));
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/** Distinct, sanitized, bounded, in first-seen order. */
|
|
90
|
-
function identities(values: ReadonlyArray<string>): string[] {
|
|
91
|
-
const seen: string[] = [];
|
|
92
|
-
for (const value of values) {
|
|
93
|
-
const text = bounded(value, IDENTITY_WIDTH);
|
|
94
|
-
if (!seen.includes(text)) seen.push(text);
|
|
95
|
-
if (seen.length >= EVIDENCE_INVENTORY_MAX_IDS) break;
|
|
96
|
-
}
|
|
97
|
-
return seen;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
function tally(value: number | undefined): number {
|
|
101
|
-
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.trunc(value) : 0;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
function amount(value: number | undefined): number {
|
|
105
|
-
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/** Newest generation first. An unparseable stamp sorts oldest rather than throwing. */
|
|
109
|
-
function byNewest(a: EvidenceOverview, b: EvidenceOverview): number {
|
|
110
|
-
return (Date.parse(b.generatedAt) || 0) - (Date.parse(a.generatedAt) || 0);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
async function evidenceInventorySnapshot(
|
|
114
|
-
now: () => number = Date.now,
|
|
115
|
-
dataDir: string = clioDataDir(),
|
|
116
|
-
): Promise<EvidenceInventorySnapshot> {
|
|
117
|
-
const all = (await listEvidenceOverviews(dataDir)).sort(byNewest);
|
|
118
|
-
const window = all.slice(0, EVIDENCE_INVENTORY_MAX_ARTIFACTS);
|
|
119
|
-
const artifacts: EvidenceInventoryArtifact[] = [];
|
|
120
|
-
for (const overview of window) {
|
|
121
|
-
// One unreadable trust file costs that artifact its verdict, never the
|
|
122
|
-
// whole inventory: the bundle itself is still the thing being listed.
|
|
123
|
-
let verdict: TrustVerdict = "unknown";
|
|
124
|
-
let runsCovered = 0;
|
|
125
|
-
let historical = true;
|
|
126
|
-
try {
|
|
127
|
-
const status = await loadEvidenceTrustStatus(dataDir, overview.evidenceId);
|
|
128
|
-
historical = status.projection !== "canonical";
|
|
129
|
-
runsCovered = status.runs.length;
|
|
130
|
-
const verdicts = status.runs.map((run) => trustVerdict(run.status));
|
|
131
|
-
verdict = VERDICT_SEVERITY.find((candidate) => verdicts.includes(candidate)) ?? "unknown";
|
|
132
|
-
} catch {
|
|
133
|
-
verdict = "unknown";
|
|
134
|
-
}
|
|
135
|
-
artifacts.push({
|
|
136
|
-
evidenceId: bounded(overview.evidenceId, IDENTITY_WIDTH),
|
|
137
|
-
sourceKind: overview.source.kind,
|
|
138
|
-
generatedAt: overview.generatedAt,
|
|
139
|
-
startedAt: overview.startedAt,
|
|
140
|
-
endedAt: overview.endedAt,
|
|
141
|
-
runIds: identities(overview.runIds),
|
|
142
|
-
runIdsTruncated: overview.runIds.length > EVIDENCE_INVENTORY_MAX_IDS,
|
|
143
|
-
agentIds: identities(overview.agentIds),
|
|
144
|
-
statuses: identities(overview.statuses),
|
|
145
|
-
tags: overview.tags.filter((tag) => EVIDENCE_TAGS.includes(tag)),
|
|
146
|
-
totals: {
|
|
147
|
-
runs: tally(overview.totals.runs),
|
|
148
|
-
receipts: tally(overview.totals.receipts),
|
|
149
|
-
toolCalls: tally(overview.totals.toolCalls),
|
|
150
|
-
toolErrors: tally(overview.totals.toolErrors),
|
|
151
|
-
blockedToolCalls: tally(overview.totals.blockedToolCalls),
|
|
152
|
-
protectedArtifacts: tally(overview.totals.protectedArtifacts),
|
|
153
|
-
tokens: tally(overview.totals.tokens),
|
|
154
|
-
costUsd: amount(overview.totals.costUsd),
|
|
155
|
-
wallTimeMs: tally(overview.totals.wallTimeMs),
|
|
156
|
-
},
|
|
157
|
-
redactionCount: tally(overview.redactionCount),
|
|
158
|
-
trust: { verdict, runsCovered, historical },
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
return {
|
|
162
|
-
version: 1,
|
|
163
|
-
generatedAt: new Date(now()).toISOString(),
|
|
164
|
-
artifacts,
|
|
165
|
-
truncated: all.length > window.length,
|
|
166
|
-
};
|
|
167
|
-
}
|
|
1
|
+
import { evidenceInventorySnapshot } from "../domains/evidence/inventory.js";
|
|
168
2
|
|
|
169
3
|
/**
|
|
170
4
|
* `clio-coder evidence inventory --json`, and nothing else.
|
package/src/cli/index.ts
CHANGED
|
@@ -71,6 +71,7 @@ Usage:
|
|
|
71
71
|
clio-coder extensions install, list, enable, disable, or remove extension packages
|
|
72
72
|
clio-coder skills list, inspect, validate, or install skills
|
|
73
73
|
clio-coder library list, search, add, or sync agents, prompts, fleets, and skills from catalogs
|
|
74
|
+
clio-coder tasks list, add, hand, finish, or drop project operator tasks
|
|
74
75
|
clio-coder verifiers discover, inspect, author, validate, edit, or dry-run project checks
|
|
75
76
|
clio-coder tools list|status|install|remove <id> pinned external programs Clio can drive
|
|
76
77
|
clio-coder interop inspect --json detected external coding agents and how far each one is wired
|
|
@@ -259,6 +260,7 @@ const COMMAND_HANDLERS = new Map<string, CommandHandler>([
|
|
|
259
260
|
["fleet", async (subArgs) => (await import("./fleet.js")).runFleetCommand(subArgs)],
|
|
260
261
|
["skills", async (subArgs) => (await import("./skills.js")).runSkillsCommand(subArgs)],
|
|
261
262
|
["library", async (subArgs) => (await import("./library.js")).runLibraryCommand(subArgs)],
|
|
263
|
+
["tasks", async (subArgs) => (await import("./tasks.js")).runTasksCommand(subArgs)],
|
|
262
264
|
["verifiers", async (subArgs) => (await import("./verifiers.js")).runVerifiersCommand(subArgs)],
|
|
263
265
|
["docs", async (subArgs) => (await import("./docs.js")).runDocsCommand(subArgs)],
|
|
264
266
|
["share", async (subArgs) => (await import("./share.js")).runShareCommand(subArgs)],
|
package/src/cli/run.ts
CHANGED
|
@@ -62,7 +62,6 @@ Flags:
|
|
|
62
62
|
--frequency-penalty <N> one-run frequency penalty override
|
|
63
63
|
--repeat-penalty <N> one-run repeat penalty override
|
|
64
64
|
--max-context-tokens <N> one-run context-window override for supported local runtimes
|
|
65
|
-
--kv-cache-mode <mode> one-run KV-cache mode override: f16|f32|none|false|q8_0|q4_0|q4_1|iq4_nl|q5_0|q5_1
|
|
66
65
|
--json stream JSONL events for the main-agent path; dispatch streams events and receipt JSON
|
|
67
66
|
--json-events <mode> main-agent JSON stream mode: full|terminal; implies --json
|
|
68
67
|
--steer-channel <path> read live steering lines from a FIFO or appended regular file
|
|
@@ -213,7 +212,6 @@ export async function runClioRun(
|
|
|
213
212
|
return withRunOverrides(
|
|
214
213
|
{
|
|
215
214
|
...(parsed.maxContextTokens !== undefined ? { maxContextTokens: parsed.maxContextTokens } : {}),
|
|
216
|
-
...(parsed.kvCacheMode !== undefined ? { kvCacheMode: parsed.kvCacheMode } : {}),
|
|
217
215
|
},
|
|
218
216
|
async () => {
|
|
219
217
|
if (parsed.help) {
|
package/src/cli/targets.ts
CHANGED
|
@@ -1003,7 +1003,7 @@ function formatUrl(status: TargetStatus): string {
|
|
|
1003
1003
|
|
|
1004
1004
|
function formatAuth(providers: ProvidersContract, status: TargetStatus): string {
|
|
1005
1005
|
if (!status.runtime) return "-";
|
|
1006
|
-
if (status.runtime.externalAgentLoop !== undefined) return "operator session";
|
|
1006
|
+
if (status.runtime.externalAgentLoop !== undefined && status.runtime.auth !== "claude-cli") return "operator session";
|
|
1007
1007
|
if (status.runtime.auth !== "api-key" && status.runtime.auth !== "oauth") return status.runtime.auth;
|
|
1008
1008
|
const auth = providers.auth.statusForTarget(status.target, status.runtime);
|
|
1009
1009
|
if (!auth.available) return "disconnected";
|
package/src/cli/tasks.ts
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { normalizeIntentExpectedOutputs, normalizeIntentVerification } from "../domains/dispatch/intent.js";
|
|
2
|
+
import type { UserTaskAcceptance } from "../domains/user-tasks/acceptance.js";
|
|
3
|
+
import { createUserTasksStore } from "../domains/user-tasks/store.js";
|
|
4
|
+
import { packageDeclaredCheck } from "../tools/verify/catalog.js";
|
|
5
|
+
import { discoverDeclaredChecksAtRoot, discoverDeclaredProjectEntriesAtRoot } from "../tools/verify/scripts.js";
|
|
6
|
+
import { printError } from "./argv.js";
|
|
7
|
+
|
|
8
|
+
/** Operator flags use the same bounds and normalization as dispatch intent. */
|
|
9
|
+
export function acceptanceFromTaskFlags(
|
|
10
|
+
cwd: string,
|
|
11
|
+
expectedOutputs: string[],
|
|
12
|
+
verify: string[],
|
|
13
|
+
): UserTaskAcceptance | undefined {
|
|
14
|
+
if (expectedOutputs.length === 0 && verify.length === 0) return undefined;
|
|
15
|
+
const discovery = discoverDeclaredChecksAtRoot(cwd, undefined);
|
|
16
|
+
if (!discovery.ok) throw new Error(discovery.reason);
|
|
17
|
+
const checks = new Map(
|
|
18
|
+
discovery.sources.flatMap((source) => source.checks.map((check) => [check.id, check] as const)),
|
|
19
|
+
);
|
|
20
|
+
for (const entry of discoverDeclaredProjectEntriesAtRoot(cwd)) {
|
|
21
|
+
if (entry.kind === "package-script" && !checks.has(entry.id))
|
|
22
|
+
checks.set(entry.id, packageDeclaredCheck(entry.id, entry.path, ".", []));
|
|
23
|
+
}
|
|
24
|
+
const verification = verify.map((value) => {
|
|
25
|
+
const suffix = checks.has(value) ? null : /^(.*):([0-9]+)$/.exec(value);
|
|
26
|
+
const check = suffix?.[1] ?? value;
|
|
27
|
+
if (!checks.has(check))
|
|
28
|
+
throw new Error(
|
|
29
|
+
`Unknown verification check '${check}'. Known ids: ${[...checks.keys()].sort().join(", ") || "(none)"}`,
|
|
30
|
+
);
|
|
31
|
+
return { check, ...(suffix ? { timeout_ms: Number(suffix[2]) } : {}) };
|
|
32
|
+
});
|
|
33
|
+
const outputs = normalizeIntentExpectedOutputs(expectedOutputs);
|
|
34
|
+
if (!Array.isArray(outputs)) throw new Error(outputs.ok ? "invalid expected outputs" : outputs.message);
|
|
35
|
+
const normalized = normalizeIntentVerification(verification, checks);
|
|
36
|
+
if (!Array.isArray(normalized)) throw new Error(normalized.ok ? "invalid verification" : normalized.message);
|
|
37
|
+
return { expectedOutputs: outputs, verification: normalized };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const HELP = `Usage:
|
|
41
|
+
clio-coder tasks [list]
|
|
42
|
+
clio-coder tasks add [--expect <path>] [--verify <checkId>[:timeoutMs]] <text>
|
|
43
|
+
clio-coder tasks hand|done|drop <uN>
|
|
44
|
+
|
|
45
|
+
--expect and --verify are repeatable. Check ids must be declared in package.json or .clio-coder/verifiers.yaml.`;
|
|
46
|
+
|
|
47
|
+
export function runTasksCommand(args: string[]): number {
|
|
48
|
+
try {
|
|
49
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
50
|
+
console.log(HELP);
|
|
51
|
+
return 0;
|
|
52
|
+
}
|
|
53
|
+
const store = createUserTasksStore({ cwd: process.cwd() });
|
|
54
|
+
const [action = "list", ...rest] = args;
|
|
55
|
+
if (action === "add") {
|
|
56
|
+
const expected: string[] = [],
|
|
57
|
+
verify: string[] = [],
|
|
58
|
+
title: string[] = [];
|
|
59
|
+
for (let index = 0; index < rest.length; index++) {
|
|
60
|
+
const token = rest[index] ?? "";
|
|
61
|
+
if (token === "--") {
|
|
62
|
+
title.push(...rest.slice(index + 1));
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
if (token === "--expect" || token === "--verify") {
|
|
66
|
+
const value = rest[++index];
|
|
67
|
+
if (!value || value.startsWith("--")) throw new Error(`${token} requires a value`);
|
|
68
|
+
(token === "--expect" ? expected : verify).push(value);
|
|
69
|
+
} else if (token.startsWith("--")) throw new Error(`Unknown flag ${token}`);
|
|
70
|
+
else title.push(token);
|
|
71
|
+
}
|
|
72
|
+
const task = store.add(title.join(" "), undefined, acceptanceFromTaskFlags(process.cwd(), expected, verify));
|
|
73
|
+
console.log(`logged operator task ${task.id}: ${task.title}`);
|
|
74
|
+
} else if (action === "list" && rest.length === 0) {
|
|
75
|
+
console.log(JSON.stringify(store.snapshot(), null, 2));
|
|
76
|
+
} else if ((action === "hand" || action === "done" || action === "drop") && rest.length === 1) {
|
|
77
|
+
console.log(JSON.stringify(store[action](rest[0] ?? ""), null, 2));
|
|
78
|
+
} else throw new Error(HELP);
|
|
79
|
+
return 0;
|
|
80
|
+
} catch (error) {
|
|
81
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
82
|
+
return 1;
|
|
83
|
+
}
|
|
84
|
+
}
|
package/src/cli/upgrade.ts
CHANGED
|
@@ -88,12 +88,17 @@ type RegistryLookup =
|
|
|
88
88
|
| { asked: false; reason: "source checkout" | "network checks are disabled" }
|
|
89
89
|
| { asked: true; version: string | null };
|
|
90
90
|
|
|
91
|
+
function testSeam(name: string): string | undefined {
|
|
92
|
+
if (process.env.NODE_ENV !== "test") return undefined;
|
|
93
|
+
return process.env[name];
|
|
94
|
+
}
|
|
95
|
+
|
|
91
96
|
async function lookUpAvailableVersion(
|
|
92
97
|
channel: Channel,
|
|
93
98
|
method: "source" | "npm",
|
|
94
99
|
noNetwork: boolean,
|
|
95
100
|
): Promise<RegistryLookup> {
|
|
96
|
-
const seam =
|
|
101
|
+
const seam = testSeam("CLIO_CODER_TEST_UPGRADE_AVAILABLE");
|
|
97
102
|
// `unreachable` stands in for a registry that answered nothing, which is the
|
|
98
103
|
// only way to reach that branch without a network in the test.
|
|
99
104
|
if (seam) return { asked: true, version: seam === "unreachable" ? null : seam };
|
|
@@ -143,14 +148,14 @@ async function runChild(command: string, args: ReadonlyArray<string>, label: str
|
|
|
143
148
|
}
|
|
144
149
|
|
|
145
150
|
async function runNpmInstall(channel: Channel): Promise<void> {
|
|
146
|
-
if (
|
|
151
|
+
if (testSeam("CLIO_CODER_TEST_UPGRADE_FAIL") === "npm") {
|
|
147
152
|
throw new Error("npm ERR! 404 Not Found (mock failure)");
|
|
148
153
|
}
|
|
149
154
|
await runChild("npm", ["install", "-g", `@iowarp/clio-coder@${channel}`], "npm install");
|
|
150
155
|
}
|
|
151
156
|
|
|
152
157
|
async function runDoctorFixAfterInstall(): Promise<void> {
|
|
153
|
-
if (
|
|
158
|
+
if (testSeam("CLIO_CODER_TEST_UPGRADE_FAIL") === "doctor") {
|
|
154
159
|
throw new Error("mock doctor fix failure");
|
|
155
160
|
}
|
|
156
161
|
await runChild("clio-coder", ["doctor", "--fix"], "clio-coder doctor --fix");
|
|
@@ -184,7 +189,7 @@ export async function runUpgradeCommand(argv: ReadonlyArray<string>): Promise<nu
|
|
|
184
189
|
const methodLabel = method === "source" ? "source checkout" : "npm global";
|
|
185
190
|
presenter.setMethod(methodLabel);
|
|
186
191
|
|
|
187
|
-
const noNetwork = Boolean(
|
|
192
|
+
const noNetwork = Boolean(testSeam("CLIO_CODER_TEST_UPGRADE_NO_NETWORK"));
|
|
188
193
|
const lookup = await lookUpAvailableVersion(opts.channel, method, noNetwork);
|
|
189
194
|
const availableVersion = lookup.asked ? lookup.version : null;
|
|
190
195
|
|
|
@@ -285,7 +290,7 @@ export async function runUpgradeCommand(argv: ReadonlyArray<string>): Promise<nu
|
|
|
285
290
|
} else {
|
|
286
291
|
let result: Awaited<ReturnType<typeof runPending>>;
|
|
287
292
|
try {
|
|
288
|
-
if (
|
|
293
|
+
if (testSeam("CLIO_CODER_TEST_UPGRADE_FAIL") === "migration") {
|
|
289
294
|
throw new Error("mock migration failure in 2026-09-01-settings-v2");
|
|
290
295
|
}
|
|
291
296
|
result = await runPending(stateDir);
|
package/src/cli/usage.ts
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
} from "../core/response-model-id.js";
|
|
9
9
|
import { clioDataDir, clioStateDir } from "../core/xdg.js";
|
|
10
10
|
import { loadMemoryRecordsSync, type MemoryRecord } from "../domains/memory/index.js";
|
|
11
|
+
import { summarizeEvidenceIndex } from "../domains/observability/accountability.js";
|
|
11
12
|
import { summarizeFailedCompactionUsage } from "../domains/observability/compaction-usage.js";
|
|
12
13
|
import { readEvidenceIndex } from "../domains/observability/evidence-index.js";
|
|
13
14
|
import { type OutOfTurnUsageRow, readOutOfTurnUsageRows } from "../domains/observability/out-of-turn-usage.js";
|
|
@@ -358,6 +359,7 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
|
|
|
358
359
|
return decision === "blocked" || decision === "denied";
|
|
359
360
|
});
|
|
360
361
|
const evidenceRows = readEvidenceIndex(stateDir).filter((row) => inWindow(row.generatedAt, windowStart, now));
|
|
362
|
+
const accountability = summarizeEvidenceIndex(evidenceRows);
|
|
361
363
|
let memoryRecords: MemoryRecord[] = [];
|
|
362
364
|
try {
|
|
363
365
|
memoryRecords = loadMemoryRecordsSync(clioDataDir());
|
|
@@ -559,6 +561,8 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
|
|
|
559
561
|
else emit({ kind: "fact", fact: "session-store-missing", path: presence.sessionsPath });
|
|
560
562
|
if (presence.receiptsPresent) emit({ kind: "fact", fact: "dispatch-runs", value: receipts.length });
|
|
561
563
|
else emit({ kind: "fact", fact: "receipt-store-missing", path: presence.receiptsPath });
|
|
564
|
+
emit({ kind: "fact", fact: "unverified-successes", value: accountability.unverifiedSuccesses });
|
|
565
|
+
emit({ kind: "fact", fact: "ungrounded-claims", value: accountability.ungroundedClaims });
|
|
562
566
|
emit({ kind: "fact", fact: "audit-tool-calls", value: auditToolCalls.length, blocked: auditBlocked.length });
|
|
563
567
|
if (usageMeasurable) {
|
|
564
568
|
// The origin split is emitted only when something out of turn was
|
|
@@ -806,6 +810,8 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
|
|
|
806
810
|
),
|
|
807
811
|
);
|
|
808
812
|
}
|
|
813
|
+
out(` unverified successes: ${accountability.unverifiedSuccesses}`);
|
|
814
|
+
out(` ungrounded claims: ${accountability.ungroundedClaims}`);
|
|
809
815
|
if (tagCounts.size > 0) {
|
|
810
816
|
out("");
|
|
811
817
|
out(" failure tags (from evidence index)");
|