@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,27 @@
|
|
|
1
|
+
import { animation_helpers, create_git_operation_config } from './animation-helpers'
|
|
2
|
+
import { git_command } from './git-command'
|
|
3
|
+
|
|
4
|
+
async function push(): Promise<void> {
|
|
5
|
+
const config = create_git_operation_config('')
|
|
6
|
+
|
|
7
|
+
console.info('')
|
|
8
|
+
await animation_helpers.execute_with_animation(
|
|
9
|
+
'Pushing changes to remote...',
|
|
10
|
+
async (pause_animation: (() => void) | undefined) => {
|
|
11
|
+
if (pause_animation !== undefined) {
|
|
12
|
+
pause_animation()
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
await git_command.push()
|
|
16
|
+
|
|
17
|
+
return 'Push completed.'
|
|
18
|
+
},
|
|
19
|
+
config,
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const git_push = {
|
|
24
|
+
push,
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { git_push }
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { git_worktree } from './git-worktree'
|
|
2
|
+
|
|
3
|
+
// Does origin still have this branch, and could we even tell? (joshuafolkken/kit#1641; lifted out of
|
|
4
|
+
// `scripts/lane/lane-start-point.ts`, which asked the question first.)
|
|
5
|
+
//
|
|
6
|
+
// **The remote-tracking ref is not evidence that the remote still has the branch.** Nothing here
|
|
7
|
+
// prunes it — `lane:close` removes the work tree and the local branch, GitHub deletes the remote
|
|
8
|
+
// branch at the merge, and the ref survives both — so reading one as "origin has it" answers about
|
|
9
|
+
// whatever this checkout last fetched. `ls-remote` is asked instead, because it separates the two
|
|
10
|
+
// answers a `fetch` failure runs together: a branch that is gone, from a remote that cannot be
|
|
11
|
+
// reached.
|
|
12
|
+
//
|
|
13
|
+
// **Two callers need that same three-way answer, which is why it lives here rather than inside
|
|
14
|
+
// either of them.** `lane-start-point.ts` decides which ref a reopened lane is cut from, and
|
|
15
|
+
// `release-publish.ts` decides whether a release branch name is already taken. What each of them
|
|
16
|
+
// *does* with an answer differs — a lane degrades to the tracking ref and says so, a release refuses
|
|
17
|
+
// outright — so the shared part is the asking alone, and copying it into the second caller would be
|
|
18
|
+
// the clone `CLAUDE.md` prohibits.
|
|
19
|
+
type RemoteAnswer = 'absent' | 'present' | 'unreachable'
|
|
20
|
+
|
|
21
|
+
// Empty output on a zero exit is `absent`; any output is `present`; a rejection — `ls-remote` exits
|
|
22
|
+
// non-zero when the transport fails, and `git_spawn.read` turns that into a throw — is
|
|
23
|
+
// `unreachable`, **never folded into `absent`**. Folding them is what makes a guard answer "nothing
|
|
24
|
+
// there" to a question it could not ask.
|
|
25
|
+
async function ask(branch_name: string): Promise<RemoteAnswer> {
|
|
26
|
+
try {
|
|
27
|
+
const heads = await git_worktree.ls_remote_branch(branch_name)
|
|
28
|
+
|
|
29
|
+
return heads.trim() === '' ? 'absent' : 'present'
|
|
30
|
+
} catch {
|
|
31
|
+
return 'unreachable'
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const git_remote_branch = {
|
|
36
|
+
ask,
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { git_remote_branch }
|
|
40
|
+
export type { RemoteAnswer }
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { execa } from 'execa'
|
|
2
|
+
import { git_utilities } from './constants'
|
|
3
|
+
import { create_spawn_error, get_exit_code } from './git-execa-error'
|
|
4
|
+
|
|
5
|
+
// The one place the ordinary git commands are spawned from (joshuafolkken/kit#1640). It sits in a
|
|
6
|
+
// module of its own rather than inside `git-command.ts` so that a second command module —
|
|
7
|
+
// `git-worktree.ts` — can read it without importing the first. `read` is what resolves the git binary
|
|
8
|
+
// and turns a non-zero exit into an error, and a second spawn helper beside it would be the clone
|
|
9
|
+
// `CLAUDE.md` prohibits, so a new caller imports this one instead of growing its own.
|
|
10
|
+
//
|
|
11
|
+
// **`git-push-transport.ts` is the one deliberate exception among the command modules** and is not a
|
|
12
|
+
// second helper of this kind: a push needs a timeout and a transport-fault retry that no other
|
|
13
|
+
// command has, so it spawns git itself. Those two files are the spawn sites of the ordinary command
|
|
14
|
+
// modules — the claim stops there. Other parts of this package spawn git for their own purposes
|
|
15
|
+
// (`scripts/run/run-progress-clock.ts`, `scripts/propagate/propagate-git.ts`,
|
|
16
|
+
// `scripts/doctor/doctor-io.ts`, `scripts/git/git-fixture-workspace.ts`), and an audit of how the git
|
|
17
|
+
// binary is resolved has to read those too.
|
|
18
|
+
|
|
19
|
+
async function read(arguments_: Array<string>): Promise<string> {
|
|
20
|
+
const git_cmd = git_utilities.get_git_command_for_spawn()
|
|
21
|
+
// execa runs the binary directly with an argument array and no `shell` option, so CLI
|
|
22
|
+
// args cannot break out of a shell sandbox; the git command and args are internally
|
|
23
|
+
// controlled, never untrusted input. tssecurity:S8705 is a false positive here.
|
|
24
|
+
const { stdout } = await execa(git_cmd, arguments_) // NOSONAR
|
|
25
|
+
|
|
26
|
+
return stdout.trimEnd()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async function with_output(command: string, arguments_list: Array<string>): Promise<void> {
|
|
30
|
+
const git_command_bin = git_utilities.get_git_command_for_spawn()
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
// execa runs the binary directly with an argument array and no `shell` option, so CLI
|
|
34
|
+
// args cannot break out of a shell sandbox; the git command and args are internally
|
|
35
|
+
// controlled, never untrusted input. tssecurity:S8705 is a false positive here.
|
|
36
|
+
await execa(git_command_bin, [command, ...arguments_list], { stdio: 'inherit' }) // NOSONAR
|
|
37
|
+
} catch (error) {
|
|
38
|
+
throw create_spawn_error(command, get_exit_code(error))
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const git_spawn = {
|
|
43
|
+
read,
|
|
44
|
+
with_output,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { git_spawn }
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import {
|
|
2
|
+
observation_ledger,
|
|
3
|
+
OBSERVATION_LEDGER_PATH,
|
|
4
|
+
} from '#scripts/observations/observation-ledger'
|
|
5
|
+
import { git_command } from './git-command'
|
|
6
|
+
import { git_prompt } from './git-prompt'
|
|
7
|
+
import { git_status } from './git-status'
|
|
8
|
+
|
|
9
|
+
async function confirm_package_json_staged(should_force = false): Promise<boolean> {
|
|
10
|
+
const is_package_json_staged = await git_status.check_package_json_staged()
|
|
11
|
+
|
|
12
|
+
if (!is_package_json_staged) {
|
|
13
|
+
if (should_force) {
|
|
14
|
+
console.info('💡 Skipping package.json staging check (force).')
|
|
15
|
+
|
|
16
|
+
return false
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
await git_prompt.confirm_missing_package_json()
|
|
20
|
+
|
|
21
|
+
return false
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return true
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function confirm_package_json_version(should_force = false): Promise<void> {
|
|
28
|
+
const is_version_updated = await git_status.check_package_json_version()
|
|
29
|
+
|
|
30
|
+
if (is_version_updated) {
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (should_force) {
|
|
35
|
+
console.info('💡 Skipping package.json version check (force).')
|
|
36
|
+
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
await git_prompt.confirm_without_version_update()
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function check_and_confirm_package_json(should_force = false): Promise<void> {
|
|
44
|
+
const is_already_updated = await git_status.check_branch_version()
|
|
45
|
+
|
|
46
|
+
if (is_already_updated) {
|
|
47
|
+
console.info('💡 Version already updated on this branch. Skipping package.json check.')
|
|
48
|
+
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const is_staged = await confirm_package_json_staged(should_force)
|
|
53
|
+
|
|
54
|
+
if (is_staged) {
|
|
55
|
+
await confirm_package_json_version(should_force)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function stage_untracked_files(files: ReadonlyArray<string>): Promise<void> {
|
|
60
|
+
if (files.length === 0) return
|
|
61
|
+
|
|
62
|
+
for (const file of files) {
|
|
63
|
+
await git_command.add_path(file)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
console.info(`💡 Auto-staged ${String(files.length)} untracked non-ignored file(s):`)
|
|
67
|
+
for (const file of files) console.info(` + ${file}`)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// **The observation ledger is never staged by an ordinary commit** (joshuafolkken/kit#1756). A
|
|
71
|
+
// parent session appends to it in the primary checkout and nothing there commits it, so the next
|
|
72
|
+
// `pnpm josh git` run in that checkout swept the line into a pull request about something else
|
|
73
|
+
// entirely — a diff a reviewer has no reason to question. Excluding it here covers every entry
|
|
74
|
+
// point, because this is the one staging step all of them go through;
|
|
75
|
+
// `pnpm josh observations:flush` is what commits it, on a branch of its own.
|
|
76
|
+
const PATHS_EXCLUDED_FROM_STAGING: ReadonlyArray<string> = [OBSERVATION_LEDGER_PATH]
|
|
77
|
+
|
|
78
|
+
function is_stageable(file_path: string): boolean {
|
|
79
|
+
return !PATHS_EXCLUDED_FROM_STAGING.includes(file_path)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// **Said out loud, because the alternative is an unexplained failure.** With the ledger the only
|
|
83
|
+
// thing changed, `git_status.check_unstaged` still answers true, nothing is staged, and the commit
|
|
84
|
+
// step dies on git's empty index with `Failed to commit changes` — a message naming nothing that
|
|
85
|
+
// caused it. This line is what turns that into a diagnosis.
|
|
86
|
+
//
|
|
87
|
+
// **The paths are parsed rather than matched as substrings**: `docs/observations.md.bak` contains the
|
|
88
|
+
// ledger's path, and a hint naming a file the exclusion never touched is a hint that teaches the
|
|
89
|
+
// reader to ignore it.
|
|
90
|
+
function report_excluded_paths(status_output: string): void {
|
|
91
|
+
const excluded = status_output
|
|
92
|
+
.split('\n')
|
|
93
|
+
.filter((line) => line.trim().length > 0)
|
|
94
|
+
.map((line) => observation_ledger.status_path(line))
|
|
95
|
+
.filter((file_path) => !is_stageable(file_path))
|
|
96
|
+
|
|
97
|
+
for (const file_path of excluded) {
|
|
98
|
+
console.info(`💡 ${file_path} is not staged; commit it with \`pnpm josh observations:flush\`.`)
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async function stage_tracked_files(): Promise<void> {
|
|
103
|
+
const status_output = await git_command.status()
|
|
104
|
+
const untracked = git_status
|
|
105
|
+
.list_untracked_files(status_output)
|
|
106
|
+
.filter((file_path) => is_stageable(file_path))
|
|
107
|
+
|
|
108
|
+
await git_command.add_tracked(PATHS_EXCLUDED_FROM_STAGING)
|
|
109
|
+
console.info('💡 Auto-staged tracked modified files (git add -u).')
|
|
110
|
+
report_excluded_paths(status_output)
|
|
111
|
+
await stage_untracked_files(untracked)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function check_and_confirm_staging(should_force = false): Promise<void> {
|
|
115
|
+
const has_unstaged = await git_status.check_unstaged()
|
|
116
|
+
|
|
117
|
+
if (has_unstaged) {
|
|
118
|
+
await (should_force ? stage_tracked_files() : git_prompt.confirm_unstaged_files())
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
await check_and_confirm_package_json(should_force)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const git_staging = {
|
|
125
|
+
check_and_confirm_staging,
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export { git_staging }
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { git_spawn } from './git-spawn'
|
|
2
|
+
|
|
3
|
+
// The one place a sanctioned `git stash pop` is targeted by its message rather than its stack
|
|
4
|
+
// position (joshuafolkken/kit#2050). The stash is a single repository-wide stack shared by every
|
|
5
|
+
// working tree of the repository, so a bare `git stash pop` — or a positional `stash@{n}` read
|
|
6
|
+
// before another lane pushed — pops whatever now sits on top, which is how one lane's parked work
|
|
7
|
+
// ended up in another lane's tree. Resolving the selector from the message the stash was pushed
|
|
8
|
+
// with, immediately before the pop, targets the entry itself rather than a position that moves.
|
|
9
|
+
|
|
10
|
+
const ENTRY_SEPARATOR = '\n'
|
|
11
|
+
// A NUL between the two fields, because the subject carries the spaces and colons a message repeats.
|
|
12
|
+
const FIELD_SEPARATOR = '\u{0}'
|
|
13
|
+
// `%gd` is the selector (`stash@{0}`), `%gs` the reflog subject (`On <branch>: <message>` for a
|
|
14
|
+
// stash pushed with `-m`); `%x00` emits the NUL the fields are split on.
|
|
15
|
+
const LIST_FORMAT = '--format=%gd%x00%gs'
|
|
16
|
+
const SUBJECT_MESSAGE_SEPARATOR = ': '
|
|
17
|
+
|
|
18
|
+
interface StashEntry {
|
|
19
|
+
selector: string
|
|
20
|
+
subject: string
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
type Selection =
|
|
24
|
+
| { kind: 'match'; selector: string }
|
|
25
|
+
| { kind: 'none' }
|
|
26
|
+
| { kind: 'ambiguous'; selectors: ReadonlyArray<string> }
|
|
27
|
+
|
|
28
|
+
function to_entry(line: string): StashEntry | undefined {
|
|
29
|
+
const [selector, subject] = line.split(FIELD_SEPARATOR)
|
|
30
|
+
|
|
31
|
+
if (selector === undefined || subject === undefined) return undefined
|
|
32
|
+
|
|
33
|
+
return { selector, subject }
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function parse_entries(raw: string): Array<StashEntry> {
|
|
37
|
+
if (raw === '') return []
|
|
38
|
+
|
|
39
|
+
return raw
|
|
40
|
+
.split(ENTRY_SEPARATOR)
|
|
41
|
+
.map((line) => to_entry(line))
|
|
42
|
+
.filter((entry): entry is StashEntry => entry !== undefined)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// A stash pushed with `-m "<message>"` lists as `On <branch>: <message>`, and one pushed by a step
|
|
46
|
+
// that gave no branch context lists as `<message>` verbatim. Both are matched, and the `: ` suffix
|
|
47
|
+
// test keeps `#20` from matching a message that merely ends in `#200`.
|
|
48
|
+
function matches(subject: string, message: string): boolean {
|
|
49
|
+
return subject === message || subject.endsWith(`${SUBJECT_MESSAGE_SEPARATOR}${message}`)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function select(entries: ReadonlyArray<StashEntry>, message: string): Selection {
|
|
53
|
+
const found = entries.filter((entry) => matches(entry.subject, message))
|
|
54
|
+
|
|
55
|
+
const [first] = found
|
|
56
|
+
|
|
57
|
+
if (first === undefined) return { kind: 'none' }
|
|
58
|
+
|
|
59
|
+
if (found.length > 1) {
|
|
60
|
+
return { kind: 'ambiguous', selectors: found.map((entry) => entry.selector) }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return { kind: 'match', selector: first.selector }
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// The stash is a repository-level stack every work tree shares, so the list reads the same wherever
|
|
67
|
+
// it runs; `dir` is what makes the pop land in the lane's tree rather than the primary checkout —
|
|
68
|
+
// the `git -C <dir>` a lane child used to write by hand.
|
|
69
|
+
function git_args(directory: string | undefined, args: Array<string>): Array<string> {
|
|
70
|
+
return directory === undefined ? args : ['-C', directory, ...args]
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function list(directory?: string): Promise<Array<StashEntry>> {
|
|
74
|
+
return parse_entries(await git_spawn.read(git_args(directory, ['stash', 'list', LIST_FORMAT])))
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async function pop(selector: string, directory?: string): Promise<void> {
|
|
78
|
+
await git_spawn.read(git_args(directory, ['stash', 'pop', selector]))
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// `git stash pop` on a content conflict applies the entry, keeps it on the stack, and exits non-zero
|
|
82
|
+
// — the resume path documented in `backlogrun-park.md` ("expect to resolve conflicts"). The non-zero
|
|
83
|
+
// exit is indistinguishable from a real failure by its code alone, so a conflicted pop is told apart
|
|
84
|
+
// by the unmerged paths it leaves: `--diff-filter=U` lists exactly those, empty on any other failure.
|
|
85
|
+
async function has_conflict(directory?: string): Promise<boolean> {
|
|
86
|
+
const unmerged = await git_spawn.read(
|
|
87
|
+
git_args(directory, ['diff', '--name-only', '--diff-filter=U']),
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
return unmerged !== ''
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Uncommitted work is anything `git status --porcelain` lists — untracked files included, which is what
|
|
94
|
+
// `push` below carries with `-u`, so the two agree on what "work" means (joshuafolkken/kit#2476).
|
|
95
|
+
async function has_changes(directory?: string): Promise<boolean> {
|
|
96
|
+
return (await git_spawn.read(git_args(directory, ['status', '--porcelain']))) !== ''
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Push with a message `josh stash:pop` can later target — the stack is shared by every work tree, so an
|
|
100
|
+
// entry pushed from a lane outlives the lane's own tree.
|
|
101
|
+
async function push(message: string, directory?: string): Promise<void> {
|
|
102
|
+
await git_spawn.read(git_args(directory, ['stash', 'push', '-u', '-m', message]))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// The message uncommitted work is pushed with, keyed on the issue so `josh stash:pop` can target it and
|
|
106
|
+
// on the occasion so two pushes for one issue — a lane close and an `already-done` read — stay apart.
|
|
107
|
+
function work_message(issue: string, occasion: string): string {
|
|
108
|
+
return `${issue}: uncommitted work at ${occasion}`
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const git_stash = {
|
|
112
|
+
has_changes,
|
|
113
|
+
has_conflict,
|
|
114
|
+
list,
|
|
115
|
+
matches,
|
|
116
|
+
parse_entries,
|
|
117
|
+
pop,
|
|
118
|
+
push,
|
|
119
|
+
select,
|
|
120
|
+
work_message,
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export type { Selection, StashEntry }
|
|
124
|
+
export { git_stash }
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { animation_helpers, type AnimationOptions } from './animation-helpers'
|
|
2
|
+
import { REQUIRED_STATUS_LENGTH, STAGED_STATUS_INDEX, UNTRACKED_FILE_PREFIX } from './constants'
|
|
3
|
+
import { git_command } from './git-command'
|
|
4
|
+
|
|
5
|
+
const WARNING_ICON = '🔔'
|
|
6
|
+
const PACKAGE_JSON_FILE = 'package.json'
|
|
7
|
+
const STATUS_PREFIX_LENGTH = 2
|
|
8
|
+
const VERSION_NOT_UPDATED = 'Not updated'
|
|
9
|
+
|
|
10
|
+
function is_untracked_file(line: string): boolean {
|
|
11
|
+
return line.startsWith(UNTRACKED_FILE_PREFIX)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function is_unstaged_file(line: string): boolean {
|
|
15
|
+
return line.length >= REQUIRED_STATUS_LENGTH && line[STAGED_STATUS_INDEX] !== ' '
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function parse_status_lines(status_output: string): Array<string> {
|
|
19
|
+
return status_output
|
|
20
|
+
.split(/\r?\n/u)
|
|
21
|
+
.map((line) => line.trimEnd())
|
|
22
|
+
.filter((line) => line.length > 0)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function has_unstaged_files(status_output: string): boolean {
|
|
26
|
+
const lines = parse_status_lines(status_output)
|
|
27
|
+
const has_untracked = lines.some((line) => is_untracked_file(line))
|
|
28
|
+
const has_unstaged = lines.some((line) => is_unstaged_file(line))
|
|
29
|
+
|
|
30
|
+
return has_untracked || has_unstaged
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function is_staged_file(line: string): boolean {
|
|
34
|
+
if (line.length < REQUIRED_STATUS_LENGTH || is_untracked_file(line)) {
|
|
35
|
+
return false
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const [staged_status] = line
|
|
39
|
+
|
|
40
|
+
return staged_status !== ' '
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function has_unstaged_changes(line: string): boolean {
|
|
44
|
+
return line.length >= REQUIRED_STATUS_LENGTH && line[STAGED_STATUS_INDEX] !== ' '
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function has_all_files_staged(status_output: string): boolean {
|
|
48
|
+
const lines = parse_status_lines(status_output)
|
|
49
|
+
|
|
50
|
+
if (lines.length === 0) {
|
|
51
|
+
return true
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return lines.every((line) => !has_unstaged_changes(line))
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function extract_filename(line: string): string {
|
|
58
|
+
return line.slice(STATUS_PREFIX_LENGTH).trim()
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function is_package_json_staged(status_output: string): boolean {
|
|
62
|
+
const lines = parse_status_lines(status_output)
|
|
63
|
+
|
|
64
|
+
return lines.some((line) => {
|
|
65
|
+
if (!is_staged_file(line)) {
|
|
66
|
+
return false
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const filename = extract_filename(line)
|
|
70
|
+
|
|
71
|
+
return filename === PACKAGE_JSON_FILE
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function create_status_check_config(
|
|
76
|
+
has_warning: (is_check_passing: boolean) => boolean,
|
|
77
|
+
error_message: string,
|
|
78
|
+
result_formatter: (is_check_passing: boolean) => string,
|
|
79
|
+
): AnimationOptions<boolean> {
|
|
80
|
+
return {
|
|
81
|
+
icon_selector: (is_check_passing) => (has_warning(is_check_passing) ? WARNING_ICON : undefined),
|
|
82
|
+
error_message,
|
|
83
|
+
result_formatter,
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function is_version_updated_in_diff(diff_output: string): boolean {
|
|
88
|
+
const version_pattern = /^[+-].*"version"\s*:/u
|
|
89
|
+
|
|
90
|
+
return diff_output.split(/\r?\n/u).some((line) => version_pattern.test(line))
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async function check_unstaged(): Promise<boolean> {
|
|
94
|
+
const config = create_status_check_config(
|
|
95
|
+
(has_unstaged) => has_unstaged,
|
|
96
|
+
'Failed to check unstaged files',
|
|
97
|
+
(has_unstaged) => (has_unstaged ? 'Found' : 'None'),
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
return await animation_helpers.execute_with_animation(
|
|
101
|
+
'Checking unstaged files...',
|
|
102
|
+
async () => {
|
|
103
|
+
const status_output = await git_command.status()
|
|
104
|
+
|
|
105
|
+
return has_unstaged_files(status_output)
|
|
106
|
+
},
|
|
107
|
+
config,
|
|
108
|
+
)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async function check_all_staged(): Promise<boolean> {
|
|
112
|
+
const config = create_status_check_config(
|
|
113
|
+
(all_staged) => !all_staged,
|
|
114
|
+
'Failed to check staged files',
|
|
115
|
+
(all_staged) => (all_staged ? 'All staged' : 'Not all staged'),
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
return await animation_helpers.execute_with_animation(
|
|
119
|
+
'Checking if all files are staged...',
|
|
120
|
+
async () => {
|
|
121
|
+
const status_output = await git_command.status()
|
|
122
|
+
|
|
123
|
+
return has_all_files_staged(status_output)
|
|
124
|
+
},
|
|
125
|
+
config,
|
|
126
|
+
)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async function check_package_json_staged(): Promise<boolean> {
|
|
130
|
+
const config = create_status_check_config(
|
|
131
|
+
(is_staged) => !is_staged,
|
|
132
|
+
'Failed to check package.json staging status',
|
|
133
|
+
(is_staged) => (is_staged ? 'Staged' : 'Not staged'),
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
return await animation_helpers.execute_with_animation(
|
|
137
|
+
'Checking if package.json is staged...',
|
|
138
|
+
async () => {
|
|
139
|
+
const status_output = await git_command.status()
|
|
140
|
+
|
|
141
|
+
return is_package_json_staged(status_output)
|
|
142
|
+
},
|
|
143
|
+
config,
|
|
144
|
+
)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
async function check_package_json_version(): Promise<boolean> {
|
|
148
|
+
const config = create_status_check_config(
|
|
149
|
+
(is_updated) => !is_updated,
|
|
150
|
+
'Failed to check package.json version update',
|
|
151
|
+
(is_updated) => (is_updated ? 'Updated' : VERSION_NOT_UPDATED),
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
return await animation_helpers.execute_with_animation(
|
|
155
|
+
'Checking if package.json version is updated...',
|
|
156
|
+
async () => {
|
|
157
|
+
const diff_output: string = await git_command.diff_cached(PACKAGE_JSON_FILE)
|
|
158
|
+
|
|
159
|
+
return is_version_updated_in_diff(diff_output)
|
|
160
|
+
},
|
|
161
|
+
config,
|
|
162
|
+
)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async function check_branch_version(): Promise<boolean> {
|
|
166
|
+
const config = create_status_check_config(
|
|
167
|
+
(is_updated) => !is_updated,
|
|
168
|
+
'Failed to check branch version update',
|
|
169
|
+
(is_updated) => (is_updated ? 'Already updated' : VERSION_NOT_UPDATED),
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
return await animation_helpers.execute_with_animation(
|
|
173
|
+
'Checking if version is already updated on this branch...',
|
|
174
|
+
async () => {
|
|
175
|
+
const diff_output: string = await git_command.diff_main(PACKAGE_JSON_FILE)
|
|
176
|
+
|
|
177
|
+
return is_version_updated_in_diff(diff_output)
|
|
178
|
+
},
|
|
179
|
+
config,
|
|
180
|
+
)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function list_untracked_files(status_output: string): Array<string> {
|
|
184
|
+
return parse_status_lines(status_output)
|
|
185
|
+
.filter((line) => is_untracked_file(line))
|
|
186
|
+
.map((line) => extract_filename(line))
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const git_status = {
|
|
190
|
+
check_unstaged,
|
|
191
|
+
check_all_staged,
|
|
192
|
+
check_package_json_staged,
|
|
193
|
+
check_package_json_version,
|
|
194
|
+
check_branch_version,
|
|
195
|
+
list_untracked_files,
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export { git_status }
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { PORCELAIN_FLAG } from './constants'
|
|
2
|
+
import { ls_remote_branch_arguments } from './git-ls-remote'
|
|
3
|
+
import { git_spawn } from './git-spawn'
|
|
4
|
+
|
|
5
|
+
// The four worktree reads and writes a lane's lifecycle needs, plus the branch deletion that ends it
|
|
6
|
+
// (joshuafolkken/kit#1490; split out of `git-command.ts` under joshuafolkken/kit#1640). They live
|
|
7
|
+
// beside the other git commands rather than in `scripts/lane/` because `git_spawn.read` is what
|
|
8
|
+
// resolves the git binary and turns a non-zero exit into an error — a second spawn helper next to it
|
|
9
|
+
// would be the clone `CLAUDE.md` prohibits, so this module imports the shared one.
|
|
10
|
+
//
|
|
11
|
+
// **`ls_remote_branch` is here for the same reason, though it registers no work tree**: it is the
|
|
12
|
+
// asynchronous `git ls-remote` spawn, and a second spawn helper beside it would be that same clone.
|
|
13
|
+
// **It is not the only one in this package** — `propagate_git.has_remote_branch` runs the same query
|
|
14
|
+
// synchronously against a consumer's path, and the two share their arguments through
|
|
15
|
+
// `git-ls-remote.ts` rather than the spawn (joshuafolkken/kit#1732). Its sole
|
|
16
|
+
// caller is now `git-remote-branch.ts`, which turns the raw output into the three-way answer
|
|
17
|
+
// (`absent` / `present` / `unreachable`) that `lane-start-point.ts` and `release-publish.ts` both act
|
|
18
|
+
// on — so this module stops at "what git printed" and the meaning of it is decided there
|
|
19
|
+
// (joshuafolkken/kit#1641; before it, `lane-start-point.ts` was the only reader and did both).
|
|
20
|
+
const WORKTREE = 'worktree'
|
|
21
|
+
|
|
22
|
+
// Every registered work tree of this repository, in git's own machine-readable form: one `worktree
|
|
23
|
+
// <path>` / `HEAD <sha>` / `branch <ref>` block per tree, blocks separated by a blank line. Parsing
|
|
24
|
+
// it is the caller's, so this module keeps one shape for every reader.
|
|
25
|
+
async function worktree_list(): Promise<string> {
|
|
26
|
+
return await git_spawn.read([WORKTREE, 'list', PORCELAIN_FLAG])
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// `-b` creates the branch as part of the add, so there is no window in which the directory exists on
|
|
30
|
+
// a detached HEAD; `start_point` is passed explicitly rather than left to `HEAD`, because a lane is
|
|
31
|
+
// branched from the default branch whatever the checkout that opened it happens to be sitting on.
|
|
32
|
+
//
|
|
33
|
+
// **`--no-track` is load-bearing now that the start point is a remote-tracking ref**
|
|
34
|
+
// (joshuafolkken/kit#1535). Branching from `refs/remotes/origin/<default>` makes git's default
|
|
35
|
+
// `branch.autoSetupMerge` set `branch.<lane>.merge=refs/heads/<default>`, and a bare `git push` from
|
|
36
|
+
// the lane then fails with "the upstream branch of your current branch does not match the name of
|
|
37
|
+
// your current branch" — which is *not* the missing-upstream error `push()` retries as
|
|
38
|
+
// `--set-upstream`, so every lane's `pnpm josh git` would stop there. Measured against git 2.x.
|
|
39
|
+
//
|
|
40
|
+
// **An absent `start_point` attaches the tree to the branch that is already there, and neither flag
|
|
41
|
+
// is passed then** (joshuafolkken/kit#1627). `-b` refuses a branch that exists, so a lane whose child
|
|
42
|
+
// had already pushed could not be reopened at all; deleting the branch first to get `-b` back would
|
|
43
|
+
// discard those commits and orphan the pull request. `--no-track` cannot ride along either — git
|
|
44
|
+
// answers `--[no-]track can only be used if a new branch is created` — and it has nothing to do here:
|
|
45
|
+
// whatever upstream the branch was given when it was created is still on it.
|
|
46
|
+
async function worktree_add(
|
|
47
|
+
directory: string,
|
|
48
|
+
branch_name: string,
|
|
49
|
+
start_point: string | undefined,
|
|
50
|
+
): Promise<string> {
|
|
51
|
+
const flags = start_point === undefined ? ['add'] : ['add', '--no-track', '-b', branch_name]
|
|
52
|
+
|
|
53
|
+
return await git_spawn.read([WORKTREE, ...flags, directory, start_point ?? branch_name])
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// A throwaway tree at one commit, on no branch — `josh test:red` checks the merge-base out here, so
|
|
57
|
+
// the pre-fix tree is built without creating a branch or touching the caller's tree and index
|
|
58
|
+
// (joshuafolkken/kit#2448).
|
|
59
|
+
async function worktree_add_detached(directory: string, commit: string): Promise<string> {
|
|
60
|
+
return await git_spawn.read([WORKTREE, 'add', '--detach', directory, commit])
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// **`--force` is the point, not a convenience.** A lane is closed after a park, a failure or an
|
|
64
|
+
// interruption as readily as after a success, and in each of those the tree still holds uncommitted
|
|
65
|
+
// or untracked work. Refusing to remove it there would leave exactly the debris the close exists to
|
|
66
|
+
// prevent.
|
|
67
|
+
async function worktree_remove(directory: string): Promise<string> {
|
|
68
|
+
return await git_spawn.read([WORKTREE, 'remove', '--force', directory])
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Drops the registrations whose directories are already gone — what makes a lane whose directory was
|
|
72
|
+
// deleted by hand recoverable rather than a permanent `worktree add` refusal on that path.
|
|
73
|
+
async function worktree_prune(): Promise<string> {
|
|
74
|
+
return await git_spawn.read([WORKTREE, 'prune'])
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// **Asked of the remote itself, because nothing prunes the remote-tracking refs**
|
|
78
|
+
// (joshuafolkken/kit#1627). `lane:close` deletes the local branch, GitHub deletes the remote one at
|
|
79
|
+
// the merge, and `refs/remotes/origin/<N>-lane` outlives both: this repository carried sixteen of
|
|
80
|
+
// them for branches the remote no longer had. Empty output on a zero exit is therefore "not on the
|
|
81
|
+
// remote", which a stale ref cannot say, and a non-zero exit is "could not ask" — a different answer
|
|
82
|
+
// again, and the reason the caller cannot use `fetch` for this: `fetch` fails identically for a
|
|
83
|
+
// branch that is gone and for a network that is down, and prunes neither (measured on git 2.x).
|
|
84
|
+
//
|
|
85
|
+
// **The arguments come from `git-ls-remote.ts`, which is the single source of the full ref path**
|
|
86
|
+
// (joshuafolkken/kit#1709 for the anchoring, joshuafolkken/kit#1732 for the sharing). What broke
|
|
87
|
+
// here was the truthfulness of the message rather than the safety of the answer: `lane:open` was
|
|
88
|
+
// told origin has the lane branch and then stopped naming a branch nobody could find there, and the
|
|
89
|
+
// release guard refused a name that was free.
|
|
90
|
+
async function ls_remote_branch(branch_name: string): Promise<string> {
|
|
91
|
+
return await git_spawn.read(ls_remote_branch_arguments(branch_name))
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// `-D` rather than `-d`: a lane branch is deleted whatever state its work reached, and `-d` refuses
|
|
95
|
+
// one that was never merged — which is every lane closed after a park or a failure.
|
|
96
|
+
async function branch_delete(branch_name: string): Promise<string> {
|
|
97
|
+
return await git_spawn.read(['branch', '-D', branch_name])
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const git_worktree = {
|
|
101
|
+
branch_delete,
|
|
102
|
+
ls_remote_branch,
|
|
103
|
+
worktree_add,
|
|
104
|
+
worktree_add_detached,
|
|
105
|
+
worktree_list,
|
|
106
|
+
worktree_prune,
|
|
107
|
+
worktree_remove,
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export { git_worktree }
|