@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,479 @@
|
|
|
1
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
2
|
+
import { time_density_hook } from '#scripts/time-runtime/time-density-hook'
|
|
3
|
+
import { time_hook_transcript } from '#scripts/time-runtime/time-hook-transcript'
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
import { josh_environment_file } from './josh-environment-file'
|
|
6
|
+
import { stamp_file } from './stamp-file'
|
|
7
|
+
|
|
8
|
+
// The parts every refusing `PreToolUse` hook needs, held once (joshuafolkken/kit#1460).
|
|
9
|
+
//
|
|
10
|
+
// **It exists because the second such hook arrived.** `batch-guard.ts` was the first
|
|
11
|
+
// (joshuafolkken/kit#1390) and carried the whole shell itself: the payload schema, the envelope
|
|
12
|
+
// Claude Code understands, the environment switch, and the stamp that makes a refusal
|
|
13
|
+
// unrepeatable. The investigation guard needs all four unchanged and only its *rule* differs, so
|
|
14
|
+
// copying them across would be the clone `CLAUDE.md` prohibits — and a rule fixed in one copy and
|
|
15
|
+
// not the other is the failure that prohibition is about.
|
|
16
|
+
//
|
|
17
|
+
// **Nothing here decides anything.** Which calls are candidates, what the tail has to say and what
|
|
18
|
+
// the refusal reads are each hook's own; this file is the plumbing they were both spelling out.
|
|
19
|
+
|
|
20
|
+
// Only the four fields a `PreToolUse` hook is handed and reads. Claude Code names the tool it is
|
|
21
|
+
// about to run beside a transcript path, so nothing is searched for.
|
|
22
|
+
//
|
|
23
|
+
// **`agent_id` is what makes a delegated unit answerable with its own file** (joshuafolkken/kit#1424).
|
|
24
|
+
// The path in the payload is the *parent* session's whichever agent issued the call, so without this
|
|
25
|
+
// field a guard judges the parent's frozen timeline and refuses nothing at all inside a fork.
|
|
26
|
+
const payload_schema = z.object({
|
|
27
|
+
transcript_path: z.string().min(1),
|
|
28
|
+
// **`nullish`, not `optional`.** A payload spelling the absent agent as `null` has to read as "no
|
|
29
|
+
// fork"; rejected, it would fail `safeParse` for the whole payload and take the guard off every
|
|
30
|
+
// call of the main line, in silence — the failure every other path here is written to avoid.
|
|
31
|
+
agent_id: z.string().nullish(),
|
|
32
|
+
tool_name: z.string().min(1),
|
|
33
|
+
tool_input: z.unknown(),
|
|
34
|
+
})
|
|
35
|
+
const refusal_schema = z.object({ refused_at_ms: z.number() })
|
|
36
|
+
|
|
37
|
+
type HookPayload = z.infer<typeof payload_schema>
|
|
38
|
+
|
|
39
|
+
const HOOK_EVENT_NAME = 'PreToolUse'
|
|
40
|
+
const DENY_DECISION = 'deny'
|
|
41
|
+
// No record means nothing has been refused yet, and every span began after instant zero — which is
|
|
42
|
+
// the answer wanted: the first qualifying accumulation of a run is refused.
|
|
43
|
+
const NEVER_MS = 0
|
|
44
|
+
const MISSING_FILE = 'ENOENT'
|
|
45
|
+
|
|
46
|
+
// More than one spelling, because the mistake on this side is silent: a value meant to disable a
|
|
47
|
+
// guard that the list does not recognize leaves it on, and the person sees refusals they asked to
|
|
48
|
+
// stop.
|
|
49
|
+
const DISABLED_VALUES: ReadonlyArray<string> = ['off', '0', 'false', 'no']
|
|
50
|
+
|
|
51
|
+
// **Read at call time, never cached at module load.** A suite that switches the variable between
|
|
52
|
+
// cases — and both hooks' suites do — sees a cached answer as the guard ignoring the switch.
|
|
53
|
+
function is_switch_enabled(key: string): boolean {
|
|
54
|
+
return !DISABLED_VALUES.includes((process.env[key] ?? '').trim().toLowerCase())
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// The opt-in counterpart of `DISABLED_VALUES`: an unset variable stays off, and only one of these
|
|
58
|
+
// spellings turns the switch on. A switch that must default off cannot be read with `is_switch_enabled`
|
|
59
|
+
// — that one defaults on — so the value list is spelled out here rather than inverted at the call site,
|
|
60
|
+
// keeping a typo from silently enabling what was meant to stay disabled (joshuafolkken/kit#2370).
|
|
61
|
+
const ENABLED_VALUES: ReadonlyArray<string> = ['on', '1', 'true', 'yes']
|
|
62
|
+
|
|
63
|
+
// Read at call time for the same reason as `is_switch_enabled`, so a suite that switches the variable
|
|
64
|
+
// between cases is not answered from a module-load cache.
|
|
65
|
+
function is_switch_opt_in(key: string): boolean {
|
|
66
|
+
return ENABLED_VALUES.includes((process.env[key] ?? '').trim().toLowerCase())
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function parse_hook_payload(raw_payload: string): HookPayload | undefined {
|
|
70
|
+
const parsed = payload_schema.safeParse(JSON.parse(raw_payload))
|
|
71
|
+
|
|
72
|
+
return parsed.success ? parsed.data : undefined
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// The documented shape a `PreToolUse` hook answers with. Plain stdout is not it — only this envelope
|
|
76
|
+
// stops the call, and only `permissionDecisionReason` reaches the model.
|
|
77
|
+
function deny_envelope(reason: string): string {
|
|
78
|
+
return JSON.stringify({
|
|
79
|
+
hookSpecificOutput: {
|
|
80
|
+
hookEventName: HOOK_EVENT_NAME,
|
|
81
|
+
permissionDecision: DENY_DECISION,
|
|
82
|
+
permissionDecisionReason: reason,
|
|
83
|
+
},
|
|
84
|
+
})
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// **A notice, not a decision.** It carries no `permissionDecision`, so the call proceeds exactly as it
|
|
88
|
+
// would have; `additionalContext` is what reaches the model, and `systemMessage` is what the person
|
|
89
|
+
// watching sees. Both are filled because either channel alone leaves one of the two blind — and the
|
|
90
|
+
// whole point of this envelope is that a guard which cannot look stops being invisible.
|
|
91
|
+
function notice_envelope(notice: string): string {
|
|
92
|
+
return JSON.stringify({
|
|
93
|
+
systemMessage: notice,
|
|
94
|
+
hookSpecificOutput: { hookEventName: HOOK_EVENT_NAME, additionalContext: notice },
|
|
95
|
+
})
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Named after the guard that raised it rather than after any one of them: `create_transcript_guard` is
|
|
99
|
+
// the shell three hooks are built from, and a fault that announced the wrong origin would send whoever
|
|
100
|
+
// reads it to the wrong file.
|
|
101
|
+
function stamp_fault(switch_key: string): string {
|
|
102
|
+
return (
|
|
103
|
+
`⚠ ${switch_key}: the run is past the limit but the refusal stamp could not be written, so this ` +
|
|
104
|
+
`call was allowed rather than refused. Without the stamp a refusal could repeat and wedge the ` +
|
|
105
|
+
`run. Batch the calls that do not need each other anyway, and check the temp directory is writable.`
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// **A transcript that does not exist yet is not a fault.** A delegated unit's own file is named before
|
|
110
|
+
// anything is written under it, so a fork's first guarded calls read a path with no file behind it —
|
|
111
|
+
// `time-hook-transcript.ts` states that "no history" is the honest verdict there. Reported as a fault
|
|
112
|
+
// it would print on every early call of every fork, which is the routine case drowning the signal this
|
|
113
|
+
// exists to raise (joshuafolkken/kit#1509).
|
|
114
|
+
function is_missing_file(error: unknown): boolean {
|
|
115
|
+
if (!(error instanceof Error) || !('code' in error)) return false
|
|
116
|
+
|
|
117
|
+
return typeof error.code === 'string' && error.code === MISSING_FILE
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function error_text(error: unknown): string {
|
|
121
|
+
if (error instanceof Error) return error.message
|
|
122
|
+
|
|
123
|
+
return typeof error === 'string' ? error : 'a value that is not an error'
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function fault_notice(switch_key: string, error: unknown): string | undefined {
|
|
127
|
+
if (is_missing_file(error)) return undefined
|
|
128
|
+
|
|
129
|
+
const detail = error_text(error)
|
|
130
|
+
|
|
131
|
+
return (
|
|
132
|
+
`⚠ ${switch_key}: the guard could not read the run's history, so this call was allowed without ` +
|
|
133
|
+
`being checked — silence here is not evidence that the run is batching. Cause: ${detail}`
|
|
134
|
+
)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
interface RefusalStamp {
|
|
138
|
+
path: (transcript_path: string) => string
|
|
139
|
+
last_ms: (target: string) => number
|
|
140
|
+
// **Recording is what makes a refusal unrepeatable, so a refusal that could not be recorded is
|
|
141
|
+
// not made.** With nothing written, every later look at the same accumulation qualifies, the same
|
|
142
|
+
// call is refused again, and the run is wedged. Arming first and refusing second turns that from
|
|
143
|
+
// unlikely into impossible, which is why this answers whether it wrote.
|
|
144
|
+
record: (target: string, now_ms: number) => boolean
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// A record that is absent, unreadable, planted by another account or not the shape written here all
|
|
148
|
+
// answer `NEVER_MS`. That direction is the permissive one for a run's first refusal and the dangerous
|
|
149
|
+
// one for every later look at the same accumulation, which `record_refusal` is placed in front of.
|
|
150
|
+
function last_refusal_ms(target: string): number {
|
|
151
|
+
const raw = stamp_file.read_stamp_text(target)
|
|
152
|
+
|
|
153
|
+
if (raw === undefined) return NEVER_MS
|
|
154
|
+
|
|
155
|
+
try {
|
|
156
|
+
return refusal_schema.parse(JSON.parse(raw)).refused_at_ms
|
|
157
|
+
} catch {
|
|
158
|
+
return NEVER_MS
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function record_refusal(target: string, now_ms: number): boolean {
|
|
163
|
+
try {
|
|
164
|
+
stamp_file.write_stamp(target, { refused_at_ms: now_ms })
|
|
165
|
+
|
|
166
|
+
return true
|
|
167
|
+
} catch {
|
|
168
|
+
return false
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// One record per session, keyed on the transcript the payload named — what is being tracked is a
|
|
173
|
+
// *run*, and a delegated child is a run of its own. Only the prefix differs between hooks, which is
|
|
174
|
+
// why that is the whole of what this closes over.
|
|
175
|
+
function create_refusal_stamp(prefix: string): RefusalStamp {
|
|
176
|
+
function path(transcript_path: string): string {
|
|
177
|
+
return stamp_file.stamp_path(prefix, transcript_path)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return { path, last_ms: last_refusal_ms, record: record_refusal }
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// **`.env` is loaded here rather than through the dispatcher's `tsx_arguments`**, and the reason —
|
|
184
|
+
// declaring any `tsx_arguments` disqualifies a command from in-process dispatch — is now shared with
|
|
185
|
+
// every other command that has to stay in-process, so the loader lives in `josh-environment-file.ts` rather
|
|
186
|
+
// than here (joshuafolkken/kit#1491). Re-exported under this namespace because that is where the
|
|
187
|
+
// hooks reach for it.
|
|
188
|
+
//
|
|
189
|
+
// **Call it only on the real hook path**, never inside the pure refusal function, so a developer's
|
|
190
|
+
// own `.env` cannot decide what the unit tests see.
|
|
191
|
+
const { load_environment_file } = josh_environment_file
|
|
192
|
+
|
|
193
|
+
// What one refusing hook differs from another by, and nothing else. Both existing hooks judge the
|
|
194
|
+
// call, derive the transcript, read its tail, ask their own rule and record before refusing — the
|
|
195
|
+
// same six steps in the same order — so those steps are here and the three fields below are what a
|
|
196
|
+
// hook supplies.
|
|
197
|
+
// What a rule may need about the run rather than about the call in hand.
|
|
198
|
+
interface GuardRun {
|
|
199
|
+
transcript: string
|
|
200
|
+
now_ms: number
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// The notice half of a guard's rule, kept optional so a guard that only refuses supplies nothing and is
|
|
204
|
+
// untouched (joshuafolkken/kit#1848). The investigation guard omits it; the batching guard supplies one
|
|
205
|
+
// for the whole-file write, which it cannot refuse but can advise.
|
|
206
|
+
interface NotifySpec {
|
|
207
|
+
// This disposition's record prefix, distinct from the refusal's so the two dedupe independently and
|
|
208
|
+
// a notice can never move the instant the refusal reads.
|
|
209
|
+
prefix: string
|
|
210
|
+
// The same shape as `should_block`, asked of the tail for a notify-only call. `notified_at_ms` is
|
|
211
|
+
// this disposition's own last-fired instant, never the refusal's.
|
|
212
|
+
should_notify: (tail: string, call: GuardedCall, notified_at_ms: number, run: GuardRun) => boolean
|
|
213
|
+
// The non-blocking text handed to `notice_envelope`, chosen from the call and the tail
|
|
214
|
+
// (joshuafolkken/kit#2164, joshuafolkken/kit#2276). A guard now notifies about more than one kind of
|
|
215
|
+
// call — the whole-file write it cannot refuse, and, in a lane child, a refusable call whose refusal
|
|
216
|
+
// is downgraded to a notice — and the two want different wording, so the text is a function of the
|
|
217
|
+
// call. It is handed the tail as well so a notice can name the concrete calls the run just issued
|
|
218
|
+
// one-per-turn (#2276); a guard whose wording is fixed is free to ignore it.
|
|
219
|
+
text: (call: GuardedCall, tail: string) => string
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
interface TranscriptGuardSpec {
|
|
223
|
+
// Keeps one hook's refusal record out of the other's.
|
|
224
|
+
prefix: string
|
|
225
|
+
// The environment variable that switches this hook off, so one being off leaves the other on.
|
|
226
|
+
switch_key: string
|
|
227
|
+
// Whether this call is one the hook may refuse at all, judged **before** the transcript is read:
|
|
228
|
+
// most of a run's calls are ones the hook could never refuse, and a quarter-megabyte tail read for
|
|
229
|
+
// each of them would be paid inside a hook that is holding the call.
|
|
230
|
+
is_candidate: (call: GuardedCall) => boolean
|
|
231
|
+
// This hook's own rule, over the tail. `run` carries what a rule may need about the *run* rather
|
|
232
|
+
// than about the call — the transcript the stamps are keyed on, and the instant this decision is
|
|
233
|
+
// being made — because a rule may have to ask what **another** hook has already recorded, and
|
|
234
|
+
// whether that record is about the call in hand or an earlier one. A rule that needs neither is
|
|
235
|
+
// free to declare three parameters and ignore it.
|
|
236
|
+
should_block: (tail: string, call: GuardedCall, refused_at_ms: number, run: GuardRun) => boolean
|
|
237
|
+
// What the model is told. The deny reason is the only text that reaches it.
|
|
238
|
+
reason: string
|
|
239
|
+
// **The optional notice disposition** (joshuafolkken/kit#1848). Supplied, it lets a guard emit a
|
|
240
|
+
// non-blocking notice for a call it does not refuse. Its record lives under a prefix of its own.
|
|
241
|
+
notify?: NotifySpec
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// What one hook invocation decided. **`fault` is the half that did not exist** (joshuafolkken/kit#1509):
|
|
245
|
+
// every failure still allows the call, but a failure that nobody can see is indistinguishable from a
|
|
246
|
+
// run that was batching properly — so the guard could be dead for two hours and read as satisfied.
|
|
247
|
+
// `reason` refuses; `fault` allows and says so.
|
|
248
|
+
interface GuardOutcome {
|
|
249
|
+
reason: string | undefined
|
|
250
|
+
// **A notice, not a refusal** (joshuafolkken/kit#1848). Set where a notify-only call — a whole-file
|
|
251
|
+
// write — reached the limit; the call still proceeds, and `notice_envelope` carries this to the
|
|
252
|
+
// model and the person with no `permissionDecision`. Never set together with `reason`: the block
|
|
253
|
+
// path decides first and returns before the notice path is asked.
|
|
254
|
+
notice: string | undefined
|
|
255
|
+
fault: string | undefined
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const NO_OUTCOME: GuardOutcome = { reason: undefined, notice: undefined, fault: undefined }
|
|
259
|
+
|
|
260
|
+
interface TranscriptGuard {
|
|
261
|
+
is_enabled: () => boolean
|
|
262
|
+
refusal_path: (transcript_path: string) => string
|
|
263
|
+
refusal: (raw_payload: string, now_ms?: number) => string | undefined
|
|
264
|
+
outcome: (raw_payload: string, now_ms?: number) => GuardOutcome
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
interface FireResult {
|
|
268
|
+
fired: boolean
|
|
269
|
+
fault: string | undefined
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// The three the guard closes over: the spec, and one record per disposition. Bundled so the functions
|
|
273
|
+
// below stay within the parameter limit, and so a further disposition adds a field rather than a
|
|
274
|
+
// parameter to every one of them (joshuafolkken/kit#1848).
|
|
275
|
+
interface GuardParts {
|
|
276
|
+
spec: TranscriptGuardSpec
|
|
277
|
+
stamp: RefusalStamp
|
|
278
|
+
notify_stamp: RefusalStamp | undefined
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// `GuardParts` plus what this one call is: the tail read for it, the call itself, and the run it sits
|
|
282
|
+
// in. Built once per payload and handed to whichever disposition asks.
|
|
283
|
+
interface GuardContext extends GuardParts {
|
|
284
|
+
tail: string
|
|
285
|
+
call: GuardedCall
|
|
286
|
+
run: GuardRun
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Ask one disposition's rule against its own record, and if the rule fires, arm the record so it
|
|
290
|
+
// cannot repeat on the call in hand. **Recording before firing is what makes a refusal unrepeatable**,
|
|
291
|
+
// so a disposition that cannot record does not fire — it reports the fault instead of risking the
|
|
292
|
+
// wedge, which is the half `scripts/hooks/batch-guard.ts` names. Shared by the refusal and the notice so the
|
|
293
|
+
// arm-then-fire order is written once (joshuafolkken/kit#1848).
|
|
294
|
+
function fire_once(
|
|
295
|
+
stamp: RefusalStamp,
|
|
296
|
+
run: GuardRun,
|
|
297
|
+
should_fire: (last_fired_ms: number) => boolean,
|
|
298
|
+
switch_key: string,
|
|
299
|
+
): FireResult {
|
|
300
|
+
const target = stamp.path(run.transcript)
|
|
301
|
+
|
|
302
|
+
if (!should_fire(stamp.last_ms(target))) return { fired: false, fault: undefined }
|
|
303
|
+
if (!stamp.record(target, run.now_ms)) return { fired: false, fault: stamp_fault(switch_key) }
|
|
304
|
+
|
|
305
|
+
return { fired: true, fault: undefined }
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function block_outcome(context: GuardContext): GuardOutcome {
|
|
309
|
+
const { spec, stamp, tail, call, run } = context
|
|
310
|
+
const result = fire_once(
|
|
311
|
+
stamp,
|
|
312
|
+
run,
|
|
313
|
+
(last_fired_ms) => spec.should_block(tail, call, last_fired_ms, run),
|
|
314
|
+
spec.switch_key,
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
if (result.fired) return { reason: spec.reason, notice: undefined, fault: undefined }
|
|
318
|
+
|
|
319
|
+
return { reason: undefined, notice: undefined, fault: result.fault }
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function notify_outcome(context: GuardContext): GuardOutcome {
|
|
323
|
+
const { spec, notify_stamp, tail, call, run } = context
|
|
324
|
+
|
|
325
|
+
if (notify_stamp === undefined || spec.notify === undefined) return NO_OUTCOME
|
|
326
|
+
|
|
327
|
+
const { notify } = spec
|
|
328
|
+
const result = fire_once(
|
|
329
|
+
notify_stamp,
|
|
330
|
+
run,
|
|
331
|
+
(last_fired_ms) => notify.should_notify(tail, call, last_fired_ms, run),
|
|
332
|
+
spec.switch_key,
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
if (result.fired) return { reason: undefined, notice: notify.text(call, tail), fault: undefined }
|
|
336
|
+
|
|
337
|
+
return { reason: undefined, notice: undefined, fault: result.fault }
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function is_clear(outcome: GuardOutcome): boolean {
|
|
341
|
+
return outcome.reason === undefined && outcome.notice === undefined && outcome.fault === undefined
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
function guard_reason_for_payload(
|
|
345
|
+
parts: GuardParts,
|
|
346
|
+
payload: HookPayload,
|
|
347
|
+
now_ms: number,
|
|
348
|
+
): GuardOutcome {
|
|
349
|
+
const call = { name: payload.tool_name, input: payload.tool_input }
|
|
350
|
+
|
|
351
|
+
if (!parts.spec.is_candidate(call)) return NO_OUTCOME
|
|
352
|
+
|
|
353
|
+
// A hook firing inside a delegated unit is handed the *parent's* path, so the fork's own file is
|
|
354
|
+
// derived here rather than judged from the parent's frozen timeline (joshuafolkken/kit#1424).
|
|
355
|
+
const transcript = time_hook_transcript.transcript_of(payload.transcript_path, payload.agent_id)
|
|
356
|
+
const tail = time_density_hook.read_tail(transcript)
|
|
357
|
+
const context = { ...parts, tail, call, run: { transcript, now_ms } }
|
|
358
|
+
|
|
359
|
+
// The block path decides first, and the notice is asked only where it stayed clear. The two never
|
|
360
|
+
// both fire — a refusable call never notifies and a whole-file write never blocks — so this ordering
|
|
361
|
+
// only keeps a block fault from arming the notice record over a fault the run already has to see.
|
|
362
|
+
const blocked = block_outcome(context)
|
|
363
|
+
|
|
364
|
+
if (!is_clear(blocked)) return blocked
|
|
365
|
+
|
|
366
|
+
return notify_outcome(context)
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
function guard_outcome(parts: GuardParts, raw_payload: string, now_ms: number): GuardOutcome {
|
|
370
|
+
const payload = parse_hook_payload(raw_payload)
|
|
371
|
+
|
|
372
|
+
if (payload === undefined || !is_switch_enabled(parts.spec.switch_key)) return NO_OUTCOME
|
|
373
|
+
|
|
374
|
+
return guard_reason_for_payload(parts, payload, now_ms)
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function create_transcript_guard(spec: TranscriptGuardSpec): TranscriptGuard {
|
|
378
|
+
const stamp = create_refusal_stamp(spec.prefix)
|
|
379
|
+
// A record of its own for the notice, only where a notify spec is supplied. Keyed on its own prefix
|
|
380
|
+
// so a notice never spends the refusal's stamp (joshuafolkken/kit#1848).
|
|
381
|
+
const notify_stamp = spec.notify ? create_refusal_stamp(spec.notify.prefix) : undefined
|
|
382
|
+
const parts = { spec, stamp, notify_stamp }
|
|
383
|
+
|
|
384
|
+
function is_enabled(): boolean {
|
|
385
|
+
return is_switch_enabled(spec.switch_key)
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
function refusal_path(transcript_path: string): string {
|
|
389
|
+
return stamp.path(transcript_path)
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// **Every failure allows the call.** A missing transcript, a payload that is not JSON, a
|
|
393
|
+
// half-written tail, a temp directory that cannot be written — each ends as "no refusal", for the
|
|
394
|
+
// same reason `format-edited-file.ts` swallows a formatter it could not start: a hook that failed
|
|
395
|
+
// closed would stop a run over its own plumbing.
|
|
396
|
+
//
|
|
397
|
+
// **What changed is that it no longer does so in silence** (joshuafolkken/kit#1509). The call still
|
|
398
|
+
// goes through — failing open is the right call and is not being revisited — but the fault comes
|
|
399
|
+
// back as text the run can see, so "the guard said nothing" and "the guard could not look" stop
|
|
400
|
+
// being the same observation.
|
|
401
|
+
function outcome(raw_payload: string, now_ms: number = Date.now()): GuardOutcome {
|
|
402
|
+
try {
|
|
403
|
+
return guard_outcome(parts, raw_payload, now_ms)
|
|
404
|
+
} catch (error) {
|
|
405
|
+
return { reason: undefined, notice: undefined, fault: fault_notice(spec.switch_key, error) }
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
function refusal(raw_payload: string, now_ms: number = Date.now()): string | undefined {
|
|
410
|
+
return outcome(raw_payload, now_ms).reason
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
return { is_enabled, outcome, refusal, refusal_path }
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Write one already-resolved outcome, so a caller that has to await its rule (the watcher guard reads
|
|
417
|
+
// the lane registry and the life record) can compute the outcome first and hand it here
|
|
418
|
+
// (joshuafolkken/kit#2353). Nothing reaches stdout on the ordinary call, so what the harness parses
|
|
419
|
+
// stays empty unless the call is being refused.
|
|
420
|
+
function emit_outcome(outcome: GuardOutcome): void {
|
|
421
|
+
const { reason, notice, fault } = outcome
|
|
422
|
+
|
|
423
|
+
if (reason !== undefined) process.stdout.write(`${deny_envelope(reason)}\n`)
|
|
424
|
+
else if (notice !== undefined) process.stdout.write(`${notice_envelope(notice)}\n`)
|
|
425
|
+
else if (fault !== undefined) process.stdout.write(`${notice_envelope(fault)}\n`)
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// The synchronous path: load `.env`, run the rule, emit. A wrapper around `emit_outcome` so both paths
|
|
429
|
+
// write the same envelopes.
|
|
430
|
+
function write_outcome(raw_payload: string, outcome: (raw: string) => GuardOutcome): void {
|
|
431
|
+
load_environment_file()
|
|
432
|
+
|
|
433
|
+
emit_outcome(outcome(raw_payload))
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// The refusal-only shape, kept so the guards not yet moved across keep working unchanged. It is a
|
|
437
|
+
// wrapper rather than a second implementation, so both paths write the same envelopes.
|
|
438
|
+
//
|
|
439
|
+
// **A guard still calling this discards any fault it raised** — `investigation-guard.ts` is the one
|
|
440
|
+
// that does, so a stamp it could not write there is still silent. That is the same gap
|
|
441
|
+
// joshuafolkken/kit#1509 closed for the batching guard, left standing deliberately: this Issue's
|
|
442
|
+
// subject is the batching guard, and moving another hook across belongs with its own test.
|
|
443
|
+
function write_decision(raw_payload: string, refusal: (raw: string) => string | undefined): void {
|
|
444
|
+
write_outcome(raw_payload, (raw) => ({
|
|
445
|
+
reason: refusal(raw),
|
|
446
|
+
notice: undefined,
|
|
447
|
+
fault: undefined,
|
|
448
|
+
}))
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Run from a terminal there is no payload coming, and waiting for one looks like a hang.
|
|
452
|
+
function report_no_payload(command: string): void {
|
|
453
|
+
process.stderr.write(
|
|
454
|
+
`${command} reads a Claude Code hook payload on stdin; it is not run by hand.\n`,
|
|
455
|
+
)
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
const hook_decision = {
|
|
459
|
+
DISABLED_VALUES,
|
|
460
|
+
ENABLED_VALUES,
|
|
461
|
+
NEVER_MS,
|
|
462
|
+
create_refusal_stamp,
|
|
463
|
+
create_transcript_guard,
|
|
464
|
+
deny_envelope,
|
|
465
|
+
emit_outcome,
|
|
466
|
+
fault_notice,
|
|
467
|
+
is_switch_enabled,
|
|
468
|
+
is_switch_opt_in,
|
|
469
|
+
load_environment_file,
|
|
470
|
+
notice_envelope,
|
|
471
|
+
parse_hook_payload,
|
|
472
|
+
report_no_payload,
|
|
473
|
+
stamp_fault,
|
|
474
|
+
write_decision,
|
|
475
|
+
write_outcome,
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
export type { GuardOutcome, GuardRun, TranscriptGuard, TranscriptGuardSpec }
|
|
479
|
+
export { hook_decision }
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import type { CommandCategory, CommandEntry } from './josh-command-types'
|
|
2
|
+
import { AI_COMMANDS } from './josh-commands-ai'
|
|
3
|
+
import { CLONE_COMMANDS } from './josh-commands-clone'
|
|
4
|
+
import { DEV_COMMANDS } from './josh-commands-development'
|
|
5
|
+
import { HOOKS_COMMANDS } from './josh-commands-hooks'
|
|
6
|
+
import { LINT_COMMANDS } from './josh-commands-lint'
|
|
7
|
+
import { MAINTENANCE_COMMANDS } from './josh-commands-maintenance'
|
|
8
|
+
import { PROJECT_COMMANDS } from './josh-commands-project'
|
|
9
|
+
import { VERSIONING_COMMANDS } from './josh-commands-versioning'
|
|
10
|
+
import { WORKFLOW_COMMANDS } from './josh-commands-workflow'
|
|
11
|
+
|
|
12
|
+
const CATEGORY_ORDER: ReadonlyArray<CommandCategory> = [
|
|
13
|
+
'Development',
|
|
14
|
+
'Project',
|
|
15
|
+
'Workflow',
|
|
16
|
+
'Versioning',
|
|
17
|
+
'Maintenance',
|
|
18
|
+
'Git hooks',
|
|
19
|
+
'AI tools',
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
const COMMAND_MAP: Record<string, CommandEntry> = {
|
|
23
|
+
...DEV_COMMANDS,
|
|
24
|
+
...PROJECT_COMMANDS,
|
|
25
|
+
...WORKFLOW_COMMANDS,
|
|
26
|
+
...VERSIONING_COMMANDS,
|
|
27
|
+
...MAINTENANCE_COMMANDS,
|
|
28
|
+
...HOOKS_COMMANDS,
|
|
29
|
+
...AI_COMMANDS,
|
|
30
|
+
...LINT_COMMANDS,
|
|
31
|
+
...CLONE_COMMANDS,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const ALIASES: Record<string, string> = {
|
|
35
|
+
ga: 'gate',
|
|
36
|
+
l: 'lint',
|
|
37
|
+
lr: 'lint:related',
|
|
38
|
+
ln: 'lines',
|
|
39
|
+
by: 'bytes',
|
|
40
|
+
f: 'format',
|
|
41
|
+
fd: 'format:edited',
|
|
42
|
+
bg: 'batch:guard',
|
|
43
|
+
sd: 'cspell:dot',
|
|
44
|
+
bh: 'behavior',
|
|
45
|
+
t: 'test',
|
|
46
|
+
tu: 'test:unit',
|
|
47
|
+
tr: 'test:related',
|
|
48
|
+
td: 'test:declared',
|
|
49
|
+
trd: 'test:red',
|
|
50
|
+
te: 'test:e2e',
|
|
51
|
+
er: 'e2e:retry-check',
|
|
52
|
+
sl: 'session:lang',
|
|
53
|
+
c: 'check',
|
|
54
|
+
pt: 'port',
|
|
55
|
+
i: 'init',
|
|
56
|
+
sy: 'sync',
|
|
57
|
+
sys: 'sync:scope',
|
|
58
|
+
g: 'git',
|
|
59
|
+
gp: 'pr',
|
|
60
|
+
fu: 'followup',
|
|
61
|
+
nf: 'notify',
|
|
62
|
+
obf: 'observations:flush',
|
|
63
|
+
mrr: 'measure:rerun',
|
|
64
|
+
ms: 'main:sync',
|
|
65
|
+
mm: 'main:merge',
|
|
66
|
+
bp: 'bump',
|
|
67
|
+
re: 'release',
|
|
68
|
+
res: 'release:scope',
|
|
69
|
+
v: 'version',
|
|
70
|
+
r: 'ranges',
|
|
71
|
+
dr: 'doctor',
|
|
72
|
+
pg: 'propagate',
|
|
73
|
+
ad: 'adopt',
|
|
74
|
+
ov: 'overrides',
|
|
75
|
+
a: 'audit',
|
|
76
|
+
ap: 'audit:provision',
|
|
77
|
+
rt: 'reconcile-templates',
|
|
78
|
+
u: 'latest',
|
|
79
|
+
lg: 'latest:guard',
|
|
80
|
+
lc: 'latest:corepack',
|
|
81
|
+
lu: 'latest:update',
|
|
82
|
+
ls: 'latest:scope',
|
|
83
|
+
pm: 'prevent-main-commit',
|
|
84
|
+
cm: 'check-commit-message',
|
|
85
|
+
ss: 'secretlint-scan',
|
|
86
|
+
ppu: 'pre-push-unit',
|
|
87
|
+
rer: 'reserved-run',
|
|
88
|
+
ptc: 'pre-commit-type-check',
|
|
89
|
+
ird: 'issue:read',
|
|
90
|
+
ist: 'issue:state',
|
|
91
|
+
isc: 'issue:scout',
|
|
92
|
+
isf: 'issue:fold',
|
|
93
|
+
isfe: 'issue:fold-existing',
|
|
94
|
+
dfr: 'defect:rate',
|
|
95
|
+
ici: 'issue:cite',
|
|
96
|
+
icm: 'issue:comment',
|
|
97
|
+
pks: 'pkg:scout',
|
|
98
|
+
iln: 'issue:lint',
|
|
99
|
+
ibl: 'issue:backlinks',
|
|
100
|
+
rl: 'report:lint',
|
|
101
|
+
ep: 'epic',
|
|
102
|
+
ec: 'epic:check',
|
|
103
|
+
en: 'epic:next',
|
|
104
|
+
ea: 'epic:audit',
|
|
105
|
+
eb: 'epic:bundle',
|
|
106
|
+
ao: 'auto-ok:next',
|
|
107
|
+
bl: 'backlog:next',
|
|
108
|
+
blo: 'backlog:offer',
|
|
109
|
+
bld: 'backlog:drive',
|
|
110
|
+
blp: 'backlog:plan',
|
|
111
|
+
bls: 'backlog:stalled',
|
|
112
|
+
bb: 'backlog:budget',
|
|
113
|
+
co: 'cost',
|
|
114
|
+
ds: 'doc:section',
|
|
115
|
+
rs: 'read:set',
|
|
116
|
+
dcr: 'doc:read',
|
|
117
|
+
rf: 'read:files',
|
|
118
|
+
ef: 'edit:files',
|
|
119
|
+
rfs: 'refactor:scan',
|
|
120
|
+
tm: 'time',
|
|
121
|
+
tmd: 'time:density',
|
|
122
|
+
rtr: 'retrospective',
|
|
123
|
+
rb: 'review:brief',
|
|
124
|
+
r2: 'review:round2',
|
|
125
|
+
ra: 'review:attest',
|
|
126
|
+
rvr: 'review:record',
|
|
127
|
+
rvf: 'review:findings',
|
|
128
|
+
dp: 'disposition',
|
|
129
|
+
dg: 'delegate',
|
|
130
|
+
fo: 'fanout',
|
|
131
|
+
rh: 'run:hold',
|
|
132
|
+
rr: 'run:release',
|
|
133
|
+
rc: 'run:carry',
|
|
134
|
+
rw: 'run:wake',
|
|
135
|
+
rct: 'run:cut',
|
|
136
|
+
rv: 'run:liveness',
|
|
137
|
+
red: 'run:ending',
|
|
138
|
+
rg: 'run:progress',
|
|
139
|
+
rp: 'run:prep',
|
|
140
|
+
ren: 'run:entry',
|
|
141
|
+
rtl: 'run:tail',
|
|
142
|
+
shp: 'ship',
|
|
143
|
+
rst: 'run:status',
|
|
144
|
+
rn: 'run:next',
|
|
145
|
+
rsp: 'run:step',
|
|
146
|
+
rpy: 'repo:party',
|
|
147
|
+
rmg: 'run:merge',
|
|
148
|
+
rrp: 'run:report',
|
|
149
|
+
rrv: 'run:review',
|
|
150
|
+
rev: 'run:event',
|
|
151
|
+
sp: 'stash:pop',
|
|
152
|
+
lno: 'lane:open',
|
|
153
|
+
lnc: 'lane:close',
|
|
154
|
+
lnl: 'lane:list',
|
|
155
|
+
lnp: 'lane:prune',
|
|
156
|
+
lnv: 'lane:output',
|
|
157
|
+
lnd: 'lane:dispatch',
|
|
158
|
+
lna: 'lane:await',
|
|
159
|
+
lnla: 'lane:launch',
|
|
160
|
+
rwg: 'run:watcher:guard',
|
|
161
|
+
rsd: 'run:stranded',
|
|
162
|
+
ig: 'investigation:guard',
|
|
163
|
+
drg: 'duplicate-read:guard',
|
|
164
|
+
rug: 'rule:guard',
|
|
165
|
+
ruv: 'rule:value',
|
|
166
|
+
ptg: 'pretool:guard',
|
|
167
|
+
sg: 'stop:guard',
|
|
168
|
+
ev: 'eval',
|
|
169
|
+
ol: 'oracle:list',
|
|
170
|
+
sa: 'split:assess',
|
|
171
|
+
shs: 'sonar:hotspots',
|
|
172
|
+
uir: 'ui:routes',
|
|
173
|
+
cs: 'clone:scan',
|
|
174
|
+
ca: 'cases',
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// The canonical name of a `josh` subcommand: an alias expands, and anything else passes through
|
|
178
|
+
// unchanged (joshuafolkken/kit#1789).
|
|
179
|
+
//
|
|
180
|
+
// **The expansion is one rule, so it lives beside the table it reads.** Two readers had each written
|
|
181
|
+
// their own `ALIASES[name] ?? name` — the layer report and the gate-run count — and a third, the run
|
|
182
|
+
// measurement's command key, had not, so `pnpm josh ga` and `pnpm josh gate` were measured as two
|
|
183
|
+
// different commands. A lookup is small enough to copy and exactly the kind of copy that drifts: the
|
|
184
|
+
// two that had it disagreed with the one that did not about whether a call was the gate.
|
|
185
|
+
//
|
|
186
|
+
// **`Object.hasOwn` rather than a bare lookup**, because a subcommand spelled like a member of
|
|
187
|
+
// `Object.prototype` — `constructor`, `toString` — would otherwise come back as that member instead
|
|
188
|
+
// of as itself, and the caller would key a call by something that is not a command name at all.
|
|
189
|
+
function canonical_command(name: string): string {
|
|
190
|
+
if (!Object.hasOwn(ALIASES, name)) return name
|
|
191
|
+
|
|
192
|
+
return ALIASES[name] ?? name
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export type { CommandCategory, CommandEntry } from './josh-command-types'
|
|
196
|
+
export { ALIASES, CATEGORY_ORDER, COMMAND_MAP, canonical_command }
|