@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,287 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
2
|
+
import { time_instant } from '#scripts/time-runtime/time-instant'
|
|
3
|
+
import { z } from 'zod'
|
|
4
|
+
|
|
5
|
+
// Reading Claude Code's own session transcripts for what a run actually cost
|
|
6
|
+
// (joshuafolkken/kit#962).
|
|
7
|
+
//
|
|
8
|
+
// **One API response is written to the transcript as several lines.** Every content block —
|
|
9
|
+
// thinking, text, each `tool_use` — becomes its own `assistant` line, and all of them carry the
|
|
10
|
+
// *same* `usage` object. Measured on a real session: 20 assistant lines for 8 requests. Summing
|
|
11
|
+
// lines therefore over-reports the cost by roughly 3x, which is why `request_id` is the unit of
|
|
12
|
+
// aggregation here and a line never is.
|
|
13
|
+
|
|
14
|
+
// Every optional field is `nullish`, not `optional`. The transcript writes an absent value as
|
|
15
|
+
// `null` rather than by omitting the key — `output_tokens_details: null`, `service_tier: null`,
|
|
16
|
+
// `iterations: null` — and a schema that accepts only `undefined` rejects the whole line. Measured
|
|
17
|
+
// against this project's own transcripts: 12 perfectly valid lines were being counted as
|
|
18
|
+
// unparseable, which is the reader silently mislabelling data in exactly the way this command
|
|
19
|
+
// exists to prevent.
|
|
20
|
+
const CACHE_CREATION_SCHEMA = z.object({
|
|
21
|
+
ephemeral_1h_input_tokens: z.number().nullish(),
|
|
22
|
+
ephemeral_5m_input_tokens: z.number().nullish(),
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
const USAGE_SCHEMA = z.object({
|
|
26
|
+
input_tokens: z.number(),
|
|
27
|
+
cache_creation_input_tokens: z.number().nullish(),
|
|
28
|
+
cache_read_input_tokens: z.number().nullish(),
|
|
29
|
+
output_tokens: z.number(),
|
|
30
|
+
output_tokens_details: z.object({ thinking_tokens: z.number().nullish() }).nullish(),
|
|
31
|
+
cache_creation: CACHE_CREATION_SCHEMA.nullish(),
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
const MESSAGE_SCHEMA = z.object({
|
|
35
|
+
id: z.string().nullish(),
|
|
36
|
+
model: z.string().nullish(),
|
|
37
|
+
usage: USAGE_SCHEMA.nullish(),
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
const LINE_SCHEMA = z.object({
|
|
41
|
+
type: z.string(),
|
|
42
|
+
requestId: z.string().nullish(),
|
|
43
|
+
uuid: z.string().nullish(),
|
|
44
|
+
gitBranch: z.string().nullish(),
|
|
45
|
+
timestamp: z.string().nullish(),
|
|
46
|
+
message: MESSAGE_SCHEMA.nullish(),
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
// Claude Code writes its own locally-generated assistant messages — an API-error notice, a queued
|
|
50
|
+
// interruption — with this model id and an all-zero usage block. They were never sent to the API, so
|
|
51
|
+
// counting them would inflate the request count and raise an "unknown model" warning about
|
|
52
|
+
// something that was never priced.
|
|
53
|
+
const SYNTHETIC_MODEL = '<synthetic>'
|
|
54
|
+
|
|
55
|
+
// The five billed quantities, kept apart because each is priced differently. Splitting the cache
|
|
56
|
+
// write by TTL is not a refinement: a 1-hour write costs 2x base against a 5-minute write's 1.25x,
|
|
57
|
+
// and this project's sessions run on the 1-hour TTL, so folding them together would under-report
|
|
58
|
+
// every run by the larger half.
|
|
59
|
+
interface UsageTotals {
|
|
60
|
+
input_tokens: number
|
|
61
|
+
cache_write_5m_tokens: number
|
|
62
|
+
cache_write_1h_tokens: number
|
|
63
|
+
cache_read_tokens: number
|
|
64
|
+
output_tokens: number
|
|
65
|
+
thinking_tokens: number
|
|
66
|
+
// Whether the API actually reported a thinking-token count, kept apart from the count itself
|
|
67
|
+
// because `thinking_tokens: 0` cannot tell "the model did no thinking" from "the field was
|
|
68
|
+
// absent" (joshuafolkken/kit#1969). A session row prints "not measured" for the second rather
|
|
69
|
+
// than a confident 0%, so the distinction has to survive `sum_totals`; it is OR-combined, so a
|
|
70
|
+
// session is measured once any one of its requests carried a count.
|
|
71
|
+
thinking_measured: boolean
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
interface UsageRecord {
|
|
75
|
+
request_id: string
|
|
76
|
+
model: string
|
|
77
|
+
branch: string
|
|
78
|
+
// The request's instant, as epoch milliseconds — `undefined` where no line of the request carried
|
|
79
|
+
// a readable timestamp (joshuafolkken/kit#1606). On a single line it is that line's timestamp;
|
|
80
|
+
// after `dedupe` folds the request's several lines into one record it is the *latest* of them,
|
|
81
|
+
// which is the response-completion instant a cost window is keyed to (joshuafolkken/kit#1899).
|
|
82
|
+
//
|
|
83
|
+
// **`undefined` rather than a sentinel, for the reason `time_instant` exists**: a request whose
|
|
84
|
+
// instant cannot be read belongs in the unattributed bucket, and a `0` would place it at the
|
|
85
|
+
// epoch — inside whichever phase window happens to open first, which is the confident wrong
|
|
86
|
+
// answer this field is meant to avoid.
|
|
87
|
+
at_ms: number | undefined
|
|
88
|
+
totals: UsageTotals
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// What one transcript line turned out to be. `skipped` is the ordinary case — most lines are user
|
|
92
|
+
// turns, attachments and bookkeeping, and counting those as missing data would bury the two kinds
|
|
93
|
+
// that matter.
|
|
94
|
+
type LineOutcome =
|
|
95
|
+
| { kind: 'record'; record: UsageRecord }
|
|
96
|
+
| { kind: 'skipped' }
|
|
97
|
+
| { kind: 'no_usage' }
|
|
98
|
+
| { kind: 'malformed' }
|
|
99
|
+
|
|
100
|
+
const EMPTY_TOTALS: UsageTotals = {
|
|
101
|
+
input_tokens: 0,
|
|
102
|
+
cache_write_5m_tokens: 0,
|
|
103
|
+
cache_write_1h_tokens: 0,
|
|
104
|
+
cache_read_tokens: 0,
|
|
105
|
+
output_tokens: 0,
|
|
106
|
+
thinking_tokens: 0,
|
|
107
|
+
thinking_measured: false,
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const UNKNOWN_MODEL = 'unknown'
|
|
111
|
+
const UNKNOWN_BRANCH = ''
|
|
112
|
+
|
|
113
|
+
type RawUsage = z.infer<typeof USAGE_SCHEMA>
|
|
114
|
+
|
|
115
|
+
// The TTL split, taken from `cache_creation` when the transcript carries it. Older lines have only
|
|
116
|
+
// the flat `cache_creation_input_tokens`; those are read as 5-minute writes, the cheaper of the two,
|
|
117
|
+
// so an unknown TTL never inflates the estimate.
|
|
118
|
+
interface CacheWrite {
|
|
119
|
+
write_5m: number
|
|
120
|
+
write_1h: number
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function split_cache_write(usage: RawUsage): CacheWrite {
|
|
124
|
+
const total = usage.cache_creation_input_tokens ?? 0
|
|
125
|
+
const detail = usage.cache_creation
|
|
126
|
+
|
|
127
|
+
if (!detail) return { write_5m: total, write_1h: 0 }
|
|
128
|
+
|
|
129
|
+
const write_1h = detail.ephemeral_1h_input_tokens ?? 0
|
|
130
|
+
|
|
131
|
+
return { write_5m: detail.ephemeral_5m_input_tokens ?? total - write_1h, write_1h }
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// The thinking-token count and whether it was reported at all. `output_tokens_details` is `null`
|
|
135
|
+
// when the API sent no breakdown and `thinking_tokens` is `null` inside it when the breakdown omits
|
|
136
|
+
// the field; both collapse to `measured: false`, while a real `0` stays measured.
|
|
137
|
+
interface ThinkingUsage {
|
|
138
|
+
tokens: number
|
|
139
|
+
measured: boolean
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function thinking_usage(usage: RawUsage): ThinkingUsage {
|
|
143
|
+
const raw = usage.output_tokens_details?.thinking_tokens
|
|
144
|
+
|
|
145
|
+
return { tokens: raw ?? 0, measured: raw !== null && raw !== undefined }
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function to_totals(usage: RawUsage): UsageTotals {
|
|
149
|
+
const { write_5m, write_1h } = split_cache_write(usage)
|
|
150
|
+
const thinking = thinking_usage(usage)
|
|
151
|
+
|
|
152
|
+
return {
|
|
153
|
+
input_tokens: usage.input_tokens,
|
|
154
|
+
cache_write_5m_tokens: write_5m,
|
|
155
|
+
cache_write_1h_tokens: write_1h,
|
|
156
|
+
cache_read_tokens: usage.cache_read_input_tokens ?? 0,
|
|
157
|
+
output_tokens: usage.output_tokens,
|
|
158
|
+
thinking_tokens: thinking.tokens,
|
|
159
|
+
thinking_measured: thinking.measured,
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
type ParsedLine = z.infer<typeof LINE_SCHEMA>
|
|
164
|
+
|
|
165
|
+
// A line with neither id is its own request rather than a duplicate of one, so the fallback has to
|
|
166
|
+
// be unique per line; an empty string would collapse every such line into one.
|
|
167
|
+
// The id the API gave the request, when the line carries one. `message.id` is the response id, so
|
|
168
|
+
// it identifies the same billed request that `requestId` does.
|
|
169
|
+
function declared_id(data: ParsedLine): string | undefined {
|
|
170
|
+
return data.requestId ?? data.message?.id ?? data.uuid ?? undefined
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function request_id_of(data: ParsedLine, usage: RawUsage): string {
|
|
174
|
+
const fallback = `${data.timestamp ?? ''}-${String(usage.output_tokens)}`
|
|
175
|
+
|
|
176
|
+
return declared_id(data) ?? fallback
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function to_record(data: ParsedLine, usage: RawUsage): UsageRecord {
|
|
180
|
+
return {
|
|
181
|
+
request_id: request_id_of(data, usage),
|
|
182
|
+
model: data.message?.model ?? UNKNOWN_MODEL,
|
|
183
|
+
branch: data.gitBranch ?? UNKNOWN_BRANCH,
|
|
184
|
+
at_ms: time_instant.parse_instant(data.timestamp),
|
|
185
|
+
totals: to_totals(usage),
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const ASSISTANT_TYPE = 'assistant'
|
|
190
|
+
|
|
191
|
+
function is_priced_line(data: ParsedLine): boolean {
|
|
192
|
+
return data.type === ASSISTANT_TYPE && data.message?.model !== SYNTHETIC_MODEL
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function classify(data: ParsedLine): LineOutcome {
|
|
196
|
+
if (!is_priced_line(data)) return { kind: 'skipped' }
|
|
197
|
+
|
|
198
|
+
const usage = data.message?.usage
|
|
199
|
+
|
|
200
|
+
return usage ? { kind: 'record', record: to_record(data, usage) } : { kind: 'no_usage' }
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function parse_line(line: string): LineOutcome {
|
|
204
|
+
if (line.trim() === '') return { kind: 'skipped' }
|
|
205
|
+
|
|
206
|
+
const parsed = LINE_SCHEMA.safeParse(json_value.parse_or_undefined(line))
|
|
207
|
+
|
|
208
|
+
return parsed.success ? classify(parsed.data) : { kind: 'malformed' }
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// The later of two request instants, treating `undefined` as no reading rather than as an early one:
|
|
212
|
+
// a line that carried no timestamp must not pull a request's instant back to nothing when a sibling
|
|
213
|
+
// line of the same request does carry one (joshuafolkken/kit#1899).
|
|
214
|
+
function later_instant(left: number | undefined, right: number | undefined): number | undefined {
|
|
215
|
+
if (left === undefined) return right
|
|
216
|
+
if (right === undefined) return left
|
|
217
|
+
|
|
218
|
+
return Math.max(left, right)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// One record per request, in first-seen order. Order matters downstream: issue attribution reads
|
|
222
|
+
// the branch sequence, so a Map (which preserves insertion order) is the right container and a Set
|
|
223
|
+
// of ids plus a filter would be the same thing written twice.
|
|
224
|
+
//
|
|
225
|
+
// **`at_ms` is folded to the request's latest line, not its first (joshuafolkken/kit#1899).** One
|
|
226
|
+
// response is written thinking → text → `tool_use` (see the file header), all sharing one request id,
|
|
227
|
+
// and a round trip's cost window opens at the `tool_use` line — the last of them. Keeping the first
|
|
228
|
+
// line's instant put every tool-issuing request *before* its own window, where it fell to the
|
|
229
|
+
// `no_tool_call` bucket; the latest instant is the response-completion time, which is where the window
|
|
230
|
+
// begins. Every other field stays the first-seen record's, so the branch sequence is untouched.
|
|
231
|
+
function dedupe(records: ReadonlyArray<UsageRecord>): Array<UsageRecord> {
|
|
232
|
+
const by_id = new Map<string, UsageRecord>()
|
|
233
|
+
|
|
234
|
+
for (const record of records) {
|
|
235
|
+
const seen = by_id.get(record.request_id)
|
|
236
|
+
const at_ms = later_instant(seen?.at_ms, record.at_ms)
|
|
237
|
+
|
|
238
|
+
by_id.set(record.request_id, { ...(seen ?? record), at_ms })
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return [...by_id.values()]
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function add_totals(left: UsageTotals, right: UsageTotals): UsageTotals {
|
|
245
|
+
return {
|
|
246
|
+
input_tokens: left.input_tokens + right.input_tokens,
|
|
247
|
+
cache_write_5m_tokens: left.cache_write_5m_tokens + right.cache_write_5m_tokens,
|
|
248
|
+
cache_write_1h_tokens: left.cache_write_1h_tokens + right.cache_write_1h_tokens,
|
|
249
|
+
cache_read_tokens: left.cache_read_tokens + right.cache_read_tokens,
|
|
250
|
+
output_tokens: left.output_tokens + right.output_tokens,
|
|
251
|
+
thinking_tokens: left.thinking_tokens + right.thinking_tokens,
|
|
252
|
+
thinking_measured: left.thinking_measured || right.thinking_measured,
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function sum_totals(records: ReadonlyArray<UsageRecord>): UsageTotals {
|
|
257
|
+
let total = EMPTY_TOTALS
|
|
258
|
+
|
|
259
|
+
for (const record of records) total = add_totals(total, record.totals)
|
|
260
|
+
|
|
261
|
+
return total
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Everything the run paid to send, whatever rate each part was billed at. `josh cost --over` reads
|
|
265
|
+
// this per request; `josh time` breaks it into resident preamble and conversation history.
|
|
266
|
+
function billed_input(totals: UsageTotals): number {
|
|
267
|
+
return (
|
|
268
|
+
totals.input_tokens +
|
|
269
|
+
totals.cache_write_5m_tokens +
|
|
270
|
+
totals.cache_write_1h_tokens +
|
|
271
|
+
totals.cache_read_tokens
|
|
272
|
+
)
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const cost_usage = {
|
|
276
|
+
EMPTY_TOTALS,
|
|
277
|
+
UNKNOWN_MODEL,
|
|
278
|
+
SYNTHETIC_MODEL,
|
|
279
|
+
parse_line,
|
|
280
|
+
dedupe,
|
|
281
|
+
add_totals,
|
|
282
|
+
sum_totals,
|
|
283
|
+
billed_input,
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export type { LineOutcome, UsageRecord, UsageTotals }
|
|
287
|
+
export { cost_usage }
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// The `--over` hand-off flag of `josh cost`, kept apart from the CLI wiring because it turns a run
|
|
2
|
+
// into a one-line verdict rather than a table (joshuafolkken/kit#1838). It answers what the next turn
|
|
3
|
+
// of a session will cost, and takes only the figures its verdict needs — an over measurement — never
|
|
4
|
+
// a whole report. The `--cap` counterfactual it once sat beside was retired in #2016 as readerless.
|
|
5
|
+
|
|
6
|
+
import { RECENT_REQUEST_WINDOW } from './context-cut-threshold'
|
|
7
|
+
|
|
8
|
+
const FAILURE_EXIT_CODE = 1
|
|
9
|
+
const OVER_VERDICT = 'over'
|
|
10
|
+
const UNDER_VERDICT = 'under'
|
|
11
|
+
|
|
12
|
+
// What `--over` reads of a session: the billed input each request paid, oldest first. The whole
|
|
13
|
+
// per-request sequence is carried rather than a single sum because the hand-off prices the recent
|
|
14
|
+
// tail alone (joshuafolkken/kit#2295) — a long session's whole-session average lags its current
|
|
15
|
+
// context by dozens of requests, so a sum could not answer what the recent window actually cost.
|
|
16
|
+
interface OverMeasurement {
|
|
17
|
+
billed_input_per_request: ReadonlyArray<number>
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// The most recent requests the hand-off prices, oldest first — the whole sequence when it is shorter
|
|
21
|
+
// than the window, so a session with fewer than `RECENT_REQUEST_WINDOW` requests is priced on what it
|
|
22
|
+
// has rather than padded.
|
|
23
|
+
function recent_requests(measurement: OverMeasurement): ReadonlyArray<number> {
|
|
24
|
+
return measurement.billed_input_per_request.slice(-RECENT_REQUEST_WINDOW)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// What a turn costs is decided by the accumulated preamble, not by what the turn does, so the
|
|
28
|
+
// marginal cost of a session is the billed input its recent requests paid. Measured across one
|
|
29
|
+
// `epicrun` that ran six children in one context: 222k per request during the first child, 645k
|
|
30
|
+
// during the sixth — the same work at 2.9x the price (joshuafolkken/kit#968).
|
|
31
|
+
//
|
|
32
|
+
// The recent window rather than the whole session, because a long parent's whole-session average
|
|
33
|
+
// lags its current context by dozens of requests (joshuafolkken/kit#2295); the recent average says
|
|
34
|
+
// what the *next* turn will cost, which is the thing a hand-off decision turns on.
|
|
35
|
+
function per_request_cost(measurement: OverMeasurement): number {
|
|
36
|
+
const window = recent_requests(measurement)
|
|
37
|
+
if (window.length === 0) return 0
|
|
38
|
+
|
|
39
|
+
const total = window.reduce((sum, billed) => sum + billed, 0)
|
|
40
|
+
|
|
41
|
+
return Math.round(total / window.length)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// The bare over/under decision, without a report: `run:status` reads this same verdict read-only
|
|
45
|
+
// (joshuafolkken/kit#2165), so the comparison lives here once rather than being copied there. A
|
|
46
|
+
// threshold of exactly `cost` is under, matching the `>` the printed report used.
|
|
47
|
+
function classify(
|
|
48
|
+
measurement: OverMeasurement,
|
|
49
|
+
limit: number,
|
|
50
|
+
): typeof OVER_VERDICT | typeof UNDER_VERDICT {
|
|
51
|
+
return per_request_cost(measurement) > limit ? OVER_VERDICT : UNDER_VERDICT
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// The stderr line names the window the average covers, so the reader can tell a recent-tail average
|
|
55
|
+
// from a whole-session one (joshuafolkken/kit#2295): "the last W of T request(s)" reads W when the
|
|
56
|
+
// session is longer than the window and the whole count when it is shorter.
|
|
57
|
+
function over_summary(measurement: OverMeasurement, limit: number): string {
|
|
58
|
+
const total = measurement.billed_input_per_request.length
|
|
59
|
+
const window = recent_requests(measurement).length
|
|
60
|
+
|
|
61
|
+
return `${String(per_request_cost(measurement))} billed input tokens per request over the last ${String(window)} of ${String(total)} request(s); limit ${String(limit)}`
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// A verdict, not a table: the point of the flag is that the hand-off is decided by a number rather
|
|
65
|
+
// than by whether the run feels long, which is a judgement made under exactly the pressure that
|
|
66
|
+
// resolves it the wrong way.
|
|
67
|
+
function report_over(measurement: OverMeasurement | undefined, limit: number): number {
|
|
68
|
+
if (measurement === undefined || measurement.billed_input_per_request.length === 0) {
|
|
69
|
+
console.error('No requests in this session; there is nothing to hand off.')
|
|
70
|
+
|
|
71
|
+
return FAILURE_EXIT_CODE
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
console.info(classify(measurement, limit))
|
|
75
|
+
console.error(over_summary(measurement, limit))
|
|
76
|
+
|
|
77
|
+
return 0
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const cost_verdict = {
|
|
81
|
+
OVER_VERDICT,
|
|
82
|
+
UNDER_VERDICT,
|
|
83
|
+
classify,
|
|
84
|
+
per_request_cost,
|
|
85
|
+
report_over,
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export type { OverMeasurement }
|
|
89
|
+
export { cost_verdict }
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { agent_session_environment } from '#scripts/josh/agent-session-environment'
|
|
2
|
+
import { cost_transcript, type SessionFile } from './cost-transcript'
|
|
3
|
+
|
|
4
|
+
// Which transcript in a listing is the *calling* session's own (joshuafolkken/kit#2403).
|
|
5
|
+
//
|
|
6
|
+
// **The mtime was measuring another session.** `latest_own_index` took the newest non-delegated
|
|
7
|
+
// transcript as "the run that just finished", which is right for a report run after a run ends but
|
|
8
|
+
// wrong for a session asking its *own* cost while another is still writing: a `backlogrun` parent
|
|
9
|
+
// waiting on a lane child stops writing its own transcript, so the child's is always newer, and the
|
|
10
|
+
// parent's `--cut` priced the child — reading 34 real requests as none and cutting a session that
|
|
11
|
+
// was under budget.
|
|
12
|
+
//
|
|
13
|
+
// **Claude Code exports the running session's id, so the session can name its own file** rather than
|
|
14
|
+
// guess by time. When the environment names one, the selection is by id and nothing else — a newer
|
|
15
|
+
// transcript under any other slug is never picked. When it names none (a plain shell outside a
|
|
16
|
+
// session), the mtime fallback is exactly the behavior this replaces.
|
|
17
|
+
|
|
18
|
+
type Environment = Readonly<Record<string, string | undefined>>
|
|
19
|
+
|
|
20
|
+
const NOT_FOUND = -1
|
|
21
|
+
|
|
22
|
+
// The calling session's own transcript in a listing:
|
|
23
|
+
// - `own` — its index, either the session the environment named or (with no name) the newest own
|
|
24
|
+
// file `latest_own_index` picks;
|
|
25
|
+
// - `absent` — the environment named a session whose transcript is not in the listing, which is
|
|
26
|
+
// measured as "not found" rather than folded to another session's newest file.
|
|
27
|
+
type OwnSessionSelection = { kind: 'own'; index: number } | { kind: 'absent'; session_id: string }
|
|
28
|
+
|
|
29
|
+
// The running session's id, or `undefined` when the environment names none — an empty value counts as
|
|
30
|
+
// none, so `CLAUDE_CODE_SESSION_ID=` does not read as a session named the empty string.
|
|
31
|
+
function session_id_of(environment: Environment): string | undefined {
|
|
32
|
+
const value = environment[agent_session_environment.SESSION_ID_KEY]
|
|
33
|
+
|
|
34
|
+
return value === undefined || value === '' ? undefined : value
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function select_own_session(
|
|
38
|
+
files: ReadonlyArray<SessionFile>,
|
|
39
|
+
environment: Environment,
|
|
40
|
+
): OwnSessionSelection {
|
|
41
|
+
const session_id = session_id_of(environment)
|
|
42
|
+
|
|
43
|
+
if (session_id === undefined) {
|
|
44
|
+
return { kind: 'own', index: cost_transcript.latest_own_index(files) }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const index = files.findIndex((file) => file.session_id === session_id)
|
|
48
|
+
|
|
49
|
+
return index === NOT_FOUND ? { kind: 'absent', session_id } : { kind: 'own', index }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const own_session = {
|
|
53
|
+
session_id_of,
|
|
54
|
+
select_own_session,
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export type { OwnSessionSelection }
|
|
58
|
+
export { own_session }
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
|
|
3
|
+
// `--path <dir>` names the target project whose transcripts to read, resolved to an absolute path
|
|
4
|
+
// (joshuafolkken/kit#1987). The transcript slug is derived from the exact cwd string and
|
|
5
|
+
// `~/.claude/projects/<slug>` was written from an absolute one, so a relative `--path` would slugify
|
|
6
|
+
// to a folder that was never written. Shared by `josh cost` and `josh time` so the two resolve a
|
|
7
|
+
// target identically — a second copy of this rule is how one of the two quietly stops finding it.
|
|
8
|
+
function resolve(target: string | undefined, cwd: string): string {
|
|
9
|
+
return target === undefined ? cwd : path.resolve(target)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const transcript_cwd = { resolve }
|
|
13
|
+
|
|
14
|
+
export { transcript_cwd }
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { delegation_policy } from './delegation-policy'
|
|
4
|
+
|
|
5
|
+
// `josh delegate <step>` — may this step run in a cheaper execution tier? (joshuafolkken/kit#969)
|
|
6
|
+
//
|
|
7
|
+
// A command rather than a paragraph, for the reason `josh review:level` is one: a rule an agent
|
|
8
|
+
// applies from memory is a rule an agent can talk itself out of, and this is the rule that decides
|
|
9
|
+
// how carefully the next thing is done.
|
|
10
|
+
|
|
11
|
+
const ARGV_OFFSET = 2
|
|
12
|
+
const FAILURE_EXIT_CODE = 1
|
|
13
|
+
const USAGE = 'Usage: josh delegate <step> | josh delegate --list'
|
|
14
|
+
|
|
15
|
+
function print_list(): number {
|
|
16
|
+
console.info('delegatable:')
|
|
17
|
+
|
|
18
|
+
for (const step of delegation_policy.DELEGATABLE_STEPS) {
|
|
19
|
+
console.info(` ${step.name}\n does ${step.does}\n verified ${step.verifier}`)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
console.info('\nkept (considered and rejected):')
|
|
23
|
+
|
|
24
|
+
for (const step of delegation_policy.REJECTED_STEPS) {
|
|
25
|
+
console.info(` ${step.name}\n because ${step.because}`)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
console.info('\nAnything not listed above is kept. The list is the whole of it.')
|
|
29
|
+
|
|
30
|
+
return 0
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const LIST_FLAG = '--list'
|
|
34
|
+
const FLAG_PREFIX = '-'
|
|
35
|
+
|
|
36
|
+
// Every reading of the argument goes through this one function, because the guard and the branch
|
|
37
|
+
// disagreeing about surrounding whitespace is the defect itself: the guard trimmed and `run` did
|
|
38
|
+
// not, so `josh delegate ' --list'` passed as a known flag and then fell through to a verdict about
|
|
39
|
+
// a step called ` --list` (joshuafolkken/kit#1096). The policy lookup trims too, which is why
|
|
40
|
+
// `josh delegate ' --help'` had already slipped past an untrimmed guard (joshuafolkken/kit#969).
|
|
41
|
+
function normalized(argument: string): string {
|
|
42
|
+
return argument.trim()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// A step name never starts with a dash, so anything that does is a flag — and the only flag this
|
|
46
|
+
// command has is `--list`. Without this, `josh delegate --help` answered `keep`: a mistyped
|
|
47
|
+
// invocation would read as a verdict about a step called `--help` (joshuafolkken/kit#969).
|
|
48
|
+
function is_unknown_flag(argument: string): boolean {
|
|
49
|
+
const trimmed = normalized(argument)
|
|
50
|
+
|
|
51
|
+
return trimmed.startsWith(FLAG_PREFIX) && trimmed !== LIST_FLAG
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Exactly one argument, non-empty, and either the one flag this command has or a step name.
|
|
55
|
+
function is_refused(argv: ReadonlyArray<string>): boolean {
|
|
56
|
+
const [first, ...rest] = argv
|
|
57
|
+
|
|
58
|
+
if (first === undefined || rest.length > 0) return true
|
|
59
|
+
|
|
60
|
+
return normalized(first) === '' || is_unknown_flag(first)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function run(argv: ReadonlyArray<string>): number {
|
|
64
|
+
if (is_refused(argv)) {
|
|
65
|
+
console.error(USAGE)
|
|
66
|
+
|
|
67
|
+
return FAILURE_EXIT_CODE
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const [first = ''] = argv
|
|
71
|
+
const argument = normalized(first)
|
|
72
|
+
|
|
73
|
+
if (argument === LIST_FLAG) return print_list()
|
|
74
|
+
|
|
75
|
+
// The verdict alone on stdout so `$(josh delegate <step>)` reads it; the reason on stderr so a
|
|
76
|
+
// person sees why without a shell having to parse around it.
|
|
77
|
+
console.info(delegation_policy.verdict_for(argument))
|
|
78
|
+
console.error(delegation_policy.reason_for(argument))
|
|
79
|
+
|
|
80
|
+
return 0
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function main(argv: ReadonlyArray<string>): void {
|
|
84
|
+
process.exitCode = run(argv)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const delegation_cli = { USAGE, print_list, run, main }
|
|
88
|
+
|
|
89
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
90
|
+
|
|
91
|
+
export { delegation_cli }
|