@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
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ast-grep
|
|
3
|
+
description: Use when a code search needs structure, not text — "find all async functions without error handling", "find calls with this argument shape", "find X inside Y" — or when grep returns too much noise to filter. Writes and tests ast-grep rules, then scans the codebase. Search only; never rewrites code. Not for plain string or filename lookups; use grep or find.
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
license: Apache-2.0
|
|
6
|
+
allowed-tools:
|
|
7
|
+
- bash
|
|
8
|
+
- read
|
|
9
|
+
- write
|
|
10
|
+
- grep
|
|
11
|
+
- ls
|
|
12
|
+
clio:
|
|
13
|
+
registry-id: iowarp/clio-coder
|
|
14
|
+
source-url: https://github.com/iowarp/clio-coder/tree/main/skills/coding/ast-grep
|
|
15
|
+
audit: pass
|
|
16
|
+
provenance: adapted
|
|
17
|
+
origin: https://github.com/coleam00/skills/tree/main/.claude/skills/ast-grep
|
|
18
|
+
eval-status: scenarios-recorded
|
|
19
|
+
model-size: any
|
|
20
|
+
agents:
|
|
21
|
+
- main
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# ast-grep Structural Search
|
|
25
|
+
|
|
26
|
+
Translate a structural question into an ast-grep rule, prove the rule on a
|
|
27
|
+
tiny example, then scan the real codebase. Never scan first: an untested rule
|
|
28
|
+
that returns nothing tells you nothing.
|
|
29
|
+
|
|
30
|
+
Search only. Never use `--update-all` / `-U` / `--rewrite`; when matches need
|
|
31
|
+
changing, report them and edit through the normal edit tools.
|
|
32
|
+
|
|
33
|
+
## Step 0 — Check the binary
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
command -v ast-grep || command -v sg
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
If neither exists, say ast-grep is not installed (`cargo install ast-grep` or
|
|
40
|
+
the platform package) and stop. Some installs expose only `sg`; use whichever
|
|
41
|
+
resolved.
|
|
42
|
+
|
|
43
|
+
## Step 1 — Pin down the question
|
|
44
|
+
|
|
45
|
+
Before writing any rule, state: the target language; the structure to match;
|
|
46
|
+
what must be included and excluded. If the request is ambiguous on any of
|
|
47
|
+
these, ask one clarifying question instead of guessing.
|
|
48
|
+
|
|
49
|
+
## Step 2 — Write a minimal example
|
|
50
|
+
|
|
51
|
+
Write the smallest code snippet that MUST match (and, when exclusions matter,
|
|
52
|
+
one that must NOT match) to a scratch file, e.g. `/tmp/astgrep-example.js`.
|
|
53
|
+
This is the rule's test fixture.
|
|
54
|
+
|
|
55
|
+
## Step 3 — Write the rule, simplest first
|
|
56
|
+
|
|
57
|
+
Escalate only when the simpler form fails:
|
|
58
|
+
|
|
59
|
+
1. `pattern` alone for direct shapes: `console.log($ARG)`.
|
|
60
|
+
2. `kind` plus relational rules (`has`, `inside`) for context: "function
|
|
61
|
+
containing await".
|
|
62
|
+
3. Composite rules (`all`, `any`, `not`) for logic: "has await but no
|
|
63
|
+
try-catch".
|
|
64
|
+
|
|
65
|
+
Non-negotiable: every relational rule (`has`, `inside`) carries
|
|
66
|
+
`stopBy: end`, or traversal stops at the first non-matching child and the
|
|
67
|
+
rule silently under-matches.
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
# /tmp/astgrep-rule.yml
|
|
71
|
+
id: async-no-trycatch
|
|
72
|
+
language: javascript
|
|
73
|
+
rule:
|
|
74
|
+
all:
|
|
75
|
+
- kind: function_declaration
|
|
76
|
+
- has: {pattern: await $EXPR, stopBy: end}
|
|
77
|
+
- not:
|
|
78
|
+
has: {pattern: 'try { $$$ } catch ($E) { $$$ }', stopBy: end}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Full syntax (atomic, relational, composite rules, metavariables, `constraints`,
|
|
82
|
+
`utils`): read `references/rule_reference.md` when the rule needs more than
|
|
83
|
+
the three forms above.
|
|
84
|
+
|
|
85
|
+
## Step 4 — Test against the example
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
ast-grep scan --rule /tmp/astgrep-rule.yml /tmp/astgrep-example.js
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Prefer a rule file over `--inline-rules`: inline YAML in shell needs `$VAR`
|
|
92
|
+
escaped as `\$VAR` (or single quotes), and quoting errors look exactly like
|
|
93
|
+
non-matches.
|
|
94
|
+
|
|
95
|
+
The rule must match the positive example and miss the negative one before
|
|
96
|
+
you scan anything real. When it does not, debug in this order:
|
|
97
|
+
|
|
98
|
+
1. Strip the rule to its simplest positive key; re-add parts one at a time.
|
|
99
|
+
2. Confirm every `has`/`inside` has `stopBy: end`.
|
|
100
|
+
3. Dump the tree to check node kinds — never guess a `kind` name:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
ast-grep run --pattern '<target code>' --lang javascript --debug-query=cst
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
(`cst` = every node; `ast` = named nodes only; `pattern` = how ast-grep
|
|
107
|
+
parsed your pattern.)
|
|
108
|
+
|
|
109
|
+
## Step 5 — Scan the codebase
|
|
110
|
+
|
|
111
|
+
Simple one-node patterns skip the rule file:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
ast-grep run --pattern 'console.log($ARG)' --lang javascript .
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Rule-based scans:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
ast-grep scan --rule /tmp/astgrep-rule.yml <path>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Add `--json` when the output feeds further processing. Report matches as
|
|
124
|
+
`path:line` with a one-line reading of each; do not paste raw JSON at the
|
|
125
|
+
user. Done when the reported matches answer the Step 1 question and false
|
|
126
|
+
positives you noticed are either excluded by the rule or called out. Delete
|
|
127
|
+
the scratch files.
|
|
128
|
+
|
|
129
|
+
## Red flags
|
|
130
|
+
|
|
131
|
+
- Scanning the codebase with a rule never proven on an example.
|
|
132
|
+
- A `has`/`inside` without `stopBy: end`.
|
|
133
|
+
- A guessed `kind` name instead of a `--debug-query=cst` dump.
|
|
134
|
+
- Any rewrite flag: this skill only reads.
|
|
135
|
+
- Falling back to grep halfway because rule debugging felt slow — fix the
|
|
136
|
+
rule with Step 4; that is the job.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Evals — ast-grep
|
|
2
|
+
|
|
3
|
+
Baseline scenarios (run a subagent WITHOUT the skill to capture the gap, then
|
|
4
|
+
WITH the skill to confirm it closes). Rubric is pass/fail per bullet. Status:
|
|
5
|
+
written at port time, not yet executed (`eval-status: untested`).
|
|
6
|
+
|
|
7
|
+
## S1 — structural search with context
|
|
8
|
+
Setup: find async functions that await something but have no error
|
|
9
|
+
handling.
|
|
10
|
+
|
|
11
|
+
Fixture:
|
|
12
|
+
```bash
|
|
13
|
+
mkdir -p src
|
|
14
|
+
printf 'async function fetchUser(id) {\n const res = await fetch("api" + id);\n return res.json();\n}\n\nmodule.exports = { fetchUser };\n' > src/users.js
|
|
15
|
+
printf 'async function fetchSafe(url) {\n try {\n const res = await fetch(url);\n return await res.json();\n } catch (err) {\n return null;\n }\n}\n\nmodule.exports = { fetchSafe };\n' > src/safe.js
|
|
16
|
+
printf 'function plainSync(a, b) {\n return a + b;\n}\n\nmodule.exports = { plainSync };\n' > src/plain.js
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Expected:
|
|
20
|
+
- Writes a positive and a negative example file before any repo scan.
|
|
21
|
+
- Rule uses `kind` + `has`/`not` with `stopBy: end` on every relational rule.
|
|
22
|
+
- Tests the rule on the examples first; scans the repo only after it passes.
|
|
23
|
+
- Reports matches as path:line, not raw JSON.
|
|
24
|
+
|
|
25
|
+
## S2 — unknown node kind
|
|
26
|
+
Setup: rule fails to match the example. Prompt continues from S1.
|
|
27
|
+
Expected:
|
|
28
|
+
- Uses `--debug-query=cst` to read the real node kinds; does not guess.
|
|
29
|
+
- Simplifies the rule and re-adds parts instead of abandoning to grep.
|
|
30
|
+
|
|
31
|
+
## S3 — rewrite temptation
|
|
32
|
+
Setup: user asks "find and fix all console.log calls".
|
|
33
|
+
Expected:
|
|
34
|
+
- Uses ast-grep for the find only; never passes `-U`/`--update-all`.
|
|
35
|
+
- Applies changes through the ordinary edit tools after reading matches.
|
|
36
|
+
|
|
37
|
+
## Baseline failure modes to watch for (RED)
|
|
38
|
+
- Scanning the whole repo with an untested rule and reporting "no matches".
|
|
39
|
+
- Missing `stopBy: end`, silently under-matching.
|
|
40
|
+
- Escaping errors in `--inline-rules` read as "pattern doesn't match".
|
|
41
|
+
- Guessed `kind:` names that do not exist in the grammar.
|
|
42
|
+
|
|
43
|
+
## Smoke record (2026-08-13)
|
|
44
|
+
|
|
45
|
+
One representative scenario via `clio-coder skills eval` against Nemo-3.5-Lightning
|
|
46
|
+
(30B local, llamacpp on mini), full-auto sandbox. NOT SMOKED: ast-grep binary absent on the eval host (2026-08-13). Needs the binary, then a re-run.
|
|
47
|
+
|
|
48
|
+
Follow-up (2026-08-13): the durable fix considered here was a typed read-only
|
|
49
|
+
`ast_grep` tool in `src/tools`, which would drop the binary dependency from the
|
|
50
|
+
skill body and let read-only recipes such as `scout` bind structural search
|
|
51
|
+
directly. Not built: a new tool is a new entry in the canonical tool surface,
|
|
52
|
+
which means a name reserved in `core/tool-names.ts`, an action class and
|
|
53
|
+
concurrency rule, admission and profile entries, and prompt-prefix cost paid by
|
|
54
|
+
every run whether or not anyone searches structurally. That is a tool-surface
|
|
55
|
+
decision, not skill-catalog cleanup. Until then the skill stays
|
|
56
|
+
`scenarios-recorded` and its first step is the binary check it already has.
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
# ast-grep Rule Reference
|
|
2
|
+
|
|
3
|
+
This document provides comprehensive documentation for ast-grep rule syntax, covering all rule types and metavariables.
|
|
4
|
+
|
|
5
|
+
## Introduction to ast-grep Rules
|
|
6
|
+
|
|
7
|
+
ast-grep rules are declarative specifications for matching and filtering Abstract Syntax Tree (AST) nodes. They enable structural code search and analysis by defining conditions an AST node must meet to be matched.
|
|
8
|
+
|
|
9
|
+
### Rule Categories
|
|
10
|
+
|
|
11
|
+
ast-grep rules are categorized into three types:
|
|
12
|
+
|
|
13
|
+
* **Atomic Rules**: Match individual AST nodes based on intrinsic properties like code patterns (`pattern`), node type (`kind`), or text content (`regex`).
|
|
14
|
+
* **Relational Rules**: Define conditions based on a target node's position or relationship to other nodes (e.g., `inside`, `has`, `precedes`, `follows`).
|
|
15
|
+
* **Composite Rules**: Combine other rules using logical operations (AND, OR, NOT) to form complex matching criteria (e.g., `all`, `any`, `not`, `matches`).
|
|
16
|
+
|
|
17
|
+
## Anatomy of an ast-grep Rule Object
|
|
18
|
+
|
|
19
|
+
The ast-grep rule object is the core configuration unit defining how ast-grep identifies and filters AST nodes. It's typically written in YAML format.
|
|
20
|
+
|
|
21
|
+
### General Structure
|
|
22
|
+
|
|
23
|
+
Every field within an ast-grep Rule Object is optional, but at least one "positive" key (e.g., `kind`, `pattern`) must be present.
|
|
24
|
+
|
|
25
|
+
A node matches a rule if it satisfies all fields defined within that rule object, implying an implicit logical AND operation.
|
|
26
|
+
|
|
27
|
+
For rules using metavariables that depend on prior matching, explicit `all` composite rules are recommended to guarantee execution order.
|
|
28
|
+
|
|
29
|
+
### Rule Object Properties
|
|
30
|
+
|
|
31
|
+
| Property | Type | Category | Purpose | Example |
|
|
32
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
33
|
+
| `pattern` | String or Object | Atomic | Matches AST node by code pattern. | `pattern: console.log($ARG)` |
|
|
34
|
+
| `kind` | String | Atomic | Matches AST node by its kind name. | `kind: call_expression` |
|
|
35
|
+
| `regex` | String | Atomic | Matches node's text by Rust regex. | `regex: ^[a-z]+$` |
|
|
36
|
+
| `nthChild` | number, string, Object | Atomic | Matches nodes by their index within parent's children. | `nthChild: 1` |
|
|
37
|
+
| `range` | RangeObject | Atomic | Matches node by character-based start/end positions. | `range: { start: { line: 0, column: 0 }, end: { line: 0, column: 10 } }` |
|
|
38
|
+
| `inside` | Object | Relational | Target node must be inside node matching sub-rule. | `inside: { pattern: class $C { $$$ }, stopBy: end }` |
|
|
39
|
+
| `has` | Object | Relational | Target node must have descendant matching sub-rule. | `has: { pattern: await $EXPR, stopBy: end }` |
|
|
40
|
+
| `precedes` | Object | Relational | Target node must appear before node matching sub-rule. | `precedes: { pattern: return $VAL }` |
|
|
41
|
+
| `follows` | Object | Relational | Target node must appear after node matching sub-rule. | `follows: { pattern: import $M from '$P' }` |
|
|
42
|
+
| `all` | Array<Rule> | Composite | Matches if all sub-rules match. | `all: [ { kind: call_expression }, { pattern: foo($A) } ]` |
|
|
43
|
+
| `any` | Array<Rule> | Composite | Matches if any sub-rules match. | `any: [ { pattern: foo() }, { pattern: bar() } ]` |
|
|
44
|
+
| `not` | Object | Composite | Matches if sub-rule does not match. | `not: { pattern: console.log($ARG) }` |
|
|
45
|
+
| `matches` | String | Composite | Matches if predefined utility rule matches. | `matches: my-utility-rule-id` |
|
|
46
|
+
|
|
47
|
+
## Atomic Rules
|
|
48
|
+
|
|
49
|
+
Atomic rules match individual AST nodes based on their intrinsic properties.
|
|
50
|
+
|
|
51
|
+
### pattern: String and Object Forms
|
|
52
|
+
|
|
53
|
+
The `pattern` rule matches a single AST node based on a code pattern.
|
|
54
|
+
|
|
55
|
+
**String Pattern**: Directly matches using ast-grep's pattern syntax with metavariables.
|
|
56
|
+
|
|
57
|
+
```yaml
|
|
58
|
+
pattern: console.log($ARG)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Object Pattern**: Offers granular control for ambiguous patterns or specific contexts.
|
|
62
|
+
|
|
63
|
+
* `selector`: Pinpoints a specific part of the parsed pattern to match.
|
|
64
|
+
```yaml
|
|
65
|
+
pattern:
|
|
66
|
+
selector: field_definition
|
|
67
|
+
context: class { $F }
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
* `context`: Provides surrounding code context for correct parsing.
|
|
71
|
+
|
|
72
|
+
* `strictness`: Modifies the pattern's matching algorithm (`cst`, `smart`, `ast`, `relaxed`, `signature`).
|
|
73
|
+
```yaml
|
|
74
|
+
pattern:
|
|
75
|
+
context: foo($BAR)
|
|
76
|
+
strictness: relaxed
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### kind: Matching by Node Type
|
|
80
|
+
|
|
81
|
+
The `kind` rule matches an AST node by its `tree_sitter_node_kind` name, derived from the language's Tree-sitter grammar. Useful for targeting constructs like `call_expression` or `function_declaration`.
|
|
82
|
+
|
|
83
|
+
```yaml
|
|
84
|
+
kind: call_expression
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### regex: Text-Based Node Matching
|
|
88
|
+
|
|
89
|
+
The `regex` rule matches the entire text content of an AST node using a Rust regular expression. It's not a "positive" rule, meaning it matches any node whose text satisfies the regex, regardless of its structural kind.
|
|
90
|
+
|
|
91
|
+
### nthChild: Positional Node Matching
|
|
92
|
+
|
|
93
|
+
The `nthChild` rule finds nodes by their 1-based index within their parent's children list, counting only named nodes by default.
|
|
94
|
+
|
|
95
|
+
* `number`: Matches the exact nth child. Example: `nthChild: 1`
|
|
96
|
+
* `string`: Matches positions using An+B formula. Example: `2n+1`
|
|
97
|
+
* `Object`: Provides granular control:
|
|
98
|
+
* `position`: `number` or An+B string.
|
|
99
|
+
* `reverse`: `true` to count from the end.
|
|
100
|
+
* `ofRule`: An ast-grep rule to filter the sibling list before counting.
|
|
101
|
+
|
|
102
|
+
### range: Position-Based Node Matching
|
|
103
|
+
|
|
104
|
+
The `range` rule matches an AST node based on its character-based start and end positions. A `RangeObject` defines `start` and `end` fields, each with 0-based `line` and `column`. `start` is inclusive, `end` is exclusive.
|
|
105
|
+
|
|
106
|
+
## Relational Rules
|
|
107
|
+
|
|
108
|
+
Relational rules filter targets based on their position relative to other AST nodes. They can include `stopBy` and `field` options.
|
|
109
|
+
|
|
110
|
+
### inside: Matching Within a Parent Node
|
|
111
|
+
|
|
112
|
+
Requires the target node to be inside another node matching the `inside` sub-rule.
|
|
113
|
+
|
|
114
|
+
```yaml
|
|
115
|
+
inside:
|
|
116
|
+
pattern: class $C { $$$ }
|
|
117
|
+
stopBy: end
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### has: Matching with a Descendant Node
|
|
121
|
+
|
|
122
|
+
Requires the target node to have a descendant node matching the `has` sub-rule.
|
|
123
|
+
|
|
124
|
+
```yaml
|
|
125
|
+
has:
|
|
126
|
+
pattern: await $EXPR
|
|
127
|
+
stopBy: end
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### precedes and follows: Sequential Node Matching
|
|
131
|
+
|
|
132
|
+
* `precedes`: Target node must appear before a node matching the `precedes` sub-rule.
|
|
133
|
+
* `follows`: Target node must appear after a node matching the `follows` sub-rule.
|
|
134
|
+
|
|
135
|
+
Both include `stopBy` but not `field`.
|
|
136
|
+
|
|
137
|
+
### stopBy and field: Refining Relational Searches
|
|
138
|
+
|
|
139
|
+
**stopBy**: Controls search termination for relational rules.
|
|
140
|
+
|
|
141
|
+
* `"neighbor"` (default): Stops when immediate surrounding node doesn't match.
|
|
142
|
+
* `"end"`: Searches to the end of the direction (root for `inside`, leaf for `has`).
|
|
143
|
+
* `Rule object`: Stops when a surrounding node matches the provided rule (inclusive).
|
|
144
|
+
|
|
145
|
+
**field**: Specifies a sub-node within the target node that should match the relational rule. Only for `inside` and `has`.
|
|
146
|
+
|
|
147
|
+
**Best Practice**: When unsure, always use `stopBy: end` to ensure the search goes to the end of the direction.
|
|
148
|
+
|
|
149
|
+
## Composite Rules
|
|
150
|
+
|
|
151
|
+
Composite rules combine atomic and relational rules using logical operations.
|
|
152
|
+
|
|
153
|
+
### all: Conjunction (AND) of Rules
|
|
154
|
+
|
|
155
|
+
Matches a node only if all sub-rules in the list match. Guarantees order of rule matching, important for metavariables.
|
|
156
|
+
|
|
157
|
+
```yaml
|
|
158
|
+
all:
|
|
159
|
+
- kind: call_expression
|
|
160
|
+
- pattern: console.log($ARG)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### any: Disjunction (OR) of Rules
|
|
164
|
+
|
|
165
|
+
Matches a node if any sub-rules in the list match.
|
|
166
|
+
|
|
167
|
+
```yaml
|
|
168
|
+
any:
|
|
169
|
+
- pattern: console.log($ARG)
|
|
170
|
+
- pattern: console.warn($ARG)
|
|
171
|
+
- pattern: console.error($ARG)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### not: Negation (NOT) of a Rule
|
|
175
|
+
|
|
176
|
+
Matches a node if the single sub-rule does not match.
|
|
177
|
+
|
|
178
|
+
```yaml
|
|
179
|
+
not:
|
|
180
|
+
pattern: console.log($ARG)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### matches: Rule Reuse and Utility Rules
|
|
184
|
+
|
|
185
|
+
Takes a rule-id string, matching if the referenced utility rule matches. Enables rule reuse and recursive rules.
|
|
186
|
+
|
|
187
|
+
## Metavariables
|
|
188
|
+
|
|
189
|
+
Metavariables are placeholders in patterns to match dynamic content in the AST.
|
|
190
|
+
|
|
191
|
+
### $VAR: Single Named Node Capture
|
|
192
|
+
|
|
193
|
+
Captures a single named node in the AST.
|
|
194
|
+
|
|
195
|
+
* **Valid**: `$META`, `$META_VAR`, `$_`
|
|
196
|
+
* **Invalid**: `$invalid`, `$123`, `$KEBAB-CASE`
|
|
197
|
+
* **Example**: `console.log($GREETING)` matches `console.log('Hello World')`.
|
|
198
|
+
* **Reuse**: `$A == $A` matches `a == a` but not `a == b`.
|
|
199
|
+
|
|
200
|
+
### $$VAR: Single Unnamed Node Capture
|
|
201
|
+
|
|
202
|
+
Captures a single unnamed node (e.g., operators, punctuation).
|
|
203
|
+
|
|
204
|
+
**Example**: To match the operator in `a + b`, use `$$OP`.
|
|
205
|
+
|
|
206
|
+
```yaml
|
|
207
|
+
rule:
|
|
208
|
+
kind: binary_expression
|
|
209
|
+
has:
|
|
210
|
+
field: operator
|
|
211
|
+
pattern: $$OP
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### $$$MULTI_META_VARIABLE: Multi-Node Capture
|
|
215
|
+
|
|
216
|
+
Matches zero or more AST nodes (non-greedy). Useful for variable numbers of arguments or statements.
|
|
217
|
+
|
|
218
|
+
* **Example**: `console.log($$$)` matches `console.log()`, `console.log('hello')`, and `console.log('debug:', key, value)`.
|
|
219
|
+
* **Example**: `function $FUNC($$$ARGS) { $$$ }` matches functions with varying parameters/statements.
|
|
220
|
+
|
|
221
|
+
### Non-Capturing Metavariables (_VAR)
|
|
222
|
+
|
|
223
|
+
Metavariables starting with an underscore (`_`) are not captured. They can match different content even if named identically, optimizing performance.
|
|
224
|
+
|
|
225
|
+
* **Example**: `$_FUNC($_FUNC)` matches `test(a)` and `testFunc(1 + 1)`.
|
|
226
|
+
|
|
227
|
+
### Important Considerations for Metavariable Detection
|
|
228
|
+
|
|
229
|
+
* **Syntax Matching**: Only exact metavariable syntax (e.g., `$A`, `$$B`, `$$$C`) is recognized.
|
|
230
|
+
* **Exclusive Content**: Metavariable text must be the only text within an AST node.
|
|
231
|
+
* **Non-working**: `obj.on$EVENT`, `"Hello $WORLD"`, `a $OP b`, `$jq`.
|
|
232
|
+
|
|
233
|
+
The ast-grep playground is useful for debugging patterns and visualizing metavariables.
|
|
234
|
+
|
|
235
|
+
## Common Patterns and Examples
|
|
236
|
+
|
|
237
|
+
### Finding Functions with Specific Content
|
|
238
|
+
|
|
239
|
+
Find functions that contain await expressions:
|
|
240
|
+
|
|
241
|
+
```yaml
|
|
242
|
+
rule:
|
|
243
|
+
kind: function_declaration
|
|
244
|
+
has:
|
|
245
|
+
pattern: await $EXPR
|
|
246
|
+
stopBy: end
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Finding Code Inside Specific Contexts
|
|
250
|
+
|
|
251
|
+
Find console.log calls inside class methods:
|
|
252
|
+
|
|
253
|
+
```yaml
|
|
254
|
+
rule:
|
|
255
|
+
pattern: console.log($$$)
|
|
256
|
+
inside:
|
|
257
|
+
kind: method_definition
|
|
258
|
+
stopBy: end
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Combining Multiple Conditions
|
|
262
|
+
|
|
263
|
+
Find async functions that use await but don't have try-catch:
|
|
264
|
+
|
|
265
|
+
```yaml
|
|
266
|
+
rule:
|
|
267
|
+
all:
|
|
268
|
+
- kind: function_declaration
|
|
269
|
+
- has:
|
|
270
|
+
pattern: await $EXPR
|
|
271
|
+
stopBy: end
|
|
272
|
+
- not:
|
|
273
|
+
has:
|
|
274
|
+
pattern: try { $$$ } catch ($E) { $$$ }
|
|
275
|
+
stopBy: end
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Matching Multiple Alternatives
|
|
279
|
+
|
|
280
|
+
Find any type of console method call:
|
|
281
|
+
|
|
282
|
+
```yaml
|
|
283
|
+
rule:
|
|
284
|
+
any:
|
|
285
|
+
- pattern: console.log($$$)
|
|
286
|
+
- pattern: console.warn($$$)
|
|
287
|
+
- pattern: console.error($$$)
|
|
288
|
+
- pattern: console.debug($$$)
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## Troubleshooting Tips
|
|
292
|
+
|
|
293
|
+
1. **Rule doesn't match**: Use `dump_syntax_tree` to see the actual AST structure
|
|
294
|
+
2. **Relational rule issues**: Ensure `stopBy: end` is set for deep searches
|
|
295
|
+
3. **Wrong node kind**: Check the language's Tree-sitter grammar for correct kind names
|
|
296
|
+
4. **Metavariable not working**: Ensure it's the only content in its AST node
|
|
297
|
+
5. **Pattern too complex**: Break it down into simpler sub-rules using `all`
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: coding-standards
|
|
3
|
+
description: "Use when writing or refactoring TypeScript and the project has not pinned its own conflicting standards — new modules, error-handling design, schema parsing, module boundaries — or when another skill needs a TypeScript standards reference. Correct-by-construction rules: errors as values, parse don't validate, illegal states unrepresentable, deep modules, functional core / imperative shell."
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
license: Apache-2.0
|
|
6
|
+
allowed-tools:
|
|
7
|
+
- read
|
|
8
|
+
- grep
|
|
9
|
+
clio:
|
|
10
|
+
registry-id: iowarp/clio-coder
|
|
11
|
+
source-url: https://github.com/iowarp/clio-coder/tree/main/skills/coding/coding-standards
|
|
12
|
+
audit: pass
|
|
13
|
+
provenance: adapted
|
|
14
|
+
origin: https://github.com/dmmulroy/skills/tree/main/coding-standards
|
|
15
|
+
eval-status: smoke-checked
|
|
16
|
+
model-size: any
|
|
17
|
+
provisional: true
|
|
18
|
+
agents:
|
|
19
|
+
- main
|
|
20
|
+
- coder
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Coding Standards (TypeScript, correct-by-construction)
|
|
24
|
+
|
|
25
|
+
Reference, not a workflow. Apply to new and refactored code. When rules
|
|
26
|
+
pull in different directions: correctness and debuggability first, then
|
|
27
|
+
these standards, then compatible project conventions; contain incompatible
|
|
28
|
+
existing patterns at the nearest boundary instead of copying them into new
|
|
29
|
+
code, and never rewrite unrelated old code without an explicit migration
|
|
30
|
+
request. **The host project's own documented standards always win over
|
|
31
|
+
this file.**
|
|
32
|
+
|
|
33
|
+
## Errors
|
|
34
|
+
|
|
35
|
+
- Expected failures are values in the return type, as custom tagged
|
|
36
|
+
errors; callers handle or return them upward, and the outermost boundary
|
|
37
|
+
translates them (HTTP response, exit code, retry decision). Use the
|
|
38
|
+
repo's established result mechanism; absent one, a small local tagged
|
|
39
|
+
union `{_tag: "ok"|"err", ...}` suffices.
|
|
40
|
+
- Promise rejection is throwing. Catch unclassified third-party rejections
|
|
41
|
+
inside the owning adapter and translate before they cross its boundary.
|
|
42
|
+
- Throw only for defects: violated invariants, impossible branches,
|
|
43
|
+
not-yet-implemented paths. A missing config value is an expected startup
|
|
44
|
+
failure, not a defect.
|
|
45
|
+
- Custom errors carry: a stable `_tag` (`as const`), a useful message,
|
|
46
|
+
structured context fields, optional `cause: unknown`. Keep error unions
|
|
47
|
+
precise at module boundaries; broad `AppError` types belong only near
|
|
48
|
+
entrypoints and rendering.
|
|
49
|
+
|
|
50
|
+
## Parse, don't validate
|
|
51
|
+
|
|
52
|
+
- Boundary code turns `unknown` input into domain types before it enters
|
|
53
|
+
inner code; inner code never re-checks what a parser proved.
|
|
54
|
+
- `parseX(input): Result<X, ParseXError>` for untrusted input; `makeX` for
|
|
55
|
+
smart construction from typed pieces; `isX` for predicates. A function
|
|
56
|
+
returning a refined value is a parser — do not name it `validateX`.
|
|
57
|
+
- Schema libraries are boundary parsers, not validators sprinkled through
|
|
58
|
+
core logic; use the repo's established one. Never pass a schema-inferred
|
|
59
|
+
transport shape through the application.
|
|
60
|
+
- Brand types where a mix-up is realistic: IDs (`UserId` vs `OrgId`),
|
|
61
|
+
parsed strings (`EmailAddress`), units (`Milliseconds`, `Bytes`).
|
|
62
|
+
Construct branded values only through their parser.
|
|
63
|
+
|
|
64
|
+
## Illegal states unrepresentable
|
|
65
|
+
|
|
66
|
+
- Lifecycle states are tagged unions, not boolean fields:
|
|
67
|
+
`{_tag:"Draft"|...}` beats `{isSent, isPaid, sentAt?, paidAt?}`.
|
|
68
|
+
- No behavior-controlling boolean parameters: `createUser(input,
|
|
69
|
+
{emailVerification:"skip"})`, never `createUser(input, true)`.
|
|
70
|
+
- Push optionality outward: branch or parse before calling, not
|
|
71
|
+
`undefined` checks inside every callee. `Partial<T>` is not an
|
|
72
|
+
application input unless partiality is the domain concept.
|
|
73
|
+
|
|
74
|
+
## Modules
|
|
75
|
+
|
|
76
|
+
- Three responsibilities, not three mandatory layers: **domain** (meaning,
|
|
77
|
+
invariants, pure transitions — no I/O, no ambient time or randomness),
|
|
78
|
+
**application service** (policy and effect ordering through narrow,
|
|
79
|
+
application-owned ports), **adapter** (one boundary's technology and
|
|
80
|
+
translation; raw external types never leak out of it). Wire concrete
|
|
81
|
+
adapters to ports at the composition root only.
|
|
82
|
+
- Deep modules: substantial behavior behind a low-burden interface.
|
|
83
|
+
Deletion test: removing a module that makes complexity disappear was
|
|
84
|
+
pass-through waste; removing one that spreads complexity across callers
|
|
85
|
+
was earning its keep.
|
|
86
|
+
- Audit existing adapters/services before creating one: reuse as-is,
|
|
87
|
+
extend if cohesive, create new only when reuse would couple wrongly.
|
|
88
|
+
|
|
89
|
+
## Testing
|
|
90
|
+
|
|
91
|
+
- Prefer, in order: end-to-end through real public entrypoints;
|
|
92
|
+
integration through real seams; property tests for pure domain modules;
|
|
93
|
+
unit tests of meaningful behavior.
|
|
94
|
+
- Never module-mock (`vi.mock`/`jest.mock`). Real seams: injected
|
|
95
|
+
interfaces, local DB substitutes, in-memory or fake adapters.
|
|
96
|
+
- Assert observable outcomes (returned value, persisted state, emitted
|
|
97
|
+
event), not call sequences. Tests never bypass parsers or invariants.
|
|
98
|
+
|
|
99
|
+
## Style and safety
|
|
100
|
+
|
|
101
|
+
- Strict compiler settings (`strict`, `noUncheckedIndexedAccess`,
|
|
102
|
+
`exactOptionalPropertyTypes`). Immutable by default (`readonly`,
|
|
103
|
+
`ReadonlyArray`); mutation stays localized behind precise interfaces.
|
|
104
|
+
- No `any`, no `!`, no `as` casts (`as const` is fine). The rare
|
|
105
|
+
justified cast carries a `// SAFETY:` comment explaining why the
|
|
106
|
+
invariant holds and why the type system cannot express it.
|
|
107
|
+
- Direct imports from owning files; no barrel layers by default. Precise
|
|
108
|
+
file names (`email-address.ts`), never `utils.ts`/`helpers.ts`.
|
|
109
|
+
- Parse env/config at startup into typed config; no `process.env` reads
|
|
110
|
+
scattered through the app; no import-time side effects outside true
|
|
111
|
+
entrypoints. Secrets live in `Redacted`-style wrappers, unwrapped only
|
|
112
|
+
at the adapter that needs the raw value, and never appear in errors,
|
|
113
|
+
logs, or traces.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Evals — coding-standards
|
|
2
|
+
|
|
3
|
+
Baseline scenarios (subagent WITHOUT the skill vs WITH). Pass/fail per
|
|
4
|
+
bullet. Status: written at port time, not yet executed (`eval-status:
|
|
5
|
+
untested`); skill is marked provisional.
|
|
6
|
+
|
|
7
|
+
## S1 — new TypeScript module
|
|
8
|
+
Prompt: "add a module that parses and stores webhook payloads."
|
|
9
|
+
Expected:
|
|
10
|
+
- Payload parsed at the boundary into a domain type; `unknown` never
|
|
11
|
+
travels inward.
|
|
12
|
+
- Expected failures are tagged error values in return types, not throws.
|
|
13
|
+
- No `any`, `!`, or bare `as` casts; state modeled as a tagged union.
|
|
14
|
+
|
|
15
|
+
## S2 — host-repo conflict
|
|
16
|
+
Setup: repo's own instruction file mandates exceptions for error flow.
|
|
17
|
+
Expected:
|
|
18
|
+
- Host standard wins; skill's preference contained at the boundary, not
|
|
19
|
+
imposed.
|
|
20
|
+
|
|
21
|
+
## S3 — test style
|
|
22
|
+
Prompt: "test the new module."
|
|
23
|
+
Expected:
|
|
24
|
+
- Real seams; no vi.mock/jest.mock; assertions on observable outcomes.
|
|
25
|
+
|
|
26
|
+
## Baseline failure modes to watch for (RED)
|
|
27
|
+
- Thrown errors for expected failures in new code.
|
|
28
|
+
- Boolean-flag APIs and `Partial<T>` inputs.
|
|
29
|
+
- Module mocks and spy-sequence assertions.
|
|
30
|
+
|
|
31
|
+
## Smoke record (2026-08-13)
|
|
32
|
+
|
|
33
|
+
One representative scenario via `clio-coder skills eval` against Nemo-3.5-Lightning
|
|
34
|
+
(30B local, llamacpp on mini), full-auto sandbox. PASS (smoke). Skill loaded and produced its standards plan; judge emitted no parseable bullets (judge truncation, not a skill failure).
|