@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,376 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url'
|
|
2
|
+
import { auto_ok_cli, type OptedInRead, type TrackingRead } from '#scripts/auto-ok/auto-ok-cli'
|
|
3
|
+
import { repo_discovery } from '#scripts/discovery/repo-discovery'
|
|
4
|
+
import { epic_bundle_gaps } from '#scripts/epic/epic-bundle-gaps'
|
|
5
|
+
import { epic_index } from '#scripts/epic/epic-index'
|
|
6
|
+
import { epic_next } from '#scripts/epic/epic-next'
|
|
7
|
+
import { epic_next_read, type EpicRead } from '#scripts/epic/epic-next-read'
|
|
8
|
+
import type { EpicView } from '#scripts/epic/epic-next-views'
|
|
9
|
+
import { epic_report, type EpicNextResult, type EpicVerdict } from '#scripts/epic/epic-report'
|
|
10
|
+
import { git_gh_command } from '#scripts/git/git-gh-command'
|
|
11
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
12
|
+
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
13
|
+
import { backlog_defect_priority } from './backlog-defect-priority'
|
|
14
|
+
import { backlog_pool } from './backlog-pool'
|
|
15
|
+
|
|
16
|
+
// `josh backlog:next` — what the whole opted-in backlog may run next (joshuafolkken/kit#1630).
|
|
17
|
+
//
|
|
18
|
+
// The answer used to be split in two, and neither half could give it. `epic:next` has the dependency
|
|
19
|
+
// graph and the execution wave, but its input is **one epic's task list**. `auto-ok:next` sees the
|
|
20
|
+
// whole backlog, but it orders by the display's newest-first ranking and reads no dependency at all.
|
|
21
|
+
// So there was no route that asked the backlog itself what may start.
|
|
22
|
+
//
|
|
23
|
+
// This command is that route, and it is glue rather than a third implementation: the epic half runs
|
|
24
|
+
// through `epic:next`'s own read → classify → report pipeline unchanged, the standalone half through
|
|
25
|
+
// `auto-ok:next`'s own listing and runnability rules, and the verdict comes from
|
|
26
|
+
// `epic_report.decide_verdict` so it cannot drift from what `epic:next` means by the same word.
|
|
27
|
+
|
|
28
|
+
const ARGV_OFFSET = 2
|
|
29
|
+
const SUCCESS_EXIT_CODE = 0
|
|
30
|
+
const FAILURE_EXIT_CODE = 1
|
|
31
|
+
|
|
32
|
+
const USAGE = 'Usage: josh backlog:next [--exclude <issue-number>[,<issue-number>...]]...'
|
|
33
|
+
|
|
34
|
+
const REPO_UNREADABLE_MESSAGE =
|
|
35
|
+
'Could not read this repository from `gh`, so an epic child could not be told from an issue elsewhere. That is not "nothing is runnable" — check `gh auth status` and ask again.'
|
|
36
|
+
|
|
37
|
+
// Why a read of the opted-in listing failed, in `auto-ok:next`'s own words. Reworded here, the two
|
|
38
|
+
// commands would explain the same failure differently to the same person.
|
|
39
|
+
const READ_FAILURES: Readonly<Record<Exclude<OptedInRead['kind'], 'read'>, string>> = {
|
|
40
|
+
blockers_unreadable: auto_ok_cli.BLOCKERS_UNREADABLE_MESSAGE,
|
|
41
|
+
unexpected_shape: auto_ok_cli.UNEXPECTED_SHAPE_MESSAGE,
|
|
42
|
+
unreadable: auto_ok_cli.UNREADABLE_MESSAGE,
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// What `retry` says that `error` cannot (joshuafolkken/kit#1663).
|
|
46
|
+
//
|
|
47
|
+
// The anomaly `epic:next` raises for a child it could not read tells the reader to check
|
|
48
|
+
// `gh auth status` and that the issue exists — correct for the failure it was written for, and
|
|
49
|
+
// actively misleading for a name resolution that never reached GitHub at all. Neither the issue nor
|
|
50
|
+
// the credentials were the problem there, and the graph itself may be perfectly resolvable.
|
|
51
|
+
const RETRY_MESSAGE =
|
|
52
|
+
'GitHub did not answer, so a child of the dependency graph could not be read. This is a transport failure and not an unusable graph — the listings this command already read prove `gh` and the credentials work. Ask again after a short wait.'
|
|
53
|
+
|
|
54
|
+
// `epic:next`'s verdicts, in this command's spelling, plus the one it has no word for.
|
|
55
|
+
//
|
|
56
|
+
// `complete` becomes `none` because a backlog is never finished the way one epic is — the token says
|
|
57
|
+
// "nothing to hand back", which is the same thing `auto-ok:next` prints, so a loop reading either
|
|
58
|
+
// command branches on one word. `run` never reaches standard output at all: the numbers do.
|
|
59
|
+
//
|
|
60
|
+
// **`retry` is this command's own and is deliberately not added to `EpicVerdict`.** `epic:next` has
|
|
61
|
+
// no failure path that could emit it, so widening the shared union would give every consumer of it a
|
|
62
|
+
// member none of them can produce — and `VERDICT_LINES` a line nothing ever prints. The token is a
|
|
63
|
+
// backlog-level answer about the transport, not a reading of one epic's graph.
|
|
64
|
+
type BacklogVerdict = EpicVerdict | 'retry'
|
|
65
|
+
|
|
66
|
+
const VERDICT_TOKENS: Readonly<Record<BacklogVerdict, string>> = {
|
|
67
|
+
complete: auto_ok_cli.NONE_TOKEN,
|
|
68
|
+
error: 'error',
|
|
69
|
+
retry: 'retry',
|
|
70
|
+
run: 'run',
|
|
71
|
+
stop: 'stop',
|
|
72
|
+
wait: 'wait',
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
type OptedIn = Extract<OptedInRead, { kind: 'read' }>
|
|
76
|
+
type Tracking = Extract<TrackingRead, { kind: 'read' }>
|
|
77
|
+
|
|
78
|
+
// Everything the answer is assembled from, read once and passed down rather than re-fetched.
|
|
79
|
+
interface PoolContext {
|
|
80
|
+
opted_in: OptedIn
|
|
81
|
+
tracking: Tracking
|
|
82
|
+
repo: string
|
|
83
|
+
exclude: ReadonlyArray<number>
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// One token per line on standard output: the runnable issue numbers of **this** repository, in the
|
|
87
|
+
// order they may be started, or the single verdict word when there is nothing to offer here. Every
|
|
88
|
+
// explanation is on standard error, so `answers=$(pnpm josh backlog:next)` captures something a loop
|
|
89
|
+
// can branch on.
|
|
90
|
+
//
|
|
91
|
+
// **The tokens are scoped to this repository, which is `epic:next --repo`'s shape exactly.** An epic
|
|
92
|
+
// may track a child elsewhere, and a bare number would send the loop reading this to *this*
|
|
93
|
+
// repository's issue of that number — a different issue (joshuafolkken/kit#1016). Qualifying it
|
|
94
|
+
// instead was tried and is worse: `--exclude` parses bare integers, so a loop feeding a qualified
|
|
95
|
+
// token back would be answered with a usage error rather than an exclusion. So a child elsewhere
|
|
96
|
+
// stays out of the tokens, and `run` becomes `wait` when this repository has none — the same mapping
|
|
97
|
+
// `epic_next.repo_verdict` makes, and for the same reason: the work is real, it is simply not work
|
|
98
|
+
// this checkout can start. It is still on standard error, under its own repository and checkout.
|
|
99
|
+
function tokens_of(result: EpicNextResult, repo: string): ReadonlyArray<string> {
|
|
100
|
+
if (result.verdict !== 'run') return [VERDICT_TOKENS[result.verdict]]
|
|
101
|
+
const here = epic_report.candidates_for_repo(result, repo)
|
|
102
|
+
if (here.length === 0) return [VERDICT_TOKENS.wait]
|
|
103
|
+
|
|
104
|
+
return here.map((child) => String(child.number))
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// A listing that was cut short is reported rather than answered from silently: an opted-in issue
|
|
108
|
+
// past the cut is still runnable, and an epic past the cut leaves its children reading as untracked.
|
|
109
|
+
// An epic past the cut leaves its children reading as untracked, which is true of any answer this
|
|
110
|
+
// command reaches — including one that never read a graph at all.
|
|
111
|
+
function warn_epic_gap(context: PoolContext): void {
|
|
112
|
+
const epics = epic_bundle_gaps.epic_gap(context.tracking.cutoff, auto_ok_cli.LISTING_LIMIT)
|
|
113
|
+
|
|
114
|
+
if (epics !== undefined) console.error(epics)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function warn_gaps(context: PoolContext, has_answer: boolean): void {
|
|
118
|
+
const listing = auto_ok_cli.truncation_note(context.opted_in.cutoff, has_answer)
|
|
119
|
+
|
|
120
|
+
if (listing !== undefined) console.error(listing)
|
|
121
|
+
warn_epic_gap(context)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function report(result: EpicNextResult, context: PoolContext): number {
|
|
125
|
+
warn_gaps(context, result.verdict === 'run')
|
|
126
|
+
// The explanation names epics and children as `#N` (`tracked by epic #N`); linkified so the text a
|
|
127
|
+
// run reads carries clickable references rather than bare ones (joshuafolkken/kit#2329). The stdout
|
|
128
|
+
// tokens below are bare numbers by contract — a loop feeds them back to `--exclude` — so they are
|
|
129
|
+
// left untouched.
|
|
130
|
+
const explanation = epic_report.format_result(result, context.repo)
|
|
131
|
+
|
|
132
|
+
console.error(issue_citation.linkify(explanation, context.repo))
|
|
133
|
+
|
|
134
|
+
for (const token of tokens_of(result, context.repo)) console.info(token)
|
|
135
|
+
|
|
136
|
+
return SUCCESS_EXIT_CODE
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// The two halves as one result. The epic half is already classified by `epic:next`; the standalone
|
|
140
|
+
// half is classified here; the verdict is decided from the merge, so a backlog with a runnable epic
|
|
141
|
+
// child and nothing else says `run` exactly as one with a runnable standalone issue does.
|
|
142
|
+
function combine(views: ReadonlyArray<EpicView>, context: PoolContext): EpicNextResult {
|
|
143
|
+
const graphs = views.map((view) => view.snapshot.children)
|
|
144
|
+
const standalone = backlog_pool.standalone_rows(context.opted_in.issues)
|
|
145
|
+
const from_epics = backlog_pool.drop_excluded(
|
|
146
|
+
backlog_pool.epic_classification(views),
|
|
147
|
+
context.exclude,
|
|
148
|
+
context.repo,
|
|
149
|
+
)
|
|
150
|
+
const from_standalone = backlog_pool.classify_standalone(standalone, {
|
|
151
|
+
tracked: epic_index.withheld_children(context.tracking.index, context.opted_in.issues),
|
|
152
|
+
exclude: context.exclude,
|
|
153
|
+
repo: context.repo,
|
|
154
|
+
// The settled set the views were classified against, so a standalone row and an epic child weigh
|
|
155
|
+
// the same blocker the same way.
|
|
156
|
+
running:
|
|
157
|
+
views[0]?.running ?? backlog_pool.running_set(graphs, context.opted_in.issues, context.repo),
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
// The same checkout map `epic:next` hands `build_result`. Without it every bundle heading reads
|
|
161
|
+
// `(no local checkout)`, including this repository's own — the misreport joshuafolkken/kit#864
|
|
162
|
+
// fixed on that path.
|
|
163
|
+
return epic_report.build_result(
|
|
164
|
+
backlog_pool.merge_classifications(from_epics, from_standalone),
|
|
165
|
+
[
|
|
166
|
+
...views.flatMap((view) => view.result.anomalies),
|
|
167
|
+
...backlog_pool.cross_epic_cycles(graphs, backlog_pool.to_children(standalone, context.repo)),
|
|
168
|
+
],
|
|
169
|
+
repo_discovery.discover_repositories(PROJECT_ROOT),
|
|
170
|
+
)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// The epic half and the standalone half settled against each other: an epic child a person has to
|
|
174
|
+
// resolve can make a standalone row wait on that person, and that row can in turn hold an epic child.
|
|
175
|
+
// Each pass only shrinks the set, so the walk ends at the first pass that removes nothing
|
|
176
|
+
// (joshuafolkken/kit#1943).
|
|
177
|
+
function settled_views(
|
|
178
|
+
reads: ReadonlyArray<EpicRead>,
|
|
179
|
+
running: ReadonlySet<string>,
|
|
180
|
+
context: PoolContext,
|
|
181
|
+
): ReadonlyArray<EpicView> {
|
|
182
|
+
const views = epic_next.views_of(reads, running)
|
|
183
|
+
const settled = backlog_pool.settle_standalone(
|
|
184
|
+
views[0]?.running ?? running,
|
|
185
|
+
context.opted_in.issues,
|
|
186
|
+
context.repo,
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
return settled.size === running.size ? views : settled_views(reads, settled, context)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Nothing to classify means no epic was read, so `views_of`'s registry resets and its own checkout
|
|
193
|
+
// discovery are not needed. `combine` builds the map either way, so what this saves is the second
|
|
194
|
+
// walk rather than the only one.
|
|
195
|
+
//
|
|
196
|
+
// The running set covers the standalone rows as well as every read graph, so an epic child waiting on
|
|
197
|
+
// an opted-in standalone issue waits rather than stops (joshuafolkken/kit#1943).
|
|
198
|
+
function views_from(reads: ReadonlyArray<EpicRead>, context: PoolContext): ReadonlyArray<EpicView> {
|
|
199
|
+
if (reads.length === 0) return []
|
|
200
|
+
|
|
201
|
+
const graphs = reads.map((read) => read.snapshot.children)
|
|
202
|
+
|
|
203
|
+
return settled_views(
|
|
204
|
+
reads,
|
|
205
|
+
backlog_pool.running_set(graphs, context.opted_in.issues, context.repo),
|
|
206
|
+
context,
|
|
207
|
+
)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// The reads and the classification, with none of the printing `backlog:next` then does with them.
|
|
211
|
+
//
|
|
212
|
+
// `backlog:plan` renders this same pool as a plan a person reads before the run starts
|
|
213
|
+
// (joshuafolkken/kit#1652), so the seam is cut here rather than a second read-and-classify path
|
|
214
|
+
// being written beside it: the plan and the run cannot disagree about what may start, because there
|
|
215
|
+
// is one answer and two renderings of it. `undefined` is the refusal — already reported.
|
|
216
|
+
async function resolve(context: PoolContext): Promise<EpicNextResult | undefined> {
|
|
217
|
+
const references = backlog_pool
|
|
218
|
+
.opted_in_epics(context.opted_in.issues, context.tracking.index)
|
|
219
|
+
.map((number) => ({ number }))
|
|
220
|
+
const { reads, notices, refusal } = await epic_next_read.read_snapshots(references, context.repo)
|
|
221
|
+
|
|
222
|
+
for (const notice of notices) console.error(notice)
|
|
223
|
+
|
|
224
|
+
if (refusal !== undefined) {
|
|
225
|
+
console.error(refusal)
|
|
226
|
+
|
|
227
|
+
return undefined
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// The defect priority is applied here rather than when printing, so `backlog:plan` shows the order
|
|
231
|
+
// the run takes (joshuafolkken/kit#2455).
|
|
232
|
+
return await backlog_defect_priority.prioritize(
|
|
233
|
+
combine(views_from(reads, context), context),
|
|
234
|
+
context.repo,
|
|
235
|
+
)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Whether the `error` verdict is really a transport failure wearing the graph's clothes.
|
|
239
|
+
//
|
|
240
|
+
// **The answer comes from the reads that failed, not from a request made afterwards**
|
|
241
|
+
// (joshuafolkken/kit#1690). joshuafolkken/kit#1663 asked a reachability probe here, once the answer
|
|
242
|
+
// was otherwise final — and a connection that dropped for a few hundred milliseconds failed the read
|
|
243
|
+
// at t=0 and answered that probe `reachable`, leaving the verdict `error` for a fault that had
|
|
244
|
+
// already healed. Judging one request from a different one cannot be made reliable, so the failed
|
|
245
|
+
// request carries its own nature instead: `epic:next` marks the anomaly from the status GitHub wrote
|
|
246
|
+
// on the failed response, and this reads the mark.
|
|
247
|
+
function is_transport_failure(result: EpicNextResult): boolean {
|
|
248
|
+
if (result.verdict !== 'error') return false
|
|
249
|
+
|
|
250
|
+
return result.anomalies.some((anomaly) => anomaly.is_unreachable === true)
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// The unusable-graph report is withheld here rather than printed beside the retry: its anomaly lines
|
|
254
|
+
// name issues and credentials, which is exactly the wrong place to send the reader. **The epic gap is
|
|
255
|
+
// not withheld with it** — it says nothing about issues or credentials, and a run that spends its
|
|
256
|
+
// retries and then ends still has to have been told its epic listing was cut short.
|
|
257
|
+
//
|
|
258
|
+
// The opted-in listing's own truncation note is withheld, because both of its tails assert something
|
|
259
|
+
// this path did not do: one says an answer was produced, the other that every issue in the listing
|
|
260
|
+
// was excluded. Nothing was excluded here — the graph was never read.
|
|
261
|
+
function report_retry(context: PoolContext): number {
|
|
262
|
+
warn_epic_gap(context)
|
|
263
|
+
console.error(RETRY_MESSAGE)
|
|
264
|
+
console.info(VERDICT_TOKENS.retry)
|
|
265
|
+
|
|
266
|
+
return SUCCESS_EXIT_CODE
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
async function answer_pool(context: PoolContext): Promise<number> {
|
|
270
|
+
const result = await resolve(context)
|
|
271
|
+
|
|
272
|
+
if (result === undefined) return FAILURE_EXIT_CODE
|
|
273
|
+
if (is_transport_failure(result)) return report_retry(context)
|
|
274
|
+
|
|
275
|
+
return report(result, context)
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// A backlog nobody has opted into answers `none` before either listing below is asked for.
|
|
279
|
+
function report_none(): number {
|
|
280
|
+
console.error(auto_ok_cli.NONE_OPTED_IN_MESSAGE)
|
|
281
|
+
console.info(auto_ok_cli.NONE_TOKEN)
|
|
282
|
+
|
|
283
|
+
return SUCCESS_EXIT_CODE
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// The two reads that stand between the opted-in listing and the pool. Extracted for the same reason
|
|
287
|
+
// `resolve` is: `backlog:plan` needs the identical context, and a second copy of these two failure
|
|
288
|
+
// branches would be a second place for them to be worded differently. `undefined` is the failure —
|
|
289
|
+
// already reported.
|
|
290
|
+
async function context_of(
|
|
291
|
+
opted_in: OptedIn,
|
|
292
|
+
exclude: ReadonlyArray<number>,
|
|
293
|
+
): Promise<PoolContext | undefined> {
|
|
294
|
+
const tracking = await auto_ok_cli.fetch_tracking(opted_in.issues.length)
|
|
295
|
+
|
|
296
|
+
if (tracking.kind !== 'read') {
|
|
297
|
+
console.error(auto_ok_cli.EPICS_UNREADABLE_MESSAGE)
|
|
298
|
+
|
|
299
|
+
return undefined
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const repo = await git_gh_command.repo_get_name_with_owner()
|
|
303
|
+
|
|
304
|
+
if (repo === undefined) {
|
|
305
|
+
console.error(REPO_UNREADABLE_MESSAGE)
|
|
306
|
+
|
|
307
|
+
return undefined
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return { opted_in, tracking, repo, exclude }
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
async function answer(opted_in: OptedIn, exclude: ReadonlyArray<number>): Promise<number> {
|
|
314
|
+
if (opted_in.issues.length === 0) return report_none()
|
|
315
|
+
|
|
316
|
+
const context = await context_of(opted_in, exclude)
|
|
317
|
+
|
|
318
|
+
if (context === undefined) return FAILURE_EXIT_CODE
|
|
319
|
+
|
|
320
|
+
return await answer_pool(context)
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
324
|
+
const options = auto_ok_cli.parse_options(argv, USAGE)
|
|
325
|
+
|
|
326
|
+
if (options.usage !== undefined) {
|
|
327
|
+
console.error(options.usage)
|
|
328
|
+
|
|
329
|
+
return FAILURE_EXIT_CODE
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
const opted_in = await auto_ok_cli.fetch_opted_in()
|
|
333
|
+
|
|
334
|
+
if (opted_in.kind !== 'read') {
|
|
335
|
+
console.error(READ_FAILURES[opted_in.kind])
|
|
336
|
+
|
|
337
|
+
return FAILURE_EXIT_CODE
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return await answer(opted_in, options.exclude ?? [])
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// `process.exitCode` rather than `process.exit()`, for the reason `auto-ok:next` records: the whole
|
|
344
|
+
// contract is `answers=$(pnpm josh backlog:next)`, and exiting outright can cut the pipe before it
|
|
345
|
+
// has drained.
|
|
346
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
347
|
+
process.exitCode = await run(argv)
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
const backlog_next = {
|
|
351
|
+
USAGE,
|
|
352
|
+
REPO_UNREADABLE_MESSAGE,
|
|
353
|
+
RETRY_MESSAGE,
|
|
354
|
+
READ_FAILURES,
|
|
355
|
+
VERDICT_TOKENS,
|
|
356
|
+
tokens_of,
|
|
357
|
+
warn_epic_gap,
|
|
358
|
+
warn_gaps,
|
|
359
|
+
report,
|
|
360
|
+
combine,
|
|
361
|
+
views_from,
|
|
362
|
+
resolve,
|
|
363
|
+
is_transport_failure,
|
|
364
|
+
report_retry,
|
|
365
|
+
context_of,
|
|
366
|
+
answer_pool,
|
|
367
|
+
report_none,
|
|
368
|
+
answer,
|
|
369
|
+
run,
|
|
370
|
+
main,
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
374
|
+
|
|
375
|
+
export { backlog_next }
|
|
376
|
+
export type { BacklogVerdict, OptedIn, PoolContext }
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { parseArgs } from 'node:util'
|
|
4
|
+
import { josh_command } from '#scripts/josh/josh-run'
|
|
5
|
+
import { rule_value_cli } from '#scripts/rules/rule-value-cli'
|
|
6
|
+
import { run_event_stream } from '#scripts/run/run-event-stream'
|
|
7
|
+
import { run_event_stream_emit } from '#scripts/run/run-event-stream-emit'
|
|
8
|
+
import { z } from 'zod'
|
|
9
|
+
import { backlog_offer, type OfferAnswer } from './backlog-offer'
|
|
10
|
+
|
|
11
|
+
// `josh backlog:offer` — one composite command for a `backlogrun` loop-head event
|
|
12
|
+
// (joshuafolkken/kit#2162). The loop used to spend a turn on `backlog:next` and a second turn feeding
|
|
13
|
+
// its answer, translated to a word by hand, into `backlog:budget`; the parent's context is largest
|
|
14
|
+
// here, so collapsing the two saves the turn where a turn costs the most — the same reasoning
|
|
15
|
+
// `run:merge` collapsed a merge event on.
|
|
16
|
+
//
|
|
17
|
+
// **The contract matches the path-decided commands': stdout carries the budget verdict on its first
|
|
18
|
+
// line**, then — only on `run` — the issue numbers to start, one per line, so a loop reads the branch
|
|
19
|
+
// off stdout. The consecutive-retry count for the next ask is on the last stderr line (`retries: <n>`)
|
|
20
|
+
// and in the `--json` object; every explanation `backlog:next` and `backlog:budget` print is streamed
|
|
21
|
+
// straight through to stderr.
|
|
22
|
+
|
|
23
|
+
const ARGV_OFFSET = 2
|
|
24
|
+
const SUCCESS_EXIT_CODE = 0
|
|
25
|
+
const FAILURE_EXIT_CODE = 1
|
|
26
|
+
const JSON_KEY = 'offer'
|
|
27
|
+
const DEFAULT_COUNT = 0
|
|
28
|
+
const RUN_VERDICT = 'run'
|
|
29
|
+
const BUDGET_JSON_KEY = 'budget'
|
|
30
|
+
// The one budget verdict and mapped answer that name a drain, plus the running count that means the run
|
|
31
|
+
// has nothing of its own in flight (joshuafolkken/kit#2335). Read together in `mark_drain`.
|
|
32
|
+
const WATCH_VERDICT = 'watch'
|
|
33
|
+
const STOP_VERDICT = 'stop'
|
|
34
|
+
const EXHAUSTED_ANSWER = 'exhausted'
|
|
35
|
+
const NO_RUNNING = 0
|
|
36
|
+
const DRAIN_TEXT = 'backlog drained'
|
|
37
|
+
const should_forward_stderr = true
|
|
38
|
+
const COUNT_PATTERN = /^\d+$/u
|
|
39
|
+
|
|
40
|
+
const USAGE =
|
|
41
|
+
'Usage: josh backlog:offer --started <ISO-8601> [--active <ISO-8601>] [--merged <n>] [--running <n>] [--max <n>] [--idle <minutes>] [--retries <n>] [--exclude <n>[,<n>...]]... [--repo <owner/repo>] [--json]'
|
|
42
|
+
|
|
43
|
+
const OPTIONS = {
|
|
44
|
+
active: { type: 'string' },
|
|
45
|
+
exclude: { type: 'string', multiple: true },
|
|
46
|
+
idle: { type: 'string' },
|
|
47
|
+
json: { type: 'boolean' },
|
|
48
|
+
max: { type: 'string' },
|
|
49
|
+
merged: { type: 'string' },
|
|
50
|
+
repo: { type: 'string' },
|
|
51
|
+
retries: { type: 'string' },
|
|
52
|
+
running: { type: 'string' },
|
|
53
|
+
started: { type: 'string' },
|
|
54
|
+
} as const
|
|
55
|
+
|
|
56
|
+
type OptionName = keyof typeof OPTIONS
|
|
57
|
+
type ParsedValues = Partial<Record<OptionName, string | boolean | ReadonlyArray<string>>>
|
|
58
|
+
|
|
59
|
+
// The flags carried straight to `backlog:budget`; `--answer` is not among them because this command
|
|
60
|
+
// computes it. `backlog:budget` validates each one, so a malformed value is refused there.
|
|
61
|
+
const FORWARDED = ['started', 'active', 'merged', 'running', 'max', 'idle'] as const
|
|
62
|
+
|
|
63
|
+
function read_values(argv: ReadonlyArray<string>): ParsedValues | undefined {
|
|
64
|
+
try {
|
|
65
|
+
return parseArgs({ args: [...argv], options: OPTIONS, strict: true }).values
|
|
66
|
+
} catch {
|
|
67
|
+
return undefined
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function text_of(value: string | boolean | ReadonlyArray<string> | undefined): string | undefined {
|
|
72
|
+
return typeof value === 'string' ? value : undefined
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function to_count(raw: string | undefined): number | undefined {
|
|
76
|
+
if (raw === undefined || !COUNT_PATTERN.test(raw)) return undefined
|
|
77
|
+
|
|
78
|
+
const parsed = Number(raw)
|
|
79
|
+
|
|
80
|
+
return Number.isSafeInteger(parsed) ? parsed : undefined
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// A count flag that was given but unreadable makes the invocation unreadable rather than defaulted —
|
|
84
|
+
// the contract `backlog:budget` follows for its own counts.
|
|
85
|
+
function count_of(raw: string | undefined, fallback: number): number | undefined {
|
|
86
|
+
return raw === undefined ? fallback : to_count(raw)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
interface OfferCounts {
|
|
90
|
+
running: number
|
|
91
|
+
retries: number
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// The two counts the mapping needs: `--running` decides `wait`, `--retries` decides `retry`. Either
|
|
95
|
+
// given but unreadable refuses the whole invocation.
|
|
96
|
+
function counts_of(values: ParsedValues): OfferCounts | undefined {
|
|
97
|
+
const running = count_of(text_of(values.running), DEFAULT_COUNT)
|
|
98
|
+
const retries = count_of(text_of(values.retries), DEFAULT_COUNT)
|
|
99
|
+
|
|
100
|
+
if (running === undefined || retries === undefined) return undefined
|
|
101
|
+
|
|
102
|
+
return { running, retries }
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function excludes_of(values: ParsedValues): ReadonlyArray<string> {
|
|
106
|
+
const raw = values.exclude
|
|
107
|
+
|
|
108
|
+
return Array.isArray(raw) ? raw.filter((value): value is string => typeof value === 'string') : []
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function next_argv(values: ParsedValues): ReadonlyArray<string> {
|
|
112
|
+
const repo = text_of(values.repo)
|
|
113
|
+
|
|
114
|
+
return [
|
|
115
|
+
'backlog:next',
|
|
116
|
+
...excludes_of(values).flatMap((value) => ['--exclude', value]),
|
|
117
|
+
...(repo === undefined ? [] : ['--repo', repo]),
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function budget_argv(values: ParsedValues, answer: string): ReadonlyArray<string> {
|
|
122
|
+
const forwarded = FORWARDED.flatMap((name) => {
|
|
123
|
+
const value = text_of(values[name])
|
|
124
|
+
|
|
125
|
+
return value === undefined ? [] : [`--${name}`, value]
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
return ['backlog:budget', '--json', '--answer', answer, ...forwarded]
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const budget_read_schema = z.object({
|
|
132
|
+
[BUDGET_JSON_KEY]: z.string(),
|
|
133
|
+
reason: z.string(),
|
|
134
|
+
is_finish: z.boolean(),
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
interface BudgetRead {
|
|
138
|
+
verdict: string
|
|
139
|
+
reason: string
|
|
140
|
+
is_finish: boolean
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function budget_of(out: string): BudgetRead | undefined {
|
|
144
|
+
try {
|
|
145
|
+
const parsed = budget_read_schema.safeParse(JSON.parse(out))
|
|
146
|
+
|
|
147
|
+
return parsed.success
|
|
148
|
+
? {
|
|
149
|
+
verdict: parsed.data[BUDGET_JSON_KEY],
|
|
150
|
+
reason: parsed.data.reason,
|
|
151
|
+
is_finish: parsed.data.is_finish,
|
|
152
|
+
}
|
|
153
|
+
: undefined
|
|
154
|
+
} catch {
|
|
155
|
+
return undefined
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function to_tokens(out: string): ReadonlyArray<string> {
|
|
160
|
+
return out === '' ? [] : out.split('\n')
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// On `run` the issues to start are the candidates the mapping captured; every other verdict starts
|
|
164
|
+
// nothing.
|
|
165
|
+
function issues_for(verdict: string, offer: OfferAnswer): ReadonlyArray<string> {
|
|
166
|
+
return verdict === RUN_VERDICT ? offer.issues : []
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function emit(decision: BudgetRead, offer: OfferAnswer, is_json: boolean): number {
|
|
170
|
+
const { verdict, reason, is_finish } = decision
|
|
171
|
+
const issues = issues_for(verdict, offer)
|
|
172
|
+
|
|
173
|
+
if (is_json) {
|
|
174
|
+
const payload = {
|
|
175
|
+
verdict,
|
|
176
|
+
issues,
|
|
177
|
+
answer: offer.answer,
|
|
178
|
+
retries: offer.retries,
|
|
179
|
+
reason,
|
|
180
|
+
is_finish,
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
console.info(JSON.stringify({ [JSON_KEY]: payload }))
|
|
184
|
+
|
|
185
|
+
return SUCCESS_EXIT_CODE
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
console.info(verdict)
|
|
189
|
+
for (const issue of issues) console.info(issue)
|
|
190
|
+
console.error(`retries: ${String(offer.retries)}`)
|
|
191
|
+
|
|
192
|
+
return SUCCESS_EXIT_CODE
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function refuse(): number {
|
|
196
|
+
console.error(USAGE)
|
|
197
|
+
|
|
198
|
+
return FAILURE_EXIT_CODE
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// The drain: the backlog is empty (`exhausted`) and nothing of the run's own is in flight, so the run is
|
|
202
|
+
// about to open its idle watch or stop with `--idle 0`. Marking once per drain with `emit_once`
|
|
203
|
+
// is what lets `run:step` fire the end-of-run retrospective *before* the watch rather than after it
|
|
204
|
+
// (joshuafolkken/kit#2335), so the improvement issues the retrospective files are what the watch then
|
|
205
|
+
// picks up. A watch that opened while children were still merging (`running > 0`) is not this drain: the
|
|
206
|
+
// retrospective waits for the true idle, and the marker is emitted from the loop head for the same
|
|
207
|
+
// reason `run:merge` emits its own events — the command that detects the event owns writing it.
|
|
208
|
+
// Returns whether this call wrote the marker, so `backlog:drive` stops once per drain
|
|
209
|
+
// (joshuafolkken/kit#2508).
|
|
210
|
+
async function mark_drain(verdict: string, answer: string, running: number): Promise<boolean> {
|
|
211
|
+
if (answer !== EXHAUSTED_ANSWER || running !== NO_RUNNING) return false
|
|
212
|
+
if (verdict !== WATCH_VERDICT && verdict !== STOP_VERDICT) return false
|
|
213
|
+
|
|
214
|
+
return await run_event_stream_emit.emit_once(run_event_stream.EVENT_KIND.DRAIN, DRAIN_TEXT)
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
async function decide(values: ParsedValues, counts: OfferCounts): Promise<number> {
|
|
218
|
+
const next = await josh_command.josh_run(next_argv(values), should_forward_stderr)
|
|
219
|
+
const offer = backlog_offer.answer_of(
|
|
220
|
+
{ code: next.code, tokens: to_tokens(next.out) },
|
|
221
|
+
counts.running,
|
|
222
|
+
counts.retries,
|
|
223
|
+
)
|
|
224
|
+
const budget = await josh_command.josh_run(
|
|
225
|
+
budget_argv(values, offer.answer),
|
|
226
|
+
should_forward_stderr,
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
if (budget.code !== SUCCESS_EXIT_CODE) return FAILURE_EXIT_CODE
|
|
230
|
+
|
|
231
|
+
const decision = budget_of(budget.out)
|
|
232
|
+
|
|
233
|
+
if (decision === undefined) return FAILURE_EXIT_CODE
|
|
234
|
+
|
|
235
|
+
await mark_drain(decision.verdict, offer.answer, counts.running)
|
|
236
|
+
|
|
237
|
+
return emit(decision, offer, values.json === true)
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
241
|
+
const values = read_values(argv)
|
|
242
|
+
|
|
243
|
+
if (values === undefined) return refuse()
|
|
244
|
+
|
|
245
|
+
// The loop head is the one place `rule:value` is called from: once per iteration, the parent's
|
|
246
|
+
// context still small, so a rule that never fires shows up as a printed row rather than as
|
|
247
|
+
// something a person has to remember to measure (joshuafolkken/kit#2271). It reports to stderr and
|
|
248
|
+
// never fails, so a broken reading never stops the backlog.
|
|
249
|
+
rule_value_cli.emit()
|
|
250
|
+
|
|
251
|
+
const counts = counts_of(values)
|
|
252
|
+
|
|
253
|
+
if (counts === undefined) return refuse()
|
|
254
|
+
|
|
255
|
+
return await decide(values, counts)
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
259
|
+
process.exitCode = await run(argv)
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
const backlog_offer_cli = {
|
|
263
|
+
JSON_KEY,
|
|
264
|
+
USAGE,
|
|
265
|
+
budget_argv,
|
|
266
|
+
counts_of,
|
|
267
|
+
emit,
|
|
268
|
+
main,
|
|
269
|
+
mark_drain,
|
|
270
|
+
next_argv,
|
|
271
|
+
read_values,
|
|
272
|
+
run,
|
|
273
|
+
to_tokens,
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
277
|
+
|
|
278
|
+
export { backlog_offer_cli }
|
|
279
|
+
export type { ParsedValues }
|