@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,345 @@
|
|
|
1
|
+
# `backlogrun` — lanes and concurrency
|
|
2
|
+
|
|
3
|
+
**Read this file in full before the first lane opens** — in the turn that reaches
|
|
4
|
+
`pnpm josh lane:open`. It is a point-of-use document, never an entry read: the entry procedure is
|
|
5
|
+
`backlogrun.md`, which points here at that step (joshuafolkken/kit#2010). This file is the single
|
|
6
|
+
source of the per-repository lane ceiling, the lane lifecycle, and how a merge conflict between lanes
|
|
7
|
+
is resolved.
|
|
8
|
+
|
|
9
|
+
## Concurrency: as many children per repository as it has free lanes
|
|
10
|
+
|
|
11
|
+
Execution state lives on GitHub and nowhere else, so **an `backlogrun` need not be a single session.** One
|
|
12
|
+
session per repository; each calls `josh epic:next <E> --repo <owner/repo>` and runs only its own
|
|
13
|
+
repository's children.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# In the kit checkout
|
|
17
|
+
pnpm josh epic:next 858 --repo joshuafolkken/kit
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
A child in another repository is read against that repository through `gh api`, so no clone is needed
|
|
21
|
+
to learn its state — only to implement it. A repository with no checkout here says so rather than being
|
|
22
|
+
cloned.
|
|
23
|
+
|
|
24
|
+
**A dependency that crosses a repository is not satisfied when the blocking issue closes.** Merging
|
|
25
|
+
kit's issue does not publish kit, so such a dependency resolves only once the blocker is closed *and*
|
|
26
|
+
its release has appeared in the registry — and while the blocker is still open the registry is never
|
|
27
|
+
consulted. **Unless that repository publishes nothing** — no `package.json` on its default branch, or
|
|
28
|
+
one declaring `private` — in which case a closed blocker there resolves. The answer is read from the
|
|
29
|
+
blocker repository's manifest, never from the registry (a 404 also means "this token may not see it").
|
|
30
|
+
|
|
31
|
+
**The lane count is per repository, and `epic:next` is what applies it.** When it has a child to offer,
|
|
32
|
+
it first asks that repository **how many of its lanes are already running something**: every open issue
|
|
33
|
+
carrying `in-progress` and not parked counts for one — whichever epic it belongs to. What is left of
|
|
34
|
+
`JOSH_LANE_LIMIT` (**default 6**) is what gets offered, and at zero the answer is `wait`. It is asked
|
|
35
|
+
**only when there is a candidate**. A **parked** issue does not hold a lane: `needs-decision` outranks
|
|
36
|
+
`in-progress` here exactly as in the classification. A child stopped by `needs-human-review` is
|
|
37
|
+
deliberately not parked and goes on holding its lane, because its uncommitted work is still in that
|
|
38
|
+
checkout.
|
|
39
|
+
|
|
40
|
+
**It is advisory and not atomic.** The label is applied when a child is dispatched — the parent claims
|
|
41
|
+
it in `lane:dispatch` before the child process starts, and a standalone `fullrun` / `halfrun` claims it
|
|
42
|
+
the moment `run:hold` answers `hold` — *after* this read, so two sessions starting in the same instant
|
|
43
|
+
can both read the same free lane. What the check closes is the window that actually occurs — a
|
|
44
|
+
dispatched lane holds the label from the launch onward, not the tens of minutes it took when the
|
|
45
|
+
child's own `fullrun` had to reach its own apply first. It is a guard that makes the invariant
|
|
46
|
+
mechanical, not a mutex.
|
|
47
|
+
|
|
48
|
+
**It is scoped to the resource, not the epic.** A lane is its own checkout with its own branch and
|
|
49
|
+
ports, so the repository-wide number is a **ceiling on how many lanes run at once**. How a session
|
|
50
|
+
drives more than one child at a time is "Lanes — running more than one child at a time" below.
|
|
51
|
+
|
|
52
|
+
**A stale label holds a lane, so the stale rule reaches past this epic's own children** — "`in-progress`
|
|
53
|
+
is removed by whoever finds it stale" below applies to **any** open issue in the repository. `epic:next`
|
|
54
|
+
names the holders on standard error, and the 90-minute stale window bounds the wait.
|
|
55
|
+
|
|
56
|
+
**A listing it could not read is not an idle repository.** `epic:next` answers `wait` there rather than
|
|
57
|
+
offering the child — reading a failed read as "nothing is running" is the one direction this guard may
|
|
58
|
+
not fail in, because that answer *starts* work. **A listing that was *cut short* is the same answer**: a
|
|
59
|
+
short one with no visible holder is `wait`, with its own message.
|
|
60
|
+
|
|
61
|
+
**Two children of one repository may run at once, and the section below is how.** The guard is a
|
|
62
|
+
ceiling rather than a prohibition, scoped to the lane rather than to the epic. **Do not read this as
|
|
63
|
+
"concurrency needs no coordination"**: the coordination is this section plus the one below, and
|
|
64
|
+
switching the guard off is not one of the ways to get parallelism.
|
|
65
|
+
|
|
66
|
+
Parallelism only helps children that do not depend on each other. When app-kit's child needs kit's new
|
|
67
|
+
feature, that is recorded as `blocked-by` and `epic:next` makes it wait.
|
|
68
|
+
|
|
69
|
+
## Lanes — running more than one child at a time
|
|
70
|
+
|
|
71
|
+
`pnpm josh epic:next <E> --repo <owner/repo> --lanes` answers with **one issue number per line**, up to
|
|
72
|
+
the number of free lanes, and each of those children runs in a **lane** of its own: a linked git work
|
|
73
|
+
tree with its own branch, its own `.env` and its own dev and preview ports (`docs/josh-commands.md` →
|
|
74
|
+
"`josh lane:open` / `josh lane:close` / `josh lane:list` / `josh lane:prune`"). **Implementation, the
|
|
75
|
+
verification gate and the review run in parallel; the merges stay serial** — each one lands on the
|
|
76
|
+
`main` the next is then measured against.
|
|
77
|
+
|
|
78
|
+
**A lane child may cut its own turn before the gate.** Implementation done, it ends its process and a
|
|
79
|
+
fresh one resumes the same lane from the gate onward — the boundary, the two commands and the resume
|
|
80
|
+
verification are `pre-gate-cut.md`, the single source. **The child is told apart from a person, and its
|
|
81
|
+
resume stage is handed to it, by a mark the dispatch sets** — `JOSH_LANE_CHILD`, the lane's issue
|
|
82
|
+
number (`pre-gate-cut.md` → "The dispatch mark" and "The stage is passed to the resumed child").
|
|
83
|
+
|
|
84
|
+
**One kind of child takes no lane beside anything: an interrupt whose subject is a defect in the
|
|
85
|
+
verification path itself.** It runs alone, and the batch resumes only once it has merged. **Decide it
|
|
86
|
+
from the enumeration, never from how serious it looks** — does the defect reach the verification gate
|
|
87
|
+
(lint / type check / spell check / unit tests), the code review, the pre-push hook, or the merge
|
|
88
|
+
checks? One of those, and the offered children wait; none, and it fills a lane like any other child.
|
|
89
|
+
**Ask it of what `epic:next --lanes` just offered, before opening a second lane**; the rule is
|
|
90
|
+
`prompts/collaboration-workflow/wip-cap.md` → 「実行のしかた」, its single source.
|
|
91
|
+
|
|
92
|
+
**A lane's review does not inherit the lane, and `pnpm josh review:brief` is what closes that.**
|
|
93
|
+
`/code-review` is forked by the harness into the **session's** working directory, which during a lane
|
|
94
|
+
run is a different tree — usually the default branch. Reading that, the review finds nothing wrong and
|
|
95
|
+
**the failure arrives as approval**: the child counts the round as clean and commits a diff nobody
|
|
96
|
+
read. **So the path is no longer something a brief has to remember to carry**: `pnpm josh review:brief`
|
|
97
|
+
prints the lane's absolute root, branch and HEAD, hands over targets written `git -C <root> …`, and
|
|
98
|
+
prints a nonce the review attests with `pnpm josh review:attest <nonce>` from the checkout it actually
|
|
99
|
+
read. **The child asks `pnpm josh review:attest --check` before it counts a round**, and
|
|
100
|
+
`pnpm josh followup` asks again before it merges; `missing` and `mismatch` are both refusals. A clean
|
|
101
|
+
round is therefore the case to check hardest, not the case to skip the check on.
|
|
102
|
+
|
|
103
|
+
**A lane's branch is `<N>-lane`, and the issue number leads it so that the commit path accepts it.**
|
|
104
|
+
`pnpm josh git` refuses to commit from a branch that is neither the default branch nor one sharing the
|
|
105
|
+
child's `<N>-` prefix (`scripts/git/git-branch.ts` → `has_same_issue_prefix`, `/^\d+-/`). **Switching
|
|
106
|
+
the lane to another branch is not the way round it**: `lane-registry.ts` → `branch_issue` identifies a
|
|
107
|
+
lane **by** that branch name, so a switched lane drops out of `list_lanes()` — losing its seat, its
|
|
108
|
+
listing and its isolation. So `epic:next` is asked **with** `--lanes`, and everything below runs as
|
|
109
|
+
written.
|
|
110
|
+
|
|
111
|
+
**Running unattended gets harder, not easier, and that is the honest trade.** Many lanes make the
|
|
112
|
+
overlap between children real, and every overlap that becomes a conflict costs the child that loses the
|
|
113
|
+
race a resolution, a re-run gate and a review ("Conflicts are not predicted" below), and parks it
|
|
114
|
+
outright under that section's four conditions. The run finishes more work per hour **and** spends more
|
|
115
|
+
of each child's budget on merge races. Do not report the first without the second.
|
|
116
|
+
|
|
117
|
+
### Once per repository, before the first lane opens
|
|
118
|
+
|
|
119
|
+
In the **primary checkout**, in this order, and never again per lane:
|
|
120
|
+
|
|
121
|
+
1. `git switch main && git pull` — every lane is branched from this ref.
|
|
122
|
+
2. `pnpm josh latest:scope`, and the update on `required` — "`josh latest` runs once per session" above.
|
|
123
|
+
3. `pnpm josh lane:prune` — closes the lanes an interruption left registered without a work tree.
|
|
124
|
+
|
|
125
|
+
**`pnpm josh latest` is never run inside a lane, whatever `latest:scope` answers there** — the command
|
|
126
|
+
enforces it: `latest:scope` answers `skip` in a lane and `pnpm josh latest` refuses outright, fronted
|
|
127
|
+
by `pnpm josh latest:guard`. Ask it in the primary checkout, per step 2 above.
|
|
128
|
+
|
|
129
|
+
**The rewritten lock file still has to reach a pull request**, and with lanes no child runs in the
|
|
130
|
+
primary checkout to carry it. `git stash` is a repository-level ref shared by every work tree:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
git stash push -u -m "backlogrun: josh latest before lanes" # primary checkout, only if the update rewrote anything
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Record it on that first child's Issue — the comment is what gets it popped if the run dies in between.
|
|
137
|
+
**The first lane's `pnpm josh lane:launch "$n" --stash "backlogrun: josh latest before lanes"` pops it
|
|
138
|
+
by message, after `lane:open`'s own install** — never a positional `git -C "$dir" stash pop`: the stash
|
|
139
|
+
is a repository-wide stack every lane shares, so a positional pop would take whichever lane last pushed.
|
|
140
|
+
|
|
141
|
+
### Opening one lane and dispatching its child
|
|
142
|
+
|
|
143
|
+
**One command opens the lane, prepares it, and dispatches the child — `pnpm josh lane:launch`**
|
|
144
|
+
(joshuafolkken/kit#2162). It runs `lane:open`, then — only when `--stash` is given, which is the first
|
|
145
|
+
lane alone — pops that stash into the lane and re-installs against the lock it brought in, then
|
|
146
|
+
`lane:dispatch`. Four to six turns of the parent folded into one:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
pid=$(pnpm josh lane:launch "$n") || exit 1 # the child's pid on stdout, nothing else; alias: josh lnla
|
|
150
|
+
pid=$(pnpm josh lane:launch "$n" --stash "backlogrun: josh latest before lanes") || exit 1 # the first lane only, and only if `josh latest` stashed
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
`lane:launch` is a thin layer over `lane:open`, `stash:pop` and `lane:dispatch`, so each of their
|
|
154
|
+
guards, refusals and messages holds unchanged; the bullets below describe the steps it runs.
|
|
155
|
+
|
|
156
|
+
- **A refusal is an empty capture beside a non-zero exit**, with the reason on standard error: `full`,
|
|
157
|
+
`already-open`, and a **failed install** — which leaves a real work tree behind holding its seat, so
|
|
158
|
+
the next launch answers `already-open` and never retries. **Park that child and name
|
|
159
|
+
`pnpm josh lane:close <N>`** — a lock the lane cannot build is a state a person fixes. A refused
|
|
160
|
+
`lane:open`, a pop that refused, or a failed re-install each **stop the launch before the child is
|
|
161
|
+
dispatched**.
|
|
162
|
+
- **`lane:open` installs; the `--stash` lane re-installs, and only that lane needs it.** A failed
|
|
163
|
+
install fails `lane:open`, so `lane:launch` reaching `lane:dispatch` is the guarantee the lane runs.
|
|
164
|
+
- **What the pop changes is the lock, which is why that one lane installs twice.** The pop brings in
|
|
165
|
+
the `pnpm-lock.yaml` that `josh latest` rewrote, which this child's gate must build against. **A pop
|
|
166
|
+
that fails stops the lane** rather than re-installing anyway.
|
|
167
|
+
- **A `<N>-lane` that already exists is attached to, and `lane:open` says so on standard error** — the
|
|
168
|
+
way back to a child parked after it pushed: a local branch of that name gets the work tree put on it,
|
|
169
|
+
and where there is none the **remote** is asked (`ls-remote`, fetched first) and the lane cut from
|
|
170
|
+
`origin/<N>-lane` where the branch survives — otherwise from the default branch. **A reused branch is
|
|
171
|
+
not a fresh lane.** Nothing deletes a branch to open a lane, so a reopen cannot cost the pushed work.
|
|
172
|
+
- **Nothing switches the lane's branch** — the registry identifies a lane by that branch, so a switch
|
|
173
|
+
costs it its seat, listing and isolation, and `<N>-lane` is already a name `pnpm josh git` commits
|
|
174
|
+
from.
|
|
175
|
+
- **`pnpm josh run:hold`'s preflight check is not asked in a lane; `lane:open`'s own answer replaces it.** A fresh
|
|
176
|
+
lane is clean by construction, preflight's `reclaim` arm (HEAD != default branch) is true of every
|
|
177
|
+
lane, and its recovery (`git switch <default>`) cannot run in a linked work tree. What a leftover
|
|
178
|
+
looks like here is `lane:open` answering `already-open`.
|
|
179
|
+
- **`pnpm josh run:hold` is unchanged, and is claimed inside the lane** — it keys on
|
|
180
|
+
`git rev-parse --absolute-git-dir` (`.git/worktrees/<name>`), so each lane holds independently.
|
|
181
|
+
|
|
182
|
+
### Handing the child over
|
|
183
|
+
|
|
184
|
+
The child runs as `fullrun #<N>` in that lane, and neither `josh latest` nor a progress watcher is
|
|
185
|
+
started there. Everything else — the plan, the gate, `/code-review`, `pnpm josh git`,
|
|
186
|
+
`pnpm josh followup` — is unchanged, and `pnpm josh followup` releases that lane's hold at the merge.
|
|
187
|
+
|
|
188
|
+
**The child is started as a process of its own, not as a subagent of this session** — `lane:launch`'s
|
|
189
|
+
final step, the `lane:dispatch` it runs after the lane is opened and prepared, whose pid it returns.
|
|
190
|
+
The bullets below describe that dispatch:
|
|
191
|
+
|
|
192
|
+
- **It records where the child writes as it starts it** — the dispatch's own
|
|
193
|
+
`<temp>/josh-lane-dispatch-<N>.log` — so "this lane records no path" is no longer a state the hand-off
|
|
194
|
+
has to except.
|
|
195
|
+
- **A refusal is an empty capture beside a non-zero exit**, and every refusal also sends a `warning`
|
|
196
|
+
Telegram — no lane open, a path that could not be recorded, a launch that failed. **Park that child
|
|
197
|
+
and name the log the message carries**; do not re-dispatch into the same lane without reading it.
|
|
198
|
+
- **A child that started with nowhere to write exits zero and warns.** The launcher starts the session
|
|
199
|
+
even when it could not open the log, so the child really is running. **Poll that lane on the process
|
|
200
|
+
trace alone**, because its log will never grow.
|
|
201
|
+
- **The brief the child used to be handed is now the invocation itself.** The child is started as
|
|
202
|
+
`fullrun #<N>` with the lane as its working directory. The batch a person approved by typing
|
|
203
|
+
`backlogrun` covers the child.
|
|
204
|
+
- **It does not pass `--dangerously-skip-permissions`.** What the child may do is the checkout's own
|
|
205
|
+
`.claude/settings.json` to decide; a headless child reaches `gh` and merges through `pnpm josh
|
|
206
|
+
followup` without the flag, and the run reports what stopped rather than loosening it.
|
|
207
|
+
|
|
208
|
+
**Start each child without blocking on it, and poll them all.** That is "A delegated unit that stopped
|
|
209
|
+
without reporting" above applied N times, and `pnpm josh run:liveness <N> --output <path> --process
|
|
210
|
+
alive` is read **in that child's lane**. **Run `pgrep -laf "(fullrun|run-ship-cli\.ts .*) #<N>$"`
|
|
211
|
+
first and pass what it found** — `alive` where the child is there, `none` where it is not, and never
|
|
212
|
+
`alive` merely because the child was dispatched. The command line carries no path; the `$` anchor
|
|
213
|
+
keeps `#12` from matching a running `#123`.
|
|
214
|
+
|
|
215
|
+
**`git switch main && git pull` is the parent's now, not the child's.** No lane can switch to the
|
|
216
|
+
default branch, so the refresh moves to the primary checkout **before each `lane:open`** — the ref the
|
|
217
|
+
lane is cut from.
|
|
218
|
+
|
|
219
|
+
### Conflicts are not predicted
|
|
220
|
+
|
|
221
|
+
**The child merges `origin/main` into its lane before its gate now, so this path is the fallback rather
|
|
222
|
+
than the first line.** Every `fullrun` runs `pnpm josh main:merge` ahead of the gate
|
|
223
|
+
(`chain-rule.md` → "origin/main is merged in before the gate", the single source), so an overlap
|
|
224
|
+
already on `main` is resolved before the gate reads the tree. What this section covers is an overlap
|
|
225
|
+
that lands on `main` *after* it, which `followup` still reports as a conflict.
|
|
226
|
+
|
|
227
|
+
**Nothing here forecasts which children will overlap.** The overlap surfaces where GitHub already
|
|
228
|
+
reports it: a pull request that conflicts with its base comes back `mergeStateStatus: DIRTY`, which
|
|
229
|
+
`git-pr-checks-eval.ts` reads as a **failure** rather than polling through it — so `pnpm josh followup`
|
|
230
|
+
ends that child with a named conflict in about ten seconds.
|
|
231
|
+
|
|
232
|
+
**That child does not stop: it resolves the conflict in its own lane.** It is **not** counted against
|
|
233
|
+
the consecutive-failure guard either way — a lost merge race is an ordinary outcome of running many
|
|
234
|
+
lanes.
|
|
235
|
+
|
|
236
|
+
**Nothing is at risk while it resolves, because the work is already committed and pushed.** The pull
|
|
237
|
+
request holds the branch, `git merge --abort` puts the tree back, and no step below rewrites a pushed
|
|
238
|
+
commit. **The merge direction is `origin/main` into the lane's branch, never a rebase** — a rebase would
|
|
239
|
+
rewrite pushed commits and need a force push, which this package denies.
|
|
240
|
+
|
|
241
|
+
1. **Resolve in the lane.** `git fetch origin main`, merge `origin/main` into the lane's branch, resolve
|
|
242
|
+
in place. Do not close the lane, open another, or switch its branch. **`pnpm josh lane:open` can now
|
|
243
|
+
reattach to a pushed branch**, so a lane closed by mistake here is recoverable; staying put is still
|
|
244
|
+
what keeps the run clear of the question.
|
|
245
|
+
2. **Re-run the whole gate.** The tree changed, so the green recorded before the conflict is void:
|
|
246
|
+
`pnpm josh lint:related` and `pnpm josh test:related`, then `pnpm josh gate`.
|
|
247
|
+
3. **Review the resolution, one round.** Brief it with `pnpm josh review:brief` and run `/code-review`
|
|
248
|
+
over the resolution diff, then require `pnpm josh review:attest --check` to answer `ok`. That round
|
|
249
|
+
is a different subject and does not spend one of the two the cap allows — `prompts/review.md` →
|
|
250
|
+
"Review round cap" carries the exception.
|
|
251
|
+
4. **Conclude the merge and push it, with `pnpm josh git -y`.** Without this step nothing changes on
|
|
252
|
+
`origin`: GitHub still returns `mergeStateStatus: DIRTY`, step 5 reports the same conflict, and
|
|
253
|
+
condition 3 reads that as a second one and parks the child for good. The distributed
|
|
254
|
+
`.claude/settings.json` denies `Bash(git commit*)` and `Bash(git add*)`, so the node script is the
|
|
255
|
+
only sanctioned way. **Record the resolution on the Issue in this same step** — a comment naming the
|
|
256
|
+
conflicting paths — because condition 3 counts resolutions off the Issue comments, not off memory.
|
|
257
|
+
5. **Merge**, by re-running `pnpm josh followup` exactly as before.
|
|
258
|
+
|
|
259
|
+
**The safeguard is the re-run verification, not who holds the pen.** What is dangerous is unreviewed
|
|
260
|
+
code merging onto a branch whose review has converged, and that happens identically whichever hand did
|
|
261
|
+
the work — so routing the decision to a person does not address it, while re-running the gate and the
|
|
262
|
+
review does. **In this repository routing it to a person does not even resolve it**: the user does not
|
|
263
|
+
read code, so a code-level conflict handed over is a deferral rather than a decision.
|
|
264
|
+
|
|
265
|
+
**The run steps back under these four conditions, and under no others. The list is exhaustive and
|
|
266
|
+
carries no judgement.**
|
|
267
|
+
|
|
268
|
+
1. **The resolution requires deleting the other side's change.** That decides intended behavior, not
|
|
269
|
+
text. It goes to the user as a **specification** question — "behavior A or behavior B" — never as a
|
|
270
|
+
diff.
|
|
271
|
+
2. **Both sides rewrote the same lines** — overlapping, not adjacent. Read off the structure of the
|
|
272
|
+
conflict hunks, so it needs no interpretation.
|
|
273
|
+
3. **A second conflict on the same child.** One resolution per child; the count is read off the Issue
|
|
274
|
+
comments step 4 writes, so it survives an interrupt.
|
|
275
|
+
4. **The re-run gate did not come back green, or the resolution review returned a High.** Not only a
|
|
276
|
+
High: a lint error, a failing test or a spell-check hit that merging a moved `main` introduced is
|
|
277
|
+
this condition too.
|
|
278
|
+
|
|
279
|
+
Meeting any of the four, the child is parked — `needs-decision` plus a comment naming which of the four
|
|
280
|
+
it was — and its lane is **kept**, because the pushed branch is the resume path (the table below).
|
|
281
|
+
|
|
282
|
+
**Leave the tree clean before parking: `git merge --abort` precedes a park under conditions 1, 2 or 4.**
|
|
283
|
+
Conditions 1 and 2 are read mid-merge with conflict markers still in the tree, condition 4 after a merge
|
|
284
|
+
that is resolved but not committed; condition 3 fires before any merge is started, so there is nothing
|
|
285
|
+
to abort.
|
|
286
|
+
|
|
287
|
+
### What happens to a lane
|
|
288
|
+
|
|
289
|
+
| When | The lane | Why |
|
|
290
|
+
| --- | --- | --- |
|
|
291
|
+
| The child **merged** | `pnpm josh lane:close <N>` | `followup` released the hold and the branch is on `main`; nothing in that tree is wanted |
|
|
292
|
+
| The child was **parked before its commit** | `git -C <dir> stash push -u -m "backlogrun: parked #<N>"`, record it on the Issue, then `pnpm josh lane:close <N>` | The stash is a repository-level ref, so it outlives the work tree — and `lane:close` is a **forced** removal that would otherwise take the work. `epic:next` counts a parked child's lane as released, so a lane left open holds a seat the count believes is free |
|
|
293
|
+
| The child was **parked after its commit and push** | **Left open**, its directory and held seat recorded on the Issue | The stash step is a **no-op** (tree clean because committed). What `lane:close` would take is the **local branch**, which is the resume path |
|
|
294
|
+
| The child hit a **merge conflict** | **Left open** — the resolution happens in it | The child resolves in place ("Conflicts are not predicted"). Closing it would delete the local branch the pull request carries — **`lane:open` does now put that branch back**, so a mistaken close is recoverable. A park under that section's four conditions takes the row above |
|
|
295
|
+
| The child stopped on **`needs-human-review`** | **Left open and untouched** | The uncommitted work *is* the artifact a person has to look at. Name the lane directory in the stop report and in the Telegram |
|
|
296
|
+
| The child **failed** | Whichever of the two parked rows applies, plus the consecutive-failure count | Same reasoning; only the counter differs. **A merge conflict is not this row** — it takes the row above, and it is not counted |
|
|
297
|
+
| **`lane:open` failed on the install** | `pnpm josh lane:close <N>`, then park the child | A lane exists that no `pnpm josh …` runs in and the next `lane:open` answers `already-open`. Closing frees the seat; parking is right because the cause is one a person fixes. Carry pnpm's reason into the park note |
|
|
298
|
+
| The run was **interrupted** | Nothing to do — the work tree survives on disk | The next session's `pnpm josh lane:prune` closes what git no longer has a tree for. **Park that child**, naming the lane and `pnpm josh lane:close <N>` as the way out |
|
|
299
|
+
|
|
300
|
+
**A committed child's lane is kept because it is the cheapest resume, not because closing it is final.**
|
|
301
|
+
`lane:close` follows the work-tree removal with `git branch -D <N>-lane` (the force flag is there so an
|
|
302
|
+
unmerged lane branch goes too), and resume is a re-run of `pnpm josh followup`, which reads the branch
|
|
303
|
+
**locally** (a `git diff` against the merge base) — so with no local branch the gate cannot be
|
|
304
|
+
re-evaluated. Keeping the lane is worth a seat: the tree, the branch and its `node_modules` are still
|
|
305
|
+
there, and the resume is one command.
|
|
306
|
+
|
|
307
|
+
**What is no longer true is that closing it is unrecoverable.** `pnpm josh lane:open <N>` now attaches
|
|
308
|
+
to a `<N>-lane` that exists locally and creates one from `origin/<N>-lane` where only the remote has it,
|
|
309
|
+
saying on standard error which it reused. So a lane closed after a push is reopened rather than lost.
|
|
310
|
+
**The branch still has to have reached the remote for that to hold** — a child parked before its commit
|
|
311
|
+
has nothing on `origin`, which is why that row stashes first and this one does not.
|
|
312
|
+
|
|
313
|
+
**Which row a child takes is decided by what `followup` printed, not by reading the situation.** **What
|
|
314
|
+
it prints is `PR checks failed (merge conflict)`** — that string is what reaches you;
|
|
315
|
+
`mergeStateStatus: DIRTY` is the internal spelling `git-pr-checks-eval.ts` compares against, never an
|
|
316
|
+
output line to search for. That string sends the child to resolve the conflict in the lane it is
|
|
317
|
+
standing in. Do not grep the output for `mergeable_state`: that is the REST field name, normalized away
|
|
318
|
+
before anything prints it. **Every after-commit park now keeps its lane, with no exception left in this
|
|
319
|
+
table.**
|
|
320
|
+
|
|
321
|
+
**A kept lane holds its seat, and that is the price rather than an oversight.** Seats are read back out
|
|
322
|
+
of the live work trees, so `lane:open` answers `full` rather than handing out ports twice. The optimism
|
|
323
|
+
is `epic:next`'s — it counts a parked child as having released its lane — and it costs one child offered
|
|
324
|
+
that cannot get a lane, which is visible and recoverable. **Say it in the park comment**: the lane
|
|
325
|
+
directory, that its seat is held, and `pnpm josh lane:close <N>` as the way to give it back.
|
|
326
|
+
|
|
327
|
+
**Release the hold on either parked arm, and leave the lane before closing it.** `pnpm josh followup`
|
|
328
|
+
releases the working-tree hold at the **merge**, so a parked child's is still held: run
|
|
329
|
+
`pnpm josh run:release <N>` in the lane — **a release names the run it belongs to**, and the child's own
|
|
330
|
+
number is what that record carries. **A `needs-human-review` stop is not a park and keeps its hold.**
|
|
331
|
+
`lane:close` does not release the hold for you — the record is keyed to the work tree's git directory,
|
|
332
|
+
so removing the tree strands it. And `cd` out of the lane **before** `pnpm josh lane:close <N>`: the
|
|
333
|
+
close removes the directory the shell is sitting in.
|
|
334
|
+
|
|
335
|
+
**A `needs-human-review` stop ends the run, and the lanes already in flight are allowed to finish.** No
|
|
336
|
+
new lane is opened, but killing units mid-gate would strand as many trees as there are lanes. When the
|
|
337
|
+
others have merged or parked, report and stop.
|
|
338
|
+
|
|
339
|
+
### CI concurrency
|
|
340
|
+
|
|
341
|
+
Past a GitHub account's concurrency entitlement, jobs **queue** rather than fail, which could cancel out
|
|
342
|
+
what the lanes bought; **`JOSH_LANE_LIMIT` lowers the ceiling with no code**. `ci.yml`'s concurrency
|
|
343
|
+
group is keyed on `${{ github.ref }}`, so N lanes on N branches are N independent groups and no lane
|
|
344
|
+
cancels another's run. Whether queueing bites is read from the multi-day backlog timing report — a
|
|
345
|
+
`checks-wait` that grows with the lane count is the queueing.
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# `backlogrun` — a child that cannot finish
|
|
2
|
+
|
|
3
|
+
**Read this file in full when a child cannot finish** — before parking it, before a
|
|
4
|
+
`needs-human-review` stop, or before recording a mid-run prerequisite or split. It is a point-of-use
|
|
5
|
+
document, never an entry read: the entry procedure is `backlogrun.md`, which points here at that
|
|
6
|
+
moment (joshuafolkken/kit#2010). This file is the single source of park-and-continue, the
|
|
7
|
+
`needs-human-review` stop, a stale `in-progress`, a prerequisite discovered mid-run, and a mid-run
|
|
8
|
+
split.
|
|
9
|
+
|
|
10
|
+
## What happens to a child that cannot finish
|
|
11
|
+
|
|
12
|
+
Nothing here is new, and nothing here is restated — a `backlogrun` child is a `fullrun` under a batch
|
|
13
|
+
authorization, whether it came from a named epic or from the opted-in pool:
|
|
14
|
+
|
|
15
|
+
- **A stop that would end the run parks one issue and the run continues** — → "park
|
|
16
|
+
and continue", which is that rule's single source, including what happens to the issue's lane.
|
|
17
|
+
- **A prerequisite discovered mid-run is recorded as a dependency rather than parked** —
|
|
18
|
+
→ "A prerequisite discovered mid-run", and `SKILL.md` → §2d for the three-way
|
|
19
|
+
distinction between a prerequisite, a split and an upstream defect. **One thing is genuinely
|
|
20
|
+
different**: with no epic, there is no `pnpm josh epic --add` to record the ordering into, so the
|
|
21
|
+
prerequisite is filed with `route:tier-a` and the blocked issue is parked with `needs-decision`
|
|
22
|
+
naming it. The parked issue returns to the pool when a person clears the label, and the
|
|
23
|
+
prerequisite is offered on the next ask if it carries `auto-ok`.
|
|
24
|
+
- **A split found mid-run** files the children and the epic and does not stop the batch, because the
|
|
25
|
+
keyword already authorized a batch — `split-assessment.md` for the assessment, → "Splitting a child
|
|
26
|
+
mid-run" for the branch. The split child is not parked or counted as a failure; its new children
|
|
27
|
+
remain available to the normal `backlog:next` / `epic:next` offer.
|
|
28
|
+
- **`in-progress` left behind by an interrupted run** is → "`in-progress` is removed by
|
|
29
|
+
whoever finds it stale".
|
|
30
|
+
- **A child released from `needs-decision` is re-dispatched to a lane, never implemented by the
|
|
31
|
+
parent.** The parent is an orchestrator: → "The parent orchestrates and never
|
|
32
|
+
implements a child in its own context" is the single source, and → "Removing the label
|
|
33
|
+
is Tier A" carries the re-dispatch itself. A released child takes a lane exactly as any batch child
|
|
34
|
+
does.
|
|
35
|
+
|
|
36
|
+
## `needs-human-review` — the one stop that is not a park
|
|
37
|
+
|
|
38
|
+
A child carrying **`needs-human-review`** is degraded to a `halfrun`-shaped stop and **the whole run ends
|
|
39
|
+
there** — implementation and the verification gate run, nothing is committed, the working tree is left
|
|
40
|
+
dirty and unstashed, a `confirmation` Telegram carrying the resume command goes out, and the remaining
|
|
41
|
+
children are not started.
|
|
42
|
+
|
|
43
|
+
**This is the exception to park-and-continue below, and it is not an oversight.** Parking works because
|
|
44
|
+
the parked child leaves the checkout clean; this child does not. Its uncommitted work is the artifact a
|
|
45
|
+
person has to look at — which is why the alternative that kept the batch running (commit, open a PR,
|
|
46
|
+
merge nothing) was rejected: it satisfies "a person approves publication" and fails "a person chooses".
|
|
47
|
+
|
|
48
|
+
**The child goes on holding its repository.** `needs-decision` outranks `in-progress` in the
|
|
49
|
+
per-repository exclusion so a parked child releases the checkout; this label deliberately does not,
|
|
50
|
+
because releasing it would start the next child on top of uncommitted work. **Its lane is left open and
|
|
51
|
+
untouched**, for the same reason. **Name the lane directory in the stop report and in the Telegram** — a
|
|
52
|
+
person told to look at a working tree and not told which one has been told nothing. The lanes already in
|
|
53
|
+
flight finish; no new lane is opened.
|
|
54
|
+
|
|
55
|
+
**Never apply or remove the label** — `auto-ok`'s rule, at `auto-ok`'s strength. Full definition and the
|
|
56
|
+
`needs-decision` comparison: `SKILL.md` → §2z, which is the single source.
|
|
57
|
+
|
|
58
|
+
## park and continue
|
|
59
|
+
|
|
60
|
+
When a child hits something this run may not decide — a Tier B toss-up, a Tier C action, an upstream
|
|
61
|
+
defect, a split that needs a person — **park the child and keep going.**
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=needs-decision'
|
|
65
|
+
pnpm josh issue:comment <N> --body-file <path> # what needs deciding, and the options
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`in-progress` is left as it is, and the parked child does **not** hold the repository — `epic:next` gives
|
|
69
|
+
`needs-decision` precedence over `in-progress`, so the next child is offered normally. Then return to
|
|
70
|
+
step 1; the other children are unaffected unless they depend on this one.
|
|
71
|
+
|
|
72
|
+
**What happens to a parked child's lane depends on whether it had committed, and the two answers are
|
|
73
|
+
opposite.** **Parked before its commit**, the lane is stashed and closed:
|
|
74
|
+
`git -C <dir> stash push -u -m "backlogrun: parked #<N>"`, the stash recorded on the Issue, then
|
|
75
|
+
`pnpm josh lane:close <N>` (`epic:next` counts a parked child's lane as released, and `lane:close`
|
|
76
|
+
removes the work tree by force). **Parked after its commit and push**, the lane is *kept*: nothing to
|
|
77
|
+
stash, and closing would delete the local branch the resume needs. **A lost merge race is not one of
|
|
78
|
+
these rows** — it resolves in its lane ("Conflicts are not predicted" above), and parks only under that
|
|
79
|
+
section's four conditions, which take the after-commit row. Both rows and the `pnpm josh run:release
|
|
80
|
+
<N>` every parked ending owes are "What happens to a lane" above, the single source.
|
|
81
|
+
|
|
82
|
+
**Parking replaces stopping the session, not the rule that produced the stop.** An upstream defect is
|
|
83
|
+
still filed immediately and unconditionally (Tier A for a first-party target), and a workaround is still
|
|
84
|
+
forbidden. **A placement choice is not one of the things this run may not decide.** `epic:bundle`'s
|
|
85
|
+
`ask` is Tier A: choose the epic you recommend, add it with `pnpm josh epic --add <E> <N> --after <M>`,
|
|
86
|
+
and record the decision on both the new Issue and that epic's `## Decisions`. What remains a park is a
|
|
87
|
+
genuine toss-up between two equally apt epics, and that is rare.
|
|
88
|
+
|
|
89
|
+
**Removing the label is Tier A — do it without asking.** When the decision is recorded (to the epic's
|
|
90
|
+
`## Decisions`), remove the label; the state is on GitHub, so the run picks up where it left off.
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
gh api -X DELETE repos/{owner}/{repo}/issues/<N>/labels/needs-decision 2>/dev/null || true
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**The released child goes back to a lane, never into the parent's own context.** A parent that is
|
|
97
|
+
*already* running, and clears a label mid-run because a person just answered, dispatches it the same way
|
|
98
|
+
rather than picking up its diff itself — `pnpm josh lane:open <N>` then `pnpm josh lane:dispatch <N>`. A
|
|
99
|
+
parent that implements the released child inline is the failure the orchestrator rule is written against:
|
|
100
|
+
"The parent orchestrates and never implements a child in its own context" above.
|
|
101
|
+
|
|
102
|
+
Without removing the label the parked child never runs again — it is the second half of the
|
|
103
|
+
human-in-the-loop cycle, not an optional tidy-up.
|
|
104
|
+
|
|
105
|
+
## `in-progress` is removed by whoever finds it stale
|
|
106
|
+
|
|
107
|
+
Nothing in the codebase removes `in-progress`; a normal finish closes the issue. An interrupted run
|
|
108
|
+
leaves it behind, and a child that carries it is excluded from every future `epic:next` — permanently.
|
|
109
|
+
**A session that detects a stale child removes the label itself** (Tier A) and reports it, before
|
|
110
|
+
continuing the loop.
|
|
111
|
+
|
|
112
|
+
**It costs more than that one child now.** An open issue carrying `in-progress` occupies one of the
|
|
113
|
+
repository's lanes — whichever epic it belongs to — so a stale label narrows every epic that touches
|
|
114
|
+
that checkout. **The rule therefore applies to any open issue in the repository, not only to this epic's
|
|
115
|
+
children**, and `epic:next` names the holders on standard error. **Age alone is not the test.** Check the
|
|
116
|
+
90-minute window below *and* look at what is holding it, because three states hold the label legitimately
|
|
117
|
+
for longer: a `halfrun` stopped for manual verification, any run paused mid-child, and a child stopped by
|
|
118
|
+
`needs-human-review` (which waits on a person reading an artifact, and carries its own label alongside
|
|
119
|
+
`in-progress`). **All three leave uncommitted work in the checkout**, so `git status` there is the
|
|
120
|
+
decisive read: a dirty tree means the hold is real — leave the label alone and report, never strip it and
|
|
121
|
+
start a second child on top of that work.
|
|
122
|
+
|
|
123
|
+
**A closed issue's labels are neither a finding nor something to clean up.** A closed issue holds no lane
|
|
124
|
+
(`epic-busy.ts` counts holders from the open listing alone) and `epic:next` never offers it, so
|
|
125
|
+
`in-progress` left behind on one changes nothing. **Do not report it, and do not strip it** — a report is
|
|
126
|
+
read as something that needs attention, so a run that lists non-findings is a run whose real findings are
|
|
127
|
+
harder to see.
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
gh api -X DELETE repos/{owner}/{repo}/issues/<N>/labels/in-progress 2>/dev/null || true
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## A prerequisite discovered mid-run
|
|
134
|
+
|
|
135
|
+
Finding that something else in **this** repository has to land first is not a split, and not an upstream
|
|
136
|
+
defect. The child in hand is still one deliverable; it just needs another one before it. The three-way
|
|
137
|
+
distinction, the `route:tier-a` filing command and the filing ceiling are `SKILL.md` → §2d, the single
|
|
138
|
+
source; what follows is this entry's branch.
|
|
139
|
+
|
|
140
|
+
`<M>` below is the child being implemented when the prerequisite turned up; `<N>` is the new Issue.
|
|
141
|
+
|
|
142
|
+
1. File the prerequisite Issue `<N>` with the `route:tier-a` label — Tier A for a first-party
|
|
143
|
+
repository, no confirmation. It is filed **first** because the next step names it.
|
|
144
|
+
2. **Stash the work in progress.** A child is implemented on the default branch with an uncommitted tree,
|
|
145
|
+
so `<M>`'s half-finished edits are sitting there, and the next child's `git switch main && git pull`
|
|
146
|
+
would refuse or carry them into the prerequisite's branch and PR.
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
git stash push -u -m "backlogrun: paused #<M> for prerequisite #<N>"
|
|
150
|
+
pnpm josh issue:comment <M> --body-file <path> # what was stashed, and that #<N> must land first
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**`-u` is not optional** (a new `*.test.ts` is untracked). The comment makes the paused state
|
|
154
|
+
auditable and tells the session that resumes `<M>` a stash is waiting. **Pop it by message, never by
|
|
155
|
+
position** — `pnpm josh stash:pop "backlogrun: paused #<M> for prerequisite #<N>"` — when `epic:next`
|
|
156
|
+
offers `<M>` again, after its `git switch main && git pull`. The stash is a repository-wide stack
|
|
157
|
+
every lane shares, so a bare `git stash pop` would take whichever lane last pushed; the message
|
|
158
|
+
targets this one. The prerequisite has merged by then, so expect to resolve conflicts.
|
|
159
|
+
|
|
160
|
+
3. `pnpm josh epic --add <E> <N> --before <M>` — one command writes the task-list row, the declaration
|
|
161
|
+
and the `blocked-by` relation together. Never edit the body by hand: the declaration and the relations
|
|
162
|
+
then disagree, `epic:next` returns `error`, and the unattended run stops.
|
|
163
|
+
4. **Remove `in-progress` from `<M>`** — `gh api -X DELETE repos/{owner}/{repo}/issues/<M>/labels/in-progress 2>/dev/null || true`.
|
|
164
|
+
This is what lets `<M>` run again: `epic:next` classifies a child carrying `in-progress` as waiting on
|
|
165
|
+
time **before** it looks at any blocker, so a child left labelled is never offered again.
|
|
166
|
+
5. **Do not park.** Go back to step 1 of the loop. `epic:next` classifies the original child as resolving
|
|
167
|
+
on its own and hands back the prerequisite first, so the order is kept with no human input.
|
|
168
|
+
|
|
169
|
+
**Parking is only for a prerequisite that cannot be expressed as a dependency** — one that needs a design
|
|
170
|
+
decision nobody has made, or that is a Tier B toss-up or a Tier C action. Parking one that *can* be
|
|
171
|
+
expressed inverts the whole point: `needs-decision` is cleared by a person.
|
|
172
|
+
|
|
173
|
+
## Splitting a child mid-run
|
|
174
|
+
|
|
175
|
+
Discovering that a child is really several is not a reason to stop. File the new children with the
|
|
176
|
+
`route:split` label (Tier A for a first-party repository — no confirmation), then add them with
|
|
177
|
+
`pnpm josh epic --add <E> <N...> [--before <M> | --after <M>]` rather than editing the epic body by hand.
|
|
178
|
+
Use the same split criteria as `kickoff`. If what remains of the original child needs a person, park
|
|
179
|
+
**that** child and move on. Splitting alone never adds `needs-decision` to the promoted epic.
|