@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,387 @@
|
|
|
1
|
+
import { poll } from '#scripts/lib/poll'
|
|
2
|
+
import { git_gh_pr_auto_merge } from './git-gh-pr-auto-merge'
|
|
3
|
+
import { git_gh_pr_snapshot } from './git-gh-pr-snapshot'
|
|
4
|
+
import {
|
|
5
|
+
describe_pr_failure,
|
|
6
|
+
evaluate_pr_state,
|
|
7
|
+
is_auto_merge_blocked,
|
|
8
|
+
is_review_decision_decisive,
|
|
9
|
+
type PrEvaluation,
|
|
10
|
+
} from './git-pr-checks-eval'
|
|
11
|
+
import { parse_pr_state_snapshot, read_string, type PrStateSnapshot } from './git-pr-checks-parse'
|
|
12
|
+
import { package_name_schema } from './schemas'
|
|
13
|
+
|
|
14
|
+
const SECONDS_TO_MS = 1000
|
|
15
|
+
const CHECK_WAIT_INTERVAL_MS = 10_000
|
|
16
|
+
// The wait has to outlast what the CI it is watching is allowed to take, or it gives up on a run
|
|
17
|
+
// that is still legitimately progressing — which is what 180 seconds did to every consumer whose
|
|
18
|
+
// suite includes E2E: `followup` became a command that needed `JOSH_CI_TIMEOUT_SECONDS` set by hand
|
|
19
|
+
// on every invocation and, when that was forgotten, exited red beside a CI that was still running.
|
|
20
|
+
// The budget is therefore read off the distributed `templates/workflows/ci.yml` rather than picked
|
|
21
|
+
// as a round number: its longest chain is `e2e` (25 minutes) behind the `playwright-image` job it
|
|
22
|
+
// needs (2), so 27 minutes is the longest run that workflow permits, and five minutes of
|
|
23
|
+
// runner-queue headroom goes on top. A unit test walks the `needs` graph of the distributed
|
|
24
|
+
// workflows and fails if any declared budget outgrows this value; a job that declares no cap is a
|
|
25
|
+
// gap the number cannot promise to cover rather than a reason to inflate it. Waiting longer costs nothing on a fast project: polling returns as
|
|
26
|
+
// soon as the checks settle, and a failed check throws immediately rather than waiting out the
|
|
27
|
+
// budget. See joshuafolkken/kit#851.
|
|
28
|
+
const DEFAULT_TIMEOUT_SECONDS = 1920
|
|
29
|
+
|
|
30
|
+
// The poll loop sleeps between attempts and not after the last one, so spanning a budget takes one
|
|
31
|
+
// more attempt than the budget holds intervals: without the `+ 1` a 60-second setting waited 50.
|
|
32
|
+
function compute_max_attempts(timeout_seconds: number, interval_ms: number): number {
|
|
33
|
+
return Math.ceil(timeout_seconds / (interval_ms / SECONDS_TO_MS)) + 1
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const DEFAULT_MAX_ATTEMPTS = compute_max_attempts(DEFAULT_TIMEOUT_SECONDS, CHECK_WAIT_INTERVAL_MS)
|
|
37
|
+
|
|
38
|
+
function get_configured_max_attempts(): number {
|
|
39
|
+
const environment_seconds = Number(process.env['JOSH_CI_TIMEOUT_SECONDS'])
|
|
40
|
+
|
|
41
|
+
return Number.isFinite(environment_seconds) && environment_seconds > 0
|
|
42
|
+
? compute_max_attempts(environment_seconds, CHECK_WAIT_INTERVAL_MS)
|
|
43
|
+
: DEFAULT_MAX_ATTEMPTS
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const CHECK_MAX_ATTEMPTS = get_configured_max_attempts()
|
|
47
|
+
const DEFAULT_STABLE_READS = 2
|
|
48
|
+
|
|
49
|
+
// One authoritative gate poll is enough once `pr_checks_watch` has already seen every check finish:
|
|
50
|
+
// the watch is the first confirmation, so the poll that follows need only agree once. The two reads
|
|
51
|
+
// exist for the pending→settled window a bare poll opens on, and the watch has itself already spanned
|
|
52
|
+
// that window — so waiting a second interval after it merely re-proves what the watch established
|
|
53
|
+
// (joshuafolkken/kit#2029).
|
|
54
|
+
const WATCH_CONFIRMED_STABLE_READS = 1
|
|
55
|
+
|
|
56
|
+
// **A read that failed is not a verdict.** The loop reads every ten seconds, so a dropped connection,
|
|
57
|
+
// a rate limit or one request over its budget is the kind of failure the *next* poll answers — and
|
|
58
|
+
// ending a 32-minute wait on one of them costs the whole run again. Before joshuafolkken/kit#1077
|
|
59
|
+
// every one of them rejected straight out of the loop, because the fetch had no `catch` at all.
|
|
60
|
+
//
|
|
61
|
+
// **The cap is what keeps "ask again" from becoming "wait out the budget in silence".** Three
|
|
62
|
+
// consecutive failures and the wait ends carrying the failure that caused it, so an endpoint that has
|
|
63
|
+
// stopped answering is reported as itself rather than as a timeout thirty minutes later. The counter
|
|
64
|
+
// is *consecutive*: any successful read puts it back to zero, because what it measures is "nobody is
|
|
65
|
+
// answering", not "the run has been unlucky".
|
|
66
|
+
//
|
|
67
|
+
// **The loop's own budget is unchanged**, so nothing here can extend a wait: a fetch that never
|
|
68
|
+
// succeeds still runs out of attempts. And a failed read never counts as a passing one — it resets
|
|
69
|
+
// the stable-read window, the same direction joshuafolkken/kit#925 / #950 / #973 / #1048 take.
|
|
70
|
+
const MAX_CONSECUTIVE_READ_FAILURES = 3
|
|
71
|
+
|
|
72
|
+
// The wait's own timeout, named so a caller can tell it apart from a failing check. The bounded
|
|
73
|
+
// watch in `git-pr-checks-watch.ts` answers `timed_out` for one and rethrows the other, and matching
|
|
74
|
+
// on prose is the only distinction the loop offers (joshuafolkken/kit#1028).
|
|
75
|
+
const PR_CHECKS_TIMEOUT_MESSAGE = 'Timed out while waiting for PR checks to complete.'
|
|
76
|
+
|
|
77
|
+
function is_pr_checks_timeout(error: unknown): boolean {
|
|
78
|
+
return error instanceof Error && error.message === PR_CHECKS_TIMEOUT_MESSAGE
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Whether this poll has to read the review listing, asked of the snapshot *without* one. It is a
|
|
82
|
+
// question about the current poll rather than a cache key: answering `false` skips one request now
|
|
83
|
+
// and nothing is carried into the next poll (joshuafolkken/kit#1043).
|
|
84
|
+
type ReviewDecisionPredicate = (snapshot: PrStateSnapshot) => boolean
|
|
85
|
+
|
|
86
|
+
// The conservative answer, and the one every evaluator that does not say gets: read it every poll,
|
|
87
|
+
// which is what all of them did before the predicate existed.
|
|
88
|
+
const SHOULD_ALWAYS_READ_REVIEW_DECISION: ReviewDecisionPredicate = () => true
|
|
89
|
+
|
|
90
|
+
type PrStateFetcher = (
|
|
91
|
+
branch_name: string,
|
|
92
|
+
should_read_review_decision: ReviewDecisionPredicate,
|
|
93
|
+
) => Promise<PrStateSnapshot>
|
|
94
|
+
|
|
95
|
+
// What the loop asks of each snapshot, and what it says when the answer is `failure`.
|
|
96
|
+
//
|
|
97
|
+
// The loop used to hard-code the merge gate's own verdict, which is the strictest question anyone
|
|
98
|
+
// asks of a pull request: mergeable *and* every required check green *and* no change request
|
|
99
|
+
// standing. `gh pr checks --watch` asked a much weaker one — have the checks finished? — and the
|
|
100
|
+
// conversion in joshuafolkken/kit#1028 gave the watch the strict verdict by accident: on a repository
|
|
101
|
+
// whose `mergeable_state` is `blocked`, the watch could never succeed, and a standing change request
|
|
102
|
+
// made it *throw* out of `pnpm josh git`. Naming the question is what keeps the two apart.
|
|
103
|
+
//
|
|
104
|
+
// **`should_read_review_decision` is part of the same question.** An evaluator that never reads
|
|
105
|
+
// `review_decision` must not make the fetcher pay for it, and one that does must get a value read in
|
|
106
|
+
// the poll it decides on. Omitting it reads the listing on every poll, so a new evaluator is never
|
|
107
|
+
// silently cheaper than it is correct.
|
|
108
|
+
interface PrStateEvaluator {
|
|
109
|
+
evaluate: (snapshot: PrStateSnapshot) => PrEvaluation
|
|
110
|
+
describe: (snapshot: PrStateSnapshot) => string
|
|
111
|
+
should_read_review_decision?: ReviewDecisionPredicate
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// The merge gate's verdict, and the default: an omitted `evaluator` leaves every existing caller
|
|
115
|
+
// exactly where it was.
|
|
116
|
+
const MERGE_GATE_EVALUATOR: PrStateEvaluator = {
|
|
117
|
+
evaluate: evaluate_pr_state,
|
|
118
|
+
describe: describe_pr_failure,
|
|
119
|
+
should_read_review_decision: is_review_decision_decisive,
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
interface WaitForPrSuccessOptions {
|
|
123
|
+
branch_name: string
|
|
124
|
+
fetcher: PrStateFetcher
|
|
125
|
+
interval_ms: number
|
|
126
|
+
max_attempts: number
|
|
127
|
+
required_stable_reads: number
|
|
128
|
+
evaluator?: PrStateEvaluator
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function parse_repo_name_from_package(package_json_content: string): string {
|
|
132
|
+
const result = package_name_schema.safeParse(JSON.parse(package_json_content))
|
|
133
|
+
|
|
134
|
+
if (!result.success) {
|
|
135
|
+
throw new Error('package.json name field is missing or not a non-empty string')
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return result.data.name
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function advance_stable_count(previous: number, state: PrEvaluation): number {
|
|
142
|
+
return state === 'success' ? previous + 1 : 0
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function classify_poll_result(input: {
|
|
146
|
+
snapshot: PrStateSnapshot
|
|
147
|
+
stable_count: number
|
|
148
|
+
required_stable_reads: number
|
|
149
|
+
evaluator: PrStateEvaluator
|
|
150
|
+
}): { is_done: boolean; next_stable_count: number } {
|
|
151
|
+
const state = input.evaluator.evaluate(input.snapshot)
|
|
152
|
+
|
|
153
|
+
if (state === 'failure') throw new Error(input.evaluator.describe(input.snapshot))
|
|
154
|
+
|
|
155
|
+
const next_stable_count = advance_stable_count(input.stable_count, state)
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
is_done: next_stable_count >= input.required_stable_reads,
|
|
159
|
+
next_stable_count,
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
interface PollAttempt {
|
|
164
|
+
options: WaitForPrSuccessOptions
|
|
165
|
+
stable_count: number
|
|
166
|
+
failure_count: number
|
|
167
|
+
attempt: number
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
interface PollAttemptResult {
|
|
171
|
+
snapshot?: PrStateSnapshot
|
|
172
|
+
next_stable_count: number
|
|
173
|
+
next_failure_count: number
|
|
174
|
+
// What this poll could not be read with, carried so that a wait ending on an unreadable poll can
|
|
175
|
+
// report *that* rather than the timeout. Absent on every poll that was read.
|
|
176
|
+
read_failure?: unknown
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// The two things one poll can come back with, kept apart so that only the *read* is retried. The
|
|
180
|
+
// throw `classify_poll_result` raises on a `failure` verdict is an answer — the checks are red — and
|
|
181
|
+
// retrying it would undo the fast fail joshuafolkken/kit#990 added.
|
|
182
|
+
type SnapshotRead =
|
|
183
|
+
{ kind: 'read'; snapshot: PrStateSnapshot } | { kind: 'unreadable'; cause: unknown }
|
|
184
|
+
|
|
185
|
+
async function read_pr_state(
|
|
186
|
+
input: PollAttempt,
|
|
187
|
+
evaluator: PrStateEvaluator,
|
|
188
|
+
): Promise<SnapshotRead> {
|
|
189
|
+
try {
|
|
190
|
+
const snapshot = await input.options.fetcher(
|
|
191
|
+
input.options.branch_name,
|
|
192
|
+
evaluator.should_read_review_decision ?? SHOULD_ALWAYS_READ_REVIEW_DECISION,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
return { kind: 'read', snapshot }
|
|
196
|
+
} catch (error) {
|
|
197
|
+
return { kind: 'unreadable', cause: error }
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// The loop sleeps between attempts and not after the last one, so a poll that is about to be the
|
|
202
|
+
// final one returns immediately and lets the caller run out of attempts.
|
|
203
|
+
async function sleep_before_next_attempt(input: PollAttempt): Promise<void> {
|
|
204
|
+
if (input.attempt < input.options.max_attempts - 1) {
|
|
205
|
+
await poll.sleep(input.options.interval_ms)
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// The unreadable branch: count it, give up at the cap with the failure that caused it, and otherwise
|
|
210
|
+
// wait out the interval exactly as a pending poll does — without the sleep a broken endpoint would be
|
|
211
|
+
// spun on rather than re-read.
|
|
212
|
+
async function retry_after_unreadable(
|
|
213
|
+
input: PollAttempt,
|
|
214
|
+
cause: unknown,
|
|
215
|
+
): Promise<PollAttemptResult> {
|
|
216
|
+
const next_failure_count = input.failure_count + 1
|
|
217
|
+
if (next_failure_count >= MAX_CONSECUTIVE_READ_FAILURES) throw cause
|
|
218
|
+
|
|
219
|
+
// The reason goes in the line. Where the next read succeeds nothing else ever reports these, and
|
|
220
|
+
// an operator cannot tell a rate limit from expired auth from a dropped connection without it.
|
|
221
|
+
console.warn(
|
|
222
|
+
`Could not read the PR state (${String(next_failure_count)}/${String(MAX_CONSECUTIVE_READ_FAILURES)}); asking again on the next poll: ${String(cause)}`,
|
|
223
|
+
)
|
|
224
|
+
await sleep_before_next_attempt(input)
|
|
225
|
+
|
|
226
|
+
return { next_stable_count: 0, next_failure_count, read_failure: cause }
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// What the loop throws when it runs out of attempts. A wait whose **last** poll could not be read
|
|
230
|
+
// ends on that failure rather than on the timeout: reporting expired auth or a rate limit as "the
|
|
231
|
+
// checks are still running" is exactly the misread this file refuses everywhere else, and
|
|
232
|
+
// `is_pr_checks_timeout` would otherwise let `git-pr-checks-watch.ts` answer `timed_out` for it.
|
|
233
|
+
function to_exhaustion_error(last_read_failure: unknown): unknown {
|
|
234
|
+
return last_read_failure ?? new Error(PR_CHECKS_TIMEOUT_MESSAGE)
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
async function attempt_pr_success_poll(input: PollAttempt): Promise<PollAttemptResult> {
|
|
238
|
+
const evaluator = input.options.evaluator ?? MERGE_GATE_EVALUATOR
|
|
239
|
+
const read = await read_pr_state(input, evaluator)
|
|
240
|
+
if (read.kind === 'unreadable') return await retry_after_unreadable(input, read.cause)
|
|
241
|
+
|
|
242
|
+
const classification = classify_poll_result({
|
|
243
|
+
snapshot: read.snapshot,
|
|
244
|
+
stable_count: input.stable_count,
|
|
245
|
+
required_stable_reads: input.options.required_stable_reads,
|
|
246
|
+
evaluator,
|
|
247
|
+
})
|
|
248
|
+
|
|
249
|
+
if (classification.is_done) {
|
|
250
|
+
return { snapshot: read.snapshot, next_stable_count: 0, next_failure_count: 0 }
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
await sleep_before_next_attempt(input)
|
|
254
|
+
|
|
255
|
+
return { next_stable_count: classification.next_stable_count, next_failure_count: 0 }
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
async function wait_for_pr_success(options: WaitForPrSuccessOptions): Promise<PrStateSnapshot> {
|
|
259
|
+
// The whole carry-over of one poll into the next, in one value: the stable-read window, the
|
|
260
|
+
// consecutive-failure count, and what the last poll could not be read with.
|
|
261
|
+
let carried: PollAttemptResult = { next_stable_count: 0, next_failure_count: 0 }
|
|
262
|
+
|
|
263
|
+
for (let attempt = 0; attempt < options.max_attempts; attempt += 1) {
|
|
264
|
+
console.info(`Checking PR status… (${String(attempt + 1)}/${String(options.max_attempts)})`)
|
|
265
|
+
carried = await attempt_pr_success_poll({
|
|
266
|
+
options,
|
|
267
|
+
stable_count: carried.next_stable_count,
|
|
268
|
+
failure_count: carried.next_failure_count,
|
|
269
|
+
attempt,
|
|
270
|
+
})
|
|
271
|
+
|
|
272
|
+
if (carried.snapshot !== undefined) return carried.snapshot
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
throw to_exhaustion_error(carried.read_failure)
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// The snapshot module rather than `git-gh-command`, which is deliberate: `git-gh-command` also
|
|
279
|
+
// exposes the watch, and the watch now polls through this file (joshuafolkken/kit#1028). Naming the
|
|
280
|
+
// one read it actually needs keeps that from closing into an import cycle.
|
|
281
|
+
//
|
|
282
|
+
// **Three requests, and a fourth only where it can change the answer.** The pull request detail and
|
|
283
|
+
// the two commit listings are read every poll because `mergeable_state` and the rollup both move
|
|
284
|
+
// while CI runs; the review listing is read when the predicate says this poll's verdict turns on it.
|
|
285
|
+
// A `followup` that waits out its whole 32-minute budget went from about 800 requests to about 600
|
|
286
|
+
// (joshuafolkken/kit#1043).
|
|
287
|
+
async function default_fetch_pr_state(
|
|
288
|
+
branch_name: string,
|
|
289
|
+
should_read_review_decision: ReviewDecisionPredicate = SHOULD_ALWAYS_READ_REVIEW_DECISION,
|
|
290
|
+
): Promise<PrStateSnapshot> {
|
|
291
|
+
const checks = await git_gh_pr_snapshot.pr_get_checks_snapshot(branch_name)
|
|
292
|
+
const snapshot = parse_pr_state_snapshot(checks.snapshot_json)
|
|
293
|
+
|
|
294
|
+
if (!should_read_review_decision(snapshot)) return snapshot
|
|
295
|
+
|
|
296
|
+
const decision = await git_gh_pr_snapshot.pr_get_review_decision(checks.pr_number)
|
|
297
|
+
|
|
298
|
+
return { ...snapshot, review_decision: read_string(decision) }
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// **`required_stable_reads` is a parameter, not a constant, so the caller can lower it** — `run_checks`
|
|
302
|
+
// passes `WATCH_CONFIRMED_STABLE_READS` when the watch already confirmed completion. It defaults to
|
|
303
|
+
// `DEFAULT_STABLE_READS`, so every caller that names only the branch is exactly where it was.
|
|
304
|
+
async function wait_for_pr_success_default(
|
|
305
|
+
branch_name: string,
|
|
306
|
+
required_stable_reads: number = DEFAULT_STABLE_READS,
|
|
307
|
+
): Promise<PrStateSnapshot> {
|
|
308
|
+
return await wait_for_pr_success({
|
|
309
|
+
branch_name,
|
|
310
|
+
fetcher: default_fetch_pr_state,
|
|
311
|
+
interval_ms: CHECK_WAIT_INTERVAL_MS,
|
|
312
|
+
max_attempts: CHECK_MAX_ATTEMPTS,
|
|
313
|
+
required_stable_reads,
|
|
314
|
+
})
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Where a pull request GitHub merges on its own stands (joshuafolkken/kit#2497). `failed` is what
|
|
318
|
+
// auto-merge never fires under — a red required check, a conflict, a requested change — so a wait on
|
|
319
|
+
// it ends now rather than at the budget; a red check outside the required list is not among them
|
|
320
|
+
// (`is_auto_merge_blocked`). A read that failed answers `waiting`, so a poll asks again.
|
|
321
|
+
type MergeProgress = 'merged' | 'failed' | 'waiting'
|
|
322
|
+
|
|
323
|
+
async function read_merge_progress(branch_name: string): Promise<MergeProgress> {
|
|
324
|
+
if (await git_gh_pr_auto_merge.pr_is_merged(branch_name)) return 'merged'
|
|
325
|
+
|
|
326
|
+
try {
|
|
327
|
+
const snapshot = await default_fetch_pr_state(branch_name)
|
|
328
|
+
|
|
329
|
+
return is_auto_merge_blocked(snapshot) ? 'failed' : 'waiting'
|
|
330
|
+
} catch {
|
|
331
|
+
return 'waiting'
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// **The wait for a pull request GitHub merges on its own.** Once auto-merge is enabled, the merge gate
|
|
336
|
+
// above is the wrong question: the merge lands the moment the checks pass, and a merged pull request
|
|
337
|
+
// never reads as mergeable again, so `wait_for_pr_success` would run out its budget on one that is
|
|
338
|
+
// already in. The budget is the gate's, so the two waits give up alike.
|
|
339
|
+
async function wait_for_pr_merged(branch_name: string): Promise<MergeProgress> {
|
|
340
|
+
let progress: MergeProgress = 'waiting'
|
|
341
|
+
|
|
342
|
+
await poll.poll_until(
|
|
343
|
+
async () => {
|
|
344
|
+
progress = await read_merge_progress(branch_name)
|
|
345
|
+
|
|
346
|
+
return progress !== 'waiting'
|
|
347
|
+
},
|
|
348
|
+
{ attempts: CHECK_MAX_ATTEMPTS, interval_ms: CHECK_WAIT_INTERVAL_MS },
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
return progress
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
const git_pr_checks = {
|
|
355
|
+
read_merge_progress,
|
|
356
|
+
wait_for_pr_merged,
|
|
357
|
+
wait_for_pr_success: wait_for_pr_success_default,
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
export {
|
|
361
|
+
git_pr_checks,
|
|
362
|
+
parse_repo_name_from_package,
|
|
363
|
+
wait_for_pr_success,
|
|
364
|
+
compute_max_attempts,
|
|
365
|
+
get_configured_max_attempts,
|
|
366
|
+
DEFAULT_STABLE_READS,
|
|
367
|
+
WATCH_CONFIRMED_STABLE_READS,
|
|
368
|
+
DEFAULT_MAX_ATTEMPTS,
|
|
369
|
+
MAX_CONSECUTIVE_READ_FAILURES,
|
|
370
|
+
DEFAULT_TIMEOUT_SECONDS,
|
|
371
|
+
CHECK_WAIT_INTERVAL_MS,
|
|
372
|
+
PR_CHECKS_TIMEOUT_MESSAGE,
|
|
373
|
+
SECONDS_TO_MS,
|
|
374
|
+
is_pr_checks_timeout,
|
|
375
|
+
default_fetch_pr_state,
|
|
376
|
+
MERGE_GATE_EVALUATOR,
|
|
377
|
+
SHOULD_ALWAYS_READ_REVIEW_DECISION,
|
|
378
|
+
}
|
|
379
|
+
export type { MergeProgress, PrStateFetcher, PrStateEvaluator, ReviewDecisionPredicate }
|
|
380
|
+
export {
|
|
381
|
+
collect_blocking_failures,
|
|
382
|
+
describe_pr_failure,
|
|
383
|
+
evaluate_pr_state,
|
|
384
|
+
} from './git-pr-checks-eval'
|
|
385
|
+
export type { PrEvaluation } from './git-pr-checks-eval'
|
|
386
|
+
export { parse_pr_state_snapshot } from './git-pr-checks-parse'
|
|
387
|
+
export type { RollupCheck, PrStateSnapshot } from './git-pr-checks-parse'
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { git_gh_command } from './git-gh-command'
|
|
2
|
+
import { has_ignore_reason } from './git-pr-ai-review'
|
|
3
|
+
import { parse_json_array_or_undefined } from './parse-json-array'
|
|
4
|
+
import { pull_comment_schema } from './schemas'
|
|
5
|
+
|
|
6
|
+
// cspell:words coderabbit coderabbitai
|
|
7
|
+
|
|
8
|
+
// CodeRabbit's line comments, and what `followup` does about the unresolved ones. Split out of
|
|
9
|
+
// `git-pr-followup.ts` when that file passed its length limit; this is the sibling of
|
|
10
|
+
// `git-pr-ai-review.ts`, which already owned the summary-comment half of the same reviewer.
|
|
11
|
+
|
|
12
|
+
const CODERABBIT_AUTHOR = 'coderabbitai[bot]'
|
|
13
|
+
const CODERABBIT_FLAG = '_⚠️ Potential issue_'
|
|
14
|
+
const CODERABBIT_RESOLVED = '✅ Addressed in commit'
|
|
15
|
+
|
|
16
|
+
interface PullComment {
|
|
17
|
+
body?: string | undefined
|
|
18
|
+
html_url?: string | undefined
|
|
19
|
+
user?: { login?: string | undefined } | undefined
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// `undefined` when the listing could not be read, which is not the same as a pull request with no
|
|
23
|
+
// line comments (joshuafolkken/kit#973).
|
|
24
|
+
function parse_pull_comments(raw_json: string | undefined): Array<PullComment> | undefined {
|
|
25
|
+
if (raw_json === undefined) return undefined
|
|
26
|
+
|
|
27
|
+
return parse_json_array_or_undefined(raw_json, pull_comment_schema)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function read_unresolved_cr_urls(comments: ReadonlyArray<PullComment>): Array<string> {
|
|
31
|
+
return comments
|
|
32
|
+
.filter((comment) => comment.user?.login === CODERABBIT_AUTHOR)
|
|
33
|
+
.filter((comment) => (comment.body ?? '').includes(CODERABBIT_FLAG))
|
|
34
|
+
.filter((comment) => !(comment.body ?? '').includes(CODERABBIT_RESOLVED))
|
|
35
|
+
.map((comment) => comment.html_url ?? '')
|
|
36
|
+
.filter((url) => url.length > 0)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function build_ignore_reason_comment(reason: string, urls: ReadonlyArray<string>): string {
|
|
40
|
+
const lines = [
|
|
41
|
+
'Some CodeRabbit findings were intentionally left unresolved.',
|
|
42
|
+
`Reason: ${reason.trim()}`,
|
|
43
|
+
'Affected comments:',
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
for (const url of urls) {
|
|
47
|
+
lines.push(`- ${url}`)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return lines.join('\n')
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function log_unresolved_coderabbit(urls: ReadonlyArray<string>): void {
|
|
54
|
+
console.warn('⚠ Unresolved CodeRabbit comments are non-blocking (temporary policy — kit#753):')
|
|
55
|
+
|
|
56
|
+
for (const url of urls) {
|
|
57
|
+
console.warn(`- ${url}`)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Temporary (kit#753): unresolved CodeRabbit line comments no longer block the merge. They are
|
|
62
|
+
// logged, returned as audit notes for the completion notification, and — when an ignore reason is
|
|
63
|
+
// supplied — still documented on the PR. Revert together with kit#752.
|
|
64
|
+
// Unreadable is reported, never blocked — the opposite of the AI review gate's handling of the same
|
|
65
|
+
// gap, and for the reason kit#753 gave: CodeRabbit does not block the merge at all right now, so an
|
|
66
|
+
// unreadable CodeRabbit listing cannot either. What it must not do is pass as "nothing unresolved",
|
|
67
|
+
// which is what the reader's old `'[]'` made of it (joshuafolkken/kit#973).
|
|
68
|
+
const UNREADABLE_CR_NOTE =
|
|
69
|
+
'CodeRabbit line comments could not be read; unresolved findings were not checked (kit#753).'
|
|
70
|
+
|
|
71
|
+
// An ignore reason is recorded on the pull request here for the same reason it is on the branch
|
|
72
|
+
// below: it is the audit trail, not a way past a block — there is no block on this path. Dropping it
|
|
73
|
+
// would leave the completion note saying the listing went unread while the PR itself said nothing.
|
|
74
|
+
async function report_unreadable_cr(input: {
|
|
75
|
+
branch_name: string
|
|
76
|
+
ignore_reason: string | undefined
|
|
77
|
+
}): Promise<Array<string>> {
|
|
78
|
+
console.warn(`⚠ ${UNREADABLE_CR_NOTE}`)
|
|
79
|
+
|
|
80
|
+
if (has_ignore_reason(input.ignore_reason)) {
|
|
81
|
+
const body = `${UNREADABLE_CR_NOTE}\nReason: ${input.ignore_reason.trim()}`
|
|
82
|
+
|
|
83
|
+
await git_gh_command.pr_comment(input.branch_name, body)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return [UNREADABLE_CR_NOTE]
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Documented on the pull request when a reason was given, logged when it was not. Either way the
|
|
90
|
+
// finding is recorded rather than dropped — kit#753 removed the block, not the audit trail.
|
|
91
|
+
async function record_unresolved_cr(input: {
|
|
92
|
+
branch_name: string
|
|
93
|
+
ignore_reason: string | undefined
|
|
94
|
+
unresolved_urls: ReadonlyArray<string>
|
|
95
|
+
}): Promise<void> {
|
|
96
|
+
if (!has_ignore_reason(input.ignore_reason)) {
|
|
97
|
+
log_unresolved_coderabbit(input.unresolved_urls)
|
|
98
|
+
|
|
99
|
+
return
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const reason_comment = build_ignore_reason_comment(input.ignore_reason, input.unresolved_urls)
|
|
103
|
+
|
|
104
|
+
await git_gh_command.pr_comment(input.branch_name, reason_comment)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function handle_coderabbit_findings(input: {
|
|
108
|
+
branch_name: string
|
|
109
|
+
ignore_reason: string | undefined
|
|
110
|
+
}): Promise<Array<string>> {
|
|
111
|
+
const raw = await git_gh_command.pr_get_review_comments(input.branch_name)
|
|
112
|
+
const comments = parse_pull_comments(raw)
|
|
113
|
+
if (comments === undefined) return await report_unreadable_cr(input)
|
|
114
|
+
const unresolved_urls = read_unresolved_cr_urls(comments)
|
|
115
|
+
if (unresolved_urls.length === 0) return []
|
|
116
|
+
|
|
117
|
+
await record_unresolved_cr({ ...input, unresolved_urls })
|
|
118
|
+
|
|
119
|
+
return unresolved_urls.map((url) => `CodeRabbit unresolved comment skipped (kit#753): ${url}`)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const git_pr_coderabbit = {
|
|
123
|
+
parse_pull_comments,
|
|
124
|
+
read_unresolved_cr_urls,
|
|
125
|
+
build_ignore_reason_comment,
|
|
126
|
+
handle_coderabbit_findings,
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export { git_pr_coderabbit, UNREADABLE_CR_NOTE }
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { telegram_notify, type TelegramSendInput } from './telegram-notify'
|
|
2
|
+
|
|
3
|
+
// What to type when the confirmation notification itself could not be delivered
|
|
4
|
+
// (joshuafolkken/kit#1564). The `--body-file` spelling rather than `--body`, because the body names
|
|
5
|
+
// commands and a backtick inside shell double quotes is evaluated before the command runs.
|
|
6
|
+
const CONFIRMATION_RECOVERY =
|
|
7
|
+
'send it by hand — `pnpm josh notify --task-type confirmation --issue-url <url> ' +
|
|
8
|
+
'--body-file <path>`'
|
|
9
|
+
|
|
10
|
+
interface TelegramContext {
|
|
11
|
+
repo_name: string | undefined
|
|
12
|
+
issue_title: string | undefined
|
|
13
|
+
issue_url: string | undefined
|
|
14
|
+
pr_url: string | undefined
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function build_confirmation_input(input: {
|
|
18
|
+
context: TelegramContext
|
|
19
|
+
body: string
|
|
20
|
+
}): TelegramSendInput {
|
|
21
|
+
return {
|
|
22
|
+
task_type: 'confirmation',
|
|
23
|
+
repo_name: input.context.repo_name,
|
|
24
|
+
issue_title: input.context.issue_title,
|
|
25
|
+
body: input.body,
|
|
26
|
+
issue_url: input.context.issue_url,
|
|
27
|
+
pr_url: input.context.pr_url,
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// **The tolerant send** (joshuafolkken/kit#1564). What stops the run is the blocker this
|
|
32
|
+
// notification is *about*, and it is raised by the caller — so a failed send must not replace that
|
|
33
|
+
// diagnosis with a Telegram error. It is reported and the caller's own stop still happens.
|
|
34
|
+
//
|
|
35
|
+
// Unlike the completion notification, this one *has* a recovery: a `confirmation` is exactly what
|
|
36
|
+
// `josh notify` is for, and the run stops here anyway, so re-sending it by hand loses nothing.
|
|
37
|
+
async function notify_confirmation(input: {
|
|
38
|
+
context: TelegramContext
|
|
39
|
+
body: string
|
|
40
|
+
}): Promise<void> {
|
|
41
|
+
await telegram_notify.send_or_report(build_confirmation_input(input), CONFIRMATION_RECOVERY)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// A blank or whitespace-only reason is no reason at all: a bypass has to say something a person can
|
|
45
|
+
// audit later, so the emptiness check is what keeps `--…-ignore-reason ""` from being a silent pass.
|
|
46
|
+
function has_ignore_reason(reason: string | undefined): reason is string {
|
|
47
|
+
return reason !== undefined && reason.trim().length > 0
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Shared by every `followup` gate that can stop the run — the AI review scan and, since
|
|
51
|
+
// joshuafolkken/kit#1578, the managed config-file gate. They ask the same two questions (was a reason
|
|
52
|
+
// given, and how is the confirmation sent), and a second copy of either answer is what lets the two
|
|
53
|
+
// gates drift apart.
|
|
54
|
+
const git_pr_confirmation = {
|
|
55
|
+
notify_confirmation,
|
|
56
|
+
build_confirmation_input,
|
|
57
|
+
has_ignore_reason,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// `has_ignore_reason` stays a named export beside the namespace: `git-pr-coderabbit.ts` imports it
|
|
61
|
+
// from `git-pr-ai-review.ts`, which re-exports this one, and a namespace-only surface would make
|
|
62
|
+
// that re-export a property read.
|
|
63
|
+
export { git_pr_confirmation, has_ignore_reason }
|
|
64
|
+
export type { TelegramContext }
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
function is_pr_already_exists_message(message: string): boolean {
|
|
2
|
+
return message === 'PR_ALREADY_EXISTS'
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
function has_error_cause(error: Error): boolean {
|
|
6
|
+
return error.cause instanceof Error && is_pr_already_exists_message(error.cause.message)
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function is_pr_already_exists_error(error: unknown): boolean {
|
|
10
|
+
if (error instanceof Error) {
|
|
11
|
+
if (is_pr_already_exists_message(error.message)) {
|
|
12
|
+
return true
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return has_error_cause(error)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return false
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const git_pr_error = {
|
|
22
|
+
is_pr_already_exists_error,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { git_pr_error }
|