@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,111 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { parseArgs } from 'node:util'
|
|
4
|
+
import {
|
|
5
|
+
run_ending,
|
|
6
|
+
UNREADABLE_VERDICT,
|
|
7
|
+
type EndingDecision,
|
|
8
|
+
type EndingRequest,
|
|
9
|
+
} from './run-ending'
|
|
10
|
+
import { run_issue_number } from './run-issue-number'
|
|
11
|
+
|
|
12
|
+
// `josh run:ending <N> --output <path> [--repo <owner/repo>]` — one verdict about how the dispatched
|
|
13
|
+
// lane child running `<N>` ended (joshuafolkken/kit#2139).
|
|
14
|
+
//
|
|
15
|
+
// The stdout/stderr split is the contract `run:liveness` and `run:hold` keep: exactly one verdict
|
|
16
|
+
// token on stdout on every path, the reason and the basis on stderr. `unreadable` exits non-zero,
|
|
17
|
+
// because a caller that could not read a trace must not act as though it had classified the ending.
|
|
18
|
+
|
|
19
|
+
const SUCCESS_EXIT_CODE = 0
|
|
20
|
+
const FAILURE_EXIT_CODE = 1
|
|
21
|
+
const ARGV_OFFSET = 2
|
|
22
|
+
const USAGE = 'Usage: josh run:ending <issue-number> --output <path> [--repo <owner/repo>]'
|
|
23
|
+
|
|
24
|
+
function report(decision: EndingDecision): number {
|
|
25
|
+
console.error(`${decision.reason}\n${decision.evidence}`)
|
|
26
|
+
console.info(decision.verdict)
|
|
27
|
+
|
|
28
|
+
return decision.verdict === UNREADABLE_VERDICT ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// A read that threw is the same answer as a trace that could not be read, printed as the verdict a
|
|
32
|
+
// caller can branch on rather than as a stack trace.
|
|
33
|
+
function report_unreadable(reason: string): number {
|
|
34
|
+
console.error(reason)
|
|
35
|
+
console.info(UNREADABLE_VERDICT)
|
|
36
|
+
|
|
37
|
+
return FAILURE_EXIT_CODE
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function report_usage(): number {
|
|
41
|
+
console.error(USAGE)
|
|
42
|
+
|
|
43
|
+
return FAILURE_EXIT_CODE
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const OPTIONS = {
|
|
47
|
+
output: { type: 'string' },
|
|
48
|
+
repo: { type: 'string' },
|
|
49
|
+
} as const
|
|
50
|
+
|
|
51
|
+
type ParsedValues = Partial<Record<keyof typeof OPTIONS, string>>
|
|
52
|
+
|
|
53
|
+
interface ParsedArguments {
|
|
54
|
+
positionals: ReadonlyArray<string>
|
|
55
|
+
values: ParsedValues
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function read_arguments(argv: ReadonlyArray<string>): ParsedArguments | undefined {
|
|
59
|
+
try {
|
|
60
|
+
return parseArgs({ args: [...argv], options: OPTIONS, allowPositionals: true })
|
|
61
|
+
} catch {
|
|
62
|
+
return undefined
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function is_valid(parsed: ParsedArguments): boolean {
|
|
67
|
+
return (
|
|
68
|
+
parsed.positionals.length === 1 &&
|
|
69
|
+
run_issue_number.ISSUE_NUMBER_PATTERN.test(parsed.positionals[0] ?? '') &&
|
|
70
|
+
parsed.values.output !== undefined
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Reached only through `is_valid`, so the fallbacks are unreachable defaults rather than behavior.
|
|
75
|
+
function to_request(parsed: ParsedArguments): EndingRequest {
|
|
76
|
+
return {
|
|
77
|
+
issue: parsed.positionals[0] ?? '',
|
|
78
|
+
output_path: parsed.values.output ?? '',
|
|
79
|
+
...(parsed.values.repo !== undefined && { repo: parsed.values.repo }),
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function parse_request(argv: ReadonlyArray<string>): EndingRequest | undefined {
|
|
84
|
+
const parsed = read_arguments(argv)
|
|
85
|
+
|
|
86
|
+
if (parsed === undefined || !is_valid(parsed)) return undefined
|
|
87
|
+
|
|
88
|
+
return to_request(parsed)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
92
|
+
const request = parse_request(argv)
|
|
93
|
+
|
|
94
|
+
if (request === undefined) return report_usage()
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
return report(await run_ending.check(request))
|
|
98
|
+
} catch (error) {
|
|
99
|
+
return report_unreadable(error instanceof Error ? error.message : String(error))
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
104
|
+
process.exitCode = await run(argv)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const run_ending_cli = { USAGE, main, parse_request, run }
|
|
108
|
+
|
|
109
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
110
|
+
|
|
111
|
+
export { run_ending_cli }
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
2
|
+
import { agent_exit_record } from '#scripts/agent/agent-exit-record'
|
|
3
|
+
import { api_outage } from '#scripts/agent/api-outage'
|
|
4
|
+
import type { ClaudeResultEvent } from '#scripts/agent/claude-result-event'
|
|
5
|
+
import { git_gh_issue_read } from '#scripts/git/git-gh-issue-read'
|
|
6
|
+
import { issue_state } from '#scripts/issue/issue-state'
|
|
7
|
+
import { run_cut } from './run-cut'
|
|
8
|
+
import { run_hold } from './run-hold'
|
|
9
|
+
import { run_issue_number } from './run-issue-number'
|
|
10
|
+
import { run_liveness } from './run-liveness'
|
|
11
|
+
|
|
12
|
+
// `josh run:ending <N>` — how a dispatched lane child *ended*, not whether it is still moving
|
|
13
|
+
// (joshuafolkken/kit#2139). `run:liveness` answers "still working, or stopped?"; a normally-exited
|
|
14
|
+
// child that stopped mid-implementation is invisible to it — the output freezes exactly as a
|
|
15
|
+
// completed child's does, and `is_error: false` looks like success. Measured on 2026-09-19: the child
|
|
16
|
+
// for joshuafolkken/kit#2118 ended `subtype: success`, left three uncommitted files, opened no PR, and
|
|
17
|
+
// `run:cut --resume` answered `fresh` — a mid-implementation exit that read as a clean finish, and the
|
|
18
|
+
// cause took a person opening 875KB of JSONL to find.
|
|
19
|
+
//
|
|
20
|
+
// **The verdict is read from three traces the child leaves behind, never from `is_error`.** A cut
|
|
21
|
+
// record for this issue means it handed off; a CLOSED Issue means it completed and merged; an OPEN
|
|
22
|
+
// Issue with no cut means it ended in the middle. The exit record's own `is_error: false` is *not* a
|
|
23
|
+
// completion — completion is the CLOSED Issue — which is the one distinction that was missing. The exit
|
|
24
|
+
// record is read for the *basis* the park comment carries: which fields said so, and how many tool
|
|
25
|
+
// calls the harness refused (`permission_denials`, the direct cause of the 2118 stop).
|
|
26
|
+
//
|
|
27
|
+
// **The words are a different question from `run:liveness`'s four**, deliberately non-overlapping:
|
|
28
|
+
// `merged` / `cut` / `outage` / `abandoned` / `unreadable` answer "how did it end", where `alive` /
|
|
29
|
+
// `stopped` / `settled` / `undetermined` answer "is it still going".
|
|
30
|
+
//
|
|
31
|
+
// **`outage` splits the mid-implementation ending in two** (joshuafolkken/kit#2240). A child that ended
|
|
32
|
+
// mid-implementation because it could not reach the API is not a child that stalled on its own: the
|
|
33
|
+
// exit record carries a transport-failure signature, read mechanically by `api-outage.ts`. The parent
|
|
34
|
+
// reads it to leave the outage child re-dispatchable rather than parking it and counting it against
|
|
35
|
+
// the consecutive-failure guard, which is meant to notice the environment — not to be tripped by it.
|
|
36
|
+
|
|
37
|
+
const MERGED_VERDICT = 'merged'
|
|
38
|
+
const CUT_VERDICT = 'cut'
|
|
39
|
+
const OUTAGE_VERDICT = 'outage'
|
|
40
|
+
const ABANDONED_VERDICT = 'abandoned'
|
|
41
|
+
const UNREADABLE_VERDICT = 'unreadable'
|
|
42
|
+
|
|
43
|
+
type EndingVerdict =
|
|
44
|
+
| typeof MERGED_VERDICT
|
|
45
|
+
| typeof CUT_VERDICT
|
|
46
|
+
| typeof OUTAGE_VERDICT
|
|
47
|
+
| typeof ABANDONED_VERDICT
|
|
48
|
+
| typeof UNREADABLE_VERDICT
|
|
49
|
+
|
|
50
|
+
// `state` alone answers the merged-vs-open question; the labels a settled child carries are
|
|
51
|
+
// `run:liveness`'s concern, not this one. gh's `--json` casing is upper, so the compare is against
|
|
52
|
+
// `CLOSED`, the same spelling `run-liveness.ts` reads `OPEN` in.
|
|
53
|
+
const STATE_FIELD = 'state'
|
|
54
|
+
const CLOSED_STATE = 'CLOSED'
|
|
55
|
+
|
|
56
|
+
const EXIT_UNREADABLE = 'exit record unreadable'
|
|
57
|
+
|
|
58
|
+
interface EndingTraces {
|
|
59
|
+
exit_record: ClaudeResultEvent | undefined
|
|
60
|
+
is_child_closed: boolean | undefined
|
|
61
|
+
is_cut_taken: boolean
|
|
62
|
+
is_tree_dirty: boolean
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
interface EndingDecision {
|
|
66
|
+
evidence: string
|
|
67
|
+
reason: string
|
|
68
|
+
verdict: EndingVerdict
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
interface EndingRequest {
|
|
72
|
+
issue: string
|
|
73
|
+
output_path: string
|
|
74
|
+
repo?: string
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const REASONS: Record<EndingVerdict, string> = {
|
|
78
|
+
[MERGED_VERDICT]: 'The child ran to completion: its Issue is CLOSED.',
|
|
79
|
+
[CUT_VERDICT]:
|
|
80
|
+
'The child took a cut and handed the run to a successor: a cut record for this issue is carried.',
|
|
81
|
+
[OUTAGE_VERDICT]:
|
|
82
|
+
'The child could not reach the API: its exit record ended in error on a transport-failure signature. Do not count it against the consecutive-failure guard — the environment, not the child, is at fault.',
|
|
83
|
+
[ABANDONED_VERDICT]:
|
|
84
|
+
'The child ended mid-implementation without a cut: its Issue is OPEN and no cut was recorded. A normal exit code does not make this a completion.',
|
|
85
|
+
[UNREADABLE_VERDICT]:
|
|
86
|
+
'A trace could not be read — the Issue state or the exit record — so how the child ended cannot be told.',
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// The mid-implementation ending, split by whether the exit record could not reach the API. A missing
|
|
90
|
+
// record is unreadable; an outage record is `outage`; anything else is `abandoned`.
|
|
91
|
+
function mid_implementation_verdict(record: ClaudeResultEvent | undefined): EndingVerdict {
|
|
92
|
+
if (record === undefined) return UNREADABLE_VERDICT
|
|
93
|
+
|
|
94
|
+
return api_outage.is_outage(record) ? OUTAGE_VERDICT : ABANDONED_VERDICT
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// The verdict never consults `is_error` for completion: a child that exits `is_error: false` while its
|
|
98
|
+
// Issue is still OPEN and uncut is `abandoned`, not `merged` — the exact confusion this command
|
|
99
|
+
// removes. `is_error` is read only inside the outage split, where a transport failure ends in error.
|
|
100
|
+
function verdict_of(traces: EndingTraces): EndingVerdict {
|
|
101
|
+
if (traces.is_cut_taken) return CUT_VERDICT
|
|
102
|
+
if (traces.is_child_closed === undefined) return UNREADABLE_VERDICT
|
|
103
|
+
if (traces.is_child_closed) return MERGED_VERDICT
|
|
104
|
+
|
|
105
|
+
return mid_implementation_verdict(traces.exit_record)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function describe_exit(record: ClaudeResultEvent): string {
|
|
109
|
+
const number_turns = record.num_turns === undefined ? 'unknown' : String(record.num_turns)
|
|
110
|
+
|
|
111
|
+
return `exit record: subtype=${record.subtype ?? 'unknown'}, is_error=${String(record.is_error)}, num_turns=${number_turns}, permission_denials=${String(record.permission_denials)}`
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// The refused interactive ask, as a clause the park comment can carry the question and options in — or
|
|
115
|
+
// empty when the child asked nothing (joshuafolkken/kit#2201). This is the backstop for a child that
|
|
116
|
+
// slipped past the `PreToolUse` refusal: the question is stranded in the exit record's
|
|
117
|
+
// `permission_denials`, and lifting it here spares the parent opening the JSONL by hand.
|
|
118
|
+
function refused_ask_clause(record: ClaudeResultEvent | undefined): string {
|
|
119
|
+
const ask = record?.refused_ask
|
|
120
|
+
|
|
121
|
+
return ask === undefined ? '' : ` the refused interactive ask was — ${ask};`
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// The basis the park comment carries: which exit-record fields were read, the count of refused tool
|
|
125
|
+
// calls, any refused interactive ask, and whether uncommitted work is still on disk for the parent to
|
|
126
|
+
// stash.
|
|
127
|
+
function abandoned_evidence(traces: EndingTraces): string {
|
|
128
|
+
const record =
|
|
129
|
+
traces.exit_record === undefined ? EXIT_UNREADABLE : describe_exit(traces.exit_record)
|
|
130
|
+
const ask = refused_ask_clause(traces.exit_record)
|
|
131
|
+
const tree = traces.is_tree_dirty ? 'uncommitted work remains' : 'the tree is clean'
|
|
132
|
+
|
|
133
|
+
return `${record};${ask} the Issue is OPEN and no cut was recorded (${tree}), so the child ended mid-implementation — include this basis in the park comment.`
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// The basis an outage verdict carries: the exit-record fields, and the transport-failure signature the
|
|
137
|
+
// reason matched, so a person sees why it was read as the environment failing rather than the child.
|
|
138
|
+
function outage_evidence(record: ClaudeResultEvent | undefined): string {
|
|
139
|
+
if (record === undefined) return EXIT_UNREADABLE
|
|
140
|
+
|
|
141
|
+
const marker = api_outage.outage_marker(record)
|
|
142
|
+
|
|
143
|
+
return `${describe_exit(record)}; the exit record ended in error on a transport-failure signature (${marker ?? 'unknown'}), so the child never reached the API.`
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function evidence_of(verdict: EndingVerdict, traces: EndingTraces): string {
|
|
147
|
+
if (verdict === ABANDONED_VERDICT) return abandoned_evidence(traces)
|
|
148
|
+
if (verdict === OUTAGE_VERDICT) return outage_evidence(traces.exit_record)
|
|
149
|
+
|
|
150
|
+
return traces.exit_record === undefined ? EXIT_UNREADABLE : describe_exit(traces.exit_record)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function decide(traces: EndingTraces): EndingDecision {
|
|
154
|
+
const verdict = verdict_of(traces)
|
|
155
|
+
|
|
156
|
+
return { evidence: evidence_of(verdict, traces), reason: REASONS[verdict], verdict }
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// CLOSED is completion; anything else is OPEN as far as this command cares. A read that produced
|
|
160
|
+
// nothing — an unreachable API, a body that is not a state report — is `undefined`, which the verdict
|
|
161
|
+
// reads as unreadable rather than guessing OPEN and reporting a completed child as abandoned.
|
|
162
|
+
async function read_child_closed(issue: string, repo?: string): Promise<boolean | undefined> {
|
|
163
|
+
const json = await git_gh_issue_read.issue_view_json(issue, STATE_FIELD, repo)
|
|
164
|
+
|
|
165
|
+
if (json === undefined) return undefined
|
|
166
|
+
|
|
167
|
+
const state = issue_state.parse_issue_state(json)
|
|
168
|
+
|
|
169
|
+
return state === undefined ? undefined : state.state === CLOSED_STATE
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// The non-mutating read behind `run:cut --resume`'s `fresh` / `resume` answer: a carried cut record
|
|
173
|
+
// naming this issue's invocation means the child handed off. `--resume` itself is not called — it
|
|
174
|
+
// adopts the cut and spends the hand-off, which a read-only classifier must not do. An expired record
|
|
175
|
+
// is a hand-off no successor took, so it is not read as a live cut and falls through to the OPEN case.
|
|
176
|
+
async function read_cut_taken(issue: string): Promise<boolean> {
|
|
177
|
+
const directory = await run_cut.worktree_directory()
|
|
178
|
+
|
|
179
|
+
if (directory === undefined) return false
|
|
180
|
+
|
|
181
|
+
const read = run_cut.read_cut(run_cut.cut_path(directory))
|
|
182
|
+
|
|
183
|
+
return read.kind === 'carried' && read.cut.invocation === run_cut.invocation_for(issue)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function read_exit(output_path: string): ClaudeResultEvent | undefined {
|
|
187
|
+
const safe_path = run_liveness.to_safe_path(output_path)
|
|
188
|
+
|
|
189
|
+
if (safe_path === undefined) return undefined
|
|
190
|
+
|
|
191
|
+
try {
|
|
192
|
+
// Validated by `run_liveness.to_safe_path` — normalized, required absolute, confined to the
|
|
193
|
+
// allowed roots — the same check `josh lane:output` gates a transcript path with, reused rather
|
|
194
|
+
// than re-spelled so the two cannot disagree.
|
|
195
|
+
return agent_exit_record.read_exit_record(readFileSync(safe_path, 'utf8')) // NOSONAR
|
|
196
|
+
} catch {
|
|
197
|
+
return undefined
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
async function read_traces(request: EndingRequest): Promise<EndingTraces> {
|
|
202
|
+
const [is_child_closed, is_cut_taken, is_tree_dirty] = await Promise.all([
|
|
203
|
+
read_child_closed(request.issue, request.repo),
|
|
204
|
+
read_cut_taken(request.issue),
|
|
205
|
+
run_hold.is_tree_dirty(),
|
|
206
|
+
])
|
|
207
|
+
|
|
208
|
+
return {
|
|
209
|
+
exit_record: read_exit(request.output_path),
|
|
210
|
+
is_child_closed,
|
|
211
|
+
is_cut_taken,
|
|
212
|
+
is_tree_dirty,
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
async function check(request: EndingRequest): Promise<EndingDecision> {
|
|
217
|
+
run_issue_number.require_issue_number(request.issue)
|
|
218
|
+
|
|
219
|
+
return decide(await read_traces(request))
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const run_ending = {
|
|
223
|
+
check,
|
|
224
|
+
decide,
|
|
225
|
+
describe_exit,
|
|
226
|
+
read_child_closed,
|
|
227
|
+
read_cut_taken,
|
|
228
|
+
read_exit,
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export type { EndingDecision, EndingRequest, EndingTraces, EndingVerdict }
|
|
232
|
+
export {
|
|
233
|
+
ABANDONED_VERDICT,
|
|
234
|
+
CUT_VERDICT,
|
|
235
|
+
MERGED_VERDICT,
|
|
236
|
+
OUTAGE_VERDICT,
|
|
237
|
+
run_ending,
|
|
238
|
+
UNREADABLE_VERDICT,
|
|
239
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { josh_command } from '#scripts/josh/josh-run'
|
|
4
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
5
|
+
import { run_entry, type EntryParts } from './run-entry'
|
|
6
|
+
import { run_hold_cli } from './run-hold-cli'
|
|
7
|
+
import { run_next } from './run-next'
|
|
8
|
+
import { run_prep } from './run-prep'
|
|
9
|
+
import { run_prep_cli } from './run-prep-cli'
|
|
10
|
+
import { run_step } from './run-step'
|
|
11
|
+
|
|
12
|
+
// `josh run:entry <N>` — one call for the fixed entry sequence a lane opens on (joshuafolkken/kit#2372).
|
|
13
|
+
// The loop used to spend a round trip on `run:hold`, one on `cost --cut`, one on `run:prep` and one on
|
|
14
|
+
// `run:step`, re-billing a lane's full context each time; this runs all four internally and prints one
|
|
15
|
+
// composite report, the same way `backlog:offer` folds `backlog:next` → `backlog:budget` and `run:prep`
|
|
16
|
+
// folds three reads.
|
|
17
|
+
//
|
|
18
|
+
// **The stops short-circuit.** A `busy` / `unknown` hold and an `over` budget both end the run, so the
|
|
19
|
+
// composite reports them without reading the issue — the gate `fullrun.md` steps 1 and 3 stop on stays a
|
|
20
|
+
// gate, decided from the token rather than a sentence. `cost --cut` is skipped in a dispatched lane
|
|
21
|
+
// child, where the parent owns the budget question — the same lane-aware skip `run:prep` makes for
|
|
22
|
+
// `latest`.
|
|
23
|
+
|
|
24
|
+
const ARGV_OFFSET = 2
|
|
25
|
+
const SUCCESS_EXIT_CODE = 0
|
|
26
|
+
const FAILURE_EXIT_CODE = 1
|
|
27
|
+
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
28
|
+
const USAGE = 'Usage: josh run:entry <issue-number>'
|
|
29
|
+
const should_forward_stderr = true
|
|
30
|
+
const NEWLINE = '\n'
|
|
31
|
+
|
|
32
|
+
const HOLD_STOP_NOTE =
|
|
33
|
+
'(tree not held — see the reason above; clean up and retry, or release with `pnpm josh run:release`)'
|
|
34
|
+
const COST_STOP_NOTE = '(session budget spent — see the figure above; resume in a fresh session)'
|
|
35
|
+
|
|
36
|
+
// Exactly one issue number, or the call is refused — `run:entry` opens one run, and a second number
|
|
37
|
+
// would claim and read a second issue a caller reads as this one's.
|
|
38
|
+
function parse_number(argv: ReadonlyArray<string>): string | undefined {
|
|
39
|
+
const [first] = argv
|
|
40
|
+
|
|
41
|
+
if (first === undefined || argv.length !== 1 || !ISSUE_NUMBER_PATTERN.test(first)) {
|
|
42
|
+
return undefined
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return first
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function first_line(out: string): string {
|
|
49
|
+
return out.split(NEWLINE)[0] ?? ''
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// `run:hold <N>` prints one token — `hold`, `busy` or `unknown` — and forwards its explanation to
|
|
53
|
+
// stderr, so the composite branches on the token and the reader still sees why.
|
|
54
|
+
async function claim_hold(issue_number: string): Promise<string> {
|
|
55
|
+
const held = await josh_command.josh_run(['run:hold', issue_number], should_forward_stderr)
|
|
56
|
+
|
|
57
|
+
return first_line(held.out)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// A dispatched lane child never asks the session boundary — the parent owns it once per session
|
|
61
|
+
// (`backlogrun-progress.md` → "The hand-off") — so this records `skipped` rather than reading a budget
|
|
62
|
+
// nothing in the lane acts on, the same shape `run:prep` skips `latest` in a lane.
|
|
63
|
+
async function check_cost(): Promise<string> {
|
|
64
|
+
if (lane_child_marker.is_child_of(process.cwd())) return run_entry.COST_SKIPPED
|
|
65
|
+
|
|
66
|
+
const cut = await josh_command.josh_run(['cost', '--cut'], should_forward_stderr)
|
|
67
|
+
|
|
68
|
+
return first_line(cut.out)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
interface Reads {
|
|
72
|
+
report: string
|
|
73
|
+
verdict: string
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// The issue reads and the pre-implementation verdict, from the one gather `run:prep` and `run:next`
|
|
77
|
+
// already share (joshuafolkken/kit#2188) rather than a second copy — the report is `run:prep`'s
|
|
78
|
+
// formatter, the verdict is `run:step`'s `pre_verdict` over the same parts.
|
|
79
|
+
async function gather_reads(issue_number: string): Promise<Reads> {
|
|
80
|
+
const reads = await run_prep_cli.gather(issue_number)
|
|
81
|
+
const parts = run_prep_cli.to_parts(issue_number, reads)
|
|
82
|
+
const verdict = run_step.pre_verdict(run_next.to_input(parts))
|
|
83
|
+
|
|
84
|
+
return { report: run_prep.format_report(parts), verdict }
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function emit(parts: EntryParts): number {
|
|
88
|
+
console.info(run_entry.format_report(parts))
|
|
89
|
+
|
|
90
|
+
return run_entry.exit_code(parts)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// The summary of a run that stopped before it read the issue: the token that stopped it, no verdict,
|
|
94
|
+
// and the note that stands in for the report body.
|
|
95
|
+
function stop_report(issue_number: string, hold: string, cost: string, report: string): number {
|
|
96
|
+
return emit({ issue_number, hold, cost, verdict: run_entry.NO_VERDICT, report })
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function open_run(issue_number: string): Promise<number> {
|
|
100
|
+
const hold = await claim_hold(issue_number)
|
|
101
|
+
|
|
102
|
+
if (hold !== run_hold_cli.HOLD_VERDICT) {
|
|
103
|
+
return stop_report(issue_number, hold, run_entry.COST_SKIPPED, HOLD_STOP_NOTE)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const cost = await check_cost()
|
|
107
|
+
|
|
108
|
+
if (cost === run_entry.COST_OVER) return stop_report(issue_number, hold, cost, COST_STOP_NOTE)
|
|
109
|
+
|
|
110
|
+
const reads = await gather_reads(issue_number)
|
|
111
|
+
|
|
112
|
+
return emit({ issue_number, hold, cost, verdict: reads.verdict, report: reads.report })
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
116
|
+
const issue_number = parse_number(argv)
|
|
117
|
+
|
|
118
|
+
if (issue_number === undefined) {
|
|
119
|
+
console.error(USAGE)
|
|
120
|
+
|
|
121
|
+
return FAILURE_EXIT_CODE
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return await open_run(issue_number)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
128
|
+
process.exitCode = await run(argv)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const run_entry_cli = { SUCCESS_EXIT_CODE, USAGE, check_cost, claim_hold, main, parse_number, run }
|
|
132
|
+
|
|
133
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
134
|
+
|
|
135
|
+
export { run_entry_cli }
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { run_hold_cli } from './run-hold-cli'
|
|
2
|
+
import { run_step } from './run-step'
|
|
3
|
+
|
|
4
|
+
// `josh run:entry <N>` — the one call a `fullrun` makes to open a run (joshuafolkken/kit#2372). It
|
|
5
|
+
// folds the fixed entry sequence a lane spends four separate round trips on — claim the tree
|
|
6
|
+
// (`run:hold`), read the session budget (`cost --cut`), gather the issue reads (`run:prep`), and decide
|
|
7
|
+
// the pre-implementation step (`run:step`) — into one composite, the same shape `backlog:offer` folded
|
|
8
|
+
// the parent loop head on (joshuafolkken/kit#2162). Context cost grows with the square of a lane's
|
|
9
|
+
// round trips, so collapsing four into one is where the fold pays the most.
|
|
10
|
+
//
|
|
11
|
+
// **This module is the pure half**, kept apart from the chaining CLI the way `run-prep.ts` is kept from
|
|
12
|
+
// `run-prep-cli.ts` and `run-review.ts` from its steps. It shapes the summary line the reader branches
|
|
13
|
+
// on, and answers the two things a test must pin without a hold ever being written or a session ever
|
|
14
|
+
// read: the exit code the loop reads, and whether the run may proceed to implement.
|
|
15
|
+
|
|
16
|
+
const SUMMARY_PREFIX = 'entry #'
|
|
17
|
+
const SUMMARY_DASH = ' — '
|
|
18
|
+
const FIELD_SEPARATOR = ' · '
|
|
19
|
+
const HOLD_LABEL = 'hold: '
|
|
20
|
+
const COST_LABEL = 'cost: '
|
|
21
|
+
const VERDICT_LABEL = 'verdict: '
|
|
22
|
+
const SECTION_SEPARATOR = '\n\n'
|
|
23
|
+
|
|
24
|
+
// The three cost verdicts this composite reads: the two `cost --cut` prints on its first line, and the
|
|
25
|
+
// stand-in a dispatched lane child records when the parent owns the budget question and this skips it.
|
|
26
|
+
const COST_UNDER = 'under'
|
|
27
|
+
const COST_OVER = 'over'
|
|
28
|
+
const COST_SKIPPED = 'skipped'
|
|
29
|
+
|
|
30
|
+
// The placeholder verdict for a summary printed before the pre-implementation step was reached — a
|
|
31
|
+
// short-circuit on a `busy` hold or an `over` budget prints the summary without a `run:step` answer.
|
|
32
|
+
const NO_VERDICT = '-'
|
|
33
|
+
|
|
34
|
+
const SUCCESS_EXIT_CODE = 0
|
|
35
|
+
const FAILURE_EXIT_CODE = 1
|
|
36
|
+
|
|
37
|
+
interface EntryParts {
|
|
38
|
+
issue_number: string
|
|
39
|
+
// `run:hold`'s single token — `hold`, `busy` or `unknown`.
|
|
40
|
+
hold: string
|
|
41
|
+
// `cost --cut`'s first-line verdict, or `skipped` in a lane child.
|
|
42
|
+
cost: string
|
|
43
|
+
// `run:step`'s pre-implementation verdict, or `-` when a stop short-circuited before it.
|
|
44
|
+
verdict: string
|
|
45
|
+
// The `run:prep` report body, or the one-line note that stands in for it on a short-circuit.
|
|
46
|
+
report: string
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// The leading line carries the three facts a run branches on — did the tree claim, is the budget
|
|
50
|
+
// spent, and which flow the pre-implementation step names — so the decision is read off the first line
|
|
51
|
+
// without parsing the report below it, exactly as `run:prep`'s own summary does.
|
|
52
|
+
function summary(parts: EntryParts): string {
|
|
53
|
+
const fields = [
|
|
54
|
+
`${HOLD_LABEL}${parts.hold}`,
|
|
55
|
+
`${COST_LABEL}${parts.cost}`,
|
|
56
|
+
`${VERDICT_LABEL}${parts.verdict}`,
|
|
57
|
+
]
|
|
58
|
+
|
|
59
|
+
return `${SUMMARY_PREFIX}${parts.issue_number}${SUMMARY_DASH}${fields.join(FIELD_SEPARATOR)}`
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function format_report(parts: EntryParts): string {
|
|
63
|
+
return [summary(parts), parts.report].join(SECTION_SEPARATOR)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// The tree must be held and the budget not spent, or the run stops before it reads anything else — the
|
|
67
|
+
// two gates `fullrun.md` steps 1 and 3 stop on, decided from the tokens rather than from a sentence.
|
|
68
|
+
function can_proceed(hold: string, cost: string): boolean {
|
|
69
|
+
return hold === run_hold_cli.HOLD_VERDICT && cost !== COST_OVER
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Non-zero when the run cannot proceed to its flow: a tree not held, a spent budget, or a state the
|
|
73
|
+
// reads could not resolve (`unknown`). A readable `update-deps`, `human-review` or `already-done`
|
|
74
|
+
// verdict is a flow the reader routes on, not a failure, so it exits zero — the same contract
|
|
75
|
+
// `run:prep` keeps, where a bundled read that succeeded exits zero whatever the state says.
|
|
76
|
+
function exit_code(parts: EntryParts): number {
|
|
77
|
+
const is_ok = can_proceed(parts.hold, parts.cost) && parts.verdict !== run_step.UNKNOWN
|
|
78
|
+
|
|
79
|
+
return is_ok ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const run_entry = {
|
|
83
|
+
COST_OVER,
|
|
84
|
+
COST_SKIPPED,
|
|
85
|
+
COST_UNDER,
|
|
86
|
+
NO_VERDICT,
|
|
87
|
+
SUMMARY_PREFIX,
|
|
88
|
+
exit_code,
|
|
89
|
+
format_report,
|
|
90
|
+
can_proceed,
|
|
91
|
+
summary,
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export type { EntryParts }
|
|
95
|
+
export { run_entry }
|