@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,431 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { parseArgs } from 'node:util'
|
|
4
|
+
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
5
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
6
|
+
import { run_event_stream } from './run-event-stream'
|
|
7
|
+
import { run_event_stream_emit } from './run-event-stream-emit'
|
|
8
|
+
import { run_ship, type ShipSection } from './run-ship'
|
|
9
|
+
import { run_ship_detach } from './run-ship-detach'
|
|
10
|
+
import { run_ship_probe } from './run-ship-probe'
|
|
11
|
+
import { run_ship_return } from './run-ship-return'
|
|
12
|
+
import { run_ship_review_steps } from './run-ship-review-steps'
|
|
13
|
+
import { run_ship_stage, type Phase, type ShipState, type Stage } from './run-ship-stage'
|
|
14
|
+
|
|
15
|
+
// `josh ship "<title> #<N>"` — one call for the fixed commit-to-report region a run ships a change on
|
|
16
|
+
// (joshuafolkken/kit#2398). The loop used to spend a round trip each on `gate`, `git -y`, `followup`
|
|
17
|
+
// and `run:tail`, re-billing a lane's full context every time; this runs the four internally and
|
|
18
|
+
// prints one composite report, the same way `run:tail` folds the post-merge bookkeeping. Each step's
|
|
19
|
+
// stderr is forwarded, so the reader still sees every explanation — a red check, a CI wait, a refusal —
|
|
20
|
+
// the four would have printed on their own.
|
|
21
|
+
//
|
|
22
|
+
// It stops at the first failed step: the gate must be green before the commit, the commit before the
|
|
23
|
+
// merge. The report ends at the failure and names the stopped step, so the run reads only that one.
|
|
24
|
+
//
|
|
25
|
+
// **Re-running it resumes rather than restarts** (joshuafolkken/kit#2426). Each stage's completion is
|
|
26
|
+
// kept in a per-issue record, and the repository's actual state — committed, pushed, merged — is read
|
|
27
|
+
// before the first stage, so a ship that died mid-way passes over what already happened and never
|
|
28
|
+
// commits, pushes or merges twice. Each stage's start, success, failure or skip goes onto the run's
|
|
29
|
+
// event stream. `run-ship-stage.ts` carries which stage may be passed over, and why the gate never is
|
|
30
|
+
// on the record's word alone.
|
|
31
|
+
//
|
|
32
|
+
// **`--review` owns the round-1 review too** (joshuafolkken/kit#2427): a `review` stage in front of the
|
|
33
|
+
// gate launches the same-strength reviewer beside it and joins, attests and records the round without
|
|
34
|
+
// an agent turn (`run-ship-review-steps.ts`); a High or Medium finding, or any failed join, stops there.
|
|
35
|
+
//
|
|
36
|
+
// **`--detach` hands the whole region to a supervisor that outlives the agent** (joshuafolkken/kit#2428):
|
|
37
|
+
// the agent ends at the hand-off instead of relaunching itself for the gate, a supervised ship that stops
|
|
38
|
+
// hands the stage back (`run-ship-return.ts`), and `--log <N>` prints the report it stopped on.
|
|
39
|
+
//
|
|
40
|
+
// The first positional is the `"<title> #<N>"` string `git -y` and `followup` already take; the issue
|
|
41
|
+
// number is read off its tail for `run:tail`. Any further positionals are follow-up citations filed
|
|
42
|
+
// this run (`fullrun-steps.md` routes branch-2 filing before `ship`), forwarded to `run:tail` after the
|
|
43
|
+
// closed issue so `issue:cite` reports them too. A notify body — `--notify-message` or the
|
|
44
|
+
// shell-body-safe `--notify-message-file` — is forwarded to `followup` alone; the completion prose is
|
|
45
|
+
// composed before this command and passed straight through.
|
|
46
|
+
|
|
47
|
+
const ARGV_OFFSET = 2
|
|
48
|
+
const SUCCESS_EXIT_CODE = 0
|
|
49
|
+
const FAILURE_EXIT_CODE = 1
|
|
50
|
+
const FIRST = 0
|
|
51
|
+
const NUMBER_GROUP = 1
|
|
52
|
+
const EXTRA_CITE_START = 1
|
|
53
|
+
// The issue reference at the tail of the title — `git -y` and `followup` read the whole string, and
|
|
54
|
+
// `run:tail` needs the number alone.
|
|
55
|
+
const TRAILING_ISSUE_PATTERN = /#([1-9]\d*)\s*$/u
|
|
56
|
+
// A follow-up citation passed as a trailing positional — a bare issue number, so a stray flag is
|
|
57
|
+
// refused rather than forwarded to the wrong step.
|
|
58
|
+
const CITE_PATTERN = /^[1-9]\d*$/u
|
|
59
|
+
// Both body forms `followup` documents, forwarded verbatim: the inline `--notify-message` and the
|
|
60
|
+
// shell-body-safe `--notify-message-file` a body naming a command or path must use (`followup.md`).
|
|
61
|
+
const NOTIFY_OPTIONS = ['notify-message', 'notify-message-file'] as const
|
|
62
|
+
// joshuafolkken/kit#2446: the PR body carrying the live-execution evidence `followup` gates the merge
|
|
63
|
+
// on, forwarded to `git -y` as a path because it holds commands and their output.
|
|
64
|
+
const BODY_FILE_OPTION = 'body-file'
|
|
65
|
+
const USAGE =
|
|
66
|
+
'Usage: josh ship "<title> #<N>" [<follow-up-N> ...] [--cite <N> ...] [--review] [--detach] [--body-file <path>] [--notify-message <text> | --notify-message-file <path>] | josh ship --log <N>'
|
|
67
|
+
const NO_LOG_NOTE = 'no detached ship supervisor log for this issue'
|
|
68
|
+
const LANE_CHILD_DETACH_NOTE =
|
|
69
|
+
'lane child: shipping through the detached supervisor (--detach implied), so the end of this turn cannot kill it'
|
|
70
|
+
const should_forward_stderr = true
|
|
71
|
+
|
|
72
|
+
type NotifyValues = Partial<Record<(typeof NOTIFY_OPTIONS)[number], string>>
|
|
73
|
+
|
|
74
|
+
const OPTIONS = {
|
|
75
|
+
[NOTIFY_OPTIONS[0]]: { type: 'string' },
|
|
76
|
+
[NOTIFY_OPTIONS[1]]: { type: 'string' },
|
|
77
|
+
[BODY_FILE_OPTION]: { type: 'string' },
|
|
78
|
+
review: { type: 'boolean' },
|
|
79
|
+
// joshuafolkken/kit#2428: hand the region to a detached supervisor (`run-ship-detach.ts`), print the
|
|
80
|
+
// report a stopped supervisor left, and carry follow-up citations as options so the supervisor's
|
|
81
|
+
// command line still ends with its title.
|
|
82
|
+
detach: { type: 'boolean' },
|
|
83
|
+
log: { type: 'string' },
|
|
84
|
+
cite: { type: 'string', multiple: true },
|
|
85
|
+
} as const
|
|
86
|
+
|
|
87
|
+
interface ShipArguments {
|
|
88
|
+
title: string
|
|
89
|
+
number: string
|
|
90
|
+
notify: ReadonlyArray<string>
|
|
91
|
+
body: ReadonlyArray<string>
|
|
92
|
+
cites: ReadonlyArray<string>
|
|
93
|
+
is_review: boolean
|
|
94
|
+
is_detach: boolean
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
type ShipCommand = { kind: 'ship'; args: ShipArguments } | { kind: 'log'; number: string }
|
|
98
|
+
|
|
99
|
+
interface Step {
|
|
100
|
+
stage: Stage
|
|
101
|
+
header: string
|
|
102
|
+
run: (args: ShipArguments, state: ShipState) => Promise<JoshResult>
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// What a resumed ship knows before its first stage: the record's path (absent outside a repository),
|
|
106
|
+
// the stages it says completed, and the repository's actual state (`run-ship-stage.ts` decides from it).
|
|
107
|
+
interface ShipContext {
|
|
108
|
+
target: string | undefined
|
|
109
|
+
done: ReadonlySet<string>
|
|
110
|
+
state: ShipState
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// The notify tail `followup` takes — whichever body form the caller composed, forwarded unchanged so a
|
|
114
|
+
// path-based body reaches `followup` exactly as passed.
|
|
115
|
+
function notify_arguments(values: NotifyValues): ReadonlyArray<string> {
|
|
116
|
+
return NOTIFY_OPTIONS.flatMap((option) => {
|
|
117
|
+
const value = values[option]
|
|
118
|
+
|
|
119
|
+
return value === undefined ? [] : [`--${option}`, value]
|
|
120
|
+
})
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function body_arguments(path: string | undefined): ReadonlyArray<string> {
|
|
124
|
+
return path === undefined ? [] : [`--${BODY_FILE_OPTION}`, path]
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const { STAGE, PHASE } = run_ship_stage
|
|
128
|
+
|
|
129
|
+
// The four steps in the order a change ships: the gate before the commit, the commit/push/PR before
|
|
130
|
+
// the merge, the merge before the report bookkeeping. The commit step carries the `--skip-*` flags a
|
|
131
|
+
// resumed ship needs, so an existing commit or push is never made twice.
|
|
132
|
+
async function josh(argv: ReadonlyArray<string>): Promise<JoshResult> {
|
|
133
|
+
return await josh_command.josh_run(argv, should_forward_stderr)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const COMMIT_STEPS: ReadonlyArray<Step> = [
|
|
137
|
+
{ stage: STAGE.GATE, header: run_ship.GATE_HEADER, run: async () => await josh(['gate']) },
|
|
138
|
+
{
|
|
139
|
+
stage: STAGE.COMMIT,
|
|
140
|
+
header: run_ship.COMMIT_HEADER,
|
|
141
|
+
run: async (args, state) =>
|
|
142
|
+
await josh(['git', '-y', ...run_ship_stage.commit_flags(state), ...args.body, args.title]),
|
|
143
|
+
},
|
|
144
|
+
]
|
|
145
|
+
|
|
146
|
+
const MERGE_STEPS: ReadonlyArray<Step> = [
|
|
147
|
+
{
|
|
148
|
+
stage: STAGE.FOLLOWUP,
|
|
149
|
+
header: run_ship.FOLLOWUP_HEADER,
|
|
150
|
+
run: async (args) => await josh(['followup', args.title, ...args.notify]),
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
stage: STAGE.REPORT,
|
|
154
|
+
header: run_ship.REPORT_HEADER,
|
|
155
|
+
run: async (args) => await josh(['run:tail', args.number, ...args.cites]),
|
|
156
|
+
},
|
|
157
|
+
]
|
|
158
|
+
|
|
159
|
+
// `--review` (joshuafolkken/kit#2427) puts the supervised round-1 review in front of the gate: it
|
|
160
|
+
// launches the gate itself, so the gate stage that follows reuses that tree's green record. It also
|
|
161
|
+
// puts the round-2 pass between the commit and the followup (joshuafolkken/kit#2489), so the PR opens
|
|
162
|
+
// between the rounds and round 2 runs beside CI — a no-op when round 1 left no fix delta.
|
|
163
|
+
const REVIEW_STEP: Step = {
|
|
164
|
+
stage: STAGE.REVIEW,
|
|
165
|
+
header: run_ship.REVIEW_HEADER,
|
|
166
|
+
run: async (args) => await run_ship_review_steps.review_stage(args.number),
|
|
167
|
+
}
|
|
168
|
+
const ROUND_TWO_STEP: Step = {
|
|
169
|
+
stage: STAGE.ROUND_TWO,
|
|
170
|
+
header: run_ship.ROUND_TWO_HEADER,
|
|
171
|
+
run: async (args) => await run_ship_review_steps.round_two_stage(args.number),
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function steps(args: ShipArguments): ReadonlyArray<Step> {
|
|
175
|
+
if (!args.is_review) return [...COMMIT_STEPS, ...MERGE_STEPS]
|
|
176
|
+
|
|
177
|
+
return [REVIEW_STEP, ...COMMIT_STEPS, ROUND_TWO_STEP, ...MERGE_STEPS]
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function issue_number(title: string): string | undefined {
|
|
181
|
+
return TRAILING_ISSUE_PATTERN.exec(title)?.[NUMBER_GROUP]
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
interface ParsedValues extends NotifyValues {
|
|
185
|
+
[BODY_FILE_OPTION]?: string
|
|
186
|
+
review?: boolean
|
|
187
|
+
detach?: boolean
|
|
188
|
+
log?: string
|
|
189
|
+
cite?: Array<string>
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function parse_values(argv: ReadonlyArray<string>): {
|
|
193
|
+
values: ParsedValues
|
|
194
|
+
positionals: Array<string>
|
|
195
|
+
} {
|
|
196
|
+
return parseArgs({ args: [...argv], options: OPTIONS, allowPositionals: true, strict: true })
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function ship_args(
|
|
200
|
+
title: string,
|
|
201
|
+
rest: ReadonlyArray<string>,
|
|
202
|
+
values: ParsedValues,
|
|
203
|
+
): ShipArguments | undefined {
|
|
204
|
+
const number = issue_number(title)
|
|
205
|
+
const cites = [...rest, ...(values.cite ?? [])]
|
|
206
|
+
|
|
207
|
+
if (number === undefined || cites.some((token) => !CITE_PATTERN.test(token))) return undefined
|
|
208
|
+
|
|
209
|
+
return {
|
|
210
|
+
title,
|
|
211
|
+
number,
|
|
212
|
+
notify: notify_arguments(values),
|
|
213
|
+
body: body_arguments(values[BODY_FILE_OPTION]),
|
|
214
|
+
cites,
|
|
215
|
+
is_review: values.review === true,
|
|
216
|
+
is_detach: values.detach === true,
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// `--log <N>` stands alone: a bare issue number and nothing to ship.
|
|
221
|
+
function log_command(number: string, positionals: ReadonlyArray<string>): ShipCommand | undefined {
|
|
222
|
+
return CITE_PATTERN.test(number) && positionals.length === 0 ? { kind: 'log', number } : undefined
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function read_args(argv: ReadonlyArray<string>): ShipCommand | undefined {
|
|
226
|
+
const { values, positionals } = parse_values(argv)
|
|
227
|
+
|
|
228
|
+
if (values.log !== undefined) return log_command(values.log, positionals)
|
|
229
|
+
|
|
230
|
+
const title = positionals[FIRST]
|
|
231
|
+
const args =
|
|
232
|
+
title === undefined ? undefined : ship_args(title, positionals.slice(EXTRA_CITE_START), values)
|
|
233
|
+
|
|
234
|
+
return args === undefined ? undefined : { kind: 'ship', args }
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Numbers-only tail and a strict parse, so a title with no `#<N>` or a stray flag is refused rather
|
|
238
|
+
// than shipped past the wrong step.
|
|
239
|
+
function parse(argv: ReadonlyArray<string>): ShipCommand | undefined {
|
|
240
|
+
try {
|
|
241
|
+
return read_args(argv)
|
|
242
|
+
} catch {
|
|
243
|
+
return undefined
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
async function run_step(step: Step, args: ShipArguments, state: ShipState): Promise<ShipSection> {
|
|
248
|
+
const result = await step.run(args, state)
|
|
249
|
+
|
|
250
|
+
return { header: step.header, body: result.out, code: result.code }
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
async function emit_phase(args: ShipArguments, stage: Stage, phase: Phase): Promise<void> {
|
|
254
|
+
const text = run_ship_stage.event_text(args.number, stage, phase)
|
|
255
|
+
|
|
256
|
+
await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.SHIP_STAGE, text)
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// The record is written best-effort, as the event stream is: a record that could not be written costs
|
|
260
|
+
// a resumed ship only the state re-read, never the stage that just succeeded.
|
|
261
|
+
function record(target: string | undefined, write: (path: string) => void): void {
|
|
262
|
+
if (target === undefined) return
|
|
263
|
+
|
|
264
|
+
try {
|
|
265
|
+
write(target)
|
|
266
|
+
} catch {
|
|
267
|
+
// Best-effort: the actual state is re-read on a resume, so a lost record repeats nothing.
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
async function settle(
|
|
272
|
+
step: Step,
|
|
273
|
+
args: ShipArguments,
|
|
274
|
+
context: ShipContext,
|
|
275
|
+
code: number,
|
|
276
|
+
): Promise<void> {
|
|
277
|
+
const is_green = code === SUCCESS_EXIT_CODE
|
|
278
|
+
|
|
279
|
+
await emit_phase(args, step.stage, is_green ? PHASE.DONE : PHASE.FAILED)
|
|
280
|
+
|
|
281
|
+
if (!is_green) return
|
|
282
|
+
|
|
283
|
+
record(context.target, (path) => {
|
|
284
|
+
run_ship_stage.mark_done(path, step.stage)
|
|
285
|
+
})
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// One stage: passed over when the record and the state say it is done, run and recorded otherwise.
|
|
289
|
+
async function run_stage(
|
|
290
|
+
step: Step,
|
|
291
|
+
args: ShipArguments,
|
|
292
|
+
context: ShipContext,
|
|
293
|
+
): Promise<ShipSection> {
|
|
294
|
+
if (run_ship_stage.is_done(step.stage, context.done, context.state, args.body.length > 0)) {
|
|
295
|
+
await emit_phase(args, step.stage, PHASE.SKIPPED)
|
|
296
|
+
|
|
297
|
+
return { header: step.header, body: run_ship.SKIPPED_BODY, code: SUCCESS_EXIT_CODE }
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
await emit_phase(args, step.stage, PHASE.START)
|
|
301
|
+
const section = await run_step(step, args, context.state)
|
|
302
|
+
|
|
303
|
+
await settle(step, args, context, section.code)
|
|
304
|
+
|
|
305
|
+
return section
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
async function open_context(args: ShipArguments): Promise<ShipContext> {
|
|
309
|
+
const [target, state] = await Promise.all([
|
|
310
|
+
run_ship_probe.record_target(args.number),
|
|
311
|
+
run_ship_probe.read_state(),
|
|
312
|
+
])
|
|
313
|
+
|
|
314
|
+
const done = target === undefined ? new Set<string>() : run_ship_stage.read_done(target)
|
|
315
|
+
|
|
316
|
+
return { target, done, state }
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// A detached supervisor hands the stopped stage back (`run-ship-return.ts`, joshuafolkken/kit#2428); a
|
|
320
|
+
// ship in an agent's own turn has its report in front of that agent already.
|
|
321
|
+
async function stopped(
|
|
322
|
+
sections: ReadonlyArray<ShipSection>,
|
|
323
|
+
args: ShipArguments,
|
|
324
|
+
stage: Stage,
|
|
325
|
+
): Promise<ReadonlyArray<ShipSection>> {
|
|
326
|
+
if (run_ship_detach.is_supervised()) await run_ship_return.return_control(args.number, stage)
|
|
327
|
+
|
|
328
|
+
return sections
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Run the four in order, stopping at the first that failed: a red gate never reaches the commit, so
|
|
332
|
+
// the returned sections end at the failure the report names. A ship that reached the end clears its
|
|
333
|
+
// record, so the next ship of the same issue starts from the gate.
|
|
334
|
+
async function ship(args: ShipArguments): Promise<ReadonlyArray<ShipSection>> {
|
|
335
|
+
const context = await open_context(args)
|
|
336
|
+
const sections: Array<ShipSection> = []
|
|
337
|
+
|
|
338
|
+
for (const step of steps(args)) {
|
|
339
|
+
const section = await run_stage(step, args, context)
|
|
340
|
+
|
|
341
|
+
sections.push(section)
|
|
342
|
+
|
|
343
|
+
if (section.code !== SUCCESS_EXIT_CODE) return await stopped(sections, args, step.stage)
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
record(context.target, (path) => {
|
|
347
|
+
run_ship_stage.clear(path)
|
|
348
|
+
})
|
|
349
|
+
|
|
350
|
+
return sections
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
async function print_log(number: string): Promise<number> {
|
|
354
|
+
const repository = await run_ship_probe.repository_directory()
|
|
355
|
+
const log = repository === undefined ? undefined : run_ship_detach.read_log(repository, number)
|
|
356
|
+
|
|
357
|
+
if (log === undefined) {
|
|
358
|
+
console.error(NO_LOG_NOTE)
|
|
359
|
+
|
|
360
|
+
return FAILURE_EXIT_CODE
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
console.info(log)
|
|
364
|
+
|
|
365
|
+
return SUCCESS_EXIT_CODE
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// The one-token contract `run:cut` keeps: the verdict on stdout, the explanation on stderr.
|
|
369
|
+
async function detach(args: ShipArguments): Promise<number> {
|
|
370
|
+
const repository = await run_ship_probe.repository_directory()
|
|
371
|
+
|
|
372
|
+
if (repository === undefined) {
|
|
373
|
+
console.info(run_ship_detach.FAILED)
|
|
374
|
+
|
|
375
|
+
return FAILURE_EXIT_CODE
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
const result = await run_ship_detach.detach({ ...args, repository, cwd: process.cwd() })
|
|
379
|
+
|
|
380
|
+
console.error(result.note)
|
|
381
|
+
console.info(result.verdict)
|
|
382
|
+
|
|
383
|
+
return result.verdict === run_ship_detach.LAUNCHED ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// joshuafolkken/kit#2457: a headless lane child's turn ending kills a ship it left in its own process,
|
|
387
|
+
// so inside a lane child the region always goes to the supervisor, flag or not. The supervisor itself
|
|
388
|
+
// inherits the lane mark, and is the one ship that must run the stages here.
|
|
389
|
+
function should_detach(args: ShipArguments): boolean {
|
|
390
|
+
if (args.is_detach) return true
|
|
391
|
+
|
|
392
|
+
return !run_ship_detach.is_supervised() && lane_child_marker.is_child_of(process.cwd())
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
async function run_ship_command(args: ShipArguments): Promise<number> {
|
|
396
|
+
if (should_detach(args)) {
|
|
397
|
+
if (!args.is_detach) console.error(LANE_CHILD_DETACH_NOTE)
|
|
398
|
+
|
|
399
|
+
return await detach(args)
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
const sections = await ship(args)
|
|
403
|
+
|
|
404
|
+
console.info(run_ship.format_report(sections))
|
|
405
|
+
|
|
406
|
+
return run_ship.exit_code(sections)
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
410
|
+
const command = parse(argv)
|
|
411
|
+
|
|
412
|
+
if (command === undefined) {
|
|
413
|
+
console.error(USAGE)
|
|
414
|
+
|
|
415
|
+
return FAILURE_EXIT_CODE
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
return command.kind === 'log'
|
|
419
|
+
? await print_log(command.number)
|
|
420
|
+
: await run_ship_command(command.args)
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
424
|
+
process.exitCode = await run(argv)
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
const run_ship_cli = { SUCCESS_EXIT_CODE, USAGE, main, parse, run, ship }
|
|
428
|
+
|
|
429
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
430
|
+
|
|
431
|
+
export { run_ship_cli }
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
2
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
|
+
import { detached_launch, type LaunchArgv } from './detached-launch'
|
|
4
|
+
import { run_event_stream } from './run-event-stream'
|
|
5
|
+
import { run_event_stream_emit } from './run-event-stream-emit'
|
|
6
|
+
|
|
7
|
+
// `josh ship --detach` — hand the post-implementation region to a supervisor that outlives the agent
|
|
8
|
+
// (joshuafolkken/kit#2428). A lane child used to take the pre-gate cut and relaunch a fresh agent session
|
|
9
|
+
// to drive the gate, the review and the merge; that session re-read the issue to run fixed procedure,
|
|
10
|
+
// and the wake role it billed was 59.8% of a run's wall time. This starts `josh ship` itself as a
|
|
11
|
+
// detached process instead, so the agent ends at the hand-off and nothing but the mechanical region runs.
|
|
12
|
+
//
|
|
13
|
+
// **The supervisor's command line ends with the `"<title> #<N>"` title**, which is what the parent's
|
|
14
|
+
// liveness pattern (`lane-child-invocation.ts`) anchors on — so a lane whose agent has ended is still
|
|
15
|
+
// booked alive while its supervisor ships it. The follow-up citations therefore travel as `--cite`
|
|
16
|
+
// options rather than trailing positionals, and an inline notify body — whose newlines no argv element
|
|
17
|
+
// may carry — is written to a file and passed as `--notify-message-file`.
|
|
18
|
+
//
|
|
19
|
+
// **One supervisor per issue.** The launched pid is kept beside the stage record, and a second detach
|
|
20
|
+
// while that process is alive is refused `busy`: two supervisors would race each other's commit and
|
|
21
|
+
// merge, which the resume record (`run-ship-stage.ts`) orders but cannot serialize.
|
|
22
|
+
|
|
23
|
+
const LOG_PREFIX = 'josh-ship-log-'
|
|
24
|
+
const PID_PREFIX = 'josh-ship-pid-'
|
|
25
|
+
const BODY_PREFIX = 'josh-ship-notify-'
|
|
26
|
+
const KEY_SEPARATOR = '-'
|
|
27
|
+
const LOG_SUFFIX = '.log'
|
|
28
|
+
const BODY_SUFFIX = '.txt'
|
|
29
|
+
const PNPM = 'pnpm'
|
|
30
|
+
const INLINE_NOTIFY = '--notify-message'
|
|
31
|
+
const FILE_NOTIFY = '--notify-message-file'
|
|
32
|
+
const NOTIFY_VALUE_INDEX = 1
|
|
33
|
+
// Set on the supervisor so it knows a failed stage is its to hand back (`run-ship-return.ts`); a ship run
|
|
34
|
+
// in an agent's own turn reports its failure in that turn and hands nothing back.
|
|
35
|
+
const SUPERVISED_KEY = 'JOSH_SHIP_SUPERVISED'
|
|
36
|
+
const SUPERVISED_VALUE = '1'
|
|
37
|
+
const LAUNCHED = 'launched'
|
|
38
|
+
const BUSY = 'busy'
|
|
39
|
+
const FAILED = 'failed'
|
|
40
|
+
const NO_SIGNAL = 0
|
|
41
|
+
// `detached_launch.log_header`'s shape — `\n=== <time> · started by process <pid> · <command> ===` — read
|
|
42
|
+
// back to find where the last launch into the log began.
|
|
43
|
+
const LAUNCH_MARK = ' · started by process '
|
|
44
|
+
const HEADER_START = '\n'
|
|
45
|
+
|
|
46
|
+
interface DetachRequest {
|
|
47
|
+
title: string
|
|
48
|
+
number: string
|
|
49
|
+
notify: ReadonlyArray<string>
|
|
50
|
+
body: ReadonlyArray<string>
|
|
51
|
+
cites: ReadonlyArray<string>
|
|
52
|
+
is_review: boolean
|
|
53
|
+
repository: string
|
|
54
|
+
cwd: string
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
interface DetachResult {
|
|
58
|
+
verdict: typeof LAUNCHED | typeof BUSY | typeof FAILED
|
|
59
|
+
note: string
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function key(prefix: string, request: Pick<DetachRequest, 'number' | 'repository'>): string {
|
|
63
|
+
return stamp_file.stamp_path(`${prefix}${request.number}${KEY_SEPARATOR}`, request.repository)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function log_path(repository: string, number: string): string {
|
|
67
|
+
return stamp_file.stamp_path(`${LOG_PREFIX}${number}${KEY_SEPARATOR}`, repository, LOG_SUFFIX)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function is_alive(pid: number): boolean {
|
|
71
|
+
try {
|
|
72
|
+
process.kill(pid, NO_SIGNAL)
|
|
73
|
+
|
|
74
|
+
return true
|
|
75
|
+
} catch (error) {
|
|
76
|
+
return error instanceof Error && 'code' in error && error.code === 'EPERM'
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// The recorded supervisor, when it is still running. An absent, unreadable or dead pid is no supervisor.
|
|
81
|
+
function is_supervisor_running(pid_target: string): boolean {
|
|
82
|
+
const pid = Number(stamp_file.read_stamp_text(pid_target)?.trim())
|
|
83
|
+
|
|
84
|
+
return Number.isSafeInteger(pid) && pid > 0 && is_alive(pid)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// The notify tail the supervisor is given: an inline body moved into a file, a file body passed as is.
|
|
88
|
+
function notify_arguments(request: DetachRequest): ReadonlyArray<string> {
|
|
89
|
+
const [flag, value] = [request.notify[0], request.notify[NOTIFY_VALUE_INDEX]]
|
|
90
|
+
|
|
91
|
+
if (flag !== INLINE_NOTIFY || value === undefined) return request.notify
|
|
92
|
+
|
|
93
|
+
const body_path = stamp_file.stamp_path(
|
|
94
|
+
`${BODY_PREFIX}${request.number}${KEY_SEPARATOR}`,
|
|
95
|
+
request.repository,
|
|
96
|
+
BODY_SUFFIX,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
stamp_file.write_text_stamp(body_path, value)
|
|
100
|
+
|
|
101
|
+
return [FILE_NOTIFY, body_path]
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function supervisor_argv(request: DetachRequest): LaunchArgv {
|
|
105
|
+
const review = request.is_review ? ['--review'] : []
|
|
106
|
+
const cites = request.cites.flatMap((cite) => ['--cite', cite])
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
command: PNPM,
|
|
110
|
+
args: [
|
|
111
|
+
'josh',
|
|
112
|
+
'ship',
|
|
113
|
+
...review,
|
|
114
|
+
...notify_arguments(request),
|
|
115
|
+
...request.body,
|
|
116
|
+
...cites,
|
|
117
|
+
request.title,
|
|
118
|
+
],
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function launch(request: DetachRequest): DetachResult {
|
|
123
|
+
const notes: Array<string> = []
|
|
124
|
+
const log = log_path(request.repository, request.number)
|
|
125
|
+
const result = detached_launch.launch(
|
|
126
|
+
{
|
|
127
|
+
argv: supervisor_argv(request),
|
|
128
|
+
cwd: request.cwd,
|
|
129
|
+
log_path: log,
|
|
130
|
+
// The provider travels as a mark because the launch strips the session keys that name it, and
|
|
131
|
+
// `ship --review` resolves its reviewer from it (joshuafolkken/kit#2456).
|
|
132
|
+
env: { ...agent_role_profile.handoff_environment(), [SUPERVISED_KEY]: SUPERVISED_VALUE },
|
|
133
|
+
},
|
|
134
|
+
(note) => {
|
|
135
|
+
notes.push(note)
|
|
136
|
+
},
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
if (result.kind === 'failed') return { verdict: FAILED, note: result.note }
|
|
140
|
+
|
|
141
|
+
stamp_file.write_text_stamp(key(PID_PREFIX, request), String(result.pid))
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
verdict: LAUNCHED,
|
|
145
|
+
note: [`supervisor ${String(result.pid)} — log: ${log}`, ...notes].join('\n'),
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
async function detach(request: DetachRequest): Promise<DetachResult> {
|
|
150
|
+
if (is_supervisor_running(key(PID_PREFIX, request))) {
|
|
151
|
+
return { verdict: BUSY, note: `a ship supervisor for #${request.number} is already running` }
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const result = launch(request)
|
|
155
|
+
|
|
156
|
+
if (result.verdict === LAUNCHED) {
|
|
157
|
+
await run_event_stream_emit.emit(
|
|
158
|
+
run_event_stream.EVENT_KIND.SHIP_LAUNCH,
|
|
159
|
+
`#${request.number} ship supervisor launched`,
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return result
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// The supervisor log carries every launch into it under `detached_launch`'s header; the report a stopped
|
|
167
|
+
// supervisor left is the last launch's, so that is what `josh ship --log` prints.
|
|
168
|
+
function last_launch(text: string): string {
|
|
169
|
+
const mark = text.lastIndexOf(LAUNCH_MARK)
|
|
170
|
+
|
|
171
|
+
if (mark === -1) return text
|
|
172
|
+
|
|
173
|
+
return text.slice(text.lastIndexOf(HEADER_START, mark) + HEADER_START.length)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function read_log(repository: string, number: string): string | undefined {
|
|
177
|
+
const text = stamp_file.read_stamp_text(log_path(repository, number))
|
|
178
|
+
|
|
179
|
+
return text === undefined ? undefined : last_launch(text)
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function is_supervised(source: NodeJS.ProcessEnv = process.env): boolean {
|
|
183
|
+
return source[SUPERVISED_KEY] === SUPERVISED_VALUE
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const run_ship_detach = {
|
|
187
|
+
BUSY,
|
|
188
|
+
FAILED,
|
|
189
|
+
LAUNCHED,
|
|
190
|
+
SUPERVISED_KEY,
|
|
191
|
+
detach,
|
|
192
|
+
is_supervised,
|
|
193
|
+
last_launch,
|
|
194
|
+
log_path,
|
|
195
|
+
read_log,
|
|
196
|
+
supervisor_argv,
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export type { DetachRequest, DetachResult }
|
|
200
|
+
export { run_ship_detach }
|