@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,20 @@
|
|
|
1
|
+
import type { CommandEntry } from './josh-command-types'
|
|
2
|
+
|
|
3
|
+
// The `split:assess` command registry, split out of `josh-commands-ai.ts` so that file stays under its
|
|
4
|
+
// 300-code-line limit, exactly as `LANE_COMMANDS` was for the same reason (joshuafolkken/kit#2162,
|
|
5
|
+
// joshuafolkken/kit#2218). It is spread into `AI_COMMANDS` so the command stays grouped with the other
|
|
6
|
+
// decision oracles under the 'AI tools' category.
|
|
7
|
+
|
|
8
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
9
|
+
const SPLIT_COMMANDS: Record<string, CommandEntry> = {
|
|
10
|
+
'split:assess': {
|
|
11
|
+
script: 'scripts/split/split-assess-cli.ts',
|
|
12
|
+
description:
|
|
13
|
+
'Measure the branch change size (tests excluded) and answer the split assessment size question: split | single',
|
|
14
|
+
category: 'AI tools',
|
|
15
|
+
reference: ['[--json]', 'automation', ['none']],
|
|
16
|
+
},
|
|
17
|
+
}
|
|
18
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
19
|
+
|
|
20
|
+
export { SPLIT_COMMANDS }
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { CommandEntry } from './josh-command-types'
|
|
2
|
+
|
|
3
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
4
|
+
const VERSIONING_COMMANDS: Record<string, CommandEntry> = {
|
|
5
|
+
bump: {
|
|
6
|
+
script: 'scripts/version/bump-version.ts',
|
|
7
|
+
description: 'Bump package version',
|
|
8
|
+
category: 'Versioning',
|
|
9
|
+
reference: ['[major|minor|patch]', 'maintainer', ['files']],
|
|
10
|
+
},
|
|
11
|
+
version: {
|
|
12
|
+
script: 'scripts/version/version-check.ts',
|
|
13
|
+
description: 'Show kit versions; --upgrade updates the global and project install',
|
|
14
|
+
category: 'Versioning',
|
|
15
|
+
reference: ['[--upgrade]', 'developer', ['files', 'network', 'processes']],
|
|
16
|
+
},
|
|
17
|
+
// A `script` entry, not a shell one: script paths resolve against the kit package root, so this
|
|
18
|
+
// keeps working from a consumer repo where the file lives under node_modules. The registry
|
|
19
|
+
// probes need NODE_AUTH_TOKEN for any `@joshuafolkken/*` dependency; `josh latest` exports it
|
|
20
|
+
// before chaining here, exactly as it already does for `latest:update`.
|
|
21
|
+
ranges: {
|
|
22
|
+
script: 'scripts/version/publishable-range-check.ts',
|
|
23
|
+
description: 'Check that every published dependency range still resolves for a consumer',
|
|
24
|
+
category: 'Versioning',
|
|
25
|
+
reference: ['', 'developer', ['network']],
|
|
26
|
+
},
|
|
27
|
+
// The one place that decides a version (joshuafolkken/kit#1169). A `script` entry for the same
|
|
28
|
+
// reason `ranges` is one: script paths resolve against the kit package root, so it keeps working
|
|
29
|
+
// from a consumer repository where the file lives under node_modules.
|
|
30
|
+
release: {
|
|
31
|
+
script: 'scripts/release/release-cli.ts',
|
|
32
|
+
description: 'Release the merges main has taken since the version last changed',
|
|
33
|
+
category: 'Versioning',
|
|
34
|
+
reference: ['[version]', 'maintainer', ['git', 'network', 'release']],
|
|
35
|
+
},
|
|
36
|
+
// The read-only half of the one above (joshuafolkken/kit#1582). `release --dry-run` cannot
|
|
37
|
+
// answer this question: it refuses off the default branch and on a dirty tree, which is every
|
|
38
|
+
// position a run asks it from. A `script` entry for the same reason `release` is one.
|
|
39
|
+
'release:scope': {
|
|
40
|
+
script: 'scripts/release/release-scope-cli.ts',
|
|
41
|
+
description: 'Say whether a release is owed, from the unreleased merges on main',
|
|
42
|
+
category: 'Versioning',
|
|
43
|
+
reference: ['[--json]', 'automation', ['none']],
|
|
44
|
+
},
|
|
45
|
+
}
|
|
46
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
47
|
+
|
|
48
|
+
export { VERSIONING_COMMANDS }
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { OPTIONAL_ENV_FILE_FLAGS, type CommandEntry } from './josh-command-types'
|
|
2
|
+
|
|
3
|
+
const GIT_WORKFLOW_SCRIPT = 'scripts-ai/git-workflow.ts'
|
|
4
|
+
const GIT_MESSAGE_ARGUMENTS = '[-y] <message>'
|
|
5
|
+
|
|
6
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
7
|
+
const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
|
|
8
|
+
git: {
|
|
9
|
+
script: GIT_WORKFLOW_SCRIPT,
|
|
10
|
+
description: 'Git workflow helper',
|
|
11
|
+
category: 'Workflow',
|
|
12
|
+
reference: [GIT_MESSAGE_ARGUMENTS, 'developer', ['git', 'network']],
|
|
13
|
+
},
|
|
14
|
+
pr: {
|
|
15
|
+
script: GIT_WORKFLOW_SCRIPT,
|
|
16
|
+
description: 'Create PR only (skip commit and push)',
|
|
17
|
+
category: 'Workflow',
|
|
18
|
+
// Not `GIT_MESSAGE_ARGUMENTS`: `-y` is already in the default arguments below, so advertising
|
|
19
|
+
// it would document a flag that cannot change what this command does.
|
|
20
|
+
reference: ['<message>', 'developer', ['network']],
|
|
21
|
+
default_script_arguments: ['-y', '--skip-commit', '--skip-push'],
|
|
22
|
+
},
|
|
23
|
+
// **The optional form, on both** (joshuafolkken/kit#1564). These two were the last commands
|
|
24
|
+
// passing the mandatory `--env-file=.env`, which node resolves before the script's first line: on
|
|
25
|
+
// a machine with no `.env` they died as `.env: not found` with exit code 9, even where
|
|
26
|
+
// `TELEGRAM_BOT_TOKEN` and `TELEGRAM_CHAT_ID` existed as real environment variables — a cloud
|
|
27
|
+
// session, and `followup` with them the merge step of every `fullrun` there. `doctor` was moved to
|
|
28
|
+
// this form for the same reason in joshuafolkken/kit#869.
|
|
29
|
+
//
|
|
30
|
+
// Nothing is lost by relaxing it: both scripts already call `load_optional_environment()`
|
|
31
|
+
// themselves, so the file is read either way and node's precedence — an existing environment
|
|
32
|
+
// variable wins over the file — is node's own in both spellings.
|
|
33
|
+
//
|
|
34
|
+
// **What the mandatory flag was accidentally providing was noise**, and that is replaced rather
|
|
35
|
+
// than dropped: `telegram_notify.send` now throws on missing credentials and on a failed send, so
|
|
36
|
+
// `josh notify` exits non-zero instead of warning and answering 0.
|
|
37
|
+
followup: {
|
|
38
|
+
script: 'scripts-ai/git-followup-workflow.ts',
|
|
39
|
+
description: 'Follow-up git workflow',
|
|
40
|
+
category: 'Workflow',
|
|
41
|
+
reference: [
|
|
42
|
+
'<title> [--notify-message <text>]',
|
|
43
|
+
'automation',
|
|
44
|
+
['git', 'network', 'notifications'],
|
|
45
|
+
],
|
|
46
|
+
tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
|
|
47
|
+
},
|
|
48
|
+
notify: {
|
|
49
|
+
script: 'scripts-ai/telegram-test.ts',
|
|
50
|
+
description: 'Send Telegram notification',
|
|
51
|
+
category: 'Workflow',
|
|
52
|
+
reference: ['--task-type <type> --body <text>', 'automation', ['notifications']],
|
|
53
|
+
tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
|
|
54
|
+
},
|
|
55
|
+
// The observation ledger's only commit path (joshuafolkken/kit#1756). `pnpm josh git` excludes the
|
|
56
|
+
// ledger from what it stages, so without this command a parent's appended line has no route to the
|
|
57
|
+
// default branch at all — and the recurrence count the promotion rule reads is a count of main.
|
|
58
|
+
'observations:flush': {
|
|
59
|
+
script: 'scripts/observations/observations-flush-cli.ts',
|
|
60
|
+
description: 'Commit the observation ledger as a pull request of its own, and merge it',
|
|
61
|
+
category: 'Workflow',
|
|
62
|
+
reference: ['', 'automation', ['git', 'network']],
|
|
63
|
+
},
|
|
64
|
+
// The one write path for a `/code-review` round's findings (joshuafolkken/kit#2325), plus the
|
|
65
|
+
// `--check` gate `followup` runs before it merges (joshuafolkken/kit#2343). It appends a `- rf:`
|
|
66
|
+
// line per finding — or one zero-finding line for a clean round — to the observation ledger, so
|
|
67
|
+
// `observations:flush` commits them and the recurrence count survives the run.
|
|
68
|
+
'review:record': {
|
|
69
|
+
script: 'scripts/review/review-record-cli.ts',
|
|
70
|
+
description: 'Record a review round’s findings, or check a round was recorded',
|
|
71
|
+
category: 'Workflow',
|
|
72
|
+
reference: [
|
|
73
|
+
'--issue <N> [<category>:<severity>:<file> ...] | --check --issue <N>',
|
|
74
|
+
'automation',
|
|
75
|
+
['files'],
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
// The reader over what `review:record` wrote (joshuafolkken/kit#2325): each recurring category’s
|
|
79
|
+
// count, and the number of zero-finding rounds that distinguishes a quiet category from an unwatched one.
|
|
80
|
+
'review:findings': {
|
|
81
|
+
script: 'scripts/review/review-findings-cli.ts',
|
|
82
|
+
description: 'Count review findings by category from the observation ledger',
|
|
83
|
+
category: 'Workflow',
|
|
84
|
+
reference: ['', 'developer', ['files']],
|
|
85
|
+
},
|
|
86
|
+
// After a behavior-change Issue merges, re-run its declared baseline and print before/after; a value
|
|
87
|
+
// that did not move appends a refuted-premise line to the observation ledger (joshuafolkken/kit#2212).
|
|
88
|
+
'measure:rerun': {
|
|
89
|
+
script: 'scripts/issue/measure-rerun-cli.ts',
|
|
90
|
+
description: 'Re-run a merged issue’s baseline command and print the before/after pair',
|
|
91
|
+
category: 'Workflow',
|
|
92
|
+
reference: ['<path>', 'automation', ['processes', 'files']],
|
|
93
|
+
},
|
|
94
|
+
// A script rather than an `sh -c` chain, because it has a precondition to enforce: run inside a
|
|
95
|
+
// linked work tree it would hijack the default branch from every other one (joshuafolkken/kit#1535).
|
|
96
|
+
'main:sync': {
|
|
97
|
+
script: 'scripts/git/main-sync.ts',
|
|
98
|
+
description:
|
|
99
|
+
'Checkout default branch, pull latest, and prune merged remote-gone branches (refuses inside a lane)',
|
|
100
|
+
category: 'Workflow',
|
|
101
|
+
reference: ['', 'developer', ['git', 'network']],
|
|
102
|
+
},
|
|
103
|
+
// A script rather than an `sh -c` chain, because the strategy has to be named rather than left to
|
|
104
|
+
// the caller's git configuration: the `git pull` this replaced aborted with `Need to specify how
|
|
105
|
+
// to reconcile divergent branches` on exactly the diverged branch the command exists for
|
|
106
|
+
// (joshuafolkken/kit#1659).
|
|
107
|
+
'main:merge': {
|
|
108
|
+
script: 'scripts/git/main-merge.ts',
|
|
109
|
+
description: 'Merge origin default branch into the current branch',
|
|
110
|
+
category: 'Workflow',
|
|
111
|
+
reference: ['', 'developer', ['git', 'network']],
|
|
112
|
+
},
|
|
113
|
+
}
|
|
114
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
115
|
+
|
|
116
|
+
export { WORKFLOW_COMMANDS }
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { CommandEntry } from './josh-command-types'
|
|
2
|
+
|
|
3
|
+
const SHELL_INTERPRETERS: ReadonlySet<string> = new Set(['sh', 'bash', 'zsh', 'dash'])
|
|
4
|
+
const SHELL_COMMAND_FLAG = '-c'
|
|
5
|
+
const PATH_SEPARATOR = '/'
|
|
6
|
+
const USAGE_ERROR_EXIT_CODE = 1
|
|
7
|
+
|
|
8
|
+
// The interpreter is matched on its basename so an absolute path counts too: `/bin/sh -c` behaves
|
|
9
|
+
// exactly like `sh -c`, and the repo already spells it both ways.
|
|
10
|
+
function is_shell_interpreter(executable: string): boolean {
|
|
11
|
+
return SHELL_INTERPRETERS.has(executable.split(PATH_SEPARATOR).at(-1) ?? executable)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// `sh -c '<script>'` turns anything appended into the shell's positional parameters. The script
|
|
15
|
+
// string never expands them, so the arguments vanish without a word — `josh test --workers=1`
|
|
16
|
+
// reads as a serial run while the suite stays parallel, and a green or red result is attributed
|
|
17
|
+
// to a configuration that was never applied. Detecting the shape instead of tagging each command
|
|
18
|
+
// is what makes this permanent: a composite added later cannot reopen the hole by forgetting to
|
|
19
|
+
// opt in. Non-composite entries (`pnpm exec prettier --check .`) append to the real tool and
|
|
20
|
+
// forward correctly, so they keep doing so.
|
|
21
|
+
function is_composite_shell(shell: ReadonlyArray<string> | undefined): boolean {
|
|
22
|
+
const [executable, flag] = shell ?? []
|
|
23
|
+
if (executable === undefined) return false
|
|
24
|
+
|
|
25
|
+
return is_shell_interpreter(executable) && flag === SHELL_COMMAND_FLAG
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function format_targets(targets: ReadonlyArray<string>): string {
|
|
29
|
+
return targets.map((target) => `josh ${target}`).join(' or ')
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function format_rejection(cmd: string, targets: ReadonlyArray<string>): string {
|
|
33
|
+
const hint =
|
|
34
|
+
targets.length > 0
|
|
35
|
+
? `pass them to ${format_targets(targets)} instead`
|
|
36
|
+
: 'it runs a fixed sequence and forwards nothing'
|
|
37
|
+
|
|
38
|
+
return `josh ${cmd} takes no extra arguments — ${hint}`
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Returns the message to print, or undefined when the invocation is fine. Keeping the decision
|
|
42
|
+
// separate from the printing lets the rule be asserted without capturing console output.
|
|
43
|
+
function reject_extra_arguments(
|
|
44
|
+
cmd: string,
|
|
45
|
+
entry: CommandEntry,
|
|
46
|
+
extra: ReadonlyArray<string>,
|
|
47
|
+
): string | undefined {
|
|
48
|
+
if (extra.length === 0 || !is_composite_shell(entry.shell)) return undefined
|
|
49
|
+
|
|
50
|
+
return format_rejection(cmd, entry.argument_targets ?? [])
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const composite_arguments = { format_rejection, is_composite_shell, reject_extra_arguments }
|
|
54
|
+
|
|
55
|
+
export { composite_arguments, USAGE_ERROR_EXIT_CODE }
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ENV_FILE_NAME } from '#ports'
|
|
2
|
+
|
|
3
|
+
// Loading `.env` from inside a command, for the commands that must stay in-process.
|
|
4
|
+
//
|
|
5
|
+
// **The flag form is what most commands use, and it is not free.** Declaring any `tsx_arguments`
|
|
6
|
+
// disqualifies a command from in-process dispatch (`josh-in-process.ts`), which puts a second
|
|
7
|
+
// ~0.16 s tsx start in front of every call — the hot path joshuafolkken/kit#1342 took it off. A
|
|
8
|
+
// command a hook fires on every `Bash` call, or one an unattended `epicrun` polls every sixty
|
|
9
|
+
// seconds, cannot pay that, so it reads the file itself instead.
|
|
10
|
+
//
|
|
11
|
+
// `process.loadEnvFile` is node's own `--env-file` parser and keeps node's precedence: a value
|
|
12
|
+
// already in the environment wins over the file's. A missing or unreadable file is swallowed,
|
|
13
|
+
// exactly as `--env-file-if-exists` does.
|
|
14
|
+
//
|
|
15
|
+
// **Call it only on the real command path** — inside the `import.meta.url` guard, or the hook's own
|
|
16
|
+
// entry — never from a function a unit test calls, so a developer's own `.env` cannot decide what
|
|
17
|
+
// the tests see.
|
|
18
|
+
function load_environment_file(): void {
|
|
19
|
+
try {
|
|
20
|
+
process.loadEnvFile(ENV_FILE_NAME)
|
|
21
|
+
} catch {
|
|
22
|
+
// No `.env` beside this project, or one this process may not read. The caller then reads from
|
|
23
|
+
// the environment alone, which is what it did before any file existed.
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const josh_environment_file = {
|
|
28
|
+
load_environment_file,
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { josh_environment_file }
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { realpathSync } from 'node:fs'
|
|
2
|
+
import { pathToFileURL } from 'node:url'
|
|
3
|
+
import type { CommandEntry } from './josh-command-types'
|
|
4
|
+
|
|
5
|
+
// `pnpm josh <script command>` started tsx twice — once for this dispatcher, once for the script it
|
|
6
|
+
// spawned. Measured on 2026-09-04, the second start was about 0.16 s of the 0.55 s a
|
|
7
|
+
// `pnpm josh format:edited` took, and the edit/Bash hook pays it 60–90 times in a single run
|
|
8
|
+
// (joshuafolkken/kit#1342). The script is ordinary TypeScript and a TypeScript loader is already
|
|
9
|
+
// installed by the time this file runs, so the dispatcher evaluates the script itself instead.
|
|
10
|
+
const TYPESCRIPT_EXTENSION = '.ts'
|
|
11
|
+
const FAILURE_EXIT_CODE = 1
|
|
12
|
+
|
|
13
|
+
// The dispatcher may only load a `.ts` script in its own process when it was itself loaded as
|
|
14
|
+
// TypeScript — which is exactly the condition under which a loader capable of it is present. A
|
|
15
|
+
// consumer runs the bundled `dist/josh.js` under plain node, whose `import.meta.url` ends in `.js`,
|
|
16
|
+
// so that install keeps the spawning path unchanged rather than failing on a module node cannot
|
|
17
|
+
// load at all.
|
|
18
|
+
function is_typescript_dispatcher(dispatcher_url: string): boolean {
|
|
19
|
+
return dispatcher_url.endsWith(TYPESCRIPT_EXTENSION)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// `tsx_arguments` are node flags the script needs *before* its own code runs — today every one of
|
|
23
|
+
// them a form of `--env-file`, which has no in-process equivalent that reproduces node's own
|
|
24
|
+
// parsing and precedence. Those commands (`doctor`, `latest:scope`, `followup`, `notify`) keep a
|
|
25
|
+
// process of their own; each runs at most a few times per run, so none of them is where the cost
|
|
26
|
+
// this saves accumulates.
|
|
27
|
+
function can_run_in_process(entry: CommandEntry, dispatcher_url: string): boolean {
|
|
28
|
+
if (entry.script === undefined || entry.tsx_arguments !== undefined) return false
|
|
29
|
+
|
|
30
|
+
return is_typescript_dispatcher(dispatcher_url)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// `process.exitCode` is typed `number | string | undefined`. Only the numeric form is an exit code
|
|
34
|
+
// this dispatcher can forward, and an unset one means the script finished without asking for one.
|
|
35
|
+
function read_exit_code(): number {
|
|
36
|
+
const code = process.exitCode
|
|
37
|
+
|
|
38
|
+
return typeof code === 'number' ? code : 0
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ESM resolution follows symlinks, so the `import.meta.url` a script's guard compares against is
|
|
42
|
+
// its real path. The argv this dispatcher builds has to be that same string: a checkout
|
|
43
|
+
// reached through a symlink would otherwise import the script cleanly, run nothing and answer 0. A
|
|
44
|
+
// path that cannot be resolved is left as it is, so the import below reports the failure.
|
|
45
|
+
function resolve_real_path(script_path: string): string {
|
|
46
|
+
try {
|
|
47
|
+
return realpathSync(script_path)
|
|
48
|
+
} catch {
|
|
49
|
+
return script_path
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Every josh script decides whether to run its own main from
|
|
54
|
+
// `process.argv[1] === fileURLToPath(import.meta.url)`, so the dispatcher's argv is replaced with
|
|
55
|
+
// the one the spawned process would have had before the module is evaluated. It is deliberately not
|
|
56
|
+
// restored afterwards: the script is the program from here on, and anything it deferred past module
|
|
57
|
+
// evaluation would otherwise read the dispatcher's argv instead of its own.
|
|
58
|
+
async function run_in_process(
|
|
59
|
+
script_path: string,
|
|
60
|
+
script_arguments: ReadonlyArray<string>,
|
|
61
|
+
): Promise<number> {
|
|
62
|
+
const resolved_path = resolve_real_path(script_path)
|
|
63
|
+
|
|
64
|
+
process.argv = [process.execPath, resolved_path, ...script_arguments]
|
|
65
|
+
|
|
66
|
+
try {
|
|
67
|
+
await import(pathToFileURL(resolved_path).href)
|
|
68
|
+
} catch (error) {
|
|
69
|
+
// A spawned tsx printed the stack and exited 1; the same failure has to look the same here.
|
|
70
|
+
console.error(error)
|
|
71
|
+
|
|
72
|
+
return FAILURE_EXIT_CODE
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return read_exit_code()
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const josh_in_process = { can_run_in_process, run_in_process }
|
|
79
|
+
|
|
80
|
+
export { FAILURE_EXIT_CODE, josh_in_process }
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { resolve_local_bin, resolve_package_bin } from '#scripts/build/local-bin'
|
|
5
|
+
import { package_version_schema } from '#scripts/lib/schemas'
|
|
6
|
+
import { resolve_spawn_exit } from '#scripts/lib/spawn-exit'
|
|
7
|
+
import { execaSync } from 'execa'
|
|
8
|
+
import { command_suggest } from './command-suggest'
|
|
9
|
+
import {
|
|
10
|
+
ALIASES,
|
|
11
|
+
CATEGORY_ORDER,
|
|
12
|
+
COMMAND_MAP,
|
|
13
|
+
type CommandCategory,
|
|
14
|
+
type CommandEntry,
|
|
15
|
+
} from './josh-command-map'
|
|
16
|
+
import { composite_arguments, USAGE_ERROR_EXIT_CODE } from './josh-composite-arguments'
|
|
17
|
+
import { josh_in_process } from './josh-in-process'
|
|
18
|
+
import { kit_only } from './kit-only'
|
|
19
|
+
|
|
20
|
+
const COLUMN_WIDTH = 26
|
|
21
|
+
const ALIAS_PAD_WIDTH = 2
|
|
22
|
+
const TSX_BIN = 'tsx'
|
|
23
|
+
const TSX_PACKAGE = 'tsx'
|
|
24
|
+
const PACKAGE_JSON = 'package.json'
|
|
25
|
+
// Not an exit code the shell ever sees: `josh.ts` reads it as "no such command" and answers with
|
|
26
|
+
// the listing on stderr. It is named because `run_command` now reports through a promise, where a
|
|
27
|
+
// bare `-1` is one step further from the check that reads it.
|
|
28
|
+
const UNKNOWN_COMMAND_EXIT_CODE = -1
|
|
29
|
+
|
|
30
|
+
interface TsxRunner {
|
|
31
|
+
executable: string
|
|
32
|
+
leading_arguments: ReadonlyArray<string>
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Resolve the kit package root by ascending to the nearest package.json. This works both
|
|
36
|
+
// from the bundled dist/josh.js (one level under the root) and from the tsx source at
|
|
37
|
+
// scripts/josh/ (two levels), so this file's depth no longer has to be hard-coded.
|
|
38
|
+
function find_package_directory(start_directory: string): string {
|
|
39
|
+
let current = start_directory
|
|
40
|
+
|
|
41
|
+
while (!existsSync(path.join(current, PACKAGE_JSON))) {
|
|
42
|
+
const parent = path.dirname(current)
|
|
43
|
+
if (parent === current) return start_directory
|
|
44
|
+
current = parent
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return current
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const PACKAGE_DIR = find_package_directory(path.dirname(fileURLToPath(import.meta.url)))
|
|
51
|
+
|
|
52
|
+
function resolve_tsx_executable(): string {
|
|
53
|
+
const candidates = [
|
|
54
|
+
resolve_local_bin(PACKAGE_DIR, TSX_BIN),
|
|
55
|
+
resolve_local_bin(process.cwd(), TSX_BIN),
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
return candidates.find(existsSync) ?? TSX_BIN
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Locating the CLI entry through tsx's own manifest never consults pnpm's generated shim, which
|
|
62
|
+
// hardcodes a store path a later bump prunes. The resolution itself is `resolve_package_bin` —
|
|
63
|
+
// shared with the format hook's eslint route rather than written twice (joshuafolkken/kit#1259).
|
|
64
|
+
function resolve_tsx_cli_entry(): string | undefined {
|
|
65
|
+
for (const base_directory of [PACKAGE_DIR, process.cwd()]) {
|
|
66
|
+
const cli_entry = resolve_package_bin(base_directory, TSX_PACKAGE, TSX_BIN)
|
|
67
|
+
if (cli_entry !== undefined) return cli_entry
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return undefined
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Preferred: run the resolved CLI entry with the current node binary. The `.bin` shim lookup
|
|
74
|
+
// stays as a fallback for layouts where tsx is not resolvable from either manifest.
|
|
75
|
+
function resolve_tsx_runner(): TsxRunner {
|
|
76
|
+
const cli_entry = resolve_tsx_cli_entry()
|
|
77
|
+
|
|
78
|
+
if (cli_entry !== undefined) {
|
|
79
|
+
return { executable: process.execPath, leading_arguments: [cli_entry] }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return { executable: resolve_tsx_executable(), leading_arguments: [] }
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function read_package_version(): string {
|
|
86
|
+
const raw = readFileSync(path.join(PACKAGE_DIR, PACKAGE_JSON), 'utf8')
|
|
87
|
+
|
|
88
|
+
return package_version_schema.parse(JSON.parse(raw)).version
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const HEADER = `josh v${read_package_version()} — Joshua Folkken's dev toolkit`
|
|
92
|
+
const USAGE = 'Usage: josh <command> [options]'
|
|
93
|
+
const ALL_HINT = "Run 'josh --all' to list every available command."
|
|
94
|
+
|
|
95
|
+
function build_alias_lookup(): Map<string, string> {
|
|
96
|
+
const lookup = new Map<string, string>()
|
|
97
|
+
for (const [alias, cmd] of Object.entries(ALIASES)) lookup.set(cmd, alias)
|
|
98
|
+
|
|
99
|
+
return lookup
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function resolve_alias(cmd: string): string {
|
|
103
|
+
return Object.hasOwn(ALIASES, cmd) ? (ALIASES[cmd] ?? cmd) : cmd
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function format_command_line(cmd: string, entry: CommandEntry, alias?: string): string {
|
|
107
|
+
const prefix = alias ? `${alias}, `.padEnd(ALIAS_PAD_WIDTH + ALIAS_PAD_WIDTH) : ''
|
|
108
|
+
|
|
109
|
+
return ` ${(prefix + cmd).padEnd(COLUMN_WIDTH)}${entry.description}`
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function format_category_section(
|
|
113
|
+
category: CommandCategory,
|
|
114
|
+
entries: Array<[string, CommandEntry]>,
|
|
115
|
+
alias_lookup: Map<string, string>,
|
|
116
|
+
): string {
|
|
117
|
+
const lines = entries.map(([cmd, entry]) =>
|
|
118
|
+
format_command_line(cmd, entry, alias_lookup.get(cmd)),
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
return [`${category}:`, ...lines].join('\n')
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// The command reference owns the audience decision for both kit and consumer help.
|
|
125
|
+
function is_visible_command(entry: CommandEntry, is_all: boolean, is_consumer: boolean): boolean {
|
|
126
|
+
if (is_consumer && kit_only.is_kit_only(entry)) return false
|
|
127
|
+
|
|
128
|
+
return is_all || entry.reference[1] === 'developer'
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function collect_visible(
|
|
132
|
+
is_all: boolean,
|
|
133
|
+
is_consumer: boolean,
|
|
134
|
+
): Map<CommandCategory, Array<[string, CommandEntry]>> {
|
|
135
|
+
const by_category = new Map<CommandCategory, Array<[string, CommandEntry]>>(
|
|
136
|
+
CATEGORY_ORDER.map((cat) => [cat, []]),
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
for (const [cmd, entry] of Object.entries(COMMAND_MAP)) {
|
|
140
|
+
if (is_visible_command(entry, is_all, is_consumer)) {
|
|
141
|
+
by_category.get(entry.category)?.push([cmd, entry])
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return by_category
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// A category left empty after audience filtering is dropped rather than printed as a bare heading.
|
|
149
|
+
function format_help(is_all = false, is_consumer = false): string {
|
|
150
|
+
const by_category = collect_visible(is_all, is_consumer)
|
|
151
|
+
const alias_lookup = build_alias_lookup()
|
|
152
|
+
const sections = CATEGORY_ORDER.map((cat) => [cat, by_category.get(cat) ?? []] as const)
|
|
153
|
+
.filter(([, entries]) => entries.length > 0)
|
|
154
|
+
.map(([cat, entries]) => format_category_section(cat, entries, alias_lookup))
|
|
155
|
+
const footer = is_all ? USAGE : `${USAGE}\n${ALL_HINT}`
|
|
156
|
+
|
|
157
|
+
return [HEADER, '', sections.join('\n\n'), '', footer].join('\n')
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Every name a user could type — the canonical commands and their aliases — ranked by edit distance
|
|
161
|
+
// so `josh gat` points at `gate` (joshuafolkken/kit#1928).
|
|
162
|
+
function all_command_names(): Array<string> {
|
|
163
|
+
return [...Object.keys(COMMAND_MAP), ...Object.keys(ALIASES)]
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// `josh <unknown>` answers on stderr with a short line rather than the whole listing. A shell
|
|
167
|
+
// substituting `$(josh port dev)` captures stdout alone, so a name this kit cannot resolve — a typo,
|
|
168
|
+
// a retired command — must leave that stream empty rather than dump the toolkit index there, how #825
|
|
169
|
+
// surfaced. It used to print the full help here; #1928 cut that to one line plus a "did you mean"
|
|
170
|
+
// when a close command exists, so the diagnosis is readable and the stdout contract is unchanged.
|
|
171
|
+
// `josh` and `josh --help` still print the listing to stdout, because there it is the answer rather
|
|
172
|
+
// than the diagnosis.
|
|
173
|
+
function format_unknown_command(cmd: string): string {
|
|
174
|
+
const suggestion = command_suggest.closest_command(cmd, all_command_names())
|
|
175
|
+
const hint = suggestion === undefined ? '' : ` Did you mean '${suggestion}'?`
|
|
176
|
+
|
|
177
|
+
return `Unknown command: ${cmd}.${hint} Run 'josh --help' for common commands or 'josh --all' for the full list.`
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// A `.cmd` shim needs the win32 shell to be executable, but the node binary does not — and
|
|
181
|
+
// running it through the shell would break on the spaces in a typical Windows install path.
|
|
182
|
+
function should_use_shell(executable: string): boolean {
|
|
183
|
+
return process.platform === 'win32' && executable !== process.execPath
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function spawn_script(tsx_executable: string, script_arguments: Array<string>): number {
|
|
187
|
+
const result = execaSync(tsx_executable, script_arguments, {
|
|
188
|
+
stdio: 'inherit',
|
|
189
|
+
shell: should_use_shell(tsx_executable),
|
|
190
|
+
reject: false,
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
return resolve_spawn_exit(tsx_executable, result)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function run_shell_command(shell: ReadonlyArray<string>, extra: Array<string>): number {
|
|
197
|
+
const [executable = '', ...rest_arguments] = shell
|
|
198
|
+
const result = execaSync(executable, [...rest_arguments, ...extra], {
|
|
199
|
+
stdio: 'inherit',
|
|
200
|
+
reject: false,
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
return resolve_spawn_exit(executable, result)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function spawn_script_entry(
|
|
207
|
+
entry: CommandEntry,
|
|
208
|
+
script_path: string,
|
|
209
|
+
script_arguments: ReadonlyArray<string>,
|
|
210
|
+
): number {
|
|
211
|
+
const runner = resolve_tsx_runner()
|
|
212
|
+
|
|
213
|
+
return spawn_script(runner.executable, [
|
|
214
|
+
...runner.leading_arguments,
|
|
215
|
+
...(entry.tsx_arguments ?? []),
|
|
216
|
+
script_path,
|
|
217
|
+
...script_arguments,
|
|
218
|
+
])
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Only the in-process branch is genuinely asynchronous; the spawning one answers the moment the
|
|
222
|
+
// child exits. Both are reported as a promise so every caller has one shape to handle, and
|
|
223
|
+
// `josh.ts` awaits it either way (joshuafolkken/kit#1342).
|
|
224
|
+
async function run_script_entry(
|
|
225
|
+
entry: CommandEntry,
|
|
226
|
+
subcommand_arguments: Array<string>,
|
|
227
|
+
): Promise<number> {
|
|
228
|
+
const script_path = path.join(PACKAGE_DIR, entry.script ?? '')
|
|
229
|
+
const script_arguments = [...(entry.default_script_arguments ?? []), ...subcommand_arguments]
|
|
230
|
+
|
|
231
|
+
if (josh_in_process.can_run_in_process(entry, import.meta.url)) {
|
|
232
|
+
return await josh_in_process.run_in_process(script_path, script_arguments)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return spawn_script_entry(entry, script_path, script_arguments)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// The exit a command answers with before it runs, or `undefined` to go ahead: a consumer is refused a
|
|
239
|
+
// kit-only command with guidance, and a composite command rejects extra arguments
|
|
240
|
+
// (joshuafolkken/kit#1988).
|
|
241
|
+
function pre_dispatch_exit(
|
|
242
|
+
resolved: string,
|
|
243
|
+
entry: CommandEntry,
|
|
244
|
+
subcommand_arguments: Array<string>,
|
|
245
|
+
is_consumer: boolean,
|
|
246
|
+
): number | undefined {
|
|
247
|
+
if (is_consumer && kit_only.is_kit_only(entry)) {
|
|
248
|
+
console.error(kit_only.notice(resolved))
|
|
249
|
+
|
|
250
|
+
return USAGE_ERROR_EXIT_CODE
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const rejection = composite_arguments.reject_extra_arguments(
|
|
254
|
+
resolved,
|
|
255
|
+
entry,
|
|
256
|
+
subcommand_arguments,
|
|
257
|
+
)
|
|
258
|
+
if (rejection === undefined) return undefined
|
|
259
|
+
console.error(rejection)
|
|
260
|
+
|
|
261
|
+
return USAGE_ERROR_EXIT_CODE
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
async function dispatch_entry(
|
|
265
|
+
entry: CommandEntry,
|
|
266
|
+
subcommand_arguments: Array<string>,
|
|
267
|
+
): Promise<number> {
|
|
268
|
+
if (entry.shell) return run_shell_command(entry.shell, subcommand_arguments)
|
|
269
|
+
|
|
270
|
+
return await run_script_entry(entry, subcommand_arguments)
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
async function run_command(
|
|
274
|
+
cmd: string,
|
|
275
|
+
subcommand_arguments: Array<string>,
|
|
276
|
+
is_consumer = false,
|
|
277
|
+
): Promise<number> {
|
|
278
|
+
const resolved = resolve_alias(cmd)
|
|
279
|
+
const entry = Object.hasOwn(COMMAND_MAP, resolved) ? COMMAND_MAP[resolved] : undefined
|
|
280
|
+
|
|
281
|
+
if (!entry) return UNKNOWN_COMMAND_EXIT_CODE
|
|
282
|
+
|
|
283
|
+
const early_exit = pre_dispatch_exit(resolved, entry, subcommand_arguments, is_consumer)
|
|
284
|
+
if (early_exit !== undefined) return early_exit
|
|
285
|
+
|
|
286
|
+
return await dispatch_entry(entry, subcommand_arguments)
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const josh_logic = {
|
|
290
|
+
format_help,
|
|
291
|
+
format_unknown_command,
|
|
292
|
+
run_command,
|
|
293
|
+
spawn_script,
|
|
294
|
+
run_shell_command,
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
export type { CommandEntry } from './josh-command-map'
|
|
298
|
+
export { ALIASES, COMMAND_MAP } from './josh-command-map'
|
|
299
|
+
export { SPAWN_ERROR_EXIT_CODE } from '#scripts/lib/spawn-exit'
|
|
300
|
+
export { composite_arguments, USAGE_ERROR_EXIT_CODE } from './josh-composite-arguments'
|
|
301
|
+
export {
|
|
302
|
+
find_package_directory,
|
|
303
|
+
josh_logic,
|
|
304
|
+
resolve_alias,
|
|
305
|
+
resolve_tsx_executable,
|
|
306
|
+
resolve_tsx_runner,
|
|
307
|
+
UNKNOWN_COMMAND_EXIT_CODE,
|
|
308
|
+
}
|