@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,124 @@
|
|
|
1
|
+
import { line_targets } from '#scripts/lines/line-targets'
|
|
2
|
+
import { import_graph } from './import-graph'
|
|
3
|
+
import { refactor_lint, type CategoryResult } from './refactor-lint'
|
|
4
|
+
import { refactor_targets } from './refactor-targets'
|
|
5
|
+
|
|
6
|
+
// `josh refactor:scan` โ the command `prompts/refactoring.md` ยง4.1โยง4.3 now point to instead of
|
|
7
|
+
// describing the search by hand (joshuafolkken/kit#2180). It selects the target files, expands the
|
|
8
|
+
// scope along the import graph, asks the project's own eslint which refactoring candidates the scope
|
|
9
|
+
// holds, and answers whether any high- or medium-priority candidate remains.
|
|
10
|
+
//
|
|
11
|
+
// **It reports and never fails**, like `josh lines`: a candidate is work to do, not a gate to break,
|
|
12
|
+
// so the exit code stays 0 and the answer is the printed verdict token. Convergence counts the high-
|
|
13
|
+
// and medium-priority categories only; the one low-priority category (unused code) is reported but
|
|
14
|
+
// never counted, so `clear` means the scope is empty of high/medium candidates.
|
|
15
|
+
|
|
16
|
+
// The convergence vocabulary. `clear` is what ยง4.3's self-reported "no high- or medium-priority
|
|
17
|
+
// candidate left" loop exit becomes once a command answers it: a token a caller can read, not a claim.
|
|
18
|
+
// `error` is the third answer (joshuafolkken/kit#2180): the eslint run itself did not complete, so the
|
|
19
|
+
// scope's state is unknown โ kept distinct from `clear` so a failed scan is never read as converged.
|
|
20
|
+
const CLEAR = 'clear'
|
|
21
|
+
const CANDIDATES = 'candidates'
|
|
22
|
+
const ERROR = 'error'
|
|
23
|
+
|
|
24
|
+
interface ScanResult {
|
|
25
|
+
seed_count: number
|
|
26
|
+
scope_count: number
|
|
27
|
+
categories: ReadonlyArray<CategoryResult>
|
|
28
|
+
verdict: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Convergence counts high- and medium-priority candidates only: a low-priority finding (unused code)
|
|
32
|
+
// is reported but auto-implemented by nobody, so it never keeps the loop from reading `clear`.
|
|
33
|
+
function convergence_candidates(categories: ReadonlyArray<CategoryResult>): number {
|
|
34
|
+
return categories
|
|
35
|
+
.filter((category) => category.priority !== refactor_lint.LOW)
|
|
36
|
+
.reduce((sum, category) => sum + category.candidates.length, 0)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function verdict_token(categories: ReadonlyArray<CategoryResult>): string {
|
|
40
|
+
return convergence_candidates(categories) === 0 ? CLEAR : CANDIDATES
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function scope_line(seed_count: number, scope_count: number): string {
|
|
44
|
+
return `scope: ${String(scope_count)} files (seed ${String(seed_count)}, expanded via import graph, max ${String(import_graph.MAX_STAGES)} stages)`
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function category_header(category: CategoryResult): string {
|
|
48
|
+
return `${category.priority} ${category.label}: ${String(category.candidates.length)}`
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function candidate_lines(category: CategoryResult): ReadonlyArray<string> {
|
|
52
|
+
return category.candidates.map((candidate) => ` ${candidate.location} (${candidate.rule})`)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function category_block(category: CategoryResult): string {
|
|
56
|
+
return [category_header(category), ...candidate_lines(category)].join('\n')
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function verdict_line(categories: ReadonlyArray<CategoryResult>): string {
|
|
60
|
+
const total = convergence_candidates(categories)
|
|
61
|
+
|
|
62
|
+
return total === 0 ? `verdict: ${CLEAR}` : `verdict: ${CANDIDATES} (${String(total)} high/medium)`
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function render(
|
|
66
|
+
categories: ReadonlyArray<CategoryResult>,
|
|
67
|
+
seed_count: number,
|
|
68
|
+
scope_count: number,
|
|
69
|
+
): string {
|
|
70
|
+
const blocks = categories.map((category) => category_block(category))
|
|
71
|
+
|
|
72
|
+
return [scope_line(seed_count, scope_count), ...blocks, verdict_line(categories)].join('\n')
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// The failure report: the scope line and an `error` verdict, so a scan that could not run says so
|
|
76
|
+
// rather than printing empty categories that would read as `clear`.
|
|
77
|
+
function error_output(seed_count: number, scope_count: number): string {
|
|
78
|
+
return [scope_line(seed_count, scope_count), `verdict: ${ERROR} (scan could not run)`].join('\n')
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function render_result(result: ScanResult): string {
|
|
82
|
+
if (result.verdict === ERROR) return error_output(result.seed_count, result.scope_count)
|
|
83
|
+
|
|
84
|
+
return render(result.categories, result.seed_count, result.scope_count)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function scan(root: string): Promise<ScanResult> {
|
|
88
|
+
const seed = await refactor_targets.collect_targets(root)
|
|
89
|
+
const universe = await line_targets.lint_target_files(root)
|
|
90
|
+
const scope = [...import_graph.expand_scope(seed, universe, root)]
|
|
91
|
+
const categories = await refactor_lint.scan_categories(scope, root)
|
|
92
|
+
const counts = { seed_count: seed.length, scope_count: scope.length }
|
|
93
|
+
|
|
94
|
+
if (categories === undefined) return { ...counts, categories: [], verdict: ERROR }
|
|
95
|
+
|
|
96
|
+
return { ...counts, categories, verdict: verdict_token(categories) }
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function run_scan(): Promise<number> {
|
|
100
|
+
const root = await line_targets.repo_root()
|
|
101
|
+
const result = await scan(root)
|
|
102
|
+
|
|
103
|
+
process.stdout.write(`${render_result(result)}\n`)
|
|
104
|
+
|
|
105
|
+
return 0
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const refactor_scan = {
|
|
109
|
+
category_block,
|
|
110
|
+
error_output,
|
|
111
|
+
render,
|
|
112
|
+
render_result,
|
|
113
|
+
run_scan,
|
|
114
|
+
scan,
|
|
115
|
+
convergence_candidates,
|
|
116
|
+
verdict_line,
|
|
117
|
+
verdict_token,
|
|
118
|
+
CANDIDATES,
|
|
119
|
+
CLEAR,
|
|
120
|
+
ERROR,
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export type { ScanResult }
|
|
124
|
+
export { refactor_scan }
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { changed_paths } from '#scripts/git/changed-paths'
|
|
4
|
+
import { line_targets } from '#scripts/lines/line-targets'
|
|
5
|
+
|
|
6
|
+
// The target-file selection of `josh refactor:scan` โ the priority `prompts/refactoring.md` ยง4.1
|
|
7
|
+
// used to spell out in prose (joshuafolkken/kit#2180). The scope is the same reading every scoped
|
|
8
|
+
// command decides from โ the branch diff plus the untracked files (`changed-paths.ts`) โ and only
|
|
9
|
+
// when that is empty does it fall back to `scripts/`, so a run on a clean `main` still has something
|
|
10
|
+
// to scan rather than reporting nothing.
|
|
11
|
+
|
|
12
|
+
// The `scripts/` fallback lives under this directory, root-relative โ the same spelling
|
|
13
|
+
// `line-targets.ts` resolves against the repository root.
|
|
14
|
+
const SCRIPTS_DIR = 'scripts'
|
|
15
|
+
// The three exclusions ยง4.1 names: demo material, the story routes, and any file that opts out at its
|
|
16
|
+
// top. Refactoring a demo or a story would change an example rather than the code it illustrates.
|
|
17
|
+
const DEMO_MARKER = 'demo'
|
|
18
|
+
const STORIES_DIR = 'src/routes/stories'
|
|
19
|
+
// The opt-out marker, matched at the very top of the file so a mention of it lower down is not read
|
|
20
|
+
// as one. `CLAUDE.md` documents it as the file-level refactoring exclusion.
|
|
21
|
+
const REFACTOR_IGNORE_MARKER = '/* @refactor-ignore */'
|
|
22
|
+
|
|
23
|
+
// A path segment named `demo`, or a filename that carries it, is demo material. Split on the forward
|
|
24
|
+
// slash git prints, so a directory named `demo` and a file `foo.demo.ts` are both caught.
|
|
25
|
+
function is_path_excluded(relative_path: string): boolean {
|
|
26
|
+
const segments = relative_path.split('/')
|
|
27
|
+
|
|
28
|
+
if (segments.some((segment) => segment.includes(DEMO_MARKER))) return true
|
|
29
|
+
|
|
30
|
+
return relative_path.includes(STORIES_DIR)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// The file-level opt-out is read from the file's own head rather than its path: `trimStart` lets a
|
|
34
|
+
// leading blank line or shebang-free preamble still count, and a marker deeper in the file is ignored.
|
|
35
|
+
function has_ignore_marker(source: string): boolean {
|
|
36
|
+
return source.trimStart().startsWith(REFACTOR_IGNORE_MARKER)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// A path that is gone or unreadable is not something to scan, so it is treated as opted out rather
|
|
40
|
+
// than crashing the whole scan on one bad entry.
|
|
41
|
+
function is_ignored_file(absolute_path: string): boolean {
|
|
42
|
+
try {
|
|
43
|
+
return has_ignore_marker(readFileSync(absolute_path, 'utf8'))
|
|
44
|
+
} catch {
|
|
45
|
+
return true
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// The changed set wins; the `scripts/` fallback is used only when nothing changed. `undefined` and an
|
|
50
|
+
// empty array are the same answer here โ both mean "no change to scan" โ because a scan of nothing is
|
|
51
|
+
// never the intended result, unlike a scoped re-check where it means "narrowed to nothing".
|
|
52
|
+
function select_scope(
|
|
53
|
+
changed: ReadonlyArray<string>,
|
|
54
|
+
fallback_files: ReadonlyArray<string>,
|
|
55
|
+
): ReadonlyArray<string> {
|
|
56
|
+
return changed.length > 0 ? changed : fallback_files
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Only lint-target source files, only those neither path-excluded nor opted out.
|
|
60
|
+
function keep_target(root: string, absolute_path: string): boolean {
|
|
61
|
+
const relative_path = path.relative(root, absolute_path)
|
|
62
|
+
|
|
63
|
+
if (!line_targets.is_lint_target(relative_path) || is_path_excluded(relative_path)) return false
|
|
64
|
+
|
|
65
|
+
return !is_ignored_file(absolute_path)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function scripts_files(root: string, all_files: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
69
|
+
const scripts_root = path.resolve(root, SCRIPTS_DIR)
|
|
70
|
+
|
|
71
|
+
return all_files.filter((file) => file.startsWith(`${scripts_root}${path.sep}`))
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async function changed_absolute(root: string): Promise<ReadonlyArray<string>> {
|
|
75
|
+
try {
|
|
76
|
+
const relative = await changed_paths.read_changed_paths(false)
|
|
77
|
+
|
|
78
|
+
return relative.map((name) => path.resolve(root, name))
|
|
79
|
+
} catch {
|
|
80
|
+
return []
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// The seed set ยง4.3 expands from: the changed files, or `scripts/` when nothing changed, filtered to
|
|
85
|
+
// lint-target source files that are not excluded.
|
|
86
|
+
async function collect_targets(root: string): Promise<ReadonlyArray<string>> {
|
|
87
|
+
const changed = await changed_absolute(root)
|
|
88
|
+
const all_files = await line_targets.lint_target_files(root)
|
|
89
|
+
const scope = select_scope(changed, scripts_files(root, all_files))
|
|
90
|
+
|
|
91
|
+
return scope.filter((absolute_path) => keep_target(root, absolute_path))
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const refactor_targets = {
|
|
95
|
+
collect_targets,
|
|
96
|
+
has_ignore_marker,
|
|
97
|
+
is_path_excluded,
|
|
98
|
+
keep_target,
|
|
99
|
+
scripts_files,
|
|
100
|
+
select_scope,
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export { refactor_targets }
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { git_command } from '#scripts/git/git-command'
|
|
4
|
+
import { release_history } from './release-history'
|
|
5
|
+
import { release_plan, type ReleasePlan } from './release-plan'
|
|
6
|
+
import { release_publish } from './release-publish'
|
|
7
|
+
|
|
8
|
+
// `pnpm josh release` โ the one place that decides a version (joshuafolkken/kit#1169).
|
|
9
|
+
//
|
|
10
|
+
// It does three things and no more: count the merges main has taken since the version last changed,
|
|
11
|
+
// report and stop when that count is zero, and otherwise raise the version by that many minors, open
|
|
12
|
+
// a pull request, merge it and watch for the tag.
|
|
13
|
+
//
|
|
14
|
+
// **It never touches the root checkout** (joshuafolkken/kit#2411). The count is read from
|
|
15
|
+
// `origin/<default>`, and the version bump / commit / push happen in a dedicated work tree
|
|
16
|
+
// `release_publish` cuts for the release โ so a release can run beside a `backlogrun` (which keeps the
|
|
17
|
+
// root on the default branch) and can start even when the root is dirty or on another branch.
|
|
18
|
+
|
|
19
|
+
const DRY_RUN_FLAG = '--dry-run'
|
|
20
|
+
const ARGUMENT_START = 2
|
|
21
|
+
const SUCCESS_EXIT_CODE = 0
|
|
22
|
+
const FAILURE_EXIT_CODE = 1
|
|
23
|
+
|
|
24
|
+
// **The remote-tracking ref is the tip everything is read from**, so the release measures against
|
|
25
|
+
// main's latest rather than whatever the root checkout is sitting on. The fetch refreshes that ref;
|
|
26
|
+
// a dry run skips it because a rehearsal writes nothing (a fetch updates refs), reporting on the ref
|
|
27
|
+
// the checkout already has.
|
|
28
|
+
async function origin_tip(is_dry_run: boolean): Promise<string> {
|
|
29
|
+
const default_branch = await git_command.get_default_branch()
|
|
30
|
+
|
|
31
|
+
if (!is_dry_run) await git_command.fetch_branch(default_branch)
|
|
32
|
+
|
|
33
|
+
return `origin/${default_branch}`
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function build_plan(tip: string): Promise<ReleasePlan> {
|
|
37
|
+
const current_version = await release_history.read_current_version(tip)
|
|
38
|
+
|
|
39
|
+
if (current_version === undefined) {
|
|
40
|
+
throw new Error(`Could not read a version from \`${tip}\`'s package.json.`)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const plan = await release_history.read_release_plan(current_version, undefined, tip)
|
|
44
|
+
|
|
45
|
+
if (plan === undefined) {
|
|
46
|
+
throw new Error(
|
|
47
|
+
`Could not find the commit that last changed the version within the last ${String(release_history.BASE_SEARCH_LIMIT)} commits that touched package.json.`,
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return plan
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async function run(is_dry_run: boolean): Promise<number> {
|
|
55
|
+
const tip = await origin_tip(is_dry_run)
|
|
56
|
+
const plan = await build_plan(tip)
|
|
57
|
+
|
|
58
|
+
if (plan.pending === 0) {
|
|
59
|
+
console.info(release_plan.format_nothing_to_release(plan.base))
|
|
60
|
+
|
|
61
|
+
return SUCCESS_EXIT_CODE
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
console.info(release_plan.format_plan(plan))
|
|
65
|
+
|
|
66
|
+
if (is_dry_run) return SUCCESS_EXIT_CODE
|
|
67
|
+
|
|
68
|
+
return await release_publish.publish(plan)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function is_dry_run_requested(argv: ReadonlyArray<string>): boolean {
|
|
72
|
+
return argv.slice(ARGUMENT_START).includes(DRY_RUN_FLAG)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function main(): Promise<void> {
|
|
76
|
+
try {
|
|
77
|
+
process.exit(await run(is_dry_run_requested(process.argv)))
|
|
78
|
+
} catch (error) {
|
|
79
|
+
console.error(error instanceof Error ? error.message : String(error))
|
|
80
|
+
process.exit(FAILURE_EXIT_CODE)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) void main()
|
|
85
|
+
|
|
86
|
+
const release_cli = { is_dry_run_requested, run, DRY_RUN_FLAG }
|
|
87
|
+
|
|
88
|
+
export { release_cli }
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { git_command } from '#scripts/git/git-command'
|
|
2
|
+
import { package_with_version_schema } from '#scripts/lib/schemas'
|
|
3
|
+
import { version_targets } from '#scripts/version/version-targets'
|
|
4
|
+
import { release_plan, type ReleasePlan, type VersionedCommit } from './release-plan'
|
|
5
|
+
|
|
6
|
+
// Reading main's history for the two numbers a release is made of: where the version last changed,
|
|
7
|
+
// and how many merges have landed since (joshuafolkken/kit#1169).
|
|
8
|
+
|
|
9
|
+
const { PACKAGE_JSON } = version_targets
|
|
10
|
+
|
|
11
|
+
// How far back the search for "the commit that last changed the version" goes, counted in commits
|
|
12
|
+
// that touched `package.json`. Once children stop bumping (joshuafolkken/kit#1486) that file still
|
|
13
|
+
// changes for every dependency update, so the base can sit several entries down โ but a repository
|
|
14
|
+
// that has taken thirty `package.json` commits without a single release has a different problem, and
|
|
15
|
+
// guessing past that point would be worse than saying so.
|
|
16
|
+
const BASE_SEARCH_LIMIT = 30
|
|
17
|
+
|
|
18
|
+
// **Which ref the history is read from.** `josh release` runs on a pulled default branch, so `HEAD`
|
|
19
|
+
// is main there and the default is right. A caller on a feature branch names the ref it means โ
|
|
20
|
+
// `origin/main` โ because `--first-parent` from a branch tip walks that branch rather than main, and
|
|
21
|
+
// the count would silently omit every merge main took after the branch was cut
|
|
22
|
+
// (joshuafolkken/kit#1486).
|
|
23
|
+
const DEFAULT_TIP = 'HEAD'
|
|
24
|
+
|
|
25
|
+
// The reads this module makes, named so a test can answer them without a git repository. Production
|
|
26
|
+
// callers take the default and never pass one.
|
|
27
|
+
interface HistoryReader {
|
|
28
|
+
log_first_parent: (limit: number, file_path: string, tip: string) => Promise<Array<string>>
|
|
29
|
+
show_file: (spec: string) => Promise<string>
|
|
30
|
+
count_merges: (range: string) => Promise<number>
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const git_reader: HistoryReader = {
|
|
34
|
+
log_first_parent: git_command.log_first_parent,
|
|
35
|
+
show_file: git_command.show_file,
|
|
36
|
+
count_merges: git_command.count_merges,
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// **Undefined rather than a throw for a `package.json` that cannot be read as one.** A revision where
|
|
40
|
+
// the file is absent or malformed is not a version change, and the comparison above wants that
|
|
41
|
+
// expressed as "no version here" rather than as an exception that ends the search.
|
|
42
|
+
function parse_version(content: string | undefined): string | undefined {
|
|
43
|
+
if (content === undefined) return undefined
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
return package_with_version_schema.parse(JSON.parse(content)).version
|
|
47
|
+
} catch {
|
|
48
|
+
return undefined
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function read_version_at(
|
|
53
|
+
reader: HistoryReader,
|
|
54
|
+
reference: string,
|
|
55
|
+
): Promise<string | undefined> {
|
|
56
|
+
try {
|
|
57
|
+
// `./` is not decoration. `git show <sha>:package.json` resolves against the **repository
|
|
58
|
+
// root**, while the `git log -- package.json` that produced these revisions resolves against
|
|
59
|
+
// **cwd** โ so run from a workspace sub-package the two halves would be comparing different
|
|
60
|
+
// files, and every version comparison would be against the wrong one. `./` makes `show`
|
|
61
|
+
// cwd-relative too, which is also what `read_workspace_version(process.cwd())` reads.
|
|
62
|
+
return parse_version(await reader.show_file(`${reference}:./${PACKAGE_JSON}`))
|
|
63
|
+
} catch {
|
|
64
|
+
return undefined
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function read_versioned_commits(
|
|
69
|
+
reader: HistoryReader,
|
|
70
|
+
tip: string,
|
|
71
|
+
): Promise<Array<VersionedCommit>> {
|
|
72
|
+
const shas = await reader.log_first_parent(BASE_SEARCH_LIMIT, PACKAGE_JSON, tip)
|
|
73
|
+
|
|
74
|
+
return await Promise.all(
|
|
75
|
+
shas.map(async (sha) => ({ sha, version: await read_version_at(reader, sha) })),
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async function read_base(
|
|
80
|
+
reader: HistoryReader = git_reader,
|
|
81
|
+
tip: string = DEFAULT_TIP,
|
|
82
|
+
): Promise<string | undefined> {
|
|
83
|
+
const commits = await read_versioned_commits(reader, tip)
|
|
84
|
+
const oldest = commits.at(-1)
|
|
85
|
+
const oldest_parent_version =
|
|
86
|
+
oldest === undefined ? undefined : await read_version_at(reader, `${oldest.sha}^`)
|
|
87
|
+
|
|
88
|
+
return release_plan.find_version_base(commits, oldest_parent_version)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// The version `package.json` carries at a git revision. `josh release` reads it from
|
|
92
|
+
// `origin/<default>` rather than from the checkout's own `package.json`, so the number it raises is
|
|
93
|
+
// main's latest even when the run happens in a work tree cut for the release (joshuafolkken/kit#2411).
|
|
94
|
+
async function read_current_version(
|
|
95
|
+
tip: string = DEFAULT_TIP,
|
|
96
|
+
reader: HistoryReader = git_reader,
|
|
97
|
+
): Promise<string | undefined> {
|
|
98
|
+
return await read_version_at(reader, tip)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// **Undefined means the base could not be found**, never "there is nothing to release" โ the two have
|
|
102
|
+
// to stay distinguishable, because one is a report and the other is a failure.
|
|
103
|
+
async function read_release_plan(
|
|
104
|
+
current_version: string,
|
|
105
|
+
reader: HistoryReader = git_reader,
|
|
106
|
+
tip: string = DEFAULT_TIP,
|
|
107
|
+
): Promise<ReleasePlan | undefined> {
|
|
108
|
+
const base = await read_base(reader, tip)
|
|
109
|
+
|
|
110
|
+
if (base === undefined) return undefined
|
|
111
|
+
|
|
112
|
+
const pending = await reader.count_merges(`${base}..${tip}`)
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
base,
|
|
116
|
+
pending,
|
|
117
|
+
current_version,
|
|
118
|
+
next_version: release_plan.next_version(current_version, pending),
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const release_history = {
|
|
123
|
+
parse_version,
|
|
124
|
+
read_base,
|
|
125
|
+
read_current_version,
|
|
126
|
+
read_release_plan,
|
|
127
|
+
BASE_SEARCH_LIMIT,
|
|
128
|
+
DEFAULT_TIP,
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export { release_history }
|
|
132
|
+
export type { HistoryReader }
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import semver from 'semver'
|
|
2
|
+
|
|
3
|
+
// What a release is, decided from main's history alone (joshuafolkken/kit#1169).
|
|
4
|
+
//
|
|
5
|
+
// **A version is a property of main's history, not of a branch.** `bump-version.ts` reads the local
|
|
6
|
+
// `package.json` and increments it, so two branches cut from the same version both claim the same
|
|
7
|
+
// next number โ and git's three-way merge does not report two branches writing the same line to the
|
|
8
|
+
// same value as a conflict. What surfaces instead is one version carrying two issues, with the other
|
|
9
|
+
// version never existing.
|
|
10
|
+
//
|
|
11
|
+
// The answer is to stop asking a branch. `pending` is how many merges main has taken since the commit
|
|
12
|
+
// that last changed the version, and the release raises the version by that many minors. There is one
|
|
13
|
+
// place that decides, and it looks only at main at the moment it runs โ which is why no lock, no
|
|
14
|
+
// reserved number and no queue is needed.
|
|
15
|
+
|
|
16
|
+
interface VersionedCommit {
|
|
17
|
+
sha: string
|
|
18
|
+
version: string | undefined
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface ReleasePlan {
|
|
22
|
+
base: string
|
|
23
|
+
pending: number
|
|
24
|
+
current_version: string
|
|
25
|
+
next_version: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const PENDING_ICON = '๐'
|
|
29
|
+
const SHORT_SHA_LENGTH = 7
|
|
30
|
+
|
|
31
|
+
// The version immediately before `commits[index]`. `commits` is newest-first and lists only the
|
|
32
|
+
// commits that touched `package.json` along main's own first-parent line, so that version is exactly
|
|
33
|
+
// `commits[index + 1]`'s: by construction nothing between the two changed the file.
|
|
34
|
+
// `oldest_parent_version` closes the list at its far end, where there is no neighbor to compare with.
|
|
35
|
+
//
|
|
36
|
+
// **The fallback belongs to the end of the list and nowhere else.** `read_version_at` answers
|
|
37
|
+
// `undefined` for any revision whose `package.json` could not be read โ absent, malformed, or a
|
|
38
|
+
// `git show` that failed โ so a `?? oldest_parent_version` written on the neighbor's *version*
|
|
39
|
+
// would fire in the middle of the list too, comparing against a version several commits older and
|
|
40
|
+
// declaring a base far too new. The bounds check asks about the neighbor's existence instead.
|
|
41
|
+
function previous_version_of(
|
|
42
|
+
commits: ReadonlyArray<VersionedCommit>,
|
|
43
|
+
index: number,
|
|
44
|
+
oldest_parent_version: string | undefined,
|
|
45
|
+
): string | undefined {
|
|
46
|
+
const previous = commits[index + 1]
|
|
47
|
+
|
|
48
|
+
return previous === undefined ? oldest_parent_version : previous.version
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// **The newest commit whose `package.json` version differs from the version immediately before it.**
|
|
52
|
+
//
|
|
53
|
+
// **A commit that touched `package.json` without moving the version is skipped**, which is what makes
|
|
54
|
+
// this right once children stop bumping (joshuafolkken/kit#1486): a dependency update rewrites the
|
|
55
|
+
// file every time and must not be mistaken for a release.
|
|
56
|
+
//
|
|
57
|
+
// **Both sides have to be readable for this to be a version change.** An unreadable neighbor makes
|
|
58
|
+
// the comparison unanswerable, and the search carries on to older commits rather than declaring one:
|
|
59
|
+
// a base that is too new under-counts the merges since it, and the release then ships fewer minors
|
|
60
|
+
// than issues โ silently, which is the one failure this command exists to prevent. Finding no base at
|
|
61
|
+
// all is reported as a failure by the caller, which is the honest end of the same reasoning.
|
|
62
|
+
function find_version_base(
|
|
63
|
+
commits: ReadonlyArray<VersionedCommit>,
|
|
64
|
+
oldest_parent_version: string | undefined,
|
|
65
|
+
): string | undefined {
|
|
66
|
+
const found = commits.find((commit, index) => {
|
|
67
|
+
const previous = previous_version_of(commits, index, oldest_parent_version)
|
|
68
|
+
|
|
69
|
+
return commit.version !== undefined && previous !== undefined && commit.version !== previous
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
return found?.sha
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// **Raising the version by `pending` minors.** `semver.inc(v, 'minor')` applied N times zeroes the
|
|
76
|
+
// patch once and adds one to the minor each time, so N applications are a single addition โ written
|
|
77
|
+
// as one here rather than as a loop, because the loop would only be re-deriving that identity.
|
|
78
|
+
//
|
|
79
|
+
// **`pending === 0` returns the current version untouched, and that needs its own branch.** The
|
|
80
|
+
// arithmetic zeroes the patch, so `1.339.4` with nothing pending would come back as `1.339.0` โ a
|
|
81
|
+
// *downgrade* carried inside every `ReleasePlan`, including the ones whose caller decides not to
|
|
82
|
+
// release at all.
|
|
83
|
+
function next_version(current: string, pending: number): string {
|
|
84
|
+
const parsed = semver.parse(current)
|
|
85
|
+
|
|
86
|
+
if (parsed === null) throw new Error(`Invalid version format: ${current}`)
|
|
87
|
+
|
|
88
|
+
if (pending === 0) return parsed.version
|
|
89
|
+
|
|
90
|
+
return `${String(parsed.major)}.${String(parsed.minor + pending)}.0`
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function short_sha(sha: string): string {
|
|
94
|
+
return sha.slice(0, SHORT_SHA_LENGTH)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// **The count is the line a person reads**, which is why it is built here rather than at each caller:
|
|
98
|
+
// the release command prints it, and so does anything else that wants to say how much is waiting to
|
|
99
|
+
// ship (joshuafolkken/kit#1169 โ "the count of unreleased merges shows somewhere visible").
|
|
100
|
+
function format_pending_line(pending: number): string {
|
|
101
|
+
return `${PENDING_ICON} unreleased merges on main: ${String(pending)}`
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function format_nothing_to_release(base: string): string {
|
|
105
|
+
return [
|
|
106
|
+
format_pending_line(0),
|
|
107
|
+
` Nothing to release โ no merge has landed on main since ${short_sha(base)}, the commit that last changed the version.`,
|
|
108
|
+
].join('\n')
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function format_plan(plan: ReleasePlan): string {
|
|
112
|
+
return [
|
|
113
|
+
format_pending_line(plan.pending),
|
|
114
|
+
` base ${short_sha(plan.base)} ยท ${plan.current_version} โ ${plan.next_version}`,
|
|
115
|
+
].join('\n')
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const release_plan = {
|
|
119
|
+
find_version_base,
|
|
120
|
+
previous_version_of,
|
|
121
|
+
format_nothing_to_release,
|
|
122
|
+
format_pending_line,
|
|
123
|
+
format_plan,
|
|
124
|
+
next_version,
|
|
125
|
+
short_sha,
|
|
126
|
+
PENDING_ICON,
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export { release_plan }
|
|
130
|
+
export type { ReleasePlan, VersionedCommit }
|