@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 { existsSync, readFileSync } from 'node:fs'
|
|
2
|
+
import { createRequire } from 'node:module'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { package_named_version_schema } from '#scripts/lib/schemas'
|
|
5
|
+
import { safe_json_parse } from './parse-json'
|
|
6
|
+
|
|
7
|
+
const PACKAGE_JSON = 'package.json'
|
|
8
|
+
// Node module paths never nest anywhere near this deep; the bound only guards against an unexpected
|
|
9
|
+
// filesystem cycle so the walk-up cannot loop forever.
|
|
10
|
+
const MAX_WALK_DEPTH = 64
|
|
11
|
+
|
|
12
|
+
// Options for `resolve_effective_upstream_version`. `resolve_marker` is a subpath specifier used for
|
|
13
|
+
// `createRequire().resolve()` when the package root itself is not directly resolvable — e.g. kit does
|
|
14
|
+
// not list `package.json` (nor a `.` entry) in `exports`, so a subpath like
|
|
15
|
+
// `@joshuafolkken/kit/config-merge` is resolved instead and the walk-up finds the root from there.
|
|
16
|
+
interface EffectiveUpstreamOptions {
|
|
17
|
+
resolve_marker?: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Read the `version` from a package.json only when its `name` matches the target package — undefined
|
|
21
|
+
// when the file is missing, malformed, or belongs to a different (e.g. nested) package. Matching by
|
|
22
|
+
// name is what lets the walk-up skip intermediate package.json files and land on the true root.
|
|
23
|
+
function read_matching_version(manifest_path: string, package_name: string): string | undefined {
|
|
24
|
+
if (!existsSync(manifest_path)) return undefined
|
|
25
|
+
const parsed = package_named_version_schema.safeParse(
|
|
26
|
+
safe_json_parse(readFileSync(manifest_path, 'utf8')),
|
|
27
|
+
)
|
|
28
|
+
if (!parsed.success) return undefined
|
|
29
|
+
if (parsed.data.name !== package_name) return undefined
|
|
30
|
+
|
|
31
|
+
return parsed.data.version
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// The directory itself and each of its ancestors up to the filesystem root, nearest-first. Bounded
|
|
35
|
+
// by MAX_WALK_DEPTH so an unexpected filesystem cycle cannot produce an unbounded list.
|
|
36
|
+
function ancestor_directories(start_directory: string): Array<string> {
|
|
37
|
+
const directories: Array<string> = []
|
|
38
|
+
let current = start_directory
|
|
39
|
+
|
|
40
|
+
for (let depth = 0; depth < MAX_WALK_DEPTH; depth += 1) {
|
|
41
|
+
directories.push(current)
|
|
42
|
+
const parent = path.dirname(current)
|
|
43
|
+
if (parent === current) break
|
|
44
|
+
current = parent
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return directories
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Walk up from a resolved file's directory to the package root, returning the version of the first
|
|
51
|
+
// ancestor package.json whose `name` matches the target — or undefined when no matching root exists.
|
|
52
|
+
function walk_up_for_version(start_directory: string, package_name: string): string | undefined {
|
|
53
|
+
for (const directory of ancestor_directories(start_directory)) {
|
|
54
|
+
const version = read_matching_version(path.join(directory, PACKAGE_JSON), package_name)
|
|
55
|
+
if (version !== undefined) return version
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return undefined
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Resolve the package (or its marker subpath) relative to `base_url`, returning the absolute file
|
|
62
|
+
// path require lands on — or undefined when the specifier cannot be resolved from that base.
|
|
63
|
+
function resolve_from_base(
|
|
64
|
+
base_url: string,
|
|
65
|
+
package_name: string,
|
|
66
|
+
resolve_marker: string | undefined,
|
|
67
|
+
): string | undefined {
|
|
68
|
+
try {
|
|
69
|
+
return createRequire(base_url).resolve(resolve_marker ?? package_name)
|
|
70
|
+
} catch {
|
|
71
|
+
return undefined
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Resolve `package_name` relative to `base_url` (a module URL — e.g. the running binary's
|
|
76
|
+
// `import.meta.url`, or an upstream package.json URL) and return the `version` from that package's
|
|
77
|
+
// root package.json: the upstream version *effectively* loaded when running from `base_url`, resolved
|
|
78
|
+
// via `createRequire` + walk-up-to-root (matching by name). Returns undefined — never throwing — when
|
|
79
|
+
// the package is absent or unresolvable. Pass `options.resolve_marker` (a subpath specifier) when the
|
|
80
|
+
// package root is not directly `require.resolve`-able because its package.json is not in `exports`.
|
|
81
|
+
function resolve_effective_upstream_version(
|
|
82
|
+
base_url: string,
|
|
83
|
+
package_name: string,
|
|
84
|
+
options: EffectiveUpstreamOptions = {},
|
|
85
|
+
): string | undefined {
|
|
86
|
+
const resolved = resolve_from_base(base_url, package_name, options.resolve_marker)
|
|
87
|
+
if (resolved === undefined) return undefined
|
|
88
|
+
|
|
89
|
+
return walk_up_for_version(path.dirname(resolved), package_name)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export type { EffectiveUpstreamOptions }
|
|
93
|
+
export { resolve_effective_upstream_version }
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Public entry point for the parameterized version-command library (`@joshuafolkken/kit/version`).
|
|
2
|
+
// Consumers (kit, jgame, app-kit) build a config with `create_version_command_config` and drive
|
|
3
|
+
// their `version` / `version:upgrade` commands through `version_commands`, passing only their own
|
|
4
|
+
// package name (endpoints are derived) plus an optional upstream chain, e.g.
|
|
5
|
+
// `upstreams: [kit_package_descriptor]` for app-kit.
|
|
6
|
+
export { KIT_PACKAGE_NAME, kit_package_descriptor } from './kit-descriptor'
|
|
7
|
+
export type {
|
|
8
|
+
PackageVersionConfig,
|
|
9
|
+
UpstreamDescriptor,
|
|
10
|
+
UpstreamHookContext,
|
|
11
|
+
VersionCommandConfig,
|
|
12
|
+
VersionCommandConfigOptions,
|
|
13
|
+
} from './version-command-config'
|
|
14
|
+
export type {
|
|
15
|
+
ReleaseHold,
|
|
16
|
+
VersionSnapshot,
|
|
17
|
+
RunningBinary,
|
|
18
|
+
UpstreamReport,
|
|
19
|
+
VersionOutputExtras,
|
|
20
|
+
} from './version-check-logic'
|
|
21
|
+
export type { InstalledVersions } from './upgrade-command-guard'
|
|
22
|
+
export { create_version_command_config, derive_versions_endpoint } from './version-command-config'
|
|
23
|
+
export type { EffectiveUpstreamOptions } from './effective-upstream'
|
|
24
|
+
export { resolve_effective_upstream_version } from './effective-upstream'
|
|
25
|
+
export { version_commands } from './version-commands'
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { UpstreamDescriptor } from './version-command-config'
|
|
2
|
+
|
|
3
|
+
const KIT_PACKAGE_NAME = '@joshuafolkken/kit'
|
|
4
|
+
|
|
5
|
+
// Kit's own upstream descriptor. Downstream consumers (app-kit, game-kit) declare kit in their
|
|
6
|
+
// `upstreams` chain through this constant instead of hardcoding kit's package name or endpoint.
|
|
7
|
+
// Kept in its own module so importing it never pulls in kit's doctor-dependent config.
|
|
8
|
+
const kit_package_descriptor: UpstreamDescriptor = { package_name: KIT_PACKAGE_NAME }
|
|
9
|
+
|
|
10
|
+
export { KIT_PACKAGE_NAME, kit_package_descriptor }
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { doctor_io } from '#scripts/doctor/doctor-io'
|
|
4
|
+
import { doctor_logic } from '#scripts/doctor/doctor-logic'
|
|
5
|
+
import { KIT_PACKAGE_NAME } from './kit-descriptor'
|
|
6
|
+
import { create_version_command_config, type VersionCommandConfig } from './version-command-config'
|
|
7
|
+
|
|
8
|
+
const SELF_DIRECTORY = path.dirname(fileURLToPath(import.meta.url))
|
|
9
|
+
|
|
10
|
+
// Warn when the `josh` first on PATH is not the pnpm-global install (a stale shim shadowing it),
|
|
11
|
+
// pointing at the `doctor --fix` recovery command. This is kit-specific (keyed off the `josh`
|
|
12
|
+
// binary), so it lives in kit's config rather than the package-agnostic library.
|
|
13
|
+
function read_shadow_warning(): string | undefined {
|
|
14
|
+
const path_josh = doctor_io.resolve_path_josh()
|
|
15
|
+
const global_josh = doctor_io.resolve_pnpm_global_josh()
|
|
16
|
+
if (path_josh === undefined || global_josh === undefined) return undefined
|
|
17
|
+
if (!doctor_logic.is_shadowed(path_josh, global_josh)) return undefined
|
|
18
|
+
|
|
19
|
+
return doctor_logic.format_shadow_warning(path_josh, global_josh)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Kit sits at the top of the version chain, so it declares no upstreams and its endpoint is
|
|
23
|
+
// derived from the package name — `josh v` / `josh vu` behavior is unchanged.
|
|
24
|
+
const kit_version_config: VersionCommandConfig = create_version_command_config({
|
|
25
|
+
package_name: KIT_PACKAGE_NAME,
|
|
26
|
+
self_directory: SELF_DIRECTORY,
|
|
27
|
+
resolve_warning: read_shadow_warning,
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
export { kit_version_config }
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Bump pnpm via `pnpm self-update` to the newest release on the project's CURRENT major.
|
|
4
|
+
*
|
|
5
|
+
* The target version is resolved from the registry's publish timestamps
|
|
6
|
+
* (`pnpm view pnpm time --json`) instead of a dist-tag, because pnpm publishes its
|
|
7
|
+
* per-major tag `latest-<major>` only for SUPERSEDED majors — while <major> is the newest
|
|
8
|
+
* major, the only tag covering it is `latest` (kit#750). The former `latest-<major>` pin
|
|
9
|
+
* (kit#444) therefore failed on every run in the common case, and `latest` itself can
|
|
10
|
+
* momentarily point below the devEngines floor. Picking the newest registry version whose
|
|
11
|
+
* major equals the `packageManager` pin keeps both invariants: never below the adopted
|
|
12
|
+
* major, and advancing while that major is the current one.
|
|
13
|
+
*
|
|
14
|
+
* The `minimum-release-age` quarantine is applied natively from `.npmrc` (kit#768).
|
|
15
|
+
* safe-chain filters the registry only when the process tree was launched through one of
|
|
16
|
+
* its wrapped shell commands, so `josh latest` and `pnpm josh latest` used to resolve
|
|
17
|
+
* different answers and the pin oscillated. Reading the window from the repo-managed
|
|
18
|
+
* `.npmrc` and filtering by publish timestamp makes the resolution identical in every
|
|
19
|
+
* invocation context; right after a pnpm release the answer is simply the previous
|
|
20
|
+
* release, exactly as the filtered view behaved.
|
|
21
|
+
*
|
|
22
|
+
* The resolved version is floored at the current `packageManager` pin: a filtered registry
|
|
23
|
+
* view legitimately answers below a freshly adopted pin for the first 24 hours after every
|
|
24
|
+
* pnpm release, and writing that answer would downgrade the protected toolchain pin
|
|
25
|
+
* (kit#766). Not-newer answers skip the bump non-fatally instead.
|
|
26
|
+
*
|
|
27
|
+
* `devEngines.packageManager.version` is realigned with the `packageManager` pin on every
|
|
28
|
+
* path — bumped, skipped, or unresolvable (kit#773). Alignment used to run only after a
|
|
29
|
+
* successful bump, which never fires in the steady state of an up-to-date repository, so a
|
|
30
|
+
* manifest that arrived with the two fields out of step kept the pnpm dual-declaration
|
|
31
|
+
* warning forever. The alignment is idempotent, so running it unconditionally is free.
|
|
32
|
+
*
|
|
33
|
+
* Registry and pnpm failures stay non-fatal: they are logged and swallowed (exit 0)
|
|
34
|
+
* so the rest of the `josh latest` chain (`latest:update`, `audit`) keeps running.
|
|
35
|
+
*
|
|
36
|
+
* Usage: tsx scripts/version/latest-corepack.ts
|
|
37
|
+
*/
|
|
38
|
+
import { readFileSync, writeFileSync } from 'node:fs'
|
|
39
|
+
import { fileURLToPath } from 'node:url'
|
|
40
|
+
import { execaSync } from 'execa'
|
|
41
|
+
import semver from 'semver'
|
|
42
|
+
import { z } from 'zod'
|
|
43
|
+
import { package_manager_version } from './package-manager-version'
|
|
44
|
+
import { safe_json_parse } from './parse-json'
|
|
45
|
+
import { release_age } from './release-age'
|
|
46
|
+
|
|
47
|
+
const PACKAGE_JSON_PATH = 'package.json'
|
|
48
|
+
const PACKAGE_MANAGER_RE = /"packageManager"\s*:\s*"pnpm@(\d+)(?:[^\d]|$)/u
|
|
49
|
+
const PINNED_VERSION_RE = /"packageManager"\s*:\s*"pnpm@([^"+]+)/u
|
|
50
|
+
const TARGET_PREFIX = 'pnpm@'
|
|
51
|
+
const FAILURE_EXIT_CODE = 1
|
|
52
|
+
const NPMRC_PATH = '.npmrc'
|
|
53
|
+
const VIEW_TIMEOUT_MS = 30_000
|
|
54
|
+
const SHA512_BYTES = 64
|
|
55
|
+
const INTEGRITY_RE = /^sha512-([A-Za-z0-9+/]+={0,2})$/u
|
|
56
|
+
const PACKAGE_MANAGER_VALUE_RE = /("packageManager"\s*:\s*")pnpm@[^"]+(")/u
|
|
57
|
+
const PNPM_DEVELOPMENT_MANAGER_SCHEMA = z.object({ name: z.literal('pnpm'), version: z.string() })
|
|
58
|
+
const DEV_ENGINES_SCHEMA = z.object({ packageManager: PNPM_DEVELOPMENT_MANAGER_SCHEMA })
|
|
59
|
+
const DEV_ENGINES_PNPM_SCHEMA = z.object({ devEngines: DEV_ENGINES_SCHEMA.optional() })
|
|
60
|
+
|
|
61
|
+
function extract_development_engines_version(package_json_content: string): string | undefined {
|
|
62
|
+
const parsed = DEV_ENGINES_PNPM_SCHEMA.safeParse(safe_json_parse(package_json_content))
|
|
63
|
+
|
|
64
|
+
return parsed.success ? parsed.data.devEngines?.packageManager.version : undefined
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function extract_pnpm_major(package_json_content: string): string | undefined {
|
|
68
|
+
const pin_major = PACKAGE_MANAGER_RE.exec(package_json_content)?.[1]
|
|
69
|
+
if (pin_major !== undefined) return pin_major
|
|
70
|
+
const version = extract_development_engines_version(package_json_content)
|
|
71
|
+
if (version === undefined) return undefined
|
|
72
|
+
|
|
73
|
+
return semver.minVersion(version)?.major.toString()
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function exact_pinned_version(raw: string | undefined): string | undefined {
|
|
77
|
+
if (raw === undefined) return undefined
|
|
78
|
+
|
|
79
|
+
return semver.valid(raw) ?? undefined
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// The full pinned version (e.g. 11.20.0), stripped of the `+sha512…` integrity suffix.
|
|
83
|
+
// Returns undefined for an absent pin or a bare-major shorthand (`pnpm@11`) — neither can
|
|
84
|
+
// anchor a comparison, so the floor below simply does not apply.
|
|
85
|
+
function extract_pinned_version(package_json_content: string): string | undefined {
|
|
86
|
+
const package_pin = PINNED_VERSION_RE.exec(package_json_content)?.[1]
|
|
87
|
+
if (package_pin !== undefined) return exact_pinned_version(package_pin)
|
|
88
|
+
const development_pin = extract_development_engines_version(package_json_content)
|
|
89
|
+
|
|
90
|
+
return exact_pinned_version(development_pin?.split('+', 1)[0])
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Never move the pin backwards. A filtered registry view (safe-chain's minimum-release-age
|
|
94
|
+
// proxy) answers below a freshly adopted pin for 24 hours after every pnpm release, and an
|
|
95
|
+
// equal answer would only rewrite the same value — both skip instead (kit#766).
|
|
96
|
+
function is_target_not_newer_than_pin(target: string, pinned_version: string | undefined): boolean {
|
|
97
|
+
if (pinned_version === undefined) return false
|
|
98
|
+
const target_version = target.slice(TARGET_PREFIX.length)
|
|
99
|
+
if (semver.valid(target_version) === null) return false
|
|
100
|
+
|
|
101
|
+
return semver.lte(target_version, pinned_version)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// `pnpm view` shares stdout with non-JSON noise (the safe-chain age-filter notice prints
|
|
105
|
+
// there too), so cut the payload down to the outermost braces before parsing.
|
|
106
|
+
function extract_times_json(stdout: string): Record<string, string> | undefined {
|
|
107
|
+
const start = stdout.indexOf('{')
|
|
108
|
+
const end = stdout.lastIndexOf('}')
|
|
109
|
+
if (start === -1 || end <= start) return undefined
|
|
110
|
+
const parsed = release_age.release_times_schema.safeParse(
|
|
111
|
+
safe_json_parse(stdout.slice(start, end + 1)),
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
return parsed.success ? parsed.data : undefined
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// The registry's publish timestamps for every pnpm release (version → ISO date, plus the
|
|
118
|
+
// created/modified bookkeeping keys the selector ignores).
|
|
119
|
+
function query_release_times(): Record<string, string> | undefined {
|
|
120
|
+
const result = execaSync('pnpm', ['view', 'pnpm', 'time', '--json'], {
|
|
121
|
+
reject: false,
|
|
122
|
+
timeout: VIEW_TIMEOUT_MS,
|
|
123
|
+
})
|
|
124
|
+
if ((result.exitCode ?? FAILURE_EXIT_CODE) !== 0) return undefined
|
|
125
|
+
|
|
126
|
+
return extract_times_json(result.stdout)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Ask the registry for the newest pnpm release on the pinned major that has aged past the
|
|
130
|
+
// quarantine window. Returns undefined when the query fails or nothing qualifies yet.
|
|
131
|
+
function query_major_latest_version(major: string): string | undefined {
|
|
132
|
+
const times = query_release_times()
|
|
133
|
+
if (times === undefined) return undefined
|
|
134
|
+
|
|
135
|
+
// The project's own `.npmrc`, deliberately not the upward walk the version check uses: `josh
|
|
136
|
+
// latest` reads `package.json` and writes the pnpm pin relative to the working directory, so it
|
|
137
|
+
// has no subdirectory case — and honouring a user-level policy here could freeze pnpm bumps in a
|
|
138
|
+
// project that declares none (joshuafolkken/kit#808).
|
|
139
|
+
return release_age.select_aged_version(
|
|
140
|
+
times,
|
|
141
|
+
major,
|
|
142
|
+
release_age.read_minimum_release_age(NPMRC_PATH),
|
|
143
|
+
Date.now(),
|
|
144
|
+
)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function parse_latest_version(stdout: string): string | undefined {
|
|
148
|
+
const version = /"(\d+\.\d+\.\d+(?:-[A-Za-z0-9.-]+)?)"/u.exec(stdout)?.[1]
|
|
149
|
+
if (version === undefined) return undefined
|
|
150
|
+
|
|
151
|
+
return semver.valid(version) ?? undefined
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function query_latest_version(): string | undefined {
|
|
155
|
+
const result = execaSync('pnpm', ['view', 'pnpm', 'version', '--json'], {
|
|
156
|
+
reject: false,
|
|
157
|
+
timeout: VIEW_TIMEOUT_MS,
|
|
158
|
+
})
|
|
159
|
+
if ((result.exitCode ?? FAILURE_EXIT_CODE) !== 0) return undefined
|
|
160
|
+
|
|
161
|
+
return parse_latest_version(result.stdout)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// The value handed to pnpm self-update: an exact registry-resolved version on the pinned
|
|
165
|
+
// major, the latest exact version when no major can be read from package.json, or undefined when
|
|
166
|
+
// the registry could not answer (the caller skips non-fatally).
|
|
167
|
+
function resolve_corepack_target(major: string | undefined): string | undefined {
|
|
168
|
+
const version = major === undefined ? query_latest_version() : query_major_latest_version(major)
|
|
169
|
+
if (version === undefined) return undefined
|
|
170
|
+
|
|
171
|
+
return `pnpm@${version}`
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Non-fatal skip message shared by both skip paths: keep the josh latest chain
|
|
175
|
+
// (latest:update, audit) running instead of aborting on a bump failure.
|
|
176
|
+
function warn_skip(reason: string): void {
|
|
177
|
+
console.warn(`⚠ Skipped pnpm bump (${reason}); the chain continues.`)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function warn_unresolved(major: string | undefined): void {
|
|
181
|
+
warn_skip(`no pnpm ${major ?? ''} release resolvable from the registry`)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function run_pnpm_update(target: string): number {
|
|
185
|
+
const version = target.slice(TARGET_PREFIX.length)
|
|
186
|
+
|
|
187
|
+
console.info(`\n▶ pnpm self-update ${version}`)
|
|
188
|
+
|
|
189
|
+
const result = execaSync('pnpm', ['self-update', version], { stdio: 'inherit', reject: false })
|
|
190
|
+
|
|
191
|
+
return result.exitCode ?? FAILURE_EXIT_CODE
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// The target is an already-resolved exact version, so a non-zero status here is a
|
|
195
|
+
// genuine pnpm or network failure; a later run retries. Returns whether a skip
|
|
196
|
+
// happened.
|
|
197
|
+
function did_warn_skip(status: number): boolean {
|
|
198
|
+
if (status === 0) return false
|
|
199
|
+
|
|
200
|
+
warn_skip(`pnpm self-update exited ${String(status)}`)
|
|
201
|
+
|
|
202
|
+
return true
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Realign `devEngines.packageManager.version` with the `packageManager` pin so the two
|
|
206
|
+
// fields keep matching (pnpm suppresses the dual-declaration warning only on an exact
|
|
207
|
+
// match). Runs on every path, not just after a successful bump: a repository that arrives
|
|
208
|
+
// with the two fields already out of step sits in the no-bump steady state forever, so an
|
|
209
|
+
// alignment gated on a bump would never repair it (kit#773).
|
|
210
|
+
function sync_development_engines(package_json_path: string = PACKAGE_JSON_PATH): void {
|
|
211
|
+
const content = readFileSync(package_json_path, 'utf8')
|
|
212
|
+
const aligned = package_manager_version.align_development_engines_version(content)
|
|
213
|
+
if (aligned === content) return
|
|
214
|
+
|
|
215
|
+
writeFileSync(package_json_path, aligned)
|
|
216
|
+
console.info('✔ Synced devEngines.packageManager.version to the packageManager pin')
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Restore the pre-run manifest if self-update fails after changing it.
|
|
220
|
+
function restore_package_json(
|
|
221
|
+
content: string,
|
|
222
|
+
package_json_path: string = PACKAGE_JSON_PATH,
|
|
223
|
+
): void {
|
|
224
|
+
writeFileSync(package_json_path, content)
|
|
225
|
+
console.info('✔ Restored package.json pin (pnpm bump skipped)')
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function decode_integrity(encoded: string): string | undefined {
|
|
229
|
+
const bytes = Buffer.from(encoded, 'base64')
|
|
230
|
+
if (bytes.length !== SHA512_BYTES) return undefined
|
|
231
|
+
if (bytes.toString('base64') !== encoded) return undefined
|
|
232
|
+
|
|
233
|
+
return `sha512.${bytes.toString('hex')}`
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function extract_encoded_integrity(stdout: string): string | undefined {
|
|
237
|
+
const payload = /"sha512-[A-Za-z0-9+/]+={0,2}"/u.exec(stdout)?.[0]
|
|
238
|
+
if (payload === undefined) return undefined
|
|
239
|
+
const parsed: unknown = safe_json_parse(payload)
|
|
240
|
+
if (typeof parsed !== 'string') return undefined
|
|
241
|
+
|
|
242
|
+
return INTEGRITY_RE.exec(parsed)?.[1]
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function query_integrity(target: string): string | undefined {
|
|
246
|
+
const result = execaSync('pnpm', ['view', target, 'dist.integrity', '--json'], {
|
|
247
|
+
reject: false,
|
|
248
|
+
timeout: VIEW_TIMEOUT_MS,
|
|
249
|
+
})
|
|
250
|
+
if ((result.exitCode ?? FAILURE_EXIT_CODE) !== 0) return undefined
|
|
251
|
+
|
|
252
|
+
const encoded = extract_encoded_integrity(result.stdout)
|
|
253
|
+
if (encoded === undefined) return undefined
|
|
254
|
+
|
|
255
|
+
return decode_integrity(encoded)
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function restore_integrity(target: string, integrity: string): void {
|
|
259
|
+
const content = readFileSync(PACKAGE_JSON_PATH, 'utf8')
|
|
260
|
+
const version = target.slice(TARGET_PREFIX.length)
|
|
261
|
+
const expected = `pnpm@${version}`
|
|
262
|
+
const current = PACKAGE_MANAGER_VALUE_RE.exec(content)?.[0]
|
|
263
|
+
|
|
264
|
+
if (current?.endsWith(`${expected}"`) !== true) {
|
|
265
|
+
throw new Error(`pnpm self-update did not pin ${expected}`)
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
const pinned = content.replace(
|
|
269
|
+
PACKAGE_MANAGER_VALUE_RE,
|
|
270
|
+
(_match: string, prefix: string, suffix: string) => {
|
|
271
|
+
return `${prefix}${expected}+${integrity}${suffix}`
|
|
272
|
+
},
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
writeFileSync(
|
|
276
|
+
PACKAGE_JSON_PATH,
|
|
277
|
+
package_manager_version.align_development_engines_version(pinned),
|
|
278
|
+
)
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// The equal case is the steady state of every up-to-date run, so it logs as success; only
|
|
282
|
+
// an answer strictly below the pin is the anomaly worth a warning (kit#766).
|
|
283
|
+
function notify_skipped_bump(target: string, pinned_version: string): void {
|
|
284
|
+
if (target === `${TARGET_PREFIX}${pinned_version}`) {
|
|
285
|
+
console.info(`✔ pnpm pin ${pinned_version} already matches the newest registry release.`)
|
|
286
|
+
|
|
287
|
+
return
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
warn_skip(`registry answered ${target}, below the pinned ${pinned_version}`)
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Resolve the pnpm target with the pin floor applied. Undefined means the bump was
|
|
294
|
+
// skipped and the reason has already been logged.
|
|
295
|
+
function resolve_floored_target(original: string, major: string | undefined): string | undefined {
|
|
296
|
+
const target = resolve_corepack_target(major)
|
|
297
|
+
|
|
298
|
+
if (target === undefined) {
|
|
299
|
+
warn_unresolved(major)
|
|
300
|
+
|
|
301
|
+
return undefined
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
const pinned_version = extract_pinned_version(original)
|
|
305
|
+
if (!is_target_not_newer_than_pin(target, pinned_version)) return target
|
|
306
|
+
|
|
307
|
+
notify_skipped_bump(target, pinned_version ?? '')
|
|
308
|
+
|
|
309
|
+
return undefined
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
function restore_after_update(original: string, target: string, integrity: string): void {
|
|
313
|
+
try {
|
|
314
|
+
restore_integrity(target, integrity)
|
|
315
|
+
} catch {
|
|
316
|
+
restore_package_json(original)
|
|
317
|
+
warn_skip('pnpm self-update wrote an unexpected pin')
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
function pin_unpinned_manifest(original: string, target: string, integrity: string): void {
|
|
322
|
+
const manifest = z.record(z.string(), z.unknown()).parse(safe_json_parse(original))
|
|
323
|
+
const pinned = JSON.stringify(
|
|
324
|
+
{ ...manifest, packageManager: `${target}+${integrity}` },
|
|
325
|
+
undefined,
|
|
326
|
+
'\t',
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
writeFileSync(
|
|
330
|
+
PACKAGE_JSON_PATH,
|
|
331
|
+
package_manager_version.align_development_engines_version(`${pinned}\n`),
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
const result = execaSync('pnpm', ['--version'], { reject: false })
|
|
335
|
+
if (result.exitCode === 0 && result.stdout.trim() === target.slice(TARGET_PREFIX.length)) return
|
|
336
|
+
|
|
337
|
+
restore_package_json(original)
|
|
338
|
+
warn_skip('the newly pinned pnpm version could not start')
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
function update_pinned_manifest(original: string, target: string, integrity: string): void {
|
|
342
|
+
const is_skipped = did_warn_skip(run_pnpm_update(target))
|
|
343
|
+
|
|
344
|
+
if (is_skipped) {
|
|
345
|
+
restore_package_json(original)
|
|
346
|
+
|
|
347
|
+
return
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
restore_after_update(original, target, integrity)
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Query integrity before mutating the manifest; self-update writes both pins without it.
|
|
354
|
+
function bump_package_manager(original: string, target: string): void {
|
|
355
|
+
const integrity = query_integrity(target)
|
|
356
|
+
|
|
357
|
+
if (integrity === undefined) {
|
|
358
|
+
warn_skip(`no integrity for ${target}`)
|
|
359
|
+
|
|
360
|
+
return
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
if (!PACKAGE_MANAGER_RE.test(original)) {
|
|
364
|
+
pin_unpinned_manifest(original, target, integrity)
|
|
365
|
+
|
|
366
|
+
return
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
update_pinned_manifest(original, target, integrity)
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
function main(): void {
|
|
373
|
+
const original = readFileSync(PACKAGE_JSON_PATH, 'utf8')
|
|
374
|
+
const major = extract_pnpm_major(original)
|
|
375
|
+
const target = resolve_floored_target(original, major)
|
|
376
|
+
if (target !== undefined) bump_package_manager(original, target)
|
|
377
|
+
|
|
378
|
+
sync_development_engines()
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
382
|
+
|
|
383
|
+
const latest_corepack = {
|
|
384
|
+
extract_pnpm_major,
|
|
385
|
+
extract_pinned_version,
|
|
386
|
+
is_target_not_newer_than_pin,
|
|
387
|
+
notify_skipped_bump,
|
|
388
|
+
extract_times_json,
|
|
389
|
+
query_release_times,
|
|
390
|
+
query_major_latest_version,
|
|
391
|
+
resolve_corepack_target,
|
|
392
|
+
warn_skip,
|
|
393
|
+
warn_unresolved,
|
|
394
|
+
run_pnpm_update,
|
|
395
|
+
query_integrity,
|
|
396
|
+
restore_integrity,
|
|
397
|
+
did_warn_skip,
|
|
398
|
+
sync_development_engines,
|
|
399
|
+
restore_package_json,
|
|
400
|
+
bump_package_manager,
|
|
401
|
+
main,
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
export { latest_corepack }
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { lane_paths, type LaneEnvironment } from '#scripts/lane/lane-paths'
|
|
4
|
+
|
|
5
|
+
// Refuse a dependency update inside a lane (joshuafolkken/kit#2135).
|
|
6
|
+
//
|
|
7
|
+
// `latest:scope` reads how long ago `josh latest` last finished, and that stamp is keyed to the
|
|
8
|
+
// project root. A lane is a linked work tree whose project root is its own directory, so a fresh
|
|
9
|
+
// lane has no stamp, is told `required`, and every lane would run its own dependency update — landing
|
|
10
|
+
// an unrelated lock-file diff on that child's pull request, where `/code-review` and CI attribute it
|
|
11
|
+
// to the child and the eslint cache key (`hashFiles('pnpm-lock.yaml')`) misses. `backlogrun-lanes.md`
|
|
12
|
+
// and `backlogrun-child.md` both forbid it in prose; this module is what stops it. It is the single
|
|
13
|
+
// source of both the `skip` reason `latest:scope` prints in a lane and the refusal `josh latest`
|
|
14
|
+
// prints, and it fronts the `josh latest` chain as `josh latest:guard` so the pnpm bump never mutates
|
|
15
|
+
// `package.json` before the refusal is reached.
|
|
16
|
+
const STAMP_NOTE =
|
|
17
|
+
'the josh latest stamp is keyed to the project root, so a fresh lane has no record and always reads as stale'
|
|
18
|
+
const PRIMARY_NOTE = 'run josh latest in the primary checkout, never in a lane'
|
|
19
|
+
const LANE_SCOPE_REASON = `inside a lane — ${STAMP_NOTE}; ${PRIMARY_NOTE}`
|
|
20
|
+
const LANE_REFUSAL = `josh latest is refused inside a lane — ${STAMP_NOTE}; ${PRIMARY_NOTE}`
|
|
21
|
+
const REFUSAL_EXIT_CODE = 1
|
|
22
|
+
|
|
23
|
+
// The path test that needs no git, so it is safe in a synchronous CLI: `lane_issue_of` reads the
|
|
24
|
+
// lane number off the directory name rather than parsing `git worktree list`.
|
|
25
|
+
function is_lane(cwd: string = process.cwd(), environment: LaneEnvironment = process.env): boolean {
|
|
26
|
+
return lane_paths.lane_issue_of(cwd, environment) !== undefined
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// `josh latest:guard` — the head of the `josh latest` chain. It exits non-zero inside a lane so the
|
|
30
|
+
// `&&`-joined steps after it (the pnpm bump, the dependency update, the audit) never run, and stays silent
|
|
31
|
+
// in the primary checkout so the chain proceeds.
|
|
32
|
+
function main(): void {
|
|
33
|
+
if (!is_lane()) return
|
|
34
|
+
|
|
35
|
+
console.error(LANE_REFUSAL)
|
|
36
|
+
process.exitCode = REFUSAL_EXIT_CODE
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const latest_lane_guard = {
|
|
40
|
+
LANE_REFUSAL,
|
|
41
|
+
LANE_SCOPE_REASON,
|
|
42
|
+
REFUSAL_EXIT_CODE,
|
|
43
|
+
is_lane,
|
|
44
|
+
main,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
48
|
+
|
|
49
|
+
export { latest_lane_guard }
|