@iowarp/clio-coder 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/README.md +50 -53
- package/dist/acp-FPR54DGL.js +138 -0
- package/dist/{agents-Q4MYPMUW.js → agents-OGPIHPJH.js} +33 -25
- package/dist/assets/codewiki.json +1 -0
- package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/LICENSE +21 -0
- package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/cgmanifest.json +16 -0
- package/dist/assets/grammars/notices/tree-sitter-wasms/LICENSE +24 -0
- package/dist/assets/grammars/tree-sitter-c-sharp.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-c.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-cpp.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-go.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-java.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-javascript.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-python.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-ruby.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-rust.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-tsx.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-typescript.wasm +0 -0
- package/dist/assets/grammars/tree-sitter.wasm +0 -0
- package/dist/{auth-O6HYIJ6J.js → auth-IC3K6NIZ.js} +22 -15
- package/dist/{chunk-KKKPTZLM.js → chunk-2STGEDFV.js} +8 -1
- package/dist/chunk-3I7MS7N2.js +40 -0
- package/dist/chunk-3R73A4XB.js +69 -0
- package/dist/{chunk-26BZQOAD.js → chunk-474KN5II.js} +86 -115
- package/dist/{chunk-NI4DEJMC.js → chunk-4QKXUHSR.js} +26 -3
- package/dist/{chunk-X3BR7HWV.js → chunk-5WIGXA4T.js} +7 -1
- package/dist/{chunk-TFSSEXL6.js → chunk-673JJUWJ.js} +14 -4
- package/dist/{chunk-GNGDQYDU.js → chunk-7SS2CTV2.js} +27922 -1249
- package/dist/{chunk-7RBKDI66.js → chunk-ASND7OZK.js} +104 -12
- package/dist/{chunk-X3NE4WVW.js → chunk-BNAZZHFG.js} +7 -1
- package/dist/{chunk-RQDWMVRB.js → chunk-BSU2YIWB.js} +9 -3
- package/dist/{chunk-CLJ5HLUD.js → chunk-C4PTHK7P.js} +24 -5
- package/dist/{chunk-QV47YRF4.js → chunk-CGKSTWHD.js} +7 -1
- package/dist/{chunk-BYEU76JP.js → chunk-DKGKUHFA.js} +34 -9
- package/dist/chunk-EYOKLTMF.js +170 -0
- package/dist/{chunk-PS4PFJQP.js → chunk-FCIH3BIZ.js} +15258 -14130
- package/dist/{chunk-2J63S4SF.js → chunk-FST4FYJB.js} +82 -14
- package/dist/{chunk-3DANZDGR.js → chunk-G34LV2PF.js} +34 -9
- package/dist/{chunk-BBUH4VAA.js → chunk-GAEBEQVI.js} +34 -21
- package/dist/chunk-GB6QRBXN.js +8543 -0
- package/dist/chunk-GEP36Y4X.js +12796 -0
- package/dist/{chunk-TKHQ4DGZ.js → chunk-H6F6BYOH.js} +496 -121
- package/dist/{chunk-UGYAX5YI.js → chunk-HQQID6OA.js} +10 -5
- package/dist/chunk-IHXBNWMM.js +137 -0
- package/dist/{chunk-ME6DNWIU.js → chunk-IS3ONKU3.js} +7 -1
- package/dist/{chunk-DXQNI4PC.js → chunk-IWHMRKLL.js} +8 -1
- package/dist/chunk-K2ITRMHZ.js +642 -0
- package/dist/{chunk-KBR4MZZR.js → chunk-K5XEMXTI.js} +7 -1
- package/dist/{chunk-AMFR5YA3.js → chunk-KKNLWXI6.js} +24 -10
- package/dist/{chunk-JWHCJDCI.js → chunk-KY56HMHH.js} +145 -61
- package/dist/{chunk-E3NYWENM.js → chunk-LU4TK2PR.js} +52 -7
- package/dist/{chunk-UWIJNAOB.js → chunk-M5T5VO65.js} +109 -42
- package/dist/{chunk-JPOWPFCU.js → chunk-MAR7Y6HW.js} +38 -16
- package/dist/chunk-N6F52NLF.js +6951 -0
- package/dist/{chunk-UHTSULZS.js → chunk-NMOX6HFD.js} +20 -7
- package/dist/{chunk-WD6AJM35.js → chunk-OLBBMFRD.js} +30 -13
- package/dist/{chunk-VOO7NYPP.js → chunk-PFEFKVGL.js} +22 -6
- package/dist/{chunk-6CWDTGUC.js → chunk-PIUMUEMV.js} +7 -1
- package/dist/chunk-PV4JUBVJ.js +462 -0
- package/dist/{chunk-527KG6XR.js → chunk-Q3RUPKEJ.js} +22 -4
- package/dist/{chunk-D5YD55AR.js → chunk-Q5WJOSJ7.js} +11 -1
- package/dist/{chunk-5N2FG33Q.js → chunk-R346GLFC.js} +7 -1
- package/dist/{chunk-4UQA7NCT.js → chunk-R5KLMSBV.js} +7 -2
- package/dist/{chunk-PIDUD6M2.js → chunk-RDLVBZEO.js} +11 -6
- package/dist/{chunk-O4EJEDHO.js → chunk-RPTR2H26.js} +40 -31
- package/dist/{chunk-HBU5MTAM.js → chunk-SVNXH4L2.js} +7 -1
- package/dist/{chunk-XNISANGE.js → chunk-TEKV33Q5.js} +122 -57
- package/dist/chunk-TXOTCRLG.js +15 -0
- package/dist/{chunk-VPAWTYLY.js → chunk-WEPFGWHJ.js} +7 -1
- package/dist/{chunk-HMYNFFY4.js → chunk-XPLRXC72.js} +7 -2
- package/dist/{chunk-UU3R62TT.js → chunk-XYWBQRDM.js} +13 -4
- package/dist/{chunk-7BHLZB3A.js → chunk-ZPY3JZ5E.js} +32 -10
- package/dist/cli/index.js +39 -33
- package/dist/clio-BZVGEUFJ.js +58 -0
- package/dist/{components-JVHMUBEB.js → components-DMAOEKFB.js} +26 -9
- package/dist/{config-ZFCDBMDC.js → config-IRUQ7SE4.js} +42 -31
- package/dist/configure-S7S6F6CL.js +32 -0
- package/dist/{context-CDXTP2MP.js → context-3KWFLHJG.js} +17 -11
- package/dist/{context-E3KIFVXI.js → context-5RADCKTR.js} +33 -28
- package/dist/{context-clear-3F4PLXOS.js → context-clear-7TSNPAAI.js} +36 -28
- package/dist/{context-index-Q7YSYTR3.js → context-index-W4RLWOQH.js} +10 -4
- package/dist/{docs-YIETIWZI.js → docs-5AWSPS37.js} +16 -10
- package/dist/doctor-UC5NAJYQ.js +77 -0
- package/dist/{eval-B3KZZESM.js → eval-U6TJHRLX.js} +77 -24
- package/dist/{evidence-V67CHM35.js → evidence-YEGUW4L3.js} +34 -26
- package/dist/{evolve-YDZSUQYA.js → evolve-TXARCTPG.js} +39 -26
- package/dist/{extensions-SRG7XCAH.js → extensions-OZFJ3A3G.js} +13 -7
- package/dist/{fleet-CA2CRTVG.js → fleet-6G3DHNYE.js} +45 -37
- package/dist/fleet-preflight-DSNT37JK.js +23 -0
- package/dist/{init-2OZDJE2D.js → init-KZ5QTF6M.js} +42 -34
- package/dist/{memory-3PIQQAKX.js → memory-73ESV5YC.js} +35 -27
- package/dist/{models-DY35XI7Y.js → models-A4PVNWJK.js} +34 -23
- package/dist/{paths-5OMXW7Z4.js → paths-C4H6IV77.js} +12 -6
- package/dist/preload-6WVMHX3A.js +13 -0
- package/dist/{reset-PIFYNOS3.js → reset-BGW6OGMV.js} +17 -11
- package/dist/{run-3VSPP24F.js → run-YTPEYQOH.js} +60 -48
- package/dist/{share-D36RQCXM.js → share-YIFFV4NQ.js} +16 -10
- package/dist/{skills-F2MRLELY.js → skills-2V6RA3OQ.js} +18 -11
- package/dist/{skills-eval-E2ZTW4PL.js → skills-eval-S2TVJO4F.js} +45 -36
- package/dist/{targets-DZMEZAH4.js → targets-TYXLPB23.js} +61 -59
- package/dist/{trace-7NYCUI2J.js → trace-GGOJ6Q6Z.js} +9 -3
- package/dist/{uninstall-AD3JWHBB.js → uninstall-LLLT4F4W.js} +14 -8
- package/dist/{upgrade-WYYBKGDY.js → upgrade-33G2LMM5.js} +45 -23
- package/dist/{usage-ULIDAGFF.js → usage-ZAFSXKKG.js} +35 -27
- package/dist/version-KGEG7EPO.js +21 -0
- package/dist/{wiki-generate-PKFIX6OB.js → wiki-generate-NUQCVOQ3.js} +55 -45
- package/dist/worker/entry.js +101 -43
- package/docs/README.md +12 -9
- package/docs/acp.md +28 -5
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +23 -2
- package/docs/artifact-placement.md +101 -0
- package/docs/artifact-versions.md +1 -1
- package/docs/built-in-agents.md +4 -2
- package/docs/capacity-and-scheduling.md +1 -1
- package/docs/commands-and-modes.md +125 -41
- package/docs/configuration-and-targets.md +88 -18
- package/docs/context-engine.md +6 -2
- package/docs/development-pipeline.md +77 -0
- package/docs/documentation-coverage.md +4 -4
- package/docs/documentation-guide.md +3 -3
- package/docs/environment-variables.md +2 -1
- package/docs/eval-runner.md +3 -3
- package/docs/evals-internal.md +2 -2
- package/docs/evidence-and-memory.md +6 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +1 -1
- package/docs/extensions-and-sharing.md +18 -11
- package/docs/fleet-demo-runbook.md +22 -23
- package/docs/fleet-dispatch.md +111 -12
- package/docs/glossary.md +107 -15
- package/docs/html/agents_blueprint.html +3 -3
- package/docs/html/alcf_blueprint.html +3 -3
- package/docs/html/architecture_blueprint.html +3 -3
- package/docs/html/commands_blueprint.html +187 -42
- package/docs/html/configuration_blueprint.html +7 -7
- package/docs/html/context_blueprint.html +3 -3
- package/docs/html/documentation_blueprint.html +1 -1
- package/docs/html/environment_blueprint.html +3 -3
- package/docs/html/eval_blueprint.html +4 -4
- package/docs/html/evals_internal_blueprint.html +3 -3
- package/docs/html/evolution_blueprint.html +3 -3
- package/docs/html/extensions_blueprint.html +3 -3
- package/docs/html/fleet_dispatch_blueprint.html +8 -8
- package/docs/html/index.html +5 -5
- package/docs/html/lifecycle_blueprint.html +4 -4
- package/docs/html/memory_blueprint.html +3 -3
- package/docs/html/middleware_blueprint.html +3 -3
- package/docs/html/models_blueprint.html +2 -2
- package/docs/html/observability_blueprint.html +2 -2
- package/docs/html/provider_adapter_blueprint.html +3 -3
- package/docs/html/safety_blueprint.html +3 -3
- package/docs/html/skills_blueprint.html +2 -2
- package/docs/html/soak_blueprint.html +3 -3
- package/docs/html/tool_usage_blueprint.html +4 -4
- package/docs/html/tools_blueprint.html +2 -2
- package/docs/html/trace_blueprint.html +3 -3
- package/docs/html/tui_design_blueprint.html +100 -40
- package/docs/html/validation_blueprint.html +1 -1
- package/docs/html/worker_dispatch_blueprint.html +3 -3
- package/docs/installation-and-lifecycle.md +62 -11
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +2 -2
- package/docs/observability.md +3 -3
- package/docs/proactive-memory.md +12 -12
- package/docs/prompt-envelope-and-tools.md +2 -2
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +4 -0
- package/docs/safety-model.md +21 -5
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +2 -2
- package/docs/skills-marketplace.md +1 -1
- package/docs/time-conventions.md +101 -0
- package/docs/tool-usage.md +5 -4
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +1 -1
- package/docs/tui-design.md +83 -27
- package/docs/worker-dispatch-mechanics.md +3 -3
- package/package.json +16 -16
- package/skills/README.md +5 -6
- package/skills/git/file-ticket/SKILL.md +107 -0
- package/skills/git/file-ticket/evals.md +54 -0
- package/skills/git/fix-issue/SKILL.md +106 -0
- package/skills/git/fix-issue/evals.md +71 -0
- package/skills/git/ship/SKILL.md +92 -0
- package/skills/git/ship/evals.md +72 -0
- package/skills/skill-marketplace.json +12 -20
- package/src/cli/acp.ts +88 -0
- package/src/cli/agents.ts +60 -0
- package/src/cli/args.ts +280 -0
- package/src/cli/argv.ts +170 -0
- package/src/cli/ask.ts +34 -0
- package/src/cli/auth.ts +468 -0
- package/src/cli/bootstrap-generate.ts +498 -0
- package/src/cli/clio.ts +34 -0
- package/src/cli/components.ts +195 -0
- package/src/cli/config-inspect.ts +330 -0
- package/src/cli/config.ts +72 -0
- package/src/cli/configure-interop.ts +67 -0
- package/src/cli/configure-layout.ts +172 -0
- package/src/cli/configure.ts +1487 -0
- package/src/cli/context-clear.ts +76 -0
- package/src/cli/context-index.ts +102 -0
- package/src/cli/context.ts +316 -0
- package/src/cli/default-target.ts +63 -0
- package/src/cli/docs.ts +340 -0
- package/src/cli/doctor.ts +54 -0
- package/src/cli/eval.ts +315 -0
- package/src/cli/evidence.ts +222 -0
- package/src/cli/evolve.ts +219 -0
- package/src/cli/extensions.ts +205 -0
- package/src/cli/fleet.ts +827 -0
- package/src/cli/index.ts +309 -0
- package/src/cli/init.ts +219 -0
- package/src/cli/initial-message.ts +47 -0
- package/src/cli/internal-dispatch.ts +55 -0
- package/src/cli/memory.ts +180 -0
- package/src/cli/models.ts +257 -0
- package/src/cli/modes/json-stream.ts +85 -0
- package/src/cli/modes/jsonl.ts +9 -0
- package/src/cli/modes/print.ts +589 -0
- package/src/cli/oauth-manual-input.ts +72 -0
- package/src/cli/oauth-select.ts +36 -0
- package/src/cli/output-guard.ts +48 -0
- package/src/cli/paths.ts +44 -0
- package/src/cli/provider-target.ts +113 -0
- package/src/cli/removal.ts +72 -0
- package/src/cli/reset.ts +253 -0
- package/src/cli/run.ts +497 -0
- package/src/cli/share.ts +243 -0
- package/src/cli/shared.ts +60 -0
- package/src/cli/skills-eval.ts +1225 -0
- package/src/cli/skills.ts +470 -0
- package/src/cli/steer-channel.ts +86 -0
- package/src/cli/targets.ts +1150 -0
- package/src/cli/text-layout.ts +102 -0
- package/src/cli/trace.ts +274 -0
- package/src/cli/uninstall.ts +405 -0
- package/src/cli/upgrade.ts +270 -0
- package/src/cli/usage.ts +869 -0
- package/src/cli/validate-model.ts +28 -0
- package/src/cli/version.ts +7 -0
- package/src/cli/wiki-generate.ts +509 -0
- package/src/core/artifact-paths.ts +43 -0
- package/src/core/bash-exec.ts +242 -0
- package/src/core/boot-trace.ts +37 -0
- package/src/core/bus-events.ts +728 -0
- package/src/core/bus-trace.ts +53 -0
- package/src/core/c-header-language.ts +265 -0
- package/src/core/clio-repo.ts +78 -0
- package/src/core/config.ts +1593 -0
- package/src/core/context-floor.ts +33 -0
- package/src/core/defaults.ts +625 -0
- package/src/core/domain-loader.ts +170 -0
- package/src/core/event-bus.ts +94 -0
- package/src/core/file-references.ts +282 -0
- package/src/core/guardrails.ts +185 -0
- package/src/core/headless-permission.ts +21 -0
- package/src/core/init.ts +223 -0
- package/src/core/json-payload.ts +58 -0
- package/src/core/package-root.ts +54 -0
- package/src/core/path-canonical.ts +37 -0
- package/src/core/process-identity.ts +41 -0
- package/src/core/recent-models.ts +91 -0
- package/src/core/release.ts +2 -0
- package/src/core/residency-protection.ts +56 -0
- package/src/core/resolve-config-value.ts +88 -0
- package/src/core/response-schema.ts +279 -0
- package/src/core/run-overrides.ts +77 -0
- package/src/core/safe-exec.ts +193 -0
- package/src/core/safe-id.ts +37 -0
- package/src/core/safe-resource-write.ts +162 -0
- package/src/core/session-routing.ts +339 -0
- package/src/core/settings-layers.ts +220 -0
- package/src/core/shared-bus.ts +8 -0
- package/src/core/shell-quote.ts +26 -0
- package/src/core/skill-activation.ts +190 -0
- package/src/core/startup-timer.ts +37 -0
- package/src/core/state-file-lock.ts +207 -0
- package/src/core/termination.ts +202 -0
- package/src/core/timers.ts +38 -0
- package/src/core/tool-names.ts +65 -0
- package/src/core/verification-scripts.ts +13 -0
- package/src/core/workspace-files.ts +492 -0
- package/src/core/xdg.ts +177 -0
- package/src/domains/agents/builtins/architect.md +4 -4
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +1 -1
- package/src/domains/agents/builtins/documenter.md +1 -1
- package/src/domains/agents/builtins/git-master.md +3 -3
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +1 -1
- package/src/domains/agents/builtins/verifier.md +1 -1
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +172 -0
- package/src/domains/agents/contract.ts +16 -0
- package/src/domains/agents/extension.ts +110 -0
- package/src/domains/agents/fleet-commands.ts +154 -0
- package/src/domains/agents/fleet-contract.ts +797 -0
- package/src/domains/agents/frontmatter.ts +40 -0
- package/src/domains/agents/index.ts +102 -0
- package/src/domains/agents/manifest.ts +6 -0
- package/src/domains/agents/recipe-schema.ts +202 -0
- package/src/domains/agents/recipe.ts +125 -0
- package/src/domains/agents/registry.ts +111 -0
- package/src/domains/agents/result-contract.ts +1265 -0
- package/src/domains/agents/spec.ts +371 -0
- package/src/domains/agents/write-boundary.ts +109 -0
- package/src/domains/components/diff.ts +99 -0
- package/src/domains/components/hash.ts +21 -0
- package/src/domains/components/index.ts +3 -0
- package/src/domains/components/scan.ts +304 -0
- package/src/domains/components/snapshot.ts +108 -0
- package/src/domains/components/types.ts +82 -0
- package/src/domains/config/agent-namespace.ts +13 -0
- package/src/domains/config/classify.ts +94 -0
- package/src/domains/config/contract.ts +22 -0
- package/src/domains/config/extension.ts +136 -0
- package/src/domains/config/index.ts +13 -0
- package/src/domains/config/keybindings.ts +164 -0
- package/src/domains/config/manifest.ts +6 -0
- package/src/domains/config/watcher.ts +41 -0
- package/src/domains/context/adoption.ts +880 -0
- package/src/domains/context/bootstrap-prompt.ts +273 -0
- package/src/domains/context/bootstrap.ts +1409 -0
- package/src/domains/context/clear.ts +86 -0
- package/src/domains/context/clio-md.ts +327 -0
- package/src/domains/context/codewiki/cmake.ts +356 -0
- package/src/domains/context/codewiki/cooperative.ts +46 -0
- package/src/domains/context/codewiki/digest.ts +135 -0
- package/src/domains/context/codewiki/grammar-assets.ts +33 -0
- package/src/domains/context/codewiki/indexer.ts +1614 -0
- package/src/domains/context/codewiki/tree-sitter.ts +771 -0
- package/src/domains/context/contract.ts +62 -0
- package/src/domains/context/excluded-dirs.ts +1 -0
- package/src/domains/context/extension.ts +407 -0
- package/src/domains/context/fingerprint.ts +196 -0
- package/src/domains/context/index.ts +164 -0
- package/src/domains/context/init-options.ts +69 -0
- package/src/domains/context/manifest.ts +6 -0
- package/src/domains/context/operator-profile.ts +157 -0
- package/src/domains/context/project-metadata.ts +510 -0
- package/src/domains/context/project-rules.ts +227 -0
- package/src/domains/context/prompt-context.ts +62 -0
- package/src/domains/context/refresh.ts +170 -0
- package/src/domains/context/sibling-files.ts +10 -0
- package/src/domains/context/state.ts +237 -0
- package/src/domains/context/wiki/assemble.ts +303 -0
- package/src/domains/context/wiki/frontmatter.ts +210 -0
- package/src/domains/context/wiki/generate.ts +590 -0
- package/src/domains/context/wiki/layout.ts +111 -0
- package/src/domains/context/wiki/meta.ts +221 -0
- package/src/domains/context/wiki/plan-store.ts +217 -0
- package/src/domains/context/wiki/plan.ts +250 -0
- package/src/domains/context/wiki/prompts.ts +270 -0
- package/src/domains/context/wiki/staleness.ts +198 -0
- package/src/domains/dispatch/active-route-planner.ts +168 -0
- package/src/domains/dispatch/admission-queue.ts +150 -0
- package/src/domains/dispatch/admission.ts +334 -0
- package/src/domains/dispatch/agent-candidates.ts +307 -0
- package/src/domains/dispatch/agent-ledger-hub.ts +71 -0
- package/src/domains/dispatch/agent-ledger-store.ts +257 -0
- package/src/domains/dispatch/agent-ledger.ts +212 -0
- package/src/domains/dispatch/agent-plan-adapter.ts +85 -0
- package/src/domains/dispatch/assignment-events.ts +132 -0
- package/src/domains/dispatch/assignment-reconcile.ts +76 -0
- package/src/domains/dispatch/assignment-store.ts +162 -0
- package/src/domains/dispatch/assignment.ts +278 -0
- package/src/domains/dispatch/backoff.ts +59 -0
- package/src/domains/dispatch/batch-store.ts +134 -0
- package/src/domains/dispatch/batch-tracker.ts +66 -0
- package/src/domains/dispatch/capability-match.ts +155 -0
- package/src/domains/dispatch/capacity-lease.ts +413 -0
- package/src/domains/dispatch/code-step-store.ts +52 -0
- package/src/domains/dispatch/code-step.ts +368 -0
- package/src/domains/dispatch/contract.ts +278 -0
- package/src/domains/dispatch/dedup.ts +133 -0
- package/src/domains/dispatch/event-pump.ts +251 -0
- package/src/domains/dispatch/execution-handoff.ts +29 -0
- package/src/domains/dispatch/execution-plan.ts +328 -0
- package/src/domains/dispatch/execution-role.ts +277 -0
- package/src/domains/dispatch/execution-scheduler.ts +583 -0
- package/src/domains/dispatch/extension.ts +5869 -0
- package/src/domains/dispatch/failure-classification.ts +141 -0
- package/src/domains/dispatch/fleet-plan.ts +225 -0
- package/src/domains/dispatch/fleet-preflight.ts +394 -0
- package/src/domains/dispatch/gate-decisions.ts +1040 -0
- package/src/domains/dispatch/gate-role-prompts.ts +58 -0
- package/src/domains/dispatch/heartbeat.ts +27 -0
- package/src/domains/dispatch/index.ts +137 -0
- package/src/domains/dispatch/joint-route-adapter.ts +114 -0
- package/src/domains/dispatch/joint-route-resolver.ts +283 -0
- package/src/domains/dispatch/manifest.ts +6 -0
- package/src/domains/dispatch/orphan-recovery.ts +224 -0
- package/src/domains/dispatch/outcome.ts +109 -0
- package/src/domains/dispatch/phase-timing.ts +47 -0
- package/src/domains/dispatch/placement.ts +202 -0
- package/src/domains/dispatch/receipt-findings.ts +255 -0
- package/src/domains/dispatch/receipt-integrity.ts +378 -0
- package/src/domains/dispatch/recovery-candidates.ts +74 -0
- package/src/domains/dispatch/reproducibility.ts +48 -0
- package/src/domains/dispatch/reservation-store.ts +501 -0
- package/src/domains/dispatch/route-approval.ts +177 -0
- package/src/domains/dispatch/route-candidates.ts +57 -0
- package/src/domains/dispatch/route-decision.ts +1079 -0
- package/src/domains/dispatch/route-facts.ts +187 -0
- package/src/domains/dispatch/route-history.ts +238 -0
- package/src/domains/dispatch/route-observer.ts +488 -0
- package/src/domains/dispatch/route-policy.ts +327 -0
- package/src/domains/dispatch/route-quality.ts +256 -0
- package/src/domains/dispatch/route-readiness.ts +120 -0
- package/src/domains/dispatch/routing-intent.ts +287 -0
- package/src/domains/dispatch/run-identity.ts +56 -0
- package/src/domains/dispatch/scout-transition.ts +130 -0
- package/src/domains/dispatch/state.ts +277 -0
- package/src/domains/dispatch/tool-stats.ts +132 -0
- package/src/domains/dispatch/transport.ts +209 -0
- package/src/domains/dispatch/types.ts +785 -0
- package/src/domains/dispatch/validation-grounding.ts +154 -0
- package/src/domains/dispatch/validation.ts +721 -0
- package/src/domains/dispatch/worker-protocol.ts +275 -0
- package/src/domains/dispatch/worker-spawn.ts +566 -0
- package/src/domains/dispatch/write-boundary-enforcer.ts +97 -0
- package/src/domains/dispatch/write-boundary.ts +426 -0
- package/src/domains/eval/artifacts/redact.ts +42 -0
- package/src/domains/eval/artifacts/store.ts +173 -0
- package/src/domains/eval/compare/compare.ts +33 -0
- package/src/domains/eval/compare/gates.ts +66 -0
- package/src/domains/eval/compare/thresholds.ts +92 -0
- package/src/domains/eval/harness-metrics.ts +62 -0
- package/src/domains/eval/index.ts +66 -0
- package/src/domains/eval/metrics/chaos-stream.ts +93 -0
- package/src/domains/eval/metrics/context.ts +34 -0
- package/src/domains/eval/metrics/coverage.ts +21 -0
- package/src/domains/eval/metrics/evidence.ts +182 -0
- package/src/domains/eval/metrics/fleet-loop-stream.ts +196 -0
- package/src/domains/eval/metrics/invariants.ts +736 -0
- package/src/domains/eval/metrics/latency.ts +4 -0
- package/src/domains/eval/metrics/token-stream.ts +139 -0
- package/src/domains/eval/metrics/tokens.ts +51 -0
- package/src/domains/eval/metrics/tool-calls.ts +7 -0
- package/src/domains/eval/proactive-memory.ts +279 -0
- package/src/domains/eval/provenance.ts +35 -0
- package/src/domains/eval/report.ts +234 -0
- package/src/domains/eval/reports/json.ts +5 -0
- package/src/domains/eval/reports/junit.ts +23 -0
- package/src/domains/eval/reports/markdown.ts +20 -0
- package/src/domains/eval/reports/swe-jsonl.ts +16 -0
- package/src/domains/eval/reports/text.ts +25 -0
- package/src/domains/eval/run-compare.ts +274 -0
- package/src/domains/eval/runner.ts +244 -0
- package/src/domains/eval/runners/clio-run.ts +148 -0
- package/src/domains/eval/runners/context-index.ts +56 -0
- package/src/domains/eval/runners/context-init.ts +203 -0
- package/src/domains/eval/runners/external-command.ts +350 -0
- package/src/domains/eval/runtime-paths.ts +171 -0
- package/src/domains/eval/schema/artifact.ts +75 -0
- package/src/domains/eval/schema/suite.ts +235 -0
- package/src/domains/eval/schema/validate.ts +339 -0
- package/src/domains/eval/store.ts +392 -0
- package/src/domains/eval/suites/load.ts +74 -0
- package/src/domains/eval/suites/matrix.ts +19 -0
- package/src/domains/eval/suites/resolve.ts +44 -0
- package/src/domains/eval/suites/run.ts +325 -0
- package/src/domains/eval/task-file.ts +186 -0
- package/src/domains/eval/types.ts +141 -0
- package/src/domains/eval/verifiers/command.ts +27 -0
- package/src/domains/eval/verifiers/file-exists.ts +6 -0
- package/src/domains/eval/verifiers/patch.ts +22 -0
- package/src/domains/eval/workspaces/git.ts +41 -0
- package/src/domains/eval/workspaces/local.ts +17 -0
- package/src/domains/eval/workspaces/temp-copy.ts +29 -0
- package/src/domains/evidence/build.ts +1714 -0
- package/src/domains/evidence/eval.ts +605 -0
- package/src/domains/evidence/failure-attribution.ts +54 -0
- package/src/domains/evidence/finish-contract-map.ts +42 -0
- package/src/domains/evidence/index.ts +55 -0
- package/src/domains/evidence/provenance.ts +200 -0
- package/src/domains/evidence/redact.ts +81 -0
- package/src/domains/evidence/store.ts +291 -0
- package/src/domains/evidence/types.ts +325 -0
- package/src/domains/evolution/SELF_EDIT_GATE.md +91 -0
- package/src/domains/evolution/index.ts +26 -0
- package/src/domains/evolution/manifest.ts +154 -0
- package/src/domains/evolution/validate.ts +304 -0
- package/src/domains/extensions/contract.ts +22 -0
- package/src/domains/extensions/discovery.ts +193 -0
- package/src/domains/extensions/extension.ts +46 -0
- package/src/domains/extensions/index.ts +34 -0
- package/src/domains/extensions/manager.ts +30 -0
- package/src/domains/extensions/manifest.ts +6 -0
- package/src/domains/extensions/resources.ts +38 -0
- package/src/domains/extensions/state.ts +224 -0
- package/src/domains/extensions/types.ts +83 -0
- package/src/domains/interop/consent.ts +185 -0
- package/src/domains/interop/contract.ts +29 -0
- package/src/domains/interop/detect.ts +173 -0
- package/src/domains/interop/extension.ts +59 -0
- package/src/domains/interop/index.ts +34 -0
- package/src/domains/interop/manifest.ts +6 -0
- package/src/domains/interop/registry.ts +139 -0
- package/src/domains/interop/state.ts +92 -0
- package/src/domains/interop/types.ts +109 -0
- package/src/domains/lifecycle/contract.ts +11 -0
- package/src/domains/lifecycle/doctor.ts +536 -0
- package/src/domains/lifecycle/extension.ts +23 -0
- package/src/domains/lifecycle/index.ts +21 -0
- package/src/domains/lifecycle/install-method.ts +51 -0
- package/src/domains/lifecycle/manifest.ts +6 -0
- package/src/domains/lifecycle/migrations/index.ts +94 -0
- package/src/domains/lifecycle/state.ts +93 -0
- package/src/domains/lifecycle/upgrade-notice.ts +35 -0
- package/src/domains/lifecycle/version.ts +35 -0
- package/src/domains/memory/index.ts +128 -0
- package/src/domains/memory/operations.ts +143 -0
- package/src/domains/memory/prompt-section.ts +86 -0
- package/src/domains/memory/proposal.ts +180 -0
- package/src/domains/memory/store.ts +163 -0
- package/src/domains/memory/task-bank.ts +229 -0
- package/src/domains/memory/task-memory-handoff.ts +222 -0
- package/src/domains/memory/task-memory-policy.ts +602 -0
- package/src/domains/memory/task-memory-status.ts +58 -0
- package/src/domains/memory/task-memory-telemetry.ts +346 -0
- package/src/domains/memory/task-memory-trace.ts +89 -0
- package/src/domains/memory/types.ts +74 -0
- package/src/domains/memory/validate.ts +297 -0
- package/src/domains/middleware/budget.ts +216 -0
- package/src/domains/middleware/contract.ts +35 -0
- package/src/domains/middleware/dispatch-nudge.ts +469 -0
- package/src/domains/middleware/extension.ts +129 -0
- package/src/domains/middleware/hook-receipts.ts +70 -0
- package/src/domains/middleware/hooks-io.ts +174 -0
- package/src/domains/middleware/hooks.ts +432 -0
- package/src/domains/middleware/index.ts +154 -0
- package/src/domains/middleware/manifest.ts +6 -0
- package/src/domains/middleware/memory-intervention.ts +701 -0
- package/src/domains/middleware/rules.ts +42 -0
- package/src/domains/middleware/runtime.ts +333 -0
- package/src/domains/middleware/skills-reminder.ts +187 -0
- package/src/domains/middleware/snapshot.ts +71 -0
- package/src/domains/middleware/stalled-turn.ts +71 -0
- package/src/domains/middleware/task-board-reminder.ts +87 -0
- package/src/domains/middleware/task-nudge.ts +77 -0
- package/src/domains/middleware/tool-choice-control.ts +42 -0
- package/src/domains/middleware/types.ts +131 -0
- package/src/domains/middleware/validate.ts +329 -0
- package/src/domains/observability/accountability.ts +67 -0
- package/src/domains/observability/contract.ts +168 -0
- package/src/domains/observability/cost.ts +206 -0
- package/src/domains/observability/evidence-index.ts +123 -0
- package/src/domains/observability/extension.ts +281 -0
- package/src/domains/observability/index.ts +78 -0
- package/src/domains/observability/manifest.ts +10 -0
- package/src/domains/observability/metrics.ts +37 -0
- package/src/domains/observability/projection.ts +477 -0
- package/src/domains/observability/telemetry.ts +89 -0
- package/src/domains/observability/trace-store.ts +1454 -0
- package/src/domains/prompts/compiler.ts +556 -0
- package/src/domains/prompts/contract.ts +30 -0
- package/src/domains/prompts/extension.ts +304 -0
- package/src/domains/prompts/fragment-loader.ts +139 -0
- package/src/domains/prompts/fragments/identity/clio.md +3 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +63 -0
- package/src/domains/prompts/fragments/operating/contract.md +10 -1
- package/src/domains/prompts/hash.ts +73 -0
- package/src/domains/prompts/index.ts +32 -0
- package/src/domains/prompts/manifest.ts +8 -0
- package/src/domains/prompts/memory-intervention.ts +57 -0
- package/src/domains/prompts/preload.ts +82 -0
- package/src/domains/providers/auth/api-key.ts +47 -0
- package/src/domains/providers/auth/backend-file.ts +69 -0
- package/src/domains/providers/auth/backend-memory.ts +17 -0
- package/src/domains/providers/auth/index.ts +37 -0
- package/src/domains/providers/auth/oauth.ts +36 -0
- package/src/domains/providers/auth/storage.ts +667 -0
- package/src/domains/providers/capabilities.ts +50 -0
- package/src/domains/providers/catalog.ts +162 -0
- package/src/domains/providers/contract.ts +151 -0
- package/src/domains/providers/credentials.ts +20 -0
- package/src/domains/providers/eligibility.ts +24 -0
- package/src/domains/providers/errors.ts +64 -0
- package/src/domains/providers/extension.ts +536 -0
- package/src/domains/providers/index.ts +142 -0
- package/src/domains/providers/knowledge-base-path.ts +102 -0
- package/src/domains/providers/manifest.ts +6 -0
- package/src/domains/providers/model-capabilities.ts +136 -0
- package/src/domains/providers/model-discovery.ts +144 -0
- package/src/domains/providers/model-family.ts +32 -0
- package/src/domains/providers/model-runtime-capabilities.ts +712 -0
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +2 -2
- package/src/domains/providers/plugins.ts +59 -0
- package/src/domains/providers/probe/fingerprint.ts +44 -0
- package/src/domains/providers/probe/http.ts +114 -0
- package/src/domains/providers/probe/reasoning.ts +111 -0
- package/src/domains/providers/registry.ts +166 -0
- package/src/domains/providers/resolver.ts +156 -0
- package/src/domains/providers/runtime-resolution.ts +720 -0
- package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +90 -0
- package/src/domains/providers/runtimes/builtins.ts +78 -0
- package/src/domains/providers/runtimes/claude/claude-code.ts +38 -0
- package/src/domains/providers/runtimes/claude/claude-sdk.ts +38 -0
- package/src/domains/providers/runtimes/claude/common.ts +55 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +171 -0
- package/src/domains/providers/runtimes/cloud/anthropic-max.ts +71 -0
- package/src/domains/providers/runtimes/cloud/anthropic.ts +43 -0
- package/src/domains/providers/runtimes/cloud/bedrock.ts +35 -0
- package/src/domains/providers/runtimes/cloud/deepseek.ts +50 -0
- package/src/domains/providers/runtimes/cloud/google.ts +41 -0
- package/src/domains/providers/runtimes/cloud/groq.ts +46 -0
- package/src/domains/providers/runtimes/cloud/mistral.ts +46 -0
- package/src/domains/providers/runtimes/cloud/openai-codex.ts +49 -0
- package/src/domains/providers/runtimes/cloud/openai.ts +46 -0
- package/src/domains/providers/runtimes/cloud/openrouter.ts +111 -0
- package/src/domains/providers/runtimes/common/lmstudio-logger.ts +32 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +165 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +474 -0
- package/src/domains/providers/runtimes/local-native/lemonade-anthropic.ts +27 -0
- package/src/domains/providers/runtimes/local-native/lemonade-openai.ts +26 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +88 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +207 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +180 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +126 -0
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +98 -0
- package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +491 -0
- package/src/domains/providers/runtimes/local-native/ollama-native.ts +117 -0
- package/src/domains/providers/runtimes/local-native/sglang.ts +26 -0
- package/src/domains/providers/runtimes/local-native/vllm.ts +27 -0
- package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +104 -0
- package/src/domains/providers/runtimes/protocol/anthropic-messages.ts +28 -0
- package/src/domains/providers/runtimes/protocol/bedrock.ts +26 -0
- package/src/domains/providers/runtimes/protocol/google.ts +27 -0
- package/src/domains/providers/runtimes/protocol/openai-compat.ts +145 -0
- package/src/domains/providers/support.ts +238 -0
- package/src/domains/providers/thinking-control-policy.ts +85 -0
- package/src/domains/providers/types/capability-flags.ts +114 -0
- package/src/domains/providers/types/cost-provenance.ts +7 -0
- package/src/domains/providers/types/inference.ts +41 -0
- package/src/domains/providers/types/knowledge-base.ts +156 -0
- package/src/domains/providers/types/local-model-quirks.ts +218 -0
- package/src/domains/providers/types/runtime-descriptor.ts +170 -0
- package/src/domains/providers/types/target-descriptor.ts +38 -0
- package/src/domains/resources/collision.ts +92 -0
- package/src/domains/resources/common-loader.ts +140 -0
- package/src/domains/resources/contract.ts +25 -0
- package/src/domains/resources/extension.ts +61 -0
- package/src/domains/resources/index.ts +74 -0
- package/src/domains/resources/loader.ts +86 -0
- package/src/domains/resources/manifest.ts +6 -0
- package/src/domains/resources/prompts/loader.ts +232 -0
- package/src/domains/resources/prompts/substitute.ts +65 -0
- package/src/domains/resources/skills/content-hash.ts +105 -0
- package/src/domains/resources/skills/evals.ts +175 -0
- package/src/domains/resources/skills/install.ts +410 -0
- package/src/domains/resources/skills/loader.ts +978 -0
- package/src/domains/resources/skills/marketplace.ts +255 -0
- package/src/domains/resources/skills/provenance-pin.ts +115 -0
- package/src/domains/safety/action-classifier.ts +268 -0
- package/src/domains/safety/approval-axis.ts +23 -0
- package/src/domains/safety/audit.ts +487 -0
- package/src/domains/safety/autonomy.ts +174 -0
- package/src/domains/safety/call-target.ts +59 -0
- package/src/domains/safety/contract.ts +65 -0
- package/src/domains/safety/damage-control.ts +44 -0
- package/src/domains/safety/default-path-policy.ts +117 -0
- package/src/domains/safety/extension.ts +383 -0
- package/src/domains/safety/finish-contract-registration.ts +128 -0
- package/src/domains/safety/finish-contract.ts +554 -0
- package/src/domains/safety/index.ts +44 -0
- package/src/domains/safety/loop-detector.ts +143 -0
- package/src/domains/safety/manifest.ts +6 -0
- package/src/domains/safety/path-policy.ts +164 -0
- package/src/domains/safety/policy-engine.ts +994 -0
- package/src/domains/safety/project-policy.ts +391 -0
- package/src/domains/safety/protected-artifacts-registration.ts +189 -0
- package/src/domains/safety/protected-artifacts.ts +993 -0
- package/src/domains/safety/rejection-feedback.ts +102 -0
- package/src/domains/safety/rigor.ts +72 -0
- package/src/domains/safety/rule-compiler.ts +48 -0
- package/src/domains/safety/rule-pack-loader.ts +92 -0
- package/src/domains/safety/run-effects.ts +197 -0
- package/src/domains/safety/scope.ts +61 -0
- package/src/domains/scheduling/budget.ts +35 -0
- package/src/domains/scheduling/cluster.ts +175 -0
- package/src/domains/scheduling/contract.ts +30 -0
- package/src/domains/scheduling/extension.ts +91 -0
- package/src/domains/scheduling/index.ts +12 -0
- package/src/domains/scheduling/manifest.ts +6 -0
- package/src/domains/session/archive-readers.ts +208 -0
- package/src/domains/session/checkpoint.ts +38 -0
- package/src/domains/session/compaction/auto.ts +89 -0
- package/src/domains/session/compaction/branch-summary.ts +186 -0
- package/src/domains/session/compaction/compact.ts +493 -0
- package/src/domains/session/compaction/cut-point.ts +171 -0
- package/src/domains/session/compaction/defaults.ts +34 -0
- package/src/domains/session/compaction/mask-observations.ts +265 -0
- package/src/domains/session/compaction/session-entries.ts +18 -0
- package/src/domains/session/compaction/tokens.ts +147 -0
- package/src/domains/session/context-accounting.ts +583 -0
- package/src/domains/session/context-ledger.ts +348 -0
- package/src/domains/session/contract.ts +144 -0
- package/src/domains/session/cwd-fallback.ts +65 -0
- package/src/domains/session/entries.ts +509 -0
- package/src/domains/session/extension.ts +322 -0
- package/src/domains/session/history.ts +172 -0
- package/src/domains/session/index.ts +84 -0
- package/src/domains/session/manager.ts +128 -0
- package/src/domains/session/manifest.ts +6 -0
- package/src/domains/session/migrations/index.ts +27 -0
- package/src/domains/session/prompt-manifest.ts +173 -0
- package/src/domains/session/protected-artifact-journal.ts +241 -0
- package/src/domains/session/protected-artifacts.ts +90 -0
- package/src/domains/session/retry.ts +238 -0
- package/src/domains/session/task-board.ts +375 -0
- package/src/domains/session/tree/active-path.ts +98 -0
- package/src/domains/session/tree/fork.ts +160 -0
- package/src/domains/session/tree/manager.ts +128 -0
- package/src/domains/session/tree/navigator.ts +177 -0
- package/src/domains/session/tree/preview.ts +259 -0
- package/src/domains/session/usage.ts +148 -0
- package/src/domains/session/workspace/git-probe.ts +161 -0
- package/src/domains/session/workspace/index.ts +4 -0
- package/src/domains/session/workspace/project-type.ts +217 -0
- package/src/domains/session/workspace/snapshot.ts +74 -0
- package/src/domains/share/archive.ts +684 -0
- package/src/domains/share/contract.ts +9 -0
- package/src/domains/share/extension.ts +26 -0
- package/src/domains/share/index.ts +28 -0
- package/src/domains/share/manifest.ts +6 -0
- package/src/engine/acp/adapter.ts +397 -0
- package/src/engine/acp/errors.ts +32 -0
- package/src/engine/acp/event-mapper.ts +154 -0
- package/src/engine/acp/server.ts +656 -0
- package/src/engine/acp/tool-mediator.ts +686 -0
- package/src/engine/acp/transport.ts +654 -0
- package/src/engine/acp/types.ts +170 -0
- package/src/engine/agent.ts +29 -0
- package/src/engine/ai.ts +202 -0
- package/src/engine/alcf-oauth.ts +198 -0
- package/src/engine/antigravity/subprocess-runtime.ts +205 -0
- package/src/engine/apis/degraded-inference.ts +95 -0
- package/src/engine/apis/index.ts +20 -0
- package/src/engine/apis/llamacpp-residency.ts +252 -0
- package/src/engine/apis/lmstudio-native.ts +1438 -0
- package/src/engine/apis/lmstudio-residency.ts +92 -0
- package/src/engine/apis/ollama-native.ts +507 -0
- package/src/engine/apis/openai-completions.ts +716 -0
- package/src/engine/apis/output-budget.ts +99 -0
- package/src/engine/apis/residency-lock.ts +29 -0
- package/src/engine/apis/residency.ts +640 -0
- package/src/engine/apis/resident-models.ts +42 -0
- package/src/engine/apis/sampling-overrides.ts +38 -0
- package/src/engine/apis/thinking-replay.ts +11 -0
- package/src/engine/claude/sdk-runtime.ts +685 -0
- package/src/engine/claude/session-id.ts +5 -0
- package/src/engine/claude/subprocess-runtime.ts +316 -0
- package/src/engine/claude/tool-safety.ts +400 -0
- package/src/engine/external-subprocess.ts +23 -0
- package/src/engine/harmony-response.ts +165 -0
- package/src/engine/loop-guard.ts +1127 -0
- package/src/engine/oauth.ts +192 -0
- package/src/engine/pi-mono-names.ts +13 -0
- package/src/engine/provider-payload.ts +315 -0
- package/src/engine/select-list.ts +53 -0
- package/src/engine/session.ts +834 -0
- package/src/engine/strip-tokenizer-sentinels.ts +125 -0
- package/src/engine/tui.ts +103 -0
- package/src/engine/types.ts +66 -0
- package/src/engine/worker-events.ts +100 -0
- package/src/engine/worker-runtime.ts +1022 -0
- package/src/engine/worker-tools.ts +203 -0
- package/src/entry/orchestrator.ts +1873 -0
- package/src/interactive/application-controller.ts +346 -0
- package/src/interactive/bus-notices.ts +265 -0
- package/src/interactive/chat-loop-messages.ts +626 -0
- package/src/interactive/chat-loop-policy.ts +18 -0
- package/src/interactive/chat-loop.ts +865 -0
- package/src/interactive/chat-panel.ts +1694 -0
- package/src/interactive/chat-renderer.ts +1038 -0
- package/src/interactive/clio-editor.ts +166 -0
- package/src/interactive/command-fallbacks.ts +23 -0
- package/src/interactive/command-output.ts +85 -0
- package/src/interactive/context-activity.ts +203 -0
- package/src/interactive/context-meter.ts +223 -0
- package/src/interactive/context-overlay.ts +220 -0
- package/src/interactive/cost-overlay.ts +279 -0
- package/src/interactive/dispatch-board.ts +1319 -0
- package/src/interactive/dispatch-steering.ts +86 -0
- package/src/interactive/editor-bash.ts +46 -0
- package/src/interactive/editor-steer.ts +51 -0
- package/src/interactive/editor-submit.ts +303 -0
- package/src/interactive/external-editor.ts +67 -0
- package/src/interactive/follow-up-queue-panel.ts +75 -0
- package/src/interactive/footer/dashboard.ts +534 -0
- package/src/interactive/footer/notifications.ts +275 -0
- package/src/interactive/footer/widgets.ts +1246 -0
- package/src/interactive/footer-panel.ts +187 -0
- package/src/interactive/format-time.ts +85 -0
- package/src/interactive/index.ts +11 -0
- package/src/interactive/interactive-application.ts +755 -0
- package/src/interactive/interactive-event-projection.ts +380 -0
- package/src/interactive/interactive-input-runtime.ts +261 -0
- package/src/interactive/interactive-presentation.ts +452 -0
- package/src/interactive/interactive-shell.ts +134 -0
- package/src/interactive/interactive-slash-runtime.ts +492 -0
- package/src/interactive/interactive-subscriptions.ts +111 -0
- package/src/interactive/interactive-tickers.ts +152 -0
- package/src/interactive/keybinding-manager.ts +496 -0
- package/src/interactive/layout.ts +20 -0
- package/src/interactive/leader-key.ts +143 -0
- package/src/interactive/loop-guard-interrupt.ts +101 -0
- package/src/interactive/memory-overlay.ts +280 -0
- package/src/interactive/overlay-ask-user-lifecycle.ts +110 -0
- package/src/interactive/overlay-auth-lifecycle.ts +308 -0
- package/src/interactive/overlay-frame.ts +502 -0
- package/src/interactive/overlay-general-openers.ts +217 -0
- package/src/interactive/overlay-key-routing.ts +213 -0
- package/src/interactive/overlay-lifecycle.ts +413 -0
- package/src/interactive/overlay-model-selectors.ts +127 -0
- package/src/interactive/overlay-permission-lifecycle.ts +344 -0
- package/src/interactive/overlay-resource-openers.ts +112 -0
- package/src/interactive/overlay-session-lifecycle.ts +270 -0
- package/src/interactive/overlay-transitions.ts +57 -0
- package/src/interactive/overlays/agents.ts +69 -0
- package/src/interactive/overlays/ask-user.ts +921 -0
- package/src/interactive/overlays/auth-dialog.ts +221 -0
- package/src/interactive/overlays/context-reset.ts +108 -0
- package/src/interactive/overlays/cwd-fallback.ts +141 -0
- package/src/interactive/overlays/extensions.ts +54 -0
- package/src/interactive/overlays/help-reference.ts +140 -0
- package/src/interactive/overlays/interop.ts +139 -0
- package/src/interactive/overlays/keybinding-detail.ts +90 -0
- package/src/interactive/overlays/list-overlay.ts +606 -0
- package/src/interactive/overlays/message-picker.ts +155 -0
- package/src/interactive/overlays/model-selector.ts +1091 -0
- package/src/interactive/overlays/prompts.ts +72 -0
- package/src/interactive/overlays/session-selector-search.ts +31 -0
- package/src/interactive/overlays/session-selector.ts +266 -0
- package/src/interactive/overlays/settings.ts +3363 -0
- package/src/interactive/overlays/skills-hub.ts +237 -0
- package/src/interactive/overlays/tree-selector.ts +387 -0
- package/src/interactive/permission-overlay.ts +170 -0
- package/src/interactive/render-trace.ts +125 -0
- package/src/interactive/renderers/branch-summary.ts +86 -0
- package/src/interactive/renderers/code-ink.ts +420 -0
- package/src/interactive/renderers/compaction-summary.ts +112 -0
- package/src/interactive/renderers/diff.ts +126 -0
- package/src/interactive/renderers/notice.ts +28 -0
- package/src/interactive/renderers/retry-status.ts +31 -0
- package/src/interactive/renderers/structured.ts +89 -0
- package/src/interactive/renderers/tool-execution.ts +1104 -0
- package/src/interactive/renderers/worker-entry.ts +264 -0
- package/src/interactive/session-last-turn.ts +186 -0
- package/src/interactive/session-transcript.ts +105 -0
- package/src/interactive/session-usage-reseed.ts +74 -0
- package/src/interactive/slash-autocomplete.ts +364 -0
- package/src/interactive/slash-commands.ts +1319 -0
- package/src/interactive/slash-spec.ts +453 -0
- package/src/interactive/status/controller.ts +256 -0
- package/src/interactive/status/index.ts +23 -0
- package/src/interactive/status/state-machine.ts +530 -0
- package/src/interactive/status/summary.ts +170 -0
- package/src/interactive/status/types.ts +121 -0
- package/src/interactive/status/verbs.ts +163 -0
- package/src/interactive/status/watchdog.ts +24 -0
- package/src/interactive/tasks-overlay.ts +186 -0
- package/src/interactive/theme/components.ts +55 -0
- package/src/interactive/theme/glyphs.ts +70 -0
- package/src/interactive/theme/index.ts +15 -0
- package/src/interactive/theme/labels.ts +88 -0
- package/src/interactive/theme/rules.ts +138 -0
- package/src/interactive/theme/segments.ts +88 -0
- package/src/interactive/theme/tokens.ts +121 -0
- package/src/interactive/thinking-level-policy.ts +6 -0
- package/src/interactive/tool-prose-loop.ts +122 -0
- package/src/interactive/tool-prose-registration.ts +48 -0
- package/src/interactive/turn-context.ts +854 -0
- package/src/interactive/turn-middleware.ts +283 -0
- package/src/interactive/turn-persistence.ts +441 -0
- package/src/interactive/turn-queues.ts +169 -0
- package/src/interactive/turn-recovery.ts +306 -0
- package/src/interactive/turn-runtime.ts +802 -0
- package/src/interactive/turn-state.ts +123 -0
- package/src/interactive/view/artifacts.ts +1342 -0
- package/src/interactive/view/view-overlay.ts +732 -0
- package/src/interactive/welcome-dashboard.ts +536 -0
- package/src/interactive/worker-receipts.ts +94 -0
- package/src/interactive/worker-replay.ts +111 -0
- package/src/interactive/worker-share.ts +100 -0
- package/src/interactive/worker-stream.ts +442 -0
- package/src/interactive/workspace-facts.ts +141 -0
- package/src/tools/agent-tools.ts +382 -0
- package/src/tools/artifact.ts +103 -0
- package/src/tools/ask-user.ts +656 -0
- package/src/tools/bash.ts +176 -0
- package/src/tools/bootstrap.ts +474 -0
- package/src/tools/codewiki/code-nav.ts +563 -0
- package/src/tools/codewiki/shared.ts +115 -0
- package/src/tools/compete-worktrees.ts +898 -0
- package/src/tools/context/docs-engine.ts +619 -0
- package/src/tools/context/index.ts +435 -0
- package/src/tools/credential-present.ts +151 -0
- package/src/tools/dispatch-arguments.ts +228 -0
- package/src/tools/dispatch-plan.ts +741 -0
- package/src/tools/dispatch-scout.ts +461 -0
- package/src/tools/dispatch.ts +3338 -0
- package/src/tools/edit-diff.ts +534 -0
- package/src/tools/edit.ts +128 -0
- package/src/tools/executables.ts +22 -0
- package/src/tools/file-mutation-queue.ts +35 -0
- package/src/tools/find.ts +292 -0
- package/src/tools/grep.ts +495 -0
- package/src/tools/ignore-policy.ts +169 -0
- package/src/tools/ledger.ts +206 -0
- package/src/tools/ls.ts +110 -0
- package/src/tools/monitor.ts +797 -0
- package/src/tools/network-policy.ts +29 -0
- package/src/tools/observation.ts +421 -0
- package/src/tools/observers.ts +99 -0
- package/src/tools/path-utils.ts +79 -0
- package/src/tools/policy.ts +154 -0
- package/src/tools/profiles.ts +108 -0
- package/src/tools/read.ts +173 -0
- package/src/tools/registry.ts +1157 -0
- package/src/tools/result-shaping.ts +204 -0
- package/src/tools/safe-exec.ts +128 -0
- package/src/tools/spawn-hygiene.ts +182 -0
- package/src/tools/steer.ts +88 -0
- package/src/tools/string-enum.ts +15 -0
- package/src/tools/tasks.ts +168 -0
- package/src/tools/truncate-utf8.ts +17 -0
- package/src/tools/truncate.ts +202 -0
- package/src/tools/verify/frontend.ts +685 -0
- package/src/tools/verify/index.ts +66 -0
- package/src/tools/verify/scripts.ts +108 -0
- package/src/tools/web-fetch.ts +777 -0
- package/src/tools/worker-evidence.ts +215 -0
- package/src/tools/write.ts +52 -0
- package/src/utils/exif-orientation.ts +192 -0
- package/src/utils/git.ts +24 -0
- package/src/utils/image-resize.ts +148 -0
- package/src/utils/photon.ts +103 -0
- package/src/worker/control-lane.ts +22 -0
- package/src/worker/entry.ts +257 -0
- package/src/worker/event-projection.ts +56 -0
- package/src/worker/heartbeat.ts +24 -0
- package/src/worker/ledger-mirror.ts +95 -0
- package/src/worker/ndjson.ts +40 -0
- package/src/worker/protocol.ts +529 -0
- package/src/worker/resource-facts.ts +79 -0
- package/src/worker/runtime-registry.ts +12 -0
- package/src/worker/spec-contract.ts +654 -0
- package/src/worker/stdin-demux.ts +316 -0
- package/dist/acp-UMLFVA3F.js +0 -92
- package/dist/chunk-262G75JS.js +0 -35
- package/dist/chunk-5LDRNKX2.js +0 -1063
- package/dist/chunk-67MTHP2E.js +0 -135
- package/dist/chunk-GOTUR54M.js +0 -9
- package/dist/chunk-TPOCL34A.js +0 -2876
- package/dist/chunk-XV4ZJ6ZM.js +0 -3177
- package/dist/clio-KIQ5SNDS.js +0 -53
- package/dist/configure-G4E3A2PG.js +0 -27
- package/dist/doctor-M5HJJZOL.js +0 -61
- package/dist/domains/agents/builtins/architect.md +0 -33
- package/dist/domains/agents/builtins/coder.md +0 -31
- package/dist/domains/agents/builtins/context-bootstrap.md +0 -38
- package/dist/domains/agents/builtins/debugger.md +0 -30
- package/dist/domains/agents/builtins/documenter.md +0 -31
- package/dist/domains/agents/builtins/git-master.md +0 -30
- package/dist/domains/agents/builtins/provenance.md +0 -30
- package/dist/domains/agents/builtins/researcher.md +0 -71
- package/dist/domains/agents/builtins/scout.md +0 -42
- package/dist/domains/agents/builtins/tester.md +0 -31
- package/dist/domains/agents/builtins/verifier.md +0 -30
- package/dist/domains/agents/builtins/wiki-writer.md +0 -41
- package/dist/fleet-preflight-CLIAX7YR.js +0 -21
- package/dist/preload-KZVHET2B.js +0 -11
- package/dist/version-ROZ6CZKH.js +0 -16
- package/skills/git/commit-crafting/SKILL.md +0 -79
- package/skills/git/commit-crafting/evals.md +0 -92
- package/skills/git/create-pr/SKILL.md +0 -116
- package/skills/git/create-pr/evals.md +0 -114
- package/skills/git/investigate-issue/SKILL.md +0 -139
- package/skills/git/investigate-issue/evals.md +0 -94
- package/skills/git/review-changes/SKILL.md +0 -103
- package/skills/git/review-changes/evals.md +0 -85
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { safeResourceWrite } from "../../../core/safe-resource-write.js";
|
|
6
|
+
import { type WikiPage, wikiDir, wikiMarkdownFilesInDir } from "./layout.js";
|
|
7
|
+
import type { ResolvedWikiDepth, WikiDepth, WikiPlan } from "./plan.js";
|
|
8
|
+
import { sanitizeWikiPlan } from "./plan-store.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* What the generator observed and chose for this artifact. Page and section
|
|
12
|
+
* counts are outcomes, not targets: they record what the repository produced
|
|
13
|
+
* at the resolved depth so an operator can see whether a run finished.
|
|
14
|
+
*/
|
|
15
|
+
export interface WikiMetaGeneration {
|
|
16
|
+
requestedDepth: WikiDepth;
|
|
17
|
+
depth: ResolvedWikiDepth;
|
|
18
|
+
sourceFiles: number;
|
|
19
|
+
sourceLines: number;
|
|
20
|
+
/** Pages the plan calls for. */
|
|
21
|
+
pagesPlanned: number;
|
|
22
|
+
/** Pages the plan records as written. Below `pagesPlanned` means work remains. */
|
|
23
|
+
pagesWritten: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface WikiMeta {
|
|
27
|
+
version: 1;
|
|
28
|
+
updatedAt: string;
|
|
29
|
+
gitHead: string | null;
|
|
30
|
+
sourceTreeHash?: string;
|
|
31
|
+
model: string;
|
|
32
|
+
contentHash: string;
|
|
33
|
+
pages: WikiPage[];
|
|
34
|
+
generation?: WikiMetaGeneration;
|
|
35
|
+
/**
|
|
36
|
+
* The page plan this wiki was built from. Carrying it here is what lets a
|
|
37
|
+
* later run resume: it knows the intended structure and which pages are
|
|
38
|
+
* still owed without re-deriving either.
|
|
39
|
+
*/
|
|
40
|
+
plan?: WikiPlan;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export type WikiMetaValidation = { ok: true; value: WikiMeta } | { ok: false; problems: string[] };
|
|
44
|
+
|
|
45
|
+
function compareStrings(a: string, b: string): number {
|
|
46
|
+
return a.localeCompare(b);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
50
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function stringValue(value: unknown): string | null {
|
|
54
|
+
return typeof value === "string" && value.trim().length > 0 ? value : null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function nonNegativeSafeInteger(value: unknown): value is number {
|
|
58
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const REQUESTED_DEPTHS: ReadonlyArray<WikiDepth> = ["auto", "simple", "medium", "detailed"];
|
|
62
|
+
const RESOLVED_DEPTHS: ReadonlyArray<ResolvedWikiDepth> = ["simple", "medium", "detailed"];
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Parse the generation block, or drop it. It is a diagnostic record, so a
|
|
66
|
+
* shape this version of Clio does not recognize costs an operator a status
|
|
67
|
+
* line; treating it as corruption would instead discard a usable wiki and
|
|
68
|
+
* silently regenerate it from scratch.
|
|
69
|
+
*/
|
|
70
|
+
function parseGeneration(value: unknown): WikiMetaGeneration | undefined {
|
|
71
|
+
if (!isRecord(value)) return undefined;
|
|
72
|
+
const { requestedDepth, depth, sourceFiles, sourceLines, pagesPlanned, pagesWritten } = value;
|
|
73
|
+
if (
|
|
74
|
+
!REQUESTED_DEPTHS.includes(requestedDepth as WikiDepth) ||
|
|
75
|
+
!RESOLVED_DEPTHS.includes(depth as ResolvedWikiDepth) ||
|
|
76
|
+
!nonNegativeSafeInteger(sourceFiles) ||
|
|
77
|
+
!nonNegativeSafeInteger(sourceLines) ||
|
|
78
|
+
!nonNegativeSafeInteger(pagesPlanned) ||
|
|
79
|
+
!nonNegativeSafeInteger(pagesWritten)
|
|
80
|
+
) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
requestedDepth: requestedDepth as WikiDepth,
|
|
85
|
+
depth: depth as ResolvedWikiDepth,
|
|
86
|
+
sourceFiles,
|
|
87
|
+
sourceLines,
|
|
88
|
+
pagesPlanned,
|
|
89
|
+
pagesWritten,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function normalizePages(pages: ReadonlyArray<WikiPage>): WikiPage[] {
|
|
94
|
+
return pages
|
|
95
|
+
.map((page) => ({ path: page.path, title: page.title, ...(page.summary ? { summary: page.summary } : {}) }))
|
|
96
|
+
.sort((a, b) => a.path.localeCompare(b.path));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function wikiMetaPath(cwd: string): string {
|
|
100
|
+
return join(wikiDir(cwd), "meta.json");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function currentWikiGitHead(cwd: string): string | null {
|
|
104
|
+
try {
|
|
105
|
+
return execFileSync("git", ["rev-parse", "--verify", "HEAD"], {
|
|
106
|
+
cwd,
|
|
107
|
+
encoding: "utf8",
|
|
108
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
109
|
+
}).trim();
|
|
110
|
+
} catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function validateWikiMeta(value: unknown): WikiMetaValidation {
|
|
116
|
+
const problems: string[] = [];
|
|
117
|
+
if (!isRecord(value)) {
|
|
118
|
+
return { ok: false, problems: ["meta must be a JSON object"] };
|
|
119
|
+
}
|
|
120
|
+
if (value.version !== 1) problems.push("version must be 1");
|
|
121
|
+
const updatedAt = stringValue(value.updatedAt);
|
|
122
|
+
if (!updatedAt) problems.push("updatedAt must be a non-empty string");
|
|
123
|
+
const gitHead = value.gitHead;
|
|
124
|
+
if (gitHead !== null && typeof gitHead !== "string") problems.push("gitHead must be a string or null");
|
|
125
|
+
const sourceTreeHash = value.sourceTreeHash;
|
|
126
|
+
if (sourceTreeHash !== undefined && (typeof sourceTreeHash !== "string" || !/^[a-f0-9]{64}$/.test(sourceTreeHash))) {
|
|
127
|
+
problems.push("sourceTreeHash must be a sha256 hex string when present");
|
|
128
|
+
}
|
|
129
|
+
const model = stringValue(value.model);
|
|
130
|
+
if (!model) problems.push("model must be a non-empty string");
|
|
131
|
+
const contentHash = stringValue(value.contentHash);
|
|
132
|
+
if (!contentHash || !/^[a-f0-9]{64}$/.test(contentHash)) {
|
|
133
|
+
problems.push("contentHash must be a sha256 hex string");
|
|
134
|
+
}
|
|
135
|
+
if (!Array.isArray(value.pages)) {
|
|
136
|
+
problems.push("pages must be an array");
|
|
137
|
+
} else {
|
|
138
|
+
for (const [index, page] of value.pages.entries()) {
|
|
139
|
+
if (!isRecord(page)) {
|
|
140
|
+
problems.push(`pages[${index}] must be an object`);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (!stringValue(page.path)) problems.push(`pages[${index}].path must be a non-empty string`);
|
|
144
|
+
if (!stringValue(page.title)) problems.push(`pages[${index}].title must be a non-empty string`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (problems.length > 0) return { ok: false, problems };
|
|
148
|
+
const generation = parseGeneration(value.generation);
|
|
149
|
+
const plan = sanitizeWikiPlan(value.plan, undefined, { trustStatus: true });
|
|
150
|
+
return {
|
|
151
|
+
ok: true,
|
|
152
|
+
value: {
|
|
153
|
+
version: 1,
|
|
154
|
+
updatedAt: updatedAt as string,
|
|
155
|
+
gitHead: gitHead as string | null,
|
|
156
|
+
...(sourceTreeHash !== undefined ? { sourceTreeHash: sourceTreeHash as string } : {}),
|
|
157
|
+
model: model as string,
|
|
158
|
+
contentHash: contentHash as string,
|
|
159
|
+
pages: normalizePages(value.pages as WikiPage[]),
|
|
160
|
+
...(generation !== undefined ? { generation } : {}),
|
|
161
|
+
...(plan !== null ? { plan } : {}),
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export function isWikiMeta(value: unknown): value is WikiMeta {
|
|
167
|
+
return validateWikiMeta(value).ok;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function readWikiMeta(cwd: string): WikiMeta | null {
|
|
171
|
+
const filePath = wikiMetaPath(cwd);
|
|
172
|
+
if (!existsSync(filePath)) return null;
|
|
173
|
+
let parsed: unknown;
|
|
174
|
+
try {
|
|
175
|
+
parsed = JSON.parse(readFileSync(filePath, "utf8"));
|
|
176
|
+
} catch {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
const validation = validateWikiMeta(parsed);
|
|
180
|
+
return validation.ok ? validation.value : null;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export function writeWikiMeta(cwd: string, meta: WikiMeta): void {
|
|
184
|
+
const normalized: WikiMeta = {
|
|
185
|
+
version: 1,
|
|
186
|
+
updatedAt: meta.updatedAt,
|
|
187
|
+
gitHead: meta.gitHead,
|
|
188
|
+
...(meta.sourceTreeHash ? { sourceTreeHash: meta.sourceTreeHash } : {}),
|
|
189
|
+
model: meta.model,
|
|
190
|
+
contentHash: meta.contentHash,
|
|
191
|
+
pages: normalizePages(meta.pages),
|
|
192
|
+
...(meta.generation !== undefined ? { generation: { ...meta.generation } } : {}),
|
|
193
|
+
...(meta.plan !== undefined ? { plan: meta.plan } : {}),
|
|
194
|
+
};
|
|
195
|
+
safeResourceWrite(wikiMetaPath(cwd), `${JSON.stringify(normalized)}\n`, { encoding: "utf8" });
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Content hash over the whole page tree. Nested sections mean the walk has to
|
|
200
|
+
* recurse; the relative path is folded in so moving a page between sections
|
|
201
|
+
* changes the hash even when its bytes do not.
|
|
202
|
+
*/
|
|
203
|
+
export function computeWikiContentHashOfDir(dir: string): string {
|
|
204
|
+
const hash = createHash("sha256");
|
|
205
|
+
for (const relPath of wikiMarkdownFilesInDir(dir).sort(compareStrings)) {
|
|
206
|
+
let text = "";
|
|
207
|
+
try {
|
|
208
|
+
text = readFileSync(join(dir, relPath), "utf8");
|
|
209
|
+
} catch {
|
|
210
|
+
text = "";
|
|
211
|
+
}
|
|
212
|
+
hash.update(`${relPath}\0${text.length}\0`);
|
|
213
|
+
hash.update(text);
|
|
214
|
+
hash.update("\0");
|
|
215
|
+
}
|
|
216
|
+
return hash.digest("hex");
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export function computeWikiContentHash(cwd: string): string {
|
|
220
|
+
return computeWikiContentHashOfDir(wikiDir(cwd));
|
|
221
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading, sanitizing, and checkpointing the page plan.
|
|
3
|
+
*
|
|
4
|
+
* The plan file is the one piece of state that survives an interrupted run, so
|
|
5
|
+
* every function here is total: a plan that cannot be parsed, or an authored
|
|
6
|
+
* rewrite that is malformed, degrades to the deterministic candidate instead of
|
|
7
|
+
* ending the run. Progress is harness-owned: it is believed when read back from
|
|
8
|
+
* the harness's own checkpoint and discarded when read from a document a model
|
|
9
|
+
* just rewrote, so a planning pass cannot mark its own pages finished.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { safeResourceWrite } from "../../../core/safe-resource-write.js";
|
|
15
|
+
import { isGeneratedWikiFile, WIKI_PLAN_FILE } from "./layout.js";
|
|
16
|
+
import type { WikiPageStatus, WikiPlan, WikiPlanPage } from "./plan.js";
|
|
17
|
+
|
|
18
|
+
/** Dispatches one page may receive across all runs before it is left alone. */
|
|
19
|
+
export const MAX_PAGE_ATTEMPTS = 3;
|
|
20
|
+
|
|
21
|
+
/** Longest authored intent kept, so one bad entry cannot bloat a page prompt. */
|
|
22
|
+
const MAX_INTENT_CHARS = 600;
|
|
23
|
+
|
|
24
|
+
/** Most pages a plan may carry, bounding an authored rewrite's blast radius. */
|
|
25
|
+
const MAX_PLAN_PAGES = 200;
|
|
26
|
+
|
|
27
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
28
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function usableString(value: unknown): string | null {
|
|
32
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function stringList(value: unknown, limit: number): string[] {
|
|
36
|
+
if (!Array.isArray(value)) return [];
|
|
37
|
+
const out: string[] = [];
|
|
38
|
+
for (const entry of value) {
|
|
39
|
+
const usable = usableString(entry);
|
|
40
|
+
if (usable && !out.includes(usable)) out.push(usable);
|
|
41
|
+
if (out.length >= limit) break;
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* A page path a writer may be pointed at: relative, Markdown, inside the wiki
|
|
48
|
+
* root, and not one of the generated navigation files. Returns null for
|
|
49
|
+
* anything else, which drops the entry rather than failing the plan.
|
|
50
|
+
*/
|
|
51
|
+
export function sanitizePagePath(value: unknown): string | null {
|
|
52
|
+
const raw = usableString(value);
|
|
53
|
+
if (raw === null) return null;
|
|
54
|
+
const normalized = raw.replace(/\\/g, "/").replace(/^\.\//, "").replace(/^\/+/, "");
|
|
55
|
+
if (!normalized.endsWith(".md") || normalized.length > 200) return null;
|
|
56
|
+
const segments = normalized.split("/");
|
|
57
|
+
if (
|
|
58
|
+
segments.some((segment) => segment.length === 0 || segment === "." || segment === ".." || segment.startsWith("."))
|
|
59
|
+
) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
if (isGeneratedWikiFile(normalized)) return null;
|
|
63
|
+
return normalized;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function wikiPlanPath(dir: string): string {
|
|
67
|
+
return join(dir, WIKI_PLAN_FILE);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function parsedStatus(value: unknown): WikiPageStatus | null {
|
|
71
|
+
return value === "written" || value === "pending" ? value : null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function parsedAttempts(value: unknown): number | null {
|
|
75
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : null;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface SanitizeWikiPlanOptions {
|
|
79
|
+
/**
|
|
80
|
+
* Whether the recorded progress in this document may be believed.
|
|
81
|
+
*
|
|
82
|
+
* True for the harness's own checkpoint and for the plan stored in metadata:
|
|
83
|
+
* that is where progress is written, so reading it back is how a run resumes.
|
|
84
|
+
* False for a document a model just rewrote, because a planning pass that
|
|
85
|
+
* marked its pages finished would skip every one of them. Progress the
|
|
86
|
+
* harness already knows, passed as `previous`, always wins over both.
|
|
87
|
+
*/
|
|
88
|
+
trustStatus: boolean;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Parse a plan, preferring harness-owned progress from `previous` for any page
|
|
93
|
+
* whose path survived. Returns null when nothing usable is left, so the caller
|
|
94
|
+
* falls back to the candidate plan.
|
|
95
|
+
*/
|
|
96
|
+
export function sanitizeWikiPlan(
|
|
97
|
+
value: unknown,
|
|
98
|
+
previous?: WikiPlan,
|
|
99
|
+
options: SanitizeWikiPlanOptions = { trustStatus: true },
|
|
100
|
+
): WikiPlan | null {
|
|
101
|
+
if (!isRecord(value) || !Array.isArray(value.pages)) return null;
|
|
102
|
+
const priorByPath = new Map((previous?.pages ?? []).map((page) => [page.path, page] as const));
|
|
103
|
+
const pages: WikiPlanPage[] = [];
|
|
104
|
+
const seen = new Set<string>();
|
|
105
|
+
for (const entry of value.pages) {
|
|
106
|
+
if (pages.length >= MAX_PLAN_PAGES) break;
|
|
107
|
+
if (!isRecord(entry)) continue;
|
|
108
|
+
const path = sanitizePagePath(entry.path);
|
|
109
|
+
if (path === null || seen.has(path)) continue;
|
|
110
|
+
const intent = usableString(entry.intent);
|
|
111
|
+
const prior = priorByPath.get(path);
|
|
112
|
+
const recorded = options.trustStatus ? parsedStatus(entry.status) : null;
|
|
113
|
+
const recordedAttempts = options.trustStatus ? parsedAttempts(entry.attempts) : null;
|
|
114
|
+
seen.add(path);
|
|
115
|
+
pages.push({
|
|
116
|
+
path,
|
|
117
|
+
title: usableString(entry.title) ?? path.replace(/\.md$/, ""),
|
|
118
|
+
intent: intent === null ? "" : intent.slice(0, MAX_INTENT_CHARS),
|
|
119
|
+
sources: stringList(entry.sources, 16),
|
|
120
|
+
status: prior?.status ?? recorded ?? "pending",
|
|
121
|
+
attempts: prior?.attempts ?? recordedAttempts ?? 0,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
if (pages.length === 0) return null;
|
|
125
|
+
return { version: 1, overview: usableString(value.overview) ?? previous?.overview ?? "", pages };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function readPlanDocument(dir: string): unknown {
|
|
129
|
+
const filePath = wikiPlanPath(dir);
|
|
130
|
+
if (!existsSync(filePath)) return undefined;
|
|
131
|
+
try {
|
|
132
|
+
return JSON.parse(readFileSync(filePath, "utf8"));
|
|
133
|
+
} catch {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Read the harness's checkpoint. Returns null when absent, unreadable, or
|
|
140
|
+
* unusable.
|
|
141
|
+
*/
|
|
142
|
+
export function readWikiPlanFile(dir: string, previous?: WikiPlan): WikiPlan | null {
|
|
143
|
+
const document = readPlanDocument(dir);
|
|
144
|
+
return document === undefined ? null : sanitizeWikiPlan(document, previous, { trustStatus: true });
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Read the plan file as a document a planning pass just rewrote: its structure
|
|
149
|
+
* is taken, its progress is not.
|
|
150
|
+
*/
|
|
151
|
+
export function readAuthoredWikiPlan(dir: string, previous: WikiPlan): WikiPlan | null {
|
|
152
|
+
const document = readPlanDocument(dir);
|
|
153
|
+
return document === undefined ? null : sanitizeWikiPlan(document, previous, { trustStatus: false });
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function writeWikiPlanFile(dir: string, plan: WikiPlan): void {
|
|
157
|
+
safeResourceWrite(wikiPlanPath(dir), `${JSON.stringify(plan, null, 2)}\n`, { encoding: "utf8" });
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Candidate pages for areas no existing page covers.
|
|
162
|
+
*
|
|
163
|
+
* These are offered to a planning pass, never appended to a settled plan. The
|
|
164
|
+
* index proposes paths derived from directory names; a planner routinely
|
|
165
|
+
* renames and regroups them, so appending by path would grow a second, machine-
|
|
166
|
+
* named copy of coverage that already exists. An area counts as covered when
|
|
167
|
+
* some page claims one of its sources, whatever that page ended up being called.
|
|
168
|
+
*/
|
|
169
|
+
export function unclaimedCandidates(
|
|
170
|
+
plan: WikiPlan,
|
|
171
|
+
candidate: WikiPlan,
|
|
172
|
+
pageSources: ReadonlyMap<string, ReadonlyArray<string>> = new Map(),
|
|
173
|
+
): WikiPlanPage[] {
|
|
174
|
+
const knownPaths = new Set(plan.pages.map((page) => page.path));
|
|
175
|
+
const claimed = new Set<string>();
|
|
176
|
+
for (const page of plan.pages) {
|
|
177
|
+
for (const source of [...page.sources, ...(pageSources.get(page.path) ?? [])]) claimed.add(source);
|
|
178
|
+
}
|
|
179
|
+
return candidate.pages.filter(
|
|
180
|
+
(page) => !knownPaths.has(page.path) && !page.sources.some((source) => claimed.has(source)),
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export interface ScopeUpdateInput {
|
|
185
|
+
plan: WikiPlan;
|
|
186
|
+
/** Repository-relative paths that changed since the wiki was last written. */
|
|
187
|
+
changedPaths: ReadonlySet<string>;
|
|
188
|
+
/** Wiki-relative page paths that exist on disk right now. */
|
|
189
|
+
existingPages: ReadonlySet<string>;
|
|
190
|
+
/** Per-page source paths drawn from each page's front matter. */
|
|
191
|
+
pageSources: ReadonlyMap<string, ReadonlyArray<string>>;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Decide what an update run owes. A page is rewritten when a source it claims
|
|
196
|
+
* has changed or when its file is missing; everything else is already current
|
|
197
|
+
* and is skipped. This is what replaces asking a model to guess which pages a
|
|
198
|
+
* diff invalidates: the answer is computed from the sources each page recorded
|
|
199
|
+
* in its own front matter.
|
|
200
|
+
*/
|
|
201
|
+
export function scopePlanForUpdate(input: ScopeUpdateInput): WikiPlan {
|
|
202
|
+
const changedPrefixes = [...input.changedPaths];
|
|
203
|
+
const pages = input.plan.pages.map((page): WikiPlanPage => {
|
|
204
|
+
if (!input.existingPages.has(page.path)) return { ...page, status: "pending", attempts: 0 };
|
|
205
|
+
const claimed = [...(input.pageSources.get(page.path) ?? []), ...page.sources];
|
|
206
|
+
const touched = claimed.some((source) =>
|
|
207
|
+
changedPrefixes.some((changed) => changed === source || changed.startsWith(`${source}/`)),
|
|
208
|
+
);
|
|
209
|
+
return touched ? { ...page, status: "pending", attempts: 0 } : { ...page, status: "written" };
|
|
210
|
+
});
|
|
211
|
+
return { ...input.plan, pages };
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/** Pages this run still owes, in plan order, excluding ones already exhausted. */
|
|
215
|
+
export function pendingPages(plan: WikiPlan): WikiPlanPage[] {
|
|
216
|
+
return plan.pages.filter((page) => page.status !== "written" && page.attempts < MAX_PAGE_ATTEMPTS);
|
|
217
|
+
}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The page plan: the wiki's skeleton, as an artifact rather than a prompt
|
|
3
|
+
* sentence.
|
|
4
|
+
*
|
|
5
|
+
* A plan names every page the wiki will contain, what each page must document,
|
|
6
|
+
* and the source files that ground it. It is built deterministically from the
|
|
7
|
+
* codewiki index, so a usable plan exists before any model runs; a planning
|
|
8
|
+
* dispatch may then merge, split, rename, drop, or re-anchor entries by
|
|
9
|
+
* rewriting `_plan.json` in the staging tree. A malformed rewrite falls back to
|
|
10
|
+
* the candidate rather than failing the run.
|
|
11
|
+
*
|
|
12
|
+
* The plan is also the run's checkpoint. Each entry carries its own status, so
|
|
13
|
+
* a run that ends early leaves a record of exactly which pages are still owed,
|
|
14
|
+
* and the next run writes only those. Nothing here targets a page count: how
|
|
15
|
+
* many pages a repository gets follows from how many substantial areas the
|
|
16
|
+
* index finds at the requested depth.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { Codewiki, CodewikiFile } from "../codewiki/indexer.js";
|
|
20
|
+
|
|
21
|
+
export type WikiDepth = "auto" | "simple" | "medium" | "detailed";
|
|
22
|
+
export type ResolvedWikiDepth = Exclude<WikiDepth, "auto">;
|
|
23
|
+
|
|
24
|
+
export type WikiPageStatus = "pending" | "written";
|
|
25
|
+
|
|
26
|
+
export interface WikiPlanPage {
|
|
27
|
+
/** POSIX-relative page path inside the wiki root. */
|
|
28
|
+
path: string;
|
|
29
|
+
title: string;
|
|
30
|
+
/** What this page must document, in one or two sentences. */
|
|
31
|
+
intent: string;
|
|
32
|
+
/** Repository-relative source files that ground the page. */
|
|
33
|
+
sources: string[];
|
|
34
|
+
/** Harness-owned: whether this page has been written in a completed dispatch. */
|
|
35
|
+
status: WikiPageStatus;
|
|
36
|
+
/** Harness-owned: how many dispatches have tried to write this page. */
|
|
37
|
+
attempts: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface WikiPlan {
|
|
41
|
+
version: 1;
|
|
42
|
+
/** One paragraph describing what this repository is; opens the generated quickstart. */
|
|
43
|
+
overview: string;
|
|
44
|
+
pages: WikiPlanPage[];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface WikiGenerationPlan {
|
|
48
|
+
requestedDepth: WikiDepth;
|
|
49
|
+
depth: ResolvedWikiDepth;
|
|
50
|
+
sourceFiles: number;
|
|
51
|
+
sourceLines: number;
|
|
52
|
+
/** The candidate skeleton derived from the index at this depth. */
|
|
53
|
+
plan: WikiPlan;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* How finely a repository is decomposed at each depth.
|
|
58
|
+
*
|
|
59
|
+
* `areaDepth` is how many directory segments make an area, so depth changes the
|
|
60
|
+
* granularity of the decomposition itself: at 1 the whole of `src` is one area,
|
|
61
|
+
* at 3 each `src/domains/<name>` is. `areaShare` and `minAreaLines` then drop
|
|
62
|
+
* areas too small to carry a page, folding them into the nearest ancestor.
|
|
63
|
+
*
|
|
64
|
+
* Both are decomposition thresholds, not page targets. Granularity is what
|
|
65
|
+
* scales with repository size; the resulting page count is whatever the
|
|
66
|
+
* repository's shape produces at that granularity, and is never something a
|
|
67
|
+
* writer is told to hit.
|
|
68
|
+
*/
|
|
69
|
+
export const WIKI_DEPTH_STRATEGY: Record<ResolvedWikiDepth, DepthStrategy> = {
|
|
70
|
+
simple: { areaDepth: 1, areaShare: 0.08, minAreaLines: 400 },
|
|
71
|
+
medium: { areaDepth: 2, areaShare: 0.03, minAreaLines: 250 },
|
|
72
|
+
detailed: { areaDepth: 3, areaShare: 0.008, minAreaLines: 150 },
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export interface DepthStrategy {
|
|
76
|
+
areaDepth: number;
|
|
77
|
+
areaShare: number;
|
|
78
|
+
minAreaLines: number;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Most source files named on one page's prompt. Keeps a page dispatch small. */
|
|
82
|
+
const MAX_PAGE_SOURCES = 8;
|
|
83
|
+
|
|
84
|
+
interface Area {
|
|
85
|
+
key: string;
|
|
86
|
+
files: CodewikiFile[];
|
|
87
|
+
lines: number;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* The area a file belongs to: its first `maxDepth` directory segments. The
|
|
92
|
+
* filename is dropped first, so a file sitting directly in `src` joins the
|
|
93
|
+
* `src` area instead of becoming an area of its own named after itself.
|
|
94
|
+
*/
|
|
95
|
+
function areaForPath(path: string, maxDepth: number): string {
|
|
96
|
+
const directories = path.split("/").filter(Boolean).slice(0, -1);
|
|
97
|
+
if (directories.length === 0) return ".";
|
|
98
|
+
return directories.slice(0, Math.max(1, maxDepth)).join("/");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function classifyDepth(sourceFiles: number, sourceLines: number): ResolvedWikiDepth {
|
|
102
|
+
if (sourceFiles <= 150 && sourceLines <= 30_000) return "simple";
|
|
103
|
+
if (sourceFiles <= 800 && sourceLines <= 150_000) return "medium";
|
|
104
|
+
return "detailed";
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function slugSegment(segment: string): string {
|
|
108
|
+
const slug = segment
|
|
109
|
+
.toLowerCase()
|
|
110
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
111
|
+
.replace(/^-+|-+$/g, "");
|
|
112
|
+
return slug.length > 0 ? slug : "section";
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Meaningful segments of an area: the ones that name a documentation section.
|
|
117
|
+
* A leading `src/` describes the language's layout rather than a section, so it
|
|
118
|
+
* is dropped and `src/domains/dispatch` becomes `domains/dispatch`. An area
|
|
119
|
+
* that is only `src`, or the repository root, has no such segments and gets a
|
|
120
|
+
* name of its own.
|
|
121
|
+
*/
|
|
122
|
+
function areaSegments(area: string): string[] {
|
|
123
|
+
const parts = area.split("/").filter((part) => part.length > 0 && part !== ".");
|
|
124
|
+
if (parts.length === 0) return ["root"];
|
|
125
|
+
if (parts[0] !== "src") return parts;
|
|
126
|
+
return parts.length === 1 ? ["source"] : parts.slice(1);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** Turn an index area into a page path; nesting follows the repository's. */
|
|
130
|
+
export function pagePathForArea(area: string): string {
|
|
131
|
+
return `${areaSegments(area).map(slugSegment).join("/")}.md`;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function titleForArea(area: string): string {
|
|
135
|
+
const name = areaSegments(area).join(" ").replace(/[-_]+/g, " ").trim();
|
|
136
|
+
return name.length > 0 ? name.charAt(0).toUpperCase() + name.slice(1) : "Overview";
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Rank an area's files so the ones a writer must read appear first. */
|
|
140
|
+
function rankedSources(files: ReadonlyArray<CodewikiFile>): string[] {
|
|
141
|
+
return [...files]
|
|
142
|
+
.sort((a, b) => {
|
|
143
|
+
const roleRank = (file: CodewikiFile): number => (file.role === "entry" ? 0 : file.role === "test" ? 2 : 1);
|
|
144
|
+
return roleRank(a) - roleRank(b) || b.loc - a.loc || a.path.localeCompare(b.path);
|
|
145
|
+
})
|
|
146
|
+
.slice(0, MAX_PAGE_SOURCES)
|
|
147
|
+
.map((file) => file.path);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function collectAreas(source: ReadonlyArray<CodewikiFile>, areaDepth: number): Area[] {
|
|
151
|
+
const byKey = new Map<string, Area>();
|
|
152
|
+
for (const file of source) {
|
|
153
|
+
const key = areaForPath(file.path, areaDepth);
|
|
154
|
+
const area = byKey.get(key) ?? { key, files: [], lines: 0 };
|
|
155
|
+
area.files.push(file);
|
|
156
|
+
area.lines += Math.max(0, file.loc);
|
|
157
|
+
byKey.set(key, area);
|
|
158
|
+
}
|
|
159
|
+
return [...byKey.values()].sort((a, b) => b.lines - a.lines || a.key.localeCompare(b.key));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* The architecture page every wiki gets. It is the one page whose subject is
|
|
164
|
+
* the repository rather than a directory, so it is anchored on indexed entry
|
|
165
|
+
* points instead of an area.
|
|
166
|
+
*/
|
|
167
|
+
function overviewPage(source: ReadonlyArray<CodewikiFile>): WikiPlanPage {
|
|
168
|
+
const entries = source.filter((file) => file.role === "entry");
|
|
169
|
+
return {
|
|
170
|
+
path: "architecture.md",
|
|
171
|
+
title: "Architecture",
|
|
172
|
+
intent:
|
|
173
|
+
"Explain what this repository is, its top-level composition, how a request or command flows through it, " +
|
|
174
|
+
"and where the boundaries between its major areas are.",
|
|
175
|
+
sources: rankedSources(entries.length > 0 ? entries : source),
|
|
176
|
+
status: "pending",
|
|
177
|
+
attempts: 0,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Build the candidate skeleton from the index. Areas above the depth threshold
|
|
183
|
+
* become pages; the rest fold their files into the closest ancestor page that
|
|
184
|
+
* did, so a small directory is documented somewhere rather than dropped.
|
|
185
|
+
*/
|
|
186
|
+
export function buildCandidatePlan(codewiki: Codewiki, depth: ResolvedWikiDepth): WikiPlan {
|
|
187
|
+
const source = codewiki.files.filter((file) => file.lang !== "config");
|
|
188
|
+
const totalLines = source.reduce((total, file) => total + Math.max(0, file.loc), 0);
|
|
189
|
+
const { areaDepth, areaShare, minAreaLines } = WIKI_DEPTH_STRATEGY[depth];
|
|
190
|
+
const threshold = Math.max(minAreaLines, Math.floor(totalLines * areaShare));
|
|
191
|
+
const areas = collectAreas(source, areaDepth);
|
|
192
|
+
const included = areas.filter((area) => area.lines >= threshold);
|
|
193
|
+
// A repository whose areas are all below threshold still gets pages: the
|
|
194
|
+
// largest area always earns one, so a small repo is never reduced to a
|
|
195
|
+
// single architecture page with nothing under it.
|
|
196
|
+
const selected = included.length > 0 ? included : areas.slice(0, 1);
|
|
197
|
+
const selectedKeys = new Set(selected.map((area) => area.key));
|
|
198
|
+
const extras = new Map<string, CodewikiFile[]>();
|
|
199
|
+
for (const area of areas) {
|
|
200
|
+
if (selectedKeys.has(area.key)) continue;
|
|
201
|
+
const ancestor = selected.find((candidate) => area.key.startsWith(`${candidate.key}/`));
|
|
202
|
+
const host = ancestor?.key ?? selected[0]?.key;
|
|
203
|
+
if (host === undefined) continue;
|
|
204
|
+
extras.set(host, [...(extras.get(host) ?? []), ...area.files]);
|
|
205
|
+
}
|
|
206
|
+
const pages = selected.map((area): WikiPlanPage => {
|
|
207
|
+
const files = [...area.files, ...(extras.get(area.key) ?? [])];
|
|
208
|
+
return {
|
|
209
|
+
path: pagePathForArea(area.key),
|
|
210
|
+
title: titleForArea(area.key),
|
|
211
|
+
intent:
|
|
212
|
+
`Document ${area.key} (${area.files.length} indexed files, ${area.lines} lines): what it owns, its entry ` +
|
|
213
|
+
"points and important symbols, the state and lifecycle invariants it enforces, an upstream caller and a " +
|
|
214
|
+
"downstream dependency, the focused tests that prove its behavior, and what to watch when editing it.",
|
|
215
|
+
sources: rankedSources(files),
|
|
216
|
+
status: "pending",
|
|
217
|
+
attempts: 0,
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
return dedupePagePaths({
|
|
221
|
+
version: 1,
|
|
222
|
+
overview: "",
|
|
223
|
+
pages: [overviewPage(source), ...pages],
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** Two areas can slug to one path; keep the first and suffix the rest. */
|
|
228
|
+
function dedupePagePaths(plan: WikiPlan): WikiPlan {
|
|
229
|
+
const seen = new Set<string>();
|
|
230
|
+
const pages: WikiPlanPage[] = [];
|
|
231
|
+
for (const page of plan.pages) {
|
|
232
|
+
let path = page.path;
|
|
233
|
+
let suffix = 2;
|
|
234
|
+
while (seen.has(path)) {
|
|
235
|
+
path = page.path.replace(/\.md$/, `-${suffix}.md`);
|
|
236
|
+
suffix += 1;
|
|
237
|
+
}
|
|
238
|
+
seen.add(path);
|
|
239
|
+
pages.push({ ...page, path });
|
|
240
|
+
}
|
|
241
|
+
return { ...plan, pages };
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export function planWikiGeneration(codewiki: Codewiki, requestedDepth: WikiDepth = "auto"): WikiGenerationPlan {
|
|
245
|
+
const source = codewiki.files.filter((file) => file.lang !== "config");
|
|
246
|
+
const sourceFiles = source.length;
|
|
247
|
+
const sourceLines = source.reduce((total, file) => total + Math.max(0, file.loc), 0);
|
|
248
|
+
const depth = requestedDepth === "auto" ? classifyDepth(sourceFiles, sourceLines) : requestedDepth;
|
|
249
|
+
return { requestedDepth, depth, sourceFiles, sourceLines, plan: buildCandidatePlan(codewiki, depth) };
|
|
250
|
+
}
|