@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,531 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { availableParallelism } from 'node:os'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import type { FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
5
|
+
import { GATE_COMMAND } from '#scripts/josh/josh-command-types'
|
|
6
|
+
import { composite_arguments, USAGE_ERROR_EXIT_CODE } from '#scripts/josh/josh-composite-arguments'
|
|
7
|
+
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
8
|
+
import { buffered_process, FAIL_EXIT_CODE } from '#scripts/lib/buffered-process'
|
|
9
|
+
import { review_stamps } from '#scripts/review/review-stamps'
|
|
10
|
+
import { review_tree } from '#scripts/review/review-tree'
|
|
11
|
+
import { unit_worker_share } from '#scripts/test/unit-worker-share'
|
|
12
|
+
import { core_budget } from './core-budget'
|
|
13
|
+
import { gate_plan, type GateCheck, type GatePlan } from './gate-plan'
|
|
14
|
+
import { gate_report, type GateStep, type GateStepResult } from './gate-report'
|
|
15
|
+
import { gate_skip } from './gate-skip'
|
|
16
|
+
import { gate_tree, type GateTree } from './gate-tree'
|
|
17
|
+
import { scoped_green, type ScopedSources } from './scoped-green'
|
|
18
|
+
import { type_check_step } from './type-check-step'
|
|
19
|
+
|
|
20
|
+
// joshuafolkken/kit#914: the completion gate's four checks are independent and share no mutable
|
|
21
|
+
// state, yet every entry point ran them one after another — paid again on every `epicrun` child,
|
|
22
|
+
// every `/code-review` fix and every `halfrun` stop. Worse than the seconds: a serial gate reports
|
|
23
|
+
// one failure at a time, so a tree with a lint error and a type error costs two full round trips to
|
|
24
|
+
// discover.
|
|
25
|
+
//
|
|
26
|
+
// The margin has narrowed as the checks gained caches and is re-measured rather than repeated: on
|
|
27
|
+
// this repository today, 19.1s back to back against 15.1s together (joshuafolkken/kit#1258). How
|
|
28
|
+
// many run at once, and how wide the unit suite fans out, are `gate-plan.ts`'s to decide.
|
|
29
|
+
//
|
|
30
|
+
// Each step shells out to the `josh` sub-command that already defines it, rather than repeating the
|
|
31
|
+
// underlying tool invocations here — one definition per check, in `josh-commands-development.ts`.
|
|
32
|
+
|
|
33
|
+
// `process.argv` is [runner, script, ...arguments].
|
|
34
|
+
const FIRST_ARGUMENT_INDEX = 2
|
|
35
|
+
|
|
36
|
+
const JOSH = 'josh'
|
|
37
|
+
const { GATE_CHECKS, TYPE_CHECK_LABEL, UNIT_LABEL } = gate_plan
|
|
38
|
+
|
|
39
|
+
const GATE_TARGETS: ReadonlyArray<string> = GATE_CHECKS.map((check) => check.target)
|
|
40
|
+
|
|
41
|
+
// vitest's own flag, appended to the sub-command rather than set in `vitest.config.ts`: the config
|
|
42
|
+
// is one project's, and the number this carries is a property of the machine the gate is running
|
|
43
|
+
// on (joshuafolkken/kit#1258). `josh test:unit` forwards what it is given straight to
|
|
44
|
+
// `vitest run`, so nothing between here and vitest has to know about it.
|
|
45
|
+
const UNIT_WORKER_FLAG = '--maxWorkers'
|
|
46
|
+
|
|
47
|
+
function unit_worker_args(check: GateCheck, plan: GatePlan): ReadonlyArray<string> {
|
|
48
|
+
if (check.label !== UNIT_LABEL || plan.unit_worker_cap === undefined) return []
|
|
49
|
+
|
|
50
|
+
return [`${UNIT_WORKER_FLAG}=${String(plan.unit_worker_cap)}`]
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Only the type check is resolved per project (joshuafolkken/kit#934) — a SvelteKit project
|
|
54
|
+
// type-checks through its own toolkit, not through `tsc --noEmit`. Resolving inside the step keeps
|
|
55
|
+
// the probe concurrent with the other three checks rather than delaying every one of them.
|
|
56
|
+
async function build_gate_step(
|
|
57
|
+
check: GateCheck,
|
|
58
|
+
start_directory: string,
|
|
59
|
+
plan: GatePlan = gate_plan.resolve_gate_plan(),
|
|
60
|
+
): Promise<GateStep> {
|
|
61
|
+
if (check.label !== TYPE_CHECK_LABEL) {
|
|
62
|
+
return {
|
|
63
|
+
label: check.label,
|
|
64
|
+
command_args: [JOSH, check.target, ...unit_worker_args(check, plan)],
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return {
|
|
69
|
+
label: check.label,
|
|
70
|
+
command_args: await type_check_step.resolve_type_check_args(start_directory),
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async function build_gate_steps(
|
|
75
|
+
start_directory: string,
|
|
76
|
+
plan: GatePlan = gate_plan.resolve_gate_plan(),
|
|
77
|
+
): Promise<ReadonlyArray<GateStep>> {
|
|
78
|
+
return await Promise.all(
|
|
79
|
+
plan.checks.map(async (check) => await build_gate_step(check, start_directory, plan)),
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function run_gate_step(step: GateStep): Promise<GateStepResult> {
|
|
84
|
+
const result = await buffered_process.run_buffered_process(step.command_args)
|
|
85
|
+
|
|
86
|
+
return { label: step.label, command: step.command_args.join(' '), ...result }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// The record `josh review:brief` reads, written only on a fully green run and only with the tree it
|
|
90
|
+
// was green on (joshuafolkken/kit#1241). `/code-review` runs in a forked process that reads none of
|
|
91
|
+
// this repository's documents, so "the unit tests already passed" reaches it only if the invocation
|
|
92
|
+
// carries it — and it may only carry it if something wrote down that they did, on **this** tree.
|
|
93
|
+
//
|
|
94
|
+
// **Four things withhold the record, and every one of them is the safe direction.** A step that
|
|
95
|
+
// passed *without running* — `test-unit-guard` exits 0 with a notice when vitest is absent or the
|
|
96
|
+
// project has no tests — must not become "the unit tests all passed": the gate keeps that skip
|
|
97
|
+
// visible on the console, and a record erasing it would have the brief tell a review agent not to
|
|
98
|
+
// re-run tests that never ran. A step that passed **with a checker's warnings** is withheld for the
|
|
99
|
+
// same reason one place further on (joshuafolkken/kit#1328): since the record is now reused instead of
|
|
100
|
+
// the checks being re-run, a warning printed once would never be printed again on that tree, and
|
|
101
|
+
// hiding an eslint or svelte-check finding is the same failure as hiding a skip. It is
|
|
102
|
+
// `has_checker_warning`, not `has_warnings`, that decides this (joshuafolkken/kit#2318): the loose
|
|
103
|
+
// marker match is right for the print path, where a false positive costs one printed body, but here a
|
|
104
|
+
// false positive withholds the whole record and turns a green gate's `run:review --join` red — so a
|
|
105
|
+
// benign line from another tool (a Vite config deprecation on `test:unit`) must not withhold it. A
|
|
106
|
+
// tree that moved while
|
|
107
|
+
// the checks were in flight (the `PostToolUse` formatter, an editor save) is not the tree they read.
|
|
108
|
+
// And a failed write leaves no record at all, which a temp-directory problem must never turn into a
|
|
109
|
+
// red gate.
|
|
110
|
+
//
|
|
111
|
+
// The destination is a parameter so a test can exercise the record without overwriting the one a
|
|
112
|
+
// real run may be relying on — `josh gate` and `josh review:brief` share one path by design.
|
|
113
|
+
function has_nothing_to_say(result: GateStepResult): boolean {
|
|
114
|
+
return !gate_report.is_skip_notice(result) && !gate_report.has_checker_warning(result)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async function record_green_gate(
|
|
118
|
+
results: ReadonlyArray<GateStepResult>,
|
|
119
|
+
before: Record<string, string>,
|
|
120
|
+
target?: string,
|
|
121
|
+
base?: string,
|
|
122
|
+
): Promise<void> {
|
|
123
|
+
if (results.some((result) => !has_nothing_to_say(result))) return
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
const after = await review_tree.read_changed_tree()
|
|
127
|
+
|
|
128
|
+
if (JSON.stringify(after) !== JSON.stringify(before)) return
|
|
129
|
+
|
|
130
|
+
review_stamps.gate_stamp.write(after, target, base)
|
|
131
|
+
} catch {
|
|
132
|
+
/* no record is the safe answer */
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// The marker that says a gate is running on this tree right now (joshuafolkken/kit#1242). The gate
|
|
137
|
+
// and `/code-review` are started together — neither writes to the working tree — so by the time
|
|
138
|
+
// `josh review:brief` composes the invocation the checks are usually still in flight. Without this
|
|
139
|
+
// record that state reads as "no gate was ever run", and the review agent runs the unit suite the
|
|
140
|
+
// gate is running beside it.
|
|
141
|
+
//
|
|
142
|
+
// **Both halves swallow their failure, and for the same reason `record_green_gate` does**: the
|
|
143
|
+
// marker is a convenience for the next command and nothing about it may reach the gate's verdict. A
|
|
144
|
+
// marker that could not be written costs a brief that says `Not verified`, which is the safe
|
|
145
|
+
// direction; one that could not be cleared costs nothing beyond the file itself, because since
|
|
146
|
+
// joshuafolkken/kit#1245 the record names the writing process by pid **and** start time — so a marker
|
|
147
|
+
// this gate leaves behind reads as not running from the moment the gate exits, however long it sits
|
|
148
|
+
// there and whatever the operating system later does with that pid. The next gate overwrites it.
|
|
149
|
+
function mark_gate_running(before: Record<string, string>, target?: string): void {
|
|
150
|
+
try {
|
|
151
|
+
review_stamps.in_flight_stamp.write(before, target)
|
|
152
|
+
} catch {
|
|
153
|
+
/* no marker is the safe answer */
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function clear_gate_running(target?: string): void {
|
|
158
|
+
try {
|
|
159
|
+
review_stamps.in_flight_stamp.remove(target)
|
|
160
|
+
} catch {
|
|
161
|
+
/* the next gate overwrites it */
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// `finally`, so the marker is cleared on a red gate and a thrown check alike. A marker that outlived
|
|
166
|
+
// its gate would tell the next brief to wait for a result nobody is going to produce.
|
|
167
|
+
//
|
|
168
|
+
// The work is a parameter rather than inlined so the clearing can be exercised against a thunk that
|
|
169
|
+
// throws — running the real fan-out to prove a `finally` would cost a full gate per assertion, and
|
|
170
|
+
// the branch under test is the one the real fan-out is least likely to take.
|
|
171
|
+
async function with_gate_marker<T>(
|
|
172
|
+
before: Record<string, string>,
|
|
173
|
+
run: () => Promise<T>,
|
|
174
|
+
target?: string,
|
|
175
|
+
): Promise<T> {
|
|
176
|
+
mark_gate_running(before, target)
|
|
177
|
+
|
|
178
|
+
try {
|
|
179
|
+
return await run()
|
|
180
|
+
} finally {
|
|
181
|
+
clear_gate_running(target)
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// This gate's share of the machine, resolved once at the gate's entry and carried down as one value
|
|
186
|
+
// (joshuafolkken/kit#2351). `available_cores` is the budget every check reserves against; `is_reserved`
|
|
187
|
+
// is false for a gate nested inside another gate's unit suite — this repository's own gate tests — so
|
|
188
|
+
// the outer gate reserves and every gate beneath it does not. Captured before this gate sets
|
|
189
|
+
// `JOSH_UNIT_RUN_MARKED`, which is why it is read at entry rather than re-derived here.
|
|
190
|
+
interface BudgetContext {
|
|
191
|
+
available_cores: number
|
|
192
|
+
is_reserved: boolean
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function default_budget(): BudgetContext {
|
|
196
|
+
return {
|
|
197
|
+
available_cores: availableParallelism(),
|
|
198
|
+
is_reserved: !unit_worker_share.is_nested_run(),
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// A gate step paired with the cores it reserves from the machine-wide budget while it runs
|
|
203
|
+
// (joshuafolkken/kit#2351). The weight travels with the step so `run_gate_steps` never has to re-pair a
|
|
204
|
+
// step with its check by index.
|
|
205
|
+
interface ReservedStep {
|
|
206
|
+
step: GateStep
|
|
207
|
+
weight: number
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async function build_reserved_steps(
|
|
211
|
+
start_directory: string,
|
|
212
|
+
plan: GatePlan,
|
|
213
|
+
available_cores: number,
|
|
214
|
+
): Promise<ReadonlyArray<ReservedStep>> {
|
|
215
|
+
return await Promise.all(
|
|
216
|
+
plan.checks.map(async (check) => ({
|
|
217
|
+
step: await build_gate_step(check, start_directory, plan),
|
|
218
|
+
weight: gate_plan.check_weight(check, plan, available_cores),
|
|
219
|
+
})),
|
|
220
|
+
)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// **A nested gate takes no reservation, and the budget is what makes that necessary rather than
|
|
224
|
+
// merely tidy** (joshuafolkken/kit#2351). The unit step spawns the suite, which runs this repository's
|
|
225
|
+
// own gate tests; each of those is a gate inside the outer gate's unit reservation, and a place it
|
|
226
|
+
// claimed would wait for cores the outer gate cannot free until the suite — this test included —
|
|
227
|
+
// finishes.
|
|
228
|
+
async function run_reserved_step(
|
|
229
|
+
reserved: ReservedStep,
|
|
230
|
+
budget: BudgetContext,
|
|
231
|
+
): Promise<GateStepResult> {
|
|
232
|
+
if (!budget.is_reserved) return await run_gate_step(reserved.step)
|
|
233
|
+
|
|
234
|
+
return await core_budget.with_core_reservation(
|
|
235
|
+
reserved.weight,
|
|
236
|
+
async () => await run_gate_step(reserved.step),
|
|
237
|
+
{ budget: budget.available_cores },
|
|
238
|
+
)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// `bounded_pool` rather than a bare `Promise.all`, so the plan's `concurrency` is what decides how
|
|
242
|
+
// many run at once (joshuafolkken/kit#1258). **The all-failures-in-one-pass property survives the
|
|
243
|
+
// change** because no check ever rejects: `buffered_process` reports a non-zero exit as a value, so
|
|
244
|
+
// the pool's first-failure abort — written for callers that spawn real Claude sessions — never
|
|
245
|
+
// fires here and every queued check still runs. Results come back in input order however they
|
|
246
|
+
// finished, which is what keeps the printed sections in declaration order. Each step first claims its
|
|
247
|
+
// place in the machine-wide budget and waits while the budget is full (joshuafolkken/kit#2351).
|
|
248
|
+
async function run_gate_steps(
|
|
249
|
+
plan: GatePlan,
|
|
250
|
+
budget: BudgetContext = default_budget(),
|
|
251
|
+
): Promise<ReadonlyArray<GateStepResult>> {
|
|
252
|
+
const reserved = await build_reserved_steps(process.cwd(), plan, budget.available_cores)
|
|
253
|
+
|
|
254
|
+
return await bounded_pool.bounded_map(
|
|
255
|
+
reserved,
|
|
256
|
+
plan.concurrency,
|
|
257
|
+
async (entry) => await run_reserved_step(entry, budget),
|
|
258
|
+
)
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// **Both markers are claims about the unit suite, so a gate that is not running it makes neither**
|
|
262
|
+
// (joshuafolkken/kit#1226). The in-flight marker tells the next `josh review:brief` that a gate is
|
|
263
|
+
// covering this tree right now, which is what stops a review agent re-running the suite; the
|
|
264
|
+
// unit-run marker tells a sibling lane a vitest run is on the machine, which is what makes that
|
|
265
|
+
// lane divide its own workers. A `--no-unit` gate that wrote either would be answering for a check
|
|
266
|
+
// it never started — the first by telling a review the tests are covered when they are running in a
|
|
267
|
+
// different CI job, the second by throttling a lane on its behalf.
|
|
268
|
+
//
|
|
269
|
+
// **The work the markers cover ends at the green record, not at the last check** (joshuafolkken/kit#2434).
|
|
270
|
+
// Cleared before `record_green_gate` wrote, the in-flight marker left a gap of tens of milliseconds in
|
|
271
|
+
// which `run:review --join` read neither a running gate nor a green one — and answered RED for a gate
|
|
272
|
+
// that was about to record green. Cleared after it, a reader that sees no marker is reading a gate
|
|
273
|
+
// whose green record, if it has one, is already on disk.
|
|
274
|
+
async function run_marked_gate<T>(
|
|
275
|
+
before: Record<string, string>,
|
|
276
|
+
plan: GatePlan,
|
|
277
|
+
work: () => Promise<T>,
|
|
278
|
+
marker_path?: string,
|
|
279
|
+
): Promise<T> {
|
|
280
|
+
if (!gate_plan.has_unit_check(plan.checks)) return await work()
|
|
281
|
+
|
|
282
|
+
return await unit_worker_share.with_run_marker(
|
|
283
|
+
async () => await with_gate_marker(before, work, marker_path),
|
|
284
|
+
)
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// The plan goes above the checks rather than beside the summary: it is what the durations under it
|
|
288
|
+
// are read against, and a reader who scrolls to the failing check has already passed it.
|
|
289
|
+
//
|
|
290
|
+
// The core count is read once and handed to both calls. Letting each default to
|
|
291
|
+
// `availableParallelism()` would be two independent reads, and a quota changed between them prints
|
|
292
|
+
// a core count the plan was not derived from — the one misreading this line exists to prevent.
|
|
293
|
+
// The concurrent-run count is read here rather than inside `gate-plan.ts` for the reason the core
|
|
294
|
+
// count already is: that module stays a pure function of its inputs, and the machine is asked once and
|
|
295
|
+
// handed to both calls. Counted *before* the unit step writes its own marker, so `+ 1` is this gate
|
|
296
|
+
// (joshuafolkken/kit#1515).
|
|
297
|
+
function announce_gate_plan(is_unit_included: boolean, available_cores: number): GatePlan {
|
|
298
|
+
const concurrent_runs = unit_worker_share.live_run_count() + unit_worker_share.SOLO_RUNS
|
|
299
|
+
const plan = gate_plan.resolve_gate_plan(available_cores, concurrent_runs, is_unit_included)
|
|
300
|
+
|
|
301
|
+
process.stdout.write(`${gate_plan.format_gate_plan(plan, available_cores, concurrent_runs)}\n`)
|
|
302
|
+
|
|
303
|
+
return plan
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// `stamp_path` is one option rather than a read path and a write path, because it is one record: the
|
|
307
|
+
// green gate this run may reuse is the green gate this run would write. A test that planted a record
|
|
308
|
+
// somewhere and let the run record its own elsewhere would be exercising a pair the real command does
|
|
309
|
+
// not have. `marker_path` is the in-flight marker's counterpart, and it exists for the same reason
|
|
310
|
+
// the other destinations are parameters: this suite runs *inside* `pnpm josh gate`, so a test writing
|
|
311
|
+
// to the shared marker would clear the live gate's own.
|
|
312
|
+
interface GateOptions {
|
|
313
|
+
is_verbose?: boolean
|
|
314
|
+
is_forced?: boolean
|
|
315
|
+
// Whether the unit suite is one of this gate's checks. Defaults to true everywhere; only
|
|
316
|
+
// `--no-unit` turns it off, for the CI job that runs the suite on a runner of its own.
|
|
317
|
+
is_unit_included?: boolean
|
|
318
|
+
stamp_path?: string
|
|
319
|
+
marker_path?: string
|
|
320
|
+
// The gate log's destination, a parameter for the same reason the two above are: this suite runs
|
|
321
|
+
// inside `pnpm josh gate`, so a test writing to the shared path would overwrite the live gate's
|
|
322
|
+
// own log with the output of four checks that never ran.
|
|
323
|
+
log_path?: string
|
|
324
|
+
// **The scoped pre-check the CLI entry turns on** (joshuafolkken/kit#2296). Off everywhere else so
|
|
325
|
+
// that a direct `run_verification_gate` call — the whole of `verification-gate.test.ts` — is never
|
|
326
|
+
// refused by a real checkout's missing scoped record; `run_gate_command` sets it true.
|
|
327
|
+
is_scoped_enforced?: boolean
|
|
328
|
+
// The scoped records' paths, overridable so a test can plant a green pair rather than depend on the
|
|
329
|
+
// surrounding checkout's — the reason `scoped-green.ts` takes a `source` per stamp.
|
|
330
|
+
scoped_sources?: ScopedSources
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// **The gate refuses to start when the scoped pair has not been green on this tree**
|
|
334
|
+
// (joshuafolkken/kit#2296) — the same record `josh review:brief` reads, applied one step earlier so the
|
|
335
|
+
// first gate is the only gate. It is the CLI entry's check alone (`is_scoped_enforced`), and it never
|
|
336
|
+
// fires for CI's `--no-unit` gate or a `--force` run: CI has no scoped record in front of it, and
|
|
337
|
+
// `--force` is the caller saying to run regardless. `scoped_green` owns the record and the `JOSH_SCOPED_GREEN`
|
|
338
|
+
// escape hatch, so a person can always get past a record that is wrong about their tree.
|
|
339
|
+
function scoped_precheck_refusal(tree: GateTree, options: GateOptions): string | undefined {
|
|
340
|
+
if (options.is_scoped_enforced !== true) return undefined
|
|
341
|
+
if (options.is_forced === true || options.is_unit_included === false) return undefined
|
|
342
|
+
|
|
343
|
+
return scoped_green.refusal_for(tree.files, tree.base, options.scoped_sources)
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// **A partial gate records nothing green, and this is the same rule as the skip one layer out**
|
|
347
|
+
// (joshuafolkken/kit#1226). The record's whole meaning to `josh review:brief` and to `gate_skip` is
|
|
348
|
+
// "every check this repository gates on passed on exactly this tree"; a `--no-unit` run proves three
|
|
349
|
+
// of the four, so writing it would let the next full `josh gate` be skipped on a tree whose unit
|
|
350
|
+
// suite nobody ran here — a check reporting success without having run, which is the state
|
|
351
|
+
// joshuafolkken/kit#1224 exists to refuse.
|
|
352
|
+
async function record_whole_gate(
|
|
353
|
+
plan: GatePlan,
|
|
354
|
+
results: ReadonlyArray<GateStepResult>,
|
|
355
|
+
tree: GateTree,
|
|
356
|
+
options: GateOptions,
|
|
357
|
+
): Promise<void> {
|
|
358
|
+
if (!gate_plan.has_unit_check(plan.checks)) return
|
|
359
|
+
|
|
360
|
+
await record_green_gate(results, tree.files, options.stamp_path, tree.base)
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Reports the checks and records a green result — inside the markers, so the in-flight one outlives
|
|
364
|
+
// the record it announces (joshuafolkken/kit#2434).
|
|
365
|
+
async function settle_gate(
|
|
366
|
+
plan: GatePlan,
|
|
367
|
+
results: ReadonlyArray<GateStepResult>,
|
|
368
|
+
tree: GateTree,
|
|
369
|
+
options: GateOptions & { started_at: number },
|
|
370
|
+
): Promise<number> {
|
|
371
|
+
const failed_labels = gate_report.report_gate_steps(results, {
|
|
372
|
+
is_verbose: options.is_verbose ?? false,
|
|
373
|
+
log_path: options.log_path,
|
|
374
|
+
elapsed_ms: performance.now() - options.started_at,
|
|
375
|
+
step_count: String(plan.checks.length),
|
|
376
|
+
})
|
|
377
|
+
|
|
378
|
+
if (failed_labels.length > 0) return FAIL_EXIT_CODE
|
|
379
|
+
|
|
380
|
+
await record_whole_gate(plan, results, tree, options)
|
|
381
|
+
|
|
382
|
+
return 0
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// The plan line is printed by the checked path alone. A run that announced a four-way fan-out and
|
|
386
|
+
// then skipped would be describing something that never happened, and the skip's own line already
|
|
387
|
+
// says everything there is to say about a gate that started no process. The reporting itself is
|
|
388
|
+
// `gate-report.ts`'s (joshuafolkken/kit#2296).
|
|
389
|
+
async function run_checked_gate(
|
|
390
|
+
tree: GateTree,
|
|
391
|
+
options: GateOptions,
|
|
392
|
+
started_at: number,
|
|
393
|
+
): Promise<number> {
|
|
394
|
+
const is_unit_included = options.is_unit_included ?? true
|
|
395
|
+
// Resolved at the gate's entry, before this gate sets `JOSH_UNIT_RUN_MARKED`, so a gate nested in the
|
|
396
|
+
// unit suite reads the flag as set and reserves nothing (joshuafolkken/kit#2351).
|
|
397
|
+
const budget = default_budget()
|
|
398
|
+
const plan = announce_gate_plan(is_unit_included, budget.available_cores)
|
|
399
|
+
|
|
400
|
+
// **The gate holds the unit-run marker for its whole run, not just its unit step.** The step that
|
|
401
|
+
// would write it is a subprocess started a second or so after the count above, so two lanes launched
|
|
402
|
+
// together — the shape `epicrun` produces — would both read "nothing else is running" and both take
|
|
403
|
+
// the whole machine. Claimed here, after the count and before any check, it is already there when
|
|
404
|
+
// the next lane asks; the guard inside the spawned `josh test:unit` sees the handoff and adds no
|
|
405
|
+
// second marker for the same run (joshuafolkken/kit#1515).
|
|
406
|
+
async function run_and_settle(): Promise<number> {
|
|
407
|
+
const results = await run_gate_steps(plan, budget)
|
|
408
|
+
|
|
409
|
+
return await settle_gate(plan, results, tree, { ...options, started_at })
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
return await run_marked_gate(tree.files, plan, run_and_settle, options.marker_path)
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// `--force` is answered here rather than inside `gate_skip`, so the module stays about what the
|
|
416
|
+
// record can prove and this one stays about what the caller asked for.
|
|
417
|
+
function reusable_stamp(tree: GateTree, options: GateOptions): FileMapStamp | undefined {
|
|
418
|
+
if (options.is_forced === true) return undefined
|
|
419
|
+
|
|
420
|
+
return gate_skip.reusable_green_gate(tree.files, tree.base, options.stamp_path)
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// The two ways a gate ends before it runs a check: a green record it can reuse (exit 0), and the
|
|
424
|
+
// scoped pre-check refusing a tree the pair has not been green on (exit 1). `undefined` means neither
|
|
425
|
+
// fired and the checks run. **Nothing else stands between the skip and the checks** (joshuafolkken/kit#1486):
|
|
426
|
+
// joshuafolkken/kit#1437's `package.json` refusal was removed once children stopped bumping.
|
|
427
|
+
function short_circuit_gate(tree: GateTree, options: GateOptions): number | undefined {
|
|
428
|
+
const reusable = reusable_stamp(tree, options)
|
|
429
|
+
|
|
430
|
+
if (reusable !== undefined) {
|
|
431
|
+
process.stdout.write(`${gate_skip.format_skip(reusable.taken_at)}\n`)
|
|
432
|
+
|
|
433
|
+
return 0
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
const scoped_refusal = scoped_precheck_refusal(tree, options)
|
|
437
|
+
|
|
438
|
+
if (scoped_refusal === undefined) return undefined
|
|
439
|
+
|
|
440
|
+
process.stderr.write(`${scoped_refusal}\n`)
|
|
441
|
+
|
|
442
|
+
return FAIL_EXIT_CODE
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
async function run_verification_gate(options: GateOptions = {}): Promise<number> {
|
|
446
|
+
// Started before the tree read, so the total is what the caller waited for rather than what the
|
|
447
|
+
// four checks alone took — the gate's own bookkeeping is part of the wait either way.
|
|
448
|
+
const started_at = performance.now()
|
|
449
|
+
const tree = await gate_tree.read_gate_tree()
|
|
450
|
+
const short_circuit = short_circuit_gate(tree, options)
|
|
451
|
+
|
|
452
|
+
if (short_circuit !== undefined) return short_circuit
|
|
453
|
+
|
|
454
|
+
return await run_checked_gate(tree, options, started_at)
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// `josh gate` fans out to four sub-commands and forwards nothing to them, so an appended flag
|
|
458
|
+
// would vanish exactly the way it does behind an `sh -c` composite — a run that looks configured
|
|
459
|
+
// and is not. The composite guard only inspects `shell` entries, so a `script` entry that fans out
|
|
460
|
+
// has to refuse for itself; the message comes from that guard so the two read identically.
|
|
461
|
+
// `--verbose` and `--force` are consumed here rather than forwarded, which is why they do not fall
|
|
462
|
+
// foul of the refusal above: the refusal exists because a forwarded flag vanishes into the
|
|
463
|
+
// sub-commands, and a flag the gate reads itself never reaches them. Every other argument is still
|
|
464
|
+
// refused.
|
|
465
|
+
const VERBOSE_FLAG = '--verbose'
|
|
466
|
+
// Read here and never forwarded, exactly as the two above are: it selects which sub-commands the
|
|
467
|
+
// gate fans out to rather than being passed to one of them.
|
|
468
|
+
const NO_UNIT_FLAG = '--no-unit'
|
|
469
|
+
const ACCEPTED_FLAGS: ReadonlyArray<string> = [VERBOSE_FLAG, gate_skip.FORCE_FLAG, NO_UNIT_FLAG]
|
|
470
|
+
|
|
471
|
+
// The flags are the caller's, the destinations are the run's, so the two are merged here rather than
|
|
472
|
+
// letting an option override a flag the user typed.
|
|
473
|
+
async function run_gate_command(
|
|
474
|
+
extra_arguments: ReadonlyArray<string>,
|
|
475
|
+
options: GateOptions = {},
|
|
476
|
+
): Promise<number> {
|
|
477
|
+
const unknown = extra_arguments.filter((argument) => !ACCEPTED_FLAGS.includes(argument))
|
|
478
|
+
|
|
479
|
+
if (unknown.length > 0) {
|
|
480
|
+
// The shared refusal, plus the arguments it is actually about. Some flags are accepted, so the
|
|
481
|
+
// bare "takes no extra arguments" would send a reader to drop the ones that work. The list is
|
|
482
|
+
// interpolated rather than spelled out here, so adding a flag cannot leave this line stale.
|
|
483
|
+
process.stderr.write(
|
|
484
|
+
`${composite_arguments.format_rejection(GATE_COMMAND, GATE_TARGETS)}\n` +
|
|
485
|
+
` refused: ${unknown.join(' ')}\n` +
|
|
486
|
+
` accepted here: ${ACCEPTED_FLAGS.join(' ')}\n`,
|
|
487
|
+
)
|
|
488
|
+
|
|
489
|
+
return USAGE_ERROR_EXIT_CODE
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
return await run_verification_gate({
|
|
493
|
+
is_scoped_enforced: true,
|
|
494
|
+
...options,
|
|
495
|
+
is_verbose: extra_arguments.includes(VERBOSE_FLAG),
|
|
496
|
+
is_forced: extra_arguments.includes(gate_skip.FORCE_FLAG),
|
|
497
|
+
is_unit_included: !extra_arguments.includes(NO_UNIT_FLAG),
|
|
498
|
+
})
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// `process.exitCode` rather than `process.exit()`: the gate's output is buffered per step and
|
|
502
|
+
// written all at once, and `process.exit()` truncates a piped stdout at its buffer size — the
|
|
503
|
+
// summary, written last, is the first thing lost. Setting the code lets the writes drain and the
|
|
504
|
+
// process end on its own, which it can, since every child has already exited by here.
|
|
505
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
506
|
+
process.exitCode = await run_gate_command(process.argv.slice(FIRST_ARGUMENT_INDEX))
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
const verification_gate = {
|
|
510
|
+
ACCEPTED_FLAGS,
|
|
511
|
+
NO_UNIT_FLAG,
|
|
512
|
+
UNIT_WORKER_FLAG,
|
|
513
|
+
VERBOSE_FLAG,
|
|
514
|
+
build_gate_step,
|
|
515
|
+
build_gate_steps,
|
|
516
|
+
clear_gate_running,
|
|
517
|
+
mark_gate_running,
|
|
518
|
+
record_green_gate,
|
|
519
|
+
run_gate_steps,
|
|
520
|
+
run_marked_gate,
|
|
521
|
+
scoped_precheck_refusal,
|
|
522
|
+
with_gate_marker,
|
|
523
|
+
run_checked_gate,
|
|
524
|
+
run_gate_command,
|
|
525
|
+
run_gate_step,
|
|
526
|
+
run_verification_gate,
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
export type { GateOptions }
|
|
530
|
+
export type { GateStep, GateStepResult } from './gate-report'
|
|
531
|
+
export { GATE_TARGETS, verification_gate }
|