@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,69 @@
|
|
|
1
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
2
|
+
import type { CarryChange, RunCarry } from './run-carry'
|
|
3
|
+
import { run_carry_streak } from './run-carry-streak'
|
|
4
|
+
|
|
5
|
+
const NO_INCREMENT = 0
|
|
6
|
+
|
|
7
|
+
function next_done(carry: RunCarry, done: number | undefined): ReadonlyArray<number> | undefined {
|
|
8
|
+
if (done === undefined) return carry.done
|
|
9
|
+
|
|
10
|
+
const current = carry.done ?? []
|
|
11
|
+
|
|
12
|
+
return current.includes(done) ? current : [...current, done]
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function next_merged_issues(
|
|
16
|
+
carry: RunCarry,
|
|
17
|
+
issue: number | undefined,
|
|
18
|
+
): ReadonlyArray<number> | undefined {
|
|
19
|
+
if (issue === undefined) return carry.merged_issues
|
|
20
|
+
|
|
21
|
+
return [...(carry.merged_issues ?? []), issue]
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function is_duplicate_merge(carry: RunCarry, change: CarryChange): boolean {
|
|
25
|
+
const issue = change.merged_issue
|
|
26
|
+
|
|
27
|
+
return issue !== undefined && carry.merged_issues?.includes(issue) === true
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function next_counts(
|
|
31
|
+
carry: RunCarry,
|
|
32
|
+
change: CarryChange,
|
|
33
|
+
): Pick<RunCarry, 'merged' | 'filed' | 'cuts' | 'is_handed_off'> {
|
|
34
|
+
const cuts = change.cuts ?? NO_INCREMENT
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
merged: carry.merged + (change.merged ?? NO_INCREMENT),
|
|
38
|
+
filed: carry.filed + (change.filed ?? NO_INCREMENT),
|
|
39
|
+
cuts: carry.cuts + cuts,
|
|
40
|
+
is_handed_off: cuts > NO_INCREMENT,
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function apply_change(
|
|
45
|
+
target: string,
|
|
46
|
+
carry: RunCarry,
|
|
47
|
+
change: CarryChange,
|
|
48
|
+
now: Date = new Date(),
|
|
49
|
+
): RunCarry {
|
|
50
|
+
if (is_duplicate_merge(carry, change)) return carry
|
|
51
|
+
|
|
52
|
+
const streak = run_carry_streak.next_state(carry, change, now)
|
|
53
|
+
const next: RunCarry = {
|
|
54
|
+
...carry,
|
|
55
|
+
...next_counts(carry, change),
|
|
56
|
+
merged_issues: next_merged_issues(carry, change.merged_issue),
|
|
57
|
+
failures: streak.failures,
|
|
58
|
+
outages: streak.outages,
|
|
59
|
+
last_outage_at: streak.last_outage_at,
|
|
60
|
+
done: next_done(carry, change.done),
|
|
61
|
+
retrospective: change.retrospective === true || carry.retrospective,
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
stamp_file.write_stamp(target, next)
|
|
65
|
+
|
|
66
|
+
return next
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export const run_carry_change = { apply_change }
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import {
|
|
4
|
+
run_carry,
|
|
5
|
+
type CarryClaim,
|
|
6
|
+
type CarryClaimRequest,
|
|
7
|
+
type CarryRead,
|
|
8
|
+
type RunCarry,
|
|
9
|
+
} from './run-carry'
|
|
10
|
+
import { run_carry_args, type CountRequest, type Request } from './run-carry-args'
|
|
11
|
+
import { run_carry_flush } from './run-carry-flush'
|
|
12
|
+
import { run_carry_stash } from './run-carry-stash'
|
|
13
|
+
import { run_event_stream } from './run-event-stream'
|
|
14
|
+
import { run_event_stream_emit } from './run-event-stream-emit'
|
|
15
|
+
import { run_stop_notify } from './run-stop-notify'
|
|
16
|
+
|
|
17
|
+
// `josh run:carry` — the record that carries one invocation's budget across its own session cuts
|
|
18
|
+
// (joshuafolkken/kit#1714). A `backlogrun` begins it, counts a merge and a filing into it, marks each
|
|
19
|
+
// cut, and ends it; a session that resumes after a cut reads the same budget back rather than
|
|
20
|
+
// starting a new one. **Turning `argv` into a request is `run-carry-args.ts`'s**; what is here acts
|
|
21
|
+
// on the record and prints.
|
|
22
|
+
//
|
|
23
|
+
// The contract is `run:hold`'s: **standard output carries exactly one token** and every explanation
|
|
24
|
+
// goes to standard error, so `answer=$(pnpm josh run:carry --begin "backlogrun --max 5")` captures
|
|
25
|
+
// something a loop can branch on. `--json` is the one exception, and it is still one line: the whole
|
|
26
|
+
// record has to reach a resumed session, and prose on standard error cannot be read back.
|
|
27
|
+
|
|
28
|
+
const ARGV_OFFSET = 2
|
|
29
|
+
const SUCCESS_EXIT_CODE = 0
|
|
30
|
+
const FAILURE_EXIT_CODE = 1
|
|
31
|
+
const BEGAN_VERDICT = 'began'
|
|
32
|
+
const RESUMED_VERDICT = 'resumed'
|
|
33
|
+
const CARRIED_VERDICT = 'carried'
|
|
34
|
+
const COUNTED_VERDICT = 'counted'
|
|
35
|
+
const ENDED_VERDICT = 'ended'
|
|
36
|
+
const EXPIRED_VERDICT = 'expired'
|
|
37
|
+
const NONE_VERDICT = 'none'
|
|
38
|
+
const UNREADABLE_VERDICT = 'unreadable'
|
|
39
|
+
const MISMATCH_VERDICT = 'mismatch'
|
|
40
|
+
const BUSY_VERDICT = 'busy'
|
|
41
|
+
const STANDING_VERDICT = 'standing'
|
|
42
|
+
const UNKNOWN_VERDICT = 'unknown'
|
|
43
|
+
// The invocation has taken its maximum cuts (joshuafolkken/kit#2346). A benign, non-failing refusal:
|
|
44
|
+
// the run carries on uncut rather than paying a cold preamble the accumulation it would shed no longer
|
|
45
|
+
// covers, exactly as an under-threshold pre-gate cut carries on to the gate.
|
|
46
|
+
const CAPPED_VERDICT = 'capped'
|
|
47
|
+
const NO_CUTS = 0
|
|
48
|
+
|
|
49
|
+
const CLAIM_VERDICTS: Record<CarryClaim, string> = {
|
|
50
|
+
busy: BUSY_VERDICT,
|
|
51
|
+
mismatch: MISMATCH_VERDICT,
|
|
52
|
+
resume: RESUMED_VERDICT,
|
|
53
|
+
standing: STANDING_VERDICT,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function report(
|
|
57
|
+
verdict: string,
|
|
58
|
+
carry: RunCarry | undefined,
|
|
59
|
+
is_json: boolean,
|
|
60
|
+
code: number,
|
|
61
|
+
): number {
|
|
62
|
+
// **`remaining` rides along with the record rather than behind a flag of its own.** `--json` is
|
|
63
|
+
// already the one answer a resumed session reads back in full, and the question it has to answer
|
|
64
|
+
// there — which of a `backlogrun`'s named issues are still outstanding — is determined by two fields
|
|
65
|
+
// of the record it is already printing (joshuafolkken/kit#1774, folded in by joshuafolkken/kit#1984).
|
|
66
|
+
// A budget-only `backlogrun` names no issues, so the value is `undefined` and `JSON.stringify` drops
|
|
67
|
+
// the key entirely.
|
|
68
|
+
console.info(
|
|
69
|
+
is_json
|
|
70
|
+
? JSON.stringify({ verdict, carry, remaining: run_carry.remaining_of(carry) })
|
|
71
|
+
: verdict,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
return code
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function report_carry(verdict: string, carry: RunCarry, is_json: boolean): number {
|
|
78
|
+
if (!is_json) console.error(run_carry.describe_carry(carry))
|
|
79
|
+
|
|
80
|
+
return report(verdict, carry, is_json, SUCCESS_EXIT_CODE)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function report_unreadable(is_json: boolean): number {
|
|
84
|
+
console.error(run_carry.unreadable_message())
|
|
85
|
+
|
|
86
|
+
return report(UNREADABLE_VERDICT, undefined, is_json, FAILURE_EXIT_CODE)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function report_expired(carry: RunCarry, is_json: boolean): number {
|
|
90
|
+
console.error(run_carry.expired_message(carry))
|
|
91
|
+
|
|
92
|
+
return report_carry(EXPIRED_VERDICT, carry, is_json)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function report_read(read: CarryRead, is_json: boolean): number {
|
|
96
|
+
if (read.kind === 'none') return report(NONE_VERDICT, undefined, is_json, SUCCESS_EXIT_CODE)
|
|
97
|
+
|
|
98
|
+
if (read.kind === 'unreadable') return report_unreadable(is_json)
|
|
99
|
+
|
|
100
|
+
if (read.kind === 'expired') return report_expired(read.carry, is_json)
|
|
101
|
+
|
|
102
|
+
return report_carry(CARRIED_VERDICT, read.carry, is_json)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function report_busy(carry: RunCarry, is_json: boolean): number {
|
|
106
|
+
console.error(run_carry.busy_message(carry))
|
|
107
|
+
|
|
108
|
+
return report(BUSY_VERDICT, carry, is_json, FAILURE_EXIT_CODE)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function refusal_message(claim: CarryClaim, carry: RunCarry, invocation: string): string {
|
|
112
|
+
if (claim === 'busy') return run_carry.busy_message(carry)
|
|
113
|
+
|
|
114
|
+
if (claim === 'mismatch') return run_carry.mismatch_message(carry, invocation)
|
|
115
|
+
|
|
116
|
+
return run_carry.standing_message(carry)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// The exclusive create lost to another process, which is what `busy` says. It is said without
|
|
120
|
+
// re-reading the record, because a record this caller does not own is not one to report the contents
|
|
121
|
+
// of as though it had established them.
|
|
122
|
+
function report_lost(is_json: boolean): number {
|
|
123
|
+
console.error(run_carry.lost_message())
|
|
124
|
+
|
|
125
|
+
return report(BUSY_VERDICT, undefined, is_json, FAILURE_EXIT_CODE)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// The take-over lost that same create, so another process claimed the record in between.
|
|
129
|
+
function report_adoption(
|
|
130
|
+
target: string,
|
|
131
|
+
carry: RunCarry,
|
|
132
|
+
request: CarryClaimRequest,
|
|
133
|
+
is_json: boolean,
|
|
134
|
+
): number {
|
|
135
|
+
const adopted = run_carry.adopt_carry(target, carry, request.owner)
|
|
136
|
+
|
|
137
|
+
if (adopted === undefined) return report_lost(is_json)
|
|
138
|
+
|
|
139
|
+
return report_carry(RESUMED_VERDICT, adopted, is_json)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// **Whose record it is, is the classifier's answer and not this command's guess.** `--end` is only
|
|
143
|
+
// reached on the clean-finish path, so a run that crashed or stopped on a guard leaves its record
|
|
144
|
+
// standing for up to the whole-run bound; `resumed` is reached only where the run itself declared the
|
|
145
|
+
// cut, or where `--resume` says the reader has decided to carry it.
|
|
146
|
+
function report_claim(
|
|
147
|
+
target: string,
|
|
148
|
+
carry: RunCarry,
|
|
149
|
+
request: CarryClaimRequest,
|
|
150
|
+
is_json: boolean,
|
|
151
|
+
): number {
|
|
152
|
+
const claim = run_carry.classify_claim(carry, request)
|
|
153
|
+
|
|
154
|
+
if (claim === 'resume') return report_adoption(target, carry, request, is_json)
|
|
155
|
+
|
|
156
|
+
console.error(refusal_message(claim, carry, request.invocation))
|
|
157
|
+
|
|
158
|
+
return report(CLAIM_VERDICTS[claim], carry, is_json, FAILURE_EXIT_CODE)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function start_fresh(
|
|
162
|
+
target: string,
|
|
163
|
+
request: CarryClaimRequest,
|
|
164
|
+
is_replacement: boolean,
|
|
165
|
+
is_json: boolean,
|
|
166
|
+
): number {
|
|
167
|
+
const carry = is_replacement
|
|
168
|
+
? run_carry.replace_carry(target, request.invocation, request.owner)
|
|
169
|
+
: run_carry.begin_carry(target, request.invocation, request.owner)
|
|
170
|
+
|
|
171
|
+
if (carry === undefined) return report_lost(is_json)
|
|
172
|
+
|
|
173
|
+
return report_carry(BEGAN_VERDICT, carry, is_json)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// **The bound ends *that* run, so a spent record whose owner is still running is not replaced
|
|
177
|
+
// either.** Replacing it would delete a live parent's budget and answer `began` — two parents on one
|
|
178
|
+
// record, which is the half of the defect the expiry path would otherwise have kept. Only that run,
|
|
179
|
+
// or a person who knows it is over, ends it.
|
|
180
|
+
function begin_over_expired(
|
|
181
|
+
target: string,
|
|
182
|
+
carry: RunCarry,
|
|
183
|
+
request: CarryClaimRequest,
|
|
184
|
+
is_json: boolean,
|
|
185
|
+
): number {
|
|
186
|
+
if (run_carry.is_foreign_live_owner(carry, request.owner)) return report_busy(carry, is_json)
|
|
187
|
+
|
|
188
|
+
// **A hand-off says the resumption *is* that run, so the spent bound is this session's too.**
|
|
189
|
+
// Replaced here, the record would come back with `started_at` set to now — and `backlog:budget
|
|
190
|
+
// --started` reads that field, so the 8-hour bound would restart at every cut and never end the
|
|
191
|
+
// run. The answer is `expired`, and a person who really is starting a new run clears the record
|
|
192
|
+
// with `--end`, which is what the expiry message says.
|
|
193
|
+
if (carry.is_handed_off === true) return report_expired(carry, is_json)
|
|
194
|
+
|
|
195
|
+
console.error(run_carry.expired_message(carry))
|
|
196
|
+
|
|
197
|
+
return start_fresh(target, request, true, is_json)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// **A live record is never replaced, and never resumed into by something else.** Replacing one would
|
|
201
|
+
// restart the budget the cut exists to carry, and resuming into one would put two parents on a single
|
|
202
|
+
// budget — the two halves of the defect this command was written for. An expired one is replaced,
|
|
203
|
+
// because its run has spent the whole-run bound and a person typing the keyword again is starting a
|
|
204
|
+
// new run — unless its owner is still running, which is the case above.
|
|
205
|
+
function begin(target: string, request: CarryClaimRequest, is_json: boolean): number {
|
|
206
|
+
const read = run_carry.read_carry(target)
|
|
207
|
+
|
|
208
|
+
if (read.kind === 'unreadable') return report_unreadable(is_json)
|
|
209
|
+
|
|
210
|
+
if (read.kind === 'carried') return report_claim(target, read.carry, request, is_json)
|
|
211
|
+
|
|
212
|
+
if (read.kind === 'expired') return begin_over_expired(target, read.carry, request, is_json)
|
|
213
|
+
|
|
214
|
+
return start_fresh(target, request, false, is_json)
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function report_nothing_to_resume(is_json: boolean): number {
|
|
218
|
+
console.error(run_carry.nothing_to_resume_message())
|
|
219
|
+
|
|
220
|
+
return report(NONE_VERDICT, undefined, is_json, FAILURE_EXIT_CODE)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// `--resume` is the carry half of the answer `standing` asks for: the reader has decided the standing
|
|
224
|
+
// record's run is over and its budget is this session's to continue. It still refuses a live foreign
|
|
225
|
+
// owner, because deciding that is not the same as being allowed to.
|
|
226
|
+
function adopt(target: string, request: CarryClaimRequest, is_json: boolean): number {
|
|
227
|
+
const read = run_carry.read_carry(target)
|
|
228
|
+
|
|
229
|
+
if (read.kind === 'none') return report_nothing_to_resume(is_json)
|
|
230
|
+
|
|
231
|
+
if (read.kind === 'unreadable') return report_unreadable(is_json)
|
|
232
|
+
|
|
233
|
+
if (read.kind === 'expired') return report_expired(read.carry, is_json)
|
|
234
|
+
|
|
235
|
+
return report_claim(target, read.carry, request, is_json)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function claim_record(target: string, request: CarryClaimRequest, is_json: boolean): number {
|
|
239
|
+
return request.is_adoption ? adopt(target, request, is_json) : begin(target, request, is_json)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// The record is no longer this session's to advance — handed off at a cut, or taken over by a live
|
|
243
|
+
// successor. It is a refusal exit, said without applying the change (joshuafolkken/kit#1935).
|
|
244
|
+
function report_count_refused(carry: RunCarry, is_json: boolean): number {
|
|
245
|
+
console.error(run_carry.count_refused_message(carry))
|
|
246
|
+
|
|
247
|
+
return report(BUSY_VERDICT, carry, is_json, FAILURE_EXIT_CODE)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// The retrospective's result on the run's event stream, so a run that filed zero improvements reads
|
|
251
|
+
// apart from one whose retrospective never ran (joshuafolkken/kit#2342). It rides the `--retrospective`
|
|
252
|
+
// mark rather than a call of its own, so closing the retrospective and recording what it found are one
|
|
253
|
+
// action; the emit is best-effort, the same contract every other append on this stream keeps, and it
|
|
254
|
+
// happens only after the mark applied — a refused count records nothing.
|
|
255
|
+
async function record_retrospective(request: CountRequest): Promise<void> {
|
|
256
|
+
if (request.summary === undefined) return
|
|
257
|
+
|
|
258
|
+
await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.RETROSPECTIVE, request.summary)
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// A cut count is the one increment with a ceiling (joshuafolkken/kit#2346); a merge or a filing has
|
|
262
|
+
// none. `--cut` sets `cuts` to one, so a positive count is what marks this count a cut.
|
|
263
|
+
function is_cut_count(request: CountRequest): boolean {
|
|
264
|
+
return (request.change.cuts ?? NO_CUTS) > NO_CUTS
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// The cut cap is reached, so the cut is refused without applying it — the run carries on uncut. Said as
|
|
268
|
+
// a benign verdict rather than a failure, so a loop reads `capped` and continues rather than stopping.
|
|
269
|
+
function report_cut_capped(carry: RunCarry, is_json: boolean): number {
|
|
270
|
+
console.error(
|
|
271
|
+
`Cut cap reached (${String(run_carry.MAX_CUTS)} cuts); nothing was counted and the run carries on uncut.`,
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
return report(CAPPED_VERDICT, carry, is_json, SUCCESS_EXIT_CODE)
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// The refusals read before a count is applied: a record this session no longer owns (handed off or
|
|
278
|
+
// taken over) keeps the single writer joshuafolkken/kit#1722 established across a cut, and a cut past
|
|
279
|
+
// the cap carries on uncut (joshuafolkken/kit#2346). `undefined` when neither applies, so the count
|
|
280
|
+
// lands.
|
|
281
|
+
function blocked_count(
|
|
282
|
+
carry: RunCarry,
|
|
283
|
+
request: CountRequest,
|
|
284
|
+
is_json: boolean,
|
|
285
|
+
): number | undefined {
|
|
286
|
+
if (run_carry.is_count_refused(carry, request.owner)) {
|
|
287
|
+
return report_count_refused(carry, is_json)
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if (is_cut_count(request) && run_carry.is_at_cut_cap(carry)) {
|
|
291
|
+
return report_cut_capped(carry, is_json)
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return undefined
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// A count against a record that is not there is `none` and exits non-zero: the loop believed it was
|
|
298
|
+
// carrying a budget and it was not, and a silent zero would let the run keep its own tally instead. A
|
|
299
|
+
// count against a record this session no longer owns is refused, and a cut past the cap carries on
|
|
300
|
+
// uncut, both before the change is applied (joshuafolkken/kit#1935, joshuafolkken/kit#2346).
|
|
301
|
+
async function count(
|
|
302
|
+
target: string,
|
|
303
|
+
read: CarryRead,
|
|
304
|
+
request: CountRequest,
|
|
305
|
+
is_json: boolean,
|
|
306
|
+
): Promise<number> {
|
|
307
|
+
if (read.kind === 'none') return report(NONE_VERDICT, undefined, is_json, FAILURE_EXIT_CODE)
|
|
308
|
+
|
|
309
|
+
if (read.kind === 'unreadable') return report_unreadable(is_json)
|
|
310
|
+
|
|
311
|
+
const blocked = blocked_count(read.carry, request, is_json)
|
|
312
|
+
|
|
313
|
+
if (blocked !== undefined) return blocked
|
|
314
|
+
|
|
315
|
+
const carry = run_carry.apply_change(target, read.carry, request.change)
|
|
316
|
+
|
|
317
|
+
await record_retrospective(request)
|
|
318
|
+
|
|
319
|
+
return read.kind === 'expired'
|
|
320
|
+
? report_expired(carry, is_json)
|
|
321
|
+
: report_carry(COUNTED_VERDICT, carry, is_json)
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// **A stop over a record that is still there pushes one ⏸️ confirmation before the record goes**
|
|
325
|
+
// (joshuafolkken/kit#2136). `plan` is read from the record `--end` is about to remove, so the second
|
|
326
|
+
// `--end` reads `none` and plans nothing — one stop never notifies twice. A clean `--end` passes no
|
|
327
|
+
// reason and stays silent, because a completed run has its own notification. The batch's one ledger
|
|
328
|
+
// flush rides the same read for the same reason (joshuafolkken/kit#2492, `run-carry-flush.ts`), and
|
|
329
|
+
// runs last: it waits out a pull request's CI, so a flush cut short must find the record already gone
|
|
330
|
+
// and the stop already announced. The closed-issue stash report (joshuafolkken/kit#2505,
|
|
331
|
+
// `run-carry-stash.ts`) is once per invocation on the same read, and goes first because it is quick.
|
|
332
|
+
async function report_end(read: CarryRead): Promise<void> {
|
|
333
|
+
if (read.kind === 'none') return
|
|
334
|
+
|
|
335
|
+
await run_carry_stash.report_orphans()
|
|
336
|
+
await run_carry_flush.flush_ledger()
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
async function finish(
|
|
340
|
+
target: string,
|
|
341
|
+
stopped: string | undefined,
|
|
342
|
+
is_json: boolean,
|
|
343
|
+
): Promise<number> {
|
|
344
|
+
const read = run_carry.read_carry(target)
|
|
345
|
+
|
|
346
|
+
run_carry.end_carry(target)
|
|
347
|
+
|
|
348
|
+
const notice = run_stop_notify.plan(read, stopped)
|
|
349
|
+
|
|
350
|
+
if (notice !== undefined) await run_stop_notify.announce(notice)
|
|
351
|
+
|
|
352
|
+
await report_end(read)
|
|
353
|
+
|
|
354
|
+
if (read.kind === 'none') return report(NONE_VERDICT, undefined, is_json, SUCCESS_EXIT_CODE)
|
|
355
|
+
|
|
356
|
+
if (read.kind === 'unreadable') {
|
|
357
|
+
return report(ENDED_VERDICT, undefined, is_json, SUCCESS_EXIT_CODE)
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return report_carry(ENDED_VERDICT, read.carry, is_json)
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
async function act(target: string, request: Request, is_json: boolean): Promise<number> {
|
|
364
|
+
if (request.kind === 'claim') return claim_record(target, request.claim, is_json)
|
|
365
|
+
|
|
366
|
+
if (request.kind === 'end') return await finish(target, request.stopped, is_json)
|
|
367
|
+
|
|
368
|
+
const read = run_carry.read_carry(target)
|
|
369
|
+
|
|
370
|
+
if (request.kind === 'read') return report_read(read, is_json)
|
|
371
|
+
|
|
372
|
+
return await count(target, read, request, is_json)
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function report_unknown(is_json: boolean): number {
|
|
376
|
+
console.error(run_carry.unknown_message())
|
|
377
|
+
|
|
378
|
+
return report(UNKNOWN_VERDICT, undefined, is_json, FAILURE_EXIT_CODE)
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
async function answer(request: Request, is_json: boolean): Promise<number> {
|
|
382
|
+
const directory = await run_carry.repository_directory()
|
|
383
|
+
|
|
384
|
+
if (directory === undefined) return report_unknown(is_json)
|
|
385
|
+
|
|
386
|
+
return await act(run_carry.carry_path(directory), request, is_json)
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
function refuse(): number {
|
|
390
|
+
console.error(run_carry_args.USAGE)
|
|
391
|
+
|
|
392
|
+
return FAILURE_EXIT_CODE
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// Every path out of here prints exactly one token, including the ones nobody planned: an empty
|
|
396
|
+
// standard output matches none of the verdicts, which a loop reads as "nothing to carry" before
|
|
397
|
+
// starting a second budget over the first one's.
|
|
398
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
399
|
+
const values = run_carry_args.read_arguments(argv)
|
|
400
|
+
|
|
401
|
+
if (values === undefined) return refuse()
|
|
402
|
+
|
|
403
|
+
const request = run_carry_args.to_request(values)
|
|
404
|
+
|
|
405
|
+
if (request === undefined) return refuse()
|
|
406
|
+
|
|
407
|
+
try {
|
|
408
|
+
return await answer(request, values.json === true)
|
|
409
|
+
} catch {
|
|
410
|
+
return report_unknown(values.json === true)
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
415
|
+
process.exitCode = await run(argv)
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
const run_carry_cli = {
|
|
419
|
+
BEGAN_VERDICT,
|
|
420
|
+
BUSY_VERDICT,
|
|
421
|
+
CAPPED_VERDICT,
|
|
422
|
+
CARRIED_VERDICT,
|
|
423
|
+
COUNTED_VERDICT,
|
|
424
|
+
ENDED_VERDICT,
|
|
425
|
+
EXPIRED_VERDICT,
|
|
426
|
+
MISMATCH_VERDICT,
|
|
427
|
+
NONE_VERDICT,
|
|
428
|
+
RESUMED_VERDICT,
|
|
429
|
+
STANDING_VERDICT,
|
|
430
|
+
UNKNOWN_VERDICT,
|
|
431
|
+
UNREADABLE_VERDICT,
|
|
432
|
+
// Re-exported rather than restated: the usage line belongs to the half that parses, and a second
|
|
433
|
+
// copy of it here would drift from the flags it describes.
|
|
434
|
+
USAGE: run_carry_args.USAGE,
|
|
435
|
+
main,
|
|
436
|
+
run,
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
440
|
+
|
|
441
|
+
export { run_carry_cli }
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { git_spawn } from '#scripts/git/git-spawn'
|
|
2
|
+
import { josh_command } from '#scripts/josh/josh-run'
|
|
3
|
+
import { observation_ledger } from '#scripts/observations/observation-ledger'
|
|
4
|
+
import { observation_ledger_home } from '#scripts/observations/observation-ledger-home'
|
|
5
|
+
|
|
6
|
+
// The one observation-ledger flush a `backlogrun` makes, at its end (joshuafolkken/kit#2492).
|
|
7
|
+
//
|
|
8
|
+
// A lane child used to flush after every merge (`run:tail`'s first step): a ledger-only branch, pull
|
|
9
|
+
// request and full CI run per issue, minutes each, for a file only the retrospective and the
|
|
10
|
+
// measurements read. The lanes now leave their lines appended in the primary checkout — the ledger's
|
|
11
|
+
// only home (`observation-ledger-home.ts`) — and `run:carry --end` commits them all in one pull request
|
|
12
|
+
// once the record is gone. `--end` is the batch's one end across every session cut, and the second
|
|
13
|
+
// `--end` finds no record and flushes nothing, so the flush is once per invocation.
|
|
14
|
+
//
|
|
15
|
+
// **It runs after the retrospective, not before**, and loses nothing by it: the retrospective reads the
|
|
16
|
+
// ledger file on disk (`retrospective-cli.ts` → `read_ledger`), not main, and the lines it stacks
|
|
17
|
+
// itself land in the same pull request. **A line a cut or a crash left unflushed is not lost either**:
|
|
18
|
+
// it is still a pending append in the primary checkout, and the next flush — this one, a later run's,
|
|
19
|
+
// or a single run's `followup` — sees it from `git status`, whichever run wrote it.
|
|
20
|
+
//
|
|
21
|
+
// **A failed flush is reported, never allowed to keep the record standing.** The lines stay on disk for
|
|
22
|
+
// the next flush, while a record that outlived its run would make the next `--begin` read `busy` — so
|
|
23
|
+
// `--end` clears the record before it flushes. A flush killed before its commit leaves only the lines
|
|
24
|
+
// in the working tree; one killed after it leaves them on its pull request's branch, which GitHub's
|
|
25
|
+
// auto-merge lands once the checks pass (joshuafolkken/kit#2497).
|
|
26
|
+
|
|
27
|
+
const FLUSH_ARGV: ReadonlyArray<string> = ['observations:flush']
|
|
28
|
+
const SUCCESS_EXIT_CODE = 0
|
|
29
|
+
const FAILURE_NOTE =
|
|
30
|
+
'The observation ledger flush failed; its lines stay in the primary checkout for the next flush (`pnpm josh observations:flush`).'
|
|
31
|
+
|
|
32
|
+
async function has_pending_append(): Promise<boolean> {
|
|
33
|
+
const root = observation_ledger_home.ledger_root()
|
|
34
|
+
const status = await git_spawn.read([
|
|
35
|
+
'-C',
|
|
36
|
+
root,
|
|
37
|
+
'status',
|
|
38
|
+
'--porcelain',
|
|
39
|
+
'--untracked-files=normal',
|
|
40
|
+
])
|
|
41
|
+
|
|
42
|
+
return observation_ledger.has_pending_append(status)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Standard output is `run:carry`'s one-token contract, so every word of the flush goes to standard
|
|
46
|
+
// error — the flush's own explanation is forwarded there, and its report is copied after it.
|
|
47
|
+
async function flush_ledger(): Promise<void> {
|
|
48
|
+
try {
|
|
49
|
+
if (!(await has_pending_append())) return
|
|
50
|
+
|
|
51
|
+
const result = await josh_command.josh_run(FLUSH_ARGV, true)
|
|
52
|
+
|
|
53
|
+
if (result.out.length > 0) console.error(result.out)
|
|
54
|
+
|
|
55
|
+
if (result.code !== SUCCESS_EXIT_CODE) console.error(FAILURE_NOTE)
|
|
56
|
+
} catch {
|
|
57
|
+
console.error(FAILURE_NOTE)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const run_carry_flush = { FAILURE_NOTE, FLUSH_ARGV, flush_ledger }
|
|
62
|
+
|
|
63
|
+
export { run_carry_flush }
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { git_stash } from '#scripts/git/git-stash'
|
|
2
|
+
import { stash_orphans } from '#scripts/git/stash-orphans'
|
|
3
|
+
import { issue_state_cli } from '#scripts/issue/issue-state-cli'
|
|
4
|
+
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
5
|
+
|
|
6
|
+
// The stash check a `backlogrun` makes at its end (joshuafolkken/kit#2505): the entries whose issue has
|
|
7
|
+
// closed, and those with no readable owner, printed for a person to revive or discard. It rides
|
|
8
|
+
// `run:carry --end` for the ledger flush's reason — `--end` is the invocation's one end across every
|
|
9
|
+
// session cut, where `--begin` repeats on each resume. Standard output is `run:carry`'s one-token
|
|
10
|
+
// contract, so the report goes to standard error, and a failed read is a note rather than a failed end.
|
|
11
|
+
|
|
12
|
+
const READ_CONCURRENCY = 8
|
|
13
|
+
const CLOSED_STATE = 'CLOSED'
|
|
14
|
+
const FAILURE_NOTE =
|
|
15
|
+
'The closed-issue stash check failed; review the stack by hand with `git stash list`.'
|
|
16
|
+
|
|
17
|
+
type Verdict = 'closed' | 'open' | 'unreadable'
|
|
18
|
+
|
|
19
|
+
interface ClosedRead {
|
|
20
|
+
closed: Set<string>
|
|
21
|
+
unreadable: Array<string>
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Only a read that answers `CLOSED` counts as closed: a missing or unreadable issue is not evidence the
|
|
25
|
+
// work is abandoned, and reporting it as closed would invite a person to drop live work.
|
|
26
|
+
async function verdict_of(issue: string): Promise<Verdict> {
|
|
27
|
+
const read = await issue_state_cli.read_issue(issue)
|
|
28
|
+
|
|
29
|
+
if (read.kind !== 'state') return 'unreadable'
|
|
30
|
+
|
|
31
|
+
return read.state.state === CLOSED_STATE ? 'closed' : 'open'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function read_closed(issues: ReadonlyArray<string>): Promise<ClosedRead> {
|
|
35
|
+
const verdicts = await bounded_pool.bounded_map(
|
|
36
|
+
issues,
|
|
37
|
+
READ_CONCURRENCY,
|
|
38
|
+
async (issue) => await verdict_of(issue),
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
closed: new Set(issues.filter((_issue, index) => verdicts[index] === 'closed')),
|
|
43
|
+
unreadable: issues.filter((_issue, index) => verdicts[index] === 'unreadable'),
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// `read_issue` answers a failed `gh` call as `unreadable` rather than throwing, so a missing `gh` or a
|
|
48
|
+
// rate limit would otherwise empty the closed set and print a report that looks complete.
|
|
49
|
+
function unreadable_note(unreadable: ReadonlyArray<string>): string {
|
|
50
|
+
const issues = unreadable.map((issue) => `#${issue}`).join(', ')
|
|
51
|
+
|
|
52
|
+
return `Could not read ${issues}, so a stash of theirs may be missing above; ${FAILURE_NOTE}`
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function report_orphans(): Promise<void> {
|
|
56
|
+
try {
|
|
57
|
+
const entries = await git_stash.list()
|
|
58
|
+
const read = await read_closed(stash_orphans.issues_of(entries))
|
|
59
|
+
const report = stash_orphans.format_report(stash_orphans.orphans(entries, read.closed))
|
|
60
|
+
|
|
61
|
+
if (report !== undefined) console.error(report)
|
|
62
|
+
|
|
63
|
+
if (read.unreadable.length > 0) console.error(unreadable_note(read.unreadable))
|
|
64
|
+
} catch {
|
|
65
|
+
console.error(FAILURE_NOTE)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const run_carry_stash = { FAILURE_NOTE, report_orphans }
|
|
70
|
+
|
|
71
|
+
export { run_carry_stash }
|