@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,105 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { josh_command } from '#scripts/josh/josh-run'
|
|
4
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
5
|
+
import { run_tail, type TailSection } from './run-tail'
|
|
6
|
+
|
|
7
|
+
// `josh run:tail [<N> ...]` — one call for the fixed post-merge sequence a run closes on
|
|
8
|
+
// (joshuafolkken/kit#2372). The loop used to spend a round trip on `observations:flush`, one on
|
|
9
|
+
// `issue:cite` and one on `release:scope`, re-billing a lane's full context each time; this runs the
|
|
10
|
+
// three internally and prints one composite report, the same way `backlog:offer` chains its two calls
|
|
11
|
+
// and `run:prep` bundles three reads. Each step's stderr is forwarded, so the reader still sees every
|
|
12
|
+
// explanation the three would have printed on their own.
|
|
13
|
+
//
|
|
14
|
+
// The issue numbers are the completion's citations — the closed issue and any follow-ups filed this run
|
|
15
|
+
// — and go to `issue:cite`; the other two take none. A `run:tail` with no numbers still closes the run,
|
|
16
|
+
// because `issue:cite` with no target exits zero.
|
|
17
|
+
//
|
|
18
|
+
// **A dispatched lane child skips the ledger step** (joshuafolkken/kit#2492). A flush opens a
|
|
19
|
+
// ledger-only pull request and waits out its whole CI before it merges — minutes per issue, spent on a
|
|
20
|
+
// file only the retrospective and the measurements read. The line stays appended in the primary
|
|
21
|
+
// checkout, and the `backlogrun` parent flushes once at its end (`run:carry --end`, `run-carry-flush.ts`).
|
|
22
|
+
// A single run outside a lane keeps the step: its one end is already the run's end.
|
|
23
|
+
|
|
24
|
+
const ARGV_OFFSET = 2
|
|
25
|
+
const SUCCESS_EXIT_CODE = 0
|
|
26
|
+
const FAILURE_EXIT_CODE = 1
|
|
27
|
+
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
28
|
+
const USAGE = 'Usage: josh run:tail [<issue-number> ...]'
|
|
29
|
+
const should_forward_stderr = true
|
|
30
|
+
|
|
31
|
+
interface Step {
|
|
32
|
+
header: string
|
|
33
|
+
argv: (issues: ReadonlyArray<string>) => ReadonlyArray<string>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The steps in the order a run closes on: the ledger is committed first so the recurrence count is on
|
|
37
|
+
// main, the citations are read for the completion report, and the release scope is decided last.
|
|
38
|
+
const FLUSH_STEP: Step = {
|
|
39
|
+
header: run_tail.OBSERVATIONS_HEADER,
|
|
40
|
+
argv: () => ['observations:flush'],
|
|
41
|
+
}
|
|
42
|
+
const REPORT_STEPS: ReadonlyArray<Step> = [
|
|
43
|
+
{ header: run_tail.CITATIONS_HEADER, argv: (issues) => ['issue:cite', ...issues] },
|
|
44
|
+
{ header: run_tail.RELEASE_HEADER, argv: () => ['release:scope'] },
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
function steps_for(is_lane_child: boolean): ReadonlyArray<Step> {
|
|
48
|
+
return is_lane_child ? REPORT_STEPS : [FLUSH_STEP, ...REPORT_STEPS]
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Numbers only — a target `issue:cite` reads as an issue, so a stray flag is refused rather than
|
|
52
|
+
// forwarded to the wrong step.
|
|
53
|
+
function parse_issues(argv: ReadonlyArray<string>): ReadonlyArray<string> | undefined {
|
|
54
|
+
if (argv.every((token) => ISSUE_NUMBER_PATTERN.test(token))) return argv
|
|
55
|
+
|
|
56
|
+
return undefined
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function run_step(step: Step, issues: ReadonlyArray<string>): Promise<TailSection> {
|
|
60
|
+
const result = await josh_command.josh_run(step.argv(issues), should_forward_stderr)
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
header: step.header,
|
|
64
|
+
body: run_tail.section_body(result.out, result.err, result.code),
|
|
65
|
+
code: result.code,
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Run the steps in order, not concurrently: the ledger commit must land on main before the release scope
|
|
70
|
+
// reads main's pending count, and the order is what a lane spent three turns on.
|
|
71
|
+
async function close_run(issues: ReadonlyArray<string>): Promise<ReadonlyArray<TailSection>> {
|
|
72
|
+
const sections: Array<TailSection> = []
|
|
73
|
+
|
|
74
|
+
const is_lane_child = lane_child_marker.is_child_of(process.cwd())
|
|
75
|
+
|
|
76
|
+
for (const step of steps_for(is_lane_child)) sections.push(await run_step(step, issues))
|
|
77
|
+
|
|
78
|
+
return sections
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
82
|
+
const issues = parse_issues(argv)
|
|
83
|
+
|
|
84
|
+
if (issues === undefined) {
|
|
85
|
+
console.error(USAGE)
|
|
86
|
+
|
|
87
|
+
return FAILURE_EXIT_CODE
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const sections = await close_run(issues)
|
|
91
|
+
|
|
92
|
+
console.info(run_tail.format_report(sections))
|
|
93
|
+
|
|
94
|
+
return run_tail.exit_code(sections)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
98
|
+
process.exitCode = await run(argv)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const run_tail_cli = { SUCCESS_EXIT_CODE, USAGE, close_run, main, parse_issues, run }
|
|
102
|
+
|
|
103
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
104
|
+
|
|
105
|
+
export { run_tail_cli }
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// `josh run:tail [<N> ...]` — the one call that closes a run (joshuafolkken/kit#2372). It folds the
|
|
2
|
+
// fixed post-merge bookkeeping a lane spends three separate round trips on — commit the observation
|
|
3
|
+
// ledger (`observations:flush`), read the completion citations (`issue:cite`), and decide whether a
|
|
4
|
+
// release is owed (`release:scope`) — into one composite, the same shape `run:prep` bundles three reads
|
|
5
|
+
// on. None of the three needs a decision between it and the next, so nothing the reader had to judge is
|
|
6
|
+
// folded away; the review verdict, the merge and the push stay their own calls above this.
|
|
7
|
+
//
|
|
8
|
+
// **This module is the pure half**, kept apart from the chaining CLI the way `run-prep.ts` is. It joins
|
|
9
|
+
// each step's output under a header and answers the exit code from the collected codes, so a test pins
|
|
10
|
+
// the composite without a ledger ever being committed or a release ever read.
|
|
11
|
+
|
|
12
|
+
const OBSERVATIONS_HEADER = '=== observations ==='
|
|
13
|
+
const CITATIONS_HEADER = '=== citations ==='
|
|
14
|
+
const RELEASE_HEADER = '=== release ==='
|
|
15
|
+
const SECTION_SEPARATOR = '\n\n'
|
|
16
|
+
|
|
17
|
+
const SUCCESS_EXIT_CODE = 0
|
|
18
|
+
const FAILURE_EXIT_CODE = 1
|
|
19
|
+
|
|
20
|
+
interface TailSection {
|
|
21
|
+
header: string
|
|
22
|
+
body: string
|
|
23
|
+
code: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function section_report(section: TailSection): string {
|
|
27
|
+
return `${section.header}\n${section.body}`
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function format_report(sections: ReadonlyArray<TailSection>): string {
|
|
31
|
+
return sections.map((section) => section_report(section)).join(SECTION_SEPARATOR)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// **A failed step's stderr joins its body** (joshuafolkken/kit#2462). A detached run's log keeps the
|
|
35
|
+
// report, not the terminal, so a refusal printed only to stderr left the section reading
|
|
36
|
+
// `ELIFECYCLE` alone. A passing step's stderr is commentary and stays out of the report.
|
|
37
|
+
function section_body(out: string, error_output: string | undefined, code: number): string {
|
|
38
|
+
if (code === SUCCESS_EXIT_CODE || error_output === undefined) return out
|
|
39
|
+
|
|
40
|
+
return [out, error_output].filter((part) => part.length > 0).join('\n')
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Non-zero when any step failed, exactly as each of the three exits on its own — a bundle where the
|
|
44
|
+
// ledger commit failed is never read as a clean close because the citations after it succeeded.
|
|
45
|
+
function exit_code(sections: ReadonlyArray<TailSection>): number {
|
|
46
|
+
const is_clean = sections.every((section) => section.code === SUCCESS_EXIT_CODE)
|
|
47
|
+
|
|
48
|
+
return is_clean ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const run_tail = {
|
|
52
|
+
CITATIONS_HEADER,
|
|
53
|
+
OBSERVATIONS_HEADER,
|
|
54
|
+
RELEASE_HEADER,
|
|
55
|
+
exit_code,
|
|
56
|
+
format_report,
|
|
57
|
+
section_body,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export type { TailSection }
|
|
61
|
+
export { run_tail }
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
## child-completion
|
|
2
|
+
a launched child runs through to its merge
|
|
3
|
+
start verdict implement
|
|
4
|
+
planned verdict implement
|
|
5
|
+
child launched verdict wait
|
|
6
|
+
child merged command pnpm josh run:merge 2250
|
|
7
|
+
|
|
8
|
+
## park
|
|
9
|
+
a child is parked and the batch moves on
|
|
10
|
+
start verdict implement
|
|
11
|
+
child parked command pnpm josh backlog:next
|
|
12
|
+
|
|
13
|
+
## cut-and-resume
|
|
14
|
+
the run is cut before its gate, then resumes to the merge
|
|
15
|
+
start verdict implement
|
|
16
|
+
cut taken command pnpm josh run:cut --resume 2250
|
|
17
|
+
resumed, pr open command pnpm josh followup
|
|
18
|
+
second review command pnpm josh review:round2
|
|
19
|
+
merged command pnpm josh run:merge 2250
|
|
20
|
+
|
|
21
|
+
## lanes-full
|
|
22
|
+
every lane holds a child, so the parent waits
|
|
23
|
+
start verdict implement
|
|
24
|
+
lanes full verdict wait
|
|
25
|
+
|
|
26
|
+
## consecutive-failure-stop
|
|
27
|
+
the failure guard stops the run
|
|
28
|
+
start verdict implement
|
|
29
|
+
outage command pnpm josh run:merge 2250
|
|
30
|
+
guard stops command pnpm josh retrospective
|
|
31
|
+
|
|
32
|
+
## drain-retrospective
|
|
33
|
+
the backlog drains, so the retrospective runs before the idle watch
|
|
34
|
+
start verdict implement
|
|
35
|
+
backlog drained command pnpm josh retrospective
|
|
36
|
+
retrospective done verdict wait
|
|
37
|
+
|
|
38
|
+
## expired-budget
|
|
39
|
+
the whole-run budget is spent — a person decides
|
|
40
|
+
start decide decide: whole-run budget spent — resume with `pnpm josh run:carry --resume` | discard with `pnpm josh run:carry --end`
|
|
41
|
+
|
|
42
|
+
## unreadable-carry
|
|
43
|
+
the carry record cannot be read
|
|
44
|
+
start verdict unknown
|
|
45
|
+
|
|
46
|
+
## closed-already-done
|
|
47
|
+
the issue is already closed, whatever the events say
|
|
48
|
+
start verdict already-done
|
|
49
|
+
after a merge verdict already-done
|
|
50
|
+
|
|
51
|
+
## needs-human-review
|
|
52
|
+
the issue stops before its commit for a person
|
|
53
|
+
start verdict human-review
|
|
54
|
+
|
|
55
|
+
## update-deps-first
|
|
56
|
+
a required dependency update comes before implementing
|
|
57
|
+
start verdict update-deps
|
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { randomUUID } from 'node:crypto'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { fileURLToPath } from 'node:url'
|
|
5
|
+
import { parseArgs } from 'node:util'
|
|
6
|
+
import type { AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
7
|
+
import { telegram_notify } from '#scripts/git/telegram-notify'
|
|
8
|
+
import { run_carry, type CarryRead } from './run-carry'
|
|
9
|
+
import { run_event_stream } from './run-event-stream'
|
|
10
|
+
import { run_headless } from './run-headless'
|
|
11
|
+
import { run_wake, type RunWake, type WakeStopReason, type WakeTidyResult } from './run-wake'
|
|
12
|
+
import { run_wake_describe, type WakeContext } from './run-wake-describe'
|
|
13
|
+
import { run_wake_driver } from './run-wake-driver'
|
|
14
|
+
import { run_wake_handoff } from './run-wake-handoff'
|
|
15
|
+
import { run_wake_loop, type LoopPorts, type LoopStop } from './run-wake-loop'
|
|
16
|
+
import { run_wake_session, type LaunchResult } from './run-wake-session'
|
|
17
|
+
|
|
18
|
+
// `josh run:wake --start | --list | --stop | --loop` — the supervisor that continues a cut
|
|
19
|
+
// `backlogrun` or `queue` without a person retyping the keyword (joshuafolkken/kit#1719,
|
|
20
|
+
// joshuafolkken/kit#1774). **Which invocations it may continue is `run-invocation.ts`'s answer**, not
|
|
21
|
+
// this file's: nothing here reads the recorded text, it is handed to `wake_argv` and either rebuilt
|
|
22
|
+
// from that module's own constants or refused.
|
|
23
|
+
//
|
|
24
|
+
// The stdout/stderr split is the contract every `run:*` command shares: exactly one verdict token on
|
|
25
|
+
// stdout on every path, the reason and the advice on stderr, so a loop branches on one token.
|
|
26
|
+
//
|
|
27
|
+
// **`--start` and `--loop` are two halves of one thing.** `--start` spawns this same script detached
|
|
28
|
+
// with `--loop` and returns immediately, which is what leaves the supervisor outside the conversation;
|
|
29
|
+
// `--loop` is the body, and running it in the foreground is how a person watches what it does.
|
|
30
|
+
|
|
31
|
+
const SUCCESS_EXIT_CODE = 0
|
|
32
|
+
const FAILURE_EXIT_CODE = 1
|
|
33
|
+
const ARGV_OFFSET = 2
|
|
34
|
+
const ONE_GROUP = 1
|
|
35
|
+
const MS_PER_SECOND = 1000
|
|
36
|
+
const DEFAULT_INTERVAL_SECONDS = 60
|
|
37
|
+
// Whole and positive. A zero interval is a busy loop against the temp directory, not a faster
|
|
38
|
+
// supervisor.
|
|
39
|
+
const INTERVAL_PATTERN = /^[1-9]\d*$/u
|
|
40
|
+
// **Bounded above as well as below, and for the same reason.** `setTimeout` clamps any delay past
|
|
41
|
+
// 2^31−1 ms to *one millisecond*, so a number large enough to look like "poll rarely" produces exactly
|
|
42
|
+
// the busy loop the lower bound exists to prevent. An hour is far past any useful polling interval and
|
|
43
|
+
// nowhere near the clamp.
|
|
44
|
+
const MAX_INTERVAL_SECONDS = 3600
|
|
45
|
+
const SCRIPT_PATH = fileURLToPath(import.meta.url)
|
|
46
|
+
|
|
47
|
+
const STARTED_VERDICT = 'started'
|
|
48
|
+
const RUNNING_VERDICT = 'running'
|
|
49
|
+
const STOPPED_VERDICT = 'stopped'
|
|
50
|
+
const SUPERVISING_VERDICT = 'supervising'
|
|
51
|
+
const STALE_VERDICT = 'stale'
|
|
52
|
+
const NONE_VERDICT = 'none'
|
|
53
|
+
const UNKNOWN_VERDICT = 'unknown'
|
|
54
|
+
const FAILED_VERDICT = 'failed'
|
|
55
|
+
|
|
56
|
+
// **The note covers both ways `wake_argv` answers `undefined`**, because it cannot tell them apart and
|
|
57
|
+
// a message that named only the first would accuse a legitimate invocation of carrying unsafe text
|
|
58
|
+
// (joshuafolkken/kit#1774). The second is the one a person actually meets: a `queue` whose references
|
|
59
|
+
// carry a `owner/repo#` prefix is a grammar this supervisor does not rebuild, and `queue.md` → "The
|
|
60
|
+
// session boundary" is why such a queue begins no record in the first place.
|
|
61
|
+
const UNSAFE_INVOCATION_NOTE =
|
|
62
|
+
'the carried invocation is not one this supervisor can continue — it is neither a backlogrun nor a queue it can rebuild, or it carries text that may not be passed to a command line'
|
|
63
|
+
// The command rather than one entry point: since joshuafolkken/kit#1774 the supervisor continues a
|
|
64
|
+
// `queue` as readily as a `backlogrun`, and a warning that named the wrong one would send the reader
|
|
65
|
+
// looking at a run that is not the one that stopped.
|
|
66
|
+
const WARNING_TITLE = 'run:wake supervisor'
|
|
67
|
+
const WARNING_RECOVERY = `Check the wake command, then restart with \`pnpm josh run:wake --start\`.`
|
|
68
|
+
// **The stop reasons that reach a person, and what each one tells them** (joshuafolkken/kit#1746). A
|
|
69
|
+
// reason absent from this map is one where nothing went wrong: `ended` is the run finishing through
|
|
70
|
+
// `run:carry --end`, `stopped` is a person's own `--stop` or a supervisor being superseded, and a
|
|
71
|
+
// warning channel that fired on those is one that stops being read.
|
|
72
|
+
//
|
|
73
|
+
// **`expired` and `unreadable` were silent until joshuafolkken/kit#1746, and that was the defect
|
|
74
|
+
// rather than the design.** Both end the supervisor while a carry record is still sitting there handed
|
|
75
|
+
// off, so the run is left asleep with nothing anywhere saying so — `run-wake.ts` →
|
|
76
|
+
// `is_predecessor_exiting` names the `expired` one as a silent overnight failure in as many words, and
|
|
77
|
+
// then only the `failed` reason was wired to the notification.
|
|
78
|
+
// **Every reason is listed, and the silent two are listed as `undefined`.** A partial map would let a
|
|
79
|
+
// sixth stop reason compile straight past this and reach nobody, which is the defect class this
|
|
80
|
+
// section exists to close.
|
|
81
|
+
const STOP_BODIES: Record<WakeStopReason, string | undefined> = {
|
|
82
|
+
ended: undefined,
|
|
83
|
+
stopped: undefined,
|
|
84
|
+
failed: 'The supervisor could not continue the run and has stopped.',
|
|
85
|
+
expired:
|
|
86
|
+
'The carried run passed its whole-run bound, so the supervisor stopped without continuing it.',
|
|
87
|
+
unreadable:
|
|
88
|
+
'The carry record could not be read, so the supervisor stopped rather than guess at it.',
|
|
89
|
+
}
|
|
90
|
+
const SUPERSEDED_RESULT: WakeTidyResult = 'superseded'
|
|
91
|
+
const SUPERSEDED_NOTE =
|
|
92
|
+
'another supervisor now holds the record, so it was left alone; this loop is the superseded one'
|
|
93
|
+
|
|
94
|
+
const USAGE = 'Usage: josh run:wake --start | --list | --stop | --loop [--interval <seconds>]'
|
|
95
|
+
|
|
96
|
+
const OPTIONS = {
|
|
97
|
+
interval: { type: 'string' },
|
|
98
|
+
list: { type: 'boolean' },
|
|
99
|
+
loop: { type: 'boolean' },
|
|
100
|
+
start: { type: 'boolean' },
|
|
101
|
+
stop: { type: 'boolean' },
|
|
102
|
+
} as const
|
|
103
|
+
|
|
104
|
+
type ParsedValues = Partial<Record<keyof typeof OPTIONS, string | boolean>>
|
|
105
|
+
|
|
106
|
+
function report(verdict: string, exit_code: number = SUCCESS_EXIT_CODE): number {
|
|
107
|
+
console.info(verdict)
|
|
108
|
+
|
|
109
|
+
return exit_code
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function usage(): number {
|
|
113
|
+
console.error(USAGE)
|
|
114
|
+
|
|
115
|
+
return FAILURE_EXIT_CODE
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function note_to_stderr(note: string): void {
|
|
119
|
+
console.error(`wake: ${note}`)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function read_arguments(argv: ReadonlyArray<string>): ParsedValues | undefined {
|
|
123
|
+
try {
|
|
124
|
+
return parseArgs({ args: [...argv], options: OPTIONS, strict: true }).values
|
|
125
|
+
} catch {
|
|
126
|
+
return undefined
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function text_of(value: string | boolean | undefined): string | undefined {
|
|
131
|
+
return typeof value === 'string' ? value : undefined
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function to_interval_ms(value: string | boolean | undefined): number | undefined {
|
|
135
|
+
if (typeof value !== 'string') return DEFAULT_INTERVAL_SECONDS * MS_PER_SECOND
|
|
136
|
+
if (!INTERVAL_PATTERN.test(value)) return undefined
|
|
137
|
+
|
|
138
|
+
const seconds = Number(value)
|
|
139
|
+
|
|
140
|
+
return seconds > MAX_INTERVAL_SECONDS ? undefined : seconds * MS_PER_SECOND
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Exactly one verb, never a guessed order between two.
|
|
144
|
+
function group_count(values: ParsedValues): number {
|
|
145
|
+
const verbs = [values.start, values.stop, values.list, values.loop]
|
|
146
|
+
|
|
147
|
+
return verbs.filter((flag) => flag === true).length
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async function resolve_context(): Promise<WakeContext | undefined> {
|
|
151
|
+
const directory = await run_carry.repository_directory()
|
|
152
|
+
|
|
153
|
+
if (directory === undefined) return undefined
|
|
154
|
+
|
|
155
|
+
const log_target = run_wake.wake_log_path(directory)
|
|
156
|
+
|
|
157
|
+
// Every verb reaches this one function, so creating the log here is what makes the path each of
|
|
158
|
+
// them prints a path that exists — including `--list` and the already-running branch of `--start`,
|
|
159
|
+
// neither of which launches anything (joshuafolkken/kit#1759).
|
|
160
|
+
run_wake_session.ensure_log(log_target, note_to_stderr)
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
carry_target: run_carry.carry_path(directory),
|
|
164
|
+
wake_target: run_wake.wake_path(directory),
|
|
165
|
+
log_target,
|
|
166
|
+
event_target: run_event_stream.target_of(directory),
|
|
167
|
+
worktree: path.dirname(directory),
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// There is nothing to supervise unless a run is actually carrying a budget. Refusing here rather than
|
|
172
|
+
// starting a supervisor that would stop on its first pass is what keeps `--start` honest: a `started`
|
|
173
|
+
// that ends a second later is worse than a refusal that says why.
|
|
174
|
+
function refuse_without_carry(kind: CarryRead['kind']): number {
|
|
175
|
+
console.error(`No carried run here to supervise — \`pnpm josh run:carry --json\` says ${kind}.`)
|
|
176
|
+
|
|
177
|
+
return report(NONE_VERDICT, FAILURE_EXIT_CODE)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function wake_session(
|
|
181
|
+
context: WakeContext,
|
|
182
|
+
invocation: string,
|
|
183
|
+
profile: AgentProfile,
|
|
184
|
+
session: { id: string; material: string },
|
|
185
|
+
): LaunchResult {
|
|
186
|
+
const built = run_wake_session.wake_argv(invocation, profile, context.worktree, session)
|
|
187
|
+
|
|
188
|
+
if (built === undefined) return { kind: 'failed', note: UNSAFE_INVOCATION_NOTE }
|
|
189
|
+
if (built.kind === 'rejected') return { kind: 'failed', note: built.note }
|
|
190
|
+
|
|
191
|
+
// The headless mark is what lets the stop hook hold this session's turn open while its lanes run —
|
|
192
|
+
// under `claude -p` a turn-end is the process's end (`run-headless.ts`, joshuafolkken/kit#2437).
|
|
193
|
+
const environment = run_headless.environment()
|
|
194
|
+
const target = { cwd: context.worktree, env: environment, log_path: context.log_target }
|
|
195
|
+
|
|
196
|
+
return run_wake_session.launch({ argv: built.argv, ...target, profile }, note_to_stderr)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function ports_for(context: WakeContext, profile: AgentProfile): LoopPorts {
|
|
200
|
+
return {
|
|
201
|
+
read_carry: () => run_carry.read_carry(context.carry_target),
|
|
202
|
+
is_owner_live: (read) => read.kind === 'carried' && run_carry.is_owner_live(read.carry),
|
|
203
|
+
has_work: async () => true,
|
|
204
|
+
new_session_id: () => randomUUID(),
|
|
205
|
+
hand_off: () => {
|
|
206
|
+
run_wake_handoff.hand_off(context.carry_target)
|
|
207
|
+
},
|
|
208
|
+
drive: async () => await run_wake_driver.drive(context.carry_target),
|
|
209
|
+
wake: (invocation, session_id, material) =>
|
|
210
|
+
wake_session(context, invocation, profile, { id: session_id, material }),
|
|
211
|
+
sleep: async (milliseconds) => {
|
|
212
|
+
await new Promise((resolve) => setTimeout(resolve, milliseconds))
|
|
213
|
+
},
|
|
214
|
+
now: () => new Date(),
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// The log is named in the warning rather than only in `--list`, because the person reading a warning
|
|
219
|
+
// at three in the morning is the one who needs to know where to look next.
|
|
220
|
+
function log_hint(context: WakeContext): string {
|
|
221
|
+
return `The output of every session this supervisor started is in ${context.log_target}.`
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
async function warn_of_stop(stop: LoopStop, body: string, context: WakeContext): Promise<void> {
|
|
225
|
+
await telegram_notify.warn({
|
|
226
|
+
issue_title: WARNING_TITLE,
|
|
227
|
+
body: [body, stop.note, log_hint(context)].filter(Boolean).join('\n'),
|
|
228
|
+
recovery: WARNING_RECOVERY,
|
|
229
|
+
})
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// **Only a failed wake exits non-zero, and the two reasons that newly warn do not**
|
|
233
|
+
// (joshuafolkken/kit#1746). The verdict-and-exit-code table in `docs/josh-commands.md` is a contract
|
|
234
|
+
// callers branch on; what `expired` and `unreadable` were missing is the notification, not a different
|
|
235
|
+
// exit code, and changing both at once would break a caller to fix a silence.
|
|
236
|
+
function exit_code_of(reason: WakeStopReason): number {
|
|
237
|
+
return reason === run_wake_loop.FAILED_REASON ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// A failure that reached nobody is the defect, so the Telegram goes out before the verdict is printed.
|
|
241
|
+
// Which stops reach a person, and what each one says — `undefined` for the two where nothing went
|
|
242
|
+
// wrong. It is a function rather than a bare lookup so the decision can be asserted for every reason
|
|
243
|
+
// the loop can end on, which is the contract joshuafolkken/kit#1746 changed.
|
|
244
|
+
function stop_body(reason: WakeStopReason): string | undefined {
|
|
245
|
+
return STOP_BODIES[reason]
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
async function finish(stop: LoopStop, context: WakeContext): Promise<number> {
|
|
249
|
+
const body = stop_body(stop.reason)
|
|
250
|
+
|
|
251
|
+
if (body === undefined) return report(stop.reason)
|
|
252
|
+
|
|
253
|
+
console.error(stop.note ?? body)
|
|
254
|
+
await warn_of_stop(stop, body, context)
|
|
255
|
+
|
|
256
|
+
return report(stop.reason, exit_code_of(stop.reason))
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function spawn_supervisor(context: WakeContext, interval: string | undefined): number {
|
|
260
|
+
const profile = run_wake_session.scheduler_profile()
|
|
261
|
+
if (profile === undefined) return report(FAILED_VERDICT, FAILURE_EXIT_CODE)
|
|
262
|
+
const argv = run_wake_session.supervisor_argv(SCRIPT_PATH, interval)
|
|
263
|
+
// **The supervisor's own output goes to the same file as the sessions it starts.** It is detached
|
|
264
|
+
// with the same call, so before joshuafolkken/kit#1746 its `console.error` — the launch note that
|
|
265
|
+
// says the agent CLI is not on `PATH`, and the stop note behind every warning — went nowhere at all.
|
|
266
|
+
const result = run_wake_session.launch(
|
|
267
|
+
{
|
|
268
|
+
argv,
|
|
269
|
+
cwd: context.worktree,
|
|
270
|
+
log_path: context.log_target,
|
|
271
|
+
env: run_wake_session.supervisor_environment(profile),
|
|
272
|
+
},
|
|
273
|
+
note_to_stderr,
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
if (result.kind === 'failed') {
|
|
277
|
+
console.error(`Could not start the supervisor: ${result.note}`)
|
|
278
|
+
|
|
279
|
+
return report(FAILED_VERDICT, FAILURE_EXIT_CODE)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
console.error(
|
|
283
|
+
`Supervisor started as process ${String(result.pid)}. Stop it with \`${run_wake_describe.STOP_COMMAND}\`.`,
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
return report(STARTED_VERDICT)
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
function start(context: WakeContext, interval: string | undefined): number {
|
|
290
|
+
const read = run_carry.read_carry(context.carry_target)
|
|
291
|
+
|
|
292
|
+
if (read.kind !== 'carried') return refuse_without_carry(read.kind)
|
|
293
|
+
|
|
294
|
+
const existing = run_wake.read_wake(context.wake_target)
|
|
295
|
+
|
|
296
|
+
if (existing !== undefined && run_wake.is_supervisor_live(existing)) {
|
|
297
|
+
console.error(run_wake_describe.describe_wake(existing, context))
|
|
298
|
+
|
|
299
|
+
return report(RUNNING_VERDICT)
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return spawn_supervisor(context, interval)
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// **The loop removes its record on the way out, and only its own** (joshuafolkken/kit#1727). A loop
|
|
306
|
+
// that ended after its record was taken over used to delete the *successor's* record here, and the
|
|
307
|
+
// run then went on with nobody watching it.
|
|
308
|
+
//
|
|
309
|
+
// **`superseded` is announced, because the two ways of ending look identical otherwise.** A `--stop`
|
|
310
|
+
// and a take-over both leave this loop reporting `stopped` at exit 0, so a supervisor that was
|
|
311
|
+
// replaced would leave no trace of that anywhere. Which of the two happened is `tidy_own_wake`'s
|
|
312
|
+
// answer rather than a second read taken here — the branch that decides it belongs beside the record,
|
|
313
|
+
// where it is tested, not in a CLI that would have to re-derive it.
|
|
314
|
+
function tidy_up(target: string): void {
|
|
315
|
+
if (run_wake.tidy_own_wake(target) === SUPERSEDED_RESULT) note_to_stderr(SUPERSEDED_NOTE)
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
async function loop(context: WakeContext, interval_ms: number): Promise<number> {
|
|
319
|
+
const read = run_carry.read_carry(context.carry_target)
|
|
320
|
+
|
|
321
|
+
if (read.kind !== 'carried') return refuse_without_carry(read.kind)
|
|
322
|
+
|
|
323
|
+
const profile = run_wake_session.scheduler_profile()
|
|
324
|
+
if (profile === undefined) return report(FAILED_VERDICT, FAILURE_EXIT_CODE)
|
|
325
|
+
|
|
326
|
+
const claimed = run_wake.claim(context.wake_target, read.carry.invocation, new Date(), profile)
|
|
327
|
+
|
|
328
|
+
if (claimed === undefined) return report(RUNNING_VERDICT)
|
|
329
|
+
|
|
330
|
+
const stop = await run_wake_loop.run_loop(
|
|
331
|
+
context.wake_target,
|
|
332
|
+
ports_for(context, claimed.profile ?? profile),
|
|
333
|
+
interval_ms,
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
tidy_up(context.wake_target)
|
|
337
|
+
|
|
338
|
+
return await finish(stop, context)
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// **The verdict tracks whether the supervisor is actually running, not merely whether a record is
|
|
342
|
+
// there.** A crash or a reboot leaves the record behind, and a caller branching on the one stdout token
|
|
343
|
+
// — which is the documented way to use this — would read `supervising` for a supervisor that is gone.
|
|
344
|
+
function list(context: WakeContext): number {
|
|
345
|
+
const wake = run_wake.read_wake(context.wake_target)
|
|
346
|
+
|
|
347
|
+
if (wake === undefined) return report(NONE_VERDICT)
|
|
348
|
+
|
|
349
|
+
console.error(run_wake_describe.describe_wake(wake, context))
|
|
350
|
+
|
|
351
|
+
return report(run_wake.is_supervisor_live(wake) ? SUPERVISING_VERDICT : STALE_VERDICT)
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// **Removing the record is the stop; the signal only shortens the wait.** A pid already gone, or one
|
|
355
|
+
// this process may not signal, is not an error — the loop ends at its next pass either way, because it
|
|
356
|
+
// re-reads the record it no longer finds and `run_wake.update_wake` refuses to write one back.
|
|
357
|
+
function signal_supervisor(wake: RunWake): void {
|
|
358
|
+
if (!run_wake.is_supervisor_live(wake)) return
|
|
359
|
+
|
|
360
|
+
try {
|
|
361
|
+
process.kill(wake.pid, 'SIGTERM')
|
|
362
|
+
} catch {
|
|
363
|
+
console.error(
|
|
364
|
+
`Process ${String(wake.pid)} could not be signalled; the record is removed regardless.`,
|
|
365
|
+
)
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
function stop_supervisor(context: WakeContext): number {
|
|
370
|
+
const wake = run_wake.read_wake(context.wake_target)
|
|
371
|
+
|
|
372
|
+
if (wake === undefined) return report(NONE_VERDICT)
|
|
373
|
+
|
|
374
|
+
run_wake.remove_wake(context.wake_target)
|
|
375
|
+
signal_supervisor(wake)
|
|
376
|
+
|
|
377
|
+
return report(STOPPED_VERDICT)
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
async function dispatch(
|
|
381
|
+
values: ParsedValues,
|
|
382
|
+
context: WakeContext,
|
|
383
|
+
interval_ms: number,
|
|
384
|
+
): Promise<number> {
|
|
385
|
+
if (values.loop === true) return await loop(context, interval_ms)
|
|
386
|
+
if (values.start === true) return start(context, text_of(values.interval))
|
|
387
|
+
if (values.stop === true) return stop_supervisor(context)
|
|
388
|
+
|
|
389
|
+
return list(context)
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
393
|
+
const values = read_arguments(argv)
|
|
394
|
+
|
|
395
|
+
if (values === undefined || group_count(values) !== ONE_GROUP) return usage()
|
|
396
|
+
|
|
397
|
+
const interval_ms = to_interval_ms(values.interval)
|
|
398
|
+
|
|
399
|
+
if (interval_ms === undefined) return usage()
|
|
400
|
+
|
|
401
|
+
const context = await resolve_context()
|
|
402
|
+
|
|
403
|
+
if (context === undefined) return report(UNKNOWN_VERDICT, FAILURE_EXIT_CODE)
|
|
404
|
+
|
|
405
|
+
return await dispatch(values, context, interval_ms)
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
409
|
+
process.exitCode = await run(argv)
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
const run_wake_cli = {
|
|
413
|
+
FAILED_VERDICT,
|
|
414
|
+
NONE_VERDICT,
|
|
415
|
+
RUNNING_VERDICT,
|
|
416
|
+
STALE_VERDICT,
|
|
417
|
+
STARTED_VERDICT,
|
|
418
|
+
STOPPED_VERDICT,
|
|
419
|
+
SUPERVISING_VERDICT,
|
|
420
|
+
UNKNOWN_VERDICT,
|
|
421
|
+
USAGE,
|
|
422
|
+
run,
|
|
423
|
+
stop_body,
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
if (process.argv[1] === SCRIPT_PATH) await main(process.argv.slice(ARGV_OFFSET))
|
|
427
|
+
|
|
428
|
+
export { run_wake_cli }
|