@iowarp/clio-coder 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +233 -373
- package/CONTRIBUTING.md +23 -23
- package/README.md +284 -613
- package/dist/{acp-FPR54DGL.js → acp-P2AQILE2.js} +43 -53
- package/dist/{agents-OGPIHPJH.js → agents-72W3BI7I.js} +43 -26
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-IC3K6NIZ.js → auth-5TWEIYDN.js} +20 -12
- package/dist/chunk-2DJ2KNFG.js +2095 -0
- package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
- package/dist/chunk-2SFS6XQE.js +122 -0
- package/dist/{chunk-PV4JUBVJ.js → chunk-2TLUCQVG.js} +40 -21
- package/dist/chunk-2VTFPG5O.js +48 -0
- package/dist/chunk-4BJ5BYCE.js +61 -0
- package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
- package/dist/chunk-4VP4KH3K.js +962 -0
- package/dist/chunk-4XUGQOHA.js +797 -0
- package/dist/chunk-4ZG3XFUR.js +77 -0
- package/dist/chunk-5B2AEOW5.js +5407 -0
- package/dist/{chunk-K2ITRMHZ.js → chunk-5TSRNF4G.js} +6 -138
- package/dist/{chunk-4QKXUHSR.js → chunk-5UFT4SUX.js} +70 -20
- package/dist/{chunk-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
- package/dist/chunk-65DEGPJ6.js +52 -0
- package/dist/chunk-6EJMN2Y3.js +17 -0
- package/dist/chunk-6N5PTWMY.js +136 -0
- package/dist/chunk-6SGHMWE3.js +277 -0
- package/dist/chunk-6XLNIQDB.js +27 -0
- package/dist/chunk-7CR24IG7.js +242 -0
- package/dist/chunk-7MNJORFF.js +22 -0
- package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
- package/dist/chunk-AGYYIBLL.js +1069 -0
- package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
- package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
- package/dist/chunk-CBCAPZAA.js +229 -0
- package/dist/chunk-CMZWFGD2.js +352 -0
- package/dist/chunk-COU2UHX6.js +400 -0
- package/dist/chunk-DSELYM6W.js +1077 -0
- package/dist/chunk-DUYJ5IO6.js +644 -0
- package/dist/chunk-ECH6PKUQ.js +39 -0
- package/dist/chunk-ED4KHGC3.js +143 -0
- package/dist/chunk-EKMEHE4H.js +340 -0
- package/dist/chunk-FCSXB6T2.js +338 -0
- package/dist/chunk-FJ3H4MN5.js +48 -0
- package/dist/{chunk-RPTR2H26.js → chunk-FNTMWMX5.js} +21 -15
- package/dist/chunk-FQ4SKYE4.js +29 -0
- package/dist/chunk-G4BMMOKF.js +182 -0
- package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
- package/dist/chunk-HC4CLZ2Y.js +68 -0
- package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
- package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
- package/dist/chunk-I4HZDVNP.js +73 -0
- package/dist/chunk-IKCO5N3L.js +162 -0
- package/dist/chunk-IR4CFBFN.js +56 -0
- package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
- package/dist/chunk-J7CWMCQD.js +255 -0
- package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
- package/dist/chunk-KZWTDYJF.js +217 -0
- package/dist/chunk-LBMZMYH2.js +285 -0
- package/dist/{chunk-G34LV2PF.js → chunk-LM5TQCJZ.js} +84 -170
- package/dist/chunk-LW6DSM3M.js +5135 -0
- package/dist/chunk-LWLEKMDQ.js +3482 -0
- package/dist/{chunk-H6F6BYOH.js → chunk-LZSJBIVT.js} +7003 -7434
- package/dist/{chunk-HQQID6OA.js → chunk-M6SHUN7Q.js} +5 -5
- package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
- package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
- package/dist/chunk-OAO4GE4M.js +619 -0
- package/dist/{chunk-Q3RUPKEJ.js → chunk-OC7FIQPC.js} +58 -189
- package/dist/chunk-OKGUZO2U.js +34 -0
- package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
- package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
- package/dist/chunk-OQE5J4C6.js +73 -0
- package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
- package/dist/{chunk-MAR7Y6HW.js → chunk-PAJK6MAQ.js} +23 -16
- package/dist/{chunk-M5T5VO65.js → chunk-PIWWS5BL.js} +837 -635
- package/dist/chunk-POHLU5DW.js +1186 -0
- package/dist/chunk-QKMUKYO7.js +4961 -0
- package/dist/chunk-SRDMMSEP.js +16405 -0
- package/dist/chunk-SST6Z5JA.js +80 -0
- package/dist/chunk-STBPMHSX.js +2456 -0
- package/dist/chunk-T6YILFSB.js +80 -0
- package/dist/chunk-TZK7PACC.js +174 -0
- package/dist/chunk-TZTZS7QK.js +227 -0
- package/dist/{chunk-ASND7OZK.js → chunk-UFIIWP2H.js} +13 -13
- package/dist/chunk-UOV2BYIW.js +107 -0
- package/dist/{chunk-PFEFKVGL.js → chunk-V6RTAOC2.js} +13 -11
- package/dist/chunk-VAKQQHWR.js +434 -0
- package/dist/chunk-VG7TBQIY.js +128 -0
- package/dist/chunk-VJWL6YS5.js +244 -0
- package/dist/{chunk-EYOKLTMF.js → chunk-VPAYEGVX.js} +17 -3
- package/dist/chunk-WEH5XRJQ.js +32 -0
- package/dist/chunk-X4RCMKVQ.js +641 -0
- package/dist/{chunk-TEKV33Q5.js → chunk-X6IAEBZR.js} +65 -33
- package/dist/chunk-XBXAASKX.js +18 -0
- package/dist/chunk-XN3L4EYL.js +46 -0
- package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
- package/dist/chunk-YHZX5GEU.js +193 -0
- package/dist/chunk-YXLYO42X.js +91 -0
- package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
- package/dist/chunk-ZI647VB5.js +37 -0
- package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
- package/dist/chunk-ZWMF7253.js +1882 -0
- package/dist/cli/index.js +62 -54
- package/dist/clio-JOU4FXVA.js +25 -0
- package/dist/code-nav-7AX6FYE6.js +600 -0
- package/dist/codewiki/build-worker.js +66 -0
- package/dist/compile-cache-CVJMMODC.js +18 -0
- package/dist/{components-DMAOEKFB.js → components-KELWS457.js} +11 -6
- package/dist/{config-IRUQ7SE4.js → config-XCDVKR23.js} +92 -55
- package/dist/configure-4GAP54ZW.js +42 -0
- package/dist/{context-5RADCKTR.js → context-4UOGGLQ5.js} +71 -35
- package/dist/context-5VKGUVJJ.js +866 -0
- package/dist/{context-3KWFLHJG.js → context-77FM5DV5.js} +15 -13
- package/dist/{context-clear-7TSNPAAI.js → context-clear-XXJRLCJJ.js} +54 -28
- package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
- package/dist/dispatch-runner-QPRDDBDX.js +1997 -0
- package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
- package/dist/{doctor-UC5NAJYQ.js → doctor-HR46URBJ.js} +27 -17
- package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
- package/dist/{evidence-YEGUW4L3.js → evidence-6HG2PY2B.js} +46 -26
- package/dist/{evolve-TXARCTPG.js → evolve-K7YU3NCY.js} +45 -25
- package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
- package/dist/{fleet-6G3DHNYE.js → fleet-VY3HHKN6.js} +163 -54
- package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
- package/dist/{init-KZ5QTF6M.js → init-JYGXI3FK.js} +69 -32
- package/dist/{memory-73ESV5YC.js → memory-WFZMGYHX.js} +48 -27
- package/dist/{models-A4PVNWJK.js → models-I5QWSEOM.js} +39 -25
- package/dist/monitor-GE4ID3IA.js +661 -0
- package/dist/{chunk-FCIH3BIZ.js → orchestrator-EM5MC3HM.js} +15979 -12407
- package/dist/{paths-C4H6IV77.js → paths-UXLN5YYZ.js} +10 -5
- package/dist/{preload-6WVMHX3A.js → preload-P6DGH2PZ.js} +2 -2
- package/dist/{reset-BGW6OGMV.js → reset-L2FQEE3E.js} +16 -10
- package/dist/{run-YTPEYQOH.js → run-ZU3QMZPZ.js} +101 -61
- package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
- package/dist/{skills-2V6RA3OQ.js → skills-X5VXCRNQ.js} +34 -14
- package/dist/{skills-eval-S2TVJO4F.js → skills-eval-WKIHWTHR.js} +70 -34
- package/dist/steer-GGWFUJUD.js +77 -0
- package/dist/{targets-TYXLPB23.js → targets-SNCPI2NR.js} +43 -27
- package/dist/terminal-lease-BNAHVHBS.js +395 -0
- package/dist/{trace-GGOJ6Q6Z.js → trace-PNCASAXC.js} +41 -16
- package/dist/{chunk-N6F52NLF.js → tree-sitter-HGKH6LG4.js} +28 -2306
- package/dist/{uninstall-LLLT4F4W.js → uninstall-FZCQCDKC.js} +10 -5
- package/dist/{upgrade-33G2LMM5.js → upgrade-JQHHPQ4K.js} +45 -25
- package/dist/{usage-ZAFSXKKG.js → usage-OR4O5SMZ.js} +62 -31
- package/dist/verify-375KUB3Y.js +716 -0
- package/dist/web-fetch-2YHJ3KTG.js +638 -0
- package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-UEXP2ARI.js} +74 -34
- package/dist/worker/entry.js +221 -36
- package/dist/workspace-G4ZWUIPR.js +22 -0
- package/docs/README.md +22 -17
- package/docs/acp.md +168 -16
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +136 -7
- package/docs/artifact-versions.md +1 -1
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +1 -1
- package/docs/commands-and-modes.md +114 -71
- package/docs/config-knobs-audit.md +1 -3
- package/docs/configuration-and-targets.md +174 -46
- package/docs/context-engine.md +29 -6
- package/docs/development-pipeline.md +26 -1
- package/docs/dispatch-architecture-rationale.md +1 -1
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +13 -5
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +6 -2
- package/docs/evolution.md +2 -2
- package/docs/exit-codes-and-output.md +15 -9
- package/docs/extensions-and-sharing.md +9 -9
- package/docs/fleet-dispatch.md +7 -5
- package/docs/git-commit-provenance.md +120 -0
- package/docs/glossary.md +1 -1
- package/docs/installation-and-lifecycle.md +34 -27
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +45 -14
- package/docs/observability.md +8 -5
- package/docs/performance-methodology.md +491 -0
- package/docs/pi-boundary.md +72 -0
- package/docs/proactive-memory.md +3 -3
- package/docs/prompt-envelope-and-tools.md +24 -3
- package/docs/provider-adapter-cookbook.md +57 -4
- package/docs/release-cut-checklist.md +129 -115
- package/docs/safety-model.md +9 -5
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +55 -12
- package/docs/skills-marketplace.md +12 -8
- package/docs/time-conventions.md +1 -1
- package/docs/tool-usage.md +3 -3
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +10 -7
- package/docs/tui-design.md +47 -10
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/package.json +19 -22
- package/skills/coding/ast-grep/SKILL.md +136 -0
- package/skills/coding/ast-grep/evals.md +56 -0
- package/skills/coding/ast-grep/references/rule_reference.md +297 -0
- package/skills/coding/coding-standards/SKILL.md +113 -0
- package/skills/coding/coding-standards/evals.md +34 -0
- package/skills/coding/prototype/SKILL.md +86 -0
- package/skills/coding/prototype/evals.md +42 -0
- package/skills/coding/prototype/references/LOGIC.md +67 -0
- package/skills/coding/prototype/references/UI.md +112 -0
- package/skills/coding/tdd/SKILL.md +101 -0
- package/skills/coding/tdd/evals.md +41 -0
- package/skills/coding/tdd/references/mocking.md +59 -0
- package/skills/coding/tdd/references/tests.md +77 -0
- package/skills/context/context-handoff/SKILL.md +126 -0
- package/skills/context/context-handoff/evals.md +57 -0
- package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
- package/skills/context/context-prime/SKILL.md +95 -0
- package/skills/context/context-prime/evals.md +54 -0
- package/skills/meta/clio-dev/SKILL.md +91 -0
- package/skills/meta/clio-dev/evals.md +45 -0
- package/skills/meta/clio-test/SKILL.md +130 -0
- package/skills/meta/clio-test/evals.md +43 -0
- package/skills/meta/clio-test/references/harness.md +97 -0
- package/skills/meta/clio-test/references/test-map.md +59 -0
- package/skills/meta/credentials/SKILL.md +125 -0
- package/skills/meta/credentials/evals.md +104 -0
- package/skills/meta/find-skills/SKILL.md +72 -0
- package/skills/meta/find-skills/evals.md +47 -0
- package/skills/meta/herdr/SKILL.md +127 -0
- package/skills/meta/herdr/evals.md +38 -0
- package/skills/meta/skill-craft/SKILL.md +102 -0
- package/skills/meta/skill-craft/evals.md +41 -0
- package/skills/planning/architecture/SKILL.md +129 -0
- package/skills/planning/architecture/evals.md +36 -0
- package/skills/planning/backlog/SKILL.md +90 -0
- package/skills/planning/backlog/evals.md +43 -0
- package/skills/planning/prd/SKILL.md +82 -0
- package/skills/planning/prd/evals.md +49 -0
- package/skills/planning/product-intent/SKILL.md +112 -0
- package/skills/planning/product-intent/evals.md +36 -0
- package/skills/planning/tech-spec/SKILL.md +115 -0
- package/skills/planning/tech-spec/evals.md +47 -0
- package/skills/registry.yaml +136 -0
- package/skills/research/arxiv-literature/SKILL.md +104 -0
- package/skills/research/arxiv-literature/evals.md +58 -0
- package/skills/research/experiment-protocol/SKILL.md +122 -0
- package/skills/research/experiment-protocol/evals.md +91 -0
- package/skills/research/scientific-debugging/SKILL.md +119 -0
- package/skills/research/scientific-debugging/evals.md +138 -0
- package/skills/research/scientific-modernization/SKILL.md +138 -0
- package/skills/research/scientific-modernization/evals.md +84 -0
- package/skills/workflow/design-council/SKILL.md +139 -0
- package/skills/workflow/design-council/evals.md +97 -0
- package/skills/workflow/grill-me/SKILL.md +186 -0
- package/skills/workflow/grill-me/evals.md +78 -0
- package/skills/workflow/workflow-distiller/SKILL.md +136 -0
- package/skills/workflow/workflow-distiller/evals.md +107 -0
- package/src/cli/acp.ts +31 -4
- package/src/cli/clio.ts +68 -6
- package/src/cli/config-inspect.ts +28 -22
- package/src/cli/configure.ts +47 -9
- package/src/cli/context-clear.ts +2 -2
- package/src/cli/context-index.ts +21 -23
- package/src/cli/context.ts +13 -8
- package/src/cli/default-target.ts +9 -17
- package/src/cli/docs.ts +11 -5
- package/src/cli/evidence.ts +4 -1
- package/src/cli/extensions.ts +10 -1
- package/src/cli/fleet.ts +47 -6
- package/src/cli/index.ts +55 -26
- package/src/cli/memory.ts +3 -1
- package/src/cli/models.ts +1 -1
- package/src/cli/modes/json-stream.ts +37 -1
- package/src/cli/modes/print.ts +24 -9
- package/src/cli/run.ts +2 -2
- package/src/cli/skills-eval.ts +23 -8
- package/src/cli/skills.ts +19 -4
- package/src/cli/targets.ts +4 -0
- package/src/cli/text-layout.ts +15 -5
- package/src/cli/trace.ts +62 -14
- package/src/cli/upgrade.ts +18 -2
- package/src/cli/usage.ts +10 -3
- package/src/cli/wiki-generate.ts +2 -1
- package/src/core/agent-environment.ts +7 -0
- package/src/core/bash-exec.ts +72 -1
- package/src/core/boot-trace.ts +9 -4
- package/src/core/bus-events.ts +20 -4
- package/src/core/commit-attribution.ts +157 -0
- package/src/core/compile-cache.ts +159 -0
- package/src/core/config.ts +131 -2
- package/src/core/defaults.ts +39 -5
- package/src/core/domain-loader.ts +12 -5
- package/src/core/git-commit-attribution.ts +387 -0
- package/src/core/incomplete-installation.ts +45 -0
- package/src/core/response-schema.ts +1 -1
- package/src/core/safe-exec.ts +13 -1
- package/src/core/settings-layers.ts +155 -21
- package/src/core/skill-activation.ts +1 -1
- package/src/core/startup-timer.ts +3 -3
- package/src/core/state-file-lock.ts +13 -1
- package/src/core/termination.ts +78 -5
- package/src/domains/config/classify.ts +15 -3
- package/src/domains/config/extension.ts +19 -13
- package/src/domains/config/index.ts +10 -0
- package/src/domains/config/keybindings.ts +45 -9
- package/src/domains/context/bootstrap-prompt.ts +1 -1
- package/src/domains/context/bootstrap.ts +111 -18
- package/src/domains/context/clear.ts +16 -11
- package/src/domains/context/clio-md.ts +111 -9
- package/src/domains/context/codewiki/artifact.ts +400 -0
- package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
- package/src/domains/context/codewiki/build-worker.ts +54 -0
- package/src/domains/context/codewiki/coordinator.ts +182 -0
- package/src/domains/context/codewiki/indexer.ts +59 -144
- package/src/domains/context/codewiki/paths.ts +67 -0
- package/src/domains/context/codewiki/schema.ts +80 -0
- package/src/domains/context/codewiki/tree-sitter.ts +1 -1
- package/src/domains/context/contract.ts +11 -5
- package/src/domains/context/extension.ts +94 -143
- package/src/domains/context/fingerprint.ts +3 -1
- package/src/domains/context/index.ts +12 -22
- package/src/domains/context/project-metadata.ts +19 -0
- package/src/domains/context/prompt-context.ts +9 -10
- package/src/domains/context/refresh.ts +29 -21
- package/src/domains/context/runtime.ts +17 -0
- package/src/domains/context/wiki/generate.ts +39 -34
- package/src/domains/context/wiki/plan.ts +1 -1
- package/src/domains/context/wiki/prompts.ts +21 -8
- package/src/domains/dispatch/code-step.ts +20 -1
- package/src/domains/dispatch/extension.ts +158 -21
- package/src/domains/dispatch/failure-classification.ts +6 -0
- package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
- package/src/domains/dispatch/orphan-recovery.ts +50 -8
- package/src/domains/dispatch/receipt-integrity.ts +5 -0
- package/src/domains/dispatch/state.ts +31 -6
- package/src/domains/dispatch/transport.ts +2 -1
- package/src/domains/dispatch/types.ts +14 -0
- package/src/domains/dispatch/worker-spawn.ts +21 -2
- package/src/domains/eval/metrics/context.ts +1 -1
- package/src/domains/eval/types.ts +0 -1
- package/src/domains/evidence/build.ts +41 -1
- package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
- package/src/domains/lifecycle/migrations/index.ts +24 -4
- package/src/domains/middleware/hooks-io.ts +12 -0
- package/src/domains/middleware/skills-reminder.ts +30 -15
- package/src/domains/prompts/compiler.ts +142 -84
- package/src/domains/prompts/contract.ts +18 -2
- package/src/domains/prompts/extension.ts +39 -7
- package/src/domains/prompts/fragment-loader.ts +0 -1
- package/src/domains/prompts/fragments/identity/clio.md +2 -4
- package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
- package/src/domains/prompts/fragments/identity/self-awareness.md +1 -45
- package/src/domains/prompts/fragments/operating/contract.md +4 -50
- package/src/domains/prompts/fragments/operating/delegation.md +42 -0
- package/src/domains/prompts/fragments/operating/skills.md +26 -0
- package/src/domains/prompts/fragments/operating/worker.md +16 -0
- package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
- package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
- package/src/domains/prompts/fragments/safety/read-only.md +4 -4
- package/src/domains/prompts/fragments/safety/suggest.md +2 -2
- package/src/domains/prompts/fragments/wiki/page.md +10 -0
- package/src/domains/prompts/fragments/wiki/plan.md +10 -0
- package/src/domains/prompts/preload.ts +3 -3
- package/src/domains/providers/auth/api-key.ts +1 -1
- package/src/domains/providers/auth/backend-file.ts +20 -10
- package/src/domains/providers/auth/backend-memory.ts +59 -4
- package/src/domains/providers/auth/boot-status.ts +65 -0
- package/src/domains/providers/auth/oauth.ts +2 -1
- package/src/domains/providers/auth/storage.ts +97 -38
- package/src/domains/providers/capabilities.ts +12 -4
- package/src/domains/providers/contract.ts +15 -4
- package/src/domains/providers/extension.ts +18 -6
- package/src/domains/providers/model-runtime-capabilities.ts +15 -4
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +118 -35
- package/src/domains/providers/plugins.ts +5 -3
- package/src/domains/providers/probe/fingerprint.ts +25 -5
- package/src/domains/providers/registry.ts +31 -10
- package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -2
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +6 -7
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
- package/src/domains/providers/support.ts +6 -3
- package/src/domains/providers/types/local-model-quirks.ts +7 -9
- package/src/domains/providers/types/runtime-descriptor.ts +12 -1
- package/src/domains/providers/types/target-descriptor.ts +22 -0
- package/src/domains/resources/contract.ts +0 -1
- package/src/domains/resources/extension.ts +1 -3
- package/src/domains/resources/loader.ts +3 -4
- package/src/domains/resources/prompts/loader.ts +16 -2
- package/src/domains/resources/prompts/substitute.ts +1 -65
- package/src/domains/resources/skills/content-hash.ts +2 -0
- package/src/domains/resources/skills/install.ts +17 -0
- package/src/domains/resources/skills/loader.ts +17 -10
- package/src/domains/resources/skills/marketplace.ts +55 -9
- package/src/domains/safety/action-classifier.ts +4 -2
- package/src/domains/safety/audit.ts +8 -2
- package/src/domains/safety/extension.ts +1 -1
- package/src/domains/session/compaction/branch-summary.ts +3 -2
- package/src/domains/session/compaction/cut-point.ts +2 -1
- package/src/domains/session/compaction/tokens.ts +2 -1
- package/src/domains/session/context-ledger.ts +14 -0
- package/src/domains/session/contract.ts +15 -0
- package/src/domains/session/decision-board.ts +190 -0
- package/src/domains/session/entries.ts +66 -3
- package/src/domains/session/extension.ts +93 -12
- package/src/domains/session/retry.ts +10 -18
- package/src/domains/session/session-artifacts.ts +107 -0
- package/src/domains/session/task-board.ts +207 -13
- package/src/domains/session/tree/active-path.ts +44 -5
- package/src/domains/session/tree/fork.ts +26 -27
- package/src/domains/session/tree/preview.ts +2 -2
- package/src/domains/session/workspace/git-probe.ts +17 -11
- package/src/domains/user-tasks/store.ts +297 -0
- package/src/engine/acp/errors.ts +96 -0
- package/src/engine/acp/server.ts +1728 -146
- package/src/engine/acp/transport.ts +135 -14
- package/src/engine/acp/types.ts +26 -0
- package/src/engine/agent.ts +3 -3
- package/src/engine/ai.ts +32 -27
- package/src/engine/alcf-oauth.ts +26 -19
- package/src/engine/api-registry.ts +223 -0
- package/src/engine/apis/index.ts +3 -7
- package/src/engine/apis/llamacpp-residency.ts +49 -9
- package/src/engine/apis/lmstudio-residency.ts +5 -21
- package/src/engine/apis/lmstudio.ts +243 -0
- package/src/engine/apis/ollama-native.ts +24 -3
- package/src/engine/apis/openai-completions.ts +170 -91
- package/src/engine/apis/residency.ts +139 -3
- package/src/engine/apis/types.ts +16 -0
- package/src/engine/env-api-keys.ts +98 -0
- package/src/engine/gemma-channel-filter.ts +223 -0
- package/src/engine/instrumented-tui.ts +192 -0
- package/src/engine/messages.ts +14 -0
- package/src/engine/models.ts +42 -0
- package/src/engine/oauth.ts +16 -12
- package/src/engine/prompt-templates.ts +1 -0
- package/src/engine/provider-payload.ts +16 -59
- package/src/engine/strip-tokenizer-sentinels.ts +1 -1
- package/src/engine/truncate.ts +9 -0
- package/src/engine/tui.ts +17 -9
- package/src/engine/types.ts +3 -6
- package/src/engine/worker-runtime-capabilities.ts +5 -0
- package/src/engine/worker-runtime.ts +1 -1
- package/src/engine/worker-tools.ts +9 -4
- package/src/entry/boot-options.ts +50 -0
- package/src/entry/orchestrator.ts +288 -150
- package/src/interactive/application-controller.ts +89 -2
- package/src/interactive/chat-loop.ts +266 -41
- package/src/interactive/chat-panel.ts +715 -278
- package/src/interactive/chat-renderer.ts +306 -85
- package/src/interactive/clio-editor.ts +3 -8
- package/src/interactive/command-fallbacks.ts +2 -2
- package/src/interactive/context-overlay.ts +27 -1
- package/src/interactive/editor-submit.ts +253 -24
- package/src/interactive/export-html/ansi-to-html.ts +161 -0
- package/src/interactive/export-html/index.ts +51 -0
- package/src/interactive/export-html/template.ts +45 -0
- package/src/interactive/export-html/tool-renderer.ts +54 -0
- package/src/interactive/footer/dashboard.ts +4 -0
- package/src/interactive/footer/notifications.ts +1 -1
- package/src/interactive/footer/widgets.ts +42 -22
- package/src/interactive/footer-panel.ts +8 -3
- package/src/interactive/format-time.ts +14 -2
- package/src/interactive/interactive-application.ts +203 -17
- package/src/interactive/interactive-event-projection.ts +18 -1
- package/src/interactive/interactive-input-runtime.ts +50 -4
- package/src/interactive/interactive-presentation.ts +151 -19
- package/src/interactive/interactive-shell.ts +268 -14
- package/src/interactive/interactive-slash-runtime.ts +184 -117
- package/src/interactive/interactive-tickers.ts +38 -7
- package/src/interactive/keybinding-manager.ts +1 -1
- package/src/interactive/layout.ts +40 -3
- package/src/interactive/overlay-frame.ts +1 -1
- package/src/interactive/overlay-general-openers.ts +58 -1
- package/src/interactive/overlay-key-routing.ts +3 -0
- package/src/interactive/overlay-lifecycle.ts +13 -0
- package/src/interactive/overlay-permission-lifecycle.ts +2 -1
- package/src/interactive/overlay-session-lifecycle.ts +69 -12
- package/src/interactive/overlays/ask-user.ts +146 -24
- package/src/interactive/overlays/decisions.ts +300 -0
- package/src/interactive/overlays/help-reference.ts +15 -10
- package/src/interactive/overlays/model-selector.ts +34 -16
- package/src/interactive/overlays/session-selector.ts +18 -0
- package/src/interactive/overlays/settings.ts +105 -17
- package/src/interactive/overlays/skills-hub.ts +4 -4
- package/src/interactive/overlays/tree-selector.ts +41 -6
- package/src/interactive/render-trace.ts +499 -90
- package/src/interactive/renderers/compaction-summary.ts +2 -2
- package/src/interactive/renderers/diff.ts +115 -104
- package/src/interactive/renderers/mermaid.ts +53 -0
- package/src/interactive/renderers/tool-execution.ts +516 -168
- package/src/interactive/renderers/worker-entry.ts +20 -4
- package/src/interactive/session-switch-settlement.ts +10 -0
- package/src/interactive/slash-autocomplete.ts +6 -114
- package/src/interactive/slash-commands.ts +135 -47
- package/src/interactive/slash-spec.ts +9 -38
- package/src/interactive/status/controller.ts +5 -1
- package/src/interactive/status/index.ts +12 -1
- package/src/interactive/status/reasoning.ts +87 -0
- package/src/interactive/status/summary.ts +13 -2
- package/src/interactive/stdout-backpressure.ts +99 -0
- package/src/interactive/stream-pacer.ts +530 -0
- package/src/interactive/stream-pacing-policy.ts +66 -0
- package/src/interactive/tasks-overlay.ts +368 -14
- package/src/interactive/terminal-lease.ts +485 -0
- package/src/interactive/theme/tokens.ts +1 -1
- package/src/interactive/transcript-detail.ts +120 -0
- package/src/interactive/turn-context.ts +4 -3
- package/src/interactive/turn-persistence.ts +30 -13
- package/src/interactive/turn-queues.ts +12 -0
- package/src/interactive/turn-recovery.ts +25 -8
- package/src/interactive/turn-runtime.ts +79 -12
- package/src/interactive/turn-state.ts +10 -0
- package/src/interactive/view/artifacts.ts +114 -4
- package/src/interactive/view/view-overlay.ts +3 -0
- package/src/interactive/welcome-dashboard.ts +17 -16
- package/src/interactive/worker-receipts.ts +52 -3
- package/src/interactive/worker-stream.ts +5 -1
- package/src/tools/agent-tools.ts +23 -3
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +23 -13
- package/src/tools/bash.ts +30 -2
- package/src/tools/bootstrap.ts +34 -431
- package/src/tools/builtin-tool-catalog.ts +271 -0
- package/src/tools/codewiki/code-nav-surface.ts +29 -0
- package/src/tools/codewiki/code-nav.ts +8 -22
- package/src/tools/codewiki/shared.ts +41 -38
- package/src/tools/context/docs-engine.ts +14 -3
- package/src/tools/context/index.ts +107 -28
- package/src/tools/context/surface.ts +19 -0
- package/src/tools/core-bootstrap.ts +168 -0
- package/src/tools/credential-present.ts +5 -5
- package/src/tools/dispatch-admission.ts +533 -0
- package/src/tools/dispatch-background.ts +54 -0
- package/src/tools/dispatch-event-text.ts +6 -0
- package/src/tools/dispatch-plan.ts +9 -4
- package/src/tools/dispatch-run-events.ts +238 -0
- package/src/tools/dispatch-runner.ts +2370 -0
- package/src/tools/dispatch-scout-admission.ts +295 -0
- package/src/tools/dispatch-types.ts +77 -0
- package/src/tools/dispatch.ts +67 -3161
- package/src/tools/find.ts +4 -2
- package/src/tools/grep.ts +2 -2
- package/src/tools/lazy-tool.ts +60 -0
- package/src/tools/ledger.ts +3 -3
- package/src/tools/monitor-surface.ts +36 -0
- package/src/tools/monitor.ts +2 -32
- package/src/tools/observers.ts +2 -2
- package/src/tools/presentation.ts +107 -0
- package/src/tools/registry.ts +45 -27
- package/src/tools/safe-exec.ts +2 -2
- package/src/tools/steer-surface.ts +17 -0
- package/src/tools/steer.ts +2 -13
- package/src/tools/tasks.ts +108 -11
- package/src/tools/truncate.ts +25 -184
- package/src/tools/verify/frontend.ts +3 -1
- package/src/tools/verify/index.ts +3 -38
- package/src/tools/verify/surface.ts +46 -0
- package/src/tools/web-fetch-surface.ts +23 -0
- package/src/tools/web-fetch.ts +2 -20
- package/src/tools/write.ts +7 -2
- package/src/worker/entry.ts +39 -2
- package/src/worker/spec-contract.ts +26 -5
- package/dist/chunk-7SS2CTV2.js +0 -61361
- package/dist/chunk-DKGKUHFA.js +0 -924
- package/dist/chunk-GEP36Y4X.js +0 -12796
- package/dist/chunk-XYWBQRDM.js +0 -137
- package/dist/clio-BZVGEUFJ.js +0 -58
- package/dist/configure-S7S6F6CL.js +0 -32
- package/docs/html/agents_blueprint.html +0 -936
- package/docs/html/alcf_blueprint.html +0 -324
- package/docs/html/architecture_blueprint.html +0 -850
- package/docs/html/commands_blueprint.html +0 -939
- package/docs/html/config_knobs_audit_blueprint.html +0 -178
- package/docs/html/configuration_blueprint.html +0 -1080
- package/docs/html/context_blueprint.html +0 -603
- package/docs/html/documentation_blueprint.html +0 -832
- package/docs/html/environment_blueprint.html +0 -404
- package/docs/html/eval_blueprint.html +0 -743
- package/docs/html/evals_internal_blueprint.html +0 -190
- package/docs/html/evolution_blueprint.html +0 -674
- package/docs/html/extensions_blueprint.html +0 -2065
- package/docs/html/fleet_dispatch_blueprint.html +0 -286
- package/docs/html/index.html +0 -919
- package/docs/html/lifecycle_blueprint.html +0 -723
- package/docs/html/memory_blueprint.html +0 -699
- package/docs/html/middleware_blueprint.html +0 -664
- package/docs/html/models_blueprint.html +0 -2366
- package/docs/html/observability_blueprint.html +0 -683
- package/docs/html/provider_adapter_blueprint.html +0 -245
- package/docs/html/safety_blueprint.html +0 -1386
- package/docs/html/shared.css +0 -571
- package/docs/html/shared.js +0 -143
- package/docs/html/skills_blueprint.html +0 -671
- package/docs/html/soak_blueprint.html +0 -182
- package/docs/html/tool_usage_blueprint.html +0 -350
- package/docs/html/tools_blueprint.html +0 -2249
- package/docs/html/trace_blueprint.html +0 -235
- package/docs/html/tui_design_blueprint.html +0 -374
- package/docs/html/validation_blueprint.html +0 -961
- package/docs/html/worker_dispatch_blueprint.html +0 -231
- package/src/core/release.ts +0 -2
- package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
- package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
- package/src/engine/apis/lmstudio-native.ts +0 -1438
- package/src/engine/apis/thinking-replay.ts +0 -11
- package/src/tools/string-enum.ts +0 -15
|
@@ -23,6 +23,8 @@ export interface ClioAppKeybindings {
|
|
|
23
23
|
"clio.status.toggle": true;
|
|
24
24
|
"clio.session.tree": true;
|
|
25
25
|
"clio.dispatchBoard.toggle": true;
|
|
26
|
+
"clio.tasks.open": true;
|
|
27
|
+
"clio.decisions.open": true;
|
|
26
28
|
"clio.dispatch.background": true;
|
|
27
29
|
"clio.model.select": true;
|
|
28
30
|
"clio.model.cycleForward": true;
|
|
@@ -34,6 +36,7 @@ export interface ClioAppKeybindings {
|
|
|
34
36
|
"clio.thinking.expandAll": true;
|
|
35
37
|
"clio.editor.external": true;
|
|
36
38
|
"clio.message.followUp": true;
|
|
39
|
+
"clio.message.interrupt": true;
|
|
37
40
|
"clio.message.dequeue": true;
|
|
38
41
|
"clio.notifications.dismiss": true;
|
|
39
42
|
"clio.leader": true;
|
|
@@ -59,10 +62,11 @@ declare module "@earendil-works/pi-tui" {
|
|
|
59
62
|
* `ctrl+d`, and the portable `ctrl+g` leader retained because every terminal
|
|
60
63
|
* already transmits them). `Alt + <letter>` decodes from the legacy
|
|
61
64
|
* `ESC <letter>` sequence on meta-capable terminals. The chosen letters avoid
|
|
62
|
-
* pi-tui's editor reserves
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
* `keybinding-manager.ts` stays as a safety
|
|
65
|
+
* pi-tui's editor reserves except for the approved `Alt+B` and `Alt+D`
|
|
66
|
+
* application-boundary overrides. They open the task and decision boards
|
|
67
|
+
* before the editor can interpret those chords as word-back or word-delete.
|
|
68
|
+
* The CSI-u/reserved-key detector in `keybinding-manager.ts` stays as a safety
|
|
69
|
+
* net for user rebinds.
|
|
66
70
|
*/
|
|
67
71
|
export const CLIO_APP_KEYBINDINGS = {
|
|
68
72
|
"clio.thinking.cycle": {
|
|
@@ -85,6 +89,16 @@ export const CLIO_APP_KEYBINDINGS = {
|
|
|
85
89
|
defaultKeys: "alt+w",
|
|
86
90
|
description: "Toggle the dispatch (workers) board overlay",
|
|
87
91
|
},
|
|
92
|
+
"clio.tasks.open": {
|
|
93
|
+
// Approved application-boundary override of pi-tui editor word-back.
|
|
94
|
+
defaultKeys: "alt+b",
|
|
95
|
+
description: "Open the composite session and operator task board",
|
|
96
|
+
},
|
|
97
|
+
"clio.decisions.open": {
|
|
98
|
+
// Approved application-boundary override of pi-tui editor word-delete.
|
|
99
|
+
defaultKeys: "alt+d",
|
|
100
|
+
description: "Open the settled interview decision board",
|
|
101
|
+
},
|
|
88
102
|
"clio.dispatch.background": {
|
|
89
103
|
// Ctrl+B alone is pi-tui's editor cursor-left, so the Claude Code chord
|
|
90
104
|
// cannot be the primary here. Alt+S ("send to background") keeps the app
|
|
@@ -108,14 +122,14 @@ export const CLIO_APP_KEYBINDINGS = {
|
|
|
108
122
|
"clio.tool.expand": {
|
|
109
123
|
defaultKeys: "alt+o",
|
|
110
124
|
description:
|
|
111
|
-
"Fold or unfold the newest tool call or worker block between its one-line summary and full details
|
|
125
|
+
"Fold or unfold the newest tool call or worker block between its one-line summary and full details, overriding the /output level for that block",
|
|
112
126
|
},
|
|
113
127
|
"clio.tool.expandAll": {
|
|
114
128
|
// Alt+Shift+letter is commonly consumed by OS keyboard-layout switching.
|
|
115
129
|
// Keep it discoverable, but pair it with the legacy-safe Ctrl+Alt form.
|
|
116
130
|
defaultKeys: ["ctrl+alt+o", "alt+shift+o"],
|
|
117
131
|
description:
|
|
118
|
-
"Fold or unfold every tool call and worker block at once
|
|
132
|
+
"Fold or unfold every tool call and worker block at once, overriding the /output level; changing /output clears the overrides",
|
|
119
133
|
},
|
|
120
134
|
"clio.tool.liveOutput": {
|
|
121
135
|
defaultKeys: "alt+p",
|
|
@@ -131,7 +145,7 @@ export const CLIO_APP_KEYBINDINGS = {
|
|
|
131
145
|
// Alt+Shift+R as a distinct key event.
|
|
132
146
|
defaultKeys: ["ctrl+alt+r", "alt+shift+r"],
|
|
133
147
|
description:
|
|
134
|
-
"Toggle all thinking blocks between hidden markers and full bodies
|
|
148
|
+
"Toggle all thinking blocks between hidden markers and full bodies, overriding the /output level; changing /output clears the overrides",
|
|
135
149
|
},
|
|
136
150
|
"clio.editor.external": {
|
|
137
151
|
defaultKeys: "alt+g",
|
|
@@ -139,7 +153,16 @@ export const CLIO_APP_KEYBINDINGS = {
|
|
|
139
153
|
},
|
|
140
154
|
"clio.message.followUp": {
|
|
141
155
|
defaultKeys: "alt+enter",
|
|
142
|
-
description:
|
|
156
|
+
description:
|
|
157
|
+
"End of turn: queue the current input for delivery when the active run settles (Enter delivers it at the next slot, between tool batches)",
|
|
158
|
+
},
|
|
159
|
+
"clio.message.interrupt": {
|
|
160
|
+
// Alt+I keeps the app scheme and earns the Ctrl+G leader fallback. A
|
|
161
|
+
// Ctrl+Enter chord was rejected because legacy terminals send it as a
|
|
162
|
+
// plain Enter, which would turn every send into a cancel.
|
|
163
|
+
defaultKeys: "alt+i",
|
|
164
|
+
description:
|
|
165
|
+
"Interrupt: cancel the active run and deliver the current input now (refused while an attached dispatch runs or a permission ask is parked; the input then queues for the next slot)",
|
|
143
166
|
},
|
|
144
167
|
"clio.message.dequeue": {
|
|
145
168
|
defaultKeys: "alt+up",
|
|
@@ -155,9 +178,22 @@ export const CLIO_APP_KEYBINDINGS = {
|
|
|
155
178
|
},
|
|
156
179
|
} as const satisfies KeybindingDefinitions;
|
|
157
180
|
|
|
158
|
-
/**
|
|
181
|
+
/**
|
|
182
|
+
* Full definition table = pi-tui editor/select defaults + Clio app ids.
|
|
183
|
+
* pi-tui 0.84 supplies dedicated prompt-history actions but leaves them
|
|
184
|
+
* unbound for applications to place. Clio uses the readline-style Ctrl+P and
|
|
185
|
+
* Ctrl+N pair because its model cycling already lives on Alt+J and Alt+K.
|
|
186
|
+
*/
|
|
159
187
|
export const CLIO_KEYBINDINGS = {
|
|
160
188
|
...TUI_KEYBINDINGS,
|
|
189
|
+
"tui.editor.historyPrevious": {
|
|
190
|
+
...TUI_KEYBINDINGS["tui.editor.historyPrevious"],
|
|
191
|
+
defaultKeys: "ctrl+p",
|
|
192
|
+
},
|
|
193
|
+
"tui.editor.historyNext": {
|
|
194
|
+
...TUI_KEYBINDINGS["tui.editor.historyNext"],
|
|
195
|
+
defaultKeys: "ctrl+n",
|
|
196
|
+
},
|
|
161
197
|
...CLIO_APP_KEYBINDINGS,
|
|
162
198
|
} as const satisfies KeybindingDefinitions;
|
|
163
199
|
|
|
@@ -3,7 +3,7 @@ import type { ProjectType } from "../session/workspace/project-type.js";
|
|
|
3
3
|
import type { AdoptionScanResult } from "./adoption.js";
|
|
4
4
|
import type { BootstrapStructuredOutput } from "./bootstrap.js";
|
|
5
5
|
import { renderCodewikiDigest } from "./codewiki/digest.js";
|
|
6
|
-
import type { Codewiki } from "./codewiki/
|
|
6
|
+
import type { Codewiki } from "./codewiki/schema.js";
|
|
7
7
|
import type { SiblingContextFile } from "./sibling-files.js";
|
|
8
8
|
|
|
9
9
|
export const BOOTSTRAP_PROMPT = `You are the clio-coder bootstrap agent. Your job is to write the custom sections of CLIO-CODER.md for the project at <cwd>. CLIO-CODER.md is a lean, project-specific handbook that the clio-coder coding agent loads on every session, so write for an experienced engineer who has never seen this repository and is about to change it.
|
|
@@ -12,9 +12,10 @@ import {
|
|
|
12
12
|
scanAgentConfigs,
|
|
13
13
|
} from "./adoption.js";
|
|
14
14
|
import { type ClioMdSection, type ParsedClioMd, parseClioMd, serializeClioMd, tryReadClioMd } from "./clio-md.js";
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import
|
|
15
|
+
import { buildCodewikiCandidate, coordinateCodewikiWrite } from "./codewiki/coordinator.js";
|
|
16
|
+
import type { Codewiki } from "./codewiki/schema.js";
|
|
17
|
+
import type { Fingerprint } from "./fingerprint.js";
|
|
18
|
+
import { hasTomlTable, type ProjectMetadata, readProjectMetadata } from "./project-metadata.js";
|
|
18
19
|
import { renderPromptContext } from "./prompt-context.js";
|
|
19
20
|
import type { SiblingContextFile } from "./sibling-files.js";
|
|
20
21
|
import {
|
|
@@ -454,6 +455,71 @@ export function packageManager(cwd: string): PackageManager {
|
|
|
454
455
|
/** A script whose command rewrites the tree cannot serve as a verification gate. */
|
|
455
456
|
const MUTATING_SCRIPT_RE = /(?:^|\s)--(?:fix|write)(?:\s|$)/;
|
|
456
457
|
|
|
458
|
+
/**
|
|
459
|
+
* First preset a human could actually invoke: named and not hidden. Hidden
|
|
460
|
+
* presets exist only to be inherited from, so naming one in the handbook would
|
|
461
|
+
* hand the agent a command CMake refuses to run.
|
|
462
|
+
*/
|
|
463
|
+
function cmakePresetName(presets: unknown, key: string): string | null {
|
|
464
|
+
if (typeof presets !== "object" || presets === null || Array.isArray(presets)) return null;
|
|
465
|
+
const list = (presets as Record<string, unknown>)[key];
|
|
466
|
+
if (!Array.isArray(list)) return null;
|
|
467
|
+
for (const entry of list) {
|
|
468
|
+
if ((entry as Record<string, unknown> | null)?.hidden === true) continue;
|
|
469
|
+
const name = stringField(entry, "name");
|
|
470
|
+
if (name !== null) return name;
|
|
471
|
+
}
|
|
472
|
+
return null;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* CMake presets are the project's own declared configure/build/test recipes,
|
|
477
|
+
* the same authority package.json scripts carry for Node. A CMake tree without
|
|
478
|
+
* presets stays silent: nothing there declares a runnable command, and a
|
|
479
|
+
* guessed `cmake -B build` fails on exactly the toolchain-file and MPI-wrapper
|
|
480
|
+
* projects this tool targets. Configure, build, and test are each named
|
|
481
|
+
* independently: a project can declare a visible build preset without a
|
|
482
|
+
* visible configure preset (e.g. the configure preset is the hidden base
|
|
483
|
+
* every build preset inherits from), and that build command is still one the
|
|
484
|
+
* agent can run.
|
|
485
|
+
*/
|
|
486
|
+
function cmakeVerificationLines(cwd: string): string[] {
|
|
487
|
+
const presets = readJsonFile(join(cwd, "CMakePresets.json"));
|
|
488
|
+
if (presets === null) return [];
|
|
489
|
+
const configure = cmakePresetName(presets, "configurePresets");
|
|
490
|
+
const build = cmakePresetName(presets, "buildPresets");
|
|
491
|
+
const test = cmakePresetName(presets, "testPresets");
|
|
492
|
+
const lines: string[] = [];
|
|
493
|
+
if (configure !== null) lines.push(`Configure with \`cmake --preset ${configure}\`.`);
|
|
494
|
+
if (build !== null) lines.push(`Build with \`cmake --build --preset ${build}\`.`);
|
|
495
|
+
if (test !== null) lines.push(`Run tests with \`ctest --preset ${test}\`.`);
|
|
496
|
+
return lines;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Python has no single scripts manifest, so this names a runner only where the
|
|
501
|
+
* project declares one: a tox configuration declares `tox`, and a declared
|
|
502
|
+
* pytest configuration declares `pytest`. An undeclared layout stays silent
|
|
503
|
+
* rather than guessing `python -m unittest` at a repository that tests some
|
|
504
|
+
* other way. Tox wins when both are declared because it typically wraps the
|
|
505
|
+
* pytest run.
|
|
506
|
+
*/
|
|
507
|
+
function pythonVerificationLines(cwd: string): string[] {
|
|
508
|
+
let pyproject = "";
|
|
509
|
+
try {
|
|
510
|
+
pyproject = readFileSync(join(cwd, "pyproject.toml"), "utf8");
|
|
511
|
+
} catch {
|
|
512
|
+
pyproject = "";
|
|
513
|
+
}
|
|
514
|
+
if (existsSync(join(cwd, "tox.ini")) || hasTomlTable(pyproject, "tool.tox")) {
|
|
515
|
+
return ["Run `tox` before handoff."];
|
|
516
|
+
}
|
|
517
|
+
if (existsSync(join(cwd, "pytest.ini")) || hasTomlTable(pyproject, "tool.pytest.ini_options")) {
|
|
518
|
+
return ["Run `pytest` before handoff."];
|
|
519
|
+
}
|
|
520
|
+
return [];
|
|
521
|
+
}
|
|
522
|
+
|
|
457
523
|
function verificationSection(cwd: string): ClioMdSection | null {
|
|
458
524
|
const scripts = packageScripts(cwd);
|
|
459
525
|
const pm = packageManager(cwd);
|
|
@@ -487,6 +553,20 @@ function verificationSection(cwd: string): ClioMdSection | null {
|
|
|
487
553
|
if (hasScript("ci")) {
|
|
488
554
|
lines.push(`Use ${command("ci")} for the full local gate before committing broad or shared behavior changes.`);
|
|
489
555
|
}
|
|
556
|
+
lines.push(...cmakeVerificationLines(cwd));
|
|
557
|
+
// Cargo's commands are defined by the toolchain, not by each project, so
|
|
558
|
+
// naming them for any Cargo workspace carries the same confidence as a
|
|
559
|
+
// declared package script.
|
|
560
|
+
if (existsSync(join(cwd, "Cargo.toml"))) {
|
|
561
|
+
lines.push("Run `cargo build` and `cargo test` before handoff.");
|
|
562
|
+
}
|
|
563
|
+
// Go's commands are defined by the toolchain, not by each project, so
|
|
564
|
+
// naming them for any module carries the same confidence as a declared
|
|
565
|
+
// package script.
|
|
566
|
+
if (existsSync(join(cwd, "go.mod"))) {
|
|
567
|
+
lines.push("Run `go build ./...` and `go test ./...` before handoff.");
|
|
568
|
+
}
|
|
569
|
+
lines.push(...pythonVerificationLines(cwd));
|
|
490
570
|
if (lines.length === 0) return null;
|
|
491
571
|
return { title: "Verification expectations", body: lines.join(" ") };
|
|
492
572
|
}
|
|
@@ -684,20 +764,21 @@ function stabilizeGeneratedOutput(
|
|
|
684
764
|
|
|
685
765
|
/**
|
|
686
766
|
* The handbook sections whose every fact is read straight off the codewiki index:
|
|
687
|
-
*
|
|
688
|
-
*
|
|
689
|
-
*
|
|
690
|
-
*
|
|
767
|
+
* which modules anchor it and where the mass sits. They are the only sections
|
|
768
|
+
* nothing but the index can author, and equally the only ones that are wrong the
|
|
769
|
+
* moment the tree moves, so `context refresh` re-derives them in place and leaves
|
|
770
|
+
* every other section to its human or model author. An exact file count stays
|
|
771
|
+
* out: the handbook persists between refreshes while the tree keeps moving, so a
|
|
772
|
+
* precise number is falsified by any single added file and carries no
|
|
773
|
+
* navigational value the entry-point list does not.
|
|
691
774
|
*/
|
|
692
775
|
export function codewikiSections(codewiki: Codewiki): ClioMdSection[] {
|
|
693
776
|
const sections: ClioMdSection[] = [];
|
|
694
777
|
const entryPoints = codewikiEntryPoints(codewiki, 8);
|
|
695
|
-
const indexedCount = indexedSourceFileCount(codewiki);
|
|
696
778
|
if (entryPoints.length > 0) {
|
|
697
779
|
sections.push({
|
|
698
780
|
title: "Context retrieval",
|
|
699
781
|
body: [
|
|
700
|
-
`The codewiki currently indexes ${indexedCount} source file${indexedCount === 1 ? "" : "s"}.`,
|
|
701
782
|
`Start orientation with these indexed entry points: ${entryPoints.map((entry) => `\`${entry}\``).join(", ")}.`,
|
|
702
783
|
"Use `code_nav` (modes: symbol, path, entries, outline, deps, dependents, wiki) before broad reads when the task is navigational.",
|
|
703
784
|
].join(" "),
|
|
@@ -1041,10 +1122,10 @@ function writeProjectState(
|
|
|
1041
1122
|
adoption: AdoptionScanResult,
|
|
1042
1123
|
recordAdoption: boolean,
|
|
1043
1124
|
codewikiVersion: number,
|
|
1125
|
+
fingerprint: Fingerprint,
|
|
1044
1126
|
generation: BootstrapGenerationTelemetry,
|
|
1045
1127
|
generated: boolean,
|
|
1046
1128
|
): string {
|
|
1047
|
-
const finalFingerprint = computeFingerprint(cwd);
|
|
1048
1129
|
const statePath = resolveStatePath(cwd);
|
|
1049
1130
|
const prev = readClioState(cwd);
|
|
1050
1131
|
// lastBootstrap describes how the CLIO-CODER.md on disk was produced, not what the
|
|
@@ -1059,7 +1140,7 @@ function writeProjectState(
|
|
|
1059
1140
|
writeClioState(cwd, {
|
|
1060
1141
|
version: 1,
|
|
1061
1142
|
projectType,
|
|
1062
|
-
fingerprint
|
|
1143
|
+
fingerprint,
|
|
1063
1144
|
codewikiVersion,
|
|
1064
1145
|
lastInitAt: now.toISOString(),
|
|
1065
1146
|
lastSessionAt: now.toISOString(),
|
|
@@ -1082,13 +1163,13 @@ function persistCodewikiForGeneration(
|
|
|
1082
1163
|
projectType: ProjectType,
|
|
1083
1164
|
indexedAt: string,
|
|
1084
1165
|
codewiki: Codewiki,
|
|
1166
|
+
fingerprint: Fingerprint,
|
|
1085
1167
|
): void {
|
|
1086
|
-
writeCodewiki(cwd, codewiki);
|
|
1087
1168
|
const prev = readClioState(cwd);
|
|
1088
1169
|
writeClioState(cwd, {
|
|
1089
1170
|
version: 1,
|
|
1090
1171
|
projectType,
|
|
1091
|
-
fingerprint
|
|
1172
|
+
fingerprint,
|
|
1092
1173
|
codewikiVersion: codewiki.version,
|
|
1093
1174
|
...(prev?.contextSources ? { contextSources: prev.contextSources } : {}),
|
|
1094
1175
|
...(prev?.contextSourceHash ? { contextSourceHash: prev.contextSourceHash } : {}),
|
|
@@ -1176,7 +1257,22 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
|
|
|
1176
1257
|
// Index the repository before generation so the generator can ground CLIO-CODER.md
|
|
1177
1258
|
// in the real structure (entry points, key modules), not just sibling prose.
|
|
1178
1259
|
progress(input, { phase: "codewiki", status: "started", message: "building codewiki index" });
|
|
1179
|
-
|
|
1260
|
+
let codewiki: Codewiki;
|
|
1261
|
+
let codewikiFingerprint: Fingerprint;
|
|
1262
|
+
if (input.preview === true) {
|
|
1263
|
+
const candidate = await buildCodewikiCandidate(cwd, projectType);
|
|
1264
|
+
codewiki = candidate.codewiki;
|
|
1265
|
+
codewikiFingerprint = candidate.fingerprint;
|
|
1266
|
+
} else {
|
|
1267
|
+
const coordinated = await coordinateCodewikiWrite(cwd, () => ({ kind: "build", cwd, language: projectType }), {
|
|
1268
|
+
beforeCommit: (_result, workspace) => ensureGitignore(workspace, input),
|
|
1269
|
+
afterCommit: ({ codewiki: committed, fingerprint }, workspace) =>
|
|
1270
|
+
persistCodewikiForGeneration(workspace, projectType, indexedAt, committed, fingerprint),
|
|
1271
|
+
});
|
|
1272
|
+
if (!coordinated) throw new Error("codewiki bootstrap transaction did not commit");
|
|
1273
|
+
codewiki = coordinated.codewiki;
|
|
1274
|
+
codewikiFingerprint = coordinated.worker.fingerprint;
|
|
1275
|
+
}
|
|
1180
1276
|
const codewikiEntryCount = indexedSourceFileCount(codewiki);
|
|
1181
1277
|
progress(input, {
|
|
1182
1278
|
phase: "codewiki",
|
|
@@ -1185,10 +1281,6 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
|
|
|
1185
1281
|
current: codewikiEntryCount,
|
|
1186
1282
|
total: codewikiEntryCount,
|
|
1187
1283
|
});
|
|
1188
|
-
if (input.preview !== true) {
|
|
1189
|
-
await ensureGitignore(cwd, input);
|
|
1190
|
-
persistCodewikiForGeneration(cwd, projectType, indexedAt, codewiki);
|
|
1191
|
-
}
|
|
1192
1284
|
const hadClioMd = existsSync(join(cwd, "CLIO-CODER.md"));
|
|
1193
1285
|
const useExistingClioMdAsSource = hadClioMd && input.rewriteClioMd !== true;
|
|
1194
1286
|
const existingClioMdText = useExistingClioMdAsSource ? readExistingClioMdText(cwd) : null;
|
|
@@ -1362,6 +1454,7 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
|
|
|
1362
1454
|
adoption,
|
|
1363
1455
|
adoptionApplied,
|
|
1364
1456
|
codewiki.version,
|
|
1457
|
+
codewikiFingerprint,
|
|
1365
1458
|
generation,
|
|
1366
1459
|
shouldGenerate,
|
|
1367
1460
|
);
|
|
@@ -2,6 +2,7 @@ import { existsSync, rmSync } from "node:fs";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
|
|
4
4
|
import type { BootstrapIo } from "./bootstrap.js";
|
|
5
|
+
import { coordinateCodewikiExclusive } from "./codewiki/coordinator.js";
|
|
5
6
|
|
|
6
7
|
export interface RunContextClearInput {
|
|
7
8
|
cwd?: string;
|
|
@@ -25,7 +26,7 @@ const ACCUMULATED_CONTEXT_PATHS = [
|
|
|
25
26
|
] as const;
|
|
26
27
|
/**
|
|
27
28
|
* Kept, and said to be kept. `.clio-coder/wiki` is Clio-written rather than
|
|
28
|
-
* operator-authored, so it does not belong with the
|
|
29
|
+
* operator-authored, so it does not belong with the handbooks and the overlay
|
|
29
30
|
* directories on merit; it is listed because the reset reports exactly two
|
|
30
31
|
* categories and a reader takes anything absent from both to be gone. It is the
|
|
31
32
|
* most expensive artifact in `.clio-coder` (one model dispatch per page), and leaving
|
|
@@ -33,6 +34,7 @@ const ACCUMULATED_CONTEXT_PATHS = [
|
|
|
33
34
|
*/
|
|
34
35
|
const PRESERVED_CONTEXT_PATHS = [
|
|
35
36
|
"CLIO-CODER.md",
|
|
37
|
+
"CLIO-CODER.override.md",
|
|
36
38
|
".clio-coder/agents",
|
|
37
39
|
".clio-coder/skills",
|
|
38
40
|
".clio-coder/wiki",
|
|
@@ -61,18 +63,21 @@ export async function runContextClear(input: RunContextClearInput = {}): Promise
|
|
|
61
63
|
return { action: "cancelled", removed: [], preserved: [...PRESERVED_CONTEXT_PATHS] };
|
|
62
64
|
}
|
|
63
65
|
|
|
64
|
-
const removed
|
|
65
|
-
|
|
66
|
+
const { removed, preserved } = await coordinateCodewikiExclusive(cwd, async (workspace) => {
|
|
67
|
+
const removed: string[] = [];
|
|
68
|
+
for (const relPath of ACCUMULATED_CONTEXT_PATHS) removeIfPresent(workspace, relPath, removed);
|
|
66
69
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
const preserved = [...PRESERVED_CONTEXT_PATHS];
|
|
71
|
+
if (input.all === true) {
|
|
72
|
+
const confirmedAll = await input.confirmAll?.();
|
|
73
|
+
if (confirmedAll === true) {
|
|
74
|
+
removeIfPresent(workspace, "CLIO-CODER.md", removed);
|
|
75
|
+
const index = preserved.indexOf("CLIO-CODER.md");
|
|
76
|
+
if (index !== -1) preserved.splice(index, 1);
|
|
77
|
+
}
|
|
74
78
|
}
|
|
75
|
-
|
|
79
|
+
return { removed, preserved };
|
|
80
|
+
});
|
|
76
81
|
|
|
77
82
|
out(
|
|
78
83
|
input.io,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
1
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
3
3
|
|
|
4
4
|
export interface ClioMdFingerprintFooter {
|
|
5
5
|
initAt: string;
|
|
@@ -26,6 +26,25 @@ export interface ParsedClioMd {
|
|
|
26
26
|
warnings: string[];
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
export interface LoadedClioMdFile {
|
|
30
|
+
path: string;
|
|
31
|
+
value: ParsedClioMd;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface ClioMdLoadError {
|
|
35
|
+
path: string;
|
|
36
|
+
error: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface LoadedProjectClioMd {
|
|
40
|
+
/** Effective files in ancestor-to-descendant order. */
|
|
41
|
+
files: LoadedClioMdFile[];
|
|
42
|
+
/** Selected files that could not be read or parsed. */
|
|
43
|
+
errors: ClioMdLoadError[];
|
|
44
|
+
/** The layered effective handbook, or null when no selected file parsed. */
|
|
45
|
+
value: ParsedClioMd | null;
|
|
46
|
+
}
|
|
47
|
+
|
|
29
48
|
export type ClioMdParseResult = { ok: true; value: ParsedClioMd } | { ok: false; errors: string[]; warnings: string[] };
|
|
30
49
|
|
|
31
50
|
export interface SerializeClioMdInput {
|
|
@@ -294,7 +313,11 @@ export function renderProjectTypeFragment(projectType: string): string {
|
|
|
294
313
|
return `<project-type>${projectType}</project-type>`;
|
|
295
314
|
}
|
|
296
315
|
|
|
297
|
-
|
|
316
|
+
function escapeXmlAttribute(value: string): string {
|
|
317
|
+
return value.replaceAll("&", "&").replaceAll('"', """).replaceAll("<", "<").replaceAll(">", ">");
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
export function renderProjectContextFragment(parsed: ParsedClioMd, sourcePath?: string): string {
|
|
298
321
|
const sections: string[] = [`# ${parsed.projectName}`, parsed.identity];
|
|
299
322
|
if (parsed.conventions.length > 0) {
|
|
300
323
|
sections.push("## Conventions", ...parsed.conventions.map((item) => `- ${item}`));
|
|
@@ -308,20 +331,99 @@ export function renderProjectContextFragment(parsed: ParsedClioMd): string {
|
|
|
308
331
|
if (parsed.importedAgentContext) {
|
|
309
332
|
sections.push("## Imported agent context", parsed.importedAgentContext);
|
|
310
333
|
}
|
|
311
|
-
|
|
334
|
+
const source = sourcePath ? ` path="${escapeXmlAttribute(sourcePath)}"` : "";
|
|
335
|
+
return `<project-context${source}>\n${sections.join("\n\n")}\n</project-context>`;
|
|
312
336
|
}
|
|
313
337
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
338
|
+
const PROJECT_CONTEXT_CANDIDATES = ["CLIO-CODER.override.md", "CLIO-CODER.md"] as const;
|
|
339
|
+
|
|
340
|
+
function selectedClioMdPath(directory: string): string | null {
|
|
341
|
+
for (const filename of PROJECT_CONTEXT_CANDIDATES) {
|
|
342
|
+
const filePath = join(directory, filename);
|
|
343
|
+
if (!existsSync(filePath)) continue;
|
|
344
|
+
try {
|
|
345
|
+
if (statSync(filePath).isFile()) return filePath;
|
|
346
|
+
} catch {
|
|
347
|
+
// Preserve candidate precedence and let the read below own the
|
|
348
|
+
// actionable error instead of silently falling back to the base file.
|
|
349
|
+
return filePath;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return null;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function readClioMdPath(filePath: string): { ok: true; value: ParsedClioMd } | { ok: false; error: string } {
|
|
317
356
|
let content: string;
|
|
318
357
|
try {
|
|
319
358
|
content = readFileSync(filePath, "utf8");
|
|
320
359
|
} catch (err) {
|
|
321
|
-
|
|
322
|
-
return { ok: false, error: message };
|
|
360
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
323
361
|
}
|
|
324
362
|
const parsed = parseClioMd(content);
|
|
325
363
|
if (!parsed.ok) return { ok: false, error: parsed.errors.join("; ") };
|
|
326
364
|
return { ok: true, value: parsed.value };
|
|
327
365
|
}
|
|
366
|
+
|
|
367
|
+
function mergeClioMdFiles(files: ReadonlyArray<LoadedClioMdFile>): ParsedClioMd | null {
|
|
368
|
+
const nearest = files.at(-1)?.value;
|
|
369
|
+
if (!nearest) return null;
|
|
370
|
+
return {
|
|
371
|
+
projectName: nearest.projectName,
|
|
372
|
+
identity: files.map((file) => file.value.identity).join("\n\n"),
|
|
373
|
+
conventions: files.flatMap((file) => file.value.conventions),
|
|
374
|
+
invariants: files.flatMap((file) => file.value.invariants),
|
|
375
|
+
sections: files.flatMap((file) => file.value.sections),
|
|
376
|
+
importedAgentContext:
|
|
377
|
+
files
|
|
378
|
+
.map((file) => file.value.importedAgentContext)
|
|
379
|
+
.filter((value): value is string => value !== null)
|
|
380
|
+
.join("\n\n") || null,
|
|
381
|
+
fingerprint: nearest.fingerprint,
|
|
382
|
+
firstInit: nearest.firstInit,
|
|
383
|
+
warnings: files.flatMap((file) => file.value.warnings),
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Load effective project handbooks from filesystem root through `cwd`.
|
|
389
|
+
* Candidate selection follows pi-coding-agent 0.84's
|
|
390
|
+
* `loadProjectContextFiles`: an override wins over the base file in the same
|
|
391
|
+
* directory. Clio's structured override additionally resets the inherited
|
|
392
|
+
* handbook chain for that subtree, as required by the project-context
|
|
393
|
+
* contract. Handbooks below the override may add new layers.
|
|
394
|
+
*/
|
|
395
|
+
export function loadProjectClioMd(cwd: string): LoadedProjectClioMd {
|
|
396
|
+
const directories: string[] = [];
|
|
397
|
+
let directory = resolve(cwd);
|
|
398
|
+
while (true) {
|
|
399
|
+
directories.unshift(directory);
|
|
400
|
+
const parent = dirname(directory);
|
|
401
|
+
if (parent === directory) break;
|
|
402
|
+
directory = parent;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
const selectedPaths: string[] = [];
|
|
406
|
+
for (const current of directories) {
|
|
407
|
+
const selected = selectedClioMdPath(current);
|
|
408
|
+
if (!selected) continue;
|
|
409
|
+
if (basename(selected) === "CLIO-CODER.override.md") {
|
|
410
|
+
selectedPaths.length = 0;
|
|
411
|
+
}
|
|
412
|
+
selectedPaths.push(selected);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
const files: LoadedClioMdFile[] = [];
|
|
416
|
+
const errors: ClioMdLoadError[] = [];
|
|
417
|
+
for (const filePath of selectedPaths) {
|
|
418
|
+
const read = readClioMdPath(filePath);
|
|
419
|
+
if (read.ok) files.push({ path: filePath, value: read.value });
|
|
420
|
+
else errors.push({ path: filePath, error: read.error });
|
|
421
|
+
}
|
|
422
|
+
return { files, errors, value: mergeClioMdFiles(files) };
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
export function tryReadClioMd(cwd: string): { ok: true; value: ParsedClioMd } | { ok: false; error: string } | null {
|
|
426
|
+
const filePath = join(cwd, "CLIO-CODER.md");
|
|
427
|
+
if (!existsSync(filePath)) return null;
|
|
428
|
+
return readClioMdPath(filePath);
|
|
429
|
+
}
|