@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,65 @@
|
|
|
1
|
+
// The one reading of a `gh api` segment shared by the rows of `delivered-rules.ts` that judge such a
|
|
2
|
+
// call by its spelling (joshuafolkken/kit#2122): the issue-body-read guard classifies read vs write,
|
|
3
|
+
// and the third-party-write guard needs the same classification plus the target `owner/repo`. Two
|
|
4
|
+
// copies of the flag regexes would be the clone `CLAUDE.md` prohibits, and the copy that forgot `-F`
|
|
5
|
+
// or `--raw-field` would be the one that let a write through.
|
|
6
|
+
//
|
|
7
|
+
// **The deny list matches globs; this reads the command.** `gh api` sends a POST as soon as any field
|
|
8
|
+
// flag appears, and a method flag can override the verb either way, so the read/write line is not a
|
|
9
|
+
// literal a glob can key on — parsing the flags is what makes the judgement independent of the
|
|
10
|
+
// spelling.
|
|
11
|
+
|
|
12
|
+
// A `gh api …` invocation. Global flags may precede the subcommand (`gh --repo o/r api …`), so they
|
|
13
|
+
// are skipped by the same optional-flag prefix `delivered-rules.ts` uses in front of `issue view`.
|
|
14
|
+
const GH_FLAGS = String.raw`(?:-{1,2}[\w-]+(?:[= ][^\s]+)?\s+)*`
|
|
15
|
+
const GH_API_COMMAND = new RegExp(String.raw`^gh\s+${GH_FLAGS}api\s`, 'u')
|
|
16
|
+
|
|
17
|
+
// The method override, and the field flags that turn a bare `gh api` into a POST. **All four field
|
|
18
|
+
// spellings**, `-F` included — it is `--field`'s short form and reads as a different flag to a
|
|
19
|
+
// pattern that only knows `-f`. A body passed with `--input <file>` counts as a write too: it carries
|
|
20
|
+
// the fields inside the file.
|
|
21
|
+
const API_METHOD = /(?:^|\s)(?:--method|-X)[= ]([A-Za-z]+)/u
|
|
22
|
+
const API_FIELD = /(?:^|\s)(?:--raw-field|--field|--input|-F|-f)(?:[= ]|$)/u
|
|
23
|
+
const READ_METHOD = 'GET'
|
|
24
|
+
|
|
25
|
+
// `repos/<owner>/<repo>` from an api path, with both halves captured. The path may carry a leading
|
|
26
|
+
// slash, a query string, or further segments (`…/issues/5/comments`), so the owner and repo are taken
|
|
27
|
+
// as the two segments after `repos/` and the rest is ignored. A call that names no repository endpoint
|
|
28
|
+
// (`gh api user`, `gh api graphql`) matches nothing and is left to the caller as "no target".
|
|
29
|
+
const REPO_PATH = /repos\/([^/\s'"?]+)\/([^/\s'"?]+)/u
|
|
30
|
+
const OWNER_GROUP = 1
|
|
31
|
+
const REPO_GROUP = 2
|
|
32
|
+
|
|
33
|
+
interface RepoTarget {
|
|
34
|
+
owner: string
|
|
35
|
+
repo: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function is_gh_api(segment: string): boolean {
|
|
39
|
+
return GH_API_COMMAND.test(segment)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// A read is a `GET` — explicit via a method flag, or implicit when no field flag makes it a POST.
|
|
43
|
+
function is_read(segment: string): boolean {
|
|
44
|
+
const method = API_METHOD.exec(segment)?.[1]
|
|
45
|
+
|
|
46
|
+
if (method !== undefined) return method.toUpperCase() === READ_METHOD
|
|
47
|
+
|
|
48
|
+
return !API_FIELD.test(segment)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function is_write(segment: string): boolean {
|
|
52
|
+
return !is_read(segment)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function repo_target(segment: string): RepoTarget | undefined {
|
|
56
|
+
const match = REPO_PATH.exec(segment)
|
|
57
|
+
|
|
58
|
+
if (match === null) return undefined
|
|
59
|
+
|
|
60
|
+
return { owner: match[OWNER_GROUP] ?? '', repo: match[REPO_GROUP] ?? '' }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const gh_api = { GH_API_COMMAND, GH_FLAGS, is_gh_api, is_read, is_write, repo_target }
|
|
64
|
+
|
|
65
|
+
export { gh_api }
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// The one reading of a shell segment as a `git` invocation, shared by the two Bash-string rows that
|
|
2
|
+
// judge a git command by its spelling (joshuafolkken/kit#2120): `git-force.ts` refuses a force push or
|
|
3
|
+
// a branch delete, and `worktree-guard.ts` refuses an unauthorized working-tree change. Both have to
|
|
4
|
+
// skip the same wrapper and the same git global options before the subcommand is even in hand, so the
|
|
5
|
+
// cut lives here rather than beside whichever row needed it first — two copies of it would be the clone
|
|
6
|
+
// `CLAUDE.md` prohibits, and the copy that forgot `git -C <path>` would be the one that stopped seeing
|
|
7
|
+
// the spelling the deny list already cannot express.
|
|
8
|
+
//
|
|
9
|
+
// **The deny list matches globs; this reads argv.** `Bash(git push *--force*)` cannot see a combined
|
|
10
|
+
// short cluster (`git push -uf`), a `-C <path>` prefix, or the colon-form delete (`git push origin
|
|
11
|
+
// :branch`), because none of those put the literal the glob keys on where the glob looks. Parsing the
|
|
12
|
+
// arguments is what makes the judgement independent of the spelling.
|
|
13
|
+
|
|
14
|
+
// The wrapper words that may stand in front of `git`, the same ones `run-tail.ts` skips in front of
|
|
15
|
+
// `josh`: environment assignments, the package-manager launchers, `sudo`, and an opening subshell
|
|
16
|
+
// parenthesis. Left in, `sudo git push --force` and `(git push -f)` are silently not a git command.
|
|
17
|
+
const ENV_ASSIGNMENT = /^[A-Za-z_]\w*=/u
|
|
18
|
+
const WRAPPER_WORDS: ReadonlySet<string> = new Set([
|
|
19
|
+
'pnpm',
|
|
20
|
+
'npx',
|
|
21
|
+
'exec',
|
|
22
|
+
'run',
|
|
23
|
+
'sudo',
|
|
24
|
+
'command',
|
|
25
|
+
])
|
|
26
|
+
const SUBSHELL_OPEN = '('
|
|
27
|
+
|
|
28
|
+
// The git global options that consume a **separate** following token as their value, so the parser
|
|
29
|
+
// skips two words rather than one. `--opt=value` carries its value inline and is skipped as one word by
|
|
30
|
+
// the ordinary flag branch below.
|
|
31
|
+
const VALUE_TAKING_GLOBALS: ReadonlySet<string> = new Set([
|
|
32
|
+
'-C',
|
|
33
|
+
'-c',
|
|
34
|
+
'--git-dir',
|
|
35
|
+
'--work-tree',
|
|
36
|
+
'--namespace',
|
|
37
|
+
'--exec-path',
|
|
38
|
+
'--super-prefix',
|
|
39
|
+
])
|
|
40
|
+
|
|
41
|
+
const FLAG_PREFIX = '-'
|
|
42
|
+
const GIT_COMMAND = 'git'
|
|
43
|
+
const NEXT = 1
|
|
44
|
+
const AFTER_VALUE = 2
|
|
45
|
+
|
|
46
|
+
interface GitCall {
|
|
47
|
+
subcommand: string | undefined
|
|
48
|
+
args: ReadonlyArray<string>
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Split on whitespace alone. A refspec such as `:branch` and a short cluster such as `-uf` are single
|
|
52
|
+
// tokens with no inner spaces, and neither force detection nor stash detection needs to look inside a
|
|
53
|
+
// quoted argument — the one place a quote matters (a commit message) belongs to a subcommand neither
|
|
54
|
+
// caller judges.
|
|
55
|
+
const WHITESPACE = /\s+/u
|
|
56
|
+
|
|
57
|
+
function words_of(segment: string): Array<string> {
|
|
58
|
+
return segment.split(WHITESPACE).filter((word) => word !== '')
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function is_wrapper_token(word: string): boolean {
|
|
62
|
+
return word === SUBSHELL_OPEN || ENV_ASSIGNMENT.test(word) || WRAPPER_WORDS.has(word)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Skip the wrapper: environment assignments, a launcher word, and a leading subshell parenthesis. The
|
|
66
|
+
// first word that is none of these is where `git` has to be, or the segment is not a git command.
|
|
67
|
+
function after_wrapper(words: ReadonlyArray<string>): number {
|
|
68
|
+
let index = 0
|
|
69
|
+
|
|
70
|
+
while (index < words.length && is_wrapper_token(words[index] ?? '')) index += NEXT
|
|
71
|
+
|
|
72
|
+
return index
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// A value-taking global with no `=` swallows the next word too; every other flag is one word.
|
|
76
|
+
function global_step(flag: string): number {
|
|
77
|
+
return VALUE_TAKING_GLOBALS.has(flag) ? AFTER_VALUE : NEXT
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Skip git's own global options, so `git -C <path> -c user.name=x push` reaches `push`.
|
|
81
|
+
function after_globals(words: ReadonlyArray<string>, start: number): number {
|
|
82
|
+
let index = start
|
|
83
|
+
|
|
84
|
+
while (index < words.length) {
|
|
85
|
+
const flag = words[index] ?? ''
|
|
86
|
+
|
|
87
|
+
if (!flag.startsWith(FLAG_PREFIX)) return index
|
|
88
|
+
|
|
89
|
+
index += global_step(flag)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return index
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// The subcommand and the arguments after it, or `undefined` when the segment is not a git invocation.
|
|
96
|
+
// **`pnpm josh git` is deliberately not one**: the word after the wrapper is `josh`, not `git`, so a
|
|
97
|
+
// run's own authorized `pnpm josh git -y` push is invisible here — which is exactly what keeps this row
|
|
98
|
+
// off the node route the deny list already leaves alone.
|
|
99
|
+
function parse(segment: string): GitCall | undefined {
|
|
100
|
+
const words = words_of(segment)
|
|
101
|
+
const git_index = after_wrapper(words)
|
|
102
|
+
|
|
103
|
+
if (words[git_index] !== GIT_COMMAND) return undefined
|
|
104
|
+
|
|
105
|
+
const subcommand_index = after_globals(words, git_index + NEXT)
|
|
106
|
+
|
|
107
|
+
return { subcommand: words[subcommand_index], args: words.slice(subcommand_index + NEXT) }
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// A single-dash cluster of letters (`-uf`, `-D`), never a `--long` flag. The callers ask whether such a
|
|
111
|
+
// cluster carries a given letter — `f` for a force push, `d` for a delete — because the deny list's
|
|
112
|
+
// glob cannot see a letter bundled with others.
|
|
113
|
+
const SHORT_CLUSTER = /^-[A-Za-z]+$/u
|
|
114
|
+
|
|
115
|
+
function short_cluster_has(token: string, letters: string): boolean {
|
|
116
|
+
if (!SHORT_CLUSTER.test(token)) return false
|
|
117
|
+
|
|
118
|
+
const cluster = token.slice(FLAG_PREFIX.length)
|
|
119
|
+
|
|
120
|
+
for (let index = 0; index < letters.length; index += 1) {
|
|
121
|
+
if (cluster.includes(letters.charAt(index))) return true
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return false
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const git_argv = { parse, short_cluster_has, words_of }
|
|
128
|
+
|
|
129
|
+
export { git_argv }
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { bash_triggers } from './bash-triggers'
|
|
2
|
+
import { git_argv } from './git-argv'
|
|
3
|
+
import { shell_segments } from './shell-segments'
|
|
4
|
+
|
|
5
|
+
// The trigger and the delivered text behind the `git-force` row of `delivered-rules.ts`
|
|
6
|
+
// (joshuafolkken/kit#2120). Group 1 of the three Bash-string gaps: a force push or a branch delete
|
|
7
|
+
// spelled in a way the `deny` glob cannot express.
|
|
8
|
+
//
|
|
9
|
+
// **The deny list stops the spellings a glob can reach and no others.** `Bash(git push *--force*)` and
|
|
10
|
+
// `Bash(git push * -f)` catch the flag written after the arguments; `Bash(git branch -d*)` /
|
|
11
|
+
// `Bash(git branch -D*)` catch a delete. But a combined short cluster (`git push -uf`), a `git -C
|
|
12
|
+
// <path>` prefix, and the colon-form delete (`git push origin :branch`) all pass every entry, because
|
|
13
|
+
// none of them puts the literal the glob keys on where the glob looks (`operating-rules.md`). Reading
|
|
14
|
+
// the argv is what makes the judgement independent of the spelling.
|
|
15
|
+
//
|
|
16
|
+
// **It fires on every occurrence, not once per run.** A force push is destructive every time it is
|
|
17
|
+
// issued, so refused-once-and-free-after would put the second one back on the run's self-restraint —
|
|
18
|
+
// the disposition `run-tail.ts` and `filing-cap.ts` take for the same reason.
|
|
19
|
+
|
|
20
|
+
// A force push. The long forms all open with `--force` (`--force`, `--force-with-lease[=ref]`,
|
|
21
|
+
// `--force-if-includes`); `-f` and any cluster carrying `f` are the short forms; a bare `--delete` and
|
|
22
|
+
// a cluster carrying `d` are the delete flags; and a refspec carries the force or delete in its own
|
|
23
|
+
// spelling — a leading `+` forces the update (`+main:main`, `+:branch`) and an empty source side
|
|
24
|
+
// deletes (`:branch`). Both open the refspec with a character the deny list cannot match as a literal.
|
|
25
|
+
const FORCE_LONG_PREFIX = '--force'
|
|
26
|
+
const DELETE_LONG = '--delete'
|
|
27
|
+
const PUSH_SHORT_LETTERS = 'fd'
|
|
28
|
+
const FORCE_OR_DELETE_REFSPEC = /^[+:]/u
|
|
29
|
+
|
|
30
|
+
function is_force_or_delete_push(args: ReadonlyArray<string>): boolean {
|
|
31
|
+
return args.some(
|
|
32
|
+
(argument) =>
|
|
33
|
+
argument.startsWith(FORCE_LONG_PREFIX) ||
|
|
34
|
+
argument === DELETE_LONG ||
|
|
35
|
+
git_argv.short_cluster_has(argument, PUSH_SHORT_LETTERS) ||
|
|
36
|
+
FORCE_OR_DELETE_REFSPEC.test(argument),
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// A branch delete: `--delete`, `-d` (delete), or `-D` (force delete), including a cluster carrying
|
|
41
|
+
// either letter. `-m` (rename), `-a` / `-r` (list) and `-f` (force-create) are deliberately not here —
|
|
42
|
+
// this rule is the delete the deny glob misses, not every branch mutation.
|
|
43
|
+
const BRANCH_DELETE_LETTERS = 'dD'
|
|
44
|
+
|
|
45
|
+
function is_branch_delete(args: ReadonlyArray<string>): boolean {
|
|
46
|
+
return args.some(
|
|
47
|
+
(argument) =>
|
|
48
|
+
argument === DELETE_LONG || git_argv.short_cluster_has(argument, BRANCH_DELETE_LETTERS),
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const PUSH_SUBCOMMAND = 'push'
|
|
53
|
+
const BRANCH_SUBCOMMAND = 'branch'
|
|
54
|
+
|
|
55
|
+
function is_destructive_segment(segment: string): boolean {
|
|
56
|
+
const call = git_argv.parse(segment)
|
|
57
|
+
|
|
58
|
+
if (call === undefined) return false
|
|
59
|
+
|
|
60
|
+
if (call.subcommand === PUSH_SUBCOMMAND) return is_force_or_delete_push(call.args)
|
|
61
|
+
|
|
62
|
+
return call.subcommand === BRANCH_SUBCOMMAND && is_branch_delete(call.args)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// A shell line carries several commands, so each segment is judged on its own — a `git push --force`
|
|
66
|
+
// quoted inside another command's argument is read as the write it is not, exactly as every other
|
|
67
|
+
// trigger in this directory reads its own.
|
|
68
|
+
function is_force_or_delete(command: string): boolean {
|
|
69
|
+
return shell_segments.segments_of(command).some((segment) => is_destructive_segment(segment))
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// The instruction in the shape a refusal can carry: what the command does, why the deny list did not
|
|
73
|
+
// stop it, and the one route left. There is no "safe reissue" the way a backgrounded push is for
|
|
74
|
+
// `run-tail` — a force push and a branch delete are Tier C, so the honest next move is a person's, in
|
|
75
|
+
// their own terminal.
|
|
76
|
+
const GIT_FORCE_REASON =
|
|
77
|
+
'⛔ force push or branch delete: this rewrites or removes shared history, which is Tier C and needs ' +
|
|
78
|
+
'explicit current-turn user instruction — never an AI decision, even to fix a problem you caused ' +
|
|
79
|
+
'(`prompts/collaboration-workflow/operating-rules.md`). The `.claude/settings.json` deny list ' +
|
|
80
|
+
'matches globs, so it misses this spelling: a combined short cluster (`git push -uf`), a `git -C ' +
|
|
81
|
+
'<path>` prefix, and the colon-form delete (`git push origin :branch`) all pass it. This row reads ' +
|
|
82
|
+
'the argv instead, so the spelling does not matter. For an ordinary push use `pnpm josh git`; a ' +
|
|
83
|
+
"force push, a `git push --delete` / `:branch`, or a `git branch -d` / `-D` is the user's to run in " +
|
|
84
|
+
'their own terminal. **This rule fires on every occurrence, not once per run.**'
|
|
85
|
+
|
|
86
|
+
// The row itself, so `delivered-rules.ts` spreads one entry. `decide` returns true so it refuses every
|
|
87
|
+
// occurrence; it declares no `keeps` — not force-pushing is the absence of a call, not a call, so the
|
|
88
|
+
// row is reported unmeasured rather than scored on an act that does not exist (`filing-cap.ts`).
|
|
89
|
+
const ROW = {
|
|
90
|
+
id: 'git-force',
|
|
91
|
+
is_trigger: bash_triggers.on_bash_command(is_force_or_delete),
|
|
92
|
+
reason: GIT_FORCE_REASON,
|
|
93
|
+
decide: (): boolean => true,
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const git_force = {
|
|
97
|
+
GIT_FORCE_REASON,
|
|
98
|
+
ROW,
|
|
99
|
+
is_branch_delete,
|
|
100
|
+
is_force_or_delete,
|
|
101
|
+
is_force_or_delete_push,
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export { git_force }
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { CostVerdict } from '#scripts/cost-runtime/cost-cli'
|
|
2
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
|
+
import { z } from 'zod'
|
|
4
|
+
|
|
5
|
+
// A short reuse window over the transcript-priced verdict `implementation-cut.ts` reads
|
|
6
|
+
// (joshuafolkken/kit#2385).
|
|
7
|
+
//
|
|
8
|
+
// **The read is a whole-transcript price and its caller is asked of every edit.**
|
|
9
|
+
// `is_over_threshold_edit` reads `cost_cli.session_verdict` — which loads and parses the session
|
|
10
|
+
// corpus — and it is asked of every `Edit` / `Write` a lane child makes. Once the row fires per
|
|
11
|
+
// threshold crossing rather than once per run, that read can no longer be paid on every edit, so the
|
|
12
|
+
// verdict is cached beside the instant it was read and a burst of edits shares one read.
|
|
13
|
+
//
|
|
14
|
+
// **An in-memory memo cannot span two edits.** `pnpm josh rule:guard` runs as a fresh process on each
|
|
15
|
+
// `PreToolUse`, so the cache is a per-checkout stamp rather than a module variable — the same handoff
|
|
16
|
+
// shape the refusal stamp itself uses.
|
|
17
|
+
//
|
|
18
|
+
// **The value cannot go stale inside a window this short.** A turn appends no new *request* record
|
|
19
|
+
// between its own edits, so consecutive edits of one turn price identically; and a cut relaunches the
|
|
20
|
+
// process, whose first edit lands far past the window, so a resumed under-threshold session never reads
|
|
21
|
+
// a stale `over` left by the process the cut ended.
|
|
22
|
+
|
|
23
|
+
const VERDICT_CACHE_PREFIX = 'josh-impl-cut-verdict-'
|
|
24
|
+
// Long enough to collapse one turn's burst of edits to a single read, short enough that the next turn
|
|
25
|
+
// re-reads as the context grows. It sits below the cut-relaunch latency by design (see the header).
|
|
26
|
+
const VERDICT_REUSE_MS = 5000
|
|
27
|
+
|
|
28
|
+
// The literal spellings, tied to `CostVerdict` by `satisfies` so a change to the union fails this line
|
|
29
|
+
// rather than drifting silently — the namespace constants (`cost_verdict.OVER_VERDICT` …) widen to
|
|
30
|
+
// `string` through the object, so they cannot type a `z.enum` tuple.
|
|
31
|
+
const VERDICT_VALUES = [
|
|
32
|
+
'over',
|
|
33
|
+
'under',
|
|
34
|
+
'unmeasurable',
|
|
35
|
+
] as const satisfies ReadonlyArray<CostVerdict>
|
|
36
|
+
const cache_schema = z.object({ read_at_ms: z.number(), verdict: z.enum(VERDICT_VALUES) })
|
|
37
|
+
|
|
38
|
+
function cache_path(directory: string): string {
|
|
39
|
+
return stamp_file.stamp_path(VERDICT_CACHE_PREFIX, directory)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// The stored verdict when it is still inside the reuse window, or `undefined` for a missing, expired or
|
|
43
|
+
// unreadable record — every one of which is a cache miss that reads afresh.
|
|
44
|
+
function cached_verdict(target: string, now_ms: number): CostVerdict | undefined {
|
|
45
|
+
const raw = stamp_file.read_stamp_text(target)
|
|
46
|
+
|
|
47
|
+
if (raw === undefined) return undefined
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
const { read_at_ms, verdict } = cache_schema.parse(JSON.parse(raw))
|
|
51
|
+
|
|
52
|
+
return now_ms - read_at_ms < VERDICT_REUSE_MS ? verdict : undefined
|
|
53
|
+
} catch {
|
|
54
|
+
return undefined
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// The verdict, read through the window: the stored value inside it, a fresh `read()` past it. The
|
|
59
|
+
// fresh read rewrites the stamp so the window restarts, and `replace_stamp`'s atomic rename keeps two
|
|
60
|
+
// edits racing the write from tearing the record.
|
|
61
|
+
function reused_verdict(
|
|
62
|
+
read: () => CostVerdict,
|
|
63
|
+
directory: string = process.cwd(),
|
|
64
|
+
now_ms: number = Date.now(),
|
|
65
|
+
): CostVerdict {
|
|
66
|
+
const target = cache_path(directory)
|
|
67
|
+
const cached = cached_verdict(target, now_ms)
|
|
68
|
+
|
|
69
|
+
if (cached !== undefined) return cached
|
|
70
|
+
|
|
71
|
+
const value = read()
|
|
72
|
+
|
|
73
|
+
stamp_file.replace_stamp(target, { read_at_ms: now_ms, verdict: value })
|
|
74
|
+
|
|
75
|
+
return value
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const implementation_cut_verdict = {
|
|
79
|
+
VERDICT_REUSE_MS,
|
|
80
|
+
cache_path,
|
|
81
|
+
reused_verdict,
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export { implementation_cut_verdict }
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
|
|
2
|
+
import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
|
|
3
|
+
import { cost_format } from '#scripts/cost-runtime/cost-format'
|
|
4
|
+
import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
|
|
5
|
+
import type { GuardRun } from '#scripts/josh/hook-decision'
|
|
6
|
+
import { lane_child_marker, type MarkerSource } from '#scripts/lane/lane-child-marker'
|
|
7
|
+
import { lane_paths } from '#scripts/lane/lane-paths'
|
|
8
|
+
import { run_cut, type RunCut } from '#scripts/run/run-cut'
|
|
9
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
10
|
+
import { bash_triggers } from './bash-triggers'
|
|
11
|
+
import { implementation_cut_verdict } from './implementation-cut-verdict'
|
|
12
|
+
import { shell_segments } from './shell-segments'
|
|
13
|
+
|
|
14
|
+
// The implementation-phase cut, delivered at the call it binds on (joshuafolkken/kit#2310).
|
|
15
|
+
//
|
|
16
|
+
// **The mechanism was there and the verdict was taken at the wrong time.** joshuafolkken/kit#1933
|
|
17
|
+
// built the second cut boundary — a lane child ends its process *during* implementation once its
|
|
18
|
+
// recent-context cost crosses the shared threshold, and a fresh one resumes back into implementation —
|
|
19
|
+
// and left the child to run `pnpm josh cost --cut` at each working-tree boundary itself. It never did.
|
|
20
|
+
// The five lanes joshuafolkken/kit#2310 measured (#2304 #2294 #2297 #2296 #2298) each read the verdict
|
|
21
|
+
// exactly once, at session entry where the context has not yet grown — so the check answered `under`
|
|
22
|
+
// by construction and the cut fired 0 times while 33.9% of their requests ran past 200,000 tokens.
|
|
23
|
+
//
|
|
24
|
+
// **This is the same lesson pre-gate-cut.ts records, one boundary earlier.** joshuafolkken/kit#1864
|
|
25
|
+
// measured the pre-gate cut taken 0 times while it was carried as prose, and a `PreToolUse` refusal is
|
|
26
|
+
// what took it. joshuafolkken/kit#1933 had reasoned the implementation cut *could not* be a guard,
|
|
27
|
+
// because the per-request cost was read asynchronously; but `cost_cli.session_verdict` is synchronous
|
|
28
|
+
// and is the very verdict `pnpm josh cost --cut` prints, so the guard reads it directly rather than
|
|
29
|
+
// approximating it — the same statistic and the same threshold, never the second measurement #1933
|
|
30
|
+
// forbids.
|
|
31
|
+
|
|
32
|
+
// The two edit tools the `PreToolUse` matcher routes here, and the working-tree boundary the cut is
|
|
33
|
+
// taken at. A `PreToolUse` refusal fires *before* the edit lands, so the tree is at the consistent
|
|
34
|
+
// state the previous edit left it — the "between edit batches, never mid-edit" boundary
|
|
35
|
+
// `pre-gate-cut.md` requires, reached without waiting for a check to go green.
|
|
36
|
+
const EDIT_TOOLS: ReadonlySet<string> = new Set(['Edit', 'Write'])
|
|
37
|
+
|
|
38
|
+
function is_edit_tool(name: string): boolean {
|
|
39
|
+
return EDIT_TOOLS.has(name)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// The one spelling that takes this cut rather than the pre-gate one: `--impl`. A bare `pnpm josh
|
|
43
|
+
// run:cut <N>` is the pre-gate boundary and `--resume` / `--end` / `--json` ask about a cut rather than
|
|
44
|
+
// take one, so the compliance test looks for the flag that makes it the implementation-phase cut.
|
|
45
|
+
const CUT_COMMANDS: ReadonlySet<string> = new Set(['run:cut'])
|
|
46
|
+
const IMPL_FLAG = /(?:^|\s)--impl(?:[=\s]|$)/u
|
|
47
|
+
|
|
48
|
+
function is_impl_cut_segment(segment: string): boolean {
|
|
49
|
+
return shell_segments.is_josh_command(segment, CUT_COMMANDS) && IMPL_FLAG.test(segment)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Whether this command takes the implementation-phase cut, segment-wise so a spelling quoted inside a
|
|
53
|
+
// body is not read as the call, and alias-expanded so `pnpm josh rct --impl` is the same call.
|
|
54
|
+
function takes_the_impl_cut(command: string): boolean {
|
|
55
|
+
return shell_segments.segments_of(command).some((segment) => is_impl_cut_segment(segment))
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// What the trigger has to know about the world, passed in so the decision is testable without a lane on
|
|
59
|
+
// disk, a cut record, or a session transcript. `verdict` is the synchronous `pnpm josh cost --cut`
|
|
60
|
+
// reading — the same per-request billed-input statistic against the same threshold — so the guard
|
|
61
|
+
// prices its cut on exactly what the parent hand-off does (joshuafolkken/kit#1933).
|
|
62
|
+
interface LaneCostState {
|
|
63
|
+
directory: string
|
|
64
|
+
source: MarkerSource
|
|
65
|
+
carried: (now?: Date) => RunCut | undefined
|
|
66
|
+
verdict: () => CostVerdict
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function current_state(): LaneCostState {
|
|
70
|
+
return {
|
|
71
|
+
directory: process.cwd(),
|
|
72
|
+
source: process.env,
|
|
73
|
+
carried: run_cut.carried_cut_sync,
|
|
74
|
+
// **Read through the short reuse window** (joshuafolkken/kit#2385). The row now fires per
|
|
75
|
+
// threshold crossing rather than once per run, so this predicate is a candidate on every edit;
|
|
76
|
+
// the window collapses one turn's burst of edits to a single whole-transcript price.
|
|
77
|
+
verdict: (): CostVerdict =>
|
|
78
|
+
implementation_cut_verdict.reused_verdict(() => cost_cli.session_verdict()),
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// A dispatched lane child for this checkout with no cut already carried. The dispatch mark is what
|
|
83
|
+
// tells a child apart from a person (joshuafolkken/kit#1904), read from the environment against this
|
|
84
|
+
// lane's own issue so a leaked mark for another issue reads as a person. **The carried-cut half keeps
|
|
85
|
+
// the guard silent between a cut and its resume**, exactly as `pre-gate-cut.ts`'s does: a record naming
|
|
86
|
+
// this issue means a cut is already in flight, and `begin_cut`'s exclusive create would refuse a second
|
|
87
|
+
// one anyway.
|
|
88
|
+
function uncut_lane_child_issue(state: LaneCostState): string | undefined {
|
|
89
|
+
if (!lane_child_marker.is_child_of(state.directory, state.source)) return undefined
|
|
90
|
+
|
|
91
|
+
const issue = lane_paths.lane_issue_of(state.directory, { ...state.source })
|
|
92
|
+
|
|
93
|
+
if (issue === undefined) return undefined
|
|
94
|
+
|
|
95
|
+
return state.carried()?.issue === issue ? undefined : issue
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// **The tool-name test comes first and the world is consulted second, the cost measurement last.** This
|
|
99
|
+
// predicate is asked of every call in the run, so the `Edit` / `Write` string match keeps the lane read
|
|
100
|
+
// off all but the edits, and the lane read keeps the transcript-priced verdict off every edit but those
|
|
101
|
+
// a dispatched child makes in an uncut lane — where crossing the threshold is exactly the event this
|
|
102
|
+
// guard exists to catch.
|
|
103
|
+
//
|
|
104
|
+
// **The unmeasurable direction matches the pre-gate cut** (joshuafolkken/kit#2385). A session that
|
|
105
|
+
// cannot be priced reads as warranting the cut, the same safety-net direction `pre-gate-cut.ts`'s
|
|
106
|
+
// `warrants_the_cut` takes (`verdict !== UNDER_VERDICT`): the two rules read one statistic against one
|
|
107
|
+
// threshold, so they must not disagree about whether an unmeasurable session is due a cut.
|
|
108
|
+
function is_over_threshold_edit(
|
|
109
|
+
call: GuardedCall,
|
|
110
|
+
state: LaneCostState = current_state(),
|
|
111
|
+
): boolean {
|
|
112
|
+
if (!is_edit_tool(call.name) || uncut_lane_child_issue(state) === undefined) return false
|
|
113
|
+
|
|
114
|
+
return state.verdict() !== cost_verdict.UNDER_VERDICT
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// **The threshold in the refusal text is assembled from the constant, never spelled** (joshuafolkken/kit#2385).
|
|
118
|
+
// joshuafolkken/kit#2374 lowered the shared threshold and the literal `200,000` stayed behind in this
|
|
119
|
+
// text, telling agents the wrong number; building it from `CONTEXT_CUT_THRESHOLD` is what keeps the two
|
|
120
|
+
// from ever drifting again. `cost_format.format_tokens` renders it the way every cost report does.
|
|
121
|
+
const THRESHOLD_TEXT = `${cost_format.format_tokens(CONTEXT_CUT_THRESHOLD)}-token`
|
|
122
|
+
|
|
123
|
+
// The instruction in the shape a refusal can carry: what the cut is for, what each verdict means, and
|
|
124
|
+
// the reissue sentence every delivery needs. The verdicts are spelled out rather than pointed at,
|
|
125
|
+
// because `cut` is the only one that ends the turn and a run told merely to "take the cut" would have to
|
|
126
|
+
// read which of the others leave it implementing — the same reason `pre-gate-cut.ts` spells them out.
|
|
127
|
+
const IMPLEMENTATION_CUT_REASON =
|
|
128
|
+
'⛔ implementation-phase cut: this checkout is a lane dispatched for this issue and its recent-context ' +
|
|
129
|
+
`cost has crossed the shared ${THRESHOLD_TEXT} threshold mid-implementation, so the thinking accumulated ` +
|
|
130
|
+
'so far is now re-read on every later request. Take the cut before this edit. ' +
|
|
131
|
+
'First write a handoff file with the Write tool — the user’s instruction verbatim, what you have ' +
|
|
132
|
+
'completed, what remains, and what you deliberately did not touch — and pass it as `--handoff <path>`, ' +
|
|
133
|
+
'so the fresh process resumes on the original instruction rather than the working tree alone ' +
|
|
134
|
+
'(joshuafolkken/kit#2354); a resume that finds no instruction is refused `incomplete` rather than ' +
|
|
135
|
+
'continuing blind. ' +
|
|
136
|
+
'`pnpm josh run:cut --impl <N> --handoff <path>` ends this process and relaunches a fresh one that resumes back into ' +
|
|
137
|
+
'implementation (`resume-impl`), dropping the accumulated context rather than carrying it — ' +
|
|
138
|
+
'joshuafolkken/kit#1933 built the boundary and joshuafolkken/kit#2310 measured it firing 0 times ' +
|
|
139
|
+
'because the verdict was only ever read at session entry, where the context has not yet grown. The ' +
|
|
140
|
+
"verdict is `pnpm josh cost --cut`'s exactly — the same per-request billed-input statistic against the " +
|
|
141
|
+
'same threshold, never a second measurement. Issue `pnpm josh run:cut --impl <N> --handoff <path>` now and read the ' +
|
|
142
|
+
'verdict: on `cut`, **end the turn immediately** — the fresh process owns the run and continues ' +
|
|
143
|
+
'implementing, so it must not be waited for; on `not-a-lane`, `unready`, `busy`, `failed` or ' +
|
|
144
|
+
'`unknown`, this process carries the run on and the edit is simply the next call. Never relaunch a ' +
|
|
145
|
+
'second process after `busy`. This fired because the dispatch mark names this lane; a person working ' +
|
|
146
|
+
'here carries no mark and sees no refusal, so there is no human-or-child judgement left to make. The ' +
|
|
147
|
+
'procedure is `.claude/skills/workflow-commands/pre-gate-cut.md`. Reissue this edit once the cut has ' +
|
|
148
|
+
'answered — an edit reissued right after this refusal passes, so `busy` / `failed` cannot wedge the ' +
|
|
149
|
+
'run edit after edit; this fires again on the next threshold crossing rather than once per run.'
|
|
150
|
+
|
|
151
|
+
// **A refusal younger than this window is this edit's own refusal being answered** (joshuafolkken/kit#2385).
|
|
152
|
+
// A `decide` row that refused every over-threshold edit would wedge a run whose cut came back `busy` /
|
|
153
|
+
// `failed` / `unready` — the very cases once-per-run relied on the reissue passing through. So an edit
|
|
154
|
+
// reissued inside this window passes: it is longer than a refusal-then-reissue round trip, so the
|
|
155
|
+
// reissue always lands inside it, while a genuinely new crossing past the window refuses again.
|
|
156
|
+
const REISSUE_WINDOW_MS = 90_000
|
|
157
|
+
|
|
158
|
+
function is_reissued_refusal(now_ms: number, delivered_at_ms: number): boolean {
|
|
159
|
+
return now_ms - delivered_at_ms < REISSUE_WINDOW_MS
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// **Fires on every threshold crossing rather than once per run** (joshuafolkken/kit#2385). Once per run
|
|
163
|
+
// silenced the row for the rest of a process the moment its first refusal landed — and a `busy` /
|
|
164
|
+
// `failed` / `unready` verdict, or an edit reissued unchanged, left the context to grow unwatched to
|
|
165
|
+
// 282,747 tokens with the cut never taken. `decide` re-asks on every over-threshold edit; the reissue
|
|
166
|
+
// window is what keeps that from wedging a run that genuinely cannot cut. `delivered_at_ms` is this
|
|
167
|
+
// row's own last refusal, written by `fire_once` only when a refusal actually fired, so a passed
|
|
168
|
+
// reissue does not move it.
|
|
169
|
+
function decide(
|
|
170
|
+
_call: GuardedCall,
|
|
171
|
+
run: GuardRun,
|
|
172
|
+
_can_record: boolean,
|
|
173
|
+
delivered_at_ms: number,
|
|
174
|
+
): boolean {
|
|
175
|
+
return !is_reissued_refusal(run.now_ms, delivered_at_ms)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// The row itself, so `delivered-rules.ts` spreads one entry. `decide` fires it per threshold crossing
|
|
179
|
+
// (joshuafolkken/kit#2385); `keeps` is the implementation cut command, read from a `Bash` call the same
|
|
180
|
+
// way `pre-gate-cut`'s is.
|
|
181
|
+
const ROW = {
|
|
182
|
+
id: 'implementation-cut',
|
|
183
|
+
is_trigger: is_over_threshold_edit,
|
|
184
|
+
reason: IMPLEMENTATION_CUT_REASON,
|
|
185
|
+
decide,
|
|
186
|
+
keeps: bash_triggers.on_bash_command(takes_the_impl_cut),
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const implementation_cut = {
|
|
190
|
+
IMPLEMENTATION_CUT_REASON,
|
|
191
|
+
REISSUE_WINDOW_MS,
|
|
192
|
+
ROW,
|
|
193
|
+
decide,
|
|
194
|
+
is_edit_tool,
|
|
195
|
+
is_over_threshold_edit,
|
|
196
|
+
is_reissued_refusal,
|
|
197
|
+
takes_the_impl_cut,
|
|
198
|
+
uncut_lane_child_issue,
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export type { LaneCostState }
|
|
202
|
+
export { implementation_cut }
|