@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,587 @@
|
|
|
1
|
+
import { PORCELAIN_FLAG } from './constants'
|
|
2
|
+
import { git_push_transport } from './git-push-transport'
|
|
3
|
+
import { git_spawn } from './git-spawn'
|
|
4
|
+
|
|
5
|
+
async function branch(): Promise<string> {
|
|
6
|
+
return await git_spawn.read(['rev-parse', '--abbrev-ref', 'HEAD'])
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// **`--untracked-files=normal` is passed rather than inherited** (joshuafolkken/kit#1381). Every
|
|
10
|
+
// reader of this output depends on the `??` lines being there: `git-staging.ts` stages exactly those,
|
|
11
|
+
// and `hook-gate-reuse.ts` reads an empty output as "this push carries the recorded tree". A person
|
|
12
|
+
// with `status.showUntrackedFiles=no` in their git config — a common setting on large repositories —
|
|
13
|
+
// gets porcelain output with those lines silently absent, so untracked files go unstaged and the
|
|
14
|
+
// pre-push hook reuses a record for a commit that does not contain them. Naming git's own default
|
|
15
|
+
// makes the reading answer to this codebase rather than to whoever ran it.
|
|
16
|
+
async function status(): Promise<string> {
|
|
17
|
+
return await git_spawn.read(['status', PORCELAIN_FLAG, '--untracked-files=normal'])
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// The absolute path every other git command's output is relative to. Asking git rather than reading
|
|
21
|
+
// `process.cwd()` is the whole point: run from a subdirectory, joining a repository-relative path
|
|
22
|
+
// onto the working directory resolves to nothing, and a digest map built that way collapses to
|
|
23
|
+
// "every file absent" — which compares *equal* to another such map (joshuafolkken/kit#1241).
|
|
24
|
+
async function repository_root(): Promise<string> {
|
|
25
|
+
return await git_spawn.read(['rev-parse', '--show-toplevel'])
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// The commit this checkout is sitting on, as opposed to `change_base_commit`'s commit a change is
|
|
29
|
+
// measured against. Read by `josh review:brief` to say which tree a review was
|
|
30
|
+
// briefed on, so a review that read a different one can be told apart from one that read this one
|
|
31
|
+
// (joshuafolkken/kit#1522).
|
|
32
|
+
async function head_commit(): Promise<string> {
|
|
33
|
+
return await git_spawn.read(['rev-parse', 'HEAD'])
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Both git directories this checkout has, absolute, one per line. In the main work tree they are the
|
|
37
|
+
// same path; in a linked work tree the first is `<repo>/.git/worktrees/<name>` and the second is
|
|
38
|
+
// `<repo>/.git`, and the commit-message file lives under the first. Asking git rather than assuming
|
|
39
|
+
// a directory named `.git` is what makes a bare repository and a `--separate-git-dir` clone answer
|
|
40
|
+
// correctly too (joshuafolkken/kit#1106).
|
|
41
|
+
// Exported so a caller that must ask the same question **synchronously** asks it with the same
|
|
42
|
+
// arguments rather than a second spelling of them (joshuafolkken/kit#1864). `git_spawn` is
|
|
43
|
+
// asynchronous throughout and a `PreToolUse` guard is synchronous by contract, so the one place that
|
|
44
|
+
// needs it runs these arguments itself — sharing the list is what keeps that from becoming a clone.
|
|
45
|
+
const GIT_DIRECTORY_ARGUMENTS: ReadonlyArray<string> = [
|
|
46
|
+
'rev-parse',
|
|
47
|
+
'--absolute-git-dir',
|
|
48
|
+
'--path-format=absolute',
|
|
49
|
+
'--git-common-dir',
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
async function git_directories(): Promise<Array<string>> {
|
|
53
|
+
const output = await git_spawn.read([...GIT_DIRECTORY_ARGUMENTS])
|
|
54
|
+
|
|
55
|
+
return output.split('\n').filter((line) => line !== '')
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function diff_cached(file_path: string): Promise<string> {
|
|
59
|
+
return await git_spawn.read(['diff', '--cached', file_path])
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const REFS_REMOTES_ORIGIN_PREFIX = 'refs/remotes/origin/'
|
|
63
|
+
const NAME_ONLY_FLAG = '--name-only'
|
|
64
|
+
const DEFAULT_BRANCH_FALLBACK = 'main'
|
|
65
|
+
|
|
66
|
+
async function get_default_branch(): Promise<string> {
|
|
67
|
+
try {
|
|
68
|
+
const output = await git_spawn.read(['symbolic-ref', 'refs/remotes/origin/HEAD'])
|
|
69
|
+
const trimmed = output.trim()
|
|
70
|
+
|
|
71
|
+
if (trimmed.startsWith(REFS_REMOTES_ORIGIN_PREFIX)) {
|
|
72
|
+
return trimmed.slice(REFS_REMOTES_ORIGIN_PREFIX.length)
|
|
73
|
+
}
|
|
74
|
+
} catch {
|
|
75
|
+
// fall through to default
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return DEFAULT_BRANCH_FALLBACK
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const MERGE_BASE_COMMAND = 'merge-base'
|
|
82
|
+
|
|
83
|
+
// **The ref the default branch is actually at**, which is not the same thing as its name
|
|
84
|
+
// (joshuafolkken/kit#1535). `get_default_branch` returns the bare name, and git resolves that to the
|
|
85
|
+
// *local* `refs/heads/<default>` — a ref nothing in this workflow advances, because merges happen on
|
|
86
|
+
// GitHub and the default branch is checked out in no work tree. This is the single source both the
|
|
87
|
+
// lane's start point and `change_base` below resolve through, so a lane cut from
|
|
88
|
+
// `refs/remotes/origin/<default>` is measured against that same commit. Measured without it: a lane
|
|
89
|
+
// cut from a remote-tracking ref three commits ahead reported those three commits' files as its own.
|
|
90
|
+
//
|
|
91
|
+
// It falls back to the bare name where there is no remote-tracking ref — a fresh `git init`, a clone
|
|
92
|
+
// with no `origin` — which is the reading every caller had before. The one case it reads differently
|
|
93
|
+
// is a local default branch *ahead* of the remote, which this workflow does not produce and
|
|
94
|
+
// `prevent-main-commit.ts` exists to stop.
|
|
95
|
+
async function reference_exists(reference: string): Promise<boolean> {
|
|
96
|
+
try {
|
|
97
|
+
await git_spawn.read(['rev-parse', '--verify', '--quiet', reference])
|
|
98
|
+
|
|
99
|
+
return true
|
|
100
|
+
} catch {
|
|
101
|
+
return false
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function default_branch_reference(): Promise<string> {
|
|
106
|
+
const default_branch = await get_default_branch()
|
|
107
|
+
const remote_reference = `${REFS_REMOTES_ORIGIN_PREFIX}${default_branch}`
|
|
108
|
+
|
|
109
|
+
return (await reference_exists(remote_reference)) ? remote_reference : default_branch
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// The commit this branch was cut from — and the base every "changed" reading below measures
|
|
113
|
+
// against, in place of the default branch itself.
|
|
114
|
+
//
|
|
115
|
+
// **A two-dot `git diff <default-branch>` compares a moving *ref* to the working tree, and in a
|
|
116
|
+
// linked work tree that ref is shared with every other lane** (joshuafolkken/kit#1527). So when one
|
|
117
|
+
// lane merges, an unmerged lane's diff picks that lane's files up in reverse: files this branch
|
|
118
|
+
// never touched arrive in `josh review:brief`'s target list, in the digest map `josh gate` stamps,
|
|
119
|
+
// and in `josh review:round2`'s fix delta.
|
|
120
|
+
//
|
|
121
|
+
// **The merge base is the fixed point that removes it**, because it is a commit rather than a ref:
|
|
122
|
+
// an advance of the default branch that this branch is an ancestor of does not move it. It is also
|
|
123
|
+
// the right answer at both points of a run, and a lane passes through both — with the work still
|
|
124
|
+
// uncommitted `HEAD` is the cut commit and the merge base is that same commit, so the diff is the
|
|
125
|
+
// uncommitted work; once the branch commits, `HEAD` moves ahead while the merge base stays put, so
|
|
126
|
+
// the diff is the branch's whole change plus anything still uncommitted. `<default-branch>...HEAD`
|
|
127
|
+
// answers neither, because a three-dot diff ends at `HEAD` and a lane's work is uncommitted for
|
|
128
|
+
// most of its run.
|
|
129
|
+
//
|
|
130
|
+
// **It never reports less than the old reading did.** The new set is the branch's own change; the
|
|
131
|
+
// old one was that same set plus the inverse of whatever the default branch had advanced by — so
|
|
132
|
+
// this narrows the reading and cannot hide a file the branch actually changed.
|
|
133
|
+
//
|
|
134
|
+
// In a checkout sitting on the default branch the merge base *is* that branch's commit, so nothing
|
|
135
|
+
// changes there. A repository with no common ancestor to find falls back to the previous reading
|
|
136
|
+
// rather than failing the callers, all of which treat a throw as "nothing can be reused".
|
|
137
|
+
async function change_base(): Promise<string> {
|
|
138
|
+
const default_branch = await default_branch_reference()
|
|
139
|
+
|
|
140
|
+
try {
|
|
141
|
+
return await git_spawn.read([MERGE_BASE_COMMAND, default_branch, 'HEAD'])
|
|
142
|
+
} catch {
|
|
143
|
+
return default_branch
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
async function diff_main(file_path: string): Promise<string> {
|
|
148
|
+
return await git_spawn.read(['diff', await change_base(), '--', file_path])
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Names only, for callers that classify a change rather than read it — `josh review:level` decides
|
|
152
|
+
// the review depth from the paths alone, and reading the whole diff to get them would be the
|
|
153
|
+
// expensive half of the thing it exists to make cheaper (joshuafolkken/kit#966).
|
|
154
|
+
//
|
|
155
|
+
// `core.quotePath=false` is not cosmetic. With git's default, a path containing any non-ASCII byte
|
|
156
|
+
// comes back C-quoted — `"prompts/\343\202\263.md"` — and a classifier testing `startsWith('prompts/')`
|
|
157
|
+
// against a string that begins with a quote character answers no. `review:level` fails safe there
|
|
158
|
+
// (non-inert wins), but a classifier that answered `skip` would drop a change it is meant to catch,
|
|
159
|
+
// so the quoting is turned off at the source every reader shares (joshuafolkken/kit#907).
|
|
160
|
+
const NO_PATH_QUOTING: ReadonlyArray<string> = ['-c', 'core.quotePath=false']
|
|
161
|
+
|
|
162
|
+
// Repository-root-relative paths, whatever the checkout is configured to prefer. `diff.relative` is
|
|
163
|
+
// a per-repository setting a person may have turned on for their own reading, and with it `git diff
|
|
164
|
+
// --name-only` run from a subdirectory prints cwd-relative paths — which every caller of this
|
|
165
|
+
// reading then joins onto the repository root (joshuafolkken/kit#1257). The flag pins the spelling
|
|
166
|
+
// at the source rather than leaving each caller to discover the configuration.
|
|
167
|
+
const NO_RELATIVE_PATHS = '--no-relative'
|
|
168
|
+
|
|
169
|
+
// **Rename detection is turned off because this listing is a description of a tree, not a summary of
|
|
170
|
+
// a change** (joshuafolkken/kit#1533). With git's default `diff.renames=true`, a rename prints only
|
|
171
|
+
// its *destination*: `git diff --name-only <base>` across a commit that moved `scripts/init-logic.ts`
|
|
172
|
+
// to `scripts/init/init-logic.ts` names the second path and never the first.
|
|
173
|
+
//
|
|
174
|
+
// That omission is what breaks `josh gate`'s reuse. The green record it compares is `base` plus a
|
|
175
|
+
// digest per listed path, and the whole claim that the record still describes the tree rests on one
|
|
176
|
+
// property: **every path that differs from `base` is in the list**, so `base` plus the digests
|
|
177
|
+
// determines the tracked tree completely. A rename's source path differs from `base` — it is gone —
|
|
178
|
+
// and it is not in the list. So a tree in which the file was renamed away and a tree in which it has
|
|
179
|
+
// since come back produce the *same* record: the returned file matches `base`, so it enters no diff,
|
|
180
|
+
// while the destination is an addition either way. The gate then reuses a green taken on the first
|
|
181
|
+
// tree for the second, without running one check on it, and a duplicated module that lint, the type
|
|
182
|
+
// check and the unit suite would all have failed on is committed on a "passed".
|
|
183
|
+
//
|
|
184
|
+
// Off, a rename is listed as its two halves — a delete and an add — and the delete is what makes the
|
|
185
|
+
// two trees compare unequal. `review-tree.ts` already records a listed path the tree does not hold
|
|
186
|
+
// as `ABSENT_DIGEST` rather than dropping it, which is exactly the entry this flag produces.
|
|
187
|
+
//
|
|
188
|
+
// **Every other reader moves in the safe direction.** `josh review:level` sees
|
|
189
|
+
// one more path and can only widen; `josh lint:related` and `josh test:related` drop what the tree
|
|
190
|
+
// no longer holds through `changed-file-scope.ts`, which they already had to do for a plain delete.
|
|
191
|
+
const NO_RENAME_DETECTION = '--no-renames'
|
|
192
|
+
|
|
193
|
+
// The commit `change_base` resolves to. Every "changed" reading below is a diff against it, so a set
|
|
194
|
+
// of changed paths — or a map of their digests — means nothing without it: fetch an advanced default
|
|
195
|
+
// branch and rebase onto it, and each digest can stay identical while the rest of the tree is
|
|
196
|
+
// replaced by code no check has read (joshuafolkken/kit#1328). A rebase still invalidates a stamp
|
|
197
|
+
// taken against it — the rebase moves `HEAD`, and with it the merge base — while another lane
|
|
198
|
+
// merging into the shared default branch no longer does, because it moves neither
|
|
199
|
+
// (joshuafolkken/kit#1527).
|
|
200
|
+
async function change_base_commit(): Promise<string> {
|
|
201
|
+
return await git_spawn.read(['rev-parse', await change_base()])
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async function diff_main_names(): Promise<string> {
|
|
205
|
+
return await git_spawn.read([
|
|
206
|
+
...NO_PATH_QUOTING,
|
|
207
|
+
'diff',
|
|
208
|
+
NAME_ONLY_FLAG,
|
|
209
|
+
NO_RELATIVE_PATHS,
|
|
210
|
+
NO_RENAME_DETECTION,
|
|
211
|
+
await change_base(),
|
|
212
|
+
'--',
|
|
213
|
+
])
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
async function diff_cached_names(): Promise<string> {
|
|
217
|
+
return await git_spawn.read([
|
|
218
|
+
...NO_PATH_QUOTING,
|
|
219
|
+
'diff',
|
|
220
|
+
'--cached',
|
|
221
|
+
NAME_ONLY_FLAG,
|
|
222
|
+
NO_RELATIVE_PATHS,
|
|
223
|
+
NO_RENAME_DETECTION,
|
|
224
|
+
])
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// The branch diff as `added\tdeleted\tpath` rows — the same base and flags as `diff_main_names`, so
|
|
228
|
+
// the size read against and the name read agree on what "changed" is. A binary file prints `-` for
|
|
229
|
+
// both counts; the parser above `josh split:assess` reads it treats those as zero changed lines.
|
|
230
|
+
async function diff_main_numstat(): Promise<string> {
|
|
231
|
+
return await git_spawn.read([
|
|
232
|
+
...NO_PATH_QUOTING,
|
|
233
|
+
'diff',
|
|
234
|
+
'--numstat',
|
|
235
|
+
NO_RELATIVE_PATHS,
|
|
236
|
+
NO_RENAME_DETECTION,
|
|
237
|
+
await change_base(),
|
|
238
|
+
'--',
|
|
239
|
+
])
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Files git is not tracking yet. `git diff` never lists them, so a classifier built on the diff
|
|
243
|
+
// alone sees a change that adds a whole new module as an empty one — which is how a run adding new
|
|
244
|
+
// code could have been handed a reduced review level (joshuafolkken/kit#966).
|
|
245
|
+
//
|
|
246
|
+
// **`--full-name` and the `:/` pathspec are what make this reading agree with the diff beside it**
|
|
247
|
+
// (joshuafolkken/kit#1257). `git diff --name-only` prints repository-root-relative paths for the
|
|
248
|
+
// whole tree wherever it is run; `git ls-files --others` prints *cwd*-relative paths and lists only
|
|
249
|
+
// what is below cwd. Read from a subdirectory, the two halves of `changed_paths` therefore came
|
|
250
|
+
// back in two different coordinate systems, and every caller that resolves a path against the
|
|
251
|
+
// repository root — `review-tree`, `josh test:related` — turned a new file into one that does not
|
|
252
|
+
// exist, or, where the same tail exists elsewhere in the tree, into a different file entirely. The
|
|
253
|
+
// pathspec restores the whole tree; the flag restores the root-relative spelling.
|
|
254
|
+
const WHOLE_TREE_PATHSPEC = ':/'
|
|
255
|
+
|
|
256
|
+
async function untracked_names(): Promise<string> {
|
|
257
|
+
return await git_spawn.read([
|
|
258
|
+
...NO_PATH_QUOTING,
|
|
259
|
+
'ls-files',
|
|
260
|
+
'--others',
|
|
261
|
+
'--exclude-standard',
|
|
262
|
+
'--full-name',
|
|
263
|
+
WHOLE_TREE_PATHSPEC,
|
|
264
|
+
])
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// One branch from `origin`, fetched by name. `gh pr checkout` did this itself after resolving the
|
|
268
|
+
// head branch through GraphQL, which a cloud session is answered 403 for (joshuafolkken/kit#1022);
|
|
269
|
+
// the resolution moved to REST and the fetch is spelled out here instead of being re-wrapped.
|
|
270
|
+
//
|
|
271
|
+
// The refspec is written out rather than left to the remote's configuration. A bare branch name is
|
|
272
|
+
// fetched under `origin`'s own refspec **only where it has the default one**: a `--single-branch`
|
|
273
|
+
// clone, and every `actions/checkout` checkout, narrow it to one branch, and there a bare name
|
|
274
|
+
// updates `FETCH_HEAD` alone. The `checkout` and the fast-forward that follow both read
|
|
275
|
+
// `refs/remotes/origin/<branch>`, so naming the destination is what keeps them working off this
|
|
276
|
+
// repository's own machine (joshuafolkken/kit#1029). `+` allows a forced update, matching what the
|
|
277
|
+
// default refspec does.
|
|
278
|
+
async function fetch_branch(branch_name: string): Promise<string> {
|
|
279
|
+
const refspec = `+refs/heads/${branch_name}:refs/remotes/origin/${branch_name}`
|
|
280
|
+
|
|
281
|
+
return await git_spawn.read(['fetch', 'origin', refspec])
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// The fast-forward `gh pr checkout` ran after its fetch, for the case the branch is already local.
|
|
285
|
+
// Without it a second `josh sdp <pr>` run works on the commit the first one left behind: the pin
|
|
286
|
+
// sync reads a stale `.github/workflows` and either reports "already in sync" or commits onto a base
|
|
287
|
+
// that `push` then rejects (joshuafolkken/kit#1029).
|
|
288
|
+
//
|
|
289
|
+
// `--ff-only` is the whole point — a branch that has diverged fails loudly rather than growing a
|
|
290
|
+
// merge commit nobody asked for, which is the behavior the CLI had.
|
|
291
|
+
async function merge_fast_forward(branch_name: string): Promise<string> {
|
|
292
|
+
return await git_spawn.read(['merge', '--ff-only', `origin/${branch_name}`])
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// The same fast-forward for a branch that is *not* checked out, so no file in the working tree moves
|
|
296
|
+
// (joshuafolkken/kit#2462). A plain refspec refuses a non-fast-forward update, and git refuses it
|
|
297
|
+
// outright for a branch checked out in any work tree — both are failures, never a rewrite.
|
|
298
|
+
async function fast_forward_local(branch_name: string): Promise<string> {
|
|
299
|
+
return await git_spawn.read(['fetch', 'origin', `${branch_name}:${branch_name}`])
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// The merge `josh main:merge` runs, and the deliberate opposite of the one above: **no `--ff-only`**,
|
|
303
|
+
// because the branch it is called on has diverged whenever the command is worth typing at all
|
|
304
|
+
// (joshuafolkken/kit#1659). Naming the strategy here is the whole fix — `git pull` decides it from
|
|
305
|
+
// `pull.rebase` / `pull.ff`, and with neither set it decides nothing and aborts.
|
|
306
|
+
//
|
|
307
|
+
// `with_output` rather than `read`: a merge that conflicts has to put git's own report in front of
|
|
308
|
+
// the person, which is what the `git pull` this replaced did.
|
|
309
|
+
//
|
|
310
|
+
// `message` replaces git's default merge message, which carries no `#N` and is therefore refused
|
|
311
|
+
// by the `commit-msg` hook on an issue branch (joshuafolkken/kit#2439).
|
|
312
|
+
async function merge_branch(branch_name: string, message?: string): Promise<void> {
|
|
313
|
+
const message_arguments = message === undefined ? [] : ['-m', message]
|
|
314
|
+
|
|
315
|
+
await git_spawn.with_output('merge', [...message_arguments, `origin/${branch_name}`])
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
async function checkout_b(branch_name: string): Promise<string> {
|
|
319
|
+
return await git_spawn.read(['checkout', '-b', branch_name])
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
async function checkout(branch_name: string): Promise<string> {
|
|
323
|
+
return await git_spawn.read(['checkout', branch_name])
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
async function commit(message: string): Promise<void> {
|
|
327
|
+
await git_spawn.with_output('commit', ['-m', message])
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// **`-d` rather than `-D`, and that is the safety rather than a preference** (joshuafolkken/kit#1785).
|
|
331
|
+
// The one caller is a rollback that removes a branch it created moments earlier, so `-d`'s refusal to
|
|
332
|
+
// delete a branch holding an unmerged commit is exactly the net it wants: a rollback can never be the
|
|
333
|
+
// thing that destroys a commit.
|
|
334
|
+
async function delete_branch(branch_name: string): Promise<void> {
|
|
335
|
+
await git_spawn.read(['branch', '-d', branch_name])
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// How many commits `tip` holds that `base` does not. **`0` is the answer that distinguishes a flush
|
|
339
|
+
// branch carrying the only copy of an appended line from one an aborted flush merely left behind**,
|
|
340
|
+
// and the two get opposite advice (joshuafolkken/kit#1785).
|
|
341
|
+
// **Output that is not a count throws rather than parsing to `0`.** `Number('')` is `0`, and `0` is
|
|
342
|
+
// the answer that says a branch holds nothing — so a read that came back empty or unparseable would
|
|
343
|
+
// report "nothing is stranded" about a branch nobody measured, which is the one wrong answer that
|
|
344
|
+
// loses work. `count_merges` guards the same way and falls back to `0` instead, because there a
|
|
345
|
+
// missing count means an empty range rather than a claim about somebody's commits.
|
|
346
|
+
async function commit_count_beyond(base: string, tip: string): Promise<number> {
|
|
347
|
+
const range = `${base}..${tip}`
|
|
348
|
+
const output = await git_spawn.read(['rev-list', '--count', range])
|
|
349
|
+
const parsed = Number(output)
|
|
350
|
+
|
|
351
|
+
if (output.length > 0 && Number.isFinite(parsed)) return parsed
|
|
352
|
+
|
|
353
|
+
throw new Error(`\`git rev-list --count ${range}\` printed \`${output}\` rather than a count`)
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function is_exit_code_128(cause: unknown): boolean {
|
|
357
|
+
return (
|
|
358
|
+
typeof cause === 'object' && cause !== null && 'exit_code' in cause && cause.exit_code === '128'
|
|
359
|
+
)
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function is_upstream_not_set_error(error: unknown): boolean {
|
|
363
|
+
if (!(error instanceof Error)) return false
|
|
364
|
+
const { cause } = error
|
|
365
|
+
|
|
366
|
+
return cause !== undefined && is_exit_code_128(cause)
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// Both pushes go through `git_push_transport` rather than `git_spawn.with_output`, which is
|
|
370
|
+
// what gives them a timeout and an SSH keepalive the local git commands beside them do not need
|
|
371
|
+
// (joshuafolkken/kit#1251). The thrown error keeps the same `cause.exit_code` shape, so the 128
|
|
372
|
+
// fallback below reads it exactly as it did.
|
|
373
|
+
async function push_with_upstream(branch_name: string): Promise<void> {
|
|
374
|
+
await git_push_transport.push(['--set-upstream', 'origin', branch_name])
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
async function push(): Promise<void> {
|
|
378
|
+
try {
|
|
379
|
+
await git_push_transport.push([])
|
|
380
|
+
} catch (error) {
|
|
381
|
+
if (is_upstream_not_set_error(error)) {
|
|
382
|
+
const current_branch = await branch()
|
|
383
|
+
|
|
384
|
+
await push_with_upstream(current_branch)
|
|
385
|
+
|
|
386
|
+
return
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
throw error
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// **`--ff-only` is named here rather than read out of whoever's git configuration is in force**
|
|
394
|
+
// (joshuafolkken/kit#1683). A bare `git pull` decides its strategy from `pull.rebase` / `pull.ff`,
|
|
395
|
+
// and with neither set — the state of a checkout nobody has configured — it decides nothing and
|
|
396
|
+
// aborts the moment the two sides have each moved:
|
|
397
|
+
//
|
|
398
|
+
// fatal: Need to specify how to reconcile divergent branches
|
|
399
|
+
//
|
|
400
|
+
// This is joshuafolkken/kit#1659's defect at the second of that issue's two `git pull` sites, left
|
|
401
|
+
// there deliberately because the callers and the conditions differ. Every caller turns out to want
|
|
402
|
+
// the same thing: it is on the default branch, bringing it up to date before doing something else —
|
|
403
|
+
// `main-sync.ts` for `josh ms`, `release-cli.ts` / `release-publish.ts` around the release pull
|
|
404
|
+
// request, `scripts-ai/prep.ts` before it snapshots the overrides, and `git-branch.ts` →
|
|
405
|
+
// `pull_latest` — reached from `scripts-ai/git-workflow.ts`, so it runs on every `josh git` /
|
|
406
|
+
// `josh pr` started from the default branch, which makes it the hottest of the five rather than a
|
|
407
|
+
// dormant one. **None of them is
|
|
408
|
+
// asking to absorb divergence**, so `merge_branch`'s reasoning inverts here: a default branch that
|
|
409
|
+
// has diverged is a state to fail loudly on rather than to grow a merge commit over. The name says
|
|
410
|
+
// which of the two this is, as `merge_fast_forward` does beside `merge_branch`.
|
|
411
|
+
async function pull_fast_forward(): Promise<void> {
|
|
412
|
+
await git_spawn.with_output('pull', ['--ff-only'])
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// Every local branch matching a `git branch --list` pattern, one name per line. The boolean below is
|
|
416
|
+
// this same read, expressed on top of it rather than beside it: `run:hold`'s preflight check needs the name
|
|
417
|
+
// itself, because the pull request an interrupted run left behind is keyed by its head branch and the
|
|
418
|
+
// slug is not derivable from an issue number alone (joshuafolkken/kit#926).
|
|
419
|
+
const SHORT_NAME_FORMAT = '--format=%(refname:short)'
|
|
420
|
+
const REMOTES_FLAG = '--remotes'
|
|
421
|
+
|
|
422
|
+
async function list_branches(
|
|
423
|
+
flags: ReadonlyArray<string>,
|
|
424
|
+
pattern: string,
|
|
425
|
+
): Promise<Array<string>> {
|
|
426
|
+
try {
|
|
427
|
+
const output: string = await git_spawn.read([
|
|
428
|
+
'branch',
|
|
429
|
+
'--list',
|
|
430
|
+
SHORT_NAME_FORMAT,
|
|
431
|
+
...flags,
|
|
432
|
+
pattern,
|
|
433
|
+
])
|
|
434
|
+
|
|
435
|
+
return output.split('\n').filter((line) => line.trim() !== '')
|
|
436
|
+
} catch {
|
|
437
|
+
return []
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
async function branch_names(pattern: string): Promise<Array<string>> {
|
|
442
|
+
return await list_branches([], pattern)
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// **The pattern is matched against the short name, which for a remote-tracking branch includes the
|
|
446
|
+
// remote** — `origin/926-x`, not `926-x` — so a caller passes `*/926-*` here and strips the remote
|
|
447
|
+
// back off itself.
|
|
448
|
+
async function branch_names_remote(pattern: string): Promise<Array<string>> {
|
|
449
|
+
return await list_branches([REMOTES_FLAG], pattern)
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
async function branch_exists(branch_name: string): Promise<boolean> {
|
|
453
|
+
const names = await branch_names(branch_name)
|
|
454
|
+
|
|
455
|
+
return names.length > 0
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// Everything `:/` matches is the repository root and everything under it, so this stages exactly what
|
|
459
|
+
// the bare `git add -u` it replaced did — from any directory, since `:/` is anchored to the root
|
|
460
|
+
// rather than to the process's working directory.
|
|
461
|
+
const ALL_PATHS_PATHSPEC = ':/'
|
|
462
|
+
|
|
463
|
+
function exclude_pathspec(file_path: string): string {
|
|
464
|
+
return `:(exclude,top)${file_path}`
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// Every tracked modification, minus the paths the caller names (joshuafolkken/kit#1756). **The
|
|
468
|
+
// positive pathspec is not decoration**: a pathspec list made only of exclusions matches nothing at
|
|
469
|
+
// all, so `ALL_PATHS_PATHSPEC` is what the exclusions are subtracted from. The one caller is
|
|
470
|
+
// `git-staging.ts`, which keeps the observation ledger out of every ordinary commit.
|
|
471
|
+
async function add_tracked(excluded_paths: ReadonlyArray<string>): Promise<void> {
|
|
472
|
+
const exclusions = excluded_paths.map((file_path) => exclude_pathspec(file_path))
|
|
473
|
+
|
|
474
|
+
await git_spawn.read(['add', '-u', '--', ALL_PATHS_PATHSPEC, ...exclusions])
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
async function add_path(file_path: string): Promise<void> {
|
|
478
|
+
await git_spawn.with_output('add', ['--', file_path])
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
// Main's own line of history. Both reads below restrict themselves to it, and for one reason: a
|
|
482
|
+
// child's commits are merged into main rather than being main's, so a walk that follows every parent
|
|
483
|
+
// answers about everything ever merged instead of about main (joshuafolkken/kit#1169).
|
|
484
|
+
const FIRST_PARENT_FLAG = '--first-parent'
|
|
485
|
+
|
|
486
|
+
// The commits that touched `file_path` along `tip`'s own first-parent line, newest first.
|
|
487
|
+
// **`--first-parent` is what keeps the answer about main's history rather than about everything ever
|
|
488
|
+
// merged into it**: a child's own commits are not main's, and the version question
|
|
489
|
+
// (joshuafolkken/kit#1169) is asked of main.
|
|
490
|
+
//
|
|
491
|
+
// **`tip` is not decoration.** `--first-parent` only reads as "main's line" when the walk starts on
|
|
492
|
+
// main; started on a feature branch it walks that branch's commits first, and any merge main took
|
|
493
|
+
// after the branch was cut is not an ancestor at all. A caller that is not on main names the ref it
|
|
494
|
+
// means — `origin/main`, say — rather than inheriting `HEAD` (joshuafolkken/kit#1486).
|
|
495
|
+
async function log_first_parent(
|
|
496
|
+
limit: number,
|
|
497
|
+
file_path: string,
|
|
498
|
+
tip = 'HEAD',
|
|
499
|
+
): Promise<Array<string>> {
|
|
500
|
+
const output = await git_spawn.read([
|
|
501
|
+
'log',
|
|
502
|
+
FIRST_PARENT_FLAG,
|
|
503
|
+
'--format=%H',
|
|
504
|
+
`-n`,
|
|
505
|
+
String(limit),
|
|
506
|
+
tip,
|
|
507
|
+
'--',
|
|
508
|
+
file_path,
|
|
509
|
+
])
|
|
510
|
+
|
|
511
|
+
return output.split('\n').filter((line) => line.length > 0)
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// One blob at one revision — `git show <ref>:<path>`. It throws when the path is absent there, which
|
|
515
|
+
// the caller reads as "no version at this revision" rather than as an error.
|
|
516
|
+
async function show_file(spec: string): Promise<string> {
|
|
517
|
+
return await git_spawn.read(['show', spec])
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
// **`--first-parent` is what makes this a count of pull requests rather than of merge commits.**
|
|
521
|
+
// Without it `rev-list` walks every ancestor of `HEAD` that `base` cannot reach, which includes
|
|
522
|
+
// merges made *inside* a pull request branch — GitHub's "Update branch" button, or a local
|
|
523
|
+
// `git merge main` before pushing. Measured on this repository, `HEAD~200..HEAD` counts 201 merges
|
|
524
|
+
// unrestricted and 200 along the first-parent line, so one such merge is already in the last two
|
|
525
|
+
// hundred commits and would have inflated a release by a whole minor (joshuafolkken/kit#1169).
|
|
526
|
+
const MERGE_COUNT_ARGUMENTS: ReadonlyArray<string> = [
|
|
527
|
+
'rev-list',
|
|
528
|
+
'--count',
|
|
529
|
+
'--merges',
|
|
530
|
+
FIRST_PARENT_FLAG,
|
|
531
|
+
]
|
|
532
|
+
|
|
533
|
+
function merge_count_arguments(range: string): Array<string> {
|
|
534
|
+
return [...MERGE_COUNT_ARGUMENTS, range]
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// How many pull requests were merged into this branch's own line in the range. **A git failure
|
|
538
|
+
// throws**, as every read here does; the `isFinite` guard is only for output that is not a number,
|
|
539
|
+
// and zero is the safe answer there because zero means "nothing to release".
|
|
540
|
+
async function count_merges(range: string): Promise<number> {
|
|
541
|
+
const output = await git_spawn.read(merge_count_arguments(range))
|
|
542
|
+
const parsed = Number(output.trim())
|
|
543
|
+
|
|
544
|
+
return Number.isFinite(parsed) ? parsed : 0
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
const git_command = {
|
|
548
|
+
GIT_DIRECTORY_ARGUMENTS,
|
|
549
|
+
branch,
|
|
550
|
+
status,
|
|
551
|
+
repository_root,
|
|
552
|
+
head_commit,
|
|
553
|
+
git_directories,
|
|
554
|
+
diff_cached,
|
|
555
|
+
diff_cached_names,
|
|
556
|
+
diff_main,
|
|
557
|
+
change_base,
|
|
558
|
+
change_base_commit,
|
|
559
|
+
diff_main_names,
|
|
560
|
+
diff_main_numstat,
|
|
561
|
+
untracked_names,
|
|
562
|
+
get_default_branch,
|
|
563
|
+
default_branch_reference,
|
|
564
|
+
fetch_branch,
|
|
565
|
+
merge_fast_forward,
|
|
566
|
+
fast_forward_local,
|
|
567
|
+
merge_branch,
|
|
568
|
+
checkout_b,
|
|
569
|
+
checkout,
|
|
570
|
+
commit,
|
|
571
|
+
commit_count_beyond,
|
|
572
|
+
delete_branch,
|
|
573
|
+
push,
|
|
574
|
+
pull_fast_forward,
|
|
575
|
+
branch_exists,
|
|
576
|
+
branch_names,
|
|
577
|
+
branch_names_remote,
|
|
578
|
+
add_tracked,
|
|
579
|
+
add_path,
|
|
580
|
+
log_first_parent,
|
|
581
|
+
show_file,
|
|
582
|
+
count_merges,
|
|
583
|
+
merge_count_arguments,
|
|
584
|
+
is_upstream_not_set_error,
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
export { git_command }
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { animation_helpers, create_git_operation_config } from './animation-helpers'
|
|
2
|
+
import { git_command } from './git-command'
|
|
3
|
+
|
|
4
|
+
async function commit(commit_message: string): Promise<void> {
|
|
5
|
+
const config = create_git_operation_config('Failed to commit changes')
|
|
6
|
+
|
|
7
|
+
console.info('')
|
|
8
|
+
await animation_helpers.execute_with_animation(
|
|
9
|
+
'Committing staged changes...',
|
|
10
|
+
async (pause_animation: (() => void) | undefined) => {
|
|
11
|
+
if (pause_animation !== undefined) {
|
|
12
|
+
pause_animation()
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
await git_command.commit(commit_message)
|
|
16
|
+
|
|
17
|
+
return 'Commit completed.'
|
|
18
|
+
},
|
|
19
|
+
config,
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const git_commit = {
|
|
24
|
+
commit,
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { git_commit }
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process'
|
|
2
|
+
import { git_utilities } from './constants'
|
|
3
|
+
import { git_command } from './git-command'
|
|
4
|
+
|
|
5
|
+
const OWN_GIT_DIRECTORY = 0
|
|
6
|
+
const COMMON_GIT_DIRECTORY = 1
|
|
7
|
+
const PROBE_TIMEOUT_MS = 2000
|
|
8
|
+
|
|
9
|
+
function read_directories(cwd: string): Array<string> {
|
|
10
|
+
const git = git_utilities.get_git_command_for_spawn()
|
|
11
|
+
const output = execFileSync(git, [...git_command.GIT_DIRECTORY_ARGUMENTS], {
|
|
12
|
+
cwd,
|
|
13
|
+
encoding: 'utf8',
|
|
14
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
15
|
+
timeout: PROBE_TIMEOUT_MS,
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
return output.trim().split('\n')
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function select_linked(directories: ReadonlyArray<string>): string | undefined {
|
|
22
|
+
const own = directories[OWN_GIT_DIRECTORY]
|
|
23
|
+
const common = directories[COMMON_GIT_DIRECTORY]
|
|
24
|
+
|
|
25
|
+
return own !== undefined && common !== undefined && own !== common ? common : undefined
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function resolve(cwd: string): string | undefined {
|
|
29
|
+
try {
|
|
30
|
+
return select_linked(read_directories(cwd))
|
|
31
|
+
} catch {
|
|
32
|
+
return undefined
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const git_common_directory = { resolve, select_linked }
|
|
37
|
+
|
|
38
|
+
export { git_common_directory }
|