@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,93 @@
|
|
|
1
|
+
import type { BacklogAnswer } from './backlog-budget'
|
|
2
|
+
import { backlog_next } from './backlog-next'
|
|
3
|
+
|
|
4
|
+
// The mechanical half of `josh backlog:offer` (joshuafolkken/kit#2162): turn what `backlog:next`
|
|
5
|
+
// answered — its stdout tokens and its exit code — into the one word `backlog:budget` is then asked
|
|
6
|
+
// with, plus the issue numbers to start and the consecutive-retry count carried to the next ask.
|
|
7
|
+
//
|
|
8
|
+
// **The mapping is `backlogrun-steps.md` → "The loop"'s table, held here so it cannot drift.** That table
|
|
9
|
+
// fixed which `backlog:next` answer becomes which `backlog:budget` word, and it carried two context
|
|
10
|
+
// branches an agent had to apply by hand every iteration: `wait` is `blocked` while this run has
|
|
11
|
+
// children in flight and `exhausted` when it has none, and `retry` is `blocked` until the third
|
|
12
|
+
// consecutive one, which is `unreadable`. Both are decided from a count here rather than from a
|
|
13
|
+
// judgement.
|
|
14
|
+
|
|
15
|
+
// Three consecutive `retry` answers end the run: below that a transport hiccup is re-asked, at it the
|
|
16
|
+
// outage is not a hiccup. `backlogrun-steps.md` → "The loop" is the single source of the count.
|
|
17
|
+
const RETRY_LIMIT = 3
|
|
18
|
+
const FAILURE_EXIT_CODE = 1
|
|
19
|
+
const NO_RETRIES = 0
|
|
20
|
+
const NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
21
|
+
|
|
22
|
+
const TOKENS = backlog_next.VERDICT_TOKENS
|
|
23
|
+
|
|
24
|
+
// `backlog:next`'s captured result: the exit code, and the trimmed stdout as one token per line.
|
|
25
|
+
interface NextRead {
|
|
26
|
+
code: number
|
|
27
|
+
tokens: ReadonlyArray<string>
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
interface OfferAnswer {
|
|
31
|
+
answer: BacklogAnswer
|
|
32
|
+
issues: ReadonlyArray<string>
|
|
33
|
+
// The consecutive-retry count after this ask — reset to zero by any answer that is not `retry`.
|
|
34
|
+
retries: number
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// The verdict words that map to one answer regardless of context. `wait` and `retry` are the two that
|
|
38
|
+
// do not, and they are handled by their own functions below.
|
|
39
|
+
const VERDICT_ANSWERS: Readonly<Record<string, BacklogAnswer>> = {
|
|
40
|
+
[TOKENS.complete]: 'exhausted',
|
|
41
|
+
[TOKENS.error]: 'unreadable',
|
|
42
|
+
[TOKENS.stop]: 'parked',
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// `wait` is `blocked` while this run has children in flight and `exhausted` when it does not — the
|
|
46
|
+
// mapping `backlog:budget` states, decided from the running count alone.
|
|
47
|
+
function wait_answer(running: number): BacklogAnswer {
|
|
48
|
+
return running > 0 ? 'blocked' : 'exhausted'
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// An unrecognized token is read as `unreadable` rather than guessed at: an answer the loop cannot
|
|
52
|
+
// place must end the run, not silently start work.
|
|
53
|
+
function verdict_answer(token: string, running: number): BacklogAnswer {
|
|
54
|
+
if (token === TOKENS.wait) return wait_answer(running)
|
|
55
|
+
|
|
56
|
+
return VERDICT_ANSWERS[token] ?? 'unreadable'
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// A single verdict token, with the retry count advanced. `retry` is the only token that carries the
|
|
60
|
+
// count forward; every other resets it, because the count is of *consecutive* retries.
|
|
61
|
+
function from_verdict(token: string, running: number, retries: number): OfferAnswer {
|
|
62
|
+
if (token === TOKENS.retry) {
|
|
63
|
+
const next = retries + 1
|
|
64
|
+
|
|
65
|
+
return { answer: next >= RETRY_LIMIT ? 'unreadable' : 'blocked', issues: [], retries: next }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return { answer: verdict_answer(token, running), issues: [], retries: NO_RETRIES }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function is_numbers(tokens: ReadonlyArray<string>): boolean {
|
|
72
|
+
return tokens.length > 0 && tokens.every((token) => NUMBER_PATTERN.test(token))
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// **Read the exit code before the tokens.** Exit 1 is "the listing could not be read", which is never
|
|
76
|
+
// an empty backlog — reading it as `none` would report an emptiness that was never seen, so it maps to
|
|
77
|
+
// `unreadable`, and a stray stdout line on that path cannot be mistaken for an issue number.
|
|
78
|
+
function answer_of(read: NextRead, running: number, retries: number): OfferAnswer {
|
|
79
|
+
if (read.code === FAILURE_EXIT_CODE) {
|
|
80
|
+
return { answer: 'unreadable', issues: [], retries: NO_RETRIES }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (is_numbers(read.tokens)) {
|
|
84
|
+
return { answer: 'candidates', issues: read.tokens, retries: NO_RETRIES }
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return from_verdict(read.tokens[0] ?? '', running, retries)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const backlog_offer = { RETRY_LIMIT, answer_of, verdict_answer, wait_answer }
|
|
91
|
+
|
|
92
|
+
export type { NextRead, OfferAnswer }
|
|
93
|
+
export { backlog_offer }
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { auto_ok_cli } from '#scripts/auto-ok/auto-ok-cli'
|
|
4
|
+
import { epic_index } from '#scripts/epic/epic-index'
|
|
5
|
+
import type { EpicNextResult } from '#scripts/epic/epic-report'
|
|
6
|
+
import { git_gh_command } from '#scripts/git/git-gh-command'
|
|
7
|
+
import { read_json_listing } from '#scripts/git/parse-json-array'
|
|
8
|
+
import { open_issue_schema, type OpenIssueData } from '#scripts/git/schemas'
|
|
9
|
+
import { run_invocation } from '#scripts/run/run-invocation'
|
|
10
|
+
import { backlog_named } from './backlog-named'
|
|
11
|
+
import { backlog_next, type OptedIn } from './backlog-next'
|
|
12
|
+
import { backlog_plan, type NamedPlan } from './backlog-plan'
|
|
13
|
+
import { backlog_scope } from './backlog-scope'
|
|
14
|
+
|
|
15
|
+
// `josh backlog:plan` — the whole backlog as a plan a person reads before a run starts
|
|
16
|
+
// (joshuafolkken/kit#1652).
|
|
17
|
+
//
|
|
18
|
+
// `backlog:next` already answers what may start, and a `backlogrun` acted on that answer one ask at a
|
|
19
|
+
// time, so nothing ever showed the shape of the run: the order, which issue waits on which, what is
|
|
20
|
+
// waiting on a person, and what the backlog will not run at all. That last one was invisible by
|
|
21
|
+
// construction — an issue without `auto-ok` never enters the pool, so silence covered both "not opted
|
|
22
|
+
// in" and "not reached yet".
|
|
23
|
+
//
|
|
24
|
+
// It is a second command rather than a flag on `backlog:next`, because that command's standard output
|
|
25
|
+
// is a contract a loop branches on — one bare token per line — and a plan printed there would break
|
|
26
|
+
// every consumer of it. What it is *not* is a second implementation: the classification comes from
|
|
27
|
+
// `backlog_next.resolve`, so the plan cannot promise an order the run does not take.
|
|
28
|
+
|
|
29
|
+
const ARGV_OFFSET = 2
|
|
30
|
+
const SUCCESS_EXIT_CODE = 0
|
|
31
|
+
const FAILURE_EXIT_CODE = 1
|
|
32
|
+
|
|
33
|
+
// The keyword `run_invocation` parses a named-issue prefix behind, reused rather than parsing `#N`
|
|
34
|
+
// again here so the `0` / leading-zero / safe-integer rules stay single-sourced (joshuafolkken/kit#1984).
|
|
35
|
+
const NAMED_COMMAND = 'backlogrun'
|
|
36
|
+
// The flag that runs the named list and stops, mirrored here so the plan the person reads before the
|
|
37
|
+
// run shows the same scope the run will take (joshuafolkken/kit#1984).
|
|
38
|
+
const ONLY_FLAG = '--only'
|
|
39
|
+
|
|
40
|
+
const USAGE =
|
|
41
|
+
'Usage: josh backlog:plan [#<issue-number>...] [--only] [--exclude <issue-number>[,<issue-number>...]]...'
|
|
42
|
+
|
|
43
|
+
// The leading `#N` tokens are the named prefix a `backlogrun #N1 #N2 …` runs before the pool. They are
|
|
44
|
+
// read through the invocation grammar so the plan and the run agree on what counts as a named issue.
|
|
45
|
+
function named_of(argv: ReadonlyArray<string>): ReadonlyArray<number> {
|
|
46
|
+
return run_invocation.issue_numbers(`${NAMED_COMMAND} ${argv.join(' ')}`) ?? []
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// The tokens after the named prefix — what the option parser sees, so a `#N` is never read as an
|
|
50
|
+
// unknown positional.
|
|
51
|
+
function without_named(argv: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
52
|
+
return argv.slice(named_of(argv).length)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function has_only_flag(argv: ReadonlyArray<string>): boolean {
|
|
56
|
+
return argv.includes(ONLY_FLAG)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// `--only` is stripped before the named block and the options are read, so it is never taken for a
|
|
60
|
+
// positional or an unknown option; whether it was present is carried as a boolean instead.
|
|
61
|
+
function without_only(argv: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
62
|
+
return argv.filter((token) => token !== ONLY_FLAG)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// The one start-time refusal: `--only` with no named issues has nothing to run. `backlog_named` is the
|
|
66
|
+
// single source of that decision, so the plan and the run refuse it alike. The refusal turns only on
|
|
67
|
+
// whether anything was named, so the items are built with `is_epic: false` — which item is an epic is
|
|
68
|
+
// decided by the run at dispatch time, not here (joshuafolkken/kit#1985).
|
|
69
|
+
function only_refusal(named: ReadonlyArray<number>, is_only: boolean): string | undefined {
|
|
70
|
+
const items = named.map((issue) => ({ issue, is_epic: false }))
|
|
71
|
+
const startup = backlog_named.startup(items, is_only)
|
|
72
|
+
|
|
73
|
+
return startup.kind === 'refused' ? startup.reason : undefined
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// A failed open listing is not "nothing is out of scope". Reported rather than rendered around, for
|
|
77
|
+
// the reason joshuafolkken/kit#950 records: a confident absence built on a read that failed is worse
|
|
78
|
+
// than no answer.
|
|
79
|
+
const OPEN_UNREADABLE_MESSAGE =
|
|
80
|
+
"Could not read this repository's open issues, so the out-of-scope half of the plan cannot be told from an empty one. Check `gh auth status` and ask again."
|
|
81
|
+
|
|
82
|
+
// A cut listing is a cut *set difference*, which is not the ignorable prefix a display's cap is: an
|
|
83
|
+
// open issue past the cut is missing from the out-of-scope section and its title is missing from
|
|
84
|
+
// every other one. Reported as a gap, the way `backlog:next` reports its own truncated listings.
|
|
85
|
+
const OPEN_TRUNCATED_MESSAGE = `⚠ The open-issue listing stopped at ${String(auto_ok_cli.LISTING_LIMIT)} rows, so the out-of-scope section is partial, some titles are missing, and a blocker that has since closed can still be named. The plan below is incomplete.`
|
|
86
|
+
|
|
87
|
+
interface Plan {
|
|
88
|
+
result: EpicNextResult
|
|
89
|
+
repo: string
|
|
90
|
+
exclude: ReadonlyArray<number>
|
|
91
|
+
// Which **opted-in** epic is withholding which issue, narrowed by the same function the pool
|
|
92
|
+
// decided membership with (joshuafolkken/kit#1668). Without it the scope layer had no branch for
|
|
93
|
+
// "an epic is offering this one instead", so every opted-in row it could not place was reported as
|
|
94
|
+
// past the listing cap. Carrying the *whole* index here instead would move that misreport rather
|
|
95
|
+
// than remove it: the sentence would name an epic that is withholding nothing.
|
|
96
|
+
tracked: ReadonlyMap<number, number>
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// The listing plus whether it was cut. Carried together because the rows alone cannot say whether
|
|
100
|
+
// what is missing from them is absent or merely past the cap.
|
|
101
|
+
interface OpenListing {
|
|
102
|
+
rows: ReadonlyArray<OpenIssueData>
|
|
103
|
+
is_capped: boolean
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// The same reads and the same classification `backlog:next` makes, through the same two functions.
|
|
107
|
+
// `undefined` is a failure it has already reported.
|
|
108
|
+
async function classify(
|
|
109
|
+
opted_in: OptedIn,
|
|
110
|
+
exclude: ReadonlyArray<number>,
|
|
111
|
+
): Promise<Plan | undefined> {
|
|
112
|
+
const context = await backlog_next.context_of(opted_in, exclude)
|
|
113
|
+
|
|
114
|
+
if (context === undefined) return undefined
|
|
115
|
+
|
|
116
|
+
const result = await backlog_next.resolve(context)
|
|
117
|
+
|
|
118
|
+
if (result === undefined) return undefined
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
result,
|
|
122
|
+
repo: context.repo,
|
|
123
|
+
exclude,
|
|
124
|
+
tracked: epic_index.withheld_children(context.tracking.index, context.opted_in.issues),
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Every open issue, read once. It carries both halves the plan needs and the pool does not hold: the
|
|
129
|
+
// titles, and the set the out-of-scope rows are subtracted from. One read serves both, so the plan
|
|
130
|
+
// costs exactly one `gh` call more than the answer it is rendering.
|
|
131
|
+
async function fetch_open(): Promise<OpenListing | undefined> {
|
|
132
|
+
const { json, is_capped } = await git_gh_command.issue_list_recent(auto_ok_cli.LISTING_LIMIT)
|
|
133
|
+
|
|
134
|
+
if (json === undefined) return undefined
|
|
135
|
+
|
|
136
|
+
const read = read_json_listing(json, open_issue_schema)
|
|
137
|
+
|
|
138
|
+
return read.kind === 'read' ? { rows: read.rows, is_capped } : undefined
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function print_plan(
|
|
142
|
+
plan: Plan,
|
|
143
|
+
open_issues: ReadonlyArray<OpenIssueData>,
|
|
144
|
+
is_capped: boolean,
|
|
145
|
+
named: NamedPlan,
|
|
146
|
+
): void {
|
|
147
|
+
const scope = { repo: plan.repo, exclude: plan.exclude, tracked: plan.tracked }
|
|
148
|
+
const rows = backlog_scope.out_of_scope(open_issues, plan.result, scope)
|
|
149
|
+
// A cut listing cannot say an issue is closed, only that it was not read — so the blocker filter is
|
|
150
|
+
// switched off rather than fed a set that would silently report standing blockers as gone.
|
|
151
|
+
const context = {
|
|
152
|
+
repo: plan.repo,
|
|
153
|
+
titles: backlog_scope.titles_of(open_issues),
|
|
154
|
+
open_numbers: is_capped ? undefined : backlog_scope.open_numbers_of(open_issues),
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
console.info(backlog_plan.format_plan(plan.result, rows, context, named))
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
async function report(plan: Plan, named: NamedPlan): Promise<number> {
|
|
161
|
+
const listing = await fetch_open()
|
|
162
|
+
|
|
163
|
+
if (listing === undefined) {
|
|
164
|
+
console.error(OPEN_UNREADABLE_MESSAGE)
|
|
165
|
+
|
|
166
|
+
return FAILURE_EXIT_CODE
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (listing.is_capped) console.error(OPEN_TRUNCATED_MESSAGE)
|
|
170
|
+
print_plan(plan, listing.rows, listing.is_capped, named)
|
|
171
|
+
|
|
172
|
+
return SUCCESS_EXIT_CODE
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
async function run_plan(rest: ReadonlyArray<string>, named: NamedPlan): Promise<number> {
|
|
176
|
+
const options = auto_ok_cli.parse_options(without_named(rest), USAGE)
|
|
177
|
+
|
|
178
|
+
if (options.usage !== undefined) {
|
|
179
|
+
console.error(options.usage)
|
|
180
|
+
|
|
181
|
+
return FAILURE_EXIT_CODE
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const opted_in = await auto_ok_cli.fetch_opted_in()
|
|
185
|
+
|
|
186
|
+
if (opted_in.kind !== 'read') {
|
|
187
|
+
console.error(backlog_next.READ_FAILURES[opted_in.kind])
|
|
188
|
+
|
|
189
|
+
return FAILURE_EXIT_CODE
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const plan = await classify(opted_in, options.exclude ?? [])
|
|
193
|
+
|
|
194
|
+
return plan === undefined ? FAILURE_EXIT_CODE : await report(plan, named)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
198
|
+
const is_only = has_only_flag(argv)
|
|
199
|
+
const rest = without_only(argv)
|
|
200
|
+
// Read the named block from the *original* argv, so `--only` placed before the `#N` block breaks the
|
|
201
|
+
// leading block exactly as the run grammar does — the plan then refuses an ordering the run refuses,
|
|
202
|
+
// rather than promising a scope the resumed invocation would stop on (joshuafolkken/kit#1984).
|
|
203
|
+
const named = named_of(argv)
|
|
204
|
+
const refusal = only_refusal(named, is_only)
|
|
205
|
+
|
|
206
|
+
if (refusal !== undefined) {
|
|
207
|
+
console.error(refusal)
|
|
208
|
+
|
|
209
|
+
return FAILURE_EXIT_CODE
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return await run_plan(rest, { issues: named, only: is_only })
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// `process.exitCode` rather than `process.exit()`, the reason `backlog:next` records: the plan is
|
|
216
|
+
// several kilobytes on standard output, and exiting outright can cut the pipe before it has drained.
|
|
217
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
218
|
+
process.exitCode = await run(argv)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const backlog_plan_cli = {
|
|
222
|
+
OPEN_TRUNCATED_MESSAGE,
|
|
223
|
+
OPEN_UNREADABLE_MESSAGE,
|
|
224
|
+
USAGE,
|
|
225
|
+
classify,
|
|
226
|
+
fetch_open,
|
|
227
|
+
main,
|
|
228
|
+
print_plan,
|
|
229
|
+
report,
|
|
230
|
+
run,
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
234
|
+
|
|
235
|
+
export { backlog_plan_cli }
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import type { EpicChild } from '#scripts/epic/epic-graph'
|
|
2
|
+
import { epic_report, type EpicNextResult } from '#scripts/epic/epic-report'
|
|
3
|
+
import type { IssueReference } from '#scripts/git/git-epic-reference'
|
|
4
|
+
import { has_label_name, IN_PROGRESS_LABEL } from '#scripts/git/issue-labels'
|
|
5
|
+
import type { OutOfScopeRow } from './backlog-scope'
|
|
6
|
+
|
|
7
|
+
// The plan a person reads before a `backlogrun` starts (joshuafolkken/kit#1652).
|
|
8
|
+
//
|
|
9
|
+
// `backlog:next` answers the **next** question — which numbers may start now — and its report is
|
|
10
|
+
// shaped for the loop that consumes it. This renders the **whole** picture from the same classified
|
|
11
|
+
// pool: what may start in parallel, what is waiting and on which issue, what is waiting on a person,
|
|
12
|
+
// and what the backlog will not run at all. Rendering only: the classification is
|
|
13
|
+
// `backlog-next.ts`'s, so a plan can never promise an order the run does not take.
|
|
14
|
+
|
|
15
|
+
// Two spaces deeper than `epic_report`'s repository headings, so a child reads as sitting under one.
|
|
16
|
+
const ROW_INDENT_WIDTH = 4
|
|
17
|
+
const ROW_INDENT = ' '.repeat(ROW_INDENT_WIDTH)
|
|
18
|
+
const NOTHING = `${ROW_INDENT}(none)`
|
|
19
|
+
|
|
20
|
+
// The named-issue prefix of a `backlogrun #N1 #N2 …` (joshuafolkken/kit#1984): these run one at a
|
|
21
|
+
// time, in the order they were typed, before anything in the pool below is picked up.
|
|
22
|
+
const NAMED_HEADING = 'Named issues — run in order first, one at a time, then the backlog:'
|
|
23
|
+
// `--only` runs the named list and stops, so its heading says the pool is not drained
|
|
24
|
+
// (joshuafolkken/kit#1984). The plan then shows the named section alone.
|
|
25
|
+
const ONLY_NAMED_HEADING =
|
|
26
|
+
'Named issues — run in order, one at a time, then stop (`--only`; the opted-in backlog is not run):'
|
|
27
|
+
const READY_HEADING =
|
|
28
|
+
'Ready now — each takes a free lane in its repository, so these may run in parallel:'
|
|
29
|
+
const WAITING_HEADING = 'Waiting — each names what it is waiting on:'
|
|
30
|
+
const HUMAN_HEADING =
|
|
31
|
+
'Waiting on a person (`needs-decision`) — resolve these before the run starts:'
|
|
32
|
+
const SCOPE_HEADING = 'Out of scope — open, but the backlog will not run these:'
|
|
33
|
+
// `epic_report`'s own words for the same condition, so the plan and the run name it identically.
|
|
34
|
+
const UNUSABLE_HEADING = 'The dependency graph is unusable, so there is no plan:'
|
|
35
|
+
|
|
36
|
+
const IN_PROGRESS_NOTE = 'a run already has it'
|
|
37
|
+
const PAST_OFFER_NOTE = 'ready, but past the offer this ask could make'
|
|
38
|
+
|
|
39
|
+
// The repository the plan is written from, and the titles the pool does not carry. Passed together
|
|
40
|
+
// because every row needs both: a bare number is not a plan, and a child elsewhere has to be
|
|
41
|
+
// qualified or it names this repository's issue of that number.
|
|
42
|
+
interface PlanContext {
|
|
43
|
+
repo: string
|
|
44
|
+
titles: ReadonlyMap<number, string>
|
|
45
|
+
// The open issues of this repository by number, or `undefined` when the listing was cut short and
|
|
46
|
+
// absence from it therefore proves nothing.
|
|
47
|
+
//
|
|
48
|
+
// A `blocked_by` edge keeps a blocker that has since closed — `backlog-pool.ts`'s `to_child` drops
|
|
49
|
+
// the node's state — so with a complete listing this is what tells a standing blocker from a
|
|
50
|
+
// closed one. **With an incomplete one every blocker is named**, because the two errors are not
|
|
51
|
+
// symmetric: naming a closed blocker sends a person to an issue that turns out to be done, while
|
|
52
|
+
// dropping a standing one reports the child as merely next in line when the run will keep waiting.
|
|
53
|
+
open_numbers: ReadonlySet<number> | undefined
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// A child elsewhere is qualified, because a bare number would name *this* repository's issue of that
|
|
57
|
+
// number — a different issue (joshuafolkken/kit#1016). Takes the reference rather than the child, so
|
|
58
|
+
// a `blocked_by` edge is named by the same rule the child itself is.
|
|
59
|
+
function reference_of(reference: IssueReference, repo: string): string {
|
|
60
|
+
const number = String(reference.number)
|
|
61
|
+
|
|
62
|
+
return reference.repo === repo ? `#${number}` : `${reference.repo}#${number}`
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// A title is only known for this repository's issues — the open listing the titles come from is this
|
|
66
|
+
// repository's. A child elsewhere is still named, just without one.
|
|
67
|
+
function title_of(child: EpicChild, context: PlanContext): string {
|
|
68
|
+
return child.repo === context.repo ? (context.titles.get(child.number) ?? '') : ''
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function join_row(reference: string, title: string, note: string): string {
|
|
72
|
+
const parts = [reference, title, note === '' ? '' : `— ${note}`].filter((part) => part !== '')
|
|
73
|
+
|
|
74
|
+
return `${ROW_INDENT}${parts.join(' ')}`
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function row_of(child: EpicChild, context: PlanContext, note: string): string {
|
|
78
|
+
return join_row(reference_of(child, context.repo), title_of(child, context), note)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Why this one is not offered yet. The blocker numbers are the answer whenever there are any — that
|
|
82
|
+
// is the dependency the report has never shown — and the two label-free cases are told apart so
|
|
83
|
+
// "waiting" does not read as "blocked" for an issue that is simply next in line.
|
|
84
|
+
// A blocker is dropped only where it is *known* closed: this repository's, and absent from a listing
|
|
85
|
+
// that was read to the end. Anything else is named.
|
|
86
|
+
function is_standing(edge: IssueReference, context: PlanContext): boolean {
|
|
87
|
+
if (context.open_numbers === undefined) return true
|
|
88
|
+
|
|
89
|
+
return edge.repo !== context.repo || context.open_numbers.has(edge.number)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function open_blockers(child: EpicChild, context: PlanContext): Array<string> {
|
|
93
|
+
return child.blocked_by
|
|
94
|
+
.filter((edge) => is_standing(edge, context))
|
|
95
|
+
.map((edge) => reference_of(edge, context.repo))
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// The label is read before the edges, the order `epic_classify.local_category` already settles the
|
|
99
|
+
// same question in: a child a run already holds is withheld for that reason whatever else it
|
|
100
|
+
// declares, and saying it waits on an issue would send a person to the wrong place.
|
|
101
|
+
function waiting_note(child: EpicChild, context: PlanContext): string {
|
|
102
|
+
if (has_label_name(child.labels, IN_PROGRESS_LABEL)) return IN_PROGRESS_NOTE
|
|
103
|
+
const blockers = open_blockers(child, context)
|
|
104
|
+
|
|
105
|
+
if (blockers.length > 0) return `waiting on ${blockers.join(', ')}`
|
|
106
|
+
|
|
107
|
+
return PAST_OFFER_NOTE
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function section(heading: string, lines: ReadonlyArray<string>): string {
|
|
111
|
+
return [heading, ...(lines.length === 0 ? [NOTHING] : lines)].join('\n')
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// The three child sections differ only in the note each row carries, so one function renders all of
|
|
115
|
+
// them and the note is what varies.
|
|
116
|
+
function child_lines(
|
|
117
|
+
children: ReadonlyArray<EpicChild>,
|
|
118
|
+
context: PlanContext,
|
|
119
|
+
note: (child: EpicChild) => string,
|
|
120
|
+
): Array<string> {
|
|
121
|
+
return children.map((child) => row_of(child, context, note(child)))
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// A section whose rows say nothing beyond naming the issue: being under the heading is the whole
|
|
125
|
+
// statement.
|
|
126
|
+
function no_note(): string {
|
|
127
|
+
return ''
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Grouped by repository, because a lane is per repository — so the grouping is the parallelism, not
|
|
131
|
+
// a presentational choice. The heading is `epic_report`'s own, checkout path included.
|
|
132
|
+
function ready_lines(result: EpicNextResult, context: PlanContext): Array<string> {
|
|
133
|
+
return result.candidates.flatMap((bundle) => [
|
|
134
|
+
epic_report.format_bundle_heading(bundle),
|
|
135
|
+
...child_lines(bundle.children, context, no_note),
|
|
136
|
+
])
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function waiting_lines(children: ReadonlyArray<EpicChild>, context: PlanContext): Array<string> {
|
|
140
|
+
return child_lines(children, context, function note(child: EpicChild): string {
|
|
141
|
+
return waiting_note(child, context)
|
|
142
|
+
})
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function scope_lines(rows: ReadonlyArray<OutOfScopeRow>): Array<string> {
|
|
146
|
+
return rows.map((row) => join_row(`#${String(row.number)}`, row.title, row.reason))
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// The classification could not be made, so every section below it would be rendered from buckets
|
|
150
|
+
// that mean nothing — and `build_result` empties only `candidates`, so an unusable graph would
|
|
151
|
+
// otherwise print as an ordinary plan with nothing ready. `backlog:next` answers `error` for this
|
|
152
|
+
// same pool, and a plan that read as normal beside it is exactly the disagreement this command
|
|
153
|
+
// promises cannot happen.
|
|
154
|
+
function format_unusable(result: EpicNextResult): string {
|
|
155
|
+
const lines = result.anomalies.map((anomaly) => `${ROW_INDENT}${anomaly.message}`)
|
|
156
|
+
|
|
157
|
+
return [UNUSABLE_HEADING, ...(lines.length === 0 ? [NOTHING] : lines)].join('\n')
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// The named prefix a `backlogrun` runs, and whether `--only` stops it there. Carried together because
|
|
161
|
+
// the plan renders the same two facts the run acts on: which issues lead, and whether the pool follows.
|
|
162
|
+
interface NamedPlan {
|
|
163
|
+
issues: ReadonlyArray<number>
|
|
164
|
+
only: boolean
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// The named issues are this repository's own, so a bare `#N` names them and a title is looked up the
|
|
168
|
+
// same way the pool's rows are. The order is the invocation's, never sorted.
|
|
169
|
+
function named_lines(named: ReadonlyArray<number>, context: PlanContext): Array<string> {
|
|
170
|
+
return named.map((issue) => join_row(`#${String(issue)}`, context.titles.get(issue) ?? '', ''))
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// The section leads the plan when the invocation named issues, and is absent otherwise — a bare
|
|
174
|
+
// `backlogrun` has no named prefix, so the plan opens on the pool as it always did. This is the
|
|
175
|
+
// non-`--only` prefix; `--only` renders its own whole plan in `format_only`.
|
|
176
|
+
function named_prefix(named: NamedPlan, context: PlanContext): Array<string> {
|
|
177
|
+
if (named.issues.length === 0) return []
|
|
178
|
+
|
|
179
|
+
return [section(NAMED_HEADING, named_lines(named.issues, context)), '']
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// `--only` runs the named list and stops, so its plan is the named section alone — the pool is not
|
|
183
|
+
// run, and rendering it would promise work `--only` excludes. The header still names the repository.
|
|
184
|
+
function format_only(named: NamedPlan, context: PlanContext): string {
|
|
185
|
+
return [
|
|
186
|
+
`Backlog plan — ${context.repo}`,
|
|
187
|
+
'',
|
|
188
|
+
section(ONLY_NAMED_HEADING, named_lines(named.issues, context)),
|
|
189
|
+
].join('\n')
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function format_plan(
|
|
193
|
+
result: EpicNextResult,
|
|
194
|
+
out_of_scope: ReadonlyArray<OutOfScopeRow>,
|
|
195
|
+
context: PlanContext,
|
|
196
|
+
named: NamedPlan,
|
|
197
|
+
): string {
|
|
198
|
+
if (result.verdict === 'error') return format_unusable(result)
|
|
199
|
+
if (named.only) return format_only(named, context)
|
|
200
|
+
|
|
201
|
+
return [
|
|
202
|
+
`Backlog plan — ${context.repo}`,
|
|
203
|
+
'',
|
|
204
|
+
...named_prefix(named, context),
|
|
205
|
+
section(READY_HEADING, ready_lines(result, context)),
|
|
206
|
+
'',
|
|
207
|
+
section(WAITING_HEADING, waiting_lines(result.waiting, context)),
|
|
208
|
+
'',
|
|
209
|
+
section(HUMAN_HEADING, child_lines(result.blocked_on_people, context, no_note)),
|
|
210
|
+
'',
|
|
211
|
+
section(SCOPE_HEADING, scope_lines(out_of_scope)),
|
|
212
|
+
].join('\n')
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const backlog_plan = {
|
|
216
|
+
HUMAN_HEADING,
|
|
217
|
+
IN_PROGRESS_NOTE,
|
|
218
|
+
NAMED_HEADING,
|
|
219
|
+
NOTHING,
|
|
220
|
+
ONLY_NAMED_HEADING,
|
|
221
|
+
PAST_OFFER_NOTE,
|
|
222
|
+
READY_HEADING,
|
|
223
|
+
SCOPE_HEADING,
|
|
224
|
+
UNUSABLE_HEADING,
|
|
225
|
+
WAITING_HEADING,
|
|
226
|
+
format_plan,
|
|
227
|
+
waiting_note,
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export { backlog_plan }
|
|
231
|
+
export type { NamedPlan, PlanContext }
|