@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,67 @@
|
|
|
1
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/run-event-stream'
|
|
2
|
+
|
|
3
|
+
const ISSUE_IN_EVENT = /#([1-9]\d*)\b/u
|
|
4
|
+
const SETTLED_KINDS: ReadonlySet<string> = new Set([
|
|
5
|
+
run_event_stream.EVENT_KIND.MERGE,
|
|
6
|
+
run_event_stream.EVENT_KIND.PARK,
|
|
7
|
+
run_event_stream.EVENT_KIND.SPLIT,
|
|
8
|
+
run_event_stream.EVENT_KIND.OUTAGE,
|
|
9
|
+
])
|
|
10
|
+
const DONE_KINDS: ReadonlySet<string> = new Set([
|
|
11
|
+
run_event_stream.EVENT_KIND.MERGE,
|
|
12
|
+
run_event_stream.EVENT_KIND.PARK,
|
|
13
|
+
run_event_stream.EVENT_KIND.SPLIT,
|
|
14
|
+
])
|
|
15
|
+
|
|
16
|
+
function issue_of(event: RunEvent): string | undefined {
|
|
17
|
+
return ISSUE_IN_EVENT.exec(event.text)?.[1]
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function update_active(active: Set<string>, event: RunEvent): void {
|
|
21
|
+
const issue = issue_of(event)
|
|
22
|
+
|
|
23
|
+
if (issue === undefined) return
|
|
24
|
+
if (event.kind === run_event_stream.EVENT_KIND.CHILD_LAUNCH) active.add(issue)
|
|
25
|
+
if (SETTLED_KINDS.has(event.kind)) active.delete(issue)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function active_issues(events: ReadonlyArray<RunEvent>): ReadonlySet<string> {
|
|
29
|
+
const active = new Set<string>()
|
|
30
|
+
|
|
31
|
+
for (const event of events) update_active(active, event)
|
|
32
|
+
|
|
33
|
+
return active
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function settled_issues(events: ReadonlyArray<RunEvent>): ReadonlySet<number> {
|
|
37
|
+
const settled = events.filter((event) => DONE_KINDS.has(event.kind))
|
|
38
|
+
|
|
39
|
+
return new Set(
|
|
40
|
+
settled
|
|
41
|
+
.map((event) => issue_of(event))
|
|
42
|
+
.filter((issue) => issue !== undefined)
|
|
43
|
+
.map(Number),
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function parked_issues(events: ReadonlyArray<RunEvent>): ReadonlySet<number> {
|
|
48
|
+
return new Set(
|
|
49
|
+
events
|
|
50
|
+
.filter((event) => event.kind === run_event_stream.EVENT_KIND.PARK)
|
|
51
|
+
.map((event) => issue_of(event))
|
|
52
|
+
.filter((issue) => issue !== undefined)
|
|
53
|
+
.map(Number),
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function restore(
|
|
58
|
+
lanes: ReadonlyArray<string>,
|
|
59
|
+
events: ReadonlyArray<RunEvent>,
|
|
60
|
+
merged_issues: ReadonlyArray<number>,
|
|
61
|
+
): ReadonlyArray<string> {
|
|
62
|
+
const active = active_issues(events)
|
|
63
|
+
|
|
64
|
+
return lanes.filter((issue) => active.has(issue) && !merged_issues.includes(Number(issue)))
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export const backlog_drive_restore = { restore, settled_issues, parked_issues }
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
// The body of `josh backlog:drive`: the backlogrun parent's mechanical transitions, run as one resident
|
|
2
|
+
// wait instead of a model turn per event (joshuafolkken/kit#2499).
|
|
3
|
+
//
|
|
4
|
+
// **What it replaces is the parent's turn between two commands.** Measured after #2492 the parent still
|
|
5
|
+
// spent about half of its backlogrun requests on nothing but glue: a child's process ends, the model
|
|
6
|
+
// wakes, runs `run:merge`, reads a number, runs `lane:launch`, restarts `lane:await`, ends its turn — or,
|
|
7
|
+
// headless, polls in the foreground because its turn cannot end. Every one of those steps is a command
|
|
8
|
+
// whose answer is already a token, so the loop here only reads tokens and never decides what one means.
|
|
9
|
+
//
|
|
10
|
+
// **It decides nothing another command answers.** Collecting a child is `run:merge`'s, choosing the next
|
|
11
|
+
// issue and the budget are `backlog:offer`'s, opening a lane is `lane:launch`'s, and a child's exit is
|
|
12
|
+
// `lane:await`'s re-confirmed process check. What is left is which of them runs next, and when a token is
|
|
13
|
+
// one the model has to read — a control verdict, a refused launch, a watch, the end of the run — the
|
|
14
|
+
// loop stops and hands that token back rather than acting on it.
|
|
15
|
+
//
|
|
16
|
+
// **Everything it touches is a port**, the pattern `run-wake-loop.ts` set, so the sequencing is pinned
|
|
17
|
+
// without a process, a network or a clock.
|
|
18
|
+
|
|
19
|
+
// The `run:merge` tokens that need the parent: a hand-off, a person's stop, a tripped guard, a foreign
|
|
20
|
+
// owner, an unreadable state. `resumed` is not among them — the same lane is awaited again.
|
|
21
|
+
const HANDOFF_TOKENS: ReadonlySet<string> = new Set([
|
|
22
|
+
'over',
|
|
23
|
+
'human-review',
|
|
24
|
+
'stop',
|
|
25
|
+
'environment',
|
|
26
|
+
'busy',
|
|
27
|
+
'retry',
|
|
28
|
+
])
|
|
29
|
+
const RESUMED_TOKEN = 'resumed'
|
|
30
|
+
const RUN_VERDICT = 'run'
|
|
31
|
+
const STOP_VERDICT = 'stop'
|
|
32
|
+
const WATCH_VERDICT = 'watch'
|
|
33
|
+
// The verdicts the loop acts on without the parent. Any other is handed back as it was printed.
|
|
34
|
+
const KNOWN_VERDICTS: ReadonlySet<string> = new Set([
|
|
35
|
+
RUN_VERDICT,
|
|
36
|
+
STOP_VERDICT,
|
|
37
|
+
WATCH_VERDICT,
|
|
38
|
+
'wait',
|
|
39
|
+
])
|
|
40
|
+
const NO_RETRIES = 0
|
|
41
|
+
|
|
42
|
+
interface OfferRead {
|
|
43
|
+
verdict: string
|
|
44
|
+
issues: ReadonlyArray<string>
|
|
45
|
+
retries: number
|
|
46
|
+
answer?: string | undefined
|
|
47
|
+
reason?: string | undefined
|
|
48
|
+
is_retrospective_done?: boolean
|
|
49
|
+
is_finish?: boolean | undefined
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface DriveState {
|
|
53
|
+
// The children this run has in flight — seeded from the open lanes, so a restarted loop resumes them.
|
|
54
|
+
in_flight: Array<string>
|
|
55
|
+
// Every child collected, fed back to `backlog:offer` because GitHub closes a merged issue late.
|
|
56
|
+
exclude: Array<string>
|
|
57
|
+
// When the run last did something, handed to `backlog:budget` as `--active`.
|
|
58
|
+
active: string
|
|
59
|
+
retries: number
|
|
60
|
+
// A `stop` verdict: start nothing more, collect what is in flight, then end.
|
|
61
|
+
is_stopping: boolean
|
|
62
|
+
stop_reason?: string | undefined
|
|
63
|
+
stop_is_finish?: boolean | undefined
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
interface DriveEnd {
|
|
67
|
+
// Why the loop handed control back: `merge`, `launch`, `offer`, `watch`, `stop`, `window` or a verdict.
|
|
68
|
+
reason: string
|
|
69
|
+
// The token the parent reads, where one command printed it.
|
|
70
|
+
token: string | undefined
|
|
71
|
+
issue: string | undefined
|
|
72
|
+
detail?: string
|
|
73
|
+
is_finish?: boolean | undefined
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface DrivePorts {
|
|
77
|
+
// Whether a child's process has confirmed-ended — `lane:await`'s re-confirmed check in production.
|
|
78
|
+
is_finished: (issue: string) => boolean
|
|
79
|
+
// `run:merge <N>`'s first stdout token.
|
|
80
|
+
merge: (issue: string) => Promise<string>
|
|
81
|
+
// `backlog:offer`'s answer for the state, or `undefined` when it exited non-zero.
|
|
82
|
+
offer: (state: DriveState) => Promise<OfferRead | undefined>
|
|
83
|
+
launch: (issue: string) => Promise<boolean>
|
|
84
|
+
now: () => Date
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// An end carries the state reached so far, so the resume line keeps what the pass collected before it.
|
|
88
|
+
type PassResult =
|
|
89
|
+
{ kind: 'continue'; state: DriveState } | { kind: 'end'; end: DriveEnd; state: DriveState }
|
|
90
|
+
|
|
91
|
+
function ended(reason: string, state: DriveState, token?: string, issue?: string): PassResult {
|
|
92
|
+
const detail = reason === STOP_VERDICT ? state.stop_reason : undefined
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
kind: 'end',
|
|
96
|
+
end: {
|
|
97
|
+
reason,
|
|
98
|
+
token,
|
|
99
|
+
issue,
|
|
100
|
+
...(detail !== undefined && { detail }),
|
|
101
|
+
...(reason === STOP_VERDICT && { is_finish: state.stop_is_finish }),
|
|
102
|
+
},
|
|
103
|
+
state,
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function is_drain(read: OfferRead, state: DriveState): boolean {
|
|
108
|
+
return (
|
|
109
|
+
read.verdict === WATCH_VERDICT && state.in_flight.length === 0 && !read.is_retrospective_done
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function needs_retrospective(read: OfferRead, state: DriveState): boolean {
|
|
114
|
+
return (
|
|
115
|
+
read.verdict === STOP_VERDICT &&
|
|
116
|
+
read.answer === 'exhausted' &&
|
|
117
|
+
state.in_flight.length === 0 &&
|
|
118
|
+
!read.is_retrospective_done
|
|
119
|
+
)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function initial_state(in_flight: ReadonlyArray<string>, active: string): DriveState {
|
|
123
|
+
return {
|
|
124
|
+
in_flight: [...in_flight],
|
|
125
|
+
exclude: [],
|
|
126
|
+
active,
|
|
127
|
+
retries: NO_RETRIES,
|
|
128
|
+
is_stopping: false,
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// One finished child: collected, excluded, and — unless its cut was resumed in place — out of flight.
|
|
133
|
+
async function collect(issue: string, state: DriveState, ports: DrivePorts): Promise<PassResult> {
|
|
134
|
+
const token = await ports.merge(issue)
|
|
135
|
+
|
|
136
|
+
// An empty first line is a `run:merge` that failed before printing one: never read as a collection.
|
|
137
|
+
if (token === '') return ended('merge', state, undefined, issue)
|
|
138
|
+
if (HANDOFF_TOKENS.has(token)) return ended('merge', state, token, issue)
|
|
139
|
+
|
|
140
|
+
const in_flight =
|
|
141
|
+
token === RESUMED_TOKEN ? state.in_flight : state.in_flight.filter((item) => item !== issue)
|
|
142
|
+
const exclude = state.exclude.includes(issue) ? state.exclude : [...state.exclude, issue]
|
|
143
|
+
|
|
144
|
+
return {
|
|
145
|
+
kind: 'continue',
|
|
146
|
+
state: { ...state, in_flight, exclude, active: ports.now().toISOString() },
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async function collect_finished(state: DriveState, ports: DrivePorts): Promise<PassResult> {
|
|
151
|
+
const finished = state.in_flight.filter((item) => ports.is_finished(item))
|
|
152
|
+
let current = state
|
|
153
|
+
|
|
154
|
+
for (const issue of finished) {
|
|
155
|
+
const result = await collect(issue, current, ports)
|
|
156
|
+
|
|
157
|
+
if (result.kind === 'end') return { ...result, state: current }
|
|
158
|
+
|
|
159
|
+
current = result.state
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return { kind: 'continue', state: current }
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async function launch_all(
|
|
166
|
+
issues: ReadonlyArray<string>,
|
|
167
|
+
state: DriveState,
|
|
168
|
+
ports: DrivePorts,
|
|
169
|
+
): Promise<PassResult> {
|
|
170
|
+
const in_flight = [...state.in_flight]
|
|
171
|
+
|
|
172
|
+
for (const issue of issues) {
|
|
173
|
+
const is_launched = await ports.launch(issue)
|
|
174
|
+
|
|
175
|
+
if (!is_launched) return ended('launch', { ...state, in_flight }, undefined, issue)
|
|
176
|
+
|
|
177
|
+
in_flight.push(issue)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return { kind: 'continue', state: { ...state, in_flight, active: ports.now().toISOString() } }
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// A watch with nothing in flight is the drain: `run:step` owes the retrospective there, so it is the
|
|
184
|
+
// parent's. With children still running the watch is only waiting on them.
|
|
185
|
+
function on_verdict(read: OfferRead, state: DriveState): PassResult {
|
|
186
|
+
if (!KNOWN_VERDICTS.has(read.verdict)) return ended(read.verdict, state, read.verdict)
|
|
187
|
+
if (needs_retrospective(read, state)) return ended('retrospective', state, 'retrospective')
|
|
188
|
+
|
|
189
|
+
if (read.verdict === STOP_VERDICT) {
|
|
190
|
+
return {
|
|
191
|
+
kind: 'continue',
|
|
192
|
+
state: {
|
|
193
|
+
...state,
|
|
194
|
+
is_stopping: true,
|
|
195
|
+
stop_reason: read.reason,
|
|
196
|
+
stop_is_finish: read.is_finish,
|
|
197
|
+
},
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (is_drain(read, state)) return ended(WATCH_VERDICT, state, WATCH_VERDICT)
|
|
202
|
+
|
|
203
|
+
return { kind: 'continue', state }
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
async function ask_offer(state: DriveState, ports: DrivePorts): Promise<PassResult> {
|
|
207
|
+
const read = await ports.offer(state)
|
|
208
|
+
|
|
209
|
+
if (read === undefined) return ended('offer', state)
|
|
210
|
+
|
|
211
|
+
const next = { ...state, retries: read.retries }
|
|
212
|
+
|
|
213
|
+
if (read.verdict === RUN_VERDICT) return await launch_all(read.issues, next, ports)
|
|
214
|
+
|
|
215
|
+
return on_verdict(read, next)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// One pass: collect every child that ended, then — unless a `stop` has been read — ask what to start.
|
|
219
|
+
// `should_offer` is the caller's throttle on the one network read; a collection always asks, because a
|
|
220
|
+
// lane just freed.
|
|
221
|
+
function is_offering(before: DriveState, after: DriveState, should_offer: boolean): boolean {
|
|
222
|
+
if (after.is_stopping) return false
|
|
223
|
+
|
|
224
|
+
return should_offer || after.in_flight.length !== before.in_flight.length
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// A stopping run with nothing left in flight has ended.
|
|
228
|
+
function settle(result: PassResult): PassResult {
|
|
229
|
+
if (result.kind === 'end') return result
|
|
230
|
+
|
|
231
|
+
const is_done = result.state.is_stopping && result.state.in_flight.length === 0
|
|
232
|
+
|
|
233
|
+
return is_done ? ended(STOP_VERDICT, result.state, STOP_VERDICT) : result
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
async function run_pass(
|
|
237
|
+
state: DriveState,
|
|
238
|
+
should_offer: boolean,
|
|
239
|
+
ports: DrivePorts,
|
|
240
|
+
): Promise<PassResult> {
|
|
241
|
+
const collected = await collect_finished(state, ports)
|
|
242
|
+
|
|
243
|
+
if (collected.kind === 'end') return collected
|
|
244
|
+
if (!is_offering(state, collected.state, should_offer)) return settle(collected)
|
|
245
|
+
|
|
246
|
+
return settle(await ask_offer(collected.state, ports))
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
interface LoopConfig {
|
|
250
|
+
poll_ms: number
|
|
251
|
+
// The floor between two `backlog:offer` asks while nothing was collected — the same one-minute
|
|
252
|
+
// cadence the wake supervisor polls the backlog on, so an idle stretch is not a network hammer.
|
|
253
|
+
offer_ms: number
|
|
254
|
+
// How long one invocation may wait before returning `window`, or `undefined` for no bound. A headless
|
|
255
|
+
// parent's foreground call is capped by its shell's timeout, so it passes one under that cap.
|
|
256
|
+
window_ms: number | undefined
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
interface LoopPorts extends DrivePorts {
|
|
260
|
+
sleep: (milliseconds: number) => Promise<void>
|
|
261
|
+
finish: (end: DriveEnd) => Promise<void>
|
|
262
|
+
// Called after every pass, ended ones included, so the caller can keep the resume line current.
|
|
263
|
+
on_state: (state: DriveState) => void
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
interface LoopRun {
|
|
267
|
+
state: DriveState
|
|
268
|
+
started_ms: number
|
|
269
|
+
offered_ms: number
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const WINDOW_END: DriveEnd = { reason: 'window', token: undefined, issue: undefined }
|
|
273
|
+
|
|
274
|
+
function is_window_spent(run: LoopRun, config: LoopConfig, now_ms: number): boolean {
|
|
275
|
+
if (config.window_ms === undefined) return false
|
|
276
|
+
|
|
277
|
+
return now_ms - run.started_ms >= config.window_ms
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
type LoopStep = { kind: 'end'; end: DriveEnd } | { kind: 'next'; run: LoopRun }
|
|
281
|
+
|
|
282
|
+
// One pass of the loop: the offer is due on the first pass and then no oftener than `offer_ms`, bar the
|
|
283
|
+
// passes that collected a child. A `next` carries the run to sleep on and pass again.
|
|
284
|
+
async function loop_step(run: LoopRun, config: LoopConfig, ports: LoopPorts): Promise<LoopStep> {
|
|
285
|
+
const now_ms = ports.now().getTime()
|
|
286
|
+
const is_due = now_ms - run.offered_ms >= config.offer_ms
|
|
287
|
+
const result = await run_pass(run.state, is_due, ports)
|
|
288
|
+
|
|
289
|
+
ports.on_state(result.state)
|
|
290
|
+
|
|
291
|
+
if (result.kind === 'end') return result
|
|
292
|
+
|
|
293
|
+
const next = { ...run, state: result.state, offered_ms: is_due ? now_ms : run.offered_ms }
|
|
294
|
+
|
|
295
|
+
return is_window_spent(next, config, ports.now().getTime())
|
|
296
|
+
? { kind: 'end', end: WINDOW_END }
|
|
297
|
+
: { kind: 'next', run: next }
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Pass, sleep, repeat — until a pass hands a token back or the window is spent.
|
|
301
|
+
async function run_loop(
|
|
302
|
+
state: DriveState,
|
|
303
|
+
config: LoopConfig,
|
|
304
|
+
ports: LoopPorts,
|
|
305
|
+
): Promise<DriveEnd> {
|
|
306
|
+
const first: LoopRun = { state, started_ms: ports.now().getTime(), offered_ms: -Infinity }
|
|
307
|
+
let step = await loop_step(first, config, ports)
|
|
308
|
+
|
|
309
|
+
while (step.kind === 'next') {
|
|
310
|
+
await ports.sleep(config.poll_ms)
|
|
311
|
+
step = await loop_step(step.run, config, ports)
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
if (step.end.reason === STOP_VERDICT) await ports.finish(step.end)
|
|
315
|
+
|
|
316
|
+
return step.end
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const backlog_drive = { HANDOFF_TOKENS, collect, initial_state, on_verdict, run_loop, run_pass }
|
|
320
|
+
|
|
321
|
+
export type { DriveEnd, DrivePorts, DriveState, LoopConfig, LoopPorts, OfferRead, PassResult }
|
|
322
|
+
export { backlog_drive }
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// The named-issue prefix of a `backlogrun` invocation (joshuafolkken/kit#1984). `backlogrun #N1 #N2 …`
|
|
2
|
+
// runs the issues typed after the keyword in the order they were typed, one at a time, and only once
|
|
3
|
+
// they are all done does the opted-in backlog drain. This module is the single source of that order
|
|
4
|
+
// and of what a failure partway through it does, so the plan a person reads (`backlog:plan`) and the
|
|
5
|
+
// loop that runs it (`backlogrun.md`) cannot disagree.
|
|
6
|
+
//
|
|
7
|
+
// **It replaces the old `queue` keyword.** `queue #N1 #N2 …` was a separate entry point for exactly
|
|
8
|
+
// this sequential run; folding it in means one command carries both the named prefix and the backlog
|
|
9
|
+
// that follows it, under one authorization and one carried budget.
|
|
10
|
+
//
|
|
11
|
+
// **A named item is a single issue or an epic** (joshuafolkken/kit#1985, folding in the old `epicrun`
|
|
12
|
+
// keyword). A single-issue item is one `fullrun`; an epic item runs every child in dependency order,
|
|
13
|
+
// across the free lanes, and is done only once every child has been processed — merged or parked. The
|
|
14
|
+
// run does not advance to the next named item until the epic item is complete, which is `epicrun`'s
|
|
15
|
+
// whole-epic execution at the granularity of one named item.
|
|
16
|
+
|
|
17
|
+
const NAMED_KIND = 'named'
|
|
18
|
+
const BACKLOG_KIND = 'backlog'
|
|
19
|
+
// What follows the named list when `--only` was typed: nothing. `end` is `backlog`'s counterpart in
|
|
20
|
+
// `after_failure.next`, so the loop reads one field to know whether the pool is next or the run is over.
|
|
21
|
+
const END_KIND = 'end'
|
|
22
|
+
const NEXT_INDEX_OFFSET = 1
|
|
23
|
+
const NOT_FOUND = -1
|
|
24
|
+
|
|
25
|
+
// `backlogrun --only` with no named issues has nothing to run — the flag says "run the named list and
|
|
26
|
+
// stop", and an empty named list makes that the empty run. Refused before anything starts rather than
|
|
27
|
+
// begun and found empty, the same way a budget-only invocation is still a valid bare `backlogrun`.
|
|
28
|
+
const NOTHING_TO_RUN =
|
|
29
|
+
'`--only` runs the named issues and stops, but none were named, so there is nothing to run. Name the issues (`backlogrun #N1 #N2 … --only`), or drop `--only` to drain the opted-in backlog.'
|
|
30
|
+
|
|
31
|
+
// One named item: a single issue (`is_epic: false`) or an epic (`is_epic: true`). The parser only sees
|
|
32
|
+
// `#N`, so which one it is is decided by the caller from GitHub state; the pure functions here carry
|
|
33
|
+
// the flag rather than re-derive it, so the plan and the loop agree on how each item runs.
|
|
34
|
+
interface NamedItem {
|
|
35
|
+
issue: number
|
|
36
|
+
is_epic: boolean
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface NamedStep {
|
|
40
|
+
kind: typeof NAMED_KIND
|
|
41
|
+
issue: number
|
|
42
|
+
is_epic: boolean
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
interface BacklogStep {
|
|
46
|
+
kind: typeof BACKLOG_KIND
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
type PlanStep = NamedStep | BacklogStep
|
|
50
|
+
|
|
51
|
+
// A named issue that could not finish parks like any other child; what is specific to a sequential run
|
|
52
|
+
// is that the issues declared *after* it are not started — the order was the point of naming them. What
|
|
53
|
+
// follows is the pool by default, or nothing under `--only`, so the run then drains the opted-in
|
|
54
|
+
// backlog or ends (joshuafolkken/kit#1984).
|
|
55
|
+
//
|
|
56
|
+
// **This skip only applies to a single-issue item.** An epic item does not park as a unit — its
|
|
57
|
+
// children park individually and the epic item completes anyway (`epic_item_outcome`), so a parked
|
|
58
|
+
// epic child, which is never in the named list, skips nothing and the run advances to the next item
|
|
59
|
+
// (joshuafolkken/kit#1985).
|
|
60
|
+
interface FailureOutcome {
|
|
61
|
+
parked: number
|
|
62
|
+
skipped: ReadonlyArray<number>
|
|
63
|
+
next: typeof BACKLOG_KIND | typeof END_KIND
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// The completion of one epic named item. It runs every child and finishes once each has been
|
|
67
|
+
// processed; the children that parked are carried here so the completion report can list them, and the
|
|
68
|
+
// item is complete regardless — a parked child never holds up the next named item
|
|
69
|
+
// (joshuafolkken/kit#1985).
|
|
70
|
+
interface EpicItemOutcome {
|
|
71
|
+
epic: number
|
|
72
|
+
parked: ReadonlyArray<number>
|
|
73
|
+
complete: true
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// One child of an epic item after it ran: merged (`parked: false`) or parked (`parked: true`).
|
|
77
|
+
interface EpicChildOutcome {
|
|
78
|
+
issue: number
|
|
79
|
+
parked: boolean
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// The plan, or the refusal that stops it before it starts. `startup` is the single decision a
|
|
83
|
+
// `backlogrun` begins from, so the refusal and the order cannot drift into two places.
|
|
84
|
+
type Startup =
|
|
85
|
+
{ kind: 'plan'; steps: ReadonlyArray<PlanStep> } | { kind: 'refused'; reason: string }
|
|
86
|
+
|
|
87
|
+
const BACKLOG_STEP: BacklogStep = { kind: BACKLOG_KIND }
|
|
88
|
+
|
|
89
|
+
function named_step(item: NamedItem): NamedStep {
|
|
90
|
+
return { kind: NAMED_KIND, issue: item.issue, is_epic: item.is_epic }
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// The execution plan: the named items in the order they were declared, then the opted-in backlog —
|
|
94
|
+
// unless `--only`, which stops after the named list. Each named step carries whether it is an epic, so
|
|
95
|
+
// the loop knows to run one `fullrun` or a whole epic. A bare `backlogrun` names none, so the plan is
|
|
96
|
+
// the backlog alone, which is the behavior that entry point always had.
|
|
97
|
+
function plan(named: ReadonlyArray<NamedItem>, is_only = false): ReadonlyArray<PlanStep> {
|
|
98
|
+
const steps = named.map((item) => named_step(item))
|
|
99
|
+
|
|
100
|
+
return is_only ? steps : [...steps, BACKLOG_STEP]
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// The plan a `backlogrun` starts from, or the refusal that keeps it from starting. Only `--only` with
|
|
104
|
+
// no named items is refused; everything else is a plan, a bare `backlogrun` (the backlog alone)
|
|
105
|
+
// included.
|
|
106
|
+
function startup(named: ReadonlyArray<NamedItem>, is_only = false): Startup {
|
|
107
|
+
if (is_only && named.length === 0) return { kind: 'refused', reason: NOTHING_TO_RUN }
|
|
108
|
+
|
|
109
|
+
return { kind: 'plan', steps: plan(named, is_only) }
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// A single-issue named item failed midway. It parks, the items declared after it are skipped (starting
|
|
113
|
+
// them would break the order they were named in), and the run proceeds to the backlog — or ends under
|
|
114
|
+
// `--only`, which never had a pool to fall through to. A failure whose number is not a *single-issue*
|
|
115
|
+
// named item skips nothing: an issue never named, and an epic child (which is not in the named list),
|
|
116
|
+
// both leave the order intact, so the run simply continues. An epic named item completes through
|
|
117
|
+
// `epic_item_outcome` rather than parking as a unit, so its number never skips the list either.
|
|
118
|
+
function after_failure(
|
|
119
|
+
named: ReadonlyArray<NamedItem>,
|
|
120
|
+
failed: number,
|
|
121
|
+
is_only = false,
|
|
122
|
+
): FailureOutcome {
|
|
123
|
+
const index = named.findIndex((item) => item.issue === failed && !item.is_epic)
|
|
124
|
+
const skipped =
|
|
125
|
+
index === NOT_FOUND ? [] : named.slice(index + NEXT_INDEX_OFFSET).map((item) => item.issue)
|
|
126
|
+
|
|
127
|
+
return { parked: failed, skipped, next: is_only ? END_KIND : BACKLOG_KIND }
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// An epic named item is complete once every child has been processed — merged or parked. The parked
|
|
131
|
+
// children are carried out so the completion report can list them, and the item is complete either
|
|
132
|
+
// way: a parked epic child does not hold up the next named item, which is `epicrun`'s park-and-continue
|
|
133
|
+
// at the granularity of one named epic item (joshuafolkken/kit#1985).
|
|
134
|
+
function epic_item_outcome(
|
|
135
|
+
epic: number,
|
|
136
|
+
children: ReadonlyArray<EpicChildOutcome>,
|
|
137
|
+
): EpicItemOutcome {
|
|
138
|
+
const parked = children.filter((child) => child.parked).map((child) => child.issue)
|
|
139
|
+
|
|
140
|
+
return { epic, parked, complete: true }
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const backlog_named = {
|
|
144
|
+
BACKLOG_KIND,
|
|
145
|
+
END_KIND,
|
|
146
|
+
NAMED_KIND,
|
|
147
|
+
NOTHING_TO_RUN,
|
|
148
|
+
after_failure,
|
|
149
|
+
epic_item_outcome,
|
|
150
|
+
plan,
|
|
151
|
+
startup,
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export type {
|
|
155
|
+
BacklogStep,
|
|
156
|
+
EpicChildOutcome,
|
|
157
|
+
EpicItemOutcome,
|
|
158
|
+
FailureOutcome,
|
|
159
|
+
NamedItem,
|
|
160
|
+
NamedStep,
|
|
161
|
+
PlanStep,
|
|
162
|
+
Startup,
|
|
163
|
+
}
|
|
164
|
+
export { backlog_named }
|