@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,93 @@
|
|
|
1
|
+
import { package_with_deps_schema } from '#scripts/overrides/schemas'
|
|
2
|
+
import semver from 'semver'
|
|
3
|
+
|
|
4
|
+
// `pnpm update --latest` sets each range to whatever the registry reports as newest. When a
|
|
5
|
+
// supply-chain guard suppresses versions younger than a minimum age, the newest *allowed* version
|
|
6
|
+
// can be older than the one already installed, and the update writes that regression into
|
|
7
|
+
// package.json and the lockfile without a word. Detecting it means comparing the ranges the update
|
|
8
|
+
// rewrote against the ones it replaced — the registry is not consulted again, so this stays a pure
|
|
9
|
+
// comparison of two manifests.
|
|
10
|
+
|
|
11
|
+
interface VersionRegression {
|
|
12
|
+
name: string
|
|
13
|
+
kept: string
|
|
14
|
+
offered: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function read_direct_dependencies(package_json_content: string): Record<string, string> {
|
|
18
|
+
const parsed = package_with_deps_schema.parse(JSON.parse(package_json_content))
|
|
19
|
+
|
|
20
|
+
return { ...parsed.dependencies, ...parsed.devDependencies }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Ranges are compared by their lowest satisfying version: `^4.23.5` guarantees at least 4.23.5, so
|
|
24
|
+
// a rewrite to `^4.23.1` lowers the floor even though both ranges could resolve to the same build.
|
|
25
|
+
// A range semver cannot read (a git URL, `workspace:*`, a tag) yields undefined and is skipped —
|
|
26
|
+
// there is no ordering to assert, and guessing one would revert updates that were never regressions.
|
|
27
|
+
function to_floor(range: string | undefined): semver.SemVer | undefined {
|
|
28
|
+
if (range === undefined) return undefined
|
|
29
|
+
|
|
30
|
+
try {
|
|
31
|
+
return semver.minVersion(range) ?? undefined
|
|
32
|
+
} catch {
|
|
33
|
+
return undefined
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function is_regression(before_range: string | undefined, after_range: string | undefined): boolean {
|
|
38
|
+
const before = to_floor(before_range)
|
|
39
|
+
const after = to_floor(after_range)
|
|
40
|
+
|
|
41
|
+
if (before === undefined || after === undefined) return false
|
|
42
|
+
|
|
43
|
+
return semver.lt(after, before)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Compare the direct dependencies of two package.json revisions and report every entry whose
|
|
48
|
+
* version floor moved down. Packages added or removed between the two are not regressions.
|
|
49
|
+
*/
|
|
50
|
+
function find_regressions(before_content: string, after_content: string): Array<VersionRegression> {
|
|
51
|
+
const before = read_direct_dependencies(before_content)
|
|
52
|
+
const after = read_direct_dependencies(after_content)
|
|
53
|
+
|
|
54
|
+
return Object.entries(before)
|
|
55
|
+
.filter(([name, range]) => is_regression(range, after[name]))
|
|
56
|
+
.map(([name, range]) => ({ name, kept: range, offered: after[name] ?? '' }))
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function format_regression(regression: VersionRegression): string {
|
|
60
|
+
return `${regression.name}@${regression.kept} (newest allowed is ${regression.offered})`
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Named "keeping" rather than "skipping" so it does not read as the held-back list printed above it:
|
|
64
|
+
// those are packages deliberately pinned, these are ones the update would have moved backwards.
|
|
65
|
+
//
|
|
66
|
+
// The wording blames the *allowed* set rather than the registry: the newer version is normally still
|
|
67
|
+
// published and still tagged latest — a minimum-age gate is simply hiding it for now — so the state
|
|
68
|
+
// is transient and a later run moves forward on its own.
|
|
69
|
+
//
|
|
70
|
+
// It also has to say the whole update was rolled back. Excluding the offender from the update
|
|
71
|
+
// targets does not exclude it from resolution: pnpm resolves the entire graph either way, and while
|
|
72
|
+
// a pin sits above the newest allowed version that pin is unresolvable
|
|
73
|
+
// (`ERR_PNPM_NO_MATCHING_VERSION`). So the choice is between a downgrade and no update at all, and
|
|
74
|
+
// a reader who is told only "kept tsx" would wrongly assume the rest of the run went through.
|
|
75
|
+
function format_kept_back_notice(regressions: ReadonlyArray<VersionRegression>): string {
|
|
76
|
+
const list = regressions.map((regression) => format_regression(regression)).join(', ')
|
|
77
|
+
|
|
78
|
+
return [
|
|
79
|
+
`\n⏮ Keeping ${list} — the newest allowed version is older than the installed one.`,
|
|
80
|
+
' The update was rolled back and no dependency changed: while a pin sits above the newest',
|
|
81
|
+
' allowed version, the whole tree cannot be resolved. Re-run once the newer release is',
|
|
82
|
+
' no longer withheld.',
|
|
83
|
+
].join('\n')
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const latest_regression = {
|
|
87
|
+
read_direct_dependencies,
|
|
88
|
+
find_regressions,
|
|
89
|
+
format_kept_back_notice,
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export { latest_regression }
|
|
93
|
+
export type { VersionRegression }
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { latest_lane_guard } from './latest-lane-guard'
|
|
4
|
+
import { latest_stamp, type LatestStamp } from './latest-stamp'
|
|
5
|
+
|
|
6
|
+
// `josh latest:scope` — say whether this run has to update dependencies (joshuafolkken/kit#1215).
|
|
7
|
+
//
|
|
8
|
+
// A command rather than a paragraph in a procedure, for the reason `josh review:level` is a command:
|
|
9
|
+
// a rule an agent applies from memory is a rule an agent can talk itself out of, and this one is
|
|
10
|
+
// argued against every time it is reached — once because the update costs a minute or two, and once
|
|
11
|
+
// because skipping it is invisible until something ships against a stale dependency.
|
|
12
|
+
//
|
|
13
|
+
// It does not share `path_decision` with that command: `josh review:level` decides from the *changed
|
|
14
|
+
// paths*, and this decides from *when the last run happened*. The flag parsing and the printing are the small half;
|
|
15
|
+
// the read of the diff is what that module exists for, and this command never makes one.
|
|
16
|
+
|
|
17
|
+
const ARGV_OFFSET = 2
|
|
18
|
+
const USAGE = 'Usage: josh latest:scope [--record] [--json]'
|
|
19
|
+
const JSON_KEY = 'scope'
|
|
20
|
+
const JSON_FLAG = '--json'
|
|
21
|
+
// Written by the `josh latest` chain itself once every step of it has succeeded, so a run that fell
|
|
22
|
+
// over halfway leaves no record and the next one updates again.
|
|
23
|
+
const RECORD_FLAG = '--record'
|
|
24
|
+
const KNOWN_FLAGS: ReadonlySet<string> = new Set([JSON_FLAG, RECORD_FLAG])
|
|
25
|
+
const REQUIRED_SCOPE = 'required'
|
|
26
|
+
const SKIPPED_SCOPE = 'skip'
|
|
27
|
+
const FAILURE_EXIT_CODE = 1
|
|
28
|
+
const NO_STAMP_REASON =
|
|
29
|
+
'no record of a `josh latest` run in this checkout — update rather than assume the dependencies are current'
|
|
30
|
+
const HOURS_PRECISION = 1
|
|
31
|
+
|
|
32
|
+
type LatestScope = typeof REQUIRED_SCOPE | typeof SKIPPED_SCOPE
|
|
33
|
+
|
|
34
|
+
interface Decision {
|
|
35
|
+
scope: LatestScope
|
|
36
|
+
reason: string
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function format_hours(hours: number): string {
|
|
40
|
+
return hours.toFixed(HOURS_PRECISION)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The age and the window both, because the answer is only readable beside the threshold that
|
|
44
|
+
// produced it — a bare "3.2 hours ago" says nothing about why that was enough.
|
|
45
|
+
function describe_stamp(stamp: LatestStamp, max_age_hours: number, is_fresh: boolean): string {
|
|
46
|
+
const age = format_hours(latest_stamp.hours_since(stamp))
|
|
47
|
+
const window = format_hours(max_age_hours)
|
|
48
|
+
|
|
49
|
+
if (is_fresh) return `last run ${age}h ago, inside the ${window}h window — nothing to update`
|
|
50
|
+
|
|
51
|
+
return `last run ${age}h ago, past the ${window}h window — update before implementing`
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function decide(): Decision {
|
|
55
|
+
const stamp = latest_stamp.read_stamp()
|
|
56
|
+
|
|
57
|
+
if (stamp === undefined) return { scope: REQUIRED_SCOPE, reason: NO_STAMP_REASON }
|
|
58
|
+
|
|
59
|
+
const max_age_hours = latest_stamp.read_max_age_hours()
|
|
60
|
+
const is_fresh = latest_stamp.is_fresh(stamp, new Date(), max_age_hours)
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
scope: is_fresh ? SKIPPED_SCOPE : REQUIRED_SCOPE,
|
|
64
|
+
reason: describe_stamp(stamp, max_age_hours, is_fresh),
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// A lane is answered `skip` before the stamp is even read (joshuafolkken/kit#2135): the stamp is
|
|
69
|
+
// keyed to the project root, so a lane always reads as stale, and every lane would otherwise run its
|
|
70
|
+
// own dependency update. `latest_lane_guard` is the single source of the reason and of the refusal
|
|
71
|
+
// `josh latest` prints.
|
|
72
|
+
function scope_decision(): Decision {
|
|
73
|
+
if (latest_lane_guard.is_lane()) {
|
|
74
|
+
return { scope: SKIPPED_SCOPE, reason: latest_lane_guard.LANE_SCOPE_REASON }
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return decide()
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// The answer alone on stdout so `$(pnpm josh latest:scope)` reads it, and the reason on stderr so a
|
|
81
|
+
// person sees why without a shell having to parse around it — the same split `josh review:level`
|
|
82
|
+
// prints in.
|
|
83
|
+
function print_decision(decision: Decision, is_json: boolean): void {
|
|
84
|
+
if (is_json) {
|
|
85
|
+
console.info(JSON.stringify({ [JSON_KEY]: decision.scope, reason: decision.reason }))
|
|
86
|
+
|
|
87
|
+
return
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
console.info(decision.scope)
|
|
91
|
+
console.error(decision.reason)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Nothing on stdout: `--record` is the write half, and a caller capturing `$(pnpm josh
|
|
95
|
+
// latest:scope)` must never be handed a scope by the invocation that was only meant to note a run
|
|
96
|
+
// down. The confirmation goes where the reasons go.
|
|
97
|
+
//
|
|
98
|
+
// **A write that failed is reported and exits zero.** This is the last link of the `josh latest`
|
|
99
|
+
// chain, so throwing here would turn a dependency update that fully succeeded into a red command
|
|
100
|
+
// with a stack trace — over a note nobody reads directly. A failed write leaves no record, and no
|
|
101
|
+
// record answers `required`, so the only consequence is that the next run updates again: the safe
|
|
102
|
+
// direction, and the one the write's own guards were built to fall in.
|
|
103
|
+
function record(): number {
|
|
104
|
+
try {
|
|
105
|
+
console.error(`recorded this josh latest run at ${latest_stamp.write_stamp()}`)
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.error(`could not record this josh latest run: ${String(error)}`)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return 0
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function run(argv: ReadonlyArray<string>): number {
|
|
114
|
+
if (argv.some((argument) => !KNOWN_FLAGS.has(argument))) {
|
|
115
|
+
console.error(USAGE)
|
|
116
|
+
|
|
117
|
+
return FAILURE_EXIT_CODE
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (argv.includes(RECORD_FLAG)) return record()
|
|
121
|
+
|
|
122
|
+
print_decision(scope_decision(), argv.includes(JSON_FLAG))
|
|
123
|
+
|
|
124
|
+
return 0
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function main(argv: ReadonlyArray<string>): void {
|
|
128
|
+
process.exitCode = run(argv)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const latest_scope_cli = {
|
|
132
|
+
decide,
|
|
133
|
+
describe_stamp,
|
|
134
|
+
JSON_KEY,
|
|
135
|
+
main,
|
|
136
|
+
NO_STAMP_REASON,
|
|
137
|
+
RECORD_FLAG,
|
|
138
|
+
REQUIRED_SCOPE,
|
|
139
|
+
run,
|
|
140
|
+
scope_decision,
|
|
141
|
+
SKIPPED_SCOPE,
|
|
142
|
+
USAGE,
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
146
|
+
|
|
147
|
+
export { latest_scope_cli }
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
2
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
|
+
|
|
4
|
+
// When `josh latest` last finished in this checkout, and whether that is recent enough to skip
|
|
5
|
+
// (joshuafolkken/kit#1215).
|
|
6
|
+
//
|
|
7
|
+
// `josh latest` is a network-bound chain — pnpm update, every dependency, `ranges`, `pnpm audit` — that
|
|
8
|
+
// took 60–120 seconds at the head of every `fullrun` / `halfrun` and of every child a batch ran, and
|
|
9
|
+
// running it several times in one day barely changes its answer. `queue` and `epicrun` had already
|
|
10
|
+
// hoisted it to the head of a batch by hand; what had no rule at all was a standalone run, which is
|
|
11
|
+
// its own batch head and therefore updated dependencies every single time.
|
|
12
|
+
//
|
|
13
|
+
// **The condition is elapsed time, not judgement.** "The deps are probably still fresh" is a call
|
|
14
|
+
// made under time pressure, and time pressure resolves it toward `skip` exactly when a stale
|
|
15
|
+
// dependency is most likely to matter — the same reason `pnpm josh review:level` takes its answer
|
|
16
|
+
// off a mechanical input rather than out of an agent's head. The record here is that input.
|
|
17
|
+
|
|
18
|
+
const STAMP_PREFIX = 'josh-latest-stamp-'
|
|
19
|
+
// Twelve hours rather than a day. The issue's own measurement is that a day's worth of runs get
|
|
20
|
+
// nearly the same answer, so the saving between the two settings is marginal, while the exposure is
|
|
21
|
+
// not: a repository that publishes several times a day would spend a whole day on dependencies
|
|
22
|
+
// nobody had re-read. Two windows a day keeps the update at a frequency a person would recognize and
|
|
23
|
+
// still takes it off all but the first run of a working session. `JOSH_LATEST_MAX_AGE_HOURS` moves
|
|
24
|
+
// it in either direction.
|
|
25
|
+
const DEFAULT_MAX_AGE_HOURS = 12
|
|
26
|
+
const MAX_AGE_ENV_VAR = 'JOSH_LATEST_MAX_AGE_HOURS'
|
|
27
|
+
const MS_PER_HOUR = 3_600_000
|
|
28
|
+
|
|
29
|
+
interface LatestStamp {
|
|
30
|
+
ran_at: string
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Keyed to the **project**, not to the kit package. A globally installed `josh` has one package
|
|
34
|
+
// directory for every project on the machine, so keying on that would let `josh latest` in one
|
|
35
|
+
// project answer `skip` in another for the rest of the window — skipping its `pnpm audit` too. This
|
|
36
|
+
// is where the record differs from `josh eval`'s, which is genuinely about the package's own files.
|
|
37
|
+
function stamp_path(): string {
|
|
38
|
+
return stamp_file.stamp_path(STAMP_PREFIX, PROJECT_ROOT)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Anything that is not a positive finite number falls back to the default, the same reading
|
|
42
|
+
// `JOSH_CI_TIMEOUT_SECONDS` gets: a misspelled value must not silently disable the update, and a
|
|
43
|
+
// zero or negative window would ask for it on every run while looking like a configured choice.
|
|
44
|
+
function read_max_age_hours(environment: NodeJS.ProcessEnv = process.env): number {
|
|
45
|
+
const raw = Number(environment[MAX_AGE_ENV_VAR])
|
|
46
|
+
|
|
47
|
+
return Number.isFinite(raw) && raw > 0 ? raw : DEFAULT_MAX_AGE_HOURS
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Takes `unknown` rather than the declared field type: the file is written by one command and read
|
|
51
|
+
// by another, so a truncated or hand-edited one has to answer "no record" rather than reach the
|
|
52
|
+
// comparison as a lie.
|
|
53
|
+
function parse_stamp(raw: string): LatestStamp | undefined {
|
|
54
|
+
const { ran_at } = JSON.parse(raw) as Partial<LatestStamp>
|
|
55
|
+
|
|
56
|
+
if (typeof ran_at !== 'string' || Number.isNaN(Date.parse(ran_at))) return undefined
|
|
57
|
+
|
|
58
|
+
return { ran_at }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function read_stamp(source: string = stamp_path()): LatestStamp | undefined {
|
|
62
|
+
const raw = stamp_file.read_stamp_text(source)
|
|
63
|
+
|
|
64
|
+
if (raw === undefined) return undefined
|
|
65
|
+
|
|
66
|
+
try {
|
|
67
|
+
return parse_stamp(raw)
|
|
68
|
+
} catch {
|
|
69
|
+
return undefined
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function write_stamp(target: string = stamp_path()): string {
|
|
74
|
+
const stamp: LatestStamp = { ran_at: new Date().toISOString() }
|
|
75
|
+
|
|
76
|
+
return stamp_file.write_stamp(target, stamp)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Negative where the record is in the future — a clock that moved backwards, or a record copied from
|
|
80
|
+
// another machine.
|
|
81
|
+
function hours_since(stamp: LatestStamp, now: Date = new Date()): number {
|
|
82
|
+
return (now.getTime() - Date.parse(stamp.ran_at)) / MS_PER_HOUR
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// **The window is measured in both directions.** A record a little ahead of now is the ordinary
|
|
86
|
+
// small clock skew, and reading it as stale would update on every invocation until the clock caught
|
|
87
|
+
// up — the failure this command exists to remove. A record *far* ahead is a different thing: a stamp
|
|
88
|
+
// written under a badly skewed clock, or copied from another machine, would otherwise answer `skip`
|
|
89
|
+
// for as long as that checkout exists and silently switch dependency updates off. Distance from now
|
|
90
|
+
// is what separates them, so the reading is the absolute one.
|
|
91
|
+
function is_fresh(stamp: LatestStamp, now: Date = new Date(), max_age_hours?: number): boolean {
|
|
92
|
+
return Math.abs(hours_since(stamp, now)) < (max_age_hours ?? read_max_age_hours())
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const latest_stamp = {
|
|
96
|
+
DEFAULT_MAX_AGE_HOURS,
|
|
97
|
+
hours_since,
|
|
98
|
+
is_fresh,
|
|
99
|
+
MAX_AGE_ENV_VAR,
|
|
100
|
+
read_max_age_hours,
|
|
101
|
+
read_stamp,
|
|
102
|
+
stamp_path,
|
|
103
|
+
write_stamp,
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export type { LatestStamp }
|
|
107
|
+
export { latest_stamp }
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Filtered `pnpm update --latest` that skips overridden packages and never downgrades.
|
|
4
|
+
*
|
|
5
|
+
* Usage: tsx scripts/version/latest-update.ts
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, writeFileSync } from 'node:fs'
|
|
8
|
+
import { fileURLToPath } from 'node:url'
|
|
9
|
+
import { file_reader } from '#scripts/lib/read-file'
|
|
10
|
+
import { lockfile_overrides } from '#scripts/overrides/lockfile-overrides'
|
|
11
|
+
import { overrides_files } from '#scripts/overrides/overrides-files'
|
|
12
|
+
import { overrides_check } from '#scripts/overrides/overrides-logic'
|
|
13
|
+
import { execaSync } from 'execa'
|
|
14
|
+
import { latest_regression, type VersionRegression } from './latest-regression'
|
|
15
|
+
import { preinstall_version_update } from './preinstall-version-update'
|
|
16
|
+
|
|
17
|
+
const PACKAGE_JSON_PATH = 'package.json'
|
|
18
|
+
const LOCKFILE_PATH = 'pnpm-lock.yaml'
|
|
19
|
+
|
|
20
|
+
interface TreeSnapshot {
|
|
21
|
+
package_json: string
|
|
22
|
+
lockfile: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function run(arguments_: Array<string>): number {
|
|
26
|
+
const [cmd, ...rest] = arguments_
|
|
27
|
+
if (cmd === undefined) return 0
|
|
28
|
+
console.info(`\n▶ ${arguments_.join(' ')}`)
|
|
29
|
+
const result = execaSync(cmd, rest, { stdio: 'inherit', reject: false })
|
|
30
|
+
|
|
31
|
+
return result.exitCode ?? 1
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function run_update_stages(stages: Array<Array<string>>): number {
|
|
35
|
+
for (const stage of stages) {
|
|
36
|
+
const status = run(stage)
|
|
37
|
+
if (status !== 0) return status
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return 0
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function take_snapshot(): TreeSnapshot {
|
|
44
|
+
return {
|
|
45
|
+
package_json: readFileSync(PACKAGE_JSON_PATH, 'utf8'),
|
|
46
|
+
lockfile: file_reader.read_file_or_empty(LOCKFILE_PATH),
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Restoring the files verbatim is the only recovery available: while the newer version is
|
|
51
|
+
// suppressed it is also unresolvable, so putting the old range back and re-installing fails with
|
|
52
|
+
// "the latest release is <older>". The captured lockfile still carries the resolved URL and
|
|
53
|
+
// integrity, which installs fine.
|
|
54
|
+
function restore_snapshot(snapshot: TreeSnapshot): void {
|
|
55
|
+
writeFileSync(PACKAGE_JSON_PATH, snapshot.package_json)
|
|
56
|
+
if (snapshot.lockfile.length > 0) writeFileSync(LOCKFILE_PATH, snapshot.lockfile)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function report_kept_back(regressions: ReadonlyArray<VersionRegression>): void {
|
|
60
|
+
console.info(latest_regression.format_kept_back_notice(regressions))
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// The direct-dependency `--latest` bump lifts the package.json ranges; this second, argument-less
|
|
64
|
+
// pass then re-resolves every tier the lockfile carries within those ranges, which is the only stage
|
|
65
|
+
// that reaches the indirect packages a direct-only update leaves pinned at a stale resolution
|
|
66
|
+
// (joshuafolkken/kit#2200). `pnpm update` defaults to depth Infinity, so no flag is needed to reach
|
|
67
|
+
// the whole tree. The re-resolution stage always runs — even when every direct dependency is
|
|
68
|
+
// overridden and the `--latest` stage is absent, the indirect tiers still need re-resolving.
|
|
69
|
+
const PNPM_UPDATE_ALL_TIERS = ['pnpm', 'update']
|
|
70
|
+
|
|
71
|
+
function build_update_commands(): Array<Array<string>> {
|
|
72
|
+
const content = readFileSync(PACKAGE_JSON_PATH, 'utf8')
|
|
73
|
+
const latest = overrides_check.build_update_command(
|
|
74
|
+
overrides_files.read_current_overrides(),
|
|
75
|
+
content,
|
|
76
|
+
)
|
|
77
|
+
const stages: Array<Array<string>> = latest === undefined ? [] : [latest]
|
|
78
|
+
|
|
79
|
+
return [...stages, [...PNPM_UPDATE_ALL_TIERS]]
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
interface UpdateOutcome {
|
|
83
|
+
status: number
|
|
84
|
+
is_rolled_back: boolean
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function find_regressions_after_update(snapshot: TreeSnapshot): Array<VersionRegression> {
|
|
88
|
+
const after = readFileSync(PACKAGE_JSON_PATH, 'utf8')
|
|
89
|
+
|
|
90
|
+
return latest_regression.find_regressions(snapshot.package_json, after)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Rolling the whole update back rather than retrying without the offender: excluding a package from
|
|
94
|
+
// the update targets does not exclude it from resolution, and while its installed version sits above
|
|
95
|
+
// the newest allowed one that version is unresolvable, so a retry can only fail with
|
|
96
|
+
// ERR_PNPM_NO_MATCHING_VERSION. The choice is genuinely between a downgrade and no update, and this
|
|
97
|
+
// takes no update — the condition is transient, so a later run picks the upgrades up.
|
|
98
|
+
//
|
|
99
|
+
// Exits zero: the tree is left exactly as it was found, nothing is broken, and every workflow that
|
|
100
|
+
// runs `josh latest` in its preamble would otherwise stop for a situation that resolves itself.
|
|
101
|
+
function update_without_downgrading(snapshot: TreeSnapshot): UpdateOutcome {
|
|
102
|
+
const status = run_update_stages(build_update_commands())
|
|
103
|
+
if (status !== 0) return { status, is_rolled_back: false }
|
|
104
|
+
|
|
105
|
+
const regressions = find_regressions_after_update(snapshot)
|
|
106
|
+
if (regressions.length === 0) return { status, is_rolled_back: false }
|
|
107
|
+
|
|
108
|
+
restore_snapshot(snapshot)
|
|
109
|
+
report_kept_back(regressions)
|
|
110
|
+
|
|
111
|
+
return { status: 0, is_rolled_back: true }
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function report_excluded(excluded: ReadonlyArray<string>): void {
|
|
115
|
+
if (excluded.length === 0) return
|
|
116
|
+
|
|
117
|
+
console.info(`\n⏭ Skipping held-back / overridden packages: ${excluded.join(', ')}`)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Printed unconditionally so the overrides verdict does not depend on an agent remembering which
|
|
121
|
+
// file to open afterwards (kit #740). The summary names the files that were read, so a run with no
|
|
122
|
+
// overrides anywhere is distinguishable from a run that looked in the wrong place.
|
|
123
|
+
function report_overrides(before: Record<string, string>): void {
|
|
124
|
+
const summary = overrides_check.describe_sources(overrides_files.read_current_sources())
|
|
125
|
+
const diff = overrides_check.compare(before, overrides_files.read_current_overrides())
|
|
126
|
+
|
|
127
|
+
if (!diff.is_changed) {
|
|
128
|
+
console.info(`\n✔ overrides unchanged (${summary}).`)
|
|
129
|
+
|
|
130
|
+
return
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
console.warn(`\n⚠ overrides changed (${summary}) — restore them unless the change was intended:`)
|
|
134
|
+
|
|
135
|
+
for (const line of overrides_check.format_diff_lines(diff)) {
|
|
136
|
+
console.warn(line)
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// The overrides verdict above only says the overrides file is intact; it says nothing about whether
|
|
141
|
+
// the lockfile still honours it. Verifying that here is what turns a push-time CI failure into a
|
|
142
|
+
// local one: `trustLockfile: true` (distributed in pnpm-workspace.yaml) makes
|
|
143
|
+
// `pnpm install --frozen-lockfile` pass locally on the very lockfile CI refuses to install, so no
|
|
144
|
+
// existing local gate covers the case (kit #744). Exits non-zero — the tree as it stands cannot be
|
|
145
|
+
// installed by CI, so continuing the chain would only build on a broken lockfile.
|
|
146
|
+
//
|
|
147
|
+
// Reads the overrides back off disk rather than reusing the pre-update snapshot: CI resolves against
|
|
148
|
+
// the files as committed, so a run that also moved an override must be judged against the new value.
|
|
149
|
+
function report_lockfile_overrides(): void {
|
|
150
|
+
const lockfile = file_reader.read_file_or_empty(LOCKFILE_PATH)
|
|
151
|
+
const overrides = overrides_files.read_current_overrides()
|
|
152
|
+
const mismatches = lockfile_overrides.find_specifier_mismatches(lockfile, overrides)
|
|
153
|
+
|
|
154
|
+
if (mismatches.length === 0) return
|
|
155
|
+
|
|
156
|
+
console.error(`\n✖ ${LOCKFILE_PATH} no longer honours the overrides — CI cannot install it:`)
|
|
157
|
+
|
|
158
|
+
for (const line of lockfile_overrides.format_mismatch_lines(mismatches)) {
|
|
159
|
+
console.error(line)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
console.error(`\n Restore it with: git checkout HEAD -- ${LOCKFILE_PATH} && pnpm install`)
|
|
163
|
+
process.exitCode = 1
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function main(): void {
|
|
167
|
+
const snapshot = take_snapshot()
|
|
168
|
+
const overrides = overrides_files.read_current_overrides()
|
|
169
|
+
|
|
170
|
+
report_excluded(overrides_check.list_excluded_package_names(overrides))
|
|
171
|
+
|
|
172
|
+
const outcome = update_without_downgrading(snapshot)
|
|
173
|
+
|
|
174
|
+
report_overrides(overrides)
|
|
175
|
+
report_lockfile_overrides()
|
|
176
|
+
|
|
177
|
+
// Skipped after a rollback so the tree really is left exactly as it was found — this sync writes
|
|
178
|
+
// package.json to advance the pinned safe-chain version, which would contradict the notice that
|
|
179
|
+
// nothing changed.
|
|
180
|
+
if (outcome.status === 0 && !outcome.is_rolled_back) {
|
|
181
|
+
preinstall_version_update.sync(PACKAGE_JSON_PATH)
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
186
|
+
|
|
187
|
+
const latest_update = {
|
|
188
|
+
run,
|
|
189
|
+
main,
|
|
190
|
+
build_update_commands,
|
|
191
|
+
run_update_stages,
|
|
192
|
+
update_without_downgrading,
|
|
193
|
+
take_snapshot,
|
|
194
|
+
restore_snapshot,
|
|
195
|
+
report_lockfile_overrides,
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export { latest_update }
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
// Capture everything after `pnpm@` verbatim — prerelease identifier AND the
|
|
4
|
+
// `+<hash>` integrity suffix that `corepack use` always writes. pnpm compares
|
|
5
|
+
// `packageManager` and `devEngines.packageManager.version` as raw strings, so
|
|
6
|
+
// dropping the suffix here would make an exact match impossible and the
|
|
7
|
+
// dual-declaration warning permanent (see the alignment comment below).
|
|
8
|
+
const PNPM_PIN_REGEX = /^pnpm@(.+)$/u
|
|
9
|
+
|
|
10
|
+
// Surgical replacements that touch only the `devEngines.packageManager.version`
|
|
11
|
+
// value, preserving the rest of the file's formatting byte-for-byte. Two key
|
|
12
|
+
// orders are supported because a hand-edited consumer manifest may list either
|
|
13
|
+
// `name` or `version` first.
|
|
14
|
+
const DEV_ENGINES_NAME_FIRST_REGEX = /("name":\s*"pnpm"\s*,\s*"version":\s*")[^"]+(")/u
|
|
15
|
+
const DEV_ENGINES_VERSION_FIRST_REGEX = /("version":\s*")[^"]+("\s*,\s*"name":\s*"pnpm")/u
|
|
16
|
+
|
|
17
|
+
const optional_version_schema = z.object({ version: z.string().optional() }).optional()
|
|
18
|
+
|
|
19
|
+
const alignment_read_schema = z.object({
|
|
20
|
+
packageManager: z.string().optional(),
|
|
21
|
+
devEngines: z
|
|
22
|
+
.object({
|
|
23
|
+
packageManager: optional_version_schema,
|
|
24
|
+
})
|
|
25
|
+
.optional(),
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
type AlignmentManifest = z.infer<typeof alignment_read_schema>
|
|
29
|
+
|
|
30
|
+
function extract_pnpm_pin(package_manager: string): string | undefined {
|
|
31
|
+
return PNPM_PIN_REGEX.exec(package_manager)?.[1]
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function read_current_version(parsed: AlignmentManifest): string | undefined {
|
|
35
|
+
return parsed.devEngines?.packageManager?.version
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Return the value that `devEngines.packageManager.version` should adopt, or
|
|
39
|
+
// undefined when there is nothing to align: no `packageManager`, no existing
|
|
40
|
+
// `devEngines.packageManager`, or the two already match.
|
|
41
|
+
function resolve_alignment_target(parsed: AlignmentManifest): string | undefined {
|
|
42
|
+
if (parsed.packageManager === undefined) return undefined
|
|
43
|
+
const target = extract_pnpm_pin(parsed.packageManager)
|
|
44
|
+
const current = read_current_version(parsed)
|
|
45
|
+
if (current === undefined || current === target) return undefined
|
|
46
|
+
|
|
47
|
+
return target
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Surgically set `devEngines.packageManager.version` to `target`, preserving the
|
|
51
|
+
// rest of the file byte-for-byte. Returns the content unchanged when there is no
|
|
52
|
+
// `devEngines.packageManager` block to update.
|
|
53
|
+
// Replacer used with `String#replace` so the captured prefix/suffix are re-emitted
|
|
54
|
+
// around `target` literally — a `$` inside `target` is never read as a replacement
|
|
55
|
+
// pattern.
|
|
56
|
+
function set_development_engines_version(content: string, target: string): string {
|
|
57
|
+
if (DEV_ENGINES_NAME_FIRST_REGEX.test(content)) {
|
|
58
|
+
return content.replace(
|
|
59
|
+
DEV_ENGINES_NAME_FIRST_REGEX,
|
|
60
|
+
(_match: string, prefix: string, suffix: string) => `${prefix}${target}${suffix}`,
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (DEV_ENGINES_VERSION_FIRST_REGEX.test(content)) {
|
|
65
|
+
return content.replace(
|
|
66
|
+
DEV_ENGINES_VERSION_FIRST_REGEX,
|
|
67
|
+
(_match: string, prefix: string, suffix: string) => `${prefix}${target}${suffix}`,
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return content
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Align `devEngines.packageManager.version` with the whole pin carried by the
|
|
75
|
+
// `packageManager` field — integrity suffix included — so pnpm 11.5.0+
|
|
76
|
+
// (pnpm/pnpm#11307) suppresses the "Cannot use both ..." warning. Only a
|
|
77
|
+
// byte-identical value silences it: pnpm 11.18.0 still warns for
|
|
78
|
+
// `pnpm@11.18.0+sha512...` paired with a bare `11.18.0`. The suffix is semver
|
|
79
|
+
// build metadata, which range checks ignore, so corepack and pnpm both still
|
|
80
|
+
// resolve the pin as `11.18.0`.
|
|
81
|
+
function align_development_engines_version(content: string): string {
|
|
82
|
+
const parsed = alignment_read_schema.parse(JSON.parse(content))
|
|
83
|
+
const target = resolve_alignment_target(parsed)
|
|
84
|
+
if (target === undefined) return content
|
|
85
|
+
|
|
86
|
+
return set_development_engines_version(content, target)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const package_manager_version = {
|
|
90
|
+
extract_pnpm_pin,
|
|
91
|
+
align_development_engines_version,
|
|
92
|
+
set_development_engines_version,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export { package_manager_version }
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Parse JSON without throwing: returns the parsed value, or undefined when the input is not valid
|
|
2
|
+
// JSON. Single source for the version commands that read package.json / CLI output and hand the
|
|
3
|
+
// result to a schema's `safeParse` (running-binary, version-targets, effective-upstream), so the
|
|
4
|
+
// permissive-parse behavior is defined once rather than re-cloned per reader.
|
|
5
|
+
function safe_json_parse(raw: string): unknown {
|
|
6
|
+
try {
|
|
7
|
+
return JSON.parse(raw)
|
|
8
|
+
} catch {
|
|
9
|
+
return undefined
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { safe_json_parse }
|