@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,126 @@
|
|
|
1
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
2
|
+
import { shell_segments } from './shell-segments'
|
|
3
|
+
|
|
4
|
+
// The rule delivered at the call that pipes a verification command (joshuafolkken/kit#1556).
|
|
5
|
+
//
|
|
6
|
+
// **A pipeline exits with its last command's status.** `pnpm josh gate 2>&1 | tail -40` therefore
|
|
7
|
+
// answers success on a gate that printed `✗ verification gate failed`, and the failure that was
|
|
8
|
+
// caught was caught by a child reading the output rather than by anything the shell reported. The
|
|
9
|
+
// defect is not in `josh gate`, which returns non-zero correctly — it is in how the call is written,
|
|
10
|
+
// and a call is composed fresh every turn.
|
|
11
|
+
//
|
|
12
|
+
// **Delivered rather than written down, and the count is what decided that.** A survey of every
|
|
13
|
+
// document, prompt and skill in this repository found exactly one piped verification example, and it
|
|
14
|
+
// was the repository's own explanation of this bug — so there were no examples to rewrite, and the
|
|
15
|
+
// pipe is invented each time rather than copied. The other candidate, a calling convention, had
|
|
16
|
+
// already been rejected in writing by `scripts/time/time-reported-failure.ts`: a convention is obeyed
|
|
17
|
+
// or it is not. `prompts/collaboration-workflow/output-bounds.md` is the single source for the rule.
|
|
18
|
+
//
|
|
19
|
+
// It lives beside the enumeration rather than inside it because `delivered-rules.ts` is the list —
|
|
20
|
+
// one row per rule — and a row's predicate and refusal text are that rule's own.
|
|
21
|
+
|
|
22
|
+
// The josh subcommands whose result means pass or fail — the whole reach of the rule, and no more.
|
|
23
|
+
// **The read-only answers are absent deliberately.** `latest:scope`, `review:level`,
|
|
24
|
+
// `review:brief` and `issue:state` print an answer rather than a verdict, and `git log | head` or
|
|
25
|
+
// `gh issue list | head` are not josh calls at all — narrowing a listing is the ordinary way to read
|
|
26
|
+
// one. A trigger wide enough to reach those would refuse on the commonest shape in the transcript,
|
|
27
|
+
// and the enumeration's own rule is that a hook firing on the wrong turn is worse than no hook.
|
|
28
|
+
//
|
|
29
|
+
// **Two more kinds are out, and for reasons rather than by omission.** `pre-commit-type-check` and
|
|
30
|
+
// `pre-push-unit` are run by lefthook rather than typed by anyone, so no call of theirs is ever
|
|
31
|
+
// composed here; and `e2e:retry-check` *reports* whether the preview server crashed rather than
|
|
32
|
+
// passing or failing on it, which puts it with the answers above.
|
|
33
|
+
//
|
|
34
|
+
// **`eval` is in, even though its verdict is the last line rather than the exit code.** Piping it to
|
|
35
|
+
// `tail -1` does keep that line — and throws away the scenario rows the same rule requires next, since
|
|
36
|
+
// a `blocked` verdict has to be attributed before it blocks a merge and a red scenario may predate the
|
|
37
|
+
// change. The Issue that filed this rule names `eval` for that reason.
|
|
38
|
+
const VERIFICATION_COMMANDS: ReadonlySet<string> = new Set([
|
|
39
|
+
'check',
|
|
40
|
+
'cspell',
|
|
41
|
+
'cspell:dot',
|
|
42
|
+
'eval',
|
|
43
|
+
'gate',
|
|
44
|
+
'lint',
|
|
45
|
+
'lint:eslint',
|
|
46
|
+
'lint:prettier',
|
|
47
|
+
'lint:related',
|
|
48
|
+
'overrides',
|
|
49
|
+
'ranges',
|
|
50
|
+
'test',
|
|
51
|
+
'test:e2e',
|
|
52
|
+
'test:related',
|
|
53
|
+
'test:unit',
|
|
54
|
+
])
|
|
55
|
+
|
|
56
|
+
// **The canonical name of each check, and both spellings still match**: `pnpm josh ga | tail` masks a
|
|
57
|
+
// gate exactly as the long spelling does, and since joshuafolkken/kit#1789 the alias is expanded where
|
|
58
|
+
// the command is read rather than by widening this set with every alias standing for one of its names
|
|
59
|
+
// (joshuafolkken/kit#1643 for the reading). The suite names `pnpm josh ga` for that reason: an
|
|
60
|
+
// expansion that regressed would show up here rather than as a guard that quietly stopped firing.
|
|
61
|
+
function is_verification_command(segment: string): boolean {
|
|
62
|
+
return shell_segments.is_josh_command(segment, VERIFICATION_COMMANDS)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// A pipeline reports its last command's status, so a check in any earlier segment has its verdict
|
|
66
|
+
// thrown away. `time_shell.discarded_commands` is what decides which segments those are — the shell
|
|
67
|
+
// reading is one rule kept in one place, not a second parser written here. It also decides the two
|
|
68
|
+
// forms this rule stands down on: a pipeline under `set -o pipefail`, which carries the check's
|
|
69
|
+
// status, and a command chain quoted inside a body, which is text rather than a call.
|
|
70
|
+
function is_masked_verification(command: string): boolean {
|
|
71
|
+
return time_shell.discarded_commands(command).some((segment) => is_verification_command(segment))
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// The masking, the two ways out of it and the boundary, in the shape a refusal can carry. **The way
|
|
75
|
+
// out travels with the refusal rather than being named**, because a delivery saying only "do not pipe
|
|
76
|
+
// it" leaves the caller with the same long output and no sanctioned way to read it, which is what put
|
|
77
|
+
// the pipe there in the first place.
|
|
78
|
+
const PIPED_VERIFICATION_REASON =
|
|
79
|
+
"⛔ piped verification: a pipeline exits with its last command's status, so `pnpm josh gate | " +
|
|
80
|
+
'tail` reports success on a gate that failed, and the verdict is discarded before anything reads ' +
|
|
81
|
+
'it. Run the check without the pipe — josh prints its verdict line last, so the harness output cap ' +
|
|
82
|
+
'keeps it even when the middle is elided. Where the output genuinely has to be narrowed, redirect ' +
|
|
83
|
+
'it to a file and read ranges from that file, or prefix `set -o pipefail` so the pipeline carries ' +
|
|
84
|
+
"the check's status. Read the printed verdict either way, never the exit code alone. Read-only " +
|
|
85
|
+
'listings are untouched — this fires only on a command whose result means pass or fail. The rule ' +
|
|
86
|
+
'is in `prompts/collaboration-workflow/output-bounds.md`. Reissue this call with no pipe — it ' +
|
|
87
|
+
'fires once per run and cannot repeat on the call in hand.'
|
|
88
|
+
|
|
89
|
+
// Every command position on the line: the chain cut `shell_segments` makes, each piece of a pipeline
|
|
90
|
+
// inside it taken on its own.
|
|
91
|
+
//
|
|
92
|
+
// **The quoted spans are blanked first, exactly as `time_shell.discarded_commands` blanks them.** A
|
|
93
|
+
// command chain quoted inside a body is text rather than a call, and this repository's issue bodies
|
|
94
|
+
// quote them constantly — without the blanking the two halves disagree, and
|
|
95
|
+
// `gh issue comment 1 --body "… | pnpm josh gate | …"` reads as a check whose verdict survived.
|
|
96
|
+
function command_pieces(command: string): Array<string> {
|
|
97
|
+
return shell_segments
|
|
98
|
+
.segments_of(time_shell.unquoted(command))
|
|
99
|
+
.flatMap((segment) => segment.split('|'))
|
|
100
|
+
.map((piece) => piece.trim())
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// **The occasion this rule governs: a check whose result means pass or fail, run at all**
|
|
104
|
+
// (joshuafolkken/kit#1643). The trigger fires only on the masked spelling, so a run that never piped
|
|
105
|
+
// one would drop out of the reading entirely and the rate would be taken over runs that masked at
|
|
106
|
+
// least once.
|
|
107
|
+
function runs_verification(command: string): boolean {
|
|
108
|
+
return command_pieces(command).some((piece) => is_verification_command(piece))
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// **Keeping the rule is running that check with its verdict intact** — no pipe, the last position in
|
|
112
|
+
// one, or `set -o pipefail` in front. Judged over the whole command, so a line that masks one check
|
|
113
|
+
// while running another unmasked is not credited for the half it got right.
|
|
114
|
+
function keeps_verdict_intact(command: string): boolean {
|
|
115
|
+
return runs_verification(command) && !is_masked_verification(command)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const piped_verification = {
|
|
119
|
+
PIPED_VERIFICATION_REASON,
|
|
120
|
+
VERIFICATION_COMMANDS,
|
|
121
|
+
is_masked_verification,
|
|
122
|
+
keeps_verdict_intact,
|
|
123
|
+
runs_verification,
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export { piped_verification }
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
2
|
+
import { bash_triggers } from './bash-triggers'
|
|
3
|
+
|
|
4
|
+
// The trigger and the delivered text behind the `poll-loop` row of `delivered-rules.ts`
|
|
5
|
+
// (joshuafolkken/kit#2371). The hand-written wait loop a lane child improvises over a backgrounded
|
|
6
|
+
// command's output file.
|
|
7
|
+
//
|
|
8
|
+
// **The gap `early-heartbeat` left, on purpose.** joshuafolkken/kit#1570's rule refuses a bare
|
|
9
|
+
// `sleep` — a clock timer arming a progress report — and it stands down the moment it sees a loop
|
|
10
|
+
// keyword (`early-heartbeat.ts`'s `LOOP_KEYWORD`), because a loop that ends on a condition is waiting
|
|
11
|
+
// on a thing rather than on a clock. This is that thing: a `while`/`until` loop that sleeps between
|
|
12
|
+
// probes of a command's output file. It never appeared in the heartbeat reading, and it is the larger
|
|
13
|
+
// half of the waste — six lanes lost about 45 minutes, 13% of their wall clock, to it.
|
|
14
|
+
//
|
|
15
|
+
// **The loop does not know when the command finished.** A regex over the output file that never
|
|
16
|
+
// matches waits to the harness block limit; one that matches a mid-run line exits too early. Either
|
|
17
|
+
// way the command's *exit* is not what ends the wait, and each pass spends a full-context round trip.
|
|
18
|
+
// A command backgrounded with `run_in_background` re-invokes the run when it exits — the completion
|
|
19
|
+
// notification is what ends the wait on the task itself, which is the mechanism this row hands back,
|
|
20
|
+
// the same reading joshuafolkken/kit#1510 took for the foreground push (`run-tail.ts`).
|
|
21
|
+
//
|
|
22
|
+
// **It fires on every occurrence**, for the reason `git-force.ts` does: a poll loop wastes the same
|
|
23
|
+
// round trips each time it is armed, so refused-once-and-free-after would put every loop but the first
|
|
24
|
+
// back on the run's self-restraint — the thing that let these loops through in the first place.
|
|
25
|
+
|
|
26
|
+
// A `while` or `until` header, in either spelling a poll loop reaches for. The trailing whitespace is
|
|
27
|
+
// what separates the keyword from a path that merely begins with it (`until.txt`); a `for` loop is out
|
|
28
|
+
// by omission — it iterates a fixed list rather than probing a state.
|
|
29
|
+
const LOOP_KEYWORD = /\b(?:while|until)\s/u
|
|
30
|
+
// A `sleep` command with any argument — the pause between probes that makes a loop a poll rather than
|
|
31
|
+
// a stream reader. Read anywhere in the line rather than at a command position, because the loop body
|
|
32
|
+
// puts it behind a `do` keyword (`; do sleep 30; done`), which no separator precedes. The argument is
|
|
33
|
+
// matched as any non-space rather than a digit, so a variable duration (`sleep "$INTERVAL"`) is caught
|
|
34
|
+
// as a literal one is — a poll with a configurable interval is still a poll (joshuafolkken/kit#2371,
|
|
35
|
+
// review round 1).
|
|
36
|
+
const SLEEP_COMMAND = /\bsleep\s+\S/u
|
|
37
|
+
// **A loop with no `sleep` is still a poll — a worse one** (joshuafolkken/kit#2421). A lane child ran
|
|
38
|
+
// `until [ -f /tmp/gate-done ]; do if ! kill -0 %1 …; then break; fi; done` for hours: a busy-wait
|
|
39
|
+
// that spun a core on a marker nobody wrote, and slipped through because the rule required the
|
|
40
|
+
// `sleep`. Two headers make a loop a poll with or without one. An `until` header waits for a state to
|
|
41
|
+
// appear by definition — the keyword has no stream-reading or counting use. A `while` header whose
|
|
42
|
+
// condition *probes* a state — a file test, a process probe, a quiet `grep` — is the same wait
|
|
43
|
+
// spelled negatively. A `while` that counts or reads (`while [ "$i" -lt 5 ]`, `while read`) is not.
|
|
44
|
+
// Both are read at a command position only — the start of the line, after a separator, or after a
|
|
45
|
+
// keyword that opens a command list — because without `sleep` there is nothing else to tell a loop
|
|
46
|
+
// header from the word in an argument: `git log --until yesterday` is not a loop (review round 1).
|
|
47
|
+
const COMMAND_POSITION = String.raw`(?:^|[;&|({\n]|\b(?:do|then|else)\s)\s*`
|
|
48
|
+
const UNTIL_HEADER = new RegExp(String.raw`${COMMAND_POSITION}until\s`, 'u')
|
|
49
|
+
const WHILE_HEADER = String.raw`${COMMAND_POSITION}while\s+(?:!\s*)?`
|
|
50
|
+
const PROBE_HEADERS: ReadonlyArray<RegExp> = [
|
|
51
|
+
String.raw`\[\[?\s+(?:!\s*)?-[defs]\s`,
|
|
52
|
+
String.raw`test\s+(?:!\s*)?-[defs]\s`,
|
|
53
|
+
String.raw`(?:kill\s+-0|pgrep)\b`,
|
|
54
|
+
String.raw`grep\s+-[A-Za-z]*q`,
|
|
55
|
+
].map((probe) => new RegExp(`${WHILE_HEADER}${probe}`, 'u'))
|
|
56
|
+
|
|
57
|
+
function is_state_wait(plain: string): boolean {
|
|
58
|
+
return UNTIL_HEADER.test(plain) || PROBE_HEADERS.some((header) => header.test(plain))
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// **A `while read … done < file` is a stream reader, not a poll**, even when its body sleeps to
|
|
62
|
+
// throttle processing (joshuafolkken/kit#2371, review round 1). Its condition consumes input rather
|
|
63
|
+
// than probing for a state — a poll never reads its condition, it *tests* it (grep, wc, a file check)
|
|
64
|
+
// — so the completion notification this rule points to has nothing to do with it. A `while read`
|
|
65
|
+
// header is therefore always a stream reader; a line that also carried a separate `until` poll would
|
|
66
|
+
// go un-refused, which fails safe (under-refusal) and is contrived enough not to warrant the added
|
|
67
|
+
// regex the attempt to catch it needed (joshuafolkken/kit#2371, review round 2).
|
|
68
|
+
const STREAM_READER = /\bwhile\s+read\b/u
|
|
69
|
+
|
|
70
|
+
function is_stream_reader(plain: string): boolean {
|
|
71
|
+
return STREAM_READER.test(plain)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// **Quoted spans are blanked first, and here that is load-bearing rather than tidy.** This
|
|
75
|
+
// repository's Issue bodies and commit messages quote these very loops constantly — this Issue's own
|
|
76
|
+
// body does — so without the blanking `gh issue comment <N> --body "… until grep …; do sleep …; done"`
|
|
77
|
+
// would read as the poll loop it only describes. `time_shell.unquoted` is the one removal shared with
|
|
78
|
+
// every other trigger, so two readers of one command cannot disagree about a quoting form.
|
|
79
|
+
function is_poll_loop(command: string): boolean {
|
|
80
|
+
const plain = time_shell.unquoted(command)
|
|
81
|
+
|
|
82
|
+
if (is_stream_reader(plain)) return false
|
|
83
|
+
if (is_state_wait(plain)) return true
|
|
84
|
+
|
|
85
|
+
return LOOP_KEYWORD.test(plain) && SLEEP_COMMAND.test(plain)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// The instruction in the shape a refusal can carry: what the loop is about to cost, why the command's
|
|
89
|
+
// exit is the thing to wait on, and the one route that delivers that exit. The measurement is named
|
|
90
|
+
// because it is what makes the rule believable — six lanes, about 45 minutes, 13% of their wall clock.
|
|
91
|
+
const POLL_LOOP_REASON =
|
|
92
|
+
"⛔ output poll loop: this hand-writes a `while`/`until` wait loop over a command's output, a " +
|
|
93
|
+
'marker file or a process — with a `sleep` or, worse, without one — and the loop does not know ' +
|
|
94
|
+
'when the command finished. A regex that never matches waits to ' +
|
|
95
|
+
'the harness block limit; one that matches a mid-run line exits too early — either way the ' +
|
|
96
|
+
'command exit is not what ends the wait, and each pass spends a full-context round trip ' +
|
|
97
|
+
'(joshuafolkken/kit#2371 measured about 45 minutes, 13% of six lanes, lost to exactly this). Do ' +
|
|
98
|
+
'not poll the output file. A command known to take minutes — `pnpm josh gate`, `pnpm josh ' +
|
|
99
|
+
'followup`, `pnpm josh format` — is started detached from the first with `run_in_background` set, ' +
|
|
100
|
+
'and the harness re-invokes you when it exits: its completion notification is what ends the wait, ' +
|
|
101
|
+
'on the task exit rather than a regex or the block limit. So issue the long command in the ' +
|
|
102
|
+
'background and end the turn — do not arm a loop; the wake-up brings you back. To glance at ' +
|
|
103
|
+
'interim output, `Read` the output file once, never in a sleep loop. If you are waiting on CI, ' +
|
|
104
|
+
'`pnpm josh followup` waits on it for you. The procedure is ' +
|
|
105
|
+
'`.claude/skills/workflow-commands/background-commands.md`, "A command that can take minutes is ' +
|
|
106
|
+
'issued in the background". **This rule fires on every occurrence, not once per run.**'
|
|
107
|
+
|
|
108
|
+
// The row itself, so `delivered-rules.ts` spreads one entry. `decide` returns true so it refuses every
|
|
109
|
+
// occurrence; it declares no `keeps` — waiting on the task exit is the *absence* of a loop, not a
|
|
110
|
+
// call, so the row is reported unmeasured rather than scored on an act that does not exist
|
|
111
|
+
// (`git-force.ts`).
|
|
112
|
+
const ROW = {
|
|
113
|
+
id: 'poll-loop',
|
|
114
|
+
is_trigger: bash_triggers.on_bash_command(is_poll_loop),
|
|
115
|
+
reason: POLL_LOOP_REASON,
|
|
116
|
+
decide: (): boolean => true,
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const poll_loop = {
|
|
120
|
+
POLL_LOOP_REASON,
|
|
121
|
+
ROW,
|
|
122
|
+
is_poll_loop,
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export { poll_loop }
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
|
|
2
|
+
import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
|
|
3
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
4
|
+
import { lane_paths } from '#scripts/lane/lane-paths'
|
|
5
|
+
import { run_cut, type RunCut } from '#scripts/run/run-cut'
|
|
6
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
7
|
+
import { bash_triggers } from './bash-triggers'
|
|
8
|
+
import { shell_segments } from './shell-segments'
|
|
9
|
+
|
|
10
|
+
// The pre-gate cut, delivered at the call it binds on (joshuafolkken/kit#1864).
|
|
11
|
+
//
|
|
12
|
+
// **The mechanism was there and nothing called it.** joshuafolkken/kit#1839 built the cut and
|
|
13
|
+
// joshuafolkken/kit#1850 measured the result: across six lane children — #1853, #1849, #1855, #1854,
|
|
14
|
+
// #1856 and #1847 — the cut was taken **0 times**. Four of the six issued the *entry* check
|
|
15
|
+
// `pnpm josh run:cut --resume <N>` and were answered `fresh`; not one issued `pnpm josh run:cut <N>`,
|
|
16
|
+
// the call that actually cuts. The procedure was read three to five times per run and remained one
|
|
17
|
+
// step of prose in the middle of it, so joshuafolkken/kit#1839's fourth acceptance condition — the
|
|
18
|
+
// drop in context per request — could not be judged at all.
|
|
19
|
+
//
|
|
20
|
+
// **This is the third time prose lost to a refusal.** joshuafolkken/kit#1344 measured three
|
|
21
|
+
// consecutive runs in which resident text about batching moved the number not at all, and
|
|
22
|
+
// joshuafolkken/kit#1460 measured the same for the investigation threshold; in both, a `PreToolUse`
|
|
23
|
+
// refusal was what finally moved it. A step a run is free to skip is a step that gets skipped under
|
|
24
|
+
// time pressure, and `run:hold` — the one boundary step that never gets missed — is the one that
|
|
25
|
+
// refuses.
|
|
26
|
+
|
|
27
|
+
const GATE_COMMANDS: ReadonlySet<string> = new Set(['gate'])
|
|
28
|
+
const CUT_COMMANDS: ReadonlySet<string> = new Set(['run:cut'])
|
|
29
|
+
// The three spellings that ask about a cut rather than take one: the fresh process's entry check, the
|
|
30
|
+
// teardown, and the record read. **Excluding them is the whole point** — four of the six measured
|
|
31
|
+
// children issued `--resume` and went straight on to the gate, so a predicate that counted any
|
|
32
|
+
// `run:cut` would have been silent on exactly the runs this rule exists for.
|
|
33
|
+
const CUT_MODE_FLAG = /(?:^|\s)--(?:resume|end|json)(?:[=\s]|$)/u
|
|
34
|
+
// **The one entry call the resumed half never makes** (joshuafolkken/kit#1867).
|
|
35
|
+
// `.claude/skills/workflow-commands/pre-gate-cut.md` sends a `fresh` verdict on to "claim the hold,
|
|
36
|
+
// ask the session boundary, read the issue, implement", and tells a `resume` verdict to "skip the
|
|
37
|
+
// title, the plan, the fresh hold claim and the implementation". So the hold claim is what a run made
|
|
38
|
+
// on the near side of the pre-gate boundary carries and the process the cut produced does not.
|
|
39
|
+
const HOLD_COMMANDS: ReadonlySet<string> = new Set(['run:hold'])
|
|
40
|
+
// **A release is not a claim, and the subcommand name alone cannot tell the two apart.** `run:release`
|
|
41
|
+
// is registered as the hold script under `--release`, so a segment naming the hold command may be
|
|
42
|
+
// either — the same asymmetry `CUT_MODE_FLAG` exists for one command up. Reading a release as a claim
|
|
43
|
+
// would put the resumed session, which releases at its merge, straight back into the denominator this
|
|
44
|
+
// predicate exists to keep it out of.
|
|
45
|
+
const HOLD_MODE_FLAG = /(?:^|\s)--release(?:[=\s]|$)/u
|
|
46
|
+
|
|
47
|
+
// **Alias-expanded rather than matched as text**, so `pnpm josh ga` and `pnpm josh rct` are the same
|
|
48
|
+
// calls as their canonical spellings. Segment-wise for the reason every other row here is: one shell
|
|
49
|
+
// line carries several commands, and a name quoted inside a body is not the command being invoked.
|
|
50
|
+
//
|
|
51
|
+
// **One reading of that question rather than one per name set.** Four predicates here differ only in
|
|
52
|
+
// which subcommands they look for and which mode flag turns the call into a different one, and a
|
|
53
|
+
// second copy of the walk is the clone `CLAUDE.md` prohibits — the copy nobody corrected would be the
|
|
54
|
+
// one that stops seeing an alias. `mode_flag` is optional because two of the four ask about the
|
|
55
|
+
// subcommand whatever mode it was invoked in.
|
|
56
|
+
function invokes_josh(command: string, names: ReadonlySet<string>, mode_flag?: RegExp): boolean {
|
|
57
|
+
return shell_segments
|
|
58
|
+
.segments_of(command)
|
|
59
|
+
.some(
|
|
60
|
+
(segment) =>
|
|
61
|
+
shell_segments.is_josh_command(segment, names) && mode_flag?.test(segment) !== true,
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function runs_the_gate(command: string): boolean {
|
|
66
|
+
return invokes_josh(command, GATE_COMMANDS)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function takes_the_cut(command: string): boolean {
|
|
70
|
+
return invokes_josh(command, CUT_COMMANDS, CUT_MODE_FLAG)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Whether this command claims the working tree, in either spelling and in neither release spelling.
|
|
74
|
+
function claims_the_hold(command: string): boolean {
|
|
75
|
+
return invokes_josh(command, HOLD_COMMANDS, HOLD_MODE_FLAG)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// **One half of the occasion, never the whole of it** (joshuafolkken/kit#1867). Taken alone this
|
|
79
|
+
// predicate enrols both processes of one obedient lane child: the cut relaunches a second session
|
|
80
|
+
// which issues this same entry check byte for byte and can never take a cut of its own, so the row
|
|
81
|
+
// read at half its true rate. `delivered-rules.ts` pairs it with `claims_the_hold`, which only the
|
|
82
|
+
// near half of the boundary makes.
|
|
83
|
+
//
|
|
84
|
+
// **The occasion the rule governs, as far as a transcript can answer it.** A lane child issues
|
|
85
|
+
// `pnpm josh run:cut --resume <N>` at its entry whatever it goes on to do, so a run that reaches for
|
|
86
|
+
// the command in any spelling is one this rule could have bound on. Whether a checkout *is* a lane is
|
|
87
|
+
// read from the working directory and appears nowhere in a transcript, so it cannot be the
|
|
88
|
+
// denominator — and taking the gate as the occasion instead would enrol every ordinary non-lane run,
|
|
89
|
+
// where the rule can never be kept, and `pnpm josh rule:value` would read the row low by
|
|
90
|
+
// construction. joshuafolkken/kit#1643 names exactly that failure.
|
|
91
|
+
function asks_about_the_cut(command: string): boolean {
|
|
92
|
+
return invokes_josh(command, CUT_COMMANDS)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// What the trigger has to know about the world, passed in so the decision itself is testable without
|
|
96
|
+
// a lane on disk and without a git call. `marked_issue` is the dispatch mark read from the
|
|
97
|
+
// environment — the fact that makes the human-or-child question mechanical rather than the model's to
|
|
98
|
+
// judge (joshuafolkken/kit#1904).
|
|
99
|
+
interface LaneCutState {
|
|
100
|
+
directory: string
|
|
101
|
+
carried: (now?: Date) => RunCut | undefined
|
|
102
|
+
marked_issue: string | undefined
|
|
103
|
+
// **The recent-window context verdict, read lazily** (joshuafolkken/kit#2312). It is a thunk, like
|
|
104
|
+
// `carried`, so `current_state` builds the object without pricing a session — the read happens only
|
|
105
|
+
// after the command and lane checks pass, off the handful of calls that actually run a lane's gate.
|
|
106
|
+
context_verdict: () => CostVerdict
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function current_state(): LaneCutState {
|
|
110
|
+
return {
|
|
111
|
+
directory: process.cwd(),
|
|
112
|
+
carried: run_cut.carried_cut_sync,
|
|
113
|
+
marked_issue: lane_child_marker.marked_issue(),
|
|
114
|
+
context_verdict: cost_cli.session_verdict,
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// **The dispatch mark is what tells a child apart from a person, and it counts only for this lane.**
|
|
119
|
+
// A person working in the lane carries no mark, so the rule stays silent for them — the
|
|
120
|
+
// human-or-child call is read from the environment, never left to the model. A mark that leaked in
|
|
121
|
+
// from the parent session names some other issue, so requiring it to equal this lane's issue reads
|
|
122
|
+
// that leak as a person too (joshuafolkken/kit#1904).
|
|
123
|
+
//
|
|
124
|
+
// **The resumed process must also stay silent, and the cut record is what says so.** After a cut,
|
|
125
|
+
// `adopt_cut` leaves the record in place with `is_handed_off: false`, so a carried record naming this
|
|
126
|
+
// issue means the process asking is the one the cut already produced. Without this half the rule
|
|
127
|
+
// would fire on the fresh process too — refusing a gate call on a run that had kept the rule
|
|
128
|
+
// perfectly, which `prompts/collaboration-workflow/rule-delivery.md` calls worse than no hook at all.
|
|
129
|
+
function uncut_lane_issue(state: LaneCutState): string | undefined {
|
|
130
|
+
const issue = lane_paths.lane_issue_of(state.directory)
|
|
131
|
+
|
|
132
|
+
if (issue === undefined) return undefined
|
|
133
|
+
|
|
134
|
+
if (state.marked_issue !== issue) return undefined
|
|
135
|
+
|
|
136
|
+
return state.carried()?.issue === issue ? undefined : issue
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// **The cut is taken only when the recent-window context is worth its resume** (joshuafolkken/kit#2312).
|
|
140
|
+
// Below the shared `CONTEXT_CUT_THRESHOLD` a short lane has no accumulation a cut would drop, so the
|
|
141
|
+
// gate runs uncut rather than paying for a relaunch; an unmeasurable session keeps the old
|
|
142
|
+
// unconditional cut as the safety net joshuafolkken/kit#1933 relies on. The verdict is
|
|
143
|
+
// `cost_cli.session_verdict`'s, the same statistic and threshold `run:cut` and the implementation-phase
|
|
144
|
+
// cut read, so the guard and the command can never disagree about whether a cut was due.
|
|
145
|
+
function warrants_the_cut(verdict: CostVerdict): boolean {
|
|
146
|
+
return verdict !== cost_verdict.UNDER_VERDICT
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// **The command test comes first and the world is consulted second.** This predicate is asked of
|
|
150
|
+
// every `Bash` call in the run, so the cheap string match is what keeps a git call — and, now, a
|
|
151
|
+
// transcript read — off all of them but the handful that actually run the gate.
|
|
152
|
+
function is_uncut_gate(command: string, state: LaneCutState = current_state()): boolean {
|
|
153
|
+
if (!runs_the_gate(command) || uncut_lane_issue(state) === undefined) return false
|
|
154
|
+
|
|
155
|
+
return warrants_the_cut(state.context_verdict())
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// The instruction in the shape a refusal can carry: what the cut is for, what each verdict means, and
|
|
159
|
+
// the reissue sentence every delivery needs. **The verdicts are spelled out rather than pointed at**,
|
|
160
|
+
// because `cut` is the only one that ends the turn and a run told merely to "take the cut" would have
|
|
161
|
+
// to go and read which of the other five leave it holding the run — the same reason the WIP cap's
|
|
162
|
+
// delivery names its three interrupt tests instead of naming the file they live in.
|
|
163
|
+
const PRE_GATE_CUT_REASON =
|
|
164
|
+
'⛔ pre-gate cut: this checkout is a lane dispatched for this issue and the gate is the boundary to ' +
|
|
165
|
+
'cut at, so take the cut before running it. `pnpm josh run:cut <N>` ends this process and ' +
|
|
166
|
+
'relaunches a fresh one that resumes from the gate, dropping the thinking built up while ' +
|
|
167
|
+
'implementing rather than carrying it on every later request — joshuafolkken/kit#1839 measured ' +
|
|
168
|
+
'176K of 204K output riding across that boundary, and joshuafolkken/kit#1864 measured the step ' +
|
|
169
|
+
'itself firing 0 times in 6 lane children while it was carried as prose. Issue ' +
|
|
170
|
+
'`pnpm josh run:cut <N>` now, and read the verdict: on `cut`, **end the turn immediately** — the ' +
|
|
171
|
+
'fresh process owns the run from there and must not be waited for; on `not-a-lane`, `unready`, ' +
|
|
172
|
+
'`busy`, `failed` or `unknown`, this process carries the run on and the gate is simply the next ' +
|
|
173
|
+
'call. Never relaunch a second process after `busy`. This fired because the dispatch mark names ' +
|
|
174
|
+
'this lane; a person working here carries no mark and sees no refusal, so there is no ' +
|
|
175
|
+
'human-or-child judgement left to make. The procedure is ' +
|
|
176
|
+
'`.claude/skills/workflow-commands/pre-gate-cut.md`. Reissue the gate once the cut has answered — ' +
|
|
177
|
+
'this fires once per run, so it cannot repeat on the call in hand.'
|
|
178
|
+
|
|
179
|
+
// **The pre-gate cut is two acts, one call apart** (joshuafolkken/kit#2034), so its `rule:value`
|
|
180
|
+
// denominator is only the runs that reached the boundary: a run that issues the cut's entry check and,
|
|
181
|
+
// somewhere in the same run, claimed the working-tree hold — the near half of the boundary a fresh
|
|
182
|
+
// process never makes. Read only by the offline measurement, never the live delivery path. Moved here
|
|
183
|
+
// from `delivered-rules.ts` so the pre-gate row lives with its rule, as `implementation-cut.ts`'s does
|
|
184
|
+
// (joshuafolkken/kit#2346).
|
|
185
|
+
function reaches_the_pre_gate_boundary(
|
|
186
|
+
call: GuardedCall,
|
|
187
|
+
_turn: ReadonlyArray<GuardedCall>,
|
|
188
|
+
run: ReadonlyArray<GuardedCall>,
|
|
189
|
+
): boolean {
|
|
190
|
+
if (!bash_triggers.on_bash_command(asks_about_the_cut)(call)) return false
|
|
191
|
+
|
|
192
|
+
return run.some((issued) => bash_triggers.on_bash_command(claims_the_hold)(issued))
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const pre_gate_cut = {
|
|
196
|
+
PRE_GATE_CUT_REASON,
|
|
197
|
+
asks_about_the_cut,
|
|
198
|
+
claims_the_hold,
|
|
199
|
+
is_uncut_gate,
|
|
200
|
+
reaches_the_pre_gate_boundary,
|
|
201
|
+
runs_the_gate,
|
|
202
|
+
takes_the_cut,
|
|
203
|
+
uncut_lane_issue,
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export type { LaneCutState }
|
|
207
|
+
export { pre_gate_cut }
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
|
|
2
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
3
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
4
|
+
import { tail_commands } from './tail-commands'
|
|
5
|
+
|
|
6
|
+
// The stand-down that keeps the `issue-comments` rule from refusing a body read the run has already
|
|
7
|
+
// earned (joshuafolkken/kit#1905). The rule exists so a run reads an Issue's comments before building
|
|
8
|
+
// on its body — but a run that already read them, and later reads the body again (a post-merge state
|
|
9
|
+
// check, a re-read), was refused a second time for a read it had already made. **The delivery path
|
|
10
|
+
// sees only the raw transcript tail** — `delivered-rules.ts` names the reason the run's own calls are
|
|
11
|
+
// not handed to it — so the earlier read is recovered by parsing that tail here, the same way
|
|
12
|
+
// `time-batch-guard.ts` parses it, rather than from a call array that does not reach delivery.
|
|
13
|
+
//
|
|
14
|
+
// **It reads comments in the josh spelling too.** `pnpm josh issue:read <N>` prints the body and every
|
|
15
|
+
// comment in one call, so a run that opened an Issue with it has read the comments as surely as one
|
|
16
|
+
// that passed `--comments` — and that spelling is the one the workflow itself reaches for, so leaving
|
|
17
|
+
// it out would refuse the reader that obeyed the rule most directly.
|
|
18
|
+
|
|
19
|
+
// The path segment `…/issues/<N>` and `…/issues/<N>/comments` both name the Issue in the same capture.
|
|
20
|
+
const ISSUE_PATH_NUMBER = /issues\/(\d+)/gu
|
|
21
|
+
// The positional after `gh issue view`, past any flags that precede it.
|
|
22
|
+
const ISSUE_VIEW_NUMBER = /\bissue\s+view\s+(?:-{1,2}\S+\s+)*(\d+)/u
|
|
23
|
+
// The run of numbers `pnpm josh issue:read` takes as its positional arguments.
|
|
24
|
+
const ISSUE_READ_ARGUMENTS = /\bissue:read\b([\s\d]*)/u
|
|
25
|
+
const A_NUMBER = /^\d+$/u
|
|
26
|
+
|
|
27
|
+
// A command that prints an Issue's comments: the comments endpoint, `gh issue view … --comments`, or
|
|
28
|
+
// the josh command that reads body and comments together.
|
|
29
|
+
const COMMENTS_ENDPOINT = /issues\/\d+\/comments\b/u
|
|
30
|
+
const VIEW_WITH_COMMENTS = /\bissue\s+view\b[^\n]*--comments\b/u
|
|
31
|
+
const ISSUE_READ_COMMAND = /\bissue:read\b/u
|
|
32
|
+
|
|
33
|
+
function add_issue_read_numbers(command: string, numbers: Set<number>): void {
|
|
34
|
+
const match = ISSUE_READ_ARGUMENTS.exec(command)
|
|
35
|
+
|
|
36
|
+
if (match === null) return
|
|
37
|
+
|
|
38
|
+
const tokens = (match[1] ?? '').split(/\s+/u)
|
|
39
|
+
|
|
40
|
+
for (const token of tokens) {
|
|
41
|
+
if (A_NUMBER.test(token)) numbers.add(Number(token))
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Every Issue number a command names, across the three read spellings the refusal covers.
|
|
46
|
+
function issue_numbers_of(command: string): Set<number> {
|
|
47
|
+
const numbers = new Set<number>()
|
|
48
|
+
|
|
49
|
+
for (const match of command.matchAll(ISSUE_PATH_NUMBER)) numbers.add(Number(match[1]))
|
|
50
|
+
|
|
51
|
+
const view = ISSUE_VIEW_NUMBER.exec(command)
|
|
52
|
+
|
|
53
|
+
if (view !== null) numbers.add(Number(view[1]))
|
|
54
|
+
|
|
55
|
+
add_issue_read_numbers(command, numbers)
|
|
56
|
+
|
|
57
|
+
return numbers
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function fetches_comments(command: string): boolean {
|
|
61
|
+
return (
|
|
62
|
+
COMMENTS_ENDPOINT.test(command) ||
|
|
63
|
+
VIEW_WITH_COMMENTS.test(command) ||
|
|
64
|
+
ISSUE_READ_COMMAND.test(command)
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function reads_target_comments(command: string, target: Set<number>): boolean {
|
|
69
|
+
if (!fetches_comments(command)) return false
|
|
70
|
+
|
|
71
|
+
for (const number of issue_numbers_of(command)) {
|
|
72
|
+
if (target.has(number)) return true
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return false
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// **Whether the run has already read the comments of the Issue this body read targets.** The tail is
|
|
79
|
+
// scanned for a prior read of the same number, so a body read that names no Issue — and a run with no
|
|
80
|
+
// earlier comment read — both answer false and are refused exactly as before.
|
|
81
|
+
function already_read_comments_for(tail: string, command: string): boolean {
|
|
82
|
+
const target = issue_numbers_of(command)
|
|
83
|
+
|
|
84
|
+
if (target.size === 0) return false
|
|
85
|
+
|
|
86
|
+
return tail_commands
|
|
87
|
+
.prior_bash_commands(tail)
|
|
88
|
+
.some((prior) => reads_target_comments(prior, target))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// The `already_satisfied` predicate wired onto the issue-comments row of `delivered-rules.ts`: this
|
|
92
|
+
// call's command against the tail, once the same tool-name gate `on_bash_command` applies has passed.
|
|
93
|
+
function already_read_for_call(tail: string, call: GuardedCall): boolean {
|
|
94
|
+
if (call.name !== cost_blocks.BASH_TOOL) return false
|
|
95
|
+
|
|
96
|
+
return already_read_comments_for(tail, time_shell.bash_command(call.input))
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const prior_comment_read = {
|
|
100
|
+
already_read_comments_for,
|
|
101
|
+
already_read_for_call,
|
|
102
|
+
fetches_comments,
|
|
103
|
+
issue_numbers_of,
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export { prior_comment_read }
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { bash_triggers } from './bash-triggers'
|
|
2
|
+
|
|
3
|
+
// The trigger and the delivered text behind the `raw-field-body` row of `delivered-rules.ts`
|
|
4
|
+
// (joshuafolkken/kit#2304). Its sibling `shell-body` refuses a body a run passed *inline* so the shell
|
|
5
|
+
// evaluates it; this one refuses a body a run passed *by path with the wrong flag*, so the path is
|
|
6
|
+
// posted as text.
|
|
7
|
+
//
|
|
8
|
+
// **`gh api` has two spellings of "pass this by path" and one silently breaks.** `-F` / `--field`
|
|
9
|
+
// reads the file when the value opens with `@`; `-f` / `--raw-field` sends the value verbatim, so
|
|
10
|
+
// `-f body=@<path>` posts the literal string `@<path>`. The two differ by a single character, `gh`
|
|
11
|
+
// exits 0 and returns a comment URL either way, and the break is invisible until a person reads the
|
|
12
|
+
// issue — joshuafolkken/kit#2304 recorded two park comments (`@/tmp/2294-park.md` and a decision
|
|
13
|
+
// record) lost exactly this way, which was the only place the reason for a stopped child was written.
|
|
14
|
+
//
|
|
15
|
+
// **The trigger is the raw-field flag with an `@`-opening body, not `@` alone.** `-F` / `--field
|
|
16
|
+
// body=@<path>` is the spelling the rule *asks* for and stays silent; a `-f body="plain text"` with no
|
|
17
|
+
// `@` is not a file reference and stays silent; a `-f 'labels[]=needs-decision'` names no body and
|
|
18
|
+
// stays silent. Only a raw field whose `body=` value begins with `@` is the misfire.
|
|
19
|
+
//
|
|
20
|
+
// **It fires on every occurrence** (`git-force.ts`): each misfire posts a broken comment of its own,
|
|
21
|
+
// so refused-once-and-free-after would let the second one through.
|
|
22
|
+
|
|
23
|
+
// A raw field flag — `-f` or `--raw-field`, never the file-reading `-F` / `--field` — carrying a
|
|
24
|
+
// `body=` value that opens with `@`. The flag is anchored to a word boundary so the `-f` inside
|
|
25
|
+
// `--field` is not mistaken for the short raw flag, and the opening quote may sit on either side of
|
|
26
|
+
// `body=` (`-f "body=@…"` and `-f body="@…"` are one command to the shell), matching the shapes
|
|
27
|
+
// `shell-body-trigger.ts` reads.
|
|
28
|
+
const RAW_FIELD_BODY_AT = /(?:^|\s)(?:-f|--raw-field)[\s=]+['"]?body=['"]?@/u
|
|
29
|
+
|
|
30
|
+
function posts_at_path_literally(command: string): boolean {
|
|
31
|
+
return RAW_FIELD_BODY_AT.test(command)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// The instruction in the shape a refusal can carry: what the flag is doing, the one-character trap
|
|
35
|
+
// that hides it, and the single command that cannot take the wrong flag. The damage is named because
|
|
36
|
+
// it reads as unbelievable — the call succeeds and returns a URL while posting the path as text.
|
|
37
|
+
const RAW_FIELD_BODY_REASON =
|
|
38
|
+
'⛔ literal @path body: this passes `body=@<path>` to `gh api` with a raw field flag (`-f` / ' +
|
|
39
|
+
'`--raw-field`), which sends the value verbatim — the string `@<path>` is posted as the comment, ' +
|
|
40
|
+
'not the file it points at. `-F` / `--field` is the flag that reads the file, and the two spellings ' +
|
|
41
|
+
'differ by one character while `gh` exits 0 and returns a comment URL either way, so the break is ' +
|
|
42
|
+
'invisible until a person reads the issue (joshuafolkken/kit#2304 lost two park comments this way). ' +
|
|
43
|
+
'Post an issue or PR comment with `pnpm josh issue:comment <N> --body-file <path>` — the one ' +
|
|
44
|
+
'spelling, which cannot take the wrong flag. The rule and the safe forms are in ' +
|
|
45
|
+
'`prompts/collaboration-workflow/shell-body.md`. This rule fires on every occurrence, not once per run.'
|
|
46
|
+
|
|
47
|
+
const ROW = {
|
|
48
|
+
id: 'raw-field-body',
|
|
49
|
+
is_trigger: bash_triggers.on_bash_command(posts_at_path_literally),
|
|
50
|
+
reason: RAW_FIELD_BODY_REASON,
|
|
51
|
+
decide: (): boolean => true,
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const raw_field_body = { RAW_FIELD_BODY_REASON, ROW, posts_at_path_literally }
|
|
55
|
+
|
|
56
|
+
export { raw_field_body }
|