@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,161 @@
|
|
|
1
|
+
import { git_gh_issue_list, type IssueListOutcome } from './git-gh-issue-list'
|
|
2
|
+
import { git_gh_issue_read } from './git-gh-issue-read'
|
|
3
|
+
import { BLOCKED_BY_COUNT_FIELD } from './git-gh-issue-rest'
|
|
4
|
+
import { git_gh_issue_write } from './git-gh-issue-write'
|
|
5
|
+
|
|
6
|
+
const NUMBER_AND_BODY_FIELDS = 'number,body'
|
|
7
|
+
// The backlog scan's fields. The title rides along because the pre-filing scan compares titles
|
|
8
|
+
// (joshuafolkken/kit#1252) and it costs nothing: the same listing request already carries it, so the
|
|
9
|
+
// two consumers share one read rather than each making their own.
|
|
10
|
+
//
|
|
11
|
+
// `blocked_by_count` rides along for the same reason and is the one field here that `gh --json`
|
|
12
|
+
// never had: it is read out of the `issue_dependencies_summary` the listing response already
|
|
13
|
+
// carries, so it costs no request at all (joshuafolkken/kit#1736). It is what lets `epic:bundle`
|
|
14
|
+
// tell a row with no blockers from one with some **before** deciding whether that row is worth a
|
|
15
|
+
// per-issue read — the read it used to make for every open issue in the repository. Absent on a row
|
|
16
|
+
// whose summary is missing, which must not be read as zero; `git-gh-issue-rest.ts` states why.
|
|
17
|
+
const BACKLOG_SCAN_FIELDS = `number,title,body,${BLOCKED_BY_COUNT_FIELD}`
|
|
18
|
+
// The recently-closed scan's fields (joshuafolkken/kit#1679). It compares titles like the scan above
|
|
19
|
+
// and never reads a body, and it needs the labels to tell an epic from a deliverable — the open half
|
|
20
|
+
// gets that from the epic listing, which by construction holds no closed epic.
|
|
21
|
+
const NUMBER_TITLE_AND_LABELS_FIELDS = 'number,title,labels'
|
|
22
|
+
// The fields every listing that is *ranked* asks for: `createdAt` to order by and `labels` to
|
|
23
|
+
// exclude by. Shared by the next-issues display and the `auto-ok` pickup, which rank identically.
|
|
24
|
+
const SUMMARY_FIELDS = 'number,title,labels,createdAt'
|
|
25
|
+
// The pickup's list, which is the display's plus the native blocker relation. Kept apart from
|
|
26
|
+
// `SUMMARY_FIELDS` on purpose: a listing carries no `blockedBy`, so the field is answered from each
|
|
27
|
+
// row's own dependencies endpoint, and asking for it on the shared list would put that request
|
|
28
|
+
// behind the next-issues display too — where a refused one becomes a failure with no message at all,
|
|
29
|
+
// since the listing swallows the error (joshuafolkken/kit#996, joshuafolkken/kit#1025).
|
|
30
|
+
const PICKUP_FIELDS = `${SUMMARY_FIELDS},blockedBy`
|
|
31
|
+
|
|
32
|
+
// Every listing below goes through the one REST invocation in `git-gh-issue-list.ts`. It kept the
|
|
33
|
+
// `json_fields` / `limit` contract it had as a `gh issue list` wrapper, so these callers changed
|
|
34
|
+
// only where a `gh` flag became a query parameter (joshuafolkken/kit#1025).
|
|
35
|
+
//
|
|
36
|
+
// **They all answer `IssueListOutcome`, not the JSON alone** (joshuafolkken/kit#1067). The page
|
|
37
|
+
// ceiling now bounds every one of them, and a bound whose caller cannot see it was reached is a
|
|
38
|
+
// silently shortened answer — so the flag rides out to the caller and the caller decides. The
|
|
39
|
+
// disposition each one settled on, and why:
|
|
40
|
+
//
|
|
41
|
+
// | Caller | Truncation is | Why |
|
|
42
|
+
// | --- | --- | --- |
|
|
43
|
+
// | `issue_list_recent` | **ignorable** | The display shows the five newest of the twenty it asks for, and the paging is newest-first — so a truncated read is a *prefix* of the untruncated one and the five rows are the same five. Nothing is hidden that this display would have shown. |
|
|
44
|
+
// | `issue_list_open_bodies` | **warning** | `epic:bundle` scanned what it scanned; a related issue past the cut is missed, which is what its existing `⚠ … cap` line already says. The scan ran, so it is something to read rather than a check that did not happen. |
|
|
45
|
+
// | `issue_search_body` | **warning** | Unchanged from joshuafolkken/kit#1033 — the orphan search ran over the newest issues, and an orphan is normally an issue filed minutes ago. |
|
|
46
|
+
// | `issue_list_by_label` | **warning** | Both consumers report it: `epic:bundle`'s epic listing, where an epic past the cut has its child recommended a second epic, and the auto-close, where an epic past the cut is never checked for completion. Neither may fail — the auto-close runs after the merge — so both print and continue. |
|
|
47
|
+
// | `issue_list_by_label_summary` | **warning** | The `auto-ok` pickup already says the cap dropped the *oldest* opted-in issues; the ceiling drops the same ones. The answer it gives is still opted in, just possibly not the highest-priority one. |
|
|
48
|
+
// | `issue_list_recently_closed` | **warning** | `issue:scout` widens its duplicate scan over what closed recently; a closed issue past the cut is one candidate the reader is not shown, exactly as on the open half. The scan ran, so it is reported beside the open one rather than failing the command. |
|
|
49
|
+
// | `issue_list_by_label_in_repo` | **error** | `epic:busy` asks whether a repository already has work running in it, and it is the only one whose answer *authorizes an action*. A truncated listing with no visible holder is not "nothing is running", and reading it as one starts a second run in the same checkout — the direction joshuafolkken/kit#925 closed. It lands with the unreadable listing, on `wait`. It is also the only caller that reports the page ceiling **without** the `limit` cap beside it; `epic-busy.ts` records why a full page of parked issues must not latch the guard. |
|
|
50
|
+
//
|
|
51
|
+
// The split is joshuafolkken/kit#1033's, applied caller by caller rather than copied: truncation is
|
|
52
|
+
// a warning where the scan *ran* and an error where the answer it produced would authorize an
|
|
53
|
+
// action. Only `epic:busy` authorizes one.
|
|
54
|
+
const { issue_list } = git_gh_issue_list
|
|
55
|
+
|
|
56
|
+
// The newest open issues, for the next-issues display at workflow completion (#821). `createdAt`
|
|
57
|
+
// rides along because the caller re-sorts explicitly rather than inheriting the listing's order.
|
|
58
|
+
async function issue_list_recent(limit: number): Promise<IssueListOutcome> {
|
|
59
|
+
return await issue_list({ json_fields: SUMMARY_FIELDS, limit })
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Every open issue with its title and body. Used by `epic:bundle` to scan the backlog and by
|
|
63
|
+
// `issue:scout` to compare titles before one is filed; a search with an empty term is not a listing,
|
|
64
|
+
// and asking `gh` for one produced a partial and arbitrary answer (joshuafolkken/kit#873).
|
|
65
|
+
async function issue_list_open_bodies(limit: number): Promise<IssueListOutcome> {
|
|
66
|
+
return await issue_list({ json_fields: BACKLOG_SCAN_FIELDS, limit })
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// The issues that closed most recently, for the duplicate half of `issue:scout`
|
|
70
|
+
// (joshuafolkken/kit#1679). **The work most likely to be filed twice is the work that just
|
|
71
|
+
// finished** — joshuafolkken/kit#1656 was filed about five hours after joshuafolkken/kit#1623 closed
|
|
72
|
+
// having already done it — and a scan that reads only open issues cannot see any of it.
|
|
73
|
+
//
|
|
74
|
+
// `sort=updated` rather than `created`: the question is what closed recently, and a listing ordered
|
|
75
|
+
// by filing date puts a five-year-old issue closed this morning behind whatever was filed yesterday.
|
|
76
|
+
// GitHub has no `sort=closed`, and `updated` moves on the close, so the newest-updated closed issues
|
|
77
|
+
// are the recently-closed ones with at most a few edited-since rows riding along — which cost a line
|
|
78
|
+
// in the candidate list and nothing else.
|
|
79
|
+
//
|
|
80
|
+
// **`labels` rather than `body`**, which is the one field list here that differs from the open scan's.
|
|
81
|
+
// The duplicate half compares titles and never reads a body, and the epic exclusion the open half
|
|
82
|
+
// gets for free — `epic_bundle_cli` marks a row from the *open* epic listing — cannot reach a closed
|
|
83
|
+
// row at all. Without the labels a closed epic would be offered as a duplicate of a deliverable, and
|
|
84
|
+
// under the new exit that reads as "this work is already done" against a container that never had an
|
|
85
|
+
// implementation of its own.
|
|
86
|
+
async function issue_list_recently_closed(limit: number): Promise<IssueListOutcome> {
|
|
87
|
+
return await issue_list({
|
|
88
|
+
json_fields: NUMBER_TITLE_AND_LABELS_FIELDS,
|
|
89
|
+
limit,
|
|
90
|
+
state: 'closed',
|
|
91
|
+
sort: 'updated',
|
|
92
|
+
})
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Open issues whose body mentions `term`. Used by `epic:audit` to find an issue that names an epic
|
|
96
|
+
// as its parent while the epic's task list does not track it (joshuafolkken/kit#870).
|
|
97
|
+
//
|
|
98
|
+
// The one listing here whose filter runs client-side, and so the one that reaches the page ceiling
|
|
99
|
+
// on an ordinary repository: its matches are normally zero, so "stop once `limit` rows are selected"
|
|
100
|
+
// never fires for it (joshuafolkken/kit#1033).
|
|
101
|
+
async function issue_search_body(term: string, limit: number): Promise<IssueListOutcome> {
|
|
102
|
+
return await issue_list({
|
|
103
|
+
json_fields: NUMBER_AND_BODY_FIELDS,
|
|
104
|
+
limit,
|
|
105
|
+
body_term: term,
|
|
106
|
+
})
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async function issue_list_by_label(label: string, limit: number): Promise<IssueListOutcome> {
|
|
110
|
+
return await issue_list({ json_fields: NUMBER_AND_BODY_FIELDS, limit, label })
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// The same filter with the fields the `auto-ok` pickup needs (joshuafolkken/kit#906): it orders by
|
|
114
|
+
// `createdAt` and re-checks `labels` client-side, so bodies would be fetched and thrown away. A
|
|
115
|
+
// label that does not exist in the repository is not an error — the listing comes back empty, which
|
|
116
|
+
// is exactly "nobody has opted anything in".
|
|
117
|
+
// `json_fields` overrides the pickup's list. Its only caller is the probe that runs *after* a failed
|
|
118
|
+
// read, asking the same question without `blockedBy` so a refused dependencies endpoint is told
|
|
119
|
+
// apart from an access failure (joshuafolkken/kit#1005).
|
|
120
|
+
async function issue_list_by_label_summary(
|
|
121
|
+
label: string,
|
|
122
|
+
limit: number,
|
|
123
|
+
options?: { json_fields?: string },
|
|
124
|
+
): Promise<IssueListOutcome> {
|
|
125
|
+
return await issue_list({
|
|
126
|
+
json_fields: options?.json_fields ?? PICKUP_FIELDS,
|
|
127
|
+
limit,
|
|
128
|
+
label,
|
|
129
|
+
})
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Open issues carrying `label` in one named repository — the read `epic:next` makes before it
|
|
133
|
+
// offers a child, to see whether that repository already has one running (joshuafolkken/kit#925).
|
|
134
|
+
//
|
|
135
|
+
// `SUMMARY_FIELDS` rather than `PICKUP_FIELDS`: the answer is only "which issues hold this
|
|
136
|
+
// repository", and asking for `blockedBy` would put a dependencies request behind the guard — where
|
|
137
|
+
// a refused one fails the whole listing, which this caller must never read as "nothing is running".
|
|
138
|
+
//
|
|
139
|
+
// `repo` names the repository inside the REST path (`git-gh-api-path.ts`). Omitted, the listing is
|
|
140
|
+
// the repository the command runs in, exactly as every other listing here.
|
|
141
|
+
async function issue_list_by_label_in_repo(
|
|
142
|
+
label: string,
|
|
143
|
+
limit: number,
|
|
144
|
+
repo?: string,
|
|
145
|
+
): Promise<IssueListOutcome> {
|
|
146
|
+
return await issue_list({ json_fields: SUMMARY_FIELDS, limit, label, repo })
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const git_gh_issue = {
|
|
150
|
+
...git_gh_issue_read,
|
|
151
|
+
...git_gh_issue_write,
|
|
152
|
+
issue_list_recent,
|
|
153
|
+
issue_list_by_label,
|
|
154
|
+
issue_list_by_label_in_repo,
|
|
155
|
+
issue_list_by_label_summary,
|
|
156
|
+
issue_search_body,
|
|
157
|
+
issue_list_open_bodies,
|
|
158
|
+
issue_list_recently_closed,
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export { git_gh_issue, PICKUP_FIELDS, SUMMARY_FIELDS }
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { git_gh_api_path } from './git-gh-api-path'
|
|
2
|
+
import { git_gh_exec } from './git-gh-exec'
|
|
3
|
+
import { read_pull, require_pr_number } from './git-gh-pr-read'
|
|
4
|
+
import { git_gh_pr_rest, type RestPull } from './git-gh-pr-rest'
|
|
5
|
+
|
|
6
|
+
// Auto-merge for a pull request a josh command opens and would otherwise have to stay alive to land
|
|
7
|
+
// (joshuafolkken/kit#2497). `pnpm josh observations:flush` used to merge its pull request only from
|
|
8
|
+
// inside its own wait, so a wait that ended early — a session cut, a killed process — left a green
|
|
9
|
+
// pull request open with nobody to merge it.
|
|
10
|
+
//
|
|
11
|
+
// **This is the one GraphQL request in the pull-request layer, because REST has no equivalent.**
|
|
12
|
+
// Enabling auto-merge is `enablePullRequestAutoMerge` and nothing else. A cloud session can be
|
|
13
|
+
// answered 403 for GraphQL (joshuafolkken/kit#1022), so the caller treats a failure here as a lost
|
|
14
|
+
// safety net rather than a failed command — the in-process wait still merges as it always did.
|
|
15
|
+
|
|
16
|
+
const GRAPHQL_PATH = 'graphql'
|
|
17
|
+
const OPEN_PULLS_QUERY = `${git_gh_api_path.FULL_PAGE_QUERY}&state=open`
|
|
18
|
+
const MISSING_NODE_ID_MESSAGE = 'gh api answered a pull request without a node_id'
|
|
19
|
+
const ENABLE_AUTO_MERGE_MUTATION =
|
|
20
|
+
'mutation($id: ID!) { enablePullRequestAutoMerge(input: { pullRequestId: $id, mergeMethod: MERGE }) { clientMutationId } }'
|
|
21
|
+
|
|
22
|
+
interface OpenPull {
|
|
23
|
+
number: number
|
|
24
|
+
head_ref: string
|
|
25
|
+
has_auto_merge: boolean
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async function pr_enable_auto_merge(branch_name: string): Promise<void> {
|
|
29
|
+
const pull = await read_pull(await require_pr_number(branch_name))
|
|
30
|
+
if (pull.node_id === undefined) throw new Error(MISSING_NODE_ID_MESSAGE)
|
|
31
|
+
|
|
32
|
+
await git_gh_exec.exec_gh_api({
|
|
33
|
+
path: GRAPHQL_PATH,
|
|
34
|
+
body: JSON.stringify({ query: ENABLE_AUTO_MERGE_MUTATION, variables: { id: pull.node_id } }),
|
|
35
|
+
})
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// **A read that failed answers "not yet" rather than throwing**, because the caller polls it: the
|
|
39
|
+
// next attempt asks again, and running out of attempts is what ends the wait.
|
|
40
|
+
async function pr_is_merged(branch_name: string): Promise<boolean> {
|
|
41
|
+
try {
|
|
42
|
+
return git_gh_pr_rest.is_merged(await read_pull(await require_pr_number(branch_name)))
|
|
43
|
+
} catch {
|
|
44
|
+
return false
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function head_reference_of(pull: RestPull): string {
|
|
49
|
+
return pull.head?.ref ?? ''
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function has_head_prefix(pull: RestPull, prefix: string): boolean {
|
|
53
|
+
return git_gh_pr_rest.is_same_repository_head(pull) && head_reference_of(pull).startsWith(prefix)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// The listing carries `auto_merge`, so no detail read is needed; whether the checks still let it land
|
|
57
|
+
// is the merge gate's question (`git_pr_checks.read_merge_progress`), asked by the caller.
|
|
58
|
+
function to_open_pull(pull: RestPull): OpenPull {
|
|
59
|
+
return {
|
|
60
|
+
number: pull.number,
|
|
61
|
+
head_ref: head_reference_of(pull),
|
|
62
|
+
has_auto_merge: pull.auto_merge !== null && pull.auto_merge !== undefined,
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function pr_list_open_with_head_prefix(prefix: string): Promise<ReadonlyArray<OpenPull>> {
|
|
67
|
+
const json = await git_gh_exec.exec_gh_api({
|
|
68
|
+
path: `${git_gh_api_path.pulls_api_path()}${OPEN_PULLS_QUERY}`,
|
|
69
|
+
should_paginate: true,
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
return git_gh_pr_rest
|
|
73
|
+
.parse_rest_pulls(json)
|
|
74
|
+
.filter((pull) => has_head_prefix(pull, prefix))
|
|
75
|
+
.map((pull) => to_open_pull(pull))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const git_gh_pr_auto_merge = {
|
|
79
|
+
pr_enable_auto_merge,
|
|
80
|
+
pr_is_merged,
|
|
81
|
+
pr_list_open_with_head_prefix,
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export type { OpenPull }
|
|
85
|
+
export { git_gh_pr_auto_merge, ENABLE_AUTO_MERGE_MUTATION }
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { FULL_PAGE_QUERY, git_gh_api_path } from './git-gh-api-path'
|
|
2
|
+
import { git_gh_exec } from './git-gh-exec'
|
|
3
|
+
import { git_gh_helpers } from './git-gh-helpers'
|
|
4
|
+
import { git_gh_pr_rest, type RestPull } from './git-gh-pr-rest'
|
|
5
|
+
|
|
6
|
+
// Reading pull requests through REST, in the answers `gh pr view` used to give.
|
|
7
|
+
//
|
|
8
|
+
// `gh pr view` goes through GraphQL, which a cloud session is answered 403 for (joshuafolkken/kit#1022).
|
|
9
|
+
// The reads move to `gh api`, and every caller downstream keeps the contract it already reads — the
|
|
10
|
+
// empty string from `pr_view`, `undefined` from the two comment readers. `pr_exists` is the one
|
|
11
|
+
// exception, and it is deliberate: it gates a **write**, so a lookup that failed cannot answer
|
|
12
|
+
// `false` there (joshuafolkken/kit#1043).
|
|
13
|
+
//
|
|
14
|
+
// One thing has no counterpart in REST: `gh pr view` accepted a **branch name** and every REST
|
|
15
|
+
// endpoint is keyed by **number**. The resolution below is the single place that bridges the two
|
|
16
|
+
// (joshuafolkken/kit#1027).
|
|
17
|
+
|
|
18
|
+
// The branch → number resolution, remembered for the life of the process.
|
|
19
|
+
//
|
|
20
|
+
// Without it the conversion would turn one request into two at six call sites: a `josh git` run
|
|
21
|
+
// alone asks `pr_exists`, `pr_view` and `pr_get_url` about the same branch, and `josh followup` adds
|
|
22
|
+
// `pr_get_body` and both comment readers. A pull request's number never changes, so the memo is
|
|
23
|
+
// sound for every one of them — with one exception, which is why `forget_pr_numbers` exists:
|
|
24
|
+
// `git-pr.ts` opens a *second* pull request on a branch whose first one merged, and a cached number
|
|
25
|
+
// would then keep answering with the merged one. `pr_create` clears it.
|
|
26
|
+
//
|
|
27
|
+
// **Only a resolved number is remembered.** A branch with no pull request is re-resolved every time,
|
|
28
|
+
// which is exactly the case `pr_create` is about to change, and a failed read is re-tried rather
|
|
29
|
+
// than remembered as an absence.
|
|
30
|
+
const pr_number_by_branch = new Map<string, number>()
|
|
31
|
+
|
|
32
|
+
// Newest first, and spelled out rather than left to the endpoint's default: `select_pull` falls back
|
|
33
|
+
// to the first row when no open pull request is on the branch, and that fallback only means "the
|
|
34
|
+
// most recent one" while this ordering holds.
|
|
35
|
+
const LOOKUP_QUERY = 'state=all&sort=created&direction=desc&per_page=100'
|
|
36
|
+
// The comment listings are paged: REST answers 30 rows by default, while `gh pr view --json comments`
|
|
37
|
+
// answered the whole conversation. Truncating them is the kit#973 failure again in another form — the
|
|
38
|
+
// newest Claude Review blocker falls off a listing that is ordered oldest first, and the merge gate
|
|
39
|
+
// finds nothing to stop on. `gh api --paginate` merges the pages of an array endpoint into one array,
|
|
40
|
+
// so the answer stays the flat listing every caller parses. The page size itself is
|
|
41
|
+
// `FULL_PAGE_QUERY`, shared with the merge-gate listings (joshuafolkken/kit#1028).
|
|
42
|
+
const COMMENTS_QUERY = FULL_PAGE_QUERY
|
|
43
|
+
// Written as a constant rather than inline: `{owner}` inside a template literal reads as a broken
|
|
44
|
+
// interpolation.
|
|
45
|
+
const OWNER_PLACEHOLDER = '{owner}'
|
|
46
|
+
const NO_HEAD_REF_MESSAGE = 'gh api answered a pull request with no head branch'
|
|
47
|
+
const FORK_HEAD_MESSAGE =
|
|
48
|
+
'gh api answered a pull request whose head branch is in another repository'
|
|
49
|
+
// What a branch-keyed caller that cannot fold an absence into its own answer throws. Lives here
|
|
50
|
+
// rather than beside either caller: the merge-gate snapshot and the two branch-keyed writes all need
|
|
51
|
+
// it, and three copies of one message is the clone `CLAUDE.md` prohibits (joshuafolkken/kit#1029).
|
|
52
|
+
const NO_PULL_REQUEST_MESSAGE = 'gh api found no pull request for branch'
|
|
53
|
+
// And what it throws when the lookup never answered at all. Separate from the message above because
|
|
54
|
+
// the two are different diagnoses: one says the branch has nothing, the other says nobody looked
|
|
55
|
+
// (joshuafolkken/kit#1048).
|
|
56
|
+
const UNREADABLE_PULL_REQUEST_MESSAGE = 'gh api could not read the pull requests for branch'
|
|
57
|
+
|
|
58
|
+
// `head` names the owner of the head repository, which for every branch this tooling opens is the
|
|
59
|
+
// repository's own owner. `gh api` expands `{owner}` inside the query string as readily as inside
|
|
60
|
+
// the path, so the lookup costs no separate request to learn the name — and none of these reads
|
|
61
|
+
// gains a second way to fail. Only the branch is escaped: an expanded `{owner}` would not be.
|
|
62
|
+
function lookup_path(branch_name: string): string {
|
|
63
|
+
const head = `${OWNER_PLACEHOLDER}:${encodeURIComponent(branch_name)}`
|
|
64
|
+
|
|
65
|
+
return `${git_gh_api_path.pulls_api_path()}?head=${head}&${LOOKUP_QUERY}`
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function fetch_pr_number(branch_name: string): Promise<number | undefined> {
|
|
69
|
+
const json = await git_gh_exec.exec_gh_api({ path: lookup_path(branch_name) })
|
|
70
|
+
|
|
71
|
+
return git_gh_pr_rest.select_pull(git_gh_pr_rest.parse_rest_pulls(json))?.number
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Why the resolution produced no number. `missing` is the lookup answering: the listing came back and
|
|
75
|
+
// held no pull request for this branch. `unreadable` is the lookup failing — a rate limit, expired
|
|
76
|
+
// auth, a dropped connection, a 200 carrying something other than a listing.
|
|
77
|
+
//
|
|
78
|
+
// The vocabulary is `IssueRead`'s in `git-gh-issue-read.ts`, which tells the same two apart for an
|
|
79
|
+
// issue number (joshuafolkken/kit#957); reusing it rather than inventing a second spelling for one
|
|
80
|
+
// distinction is the point. The *classification* is cheaper here and needs no status probe: a branch
|
|
81
|
+
// with no pull request is a 200 with an empty listing rather than a 404, so the lookup's own outcome
|
|
82
|
+
// already separates them (joshuafolkken/kit#1048).
|
|
83
|
+
type PullNumberRead =
|
|
84
|
+
{ kind: 'read'; pr_number: number } | { kind: 'missing' } | { kind: 'unreadable'; cause: unknown }
|
|
85
|
+
|
|
86
|
+
// The lookups still in flight, keyed the same way the resolved numbers are.
|
|
87
|
+
const pending_pr_number_by_branch = new Map<string, Promise<PullNumberRead>>()
|
|
88
|
+
|
|
89
|
+
async function fetch_pr_number_read(branch_name: string): Promise<PullNumberRead> {
|
|
90
|
+
try {
|
|
91
|
+
const pr_number = await fetch_pr_number(branch_name)
|
|
92
|
+
if (pr_number === undefined) return { kind: 'missing' }
|
|
93
|
+
pr_number_by_branch.set(branch_name, pr_number)
|
|
94
|
+
|
|
95
|
+
return { kind: 'read', pr_number }
|
|
96
|
+
} catch (error) {
|
|
97
|
+
return { kind: 'unreadable', cause: error }
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// **The lookup in flight is shared, not only the number it resolves to** (joshuafolkken/kit#1446).
|
|
102
|
+
// The memo above answers a caller arriving *after* the first lookup returned, which was every caller
|
|
103
|
+
// while the branch-keyed reads were issued one at a time. `josh followup` now asks `pr_get_body` and
|
|
104
|
+
// `pr_get_url` about the same branch in the same tick, and two callers that both miss an empty map
|
|
105
|
+
// each fire their own `GET /pulls?head=…` — the second request this memo exists to remove,
|
|
106
|
+
// reappearing the moment the callers stopped being serial. Overlapping the reads must not cost a
|
|
107
|
+
// request it was meant to save.
|
|
108
|
+
//
|
|
109
|
+
// **A pending entry is dropped as soon as it settles**, so the property stated above is untouched:
|
|
110
|
+
// only a resolved number is *remembered*, and a `missing` or `unreadable` lookup is re-tried by the
|
|
111
|
+
// next caller rather than remembered as an absence.
|
|
112
|
+
async function start_pr_number_read(branch_name: string): Promise<PullNumberRead> {
|
|
113
|
+
const pending = pending_pr_number_by_branch.get(branch_name)
|
|
114
|
+
if (pending !== undefined) return await pending
|
|
115
|
+
|
|
116
|
+
const lookup = fetch_pr_number_read(branch_name)
|
|
117
|
+
|
|
118
|
+
pending_pr_number_by_branch.set(branch_name, lookup)
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
return await lookup
|
|
122
|
+
} finally {
|
|
123
|
+
pending_pr_number_by_branch.delete(branch_name)
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Defined after the map it clears, so the two memos are declared before anything reaches them.
|
|
128
|
+
function forget_pr_numbers(): void {
|
|
129
|
+
pr_number_by_branch.clear()
|
|
130
|
+
pending_pr_number_by_branch.clear()
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async function read_pr_number(branch_name: string): Promise<PullNumberRead> {
|
|
134
|
+
const cached = pr_number_by_branch.get(branch_name)
|
|
135
|
+
if (cached !== undefined) return { kind: 'read', pr_number: cached }
|
|
136
|
+
|
|
137
|
+
return await start_pr_number_read(branch_name)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// `undefined` covers both "this branch has no pull request" and "the lookup failed", which is the
|
|
141
|
+
// distinction `gh pr view` never made either — every *read* here folds them together on purpose:
|
|
142
|
+
// `pr_view` answers the empty string either way, the comment readers `undefined`. The two callers
|
|
143
|
+
// that act on the absence rather than displaying it — `require_pr_number` and `pr_exists` — opt out.
|
|
144
|
+
async function resolve_pr_number(branch_name: string): Promise<number | undefined> {
|
|
145
|
+
const read = await read_pr_number(branch_name)
|
|
146
|
+
|
|
147
|
+
return read.kind === 'read' ? read.pr_number : undefined
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// One definition, because both callers that refuse to fold an unreadable lookup raise it —
|
|
151
|
+
// `require_pr_number` and `pr_exists` (joshuafolkken/kit#1043).
|
|
152
|
+
function to_unreadable_error(branch_name: string, cause: unknown): Error {
|
|
153
|
+
return new Error(`${UNREADABLE_PULL_REQUEST_MESSAGE}: ${branch_name}`, { cause })
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// The number for a caller that has nothing to fold an absence into. The reads above answer their own
|
|
157
|
+
// empty value for a branch with no pull request; a write cannot — `gh pr comment <branch>` and
|
|
158
|
+
// `gh pr merge <branch>` both failed there, and the merge-gate snapshot already threw for the same
|
|
159
|
+
// reason. One throw shared by all three (joshuafolkken/kit#1029).
|
|
160
|
+
//
|
|
161
|
+
// **This is the caller the distinction was written for.** Folding both into
|
|
162
|
+
// `NO_PULL_REQUEST_MESSAGE` reported a rate-limited lookup as "there is no pull request for this
|
|
163
|
+
// branch" — safe, in that the run stops without merging, but wrong about why, which is the
|
|
164
|
+
// joshuafolkken/kit#973 misread costing diagnosis time instead of correctness. The failure travels as
|
|
165
|
+
// the `cause`, so `git_error.handle` prints gh's own reason under 💡 Details
|
|
166
|
+
// (joshuafolkken/kit#1048).
|
|
167
|
+
async function require_pr_number(branch_name: string): Promise<number> {
|
|
168
|
+
const read = await read_pr_number(branch_name)
|
|
169
|
+
if (read.kind === 'read') return read.pr_number
|
|
170
|
+
if (read.kind === 'missing') throw new Error(`${NO_PULL_REQUEST_MESSAGE}: ${branch_name}`)
|
|
171
|
+
|
|
172
|
+
throw to_unreadable_error(branch_name, read.cause)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
async function read_pull(pr_number: number): Promise<RestPull> {
|
|
176
|
+
const json = await git_gh_exec.exec_gh_api({
|
|
177
|
+
path: git_gh_api_path.pull_api_path(String(pr_number)),
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
return git_gh_pr_rest.parse_rest_pull(json)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// One pull request named by its branch: the resolution, then the detail read that carries
|
|
184
|
+
// `mergeable` and `mergeable_state`, which the lookup listing does not.
|
|
185
|
+
async function read_pull_of_branch(branch_name: string): Promise<RestPull | undefined> {
|
|
186
|
+
const pr_number = await resolve_pr_number(branch_name)
|
|
187
|
+
if (pr_number === undefined) return undefined
|
|
188
|
+
|
|
189
|
+
try {
|
|
190
|
+
return await read_pull(pr_number)
|
|
191
|
+
} catch {
|
|
192
|
+
return undefined
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// **`false` means the branch has no pull request, and nothing else.** This is the second half of
|
|
197
|
+
// joshuafolkken/kit#1048's distinction, on the caller that needs it most: `pr_exists` is not read for
|
|
198
|
+
// display, it decides whether `git-pr.ts` **opens** a pull request. Folding an unreadable lookup into
|
|
199
|
+
// `false` therefore made a rate-limited run try to create a second pull request on a branch that
|
|
200
|
+
// already had one — surviving only because `pr_create`'s 422 → `PR_ALREADY_EXISTS` recovery caught it
|
|
201
|
+
// (joshuafolkken/kit#1029), which is an accident rather than a design. The throw is the one
|
|
202
|
+
// `require_pr_number` raises, so gh's own reason travels as the `cause` (joshuafolkken/kit#1043).
|
|
203
|
+
async function pr_exists(branch_name: string): Promise<boolean> {
|
|
204
|
+
const read = await read_pr_number(branch_name)
|
|
205
|
+
if (read.kind === 'unreadable') throw to_unreadable_error(branch_name, read.cause)
|
|
206
|
+
|
|
207
|
+
return read.kind === 'read'
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async function pr_get_number(branch_name: string): Promise<number | undefined> {
|
|
211
|
+
return await resolve_pr_number(branch_name)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async function pr_get_url(branch_name: string): Promise<string | undefined> {
|
|
215
|
+
const pull = await read_pull_of_branch(branch_name)
|
|
216
|
+
if (pull?.html_url === undefined) return undefined
|
|
217
|
+
|
|
218
|
+
return git_gh_helpers.parse_pr_state_string(pull.html_url)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// REST answers JSON null for a pull request with no body where `gh --json body` answered an empty
|
|
222
|
+
// string, and both used to arrive here as the empty answer this folds to `undefined`.
|
|
223
|
+
async function pr_get_body(branch_name: string): Promise<string | undefined> {
|
|
224
|
+
const pull = await read_pull_of_branch(branch_name)
|
|
225
|
+
const body = pull?.body
|
|
226
|
+
|
|
227
|
+
return typeof body === 'string' && body.length > 0 ? body : undefined
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// The empty string means "there is nothing to read" — a branch with no pull request, or a read that
|
|
231
|
+
// failed. `git-pr.ts` checks the length before parsing.
|
|
232
|
+
async function pr_view(branch_name: string): Promise<string> {
|
|
233
|
+
const pull = await read_pull_of_branch(branch_name)
|
|
234
|
+
if (pull === undefined) return ''
|
|
235
|
+
|
|
236
|
+
return JSON.stringify(git_gh_pr_rest.to_pr_info(pull))
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Already keyed by number, so no resolution is needed. It throws where the others fold to an empty
|
|
240
|
+
// answer, which is the contract `sync-dependabot-pins.ts` relies on: it checks out the branch it is
|
|
241
|
+
// handed, and a guessed one would push template pins onto the wrong PR.
|
|
242
|
+
async function pr_head_reference(pr_number: number): Promise<string> {
|
|
243
|
+
const pull = await read_pull(pr_number)
|
|
244
|
+
const reference = pull.head?.ref
|
|
245
|
+
if (reference === undefined) throw new Error(NO_HEAD_REF_MESSAGE)
|
|
246
|
+
// A fork's head is not on `origin` under this name, and `origin` may well carry a different branch
|
|
247
|
+
// that answers to it. Refusing is the same contract the missing ref has: the caller checks out what
|
|
248
|
+
// it is handed, so a guessed branch pushes template pins onto the wrong pull request.
|
|
249
|
+
if (!git_gh_pr_rest.is_same_repository_head(pull)) throw new Error(FORK_HEAD_MESSAGE)
|
|
250
|
+
|
|
251
|
+
return reference
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// `undefined` when the listing could not be read — a failed request, or a PR whose number could not
|
|
255
|
+
// be resolved. Not `'[]'`, which every failure used to become.
|
|
256
|
+
//
|
|
257
|
+
// The two are the same string to a caller, and the callers are the merge gate: a rate limit arrived
|
|
258
|
+
// as "no reviewer left a finding" and the PR merged with the gate never actually read
|
|
259
|
+
// (joshuafolkken/kit#973). The direction is what makes it worse than the epic auto-close's version of
|
|
260
|
+
// the same misread — that one only failed to close something.
|
|
261
|
+
async function read_comments(
|
|
262
|
+
branch_name: string,
|
|
263
|
+
to_path: (pr_number: string) => string,
|
|
264
|
+
to_json: (raw: string) => string,
|
|
265
|
+
): Promise<string | undefined> {
|
|
266
|
+
const pr_number = await resolve_pr_number(branch_name)
|
|
267
|
+
if (pr_number === undefined) return undefined
|
|
268
|
+
const path = `${to_path(String(pr_number))}${COMMENTS_QUERY}`
|
|
269
|
+
|
|
270
|
+
try {
|
|
271
|
+
return to_json(await git_gh_exec.exec_gh_api({ path, should_paginate: true }))
|
|
272
|
+
} catch {
|
|
273
|
+
return undefined
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function to_comments_json(raw: string): string {
|
|
278
|
+
return JSON.stringify(git_gh_pr_rest.to_pr_comments(raw))
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// `git-pr-coderabbit.ts` parses `html_url` and `user.login` itself, so the review thread is handed on
|
|
282
|
+
// as REST serves it (joshuafolkken/kit#1023).
|
|
283
|
+
function as_served(raw: string): string {
|
|
284
|
+
return raw
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// The conversation comments, mapped back into the shape `gh pr view --json comments` answered with —
|
|
288
|
+
// `git-pr-ai-review.ts` reads `author.login` and `url`, which REST spells `user.login` / `html_url`.
|
|
289
|
+
async function pr_get_comments(branch_name: string): Promise<string | undefined> {
|
|
290
|
+
return await read_comments(branch_name, git_gh_api_path.issue_comments_api_path, to_comments_json)
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
async function pr_get_review_comments(branch_name: string): Promise<string | undefined> {
|
|
294
|
+
return await read_comments(branch_name, git_gh_api_path.pull_comments_api_path, as_served)
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const git_gh_pr_read = {
|
|
298
|
+
pr_exists,
|
|
299
|
+
pr_get_number,
|
|
300
|
+
pr_get_url,
|
|
301
|
+
pr_get_body,
|
|
302
|
+
pr_view,
|
|
303
|
+
pr_head_reference,
|
|
304
|
+
pr_get_comments,
|
|
305
|
+
pr_get_review_comments,
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// The merge-gate snapshot needs the same branch → number resolution and the same detail read, and it
|
|
309
|
+
// needs them separately: the reviews endpoint is keyed by number while the rollup is keyed by the
|
|
310
|
+
// head commit the detail carries. Exported rather than re-derived so the memo above stays one memo
|
|
311
|
+
// (joshuafolkken/kit#1028).
|
|
312
|
+
export {
|
|
313
|
+
git_gh_pr_read,
|
|
314
|
+
forget_pr_numbers,
|
|
315
|
+
read_pull,
|
|
316
|
+
require_pr_number,
|
|
317
|
+
resolve_pr_number,
|
|
318
|
+
FORK_HEAD_MESSAGE,
|
|
319
|
+
NO_HEAD_REF_MESSAGE,
|
|
320
|
+
NO_PULL_REQUEST_MESSAGE,
|
|
321
|
+
UNREADABLE_PULL_REQUEST_MESSAGE,
|
|
322
|
+
}
|