@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,296 @@
|
|
|
1
|
+
import { execaSync } from 'execa'
|
|
2
|
+
import { release_age } from './release-age'
|
|
3
|
+
import { release_hold } from './release-hold'
|
|
4
|
+
import { running_binary } from './running-binary'
|
|
5
|
+
import type { InstalledVersions } from './upgrade-command-guard'
|
|
6
|
+
import {
|
|
7
|
+
version_check_logic,
|
|
8
|
+
type ReleaseHold,
|
|
9
|
+
type RunningBinary,
|
|
10
|
+
type UpstreamEffective,
|
|
11
|
+
type UpstreamReport,
|
|
12
|
+
type VersionOutputExtras,
|
|
13
|
+
type VersionSnapshot,
|
|
14
|
+
} from './version-check-logic'
|
|
15
|
+
import type {
|
|
16
|
+
UpstreamHookContext,
|
|
17
|
+
UpstreamVersionConfig,
|
|
18
|
+
VersionCommandConfig,
|
|
19
|
+
} from './version-command-config'
|
|
20
|
+
import { fetch_latest_version, fetch_release_times } from './version-remote'
|
|
21
|
+
import { version_targets } from './version-targets'
|
|
22
|
+
|
|
23
|
+
const FAILURE_EXIT_CODE = 1
|
|
24
|
+
const ALREADY_UP_TO_DATE = 'Already up to date'
|
|
25
|
+
const NO_QUARANTINE_MINUTES = 0
|
|
26
|
+
|
|
27
|
+
// What the local minimum-release-age policy permits for one package. Resolved per package because
|
|
28
|
+
// the newest installable release is a property of that package's own publish history. Returns a hold
|
|
29
|
+
// whose `installable` is undefined when the timestamps cannot be read — the report then renders
|
|
30
|
+
// exactly as it did before (joshuafolkken/kit#808).
|
|
31
|
+
//
|
|
32
|
+
// Skipped entirely unless some target is behind `latest`: the timestamps cost a second `gh api`
|
|
33
|
+
// round trip per package, and a package with nothing stale has no gap for a hold to explain. On the
|
|
34
|
+
// common all-current run the report costs exactly what it did before this feature.
|
|
35
|
+
function read_release_hold(
|
|
36
|
+
versions_endpoint: string | undefined,
|
|
37
|
+
latest: string,
|
|
38
|
+
versions: ReadonlyArray<string | undefined>,
|
|
39
|
+
): ReleaseHold | undefined {
|
|
40
|
+
if (versions.every((version) => version === undefined || version === latest)) return undefined
|
|
41
|
+
// Resolved by walking up from the working directory: `josh version` runs from subdirectories and
|
|
42
|
+
// from outside a project, where a fixed relative path would silently read "no quarantine".
|
|
43
|
+
const minimum_age_minutes = release_age.read_nearest_minimum_release_age(process.cwd())
|
|
44
|
+
// No window means nothing can be withheld, so there is no hold to explain and no reason to spend
|
|
45
|
+
// a registry round trip discovering that.
|
|
46
|
+
if (minimum_age_minutes <= NO_QUARANTINE_MINUTES) return undefined
|
|
47
|
+
const installable = release_hold.resolve_installable(
|
|
48
|
+
fetch_release_times(versions_endpoint),
|
|
49
|
+
latest,
|
|
50
|
+
minimum_age_minutes,
|
|
51
|
+
Date.now(),
|
|
52
|
+
)
|
|
53
|
+
// Absent rather than present-with-nothing: `ReleaseHold` is publicly exported, so the field's
|
|
54
|
+
// presence must mean a hold was actually resolved.
|
|
55
|
+
if (installable === undefined) return undefined
|
|
56
|
+
|
|
57
|
+
return { installable, minimum_age_minutes }
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Read the global, project, and latest versions for the configured package — the three values a
|
|
61
|
+
// single `version` / `version:upgrade` invocation operates on.
|
|
62
|
+
function read_snapshot(config: VersionCommandConfig): VersionSnapshot {
|
|
63
|
+
return {
|
|
64
|
+
global_version: version_targets.read_global_version(config.package_name),
|
|
65
|
+
project_version: version_targets.read_project_version(process.cwd(), config.package_name),
|
|
66
|
+
latest: fetch_latest_version(config.versions_endpoint, config.package_name),
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// The running binary is the single source of truth: report the version/path of the install that
|
|
71
|
+
// actually executed. Undefined when the consumer supplies no `self_dir` or the binary is unknown.
|
|
72
|
+
function read_running_binary(self_directory: string | undefined): RunningBinary | undefined {
|
|
73
|
+
if (self_directory === undefined) return undefined
|
|
74
|
+
const version = running_binary.read_running_version(self_directory)
|
|
75
|
+
if (version === undefined) return undefined
|
|
76
|
+
|
|
77
|
+
return { version, path: running_binary.running_package_directory(self_directory) }
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Build the optional report extras (running-binary line + PATH-shadowing warning) from the
|
|
81
|
+
// consumer's hooks, assigning only defined values to stay `exactOptionalPropertyTypes`-compatible.
|
|
82
|
+
function build_extras(config: VersionCommandConfig): VersionOutputExtras {
|
|
83
|
+
const extras: VersionOutputExtras = {}
|
|
84
|
+
const running = read_running_binary(config.self_directory)
|
|
85
|
+
if (running !== undefined) extras.running = running
|
|
86
|
+
const warning = config.resolve_warning?.()
|
|
87
|
+
if (warning !== undefined) extras.warning = warning
|
|
88
|
+
|
|
89
|
+
return extras
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Resolve the upstream's effective (running-relative) install from the consumer's opt-in hooks, or
|
|
93
|
+
// undefined when the consumer supplies neither (e.g. kit, which has no upstream). Both hooks are
|
|
94
|
+
// required together and receive `context` (the downstream package's already-fetched latest) so the
|
|
95
|
+
// global upgrade command can reuse kit's single fetch instead of resolving `latest` a second time.
|
|
96
|
+
function build_upstream_effective(
|
|
97
|
+
upstream: UpstreamVersionConfig,
|
|
98
|
+
context: UpstreamHookContext,
|
|
99
|
+
): UpstreamEffective | undefined {
|
|
100
|
+
const { resolve_effective_version, resolve_global_upgrade_command } = upstream
|
|
101
|
+
if (resolve_effective_version === undefined) return undefined
|
|
102
|
+
if (resolve_global_upgrade_command === undefined) return undefined
|
|
103
|
+
|
|
104
|
+
return {
|
|
105
|
+
version: resolve_effective_version(context),
|
|
106
|
+
upgrade_command: resolve_global_upgrade_command(context),
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// The globally-resolved versions kit already knows for one upstream: the primary package's global
|
|
111
|
+
// install (what a `pnpm add -g <primary>@<v>` command would target) and the upstream's own effective
|
|
112
|
+
// install. Attached to the report only when the consumer declared its global upgrade command
|
|
113
|
+
// pin-only, so the no-op guard can prove a command that pins these exact versions is dead (#697).
|
|
114
|
+
function build_installed_versions(
|
|
115
|
+
report: UpstreamReport,
|
|
116
|
+
config: VersionCommandConfig,
|
|
117
|
+
snapshot: VersionSnapshot,
|
|
118
|
+
): InstalledVersions {
|
|
119
|
+
return new Map([
|
|
120
|
+
[config.package_name, snapshot.global_version],
|
|
121
|
+
[report.config.package_name, report.effective?.version],
|
|
122
|
+
])
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Attach the effective install and, when the consumer declared its global command pin-only, the
|
|
126
|
+
// installed versions the no-op guard needs. Mutates the report in place so the optional fields stay
|
|
127
|
+
// absent for upstreams without hooks (`exactOptionalPropertyTypes`).
|
|
128
|
+
function attach_upstream_effective(
|
|
129
|
+
report: UpstreamReport,
|
|
130
|
+
config: VersionCommandConfig,
|
|
131
|
+
snapshot: VersionSnapshot,
|
|
132
|
+
upstream: UpstreamVersionConfig,
|
|
133
|
+
): void {
|
|
134
|
+
const context: UpstreamHookContext = { latest: snapshot.latest, upstream_latest: report.latest }
|
|
135
|
+
const effective = build_upstream_effective(upstream, context)
|
|
136
|
+
if (effective === undefined) return
|
|
137
|
+
|
|
138
|
+
report.effective = effective
|
|
139
|
+
if (upstream.is_global_upgrade_command_pinned !== true) return
|
|
140
|
+
|
|
141
|
+
report.installed_versions = build_installed_versions(report, config, snapshot)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Read one upstream's project-installed and latest versions, plus the optional effective/global
|
|
145
|
+
// install when the consumer opts in. Absent the hooks, the report keeps its project/latest-only shape.
|
|
146
|
+
function read_upstream_report(
|
|
147
|
+
upstream: UpstreamVersionConfig,
|
|
148
|
+
config: VersionCommandConfig,
|
|
149
|
+
snapshot: VersionSnapshot,
|
|
150
|
+
is_hold_wanted: boolean,
|
|
151
|
+
): UpstreamReport {
|
|
152
|
+
const latest = fetch_latest_version(upstream.versions_endpoint, upstream.package_name)
|
|
153
|
+
const project_version = version_targets.read_project_version(process.cwd(), upstream.package_name)
|
|
154
|
+
const report: UpstreamReport = { config: upstream, project_version, latest }
|
|
155
|
+
|
|
156
|
+
attach_upstream_effective(report, config, snapshot, upstream)
|
|
157
|
+
// After the effective install is attached, so its version counts toward the staleness gate.
|
|
158
|
+
// Only the effective install is peer-resolved, so it is the only target the window can hold back.
|
|
159
|
+
const hold = is_hold_wanted
|
|
160
|
+
? read_release_hold(upstream.versions_endpoint, latest, [report.effective?.version])
|
|
161
|
+
: undefined
|
|
162
|
+
if (hold !== undefined) report.hold = hold
|
|
163
|
+
|
|
164
|
+
return report
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Read the reports for the configured upstream chain, preserving the configured (nearest-first)
|
|
168
|
+
// order. Empty when the consumer declares no upstreams (e.g. kit itself). `snapshot` is the primary
|
|
169
|
+
// package's already-read state (from `read_snapshot`): its `latest` is threaded into each upstream's
|
|
170
|
+
// hooks so a consumer never re-fetches it, and its `global_version` feeds the no-op guard.
|
|
171
|
+
function read_upstream_reports(
|
|
172
|
+
config: VersionCommandConfig,
|
|
173
|
+
snapshot: VersionSnapshot,
|
|
174
|
+
is_hold_wanted = false,
|
|
175
|
+
): Array<UpstreamReport> {
|
|
176
|
+
return config.upstreams.map((upstream) =>
|
|
177
|
+
read_upstream_report(upstream, config, snapshot, is_hold_wanted),
|
|
178
|
+
)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// The `version` (show) command for any configured package: print the dual/offline report with
|
|
182
|
+
// staleness markers, upstream sections, upgrade hints, and the running-binary/warning extras.
|
|
183
|
+
function run_check(config: VersionCommandConfig): void {
|
|
184
|
+
const snapshot = read_snapshot(config)
|
|
185
|
+
const upstream_reports = read_upstream_reports(config, snapshot, true)
|
|
186
|
+
|
|
187
|
+
console.info(
|
|
188
|
+
version_check_logic.format_dual_version_output(
|
|
189
|
+
snapshot,
|
|
190
|
+
config,
|
|
191
|
+
build_extras(config),
|
|
192
|
+
upstream_reports,
|
|
193
|
+
),
|
|
194
|
+
)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function run_upgrade_command(command: string): number {
|
|
198
|
+
const result = execaSync('sh', ['-c', command], { stdio: 'inherit', reject: false })
|
|
199
|
+
|
|
200
|
+
return result.exitCode ?? FAILURE_EXIT_CODE
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Run every upgrade command in order, returning the last non-zero exit code (or 0 when all
|
|
204
|
+
// succeed) so a failure on either target is surfaced without aborting the remaining upgrades.
|
|
205
|
+
function run_all_upgrade_commands(commands: ReadonlyArray<string>): number {
|
|
206
|
+
let exit_code = 0
|
|
207
|
+
|
|
208
|
+
for (const command of commands) {
|
|
209
|
+
const code = run_upgrade_command(command)
|
|
210
|
+
if (code !== 0) exit_code = code
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return exit_code
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// What to print when nothing can be upgraded: either everything is current, or a stale effective
|
|
217
|
+
// upstream's global command provably cannot change it and the explanation says so (#697).
|
|
218
|
+
function build_idle_message(reports: ReadonlyArray<UpstreamReport>): string {
|
|
219
|
+
const notes = version_check_logic.build_upstream_upgrade_notes(reports)
|
|
220
|
+
if (notes.length === 0) return ALREADY_UP_TO_DATE
|
|
221
|
+
|
|
222
|
+
return notes.join('\n')
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Re-read one upstream's effective install after the upgrade ran and describe what changed, or
|
|
226
|
+
// nothing when it reached the latest (success needs no explanation). Gated on the global command
|
|
227
|
+
// having actually been emitted: a suppressed no-op command never ran, so reporting that it "did not
|
|
228
|
+
// change" the install would blame a command the user was never offered.
|
|
229
|
+
function describe_effective_outcome(
|
|
230
|
+
upstream: UpstreamVersionConfig,
|
|
231
|
+
report: UpstreamReport | undefined,
|
|
232
|
+
snapshot: VersionSnapshot,
|
|
233
|
+
): Array<string> {
|
|
234
|
+
const { resolve_effective_version } = upstream
|
|
235
|
+
if (resolve_effective_version === undefined || report === undefined) return []
|
|
236
|
+
if (version_check_logic.build_effective_upgrade_commands(report).length === 0) return []
|
|
237
|
+
|
|
238
|
+
const after = resolve_effective_version({
|
|
239
|
+
latest: snapshot.latest,
|
|
240
|
+
upstream_latest: report.latest,
|
|
241
|
+
})
|
|
242
|
+
if (after === report.latest) return []
|
|
243
|
+
|
|
244
|
+
return [version_check_logic.format_effective_outcome(report, after)]
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// After the upgrade commands ran, report every effective upstream that did not reach its latest, so
|
|
248
|
+
// `version:upgrade` states the outcome itself instead of leaving the next `version` to repeat the
|
|
249
|
+
// same warning. Reports and configured upstreams share an index — `read_upstream_reports` maps over
|
|
250
|
+
// `config.upstreams` in order — which is how each report is paired back with its hooks.
|
|
251
|
+
function report_effective_outcomes(
|
|
252
|
+
config: VersionCommandConfig,
|
|
253
|
+
snapshot: VersionSnapshot,
|
|
254
|
+
reports: ReadonlyArray<UpstreamReport>,
|
|
255
|
+
): void {
|
|
256
|
+
const lines = config.upstreams.flatMap((upstream, index) =>
|
|
257
|
+
describe_effective_outcome(upstream, reports[index], snapshot),
|
|
258
|
+
)
|
|
259
|
+
if (lines.length > 0) console.info(lines.join('\n'))
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// The `version:upgrade` command for any configured package: upgrade whichever of global/project
|
|
263
|
+
// are stale, plus any stale upstream project dependencies (each respecting the fix-gh-packages
|
|
264
|
+
// lockfile repair). Returns the process exit code.
|
|
265
|
+
function run_upgrade(config: VersionCommandConfig): number {
|
|
266
|
+
const snapshot = read_snapshot(config)
|
|
267
|
+
const reports = read_upstream_reports(config, snapshot)
|
|
268
|
+
const commands = version_check_logic.unique_upgrade_commands([
|
|
269
|
+
...version_check_logic.build_dual_upgrade_commands(snapshot, config),
|
|
270
|
+
...version_check_logic.build_upstream_upgrade_commands(reports),
|
|
271
|
+
])
|
|
272
|
+
|
|
273
|
+
if (commands.length === 0) {
|
|
274
|
+
console.info(build_idle_message(reports))
|
|
275
|
+
|
|
276
|
+
return 0
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const exit_code = run_all_upgrade_commands(commands)
|
|
280
|
+
|
|
281
|
+
report_effective_outcomes(config, snapshot, reports)
|
|
282
|
+
|
|
283
|
+
return exit_code
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const version_commands = {
|
|
287
|
+
read_snapshot,
|
|
288
|
+
read_upstream_reports,
|
|
289
|
+
build_extras,
|
|
290
|
+
run_check,
|
|
291
|
+
run_upgrade,
|
|
292
|
+
run_upgrade_command,
|
|
293
|
+
run_all_upgrade_commands,
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export { version_commands }
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { git_gh_exec } from '#scripts/git/git-gh-exec'
|
|
2
|
+
import { execaSync } from 'execa'
|
|
3
|
+
import { safe_json_parse } from './parse-json'
|
|
4
|
+
import { release_age } from './release-age'
|
|
5
|
+
|
|
6
|
+
const GH_FAILURE_FALLBACK = 'gh api failed'
|
|
7
|
+
// Enough history to reach past a quarantine window into the newest release that has aged out of it.
|
|
8
|
+
// The endpoint's default page is a single entry, so it is widened to the API's maximum rather than
|
|
9
|
+
// paged through: a page that cannot span the window resolves no aged release at all, which silently
|
|
10
|
+
// drops the explanation and leaves the unexplained `⚠` this exists to remove. At the maximum, a
|
|
11
|
+
// week-long window still needs more than 14 releases a day to overflow (joshuafolkken/kit#808).
|
|
12
|
+
const TIMES_PAGE_SIZE = 100
|
|
13
|
+
// Reduce the endpoint's version objects to the version → publish-date map the selector expects.
|
|
14
|
+
const TIMES_JQ = '[.[] | {(.name): .created_at}] | add'
|
|
15
|
+
|
|
16
|
+
// Guard an undefined/empty endpoint before it reaches `gh api` — otherwise the CLI would run
|
|
17
|
+
// `gh api undefined` and surface a raw 404 ExecaSyncError. Narrows to a concrete string.
|
|
18
|
+
function require_endpoint(versions_endpoint: string | undefined, package_name: string): string {
|
|
19
|
+
if (versions_endpoint !== undefined && versions_endpoint.trim() !== '') return versions_endpoint
|
|
20
|
+
|
|
21
|
+
throw new Error(
|
|
22
|
+
`Could not derive a versions endpoint for ${package_name}; check its version-command config.`,
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Turn a failed `gh api` result into a concise detail line: prefer gh's own stderr
|
|
27
|
+
// (e.g. "gh: Not Found (HTTP 404)"), falling back to execa's short message.
|
|
28
|
+
function describe_failure(result: { stderr: string; shortMessage?: string | undefined }): string {
|
|
29
|
+
const stderr = result.stderr.trim()
|
|
30
|
+
|
|
31
|
+
if (stderr !== '') return stderr
|
|
32
|
+
|
|
33
|
+
return result.shortMessage ?? GH_FAILURE_FALLBACK
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Fetch the latest published version from a GitHub Packages versions endpoint. The endpoint is
|
|
37
|
+
// supplied per package (e.g. `/users/joshuafolkken/packages/npm/kit/versions?per_page=1`) so the
|
|
38
|
+
// same fetcher serves kit, jgame, and app-kit. Guards an undefined/empty endpoint and wraps
|
|
39
|
+
// `gh api` failures with an actionable message instead of a raw ExecaSyncError stack.
|
|
40
|
+
function fetch_latest_version(versions_endpoint: string | undefined, package_name: string): string {
|
|
41
|
+
const endpoint = require_endpoint(versions_endpoint, package_name)
|
|
42
|
+
const result = execaSync('gh', ['api', endpoint, '--jq', '.[0].name'], {
|
|
43
|
+
...git_gh_exec.direct_environment(),
|
|
44
|
+
reject: false,
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
if (result.exitCode === 0) return result.stdout.trim()
|
|
48
|
+
|
|
49
|
+
throw new Error(
|
|
50
|
+
`Failed to fetch latest version for ${package_name} via ${endpoint}: ${describe_failure(result)}`,
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Rewrite the endpoint's page size. The endpoint is consumer-overridable, so `per_page` is set
|
|
55
|
+
// through a query parser rather than by substituting the literal the default happens to carry.
|
|
56
|
+
function with_page_size(endpoint: string, page_size: number): string {
|
|
57
|
+
// Cut at the first `?` rather than `split`, whose limit truncates: a query carrying a second `?`
|
|
58
|
+
// would otherwise lose everything after it.
|
|
59
|
+
const separator = endpoint.indexOf('?')
|
|
60
|
+
const path_part = separator === -1 ? endpoint : endpoint.slice(0, separator)
|
|
61
|
+
const query = new URLSearchParams(separator === -1 ? '' : endpoint.slice(separator + 1))
|
|
62
|
+
|
|
63
|
+
query.set('per_page', String(page_size))
|
|
64
|
+
|
|
65
|
+
return `${path_part}?${query.toString()}`
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Publish timestamps for the package's recent releases, or nothing. Unlike `fetch_latest_version`
|
|
69
|
+
// this never throws: the timestamps only enrich an explanation, so a package whose history cannot be
|
|
70
|
+
// read keeps the report it had before (joshuafolkken/kit#808).
|
|
71
|
+
function fetch_release_times(
|
|
72
|
+
versions_endpoint: string | undefined,
|
|
73
|
+
): Record<string, string> | undefined {
|
|
74
|
+
if (versions_endpoint === undefined || versions_endpoint.trim() === '') return undefined
|
|
75
|
+
const endpoint = with_page_size(versions_endpoint, TIMES_PAGE_SIZE)
|
|
76
|
+
const result = execaSync('gh', ['api', endpoint, '--jq', TIMES_JQ], {
|
|
77
|
+
...git_gh_exec.direct_environment(),
|
|
78
|
+
reject: false,
|
|
79
|
+
})
|
|
80
|
+
if (result.exitCode !== 0) return undefined
|
|
81
|
+
const parsed = release_age.release_times_schema.safeParse(safe_json_parse(result.stdout))
|
|
82
|
+
|
|
83
|
+
return parsed.success ? parsed.data : undefined
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export { fetch_latest_version, fetch_release_times, with_page_size }
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { package_version_schema, pnpm_ls_global_schema } from '#scripts/lib/schemas'
|
|
4
|
+
import { execaSync } from 'execa'
|
|
5
|
+
import { safe_json_parse } from './parse-json'
|
|
6
|
+
|
|
7
|
+
const NODE_MODULES = 'node_modules'
|
|
8
|
+
const PACKAGE_JSON = 'package.json'
|
|
9
|
+
|
|
10
|
+
// Build the `pnpm ls -g --json <package>` arguments for the package being checked.
|
|
11
|
+
function build_pnpm_ls_arguments(package_name: string): Array<string> {
|
|
12
|
+
return ['ls', '-g', '--json', package_name]
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Read the globally installed version from `pnpm ls -g --json` output. Returns undefined when
|
|
16
|
+
// the package is absent or the output cannot be parsed (e.g. pnpm missing, empty stdout).
|
|
17
|
+
function parse_global_version(stdout: string, package_name: string): string | undefined {
|
|
18
|
+
const parsed = pnpm_ls_global_schema.safeParse(safe_json_parse(stdout))
|
|
19
|
+
if (!parsed.success) return undefined
|
|
20
|
+
|
|
21
|
+
return parsed.data[0]?.dependencies?.[package_name]?.version
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Read the project-local version from a node_modules package.json string. Undefined when the
|
|
25
|
+
// file is missing (raw is undefined) or malformed.
|
|
26
|
+
function parse_project_version(raw: string | undefined): string | undefined {
|
|
27
|
+
if (raw === undefined) return undefined
|
|
28
|
+
const parsed = package_version_schema.safeParse(safe_json_parse(raw))
|
|
29
|
+
|
|
30
|
+
return parsed.success ? parsed.data.version : undefined
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function read_global_version(package_name: string): string | undefined {
|
|
34
|
+
const result = execaSync('pnpm', build_pnpm_ls_arguments(package_name), { reject: false })
|
|
35
|
+
|
|
36
|
+
return parse_global_version(result.stdout, package_name)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function project_package_path(cwd: string, package_name: string): string {
|
|
40
|
+
return path.join(cwd, NODE_MODULES, package_name, PACKAGE_JSON)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function read_project_version(cwd: string, package_name: string): string | undefined {
|
|
44
|
+
const package_path = project_package_path(cwd, package_name)
|
|
45
|
+
const raw = existsSync(package_path) ? readFileSync(package_path, 'utf8') : undefined
|
|
46
|
+
|
|
47
|
+
return parse_project_version(raw)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Read the current project's own declared version from <cwd>/package.json. This is the version
|
|
51
|
+
// that `josh bump` increments — distinct from read_project_version, which reads the installed kit
|
|
52
|
+
// package version under node_modules.
|
|
53
|
+
function read_workspace_version(cwd: string): string | undefined {
|
|
54
|
+
const package_path = path.join(cwd, PACKAGE_JSON)
|
|
55
|
+
const raw = existsSync(package_path) ? readFileSync(package_path, 'utf8') : undefined
|
|
56
|
+
|
|
57
|
+
return parse_project_version(raw)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// `format_project_version_line` / `project_version_line` lived here and formatted
|
|
61
|
+
// `📦 project version: <v>` for the end of a workflow. Both are gone (joshuafolkken/kit#1486): a
|
|
62
|
+
// child no longer bumps, so the local manifest names the *previous* release rather than what the run
|
|
63
|
+
// ships, and every caller now prints the count of unreleased merges instead
|
|
64
|
+
// (`scripts/git/git-followup-pending.ts`). Removed rather than left unused, so nothing reaches for
|
|
65
|
+
// the misleading reading again.
|
|
66
|
+
|
|
67
|
+
const version_targets = {
|
|
68
|
+
build_pnpm_ls_arguments,
|
|
69
|
+
parse_global_version,
|
|
70
|
+
parse_project_version,
|
|
71
|
+
read_global_version,
|
|
72
|
+
read_project_version,
|
|
73
|
+
project_package_path,
|
|
74
|
+
read_workspace_version,
|
|
75
|
+
// The manifest's filename. Exported rather than re-declared in each of `josh release`'s two
|
|
76
|
+
// halves (joshuafolkken/kit#1169): the module that already owns "where the project's manifest is"
|
|
77
|
+
// is where the name belongs.
|
|
78
|
+
PACKAGE_JSON,
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export { version_targets }
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { json_object_schema } from '#scripts/lib/schemas'
|
|
2
|
+
import { load, loadAll, YAMLException } from 'js-yaml'
|
|
3
|
+
|
|
4
|
+
// js-yaml 5 throws "expected a document, but the input is empty" for input with no document node
|
|
5
|
+
// (empty / whitespace / comment-only), whereas js-yaml 4 returned undefined. Restore the v4
|
|
6
|
+
// semantics so reading an empty or comment-only file yields {} instead of throwing.
|
|
7
|
+
const EMPTY_YAML_REASON = 'expected a document, but the input is empty'
|
|
8
|
+
|
|
9
|
+
function load_yaml_or_empty(content: string): unknown {
|
|
10
|
+
try {
|
|
11
|
+
return load(content)
|
|
12
|
+
} catch (error) {
|
|
13
|
+
if (error instanceof YAMLException && error.reason === EMPTY_YAML_REASON) return {}
|
|
14
|
+
throw error
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Shared by every reader that needs a YAML file as a plain object: the config-merge list patcher
|
|
19
|
+
// and the overrides protection check both parse `pnpm-workspace.yaml`-shaped documents, and a
|
|
20
|
+
// second copy of the empty-document handling would drift the moment js-yaml changes again.
|
|
21
|
+
function parse_yaml(content: string): Record<string, unknown> {
|
|
22
|
+
const raw = load_yaml_or_empty(content)
|
|
23
|
+
if (raw === null || raw === undefined) return {}
|
|
24
|
+
|
|
25
|
+
return json_object_schema.parse(raw)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function is_mapping_document(value: unknown): value is Record<string, unknown> {
|
|
29
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// pnpm 11 writes pnpm-lock.yaml as a multi-document stream (the package-manager document, then the
|
|
33
|
+
// dependency graph), which `load` rejects outright. Non-mapping documents are dropped rather than
|
|
34
|
+
// rejected: a reader only ever looks up keys, and a stream that legitimately carries a scalar
|
|
35
|
+
// document should not make the whole file unreadable.
|
|
36
|
+
// js-yaml 5.3 deprecated the iterator overload ("Iterator is not supported"); the plain
|
|
37
|
+
// `loadAll(content)` form returns the documents as an array and is the supported replacement.
|
|
38
|
+
function parse_yaml_documents(content: string): Array<Record<string, unknown>> {
|
|
39
|
+
if (content.trim().length === 0) return []
|
|
40
|
+
|
|
41
|
+
return loadAll(content).filter(is_mapping_document)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const yaml_document = { is_mapping_document, parse_yaml, parse_yaml_documents }
|
|
45
|
+
|
|
46
|
+
export { yaml_document }
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const GATE_LINT = 'pnpm run lint'
|
|
2
|
+
const GATE_CHECK_CI = 'pnpm josh check:svelte:ci'
|
|
3
|
+
const GATE_CSPELL = 'pnpm josh cspell:dot'
|
|
4
|
+
const GATE_TEST_UNIT = 'pnpm josh test:unit'
|
|
5
|
+
|
|
6
|
+
const COMPLETION_GATE_STEPS: ReadonlyArray<string> = [
|
|
7
|
+
GATE_LINT,
|
|
8
|
+
GATE_CHECK_CI,
|
|
9
|
+
GATE_CSPELL,
|
|
10
|
+
GATE_TEST_UNIT,
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
export { COMPLETION_GATE_STEPS, GATE_LINT, GATE_CHECK_CI, GATE_CSPELL, GATE_TEST_UNIT }
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Check an existing epic Issue against the four requirements, reporting each as pass or fail.
|
|
4
|
+
*
|
|
5
|
+
* Usage: tsx scripts-ai/epic-check.ts <issue-number>
|
|
6
|
+
*/
|
|
7
|
+
import { git_epic_run } from '../scripts/git/git-epic-run'
|
|
8
|
+
import { epic_cli } from './epic-cli'
|
|
9
|
+
|
|
10
|
+
const ARGV_OFFSET = 2
|
|
11
|
+
const USAGE = 'Usage: josh epic:check <issue-number>'
|
|
12
|
+
const FAILURE_EXIT_CODE = 1
|
|
13
|
+
|
|
14
|
+
async function main(): Promise<void> {
|
|
15
|
+
const epic_number = epic_cli.parse_check_argument(process.argv.slice(ARGV_OFFSET))
|
|
16
|
+
|
|
17
|
+
if (epic_number === undefined) {
|
|
18
|
+
console.error(`✖ An epic issue number is required.\n${USAGE}`)
|
|
19
|
+
process.exit(FAILURE_EXIT_CODE)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const exit_code = await git_epic_run.check_epic(epic_number)
|
|
23
|
+
|
|
24
|
+
if (exit_code !== 0) process.exit(exit_code)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// A `gh` failure carries its stderr as the message, which is the useful part; printing it alone
|
|
28
|
+
// keeps a routine "not authenticated" from arriving as a stack trace.
|
|
29
|
+
try {
|
|
30
|
+
await main()
|
|
31
|
+
} catch (error) {
|
|
32
|
+
console.error(`✖ ${error instanceof Error ? error.message : String(error)}`)
|
|
33
|
+
process.exit(FAILURE_EXIT_CODE)
|
|
34
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// The argument-reading primitives every `josh epic` form shares.
|
|
2
|
+
//
|
|
3
|
+
// They were private to `epic-cli.ts` until `--remove` needed the same four (joshuafolkken/kit#1712),
|
|
4
|
+
// at which point the choice was to copy them or to name them. Copying is what `CLAUDE.md` prohibits,
|
|
5
|
+
// and the failure it would produce is specific: two readers disagreeing about what counts as a flag
|
|
6
|
+
// value would have one form silently take a `--decision-file` path for an issue number.
|
|
7
|
+
|
|
8
|
+
const FLAG_PREFIX = '--'
|
|
9
|
+
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
10
|
+
|
|
11
|
+
function is_flag(argument: string): boolean {
|
|
12
|
+
return argument.startsWith(FLAG_PREFIX)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function read_flag_value(argv: ReadonlyArray<string>, flag: string): string | undefined {
|
|
16
|
+
const index = argv.indexOf(flag)
|
|
17
|
+
if (index === -1) return undefined
|
|
18
|
+
|
|
19
|
+
return argv[index + 1]
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// A value-taking flag's argument must not be mistaken for a child issue number, so the argument
|
|
23
|
+
// directly after one is dropped along with the flag itself.
|
|
24
|
+
function is_flag_value(
|
|
25
|
+
argv: ReadonlyArray<string>,
|
|
26
|
+
index: number,
|
|
27
|
+
value_flags: ReadonlySet<string>,
|
|
28
|
+
): boolean {
|
|
29
|
+
return value_flags.has(argv[index - 1] ?? '')
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// **Which flags consume the argument after them is per parser, not module-wide**: `--before` takes a
|
|
33
|
+
// value only under `--add`, and treating it as one everywhere had `josh epic "T" 101 102 --after 103`
|
|
34
|
+
// silently drop #103 from the new epic instead of ignoring an unknown flag (joshuafolkken/kit#890).
|
|
35
|
+
function to_positional_arguments(
|
|
36
|
+
argv: ReadonlyArray<string>,
|
|
37
|
+
value_flags: ReadonlySet<string>,
|
|
38
|
+
): Array<string> {
|
|
39
|
+
return argv.filter(
|
|
40
|
+
(argument, index) => !is_flag(argument) && !is_flag_value(argv, index, value_flags),
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function count_flag(argv: ReadonlyArray<string>, flag: string): number {
|
|
45
|
+
return argv.filter((argument) => argument === flag).length
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// A value-taking flag given without a usable value: last on the line, or followed by another flag.
|
|
49
|
+
// **Refused rather than read as "none was asked for"** — `--decision-file` is passed precisely because
|
|
50
|
+
// the record has to exist, so a shell that ate the path would otherwise land the edit, write no
|
|
51
|
+
// record, post no comment and exit 0: success reported for half the job. Repeated, it names two
|
|
52
|
+
// records, which is refused for the reason two positioning flags are (joshuafolkken/kit#1350).
|
|
53
|
+
function is_value_unusable(argv: ReadonlyArray<string>, flag: string): boolean {
|
|
54
|
+
if (!argv.includes(flag)) return false
|
|
55
|
+
if (count_flag(argv, flag) > 1) return true
|
|
56
|
+
const value = read_flag_value(argv, flag)
|
|
57
|
+
|
|
58
|
+
return value === undefined || is_flag(value)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// `--add` and `--remove` refuse a flag they do not know, unlike creation and promotion which ignore
|
|
62
|
+
// one. A typo there costs a flag; here a mistyped flag would leave its value positional, so it
|
|
63
|
+
// becomes an issue number and the edit silently lands somewhere else (joshuafolkken/kit#890).
|
|
64
|
+
function has_unknown_flag(argv: ReadonlyArray<string>, known: ReadonlySet<string>): boolean {
|
|
65
|
+
return argv.some((argument) => is_flag(argument) && !known.has(argument))
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const epic_cli_argv = {
|
|
69
|
+
is_flag,
|
|
70
|
+
read_flag_value,
|
|
71
|
+
to_positional_arguments,
|
|
72
|
+
count_flag,
|
|
73
|
+
is_value_unusable,
|
|
74
|
+
has_unknown_flag,
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export { epic_cli_argv, ISSUE_NUMBER_PATTERN }
|