@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,146 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { gate_skip } from '#scripts/gate/gate-skip'
|
|
4
|
+
import { gate_tree, type GateTree } from '#scripts/gate/gate-tree'
|
|
5
|
+
import { hook_gate_reuse } from '#scripts/gate/hook-gate-reuse'
|
|
6
|
+
import type { FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
7
|
+
import { test_unit_guard } from '#scripts/test/test-unit-guard'
|
|
8
|
+
|
|
9
|
+
// The pre-push hook's unit run, which no longer re-runs a suite a green gate already covers
|
|
10
|
+
// (joshuafolkken/kit#1334).
|
|
11
|
+
//
|
|
12
|
+
// Measured on joshuafolkken/kit#1326: `pnpm josh git -y` took 40 seconds, 15.9 of them the pre-push
|
|
13
|
+
// `vitest run` — started 40 seconds after `pnpm josh gate` had printed all four checks green on that
|
|
14
|
+
// same tree, with nothing edited in between. The gate had written the record down and the hook was
|
|
15
|
+
// the one reader that never looked at it.
|
|
16
|
+
//
|
|
17
|
+
// **The decision is joshuafolkken/kit#1328's, imported rather than restated.** "There is a green
|
|
18
|
+
// record and nothing it covers has moved" is one question, and a hook answering it differently from
|
|
19
|
+
// the gate beside it would be two commands disagreeing about the same tree — the clone `CLAUDE.md`
|
|
20
|
+
// prohibits. So `gate_skip.reusable_green_gate` decides all three of its conditions here too: the
|
|
21
|
+
// file map matches, the **base commit** the map is a diff against matches, and the map is non-empty.
|
|
22
|
+
//
|
|
23
|
+
// **What this hook shares with the pre-commit type check is `hook-gate-reuse.ts`**
|
|
24
|
+
// (joshuafolkken/kit#1381): the escape hatch, the pre-filter in front of the record and the one
|
|
25
|
+
// `git status` reading both narrow themselves from. Only the narrowing itself is written here, because
|
|
26
|
+
// only it is about a push.
|
|
27
|
+
//
|
|
28
|
+
// **What this adds is one condition, and it only ever narrows.** A commit changes nothing outside
|
|
29
|
+
// this checkout; a push puts code where other people and CI read it, so an unverified commit reaching
|
|
30
|
+
// the remote is the failure this must not have. The gate's record describes the **working tree**, and
|
|
31
|
+
// a push carries **HEAD** — the same thing only while nothing is uncommitted. Commit half of a green
|
|
32
|
+
// tree and the map still matches while the commit being pushed is a tree no check ever read. So the
|
|
33
|
+
// reuse also requires a clean working tree, which is exactly what `josh git` leaves behind when it
|
|
34
|
+
// commits before pushing, and any doubt whatever sends the hook back to the full suite.
|
|
35
|
+
//
|
|
36
|
+
// **`audit` is untouched.** The gate does not run it, so it is not a duplicate of anything.
|
|
37
|
+
|
|
38
|
+
// The escape hatch's name; the shared reading of it is `hook_gate_reuse.is_force_requested`.
|
|
39
|
+
const FORCE_ENV = 'JOSH_PRE_PUSH_FORCE'
|
|
40
|
+
|
|
41
|
+
// The gate's own two readings — the changed-file map and the commit it is a diff against, taken from
|
|
42
|
+
// `gate-tree.ts` rather than read a second way here — plus the one this hook adds.
|
|
43
|
+
interface PushTree extends GateTree {
|
|
44
|
+
is_clean: boolean
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// `git status --porcelain` prints one line per difference from HEAD, untracked files included — so an
|
|
48
|
+
// empty output is the whole of "what this push carries is what the record was taken from". Untracked
|
|
49
|
+
// files count: the gate's map covers them, and one left behind is content the record was green on
|
|
50
|
+
// that the pushed commit does not have. An unreadable status fails toward running the suite, like
|
|
51
|
+
// every other read here.
|
|
52
|
+
//
|
|
53
|
+
// The readings are independent, so they are started together rather than one after the other.
|
|
54
|
+
async function read_push_tree(): Promise<PushTree> {
|
|
55
|
+
const [tree, lines] = await Promise.all([
|
|
56
|
+
gate_tree.read_gate_tree(),
|
|
57
|
+
hook_gate_reuse.read_status_lines(),
|
|
58
|
+
])
|
|
59
|
+
|
|
60
|
+
return { ...tree, is_clean: hook_gate_reuse.is_worktree_clean(lines) }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// `--force` is the gate's own flag, reused rather than respelled: it and `JOSH_PRE_PUSH_FORCE` are
|
|
64
|
+
// one instruction in the two places a person gives it — typing the command, and pushing through the
|
|
65
|
+
// hook, whose line carries no flags of its own. It is consumed here rather than forwarded, because
|
|
66
|
+
// vitest would refuse it.
|
|
67
|
+
function forwarded_arguments(extra_arguments: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
68
|
+
return extra_arguments.filter((argument) => argument !== gate_skip.FORCE_FLAG)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The stamp rather than a boolean, for the same reason `gate_skip` hands one back: the caller prints
|
|
72
|
+
// `taken_at`, and a record that does not describe this tree has no timestamp worth printing.
|
|
73
|
+
//
|
|
74
|
+
// **Any argument at all refuses the reuse**, not only `--force`. Everything else is forwarded to
|
|
75
|
+
// vitest, and a caller who narrowed the run to one spec asked for that run rather than for a
|
|
76
|
+
// recorded result about a whole tree. The hook's own line passes none, so this costs it nothing.
|
|
77
|
+
function reusable_green_push(
|
|
78
|
+
tree: PushTree,
|
|
79
|
+
extra_arguments: ReadonlyArray<string>,
|
|
80
|
+
source?: string,
|
|
81
|
+
): FileMapStamp | undefined {
|
|
82
|
+
return hook_gate_reuse.reusable_green_hook({
|
|
83
|
+
tree,
|
|
84
|
+
is_tree_carried: tree.is_clean,
|
|
85
|
+
extra_arguments,
|
|
86
|
+
force_env: FORCE_ENV,
|
|
87
|
+
source,
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// **The sentence claims the result, never merely the omission.** "unit tests skipped" reads as "not
|
|
92
|
+
// verified", which is the one thing this line must not be mistaken for while the push it precedes
|
|
93
|
+
// goes on to the remote. So it says what passed, on which tree, when, and how to run it anyway — in
|
|
94
|
+
// the one sentence every reader of the record shares (joshuafolkken/kit#1381).
|
|
95
|
+
function format_skip(taken_at: string): string {
|
|
96
|
+
return gate_skip.format_reuse_notice({
|
|
97
|
+
subject: 'the unit tests',
|
|
98
|
+
carried_clause: ', and this push carries that same tree',
|
|
99
|
+
taken_at,
|
|
100
|
+
force_hint: `${FORCE_ENV}=1 git push`,
|
|
101
|
+
rerun_object: 'them',
|
|
102
|
+
})
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// The suite is run through the guard `josh test:unit` uses rather than a bare `vitest run`, so a
|
|
106
|
+
// project with no vitest prints a skip notice instead of failing the push — the behavior the hook's
|
|
107
|
+
// other commands already have. **A project that has vitest and no test file at all fails the push
|
|
108
|
+
// instead** (joshuafolkken/kit#1224): the guard treats that half as a broken state rather than a
|
|
109
|
+
// young project, and the hook returns what the guard returns.
|
|
110
|
+
async function run_pre_push_unit(
|
|
111
|
+
extra_arguments: ReadonlyArray<string> = [],
|
|
112
|
+
source?: string,
|
|
113
|
+
): Promise<number> {
|
|
114
|
+
const reusable = reusable_green_push(await read_push_tree(), extra_arguments, source)
|
|
115
|
+
|
|
116
|
+
if (reusable === undefined) {
|
|
117
|
+
return await test_unit_guard.run_guarded_unit(
|
|
118
|
+
process.cwd(),
|
|
119
|
+
forwarded_arguments(extra_arguments),
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
process.stdout.write(`${format_skip(reusable.taken_at)}\n`)
|
|
124
|
+
|
|
125
|
+
return 0
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// `process.exitCode` rather than `process.exit()`: a non-zero code has to block the push, and exiting
|
|
129
|
+
// outright truncates a piped stdout — which for a failing suite is the output that says why.
|
|
130
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
131
|
+
// `process.argv` is [runner, script, ...arguments].
|
|
132
|
+
const FIRST_ARGUMENT_INDEX = 2
|
|
133
|
+
|
|
134
|
+
process.exitCode = await run_pre_push_unit(process.argv.slice(FIRST_ARGUMENT_INDEX))
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const pre_push_unit = {
|
|
138
|
+
FORCE_ENV,
|
|
139
|
+
format_skip,
|
|
140
|
+
forwarded_arguments,
|
|
141
|
+
read_push_tree,
|
|
142
|
+
reusable_green_push,
|
|
143
|
+
run_pre_push_unit,
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export { pre_push_unit }
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { text } from 'node:stream/consumers'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { duplicate_read_outcome } from '#scripts/delegation/duplicate-read-guard'
|
|
5
|
+
import { investigation_refusal } from '#scripts/delegation/investigation-guard'
|
|
6
|
+
import { hook_decision, type GuardOutcome } from '#scripts/josh/hook-decision'
|
|
7
|
+
import { delivered_rules } from '#scripts/rules/delivered-rules'
|
|
8
|
+
import { run_watcher_hook } from '#scripts/run/run-watcher-hook'
|
|
9
|
+
import { batch_outcome } from './batch-guard'
|
|
10
|
+
|
|
11
|
+
// One PreToolUse process for the three guards that used to be three (joshuafolkken/kit#1930). A Bash
|
|
12
|
+
// call used to spawn `batch:guard`, `investigation:guard` and `rule:guard` separately — three pnpm
|
|
13
|
+
// launches on top of the tool call — while consumers paid that thrice on every guarded call. The
|
|
14
|
+
// three share one shell (`hook-decision.ts`): the same payload schema, the same deny envelope, the
|
|
15
|
+
// same `.env` load. So the consolidation is a composition, not a rewrite — each guard's own
|
|
16
|
+
// `refusal` / `outcome` is called, unchanged, on the one payload this process reads.
|
|
17
|
+
//
|
|
18
|
+
// **The verdict is identical to running the three in turn**, and that is the whole point. Each guard
|
|
19
|
+
// self-gates on the tool name inside its own `is_candidate` / trigger, so running all three on the
|
|
20
|
+
// union matcher (`Bash|Edit|Read|Write|AskUserQuestion`) refuses exactly what the three separate
|
|
21
|
+
// entries did — `AskUserQuestion` is matched for the rule guard's lane-child interactive-ask row
|
|
22
|
+
// (joshuafolkken/kit#2201), and the batching and investigation guards self-gate away from it. A
|
|
23
|
+
// refusal from any guard wins first; only when none refuses is the batch guard's non-blocking notice
|
|
24
|
+
// (the whole-file-write notice, joshuafolkken/kit#1848) emitted. Each guard still honours its own
|
|
25
|
+
// switch (`JOSH_BATCH_GUARD` / `JOSH_INVESTIGATION_GUARD` / `JOSH_RULE_GUARD`) internally, so this
|
|
26
|
+
// process needs no switch of its own.
|
|
27
|
+
|
|
28
|
+
// Fold the guards' verdicts into one. A refusal wins over everything else, and the batch guard's
|
|
29
|
+
// reason is shown first to match the entry order the separate hooks had. When nothing refuses,
|
|
30
|
+
// whatever the batch guard reported (a notice, a fault, or nothing) passes through untouched.
|
|
31
|
+
function combine_outcomes(batch: GuardOutcome, extra_reason: string | undefined): GuardOutcome {
|
|
32
|
+
if (batch.reason !== undefined) return batch
|
|
33
|
+
|
|
34
|
+
if (extra_reason !== undefined) {
|
|
35
|
+
return { reason: extra_reason, notice: undefined, fault: undefined }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return batch
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function is_clear(outcome: GuardOutcome): boolean {
|
|
42
|
+
return outcome.reason === undefined && outcome.notice === undefined && outcome.fault === undefined
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// The duplicate-read guard is `notice`-mode in a lane child, so it is the second guard that can raise a
|
|
46
|
+
// non-refusal notice (joshuafolkken/kit#2298). Its notice is surfaced only where nothing else spoke —
|
|
47
|
+
// a refusal from any guard, or the batch guard's own notice, wins first.
|
|
48
|
+
function with_duplicate_notice(combined: GuardOutcome, notice: string | undefined): GuardOutcome {
|
|
49
|
+
if (notice === undefined || !is_clear(combined)) return combined
|
|
50
|
+
|
|
51
|
+
return { reason: undefined, notice, fault: undefined }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// All guards run unconditionally, exactly as the separate PreToolUse entries did: each records its own
|
|
55
|
+
// once-per-run stamp, so short-circuiting on the first refusal would change which guard is allowed to
|
|
56
|
+
// fire on a later call.
|
|
57
|
+
function pretool_outcome(raw_payload: string): GuardOutcome {
|
|
58
|
+
const batch = batch_outcome(raw_payload)
|
|
59
|
+
const investigation = investigation_refusal(raw_payload)
|
|
60
|
+
const duplicate = duplicate_read_outcome(raw_payload)
|
|
61
|
+
const rule = delivered_rules.delivery(raw_payload)
|
|
62
|
+
const duplicate_refusal = duplicate.reason
|
|
63
|
+
const combined = combine_outcomes(batch, investigation ?? duplicate_refusal ?? rule)
|
|
64
|
+
|
|
65
|
+
return with_duplicate_notice(combined, duplicate.notice)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// The watcher guard is the one composed rule that cannot answer synchronously — it reads the lane
|
|
69
|
+
// registry and the watcher's life record off disk (joshuafolkken/kit#2353). So it is asked after the
|
|
70
|
+
// synchronous guards and only where they stayed clear: a refusal from any of them wins first, exactly
|
|
71
|
+
// as `combine_outcomes` orders them, and the watcher's refusal fills a clear verdict rather than
|
|
72
|
+
// overriding one. It fires once per run itself (`run-watcher-hook.ts`), so a stale watcher refuses the
|
|
73
|
+
// first call but not the `pnpm josh run:progress --wait` that fixes it.
|
|
74
|
+
async function pretool_outcome_async(raw_payload: string): Promise<GuardOutcome> {
|
|
75
|
+
const base = pretool_outcome(raw_payload)
|
|
76
|
+
|
|
77
|
+
if (!is_clear(base)) return base
|
|
78
|
+
|
|
79
|
+
const reason = await run_watcher_hook.watcher_hook_reason(raw_payload)
|
|
80
|
+
|
|
81
|
+
return reason === undefined ? base : { reason, notice: undefined, fault: undefined }
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const pretool_guard = { combine_outcomes, pretool_outcome, pretool_outcome_async }
|
|
85
|
+
|
|
86
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
87
|
+
if (process.stdin.isTTY) hook_decision.report_no_payload('pretool:guard')
|
|
88
|
+
else {
|
|
89
|
+
const raw_payload = await text(process.stdin)
|
|
90
|
+
|
|
91
|
+
hook_decision.load_environment_file()
|
|
92
|
+
hook_decision.emit_outcome(await pretool_outcome_async(raw_payload))
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export { pretool_guard, pretool_outcome, pretool_outcome_async }
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { git_command } from '#scripts/git/git-command'
|
|
4
|
+
|
|
5
|
+
interface CheckResult {
|
|
6
|
+
success: boolean
|
|
7
|
+
message: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
async function check_main_branch(): Promise<CheckResult> {
|
|
11
|
+
const current_branch = await git_command.branch()
|
|
12
|
+
const default_branch = await git_command.get_default_branch()
|
|
13
|
+
|
|
14
|
+
if (current_branch === default_branch) {
|
|
15
|
+
return {
|
|
16
|
+
success: false,
|
|
17
|
+
message:
|
|
18
|
+
`🚫 Error: Direct commits to main branch are not allowed\n` +
|
|
19
|
+
` Please create a new branch and commit there:\n` +
|
|
20
|
+
` git checkout -b feature/your-feature-name\n`,
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return { success: true, message: `✅ Branch check passed: '${current_branch}'` }
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function main(): Promise<void> {
|
|
28
|
+
const result = await check_main_branch()
|
|
29
|
+
|
|
30
|
+
console.info(result.message)
|
|
31
|
+
|
|
32
|
+
if (!result.success) process.exit(1)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
|
|
36
|
+
|
|
37
|
+
export { check_main_branch }
|
|
38
|
+
export type { CheckResult }
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
// The `UserPromptSubmit` hook commands declared in a `.claude/settings.json`
|
|
5
|
+
// (joshuafolkken/kit#1151).
|
|
6
|
+
//
|
|
7
|
+
// What these commands echo is injected into **every** user turn and then re-read as accumulated
|
|
8
|
+
// context on every turn after it, which is why joshuafolkken/kit#967 put a ceiling on their size and
|
|
9
|
+
// why `josh cost` names them in the resident breakdown. Two readers, one parser: the suite that
|
|
10
|
+
// enforces the ceiling and the report that prices it must agree on what is being measured, or the
|
|
11
|
+
// ceiling guards a quantity the report does not show.
|
|
12
|
+
|
|
13
|
+
const HOOK_SCHEMA = z.object({ command: z.string().nullish() })
|
|
14
|
+
const MATCHER_SCHEMA = z.object({ hooks: z.array(HOOK_SCHEMA).nullish() })
|
|
15
|
+
const SETTINGS_SCHEMA = z.object({
|
|
16
|
+
hooks: z
|
|
17
|
+
.object({
|
|
18
|
+
UserPromptSubmit: z.array(MATCHER_SCHEMA).nullish(),
|
|
19
|
+
})
|
|
20
|
+
.nullish(),
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
// An unreadable or hook-less settings file yields no commands rather than throwing: a consumer
|
|
24
|
+
// project may have neither, and `josh cost` must still print a breakdown there.
|
|
25
|
+
function user_prompt_hook_commands(settings_text: string): Array<string> {
|
|
26
|
+
const parsed = SETTINGS_SCHEMA.safeParse(json_value.parse_or_undefined(settings_text))
|
|
27
|
+
const matchers = parsed.success ? (parsed.data.hooks?.UserPromptSubmit ?? []) : []
|
|
28
|
+
|
|
29
|
+
return matchers.flatMap((matcher) =>
|
|
30
|
+
(matcher.hooks ?? []).flatMap((hook) =>
|
|
31
|
+
typeof hook.command === 'string' ? [hook.command] : [],
|
|
32
|
+
),
|
|
33
|
+
)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const prompt_hooks = { user_prompt_hook_commands }
|
|
37
|
+
|
|
38
|
+
export { prompt_hooks }
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { core_budget } from '#scripts/gate/core-budget'
|
|
4
|
+
import { unit_worker_share } from '#scripts/test/unit-worker-share'
|
|
5
|
+
import { execa } from 'execa'
|
|
6
|
+
|
|
7
|
+
// Runs a command while holding a place in the machine-wide core budget (joshuafolkken/kit#2351).
|
|
8
|
+
//
|
|
9
|
+
// **The pre-push hook's `pnpm install` and `pnpm josh audit` are heavy and were outside the ledger.**
|
|
10
|
+
// The gate's checks reserve their cores, but a lefthook `pre-push` fires `pnpm install` on every push
|
|
11
|
+
// (`josh bump` rewrites `package.json` right before it) and runs `josh audit` beside it — and eight
|
|
12
|
+
// lanes reach that push around the same time, so the two spiked a machine the gate thought it had to
|
|
13
|
+
// itself. Wrapping each command here counts it: it claims a place before it starts and waits while the
|
|
14
|
+
// budget is full, exactly as a gate check does, so a concurrent gate on another lane backs off for it.
|
|
15
|
+
//
|
|
16
|
+
// **It is one wrapper for both rather than a reservation written into each command.** The audit scans
|
|
17
|
+
// synchronously and the install is pnpm's, so neither can hold an async reservation itself without
|
|
18
|
+
// being rewritten around it — and a second copy of the claim-run-release dance is the clone
|
|
19
|
+
// `CLAUDE.md` prohibits. The weight is the caller's, passed on the command line beside the command, so
|
|
20
|
+
// the reservation these two conservative numbers stand for lives at the one place a person reads them.
|
|
21
|
+
|
|
22
|
+
// `process.argv` is [runner, script, ...arguments].
|
|
23
|
+
const FIRST_ARGUMENT_INDEX = 2
|
|
24
|
+
// The token separating the reserved weight from the command it guards, so a command carrying flags of
|
|
25
|
+
// its own is never mistaken for this wrapper's arguments.
|
|
26
|
+
const COMMAND_SEPARATOR = '--'
|
|
27
|
+
const WEIGHT_INDEX = 0
|
|
28
|
+
const FAIL_EXIT_CODE = 1
|
|
29
|
+
// A reservation claims at least one core; a zero or negative weight would subtract from the ledger's
|
|
30
|
+
// cumulative sum and let a later reservation admit past the budget the ledger exists to hold.
|
|
31
|
+
const MIN_WEIGHT = 1
|
|
32
|
+
|
|
33
|
+
interface ReservedCommand {
|
|
34
|
+
weight: number
|
|
35
|
+
command: ReadonlyArray<string>
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// `<weight> -- <command> [args...]`. `undefined` is a usage error: a missing separator, a weight that
|
|
39
|
+
// is not an integer of at least one core, or nothing to run.
|
|
40
|
+
function parse_arguments(argv: ReadonlyArray<string>): ReservedCommand | undefined {
|
|
41
|
+
const NOT_FOUND = -1
|
|
42
|
+
const separator = argv.indexOf(COMMAND_SEPARATOR)
|
|
43
|
+
const weight = Number(argv[WEIGHT_INDEX])
|
|
44
|
+
const is_valid_weight = Number.isSafeInteger(weight) && weight >= MIN_WEIGHT
|
|
45
|
+
|
|
46
|
+
if (separator === NOT_FOUND || !is_valid_weight) return undefined
|
|
47
|
+
|
|
48
|
+
const command = argv.slice(separator + 1)
|
|
49
|
+
|
|
50
|
+
return command.length > 0 ? { weight, command } : undefined
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// `stdio: 'inherit'` so the command's own progress reaches the push, and `reject: false` so a failing
|
|
54
|
+
// command becomes an exit code the caller returns rather than a throw — the reservation is released by
|
|
55
|
+
// `with_core_reservation`'s `finally` on either path.
|
|
56
|
+
async function run_command(command: ReadonlyArray<string>): Promise<number> {
|
|
57
|
+
const [file, ...args] = command
|
|
58
|
+
const result = await execa(file ?? '', args, { stdio: 'inherit', reject: false })
|
|
59
|
+
|
|
60
|
+
return result.exitCode ?? FAIL_EXIT_CODE
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function run_reserved(argv: ReadonlyArray<string>): Promise<number> {
|
|
64
|
+
const parsed = parse_arguments(argv)
|
|
65
|
+
|
|
66
|
+
if (parsed === undefined) {
|
|
67
|
+
process.stderr.write('reserved-run: usage: reserved-run <weight> -- <command> [args...]\n')
|
|
68
|
+
|
|
69
|
+
return FAIL_EXIT_CODE
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// **A command already inside a gate's unit suite takes no place, for the reason a nested gate does
|
|
73
|
+
// not** (joshuafolkken/kit#2351): this repository's own gate tests exercise the wrapper, and a place
|
|
74
|
+
// claimed there would wait on cores the outer gate is holding. In its real use — the pre-push hook —
|
|
75
|
+
// nothing has set the marker, so the reservation is taken.
|
|
76
|
+
if (unit_worker_share.is_nested_run()) return await run_command(parsed.command)
|
|
77
|
+
|
|
78
|
+
return await core_budget.with_core_reservation(
|
|
79
|
+
parsed.weight,
|
|
80
|
+
async () => await run_command(parsed.command),
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
85
|
+
process.exitCode = await run_reserved(process.argv.slice(FIRST_ARGUMENT_INDEX))
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const reserved_run = { parse_arguments, run_command, run_reserved }
|
|
89
|
+
|
|
90
|
+
export { reserved_run }
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { text } from 'node:stream/consumers'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { backlog_ready } from '#scripts/backlog/backlog-ready'
|
|
5
|
+
import { backlog_stalled_detect } from '#scripts/backlog/backlog-stalled-detect'
|
|
6
|
+
import { repo_party } from '#scripts/discovery/repo-party'
|
|
7
|
+
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
8
|
+
import { session_language } from '#scripts/josh/session-language'
|
|
9
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
10
|
+
import { filing_cap } from '#scripts/rules/filing-cap'
|
|
11
|
+
import { lane_park } from '#scripts/rules/lane-park'
|
|
12
|
+
import { stop_rules, type StopContext, type StopOutcome } from '#scripts/rules/stop-rules'
|
|
13
|
+
import { run_cut } from '#scripts/run/run-cut'
|
|
14
|
+
import { run_headless } from '#scripts/run/run-headless'
|
|
15
|
+
import { run_hold } from '#scripts/run/run-hold'
|
|
16
|
+
import { run_stranded_detect } from '#scripts/run/run-stranded-detect'
|
|
17
|
+
import { time_density_hook } from '#scripts/time-runtime/time-density-hook'
|
|
18
|
+
import { time_hook_transcript } from '#scripts/time-runtime/time-hook-transcript'
|
|
19
|
+
|
|
20
|
+
// The `Stop` hook entry: one process that delivers the three stop-time rules (joshuafolkken/kit#2121).
|
|
21
|
+
// It is the stop-time counterpart of `pretool-guard.ts` — a second entry on the same `hook_decision`
|
|
22
|
+
// foundation, not a second copy of it.
|
|
23
|
+
//
|
|
24
|
+
// **Every failure allows the stop.** A missing transcript, an unreadable hold record, a git status
|
|
25
|
+
// that will not read — each ends as "no block", for the same reason the PreToolUse guard fails open:
|
|
26
|
+
// a hook that failed closed would wedge a run over its own plumbing. The block rules are self-
|
|
27
|
+
// resolving (send the notify, release the hold) and `stop_hook_active` is the backstop, so failing
|
|
28
|
+
// open here costs at most a missed nudge, never a stuck run.
|
|
29
|
+
|
|
30
|
+
// The hold record for this working tree is still in place. `unreadable` reads as absent: the safe
|
|
31
|
+
// direction for a stop guard is not to block, and an unreadable record is not proof a run is holding.
|
|
32
|
+
async function is_hold_present(): Promise<boolean> {
|
|
33
|
+
const directory = await run_hold.worktree_directory()
|
|
34
|
+
|
|
35
|
+
if (directory === undefined) return false
|
|
36
|
+
|
|
37
|
+
const read = run_hold.read_hold(run_hold.hold_path(directory))
|
|
38
|
+
|
|
39
|
+
return read.kind === 'held' || read.kind === 'stale'
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// A `confirmation` notify sits on this run's transcript tail. The tail is derived exactly as the
|
|
43
|
+
// PreToolUse guards derive it, and the judgement is `lane-park`'s, reused rather than re-spelled.
|
|
44
|
+
function transcript_tail(transcript_path: string): string {
|
|
45
|
+
const transcript = time_hook_transcript.transcript_of(transcript_path, undefined)
|
|
46
|
+
|
|
47
|
+
return time_density_hook.read_tail(transcript)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// An Issue was filed on this turn — the tail from the last prompt on. The count is `filing_cap`'s, so a
|
|
51
|
+
// filing a guard refused is not counted, and one an earlier turn made does not stand this turn down.
|
|
52
|
+
function was_filed(tail: string): boolean {
|
|
53
|
+
return filing_cap.turn_filing_count(tail) > 0
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// The session language the refusal is written for — `write_stop_decision` has already loaded the `.env`.
|
|
57
|
+
function session_lang(): string {
|
|
58
|
+
return session_language.resolve_session_lang().lang
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function build_context(
|
|
62
|
+
transcript_path: string,
|
|
63
|
+
payload_tail: { stop_hook_active: boolean; message: string },
|
|
64
|
+
): Promise<StopContext> {
|
|
65
|
+
const tail = transcript_tail(transcript_path)
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
hold_present: await is_hold_present(),
|
|
69
|
+
tree_clean: !(await run_hold.is_tree_dirty()),
|
|
70
|
+
notified: lane_park.mentions_confirmation_notify(tail),
|
|
71
|
+
message: payload_tail.message,
|
|
72
|
+
stop_hook_active: payload_tail.stop_hook_active,
|
|
73
|
+
cut_pending: run_cut.carried_cut_sync() !== undefined,
|
|
74
|
+
filed: was_filed(tail),
|
|
75
|
+
session_owner: repo_party.current_owner(),
|
|
76
|
+
headless_waiting: await run_headless.must_keep_waiting(),
|
|
77
|
+
headless_refusals: stop_rules.count_headless_refusals(tail),
|
|
78
|
+
lane_child: lane_child_marker.is_child_of(process.cwd()),
|
|
79
|
+
session_lang: session_lang(),
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function stop_outcome_for_payload(raw_payload: string): Promise<StopOutcome> {
|
|
84
|
+
const payload = stop_rules.parse_stop_payload(raw_payload)
|
|
85
|
+
|
|
86
|
+
if (payload === undefined || !stop_rules.is_enabled()) return stop_rules.NO_OUTCOME
|
|
87
|
+
|
|
88
|
+
const context = await build_context(payload.transcript_path, {
|
|
89
|
+
stop_hook_active: payload.stop_hook_active ?? false,
|
|
90
|
+
message: payload.last_assistant_message ?? '',
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
return stop_rules.stop_outcome(context)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async function outcome_of(raw_payload: string): Promise<StopOutcome> {
|
|
97
|
+
try {
|
|
98
|
+
return await stop_outcome_for_payload(raw_payload)
|
|
99
|
+
} catch {
|
|
100
|
+
return stop_rules.NO_OUTCOME
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Nothing reaches stdout on an ordinary stop, so what the harness parses stays empty unless the stop
|
|
105
|
+
// is being held — all three rules block, so a bare `#N` is reported the same way (joshuafolkken/kit#2247).
|
|
106
|
+
async function write_stop_decision(raw_payload: string): Promise<void> {
|
|
107
|
+
hook_decision.load_environment_file()
|
|
108
|
+
|
|
109
|
+
// The stall check rides the Stop hook because the stop *is* the loop boundary: a run alive but not
|
|
110
|
+
// advancing ends turns without dispatching (joshuafolkken/kit#2359). It only reports — leaves a
|
|
111
|
+
// marker, sends a notification — and swallows its own failures, so it can never change the decision
|
|
112
|
+
// below or hold the stop.
|
|
113
|
+
await backlog_stalled_detect.run_stall_check(backlog_ready.DEFAULT_PORTS)
|
|
114
|
+
|
|
115
|
+
// The strand check rides the same boundary for the same reason, and is the step before the stall
|
|
116
|
+
// (joshuafolkken/kit#2375): the stall detector needs a live driver that could dispatch, and this one
|
|
117
|
+
// fires when that driver is gone — the budget handed off, the owner dead, no supervisor watching. It
|
|
118
|
+
// too only reports and swallows its own failures, so it never touches the stop decision below.
|
|
119
|
+
await run_stranded_detect.run_stranded_check()
|
|
120
|
+
|
|
121
|
+
const { reason } = await outcome_of(raw_payload)
|
|
122
|
+
|
|
123
|
+
if (reason === undefined) return
|
|
124
|
+
|
|
125
|
+
process.stdout.write(`${stop_rules.block_envelope(reason, session_lang())}\n`)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const stop_guard = { outcome_of, stop_outcome_for_payload }
|
|
129
|
+
|
|
130
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
131
|
+
if (process.stdin.isTTY) hook_decision.report_no_payload('stop:guard')
|
|
132
|
+
else await write_stop_decision(await text(process.stdin))
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export { stop_guard, write_stop_decision }
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { init_logic_json_merge } from './init-logic-json-merge'
|
|
3
|
+
|
|
4
|
+
// The Claude Code plugin that ships kit's distributed skills (joshuafolkken/kit#1879). A consumer no
|
|
5
|
+
// longer receives the five skill directories as a byte copy under its own `.claude/skills/`; it
|
|
6
|
+
// receives this marketplace and plugin declaration in its `.claude/settings.json`, and the skills
|
|
7
|
+
// load from the package as `kit:<name>`.
|
|
8
|
+
const MARKETPLACE_NAME = 'kit'
|
|
9
|
+
const PLUGIN_ID = 'kit@kit'
|
|
10
|
+
// Relative to the consumer's project root, where `@joshuafolkken/kit` is installed. An absolute path
|
|
11
|
+
// would be correct only on the machine it was written on, so it has to stay relative; the `./`
|
|
12
|
+
// prefix keeps `claude plugin marketplace add` from reading it as a GitHub `owner/repo` shorthand.
|
|
13
|
+
const MARKETPLACE_PATH = './node_modules/@joshuafolkken/kit'
|
|
14
|
+
const CLAUDE_SETTINGS_DESTINATION = path.join('.claude', 'settings.json')
|
|
15
|
+
|
|
16
|
+
// `enabledPlugins` declares the plugin; `extraKnownMarketplaces` says where to find it. The CLI does
|
|
17
|
+
// not auto-install from these alone — a consumer runs `claude plugin install kit@kit` once — so the
|
|
18
|
+
// declaration is what makes that one command resolve without further arguments.
|
|
19
|
+
const PLUGIN_SETTINGS: Record<string, unknown> = {
|
|
20
|
+
extraKnownMarketplaces: {
|
|
21
|
+
[MARKETPLACE_NAME]: { source: { source: 'directory', path: MARKETPLACE_PATH } },
|
|
22
|
+
},
|
|
23
|
+
enabledPlugins: { [PLUGIN_ID]: true },
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function inject_plugin_config(content: string): string {
|
|
27
|
+
return init_logic_json_merge.merge_json_object(content, PLUGIN_SETTINGS)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Only the consumer's `.claude/settings.json` receives the plugin block. kit's own settings file is
|
|
31
|
+
// never transformed in place — kit loads the skills locally from `.claude/skills/`, so enabling the
|
|
32
|
+
// plugin in kit would double-load every skill (`kit:workflow-commands` beside the local
|
|
33
|
+
// `workflow-commands`). The check is against the copied file's destination, which is why it runs in
|
|
34
|
+
// the copy transform rather than against kit's source tree.
|
|
35
|
+
function apply_plugin_config_for_destination(destination_path: string, content: string): string {
|
|
36
|
+
return destination_path.endsWith(CLAUDE_SETTINGS_DESTINATION)
|
|
37
|
+
? inject_plugin_config(content)
|
|
38
|
+
: content
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const claude_plugin_config = {
|
|
42
|
+
MARKETPLACE_NAME,
|
|
43
|
+
PLUGIN_ID,
|
|
44
|
+
MARKETPLACE_PATH,
|
|
45
|
+
CLAUDE_SETTINGS_DESTINATION,
|
|
46
|
+
PLUGIN_SETTINGS,
|
|
47
|
+
inject_plugin_config,
|
|
48
|
+
apply_plugin_config_for_destination,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export { claude_plugin_config }
|