@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,107 @@
|
|
|
1
|
+
import { repo_discovery } from '#scripts/discovery/repo-discovery'
|
|
2
|
+
import { repo_origin } from '#scripts/discovery/repo-origin'
|
|
3
|
+
import type { Release, ReleasePlan } from '#scripts/propagate/propagate-steps'
|
|
4
|
+
import type { PropagateTarget } from '#scripts/propagate/propagate-targets'
|
|
5
|
+
import { self_sync_guard } from '#scripts/self-sync-guard/self-sync-guard-logic'
|
|
6
|
+
import { KIT_PACKAGE_NAME } from '#scripts/version/kit-descriptor'
|
|
7
|
+
|
|
8
|
+
// The decisions `josh adopt` makes before any step runs: whether this repository may adopt at all,
|
|
9
|
+
// which repository the issue is opened in, and what the run is carrying (joshuafolkken/kit#1085).
|
|
10
|
+
|
|
11
|
+
const ADOPT_ORIGIN = 'Opened by `josh adopt` in this repository.'
|
|
12
|
+
const INCOMPLETE_HEADLINE =
|
|
13
|
+
'Refusing to adopt: these declared toolkits would fall out of the plan, and the run would sync the rest without them.'
|
|
14
|
+
const INCOMPLETE_EFFECT =
|
|
15
|
+
"The toolkits overlay files derived from kit's own (see docs/sync.md), so syncing kit without one rewrites that overlay back to kit's original — a wrong diff wearing kit's face."
|
|
16
|
+
const MISPLACED_CAUSE =
|
|
17
|
+
'declared under `dependencies`; the upgrade installs with `pnpm add -D` and would relocate it. Move it to `devDependencies`.'
|
|
18
|
+
const ABSENT_CAUSE =
|
|
19
|
+
'no runnable CLI here; the package or its `node_modules/.bin` shim is missing. Run `pnpm install`.'
|
|
20
|
+
|
|
21
|
+
// Adoption never runs inside kit's own repository — the same boundary `josh sync` draws
|
|
22
|
+
// (joshuafolkken/kit#868), and for the same reason: the sync would overwrite the distribution source
|
|
23
|
+
// with its own derived templates. Refused here, before anything writes, rather than left for the
|
|
24
|
+
// sync to fail on halfway through the sequence.
|
|
25
|
+
//
|
|
26
|
+
// It is only kit that is refused, not every repository under the scope. app-kit and game-kit are
|
|
27
|
+
// themselves consumers of kit — `josh propagate` carries kit's releases *into* them — so adopting
|
|
28
|
+
// there is exactly the intended use, and a refusal keyed on the npm scope would lock out the two
|
|
29
|
+
// repositories that need this command most.
|
|
30
|
+
function refuse_inside_kit_repository(project_root: string): string | undefined {
|
|
31
|
+
if (self_sync_guard.read_package_name(project_root) !== KIT_PACKAGE_NAME) return undefined
|
|
32
|
+
|
|
33
|
+
return [
|
|
34
|
+
`Refusing to adopt: this is ${KIT_PACKAGE_NAME}'s own repository.`,
|
|
35
|
+
'Adoption carries a published toolkit inward, so it runs in a repository that consumes one.',
|
|
36
|
+
'Run it from a consumer project instead.',
|
|
37
|
+
].join('\n')
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// The verification gate and the pull request both run through `pnpm josh`, which is kit's own CLI.
|
|
41
|
+
// pnpm writes a `node_modules/.bin` shim only for a project's *direct* dependencies, so a repository
|
|
42
|
+
// that declares app-kit or game-kit alone has no `josh` shim: those two steps would fail *after* the
|
|
43
|
+
// upgrade and the sync had already written, leaving a dirty tree and no pull request. Refused before
|
|
44
|
+
// anything writes instead.
|
|
45
|
+
function refuse_without_kit(releases: ReadonlyArray<Release>): string | undefined {
|
|
46
|
+
if (releases.some((release) => release.package_name === KIT_PACKAGE_NAME)) return undefined
|
|
47
|
+
|
|
48
|
+
return [
|
|
49
|
+
`Refusing to adopt: ${KIT_PACKAGE_NAME} is not a direct dev dependency here.`,
|
|
50
|
+
'The verification gate and the pull request run through `pnpm josh`, which it provides.',
|
|
51
|
+
`Add it with \`pnpm add -D ${KIT_PACKAGE_NAME}\` and run this again.`,
|
|
52
|
+
].join('\n')
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// One indented line per toolkit, so the reader sees which fix belongs to which package rather than
|
|
56
|
+
// two lists to match up by hand.
|
|
57
|
+
function name_causes(package_names: ReadonlyArray<string>, cause: string): Array<string> {
|
|
58
|
+
return package_names.map((package_name) => ` ${package_name} — ${cause}`)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// A declared toolkit that falls out of the plan is a refusal rather than a warning
|
|
62
|
+
// (joshuafolkken/kit#1540). kit distributes the base files and every other toolkit overlays files
|
|
63
|
+
// *derived* from them (`docs/sync.md` → two distribution tiers), so a run that syncs kit without the
|
|
64
|
+
// overlay does not merely do less — it writes the overlay's paths back to kit's originals. That diff
|
|
65
|
+
// then wears kit's own face in the pull request, which is exactly what a reviewer cannot spot.
|
|
66
|
+
//
|
|
67
|
+
// Warning and continuing was the first round's answer, and it holds only where someone is reading:
|
|
68
|
+
// `josh adopt` runs unattended, and both causes are one command away from fixed — so refusing costs
|
|
69
|
+
// the user a command and continuing costs a wrong diff. Refusing keeps the first round's rule rather
|
|
70
|
+
// than reversing it: the exclusion is still named, and now it also stops.
|
|
71
|
+
function refuse_incomplete_plan(
|
|
72
|
+
misplaced: ReadonlyArray<string>,
|
|
73
|
+
unresolved: ReadonlyArray<string>,
|
|
74
|
+
): string | undefined {
|
|
75
|
+
const moved = name_causes(misplaced, MISPLACED_CAUSE)
|
|
76
|
+
const named = [...moved, ...name_causes(unresolved, ABSENT_CAUSE)]
|
|
77
|
+
if (named.length === 0) return undefined
|
|
78
|
+
|
|
79
|
+
return [INCOMPLETE_HEADLINE, INCOMPLETE_EFFECT, ...named].join('\n')
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// The one target of an adoption: this checkout, named by its own `origin` so the issue and the pull
|
|
83
|
+
// request land in the repository the work is done in. Read from the git config rather than asked of
|
|
84
|
+
// `gh`, which is how the discovery map is built too.
|
|
85
|
+
function resolve_self_target(project_root: string): PropagateTarget | undefined {
|
|
86
|
+
const origin_url = repo_discovery.read_origin_url(project_root)
|
|
87
|
+
if (origin_url === undefined) return undefined
|
|
88
|
+
const identity = repo_origin.parse_origin_url(origin_url)
|
|
89
|
+
if (identity === undefined) return undefined
|
|
90
|
+
|
|
91
|
+
return { repo: repo_origin.format_identity(identity), path: project_root, state: 'ready' }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function build_plan(releases: ReadonlyArray<Release>): ReleasePlan {
|
|
95
|
+
return { releases, origin: ADOPT_ORIGIN }
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const adopt_logic = {
|
|
99
|
+
ADOPT_ORIGIN,
|
|
100
|
+
refuse_inside_kit_repository,
|
|
101
|
+
refuse_without_kit,
|
|
102
|
+
refuse_incomplete_plan,
|
|
103
|
+
resolve_self_target,
|
|
104
|
+
build_plan,
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export { adopt_logic }
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { find_local_bin_upwards } from '#scripts/build/local-bin'
|
|
3
|
+
import type { Release } from '#scripts/propagate/propagate-steps'
|
|
4
|
+
import { propagate_targets, type Manifest } from '#scripts/propagate/propagate-targets'
|
|
5
|
+
import { KIT_PACKAGE_NAME } from '#scripts/version/kit-descriptor'
|
|
6
|
+
import { z } from 'zod'
|
|
7
|
+
|
|
8
|
+
// Which `@joshuafolkken/*` toolkits `josh adopt` can upgrade in the repository it is run from
|
|
9
|
+
// (joshuafolkken/kit#1085).
|
|
10
|
+
//
|
|
11
|
+
// Discovery is a filesystem fact rather than a roster written here: a hardcoded list would go stale
|
|
12
|
+
// the day a fourth toolkit is published, and a project that depends on only one of them would be
|
|
13
|
+
// told to sync a CLI it does not have.
|
|
14
|
+
|
|
15
|
+
const TOOLKIT_SCOPE = '@joshuafolkken/'
|
|
16
|
+
// `josh adopt` pulls whatever is newest inward. The exact-version pin is `josh propagate`'s, and it
|
|
17
|
+
// exists there only because that command waits for a specific publish before carrying it outward.
|
|
18
|
+
const LATEST_VERSION = 'latest'
|
|
19
|
+
const NODE_MODULES = 'node_modules'
|
|
20
|
+
const BASE_RANK = 0
|
|
21
|
+
const DERIVED_RANK = 1
|
|
22
|
+
|
|
23
|
+
// Only the field the bin name is read from, in both shapes npm accepts. The manifest is read through
|
|
24
|
+
// propagation's own reader, which keeps every other field, so this parses what that reader passed
|
|
25
|
+
// through rather than opening the file a second time (`CLAUDE.md` → "No clones").
|
|
26
|
+
const bin_map_schema = z.record(z.string(), z.string())
|
|
27
|
+
const bin_schema = z.looseObject({ bin: z.union([z.string(), bin_map_schema]).optional() })
|
|
28
|
+
|
|
29
|
+
function is_toolkit_package(package_name: string): boolean {
|
|
30
|
+
return package_name.startsWith(TOOLKIT_SCOPE)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// kit is the base tier and every other toolkit distributes files *derived* from kit's, so the two
|
|
34
|
+
// can manage the same path and whichever `sync` ran last decides its contents
|
|
35
|
+
// (`docs/sync.md` → "two distribution tiers"). Ordering is therefore base-first: kit syncs, then the
|
|
36
|
+
// toolkits that overlay it. Sorting by name would put kit last and have it overwrite the overlay
|
|
37
|
+
// with the original every single run.
|
|
38
|
+
function toolkit_rank(package_name: string): number {
|
|
39
|
+
return package_name === KIT_PACKAGE_NAME ? BASE_RANK : DERIVED_RANK
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function compare_toolkits(left: string, right: string): number {
|
|
43
|
+
const by_rank = toolkit_rank(left) - toolkit_rank(right)
|
|
44
|
+
|
|
45
|
+
return by_rank === 0 ? left.localeCompare(right) : by_rank
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function scoped_names(declared: Readonly<Record<string, string>> | undefined): Array<string> {
|
|
49
|
+
return Object.keys(declared ?? {}).filter((package_name) => is_toolkit_package(package_name))
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Toolkits are development tooling, and the shared upgrade builder installs them with `pnpm add -D`
|
|
53
|
+
// (`build_upgrade_shell_command`). A toolkit declared under `dependencies` would therefore be
|
|
54
|
+
// *relocated* into `devDependencies` by the upgrade — a manifest rewrite nobody asked for, riding
|
|
55
|
+
// silently into the pull request. Discovery reads `devDependencies` only for that reason, and
|
|
56
|
+
// `misplaced_toolkits` names what was left out so the omission is reported rather than silent.
|
|
57
|
+
function declared_toolkits(project_root: string): ReadonlyArray<string> {
|
|
58
|
+
const manifest = propagate_targets.read_manifest(project_root)
|
|
59
|
+
|
|
60
|
+
return scoped_names(manifest?.devDependencies).toSorted(compare_toolkits)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// npm accepts two shapes for `bin`. The string form names exactly one executable and its name is the
|
|
64
|
+
// package's *unscoped* one — the rule `read_bin_entry` in `scripts/build/local-bin.ts` reads in the other
|
|
65
|
+
// direction, from a name to a path. The object form is answered by that same unscoped name where it
|
|
66
|
+
// declares one, so a toolkit shipping several CLIs still resolves to one deterministically.
|
|
67
|
+
function pick_bin_name(package_name: string, bin: string | Record<string, string>): string {
|
|
68
|
+
const unscoped = path.basename(package_name)
|
|
69
|
+
if (typeof bin === 'string') return unscoped
|
|
70
|
+
if (bin[unscoped] !== undefined) return unscoped
|
|
71
|
+
|
|
72
|
+
return Object.keys(bin)[0] ?? unscoped
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function read_installed_manifest(project_root: string, package_name: string): Manifest | undefined {
|
|
76
|
+
return propagate_targets.read_manifest(path.join(project_root, NODE_MODULES, package_name))
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function bin_name_of(package_name: string, installed: Manifest): string | undefined {
|
|
80
|
+
const parsed = bin_schema.safeParse(installed)
|
|
81
|
+
const bin = parsed.success ? parsed.data.bin : undefined
|
|
82
|
+
|
|
83
|
+
return bin === undefined ? undefined : pick_bin_name(package_name, bin)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// The CLI a toolkit installs, read from the installed package's own `bin` field. Deriving it means
|
|
87
|
+
// `@joshuafolkken/app-kit` answers `josh-app` without anyone maintaining the mapping here.
|
|
88
|
+
function read_bin_name(project_root: string, package_name: string): string | undefined {
|
|
89
|
+
const installed = read_installed_manifest(project_root, package_name)
|
|
90
|
+
|
|
91
|
+
return installed === undefined ? undefined : bin_name_of(package_name, installed)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function has_runnable_cli(project_root: string, bin_name: string): boolean {
|
|
95
|
+
return find_local_bin_upwards(project_root, bin_name) !== undefined
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// A declared toolkit is a target only when its CLI is actually runnable here. A dependency whose
|
|
99
|
+
// shim is missing — an install that never ran, a partial workspace — cannot be told to sync, and
|
|
100
|
+
// spawning it would fail the sync step rather than say what is wrong.
|
|
101
|
+
function resolve_toolkit(project_root: string, package_name: string): Release | undefined {
|
|
102
|
+
const bin_name = read_bin_name(project_root, package_name)
|
|
103
|
+
if (bin_name === undefined) return undefined
|
|
104
|
+
if (!has_runnable_cli(project_root, bin_name)) return undefined
|
|
105
|
+
|
|
106
|
+
return { package_name, version: LATEST_VERSION, bin_name }
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Unreachable and not-a-toolkit are two different answers, and collapsing them is what makes a
|
|
110
|
+
// refusal give advice that is wrong. **Unreachable** is a broken install — the package is missing
|
|
111
|
+
// here, or it declares a CLI whose shim is not installed — and `pnpm install` fixes it whatever the
|
|
112
|
+
// package turns out to be. A package that is installed perfectly well and simply ships **no** CLI is
|
|
113
|
+
// a scoped *library* rather than a toolkit: nothing about it is broken, so it is not this, and it is
|
|
114
|
+
// not misplaced either. The `@joshuafolkken/` prefix alone cannot tell the two apart, which is why
|
|
115
|
+
// the question is asked of the installed `bin` field (joshuafolkken/kit#1540 review round 1).
|
|
116
|
+
function is_unreachable_toolkit(project_root: string, package_name: string): boolean {
|
|
117
|
+
const installed = read_installed_manifest(project_root, package_name)
|
|
118
|
+
if (installed === undefined) return true
|
|
119
|
+
|
|
120
|
+
const bin_name = bin_name_of(package_name, installed)
|
|
121
|
+
|
|
122
|
+
return bin_name !== undefined && !has_runnable_cli(project_root, bin_name)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Only a package that is *demonstrably* a toolkit — installed, with its CLI runnable here — is
|
|
126
|
+
// reported as misplaced. Telling the owner of a scoped runtime library to move it into
|
|
127
|
+
// `devDependencies` would break the build it is there to serve, and one that is not installed at all
|
|
128
|
+
// is answered by `unresolved_toolkits` instead, whose `pnpm install` is the fix that actually
|
|
129
|
+
// applies. Naming only what can be proved is what keeps a refusal honest.
|
|
130
|
+
function misplaced_toolkits(project_root: string): ReadonlyArray<string> {
|
|
131
|
+
const manifest = propagate_targets.read_manifest(project_root)
|
|
132
|
+
const development = new Set(scoped_names(manifest?.devDependencies))
|
|
133
|
+
|
|
134
|
+
return scoped_names(manifest?.dependencies).filter(
|
|
135
|
+
(name) => !development.has(name) && resolve_toolkit(project_root, name) !== undefined,
|
|
136
|
+
)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function discover_toolkits(project_root: string): ReadonlyArray<Release> {
|
|
140
|
+
return declared_toolkits(project_root)
|
|
141
|
+
.map((package_name) => resolve_toolkit(project_root, package_name))
|
|
142
|
+
.filter((release) => release !== undefined)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Every scoped package this manifest declares, in either field. `unresolved_toolkits` reads both
|
|
146
|
+
// because a broken install is a broken install wherever it was declared, and the fix it reports —
|
|
147
|
+
// `pnpm install` — is right for a package under `dependencies` too.
|
|
148
|
+
function all_declared_toolkits(project_root: string): ReadonlyArray<string> {
|
|
149
|
+
const manifest = propagate_targets.read_manifest(project_root)
|
|
150
|
+
const development = scoped_names(manifest?.devDependencies)
|
|
151
|
+
|
|
152
|
+
return [...new Set([...development, ...scoped_names(manifest?.dependencies)])]
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// The other half of the same read: which declared packages the run cannot reach at all. Dropping
|
|
156
|
+
// them silently is what let a partial install sync kit alone and revert the overlay tier
|
|
157
|
+
// (joshuafolkken/kit#1540), so the caller refuses on this list rather than discovering it as a
|
|
158
|
+
// shorter plan. A scoped library that ships no CLI appears in neither list, because nothing about it
|
|
159
|
+
// is broken.
|
|
160
|
+
function unresolved_toolkits(project_root: string): ReadonlyArray<string> {
|
|
161
|
+
return all_declared_toolkits(project_root).filter((package_name) =>
|
|
162
|
+
is_unreachable_toolkit(project_root, package_name),
|
|
163
|
+
)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const adopt_toolkits = {
|
|
167
|
+
TOOLKIT_SCOPE,
|
|
168
|
+
LATEST_VERSION,
|
|
169
|
+
is_toolkit_package,
|
|
170
|
+
compare_toolkits,
|
|
171
|
+
declared_toolkits,
|
|
172
|
+
misplaced_toolkits,
|
|
173
|
+
pick_bin_name,
|
|
174
|
+
read_bin_name,
|
|
175
|
+
is_unreachable_toolkit,
|
|
176
|
+
resolve_toolkit,
|
|
177
|
+
discover_toolkits,
|
|
178
|
+
unresolved_toolkits,
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export { adopt_toolkits }
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
4
|
+
import { refuse_unknown_flags } from '#scripts/lib/cli-flags'
|
|
5
|
+
import { propagate_run, type TargetResult } from '#scripts/propagate/propagate-run'
|
|
6
|
+
import { propagate_steps, type Release, type ReleasePlan } from '#scripts/propagate/propagate-steps'
|
|
7
|
+
import type { PropagateTarget } from '#scripts/propagate/propagate-targets'
|
|
8
|
+
import { adopt_logic } from './adopt-logic'
|
|
9
|
+
import { adopt_toolkits } from './adopt-toolkits'
|
|
10
|
+
|
|
11
|
+
// `josh adopt` — upgrade every `@joshuafolkken/*` toolkit installed in this repository to latest,
|
|
12
|
+
// sync each one's managed files, run the verification gate, and open the issue and pull request
|
|
13
|
+
// (joshuafolkken/kit#1085).
|
|
14
|
+
//
|
|
15
|
+
// It is `josh propagate` seen from the other end: propagation stands in the supplier and pushes one
|
|
16
|
+
// released version out to every consumer, adoption stands in the consumer and pulls whatever is
|
|
17
|
+
// newest in. The step sequence is literally the same one — `propagate_run.STEP_ORDER`, run through
|
|
18
|
+
// `propagate_run.run_target` — so the working-tree pre-check, the ordering and the return to the
|
|
19
|
+
// default branch cannot drift between the two.
|
|
20
|
+
//
|
|
21
|
+
// It stops at the open pull request. Merging is what `pnpm josh followup` does, under an
|
|
22
|
+
// authorization a CLI does not have.
|
|
23
|
+
|
|
24
|
+
const SUCCESS_EXIT_CODE = 0
|
|
25
|
+
const FAILURE_EXIT_CODE = 1
|
|
26
|
+
const ARGV_OFFSET = 2
|
|
27
|
+
const DRY_RUN_FLAG = '--dry-run'
|
|
28
|
+
const KNOWN_FLAGS: ReadonlyArray<string> = [DRY_RUN_FLAG]
|
|
29
|
+
const DRY_RUN_REASON = 'would be adopted'
|
|
30
|
+
const NOTHING_TO_ADOPT = 'No @joshuafolkken toolkit is installed here; nothing to adopt.'
|
|
31
|
+
const NO_ORIGIN =
|
|
32
|
+
'Refusing to adopt: this checkout has no GitHub `origin`, so there is nowhere to open the issue.'
|
|
33
|
+
|
|
34
|
+
interface RunOptions {
|
|
35
|
+
is_dry_run: boolean
|
|
36
|
+
// The usage message, when the arguments were not accepted. Carried alongside rather than returned
|
|
37
|
+
// instead, so the caller has one shape to branch on.
|
|
38
|
+
usage?: string
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function parse_options(argv: ReadonlyArray<string>): RunOptions {
|
|
42
|
+
const options: RunOptions = { is_dry_run: argv.includes(DRY_RUN_FLAG) }
|
|
43
|
+
const usage = refuse_unknown_flags(argv, KNOWN_FLAGS, 'adopt')
|
|
44
|
+
|
|
45
|
+
return usage === undefined ? options : { ...options, usage }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function announce_releases(releases: ReadonlyArray<Release>): void {
|
|
49
|
+
console.info(`Adopting: ${releases.map((release) => release.package_name).join(', ')}`)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function report(result: TargetResult): number {
|
|
53
|
+
console.info('')
|
|
54
|
+
console.info(propagate_run.format_report([result]))
|
|
55
|
+
|
|
56
|
+
return propagate_run.has_failure([result]) ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// A dry run describes each step and touches nothing; a real run carries the plan. Both go through
|
|
60
|
+
// the same sequence, so what the dry run lists is what the real run does.
|
|
61
|
+
function run_sequence(target: PropagateTarget, plan: ReleasePlan | undefined): number {
|
|
62
|
+
const step =
|
|
63
|
+
plan === undefined ? propagate_steps.describe_step : propagate_steps.create_step_runner(plan)
|
|
64
|
+
const reason = plan === undefined ? DRY_RUN_REASON : propagate_run.PROPAGATED_REASON
|
|
65
|
+
|
|
66
|
+
return report(propagate_run.run_target(target, step, reason))
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// A declared toolkit that cannot be carried stops the run, whichever of the two ways it fell out —
|
|
70
|
+
// placed under `dependencies`, or declared with no runnable CLI here (joshuafolkken/kit#1540). The
|
|
71
|
+
// refusal names each one and its cause, so the exclusion is still reported as it was before; what
|
|
72
|
+
// changed is that it no longer leaves the run to sync kit alone and revert the overlay tier.
|
|
73
|
+
//
|
|
74
|
+
// It runs ahead of discovery, so a dry run refuses too: what the dry run lists has to be what the
|
|
75
|
+
// real run does, and a plan it printed here would be a plan nothing will ever execute.
|
|
76
|
+
function refuse_incomplete_plan(project_root: string): number | undefined {
|
|
77
|
+
const refusal = adopt_logic.refuse_incomplete_plan(
|
|
78
|
+
adopt_toolkits.misplaced_toolkits(project_root),
|
|
79
|
+
adopt_toolkits.unresolved_toolkits(project_root),
|
|
80
|
+
)
|
|
81
|
+
if (refusal === undefined) return undefined
|
|
82
|
+
|
|
83
|
+
console.error(refusal)
|
|
84
|
+
|
|
85
|
+
return FAILURE_EXIT_CODE
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Nothing installed is a skip; kit missing is a refusal. Both stop the run before anything writes,
|
|
89
|
+
// and they differ only in the exit code they stop with.
|
|
90
|
+
function stop_reason(releases: ReadonlyArray<Release>): number | undefined {
|
|
91
|
+
if (releases.length === 0) {
|
|
92
|
+
console.info(NOTHING_TO_ADOPT)
|
|
93
|
+
|
|
94
|
+
return SUCCESS_EXIT_CODE
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const refusal = adopt_logic.refuse_without_kit(releases)
|
|
98
|
+
if (refusal === undefined) return undefined
|
|
99
|
+
|
|
100
|
+
console.error(refusal)
|
|
101
|
+
|
|
102
|
+
return FAILURE_EXIT_CODE
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function adopt_target(
|
|
106
|
+
project_root: string,
|
|
107
|
+
releases: ReadonlyArray<Release>,
|
|
108
|
+
is_dry_run: boolean,
|
|
109
|
+
): number {
|
|
110
|
+
const target = adopt_logic.resolve_self_target(project_root)
|
|
111
|
+
|
|
112
|
+
if (target === undefined) {
|
|
113
|
+
console.error(NO_ORIGIN)
|
|
114
|
+
|
|
115
|
+
return FAILURE_EXIT_CODE
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
announce_releases(releases)
|
|
119
|
+
|
|
120
|
+
return run_sequence(target, is_dry_run ? undefined : adopt_logic.build_plan(releases))
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// The run once the repository has been accepted as a place to adopt into.
|
|
124
|
+
function run_here(project_root: string, is_dry_run: boolean): number {
|
|
125
|
+
const incomplete = refuse_incomplete_plan(project_root)
|
|
126
|
+
if (incomplete !== undefined) return incomplete
|
|
127
|
+
|
|
128
|
+
const releases = adopt_toolkits.discover_toolkits(project_root)
|
|
129
|
+
const stop = stop_reason(releases)
|
|
130
|
+
|
|
131
|
+
return stop ?? adopt_target(project_root, releases, is_dry_run)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function run(argv: ReadonlyArray<string>, project_root: string = PROJECT_ROOT): number {
|
|
135
|
+
const options = parse_options(argv)
|
|
136
|
+
|
|
137
|
+
if (options.usage !== undefined) {
|
|
138
|
+
console.error(options.usage)
|
|
139
|
+
|
|
140
|
+
return FAILURE_EXIT_CODE
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const refusal = adopt_logic.refuse_inside_kit_repository(project_root)
|
|
144
|
+
|
|
145
|
+
if (refusal !== undefined) {
|
|
146
|
+
console.error(refusal)
|
|
147
|
+
|
|
148
|
+
return FAILURE_EXIT_CODE
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return run_here(project_root, options.is_dry_run)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function main(argv: ReadonlyArray<string>): void {
|
|
155
|
+
process.exit(run(argv))
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const adopt = {
|
|
159
|
+
DRY_RUN_REASON,
|
|
160
|
+
KNOWN_FLAGS,
|
|
161
|
+
NOTHING_TO_ADOPT,
|
|
162
|
+
parse_options,
|
|
163
|
+
run_here,
|
|
164
|
+
run,
|
|
165
|
+
main,
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
169
|
+
|
|
170
|
+
export type { RunOptions }
|
|
171
|
+
export { adopt }
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { agent_diagnostics } from './agent-diagnostics'
|
|
2
|
+
import {
|
|
3
|
+
agent_role_profile,
|
|
4
|
+
type AgentEnvironment,
|
|
5
|
+
type AgentProfile,
|
|
6
|
+
type AgentRole,
|
|
7
|
+
} from './agent-role-profile'
|
|
8
|
+
import { claude_agent_argv } from './claude-agent-argv'
|
|
9
|
+
import { codex_agent_argv } from './codex-agent-argv'
|
|
10
|
+
|
|
11
|
+
interface AgentArgv {
|
|
12
|
+
command: string
|
|
13
|
+
args: ReadonlyArray<string>
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type AgentArgvResult =
|
|
17
|
+
{ kind: 'argv'; argv: AgentArgv; profile: AgentProfile } | { kind: 'rejected'; note: string }
|
|
18
|
+
|
|
19
|
+
// **`session_id` forces the fresh session's id, and only the Claude path can honour it**
|
|
20
|
+
// (joshuafolkken/kit#2407). Codex has no such flag, and the run-state report reads Claude transcripts
|
|
21
|
+
// alone, so an OpenAI scheduler simply builds as before; whiff attribution is a Claude-transcript
|
|
22
|
+
// property, so nothing is lost by the omission.
|
|
23
|
+
function build(
|
|
24
|
+
invocation: string,
|
|
25
|
+
profile: AgentProfile,
|
|
26
|
+
cwd?: string,
|
|
27
|
+
session_id?: string,
|
|
28
|
+
): AgentArgv {
|
|
29
|
+
return profile.provider === 'openai'
|
|
30
|
+
? codex_agent_argv.build(invocation, profile, cwd)
|
|
31
|
+
: claude_agent_argv.build(invocation, profile, session_id, cwd)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// The resume counterpart of `build` (joshuafolkken/kit#2317). Only the Claude path resumes by session
|
|
35
|
+
// id; an OpenAI lane carries no such id at the outage re-dispatch, so it falls back to a fresh build —
|
|
36
|
+
// which is never reached in practice, because `lane-resume.ts` only plans a resume for an Anthropic
|
|
37
|
+
// provider. The fallback keeps this total rather than throwing on a provider it was not handed.
|
|
38
|
+
function build_resume(
|
|
39
|
+
invocation: string,
|
|
40
|
+
profile: AgentProfile,
|
|
41
|
+
session_id: string,
|
|
42
|
+
cwd?: string,
|
|
43
|
+
): AgentArgv {
|
|
44
|
+
return profile.provider === 'openai'
|
|
45
|
+
? codex_agent_argv.build(invocation, profile, cwd)
|
|
46
|
+
: claude_agent_argv.build_resume(invocation, profile, session_id, cwd)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// **`session_id` threads to the Claude build, so a wake launched in a lane's work tree still forces
|
|
50
|
+
// its transcript id** (joshuafolkken/kit#2407). It is optional, so every other caller of the
|
|
51
|
+
// cwd-scoped build is unchanged.
|
|
52
|
+
function with_profile_in(
|
|
53
|
+
invocation: string,
|
|
54
|
+
profile: AgentProfile,
|
|
55
|
+
cwd: string,
|
|
56
|
+
session_id?: string,
|
|
57
|
+
): AgentArgvResult {
|
|
58
|
+
const diagnostic = agent_diagnostics.check(profile)
|
|
59
|
+
if (diagnostic.kind === 'rejected') return diagnostic
|
|
60
|
+
|
|
61
|
+
return { kind: 'argv', argv: build(invocation, profile, cwd, session_id), profile }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// A resume build under the same profile diagnostics as `with_profile_in`, so a lane re-dispatch that
|
|
65
|
+
// resumes a session runs the identical readiness check a fresh one does (joshuafolkken/kit#2317).
|
|
66
|
+
function with_resume_in(
|
|
67
|
+
invocation: string,
|
|
68
|
+
profile: AgentProfile,
|
|
69
|
+
session_id: string,
|
|
70
|
+
cwd: string,
|
|
71
|
+
): AgentArgvResult {
|
|
72
|
+
const diagnostic = agent_diagnostics.check(profile)
|
|
73
|
+
if (diagnostic.kind === 'rejected') return diagnostic
|
|
74
|
+
|
|
75
|
+
return { kind: 'argv', argv: build_resume(invocation, profile, session_id, cwd), profile }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function with_profile(invocation: string, profile: AgentProfile): AgentArgvResult {
|
|
79
|
+
const diagnostic = agent_diagnostics.check(profile)
|
|
80
|
+
if (diagnostic.kind === 'rejected') return diagnostic
|
|
81
|
+
|
|
82
|
+
return { kind: 'argv', argv: build(invocation, profile), profile }
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function resolve(
|
|
86
|
+
invocation: string,
|
|
87
|
+
role: AgentRole,
|
|
88
|
+
environment: AgentEnvironment = process.env,
|
|
89
|
+
): AgentArgvResult {
|
|
90
|
+
const resolved = agent_role_profile.resolve(role, environment)
|
|
91
|
+
|
|
92
|
+
return resolved.kind === 'rejected' ? resolved : with_profile(invocation, resolved.profile)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// **A cut relaunch's profile, resolved for the phase the resumed child is entering**
|
|
96
|
+
// (joshuafolkken/kit#2382). A stored lane profile keeps its model and takes only the phase's effort; a
|
|
97
|
+
// lane without one resolves the worker for the phase. An env override wins over the phase in either path.
|
|
98
|
+
function resume_argv(
|
|
99
|
+
invocation: string,
|
|
100
|
+
profile: AgentProfile | undefined,
|
|
101
|
+
phase: string,
|
|
102
|
+
cwd: string,
|
|
103
|
+
): AgentArgvResult {
|
|
104
|
+
if (profile !== undefined) {
|
|
105
|
+
return with_profile_in(invocation, agent_role_profile.with_phase_effort(profile, phase), cwd)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const resolved = agent_role_profile.resolve(agent_role_profile.WORKER, process.env, phase)
|
|
109
|
+
|
|
110
|
+
return resolved.kind === 'rejected'
|
|
111
|
+
? resolved
|
|
112
|
+
: with_profile_in(invocation, resolved.profile, cwd)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function resolve_in(
|
|
116
|
+
invocation: string,
|
|
117
|
+
role: AgentRole,
|
|
118
|
+
cwd: string,
|
|
119
|
+
environment: AgentEnvironment = process.env,
|
|
120
|
+
): AgentArgvResult {
|
|
121
|
+
const resolved = agent_role_profile.resolve(role, environment)
|
|
122
|
+
|
|
123
|
+
return resolved.kind === 'rejected'
|
|
124
|
+
? resolved
|
|
125
|
+
: with_profile_in(invocation, resolved.profile, cwd)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const agent_argv = {
|
|
129
|
+
build,
|
|
130
|
+
build_resume,
|
|
131
|
+
resolve,
|
|
132
|
+
resolve_in,
|
|
133
|
+
resume_argv,
|
|
134
|
+
with_profile,
|
|
135
|
+
with_profile_in,
|
|
136
|
+
with_resume_in,
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export type { AgentArgv, AgentArgvResult }
|
|
140
|
+
export { agent_argv }
|