@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,123 @@
|
|
|
1
|
+
import type { FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
2
|
+
import { review_brief } from '#scripts/review/review-brief'
|
|
3
|
+
import { review_stamps } from '#scripts/review/review-stamps'
|
|
4
|
+
|
|
5
|
+
// Whether `josh gate` already has the answer it is about to spend 47–50 seconds computing again
|
|
6
|
+
// (joshuafolkken/kit#1328).
|
|
7
|
+
//
|
|
8
|
+
// The record has existed since joshuafolkken/kit#1241: `record_green_gate` writes the digest of every
|
|
9
|
+
// changed file the four checks were green on, and `josh review:brief` reads it back to print
|
|
10
|
+
// `Already verified`. The gate itself never read it, so a second run over an unedited tree started
|
|
11
|
+
// four processes to reach a conclusion already on disk. **This is reuse of a result, not a check
|
|
12
|
+
// dropped**: the bytes the skip answers for are the bytes the record was written from, compared one
|
|
13
|
+
// by one.
|
|
14
|
+
//
|
|
15
|
+
// **The tree comparison is `review_brief.matching_stamp`, not a second copy of it.** "There is a
|
|
16
|
+
// record and nothing it covers has moved" is one question with one answer, and a gate that decided it
|
|
17
|
+
// differently from the brief printed beside it would be two commands disagreeing about the same tree.
|
|
18
|
+
//
|
|
19
|
+
// **A file map does not describe a tree on its own, because it is a diff.** It lists what differs
|
|
20
|
+
// from the commit the branch was cut from — its merge base with the default branch since
|
|
21
|
+
// joshuafolkken/kit#1527 — so everything the record says stays true while that base moves underneath
|
|
22
|
+
// it. Two shapes of that, one obvious and one not:
|
|
23
|
+
//
|
|
24
|
+
// - Straight after `git switch main && git pull` the map is **empty**, and an empty map compares
|
|
25
|
+
// equal to any other empty map however many commits the pull brought in. `epicrun` runs exactly
|
|
26
|
+
// that pair of commands between children.
|
|
27
|
+
// - Fetch an advanced default branch and rebase a feature branch onto it, and the map can come back
|
|
28
|
+
// **byte-identical** — the same files still differ by the same digests — over a working tree whose
|
|
29
|
+
// every other file has been replaced by code no check has read. The rebase moves `HEAD`, so it
|
|
30
|
+
// moves the merge base with it, and the base check still catches this.
|
|
31
|
+
//
|
|
32
|
+
// **What no longer refuses a reuse is another lane merging into the shared default branch**
|
|
33
|
+
// (joshuafolkken/kit#1527). In a linked work tree the default branch's ref is shared, but the merge
|
|
34
|
+
// base is a commit: an advance this branch is an ancestor of does not move it, and nothing this
|
|
35
|
+
// checkout's four checks read has changed — so refusing there would have discarded a record that
|
|
36
|
+
// still describes the tree exactly.
|
|
37
|
+
//
|
|
38
|
+
// So the record pins the commit the map was taken against, and both halves have to match. The empty
|
|
39
|
+
// map is refused on top of that rather than left to the base check, because a skip there buys nothing
|
|
40
|
+
// worth the argument: a tree with no changed file is not where a run spends its gate time.
|
|
41
|
+
//
|
|
42
|
+
// Two refusals need no code here. A gate that went red writes no record at all, so the re-verification
|
|
43
|
+
// after a fix finds nothing to reuse; and joshuafolkken/kit#1261's join before the commit follows a
|
|
44
|
+
// `josh bump`, which edits `package.json` into the map.
|
|
45
|
+
//
|
|
46
|
+
// **What is reused is a silent green run.** `record_green_gate` withholds the record from a run that
|
|
47
|
+
// printed anything — a skip notice, or a check that passed with warnings — because the skip prints no
|
|
48
|
+
// check bodies at all, and a record taken from such a run would make those lines disappear from every
|
|
49
|
+
// later run over the same tree.
|
|
50
|
+
|
|
51
|
+
// The escape hatch, for the times a person knows something outside the tree moved — a `pnpm install`,
|
|
52
|
+
// a toolchain change, a cache thrown away. It lives beside the decision it overrides rather than with
|
|
53
|
+
// the gate's other flag, so removing the skip would take its flag with it.
|
|
54
|
+
const FORCE_FLAG = '--force'
|
|
55
|
+
|
|
56
|
+
// The stamp rather than a boolean, for the same reason `review_brief.matching_stamp` hands one back:
|
|
57
|
+
// the caller prints `taken_at`, and a record that does not describe this tree has no timestamp worth
|
|
58
|
+
// printing. The source is a parameter so a test can plant a record without overwriting the one a real
|
|
59
|
+
// run relies on — `josh gate` and `josh review:brief` share one path by design.
|
|
60
|
+
//
|
|
61
|
+
// A `base` that could not be read is `undefined`, and an older record carries none: both compare
|
|
62
|
+
// unequal to anything, so the gate runs its checks. No base means no reuse, never reuse without one.
|
|
63
|
+
function reusable_green_gate(
|
|
64
|
+
tree: Record<string, string>,
|
|
65
|
+
base: string | undefined,
|
|
66
|
+
source?: string,
|
|
67
|
+
): FileMapStamp | undefined {
|
|
68
|
+
if (base === undefined || Object.keys(tree).length === 0) return undefined
|
|
69
|
+
|
|
70
|
+
const stamp = review_brief.matching_stamp(review_stamps.gate_stamp.read(source), tree)
|
|
71
|
+
|
|
72
|
+
if (stamp?.base !== base) return undefined
|
|
73
|
+
|
|
74
|
+
return stamp
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// **The sentence claims the result, and never merely the omission.** "verification skipped" on its
|
|
78
|
+
// own reads as `Not verified` — the one thing this output must not be mistaken for, since the run
|
|
79
|
+
// goes on to a commit on the strength of it. So the line says what passed, on which tree and when,
|
|
80
|
+
// and names the flag or the variable that runs the checks anyway.
|
|
81
|
+
//
|
|
82
|
+
// **One sentence, every reader of the record** (joshuafolkken/kit#1381). The gate says it, the
|
|
83
|
+
// pre-push hook says it and the pre-commit hook says it, and three copies of a claim this load-bearing
|
|
84
|
+
// would not have stayed the same sentence — the clone `CLAUDE.md` prohibits. What differs between them
|
|
85
|
+
// is four fragments and nothing else, so those are the parameters and the shape is not.
|
|
86
|
+
interface ReuseNotice {
|
|
87
|
+
// The noun phrase that `passed on it` is said of — `the unit tests`, `the type check`.
|
|
88
|
+
subject: string
|
|
89
|
+
// What the git operation about to happen carries, where the reader has a narrower condition than
|
|
90
|
+
// the gate's own. Empty for the gate, which speaks about the working tree it just read.
|
|
91
|
+
carried_clause: string
|
|
92
|
+
taken_at: string
|
|
93
|
+
// How a person runs the checks anyway: a flag where they type the command, a variable where the
|
|
94
|
+
// command line belongs to `lefthook/base.yml`.
|
|
95
|
+
force_hint: string
|
|
96
|
+
// What that hint re-runs, so the last clause reads as English in each caller — `the four checks`,
|
|
97
|
+
// `them`, `it`.
|
|
98
|
+
rerun_object: string
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function format_reuse_notice(notice: ReuseNotice): string {
|
|
102
|
+
return (
|
|
103
|
+
`✔ this tree is already green — ${notice.subject} passed on it at ${notice.taken_at} ` +
|
|
104
|
+
`(\`pnpm josh gate\`)${notice.carried_clause}.\n` +
|
|
105
|
+
` Reusing that result; nothing was re-run. \`${notice.force_hint}\` runs ${notice.rerun_object} anyway.`
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function format_skip(taken_at: string): string {
|
|
110
|
+
return format_reuse_notice({
|
|
111
|
+
subject: 'lint, the type check, the spell check and the unit tests all',
|
|
112
|
+
carried_clause: '',
|
|
113
|
+
taken_at,
|
|
114
|
+
force_hint: `pnpm josh gate ${FORCE_FLAG}`,
|
|
115
|
+
rerun_object: 'the four checks',
|
|
116
|
+
})
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const gate_skip = { FORCE_FLAG, format_reuse_notice, format_skip, reusable_green_gate }
|
|
120
|
+
|
|
121
|
+
export type { ReuseNotice }
|
|
122
|
+
|
|
123
|
+
export { gate_skip }
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { change_base } from '#scripts/git/change-base'
|
|
2
|
+
import { review_tree } from '#scripts/review/review-tree'
|
|
3
|
+
|
|
4
|
+
// The two readings a green-gate record is written from and compared against: the digest of every
|
|
5
|
+
// changed file, and the commit that map is a diff against (joshuafolkken/kit#1241,
|
|
6
|
+
// joshuafolkken/kit#1328).
|
|
7
|
+
//
|
|
8
|
+
// They live here rather than inside `verification-gate.ts` because there are now two readers — the
|
|
9
|
+
// gate, which reuses a green record instead of re-running its four checks, and the pre-push hook,
|
|
10
|
+
// which reuses the same record instead of re-running the unit suite (joshuafolkken/kit#1334). A
|
|
11
|
+
// second copy of the pair would be the clone `CLAUDE.md` prohibits, and it would not have stayed
|
|
12
|
+
// identical: what these functions really encode is which failure direction is safe, and a copy is
|
|
13
|
+
// where that decision gets made twice.
|
|
14
|
+
//
|
|
15
|
+
// **A failed read is `undefined` or an empty map, never a throw.** Neither reader is entitled to fail
|
|
16
|
+
// because git could not answer; both are entitled to conclude that nothing can be reused. The gate
|
|
17
|
+
// then runs its checks and the hook runs the suite, which is the direction that costs seconds rather
|
|
18
|
+
// than correctness.
|
|
19
|
+
|
|
20
|
+
interface GateTree {
|
|
21
|
+
files: Record<string, string>
|
|
22
|
+
base: string | undefined
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function read_changed_files(): Promise<Record<string, string>> {
|
|
26
|
+
try {
|
|
27
|
+
return await review_tree.read_changed_tree()
|
|
28
|
+
} catch {
|
|
29
|
+
return {}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// The resolver lives in `git/change-base.ts` since joshuafolkken/kit#1537, because the review brief
|
|
34
|
+
// needs exactly this reading and a second copy of it is the clone `CLAUDE.md` prohibits.
|
|
35
|
+
async function read_base(): Promise<string | undefined> {
|
|
36
|
+
return await change_base.resolved()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// The two readings are independent, so they are started together rather than one after the other.
|
|
40
|
+
async function read_gate_tree(): Promise<GateTree> {
|
|
41
|
+
const [files, base] = await Promise.all([read_changed_files(), read_base()])
|
|
42
|
+
|
|
43
|
+
return { files, base }
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const gate_tree = { read_base, read_changed_files, read_gate_tree }
|
|
47
|
+
|
|
48
|
+
export type { GateTree }
|
|
49
|
+
export { gate_tree }
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { git_command } from '#scripts/git/git-command'
|
|
2
|
+
import type { FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
3
|
+
import { observation_ledger } from '#scripts/observations/observation-ledger'
|
|
4
|
+
import { gate_skip } from './gate-skip'
|
|
5
|
+
import type { GateTree } from './gate-tree'
|
|
6
|
+
|
|
7
|
+
// What the two git hooks share when they decline to re-run a check `pnpm josh gate` already passed on
|
|
8
|
+
// this tree (joshuafolkken/kit#1381).
|
|
9
|
+
//
|
|
10
|
+
// The pre-push hook got this behavior first (joshuafolkken/kit#1334) and the pre-commit type check is
|
|
11
|
+
// the second reader of the same record. Everything that is the same in both lives here rather than in
|
|
12
|
+
// each of them: the escape hatch, the pre-filter in front of the record, and the one `git status`
|
|
13
|
+
// reading both narrow themselves from. **The record comparison itself is not here either** — it is
|
|
14
|
+
// `gate_skip.reusable_green_gate`, joshuafolkken/kit#1328's, so a hook cannot answer "is this tree
|
|
15
|
+
// still the recorded one" differently from the gate printing its answer beside it.
|
|
16
|
+
//
|
|
17
|
+
// **Every condition added here only ever narrows.** The gate's own three — the file map matches, the
|
|
18
|
+
// base commit the map is a diff against matches, and the map is non-empty — are necessary and never
|
|
19
|
+
// sufficient for a hook, because the gate speaks about the **working tree** while a hook guards what a
|
|
20
|
+
// git operation is about to carry. Where the two can differ, the hook runs the check. Any reading that
|
|
21
|
+
// could not be taken fails the same way: "we could not tell" must never resolve to "no need to check".
|
|
22
|
+
|
|
23
|
+
// The `josh` targets that decline a check on the strength of this record (joshuafolkken/kit#1786).
|
|
24
|
+
//
|
|
25
|
+
// **It is declared beside the mechanism rather than beside the reader.** `josh layers` reports which
|
|
26
|
+
// checks run in more than one layer, and two of the rows it prints are not the repetition they look
|
|
27
|
+
// like: the pre-commit type check and the pre-push unit run are skipped outright where a green gate
|
|
28
|
+
// already covers the tree. A reader that carried its own copy of this list would go on printing a
|
|
29
|
+
// retired name the day a hook is rewired, which is the drift `hook-gate-reuse.test.ts` pins by
|
|
30
|
+
// comparing this list against the files that actually import this module.
|
|
31
|
+
const GATE_REUSING_TARGETS: ReadonlyArray<string> = ['pre-commit-type-check', 'pre-push-unit']
|
|
32
|
+
|
|
33
|
+
// `git status --porcelain` prints `XY PATH` per difference — `X` the index against HEAD, `Y` the
|
|
34
|
+
// working tree against the index — so column 1 is the one that says whether the staged content is
|
|
35
|
+
// what is on disk. An untracked file is `??`, which fails this test too.
|
|
36
|
+
const WORKTREE_COLUMN = 1
|
|
37
|
+
const UNMODIFIED = ' '
|
|
38
|
+
|
|
39
|
+
// The escape hatch, for the times a person knows something outside the tree moved — a `pnpm install`,
|
|
40
|
+
// a toolchain change, a cache thrown away. An environment variable rather than the gate's `--force`
|
|
41
|
+
// flag because a hook's command line belongs to `lefthook/base.yml`: nobody types that invocation, so
|
|
42
|
+
// a flag alone would be unreachable at the moment it is wanted. Each hook names its own variable and
|
|
43
|
+
// passes it in, so the two escape hatches cannot be confused for one another.
|
|
44
|
+
//
|
|
45
|
+
// Any value at all, empty string aside: this is read from a shell, where `JOSH_…_FORCE=1` and
|
|
46
|
+
// `JOSH_…_FORCE=true` are the two spellings a person reaches for and neither should be the one that
|
|
47
|
+
// silently does nothing.
|
|
48
|
+
function is_force_requested(force_environment: string): boolean {
|
|
49
|
+
return (process.env[force_environment] ?? '') !== ''
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// `undefined` rather than an empty list when the reading failed, so a caller cannot mistake "git said
|
|
53
|
+
// nothing" for "git could not be asked". Every predicate below treats the two differently.
|
|
54
|
+
//
|
|
55
|
+
// **The observation ledger is dropped from the reading, and it is the one line that may be**
|
|
56
|
+
// (joshuafolkken/kit#1756). Since that issue `pnpm josh git` excludes `docs/observations.md` from
|
|
57
|
+
// what it stages, so a parent's appended line sits modified-but-never-staged for the whole interval
|
|
58
|
+
// between the append and the next `pnpm josh observations:flush` — and every condition below reads a
|
|
59
|
+
// non-empty status as "this operation carries a tree no check has read". Left in, one ledger line
|
|
60
|
+
// would send every commit and every push in the primary checkout back to the full gate for days,
|
|
61
|
+
// which is the reuse this module exists to grant. **Dropping it is sound because nothing can carry
|
|
62
|
+
// it**: the exclusion means the index and the push are byte-for-byte the recorded tree whatever the
|
|
63
|
+
// ledger says, and the ledger's own content is checked by the CI of the pull request the flush opens.
|
|
64
|
+
async function read_status_lines(): Promise<ReadonlyArray<string> | undefined> {
|
|
65
|
+
try {
|
|
66
|
+
const status = await git_command.status()
|
|
67
|
+
|
|
68
|
+
return status
|
|
69
|
+
.split('\n')
|
|
70
|
+
.filter((line) => line !== '')
|
|
71
|
+
.filter((line) => !observation_ledger.is_ledger_line(line))
|
|
72
|
+
} catch {
|
|
73
|
+
return undefined
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The pre-push condition: nothing differs from HEAD at all, untracked files included, so the commit
|
|
78
|
+
// being pushed is byte-for-byte the tree the record was taken from.
|
|
79
|
+
function is_worktree_clean(lines: ReadonlyArray<string> | undefined): boolean {
|
|
80
|
+
return lines?.length === 0
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// The pre-commit condition: the commit carries the **index**, so what must match the recorded working
|
|
84
|
+
// tree is the index rather than HEAD. Staged-only entries (`M `, `A `, `R `) pass; an unstaged edit
|
|
85
|
+
// (` M`), a partially staged file (`MM`) and an untracked file (`??`) each mean the commit is a tree no
|
|
86
|
+
// check has read, and send the hook back to the full check.
|
|
87
|
+
function is_index_matching_worktree(lines: ReadonlyArray<string> | undefined): boolean {
|
|
88
|
+
return lines?.every((line) => line[WORKTREE_COLUMN] === UNMODIFIED) === true
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
interface HookReuse {
|
|
92
|
+
// The gate's own two readings — the changed-file map and the commit it is a diff against — taken
|
|
93
|
+
// from `gate-tree.ts` rather than read a second way here.
|
|
94
|
+
tree: GateTree
|
|
95
|
+
// The hook-specific narrowing: whether what this git operation carries is the tree the record
|
|
96
|
+
// describes. `is_worktree_clean` for a push, `is_index_matching_worktree` for a commit.
|
|
97
|
+
is_tree_carried: boolean
|
|
98
|
+
extra_arguments: ReadonlyArray<string>
|
|
99
|
+
force_env: string
|
|
100
|
+
// The record to read, so a test can plant one without overwriting the record a live run relies on.
|
|
101
|
+
// `| undefined` is explicit because `exactOptionalPropertyTypes` is on: each hook passes its own
|
|
102
|
+
// optional parameter straight through, and omitting it would refuse the value it always has.
|
|
103
|
+
source?: string | undefined
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// The stamp rather than a boolean, for the same reason `gate_skip.reusable_green_gate` hands one back:
|
|
107
|
+
// the caller prints `taken_at`, and a record that does not describe this tree has no timestamp worth
|
|
108
|
+
// printing.
|
|
109
|
+
//
|
|
110
|
+
// **Any argument at all refuses the reuse**, not only the force flag. A caller who narrowed the run
|
|
111
|
+
// asked for that run rather than for a recorded result about a whole tree, and a hook's own line passes
|
|
112
|
+
// none, so this costs it nothing.
|
|
113
|
+
function reusable_green_hook(input: HookReuse): FileMapStamp | undefined {
|
|
114
|
+
if (input.extra_arguments.length > 0 || is_force_requested(input.force_env)) return undefined
|
|
115
|
+
if (!input.is_tree_carried) return undefined
|
|
116
|
+
|
|
117
|
+
return gate_skip.reusable_green_gate(input.tree.files, input.tree.base, input.source)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const hook_gate_reuse = {
|
|
121
|
+
GATE_REUSING_TARGETS,
|
|
122
|
+
is_force_requested,
|
|
123
|
+
is_index_matching_worktree,
|
|
124
|
+
is_worktree_clean,
|
|
125
|
+
read_status_lines,
|
|
126
|
+
reusable_green_hook,
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export type { HookReuse }
|
|
130
|
+
export { hook_gate_reuse }
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import type { FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
4
|
+
import { resolve_spawn_exit } from '#scripts/lib/spawn-exit'
|
|
5
|
+
import { execa } from 'execa'
|
|
6
|
+
import { gate_skip } from './gate-skip'
|
|
7
|
+
import { gate_tree, type GateTree } from './gate-tree'
|
|
8
|
+
import { hook_gate_reuse } from './hook-gate-reuse'
|
|
9
|
+
import { DEFAULT_TYPE_CHECK_ARGS, type_check_step } from './type-check-step'
|
|
10
|
+
|
|
11
|
+
// The pre-commit hook's type check, which no longer re-runs a project-wide `tsc --noEmit` that a green
|
|
12
|
+
// gate already covers (joshuafolkken/kit#1381).
|
|
13
|
+
//
|
|
14
|
+
// Measured on this repository: `pnpm exec tsc --noEmit` over the whole project takes 3.8–4.4s warm, and
|
|
15
|
+
// `pnpm josh git -y` pays it on every commit — a `fullrun` commits twice — seconds after `pnpm josh
|
|
16
|
+
// gate` printed the same project-wide type check green on the same tree. The pre-commit hook runs its
|
|
17
|
+
// commands in parallel, so that one check is what the hook's wall time was.
|
|
18
|
+
//
|
|
19
|
+
// **It is the one project-wide check left in the hook.** cspell, prettier and eslint there read only
|
|
20
|
+
// `{staged_files}`, which is a different scope from the gate's project-wide run and costs 0.3–1.0s each
|
|
21
|
+
// in parallel; skipping them would buy about half a second and would trade a narrow reading for a
|
|
22
|
+
// recorded wide one. So they are untouched, and so are `prevent-main-commit` and `secretlint`, which
|
|
23
|
+
// the gate does not run at all and which are therefore duplicates of nothing.
|
|
24
|
+
//
|
|
25
|
+
// **The decision is joshuafolkken/kit#1328's, imported rather than restated** — `hook_gate_reuse`
|
|
26
|
+
// carries what this shares with the pre-push hook (joshuafolkken/kit#1334) and defers the record
|
|
27
|
+
// comparison itself to `gate_skip.reusable_green_gate`. A hook answering "is this still the recorded
|
|
28
|
+
// tree" differently from the gate beside it would be two commands disagreeing about one tree.
|
|
29
|
+
//
|
|
30
|
+
// **What this adds is one condition, and it only ever narrows.** The record describes the **working
|
|
31
|
+
// tree**; a commit carries the **index**. Stage half of a green tree and the map still matches while the
|
|
32
|
+
// commit being made is a tree no check ever read. So the reuse also requires the index to match the
|
|
33
|
+
// working tree — which is what `pnpm josh git` leaves behind once it has staged — and any doubt whatever
|
|
34
|
+
// sends the hook back to the full check.
|
|
35
|
+
|
|
36
|
+
// The escape hatch's name; the shared reading of it is `hook_gate_reuse.is_force_requested`.
|
|
37
|
+
const FORCE_ENV = 'JOSH_PRE_COMMIT_FORCE'
|
|
38
|
+
|
|
39
|
+
const PNPM = 'pnpm'
|
|
40
|
+
|
|
41
|
+
// Exactly what `lefthook/base.yml` ran before this wrapper existed. **The set of checks is unchanged**:
|
|
42
|
+
// what changes is only whether an already-passed check is executed again on an unchanged tree.
|
|
43
|
+
const TYPE_CHECK_ARGUMENTS: ReadonlyArray<string> = ['exec', 'tsc', '--noEmit']
|
|
44
|
+
|
|
45
|
+
// What an argument this command does not take exits with. A type error's own code comes from `tsc`.
|
|
46
|
+
const REFUSED_EXIT_CODE = 1
|
|
47
|
+
|
|
48
|
+
// `process.argv` is [runner, script, ...arguments].
|
|
49
|
+
const FIRST_ARGUMENT_INDEX = 2
|
|
50
|
+
|
|
51
|
+
// The gate's own two readings plus the one this hook adds.
|
|
52
|
+
interface CommitTree extends GateTree {
|
|
53
|
+
is_index_matching_worktree: boolean
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// **The record says the gate's four checks were green; it does not say *which* type check ran.**
|
|
57
|
+
// `type-check-step.ts` resolves that per project (joshuafolkken/kit#934): a project carrying a
|
|
58
|
+
// `josh-app` / `josh-game` shim has the toolkit's `check:ci` as its gate step, and this hook's step is
|
|
59
|
+
// `tsc --noEmit`. Reusing across that difference would skip `tsc --noEmit` on the strength of a
|
|
60
|
+
// different check — a `.ts` file inside the root `tsconfig.json` but outside the one `svelte-check` is
|
|
61
|
+
// pointed at is exactly the error that would then reach a commit.
|
|
62
|
+
//
|
|
63
|
+
// So the reuse is refused wherever the two are not the same command, and the resolution is asked of
|
|
64
|
+
// `type_check_step` rather than re-derived here. **The hook's own command is unchanged either way**:
|
|
65
|
+
// what this narrows is only when an identical check is not re-run.
|
|
66
|
+
//
|
|
67
|
+
// **The `catch` is the module's invariant, not defensiveness**: a reading that could not be taken says
|
|
68
|
+
// nothing about which check ran, and "we could not tell" must resolve to running the check.
|
|
69
|
+
async function is_recorded_check_this_check(start_directory: string): Promise<boolean> {
|
|
70
|
+
try {
|
|
71
|
+
const resolved = await type_check_step.resolve_type_check_args(start_directory)
|
|
72
|
+
|
|
73
|
+
return resolved.join(' ') === DEFAULT_TYPE_CHECK_ARGS.join(' ')
|
|
74
|
+
} catch {
|
|
75
|
+
return false
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// The readings are independent, so they are started together rather than one after the other.
|
|
80
|
+
async function read_commit_tree(): Promise<CommitTree> {
|
|
81
|
+
const [tree, lines] = await Promise.all([
|
|
82
|
+
gate_tree.read_gate_tree(),
|
|
83
|
+
hook_gate_reuse.read_status_lines(),
|
|
84
|
+
])
|
|
85
|
+
|
|
86
|
+
return { ...tree, is_index_matching_worktree: hook_gate_reuse.is_index_matching_worktree(lines) }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// **The type-check identity is asked last, because it is the only reading that can spawn a process.**
|
|
90
|
+
// `resolve_type_check_args` probes a toolkit shim for its usage line, and on a project that has one the
|
|
91
|
+
// reuse is refused anyway — so asking it before the record had matched would put a subprocess on the
|
|
92
|
+
// force path, on a dirty index, and on every commit of a project that can never reuse.
|
|
93
|
+
async function reusable_green_commit(
|
|
94
|
+
tree: CommitTree,
|
|
95
|
+
extra_arguments: ReadonlyArray<string>,
|
|
96
|
+
source?: string,
|
|
97
|
+
start_directory: string = process.cwd(),
|
|
98
|
+
): Promise<FileMapStamp | undefined> {
|
|
99
|
+
const reusable = hook_gate_reuse.reusable_green_hook({
|
|
100
|
+
tree,
|
|
101
|
+
is_tree_carried: tree.is_index_matching_worktree,
|
|
102
|
+
extra_arguments,
|
|
103
|
+
force_env: FORCE_ENV,
|
|
104
|
+
source,
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
if (reusable === undefined) return undefined
|
|
108
|
+
|
|
109
|
+
return (await is_recorded_check_this_check(start_directory)) ? reusable : undefined
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// **Nothing is forwarded to `tsc`, and an argument is refused rather than dropped.** `tsc --noEmit
|
|
113
|
+
// <file>` ignores `tsconfig.json`, so forwarding a path would silently narrow the very check this
|
|
114
|
+
// command exists to run in full — and ignoring the argument in silence would look like it had been
|
|
115
|
+
// honored. `--force` is the one argument this command takes, and it is consumed here.
|
|
116
|
+
function format_refusal(unexpected: ReadonlyArray<string>): string {
|
|
117
|
+
return (
|
|
118
|
+
`✗ josh pre-commit-type-check takes no argument but \`${gate_skip.FORCE_FLAG}\`; ` +
|
|
119
|
+
`refusing ${unexpected.join(' ')}.\n` +
|
|
120
|
+
` It type-checks the whole project, so a path here would narrow the check rather than scope it.`
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function format_skip(taken_at: string): string {
|
|
125
|
+
return gate_skip.format_reuse_notice({
|
|
126
|
+
subject: 'the type check',
|
|
127
|
+
carried_clause: ', and this commit carries that same tree',
|
|
128
|
+
taken_at,
|
|
129
|
+
force_hint: `${FORCE_ENV}=1 git commit`,
|
|
130
|
+
rerun_object: 'it',
|
|
131
|
+
})
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// The exit code is resolved through `spawn-exit.ts` rather than `exitCode ?? 1`, so a spawn that never
|
|
135
|
+
// produced a code — `tsc` missing from PATH — is reported as such instead of being reported as a type
|
|
136
|
+
// error. Either way it is non-zero and the commit is blocked.
|
|
137
|
+
async function run_type_check(): Promise<number> {
|
|
138
|
+
const result = await execa(PNPM, [...TYPE_CHECK_ARGUMENTS], { stdio: 'inherit', reject: false })
|
|
139
|
+
|
|
140
|
+
return resolve_spawn_exit(PNPM, result)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function unexpected_arguments(extra_arguments: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
144
|
+
return extra_arguments.filter((argument) => argument !== gate_skip.FORCE_FLAG)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
async function run_pre_commit_type_check(
|
|
148
|
+
extra_arguments: ReadonlyArray<string> = [],
|
|
149
|
+
source?: string,
|
|
150
|
+
): Promise<number> {
|
|
151
|
+
const unexpected = unexpected_arguments(extra_arguments)
|
|
152
|
+
|
|
153
|
+
if (unexpected.length > 0) {
|
|
154
|
+
process.stderr.write(`${format_refusal(unexpected)}\n`)
|
|
155
|
+
|
|
156
|
+
return REFUSED_EXIT_CODE
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const reusable = await reusable_green_commit(await read_commit_tree(), extra_arguments, source)
|
|
160
|
+
|
|
161
|
+
if (reusable === undefined) return await run_type_check()
|
|
162
|
+
|
|
163
|
+
process.stdout.write(`${format_skip(reusable.taken_at)}\n`)
|
|
164
|
+
|
|
165
|
+
return 0
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// `process.exitCode` rather than `process.exit()`: a non-zero code has to block the commit, and exiting
|
|
169
|
+
// outright truncates a piped stdout — which for a failing type check is the output that says why.
|
|
170
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
171
|
+
process.exitCode = await run_pre_commit_type_check(process.argv.slice(FIRST_ARGUMENT_INDEX))
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const pre_commit_type_check = {
|
|
175
|
+
FORCE_ENV,
|
|
176
|
+
TYPE_CHECK_ARGUMENTS,
|
|
177
|
+
format_refusal,
|
|
178
|
+
format_skip,
|
|
179
|
+
is_recorded_check_this_check,
|
|
180
|
+
read_commit_tree,
|
|
181
|
+
reusable_green_commit,
|
|
182
|
+
run_pre_commit_type_check,
|
|
183
|
+
unexpected_arguments,
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export type { CommitTree }
|
|
187
|
+
export { pre_commit_type_check }
|