@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,326 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { git_gh_issue_write } from '#scripts/git/git-gh-issue-write'
|
|
4
|
+
import { git_stash } from '#scripts/git/git-stash'
|
|
5
|
+
import { IN_PROGRESS_LABEL, NEEDS_DECISION_LABEL } from '#scripts/git/issue-labels'
|
|
6
|
+
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
7
|
+
import { lane_close } from '#scripts/lane/lane-close'
|
|
8
|
+
import { lane_reap } from '#scripts/lane/lane-reap'
|
|
9
|
+
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
10
|
+
import { lane_relaunch } from '#scripts/lane/lane-relaunch'
|
|
11
|
+
import { run_carry, type CarryChange, type CarryOwner, type RunCarry } from './run-carry'
|
|
12
|
+
import { run_cut, type RunCut } from './run-cut'
|
|
13
|
+
import { run_merge } from './run-merge'
|
|
14
|
+
|
|
15
|
+
// The result of attempting to apply a carry change. Distinguishing `refused` from `applied` lets
|
|
16
|
+
// callers surface the refusal as a hard failure rather than silently continuing on a carry that was
|
|
17
|
+
// not advanced (joshuafolkken/kit#2114).
|
|
18
|
+
type ApplyCarryResult =
|
|
19
|
+
{ kind: 'applied'; carry: RunCarry } | { kind: 'refused'; carry: RunCarry } | { kind: 'none' }
|
|
20
|
+
|
|
21
|
+
// The side-effect half of `run:merge` (joshuafolkken/kit#2024). The pure decisions are `run-merge.ts`'s;
|
|
22
|
+
// this file is what those decisions drive — the same actions the parent used to spend two turns on,
|
|
23
|
+
// collapsed into one command.
|
|
24
|
+
//
|
|
25
|
+
// **What was a separate `pnpm josh` call stays one.** `main:sync`, `lane:close`, `cost` and
|
|
26
|
+
// `epic:next` / `backlog:next` are run as captured subprocesses, so their output lands in this
|
|
27
|
+
// command's own return value rather than on the caller's stdout and their report logic is reused
|
|
28
|
+
// rather than cloned. The new work — counting the outcome into the single-source carry record, parking
|
|
29
|
+
// a failed child, and generating the progress comment from that record — is in-process, because it has
|
|
30
|
+
// a reusable logic function and no stdout to keep clean.
|
|
31
|
+
|
|
32
|
+
const OVER = 'over'
|
|
33
|
+
const LANES = '--lanes'
|
|
34
|
+
const REPO_FLAG = '--repo'
|
|
35
|
+
const LANE_CLOSE_OCCASION = 'lane close'
|
|
36
|
+
const GIT_ENTRY = '.git'
|
|
37
|
+
|
|
38
|
+
// One returned child's context, gathered from the command line by the CLI.
|
|
39
|
+
interface MergeContext {
|
|
40
|
+
child: string
|
|
41
|
+
epic: string | undefined
|
|
42
|
+
repo: string | undefined
|
|
43
|
+
over: number
|
|
44
|
+
owner: CarryOwner
|
|
45
|
+
// The child's transcript output path, when the caller passed `--output`. Read to tell an API-outage
|
|
46
|
+
// ending apart from a genuine child failure (joshuafolkken/kit#2240); absent leaves outage detection
|
|
47
|
+
// off, so the child is classified from its GitHub state alone as before.
|
|
48
|
+
output?: string | undefined
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
interface FailedResult {
|
|
52
|
+
carry: RunCarry | undefined
|
|
53
|
+
is_parked: boolean
|
|
54
|
+
// Set when the carry record refused the count because this session is not its owner
|
|
55
|
+
// (joshuafolkken/kit#2114). The caller surfaces this as a hard failure rather than continuing.
|
|
56
|
+
is_refused: boolean
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// A captured `pnpm josh` subprocess: its output is read back rather than inherited, and a non-zero
|
|
60
|
+
// exit is a value to branch on rather than a throw. The step's stderr stays piped here — `run:merge`
|
|
61
|
+
// composes its own report from the captured values — so this passes `josh_command.josh_run`'s default.
|
|
62
|
+
async function josh(args: ReadonlyArray<string>): Promise<JoshResult> {
|
|
63
|
+
return await josh_command.josh_run(args)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Read the single-source carry record, or `undefined` when there is none to advance.
|
|
67
|
+
async function read_record(): Promise<{ target: string; carry: RunCarry } | undefined> {
|
|
68
|
+
const directory = await run_carry.repository_directory()
|
|
69
|
+
|
|
70
|
+
if (directory === undefined) return undefined
|
|
71
|
+
|
|
72
|
+
const target = run_carry.carry_path(directory)
|
|
73
|
+
const read = run_carry.read_carry(target)
|
|
74
|
+
|
|
75
|
+
if (read.kind !== 'carried' && read.kind !== 'expired') return undefined
|
|
76
|
+
|
|
77
|
+
return { target, carry: read.carry }
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Count the outcome into the carry record, respecting the ownership guard so a session whose record
|
|
81
|
+
// was handed off cannot advance a budget that is no longer its own. Returns `refused` when the
|
|
82
|
+
// ownership check fails — callers treat this as a hard failure so the operation is not silently
|
|
83
|
+
// skipped (joshuafolkken/kit#2114).
|
|
84
|
+
async function apply_carry(
|
|
85
|
+
ctx: MergeContext,
|
|
86
|
+
change: CarryChange | undefined,
|
|
87
|
+
): Promise<ApplyCarryResult> {
|
|
88
|
+
const record = await read_record()
|
|
89
|
+
|
|
90
|
+
if (record === undefined) return { kind: 'none' }
|
|
91
|
+
|
|
92
|
+
if (change === undefined) return { kind: 'applied', carry: record.carry }
|
|
93
|
+
|
|
94
|
+
if (run_carry.is_count_refused(record.carry, ctx.owner)) {
|
|
95
|
+
return { kind: 'refused', carry: record.carry }
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return { kind: 'applied', carry: run_carry.apply_change(record.target, record.carry, change) }
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// The carry record when this session may not act on it — the same ownership guard `apply_carry` asks —
|
|
102
|
+
// or `undefined`. Asked before an action that counts nothing, like the cut fallback's relaunch, so a
|
|
103
|
+
// stray session is refused rather than relaunching a lane it does not own (joshuafolkken/kit#2484).
|
|
104
|
+
async function refused_carry(ctx: MergeContext): Promise<RunCarry | undefined> {
|
|
105
|
+
const record = await read_record()
|
|
106
|
+
|
|
107
|
+
if (record === undefined || !run_carry.is_count_refused(record.carry, ctx.owner)) return undefined
|
|
108
|
+
|
|
109
|
+
return record.carry
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function sync_main(): Promise<void> {
|
|
113
|
+
const result = await josh(['main:sync'])
|
|
114
|
+
|
|
115
|
+
if (result.code !== 0) throw new Error(`main:sync failed: ${result.out}`)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async function close_lane(child: string): Promise<void> {
|
|
119
|
+
await josh(['lane:close', child])
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function preserved_comment(message: string): string {
|
|
123
|
+
return [
|
|
124
|
+
'The lane held uncommitted work when `run:merge` closed it, so it was stashed before the close:',
|
|
125
|
+
`- recover with \`pnpm josh stash:pop "${message}"\``,
|
|
126
|
+
].join('\n')
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async function stash_work(child: string, directory: string): Promise<void> {
|
|
130
|
+
const message = git_stash.work_message(child, LANE_CLOSE_OCCASION)
|
|
131
|
+
|
|
132
|
+
await git_stash.push(message, directory)
|
|
133
|
+
await git_gh_issue_write.issue_try_comment(child, preserved_comment(message))
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Stash whatever the lane still holds uncommitted before its tree is removed (joshuafolkken/kit#2476):
|
|
137
|
+
// `lane:close` deletes by force, and a merged child that had popped its parked work and then read
|
|
138
|
+
// `already-done` left that work nowhere else. The stash stack outlives the tree, so the push is the copy.
|
|
139
|
+
// Returns whether closing is safe — `false` when the tree could not be read or pushed, so it is left
|
|
140
|
+
// rather than lost. A directory with no `.git` is no work tree — the remnant of an interrupted close —
|
|
141
|
+
// and holds nothing git could keep, so it is closed rather than stranded behind a status that fails.
|
|
142
|
+
async function preserve_uncommitted(child: string): Promise<boolean> {
|
|
143
|
+
const lane = await lane_close.resolve_lane(child)
|
|
144
|
+
const { directory } = lane.targets
|
|
145
|
+
|
|
146
|
+
if (!existsSync(path.join(directory, GIT_ENTRY))) return true
|
|
147
|
+
|
|
148
|
+
try {
|
|
149
|
+
if (await git_stash.has_changes(directory)) await stash_work(child, directory)
|
|
150
|
+
|
|
151
|
+
return true
|
|
152
|
+
} catch {
|
|
153
|
+
console.error(`#${child}: uncommitted work could not be stashed — lane left at ${directory}`)
|
|
154
|
+
|
|
155
|
+
return false
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// The progress comment is a human-readable mirror of the carry record, so it is best-effort and only
|
|
160
|
+
// where a named epic has a body to carry it — a pure backlog run keeps the record alone.
|
|
161
|
+
async function post_counters(ctx: MergeContext, carry: RunCarry | undefined): Promise<void> {
|
|
162
|
+
if (carry === undefined || ctx.epic === undefined) return
|
|
163
|
+
|
|
164
|
+
await git_gh_issue_write.issue_try_comment(ctx.epic, run_merge.counters_comment(carry))
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// A merged child: count the merge (which resets the failure streak), return to the default branch,
|
|
168
|
+
// stash any uncommitted work the lane still holds and close it, and mirror the counters onto the epic. Returns the carry when the ownership check
|
|
169
|
+
// fails — the caller treats a non-undefined return as a hard refusal and must not offer a next child
|
|
170
|
+
// (joshuafolkken/kit#2114). Returns `undefined` on success.
|
|
171
|
+
async function do_merged(ctx: MergeContext): Promise<RunCarry | undefined> {
|
|
172
|
+
const refused = await refused_carry(ctx)
|
|
173
|
+
|
|
174
|
+
if (refused !== undefined) return refused
|
|
175
|
+
|
|
176
|
+
await sync_main()
|
|
177
|
+
const result = await apply_carry(ctx, {
|
|
178
|
+
...run_merge.change_of('merged'),
|
|
179
|
+
merged_issue: Number(ctx.child),
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
if (result.kind === 'refused') return result.carry
|
|
183
|
+
|
|
184
|
+
if (await preserve_uncommitted(ctx.child)) await close_lane(ctx.child)
|
|
185
|
+
await post_counters(ctx, result.kind === 'applied' ? result.carry : undefined)
|
|
186
|
+
|
|
187
|
+
return undefined
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// A stale label removal must not fail the run, so a failed removal is swallowed exactly as the
|
|
191
|
+
// `|| true` in the hand-written procedure did.
|
|
192
|
+
async function remove_in_progress(child: string): Promise<void> {
|
|
193
|
+
try {
|
|
194
|
+
await git_gh_issue_write.issue_remove_label(child, IN_PROGRESS_LABEL)
|
|
195
|
+
} catch {
|
|
196
|
+
// A stale label may already be gone; a failed removal must not fail the run.
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// A failed child: count the failure, end whatever of its process is still running (a child judged
|
|
201
|
+
// abandoned that hung on a wait loop would otherwise answer the pgrep liveness check `alive` for its
|
|
202
|
+
// issue number forever, joshuafolkken/kit#2421), drop the stale `in-progress`, and park it with
|
|
203
|
+
// `needs-decision` so the next offer does not hand the same child straight back. Returns the record
|
|
204
|
+
// so the caller can read the streak against the guard. Returns `is_refused: true` without touching labels when the
|
|
205
|
+
// carry record rejected the count (joshuafolkken/kit#2114).
|
|
206
|
+
async function do_failed(ctx: MergeContext): Promise<FailedResult> {
|
|
207
|
+
const result = await apply_carry(ctx, run_merge.change_of('failed'))
|
|
208
|
+
|
|
209
|
+
if (result.kind === 'refused') return { carry: result.carry, is_parked: false, is_refused: true }
|
|
210
|
+
|
|
211
|
+
const carry = result.kind === 'applied' ? result.carry : undefined
|
|
212
|
+
|
|
213
|
+
lane_reap.reap_child(ctx.child)
|
|
214
|
+
await remove_in_progress(ctx.child)
|
|
215
|
+
const is_parked = await git_gh_issue_write.issue_add_label(ctx.child, NEEDS_DECISION_LABEL)
|
|
216
|
+
|
|
217
|
+
return { carry, is_parked, is_refused: false }
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// The outcome of counting an outage: the record to read the streak against, and whether the count was
|
|
221
|
+
// refused because this session does not own the budget (joshuafolkken/kit#2240).
|
|
222
|
+
interface OutageResult {
|
|
223
|
+
carry: RunCarry | undefined
|
|
224
|
+
is_refused: boolean
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// An API-outage child: count the outage into its own streak, end any process it left — before the
|
|
228
|
+
// re-dispatch launches a second one matching the same pattern (joshuafolkken/kit#2421) — and drop the
|
|
229
|
+
// stale `in-progress` so the child is offerable again, but **do not** park it with `needs-decision` — the environment failed, not
|
|
230
|
+
// the child, so it is re-dispatchable in the same run (joshuafolkken/kit#2240). Returns the record so
|
|
231
|
+
// the caller can read the outage streak against its guard. Returns `is_refused: true` without touching
|
|
232
|
+
// labels when the carry record rejected the count (joshuafolkken/kit#2114).
|
|
233
|
+
async function do_outage(ctx: MergeContext): Promise<OutageResult> {
|
|
234
|
+
const result = await apply_carry(ctx, run_merge.change_of('outage'))
|
|
235
|
+
|
|
236
|
+
if (result.kind === 'refused') return { carry: result.carry, is_refused: true }
|
|
237
|
+
|
|
238
|
+
lane_reap.reap_child(ctx.child)
|
|
239
|
+
await remove_in_progress(ctx.child)
|
|
240
|
+
|
|
241
|
+
return { carry: result.kind === 'applied' ? result.carry : undefined, is_refused: false }
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
interface RelaunchableCut {
|
|
245
|
+
lane: LaneInfo
|
|
246
|
+
target: string
|
|
247
|
+
cut: RunCut
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// The lane's cut the fallback may relaunch, or `undefined` (joshuafolkken/kit#2484). An OpenAI lane is
|
|
251
|
+
// left out: its supervisor, not this command, starts the process after a standing cut.
|
|
252
|
+
async function relaunchable_lane(child: string): Promise<LaneInfo | undefined> {
|
|
253
|
+
const lane = await lane_registry.find_open_lane(child)
|
|
254
|
+
|
|
255
|
+
return lane === undefined || lane_relaunch.is_openai_lane(lane) ? undefined : lane
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
async function relaunchable_cut(child: string): Promise<RelaunchableCut | undefined> {
|
|
259
|
+
const lane = await relaunchable_lane(child)
|
|
260
|
+
|
|
261
|
+
if (lane === undefined) return undefined
|
|
262
|
+
|
|
263
|
+
const carried = run_cut.lane_cut_sync(lane.directory)
|
|
264
|
+
|
|
265
|
+
if (carried === undefined || !run_cut.is_relaunchable(carried.cut, child)) return undefined
|
|
266
|
+
|
|
267
|
+
return { lane, ...carried }
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
async function has_resumable_cut(child: string): Promise<boolean> {
|
|
271
|
+
return (await relaunchable_cut(child)) !== undefined
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// **The cutting child launches its own successor; this is only the fallback** (joshuafolkken/kit#2484).
|
|
275
|
+
// `lane:await` wakes the parent once every process of the lane has gone, so a cut still unadopted then
|
|
276
|
+
// means the successor never took it over. It is relaunched through the same `lane_relaunch` the cut uses,
|
|
277
|
+
// once per cut — the record is marked first, so a second unadopted return is parked instead. Returns
|
|
278
|
+
// whether a successor was started.
|
|
279
|
+
async function resume_cut(child: string): Promise<boolean> {
|
|
280
|
+
const found = await relaunchable_cut(child)
|
|
281
|
+
|
|
282
|
+
if (found === undefined || !run_cut.mark_merge_relaunched(found.target, found.cut)) return false
|
|
283
|
+
|
|
284
|
+
const result = lane_relaunch.resume(found.lane, found.cut.phase, (note) => {
|
|
285
|
+
console.error(note)
|
|
286
|
+
})
|
|
287
|
+
|
|
288
|
+
return result.kind === 'launched'
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// The hand-off check, asked at a merge alone. A subprocess that cannot measure exits non-zero, which
|
|
292
|
+
// is read as `over` — "could not measure" is never "still cheap".
|
|
293
|
+
async function is_over_budget(over: number): Promise<boolean> {
|
|
294
|
+
const result = await josh(['cost', '--over', String(over)])
|
|
295
|
+
|
|
296
|
+
return result.code !== 0 || result.out === OVER
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// The next offer: one issue number per line up to the free lanes, or a verdict token, exactly as the
|
|
300
|
+
// parent read it. `--lanes` needs `--repo`, so the epic form is used only where both are present.
|
|
301
|
+
async function ask_next(ctx: MergeContext): Promise<string> {
|
|
302
|
+
if (ctx.epic === undefined || ctx.repo === undefined) {
|
|
303
|
+
const backlog = await josh(['backlog:next'])
|
|
304
|
+
|
|
305
|
+
return backlog.out
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const offer = await josh(['epic:next', ctx.epic, REPO_FLAG, ctx.repo, LANES])
|
|
309
|
+
|
|
310
|
+
return offer.out
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const run_merge_steps = {
|
|
314
|
+
apply_carry,
|
|
315
|
+
ask_next,
|
|
316
|
+
do_failed,
|
|
317
|
+
do_merged,
|
|
318
|
+
do_outage,
|
|
319
|
+
has_resumable_cut,
|
|
320
|
+
is_over_budget,
|
|
321
|
+
refused_carry,
|
|
322
|
+
resume_cut,
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
export type { MergeContext, OutageResult }
|
|
326
|
+
export { run_merge_steps }
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ALREADY_DONE_LABEL,
|
|
3
|
+
EPIC_LABEL,
|
|
4
|
+
has_label_name,
|
|
5
|
+
NEEDS_DECISION_LABEL,
|
|
6
|
+
} from '#scripts/git/issue-labels'
|
|
7
|
+
import type { IssueState } from '#scripts/issue/issue-state'
|
|
8
|
+
import type { CarryChange, RunCarry } from './run-carry'
|
|
9
|
+
|
|
10
|
+
// joshuafolkken/kit#2024: a `backlogrun` merge event was two parent turns — a reading turn and an
|
|
11
|
+
// acting turn — spent at the session whose context is largest and whose per-turn cost is highest.
|
|
12
|
+
// This is the pure core of the one composite command that collapses it: the parent calls
|
|
13
|
+
// `run:merge <N>` once at a child's return and reads back the next child number, or a control verdict.
|
|
14
|
+
//
|
|
15
|
+
// Everything here is pure — the classification of the returned child, the counter change that outcome
|
|
16
|
+
// implies, the consecutive-failure guard, and the progress-comment text generated from the
|
|
17
|
+
// single-source carry record. The side effects (`main:sync`, `lane:close`, the comment write, the
|
|
18
|
+
// label edits, `epic:next` / `backlog:next`) are the CLI's, so the branches this file decides are
|
|
19
|
+
// unit-tested without a network — `merged`, `parked`, `failed`, `human-review`, `unresolved`.
|
|
20
|
+
|
|
21
|
+
const CLOSED_STATE = 'CLOSED'
|
|
22
|
+
// Three failures in a row stop the run — the figure `backlogrun-progress.md` states in prose. A merge
|
|
23
|
+
// resets the streak (`run-carry.ts` → `next_failures`), so the guard trips only on an environment
|
|
24
|
+
// failing every child it is handed rather than on failures scattered across a long run.
|
|
25
|
+
const CONSECUTIVE_FAILURE_LIMIT = 3
|
|
26
|
+
// Three API outages in a row stop the run too (joshuafolkken/kit#2240) — the same shape as the failure
|
|
27
|
+
// guard, over its own streak. An outage is a child that could not reach the API, so a run of them is
|
|
28
|
+
// the environment being down; stopping is what keeps the run from re-dispatching into a dead API
|
|
29
|
+
// forever. A merge or a genuine child failure resets it (`run-carry.ts` → `next_outages`).
|
|
30
|
+
const CONSECUTIVE_OUTAGE_LIMIT = 3
|
|
31
|
+
const ONE = 1
|
|
32
|
+
|
|
33
|
+
// What a returned child turned out to be, decided from its GitHub state and — for the failed case
|
|
34
|
+
// alone — the exit record.
|
|
35
|
+
// - `merged` — CLOSED; the child finished and its pull request merged.
|
|
36
|
+
// - `human-review` — OPEN and carrying `needs-human-review`; the run's own ending (SKILL.md → §2z).
|
|
37
|
+
// - `parked` — OPEN and carrying `needs-decision` or `already-done`; a person still owns it.
|
|
38
|
+
// - `split` — OPEN and carrying `epic`; its work was divided into new children.
|
|
39
|
+
// - `outage` — OPEN and carrying neither, but the exit record shows it could not reach the API; not
|
|
40
|
+
// the child's failure, so it is re-dispatchable and uncounted against the failure guard
|
|
41
|
+
// (joshuafolkken/kit#2240).
|
|
42
|
+
// - `cut` — OPEN and carrying neither, but its lane holds a declared cut no successor adopted;
|
|
43
|
+
// the child ended its session on purpose, so it is resumed rather than parked and
|
|
44
|
+
// counts nothing (joshuafolkken/kit#2484).
|
|
45
|
+
// - `failed` — OPEN and carrying neither, and not an outage; the child did not finish.
|
|
46
|
+
// - `unresolved` — the state could not be read; re-read before deciding.
|
|
47
|
+
type ChildOutcome =
|
|
48
|
+
'merged' | 'human-review' | 'parked' | 'split' | 'cut' | 'outage' | 'failed' | 'unresolved'
|
|
49
|
+
|
|
50
|
+
// What the CLI read beside the GitHub state: whether the exit record is an API outage, and whether the
|
|
51
|
+
// lane holds a cut its successor never adopted.
|
|
52
|
+
interface EndingSignals {
|
|
53
|
+
is_outage: boolean
|
|
54
|
+
is_cut: boolean
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const NO_SIGNALS: EndingSignals = { is_outage: false, is_cut: false }
|
|
58
|
+
|
|
59
|
+
function is_closed(state: IssueState): boolean {
|
|
60
|
+
return state.state.toUpperCase() === CLOSED_STATE
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// A parked child is one a person still owns: it stopped for a decision (`needs-decision`) or it was
|
|
64
|
+
// found already merged (`already-done`). Either way it is left alone and not counted as a failure.
|
|
65
|
+
const PARK_LABELS: ReadonlyArray<string> = [NEEDS_DECISION_LABEL, ALREADY_DONE_LABEL]
|
|
66
|
+
|
|
67
|
+
function is_parked(state: IssueState): boolean {
|
|
68
|
+
return PARK_LABELS.some((label) => has_label_name(state.labels, label))
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// **CLOSED means merged, whatever labels it carries** — a child that finished and merged keeps the
|
|
72
|
+
// `needs-human-review` a person put on it, so that label is read only on an OPEN child
|
|
73
|
+
// (`backlogrun-progress.md` → "Running a named epic's children").
|
|
74
|
+
// An OPEN, unparked child that is not waiting on a person: a declared cut is resumed
|
|
75
|
+
// (joshuafolkken/kit#2484), and it is read before the outage so a cut whose process then lost the API is
|
|
76
|
+
// still resumed from its record; an OPEN, unparked child that could not reach the API is an `outage`,
|
|
77
|
+
// not a `failed` (joshuafolkken/kit#2240).
|
|
78
|
+
function unfinished_outcome(signals: EndingSignals): ChildOutcome {
|
|
79
|
+
if (signals.is_cut) return 'cut'
|
|
80
|
+
|
|
81
|
+
return signals.is_outage ? 'outage' : 'failed'
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function open_outcome(state: IssueState, signals: EndingSignals): ChildOutcome {
|
|
85
|
+
if (state.is_human_review) return 'human-review'
|
|
86
|
+
|
|
87
|
+
if (has_label_name(state.labels, EPIC_LABEL)) return 'split'
|
|
88
|
+
|
|
89
|
+
if (is_parked(state)) return 'parked'
|
|
90
|
+
|
|
91
|
+
return unfinished_outcome(signals)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// The signals are read by the CLI and matter only for an OPEN child — a CLOSED child is merged
|
|
95
|
+
// regardless of how the process exited.
|
|
96
|
+
function classify_child(
|
|
97
|
+
state: IssueState | undefined,
|
|
98
|
+
signals: EndingSignals = NO_SIGNALS,
|
|
99
|
+
): ChildOutcome {
|
|
100
|
+
if (state === undefined) return 'unresolved'
|
|
101
|
+
|
|
102
|
+
if (is_closed(state)) return 'merged'
|
|
103
|
+
|
|
104
|
+
return open_outcome(state, signals)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// The counter change a child's outcome implies. A merge counts a merge (which resets the failure
|
|
108
|
+
// streak); a failure counts a failure; a split, parked or human-review child counts nothing — a decision
|
|
109
|
+
// waiting on a person is not the environment failing — and `undefined` says the carry record is left
|
|
110
|
+
// untouched.
|
|
111
|
+
function change_of(outcome: ChildOutcome): CarryChange | undefined {
|
|
112
|
+
if (outcome === 'merged') return { merged: ONE }
|
|
113
|
+
|
|
114
|
+
if (outcome === 'failed') return { failures: ONE }
|
|
115
|
+
|
|
116
|
+
if (outcome === 'outage') return { outages: ONE }
|
|
117
|
+
|
|
118
|
+
return undefined
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function is_guard_tripped(failures: number): boolean {
|
|
122
|
+
return failures >= CONSECUTIVE_FAILURE_LIMIT
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// The outage guard, over its own streak (joshuafolkken/kit#2240). Same shape as the failure guard: a
|
|
126
|
+
// run of consecutive outages is the environment being down, so the run stops rather than re-dispatching.
|
|
127
|
+
function is_outage_guard_tripped(outages: number): boolean {
|
|
128
|
+
return outages >= CONSECUTIVE_OUTAGE_LIMIT
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// The progress comment, generated from the single-source carry record so the counters live in one
|
|
132
|
+
// place and this text is derived rather than a second copy kept alongside it (joshuafolkken/kit#2024).
|
|
133
|
+
// It is script-emitted, so it stays English while the run's session-facing prose follows
|
|
134
|
+
// `JOSH_SESSION_LANG`.
|
|
135
|
+
function counters_comment(carry: RunCarry): string {
|
|
136
|
+
return [
|
|
137
|
+
'Run progress (generated from the carry record):',
|
|
138
|
+
`- started: ${carry.started_at}`,
|
|
139
|
+
`- merged: ${String(carry.merged)}`,
|
|
140
|
+
`- filed: ${String(carry.filed)}`,
|
|
141
|
+
`- consecutive failures: ${String(carry.failures)}`,
|
|
142
|
+
`- consecutive outages: ${String(carry.outages)}`,
|
|
143
|
+
`- cuts crossed: ${String(carry.cuts)}`,
|
|
144
|
+
].join('\n')
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const run_merge = {
|
|
148
|
+
CONSECUTIVE_FAILURE_LIMIT,
|
|
149
|
+
CONSECUTIVE_OUTAGE_LIMIT,
|
|
150
|
+
change_of,
|
|
151
|
+
classify_child,
|
|
152
|
+
counters_comment,
|
|
153
|
+
is_guard_tripped,
|
|
154
|
+
is_outage_guard_tripped,
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export type { ChildOutcome, EndingSignals }
|
|
158
|
+
export { run_merge }
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { run_next } from './run-next'
|
|
4
|
+
import { run_prep_cli } from './run-prep-cli'
|
|
5
|
+
|
|
6
|
+
// `josh run:next <N>` — print the next step a `fullrun` takes, from the run's state
|
|
7
|
+
// (joshuafolkken/kit#2188). It reads exactly what `run:prep` reads — the issue state, the
|
|
8
|
+
// `human_review` line and the dependency scope — by calling `run:prep`'s own gather, so the two never
|
|
9
|
+
// answer from different facts, and hands the assembled parts to the state → step mapping in
|
|
10
|
+
// `run-next.ts`.
|
|
11
|
+
//
|
|
12
|
+
// **It is the consumer `run:prep` was built to have.** joshuafolkken/kit#1978 bundled the reads;
|
|
13
|
+
// joshuafolkken/kit#2165 added the read-only glance; this one prints the decision those reads support,
|
|
14
|
+
// which is the trim epic #2166 is after — prose a reader interprets replaced by a computed answer.
|
|
15
|
+
|
|
16
|
+
const SUCCESS_EXIT_CODE = 0
|
|
17
|
+
const FAILURE_EXIT_CODE = 1
|
|
18
|
+
const ARGV_OFFSET = 2
|
|
19
|
+
const USAGE = 'Usage: josh run:next <issue-number>'
|
|
20
|
+
|
|
21
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
22
|
+
const issue_number = run_prep_cli.parse_number(argv)
|
|
23
|
+
|
|
24
|
+
if (issue_number === undefined) {
|
|
25
|
+
console.error(USAGE)
|
|
26
|
+
|
|
27
|
+
return FAILURE_EXIT_CODE
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const reads = await run_prep_cli.gather(issue_number)
|
|
31
|
+
const parts = run_prep_cli.to_parts(issue_number, reads)
|
|
32
|
+
|
|
33
|
+
console.info(run_next.format_report(parts))
|
|
34
|
+
|
|
35
|
+
// A state that could not be read is a non-zero exit, exactly as `run:prep` exits on the same
|
|
36
|
+
// failure, so a bundle missing its state is never read as a confident "implement".
|
|
37
|
+
return parts.state === undefined ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
41
|
+
process.exitCode = await run(argv)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const run_next_cli = { USAGE, main, run }
|
|
45
|
+
|
|
46
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
47
|
+
|
|
48
|
+
export { run_next_cli }
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { PrepParts } from './run-prep'
|
|
2
|
+
import { run_step, type PreVerdict } from './run-step'
|
|
3
|
+
|
|
4
|
+
// `josh run:next <N>` — the next step a `fullrun` takes, printed from the run's state
|
|
5
|
+
// (joshuafolkken/kit#2188). It is the foundation the epic #2166 rests on: the entry read is trimmed by
|
|
6
|
+
// replacing prose that a reader has to interpret with a command that answers "what now" from the same
|
|
7
|
+
// state `run:prep` already gathered, so the answer is computed rather than judged.
|
|
8
|
+
//
|
|
9
|
+
// **It is now the degenerate form of `run:step`** (joshuafolkken/kit#2248). `run:step` computes a run's
|
|
10
|
+
// position from the event stream, the carry record and the issue state; a `fullrun` with nothing emitted
|
|
11
|
+
// yet is at its pre-implementation position, which is exactly what this prints. The state → step mapping
|
|
12
|
+
// lives once, in `run-step.ts`'s `pre_verdict`, and this maps each verdict to the prose sentence a
|
|
13
|
+
// reader expects — so there is no second implementation of the mapping.
|
|
14
|
+
|
|
15
|
+
const ALREADY_DONE_STEP =
|
|
16
|
+
'Issue is CLOSED — nothing to run. Verify it against merged code before starting.'
|
|
17
|
+
const KEEP_WORK_STEP =
|
|
18
|
+
'Issue is CLOSED but this lane holds uncommitted work — stash it with `git stash push -u -m "<N>: uncommitted work at already-done"` before ending.'
|
|
19
|
+
const LATEST_STEP =
|
|
20
|
+
'Update dependencies first (latest: required), load the dependency-update skill, then implement.'
|
|
21
|
+
const HUMAN_REVIEW_STEP =
|
|
22
|
+
'Implement and run the verification gate, then STOP before the commit (needs-human-review).'
|
|
23
|
+
const IMPLEMENT_STEP = 'Implement, then run the verification gate (refactor, gate, /code-review).'
|
|
24
|
+
const UNKNOWN_STEP =
|
|
25
|
+
'State could not be read — resolve the failure in run:prep before deciding the next step.'
|
|
26
|
+
|
|
27
|
+
// The prose sentence for each pre-implementation verdict `run:step` computes. The verdict set is
|
|
28
|
+
// `run-step.ts`'s, so a new position can never be printed here without a sentence to print it with.
|
|
29
|
+
const STEP_OF: Record<PreVerdict, string> = {
|
|
30
|
+
'already-done': ALREADY_DONE_STEP,
|
|
31
|
+
'human-review': HUMAN_REVIEW_STEP,
|
|
32
|
+
implement: IMPLEMENT_STEP,
|
|
33
|
+
'keep-work': KEEP_WORK_STEP,
|
|
34
|
+
unknown: UNKNOWN_STEP,
|
|
35
|
+
'update-deps': LATEST_STEP,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The four facts a step is keyed on, lifted off `PrepParts` so the mapping is a pure function of state
|
|
39
|
+
// and the CLI does the reading. `state` is `undefined` exactly when `run:prep` could not read it.
|
|
40
|
+
interface NextInput {
|
|
41
|
+
state: string | undefined
|
|
42
|
+
is_human_review: boolean
|
|
43
|
+
latest_scope: string
|
|
44
|
+
has_changes: boolean
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function to_input(parts: PrepParts): NextInput {
|
|
48
|
+
return {
|
|
49
|
+
state: parts.state?.state,
|
|
50
|
+
is_human_review: parts.state?.is_human_review ?? false,
|
|
51
|
+
latest_scope: parts.latest_scope,
|
|
52
|
+
has_changes: parts.has_changes,
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// The prose for the pre-implementation position `run:step` computes — the degenerate case where the
|
|
57
|
+
// run has emitted no event yet. The ordering of the guards is `run-step.ts`'s `pre_verdict`, so the two
|
|
58
|
+
// never disagree about which fact wins.
|
|
59
|
+
function next_step(input: NextInput): string {
|
|
60
|
+
return STEP_OF[run_step.pre_verdict(input)]
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function format_report(parts: PrepParts): string {
|
|
64
|
+
return next_step(to_input(parts))
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const run_next = {
|
|
68
|
+
ALREADY_DONE_STEP,
|
|
69
|
+
HUMAN_REVIEW_STEP,
|
|
70
|
+
IMPLEMENT_STEP,
|
|
71
|
+
KEEP_WORK_STEP,
|
|
72
|
+
LATEST_STEP,
|
|
73
|
+
UNKNOWN_STEP,
|
|
74
|
+
format_report,
|
|
75
|
+
next_step,
|
|
76
|
+
to_input,
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export type { NextInput }
|
|
80
|
+
export { run_next }
|