@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,132 @@
|
|
|
1
|
+
import { parseArgs } from 'node:util'
|
|
2
|
+
import { run_issue_number } from './run-issue-number'
|
|
3
|
+
|
|
4
|
+
// `josh run:cut` turns its `argv` into one of four requests. The contract mirrors `run-carry-args.ts`:
|
|
5
|
+
// parsing lives here, acting on the record lives in `run-cut-cli.ts`, and a malformed command line is
|
|
6
|
+
// `undefined` rather than a guessed intent — a cut that ran on a misread flag would end a process at
|
|
7
|
+
// the wrong moment.
|
|
8
|
+
|
|
9
|
+
const USAGE =
|
|
10
|
+
'Usage: josh run:cut <issue> [--impl] [--handoff <path>] | --resume <issue> | --json | --end'
|
|
11
|
+
|
|
12
|
+
const OPTIONS = {
|
|
13
|
+
end: { type: 'boolean' },
|
|
14
|
+
// The path to the handoff file the cut carries — the run's instruction and work state
|
|
15
|
+
// (joshuafolkken/kit#2354). A value rather than a boolean: the body is passed by path, never inlined
|
|
16
|
+
// on the command line, so a backtick or `$` in the instruction is not executed. It modifies the bare
|
|
17
|
+
// cut like `--impl`, so it is refused only when paired with a mode that asks about a cut.
|
|
18
|
+
handoff: { type: 'string' },
|
|
19
|
+
// The implementation-phase cut (joshuafolkken/kit#1933). It modifies the bare cut rather than being
|
|
20
|
+
// a mode of its own — `run:cut --impl <issue>` still takes a cut — so it is refused only when it is
|
|
21
|
+
// paired with `--resume`, `--json` or `--end`, which ask about a cut rather than take one.
|
|
22
|
+
impl: { type: 'boolean' },
|
|
23
|
+
json: { type: 'boolean' },
|
|
24
|
+
resume: { type: 'boolean' },
|
|
25
|
+
} as const
|
|
26
|
+
|
|
27
|
+
interface ParsedValues {
|
|
28
|
+
values: {
|
|
29
|
+
end?: boolean
|
|
30
|
+
handoff?: string
|
|
31
|
+
impl?: boolean
|
|
32
|
+
json?: boolean
|
|
33
|
+
resume?: boolean
|
|
34
|
+
}
|
|
35
|
+
positionals: ReadonlyArray<string>
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
type Request =
|
|
39
|
+
| {
|
|
40
|
+
kind: 'cut'
|
|
41
|
+
issue: string
|
|
42
|
+
is_implementation: boolean
|
|
43
|
+
handoff_path?: string | undefined
|
|
44
|
+
}
|
|
45
|
+
| { kind: 'resume'; issue: string }
|
|
46
|
+
| { kind: 'read' }
|
|
47
|
+
| { kind: 'end' }
|
|
48
|
+
|
|
49
|
+
function read_arguments(argv: ReadonlyArray<string>): ParsedValues | undefined {
|
|
50
|
+
try {
|
|
51
|
+
const parsed = parseArgs({
|
|
52
|
+
args: [...argv],
|
|
53
|
+
options: OPTIONS,
|
|
54
|
+
strict: true,
|
|
55
|
+
allowPositionals: true,
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
return { values: parsed.values, positionals: parsed.positionals }
|
|
59
|
+
} catch {
|
|
60
|
+
return undefined
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// The issue is the sole positional, and it must be a real issue number: a cut relaunches
|
|
65
|
+
// `fullrun #<issue>`, so a value that skipped validation would reach a detached agent invocation.
|
|
66
|
+
function issue_of(positionals: ReadonlyArray<string>): string | undefined {
|
|
67
|
+
const [issue] = positionals
|
|
68
|
+
|
|
69
|
+
if (issue === undefined) return undefined
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
run_issue_number.require_issue_number(issue)
|
|
73
|
+
} catch {
|
|
74
|
+
return undefined
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return issue
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// The mode flags are mutually exclusive; more than one is a refusal rather than a precedence order
|
|
81
|
+
// the caller has to remember. `--impl` and `--handoff` are not modes — they modify the bare cut — so
|
|
82
|
+
// each is refused only when it accompanies one of the three that ask about a cut rather than take one.
|
|
83
|
+
// `--handoff` pairs freely with `--impl`: it carries the instruction the cut records.
|
|
84
|
+
function is_single_mode(values: ParsedValues['values']): boolean {
|
|
85
|
+
const modes = [values.end, values.json, values.resume].filter(Boolean)
|
|
86
|
+
|
|
87
|
+
if (modes.length > 1) return false
|
|
88
|
+
|
|
89
|
+
const has_cut_modifier = values.impl === true || values.handoff !== undefined
|
|
90
|
+
|
|
91
|
+
return !(has_cut_modifier && modes.length > 0)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// What a cut carries beyond its issue: whether `--impl` named the implementation boundary rather than
|
|
95
|
+
// the pre-gate one, and the `--handoff` path for the instruction it carries. A resume needs none of it.
|
|
96
|
+
interface CutExtras {
|
|
97
|
+
is_implementation: boolean
|
|
98
|
+
handoff_path?: string | undefined
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// The cut and the resume both take the sole positional issue; the cut also carries its extras.
|
|
102
|
+
function issue_request(
|
|
103
|
+
kind: 'cut' | 'resume',
|
|
104
|
+
positionals: ReadonlyArray<string>,
|
|
105
|
+
extras: CutExtras,
|
|
106
|
+
): Request | undefined {
|
|
107
|
+
const issue = issue_of(positionals)
|
|
108
|
+
|
|
109
|
+
if (issue === undefined) return undefined
|
|
110
|
+
|
|
111
|
+
return kind === 'resume' ? { kind: 'resume', issue } : { kind: 'cut', issue, ...extras }
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function to_request(parsed: ParsedValues): Request | undefined {
|
|
115
|
+
if (!is_single_mode(parsed.values)) return undefined
|
|
116
|
+
|
|
117
|
+
if (parsed.values.end === true) return { kind: 'end' }
|
|
118
|
+
|
|
119
|
+
if (parsed.values.json === true) return { kind: 'read' }
|
|
120
|
+
|
|
121
|
+
const kind = parsed.values.resume === true ? 'resume' : 'cut'
|
|
122
|
+
|
|
123
|
+
return issue_request(kind, parsed.positionals, {
|
|
124
|
+
is_implementation: parsed.values.impl === true,
|
|
125
|
+
handoff_path: parsed.values.handoff,
|
|
126
|
+
})
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const run_cut_args = { USAGE, issue_of, read_arguments, to_request }
|
|
130
|
+
|
|
131
|
+
export type { Request }
|
|
132
|
+
export { run_cut_args }
|
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { cost_cli } from '#scripts/cost-runtime/cost-cli'
|
|
4
|
+
import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
|
|
5
|
+
import { git_command } from '#scripts/git/git-command'
|
|
6
|
+
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
7
|
+
import { lane_relaunch } from '#scripts/lane/lane-relaunch'
|
|
8
|
+
import { openai_lane_supervisor } from '#scripts/lane/openai-lane-supervisor'
|
|
9
|
+
import { run_cut, type CutState, type RunCut } from './run-cut'
|
|
10
|
+
import { run_cut_args, type Request } from './run-cut-args'
|
|
11
|
+
import { run_cut_handoff } from './run-cut-handoff'
|
|
12
|
+
import { run_event_stream } from './run-event-stream'
|
|
13
|
+
import { run_event_stream_emit } from './run-event-stream-emit'
|
|
14
|
+
|
|
15
|
+
// `josh run:cut` — the record that lets a lane child end its process before the gate and a fresh one
|
|
16
|
+
// resume from it (joshuafolkken/kit#1839). `run:cut <N>` writes the record and relaunches a fresh
|
|
17
|
+
// `fullrun #<N>`; the fresh process runs `run:cut --resume <N>` at its entry, which verifies the tree
|
|
18
|
+
// against the record and hands the run on to the gate. **Turning `argv` into a request is
|
|
19
|
+
// `run-cut-args.ts`'s**; what is here acts on the record and relaunches.
|
|
20
|
+
//
|
|
21
|
+
// The contract is `run:hold`'s and `run:carry`'s: **standard output carries exactly one token** and
|
|
22
|
+
// every explanation goes to standard error, so a loop can branch on `answer=$(pnpm josh run:cut 12)`.
|
|
23
|
+
// `--json` is the one exception, and it is still one line: the whole record has to reach a resuming
|
|
24
|
+
// session.
|
|
25
|
+
|
|
26
|
+
const ARGV_OFFSET = 2
|
|
27
|
+
const SUCCESS_EXIT_CODE = 0
|
|
28
|
+
const FAILURE_EXIT_CODE = 1
|
|
29
|
+
|
|
30
|
+
const CUT_VERDICT = 'cut'
|
|
31
|
+
const RESUME_VERDICT = 'resume'
|
|
32
|
+
// An implementation-phase resume: the fresh process continues implementing rather than going to the
|
|
33
|
+
// gate (joshuafolkken/kit#1933). It is a distinct token so the resuming child branches on it without
|
|
34
|
+
// re-reading the record.
|
|
35
|
+
const RESUME_IMPL_VERDICT = 'resume-impl'
|
|
36
|
+
const FRESH_VERDICT = 'fresh'
|
|
37
|
+
// The recent-window context is under the shared cut threshold, so the pre-gate cut was not worth its
|
|
38
|
+
// resume and nothing was cut (joshuafolkken/kit#2312). A benign, non-failing answer: the run carries
|
|
39
|
+
// on to the gate itself, exactly as `not-a-lane` does.
|
|
40
|
+
const UNDER_THRESHOLD_VERDICT = 'under-threshold'
|
|
41
|
+
const STALE_VERDICT = 'stale'
|
|
42
|
+
// The record matched the tree but carried no instruction to resume on, so the run was refused rather
|
|
43
|
+
// than continued blind to what it was told to do (joshuafolkken/kit#2354).
|
|
44
|
+
const INCOMPLETE_VERDICT = 'incomplete'
|
|
45
|
+
// The `--handoff` path was given but could not be read as a handoff, or was too large for the record;
|
|
46
|
+
// the cut is refused rather than taken without the instruction it was meant to carry.
|
|
47
|
+
const BAD_HANDOFF_VERDICT = 'bad-handoff'
|
|
48
|
+
const HANDED_OFF_VERDICT = 'handed-off'
|
|
49
|
+
const BUSY_VERDICT = 'busy'
|
|
50
|
+
const NOT_A_LANE_VERDICT = 'not-a-lane'
|
|
51
|
+
const UNREADY_VERDICT = 'unready'
|
|
52
|
+
const FAILED_VERDICT = 'failed'
|
|
53
|
+
const ENDED_VERDICT = 'ended'
|
|
54
|
+
const UNREADABLE_VERDICT = 'unreadable'
|
|
55
|
+
const UNKNOWN_VERDICT = 'unknown'
|
|
56
|
+
|
|
57
|
+
function report(verdict: string, code: number): number {
|
|
58
|
+
console.info(verdict)
|
|
59
|
+
|
|
60
|
+
return code
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function report_stale(cut_record: RunCut): number {
|
|
64
|
+
console.error(run_cut.stale_message(cut_record))
|
|
65
|
+
|
|
66
|
+
return report(STALE_VERDICT, FAILURE_EXIT_CODE)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function report_busy(cut_record: RunCut): number {
|
|
70
|
+
console.error(run_cut.busy_message(cut_record))
|
|
71
|
+
|
|
72
|
+
return report(BUSY_VERDICT, FAILURE_EXIT_CODE)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// The record matched the tree but carried no instruction; the run is refused rather than continued
|
|
76
|
+
// without what it was told to do (joshuafolkken/kit#2354).
|
|
77
|
+
function report_incomplete(cut_record: RunCut): number {
|
|
78
|
+
console.error(run_cut.incomplete_message(cut_record))
|
|
79
|
+
|
|
80
|
+
return report(INCOMPLETE_VERDICT, FAILURE_EXIT_CODE)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// The `--handoff` file parsed but the assembled record would not fit the byte bound — the scalar fields
|
|
84
|
+
// carry a handoff that fit alone past the cap (joshuafolkken/kit#2354).
|
|
85
|
+
const HANDOFF_OVERFLOW_NOTE = '--handoff <path> would grow the cut record past its byte bound'
|
|
86
|
+
// An implementation cut resumes into implementation, and that resume refuses a record with no
|
|
87
|
+
// instruction (`incomplete`) — so the cut is refused here instead of relaunching a successor that can
|
|
88
|
+
// only stop (joshuafolkken/kit#2484).
|
|
89
|
+
const HANDOFF_MISSING_NOTE = 'this cut resumes into implementation and needs --handoff <path>'
|
|
90
|
+
|
|
91
|
+
function report_bad_handoff(note: string): number {
|
|
92
|
+
console.error(`${note}. Nothing was cut; write the handoff file and reissue.`)
|
|
93
|
+
|
|
94
|
+
return report(BAD_HANDOFF_VERDICT, FAILURE_EXIT_CODE)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// A successor already resumed this cut; a process woken after its own hand-off is told to stop rather
|
|
98
|
+
// than to investigate (joshuafolkken/kit#1935). It is a benign, non-failing stop.
|
|
99
|
+
function report_handed_off(cut_record: RunCut): number {
|
|
100
|
+
console.error(run_cut.handed_off_message(cut_record))
|
|
101
|
+
|
|
102
|
+
return report(HANDED_OFF_VERDICT, SUCCESS_EXIT_CODE)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function report_unreadable(): number {
|
|
106
|
+
console.error(run_cut.unreadable_message())
|
|
107
|
+
|
|
108
|
+
return report(UNREADABLE_VERDICT, FAILURE_EXIT_CODE)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function report_unknown(): number {
|
|
112
|
+
console.error(run_cut.unknown_message())
|
|
113
|
+
|
|
114
|
+
return report(UNKNOWN_VERDICT, FAILURE_EXIT_CODE)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// A cut is only meaningful on a lane branch whose implementation is uncommitted. On the default
|
|
118
|
+
// branch, or with a clean tree, there is nothing to carry across the boundary.
|
|
119
|
+
function refuse_unready(state: CutState): number {
|
|
120
|
+
console.error(
|
|
121
|
+
`Not ready to cut on ${state.branch} (dirty: ${String(state.is_dirty)}); a cut needs an uncommitted lane branch. Nothing was cut.`,
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
return report(UNREADY_VERDICT, FAILURE_EXIT_CODE)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Below the shared context threshold there is no accumulation a cut would drop, so the resume it would
|
|
128
|
+
// relaunch costs more than it saves; the current process carries the run on to the gate uncut.
|
|
129
|
+
function report_under_threshold(): number {
|
|
130
|
+
console.error(
|
|
131
|
+
'The recent-window context is under the shared cut threshold, so nothing was cut; a resume would cost more than the accumulation it would drop. Continue to the gate.',
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
return report(UNDER_THRESHOLD_VERDICT, SUCCESS_EXIT_CODE)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// **The pre-gate cut is conditional on the same statistic the implementation-phase cut reads**
|
|
138
|
+
// (joshuafolkken/kit#2312). `cost_cli.session_verdict` prices the recent `RECENT_REQUEST_WINDOW`
|
|
139
|
+
// against `CONTEXT_CUT_THRESHOLD`, so no second threshold is introduced — an `under` session skips the
|
|
140
|
+
// cut, and an unmeasurable one keeps the old unconditional cut as the safety net joshuafolkken/kit#1933
|
|
141
|
+
// relies on. Only the pre-gate phase is checked here; the implementation-phase caller gates its own
|
|
142
|
+
// `--impl` cut on `pnpm josh cost --cut` before it is ever issued.
|
|
143
|
+
function skips_pre_gate_cut(phase: string): boolean {
|
|
144
|
+
if (phase !== run_cut.PRE_GATE_PHASE) return false
|
|
145
|
+
|
|
146
|
+
return cost_cli.session_verdict() === cost_verdict.UNDER_VERDICT
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// The exclusive create lost, so a cut is already in flight for this tree — the double-cut guard. The
|
|
150
|
+
// standing record is described rather than a bare token, so the reader sees which run holds it.
|
|
151
|
+
function report_cut_exists(target: string): number {
|
|
152
|
+
const read = run_cut.read_cut(target)
|
|
153
|
+
|
|
154
|
+
if (read.kind === 'carried' || read.kind === 'expired') return report_busy(read.cut)
|
|
155
|
+
|
|
156
|
+
console.error('A cut is already in flight for this tree, so nothing was cut again.')
|
|
157
|
+
|
|
158
|
+
return report(BUSY_VERDICT, FAILURE_EXIT_CODE)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// A relaunch failure clears the record so the current process can carry on to the gate itself — the
|
|
162
|
+
// run is never lost to a failed hand-off, and the failure is reported rather than passed off as a cut.
|
|
163
|
+
function report_relaunch_failure(target: string, note: string): number {
|
|
164
|
+
run_cut.end_cut(target)
|
|
165
|
+
console.error(
|
|
166
|
+
`Relaunch failed: ${note}. The cut was cleared so this process can continue to the gate.`,
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
return report(FAILED_VERDICT, FAILURE_EXIT_CODE)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function report_missing_supervisor(issue: string): number {
|
|
173
|
+
console.error(
|
|
174
|
+
`The OpenAI supervisor for #${issue} is not live, so this nested process was not cut and can continue. Re-dispatch the lane to recover the supervisor.`,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
return report(FAILED_VERDICT, FAILURE_EXIT_CODE)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// **The relaunched child is started at the effort of the phase it is resuming into**
|
|
181
|
+
// (joshuafolkken/kit#2382). A pre-gate resume drives the gate, commit, PR and merge — the mechanical
|
|
182
|
+
// ship/bookkeeping region, lowered — while an implementation resume keeps the role default. The
|
|
183
|
+
// phase-aware profile is `agent_argv.resume_argv`'s; a person's `JOSH_WORKER_EFFORT` still wins over it.
|
|
184
|
+
function relaunch(target: string, lane: LaneInfo, phase: string): number {
|
|
185
|
+
const notes: Array<string> = []
|
|
186
|
+
const result = lane_relaunch.resume(lane, phase, (note) => {
|
|
187
|
+
notes.push(note)
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
if (result.kind !== 'launched') return report_relaunch_failure(target, result.note)
|
|
191
|
+
|
|
192
|
+
if (notes.length > 0) console.error(notes.join('\n'))
|
|
193
|
+
|
|
194
|
+
return report(CUT_VERDICT, SUCCESS_EXIT_CODE)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
async function is_lane_branch(state: CutState): Promise<boolean> {
|
|
198
|
+
const default_branch = await git_command.get_default_branch()
|
|
199
|
+
|
|
200
|
+
return state.branch !== default_branch && state.is_dirty
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// An expired record is a fresh process that never started; it is cleared so the next cut can begin
|
|
204
|
+
// rather than being wedged behind a stale file the exclusive create would refuse forever.
|
|
205
|
+
function clear_expired(target: string): void {
|
|
206
|
+
if (run_cut.read_cut(target).kind === 'expired') run_cut.end_cut(target)
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function has_matching_supervisor(lane: LaneInfo, issue: string): boolean {
|
|
210
|
+
if (!lane_relaunch.is_openai_lane(lane)) return true
|
|
211
|
+
|
|
212
|
+
return openai_lane_supervisor.active(lane.directory)?.issue === issue
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
interface CutRequest {
|
|
216
|
+
branch: string
|
|
217
|
+
issue: string
|
|
218
|
+
phase: string
|
|
219
|
+
// The `--handoff` path whose instruction and work state the record carries, absent for a pre-gate
|
|
220
|
+
// cut that resumes into the gate rather than into implementation (joshuafolkken/kit#2354).
|
|
221
|
+
handoff_path?: string | undefined
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// **Every cut appends a `cut` event to the run's stream** (joshuafolkken/kit#2346). It is what advances
|
|
225
|
+
// `run:step` past the phase boundary — a cut emitted here is why the run's next position reads as
|
|
226
|
+
// `run:cut --resume`. Best-effort by the stream's contract, so a failed append never fails the cut it
|
|
227
|
+
// reports.
|
|
228
|
+
async function emit_cut_event(request: CutRequest): Promise<void> {
|
|
229
|
+
await run_event_stream_emit.emit(
|
|
230
|
+
run_event_stream.EVENT_KIND.CUT,
|
|
231
|
+
`#${request.issue} cut (${request.phase})`,
|
|
232
|
+
)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// The note a cut record is refused with before it is written, or `undefined` when it may be written.
|
|
236
|
+
function spec_refusal(spec: Parameters<typeof run_cut.begin_cut>[1]): string | undefined {
|
|
237
|
+
if (!run_cut.has_required_handoff(spec)) return HANDOFF_MISSING_NOTE
|
|
238
|
+
if (!run_cut.record_within_bound(spec)) return HANDOFF_OVERFLOW_NOTE
|
|
239
|
+
|
|
240
|
+
return undefined
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
async function finish_cut(target: string, lane: LaneInfo, request: CutRequest): Promise<number> {
|
|
244
|
+
const loaded = run_cut_handoff.load_handoff(request.handoff_path, run_cut.MAX_HANDOFF_BYTES)
|
|
245
|
+
if (loaded.kind === 'bad') return report_bad_handoff(loaded.note)
|
|
246
|
+
|
|
247
|
+
const spec = {
|
|
248
|
+
issue: request.issue,
|
|
249
|
+
branch: request.branch,
|
|
250
|
+
phase: request.phase,
|
|
251
|
+
handoff: loaded.handoff,
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const spec_note = spec_refusal(spec)
|
|
255
|
+
|
|
256
|
+
if (spec_note !== undefined) return report_bad_handoff(spec_note)
|
|
257
|
+
if (run_cut.begin_cut(target, spec) === undefined) return report_cut_exists(target)
|
|
258
|
+
|
|
259
|
+
await emit_cut_event(request)
|
|
260
|
+
|
|
261
|
+
return lane_relaunch.is_openai_lane(lane)
|
|
262
|
+
? report(CUT_VERDICT, SUCCESS_EXIT_CODE)
|
|
263
|
+
: relaunch(target, lane, request.phase)
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
async function cut(
|
|
267
|
+
target: string,
|
|
268
|
+
issue: string,
|
|
269
|
+
phase: string,
|
|
270
|
+
handoff_path?: string,
|
|
271
|
+
): Promise<number> {
|
|
272
|
+
const lane = await lane_registry.find_open_lane(issue)
|
|
273
|
+
|
|
274
|
+
if (lane === undefined) return report(NOT_A_LANE_VERDICT, SUCCESS_EXIT_CODE)
|
|
275
|
+
|
|
276
|
+
const state = await run_cut.current_state()
|
|
277
|
+
|
|
278
|
+
if (!(await is_lane_branch(state))) return refuse_unready(state)
|
|
279
|
+
if (skips_pre_gate_cut(phase)) return report_under_threshold()
|
|
280
|
+
|
|
281
|
+
clear_expired(target)
|
|
282
|
+
if (!has_matching_supervisor(lane, issue)) return report_missing_supervisor(issue)
|
|
283
|
+
|
|
284
|
+
return await finish_cut(target, lane, { issue, branch: state.branch, phase, handoff_path })
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// **The adoption is the resume-uniqueness guarantee**: it removes and creates exclusively, so of two
|
|
288
|
+
// racing resumes only one wins the create and the loser is answered `busy`.
|
|
289
|
+
// An implementation cut resumes back into implementation; a pre-gate one into the gate. The resuming
|
|
290
|
+
// child is told which by the verdict rather than reconstructing it from the record
|
|
291
|
+
// (joshuafolkken/kit#1933).
|
|
292
|
+
function resume_verdict_for(cut_record: RunCut): string {
|
|
293
|
+
return run_cut.resumes_into_implementation(cut_record.phase)
|
|
294
|
+
? RESUME_IMPL_VERDICT
|
|
295
|
+
: RESUME_VERDICT
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// **An implementation resume removes the record; a pre-gate one marks it handed off**
|
|
299
|
+
// (joshuafolkken/kit#2310). The cuts have different multiplicities sharing one
|
|
300
|
+
// record: the pre-gate cut fires once per lane, so its record must survive to answer a second resume
|
|
301
|
+
// `handed-off` (joshuafolkken/kit#1935); the implementation cut is guarded by the run's
|
|
302
|
+
// event stream rather than the cut record, so its record is cleared on resume — a lingering record
|
|
303
|
+
// would keep the pre-gate guard, which reads `carried_cut_sync`, silent for the rest of the run. A double
|
|
304
|
+
// cut stays impossible either way: `begin_cut`'s exclusive create is what prevents it.
|
|
305
|
+
function take_over(target: string, cut_record: RunCut): RunCut | undefined {
|
|
306
|
+
if (!run_cut.resumes_into_implementation(cut_record.phase)) {
|
|
307
|
+
return run_cut.adopt_cut(target, cut_record)
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
run_cut.end_cut(target)
|
|
311
|
+
|
|
312
|
+
return cut_record
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// The carried instruction and work state, printed to standard error so the resumed session continues
|
|
316
|
+
// on what the run was told to do rather than on the tree alone (joshuafolkken/kit#2354). The record is
|
|
317
|
+
// cleared on adoption, so this is where it reaches the fresh process.
|
|
318
|
+
function announce_handoff(cut_record: RunCut): void {
|
|
319
|
+
if (cut_record.handoff !== undefined) {
|
|
320
|
+
console.error(run_cut_handoff.describe_handoff(cut_record.handoff))
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function adopt(target: string, cut_record: RunCut): number {
|
|
325
|
+
const taken = take_over(target, cut_record)
|
|
326
|
+
|
|
327
|
+
if (taken === undefined) return report_busy(cut_record)
|
|
328
|
+
|
|
329
|
+
announce_handoff(cut_record)
|
|
330
|
+
|
|
331
|
+
return report(resume_verdict_for(cut_record), SUCCESS_EXIT_CODE)
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
async function verify_and_adopt(
|
|
335
|
+
target: string,
|
|
336
|
+
cut_record: RunCut,
|
|
337
|
+
issue: string,
|
|
338
|
+
): Promise<number> {
|
|
339
|
+
const state = await run_cut.current_state()
|
|
340
|
+
const verdict = run_cut.classify_resume(cut_record, {
|
|
341
|
+
issue,
|
|
342
|
+
current_branch: state.branch,
|
|
343
|
+
is_dirty: state.is_dirty,
|
|
344
|
+
is_held: state.is_held,
|
|
345
|
+
})
|
|
346
|
+
|
|
347
|
+
if (verdict === HANDED_OFF_VERDICT) return report_handed_off(cut_record)
|
|
348
|
+
|
|
349
|
+
if (verdict === 'stale') return report_stale(cut_record)
|
|
350
|
+
|
|
351
|
+
if (verdict === INCOMPLETE_VERDICT) return report_incomplete(cut_record)
|
|
352
|
+
|
|
353
|
+
return adopt(target, cut_record)
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
async function resume(target: string, issue: string): Promise<number> {
|
|
357
|
+
const read = run_cut.read_cut(target)
|
|
358
|
+
|
|
359
|
+
if (read.kind === 'none') return report(FRESH_VERDICT, SUCCESS_EXIT_CODE)
|
|
360
|
+
|
|
361
|
+
if (read.kind === 'unreadable') return report_unreadable()
|
|
362
|
+
|
|
363
|
+
if (read.kind === 'expired') return report_stale(read.cut)
|
|
364
|
+
|
|
365
|
+
return await verify_and_adopt(target, read.cut, issue)
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
function read_json(target: string): number {
|
|
369
|
+
const read = run_cut.read_cut(target)
|
|
370
|
+
const cut_record = read.kind === 'carried' || read.kind === 'expired' ? read.cut : undefined
|
|
371
|
+
|
|
372
|
+
console.info(JSON.stringify({ verdict: read.kind, cut: cut_record }))
|
|
373
|
+
|
|
374
|
+
return read.kind === 'unreadable' ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function end(target: string): number {
|
|
378
|
+
run_cut.end_cut(target)
|
|
379
|
+
|
|
380
|
+
return report(ENDED_VERDICT, SUCCESS_EXIT_CODE)
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// A bare cut is the pre-gate boundary and `--impl` the implementation-phase one (joshuafolkken/kit#1933).
|
|
384
|
+
function cut_phase(request: { is_implementation: boolean }): string {
|
|
385
|
+
return request.is_implementation ? run_cut.IMPLEMENTATION_PHASE : run_cut.PRE_GATE_PHASE
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
async function act(target: string, request: Request): Promise<number> {
|
|
389
|
+
if (request.kind === 'cut') {
|
|
390
|
+
return await cut(target, request.issue, cut_phase(request), request.handoff_path)
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
if (request.kind === 'resume') return await resume(target, request.issue)
|
|
394
|
+
|
|
395
|
+
if (request.kind === 'read') return read_json(target)
|
|
396
|
+
|
|
397
|
+
return end(target)
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
async function answer(request: Request): Promise<number> {
|
|
401
|
+
const directory = await run_cut.worktree_directory()
|
|
402
|
+
|
|
403
|
+
if (directory === undefined) return report_unknown()
|
|
404
|
+
|
|
405
|
+
return await act(run_cut.cut_path(directory), request)
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
function refuse(): number {
|
|
409
|
+
console.error(run_cut_args.USAGE)
|
|
410
|
+
|
|
411
|
+
return FAILURE_EXIT_CODE
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// Every path out prints exactly one token, including the ones nobody planned: an empty standard
|
|
415
|
+
// output matches no verdict, which a resume entry check reads as "not a resume" and would let a fresh
|
|
416
|
+
// process re-implement over a cut it should have carried.
|
|
417
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
418
|
+
const parsed = run_cut_args.read_arguments(argv)
|
|
419
|
+
|
|
420
|
+
if (parsed === undefined) return refuse()
|
|
421
|
+
|
|
422
|
+
const request = run_cut_args.to_request(parsed)
|
|
423
|
+
|
|
424
|
+
if (request === undefined) return refuse()
|
|
425
|
+
|
|
426
|
+
try {
|
|
427
|
+
return await answer(request)
|
|
428
|
+
} catch {
|
|
429
|
+
return report_unknown()
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
434
|
+
process.exitCode = await run(argv)
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
const run_cut_cli = {
|
|
438
|
+
BAD_HANDOFF_VERDICT,
|
|
439
|
+
BUSY_VERDICT,
|
|
440
|
+
CUT_VERDICT,
|
|
441
|
+
ENDED_VERDICT,
|
|
442
|
+
FAILED_VERDICT,
|
|
443
|
+
FRESH_VERDICT,
|
|
444
|
+
HANDED_OFF_VERDICT,
|
|
445
|
+
INCOMPLETE_VERDICT,
|
|
446
|
+
NOT_A_LANE_VERDICT,
|
|
447
|
+
RESUME_IMPL_VERDICT,
|
|
448
|
+
RESUME_VERDICT,
|
|
449
|
+
STALE_VERDICT,
|
|
450
|
+
UNDER_THRESHOLD_VERDICT,
|
|
451
|
+
UNKNOWN_VERDICT,
|
|
452
|
+
UNREADABLE_VERDICT,
|
|
453
|
+
UNREADY_VERDICT,
|
|
454
|
+
USAGE: run_cut_args.USAGE,
|
|
455
|
+
main,
|
|
456
|
+
run,
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
460
|
+
|
|
461
|
+
export { run_cut_cli }
|