@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,224 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { git_location_environment } from '#scripts/git/git-location-environment'
|
|
4
|
+
import { ls_remote_branch_arguments } from '#scripts/git/git-ls-remote'
|
|
5
|
+
import { execaSync } from 'execa'
|
|
6
|
+
|
|
7
|
+
// The git probes propagation needs before it writes anything into a working tree.
|
|
8
|
+
//
|
|
9
|
+
// Propagation commits and pushes. A consumer with uncommitted work would have that work swept into
|
|
10
|
+
// the upgrade commit — `josh git` stages the whole tree — and a supplier repository that is behind
|
|
11
|
+
// its remote would propagate the *previous* release, which is already published and would report
|
|
12
|
+
// success (joshuafolkken/kit#863).
|
|
13
|
+
|
|
14
|
+
const GIT_TIMEOUT_MS = 10_000
|
|
15
|
+
// The probes that talk to the remote get their own budget. Ten seconds is generous for a local
|
|
16
|
+
// `rev-parse` and tight for an ssh handshake, and a probe that times out answers "no" — which for
|
|
17
|
+
// the two below would report a push that never reached origin as a push nobody attempted.
|
|
18
|
+
const REMOTE_TIMEOUT_MS = 60_000
|
|
19
|
+
const SUCCESS_EXIT_CODE = 0
|
|
20
|
+
const DEFAULT_BRANCH_REF = 'refs/remotes/origin/HEAD'
|
|
21
|
+
const FALLBACK_DEFAULT_BRANCH = 'main'
|
|
22
|
+
const ORIGIN_PREFIX = 'refs/remotes/origin/'
|
|
23
|
+
const PRE_PUSH_HOOK = 'pre-push'
|
|
24
|
+
|
|
25
|
+
// What a repository has to be for propagation to write into it, or the reason it is not.
|
|
26
|
+
interface TreeState {
|
|
27
|
+
is_ready: boolean
|
|
28
|
+
reason?: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// **`cwd` alone does not say which repository this is about** (joshuafolkken/kit#1515). `GIT_DIR` and
|
|
32
|
+
// `GIT_WORK_TREE` beat it outright, and git exports both to every hook it runs — so under
|
|
33
|
+
// `pnpm josh git`'s pre-push hook every probe below silently answered about the checkout the hook was
|
|
34
|
+
// firing in rather than the path it was handed. The visible cost was in the unit suite, where
|
|
35
|
+
// `propagate-guard.test.ts` builds directories that are deliberately *not* repositories and expects
|
|
36
|
+
// the tree check to refuse them: with `GIT_DIR` inherited they resolved to the real checkout instead,
|
|
37
|
+
// `current_branch` succeeded, and `is_up_to_date` went out to `origin` for real — two live fetches, 4
|
|
38
|
+
// seconds each against a 10-second test timeout, on the one code path that only ever runs inside a
|
|
39
|
+
// hook. That is the intermittent `propagate-guard` failure listed on the issue, and it is why it never
|
|
40
|
+
// reproduced outside a push.
|
|
41
|
+
//
|
|
42
|
+
// Clearing them is what makes `cwd` mean what it says. `-C` would work as well and is not used here,
|
|
43
|
+
// because every call below already passes the path this way and a second spelling of the same intent
|
|
44
|
+
// is one more thing to keep in step.
|
|
45
|
+
//
|
|
46
|
+
// **The list itself moved to `#scripts/git/git-location-environment`** when joshuafolkken/kit#1530
|
|
47
|
+
// found the same defect in a second file: three consumers now clear the same names, and a list kept
|
|
48
|
+
// in one of them is a list the other two drift away from. It widened there past `GIT_DIR` /
|
|
49
|
+
// `GIT_WORK_TREE` to the index and object-store variables, which redirect a *write* rather than a
|
|
50
|
+
// lookup — inert for the read-only probes below, and required by the fixture that commits.
|
|
51
|
+
|
|
52
|
+
function run_git(
|
|
53
|
+
repository_path: string,
|
|
54
|
+
args: ReadonlyArray<string>,
|
|
55
|
+
timeout_ms: number = GIT_TIMEOUT_MS,
|
|
56
|
+
): string | undefined {
|
|
57
|
+
const result = execaSync('git', args, {
|
|
58
|
+
cwd: repository_path,
|
|
59
|
+
reject: false,
|
|
60
|
+
timeout: timeout_ms,
|
|
61
|
+
env: { LC_ALL: 'C', LANGUAGE: 'C', ...git_location_environment.location_free_environment() },
|
|
62
|
+
extendEnv: true,
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
return result.exitCode === SUCCESS_EXIT_CODE ? result.stdout.trim() : undefined
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// The repository's default branch, from the remote's own HEAD. Falls back to `main` when the ref is
|
|
69
|
+
// missing, which is the case in a fresh clone that never ran `git remote set-head`.
|
|
70
|
+
function default_branch(repository_path: string): string {
|
|
71
|
+
const reference = run_git(repository_path, ['symbolic-ref', DEFAULT_BRANCH_REF])
|
|
72
|
+
if (reference?.startsWith(ORIGIN_PREFIX) !== true) return FALLBACK_DEFAULT_BRANCH
|
|
73
|
+
|
|
74
|
+
return reference.slice(ORIGIN_PREFIX.length)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function current_branch(repository_path: string): string | undefined {
|
|
78
|
+
return run_git(repository_path, ['rev-parse', '--abbrev-ref', 'HEAD'])
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Whether the working tree has no changes at all — tracked or untracked. Untracked files count
|
|
82
|
+
// because `josh git` stages them too, so leaving them out would let a consumer's scratch files ride
|
|
83
|
+
// into the pull request.
|
|
84
|
+
function is_clean(repository_path: string): boolean {
|
|
85
|
+
return run_git(repository_path, ['status', '--porcelain']) === ''
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Refresh the remote-tracking ref. Without this the comparison below is between two pre-merge refs
|
|
89
|
+
// and passes in exactly the situation the check exists for: the seconds after a pull request merged
|
|
90
|
+
// on GitHub, when the local checkout has not seen the merge commit yet.
|
|
91
|
+
function fetch_branch(repository_path: string, branch: string): void {
|
|
92
|
+
run_git(repository_path, ['fetch', '--quiet', 'origin', branch])
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Whether the branch's tip matches its remote. Fetched first, and an unknown answer reads as *not*
|
|
96
|
+
// up to date: a repository whose remote ref cannot be resolved is one this command should not start
|
|
97
|
+
// committing in, and passing on the unknown is what let a stale checkout
|
|
98
|
+
// propagate the previous release.
|
|
99
|
+
function is_up_to_date(repository_path: string, branch: string): boolean {
|
|
100
|
+
fetch_branch(repository_path, branch)
|
|
101
|
+
const local = run_git(repository_path, ['rev-parse', branch])
|
|
102
|
+
const remote = run_git(repository_path, ['rev-parse', `origin/${branch}`])
|
|
103
|
+
if (local === undefined || remote === undefined) return false
|
|
104
|
+
|
|
105
|
+
return local === remote
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// The commit a feature branch carries beyond the default branch, or nothing when it carries none.
|
|
109
|
+
// A branch that was created but never committed to still sits on the default branch's own tip, and
|
|
110
|
+
// reading that tip as a commit would report a refused push for a push nobody attempted.
|
|
111
|
+
function commit_ahead(repository_path: string, default_name: string): string | undefined {
|
|
112
|
+
const head = run_git(repository_path, ['rev-parse', 'HEAD'])
|
|
113
|
+
const base = run_git(repository_path, ['rev-parse', default_name])
|
|
114
|
+
|
|
115
|
+
if (head === undefined || head === base) return undefined
|
|
116
|
+
|
|
117
|
+
return run_git(repository_path, ['rev-parse', '--short', 'HEAD'])
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Whether origin already carries the branch. Asked of the remote itself rather than of a
|
|
121
|
+
// remote-tracking ref: a push that was refused leaves no such ref behind, and neither does a branch
|
|
122
|
+
// that was never pushed at all, so the ref cannot tell the two apart.
|
|
123
|
+
//
|
|
124
|
+
// **The arguments come from `git-ls-remote.ts`, which anchors the pattern at `refs/heads/`**
|
|
125
|
+
// (joshuafolkken/kit#1732). Built here from the bare name, the query answered for any branch whose
|
|
126
|
+
// ref ends in it — so a lane pushed as `wip/1641-lane` reported `1641-lane` as already on origin,
|
|
127
|
+
// and propagation classified an unpushed branch as pushed.
|
|
128
|
+
function has_remote_branch(repository_path: string, branch: string): boolean {
|
|
129
|
+
const heads = run_git(repository_path, ls_remote_branch_arguments(branch), REMOTE_TIMEOUT_MS)
|
|
130
|
+
|
|
131
|
+
return heads !== undefined && heads !== ''
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Whether the consumer has a pre-push hook at all, honouring `core.hooksPath` — which `rev-parse
|
|
135
|
+
// --git-path` does not. Without this the classification would name a hook on the strength of a dry
|
|
136
|
+
// run alone, and **any** push failure that has cleared by the time the probe runs satisfies that: a
|
|
137
|
+
// dropped ssh connection, a refreshed token, one 500 from GitHub. Naming a hook that does not exist
|
|
138
|
+
// is the same misattribution joshuafolkken/kit#1417 was filed for, pointed the other way.
|
|
139
|
+
function hooks_directory(repository_path: string): string | undefined {
|
|
140
|
+
const configured = run_git(repository_path, ['config', '--get', 'core.hooksPath'])
|
|
141
|
+
if (configured !== undefined && configured !== '') return configured
|
|
142
|
+
|
|
143
|
+
return run_git(repository_path, ['rev-parse', '--git-path', 'hooks'])
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function has_pre_push_hook(repository_path: string): boolean {
|
|
147
|
+
const directory = hooks_directory(repository_path)
|
|
148
|
+
if (directory === undefined || directory === '') return false
|
|
149
|
+
|
|
150
|
+
return existsSync(path.resolve(repository_path, directory, PRE_PUSH_HOOK))
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Whether the push would go through with the consumer's own hooks out of the way. Asked *after* a
|
|
154
|
+
// real push has failed, this is what separates a pre-push hook's refusal from a transport failure:
|
|
155
|
+
// both leave the commit local and origin without the branch, and only this says which of the two
|
|
156
|
+
// happened. `--dry-run` writes nothing, so asking costs a round trip and no more — and `--no-verify`
|
|
157
|
+
// is scoped to this probe, which never pushes anything: the consumer's gate stays exactly as strong
|
|
158
|
+
// as it was, and a push it refused stays refused.
|
|
159
|
+
function can_push_without_hooks(repository_path: string, branch: string): boolean {
|
|
160
|
+
const args = ['push', '--dry-run', '--no-verify', 'origin', branch]
|
|
161
|
+
|
|
162
|
+
return run_git(repository_path, args, REMOTE_TIMEOUT_MS) !== undefined
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Decide from already-gathered facts, so the decision is testable without a repository.
|
|
166
|
+
function decide_tree_state(
|
|
167
|
+
branch: string,
|
|
168
|
+
default_name: string,
|
|
169
|
+
is_tree_clean: boolean,
|
|
170
|
+
is_current: boolean,
|
|
171
|
+
): TreeState {
|
|
172
|
+
if (!is_tree_clean) return { is_ready: false, reason: 'working tree has uncommitted changes' }
|
|
173
|
+
|
|
174
|
+
if (branch !== default_name) {
|
|
175
|
+
return { is_ready: false, reason: `on branch ${branch}, not ${default_name}` }
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return is_current
|
|
179
|
+
? { is_ready: true }
|
|
180
|
+
: { is_ready: false, reason: `${branch} is not up to date` }
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Whether a repository is safe to propagate into (or from). Everything unknown reads as not ready:
|
|
184
|
+
// a repository git could not describe is not one to start committing in.
|
|
185
|
+
function tree_state(repository_path: string): TreeState {
|
|
186
|
+
const branch = current_branch(repository_path)
|
|
187
|
+
if (branch === undefined) return { is_ready: false, reason: 'not a readable git repository' }
|
|
188
|
+
const default_name = default_branch(repository_path)
|
|
189
|
+
|
|
190
|
+
return decide_tree_state(
|
|
191
|
+
branch,
|
|
192
|
+
default_name,
|
|
193
|
+
is_clean(repository_path),
|
|
194
|
+
is_up_to_date(repository_path, branch),
|
|
195
|
+
)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Return a checkout to its default branch and pull. Run after a consumer's pull request is opened:
|
|
199
|
+
// `josh git` leaves the checkout on the feature branch, and the next propagation's pre-check would
|
|
200
|
+
// refuse it for exactly that — so the consumer would silently stop receiving releases.
|
|
201
|
+
function return_to_default_branch(repository_path: string): boolean {
|
|
202
|
+
const branch = default_branch(repository_path)
|
|
203
|
+
if (run_git(repository_path, ['checkout', branch]) === undefined) return false
|
|
204
|
+
|
|
205
|
+
return run_git(repository_path, ['pull', '--ff-only', 'origin', branch]) !== undefined
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const propagate_git = {
|
|
209
|
+
default_branch,
|
|
210
|
+
fetch_branch,
|
|
211
|
+
return_to_default_branch,
|
|
212
|
+
current_branch,
|
|
213
|
+
commit_ahead,
|
|
214
|
+
has_remote_branch,
|
|
215
|
+
has_pre_push_hook,
|
|
216
|
+
can_push_without_hooks,
|
|
217
|
+
is_clean,
|
|
218
|
+
is_up_to_date,
|
|
219
|
+
decide_tree_state,
|
|
220
|
+
tree_state,
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export type { TreeState }
|
|
224
|
+
export { propagate_git }
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { git_gh_exec } from '#scripts/git/git-gh-exec'
|
|
2
|
+
import { poll } from '#scripts/lib/poll'
|
|
3
|
+
import { with_page_size } from '#scripts/version/version-remote'
|
|
4
|
+
import { execaSync } from 'execa'
|
|
5
|
+
|
|
6
|
+
// Waiting for a specific version of this package to actually exist in the registry.
|
|
7
|
+
//
|
|
8
|
+
// A merge is not a publish: kit's auto-tag and publish workflows run after the merge commit lands,
|
|
9
|
+
// so a consumer told to upgrade the instant the PR merged resolves the previous release. The wait is
|
|
10
|
+
// implemented once here because joshuafolkken/kit#864 resolves a cross-repository child on the same
|
|
11
|
+
// condition — two implementations would drift, and the looser one would decide
|
|
12
|
+
// (joshuafolkken/kit#863).
|
|
13
|
+
|
|
14
|
+
const VERSIONS_PAGE_SIZE = 100
|
|
15
|
+
const NAMES_JQ = '[.[] | .name]'
|
|
16
|
+
const DEFAULT_TIMEOUT_MS = 600_000
|
|
17
|
+
const DEFAULT_INTERVAL_MS = 15_000
|
|
18
|
+
const GH_TIMEOUT_MS = 20_000
|
|
19
|
+
// How many probes in a row may fail before the registry is called unreadable. One failure is a rate
|
|
20
|
+
// limit, a 5xx or a DNS hiccup — ending a ten-minute wait seconds in, on the first of those, is the
|
|
21
|
+
// opposite of waiting. Only a registry that fails this many times running is a broken one.
|
|
22
|
+
const UNREADABLE_THRESHOLD = 3
|
|
23
|
+
|
|
24
|
+
// How a wait ended. `timed_out` is deliberately distinct from `published`: a publish workflow that
|
|
25
|
+
// failed never produces the version, and reporting that as anything other than an anomaly would let
|
|
26
|
+
// propagation continue against a release that does not exist.
|
|
27
|
+
type PublishWaitState = 'published' | 'timed_out' | 'unreadable'
|
|
28
|
+
|
|
29
|
+
interface PublishWaitResult {
|
|
30
|
+
state: PublishWaitState
|
|
31
|
+
version: string
|
|
32
|
+
attempts: number
|
|
33
|
+
detail?: string
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Whether the target version is among the versions the registry reports. Exact membership, never
|
|
37
|
+
// "something newer exists": a consumer several releases behind would otherwise be satisfied by any
|
|
38
|
+
// publish at all, including one that predates the change being propagated.
|
|
39
|
+
function is_version_published(
|
|
40
|
+
published_versions: ReadonlyArray<string>,
|
|
41
|
+
target_version: string,
|
|
42
|
+
): boolean {
|
|
43
|
+
return published_versions.includes(target_version)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Whether the wait should keep going. Split out so the loop below stays a loop over a decision
|
|
47
|
+
// rather than a decision spread across a loop.
|
|
48
|
+
function should_keep_waiting(now_ms: number, deadline_ms: number): boolean {
|
|
49
|
+
return now_ms < deadline_ms
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function finish(state: PublishWaitState, version: string, attempts: number): PublishWaitResult {
|
|
53
|
+
return { state, version, attempts }
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// The versions the registry reports for this package, or nothing when it could not be read. An
|
|
57
|
+
// unreadable registry is never treated as "not published yet" past the timeout — the two are
|
|
58
|
+
// reported apart, because one means wait longer and the other means something is broken.
|
|
59
|
+
function fetch_published_versions(versions_endpoint: string): Array<string> | undefined {
|
|
60
|
+
const endpoint = with_page_size(versions_endpoint, VERSIONS_PAGE_SIZE)
|
|
61
|
+
const result = execaSync('gh', ['api', endpoint, '--jq', NAMES_JQ], {
|
|
62
|
+
...git_gh_exec.direct_environment(),
|
|
63
|
+
reject: false,
|
|
64
|
+
timeout: GH_TIMEOUT_MS,
|
|
65
|
+
})
|
|
66
|
+
if (result.exitCode !== 0) return undefined
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
const parsed: unknown = JSON.parse(result.stdout)
|
|
70
|
+
|
|
71
|
+
return Array.isArray(parsed) ? parsed.filter((name) => typeof name === 'string') : undefined
|
|
72
|
+
} catch {
|
|
73
|
+
return undefined
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The knobs the wait exposes. Every one of them is injectable so the unit suite can drive the loop
|
|
78
|
+
// without a registry, a clock, or a real delay.
|
|
79
|
+
interface WaitOptions {
|
|
80
|
+
timeout_ms?: number
|
|
81
|
+
interval_ms?: number
|
|
82
|
+
fetch_versions?: (endpoint: string) => Array<string> | undefined
|
|
83
|
+
sleep?: (milliseconds: number) => Promise<void>
|
|
84
|
+
now?: () => number
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
interface ResolvedWait {
|
|
88
|
+
timeout_ms: number
|
|
89
|
+
interval_ms: number
|
|
90
|
+
fetch_versions: (endpoint: string) => Array<string> | undefined
|
|
91
|
+
sleep: (milliseconds: number) => Promise<void>
|
|
92
|
+
now: () => number
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const WAIT_DEFAULTS: ResolvedWait = {
|
|
96
|
+
timeout_ms: DEFAULT_TIMEOUT_MS,
|
|
97
|
+
interval_ms: DEFAULT_INTERVAL_MS,
|
|
98
|
+
fetch_versions: fetch_published_versions,
|
|
99
|
+
sleep: poll.sleep,
|
|
100
|
+
now: Date.now,
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Spread rather than a chain of `??`, so adding a knob does not add a branch to a function the
|
|
104
|
+
// complexity limit already caps.
|
|
105
|
+
function resolve_wait_options(options: WaitOptions): ResolvedWait {
|
|
106
|
+
return { ...WAIT_DEFAULTS, ...options }
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// The outcome of one probe: found, still waiting, or the registry has now failed often enough in a
|
|
110
|
+
// row to call it unreadable.
|
|
111
|
+
function probe_state(
|
|
112
|
+
versions: ReadonlyArray<string> | undefined,
|
|
113
|
+
target_version: string,
|
|
114
|
+
consecutive_failures: number,
|
|
115
|
+
): PublishWaitState | undefined {
|
|
116
|
+
if (versions === undefined) {
|
|
117
|
+
return consecutive_failures >= UNREADABLE_THRESHOLD ? 'unreadable' : undefined
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return is_version_published(versions, target_version) ? 'published' : undefined
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Poll until the target version exists, the timeout elapses, or the registry proves unreadable.
|
|
124
|
+
//
|
|
125
|
+
// A registry that keeps failing ends the wait rather than being retried to the timeout: `gh` failing
|
|
126
|
+
// is a different problem from a publish still running, and propagating on a guess is what must not
|
|
127
|
+
// happen. A single failure is not that — see `UNREADABLE_THRESHOLD`. Either way the caller reports
|
|
128
|
+
// it and touches no consumer.
|
|
129
|
+
// What the loop carries between probes: how many it has made, and how many failed in a row.
|
|
130
|
+
interface WaitProgress {
|
|
131
|
+
attempts: number
|
|
132
|
+
failures: number
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// One probe, advancing the progress it was given. Mutating it here rather than returning a new one
|
|
136
|
+
// keeps the loop above within its statement budget.
|
|
137
|
+
function probe_once(
|
|
138
|
+
resolved: ResolvedWait,
|
|
139
|
+
versions_endpoint: string,
|
|
140
|
+
target_version: string,
|
|
141
|
+
progress: WaitProgress,
|
|
142
|
+
): { state?: PublishWaitState } {
|
|
143
|
+
progress.attempts += 1
|
|
144
|
+
const versions = resolved.fetch_versions(versions_endpoint)
|
|
145
|
+
|
|
146
|
+
progress.failures = versions === undefined ? progress.failures + 1 : 0
|
|
147
|
+
const state = probe_state(versions, target_version, progress.failures)
|
|
148
|
+
|
|
149
|
+
return state === undefined ? {} : { state }
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
async function wait_for_publish(
|
|
153
|
+
versions_endpoint: string,
|
|
154
|
+
target_version: string,
|
|
155
|
+
options: WaitOptions = {},
|
|
156
|
+
): Promise<PublishWaitResult> {
|
|
157
|
+
const resolved = resolve_wait_options(options)
|
|
158
|
+
const deadline = resolved.now() + resolved.timeout_ms
|
|
159
|
+
const progress: WaitProgress = { attempts: 0, failures: 0 }
|
|
160
|
+
|
|
161
|
+
while (should_keep_waiting(resolved.now(), deadline)) {
|
|
162
|
+
const { state } = probe_once(resolved, versions_endpoint, target_version, progress)
|
|
163
|
+
|
|
164
|
+
if (state !== undefined) return finish(state, target_version, progress.attempts)
|
|
165
|
+
await resolved.sleep(resolved.interval_ms)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return finish('timed_out', target_version, progress.attempts)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const propagate_publish = {
|
|
172
|
+
DEFAULT_TIMEOUT_MS,
|
|
173
|
+
DEFAULT_INTERVAL_MS,
|
|
174
|
+
UNREADABLE_THRESHOLD,
|
|
175
|
+
is_version_published,
|
|
176
|
+
should_keep_waiting,
|
|
177
|
+
fetch_published_versions,
|
|
178
|
+
wait_for_publish,
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export { propagate_publish }
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { status_icons } from '#scripts/lib/status-icons'
|
|
2
|
+
import type { PropagateTarget } from './propagate-targets'
|
|
3
|
+
|
|
4
|
+
// Running the per-consumer sequence, and reporting what happened to every consumer.
|
|
5
|
+
//
|
|
6
|
+
// One consumer's failure never stops another: the whole point of the command is to leave the run
|
|
7
|
+
// knowing which consumers took the release and which did not, and a run that aborts on the first
|
|
8
|
+
// failure answers that for a prefix of them (joshuafolkken/kit#863).
|
|
9
|
+
|
|
10
|
+
// The steps, in order, that carry a release into one consumer. `josh` here is the consumer's own
|
|
11
|
+
// installed CLI, run from the consumer's directory — which is what keeps kit's self-sync guard
|
|
12
|
+
// (joshuafolkken/kit#868) out of the way: the sync runs in a consumer project, where it belongs.
|
|
13
|
+
const STEP_PRECHECK = 'working tree check'
|
|
14
|
+
const STEP_UPGRADE = 'josh vu'
|
|
15
|
+
const STEP_SYNC = 'josh sync'
|
|
16
|
+
const STEP_VERIFY = 'verification gate'
|
|
17
|
+
const STEP_ISSUE = 'open issue'
|
|
18
|
+
const STEP_PR = 'josh git'
|
|
19
|
+
const STEP_RETURN = 'return to default branch'
|
|
20
|
+
// The precheck is first for the reason it exists: everything after it writes. A consumer with
|
|
21
|
+
// uncommitted work must be refused before `josh vu` touches its lockfile, not after.
|
|
22
|
+
const STEP_ORDER: ReadonlyArray<string> = [
|
|
23
|
+
STEP_PRECHECK,
|
|
24
|
+
STEP_UPGRADE,
|
|
25
|
+
STEP_SYNC,
|
|
26
|
+
STEP_VERIFY,
|
|
27
|
+
STEP_ISSUE,
|
|
28
|
+
STEP_PR,
|
|
29
|
+
STEP_RETURN,
|
|
30
|
+
]
|
|
31
|
+
const PROPAGATED_REASON = 'opened a pull request'
|
|
32
|
+
|
|
33
|
+
type RunOutcome = 'propagated' | 'failed' | 'skipped'
|
|
34
|
+
|
|
35
|
+
interface StepResult {
|
|
36
|
+
step: string
|
|
37
|
+
is_ok: boolean
|
|
38
|
+
detail?: string
|
|
39
|
+
// Set when the step succeeded *and* there is nothing left to do — an upgrade that changed no
|
|
40
|
+
// file, for instance. The sequence ends here as a skip rather than opening an empty pull request.
|
|
41
|
+
is_complete?: boolean
|
|
42
|
+
// What this failure actually left in the consumer, as the failing step measured it. Only the
|
|
43
|
+
// steps that can probe set it; for the rest the standing note below is what they always leave
|
|
44
|
+
// (joshuafolkken/kit#1417).
|
|
45
|
+
leftover?: string
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface TargetResult {
|
|
49
|
+
repo: string
|
|
50
|
+
outcome: RunOutcome
|
|
51
|
+
reason: string
|
|
52
|
+
steps: ReadonlyArray<StepResult>
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// One step's execution, injected so the sequencing is testable without spawning anything.
|
|
56
|
+
type RunStep = (target: PropagateTarget, step: string) => StepResult
|
|
57
|
+
|
|
58
|
+
const SKIP_REASONS: Readonly<Record<string, string>> = {
|
|
59
|
+
up_to_date: 'already carries this release',
|
|
60
|
+
not_downstream: 'does not depend on this package',
|
|
61
|
+
missing_checkout: 'no local checkout at the mapped path — reported, not cloned',
|
|
62
|
+
unreadable: 'package.json could not be read',
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// The reason text for a candidate that is not going to be processed. A missing local checkout is
|
|
66
|
+
// reported rather than cloned: propagation writes to a working tree, and creating one nobody asked
|
|
67
|
+
// for is not a step this command may take on its own.
|
|
68
|
+
function skip_reason(target: PropagateTarget): string {
|
|
69
|
+
return SKIP_REASONS[target.state] ?? 'not eligible'
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const LEFTOVER_NOTE = 'upgrade/sync changes left uncommitted'
|
|
73
|
+
|
|
74
|
+
// Whether the failure happened after a step that writes into the consumer. The pre-check writes
|
|
75
|
+
// nothing, so a consumer refused there is untouched; everything later leaves changes behind, and a
|
|
76
|
+
// run that does not say so leaves a working tree the *next* run will silently refuse.
|
|
77
|
+
function has_leftover_changes(steps: ReadonlyArray<StepResult>): boolean {
|
|
78
|
+
return steps.some((result) => result.step === STEP_UPGRADE)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// What to say the failure left behind. A step that measured it wins; the note above stands in only
|
|
82
|
+
// where none did, which is every step before the commit — and there it is accurate, since nothing
|
|
83
|
+
// has committed yet. Before joshuafolkken/kit#1417 it was appended to *every* failure after the
|
|
84
|
+
// upgrade, including one whose commit had already been made, so a push refused by the consumer's
|
|
85
|
+
// pre-push hook was reported as changes that were never committed.
|
|
86
|
+
function leftover_of(result: StepResult, steps: ReadonlyArray<StepResult>): string | undefined {
|
|
87
|
+
if (!has_leftover_changes(steps)) return undefined
|
|
88
|
+
|
|
89
|
+
return result.leftover ?? LEFTOVER_NOTE
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function failure_reason(result: StepResult, steps: ReadonlyArray<StepResult>): string {
|
|
93
|
+
const base =
|
|
94
|
+
result.detail === undefined
|
|
95
|
+
? `${result.step} failed`
|
|
96
|
+
: `${result.step} failed: ${result.detail}`
|
|
97
|
+
const leftover = leftover_of(result, steps)
|
|
98
|
+
|
|
99
|
+
return leftover === undefined ? base : `${base} — ${leftover}`
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Run one consumer's sequence, stopping at its first failing step. Stopping is per consumer: a
|
|
103
|
+
// failed verification gate must not go on to open a pull request for that consumer, and must not
|
|
104
|
+
// affect any other.
|
|
105
|
+
// The result a step ends the sequence with, or nothing when the sequence continues.
|
|
106
|
+
function terminal_result(
|
|
107
|
+
repo: string,
|
|
108
|
+
result: StepResult,
|
|
109
|
+
steps: ReadonlyArray<StepResult>,
|
|
110
|
+
): TargetResult | undefined {
|
|
111
|
+
if (!result.is_ok) {
|
|
112
|
+
return { repo, outcome: 'failed', reason: failure_reason(result, steps), steps }
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (result.is_complete === true) {
|
|
116
|
+
return { repo, outcome: 'skipped', reason: result.detail ?? 'nothing to do', steps }
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return undefined
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function run_target(
|
|
123
|
+
target: PropagateTarget,
|
|
124
|
+
run_step: RunStep,
|
|
125
|
+
success_reason: string = PROPAGATED_REASON,
|
|
126
|
+
): TargetResult {
|
|
127
|
+
const steps: Array<StepResult> = []
|
|
128
|
+
|
|
129
|
+
for (const step of STEP_ORDER) {
|
|
130
|
+
const result = run_step(target, step)
|
|
131
|
+
|
|
132
|
+
steps.push(result)
|
|
133
|
+
const terminal = terminal_result(target.repo, result, steps)
|
|
134
|
+
|
|
135
|
+
if (terminal !== undefined) return terminal
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return { repo: target.repo, outcome: 'propagated', reason: success_reason, steps }
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Every candidate's result, in the order the map produced them. Candidates that are not ready are
|
|
142
|
+
// recorded as skips rather than dropped, so the report accounts for every repository considered.
|
|
143
|
+
function run_targets(
|
|
144
|
+
targets: ReadonlyArray<PropagateTarget>,
|
|
145
|
+
run_step: RunStep,
|
|
146
|
+
success_reason: string = PROPAGATED_REASON,
|
|
147
|
+
): Array<TargetResult> {
|
|
148
|
+
return targets.map((target) =>
|
|
149
|
+
target.state === 'ready'
|
|
150
|
+
? run_target(target, run_step, success_reason)
|
|
151
|
+
: { repo: target.repo, outcome: 'skipped' as const, reason: skip_reason(target), steps: [] },
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Whether the run as a whole failed. A skip is not a failure — a consumer that already carries the
|
|
156
|
+
// release, or never depended on the package, is a correct outcome.
|
|
157
|
+
function has_failure(results: ReadonlyArray<TargetResult>): boolean {
|
|
158
|
+
return results.some((result) => result.outcome === 'failed')
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const OUTCOME_ICONS: Readonly<Record<RunOutcome, string>> = {
|
|
162
|
+
propagated: '✓',
|
|
163
|
+
failed: status_icons.FAIL_ICON,
|
|
164
|
+
skipped: '–',
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function format_result(result: TargetResult): string {
|
|
168
|
+
return ` ${OUTCOME_ICONS[result.outcome]} ${result.repo} ${result.reason}`
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// The whole run, as one block. Printed together at the end rather than streamed, so the answer to
|
|
172
|
+
// "which consumers took this release" is in one place instead of interleaved with four commands'
|
|
173
|
+
// output per consumer.
|
|
174
|
+
function format_report(results: ReadonlyArray<TargetResult>): string {
|
|
175
|
+
if (results.length === 0) return 'No repositories were considered.'
|
|
176
|
+
|
|
177
|
+
return results.map((result) => format_result(result)).join('\n')
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const propagate_run = {
|
|
181
|
+
PROPAGATED_REASON,
|
|
182
|
+
LEFTOVER_NOTE,
|
|
183
|
+
has_leftover_changes,
|
|
184
|
+
leftover_of,
|
|
185
|
+
STEP_RETURN,
|
|
186
|
+
STEP_PRECHECK,
|
|
187
|
+
STEP_ISSUE,
|
|
188
|
+
STEP_UPGRADE,
|
|
189
|
+
STEP_SYNC,
|
|
190
|
+
STEP_VERIFY,
|
|
191
|
+
STEP_PR,
|
|
192
|
+
STEP_ORDER,
|
|
193
|
+
skip_reason,
|
|
194
|
+
run_target,
|
|
195
|
+
run_targets,
|
|
196
|
+
has_failure,
|
|
197
|
+
format_report,
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export type { RunStep, StepResult, TargetResult }
|
|
201
|
+
export { propagate_run }
|