@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,225 @@
|
|
|
1
|
+
import { git_epic_close } from './git-epic-close'
|
|
2
|
+
import { git_followup_cleanup } from './git-followup-cleanup'
|
|
3
|
+
import { git_followup_flush } from './git-followup-flush'
|
|
4
|
+
import { git_followup_label } from './git-followup-label'
|
|
5
|
+
import { git_followup_stages, type StageLog } from './git-followup-stages'
|
|
6
|
+
import { git_gh_command } from './git-gh-command'
|
|
7
|
+
import { git_notify, type GitNotifyConfig } from './git-notify'
|
|
8
|
+
|
|
9
|
+
const { STAGE, lap } = git_followup_stages
|
|
10
|
+
|
|
11
|
+
// **Both destinations, because the step writes to whichever the notify target names.** A hint that
|
|
12
|
+
// only covered the issue would send the reader to the wrong place after a `--notify-target pr` run
|
|
13
|
+
// failed, which is the same defect as naming a command that cannot do the step at all.
|
|
14
|
+
const COMPLETION_COMMENT_RECOVERY =
|
|
15
|
+
'post the completion report by hand — `gh pr comment <branch>` for the pull request, ' +
|
|
16
|
+
'`gh api repos/{owner}/{repo}/issues/<N>/comments` for the issue'
|
|
17
|
+
|
|
18
|
+
// This step **has** a command that finishes it by hand, so it names one — unlike the epic
|
|
19
|
+
// auto-close, whose absence of one is stated rather than papered over.
|
|
20
|
+
const IN_PROGRESS_RECOVERY = 'gh api -X DELETE repos/{owner}/{repo}/issues/<N>/labels/in-progress'
|
|
21
|
+
|
|
22
|
+
// Everything from the merge gate opening onwards. Split out of `git-pr-followup.ts` because that file
|
|
23
|
+
// had eight code lines of headroom left, and cut here because this is where the run stops being able
|
|
24
|
+
// to fail safely: past the merge, the branch is gone and re-running the command is not a recovery.
|
|
25
|
+
interface WrapupInput {
|
|
26
|
+
branch_name: string
|
|
27
|
+
issue_number: string | undefined
|
|
28
|
+
notify_config: GitNotifyConfig | undefined
|
|
29
|
+
pr_url: string | undefined
|
|
30
|
+
should_merge: boolean
|
|
31
|
+
// The managed config-file report, which reaches the completion report on the Issue as well as the
|
|
32
|
+
// completion notification (joshuafolkken/kit#1592). Empty on a run that changed nothing `josh sync`
|
|
33
|
+
// distributes, and an empty one adds no line.
|
|
34
|
+
managed_notes: ReadonlyArray<string>
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function build_notify_body(input: {
|
|
38
|
+
notify_config: GitNotifyConfig
|
|
39
|
+
issue_number: string | undefined
|
|
40
|
+
pr_url: string | undefined
|
|
41
|
+
managed_notes: ReadonlyArray<string>
|
|
42
|
+
}): string {
|
|
43
|
+
return git_notify.build_completion_comment_body({
|
|
44
|
+
message: input.notify_config.message,
|
|
45
|
+
issue_number: input.issue_number,
|
|
46
|
+
pr_url: input.pr_url,
|
|
47
|
+
mentions: input.notify_config.mentions,
|
|
48
|
+
notes: input.managed_notes,
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function is_blank_issue_body(body: string | undefined): boolean {
|
|
53
|
+
if (body === undefined) return true
|
|
54
|
+
|
|
55
|
+
return body.trim().length === 0
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function post_notify_issue(input: {
|
|
59
|
+
issue_number: string | undefined
|
|
60
|
+
body: string
|
|
61
|
+
}): Promise<void> {
|
|
62
|
+
if (input.issue_number === undefined) {
|
|
63
|
+
throw new Error('Issue number is required for issue notification.')
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const current_body = await git_gh_command.issue_get_body(input.issue_number)
|
|
67
|
+
const should_edit_body = current_body !== undefined && is_blank_issue_body(current_body)
|
|
68
|
+
|
|
69
|
+
await (should_edit_body
|
|
70
|
+
? git_gh_command.issue_edit_body(input.issue_number, input.body)
|
|
71
|
+
: git_gh_command.issue_comment(input.issue_number, input.body))
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function should_notify_pr(target: GitNotifyConfig['target']): boolean {
|
|
75
|
+
return target === 'pr' || target === 'both'
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function should_notify_issue(target: GitNotifyConfig['target']): boolean {
|
|
79
|
+
return target === 'issue' || target === 'both'
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function post_completion_notification(input: {
|
|
83
|
+
branch_name: string
|
|
84
|
+
issue_number: string | undefined
|
|
85
|
+
notify_config: GitNotifyConfig | undefined
|
|
86
|
+
pr_url: string | undefined
|
|
87
|
+
managed_notes: ReadonlyArray<string>
|
|
88
|
+
}): Promise<void> {
|
|
89
|
+
if (input.notify_config === undefined) return
|
|
90
|
+
|
|
91
|
+
const body = build_notify_body({
|
|
92
|
+
notify_config: input.notify_config,
|
|
93
|
+
issue_number: input.issue_number,
|
|
94
|
+
pr_url: input.pr_url,
|
|
95
|
+
managed_notes: input.managed_notes,
|
|
96
|
+
})
|
|
97
|
+
const { target } = input.notify_config
|
|
98
|
+
|
|
99
|
+
if (should_notify_pr(target)) {
|
|
100
|
+
await git_gh_command.pr_comment(input.branch_name, body)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (should_notify_issue(target)) {
|
|
104
|
+
await post_notify_issue({ issue_number: input.issue_number, body })
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// **Guarded only once the merge has landed** (joshuafolkken/kit#1539) — the rule and its reason are
|
|
109
|
+
// `git-followup-cleanup.ts`, so this module and the run's tail cannot disagree about it. After the
|
|
110
|
+
// merge, a step that throws is reported and the ones after it still run, rather than taking the epic
|
|
111
|
+
// close and the working-tree hold release down with it.
|
|
112
|
+
async function notify_step(input: WrapupInput): Promise<void> {
|
|
113
|
+
await git_followup_cleanup.run_guarded_step(input.should_merge, {
|
|
114
|
+
label: 'The completion comment',
|
|
115
|
+
recovery: COMPLETION_COMMENT_RECOVERY,
|
|
116
|
+
run: async () => {
|
|
117
|
+
await post_completion_notification({
|
|
118
|
+
branch_name: input.branch_name,
|
|
119
|
+
issue_number: input.issue_number,
|
|
120
|
+
notify_config: input.notify_config,
|
|
121
|
+
pr_url: input.pr_url,
|
|
122
|
+
managed_notes: input.managed_notes,
|
|
123
|
+
})
|
|
124
|
+
},
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// No `recovery`: the auto-close has no command of its own, and naming `epic:audit` — which only
|
|
129
|
+
// reports contradictions — would send the reader somewhere that closes nothing. The epic's own task
|
|
130
|
+
// list is what says which children are done.
|
|
131
|
+
async function epic_close_step(input: WrapupInput): Promise<void> {
|
|
132
|
+
await git_followup_cleanup.run_guarded_step(input.should_merge, {
|
|
133
|
+
label: 'The epic auto-close',
|
|
134
|
+
recovery: undefined,
|
|
135
|
+
run: async () => {
|
|
136
|
+
await git_epic_close.close_completed_epics({
|
|
137
|
+
issue_number: input.issue_number,
|
|
138
|
+
is_merged: input.should_merge,
|
|
139
|
+
})
|
|
140
|
+
},
|
|
141
|
+
})
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// **The run's own mark, taken off at the end of the run that wrote it** (joshuafolkken/kit#1794).
|
|
145
|
+
// `in-progress` is added by every entry point before it implements, and nothing took it off on the
|
|
146
|
+
// ordinary ending: the pull request merged, the issue closed, and the mark stayed. Removed here
|
|
147
|
+
// rather than by the workflow procedure because this is the one step that knows the merge landed.
|
|
148
|
+
//
|
|
149
|
+
// **A merged run only.** Without `should_merge` the issue is still open and a run may still be
|
|
150
|
+
// holding it, so taking the mark off would say the opposite of what is true — and the step is not
|
|
151
|
+
// issued at all there, rather than issued and self-skipping. The guard flag is `input.should_merge`
|
|
152
|
+
// like both siblings', so the early return above stays the *only* thing deciding whether the step
|
|
153
|
+
// runs: read as redundant and deleted, a hardcoded `true` would turn the step on for a `--no-merge`
|
|
154
|
+
// run instead of leaving it off.
|
|
155
|
+
async function in_progress_step(input: WrapupInput): Promise<void> {
|
|
156
|
+
if (!input.should_merge) return
|
|
157
|
+
|
|
158
|
+
await git_followup_cleanup.run_guarded_step(input.should_merge, {
|
|
159
|
+
label: 'The `in-progress` label removal',
|
|
160
|
+
recovery: IN_PROGRESS_RECOVERY,
|
|
161
|
+
run: async () => {
|
|
162
|
+
await git_followup_label.strip_in_progress(input.issue_number)
|
|
163
|
+
},
|
|
164
|
+
})
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// **The steps after the merge are issued together** (joshuafolkken/kit#1446). The completion
|
|
168
|
+
// comment writes to the issue or the pull request, the auto-close reads the open epics, and the
|
|
169
|
+
// label removal reads and writes the issue's labels; none needs another's answer, and measured
|
|
170
|
+
// serially the first two were 1.9 s and 3.1 s of `followup`'s own clock. Past the merge none can
|
|
171
|
+
// reject another — `run_guarded_step` reports the failure and answers instead — so they settle
|
|
172
|
+
// independently and the stage costs the longest of them rather than their sum.
|
|
173
|
+
//
|
|
174
|
+
// **A run that merged nothing keeps them in sequence, because there is nothing to overlap.**
|
|
175
|
+
// `close_completed_epics` returns immediately without `is_merged`, and the label removal is not
|
|
176
|
+
// issued on that path at all — so the serial branch is one real step and a no-op beside it. There
|
|
177
|
+
// the guard is off, so a failure still ends the run and re-running the command is the whole recovery
|
|
178
|
+
// (`git-followup-cleanup.ts`), which is easier to read as one sequence than as a settled set.
|
|
179
|
+
//
|
|
180
|
+
// **What the overlap costs, stated rather than glossed**: mutating requests now go out at once
|
|
181
|
+
// against one repository — a comment write, an auto-close that comments on and closes epics, and a
|
|
182
|
+
// label delete — which is what GitHub's secondary rate limit guidance is about. Past the merge all
|
|
183
|
+
// of them are guarded, so the worst case is a cleanup reported as unfinished rather than a failed
|
|
184
|
+
// run, and this is a handful of requests rather than a fan-out. **Their console output can
|
|
185
|
+
// interleave too**: the guard's warning and its recovery line are printed as they happen, so an
|
|
186
|
+
// auto-close progress line can land between them. The recovery line names its own command and stands
|
|
187
|
+
// on its own, so it is still readable out of order — and the alternative, buffering one step's
|
|
188
|
+
// output until the others settle, would hold back a warning about work that has already failed.
|
|
189
|
+
async function run_tail_steps(input: WrapupInput): Promise<void> {
|
|
190
|
+
if (!input.should_merge) {
|
|
191
|
+
await notify_step(input)
|
|
192
|
+
await epic_close_step(input)
|
|
193
|
+
|
|
194
|
+
return
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
await Promise.all([notify_step(input), epic_close_step(input), in_progress_step(input)])
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
async function run_wrapup(input: WrapupInput, log: StageLog): Promise<void> {
|
|
201
|
+
if (input.should_merge) {
|
|
202
|
+
await git_gh_command.pr_merge(input.branch_name)
|
|
203
|
+
lap(log, STAGE.merge)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
await run_tail_steps(input)
|
|
207
|
+
// After the merge tail and before the hold is released (`git-followup-finish.ts`): the ledger
|
|
208
|
+
// flush switches branches, so it must land while this run still holds the tree (kit#1810).
|
|
209
|
+
await git_followup_flush.flush_ledger_step(input.should_merge)
|
|
210
|
+
|
|
211
|
+
lap(log, STAGE.completion_and_epic_close)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const git_pr_followup_wrapup = {
|
|
215
|
+
run_wrapup,
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export {
|
|
219
|
+
git_pr_followup_wrapup,
|
|
220
|
+
post_notify_issue,
|
|
221
|
+
post_completion_notification,
|
|
222
|
+
is_blank_issue_body,
|
|
223
|
+
build_notify_body,
|
|
224
|
+
}
|
|
225
|
+
export type { WrapupInput }
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
import { git_followup_pending } from './git-followup-pending'
|
|
2
|
+
import { git_followup_stages, type StageLog } from './git-followup-stages'
|
|
3
|
+
import { git_gh_command } from './git-gh-command'
|
|
4
|
+
import { git_gh_helpers } from './git-gh-helpers'
|
|
5
|
+
import type { GitNotifyConfig } from './git-notify'
|
|
6
|
+
import { git_pr_ai_review, type TelegramContext } from './git-pr-ai-review'
|
|
7
|
+
import { DEFAULT_STABLE_READS, git_pr_checks, WATCH_CONFIRMED_STABLE_READS } from './git-pr-checks'
|
|
8
|
+
import { is_coderabbit_check } from './git-pr-checks-eval'
|
|
9
|
+
import { CHECK_STATUS_PASS, git_pr_checks_parse, type PrStateSnapshot } from './git-pr-checks-parse'
|
|
10
|
+
import { git_pr_coderabbit } from './git-pr-coderabbit'
|
|
11
|
+
import { git_pr_followup_wrapup } from './git-pr-followup-wrapup'
|
|
12
|
+
import { git_pr_managed_config } from './git-pr-managed-config'
|
|
13
|
+
import { github_issue_url } from './github-issue-url'
|
|
14
|
+
import { telegram_notify, type TelegramSendInput, type TelegramTaskType } from './telegram-notify'
|
|
15
|
+
|
|
16
|
+
const { STAGE, lap } = git_followup_stages
|
|
17
|
+
|
|
18
|
+
// Captures the number, so the one pattern answers both questions the run asks of a PR body: whether
|
|
19
|
+
// the linked issue will auto-close, and — since joshuafolkken/kit#1539 — which issue that is when the
|
|
20
|
+
// invocation did not say. A second pattern here would be two readings of "closes #N" to disagree.
|
|
21
|
+
const CLOSES_PATTERN = /closes\s+#(\d+)/iu
|
|
22
|
+
// Named so a test can pin the note without restating it (joshuafolkken/kit#999).
|
|
23
|
+
const WATCH_FAILED_NOTE = 'pr checks --watch failed; falling through to polling'
|
|
24
|
+
const REPO_NAME_SEPARATOR = '/'
|
|
25
|
+
|
|
26
|
+
function parse_repo_name(name_with_owner: string | undefined): string | undefined {
|
|
27
|
+
if (name_with_owner === undefined) return undefined
|
|
28
|
+
const parts = name_with_owner.split(REPO_NAME_SEPARATOR)
|
|
29
|
+
|
|
30
|
+
return parts.at(-1)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function build_telegram_input(input: {
|
|
34
|
+
task_type: TelegramTaskType
|
|
35
|
+
context: TelegramContext
|
|
36
|
+
body: string | undefined
|
|
37
|
+
}): TelegramSendInput {
|
|
38
|
+
return {
|
|
39
|
+
task_type: input.task_type,
|
|
40
|
+
repo_name: input.context.repo_name,
|
|
41
|
+
issue_title: input.context.issue_title,
|
|
42
|
+
body: input.body,
|
|
43
|
+
issue_url: input.context.issue_url,
|
|
44
|
+
pr_url: input.context.pr_url,
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// The sibling issue URL of a pull request: same repository, the number this run is closing. Read
|
|
49
|
+
// through the shared parser rather than a second pattern here, so the two cannot disagree about what
|
|
50
|
+
// a github.com URL looks like (joshuafolkken/kit#994).
|
|
51
|
+
function build_issue_url(
|
|
52
|
+
pr_url: string | undefined,
|
|
53
|
+
issue_number: string | undefined,
|
|
54
|
+
): string | undefined {
|
|
55
|
+
if (issue_number === undefined) return undefined
|
|
56
|
+
const target = github_issue_url.parse_pull(pr_url)
|
|
57
|
+
if (target === undefined) return undefined
|
|
58
|
+
|
|
59
|
+
return `${target.base_url}/issues/${issue_number}`
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
interface FollowupInput {
|
|
63
|
+
branch_name: string
|
|
64
|
+
issue_number: string | undefined
|
|
65
|
+
notify_config: GitNotifyConfig | undefined
|
|
66
|
+
coderabbit_ignore_reason: string | undefined
|
|
67
|
+
ai_review_ignore_reason: string | undefined
|
|
68
|
+
is_skip_watch: boolean
|
|
69
|
+
should_merge: boolean
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function parse_closes_issue_number(body: string | undefined): string | undefined {
|
|
73
|
+
if (body === undefined) return undefined
|
|
74
|
+
|
|
75
|
+
return CLOSES_PATTERN.exec(body)?.[1]
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function has_closes_keyword(body: string | undefined): boolean {
|
|
79
|
+
return parse_closes_issue_number(body) !== undefined
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// **Returns the number it warned about the absence of** (joshuafolkken/kit#1539). The issue number
|
|
83
|
+
// used to reach the notification from the command line alone, so an invocation that omitted it threw
|
|
84
|
+
// after the merge had already landed. This stage reads the pull request body anyway, and that body
|
|
85
|
+
// carries the number in its `closes #N` keyword — so the read the warning already makes is what
|
|
86
|
+
// recovers it, at no extra request.
|
|
87
|
+
async function warn_if_missing_closes(branch_name: string): Promise<string | undefined> {
|
|
88
|
+
const body = await git_gh_command.pr_get_body(branch_name)
|
|
89
|
+
const closes_number = parse_closes_issue_number(body)
|
|
90
|
+
|
|
91
|
+
if (closes_number !== undefined) return closes_number
|
|
92
|
+
|
|
93
|
+
console.warn('')
|
|
94
|
+
console.warn(
|
|
95
|
+
'⚠️ PR body is missing a "closes #N" keyword — the linked Issue will not auto-close on merge.',
|
|
96
|
+
)
|
|
97
|
+
console.warn(' Recovery: pnpm josh pr (or: pnpm josh git -y --skip-commit --skip-push)')
|
|
98
|
+
console.warn('')
|
|
99
|
+
|
|
100
|
+
return undefined
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// The watch is a look ahead, not a gate. It fails when **any** check has failed — CodeRabbit
|
|
104
|
+
// included — and letting that escape ended the run before `evaluate_pr_state` could apply kit#753's
|
|
105
|
+
// CodeRabbit exemption at all. It only ever bit where every check finished inside the two-minute
|
|
106
|
+
// window, so a repository with a slow E2E never saw it and a fast one always would
|
|
107
|
+
// (joshuafolkken/kit#999). What the watch is has since changed — `gh pr checks --watch` went through
|
|
108
|
+
// GraphQL, so joshuafolkken/kit#1028 replaced it with the same poll loop bounded to two minutes —
|
|
109
|
+
// but its place here has not.
|
|
110
|
+
//
|
|
111
|
+
// Falling through costs nothing: whether the merge may proceed is decided in one place below, and a
|
|
112
|
+
// genuinely failing non-CodeRabbit check still ends the wait on the first poll by kit#990's
|
|
113
|
+
// fast-fail rather than by that failure.
|
|
114
|
+
// The watch fails for two different reasons — "a check failed" and "no checks reported on this
|
|
115
|
+
// branch" — and its own error does not say which. The pull request itself can: a failed check leaves
|
|
116
|
+
// a rollup, and a branch with no checks leaves it empty. Falling through on the empty case would
|
|
117
|
+
// trade a failure reported in seconds for the whole budget spent waiting on a required check that is
|
|
118
|
+
// missing rather than pending, so that one is rethrown and the old behavior kept.
|
|
119
|
+
//
|
|
120
|
+
// **Read from the raw payload, not from `parse_pr_state_snapshot`.** That parser never throws: a
|
|
121
|
+
// malformed answer or a schema mismatch degrades to `rollup: []`, which is indistinguishable there
|
|
122
|
+
// from a branch that genuinely has no checks. Rethrowing on it would put an unreadable answer back
|
|
123
|
+
// on the path this whole change exists to remove. So the question asked here is the narrow one —
|
|
124
|
+
// *is this definitely an empty rollup* — and every other outcome falls through.
|
|
125
|
+
function reads_as_empty_rollup(raw_json: string): boolean {
|
|
126
|
+
const parsed = git_pr_checks_parse.parse_json_safe(raw_json)
|
|
127
|
+
|
|
128
|
+
if (typeof parsed !== 'object' || parsed === null || !('statusCheckRollup' in parsed)) {
|
|
129
|
+
return false
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const { statusCheckRollup: rollup } = parsed
|
|
133
|
+
|
|
134
|
+
return Array.isArray(rollup) && rollup.length === 0
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// The read throws rather than answering `undefined`, so the `catch` is its only failure path.
|
|
138
|
+
//
|
|
139
|
+
// The **checks** half, not the whole snapshot: the question here is about `statusCheckRollup` alone,
|
|
140
|
+
// and reading the review listing to answer it paged a whole conversation for nothing
|
|
141
|
+
// (joshuafolkken/kit#1043).
|
|
142
|
+
async function has_no_checks(branch_name: string): Promise<boolean> {
|
|
143
|
+
try {
|
|
144
|
+
const checks = await git_gh_command.pr_get_checks_snapshot(branch_name)
|
|
145
|
+
|
|
146
|
+
return reads_as_empty_rollup(checks.snapshot_json)
|
|
147
|
+
} catch {
|
|
148
|
+
// The read refines the swallow; it is not a gate of its own. An answer it cannot get is not
|
|
149
|
+
// evidence of anything, so prefer falling through — the poll below reads the same state.
|
|
150
|
+
return false
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async function handle_watch_failure(branch_name: string, error: unknown): Promise<void> {
|
|
155
|
+
if (await has_no_checks(branch_name)) throw error
|
|
156
|
+
|
|
157
|
+
// Swallowed, but never silently: the reason a run stopped early used to be this line, so it
|
|
158
|
+
// stays visible even though it no longer decides anything.
|
|
159
|
+
console.info(`⚠️ ${WATCH_FAILED_NOTE}: ${git_gh_helpers.get_error_message_with_stderr(error)}`)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// **Returns whether the watch confirmed completion** (joshuafolkken/kit#2029): `true` only when
|
|
163
|
+
// `pr_checks_watch` saw every check finish, `false` when it timed out with checks still pending or
|
|
164
|
+
// fell through to polling on a swallowed failure. `run_checks` reads it to decide how many stable poll
|
|
165
|
+
// reads the wait still needs. A timed-out watch (`timed_out: true`) never spanned the pending→settled
|
|
166
|
+
// window, so it must keep the full stable-read window rather than claim the confirmation. A rethrown
|
|
167
|
+
// failure — the empty-rollup case — never reaches a caller, so it needs no answer here.
|
|
168
|
+
async function watch_before_polling(branch_name: string): Promise<boolean> {
|
|
169
|
+
console.info('')
|
|
170
|
+
console.info('📊 Watching PR checks...')
|
|
171
|
+
|
|
172
|
+
try {
|
|
173
|
+
const result = await git_gh_command.pr_checks_watch(branch_name)
|
|
174
|
+
|
|
175
|
+
return !result.timed_out
|
|
176
|
+
} catch (error) {
|
|
177
|
+
await handle_watch_failure(branch_name, error)
|
|
178
|
+
|
|
179
|
+
return false
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// **A confirmed watch lowers the poll's stable-read requirement to one** (joshuafolkken/kit#2029). The
|
|
184
|
+
// watch is the first confirmation that every check settled, so the poll that follows need only agree
|
|
185
|
+
// once rather than twice — which removes the extra interval `followup` spent re-proving a settled run.
|
|
186
|
+
// A skipped or fallen-through watch keeps `DEFAULT_STABLE_READS`, and a check that turned red is still
|
|
187
|
+
// caught: the poll evaluates the full merge gate and throws on failure before any stable read counts.
|
|
188
|
+
async function run_checks(input: {
|
|
189
|
+
branch_name: string
|
|
190
|
+
is_skip_watch: boolean
|
|
191
|
+
}): Promise<PrStateSnapshot> {
|
|
192
|
+
const is_watch_confirmed = !input.is_skip_watch && (await watch_before_polling(input.branch_name))
|
|
193
|
+
const stable_reads = is_watch_confirmed ? WATCH_CONFIRMED_STABLE_READS : DEFAULT_STABLE_READS
|
|
194
|
+
|
|
195
|
+
return await git_pr_checks.wait_for_pr_success(input.branch_name, stable_reads)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Temporary (kit#753): record every CodeRabbit check that was not passing when the merge gate
|
|
199
|
+
// opened, so a merge shipped without CodeRabbit review stays auditable.
|
|
200
|
+
function read_coderabbit_skip_notes(snapshot: PrStateSnapshot): Array<string> {
|
|
201
|
+
return snapshot.rollup
|
|
202
|
+
.filter((check) => is_coderabbit_check(check.name))
|
|
203
|
+
.filter((check) => check.status !== CHECK_STATUS_PASS)
|
|
204
|
+
.map(
|
|
205
|
+
(check) =>
|
|
206
|
+
`CodeRabbit check skipped (kit#753): ${check.name} was ${check.status} at merge time`,
|
|
207
|
+
)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// The skip is printed where the run is being watched, not only carried into the Telegram body it
|
|
211
|
+
// ends up in. A merge that went ahead while CodeRabbit had not come back is the one thing kit#753's
|
|
212
|
+
// exemption trades away, and it used to be invisible in `followup`'s own output
|
|
213
|
+
// (joshuafolkken/kit#1217).
|
|
214
|
+
function log_skip_notes(notes: ReadonlyArray<string>): void {
|
|
215
|
+
for (const note of notes) {
|
|
216
|
+
console.info(`⏭ ${note}`)
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// **The one read of the four that can depend on another.** Without an issue number on the command
|
|
221
|
+
// line it is the pull request body that names it (joshuafolkken/kit#1539), so the title read waits
|
|
222
|
+
// for exactly that one and for nothing else. With a number in hand the `??` short-circuits and the
|
|
223
|
+
// promise is never awaited at all, which is what lets this read go out in the same tick as the other
|
|
224
|
+
// three.
|
|
225
|
+
async function read_issue_title(
|
|
226
|
+
issue_number: string | undefined,
|
|
227
|
+
closes_number: Promise<string | undefined>,
|
|
228
|
+
): Promise<string | undefined> {
|
|
229
|
+
const number = issue_number ?? (await closes_number)
|
|
230
|
+
if (number === undefined) return undefined
|
|
231
|
+
|
|
232
|
+
return await git_gh_command.issue_get_title(number)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
interface RunContext {
|
|
236
|
+
issue_number: string | undefined
|
|
237
|
+
context: TelegramContext
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// **The four reads in front of the check wait are issued together** (joshuafolkken/kit#1446). Not one
|
|
241
|
+
// of them is a wait on anything: the `closes #N` check reads the pull request body, and the
|
|
242
|
+
// notification needs the repository name, the issue title and the pull request URL — four requests
|
|
243
|
+
// that were sent one at a time for 5.5 of `followup`'s measured 45.8 seconds, purely because they
|
|
244
|
+
// were written as consecutive statements.
|
|
245
|
+
//
|
|
246
|
+
// **This overlaps requests; it decides nothing differently.** The `closes #N` warning still fires on
|
|
247
|
+
// the same body, the context still carries the same four fields, and the required-check wait and the
|
|
248
|
+
// AI-review scan below — the merge gate itself — are untouched. Overlapping two reads that do not
|
|
249
|
+
// depend on each other is the whole of the change; skipping one would be a different thing entirely.
|
|
250
|
+
//
|
|
251
|
+
// **Every promise is handed to `Promise.all` in the same synchronous block**, so a rejection has a
|
|
252
|
+
// handler attached in the tick it was created — the first failure still ends the run, and no other
|
|
253
|
+
// read is left rejecting into nothing.
|
|
254
|
+
async function read_run_context(input: {
|
|
255
|
+
branch_name: string
|
|
256
|
+
issue_number: string | undefined
|
|
257
|
+
}): Promise<RunContext> {
|
|
258
|
+
const closes = warn_if_missing_closes(input.branch_name)
|
|
259
|
+
const owner = git_gh_command.repo_get_name_with_owner()
|
|
260
|
+
const url = git_gh_command.pr_get_url(input.branch_name)
|
|
261
|
+
const title = read_issue_title(input.issue_number, closes)
|
|
262
|
+
const [closes_number, name_with_owner, pr_url, issue_title] = await Promise.all([
|
|
263
|
+
closes,
|
|
264
|
+
owner,
|
|
265
|
+
url,
|
|
266
|
+
title,
|
|
267
|
+
])
|
|
268
|
+
const issue_number = input.issue_number ?? closes_number
|
|
269
|
+
|
|
270
|
+
return {
|
|
271
|
+
issue_number,
|
|
272
|
+
context: {
|
|
273
|
+
repo_name: parse_repo_name(name_with_owner),
|
|
274
|
+
issue_title,
|
|
275
|
+
issue_url: build_issue_url(pr_url, issue_number),
|
|
276
|
+
pr_url,
|
|
277
|
+
},
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// The pending count replaces the project version line (joshuafolkken/kit#1486): children no longer
|
|
282
|
+
// bump, so the local `package.json` names the previous release rather than what this run ships.
|
|
283
|
+
// A count that could not be read contributes no line at all, rather than a zero nobody measured.
|
|
284
|
+
async function notify_completion(
|
|
285
|
+
context: TelegramContext,
|
|
286
|
+
skip_notes: ReadonlyArray<string>,
|
|
287
|
+
is_merge_pending: boolean,
|
|
288
|
+
): Promise<void> {
|
|
289
|
+
const pending_line = await git_followup_pending.pending_release_line({ is_merge_pending })
|
|
290
|
+
const lines = pending_line === undefined ? skip_notes : [pending_line, ...skip_notes]
|
|
291
|
+
const body = lines.join('\n')
|
|
292
|
+
|
|
293
|
+
// **The tolerant send** (joshuafolkken/kit#1564): this runs on the way to the merge, so a Telegram
|
|
294
|
+
// gateway timeout must not leave a reviewed, green pull request unmerged. The failure is reported
|
|
295
|
+
// under `❗` and the run carries on.
|
|
296
|
+
//
|
|
297
|
+
// **No recovery line**, deliberately, in the same sense `git_followup_cleanup`'s epic-close step
|
|
298
|
+
// has none: a completion notification is never re-sent by hand — `pnpm josh notify --task-type
|
|
299
|
+
// completion` is prohibited because it populates no PR link — and re-running `followup` after the
|
|
300
|
+
// merge is not a re-send either. Naming either would send the reader somewhere useless.
|
|
301
|
+
await telegram_notify.send_or_report(
|
|
302
|
+
build_telegram_input({
|
|
303
|
+
task_type: 'completion',
|
|
304
|
+
context,
|
|
305
|
+
body,
|
|
306
|
+
}),
|
|
307
|
+
undefined,
|
|
308
|
+
)
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// The two comment scans, marked separately from the check wait because they answer a different
|
|
312
|
+
// question: the wait is time GitHub took, and these are requests this command chose to make.
|
|
313
|
+
async function run_comment_scans(
|
|
314
|
+
input: FollowupInput,
|
|
315
|
+
context: TelegramContext,
|
|
316
|
+
log: StageLog,
|
|
317
|
+
): Promise<Array<string>> {
|
|
318
|
+
const comment_notes = await git_pr_coderabbit.handle_coderabbit_findings({
|
|
319
|
+
branch_name: input.branch_name,
|
|
320
|
+
ignore_reason: input.coderabbit_ignore_reason,
|
|
321
|
+
})
|
|
322
|
+
|
|
323
|
+
lap(log, STAGE.coderabbit_comments)
|
|
324
|
+
const ai_review_notes = await git_pr_ai_review.handle_ai_review_findings({
|
|
325
|
+
branch_name: input.branch_name,
|
|
326
|
+
ignore_reason: input.ai_review_ignore_reason,
|
|
327
|
+
context,
|
|
328
|
+
})
|
|
329
|
+
|
|
330
|
+
lap(log, STAGE.ai_review_comments)
|
|
331
|
+
|
|
332
|
+
return [...comment_notes, ...ai_review_notes]
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// **The managed config-file read runs first, ahead of the check wait** (joshuafolkken/kit#1578). It
|
|
336
|
+
// reads the branch diff and nothing else, so its answer is in hand before CI is waited on at all.
|
|
337
|
+
// Since joshuafolkken/kit#1592 that answer stops nothing — it is a report — but the position is kept:
|
|
338
|
+
// a read this cheap belongs beside the other things decided from the diff.
|
|
339
|
+
//
|
|
340
|
+
// **It laps no stage of its own.** The printed stage sequence is asserted as an exact list, and a
|
|
341
|
+
// diff read this cheap is not what a measurement of `followup` is looking for; its cost lands inside
|
|
342
|
+
// `checks-wait`, where it is indistinguishable from noise.
|
|
343
|
+
//
|
|
344
|
+
// **The managed report comes back beside the notes as well as inside them**, because the two have
|
|
345
|
+
// different destinations: every note reaches the completion notification, and this one alone also
|
|
346
|
+
// reaches the completion report posted to the Issue (joshuafolkken/kit#1592). Returning it twice is
|
|
347
|
+
// what lets `run_stages` hand each destination what belongs to it without re-deriving the answer.
|
|
348
|
+
async function run_review_checks(
|
|
349
|
+
input: FollowupInput,
|
|
350
|
+
context: TelegramContext,
|
|
351
|
+
log: StageLog,
|
|
352
|
+
): Promise<{ notes: Array<string>; managed: Array<string> }> {
|
|
353
|
+
const managed = await git_pr_managed_config.handle_managed_config_changes({
|
|
354
|
+
should_merge: input.should_merge,
|
|
355
|
+
})
|
|
356
|
+
const snapshot = await run_checks({
|
|
357
|
+
branch_name: input.branch_name,
|
|
358
|
+
is_skip_watch: input.is_skip_watch,
|
|
359
|
+
})
|
|
360
|
+
|
|
361
|
+
lap(log, STAGE.checks_wait)
|
|
362
|
+
const check_notes = read_coderabbit_skip_notes(snapshot)
|
|
363
|
+
|
|
364
|
+
log_skip_notes(check_notes)
|
|
365
|
+
const scan_notes = await run_comment_scans(input, context, log)
|
|
366
|
+
|
|
367
|
+
return { notes: [...managed, ...check_notes, ...scan_notes], managed }
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// **Answers with the issue number the run actually used** (joshuafolkken/kit#1539), which is the one
|
|
371
|
+
// the invocation named or, failing that, the one the pull request body closes. Everything downstream
|
|
372
|
+
// takes it from here rather than from the input, so the Telegram context, the completion comment and
|
|
373
|
+
// the epic close all name the same issue — and so the caller's own tail can record a run whose number
|
|
374
|
+
// only the pull request knew.
|
|
375
|
+
async function run_stages(input: FollowupInput, log: StageLog): Promise<string | undefined> {
|
|
376
|
+
const { issue_number, context } = await read_run_context(input)
|
|
377
|
+
|
|
378
|
+
lap(log, STAGE.closes_and_context)
|
|
379
|
+
const checks = await run_review_checks(input, context, log)
|
|
380
|
+
|
|
381
|
+
await notify_completion(context, checks.notes, input.should_merge)
|
|
382
|
+
|
|
383
|
+
lap(log, STAGE.telegram)
|
|
384
|
+
await git_pr_followup_wrapup.run_wrapup(
|
|
385
|
+
{
|
|
386
|
+
branch_name: input.branch_name,
|
|
387
|
+
issue_number,
|
|
388
|
+
notify_config: input.notify_config,
|
|
389
|
+
pr_url: context.pr_url,
|
|
390
|
+
should_merge: input.should_merge,
|
|
391
|
+
managed_notes: checks.managed,
|
|
392
|
+
},
|
|
393
|
+
log,
|
|
394
|
+
)
|
|
395
|
+
|
|
396
|
+
return issue_number
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// **The stage block is printed on the way out of every run, failed ones included**
|
|
400
|
+
// (joshuafolkken/kit#1349). A `followup` that exits non-zero on an AI-review blocker or a red check is
|
|
401
|
+
// the invocation whose wait was longest, and one that printed nothing would leave the measurement
|
|
402
|
+
// blind to exactly those. The `catch` marks the lap that was still running so the failing stage is
|
|
403
|
+
// reported rather than dropped, and rethrows unchanged — a silent run is still a failed run.
|
|
404
|
+
async function run(input: FollowupInput): Promise<string | undefined> {
|
|
405
|
+
const log = git_followup_stages.new_log()
|
|
406
|
+
|
|
407
|
+
try {
|
|
408
|
+
return await run_stages(input, log)
|
|
409
|
+
} catch (error) {
|
|
410
|
+
lap(log, STAGE.interrupted)
|
|
411
|
+
|
|
412
|
+
throw error
|
|
413
|
+
} finally {
|
|
414
|
+
git_followup_stages.print_stages(log)
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
const git_pr_followup = {
|
|
419
|
+
run,
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
export {
|
|
423
|
+
git_pr_followup,
|
|
424
|
+
WATCH_FAILED_NOTE,
|
|
425
|
+
run_checks,
|
|
426
|
+
build_issue_url,
|
|
427
|
+
parse_repo_name,
|
|
428
|
+
build_telegram_input,
|
|
429
|
+
has_closes_keyword,
|
|
430
|
+
parse_closes_issue_number,
|
|
431
|
+
warn_if_missing_closes,
|
|
432
|
+
read_coderabbit_skip_notes,
|
|
433
|
+
log_skip_notes,
|
|
434
|
+
}
|
|
435
|
+
export type { FollowupInput }
|
|
436
|
+
export type { TelegramContext } from './git-pr-ai-review'
|