@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,421 @@
|
|
|
1
|
+
import { git_gh_exec } from '#scripts/git/git-gh-exec'
|
|
2
|
+
import { git_gh_issue_write } from '#scripts/git/git-gh-issue-write'
|
|
3
|
+
import { GATE_COMMAND } from '#scripts/josh/josh-command-types'
|
|
4
|
+
import { build_upgrade_shell_command } from '#scripts/version/upgrade-shell-command'
|
|
5
|
+
import { create_version_command_config } from '#scripts/version/version-command-config'
|
|
6
|
+
import { execaSync } from 'execa'
|
|
7
|
+
import { propagate_git } from './propagate-git'
|
|
8
|
+
import { propagate_git_failure } from './propagate-git-failure'
|
|
9
|
+
import { propagate_run, type RunStep, type StepResult } from './propagate-run'
|
|
10
|
+
import type { PropagateTarget } from './propagate-targets'
|
|
11
|
+
|
|
12
|
+
// Executing one consumer's steps for real.
|
|
13
|
+
//
|
|
14
|
+
// Kept out of the command module because two of the steps are not plain spawns: the pre-check is a
|
|
15
|
+
// decision made from git probes, and the pull-request step needs the issue number the step before it
|
|
16
|
+
// created. A closure carries that number instead of module-level state, so a run is self-contained
|
|
17
|
+
// and the sequencing stays testable (joshuafolkken/kit#863).
|
|
18
|
+
|
|
19
|
+
const SUCCESS_EXIT_CODE = 0
|
|
20
|
+
// Long enough for a consumer's full unit suite and a `pnpm add`, short enough that a hung step ends
|
|
21
|
+
// the run instead of holding the whole propagation open.
|
|
22
|
+
const STEP_TIMEOUT_MS = 1_800_000
|
|
23
|
+
// The consumer-side gate. `josh gate` is the same command the AI documents require of a person
|
|
24
|
+
// (joshuafolkken/kit#914) — running the four checks concurrently and reporting every failure in one
|
|
25
|
+
// pass — so the chain is not repeated here. It resolves in the consumer's directory, which by this
|
|
26
|
+
// point has already been upgraded to the version being propagated, so the command is present.
|
|
27
|
+
const VERIFY_SCRIPT = `pnpm josh ${GATE_COMMAND}`
|
|
28
|
+
|
|
29
|
+
// The commands the release-independent spawning steps run inside the target's own directory. The
|
|
30
|
+
// upgrade and the sync are not here: both are per toolkit, so they are built from the plan instead.
|
|
31
|
+
const STEP_COMMANDS: Readonly<Record<string, ReadonlyArray<string>>> = {
|
|
32
|
+
[propagate_run.STEP_VERIFY]: ['sh', '-c', VERIFY_SCRIPT],
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// kit's own CLI name. The sync is spelled through the *toolkit's* bin rather than hardcoded, because
|
|
36
|
+
// `@joshuafolkken/app-kit` syncs with `josh-app` and `@joshuafolkken/game-kit` with `josh-game`; a
|
|
37
|
+
// run that synced only `josh` would leave the other toolkit's managed files behind
|
|
38
|
+
// (joshuafolkken/kit#1085).
|
|
39
|
+
const JOSH_BIN = 'josh'
|
|
40
|
+
|
|
41
|
+
// `pnpm <bin>` resolves the target's own installed CLI, never this checkout — which is what keeps
|
|
42
|
+
// the sync a consumer-side sync and leaves kit's self-sync guard (joshuafolkken/kit#868) satisfied.
|
|
43
|
+
function sync_command(bin_name: string): ReadonlyArray<string> {
|
|
44
|
+
return ['pnpm', bin_name, 'sync']
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// The upgrade installs the version the plan names. For `josh propagate` that is the **exact**
|
|
48
|
+
// version that was waited for, not the registry's latest — `josh version:upgrade` resolves latest,
|
|
49
|
+
// which would defeat the exact-version wait: a release published while the run was in flight would
|
|
50
|
+
// be the one every consumer received. `josh adopt` names `latest` deliberately, because it is pulling
|
|
51
|
+
// whatever is newest inward rather than carrying one known release outward. Built through kit's own
|
|
52
|
+
// upgrade-command builder either way, so the lockfile repair it chains stays single-sourced.
|
|
53
|
+
function upgrade_command(package_name: string, version: string): ReadonlyArray<string> {
|
|
54
|
+
const config = create_version_command_config({ package_name })
|
|
55
|
+
|
|
56
|
+
return ['sh', '-c', build_upgrade_shell_command(version, true, config)]
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const PROPAGATE_ORIGIN =
|
|
60
|
+
'Opened by `josh propagate` from the supplier repository after the release was published.'
|
|
61
|
+
const RUN_NOTE =
|
|
62
|
+
'The upgrade, the managed-file sync and the verification gate have already run here.'
|
|
63
|
+
const EMPTY_PLAN_TITLE = 'Upgrade the installed toolkits'
|
|
64
|
+
const LAST_SEPARATOR = ' and '
|
|
65
|
+
const NAME_SEPARATOR = ', '
|
|
66
|
+
|
|
67
|
+
function issue_title(package_name: string, version: string): string {
|
|
68
|
+
return `Upgrade ${package_name} to ${version}`
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The packages a plan names, as English prose: one name alone, two joined by "and", more as a list
|
|
72
|
+
// with "and" before the last. `josh git` derives the branch name from this title, so it stays one
|
|
73
|
+
// plain line whatever the count.
|
|
74
|
+
function release_names(releases: ReadonlyArray<Release>): string {
|
|
75
|
+
const names = releases.map((release) => release.package_name)
|
|
76
|
+
const last = names.at(-1) ?? ''
|
|
77
|
+
if (names.length <= 1) return last
|
|
78
|
+
|
|
79
|
+
return `${names.slice(0, -1).join(NAME_SEPARATOR)}${LAST_SEPARATOR}${last}`
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// One release reproduces `issue_title` exactly, which is what keeps a `propagate` run's issue title
|
|
83
|
+
// unchanged by the generalization.
|
|
84
|
+
function plan_title(releases: ReadonlyArray<Release>): string {
|
|
85
|
+
const [first] = releases
|
|
86
|
+
if (first === undefined) return EMPTY_PLAN_TITLE
|
|
87
|
+
|
|
88
|
+
return issue_title(release_names(releases), first.version)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function plan_body(plan: ReleasePlan): string {
|
|
92
|
+
const specs = plan.releases
|
|
93
|
+
.map((release) => `\`${release.package_name}@${release.version}\``)
|
|
94
|
+
.join(NAME_SEPARATOR)
|
|
95
|
+
|
|
96
|
+
return [`Carry ${specs} into this repository.`, '', plan.origin, RUN_NOTE].join('\n')
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function issue_body(package_name: string, version: string): string {
|
|
100
|
+
return plan_body({
|
|
101
|
+
releases: [{ package_name, version, bin_name: JOSH_BIN }],
|
|
102
|
+
origin: PROPAGATE_ORIGIN,
|
|
103
|
+
})
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// A step's result together with what the step printed, one entry per stream.
|
|
107
|
+
interface SpawnOutcome {
|
|
108
|
+
result: StepResult
|
|
109
|
+
streams: ReadonlyArray<string>
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const NO_COMMAND = 'no command defined'
|
|
113
|
+
|
|
114
|
+
// One captured stream, as a string whatever happened. **This is not defensive padding, and the type
|
|
115
|
+
// it accepts is wider than execa's on purpose**: a command that fails to *spawn* at all — a consumer
|
|
116
|
+
// whose `pnpm` is not on the path, or a checkout directory that is gone — reports no streams, and
|
|
117
|
+
// both fields come back `undefined` against a declared type of `string`. Passed on as they are, the
|
|
118
|
+
// tail would throw on its first `replaceAll`, and nothing between here and the report catches it:
|
|
119
|
+
// the throw escapes the whole run, so every consumer after this one goes unattempted and the
|
|
120
|
+
// end-of-run block is never printed — "one consumer's failure never stops another", lost to a crash.
|
|
121
|
+
function captured(text: string | undefined): string {
|
|
122
|
+
return text ?? ''
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function step_result(step: string, exit_code: number | undefined): StepResult {
|
|
126
|
+
if (exit_code === SUCCESS_EXIT_CODE) return { step, is_ok: true }
|
|
127
|
+
|
|
128
|
+
return { step, is_ok: false, detail: `exit ${String(exit_code ?? 'timed out')}` }
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Run a command in the consumer's directory with its output inherited, so a failing step shows why
|
|
132
|
+
// it failed rather than only `exit 1`, and so the long steps print as they run.
|
|
133
|
+
function spawn_step(
|
|
134
|
+
target: PropagateTarget,
|
|
135
|
+
step: string,
|
|
136
|
+
command: ReadonlyArray<string>,
|
|
137
|
+
): StepResult {
|
|
138
|
+
const [executable, ...rest] = command
|
|
139
|
+
if (executable === undefined) return { step, is_ok: false, detail: NO_COMMAND }
|
|
140
|
+
const spawned = execaSync(executable, rest, {
|
|
141
|
+
cwd: target.path,
|
|
142
|
+
reject: false,
|
|
143
|
+
stdio: 'inherit',
|
|
144
|
+
timeout: STEP_TIMEOUT_MS,
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
return step_result(step, spawned.exitCode)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// The same, keeping what the command printed. Only the pull-request step uses it: a consumer's
|
|
151
|
+
// pre-push hook names the check that stopped it in its own last lines, and until
|
|
152
|
+
// joshuafolkken/kit#1417 nothing in the run kept them — so the report had one exit code to attribute
|
|
153
|
+
// three sub-steps with, and attributed it to the wrong one.
|
|
154
|
+
//
|
|
155
|
+
// **This step's output is replayed when it finishes rather than printed as it runs**, and that is
|
|
156
|
+
// the price of keeping it. A synchronous spawn gives one target per file descriptor, so `['inherit',
|
|
157
|
+
// 'pipe']` cannot do both: execa buffers and writes the buffer out when the child exits. Nothing is
|
|
158
|
+
// lost, and the cost is confined to this one step — every other step above still streams, including
|
|
159
|
+
// the consumer's own verification gate, which is the long one. The alternative was to reproduce the
|
|
160
|
+
// message afterwards by pushing again with hooks enabled, which runs the consumer's whole gate a
|
|
161
|
+
// second time.
|
|
162
|
+
function spawn_captured(
|
|
163
|
+
target: PropagateTarget,
|
|
164
|
+
step: string,
|
|
165
|
+
command: ReadonlyArray<string>,
|
|
166
|
+
): SpawnOutcome {
|
|
167
|
+
const [executable, ...rest] = command
|
|
168
|
+
|
|
169
|
+
if (executable === undefined) {
|
|
170
|
+
return { result: { step, is_ok: false, detail: NO_COMMAND }, streams: [] }
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const spawned = execaSync(executable, rest, {
|
|
174
|
+
cwd: target.path,
|
|
175
|
+
reject: false,
|
|
176
|
+
stdin: 'inherit',
|
|
177
|
+
stdout: ['inherit', 'pipe'],
|
|
178
|
+
stderr: ['inherit', 'pipe'],
|
|
179
|
+
timeout: STEP_TIMEOUT_MS,
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
return {
|
|
183
|
+
result: step_result(step, spawned.exitCode),
|
|
184
|
+
streams: [captured(spawned.stdout), captured(spawned.stderr)],
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Refuse a consumer whose working tree is not clean, is not on its default branch, or is behind its
|
|
189
|
+
// remote. Everything after this step commits and pushes, and `josh git` stages the whole tree — so a
|
|
190
|
+
// consumer's unrelated work in progress would otherwise ride into the pull request.
|
|
191
|
+
function precheck_step(target: PropagateTarget, step: string): StepResult {
|
|
192
|
+
const state = propagate_git.tree_state(target.path)
|
|
193
|
+
if (state.is_ready) return { step, is_ok: true }
|
|
194
|
+
|
|
195
|
+
return { step, is_ok: false, detail: state.reason ?? 'not ready' }
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Open the issue the pull request will close. `josh git` requires an issue argument — it derives the
|
|
199
|
+
// branch name and the `closes #N` line from it — so the upgrade gets a tracked issue in the consumer
|
|
200
|
+
// rather than a branchless pull request that cannot be opened at all.
|
|
201
|
+
//
|
|
202
|
+
// It posts to REST instead of running `gh issue create`: that command goes through GraphQL, which a
|
|
203
|
+
// cloud session is answered 403 for, while the REST endpoint is served normally
|
|
204
|
+
// (joshuafolkken/kit#1022). This was the last `gh <noun> <verb>` spawn in kit's own code, and it was
|
|
205
|
+
// missed by that epic's survey because the survey counted `exec_gh_command` call sites and this one
|
|
206
|
+
// spawned gh directly (joshuafolkken/kit#1042).
|
|
207
|
+
//
|
|
208
|
+
// The request is the one every issue creation builds, and the spawn is the synchronous twin of the
|
|
209
|
+
// one the asynchronous writers use — so no second write layer exists to disagree with the first.
|
|
210
|
+
// Two things follow from the switch: the multi-line body travels over stdin rather than as an
|
|
211
|
+
// argument, and the path names the consumer repository outright, so the call no longer depends on
|
|
212
|
+
// the directory it is spawned in.
|
|
213
|
+
// gh's own output is the only thing that distinguishes a missing scope from disabled issues from a
|
|
214
|
+
// repository that does not exist. Reporting `could not open an issue` alone hides all three, so the
|
|
215
|
+
// whole message is kept — `to_gh_error` puts the stderr summary and the JSON body REST writes to
|
|
216
|
+
// stdout on separate lines (joshuafolkken/kit#1029), and both carry the reason.
|
|
217
|
+
//
|
|
218
|
+
// **It is folded back onto one line here.** The run's report is one line per consumer, and
|
|
219
|
+
// `failure_reason` appends the "changes left uncommitted" warning to the end of this text — so a
|
|
220
|
+
// multi-line detail would print raw JSON as an unindented second line and glue that warning to the
|
|
221
|
+
// end of it, where nobody reading the report would see it.
|
|
222
|
+
function to_issue_detail(error: unknown): string {
|
|
223
|
+
const message = error instanceof Error ? error.message : String(error)
|
|
224
|
+
|
|
225
|
+
return message.replaceAll('\n', ' ').trim()
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function create_issue(target: PropagateTarget, title: string, body: string): IssueOutcome {
|
|
229
|
+
try {
|
|
230
|
+
const url = git_gh_exec.exec_gh_api_sync(
|
|
231
|
+
git_gh_issue_write.issue_create_request({ title, body, repo: target.repo }),
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
return { url }
|
|
235
|
+
} catch (error) {
|
|
236
|
+
return { detail: to_issue_detail(error) }
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function open_issue(target: PropagateTarget, package_name: string, version: string): IssueOutcome {
|
|
241
|
+
return create_issue(target, issue_title(package_name, version), issue_body(package_name, version))
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// What the creation produced: the new issue's URL, or gh's reason for refusing.
|
|
245
|
+
interface IssueOutcome {
|
|
246
|
+
url?: string
|
|
247
|
+
detail?: string
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const ISSUE_NUMBER_PATTERN = /\/(?<number>\d+)\s*$/u
|
|
251
|
+
|
|
252
|
+
// The creation answers the new issue's browser URL — `.html_url`, which is the value `gh issue
|
|
253
|
+
// create` used to print — and its last path segment is the number `josh git` needs.
|
|
254
|
+
function parse_issue_number(issue_url: string): string | undefined {
|
|
255
|
+
const { groups } = ISSUE_NUMBER_PATTERN.exec(issue_url.trim()) ?? {}
|
|
256
|
+
const { number: issue_number } = groups ?? {}
|
|
257
|
+
|
|
258
|
+
return issue_number
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// The issue step: open it, and remember its number for the pull-request step.
|
|
262
|
+
function issue_step(
|
|
263
|
+
target: PropagateTarget,
|
|
264
|
+
step: string,
|
|
265
|
+
plan: ReleasePlan,
|
|
266
|
+
issue_numbers: Map<string, string>,
|
|
267
|
+
): StepResult {
|
|
268
|
+
// Nothing changed, so there is nothing to open an issue about. Reached when the upgrade installed
|
|
269
|
+
// a version the consumer already had and the sync rewrote no file; opening an issue and then
|
|
270
|
+
// failing on an empty commit is the alternative.
|
|
271
|
+
if (propagate_git.is_clean(target.path)) {
|
|
272
|
+
return { step, is_ok: true, is_complete: true, detail: 'already current — nothing to commit' }
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const outcome = create_issue(target, plan_title(plan.releases), plan_body(plan))
|
|
276
|
+
const number = parse_issue_number(outcome.url ?? '')
|
|
277
|
+
|
|
278
|
+
if (number === undefined) {
|
|
279
|
+
return { step, is_ok: false, detail: outcome.detail ?? 'could not open an issue' }
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
issue_numbers.set(target.repo, number)
|
|
283
|
+
|
|
284
|
+
return { step, is_ok: true }
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Put the consumer back on its default branch. `josh git` leaves it on the feature branch, and the
|
|
288
|
+
// next run's pre-check would refuse it for that — the consumer would silently stop receiving
|
|
289
|
+
// releases (joshuafolkken/kit#863).
|
|
290
|
+
function return_step(target: PropagateTarget, step: string): StepResult {
|
|
291
|
+
if (propagate_git.return_to_default_branch(target.path)) return { step, is_ok: true }
|
|
292
|
+
|
|
293
|
+
return { step, is_ok: false, detail: 'left on the pull request branch' }
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// The pull-request step, named after the issue the step before it opened.
|
|
297
|
+
function pull_request_step(
|
|
298
|
+
target: PropagateTarget,
|
|
299
|
+
step: string,
|
|
300
|
+
plan: ReleasePlan,
|
|
301
|
+
issue_numbers: ReadonlyMap<string, string>,
|
|
302
|
+
): StepResult {
|
|
303
|
+
const number = issue_numbers.get(target.repo)
|
|
304
|
+
if (number === undefined) return { step, is_ok: false, detail: 'no issue number' }
|
|
305
|
+
const argument = `${plan_title(plan.releases)} #${number}`
|
|
306
|
+
const outcome = spawn_captured(target, step, ['pnpm', 'josh', 'git', '-y', argument])
|
|
307
|
+
if (outcome.result.is_ok) return outcome.result
|
|
308
|
+
|
|
309
|
+
return propagate_git_failure.attribute(target.path, outcome.result, outcome.streams)
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// One toolkit release being carried, as one value so the step handlers stay within the parameter
|
|
313
|
+
// limit. `bin_name` is the CLI that toolkit installs, which is what its own `sync` is spelled with.
|
|
314
|
+
interface Release {
|
|
315
|
+
package_name: string
|
|
316
|
+
version: string
|
|
317
|
+
bin_name: string
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// What one run carries: the releases, and the sentence naming the command that opened the issue.
|
|
321
|
+
// `josh propagate` always passes exactly one release; `josh adopt` passes every toolkit installed in
|
|
322
|
+
// the repository it runs in (joshuafolkken/kit#1085). Only the upgrade and the sync repeat per
|
|
323
|
+
// release — the pre-check, the verification gate, the issue, the pull request and the return to the
|
|
324
|
+
// default branch happen once, which is why the step order itself is unchanged.
|
|
325
|
+
interface ReleasePlan {
|
|
326
|
+
releases: ReadonlyArray<Release>
|
|
327
|
+
origin: string
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// One release's command under a step that repeats per release. The package name travels with it so
|
|
331
|
+
// a failure can say *which* toolkit failed: the run's report is one line per target, and `exit 1`
|
|
332
|
+
// alone would leave a two-toolkit upgrade with nothing to act on.
|
|
333
|
+
interface ToolkitCommand {
|
|
334
|
+
package_name: string
|
|
335
|
+
command: ReadonlyArray<string>
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Run one command per release under a single step, stopping at the first failure. The step is
|
|
339
|
+
// reported once, so a failing toolkit ends the sequence before the gate rather than leaving a
|
|
340
|
+
// half-upgraded tree to be verified.
|
|
341
|
+
function run_each(
|
|
342
|
+
target: PropagateTarget,
|
|
343
|
+
step: string,
|
|
344
|
+
commands: ReadonlyArray<ToolkitCommand>,
|
|
345
|
+
): StepResult {
|
|
346
|
+
for (const { package_name, command } of commands) {
|
|
347
|
+
const result = spawn_step(target, step, command)
|
|
348
|
+
|
|
349
|
+
if (!result.is_ok) return { ...result, detail: `${package_name}: ${result.detail ?? 'failed'}` }
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return { step, is_ok: true }
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function upgrade_commands(plan: ReleasePlan): ReadonlyArray<ToolkitCommand> {
|
|
356
|
+
return plan.releases.map((release) => ({
|
|
357
|
+
package_name: release.package_name,
|
|
358
|
+
command: upgrade_command(release.package_name, release.version),
|
|
359
|
+
}))
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function sync_commands(plan: ReleasePlan): ReadonlyArray<ToolkitCommand> {
|
|
363
|
+
return plan.releases.map((release) => ({
|
|
364
|
+
package_name: release.package_name,
|
|
365
|
+
command: sync_command(release.bin_name),
|
|
366
|
+
}))
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// A step runner bound to one run. The issue number created for a target is kept here so the
|
|
370
|
+
// pull-request step can name it, without any module-level state to leak between runs.
|
|
371
|
+
function create_step_runner(plan: ReleasePlan): RunStep {
|
|
372
|
+
const issue_numbers = new Map<string, string>()
|
|
373
|
+
const handlers: Record<string, (target: PropagateTarget, step: string) => StepResult> = {
|
|
374
|
+
[propagate_run.STEP_PRECHECK]: precheck_step,
|
|
375
|
+
[propagate_run.STEP_UPGRADE]: (target, step) => run_each(target, step, upgrade_commands(plan)),
|
|
376
|
+
[propagate_run.STEP_SYNC]: (target, step) => run_each(target, step, sync_commands(plan)),
|
|
377
|
+
[propagate_run.STEP_ISSUE]: (target, step) => issue_step(target, step, plan, issue_numbers),
|
|
378
|
+
[propagate_run.STEP_PR]: (target, step) => pull_request_step(target, step, plan, issue_numbers),
|
|
379
|
+
[propagate_run.STEP_RETURN]: return_step,
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
return (target: PropagateTarget, step: string): StepResult => {
|
|
383
|
+
console.info(` ${target.repo}: ${step}`)
|
|
384
|
+
const handler = handlers[step]
|
|
385
|
+
|
|
386
|
+
if (handler !== undefined) return handler(target, step)
|
|
387
|
+
|
|
388
|
+
return spawn_step(target, step, STEP_COMMANDS[step] ?? [])
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// The dry-run runner: it reports what each step would do and touches nothing.
|
|
393
|
+
function describe_step(target: PropagateTarget, step: string): StepResult {
|
|
394
|
+
console.info(` ${target.repo}: would run ${step}`)
|
|
395
|
+
|
|
396
|
+
return { step, is_ok: true }
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
const propagate_steps = {
|
|
400
|
+
STEP_COMMANDS,
|
|
401
|
+
JOSH_BIN,
|
|
402
|
+
PROPAGATE_ORIGIN,
|
|
403
|
+
sync_command,
|
|
404
|
+
upgrade_command,
|
|
405
|
+
upgrade_commands,
|
|
406
|
+
sync_commands,
|
|
407
|
+
return_step,
|
|
408
|
+
VERIFY_SCRIPT,
|
|
409
|
+
issue_title,
|
|
410
|
+
issue_body,
|
|
411
|
+
plan_title,
|
|
412
|
+
plan_body,
|
|
413
|
+
parse_issue_number,
|
|
414
|
+
open_issue,
|
|
415
|
+
precheck_step,
|
|
416
|
+
create_step_runner,
|
|
417
|
+
describe_step,
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
export type { Release, ReleasePlan }
|
|
421
|
+
export { propagate_steps }
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import type { RepoMap } from '#scripts/discovery/repo-map-logic'
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
|
|
6
|
+
// Deciding which repositories a published release should be carried into.
|
|
7
|
+
//
|
|
8
|
+
// The candidate set is joshuafolkken/kit#869's discovery map, so the owner restriction is inherited
|
|
9
|
+
// rather than restated: propagation writes — `josh vu`, `josh sync`, a commit, a pull request — and
|
|
10
|
+
// a write aimed at somebody else's repository is worse than a read aimed at one. Nothing here
|
|
11
|
+
// re-implements discovery.
|
|
12
|
+
//
|
|
13
|
+
// Which candidates are targets is read from the candidate itself: a repository is downstream when
|
|
14
|
+
// its manifest declares a dependency on this package. That is a fact about the checkout in front of
|
|
15
|
+
// us rather than a roster, so a new consumer needs no edit here — and it covers a consumer that is
|
|
16
|
+
// not a published package at all, which a list of downstream package names cannot
|
|
17
|
+
// (joshuafolkken/kit#863).
|
|
18
|
+
|
|
19
|
+
const MANIFEST_NAME = 'package.json'
|
|
20
|
+
const NODE_MODULES = 'node_modules'
|
|
21
|
+
|
|
22
|
+
// Why a candidate is not going to be processed, or that it is.
|
|
23
|
+
type TargetState = 'ready' | 'up_to_date' | 'not_downstream' | 'missing_checkout' | 'unreadable'
|
|
24
|
+
|
|
25
|
+
interface PropagateTarget {
|
|
26
|
+
repo: string
|
|
27
|
+
path: string
|
|
28
|
+
state: TargetState
|
|
29
|
+
// The range the consumer currently declares, when it declares one at all. Reported so a skip can
|
|
30
|
+
// say what it skipped rather than only that it did.
|
|
31
|
+
declared_range?: string
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Only the fields propagation reads. `passthrough` is deliberate — a consumer manifest carries far
|
|
35
|
+
// more, and rejecting it for that would classify every real repository as unreadable.
|
|
36
|
+
const manifest_schema = z
|
|
37
|
+
.object({
|
|
38
|
+
name: z.string().optional(),
|
|
39
|
+
version: z.string().optional(),
|
|
40
|
+
dependencies: z.record(z.string(), z.string()).optional(),
|
|
41
|
+
devDependencies: z.record(z.string(), z.string()).optional(),
|
|
42
|
+
})
|
|
43
|
+
.loose()
|
|
44
|
+
|
|
45
|
+
type Manifest = z.infer<typeof manifest_schema>
|
|
46
|
+
|
|
47
|
+
// Whether a candidate's directory is there at all. Only an override can name a path that is not:
|
|
48
|
+
// discovery produces candidates by scanning directories that exist.
|
|
49
|
+
function has_checkout(repository_path: string): boolean {
|
|
50
|
+
return existsSync(repository_path)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function read_manifest(repository_path: string): Manifest | undefined {
|
|
54
|
+
const manifest_path = path.join(repository_path, MANIFEST_NAME)
|
|
55
|
+
if (!existsSync(manifest_path)) return undefined
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
const parsed: unknown = JSON.parse(readFileSync(manifest_path, 'utf8'))
|
|
59
|
+
|
|
60
|
+
const result = manifest_schema.safeParse(parsed)
|
|
61
|
+
|
|
62
|
+
return result.success ? result.data : undefined
|
|
63
|
+
} catch {
|
|
64
|
+
return undefined
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// The range a manifest declares for `package_name`, from either dependency field. Undefined when the
|
|
69
|
+
// manifest does not depend on it at all.
|
|
70
|
+
function declared_range(manifest: Manifest, package_name: string): string | undefined {
|
|
71
|
+
return manifest.dependencies?.[package_name] ?? manifest.devDependencies?.[package_name]
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// The version of `package_name` actually installed in a consumer's `node_modules`. This — not the
|
|
75
|
+
// declared range — is what decides "already up to date": a caret range that would accept the new
|
|
76
|
+
// release still leaves the old copy installed until someone installs it.
|
|
77
|
+
function installed_version(repository_path: string, package_name: string): string | undefined {
|
|
78
|
+
const installed = read_manifest(path.join(repository_path, NODE_MODULES, package_name))
|
|
79
|
+
|
|
80
|
+
return typeof installed?.version === 'string' ? installed.version : undefined
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// The three ways a candidate can fail before its manifest is even read, kept apart because they mean
|
|
84
|
+
// different things. A path that does not exist is a checkout to report rather than clone; a
|
|
85
|
+
// directory with no manifest at all is simply not a Node project (a Godot or Rust repository sharing
|
|
86
|
+
// the parent directory), which is an ordinary "not downstream" rather than damage.
|
|
87
|
+
function classify_manifest_absence(repository_path: string): TargetState | undefined {
|
|
88
|
+
if (!has_checkout(repository_path)) return 'missing_checkout'
|
|
89
|
+
if (!existsSync(path.join(repository_path, MANIFEST_NAME))) return 'not_downstream'
|
|
90
|
+
|
|
91
|
+
return undefined
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// The state a candidate is in before any dependency is considered: it has no checkout, no manifest,
|
|
95
|
+
// an unreadable one, or it is the supplier itself. A supplier repository is not a target because
|
|
96
|
+
// propagation carries a release outward, and the source is where it came from.
|
|
97
|
+
function classify_before_dependency(
|
|
98
|
+
repository_path: string,
|
|
99
|
+
package_name: string,
|
|
100
|
+
manifest: Manifest | undefined,
|
|
101
|
+
): TargetState | undefined {
|
|
102
|
+
const absence = classify_manifest_absence(repository_path)
|
|
103
|
+
if (absence !== undefined) return absence
|
|
104
|
+
if (manifest === undefined) return 'unreadable'
|
|
105
|
+
|
|
106
|
+
return manifest.name === package_name ? 'not_downstream' : undefined
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Classify one candidate.
|
|
110
|
+
function classify_target(
|
|
111
|
+
repo: string,
|
|
112
|
+
repository_path: string,
|
|
113
|
+
package_name: string,
|
|
114
|
+
target_version: string,
|
|
115
|
+
): PropagateTarget {
|
|
116
|
+
const manifest = read_manifest(repository_path)
|
|
117
|
+
const early = classify_before_dependency(repository_path, package_name, manifest)
|
|
118
|
+
if (early !== undefined) return { repo, path: repository_path, state: early }
|
|
119
|
+
const range = manifest === undefined ? undefined : declared_range(manifest, package_name)
|
|
120
|
+
if (range === undefined) return { repo, path: repository_path, state: 'not_downstream' }
|
|
121
|
+
const is_current = installed_version(repository_path, package_name) === target_version
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
repo,
|
|
125
|
+
path: repository_path,
|
|
126
|
+
state: is_current ? 'up_to_date' : 'ready',
|
|
127
|
+
declared_range: range,
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Every candidate in the map, classified, in map order. Candidates that are not downstream are kept
|
|
132
|
+
// in the result rather than filtered away, so the report can say what was considered — a consumer
|
|
133
|
+
// silently missing from a propagation run is the failure mode this command exists to remove.
|
|
134
|
+
function resolve_targets(
|
|
135
|
+
map: RepoMap,
|
|
136
|
+
package_name: string,
|
|
137
|
+
target_version: string,
|
|
138
|
+
): Array<PropagateTarget> {
|
|
139
|
+
const targets: Array<PropagateTarget> = []
|
|
140
|
+
|
|
141
|
+
for (const [repo, repository_path] of map) {
|
|
142
|
+
targets.push(classify_target(repo, repository_path, package_name, target_version))
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return targets
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const propagate_targets = {
|
|
149
|
+
has_checkout,
|
|
150
|
+
read_manifest,
|
|
151
|
+
classify_manifest_absence,
|
|
152
|
+
classify_before_dependency,
|
|
153
|
+
declared_range,
|
|
154
|
+
installed_version,
|
|
155
|
+
classify_target,
|
|
156
|
+
resolve_targets,
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export type { Manifest, PropagateTarget }
|
|
160
|
+
export { propagate_targets }
|