@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,219 @@
|
|
|
1
|
+
import { poll } from '#scripts/lib/poll'
|
|
2
|
+
import { git_command } from './git-command'
|
|
3
|
+
import { git_gh_api_path } from './git-gh-api-path'
|
|
4
|
+
import { git_gh_exec } from './git-gh-exec'
|
|
5
|
+
import { git_gh_helpers } from './git-gh-helpers'
|
|
6
|
+
import { git_gh_issue_write } from './git-gh-issue-write'
|
|
7
|
+
import { forget_pr_numbers, git_gh_pr_read, read_pull, require_pr_number } from './git-gh-pr-read'
|
|
8
|
+
import { git_gh_pr_rest } from './git-gh-pr-rest'
|
|
9
|
+
import { git_gh_pr_snapshot } from './git-gh-pr-snapshot'
|
|
10
|
+
|
|
11
|
+
// The pull-request writes, through REST.
|
|
12
|
+
//
|
|
13
|
+
// `gh pr create` / `comment` / `merge` / `checkout` all go through GraphQL, which a cloud session is
|
|
14
|
+
// answered 403 for while the REST endpoints are served normally (joshuafolkken/kit#1022). The reads
|
|
15
|
+
// converted first — the ones `gh pr view` served in `git-gh-pr-read.ts` (joshuafolkken/kit#1027) and
|
|
16
|
+
// the merge gate's snapshot in `git-gh-pr-snapshot.ts` (joshuafolkken/kit#1028) — and these are the
|
|
17
|
+
// last four calls, plus the one whose API use the epic left unconfirmed.
|
|
18
|
+
//
|
|
19
|
+
// **Every path here was measured against the live API before it was written**, on a throwaway pull
|
|
20
|
+
// request opened between two throwaway branches so that neither `main` nor any real pull request was
|
|
21
|
+
// touched. Two of the four did not behave as reading the documentation would suggest: see
|
|
22
|
+
// `pr_create` for the duplicate-head response and `pr_checkout` for what `gh` actually does.
|
|
23
|
+
//
|
|
24
|
+
// `pr_checks` — a `gh pr checks <branch>` wrapper — is gone rather than converted. Nothing called it:
|
|
25
|
+
// the merge gate reads the rollup out of the snapshot and `git-pr-checks-watch.ts` runs the watching
|
|
26
|
+
// variant, so rebuilding it on REST would have added a second, unread path to the same data.
|
|
27
|
+
|
|
28
|
+
// The browser URL of the pull request, which is what `gh pr create` printed and what `git-pr.ts`
|
|
29
|
+
// displays. REST answers the whole object, so the same value is unwrapped out of it.
|
|
30
|
+
const HTML_URL_FILTER = '.html_url'
|
|
31
|
+
const PUT_METHOD = 'PUT'
|
|
32
|
+
const PATCH_METHOD = 'PATCH'
|
|
33
|
+
// `gh pr merge --merge` produced a merge commit, and this repository allows nothing else
|
|
34
|
+
// (`allow_squash_merge` and `allow_rebase_merge` are both false). Sent explicitly rather than left to
|
|
35
|
+
// the endpoint's default, so a change to either would fail loudly instead of silently squashing.
|
|
36
|
+
const MERGE_COMMIT_METHOD = 'merge'
|
|
37
|
+
// The one write worth waiting longer for, and the only per-request override in this file. It is the
|
|
38
|
+
// least idempotent request the layer makes, so the failure the shared 60-second budget produces is
|
|
39
|
+
// the expensive one: a merge that landed while the request was already being abandoned. Three
|
|
40
|
+
// minutes lowers how often that happens without leaving the request unbounded — the recovery below
|
|
41
|
+
// is what actually removes the failure mode, and this only makes it rarer (joshuafolkken/kit#1077).
|
|
42
|
+
const MERGE_REQUEST_TIMEOUT_MS = 180_000
|
|
43
|
+
// What a failed merge whose outcome could not be read back is reported as. Deliberately neither
|
|
44
|
+
// "merged" nor "not merged": nobody read it.
|
|
45
|
+
const MERGE_UNCONFIRMED_MESSAGE =
|
|
46
|
+
'gh api could not read the pull request back after the merge request failed'
|
|
47
|
+
const MERGE_READ_BACK_ATTEMPTS = 3
|
|
48
|
+
const MERGE_READ_BACK_INTERVAL_MS = 1000
|
|
49
|
+
|
|
50
|
+
// **`head` is required and `gh pr create` never asked for it.** The CLI inferred it from the current
|
|
51
|
+
// branch; REST does not, and a request without it is a 422. The branch is read from git rather than
|
|
52
|
+
// from the pull request the run is about to create.
|
|
53
|
+
//
|
|
54
|
+
// A branch whose previous pull request merged gets a second one, so the branch → number resolution
|
|
55
|
+
// the reads memoize is stale from here on. Clearing it is what keeps `pr_get_url` from answering
|
|
56
|
+
// with the merged pull request afterwards.
|
|
57
|
+
//
|
|
58
|
+
// **The duplicate-head answer is the trap.** `gh pr create` wrote `a pull request for branch … into
|
|
59
|
+
// branch … already exists` to stderr, and `handle_pr_create_error` turns any `already exists` into
|
|
60
|
+
// the `PR_ALREADY_EXISTS` that `git-pr.ts` recovers from. REST answers 422 with
|
|
61
|
+
// `{"message":"Validation Failed","errors":[{"resource":"PullRequest","code":"custom","message":"A
|
|
62
|
+
// pull request already exists for <owner>:<branch>."}]}` — which `gh` writes to **stdout**, putting
|
|
63
|
+
// only `gh: Validation Failed (HTTP 422)` on stderr. The body reaches the thrown Error because
|
|
64
|
+
// `to_gh_error` appends stdout (joshuafolkken/kit#1029); the `already exists` match itself is
|
|
65
|
+
// unchanged, because both wordings contain it and the 422 carries no machine-readable code for the
|
|
66
|
+
// case (`"code":"custom"`).
|
|
67
|
+
async function pr_create(title: string, body: string): Promise<string> {
|
|
68
|
+
const base = await git_command.get_default_branch()
|
|
69
|
+
const head = await git_command.branch()
|
|
70
|
+
|
|
71
|
+
forget_pr_numbers()
|
|
72
|
+
|
|
73
|
+
try {
|
|
74
|
+
return await git_gh_exec.exec_gh_api({
|
|
75
|
+
path: git_gh_api_path.pulls_api_path(),
|
|
76
|
+
body: JSON.stringify({ title, body, head, base }),
|
|
77
|
+
jq_filter: HTML_URL_FILTER,
|
|
78
|
+
})
|
|
79
|
+
} catch (error) {
|
|
80
|
+
return git_gh_helpers.handle_pr_create_error(error)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// **`gh pr checkout` does use GraphQL** — one `POST /graphql` to resolve the pull request, measured
|
|
85
|
+
// with `GH_DEBUG=api` on the throwaway pull request (joshuafolkken/kit#1029). Everything after that
|
|
86
|
+
// is git, so only the resolution had to move: `pr_head_reference` is the REST read that already
|
|
87
|
+
// replaced it for this file's one caller, `sync-dependabot-pins.ts`.
|
|
88
|
+
//
|
|
89
|
+
// `fetch_branch` updates `refs/remotes/origin/<branch>`, which is what lets the plain `checkout`
|
|
90
|
+
// resolve a branch that exists only on the remote — the tracking branch `gh` left behind, by the
|
|
91
|
+
// operations `git-command.ts` already owns rather than a new wrapper. The fast-forward is the third
|
|
92
|
+
// thing the CLI did and the one a fetch-and-checkout pair silently drops: a branch that is already
|
|
93
|
+
// local is checked out at whatever commit the last run left it on.
|
|
94
|
+
//
|
|
95
|
+
// A fork's head is refused by `pr_head_reference` rather than fetched from `origin` under a name
|
|
96
|
+
// that repository may use for something else.
|
|
97
|
+
async function pr_checkout(pr_number: number): Promise<void> {
|
|
98
|
+
const branch_name = await git_gh_pr_read.pr_head_reference(pr_number)
|
|
99
|
+
|
|
100
|
+
await git_command.fetch_branch(branch_name)
|
|
101
|
+
await git_command.checkout(branch_name)
|
|
102
|
+
await git_command.merge_fast_forward(branch_name)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// A pull request's conversation comment is an **issue** comment: `POST issues/{N}/comments` is the
|
|
106
|
+
// endpoint, and it answers the same `html_url` for a pull request as for an issue (measured on the
|
|
107
|
+
// throwaway pull request). `git-gh-issue-write.ts` already posts to it, so this resolves the number
|
|
108
|
+
// and reuses that writer rather than adding a second call site for one endpoint.
|
|
109
|
+
async function pr_comment(branch_name: string, body: string): Promise<string> {
|
|
110
|
+
const pr_number = await require_pr_number(branch_name)
|
|
111
|
+
|
|
112
|
+
return await git_gh_issue_write.issue_comment(String(pr_number), body)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Replaces the body of the branch's open pull request. `git -y` opens a pull request once, so a
|
|
116
|
+
// body supplied on a later run — the live-execution evidence `followup` gates the merge on
|
|
117
|
+
// (joshuafolkken/kit#2446) — reaches an already-open one only through this write.
|
|
118
|
+
async function pr_update_body(branch_name: string, body: string): Promise<void> {
|
|
119
|
+
const pr_number = await require_pr_number(branch_name)
|
|
120
|
+
|
|
121
|
+
await git_gh_exec.exec_gh_api({
|
|
122
|
+
path: git_gh_api_path.pull_api_path(String(pr_number)),
|
|
123
|
+
method: PATCH_METHOD,
|
|
124
|
+
body: JSON.stringify({ body }),
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
async function put_merge(pr_number: number): Promise<void> {
|
|
129
|
+
await git_gh_exec.exec_gh_api({
|
|
130
|
+
path: git_gh_api_path.pull_merge_api_path(String(pr_number)),
|
|
131
|
+
method: PUT_METHOD,
|
|
132
|
+
body: JSON.stringify({ merge_method: MERGE_COMMIT_METHOD }),
|
|
133
|
+
timeout_ms: MERGE_REQUEST_TIMEOUT_MS,
|
|
134
|
+
})
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// `undefined` is "nobody read it", kept apart from the `false` that means "the pull request is not
|
|
138
|
+
// merged". Folding the two is the misread joshuafolkken/kit#925 / #950 / #973 / #1048 all refuse.
|
|
139
|
+
async function read_merge_state(pr_number: number): Promise<boolean | undefined> {
|
|
140
|
+
try {
|
|
141
|
+
return git_gh_pr_rest.is_merged(await read_pull(pr_number))
|
|
142
|
+
} catch (error) {
|
|
143
|
+
// The reason goes in the line, for the same reason the poll loop's warning carries one: the
|
|
144
|
+
// failure this throws below names the *merge* request as its cause, so without this an operator
|
|
145
|
+
// is told the pull request could not be read back and never why.
|
|
146
|
+
console.warn(`Could not read the pull request back: ${String(error)}`)
|
|
147
|
+
|
|
148
|
+
return undefined
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// The wait goes **between** attempts and never after the last one — the convention `poll.wait_between`
|
|
153
|
+
// and `git-pr-checks.ts`'s own `sleep_before_next_attempt` both hold to. Without the guard a merge
|
|
154
|
+
// whose read-back never succeeds delays its own failure report by a whole interval.
|
|
155
|
+
async function sleep_between_read_backs(attempt: number): Promise<void> {
|
|
156
|
+
if (attempt < MERGE_READ_BACK_ATTEMPTS - 1) await poll.sleep(MERGE_READ_BACK_INTERVAL_MS)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Whether the merge is actually there, asked only after the request failed.
|
|
160
|
+
//
|
|
161
|
+
// **The read-back is retried, because the outage that killed the merge request is the one most
|
|
162
|
+
// likely to kill the read that follows it** — the same rate limit, the same dropped connection. One
|
|
163
|
+
// unretried request would therefore fail hardest in exactly the case this recovery exists for. Three
|
|
164
|
+
// attempts a second apart get past a dropped connection; a real outage still ends below, and a
|
|
165
|
+
// re-run of `followup` recovers from that.
|
|
166
|
+
//
|
|
167
|
+
// **A read that failed is still not an answer.** Out of attempts it throws rather than reporting
|
|
168
|
+
// `false`, carrying the merge failure as its `cause`, so no run ever concludes "the merge did not
|
|
169
|
+
// happen" from a read nobody got.
|
|
170
|
+
async function has_merge_landed(pr_number: number, merge_error: unknown): Promise<boolean> {
|
|
171
|
+
for (let attempt = 0; attempt < MERGE_READ_BACK_ATTEMPTS; attempt += 1) {
|
|
172
|
+
const is_merged = await read_merge_state(pr_number)
|
|
173
|
+
if (is_merged !== undefined) return is_merged
|
|
174
|
+
|
|
175
|
+
await sleep_between_read_backs(attempt)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
throw new Error(MERGE_UNCONFIRMED_MESSAGE, { cause: merge_error })
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// **The least idempotent write in this layer, made re-entrant** (joshuafolkken/kit#1077).
|
|
182
|
+
//
|
|
183
|
+
// The request carries a budget like everything else since joshuafolkken/kit#1065, and a merge that
|
|
184
|
+
// lands server-side but overruns it used to throw: `followup` then skipped its completion
|
|
185
|
+
// notification and the epic auto-close, and a re-run answered 405 on a pull request that was already
|
|
186
|
+
// merged. The budget did not create that — before it the same request hung forever, with no
|
|
187
|
+
// notification either and no end to the run — it only turned a silent hang into a loud failure.
|
|
188
|
+
//
|
|
189
|
+
// **A failed merge request is not proof the merge did not happen**, so the pull request's own state
|
|
190
|
+
// settles it: merged, and this returns as if the request had succeeded, which is what lets
|
|
191
|
+
// `followup` carry on to the notification and the epic close, and what makes re-running it recover
|
|
192
|
+
// instead of failing on the 405. Not merged, and the original failure is rethrown unchanged.
|
|
193
|
+
//
|
|
194
|
+
// **The question is "is this pull request merged", not "did my request merge it"**, and that is
|
|
195
|
+
// deliberate: the state the recovery has to act on is whether the branch is in, and a merge someone
|
|
196
|
+
// made by hand between the failure and the read leaves `followup` with exactly the same work to
|
|
197
|
+
// finish. REST offers nothing that would tell the two apart without keeping the merge commit's SHA
|
|
198
|
+
// across a request that never answered.
|
|
199
|
+
async function pr_merge(branch_name: string): Promise<void> {
|
|
200
|
+
const pr_number = await require_pr_number(branch_name)
|
|
201
|
+
|
|
202
|
+
try {
|
|
203
|
+
await put_merge(pr_number)
|
|
204
|
+
} catch (error) {
|
|
205
|
+
if (!(await has_merge_landed(pr_number, error))) throw error
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const git_gh_pr = {
|
|
210
|
+
...git_gh_pr_read,
|
|
211
|
+
...git_gh_pr_snapshot,
|
|
212
|
+
pr_create,
|
|
213
|
+
pr_checkout,
|
|
214
|
+
pr_comment,
|
|
215
|
+
pr_merge,
|
|
216
|
+
pr_update_body,
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export { git_gh_pr, MERGE_COMMIT_METHOD, MERGE_REQUEST_TIMEOUT_MS, MERGE_UNCONFIRMED_MESSAGE }
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// Whether GitHub answered at all — the question a failed read has to ask before it calls itself a
|
|
2
|
+
// structural failure (joshuafolkken/kit#1663).
|
|
3
|
+
//
|
|
4
|
+
// **The question is now asked of the failed request itself, not of a later one**
|
|
5
|
+
// (joshuafolkken/kit#1690). `probe()` used to fire one request at `rate_limit` after the reads were
|
|
6
|
+
// over and the answer otherwise final; a connection that dropped for a few hundred milliseconds
|
|
7
|
+
// failed a read at t=0 and answered that probe `reachable`, so the run kept the verdict the probe
|
|
8
|
+
// gave it rather than the one the read had. What remains here is the classification — status to
|
|
9
|
+
// retryable-or-not — which `git-gh-issue-read.ts` applies to the status the failed request carried
|
|
10
|
+
// on its own error document.
|
|
11
|
+
//
|
|
12
|
+
// A dropped connection, a name that would not resolve, a rate limit and a 5xx are **retryable**: the
|
|
13
|
+
// same request a moment later can succeed, and nothing about the repository has to change first. A
|
|
14
|
+
// 404 or a 401 is not — the issue is absent or the credentials are wrong, and asking again answers
|
|
15
|
+
// the same. Callers that cannot tell the two apart have to choose one meaning for both, and
|
|
16
|
+
// joshuafolkken/kit#1663 measured what that costs: an unattended run reported thirteen runnable
|
|
17
|
+
// issues as an unresolvable dependency graph because DNS hiccuped once.
|
|
18
|
+
//
|
|
19
|
+
// **It classifies by status code and not by gh's wording**, which is the same argument
|
|
20
|
+
// `issue_view_json_classified` records for separating 404 from the rest: a message is prose that can
|
|
21
|
+
// be reworded between releases, while the status is the protocol. The transport case is the one the
|
|
22
|
+
// protocol expresses by *absence* — no status line at all — which is exactly what
|
|
23
|
+
// `exec_gh_api_status` already answers `undefined` for.
|
|
24
|
+
|
|
25
|
+
// **403 is deliberately not retryable.** GitHub does spell some secondary rate limits that way, but
|
|
26
|
+
// it is equally how a SAML-SSO-unauthorized token, an IP allowlist and an org policy each answer —
|
|
27
|
+
// all permanent, and all diagnosed correctly by the `gh auth status` advice the unusable-graph
|
|
28
|
+
// report already carries. Reading one of those as a connection problem would be this Issue's own
|
|
29
|
+
// misdirection pointed the other way, so the ambiguous status is left with the permanent meaning and
|
|
30
|
+
// only the unambiguous ones — 429, 5xx, and no answer at all — are treated as worth asking again.
|
|
31
|
+
const RATE_LIMITED_STATUS = 429
|
|
32
|
+
const SERVER_ERROR_FLOOR = 500
|
|
33
|
+
|
|
34
|
+
// `unreachable` is a statement about the transport, never about the caller's own request: it says
|
|
35
|
+
// the probe could not get an answer out of GitHub, and deliberately not that any particular read
|
|
36
|
+
// would have succeeded had it.
|
|
37
|
+
type GhReachability = 'reachable' | 'unreachable'
|
|
38
|
+
|
|
39
|
+
function is_retryable_status(status: number): boolean {
|
|
40
|
+
if (status >= SERVER_ERROR_FLOOR) return true
|
|
41
|
+
|
|
42
|
+
return status === RATE_LIMITED_STATUS
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// `undefined` is the transport case rather than an unknown one: a failed `gh api` request that wrote
|
|
46
|
+
// no response body has no status to report, which a request that never arrived is exactly — the same
|
|
47
|
+
// meaning `exec_gh_api_status` gives it when no status line was reached.
|
|
48
|
+
function classify_status(status: number | undefined): GhReachability {
|
|
49
|
+
if (status === undefined) return 'unreachable'
|
|
50
|
+
|
|
51
|
+
return is_retryable_status(status) ? 'unreachable' : 'reachable'
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const gh_reachability = { classify_status }
|
|
55
|
+
|
|
56
|
+
export { gh_reachability }
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { 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
|
+
|
|
5
|
+
// `owner/repo` for the repository the session runs in.
|
|
6
|
+
//
|
|
7
|
+
// Read through REST rather than `gh repo view --json nameWithOwner`: the `gh <noun> <verb>` form
|
|
8
|
+
// goes through GraphQL, which a cloud session is refused outright (403), so this read answered
|
|
9
|
+
// `undefined` there and every caller needing the name inherited that answer
|
|
10
|
+
// (joshuafolkken/kit#1023).
|
|
11
|
+
//
|
|
12
|
+
// The pull-request reads no longer go through it at all: they address `repos/{owner}/{repo}` and
|
|
13
|
+
// name the head filter's owner as `{owner}` too, which `gh api` expands inside a query string as
|
|
14
|
+
// readily as inside a path. That keeps six branch-keyed reads from gaining a second way to fail, and
|
|
15
|
+
// it is what makes `pr_get_review_comments` REST end to end (joshuafolkken/kit#1027). The remaining
|
|
16
|
+
// caller is the completion notification, which puts the name in its Telegram body.
|
|
17
|
+
//
|
|
18
|
+
// The failure contract is unchanged: `undefined` when the read fails, for a caller that has nothing
|
|
19
|
+
// better to do with the error than treat the name as unknown.
|
|
20
|
+
async function repo_get_name_with_owner(): Promise<string | undefined> {
|
|
21
|
+
try {
|
|
22
|
+
const result: string = await git_gh_exec.exec_gh_api({
|
|
23
|
+
path: git_gh_api_path.repo_api_path(),
|
|
24
|
+
jq_filter: '.full_name',
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
return git_gh_helpers.parse_pr_state_string(result)
|
|
28
|
+
} catch {
|
|
29
|
+
return undefined
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const git_gh_repo = {
|
|
34
|
+
repo_get_name_with_owner,
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { git_gh_repo }
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// The casing rule between REST and `gh --json`, and the one spelling of a merged pull request.
|
|
2
|
+
//
|
|
3
|
+
// REST answers `open` / `closed` in lower case and reports a merge as a *separate* field, while `gh`
|
|
4
|
+
// answered `OPEN` / `CLOSED` / `MERGED` and every reader downstream compares against that spelling.
|
|
5
|
+
// Two endpoints have to recompose the third value from different fields — the issue endpoint from
|
|
6
|
+
// `pull_request.merged_at`, the pulls endpoint from `merged` — so the rule they share is named here
|
|
7
|
+
// rather than in either of them (joshuafolkken/kit#1027).
|
|
8
|
+
const MERGED_STATE = 'MERGED'
|
|
9
|
+
|
|
10
|
+
function to_gh_state(state: string | undefined): string | undefined {
|
|
11
|
+
return state?.toUpperCase()
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { MERGED_STATE, to_gh_state }
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { lane_paths } from '#scripts/lane/lane-paths'
|
|
2
|
+
import { SEPARATOR_LINE } from './constants'
|
|
3
|
+
import { git_gh_issue_read } from './git-gh-issue-read'
|
|
4
|
+
import { git_prompt } from './git-prompt'
|
|
5
|
+
|
|
6
|
+
interface IssueInfo {
|
|
7
|
+
title: string
|
|
8
|
+
number: string
|
|
9
|
+
branch_name: string
|
|
10
|
+
commit_message: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const ISSUE_NUMBER_PATTERN = /#(\d+)$/u
|
|
14
|
+
|
|
15
|
+
function extract_issue_number(input: string): string {
|
|
16
|
+
const match = ISSUE_NUMBER_PATTERN.exec(input)
|
|
17
|
+
|
|
18
|
+
if (match === null) {
|
|
19
|
+
throw new Error('Invalid format: Issue number not found (e.g., "title #52")')
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return match[1] ?? ''
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function extract_issue_title(input: string): string {
|
|
26
|
+
const title = input.replace(/#\d+$/u, '').trim()
|
|
27
|
+
|
|
28
|
+
if (title.length === 0) {
|
|
29
|
+
throw new Error('Invalid format: Issue title is required')
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return title
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function normalize_title_for_branch(title: string): string {
|
|
36
|
+
const replaced = title
|
|
37
|
+
.toLowerCase()
|
|
38
|
+
.normalize('NFKD')
|
|
39
|
+
.replaceAll(/[^a-z0-9]+/gu, '-')
|
|
40
|
+
.replaceAll(/-+/gu, '-')
|
|
41
|
+
.replaceAll(/(^-)|(-$)/gu, '')
|
|
42
|
+
|
|
43
|
+
return replaced.length === 0 ? 'update' : replaced
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function create_branch_name(issue_number: string, title: string): string {
|
|
47
|
+
return `${issue_number}-${normalize_title_for_branch(title)}`
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function parse_issue_input(input: string): IssueInfo {
|
|
51
|
+
const trimmed_input = input.trim()
|
|
52
|
+
const issue_number = extract_issue_number(trimmed_input)
|
|
53
|
+
const title = extract_issue_title(trimmed_input)
|
|
54
|
+
const branch_name = create_branch_name(issue_number, title)
|
|
55
|
+
const commit_message = `${title} #${issue_number}`
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
title,
|
|
59
|
+
number: issue_number,
|
|
60
|
+
branch_name,
|
|
61
|
+
commit_message,
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const BRANCH_NUMBER_PATTERN = /^(\d+)-(.+)$/u
|
|
66
|
+
|
|
67
|
+
// A lane's branch is `<N>-lane` (joshuafolkken/kit#1490), so its second segment is the fixed word
|
|
68
|
+
// `lane` rather than a slug of the title — de-slugging it produced commit messages like `lane #1465`
|
|
69
|
+
// on joshuafolkken/kit#1586. The shape is recognized through `lane_paths.lane_branch` rather than a
|
|
70
|
+
// second copy of the suffix, so the two ends cannot drift apart (joshuafolkken/kit#1590).
|
|
71
|
+
function is_lane_branch(branch_name: string, issue_number: string): boolean {
|
|
72
|
+
return branch_name === lane_paths.lane_branch(issue_number)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const EXAMPLE_ISSUE_NUMBER = '42'
|
|
76
|
+
|
|
77
|
+
function argument_hint(issue_number: string): string {
|
|
78
|
+
return `Provide an issue argument like "title #${issue_number}".`
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Never falls back to the branch's own word: `lane` is not a title, and a commit message cannot be
|
|
82
|
+
// rewritten once it is on the default branch. Failing loudly leaves the caller one argument away.
|
|
83
|
+
async function lane_issue_title(branch_name: string, issue_number: string): Promise<string> {
|
|
84
|
+
const title = await git_gh_issue_read.issue_get_title(issue_number)
|
|
85
|
+
|
|
86
|
+
if (title === undefined) {
|
|
87
|
+
throw new Error(
|
|
88
|
+
`Cannot read the title of issue #${issue_number} for lane branch "${branch_name}". ${argument_hint(issue_number)}`,
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return title
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function derive_issue_input_from_branch(branch_name: string): Promise<string> {
|
|
96
|
+
const match = BRANCH_NUMBER_PATTERN.exec(branch_name)
|
|
97
|
+
|
|
98
|
+
if (match === null) {
|
|
99
|
+
throw new Error(
|
|
100
|
+
`Cannot derive issue info from branch "${branch_name}" in non-interactive mode. ${argument_hint(EXAMPLE_ISSUE_NUMBER)}`,
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const [, number = '', slug = ''] = match
|
|
105
|
+
const title = is_lane_branch(branch_name, number)
|
|
106
|
+
? await lane_issue_title(branch_name, number)
|
|
107
|
+
: slug.replaceAll('-', ' ').trim()
|
|
108
|
+
|
|
109
|
+
return `${title} #${number}`
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function derive_from_branch(branch_name: string): Promise<IssueInfo> {
|
|
113
|
+
const parsed = parse_issue_input(await derive_issue_input_from_branch(branch_name))
|
|
114
|
+
|
|
115
|
+
// Pin to the actual branch so a non-round-tripping slug never triggers a branch switch.
|
|
116
|
+
return { ...parsed, branch_name }
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function display_issue_info(issue_info: IssueInfo): void {
|
|
120
|
+
console.info('')
|
|
121
|
+
console.info('📋 Issue Information')
|
|
122
|
+
console.info(SEPARATOR_LINE)
|
|
123
|
+
console.info(` Issue Title: ${issue_info.title}`)
|
|
124
|
+
console.info(` Issue Number: ${issue_info.number}`)
|
|
125
|
+
console.info(` Branch Name: ${issue_info.branch_name}`)
|
|
126
|
+
console.info(` Commit Message: ${issue_info.commit_message}`)
|
|
127
|
+
console.info(SEPARATOR_LINE)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async function get_and_display(cli_input?: string): Promise<IssueInfo> {
|
|
131
|
+
const input = cli_input ?? (await git_prompt.get_issue_info())
|
|
132
|
+
const issue_info = parse_issue_input(input)
|
|
133
|
+
|
|
134
|
+
display_issue_info(issue_info)
|
|
135
|
+
|
|
136
|
+
return issue_info
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
interface ResolveIssueInput {
|
|
140
|
+
cli_input: string | undefined
|
|
141
|
+
current_branch: string
|
|
142
|
+
is_non_interactive: boolean
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// In non-interactive mode (e.g. `josh pr` / `-y` with no issue arg, or no TTY) the issue
|
|
146
|
+
// info is derived from the current branch instead of prompting, so headless runs never throw.
|
|
147
|
+
async function resolve_and_display(input: ResolveIssueInput): Promise<IssueInfo> {
|
|
148
|
+
if (input.cli_input !== undefined) return await get_and_display(input.cli_input)
|
|
149
|
+
|
|
150
|
+
if (input.is_non_interactive) {
|
|
151
|
+
const issue_info = await derive_from_branch(input.current_branch)
|
|
152
|
+
|
|
153
|
+
display_issue_info(issue_info)
|
|
154
|
+
|
|
155
|
+
return issue_info
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return await get_and_display()
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const git_issue = {
|
|
162
|
+
get_and_display,
|
|
163
|
+
resolve_and_display,
|
|
164
|
+
derive_from_branch,
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export type { IssueInfo }
|
|
168
|
+
export { git_issue }
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// The `GIT_*` variables that decide **which** repository, work tree, index or object store a `git`
|
|
2
|
+
// command acts on — and every one of them beats `cwd` outright.
|
|
3
|
+
//
|
|
4
|
+
// git exports them to every hook it runs, so a child process spawned from inside `pre-commit` or
|
|
5
|
+
// `pre-push` inherits a pointer at the repository the hook is firing in. A helper that passes
|
|
6
|
+
// `{ cwd: fixture_directory }` and nothing else therefore writes into the **real** checkout, with no
|
|
7
|
+
// error anywhere: joshuafolkken/kit#1515 found it in `propagate-git`'s probes, and
|
|
8
|
+
// joshuafolkken/kit#1530 found the same shape in `lane-change-base.test.ts`, where it committed a
|
|
9
|
+
// test fixture's own commits onto a lane's live branch during the pre-push gate.
|
|
10
|
+
//
|
|
11
|
+
// The list is single-sourced here because it now has three consumers that must not drift apart: the
|
|
12
|
+
// probes that clear it, the fixture that clears it, and the unit-suite guard that refuses a write
|
|
13
|
+
// while any of it is set (`scripts/test/test-repository-guard.ts`).
|
|
14
|
+
//
|
|
15
|
+
// **Only the variables that redirect where git writes are listed.** `GIT_PREFIX`, `GIT_EDITOR` and
|
|
16
|
+
// the `GIT_CONFIG_*` family are exported to hooks too and are deliberately absent: clearing them
|
|
17
|
+
// buys nothing, and the guard refuses on the presence of any name on this list, so a name that does
|
|
18
|
+
// not redirect a write would only manufacture false positives.
|
|
19
|
+
const GIT_LOCATION_VARIABLES: ReadonlyArray<string> = [
|
|
20
|
+
'GIT_ALTERNATE_OBJECT_DIRECTORIES',
|
|
21
|
+
'GIT_COMMON_DIR',
|
|
22
|
+
'GIT_DIR',
|
|
23
|
+
'GIT_INDEX_FILE',
|
|
24
|
+
'GIT_NAMESPACE',
|
|
25
|
+
'GIT_OBJECT_DIRECTORY',
|
|
26
|
+
'GIT_WORK_TREE',
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
// The `env` overlay that makes `cwd` mean what it says. Spread into an execa call alongside
|
|
30
|
+
// `extendEnv: true`, each `undefined` removes that name from the child's environment rather than
|
|
31
|
+
// setting it to the string `"undefined"`.
|
|
32
|
+
function location_free_environment(): Record<string, undefined> {
|
|
33
|
+
return Object.fromEntries(GIT_LOCATION_VARIABLES.map((name) => [name, undefined]))
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// `Reflect.deleteProperty` rather than `delete`: assigning `undefined` to a `process.env` key stores
|
|
37
|
+
// the string `"undefined"`, which git reads as a request rather than as an absence.
|
|
38
|
+
function forget(name: string): void {
|
|
39
|
+
Reflect.deleteProperty(process.env, name)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function restore_one(name: string, value: string | undefined): void {
|
|
43
|
+
if (value === undefined) forget(name)
|
|
44
|
+
else process.env[name] = value
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// The same clearing applied to **this** process, answering with the restore. A child's environment
|
|
48
|
+
// is not the whole exposure: a helper that spawns `git` with no `env` of its own inherits
|
|
49
|
+
// `process.env`, so a test file driving such a helper has to clear the variables where they are.
|
|
50
|
+
function clear_git_location_variables(): () => void {
|
|
51
|
+
const previous = GIT_LOCATION_VARIABLES.map((name) => [name, process.env[name]] as const)
|
|
52
|
+
|
|
53
|
+
for (const [name] of previous) forget(name)
|
|
54
|
+
|
|
55
|
+
return (): void => {
|
|
56
|
+
for (const [name, value] of previous) restore_one(name, value)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const git_location_environment = { clear_git_location_variables, location_free_environment }
|
|
61
|
+
|
|
62
|
+
export { GIT_LOCATION_VARIABLES, git_location_environment }
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// How origin is asked whether it carries a branch — the one place that says it
|
|
2
|
+
// (joshuafolkken/kit#1732).
|
|
3
|
+
//
|
|
4
|
+
// **The pattern is the full ref path, because `ls-remote` matches a pattern against the *tail* of a
|
|
5
|
+
// ref at a slash boundary** (joshuafolkken/kit#1709). A bare name therefore answers for any branch
|
|
6
|
+
// ending in it: `1641-lane` matches `refs/heads/wip/1641-lane`, and `release/v1.2.0` matches
|
|
7
|
+
// `refs/heads/foo/release/v1.2.0`. **`--heads` does not close it** — that limits which refs are
|
|
8
|
+
// considered, not where inside one the pattern may match. Anchored at `refs/heads/`, only the exact
|
|
9
|
+
// branch is left, since no shorter tail of `refs/heads/wip/1641-lane` starts with `refs/heads/`.
|
|
10
|
+
// Callers pass a bare branch name, so the prefix goes on once even for a name that already carries a
|
|
11
|
+
// slash.
|
|
12
|
+
//
|
|
13
|
+
// **It is the arguments that are shared, not the spawn.** `git_worktree.ls_remote_branch` runs this
|
|
14
|
+
// asynchronously against the process's own cwd with no timeout, while
|
|
15
|
+
// `propagate_git.has_remote_branch` runs it synchronously against a consumer's path under a remote
|
|
16
|
+
// budget — three differences that belong to those callers. What was duplicated is the knowledge
|
|
17
|
+
// above, and joshuafolkken/kit#1709 fixed it in only one of the two places, which is the defect
|
|
18
|
+
// joshuafolkken/kit#1732 was filed for. Kept in one module, the next such fix reaches both.
|
|
19
|
+
const LS_REMOTE_COMMAND = 'ls-remote'
|
|
20
|
+
const HEADS_FLAG = '--heads'
|
|
21
|
+
const ORIGIN_REMOTE = 'origin'
|
|
22
|
+
const HEADS_REF_PREFIX = 'refs/heads/'
|
|
23
|
+
|
|
24
|
+
function ls_remote_branch_arguments(branch_name: string): Array<string> {
|
|
25
|
+
return [LS_REMOTE_COMMAND, HEADS_FLAG, ORIGIN_REMOTE, `${HEADS_REF_PREFIX}${branch_name}`]
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export { ls_remote_branch_arguments }
|