@joshuafolkken/kit 1.872.0
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/.claude/.claude-plugin/plugin.json +11 -0
- package/.claude/settings.json +110 -0
- package/.claude/skills/dependency-update/SKILL.md +76 -0
- package/.claude/skills/epic-commands/SKILL.md +463 -0
- package/.claude/skills/verify-ui/SKILL.md +96 -0
- package/.claude/skills/workflow-commands/SKILL.md +265 -0
- package/.claude/skills/workflow-commands/background-commands.md +130 -0
- package/.claude/skills/workflow-commands/backlogrun-child.md +364 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +345 -0
- package/.claude/skills/workflow-commands/backlogrun-park.md +179 -0
- package/.claude/skills/workflow-commands/backlogrun-progress.md +600 -0
- package/.claude/skills/workflow-commands/backlogrun-steps.md +604 -0
- package/.claude/skills/workflow-commands/backlogrun.md +109 -0
- package/.claude/skills/workflow-commands/chain-rule.md +98 -0
- package/.claude/skills/workflow-commands/delegation.md +52 -0
- package/.claude/skills/workflow-commands/followup-reference.md +118 -0
- package/.claude/skills/workflow-commands/followup.md +222 -0
- package/.claude/skills/workflow-commands/fullrun-steps.md +93 -0
- package/.claude/skills/workflow-commands/fullrun.md +82 -0
- package/.claude/skills/workflow-commands/halfrun.md +73 -0
- package/.claude/skills/workflow-commands/into-target.md +48 -0
- package/.claude/skills/workflow-commands/issue-comments.md +109 -0
- package/.claude/skills/workflow-commands/issue-fold-existing.md +27 -0
- package/.claude/skills/workflow-commands/issue-scout.md +45 -0
- package/.claude/skills/workflow-commands/kickoff.md +82 -0
- package/.claude/skills/workflow-commands/latest-gate.md +85 -0
- package/.claude/skills/workflow-commands/needs-human-review.md +64 -0
- package/.claude/skills/workflow-commands/observation-filing.md +349 -0
- package/.claude/skills/workflow-commands/pre-gate-cut.md +340 -0
- package/.claude/skills/workflow-commands/prerequisite.md +62 -0
- package/.claude/skills/workflow-commands/retrospective.md +81 -0
- package/.claude/skills/workflow-commands/rule-residency.md +267 -0
- package/.claude/skills/workflow-commands/split-assessment.md +130 -0
- package/.claude/skills/workflow-commands/target-repository.md +58 -0
- package/.claude/skills/workflow-commands/working-tree-hold.md +66 -0
- package/.claude-plugin/marketplace.json +15 -0
- package/.coderabbit.yaml +50 -0
- package/.codex/config.toml +8 -0
- package/.codex/hooks.json +71 -0
- package/.cursorrules +45 -0
- package/.gitattributes +7 -0
- package/.github/dependabot.yml +19 -0
- package/.github/pull_request_template.md +1 -0
- package/.github/release.yml +18 -0
- package/.github/workflows/auto-tag.yml +111 -0
- package/.github/workflows/ci.yml +681 -0
- package/.github/workflows/dependabot-auto-merge.yml +55 -0
- package/.github/workflows/production.yml +47 -0
- package/.github/workflows/publish.yml +39 -0
- package/.github/workflows/sonar-qube.yml +34 -0
- package/.mcp.json +8 -0
- package/.ncurc.json +3 -0
- package/.prettierignore +20 -0
- package/.vscode/extensions.json +21 -0
- package/.vscode/settings.json +41 -0
- package/AGENTS.md +29 -0
- package/CLAUDE.md +207 -0
- package/CODE_OF_CONDUCT.md +132 -0
- package/GEMINI.md +30 -0
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/SECURITY.md +34 -0
- package/cspell/index.yaml +177 -0
- package/dist/CLAUDE.md +207 -0
- package/dist/config-merge/index.d.ts +29 -0
- package/dist/config-merge/index.js +459 -0
- package/dist/hooks/batch-guard.js +28 -0
- package/dist/hooks/chunk-25JL6FMS.js +4970 -0
- package/dist/hooks/chunk-2ANGT3XM.js +375 -0
- package/dist/hooks/chunk-2EI5GBSW.js +42 -0
- package/dist/hooks/chunk-2OT5XE2N.js +5014 -0
- package/dist/hooks/chunk-2RUPMGGV.js +137 -0
- package/dist/hooks/chunk-2XIGZQMQ.js +3299 -0
- package/dist/hooks/chunk-33ELOKEV.js +910 -0
- package/dist/hooks/chunk-33YRTKM7.js +230 -0
- package/dist/hooks/chunk-36JQU5NN.js +77 -0
- package/dist/hooks/chunk-3EJBTWVS.js +1769 -0
- package/dist/hooks/chunk-3FK5SFAC.js +432 -0
- package/dist/hooks/chunk-3PWPYDD2.js +240 -0
- package/dist/hooks/chunk-3TQU7TDH.js +375 -0
- package/dist/hooks/chunk-3TVLSFZ6.js +432 -0
- package/dist/hooks/chunk-3VXYCB4E.js +77 -0
- package/dist/hooks/chunk-44M6JXGV.js +3398 -0
- package/dist/hooks/chunk-46EEEHC3.js +240 -0
- package/dist/hooks/chunk-4A7UVP2P.js +364 -0
- package/dist/hooks/chunk-4LFQEZS4.js +137 -0
- package/dist/hooks/chunk-4OCX3V2T.js +469 -0
- package/dist/hooks/chunk-4OHA5DE7.js +49 -0
- package/dist/hooks/chunk-4PMDW3YD.js +68 -0
- package/dist/hooks/chunk-4QHBNAI4.js +68 -0
- package/dist/hooks/chunk-4SSB3FEE.js +3273 -0
- package/dist/hooks/chunk-5A2WQ2CQ.js +5390 -0
- package/dist/hooks/chunk-5EVA2JQB.js +5390 -0
- package/dist/hooks/chunk-5P7VF5VE.js +3230 -0
- package/dist/hooks/chunk-5QWJGGZP.js +49 -0
- package/dist/hooks/chunk-5U5EZYG6.js +77 -0
- package/dist/hooks/chunk-5VUUF3ZV.js +240 -0
- package/dist/hooks/chunk-5WA7UBT3.js +374 -0
- package/dist/hooks/chunk-6EBGRQ3Q.js +301 -0
- package/dist/hooks/chunk-6TVHWMD3.js +432 -0
- package/dist/hooks/chunk-6V5OPIUU.js +13 -0
- package/dist/hooks/chunk-6VAGLEMB.js +68 -0
- package/dist/hooks/chunk-75BTXKFJ.js +3424 -0
- package/dist/hooks/chunk-75RHN67S.js +137 -0
- package/dist/hooks/chunk-76KC3BDD.js +3414 -0
- package/dist/hooks/chunk-76SLS7CZ.js +898 -0
- package/dist/hooks/chunk-7DHZ4DWT.js +5015 -0
- package/dist/hooks/chunk-7INSJDGE.js +458 -0
- package/dist/hooks/chunk-7VJ4FTDX.js +268 -0
- package/dist/hooks/chunk-7XCYNHQK.js +77 -0
- package/dist/hooks/chunk-A5YJ3H7E.js +375 -0
- package/dist/hooks/chunk-AAEXXUUL.js +268 -0
- package/dist/hooks/chunk-ABVEVV2M.js +432 -0
- package/dist/hooks/chunk-ACN3YXFL.js +68 -0
- package/dist/hooks/chunk-AD3XE3QZ.js +397 -0
- package/dist/hooks/chunk-AENFZPZH.js +230 -0
- package/dist/hooks/chunk-AFKRFQ6W.js +68 -0
- package/dist/hooks/chunk-AHD5IPWI.js +375 -0
- package/dist/hooks/chunk-AMK5JGV7.js +77 -0
- package/dist/hooks/chunk-ARN7NCQI.js +425 -0
- package/dist/hooks/chunk-AUFY653N.js +3425 -0
- package/dist/hooks/chunk-AXQBNFEF.js +375 -0
- package/dist/hooks/chunk-AYC7R6U4.js +3316 -0
- package/dist/hooks/chunk-AYEA2FJ7.js +5015 -0
- package/dist/hooks/chunk-B2LIXYFL.js +77 -0
- package/dist/hooks/chunk-B4HPNY2I.js +375 -0
- package/dist/hooks/chunk-B4YNCUGB.js +469 -0
- package/dist/hooks/chunk-B57S3VWT.js +922 -0
- package/dist/hooks/chunk-BINZ3PLI.js +364 -0
- package/dist/hooks/chunk-BIWLABFK.js +432 -0
- package/dist/hooks/chunk-BODUSXKK.js +410 -0
- package/dist/hooks/chunk-BQBAT2YK.js +375 -0
- package/dist/hooks/chunk-BUJEBW75.js +391 -0
- package/dist/hooks/chunk-BVNWORKA.js +72 -0
- package/dist/hooks/chunk-BWI47LQS.js +5205 -0
- package/dist/hooks/chunk-C25HRMJX.js +137 -0
- package/dist/hooks/chunk-CBFZNC74.js +375 -0
- package/dist/hooks/chunk-CECYXS4Y.js +3424 -0
- package/dist/hooks/chunk-CELGUP5F.js +49 -0
- package/dist/hooks/chunk-CMHANU3F.js +3442 -0
- package/dist/hooks/chunk-CMN372LI.js +68 -0
- package/dist/hooks/chunk-CPGZLMMK.js +3299 -0
- package/dist/hooks/chunk-CTQKXDC7.js +268 -0
- package/dist/hooks/chunk-CYAT4RIT.js +68 -0
- package/dist/hooks/chunk-CYTWYCH2.js +5014 -0
- package/dist/hooks/chunk-CZSOLRBA.js +77 -0
- package/dist/hooks/chunk-D2PIDYJR.js +3438 -0
- package/dist/hooks/chunk-DE57HI6T.js +137 -0
- package/dist/hooks/chunk-DGXDGAPG.js +5306 -0
- package/dist/hooks/chunk-DNYRSYQG.js +5014 -0
- package/dist/hooks/chunk-DTAXH2A2.js +240 -0
- package/dist/hooks/chunk-E2IZUWI5.js +375 -0
- package/dist/hooks/chunk-E4L2K2BL.js +397 -0
- package/dist/hooks/chunk-E55NKX5F.js +68 -0
- package/dist/hooks/chunk-ECXVCCVD.js +3079 -0
- package/dist/hooks/chunk-EPHO443D.js +68 -0
- package/dist/hooks/chunk-EUFK2BI2.js +375 -0
- package/dist/hooks/chunk-EYCD5ZAV.js +137 -0
- package/dist/hooks/chunk-F2SDYJU4.js +240 -0
- package/dist/hooks/chunk-F4B5D5TF.js +68 -0
- package/dist/hooks/chunk-FGEO3NDX.js +432 -0
- package/dist/hooks/chunk-FJYI52RE.js +137 -0
- package/dist/hooks/chunk-FXAKJKTB.js +18 -0
- package/dist/hooks/chunk-FYTZHIY4.js +3085 -0
- package/dist/hooks/chunk-G7JL2A5K.js +375 -0
- package/dist/hooks/chunk-GA3ITDBW.js +42 -0
- package/dist/hooks/chunk-GDR4H4SV.js +469 -0
- package/dist/hooks/chunk-GFKDXPSM.js +2855 -0
- package/dist/hooks/chunk-GIMRTKFU.js +566 -0
- package/dist/hooks/chunk-GOPHRLGO.js +240 -0
- package/dist/hooks/chunk-GX4HO7SJ.js +230 -0
- package/dist/hooks/chunk-GXKKK23T.js +240 -0
- package/dist/hooks/chunk-GZ6FUVIK.js +566 -0
- package/dist/hooks/chunk-H5HPY5M5.js +2869 -0
- package/dist/hooks/chunk-HCF3OGEE.js +1829 -0
- package/dist/hooks/chunk-HDEXAOUM.js +469 -0
- package/dist/hooks/chunk-HM2TY3TN.js +469 -0
- package/dist/hooks/chunk-HOA7NXA2.js +55 -0
- package/dist/hooks/chunk-HOFEWH6H.js +240 -0
- package/dist/hooks/chunk-HUUI6S5J.js +2669 -0
- package/dist/hooks/chunk-I4D3NVUD.js +469 -0
- package/dist/hooks/chunk-I4Q6WAJE.js +68 -0
- package/dist/hooks/chunk-IB6N4CR2.js +432 -0
- package/dist/hooks/chunk-IFLDYJMD.js +469 -0
- package/dist/hooks/chunk-IGU466YD.js +77 -0
- package/dist/hooks/chunk-IJCQUHKY.js +375 -0
- package/dist/hooks/chunk-IKUMBDJB.js +230 -0
- package/dist/hooks/chunk-IM3BDIBJ.js +5005 -0
- package/dist/hooks/chunk-IMYMAODK.js +3431 -0
- package/dist/hooks/chunk-IN2ZVGXA.js +5005 -0
- package/dist/hooks/chunk-ITVJ2MKQ.js +18 -0
- package/dist/hooks/chunk-J5RIJYTM.js +2669 -0
- package/dist/hooks/chunk-JFLMH4K5.js +3460 -0
- package/dist/hooks/chunk-JR25IFML.js +77 -0
- package/dist/hooks/chunk-JT5AUXFI.js +432 -0
- package/dist/hooks/chunk-JY5YVN6N.js +3234 -0
- package/dist/hooks/chunk-K5Q4ETVI.js +391 -0
- package/dist/hooks/chunk-K67V2F24.js +137 -0
- package/dist/hooks/chunk-KABG6AEW.js +3460 -0
- package/dist/hooks/chunk-KATZESEC.js +3273 -0
- package/dist/hooks/chunk-KFH4H7W7.js +469 -0
- package/dist/hooks/chunk-KMUEI6RX.js +910 -0
- package/dist/hooks/chunk-KMV4OY77.js +3438 -0
- package/dist/hooks/chunk-KQAZNWEY.js +137 -0
- package/dist/hooks/chunk-KZZR6JER.js +5015 -0
- package/dist/hooks/chunk-LAR6DREP.js +77 -0
- package/dist/hooks/chunk-LNCJWEZD.js +5015 -0
- package/dist/hooks/chunk-LRYD2GLM.js +6 -0
- package/dist/hooks/chunk-LXBKYHDV.js +77 -0
- package/dist/hooks/chunk-LYLKIUNE.js +5024 -0
- package/dist/hooks/chunk-LZKCFOVC.js +432 -0
- package/dist/hooks/chunk-M4FCIYRI.js +77 -0
- package/dist/hooks/chunk-M5M7327Q.js +3425 -0
- package/dist/hooks/chunk-MF72MHSX.js +3455 -0
- package/dist/hooks/chunk-MK56LKDO.js +397 -0
- package/dist/hooks/chunk-N3MJADY7.js +240 -0
- package/dist/hooks/chunk-NFQSUDBN.js +458 -0
- package/dist/hooks/chunk-NHREKY45.js +137 -0
- package/dist/hooks/chunk-NP5TTAAW.js +375 -0
- package/dist/hooks/chunk-NQTLTKTJ.js +2993 -0
- package/dist/hooks/chunk-NVRCZPBZ.js +391 -0
- package/dist/hooks/chunk-O46HMMLJ.js +469 -0
- package/dist/hooks/chunk-OFJGH2L4.js +240 -0
- package/dist/hooks/chunk-OLFMCZH5.js +240 -0
- package/dist/hooks/chunk-OMCZS46I.js +49 -0
- package/dist/hooks/chunk-OQZEZW5G.js +469 -0
- package/dist/hooks/chunk-P2MDAT2Y.js +1897 -0
- package/dist/hooks/chunk-P3M2JJIF.js +68 -0
- package/dist/hooks/chunk-PDVHQITQ.js +3453 -0
- package/dist/hooks/chunk-PNT2AMDH.js +391 -0
- package/dist/hooks/chunk-PR2LVSY6.js +3445 -0
- package/dist/hooks/chunk-PRR5R4JK.js +137 -0
- package/dist/hooks/chunk-PXT44QVN.js +566 -0
- package/dist/hooks/chunk-PZLWJLAP.js +469 -0
- package/dist/hooks/chunk-Q2FEAZJ2.js +77 -0
- package/dist/hooks/chunk-Q32WETDO.js +3265 -0
- package/dist/hooks/chunk-Q45DUBLE.js +3600 -0
- package/dist/hooks/chunk-Q7NZSWQ5.js +240 -0
- package/dist/hooks/chunk-QH2JNAMK.js +3085 -0
- package/dist/hooks/chunk-QNNWYQ2R.js +375 -0
- package/dist/hooks/chunk-QPU5H2OS.js +68 -0
- package/dist/hooks/chunk-QRAHZ5TO.js +1829 -0
- package/dist/hooks/chunk-QUZ5HPIE.js +469 -0
- package/dist/hooks/chunk-QVCRG34O.js +2893 -0
- package/dist/hooks/chunk-R3MY4E3S.js +1675 -0
- package/dist/hooks/chunk-R6TXJJXP.js +77 -0
- package/dist/hooks/chunk-REJU6VT7.js +1829 -0
- package/dist/hooks/chunk-REQAQLRC.js +2993 -0
- package/dist/hooks/chunk-RFCXPAHH.js +391 -0
- package/dist/hooks/chunk-RHI6Y22X.js +137 -0
- package/dist/hooks/chunk-RKZVOBBS.js +469 -0
- package/dist/hooks/chunk-RL57TT2Y.js +566 -0
- package/dist/hooks/chunk-RORDOD4S.js +3321 -0
- package/dist/hooks/chunk-RZKYW5P2.js +77 -0
- package/dist/hooks/chunk-SJPJ6VSI.js +391 -0
- package/dist/hooks/chunk-SKSIJQQQ.js +432 -0
- package/dist/hooks/chunk-SSQDZKXG.js +268 -0
- package/dist/hooks/chunk-SSX23SJ2.js +89 -0
- package/dist/hooks/chunk-SYHFKE4C.js +77 -0
- package/dist/hooks/chunk-TCGNI2ZY.js +42 -0
- package/dist/hooks/chunk-TG3WXJF5.js +137 -0
- package/dist/hooks/chunk-TH7IJAY5.js +77 -0
- package/dist/hooks/chunk-TLZ27PCY.js +240 -0
- package/dist/hooks/chunk-U652FXTN.js +566 -0
- package/dist/hooks/chunk-UEK47YUF.js +268 -0
- package/dist/hooks/chunk-UIO45H3O.js +432 -0
- package/dist/hooks/chunk-UNLZEEVH.js +5005 -0
- package/dist/hooks/chunk-UNRVF3SZ.js +432 -0
- package/dist/hooks/chunk-USLFAFOI.js +3453 -0
- package/dist/hooks/chunk-VAEELMLL.js +442 -0
- package/dist/hooks/chunk-VALSWLDQ.js +3453 -0
- package/dist/hooks/chunk-VC5JEPNY.js +3398 -0
- package/dist/hooks/chunk-VEZVK6C7.js +230 -0
- package/dist/hooks/chunk-VK5JKFAR.js +49 -0
- package/dist/hooks/chunk-VNF2KP7Z.js +469 -0
- package/dist/hooks/chunk-VWWCUMW6.js +2669 -0
- package/dist/hooks/chunk-W4JARUQV.js +137 -0
- package/dist/hooks/chunk-WCYPBPJC.js +5014 -0
- package/dist/hooks/chunk-WEOBMNJG.js +2993 -0
- package/dist/hooks/chunk-WKJU3J5Y.js +5390 -0
- package/dist/hooks/chunk-WMN4TSVF.js +3299 -0
- package/dist/hooks/chunk-WNON54PT.js +3469 -0
- package/dist/hooks/chunk-WOVKBPPX.js +137 -0
- package/dist/hooks/chunk-WRVFORYJ.js +432 -0
- package/dist/hooks/chunk-WUBVYGQZ.js +240 -0
- package/dist/hooks/chunk-WWULTUOM.js +68 -0
- package/dist/hooks/chunk-WXHKKB45.js +4962 -0
- package/dist/hooks/chunk-XAI3YTHJ.js +469 -0
- package/dist/hooks/chunk-XFZH6JZJ.js +77 -0
- package/dist/hooks/chunk-XGPWX6IA.js +137 -0
- package/dist/hooks/chunk-XIXXIVGY.js +566 -0
- package/dist/hooks/chunk-XKDOYJGA.js +922 -0
- package/dist/hooks/chunk-YALTVBHM.js +432 -0
- package/dist/hooks/chunk-YEBEPBFK.js +5014 -0
- package/dist/hooks/chunk-YI2BQ3DK.js +3441 -0
- package/dist/hooks/chunk-YVNBCFGG.js +1829 -0
- package/dist/hooks/chunk-YXBN3RGG.js +432 -0
- package/dist/hooks/chunk-Z2OOJSW3.js +3163 -0
- package/dist/hooks/chunk-ZA3HVBOY.js +2644 -0
- package/dist/hooks/chunk-ZKID46U3.js +137 -0
- package/dist/hooks/chunk-ZPMU2JV6.js +49 -0
- package/dist/hooks/chunk-ZRKY4W7O.js +432 -0
- package/dist/hooks/chunk-ZTMRB7LJ.js +268 -0
- package/dist/hooks/chunk-ZVPPBQ3L.js +3413 -0
- package/dist/hooks/codex-hook-adapter.js +164 -0
- package/dist/hooks/duplicate-read-guard.js +29 -0
- package/dist/hooks/format-edited.js +37 -0
- package/dist/hooks/investigation-guard.js +31 -0
- package/dist/hooks/pretool-guard.js +21 -0
- package/dist/hooks/session-lang.js +34 -0
- package/dist/hooks/stop-guard.js +1597 -0
- package/dist/josh.js +1795 -0
- package/dist/managed-marker/index.d.ts +10 -0
- package/dist/managed-marker/index.js +32 -0
- package/dist/self-sync-guard/index.d.ts +10 -0
- package/dist/self-sync-guard/index.js +49 -0
- package/dist/version/index.d.ts +93 -0
- package/dist/version/index.js +1024 -0
- package/env/index.d.ts +7 -0
- package/env/index.js +62 -0
- package/eslint/base.js +233 -0
- package/eslint/checkout-rooted-parser.js +34 -0
- package/eslint/config-fingerprint.js +103 -0
- package/eslint/rules/code-quality.js +292 -0
- package/eslint/rules/english-only-prose.js +135 -0
- package/eslint/rules/formatting.js +44 -0
- package/eslint/rules/import.js +83 -0
- package/eslint/rules/namespace-object-export.js +107 -0
- package/eslint/rules/naming-convention.js +109 -0
- package/eslint/rules/promise.js +17 -0
- package/eslint/rules/sonarjs.js +45 -0
- package/eslint/rules/test-filename.js +91 -0
- package/eslint/rules/typescript.js +186 -0
- package/eslint/rules/unicorn.js +191 -0
- package/eslint/vanilla.js +1 -0
- package/evals/scenarios/consult-not-execute.json +20 -0
- package/evals/scenarios/no-implicit-workflow.json +26 -0
- package/evals/scenarios/overrides-both-locations.json +29 -0
- package/evals/scenarios/upstream-interrupt.json +23 -0
- package/evals/scenarios/workflow-skill-loaded.json +16 -0
- package/lefthook/base.yml +131 -0
- package/lefthook/vanilla.yml +7 -0
- package/package.json +169 -0
- package/playwright.config.ts +160 -0
- package/pnpm-workspace.yaml +41 -0
- package/ports/index.d.ts +17 -0
- package/ports/index.js +256 -0
- package/prettier/index.d.ts +3 -0
- package/prettier/index.js +31 -0
- package/prompts/agent-lint-protocol.json +79 -0
- package/prompts/agent-rules.md +63 -0
- package/prompts/coding-standards.md +382 -0
- package/prompts/collaboration-workflow/consultation-vs-execution.md +8 -0
- package/prompts/collaboration-workflow/cross-repo-epic.md +54 -0
- package/prompts/collaboration-workflow/distributed-docs.md +7 -0
- package/prompts/collaboration-workflow/durable-rules.md +24 -0
- package/prompts/collaboration-workflow/epic-audit.md +56 -0
- package/prompts/collaboration-workflow/epic-bundle.md +109 -0
- package/prompts/collaboration-workflow/file-edits.md +124 -0
- package/prompts/collaboration-workflow/gh-rest.md +57 -0
- package/prompts/collaboration-workflow/issue-citation.md +38 -0
- package/prompts/collaboration-workflow/issue-template.md +190 -0
- package/prompts/collaboration-workflow/latest-first.md +14 -0
- package/prompts/collaboration-workflow/no-clones.md +11 -0
- package/prompts/collaboration-workflow/operating-rules.md +123 -0
- package/prompts/collaboration-workflow/output-bounds.md +107 -0
- package/prompts/collaboration-workflow/overview.md +35 -0
- package/prompts/collaboration-workflow/plan-comment.md +85 -0
- package/prompts/collaboration-workflow/proposal-request.md +23 -0
- package/prompts/collaboration-workflow/report-format.md +206 -0
- package/prompts/collaboration-workflow/residency.md +94 -0
- package/prompts/collaboration-workflow/rule-delivery.md +146 -0
- package/prompts/collaboration-workflow/shell-body.md +82 -0
- package/prompts/collaboration-workflow/simplicity-first.md +9 -0
- package/prompts/collaboration-workflow/single-source-rules.md +13 -0
- package/prompts/collaboration-workflow/turn-batching.md +137 -0
- package/prompts/collaboration-workflow/upstream-interrupt.md +51 -0
- package/prompts/collaboration-workflow/wip-cap.md +118 -0
- package/prompts/collaboration-workflow.md +52 -0
- package/prompts/refactoring.md +103 -0
- package/prompts/review-rubric.md +338 -0
- package/prompts/review.md +217 -0
- package/prompts/sonar-hotspot-handling.md +77 -0
- package/prompts/testing-guide.md +277 -0
- package/scripts/adopt/adopt-logic.ts +107 -0
- package/scripts/adopt/adopt-toolkits.ts +181 -0
- package/scripts/adopt/adopt.ts +171 -0
- package/scripts/agent/agent-argv.ts +140 -0
- package/scripts/agent/agent-diagnostics.ts +120 -0
- package/scripts/agent/agent-event.ts +173 -0
- package/scripts/agent/agent-exit-record.ts +32 -0
- package/scripts/agent/agent-launch-environment.ts +71 -0
- package/scripts/agent/agent-role-profile.ts +329 -0
- package/scripts/agent/api-outage.ts +51 -0
- package/scripts/agent/claude-agent-argv.ts +151 -0
- package/scripts/agent/claude-result-event.ts +98 -0
- package/scripts/agent/codex-agent-argv.ts +94 -0
- package/scripts/agent/codex-home-source.ts +11 -0
- package/scripts/agent/interactive-ask.ts +91 -0
- package/scripts/auto-ok/auto-ok-cli.ts +516 -0
- package/scripts/backlog/backlog-arrival.ts +147 -0
- package/scripts/backlog/backlog-budget-cli.ts +220 -0
- package/scripts/backlog/backlog-budget.ts +284 -0
- package/scripts/backlog/backlog-defect-priority.ts +77 -0
- package/scripts/backlog/backlog-drive-cli.ts +377 -0
- package/scripts/backlog/backlog-drive-finish.ts +23 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +81 -0
- package/scripts/backlog/backlog-drive-named.ts +101 -0
- package/scripts/backlog/backlog-drive-offer-argv.ts +29 -0
- package/scripts/backlog/backlog-drive-owner.ts +22 -0
- package/scripts/backlog/backlog-drive-restore.ts +67 -0
- package/scripts/backlog/backlog-drive.ts +322 -0
- package/scripts/backlog/backlog-named.ts +164 -0
- package/scripts/backlog/backlog-next.ts +376 -0
- package/scripts/backlog/backlog-offer-cli.ts +279 -0
- package/scripts/backlog/backlog-offer.ts +93 -0
- package/scripts/backlog/backlog-plan-cli.ts +235 -0
- package/scripts/backlog/backlog-plan.ts +231 -0
- package/scripts/backlog/backlog-pool.ts +322 -0
- package/scripts/backlog/backlog-ready.ts +146 -0
- package/scripts/backlog/backlog-scope.ts +144 -0
- package/scripts/backlog/backlog-stalled-cli.ts +30 -0
- package/scripts/backlog/backlog-stalled-detect.ts +143 -0
- package/scripts/backlog/backlog-stalled.ts +118 -0
- package/scripts/behavior/behavior-assertion.ts +87 -0
- package/scripts/behavior/behavior-cli.ts +88 -0
- package/scripts/behavior/behavior-rules.ts +128 -0
- package/scripts/build/build-bin.ts +36 -0
- package/scripts/build/build-claude-md.ts +42 -0
- package/scripts/build/build-config-merge.ts +26 -0
- package/scripts/build/build-hooks.ts +79 -0
- package/scripts/build/build-library.ts +83 -0
- package/scripts/build/build-managed-marker.ts +26 -0
- package/scripts/build/build-self-sync-guard.ts +26 -0
- package/scripts/build/build-version.ts +25 -0
- package/scripts/build/local-bin.ts +97 -0
- package/scripts/build/shim-shell.ts +25 -0
- package/scripts/bytes/bytes-command.ts +181 -0
- package/scripts/cases/cases-cli.ts +48 -0
- package/scripts/cases/cases-logic.ts +100 -0
- package/scripts/claude/skill-meta.ts +37 -0
- package/scripts/claude/workflow-destination.ts +13 -0
- package/scripts/clone/clone-aggregate.ts +76 -0
- package/scripts/clone/clone-fingerprint.ts +96 -0
- package/scripts/clone/clone-scan-cli.ts +39 -0
- package/scripts/clone/clone-scan.ts +158 -0
- package/scripts/config-merge/index.ts +19 -0
- package/scripts/config-merge/json-format.ts +128 -0
- package/scripts/config-merge/list-patch.ts +61 -0
- package/scripts/config-merge/parse-jsonc.ts +14 -0
- package/scripts/config-merge/patch-json-key.ts +439 -0
- package/scripts/config-merge/patch-json-list.ts +38 -0
- package/scripts/config-merge/patch-yaml-list.ts +107 -0
- package/scripts/cost-runtime/codex-usage.ts +119 -0
- package/scripts/cost-runtime/context-cut-payback.ts +77 -0
- package/scripts/cost-runtime/context-cut-threshold.ts +21 -0
- package/scripts/cost-runtime/cost-attribute.ts +168 -0
- package/scripts/cost-runtime/cost-blocks.ts +149 -0
- package/scripts/cost-runtime/cost-cli.ts +318 -0
- package/scripts/cost-runtime/cost-corpus.ts +278 -0
- package/scripts/cost-runtime/cost-format.ts +32 -0
- package/scripts/cost-runtime/cost-pricing.ts +176 -0
- package/scripts/cost-runtime/cost-tokens.ts +84 -0
- package/scripts/cost-runtime/cost-transcript.ts +531 -0
- package/scripts/cost-runtime/cost-usage.ts +287 -0
- package/scripts/cost-runtime/cost-verdict.ts +89 -0
- package/scripts/cost-runtime/own-session.ts +58 -0
- package/scripts/cost-runtime/transcript-cwd.ts +14 -0
- package/scripts/delegation/delegation-cli.ts +91 -0
- package/scripts/delegation/delegation-policy.ts +178 -0
- package/scripts/delegation/duplicate-read-guard.ts +244 -0
- package/scripts/delegation/fanout-cli.ts +61 -0
- package/scripts/delegation/fanout.ts +95 -0
- package/scripts/delegation/investigation-guard.ts +131 -0
- package/scripts/delegation/investigation-reads.ts +637 -0
- package/scripts/discovery/repo-discovery.ts +166 -0
- package/scripts/discovery/repo-map-logic.ts +102 -0
- package/scripts/discovery/repo-origin.ts +153 -0
- package/scripts/discovery/repo-party-cli.ts +69 -0
- package/scripts/discovery/repo-party.ts +46 -0
- package/scripts/doctor/doctor-consumer.ts +181 -0
- package/scripts/doctor/doctor-io.ts +210 -0
- package/scripts/doctor/doctor-logic.ts +122 -0
- package/scripts/doctor/doctor-ports.ts +117 -0
- package/scripts/doctor/doctor.ts +232 -0
- package/scripts/document/backlogrun-parent-read-set.ts +48 -0
- package/scripts/document/bash-output-cap.ts +45 -0
- package/scripts/document/document-byte-budget.ts +183 -0
- package/scripts/document/document-byte-check.ts +131 -0
- package/scripts/document/document-reachability.ts +131 -0
- package/scripts/document/document-read-cli.ts +82 -0
- package/scripts/document/document-scan.ts +108 -0
- package/scripts/document/document-section-cli.ts +101 -0
- package/scripts/document/document-section.ts +156 -0
- package/scripts/document/edit-files-cli.ts +280 -0
- package/scripts/document/entry-read-budget.ts +154 -0
- package/scripts/document/entry-read-set.ts +471 -0
- package/scripts/document/generate-catalog.ts +69 -0
- package/scripts/document/lane-child-read-set.ts +88 -0
- package/scripts/document/read-files-cli.ts +135 -0
- package/scripts/document/read-set-cli.ts +295 -0
- package/scripts/document/read-set-point-of-use.ts +89 -0
- package/scripts/document/read-set-pricing.ts +52 -0
- package/scripts/document/read-set-trim.ts +78 -0
- package/scripts/document/retired-phrases.ts +143 -0
- package/scripts/document/review-agent-type.ts +46 -0
- package/scripts/document/single-source.ts +73 -0
- package/scripts/epic/epic-audit-checks.ts +452 -0
- package/scripts/epic/epic-audit-cli.ts +374 -0
- package/scripts/epic/epic-audit-orphans.ts +142 -0
- package/scripts/epic/epic-audit-rationale.ts +191 -0
- package/scripts/epic/epic-audit-report.ts +101 -0
- package/scripts/epic/epic-audit.ts +240 -0
- package/scripts/epic/epic-bundle-cli.ts +472 -0
- package/scripts/epic/epic-bundle-evidence.ts +147 -0
- package/scripts/epic/epic-bundle-gaps.ts +86 -0
- package/scripts/epic/epic-bundle-referenced.ts +195 -0
- package/scripts/epic/epic-bundle.ts +309 -0
- package/scripts/epic/epic-busy.ts +204 -0
- package/scripts/epic/epic-candidate-confirm.ts +279 -0
- package/scripts/epic/epic-classify.ts +294 -0
- package/scripts/epic/epic-cross-repo.ts +366 -0
- package/scripts/epic/epic-fetch.ts +370 -0
- package/scripts/epic/epic-graph.ts +279 -0
- package/scripts/epic/epic-index.ts +209 -0
- package/scripts/epic/epic-issue.ts +172 -0
- package/scripts/epic/epic-lane-offer.ts +207 -0
- package/scripts/epic/epic-nested.ts +37 -0
- package/scripts/epic/epic-next-read.ts +141 -0
- package/scripts/epic/epic-next-views.ts +144 -0
- package/scripts/epic/epic-next.ts +477 -0
- package/scripts/epic/epic-outside-blocker.ts +113 -0
- package/scripts/epic/epic-relation-recheck.ts +108 -0
- package/scripts/epic/epic-report.ts +200 -0
- package/scripts/gate/core-budget.ts +292 -0
- package/scripts/gate/gate-log.ts +95 -0
- package/scripts/gate/gate-plan.ts +356 -0
- package/scripts/gate/gate-report.ts +207 -0
- package/scripts/gate/gate-skip.ts +123 -0
- package/scripts/gate/gate-tree.ts +49 -0
- package/scripts/gate/hook-gate-reuse.ts +130 -0
- package/scripts/gate/pre-commit-type-check.ts +187 -0
- package/scripts/gate/scoped-green.ts +260 -0
- package/scripts/gate/type-check-step.ts +90 -0
- package/scripts/gate/verification-gate.ts +531 -0
- package/scripts/gh/fix-gh-packages-logic.ts +232 -0
- package/scripts/gh/fix-gh-packages.ts +129 -0
- package/scripts/gh/gh-cli-token.ts +18 -0
- package/scripts/gh/gh-spawn.ts +44 -0
- package/scripts/git/animation-helpers.ts +81 -0
- package/scripts/git/change-base.ts +26 -0
- package/scripts/git/changed-file-scope.ts +209 -0
- package/scripts/git/changed-paths.ts +30 -0
- package/scripts/git/constants.ts +41 -0
- package/scripts/git/git-ai-review-scan.ts +154 -0
- package/scripts/git/git-animation.ts +41 -0
- package/scripts/git/git-branch.ts +127 -0
- package/scripts/git/git-command.ts +587 -0
- package/scripts/git/git-commit.ts +27 -0
- package/scripts/git/git-common-directory.ts +38 -0
- package/scripts/git/git-epic-add-body.ts +365 -0
- package/scripts/git/git-epic-add-plan.ts +421 -0
- package/scripts/git/git-epic-add.ts +249 -0
- package/scripts/git/git-epic-body.ts +150 -0
- package/scripts/git/git-epic-chains.ts +411 -0
- package/scripts/git/git-epic-close-comment.ts +199 -0
- package/scripts/git/git-epic-close.ts +393 -0
- package/scripts/git/git-epic-decision.ts +171 -0
- package/scripts/git/git-epic-parse.ts +351 -0
- package/scripts/git/git-epic-promote.ts +102 -0
- package/scripts/git/git-epic-read.ts +73 -0
- package/scripts/git/git-epic-reconcile.ts +246 -0
- package/scripts/git/git-epic-reference.ts +98 -0
- package/scripts/git/git-epic-relations.ts +78 -0
- package/scripts/git/git-epic-remove-plan.ts +152 -0
- package/scripts/git/git-epic-remove.ts +101 -0
- package/scripts/git/git-epic-run.ts +223 -0
- package/scripts/git/git-epic-sections.ts +98 -0
- package/scripts/git/git-epic-shape.ts +81 -0
- package/scripts/git/git-epic-validate.ts +155 -0
- package/scripts/git/git-error.ts +78 -0
- package/scripts/git/git-execa-error.ts +35 -0
- package/scripts/git/git-fixture-workspace.ts +88 -0
- package/scripts/git/git-followup-cleanup.ts +88 -0
- package/scripts/git/git-followup-flush.ts +63 -0
- package/scripts/git/git-followup-label.ts +67 -0
- package/scripts/git/git-followup-pending.ts +95 -0
- package/scripts/git/git-followup-stages.ts +149 -0
- package/scripts/git/git-gh-api-path.ts +118 -0
- package/scripts/git/git-gh-check.ts +21 -0
- package/scripts/git/git-gh-command.ts +17 -0
- package/scripts/git/git-gh-exec.ts +344 -0
- package/scripts/git/git-gh-failure.ts +103 -0
- package/scripts/git/git-gh-helpers.ts +44 -0
- package/scripts/git/git-gh-issue-list.ts +257 -0
- package/scripts/git/git-gh-issue-read.ts +457 -0
- package/scripts/git/git-gh-issue-rest.ts +238 -0
- package/scripts/git/git-gh-issue-write.ts +285 -0
- package/scripts/git/git-gh-issue.ts +161 -0
- package/scripts/git/git-gh-pr-auto-merge.ts +85 -0
- package/scripts/git/git-gh-pr-read.ts +322 -0
- package/scripts/git/git-gh-pr-rest.ts +172 -0
- package/scripts/git/git-gh-pr-review.ts +103 -0
- package/scripts/git/git-gh-pr-rollup.ts +91 -0
- package/scripts/git/git-gh-pr-snapshot.ts +138 -0
- package/scripts/git/git-gh-pr.ts +219 -0
- package/scripts/git/git-gh-reachability.ts +56 -0
- package/scripts/git/git-gh-repo.ts +37 -0
- package/scripts/git/git-gh-rest-state.ts +14 -0
- package/scripts/git/git-issue.ts +168 -0
- package/scripts/git/git-location-environment.ts +62 -0
- package/scripts/git/git-ls-remote.ts +28 -0
- package/scripts/git/git-next-issues.ts +98 -0
- package/scripts/git/git-notify.ts +104 -0
- package/scripts/git/git-pr-ai-review.ts +180 -0
- package/scripts/git/git-pr-checks-eval.ts +265 -0
- package/scripts/git/git-pr-checks-parse.ts +153 -0
- package/scripts/git/git-pr-checks-watch.ts +184 -0
- package/scripts/git/git-pr-checks.ts +387 -0
- package/scripts/git/git-pr-coderabbit.ts +129 -0
- package/scripts/git/git-pr-confirmation.ts +64 -0
- package/scripts/git/git-pr-error.ts +25 -0
- package/scripts/git/git-pr-followup-wrapup.ts +225 -0
- package/scripts/git/git-pr-followup.ts +436 -0
- package/scripts/git/git-pr-managed-config.ts +69 -0
- package/scripts/git/git-pr-messages.ts +37 -0
- package/scripts/git/git-pr.ts +181 -0
- package/scripts/git/git-prompt-display.ts +22 -0
- package/scripts/git/git-prompt.ts +207 -0
- package/scripts/git/git-push-transport.ts +173 -0
- package/scripts/git/git-push.ts +27 -0
- package/scripts/git/git-remote-branch.ts +40 -0
- package/scripts/git/git-spawn.ts +47 -0
- package/scripts/git/git-staging.ts +128 -0
- package/scripts/git/git-stash.ts +124 -0
- package/scripts/git/git-status.ts +198 -0
- package/scripts/git/git-worktree.ts +110 -0
- package/scripts/git/github-issue-url.ts +105 -0
- package/scripts/git/gone-branch.ts +113 -0
- package/scripts/git/issue-labels.ts +279 -0
- package/scripts/git/listing-cutoff.ts +51 -0
- package/scripts/git/main-merge-guard.ts +134 -0
- package/scripts/git/main-merge.ts +120 -0
- package/scripts/git/main-sync.ts +121 -0
- package/scripts/git/parse-json-array.ts +102 -0
- package/scripts/git/schemas.ts +166 -0
- package/scripts/git/stash-orphans.ts +91 -0
- package/scripts/git/stash-pop-args.ts +59 -0
- package/scripts/git/stash-pop-cli.ts +105 -0
- package/scripts/git/telegram-notify.ts +404 -0
- package/scripts/hooks/batch-guard.ts +144 -0
- package/scripts/hooks/check-commit-message.ts +134 -0
- package/scripts/hooks/codex-hook-adapter.ts +155 -0
- package/scripts/hooks/edited-cspell.ts +128 -0
- package/scripts/hooks/format-edited-file-fixtures.ts +109 -0
- package/scripts/hooks/format-edited-file.ts +510 -0
- package/scripts/hooks/format-rewrite-notice.ts +99 -0
- package/scripts/hooks/pre-push-unit.ts +146 -0
- package/scripts/hooks/pretool-guard.ts +96 -0
- package/scripts/hooks/prevent-main-commit.ts +38 -0
- package/scripts/hooks/prompt-hooks.ts +38 -0
- package/scripts/hooks/reserved-run.ts +90 -0
- package/scripts/hooks/stop-guard.ts +135 -0
- package/scripts/init/claude-plugin-config.ts +51 -0
- package/scripts/init/distributed-paths.ts +100 -0
- package/scripts/init/hook-command-rewrite.ts +85 -0
- package/scripts/init/hook-launch.ts +31 -0
- package/scripts/init/init-actions.ts +147 -0
- package/scripts/init/init-ai-copy.ts +235 -0
- package/scripts/init/init-copy-content.ts +50 -0
- package/scripts/init/init-logic-deploy-vps.ts +43 -0
- package/scripts/init/init-logic-json-merge.ts +340 -0
- package/scripts/init/init-logic-migrate.ts +62 -0
- package/scripts/init/init-logic-package-key-order.ts +50 -0
- package/scripts/init/init-logic-secretlint.ts +36 -0
- package/scripts/init/init-logic-sonar.ts +197 -0
- package/scripts/init/init-logic-templates.ts +142 -0
- package/scripts/init/init-logic-workspace.ts +59 -0
- package/scripts/init/init-logic-yaml-merge.ts +57 -0
- package/scripts/init/init-logic.ts +474 -0
- package/scripts/init/init-paths.ts +11 -0
- package/scripts/init/init-sonar.ts +32 -0
- package/scripts/init/init.ts +219 -0
- package/scripts/init/kit-base-preset.ts +60 -0
- package/scripts/init/plugin-install-hint.ts +47 -0
- package/scripts/init/tsconfig-preset-migration.ts +67 -0
- package/scripts/issue/baseline-measure.ts +105 -0
- package/scripts/issue/behavior-change-lint.ts +122 -0
- package/scripts/issue/defect-rate-cli.ts +167 -0
- package/scripts/issue/defect-rate.ts +145 -0
- package/scripts/issue/issue-backlinks-cli.ts +97 -0
- package/scripts/issue/issue-backlinks.ts +164 -0
- package/scripts/issue/issue-cite-cli.ts +158 -0
- package/scripts/issue/issue-cite.ts +102 -0
- package/scripts/issue/issue-comment-cli.ts +95 -0
- package/scripts/issue/issue-fold-cli.ts +104 -0
- package/scripts/issue/issue-fold-existing-cli.ts +81 -0
- package/scripts/issue/issue-fold-existing.ts +73 -0
- package/scripts/issue/issue-fold.ts +42 -0
- package/scripts/issue/issue-lint-cli.ts +60 -0
- package/scripts/issue/issue-lint.ts +26 -0
- package/scripts/issue/issue-logic.ts +50 -0
- package/scripts/issue/issue-read-cli.ts +190 -0
- package/scripts/issue/issue-read.ts +145 -0
- package/scripts/issue/issue-scout-cli.ts +482 -0
- package/scripts/issue/issue-scout.ts +244 -0
- package/scripts/issue/issue-state-cli.ts +260 -0
- package/scripts/issue/issue-state.ts +109 -0
- package/scripts/issue/markdown-section.ts +39 -0
- package/scripts/issue/measure-rerun-cli.ts +98 -0
- package/scripts/issue/reproduction-measure.ts +59 -0
- package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +1171 -0
- package/scripts/josh/agent-session-environment.ts +188 -0
- package/scripts/josh/cli-body.ts +96 -0
- package/scripts/josh/command-suggest.ts +57 -0
- package/scripts/josh/file-map-stamp.ts +264 -0
- package/scripts/josh/hook-decision.ts +479 -0
- package/scripts/josh/josh-command-map.ts +196 -0
- package/scripts/josh/josh-command-types.ts +226 -0
- package/scripts/josh/josh-commands-ai.ts +327 -0
- package/scripts/josh/josh-commands-backlog.ts +54 -0
- package/scripts/josh/josh-commands-clone.ts +18 -0
- package/scripts/josh/josh-commands-development.ts +206 -0
- package/scripts/josh/josh-commands-document.ts +45 -0
- package/scripts/josh/josh-commands-guard.ts +38 -0
- package/scripts/josh/josh-commands-hooks.ts +42 -0
- package/scripts/josh/josh-commands-issue.ts +69 -0
- package/scripts/josh/josh-commands-lane.ts +75 -0
- package/scripts/josh/josh-commands-lint.ts +37 -0
- package/scripts/josh/josh-commands-maintenance.ts +80 -0
- package/scripts/josh/josh-commands-project.ts +53 -0
- package/scripts/josh/josh-commands-split.ts +20 -0
- package/scripts/josh/josh-commands-versioning.ts +48 -0
- package/scripts/josh/josh-commands-workflow.ts +116 -0
- package/scripts/josh/josh-composite-arguments.ts +55 -0
- package/scripts/josh/josh-environment-file.ts +31 -0
- package/scripts/josh/josh-in-process.ts +80 -0
- package/scripts/josh/josh-logic.ts +308 -0
- package/scripts/josh/josh-run.ts +53 -0
- package/scripts/josh/josh-script-reader.ts +11 -0
- package/scripts/josh/josh-verdict.ts +111 -0
- package/scripts/josh/josh.ts +60 -0
- package/scripts/josh/kit-only.ts +33 -0
- package/scripts/josh/path-decision.ts +104 -0
- package/scripts/josh/platform-temporary.ts +66 -0
- package/scripts/josh/process-identity.ts +335 -0
- package/scripts/josh/session-language-cli.ts +51 -0
- package/scripts/josh/session-language.ts +30 -0
- package/scripts/josh/stamp-file.ts +194 -0
- package/scripts/lane/lane-await.ts +165 -0
- package/scripts/lane/lane-cache-run.ts +39 -0
- package/scripts/lane/lane-cache.ts +135 -0
- package/scripts/lane/lane-capacity.ts +69 -0
- package/scripts/lane/lane-child-invocation.ts +73 -0
- package/scripts/lane/lane-child-marker.ts +58 -0
- package/scripts/lane/lane-cli.ts +410 -0
- package/scripts/lane/lane-close.ts +197 -0
- package/scripts/lane/lane-dispatch-log.ts +13 -0
- package/scripts/lane/lane-dispatch.ts +458 -0
- package/scripts/lane/lane-environment.ts +253 -0
- package/scripts/lane/lane-guard-policy.ts +136 -0
- package/scripts/lane/lane-install.ts +94 -0
- package/scripts/lane/lane-launch-cli.ts +133 -0
- package/scripts/lane/lane-occupancy.ts +112 -0
- package/scripts/lane/lane-open.ts +275 -0
- package/scripts/lane/lane-output.ts +124 -0
- package/scripts/lane/lane-paths.ts +96 -0
- package/scripts/lane/lane-reap.ts +137 -0
- package/scripts/lane/lane-registry.ts +261 -0
- package/scripts/lane/lane-relaunch.ts +68 -0
- package/scripts/lane/lane-report.ts +95 -0
- package/scripts/lane/lane-resume.ts +61 -0
- package/scripts/lane/lane-seed.ts +44 -0
- package/scripts/lane/lane-start-point.ts +175 -0
- package/scripts/lane/openai-lane-supervisor-cli.ts +32 -0
- package/scripts/lane/openai-lane-supervisor-decision.ts +63 -0
- package/scripts/lane/openai-lane-supervisor.ts +337 -0
- package/scripts/lib/bounded-pool.ts +109 -0
- package/scripts/lib/buffered-process.ts +82 -0
- package/scripts/lib/caddy-logs.sh +45 -0
- package/scripts/lib/cli-flags.ts +19 -0
- package/scripts/lib/json-value.ts +24 -0
- package/scripts/lib/poll.ts +57 -0
- package/scripts/lib/read-file.ts +16 -0
- package/scripts/lib/schemas.ts +67 -0
- package/scripts/lib/spawn-exit.ts +45 -0
- package/scripts/lib/status-icons.ts +24 -0
- package/scripts/lines/effective-limit.ts +156 -0
- package/scripts/lines/line-budget.ts +404 -0
- package/scripts/lines/line-targets.ts +80 -0
- package/scripts/lines/lines-command.ts +174 -0
- package/scripts/lint/cspell-cached.ts +41 -0
- package/scripts/lint/lint-parallel.ts +72 -0
- package/scripts/lint/lint-related-scope.ts +128 -0
- package/scripts/lint/lint-related.ts +104 -0
- package/scripts/managed-marker/index.ts +5 -0
- package/scripts/managed-marker/managed-marker-logic.ts +67 -0
- package/scripts/observations/observation-ledger-home.ts +32 -0
- package/scripts/observations/observation-ledger-line.ts +93 -0
- package/scripts/observations/observation-ledger.ts +35 -0
- package/scripts/observations/observations-flush-cli.ts +42 -0
- package/scripts/observations/observations-flush-landing.ts +97 -0
- package/scripts/observations/observations-flush.ts +420 -0
- package/scripts/overrides/lockfile-overrides.ts +105 -0
- package/scripts/overrides/overrides-check.ts +84 -0
- package/scripts/overrides/overrides-files.ts +19 -0
- package/scripts/overrides/overrides-logic.ts +211 -0
- package/scripts/overrides/schemas.ts +49 -0
- package/scripts/package/package-scout-cli.ts +195 -0
- package/scripts/package/package-scout-format.ts +151 -0
- package/scripts/package/package-scout.ts +121 -0
- package/scripts/ports/port-command.ts +87 -0
- package/scripts/propagate/propagate-git-failure.ts +191 -0
- package/scripts/propagate/propagate-git.ts +224 -0
- package/scripts/propagate/propagate-publish.ts +181 -0
- package/scripts/propagate/propagate-run.ts +201 -0
- package/scripts/propagate/propagate-steps.ts +421 -0
- package/scripts/propagate/propagate-targets.ts +160 -0
- package/scripts/propagate/propagate.ts +216 -0
- package/scripts/refactor/import-graph.ts +187 -0
- package/scripts/refactor/refactor-lint.ts +250 -0
- package/scripts/refactor/refactor-scan-cli.ts +10 -0
- package/scripts/refactor/refactor-scan.ts +124 -0
- package/scripts/refactor/refactor-targets.ts +103 -0
- package/scripts/release/release-cli.ts +88 -0
- package/scripts/release/release-history.ts +132 -0
- package/scripts/release/release-plan.ts +130 -0
- package/scripts/release/release-publish.ts +152 -0
- package/scripts/release/release-scope-cli.ts +103 -0
- package/scripts/release/release-tag.ts +93 -0
- package/scripts/release/release-worktree.ts +71 -0
- package/scripts/repo/auto-merge-setting-logic.ts +100 -0
- package/scripts/repo/auto-merge-setting.ts +37 -0
- package/scripts/repo/repo-setting.ts +112 -0
- package/scripts/report/report-lint-cli.ts +49 -0
- package/scripts/report/report-lint.ts +250 -0
- package/scripts/retrospective/retrospective-cli.ts +97 -0
- package/scripts/retrospective/retrospective.ts +127 -0
- package/scripts/review/disposition-cli.ts +44 -0
- package/scripts/review/disposition-logic.ts +45 -0
- package/scripts/review/live-evidence.ts +62 -0
- package/scripts/review/review-attest-cli.ts +115 -0
- package/scripts/review/review-attest.ts +319 -0
- package/scripts/review/review-brief-cli.ts +290 -0
- package/scripts/review/review-brief.ts +440 -0
- package/scripts/review/review-checkout.ts +56 -0
- package/scripts/review/review-finding-ledger.ts +167 -0
- package/scripts/review/review-findings-cli.ts +57 -0
- package/scripts/review/review-level.ts +86 -0
- package/scripts/review/review-record-cli.ts +196 -0
- package/scripts/review/review-record.ts +74 -0
- package/scripts/review/review-round2-cli.ts +84 -0
- package/scripts/review/review-round2.ts +139 -0
- package/scripts/review/review-stamps.ts +113 -0
- package/scripts/review/review-tree.ts +58 -0
- package/scripts/rules/bash-triggers.ts +44 -0
- package/scripts/rules/decision-oracle.ts +342 -0
- package/scripts/rules/delivered-rules-harness.ts +72 -0
- package/scripts/rules/delivered-rules.ts +793 -0
- package/scripts/rules/early-heartbeat.ts +241 -0
- package/scripts/rules/file-body.ts +150 -0
- package/scripts/rules/filing-cap.ts +133 -0
- package/scripts/rules/filing-offer.ts +81 -0
- package/scripts/rules/firing-point.ts +63 -0
- package/scripts/rules/gh-api.ts +65 -0
- package/scripts/rules/git-argv.ts +129 -0
- package/scripts/rules/git-force.ts +104 -0
- package/scripts/rules/implementation-cut-verdict.ts +84 -0
- package/scripts/rules/implementation-cut.ts +202 -0
- package/scripts/rules/issue-citation.ts +242 -0
- package/scripts/rules/issue-fold.ts +73 -0
- package/scripts/rules/issue-scout.ts +64 -0
- package/scripts/rules/josh-git-bare.ts +80 -0
- package/scripts/rules/lane-carry-conflict.ts +96 -0
- package/scripts/rules/lane-interactive-ask.ts +71 -0
- package/scripts/rules/lane-park.ts +122 -0
- package/scripts/rules/lane-switch-main.ts +139 -0
- package/scripts/rules/oracle-consulted.ts +81 -0
- package/scripts/rules/oracle-firing.ts +151 -0
- package/scripts/rules/oracle-list-cli.ts +81 -0
- package/scripts/rules/piped-verification.ts +126 -0
- package/scripts/rules/poll-loop.ts +125 -0
- package/scripts/rules/pre-gate-cut.ts +207 -0
- package/scripts/rules/prior-comment-read.ts +106 -0
- package/scripts/rules/raw-field-body.ts +56 -0
- package/scripts/rules/reply-language.ts +116 -0
- package/scripts/rules/rule-body-guard.ts +206 -0
- package/scripts/rules/rule-guard.ts +23 -0
- package/scripts/rules/rule-value-cli.ts +129 -0
- package/scripts/rules/rule-value.ts +397 -0
- package/scripts/rules/run-tail.ts +178 -0
- package/scripts/rules/shell-body-trigger.ts +204 -0
- package/scripts/rules/shell-segments.ts +45 -0
- package/scripts/rules/stop-rules.ts +329 -0
- package/scripts/rules/tail-commands.ts +35 -0
- package/scripts/rules/test-declared-commit.ts +51 -0
- package/scripts/rules/third-party-write.ts +90 -0
- package/scripts/rules/top-level-scripts-guard.ts +47 -0
- package/scripts/rules/worktree-guard.ts +130 -0
- package/scripts/run/detached-launch.ts +360 -0
- package/scripts/run/run-carry-args.ts +264 -0
- package/scripts/run/run-carry-change.ts +69 -0
- package/scripts/run/run-carry-cli.ts +441 -0
- package/scripts/run/run-carry-flush.ts +63 -0
- package/scripts/run/run-carry-stash.ts +71 -0
- package/scripts/run/run-carry-streak.ts +113 -0
- package/scripts/run/run-carry.ts +550 -0
- package/scripts/run/run-cut-args.ts +132 -0
- package/scripts/run/run-cut-cli.ts +461 -0
- package/scripts/run/run-cut-handoff.ts +126 -0
- package/scripts/run/run-cut.ts +531 -0
- package/scripts/run/run-ending-cli.ts +111 -0
- package/scripts/run/run-ending.ts +239 -0
- package/scripts/run/run-entry-cli.ts +135 -0
- package/scripts/run/run-entry.ts +95 -0
- package/scripts/run/run-event-cli.ts +210 -0
- package/scripts/run/run-event-follow.ts +65 -0
- package/scripts/run/run-event-render.ts +75 -0
- package/scripts/run/run-event-scope.ts +127 -0
- package/scripts/run/run-event-stream-emit.ts +140 -0
- package/scripts/run/run-event-stream.ts +258 -0
- package/scripts/run/run-event-watch.ts +37 -0
- package/scripts/run/run-headless.ts +105 -0
- package/scripts/run/run-hold-cli.ts +310 -0
- package/scripts/run/run-hold.ts +264 -0
- package/scripts/run/run-invocation.ts +237 -0
- package/scripts/run/run-issue-number.ts +19 -0
- package/scripts/run/run-liveness-cli.ts +169 -0
- package/scripts/run/run-liveness.ts +424 -0
- package/scripts/run/run-merge-cli.ts +385 -0
- package/scripts/run/run-merge-steps.ts +326 -0
- package/scripts/run/run-merge.ts +158 -0
- package/scripts/run/run-next-cli.ts +48 -0
- package/scripts/run/run-next.ts +80 -0
- package/scripts/run/run-preflight.ts +337 -0
- package/scripts/run/run-prep-cli.ts +151 -0
- package/scripts/run/run-prep.ts +84 -0
- package/scripts/run/run-progress-args.ts +65 -0
- package/scripts/run/run-progress-cli.ts +508 -0
- package/scripts/run/run-progress-clock.ts +320 -0
- package/scripts/run/run-progress-config.ts +119 -0
- package/scripts/run/run-progress-read.ts +199 -0
- package/scripts/run/run-progress.ts +366 -0
- package/scripts/run/run-report-cli.ts +71 -0
- package/scripts/run/run-report.ts +78 -0
- package/scripts/run/run-review-cli.ts +130 -0
- package/scripts/run/run-review-steps.ts +161 -0
- package/scripts/run/run-review.ts +121 -0
- package/scripts/run/run-ship-cli.ts +431 -0
- package/scripts/run/run-ship-detach.ts +200 -0
- package/scripts/run/run-ship-probe.ts +103 -0
- package/scripts/run/run-ship-return.ts +75 -0
- package/scripts/run/run-ship-review-steps.ts +227 -0
- package/scripts/run/run-ship-review.ts +177 -0
- package/scripts/run/run-ship-stage.ts +150 -0
- package/scripts/run/run-ship.ts +78 -0
- package/scripts/run/run-status-cli.ts +175 -0
- package/scripts/run/run-status.ts +77 -0
- package/scripts/run/run-step-cli.ts +111 -0
- package/scripts/run/run-step.ts +292 -0
- package/scripts/run/run-stop-notify.ts +52 -0
- package/scripts/run/run-stranded-cli.ts +31 -0
- package/scripts/run/run-stranded-detect.ts +134 -0
- package/scripts/run/run-stranded.ts +120 -0
- package/scripts/run/run-tail-cli.ts +105 -0
- package/scripts/run/run-tail.ts +61 -0
- package/scripts/run/run-transcript.golden.txt +57 -0
- package/scripts/run/run-wake-cli.ts +428 -0
- package/scripts/run/run-wake-describe.ts +97 -0
- package/scripts/run/run-wake-driver.ts +80 -0
- package/scripts/run/run-wake-handoff.ts +29 -0
- package/scripts/run/run-wake-loop.ts +223 -0
- package/scripts/run/run-wake-session.ts +150 -0
- package/scripts/run/run-wake-work.ts +104 -0
- package/scripts/run/run-wake.ts +607 -0
- package/scripts/run/run-watcher-guard-cli.ts +37 -0
- package/scripts/run/run-watcher-guard.ts +59 -0
- package/scripts/run/run-watcher-hook.ts +86 -0
- package/scripts/security/secretlint-scan.ts +86 -0
- package/scripts/security/security-audit-logic.ts +51 -0
- package/scripts/security/security-audit-provision-logic.ts +217 -0
- package/scripts/security/security-audit-provision.ts +186 -0
- package/scripts/security/security-audit.ts +132 -0
- package/scripts/security/security-updates-logic.ts +131 -0
- package/scripts/security/security-updates.ts +38 -0
- package/scripts/security/sonar-file.ts +44 -0
- package/scripts/self-sync-guard/index.ts +5 -0
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +98 -0
- package/scripts/self-sync-guard/self-sync-refusal.ts +22 -0
- package/scripts/sonar/sonar-hotspots-cli.ts +149 -0
- package/scripts/sonar/sonar-hotspots.ts +111 -0
- package/scripts/split/split-assess-cli.ts +52 -0
- package/scripts/split/split-assess.ts +124 -0
- package/scripts/sync/dependabot-pin-logic.ts +135 -0
- package/scripts/sync/directory-copy-guard.ts +187 -0
- package/scripts/sync/file-content.ts +49 -0
- package/scripts/sync/managed-config-scope-cli.ts +64 -0
- package/scripts/sync/managed-config-scope.ts +123 -0
- package/scripts/sync/plugin-skill-directories.ts +15 -0
- package/scripts/sync/reconcile-templates.ts +53 -0
- package/scripts/sync/removed-skill-manifest.ts +27 -0
- package/scripts/sync/skill-migration.ts +192 -0
- package/scripts/sync/sync-configs.ts +156 -0
- package/scripts/sync/sync-hook-safety.ts +82 -0
- package/scripts/sync/sync.ts +417 -0
- package/scripts/sync/synced-paths.ts +52 -0
- package/scripts/sync/template-source-logic.ts +122 -0
- package/scripts/sync/workflow-pin-logic.ts +240 -0
- package/scripts/test/classify-isolation.ts +149 -0
- package/scripts/test/e2e-retry-check.ts +150 -0
- package/scripts/test/http-fault-injection.ts +79 -0
- package/scripts/test/josh-harness-environment.ts +260 -0
- package/scripts/test/josh-harness.ts +96 -0
- package/scripts/test/pilot-files.ts +457 -0
- package/scripts/test/pilot-measure.ts +78 -0
- package/scripts/test/test-declared-changed.ts +99 -0
- package/scripts/test/test-declared-logic.ts +91 -0
- package/scripts/test/test-declared-match.ts +106 -0
- package/scripts/test/test-declared.ts +180 -0
- package/scripts/test/test-e2e-guard.ts +86 -0
- package/scripts/test/test-network-guard.ts +453 -0
- package/scripts/test/test-red-commit.ts +51 -0
- package/scripts/test/test-red-logic.ts +76 -0
- package/scripts/test/test-red.ts +154 -0
- package/scripts/test/test-related-scope.ts +115 -0
- package/scripts/test/test-related.ts +73 -0
- package/scripts/test/test-repository-guard.ts +317 -0
- package/scripts/test/test-state-guard.ts +85 -0
- package/scripts/test/test-stdout-guard.ts +54 -0
- package/scripts/test/test-telegram-guard.ts +90 -0
- package/scripts/test/test-type-logic.ts +31 -0
- package/scripts/test/test-unit-guard.ts +185 -0
- package/scripts/test/unit-guard-environment.ts +12 -0
- package/scripts/test/unit-projects.ts +139 -0
- package/scripts/test/unit-worker-share.ts +251 -0
- package/scripts/test/vitest-include-globs.ts +12 -0
- package/scripts/time-runtime/time-agent-bundles.ts +128 -0
- package/scripts/time-runtime/time-background.ts +300 -0
- package/scripts/time-runtime/time-batch-guard-fixtures.ts +66 -0
- package/scripts/time-runtime/time-batch-guard.ts +529 -0
- package/scripts/time-runtime/time-bundle-call.ts +575 -0
- package/scripts/time-runtime/time-bundles.ts +536 -0
- package/scripts/time-runtime/time-call-identity.ts +37 -0
- package/scripts/time-runtime/time-command-key.ts +35 -0
- package/scripts/time-runtime/time-density-hook.ts +166 -0
- package/scripts/time-runtime/time-density.ts +147 -0
- package/scripts/time-runtime/time-followup-stage.ts +107 -0
- package/scripts/time-runtime/time-format.ts +186 -0
- package/scripts/time-runtime/time-hook-transcript.ts +82 -0
- package/scripts/time-runtime/time-instant.ts +20 -0
- package/scripts/time-runtime/time-markers.ts +228 -0
- package/scripts/time-runtime/time-phase-names.ts +123 -0
- package/scripts/time-runtime/time-reported-failure.ts +227 -0
- package/scripts/time-runtime/time-round-trips.ts +279 -0
- package/scripts/time-runtime/time-shell.ts +286 -0
- package/scripts/time-runtime/time-single-check.ts +65 -0
- package/scripts/time-runtime/time-spans.ts +545 -0
- package/scripts/time-runtime/time-transcript-line.ts +253 -0
- package/scripts/time-runtime/time-writes.ts +71 -0
- package/scripts/ui/ui-routes-cli.ts +122 -0
- package/scripts/ui/ui-routes.ts +102 -0
- package/scripts/version/bump-version.ts +71 -0
- package/scripts/version/effective-upstream.ts +93 -0
- package/scripts/version/index.ts +25 -0
- package/scripts/version/kit-descriptor.ts +10 -0
- package/scripts/version/kit-version-config.ts +30 -0
- package/scripts/version/latest-corepack.ts +404 -0
- package/scripts/version/latest-lane-guard.ts +49 -0
- package/scripts/version/latest-regression.ts +93 -0
- package/scripts/version/latest-scope-cli.ts +147 -0
- package/scripts/version/latest-stamp.ts +107 -0
- package/scripts/version/latest-update.ts +198 -0
- package/scripts/version/package-manager-version.ts +95 -0
- package/scripts/version/parse-json.ts +13 -0
- package/scripts/version/preinstall-version-update.ts +84 -0
- package/scripts/version/publishable-range-check.ts +74 -0
- package/scripts/version/publishable-range.ts +123 -0
- package/scripts/version/release-age.ts +146 -0
- package/scripts/version/release-hold.ts +142 -0
- package/scripts/version/running-binary.ts +42 -0
- package/scripts/version/upgrade-command-guard.ts +49 -0
- package/scripts/version/upgrade-shell-command.ts +30 -0
- package/scripts/version/version-check-logic.ts +333 -0
- package/scripts/version/version-check.ts +14 -0
- package/scripts/version/version-command-config.ts +177 -0
- package/scripts/version/version-commands.ts +296 -0
- package/scripts/version/version-remote.ts +86 -0
- package/scripts/version/version-targets.ts +81 -0
- package/scripts/yaml/yaml-document.ts +46 -0
- package/scripts-ai/completion-gate.ts +13 -0
- package/scripts-ai/environment-loader.ts +9 -0
- package/scripts-ai/epic-check.ts +34 -0
- package/scripts-ai/epic-cli-argv.ts +77 -0
- package/scripts-ai/epic-cli-remove.ts +71 -0
- package/scripts-ai/epic-cli.ts +413 -0
- package/scripts-ai/epic.ts +192 -0
- package/scripts-ai/followup-issue-number.ts +31 -0
- package/scripts-ai/git-followup-finish.ts +217 -0
- package/scripts-ai/git-followup-workflow.ts +252 -0
- package/scripts-ai/git-workflow.ts +246 -0
- package/scripts-ai/telegram-test-logic.ts +88 -0
- package/scripts-ai/telegram-test.ts +130 -0
- package/templates/gitignore +76 -0
- package/templates/sonar-project.properties +52 -0
- package/templates/workflows/ci.yml +639 -0
- package/templates/workflows/dependabot-auto-merge.yml +428 -0
- package/tsconfig/base.json +50 -0
- package/tsconfig.sonar.json +34 -0
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
import { time_agent_bundles } from './time-agent-bundles'
|
|
2
|
+
import { time_format } from './time-format'
|
|
3
|
+
import { time_round_trips } from './time-round-trips'
|
|
4
|
+
import { time_spans, type Span } from './time-spans'
|
|
5
|
+
|
|
6
|
+
// How many of a run's round trips were avoidable, read from the run rather than assumed
|
|
7
|
+
// (joshuafolkken/kit#1344).
|
|
8
|
+
//
|
|
9
|
+
// Three runs in a row came in at 1.10–1.12 calls per round trip against a 1.50 floor, and neither the
|
|
10
|
+
// end-of-run warning (joshuafolkken/kit#1304) nor the live line (joshuafolkken/kit#1329) moved the
|
|
11
|
+
// number. The Issue's estimate of what batching would return — 33 round trips of 136, about 4.8
|
|
12
|
+
// minutes — was arithmetic on the floor: it assumed every call could be bundled to 1.50 and said
|
|
13
|
+
// nothing about which ones actually could. **A mechanism proposed on that figure would be sized by an
|
|
14
|
+
// assumption**, which is what this module replaces.
|
|
15
|
+
//
|
|
16
|
+
// **A sequence is consecutive single-call round trips whose calls do not touch one another's
|
|
17
|
+
// targets.** Each such sequence of `n` turns could have been one, so `n - 1` of its round trips were
|
|
18
|
+
// avoidable. Nothing here proposes a mechanism; it establishes the size of what one would be worth.
|
|
19
|
+
//
|
|
20
|
+
// ## What the figure cannot see, in both directions
|
|
21
|
+
//
|
|
22
|
+
// **It under-reports** wherever the target test finds an overlap that was not a dependency — two
|
|
23
|
+
// unrelated reads of the same file, or a read inside a directory an earlier call merely mentioned —
|
|
24
|
+
// and wherever a chained shell command was excluded for holding a mutation word it never used as one.
|
|
25
|
+
//
|
|
26
|
+
// **It over-reports** wherever a call named no target at all: a dependency that exists only in the
|
|
27
|
+
// earlier call's *output* is invisible here, because no result text is retained anywhere in this
|
|
28
|
+
// pipeline. `gh issue view 1344` followed by a read of what it printed is the shape that escapes.
|
|
29
|
+
//
|
|
30
|
+
// So it is an estimate with its error stated, not a floor and not a ceiling — and it is an estimate
|
|
31
|
+
// of what a run did rather than of what a target density implies.
|
|
32
|
+
|
|
33
|
+
const { unmeasured_row } = time_format
|
|
34
|
+
const HEADING = 'Bundling:'
|
|
35
|
+
const SEQUENCE_LABEL = 'bundleable sequences'
|
|
36
|
+
const RECOVERABLE_LABEL = 'recoverable round trips'
|
|
37
|
+
// **Not `model wait recoverable`.** The category table's own row is `model wait`, and every reader
|
|
38
|
+
// of this report filters its rows by a substring — a label holding that phrase would be counted as a
|
|
39
|
+
// fourth category share by anything looking for the three.
|
|
40
|
+
const SAVING_LABEL = 'recoverable wait'
|
|
41
|
+
// The breakdown's own row, withheld beside the three above rather than beneath them: an unread
|
|
42
|
+
// transcript has no per-tool answer either, and a table printed under a `not measured` heading would
|
|
43
|
+
// be the empty-means-nothing-to-recover reading this block refuses everywhere else.
|
|
44
|
+
const BY_TOOL_LABEL = 'recoverable by tool'
|
|
45
|
+
// The one label the spread-apart series contributes (joshuafolkken/kit#1854). Both launch spellings —
|
|
46
|
+
// `Agent` here, `Task` elsewhere — collapse into this one row, so the reconciliation stays balanced.
|
|
47
|
+
const AGENT_ROW_LABEL = 'Agent'
|
|
48
|
+
// The per-tool rows sit one level under that row. Two spaces rather than a separate column, because
|
|
49
|
+
// `format_columns` lays out one label column and a sub-table with its own would not line up with it.
|
|
50
|
+
const ROW_INDENT = ' '
|
|
51
|
+
// Two turns is the smallest thing that could have been one. A sequence of one is a turn that had
|
|
52
|
+
// nothing to go out beside, which is not a finding.
|
|
53
|
+
const MIN_SEQUENCE = 2
|
|
54
|
+
const ONE_CALL = 1
|
|
55
|
+
const NONE = 0
|
|
56
|
+
const PATH_SEPARATOR = '/'
|
|
57
|
+
// The first call of a sequence is the turn the rest could have gone out in, so it is the one call
|
|
58
|
+
// that costs nothing — the attribution starts after it.
|
|
59
|
+
const FIRST_CALL = 1
|
|
60
|
+
// The label a span carries when nothing could be read off the call. Left out of the breakdown rather
|
|
61
|
+
// than printed as a bucket, which is the answer `time-report.ts` already gives an empty label — and
|
|
62
|
+
// what it leaves out is exactly what `unattributed_round_trips` below then reports.
|
|
63
|
+
const NO_LABEL = ''
|
|
64
|
+
|
|
65
|
+
// One tool's share of what the run could have recovered (joshuafolkken/kit#1607). `sequence_count` is
|
|
66
|
+
// the number of sequences this tool contributed a recoverable trip to, not the number of calls it
|
|
67
|
+
// made — a tool appearing four times inside one sequence is one sequence to go and look at.
|
|
68
|
+
interface BundleToolRow {
|
|
69
|
+
label: string
|
|
70
|
+
sequence_count: number
|
|
71
|
+
recoverable_round_trips: number
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// What the walk established about a run. **`is_measured` is not `sequence_count > 0`**: a run that
|
|
75
|
+
// batched everything genuinely has no sequence, and a run whose transcript was never read has none
|
|
76
|
+
// either — printing `0` for both would report the first as though it were the second.
|
|
77
|
+
//
|
|
78
|
+
// **`by_tool` is what makes the count actionable** (joshuafolkken/kit#1607). `recoverable_round_trips`
|
|
79
|
+
// says how many turns could have been one and nothing about *whose* turns they were, so a diag that
|
|
80
|
+
// read only it could name a density and never a tool — and the tool was then found by reading the
|
|
81
|
+
// transcript by hand, once per run.
|
|
82
|
+
//
|
|
83
|
+
// **`unattributed_round_trips` is a reconciliation rather than a second bucket, and on a real
|
|
84
|
+
// transcript it is always `0`.** Only a bundleable call can enter a sequence and every one of those
|
|
85
|
+
// carries a label — `non_bash_call` takes the tool's own name, `bash_label` falls back to `Bash`, and
|
|
86
|
+
// the two unlabelled `ToolCall`s are both `not_bundleable()` — so the rows and the residue sum to
|
|
87
|
+
// `recoverable_round_trips` by construction and the residue has nothing to hold. **What it catches is
|
|
88
|
+
// the two halves coming apart**: this block is read by a person deciding what to batch, and a table
|
|
89
|
+
// that had quietly stopped covering its own total is the one failure they could not otherwise see.
|
|
90
|
+
// **Do not read a `0` here as "every call was labelled" evidence** — it is the expected state, and the
|
|
91
|
+
// documentation that quotes this row quotes it balanced for that reason.
|
|
92
|
+
interface BundleTotals {
|
|
93
|
+
sequence_count: number
|
|
94
|
+
longest_sequence: number
|
|
95
|
+
recoverable_round_trips: number
|
|
96
|
+
by_tool: ReadonlyArray<BundleToolRow>
|
|
97
|
+
unattributed_round_trips: number
|
|
98
|
+
is_measured: boolean
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const NO_BUNDLES: BundleTotals = {
|
|
102
|
+
sequence_count: 0,
|
|
103
|
+
longest_sequence: 0,
|
|
104
|
+
recoverable_round_trips: 0,
|
|
105
|
+
by_tool: [],
|
|
106
|
+
unattributed_round_trips: 0,
|
|
107
|
+
is_measured: false,
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Whether `whole` contains `part` **as a run of whole path segments**. Three positions, because a
|
|
111
|
+
// path can hold another at its head, its tail or its middle, and a plain `includes` would match
|
|
112
|
+
// `scripts/time-x` inside `scripts/time-xyz`.
|
|
113
|
+
//
|
|
114
|
+
// **The tail position is what makes an absolute path comparable with a relative one.** A `Read` call
|
|
115
|
+
// names `/Users/…/kit/scripts/time/x.ts` while the `grep` before it named `scripts/time`, and nothing
|
|
116
|
+
// here knows the working directory the second was relative to — so the search-then-read pair, which is
|
|
117
|
+
// the whole reason the target test exists, would escape it on the two shapes it occurs in most.
|
|
118
|
+
function contains_segments(whole: string, part: string): boolean {
|
|
119
|
+
if (whole.startsWith(`${part}${PATH_SEPARATOR}`)) return true
|
|
120
|
+
|
|
121
|
+
return (
|
|
122
|
+
whole.endsWith(`${PATH_SEPARATOR}${part}`) ||
|
|
123
|
+
whole.includes(`${PATH_SEPARATOR}${part}${PATH_SEPARATOR}`)
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Equal, or one inside the other. The containing form is what catches the search-then-read pair:
|
|
128
|
+
// `grep -rn foo scripts` names `scripts`, and the `cat scripts/time/x.ts` that follows it names a path
|
|
129
|
+
// beneath — which is exactly how the second call learned the first one's answer.
|
|
130
|
+
function is_related(left: string, right: string): boolean {
|
|
131
|
+
if (left === right) return true
|
|
132
|
+
|
|
133
|
+
return contains_segments(left, right) || contains_segments(right, left)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function shares_target(left: ReadonlyArray<string>, right: ReadonlyArray<string>): boolean {
|
|
137
|
+
return left.some((one) => right.some((other) => is_related(one, other)))
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// What sharing a target is evidence *of*. Sharing one is the proxy for "the later call needed the
|
|
141
|
+
// earlier one's result", and for a read after a write it is a good one — an `Edit`'s `old_string`
|
|
142
|
+
// came from the `Read` before it.
|
|
143
|
+
//
|
|
144
|
+
// **Between two writes it is not** (joshuafolkken/kit#1509). A second edit to a file already held
|
|
145
|
+
// needs nothing from the first, so both belong in one turn — and treating the pair as dependent is
|
|
146
|
+
// what kept the guard silent for a whole run. `extend` below does not merely decline to count such a
|
|
147
|
+
// pair: it *flushes* the sequence and restarts it at the conflicting call, so a stretch of single-call
|
|
148
|
+
// turns all editing one file could never take `sequence.length` past 1, and the refusal at
|
|
149
|
+
// `time-batch-guard.ts` — which needs 2 — could never fire however long the stretch ran. Measured on
|
|
150
|
+
// `fullrun #1503`: 17 such stretches, 108 seconds, and zero refusals in two hours.
|
|
151
|
+
//
|
|
152
|
+
// **Read-after-read keeps the old reading deliberately.** Two reads of one file can genuinely depend
|
|
153
|
+
// — a `grep` that finds a line number and a `sed -n` that prints around it — so the proxy still earns
|
|
154
|
+
// its place there. Only the write-write pair has no such counter-case.
|
|
155
|
+
interface TargetFacts {
|
|
156
|
+
targets: ReadonlyArray<string>
|
|
157
|
+
is_writing: boolean
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function is_dependent(earlier: TargetFacts, later: TargetFacts): boolean {
|
|
161
|
+
if (earlier.is_writing && later.is_writing) return false
|
|
162
|
+
|
|
163
|
+
return shares_target(earlier.targets, later.targets)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function conflicts(span: Span, sequence: ReadonlyArray<Span>): boolean {
|
|
167
|
+
return sequence.some((earlier) => is_dependent(earlier, span))
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// A call, as opposed to the tail of one. A continuation is the remainder of a call whose middle went
|
|
171
|
+
// to a delegated unit, and `time-round-trips.ts` already refuses to count it as a second call.
|
|
172
|
+
function is_call(span: Span): boolean {
|
|
173
|
+
return span.category === time_spans.TOOL_CATEGORY && !span.is_continuation
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Whether the span between two round trips leaves them consecutive. Only a model span does: a person
|
|
177
|
+
// typing means the second turn was composed after an interruption, and a continuation means a
|
|
178
|
+
// delegated unit ran in between — neither pair could have gone out together.
|
|
179
|
+
function is_turn_boundary(span: Span): boolean {
|
|
180
|
+
return span.category === time_spans.MODEL_CATEGORY
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// The walk's three running pieces: the calls of the round trip currently open, the sequence being
|
|
184
|
+
// extended, and the sequences already closed.
|
|
185
|
+
//
|
|
186
|
+
// **`closed` keeps the calls rather than their lengths** (joshuafolkken/kit#1607). A length is all the
|
|
187
|
+
// three totals need, and it is also everything the per-tool breakdown cannot be rebuilt from — the
|
|
188
|
+
// labels are gone by the time anything asks. Retaining the spans is what lets one walk answer both,
|
|
189
|
+
// and a second walk over the same rule would be the clone `CLAUDE.md` prohibits.
|
|
190
|
+
interface Walk {
|
|
191
|
+
pending: Array<Span>
|
|
192
|
+
sequence: Array<Span>
|
|
193
|
+
closed: Array<Array<Span>>
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function new_walk(): Walk {
|
|
197
|
+
return { pending: [], sequence: [], closed: [] }
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function flush(walk: Walk): void {
|
|
201
|
+
if (walk.sequence.length >= MIN_SEQUENCE) walk.closed.push(walk.sequence)
|
|
202
|
+
|
|
203
|
+
walk.sequence = []
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// A conflicting call does not end the run of single-call turns; it starts a new sequence at itself,
|
|
207
|
+
// because everything after it may still have been bundleable with it.
|
|
208
|
+
function extend(walk: Walk, span: Span): void {
|
|
209
|
+
if (conflicts(span, walk.sequence)) flush(walk)
|
|
210
|
+
|
|
211
|
+
walk.sequence.push(span)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// **A turn that issued several calls breaks the sequence rather than joining it.** It is a turn that
|
|
215
|
+
// already batched, and the question here is what the single-call turns cost — folding a batched turn
|
|
216
|
+
// in would count the improvement as part of the defect.
|
|
217
|
+
function close_trip(walk: Walk): void {
|
|
218
|
+
const [only] = walk.pending
|
|
219
|
+
|
|
220
|
+
if (walk.pending.length === ONE_CALL && only?.is_bundleable === true) extend(walk, only)
|
|
221
|
+
else if (walk.pending.length > NONE) flush(walk)
|
|
222
|
+
|
|
223
|
+
walk.pending = []
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Whether this span is still the turn whose calls are pending. **A turn's calls are separated by its
|
|
227
|
+
// own model spans**, because Claude Code writes one line per content block and the harness returns
|
|
228
|
+
// each result as it arrives (joshuafolkken/kit#1406) — so closing the trip on every model span read
|
|
229
|
+
// one batched turn as several single-call ones and offered it back as a sequence that could have been
|
|
230
|
+
// bundled, which it already was. An absent id matches nothing, leaving the adjacency reading intact
|
|
231
|
+
// for a transcript that wrote none.
|
|
232
|
+
// **A continuation is excluded whatever id it carries.** `time_overlap.trim` copies the head's fields
|
|
233
|
+
// onto the tail, so a delegated unit's bracketing call comes back carrying the very message this turn
|
|
234
|
+
// is issuing from — and read as the same turn it would skip the flush that says the unit ran in
|
|
235
|
+
// between, which is exactly what `is_turn_boundary` below refuses to let a sequence cross.
|
|
236
|
+
function is_same_turn(span: Span, pending: ReadonlyArray<Span>): boolean {
|
|
237
|
+
const [first] = pending
|
|
238
|
+
|
|
239
|
+
if (first === undefined || span.is_continuation || span.message_id === time_spans.NO_MESSAGE_ID) {
|
|
240
|
+
return false
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return span.message_id === first.message_id
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function step(walk: Walk, span: Span): void {
|
|
247
|
+
if (is_call(span)) {
|
|
248
|
+
walk.pending.push(span)
|
|
249
|
+
|
|
250
|
+
return
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (is_same_turn(span, walk.pending)) return
|
|
254
|
+
|
|
255
|
+
close_trip(walk)
|
|
256
|
+
if (!is_turn_boundary(span)) flush(walk)
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function longest_of(sizes: ReadonlyArray<number>): number {
|
|
260
|
+
return sizes.length === NONE ? NONE : Math.max(...sizes)
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// One sequence of `n` turns could have been one turn, so it holds `n - 1` avoidable round trips.
|
|
264
|
+
function recoverable_of(sizes: ReadonlyArray<number>): number {
|
|
265
|
+
return sizes.reduce((sum, size) => sum + size - ONE_CALL, NONE)
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
function sizes_of(closed: ReadonlyArray<ReadonlyArray<Span>>): Array<number> {
|
|
269
|
+
return closed.map((sequence) => sequence.length)
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
interface ToolTally {
|
|
273
|
+
sequence_count: number
|
|
274
|
+
recoverable_round_trips: number
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function tally_for(tallies: Map<string, ToolTally>, label: string): ToolTally {
|
|
278
|
+
const found = tallies.get(label)
|
|
279
|
+
|
|
280
|
+
if (found !== undefined) return found
|
|
281
|
+
|
|
282
|
+
const created = { sequence_count: NONE, recoverable_round_trips: NONE }
|
|
283
|
+
|
|
284
|
+
tallies.set(label, created)
|
|
285
|
+
|
|
286
|
+
return created
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// **Attribution is per call, not per sequence** (joshuafolkken/kit#1607). A sequence of `n` calls
|
|
290
|
+
// holds `n - 1` avoidable trips, and the call that made each of them its own turn is the one after
|
|
291
|
+
// the first — so each trip goes to *that* call's tool. Attributing a whole sequence to one tool would
|
|
292
|
+
// have named a tool only where every call in the sequence shared one, and a real run's sequences are
|
|
293
|
+
// mixed: `grep`, `sed`, `Read` in a row is the shape, and the reading that has to come out of it is
|
|
294
|
+
// still "batch the `grep` calls". The alternative leaves that sequence entirely unattributed, which is
|
|
295
|
+
// the reading this block exists to stop having to do by hand.
|
|
296
|
+
//
|
|
297
|
+
// **A label counts a sequence once however many trips it held there**, so the row says how many
|
|
298
|
+
// separate places in the run to go and look at rather than repeating the trip count.
|
|
299
|
+
function count_trip(tallies: Map<string, ToolTally>, counted: Set<string>, label: string): void {
|
|
300
|
+
const tally = tally_for(tallies, label)
|
|
301
|
+
|
|
302
|
+
tally.recoverable_round_trips += ONE_CALL
|
|
303
|
+
if (!counted.has(label)) tally.sequence_count += ONE_CALL
|
|
304
|
+
counted.add(label)
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function tally_sequence(tallies: Map<string, ToolTally>, sequence: ReadonlyArray<Span>): void {
|
|
308
|
+
const counted = new Set<string>()
|
|
309
|
+
|
|
310
|
+
for (const span of sequence.slice(FIRST_CALL)) {
|
|
311
|
+
if (span.label !== NO_LABEL) count_trip(tallies, counted, span.label)
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Heaviest first, because the row a batching proposal is written from is the top one; ties settle on
|
|
316
|
+
// the label so two runs of the same shape print the same table.
|
|
317
|
+
function by_weight(left: BundleToolRow, right: BundleToolRow): number {
|
|
318
|
+
if (left.recoverable_round_trips !== right.recoverable_round_trips) {
|
|
319
|
+
return right.recoverable_round_trips - left.recoverable_round_trips
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return left.label.localeCompare(right.label)
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
function tool_rows(closed: ReadonlyArray<ReadonlyArray<Span>>): Array<BundleToolRow> {
|
|
326
|
+
const tallies = new Map<string, ToolTally>()
|
|
327
|
+
|
|
328
|
+
for (const sequence of closed) tally_sequence(tallies, sequence)
|
|
329
|
+
|
|
330
|
+
return [...tallies].map(([label, tally]) => ({ label, ...tally })).toSorted(by_weight)
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function attributed_of(rows: ReadonlyArray<BundleToolRow>): number {
|
|
334
|
+
return rows.reduce((sum, row) => sum + row.recoverable_round_trips, NONE)
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// **Ordered before it is walked, for the reason `time-failures.ts` states.** A run's spans do not
|
|
338
|
+
// arrive in time order: a delegated unit's are appended after the parent's, and `time_corpus`
|
|
339
|
+
// concatenates one session after another. Walked in array order, two turns from different sessions
|
|
340
|
+
// would read as consecutive and be counted as a sequence nobody could have batched.
|
|
341
|
+
// The spread-apart launch series folded in as one row (joshuafolkken/kit#1854). Appended and re-sorted
|
|
342
|
+
// rather than pushed in place, so the heaviest-first order still holds; omitted entirely when it
|
|
343
|
+
// recovered nothing, so a run that fanned out its launches shows no empty `Agent` row. Its whole count
|
|
344
|
+
// enters the total below beside it, which is what keeps `unattributed_round_trips` at zero.
|
|
345
|
+
function with_agent_row(
|
|
346
|
+
rows: ReadonlyArray<BundleToolRow>,
|
|
347
|
+
agent_sizes: ReadonlyArray<number>,
|
|
348
|
+
): Array<BundleToolRow> {
|
|
349
|
+
const recoverable_round_trips = recoverable_of(agent_sizes)
|
|
350
|
+
|
|
351
|
+
if (recoverable_round_trips === NONE) return [...rows]
|
|
352
|
+
|
|
353
|
+
const row = {
|
|
354
|
+
label: AGENT_ROW_LABEL,
|
|
355
|
+
sequence_count: agent_sizes.length,
|
|
356
|
+
recoverable_round_trips,
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
return [...rows, row].toSorted(by_weight)
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function build_bundles(spans: ReadonlyArray<Span>): BundleTotals {
|
|
363
|
+
const walk = new_walk()
|
|
364
|
+
|
|
365
|
+
// A loop rather than `reduce`: the walk carries three pieces and mutates them, which is the shape
|
|
366
|
+
// `time-failures.ts` uses for the same reason.
|
|
367
|
+
for (const span of time_round_trips.in_time_order(spans)) step(walk, span)
|
|
368
|
+
|
|
369
|
+
close_trip(walk)
|
|
370
|
+
flush(walk)
|
|
371
|
+
|
|
372
|
+
// The consecutive series and the spread-apart launch series are disjoint by construction — a launch
|
|
373
|
+
// is never bundleable, so it cannot have entered a sequence above — so their counts simply add.
|
|
374
|
+
const sizes = sizes_of(walk.closed)
|
|
375
|
+
const agent_sizes = time_agent_bundles.agent_bundles(spans)
|
|
376
|
+
const by_tool = with_agent_row(tool_rows(walk.closed), agent_sizes)
|
|
377
|
+
const recoverable_round_trips = recoverable_of(sizes) + recoverable_of(agent_sizes)
|
|
378
|
+
|
|
379
|
+
return {
|
|
380
|
+
sequence_count: sizes.length + agent_sizes.length,
|
|
381
|
+
longest_sequence: Math.max(longest_of(sizes), longest_of(agent_sizes)),
|
|
382
|
+
recoverable_round_trips,
|
|
383
|
+
by_tool,
|
|
384
|
+
unattributed_round_trips: recoverable_round_trips - attributed_of(by_tool),
|
|
385
|
+
is_measured: time_spans.has_transcript_data(spans.length),
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// The sequence the walk is still inside when the spans run out — the trailing run of consecutive
|
|
390
|
+
// single-call bundleable turns (joshuafolkken/kit#1390).
|
|
391
|
+
//
|
|
392
|
+
// **Neither `close_trip` nor `flush` is called, and that is the whole difference from
|
|
393
|
+
// `build_bundles`.** The report closes the walk because it is pricing a run that has ended; a guard
|
|
394
|
+
// reading a transcript mid-flight wants the sequence nothing has ended yet, which is the one the next
|
|
395
|
+
// call would extend. Sharing the walk is what keeps the refusal and the end-of-run figure from ever
|
|
396
|
+
// disagreeing about what a sequence is — a second walk here would be the clone `CLAUDE.md` prohibits,
|
|
397
|
+
// in the one place a drift would refuse a call the report then says was fine.
|
|
398
|
+
//
|
|
399
|
+
// **Leaving `close_trip` out is load-bearing rather than tidy.** The turn being read is still open, and
|
|
400
|
+
// its earlier calls have already come back — so closing the trip here folds the in-flight turn into the
|
|
401
|
+
// sequence as though it were a closed single-call turn. Measured live: the first call of a two-call
|
|
402
|
+
// turn was admitted and the second refused, because the first had returned in between and lengthened
|
|
403
|
+
// the sequence by one. Only a turn boundary may close a trip, and the walk's own `step` is what
|
|
404
|
+
// supplies one.
|
|
405
|
+
function open_sequence(spans: ReadonlyArray<Span>): ReadonlyArray<Span> {
|
|
406
|
+
const walk = new_walk()
|
|
407
|
+
|
|
408
|
+
for (const span of time_round_trips.in_time_order(spans)) step(walk, span)
|
|
409
|
+
|
|
410
|
+
return walk.sequence
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
function sequence_suffix(totals: BundleTotals): string {
|
|
414
|
+
return `longest ${String(totals.longest_sequence)} turn(s)`
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// What the report already knows about a round trip, taken as one record so the caller hands over the
|
|
418
|
+
// report itself rather than picking two fields out of it — and so `time-report.ts` never imports a
|
|
419
|
+
// type from here that it would then have to export back.
|
|
420
|
+
interface TripPrice {
|
|
421
|
+
round_trip_count: number
|
|
422
|
+
model_ms_per_round_trip: number
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
function recoverable_suffix(totals: BundleTotals, round_trip_count: number): string {
|
|
426
|
+
const share = time_format.format_share(totals.recoverable_round_trips, round_trip_count)
|
|
427
|
+
|
|
428
|
+
return `${share} of ${String(round_trip_count)} round trip(s)`
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// **The model share is what a batching change actually returns**, for the reason `time-report.ts`
|
|
432
|
+
// gives beside the unit price: a tool's own execution is paid whichever turn it was issued from, so
|
|
433
|
+
// multiplying the avoidable trips by the whole price would promise back seconds no change removes.
|
|
434
|
+
function saving_line(totals: BundleTotals, model_ms_per_round_trip: number): string {
|
|
435
|
+
const saved_ms = totals.recoverable_round_trips * model_ms_per_round_trip
|
|
436
|
+
const rate = `at ${time_format.format_seconds(model_ms_per_round_trip)} model time per round trip`
|
|
437
|
+
|
|
438
|
+
return time_format.format_row(SAVING_LABEL, saved_ms, rate)
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// **The suffix is the reconciliation, printed whether or not it balances** — and on a real transcript
|
|
442
|
+
// it always balances, for the reason `BundleTotals` gives. It is printed rather than asserted because
|
|
443
|
+
// this table is read by a person deciding what to batch: a row reading `23 of 25 attributed` is the
|
|
444
|
+
// walk and the attribution having come apart, which is the one failure that table cannot show on its
|
|
445
|
+
// own. **It is not a count of unlabelled calls** — reading it as one is what the rows beneath it and
|
|
446
|
+
// the two documents quoting them were corrected away from.
|
|
447
|
+
//
|
|
448
|
+
// **Derived from the recorded residue rather than re-summed from the rows**, so a drift between the
|
|
449
|
+
// record and the table is what the row prints instead of being hidden by recomputing one from the
|
|
450
|
+
// other.
|
|
451
|
+
function by_tool_suffix(totals: BundleTotals): string {
|
|
452
|
+
const attributed = totals.recoverable_round_trips - totals.unattributed_round_trips
|
|
453
|
+
|
|
454
|
+
return `${String(attributed)} of ${String(totals.recoverable_round_trips)} attributed`
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
function tool_row(row: BundleToolRow): string {
|
|
458
|
+
return time_format.format_columns(
|
|
459
|
+
`${ROW_INDENT}${row.label}`,
|
|
460
|
+
String(row.recoverable_round_trips),
|
|
461
|
+
`in ${String(row.sequence_count)} sequence(s)`,
|
|
462
|
+
)
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// Capped like every other table this report prints, and for the reason `time-format.ts` gives beside
|
|
466
|
+
// the cap: `--json` carries every row, so what a long run loses here is a table nobody reads.
|
|
467
|
+
function by_tool_lines(totals: BundleTotals): Array<string> {
|
|
468
|
+
const heading = time_format.format_columns(
|
|
469
|
+
BY_TOOL_LABEL,
|
|
470
|
+
String(totals.by_tool.length),
|
|
471
|
+
by_tool_suffix(totals),
|
|
472
|
+
)
|
|
473
|
+
const rows = totals.by_tool.slice(NONE, time_format.MAX_ROWS).map((row) => tool_row(row))
|
|
474
|
+
|
|
475
|
+
return [heading, ...rows, ...time_format.overflow_line(totals.by_tool.length)]
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
function measured_lines(totals: BundleTotals, price: TripPrice): Array<string> {
|
|
479
|
+
return [
|
|
480
|
+
time_format.format_columns(
|
|
481
|
+
SEQUENCE_LABEL,
|
|
482
|
+
String(totals.sequence_count),
|
|
483
|
+
sequence_suffix(totals),
|
|
484
|
+
),
|
|
485
|
+
time_format.format_columns(
|
|
486
|
+
RECOVERABLE_LABEL,
|
|
487
|
+
String(totals.recoverable_round_trips),
|
|
488
|
+
recoverable_suffix(totals, price.round_trip_count),
|
|
489
|
+
),
|
|
490
|
+
saving_line(totals, price.model_ms_per_round_trip),
|
|
491
|
+
...by_tool_lines(totals),
|
|
492
|
+
]
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
const LABELS = [SEQUENCE_LABEL, RECOVERABLE_LABEL, SAVING_LABEL, BY_TOOL_LABEL]
|
|
496
|
+
|
|
497
|
+
// **A transcript that was read but called no tool has nothing to divide by, and says so** — the same
|
|
498
|
+
// answer, in the same words, the round-trip block's own price row gives. Without this the block
|
|
499
|
+
// printed `at 0.0 s model time per round trip` beside a price row reading `no tool call to divide`,
|
|
500
|
+
// which is one report disagreeing with itself about what was measured.
|
|
501
|
+
function no_divisor_lines(): Array<string> {
|
|
502
|
+
return LABELS.map((label) => time_format.format_columns(label, '', time_format.NO_CALLS))
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// **A run whose transcript was not read says so rather than reporting nothing to recover.** Zero here
|
|
506
|
+
// would read as a run that batched everything, which is the one answer an unread transcript cannot
|
|
507
|
+
// support — the same shape, and the same word, the category shares and the round-trip block use.
|
|
508
|
+
//
|
|
509
|
+
// **The two withheld cases are different answers.** One says nothing was read; the other says what was
|
|
510
|
+
// read made no round trip, so there is no share and no price to quote — and the counts beside them
|
|
511
|
+
// would be a measured zero either way, which is what neither is.
|
|
512
|
+
function bundle_lines(totals: BundleTotals, price: TripPrice): Array<string> {
|
|
513
|
+
const heading = ['', HEADING]
|
|
514
|
+
|
|
515
|
+
if (!totals.is_measured) return [...heading, ...LABELS.map((label) => unmeasured_row(label))]
|
|
516
|
+
if (price.round_trip_count === NONE) return [...heading, ...no_divisor_lines()]
|
|
517
|
+
|
|
518
|
+
return [...heading, ...measured_lines(totals, price)]
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
const time_bundles = {
|
|
522
|
+
HEADING,
|
|
523
|
+
SEQUENCE_LABEL,
|
|
524
|
+
RECOVERABLE_LABEL,
|
|
525
|
+
SAVING_LABEL,
|
|
526
|
+
BY_TOOL_LABEL,
|
|
527
|
+
MIN_SEQUENCE,
|
|
528
|
+
NO_BUNDLES,
|
|
529
|
+
build_bundles,
|
|
530
|
+
bundle_lines,
|
|
531
|
+
is_dependent,
|
|
532
|
+
open_sequence,
|
|
533
|
+
shares_target,
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
export { time_bundles }
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { time_command_key } from './time-command-key'
|
|
2
|
+
import type { Span } from './time-spans'
|
|
3
|
+
|
|
4
|
+
// What "the same call" means, in one place (joshuafolkken/kit#1979).
|
|
5
|
+
//
|
|
6
|
+
// Two readers ask it and must agree. `time-guard-refusals.ts` asks whether a refused call was later
|
|
7
|
+
// re-issued unchanged — the false-positive hint on the guard breakdown — and `time-batch-guard.ts`
|
|
8
|
+
// asks, live, whether the call in hand is one it has already refused, so it does not refuse the
|
|
9
|
+
// re-issue a second time. Both mean the same thing by "the same call", so the rule sits here rather
|
|
10
|
+
// than in either of them: a second copy is the clone `CLAUDE.md` prohibits, in the one place a drift
|
|
11
|
+
// would let the guard refuse a re-issue the report then says was the same call.
|
|
12
|
+
//
|
|
13
|
+
// **The same call twice is the same command naming the same files.** A coarser key (the command
|
|
14
|
+
// alone) would call two unrelated reads a re-issue; a finer one is not on the span, which keeps no
|
|
15
|
+
// command string — so this is the closest "same arguments" the timeline can answer, and the same key
|
|
16
|
+
// the guard can build for a live call once its input has been read into a `ToolCall`.
|
|
17
|
+
|
|
18
|
+
// A null byte cannot appear in a command, a check key or a path, so joining the fields on it makes an
|
|
19
|
+
// identity that no ordinary argument can forge a collision in — a space could, since a command key
|
|
20
|
+
// and a check key may each hold one.
|
|
21
|
+
const IDENTITY_SEPARATOR = '\0'
|
|
22
|
+
|
|
23
|
+
// The four fields the identity is read off, which both a full `Span` and a freshly-built `ToolCall`
|
|
24
|
+
// carry — so a refused span and the live call about to repeat it produce the identical string.
|
|
25
|
+
type IdentityCall = Pick<Span, 'label' | 'josh_command' | 'check_key' | 'targets'>
|
|
26
|
+
|
|
27
|
+
function identity_of(call: IdentityCall): string {
|
|
28
|
+
return [
|
|
29
|
+
time_command_key.command_key(call),
|
|
30
|
+
call.check_key,
|
|
31
|
+
[...call.targets].toSorted((left, right) => left.localeCompare(right)).join(','),
|
|
32
|
+
].join(IDENTITY_SEPARATOR)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const time_call_identity = { identity_of }
|
|
36
|
+
|
|
37
|
+
export { time_call_identity }
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { time_spans, type Span } from './time-spans'
|
|
2
|
+
|
|
3
|
+
// What counts as *the same command* across a run's spans (joshuafolkken/kit#1311).
|
|
4
|
+
//
|
|
5
|
+
// Two questions need it and used to answer it separately: the failure chain asks whether a call
|
|
6
|
+
// repeats one that just failed, and the per-invocation listing asks which calls belong on one row.
|
|
7
|
+
// Both mean the same thing by "the same command", so the rule sits here rather than in either of
|
|
8
|
+
// them — a second copy is the clone `CLAUDE.md` prohibits, in the one place a drift would make the
|
|
9
|
+
// rework figure and the per-invocation row disagree about which calls were the same command.
|
|
10
|
+
//
|
|
11
|
+
// **The josh subcommand wins where there is one.** `Bash: pnpm` alone would put `josh gate` and
|
|
12
|
+
// `josh lint` under one key, so the second would be read as a repeat of the first.
|
|
13
|
+
//
|
|
14
|
+
// **A call the transcript could not name has no key at all.** `time_spans` labels a result whose
|
|
15
|
+
// `tool_use` line was never written `unknown`, and every such call would otherwise share one key —
|
|
16
|
+
// so two unrelated tools would be chained together, and a per-invocation row would list durations
|
|
17
|
+
// belonging to different commands.
|
|
18
|
+
//
|
|
19
|
+
// **The label is as fine as a span can go.** `Read` and `Bash: git` are one key each, because a span
|
|
20
|
+
// keeps no input to narrow them by — the same granularity `by_tool` already reports at.
|
|
21
|
+
|
|
22
|
+
const UNNAMED_KEY = ''
|
|
23
|
+
|
|
24
|
+
// **The parameter is the two fields it reads, not the whole `Span`.** A full span satisfies it, and so
|
|
25
|
+
// does a `ToolCall` the batching guard builds for a live call (joshuafolkken/kit#1979) — the key has
|
|
26
|
+
// to mean the same thing whether it is read off a recorded span or the call about to repeat it.
|
|
27
|
+
function command_key(span: Pick<Span, 'label' | 'josh_command'>): string {
|
|
28
|
+
if (span.label === time_spans.UNKNOWN_TOOL) return UNNAMED_KEY
|
|
29
|
+
|
|
30
|
+
return span.josh_command === '' ? span.label : span.josh_command
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const time_command_key = { UNNAMED_KEY, command_key }
|
|
34
|
+
|
|
35
|
+
export { time_command_key }
|