@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,119 @@
|
|
|
1
|
+
import { globSync, readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { z } from 'zod'
|
|
4
|
+
import { cost_transcript } from './cost-transcript'
|
|
5
|
+
import type { OverMeasurement } from './cost-verdict'
|
|
6
|
+
|
|
7
|
+
const THREAD_ID_PATTERN = /^[A-Za-z0-9-]+$/u
|
|
8
|
+
const SESSION_META_SCHEMA = z.looseObject({
|
|
9
|
+
type: z.literal('session_meta'),
|
|
10
|
+
payload: z.looseObject({ id: z.string(), cwd: z.string() }),
|
|
11
|
+
})
|
|
12
|
+
const TOTAL_USAGE_SCHEMA = z.looseObject({ input_tokens: z.number().nonnegative() })
|
|
13
|
+
const TOKEN_COUNT_SCHEMA = z.looseObject({
|
|
14
|
+
type: z.literal('event_msg'),
|
|
15
|
+
payload: z.looseObject({
|
|
16
|
+
type: z.literal('token_count'),
|
|
17
|
+
info: z.looseObject({
|
|
18
|
+
total_token_usage: TOTAL_USAGE_SCHEMA,
|
|
19
|
+
last_token_usage: TOTAL_USAGE_SCHEMA,
|
|
20
|
+
}),
|
|
21
|
+
}),
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
type Environment = Readonly<Record<string, string | undefined>>
|
|
25
|
+
|
|
26
|
+
function decode(line: string): unknown {
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(line)
|
|
29
|
+
} catch {
|
|
30
|
+
return undefined
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function same_project(cwd: string, target: string): boolean {
|
|
35
|
+
return cost_transcript.session_cwd(cwd) === cost_transcript.session_cwd(target)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The billed input each request paid, oldest first (joshuafolkken/kit#2295). Each `token_count`
|
|
39
|
+
// event carries `last_token_usage` — that request's own input — so the per-request sequence the
|
|
40
|
+
// hand-off's recent window reads is those deltas, not a cumulative-total difference. A session
|
|
41
|
+
// resumed with inherited context is excluded for free: the inherited tokens are in the cumulative
|
|
42
|
+
// total, never in a request's own `last_token_usage`.
|
|
43
|
+
function billed_per_request(
|
|
44
|
+
usages: ReadonlyArray<z.infer<typeof TOKEN_COUNT_SCHEMA>['payload']['info']>,
|
|
45
|
+
): ReadonlyArray<number> {
|
|
46
|
+
return usages.map((usage) => usage.last_token_usage.input_tokens)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function measurement_from(
|
|
50
|
+
content: string,
|
|
51
|
+
target: string,
|
|
52
|
+
thread_id: string,
|
|
53
|
+
): OverMeasurement | undefined {
|
|
54
|
+
const values = content.split('\n').map((line) => decode(line))
|
|
55
|
+
const metadata = values.flatMap((value) => {
|
|
56
|
+
const parsed = SESSION_META_SCHEMA.safeParse(value)
|
|
57
|
+
|
|
58
|
+
return parsed.success ? [parsed.data] : []
|
|
59
|
+
})
|
|
60
|
+
const usages = values.flatMap((value) => {
|
|
61
|
+
const parsed = TOKEN_COUNT_SCHEMA.safeParse(value)
|
|
62
|
+
|
|
63
|
+
return parsed.success ? [parsed.data.payload.info] : []
|
|
64
|
+
})
|
|
65
|
+
const session = metadata.find((entry) => entry.payload.id === thread_id)
|
|
66
|
+
if (session === undefined || usages.length === 0) return undefined
|
|
67
|
+
if (!same_project(session.payload.cwd, target)) return undefined
|
|
68
|
+
|
|
69
|
+
return { billed_input_per_request: billed_per_request(usages) }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function rollout_files(home: string, thread_id: string): Array<string> {
|
|
73
|
+
if (!THREAD_ID_PATTERN.test(thread_id)) return []
|
|
74
|
+
|
|
75
|
+
return globSync(`sessions/**/*${thread_id}.jsonl`, { cwd: home }).map((file) =>
|
|
76
|
+
path.join(home, file),
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function read_measurement(
|
|
81
|
+
file: string,
|
|
82
|
+
target: string,
|
|
83
|
+
thread_id: string,
|
|
84
|
+
): OverMeasurement | undefined {
|
|
85
|
+
try {
|
|
86
|
+
return measurement_from(readFileSync(file, 'utf8'), target, thread_id)
|
|
87
|
+
} catch {
|
|
88
|
+
return undefined
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function latest_measurement(
|
|
93
|
+
files: ReadonlyArray<string>,
|
|
94
|
+
target: string,
|
|
95
|
+
thread_id: string,
|
|
96
|
+
): OverMeasurement | undefined {
|
|
97
|
+
for (const file of files.toReversed()) {
|
|
98
|
+
const measured = read_measurement(file, target, thread_id)
|
|
99
|
+
if (measured !== undefined) return measured
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return undefined
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function measurement(
|
|
106
|
+
target: string,
|
|
107
|
+
default_home: string,
|
|
108
|
+
environment: Environment = process.env,
|
|
109
|
+
): OverMeasurement | undefined {
|
|
110
|
+
const thread_id = environment['CODEX_THREAD_ID']
|
|
111
|
+
if (thread_id === undefined) return undefined
|
|
112
|
+
const home = environment['CODEX_HOME'] ?? path.join(default_home, '.codex')
|
|
113
|
+
|
|
114
|
+
return latest_measurement(rollout_files(home, thread_id), target, thread_id)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const codex_usage = { measurement }
|
|
118
|
+
|
|
119
|
+
export { codex_usage }
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { cost_pricing } from './cost-pricing'
|
|
2
|
+
|
|
3
|
+
// **When a context cut pays back, priced from the cost model rather than fixed at a ceiling**
|
|
4
|
+
// (joshuafolkken/kit#2406). A cut ends the oversized session and relaunches a fresh one that rebuilds
|
|
5
|
+
// only its preamble, so what it saves is not decided by a ceiling on the accumulated context but by a
|
|
6
|
+
// *rate*: a cache read bills the whole context on every request, so whether to cut turns on how many
|
|
7
|
+
// requests are still to come and what each would pay, not on how much has piled up.
|
|
8
|
+
//
|
|
9
|
+
// The arithmetic is a break-even. A cut costs one preamble rewrite — `POST_CUT_CONTEXT` tokens written
|
|
10
|
+
// to cache once — and saves, on every later request, the cache read of the context it dropped
|
|
11
|
+
// (`current − POST_CUT_CONTEXT` tokens). The base input rate cancels: both the cost and the saving are
|
|
12
|
+
// billed at the same model's input rate, so only the two cache multipliers survive, and they are read
|
|
13
|
+
// from `cost-pricing.ts` rather than restated here — no second price list.
|
|
14
|
+
|
|
15
|
+
// The context a resumed request pays: the preamble plus the carried hand-off a fresh process rebuilds.
|
|
16
|
+
// Measured at ~60,000 — `.claude/skills/workflow-commands/pre-gate-cut.md` records the cut carrying a
|
|
17
|
+
// request from ~130k down to ~60k. It is both the cut's one-time cost (written once) and the floor the
|
|
18
|
+
// per-request saving is measured above.
|
|
19
|
+
const POST_CUT_CONTEXT = 60_000
|
|
20
|
+
|
|
21
|
+
// The requests a resumed session is expected to still run — the horizon the break-even is measured
|
|
22
|
+
// against. A cut only pays if enough requests remain to recoup the preamble rewrite; even the shortest
|
|
23
|
+
// resume (into the gate, commit, PR and merge) runs on the order of ten. Ten is the conservative
|
|
24
|
+
// horizon: it keeps the shared threshold near joshuafolkken/kit#2374's empirically validated 150_000
|
|
25
|
+
// (this lands at 135_000, inside the 100k–200k band that PR simulated) while pricing the decision from
|
|
26
|
+
// the cost model. It is the knob a before/after lane measurement tunes.
|
|
27
|
+
const EXPECTED_REMAINING_REQUESTS = 10
|
|
28
|
+
|
|
29
|
+
// The price of a dropped token relative to a rewritten one, from `cost-pricing.ts`. A cache read bills
|
|
30
|
+
// `CACHE_READ_MULTIPLIER` of base input and a 5-minute cache write `CACHE_WRITE_5M_MULTIPLIER`, so a
|
|
31
|
+
// preamble rewrite costs this many per-request cache reads. The base input rate is common to both and
|
|
32
|
+
// cancels, which is why only the ratio appears.
|
|
33
|
+
function write_over_read(): number {
|
|
34
|
+
return cost_pricing.CACHE_WRITE_5M_MULTIPLIER / cost_pricing.CACHE_READ_MULTIPLIER
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// The current per-request context at which a cut breaks even over exactly `remaining` requests. The
|
|
38
|
+
// shared cut threshold is this evaluated at `EXPECTED_REMAINING_REQUESTS`; rounded to an integer so the
|
|
39
|
+
// `>` comparison against a per-request billed-input count has no floating-point seam.
|
|
40
|
+
function break_even_context(remaining: number = EXPECTED_REMAINING_REQUESTS): number {
|
|
41
|
+
if (remaining <= 0) return Infinity
|
|
42
|
+
|
|
43
|
+
return Math.round(POST_CUT_CONTEXT * (1 + write_over_read() / remaining))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// The requests a cut must save over before it recoups its own preamble rewrite, at a given current
|
|
47
|
+
// per-request context. Decreasing in context: the more a request currently pays, the fewer resumed
|
|
48
|
+
// requests are needed to earn the cut back. Exposed as the diagnostic the break-even is read in —
|
|
49
|
+
// `break_even_requests(current) < remaining` is the same decision as `pays_back`.
|
|
50
|
+
function break_even_requests(current_context: number): number {
|
|
51
|
+
const saved_per_request = current_context - POST_CUT_CONTEXT
|
|
52
|
+
|
|
53
|
+
if (saved_per_request <= 0) return Infinity
|
|
54
|
+
|
|
55
|
+
return (POST_CUT_CONTEXT * write_over_read()) / saved_per_request
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Whether cutting now pays back: the current per-request context has grown past the break-even point
|
|
59
|
+
// for the expected remaining requests. Compared against the rounded `break_even_context` with `>`, so
|
|
60
|
+
// it agrees to the token with `cost_verdict.classify` reading the derived `CONTEXT_CUT_THRESHOLD` — the
|
|
61
|
+
// same one decision, whether a caller holds the threshold or asks this function.
|
|
62
|
+
function pays_back(
|
|
63
|
+
current_context: number,
|
|
64
|
+
remaining: number = EXPECTED_REMAINING_REQUESTS,
|
|
65
|
+
): boolean {
|
|
66
|
+
return current_context > break_even_context(remaining)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const context_cut_payback = {
|
|
70
|
+
POST_CUT_CONTEXT,
|
|
71
|
+
EXPECTED_REMAINING_REQUESTS,
|
|
72
|
+
break_even_context,
|
|
73
|
+
break_even_requests,
|
|
74
|
+
pays_back,
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export { context_cut_payback }
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { context_cut_payback } from './context-cut-payback'
|
|
2
|
+
|
|
3
|
+
// The scheduler entry/hand-off and lane worker implementation cut use one threshold. Keeping the
|
|
4
|
+
// value here prevents either side from drifting when the context budget changes.
|
|
5
|
+
// joshuafolkken/kit#2374 lowered it from 200_000 by simulation; joshuafolkken/kit#2406 replaced the
|
|
6
|
+
// hand-picked ceiling with a break-even: the threshold is no longer a chosen number but the current
|
|
7
|
+
// per-request context at which a cut pays back over the expected remaining requests
|
|
8
|
+
// (`context-cut-payback.ts`). At `POST_CUT_CONTEXT` 60_000 and a 10-request horizon that is 135_000 —
|
|
9
|
+
// 10% under #2374's empirical 150_000 and inside the 100k–200k band that PR simulated — now derived
|
|
10
|
+
// from the cache-price multipliers and the horizon rather than restated, so it moves with the model.
|
|
11
|
+
const CONTEXT_CUT_THRESHOLD = context_cut_payback.break_even_context()
|
|
12
|
+
|
|
13
|
+
// The hand-off prices the average billed input of the most recent requests, not the whole session
|
|
14
|
+
// (joshuafolkken/kit#2295). A long parent session's whole-session average lags its current context by
|
|
15
|
+
// dozens of requests — measured at 85 requests (~4 hours) behind on the 2026-09-21 parent — so it
|
|
16
|
+
// keeps supervising an already-oversized context long after a cut was due. Ten requests is enough to
|
|
17
|
+
// smooth a single outlier without reaching back into the cheap early context; it sits beside the
|
|
18
|
+
// threshold so the window and the limit are read from one place and cannot drift.
|
|
19
|
+
const RECENT_REQUEST_WINDOW = 10
|
|
20
|
+
|
|
21
|
+
export { CONTEXT_CUT_THRESHOLD, RECENT_REQUEST_WINDOW }
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import type { UsageRecord } from './cost-usage'
|
|
2
|
+
|
|
3
|
+
// Which Issue a request belongs to (joshuafolkken/kit#962).
|
|
4
|
+
//
|
|
5
|
+
// **The walk is keyed on the branch and nothing else**, which is why its input is `BranchBearing`
|
|
6
|
+
// rather than `UsageRecord` (joshuafolkken/kit#1268). `josh time` attributes *spans* to an issue by
|
|
7
|
+
// exactly this rule, and the alternative to widening the parameter was a second copy of the
|
|
8
|
+
// fill-forward walk over a different element type — the clone `CLAUDE.md` prohibits, in the one
|
|
9
|
+
// place where a drift between the two would make `josh cost --issue` and `josh time --issue`
|
|
10
|
+
// disagree about which issue a run belonged to.
|
|
11
|
+
//
|
|
12
|
+
// The transcript records `gitBranch` on every line, and `josh git` names a branch `<N>-<slug>`, so
|
|
13
|
+
// the branch is where the Issue number is. What makes the mapping less than direct is that a child
|
|
14
|
+
// is implemented on the **default branch** — `josh git` only creates the branch at commit time — so
|
|
15
|
+
// most of a child's requests were made while `gitBranch` still said `main`.
|
|
16
|
+
//
|
|
17
|
+
// Hence the fill: a request on a non-issue branch is attributed to the nearest issue branch that
|
|
18
|
+
// appears **later** in the session, because the work precedes the branch it will be committed to.
|
|
19
|
+
// Only when nothing follows does it fall back to the nearest earlier one, which is what catches the
|
|
20
|
+
// tail after a merge — `josh ms` returns to the default branch while the run is still reporting.
|
|
21
|
+
|
|
22
|
+
const ISSUE_BRANCH_PATTERN = /^(\d+)-/u
|
|
23
|
+
|
|
24
|
+
// The value that means "no issue". Issue numbers are positive, so a negative sentinel cannot be
|
|
25
|
+
// mistaken for one, and one value used throughout removes the `undefined` juggling that each fill
|
|
26
|
+
// direction would otherwise repeat.
|
|
27
|
+
const UNATTRIBUTED_KEY = -1
|
|
28
|
+
|
|
29
|
+
// Everything the attribution reads. `UsageRecord` satisfies it, and so does a timed span.
|
|
30
|
+
//
|
|
31
|
+
// **`issue` is the branch's answer where the branch cannot give one** (joshuafolkken/kit#1617). The
|
|
32
|
+
// paragraph above assumes the session and the work share a checkout, and under lanes they do not: a
|
|
33
|
+
// child's commands run in a linked work tree on `<N>-lane` while the session writing the transcript
|
|
34
|
+
// sits on the default branch, so every line of a lane run reads `gitBranch: "main"` and no fill
|
|
35
|
+
// direction has an issue branch to carry. Measured on 2026-09-09: issues 1445, 1510 and 1511 each
|
|
36
|
+
// merged from a lane and left not one `<N>-` branch anywhere in the corpus.
|
|
37
|
+
//
|
|
38
|
+
// **It is a declaration, not a second walk.** The record says which issue it names and the existing
|
|
39
|
+
// fill-forward carries it exactly as it carries a branch — the alternative was a lane-aware copy of
|
|
40
|
+
// `attribute`, which is the clone `CLAUDE.md` prohibits in the one place a drift would make
|
|
41
|
+
// `josh cost --issue` and `josh time --issue` disagree. `UsageRecord` declares nothing and is
|
|
42
|
+
// unaffected.
|
|
43
|
+
interface BranchBearing {
|
|
44
|
+
branch: string
|
|
45
|
+
issue?: number
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function issue_from_branch(branch: string): number {
|
|
49
|
+
const matched = ISSUE_BRANCH_PATTERN.exec(branch)
|
|
50
|
+
|
|
51
|
+
return matched?.[1] === undefined ? UNATTRIBUTED_KEY : Number(matched[1])
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// What a record says it belongs to. A declaration wins over the branch because it is the stronger
|
|
55
|
+
// evidence: the branch is the checkout's and may be shared by every run of the day, while a
|
|
56
|
+
// declaration was written by the run itself about itself.
|
|
57
|
+
function declared_issue(record: BranchBearing): number {
|
|
58
|
+
const declared = record.issue ?? UNATTRIBUTED_KEY
|
|
59
|
+
|
|
60
|
+
return declared === UNATTRIBUTED_KEY ? issue_from_branch(record.branch) : declared
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// The nearest declared issue in one direction, carried across the gaps. Both directions are the
|
|
64
|
+
// same walk, so they are one function rather than two that would drift.
|
|
65
|
+
function fill(declared: ReadonlyArray<number>, is_reverse: boolean): Array<number> {
|
|
66
|
+
const filled: Array<number> = Array.from({ length: declared.length }, () => UNATTRIBUTED_KEY)
|
|
67
|
+
const order = declared.map((_value, index) => (is_reverse ? declared.length - 1 - index : index))
|
|
68
|
+
let carried = UNATTRIBUTED_KEY
|
|
69
|
+
|
|
70
|
+
for (const index of order) {
|
|
71
|
+
const own = declared[index] ?? UNATTRIBUTED_KEY
|
|
72
|
+
|
|
73
|
+
carried = own === UNATTRIBUTED_KEY ? carried : own
|
|
74
|
+
filled[index] = carried
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return filled
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function is_attributed(value: number | undefined): value is number {
|
|
81
|
+
return value !== undefined && value !== UNATTRIBUTED_KEY
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// **A declaration is carried forward, and it outranks both branch directions.** The preference for
|
|
85
|
+
// `next` below is a statement about *branches*: work precedes the branch it will be committed to, so
|
|
86
|
+
// the branch sits at the end of the run it names. A declaration sits at the *start* — the
|
|
87
|
+
// `in-progress` label is the first thing a run writes — so carrying it backwards would give one
|
|
88
|
+
// child's work to the next child declared after it, which is exactly the shape a lane transcript
|
|
89
|
+
// holding two children has. `carried` is therefore the forward fill of declarations alone, and a
|
|
90
|
+
// corpus with no declaration leaves every value `UNATTRIBUTED_KEY` and this branch inert.
|
|
91
|
+
function pick(
|
|
92
|
+
own: number,
|
|
93
|
+
carried: number,
|
|
94
|
+
next: number | undefined,
|
|
95
|
+
previous: number | undefined,
|
|
96
|
+
): number {
|
|
97
|
+
if (is_attributed(own)) return own
|
|
98
|
+
if (is_attributed(carried)) return carried
|
|
99
|
+
if (is_attributed(next)) return next
|
|
100
|
+
|
|
101
|
+
return previous ?? UNATTRIBUTED_KEY
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function announcements(records: ReadonlyArray<BranchBearing>): Array<number> {
|
|
105
|
+
return fill(
|
|
106
|
+
records.map((record) => record.issue ?? UNATTRIBUTED_KEY),
|
|
107
|
+
false,
|
|
108
|
+
)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function attribute(records: ReadonlyArray<BranchBearing>): Array<number> {
|
|
112
|
+
const declared = records.map((record) => declared_issue(record))
|
|
113
|
+
const carried = announcements(records)
|
|
114
|
+
const next = fill(declared, true)
|
|
115
|
+
const previous = fill(declared, false)
|
|
116
|
+
|
|
117
|
+
return declared.map((own, index) =>
|
|
118
|
+
pick(own, carried[index] ?? UNATTRIBUTED_KEY, next[index], previous[index]),
|
|
119
|
+
)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
interface IssueGroup {
|
|
123
|
+
// `UNATTRIBUTED_KEY` for requests made in a session that never touched an issue branch — a plain
|
|
124
|
+
// conversational session. Reported as its own bucket rather than dropped.
|
|
125
|
+
issue: number
|
|
126
|
+
records: Array<UsageRecord>
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function group_by_issue(records: ReadonlyArray<UsageRecord>): Array<IssueGroup> {
|
|
130
|
+
const issues = attribute(records)
|
|
131
|
+
const grouped = new Map<number, Array<UsageRecord>>()
|
|
132
|
+
|
|
133
|
+
for (const [index, record] of records.entries()) {
|
|
134
|
+
const bucket = grouped.get(issues[index] ?? UNATTRIBUTED_KEY) ?? []
|
|
135
|
+
|
|
136
|
+
bucket.push(record)
|
|
137
|
+
grouped.set(issues[index] ?? UNATTRIBUTED_KEY, bucket)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return [...grouped]
|
|
141
|
+
.toSorted(([left], [right]) => left - right)
|
|
142
|
+
.map(([issue, bucket]) => ({ issue, records: bucket }))
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// One issue's slice of a session's items, whatever the items are. Generic for the same reason
|
|
146
|
+
// `attribute` is: `josh time` filters spans through it, and a second copy narrowed to spans would
|
|
147
|
+
// be the fill-forward rule written twice.
|
|
148
|
+
function records_for_issue<Item extends BranchBearing>(
|
|
149
|
+
records: ReadonlyArray<Item>,
|
|
150
|
+
issue_number: number,
|
|
151
|
+
): Array<Item> {
|
|
152
|
+
const issues = attribute(records)
|
|
153
|
+
|
|
154
|
+
return records.filter((_record, index) => issues[index] === issue_number)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const cost_attribute = {
|
|
158
|
+
UNATTRIBUTED_KEY,
|
|
159
|
+
issue_from_branch,
|
|
160
|
+
declared_issue,
|
|
161
|
+
fill,
|
|
162
|
+
attribute,
|
|
163
|
+
group_by_issue,
|
|
164
|
+
records_for_issue,
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export type { BranchBearing, IssueGroup }
|
|
168
|
+
export { cost_attribute }
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
// Reading the content blocks out of a session transcript (joshuafolkken/kit#1151).
|
|
5
|
+
//
|
|
6
|
+
// `cost-usage.ts` reads the same file for what each request was billed and skips everything else.
|
|
7
|
+
// This module reads the other half: what the conversation is actually made of. They stay apart
|
|
8
|
+
// because they aggregate differently — usage is deduplicated per `requestId`, since one response is
|
|
9
|
+
// written as several lines all carrying the same `usage`, while the content blocks on those lines
|
|
10
|
+
// are each written exactly once and must not be deduplicated.
|
|
11
|
+
//
|
|
12
|
+
// **Thinking arrives here empty, and that is not a defect.** Claude Code writes a `thinking` block
|
|
13
|
+
// with its `signature` but with `thinking` set to `''` — 118 blocks, 0 bytes, in the transcript this
|
|
14
|
+
// was measured on, and the same in every other session checked. The thinking count therefore comes
|
|
15
|
+
// from `usage.output_tokens_details.thinking_tokens`, which is a real API-reported number rather
|
|
16
|
+
// than an estimate.
|
|
17
|
+
|
|
18
|
+
const CONTENT_ITEM_SCHEMA = z.object({ text: z.string().nullish() })
|
|
19
|
+
const RESULT_CONTENT_SCHEMA = z.union([z.string(), z.array(CONTENT_ITEM_SCHEMA)])
|
|
20
|
+
|
|
21
|
+
// Every field is optional, including `type`. A required field would make one unexpected block fail
|
|
22
|
+
// the whole array it sits in, and with it every other block on that line — an entire assistant turn
|
|
23
|
+
// dropped from the table because one tool wrote a shape this reader had not seen. A block that
|
|
24
|
+
// parses to nothing contributes nothing, which is the cost it should have.
|
|
25
|
+
const BLOCK_SCHEMA = z.object({
|
|
26
|
+
type: z.string().nullish(),
|
|
27
|
+
text: z.string().nullish(),
|
|
28
|
+
name: z.string().nullish(),
|
|
29
|
+
input: z.unknown().nullish(),
|
|
30
|
+
content: RESULT_CONTENT_SCHEMA.nullish(),
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
const LINE_CONTENT_SCHEMA = z.union([z.string(), z.array(BLOCK_SCHEMA)])
|
|
34
|
+
const MESSAGE_SCHEMA = z.object({ content: LINE_CONTENT_SCHEMA.nullish() })
|
|
35
|
+
const CONTENT_LINE_SCHEMA = z.object({ type: z.string(), message: MESSAGE_SCHEMA.nullish() })
|
|
36
|
+
|
|
37
|
+
type RawBlock = z.infer<typeof BLOCK_SCHEMA>
|
|
38
|
+
|
|
39
|
+
const TEXT_TYPE = 'text'
|
|
40
|
+
const TOOL_USE_TYPE = 'tool_use'
|
|
41
|
+
const TOOL_RESULT_TYPE = 'tool_result'
|
|
42
|
+
const BASH_TOOL = 'Bash'
|
|
43
|
+
const COMMAND_KEY = 'command'
|
|
44
|
+
|
|
45
|
+
// One block, reduced to what a token estimate needs. `command` is split out from the rest of a Bash
|
|
46
|
+
// tool_use's input because the command body is the quantity joshuafolkken/kit#1150 measured at 30.2%
|
|
47
|
+
// of one run's context and joshuafolkken/kit#1159 has to re-measure — folded into the rest of the
|
|
48
|
+
// input it would not be readable at all.
|
|
49
|
+
interface ContentBlock {
|
|
50
|
+
type: string
|
|
51
|
+
tool_name: string
|
|
52
|
+
command: string
|
|
53
|
+
text: string
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function json_of(value: unknown): string {
|
|
57
|
+
return value === undefined || value === null ? '' : JSON.stringify(value)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// The Bash command body, and the input with that key removed. Only Bash is split: another tool's
|
|
61
|
+
// `command` key, if one ever existed, is not the quantity being tracked and folding it in would
|
|
62
|
+
// report a number nobody measured.
|
|
63
|
+
function split_bash_input(input: unknown): { command: string; rest: string } {
|
|
64
|
+
if (!json_value.is_record(input)) return { command: '', rest: json_of(input) }
|
|
65
|
+
|
|
66
|
+
const command = input[COMMAND_KEY]
|
|
67
|
+
const rest = Object.entries(input).filter(([key]) => key !== COMMAND_KEY)
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
command: typeof command === 'string' ? command : '',
|
|
71
|
+
rest: json_of(Object.fromEntries(rest)),
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function to_tool_use(block: RawBlock): ContentBlock {
|
|
76
|
+
const tool_name = block.name ?? ''
|
|
77
|
+
const is_bash = tool_name === BASH_TOOL
|
|
78
|
+
const { command, rest } = is_bash
|
|
79
|
+
? split_bash_input(block.input)
|
|
80
|
+
: { command: '', rest: json_of(block.input) }
|
|
81
|
+
|
|
82
|
+
return { type: TOOL_USE_TYPE, tool_name, command, text: rest }
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// A tool result is either a plain string or a list of blocks. Only the textual items are counted:
|
|
86
|
+
// an image block carries no text here, and inventing a size for it would put a made-up number in a
|
|
87
|
+
// table whose whole purpose is to be compared against another run's.
|
|
88
|
+
function result_text(content: string | ReadonlyArray<z.infer<typeof CONTENT_ITEM_SCHEMA>>): string {
|
|
89
|
+
if (typeof content === 'string') return content
|
|
90
|
+
|
|
91
|
+
return content.map((item) => item.text ?? '').join('')
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Everything that is not a tool call: a result contributes its textual content, and anything else —
|
|
95
|
+
// text, thinking, a block type this reader has never seen — contributes its `text`, which for
|
|
96
|
+
// thinking is the empty string Claude Code writes there.
|
|
97
|
+
function to_plain_block(block: RawBlock): ContentBlock {
|
|
98
|
+
const base = { type: block.type ?? '', tool_name: '', command: '' }
|
|
99
|
+
const text =
|
|
100
|
+
block.type === TOOL_RESULT_TYPE ? result_text(block.content ?? '') : (block.text ?? '')
|
|
101
|
+
|
|
102
|
+
return { ...base, text }
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function to_block(block: RawBlock): ContentBlock {
|
|
106
|
+
return block.type === TOOL_USE_TYPE ? to_tool_use(block) : to_plain_block(block)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// A user turn whose content is a bare string — the prompt itself, plus whatever a `UserPromptSubmit`
|
|
110
|
+
// hook injected into it. Counted as text, which is what it is.
|
|
111
|
+
function to_blocks(content: string | ReadonlyArray<RawBlock>): Array<ContentBlock> {
|
|
112
|
+
if (typeof content === 'string') {
|
|
113
|
+
return [{ type: TEXT_TYPE, tool_name: '', command: '', text: content }]
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return content.map((block) => to_block(block))
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// A blank line, a line that is not JSON, and a line carrying no message content are one answer:
|
|
120
|
+
// nothing to count. With `BLOCK_SCHEMA` accepting anything object-shaped, the only line lost whole
|
|
121
|
+
// is one that is not JSON at all — which `cost-usage.ts` already counts as unparseable, so
|
|
122
|
+
// reporting it again here would double one missing-data figure.
|
|
123
|
+
function content_of(line: string): z.infer<typeof LINE_CONTENT_SCHEMA> | undefined {
|
|
124
|
+
const parsed = CONTENT_LINE_SCHEMA.safeParse(json_value.parse_or_undefined(line))
|
|
125
|
+
|
|
126
|
+
return parsed.success ? (parsed.data.message?.content ?? undefined) : undefined
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function parse_line(line: string): Array<ContentBlock> {
|
|
130
|
+
const content = content_of(line)
|
|
131
|
+
|
|
132
|
+
return content === undefined ? [] : to_blocks(content)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function parse_content(text: string): Array<ContentBlock> {
|
|
136
|
+
return text.split('\n').flatMap((line) => parse_line(line))
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const cost_blocks = {
|
|
140
|
+
BASH_TOOL,
|
|
141
|
+
TEXT_TYPE,
|
|
142
|
+
TOOL_USE_TYPE,
|
|
143
|
+
TOOL_RESULT_TYPE,
|
|
144
|
+
parse_line,
|
|
145
|
+
parse_content,
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export type { ContentBlock }
|
|
149
|
+
export { cost_blocks }
|