@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,97 @@
|
|
|
1
|
+
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
2
|
+
import { run_carry, type CarryRead } from './run-carry'
|
|
3
|
+
import { run_event_stream } from './run-event-stream'
|
|
4
|
+
import { run_liveness } from './run-liveness'
|
|
5
|
+
import { run_wake, type RunWake } from './run-wake'
|
|
6
|
+
|
|
7
|
+
// The `--list` presentation of a wake record (joshuafolkken/kit#2407 split it out of `run-wake-cli.ts`,
|
|
8
|
+
// which had reached its line limit). What the command *does* stays in the CLI; how a supervisor's
|
|
9
|
+
// record reads back to a person lives here, one cohesive block.
|
|
10
|
+
|
|
11
|
+
const UNKNOWN_CUTS = 'an unreadable number of'
|
|
12
|
+
const STOP_COMMAND = 'pnpm josh run:wake --stop'
|
|
13
|
+
|
|
14
|
+
// The three paths every verb needs: the carry record it reads, its own record, and the work tree a
|
|
15
|
+
// woken session runs in. The work tree is the common git directory's parent, which is the *primary*
|
|
16
|
+
// checkout — a lane must never be where the next session resumes, because a lane belongs to one child.
|
|
17
|
+
interface WakeContext {
|
|
18
|
+
carry_target: string
|
|
19
|
+
wake_target: string
|
|
20
|
+
// Where everything this supervisor starts writes its output (joshuafolkken/kit#1746). It is named
|
|
21
|
+
// in `--list` and in every warning, because a path nobody is told is a file nobody reads.
|
|
22
|
+
log_target: string
|
|
23
|
+
// The run's event stream, keyed on the primary checkout's git directory — the one the resumed
|
|
24
|
+
// `backlogrun` parent runs in, so its own git directory is this common one, exactly the key the emit
|
|
25
|
+
// side uses. `--list` relays the newest event from here: the report surface belongs to the run, and
|
|
26
|
+
// `--list` is the degenerate last-event read of the same stream the attached session follows
|
|
27
|
+
// (joshuafolkken/kit#2207).
|
|
28
|
+
event_target: string
|
|
29
|
+
worktree: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function carry_cuts(read: CarryRead): string {
|
|
33
|
+
if (read.kind === 'carried' || read.kind === 'expired') return String(read.carry.cuts)
|
|
34
|
+
|
|
35
|
+
return UNKNOWN_CUTS
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// **A wake that has gone out and has not been answered is said out loud** (joshuafolkken/kit#1746).
|
|
39
|
+
// Read from `woke` and `cuts` alone, the forty minutes a supervisor spends retrying one lost cut look
|
|
40
|
+
// exactly like the second before its first launch — so a person checking on a stalled backlog was
|
|
41
|
+
// shown nothing to check. `attempts` is present only while a cut is unserved, which is why its
|
|
42
|
+
// absence is what prints nothing.
|
|
43
|
+
function outstanding_line(wake: RunWake): string | undefined {
|
|
44
|
+
if (wake.attempts === undefined) return undefined
|
|
45
|
+
|
|
46
|
+
return `${String(wake.attempts)} launch(es) outstanding for the current cut, none claimed yet`
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// The run's stream, read here because a headless parent's progress reaches its own transcript alone —
|
|
50
|
+
// after a cut, `--list` is the person's one window onto it (joshuafolkken/kit#1910). Two lines: the
|
|
51
|
+
// newest event (the degenerate last-event read of the stream the watch pane follows, so `--list` and
|
|
52
|
+
// the pane read one stream rather than two paths), and how to watch on from here in a pane of its own —
|
|
53
|
+
// the same surface before and after the cut, with `tail -F` on the raw stream named as a recovery path
|
|
54
|
+
// rather than the ambient one (joshuafolkken/kit#2207, joshuafolkken/kit#2492). The event line is
|
|
55
|
+
// omitted before the first event, the way `outstanding_line` omits a count of zero; the watch line is
|
|
56
|
+
// always shown.
|
|
57
|
+
function stream_lines(context: WakeContext): Array<string> {
|
|
58
|
+
const event = run_event_stream.read_last(context.event_target)
|
|
59
|
+
const progress = event === undefined ? [] : [`progress: ${run_event_stream.format_event(event)}`]
|
|
60
|
+
const follow = `watch: \`pnpm josh run:event --watch ${String(event?.pos ?? 0)}\` in a pane of its own (recover with \`tail -F ${context.event_target}\`)`
|
|
61
|
+
|
|
62
|
+
return [...progress, follow]
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// The wake count is printed beside the carry record's `cuts` rather than alone, because their relation
|
|
66
|
+
// is the property worth being able to check — one wake per cut, plus one per crashed session the
|
|
67
|
+
// supervisor recovered (joshuafolkken/kit#2336), so `woke >= cuts` and the gap is the recoveries.
|
|
68
|
+
// `woke < cuts` is the shortfall that says a cut went unserved, and since joshuafolkken/kit#1746 `woke`
|
|
69
|
+
// counts records actually claimed rather than sessions started.
|
|
70
|
+
// **The outstanding line beside it is what makes a shortfall readable**: the count is observed at a
|
|
71
|
+
// poll, so it lags a claim by up to one interval, and launches still outstanding are what say whether
|
|
72
|
+
// a missing wake is one not yet seen or one that never arrived.
|
|
73
|
+
function describe_wake(wake: RunWake, context: WakeContext): string {
|
|
74
|
+
const live = run_wake.is_supervisor_live(wake) ? 'running' : 'not running'
|
|
75
|
+
const cuts = carry_cuts(run_carry.read_carry(context.carry_target))
|
|
76
|
+
|
|
77
|
+
return [
|
|
78
|
+
`invocation: ${wake.invocation}`,
|
|
79
|
+
`profile: ${wake.profile === undefined ? 'unrecorded' : agent_role_profile.describe(wake.profile)}`,
|
|
80
|
+
`supervisor: process ${String(wake.pid)} (${live}), watching since ${wake.started_at}`,
|
|
81
|
+
`woke ${String(wake.woke)} session(s) across ${cuts} cut(s)`,
|
|
82
|
+
outstanding_line(wake),
|
|
83
|
+
run_liveness.describe_agent_state(context.log_target),
|
|
84
|
+
`output: ${context.log_target}`,
|
|
85
|
+
// How progress is seen without asking after the cut: the run's stream, followed from here
|
|
86
|
+
// (joshuafolkken/kit#2207). `--list` is that reader's one-shot last-event form.
|
|
87
|
+
...stream_lines(context),
|
|
88
|
+
`stop it with \`${STOP_COMMAND}\``,
|
|
89
|
+
]
|
|
90
|
+
.filter((line) => line !== undefined)
|
|
91
|
+
.join('\n')
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const run_wake_describe = { STOP_COMMAND, describe_wake }
|
|
95
|
+
|
|
96
|
+
export type { WakeContext }
|
|
97
|
+
export { run_wake_describe }
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
2
|
+
import { run_carry, type CarryRead } from './run-carry'
|
|
3
|
+
import { run_invocation } from './run-invocation'
|
|
4
|
+
import type { DriveResult } from './run-wake-loop'
|
|
5
|
+
|
|
6
|
+
const SUCCESS = 0
|
|
7
|
+
const FIRST_LINE = 0
|
|
8
|
+
const RESUME_PREFIX = 'resume: '
|
|
9
|
+
|
|
10
|
+
function driver_args(invocation: string): ReadonlyArray<string> | undefined {
|
|
11
|
+
const rebuilt = run_invocation.rebuild(invocation)
|
|
12
|
+
if (rebuilt !== invocation) return undefined
|
|
13
|
+
const named_count = run_invocation.issue_numbers(rebuilt)?.length ?? 0
|
|
14
|
+
|
|
15
|
+
return [
|
|
16
|
+
'backlog:drive',
|
|
17
|
+
'--owner',
|
|
18
|
+
String(process.pid),
|
|
19
|
+
...rebuilt.split(' ').slice(1 + named_count),
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function is_final_stop(verdict: string | undefined, read: CarryRead): boolean {
|
|
24
|
+
return verdict?.startsWith('stop') === true && read.kind === 'none'
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function handoff_material(verdict: string, resume: string, details: string): string {
|
|
28
|
+
const context = details === '' ? '' : `\nDetails: ${details}`
|
|
29
|
+
const epic = verdict.startsWith('epic #')
|
|
30
|
+
? '\nThe named item is an epic. Follow backlogrun-steps.md named epic procedure; do not launch the epic root as a fullrun child. After all children merge or park, record the root with pnpm josh run:carry --done <epic-number> --owner "$PPID" before continuing to the next named item.'
|
|
31
|
+
: ''
|
|
32
|
+
|
|
33
|
+
return `Driver result: ${verdict}\n${resume}${context}${epic}`
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function driver_result(out: string, read: CarryRead, details = ''): DriveResult {
|
|
37
|
+
const lines = out.split('\n')
|
|
38
|
+
const verdict = lines[FIRST_LINE]
|
|
39
|
+
|
|
40
|
+
if (is_final_stop(verdict, read)) return { kind: 'finished' }
|
|
41
|
+
const resume = lines.find((line) => line.startsWith(RESUME_PREFIX))
|
|
42
|
+
|
|
43
|
+
if (verdict === undefined || resume === undefined) {
|
|
44
|
+
return { kind: 'failed', note: `backlog:drive returned an incomplete result: ${out}` }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return { kind: 'judgment', material: handoff_material(verdict, resume, details) }
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function read_result(result: JoshResult, target: string): DriveResult {
|
|
51
|
+
if (result.code !== SUCCESS) return { kind: 'failed', note: result.err ?? result.out }
|
|
52
|
+
|
|
53
|
+
return driver_result(result.out, run_carry.read_carry(target), result.err)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function claim_record(target: string, invocation: string): boolean {
|
|
57
|
+
const current = run_carry.read_carry(target)
|
|
58
|
+
if (current.kind !== 'carried' || current.carry.invocation !== invocation) return false
|
|
59
|
+
if (current.carry.is_handed_off !== true && run_carry.is_owner_live(current.carry)) return false
|
|
60
|
+
|
|
61
|
+
return run_carry.adopt_carry(target, current.carry, run_carry.owner_of(process.pid)) !== undefined
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async function drive(target: string): Promise<DriveResult> {
|
|
65
|
+
const read = run_carry.read_carry(target)
|
|
66
|
+
if (read.kind !== 'carried') return { kind: 'failed', note: 'The carry record changed.' }
|
|
67
|
+
|
|
68
|
+
const args = driver_args(read.carry.invocation)
|
|
69
|
+
if (args === undefined) return { kind: 'failed', note: 'The carried invocation is invalid.' }
|
|
70
|
+
|
|
71
|
+
if (!claim_record(target, read.carry.invocation)) {
|
|
72
|
+
return { kind: 'failed', note: 'The driver could not claim the carry record.' }
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const result = await josh_command.josh_run(args, true)
|
|
76
|
+
|
|
77
|
+
return read_result(result, target)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export const run_wake_driver = { drive, driver_args, driver_result }
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
2
|
+
import { run_carry } from './run-carry'
|
|
3
|
+
|
|
4
|
+
// The supervisor's recovery hand-off (joshuafolkken/kit#2437). A session that claimed the carry record
|
|
5
|
+
// and then died without `run:carry --cut` leaves it `carried`, owned by a gone process, with no
|
|
6
|
+
// hand-off. `run-wake.ts` → `decide_not_handed_off` already re-wakes on that record (#2336), but the
|
|
7
|
+
// successor it woke then ran `--begin` over a record no cut handed off and was answered `standing` —
|
|
8
|
+
// "stop for a person" — so the recovery ended the run it existed to continue.
|
|
9
|
+
//
|
|
10
|
+
// **The fix is to make the recovery a cut, not to teach the successor a second answer.** Before it
|
|
11
|
+
// launches, the supervisor writes the same `is_handed_off` a `--cut` writes, so the successor's
|
|
12
|
+
// `--begin` classifies `resume` through the one path a declared cut already takes, and `standing` is
|
|
13
|
+
// left meaning what `backlogrun-steps.md` says it means: a record nobody is watching.
|
|
14
|
+
//
|
|
15
|
+
// It writes only where the record is `carried` and not already handed off, so on the ordinary path —
|
|
16
|
+
// a hand-off a cut already declared — it touches nothing. The dead-owner test is the caller's: the loop
|
|
17
|
+
// reaches a launch on an un-handed-off record only through `decide_not_handed_off`'s dead-owner branch.
|
|
18
|
+
|
|
19
|
+
function hand_off(target: string): void {
|
|
20
|
+
const read = run_carry.read_carry(target)
|
|
21
|
+
|
|
22
|
+
if (read.kind !== 'carried' || read.carry.is_handed_off === true) return
|
|
23
|
+
|
|
24
|
+
stamp_file.write_stamp(target, { ...read.carry, is_handed_off: true })
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const run_wake_handoff = { hand_off }
|
|
28
|
+
|
|
29
|
+
export { run_wake_handoff }
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import type { CarryRead } from './run-carry'
|
|
2
|
+
import {
|
|
3
|
+
run_wake,
|
|
4
|
+
type RunWake,
|
|
5
|
+
type WakeDecision,
|
|
6
|
+
type WakeDecisionInput,
|
|
7
|
+
type WakeStopReason,
|
|
8
|
+
} from './run-wake'
|
|
9
|
+
import type { LaunchResult } from './run-wake-session'
|
|
10
|
+
|
|
11
|
+
// The supervisor's body: read the carry record, decide, act, sleep, repeat (joshuafolkken/kit#1719).
|
|
12
|
+
//
|
|
13
|
+
// **Everything it touches is a port**, so the loop is testable without a real process, a real clock or
|
|
14
|
+
// a real Telegram. What is left here is the sequencing, which is the part worth pinning: a run that
|
|
15
|
+
// woke twice for one cut, or that stopped on a record it had not re-read, would be wrong in a way no
|
|
16
|
+
// unit test of `decide` alone could see.
|
|
17
|
+
//
|
|
18
|
+
// **The supervisor re-reads its own record every pass, and that is how `--stop` works.** Removing the
|
|
19
|
+
// record is the stop signal; the signal sent alongside it only shortens the wait. So a stop is honored
|
|
20
|
+
// even where the process cannot be signalled, and the supervisor never outlives a record a person
|
|
21
|
+
// deliberately removed.
|
|
22
|
+
|
|
23
|
+
const STOPPED_REASON: WakeStopReason = 'stopped'
|
|
24
|
+
const FAILED_REASON: WakeStopReason = 'failed'
|
|
25
|
+
const NO_ATTEMPTS = 0
|
|
26
|
+
const STOPPED_BY_PERSON: LoopStop = { reason: STOPPED_REASON, note: undefined }
|
|
27
|
+
// **The back-off after repeated whiffs, and its ceiling** (joshuafolkken/kit#2417). While a launch is
|
|
28
|
+
// deferred for want of work, each wait is as long as the idle stretch so far — so the polling interval
|
|
29
|
+
// doubles pass by pass — capped at this multiple of the configured one. Eight times the one-minute
|
|
30
|
+
// default is eight minutes: far fewer backlog reads over a long empty stretch, and still well inside
|
|
31
|
+
// the idle ceiling, so work that appears is picked up within one capped wait.
|
|
32
|
+
const MAX_BACKOFF_FACTOR = 8
|
|
33
|
+
|
|
34
|
+
interface LoopPorts {
|
|
35
|
+
// The carry record, re-read every pass rather than cached: it is written by the parent loop of a
|
|
36
|
+
// different session, which is the whole point of reading it here.
|
|
37
|
+
read_carry: () => CarryRead
|
|
38
|
+
// Whether the process named on the carry record is still running. The cutting session writes
|
|
39
|
+
// `--cut` and then exits, so the two moments are not the same one and the supervisor has to wait
|
|
40
|
+
// out the second — `run-wake.ts` → `WakeDecisionInput.is_owner_live`.
|
|
41
|
+
is_owner_live: (read: CarryRead) => boolean
|
|
42
|
+
// A compatibility probe for the wake decision. Production lets the resident driver inspect work,
|
|
43
|
+
// including an empty idle watch, without starting an AI session.
|
|
44
|
+
has_work: (read: CarryRead) => Promise<boolean | undefined>
|
|
45
|
+
// **The forced transcript id is generated here and handed to `wake`** (joshuafolkken/kit#2407), so
|
|
46
|
+
// the loop stays deterministic under test — a fixture returns a known id — while production draws a
|
|
47
|
+
// fresh UUID. The same id is recorded on the wake record, which is how `josh time --run` later knows
|
|
48
|
+
// the session was one this supervisor started.
|
|
49
|
+
new_session_id: () => string
|
|
50
|
+
// Hands the carry record from the supervisor-owned driver to a judgment session.
|
|
51
|
+
hand_off: () => void
|
|
52
|
+
// Runs the deterministic backlog driver. A normal completion never calls `wake`.
|
|
53
|
+
drive: () => Promise<DriveResult>
|
|
54
|
+
wake: (invocation: string, session_id: string, material: string) => LaunchResult
|
|
55
|
+
sleep: (milliseconds: number) => Promise<void>
|
|
56
|
+
now: () => Date
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
type DriveResult =
|
|
60
|
+
{ kind: 'finished' } | { kind: 'judgment'; material: string } | { kind: 'failed'; note: string }
|
|
61
|
+
|
|
62
|
+
interface LoopStop {
|
|
63
|
+
reason: WakeStopReason
|
|
64
|
+
// What went wrong, where anything did. It is what the completion warning quotes, so a failure never
|
|
65
|
+
// reaches the person as a bare verdict they then have to go and diagnose.
|
|
66
|
+
note: string | undefined
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
type StepOutcome = { kind: 'continue'; wake: RunWake } | { kind: 'stop'; stop: LoopStop }
|
|
70
|
+
|
|
71
|
+
function stopped(reason: WakeStopReason, note?: string): StepOutcome {
|
|
72
|
+
return { kind: 'stop', stop: { reason, note } }
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// The grace window elapsing is the launch-failure detector, so the note has to say what was expected
|
|
76
|
+
// rather than only that something failed — the person reading it has no other record of the attempt.
|
|
77
|
+
// **The last process is named because it is not killed**: a session that is merely slow is still doing
|
|
78
|
+
// the run's work, so the warning hands the person something to check rather than destroying it.
|
|
79
|
+
function wake_failure_note(wake: RunWake): string {
|
|
80
|
+
const attempts = String(wake.attempts ?? NO_ATTEMPTS)
|
|
81
|
+
const last = wake.woke_pid === undefined ? 'none' : `process ${String(wake.woke_pid)}`
|
|
82
|
+
|
|
83
|
+
return `woke a session for "${wake.invocation}" ${attempts} time(s) and none of them claimed the carry record; the last one was ${last}, which may still be running`
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// The hand-off is written before the launch, never after: a successor that boots fast enough to run
|
|
87
|
+
// `--begin` before a post-launch write would read the record un-handed-off and be answered `standing`.
|
|
88
|
+
async function wake_step(wake: RunWake, ports: LoopPorts): Promise<StepOutcome> {
|
|
89
|
+
const driven = await ports.drive()
|
|
90
|
+
if (driven.kind === 'finished') return stopped('ended')
|
|
91
|
+
if (driven.kind === 'failed') return stopped(FAILED_REASON, driven.note)
|
|
92
|
+
|
|
93
|
+
const session_id = ports.new_session_id()
|
|
94
|
+
|
|
95
|
+
ports.hand_off()
|
|
96
|
+
|
|
97
|
+
const result = ports.wake(wake.invocation, session_id, driven.material)
|
|
98
|
+
|
|
99
|
+
if (result.kind === 'failed') return stopped(FAILED_REASON, result.note)
|
|
100
|
+
|
|
101
|
+
return { kind: 'continue', wake: run_wake.count_wake(wake, ports.now(), result.pid, session_id) }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// A `wait` means the woken session has claimed the carry record, so the wake mark is cleared and the
|
|
105
|
+
// next cut starts the grace window afresh — **and it is the only pass on which `woke` may grow**
|
|
106
|
+
// (joshuafolkken/kit#1746), because arriving here is the supervisor observing that a record it was
|
|
107
|
+
// waiting on has been taken over. A `hold` starts the ceiling on a wait without launching
|
|
108
|
+
// anything — the bounded wait on a predecessor that has cut but not yet exited, which ends the moment
|
|
109
|
+
// that predecessor does. A `pending` keeps what is there, because the window it is measured from is
|
|
110
|
+
// still open.
|
|
111
|
+
function continue_step(wake: RunWake, decision: WakeDecision, ports: LoopPorts): StepOutcome {
|
|
112
|
+
if (decision.kind === 'wait') return { kind: 'continue', wake: run_wake.count_claim(wake) }
|
|
113
|
+
|
|
114
|
+
if (decision.kind === 'hold') {
|
|
115
|
+
return { kind: 'continue', wake: run_wake.mark_wait(wake, ports.now()) }
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (decision.kind === 'idle') {
|
|
119
|
+
return { kind: 'continue', wake: run_wake.mark_idle(wake, ports.now()) }
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return { kind: 'continue', wake }
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async function step(wake: RunWake, decision: WakeDecision, ports: LoopPorts): Promise<StepOutcome> {
|
|
126
|
+
if (decision.kind === 'stop') return stopped(decision.reason)
|
|
127
|
+
if (decision.kind === 'failed') return stopped(FAILED_REASON, wake_failure_note(wake))
|
|
128
|
+
if (decision.kind === 'wake') return await wake_step(wake, ports)
|
|
129
|
+
|
|
130
|
+
return continue_step(wake, decision, ports)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// `has_work` starts as "cannot tell", which never defers anything — so this first input decides every
|
|
134
|
+
// branch except whether a launch has work to go to.
|
|
135
|
+
function decision_input(wake: RunWake, ports: LoopPorts): WakeDecisionInput {
|
|
136
|
+
const read = ports.read_carry()
|
|
137
|
+
|
|
138
|
+
return {
|
|
139
|
+
read,
|
|
140
|
+
woke_at: wake.woke_at,
|
|
141
|
+
attempts: wake.attempts ?? NO_ATTEMPTS,
|
|
142
|
+
is_owner_live: ports.is_owner_live(read),
|
|
143
|
+
held_at: wake.held_at,
|
|
144
|
+
has_work: undefined,
|
|
145
|
+
idle_since: wake.idle_since,
|
|
146
|
+
now: ports.now(),
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// **Work is asked about only where the answer could change the decision** (joshuafolkken/kit#2417):
|
|
151
|
+
// on a pass the record alone would launch from. Every other pass — the in-flight wait, the pending
|
|
152
|
+
// grace window, the hold — decides from the record as before and costs no backlog read.
|
|
153
|
+
async function decide_pass(wake: RunWake, ports: LoopPorts): Promise<WakeDecision> {
|
|
154
|
+
const input = decision_input(wake, ports)
|
|
155
|
+
const decision = run_wake.decide(input)
|
|
156
|
+
|
|
157
|
+
if (decision.kind !== 'wake') return decision
|
|
158
|
+
|
|
159
|
+
return run_wake.decide({ ...input, has_work: await ports.has_work(input.read) })
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// The wait before the next pass: the configured interval, stretched while a launch is being deferred
|
|
163
|
+
// to the length of the idle stretch so far and capped at `MAX_BACKOFF_FACTOR` times the interval.
|
|
164
|
+
function next_interval(wake: RunWake | undefined, interval_ms: number, now: Date): number {
|
|
165
|
+
const idle_since = wake?.idle_since === undefined ? NaN : Date.parse(wake.idle_since)
|
|
166
|
+
|
|
167
|
+
if (Number.isNaN(idle_since)) return interval_ms
|
|
168
|
+
|
|
169
|
+
const stretched = Math.max(interval_ms, now.getTime() - idle_since)
|
|
170
|
+
|
|
171
|
+
return Math.min(stretched, interval_ms * MAX_BACKOFF_FACTOR)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// The record is re-read at the top of every pass rather than carried in a variable, so a `--stop` that
|
|
175
|
+
// removed it ends the loop at the next interval and a `--list` reads what the loop actually wrote.
|
|
176
|
+
// One pass: decide, act, write the result back. `undefined` means carry on to the next interval.
|
|
177
|
+
async function run_pass(
|
|
178
|
+
target: string,
|
|
179
|
+
wake: RunWake,
|
|
180
|
+
ports: LoopPorts,
|
|
181
|
+
): Promise<LoopStop | undefined> {
|
|
182
|
+
const outcome = await step(wake, await decide_pass(wake, ports), ports)
|
|
183
|
+
|
|
184
|
+
if (outcome.kind === 'stop') return outcome.stop
|
|
185
|
+
|
|
186
|
+
return run_wake.update_wake(target, outcome.wake) ? undefined : STOPPED_BY_PERSON
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// The record is re-read at the top of every pass rather than carried in a variable, so a `--stop` that
|
|
190
|
+
// removed it ends the loop at the next interval and a `--list` reads what the loop actually wrote.
|
|
191
|
+
//
|
|
192
|
+
// **`read_own_wake` rather than `read_wake`, and the difference is a whole pass** (joshuafolkken/kit#1727).
|
|
193
|
+
// A record that has become a *successor's* is not this loop's to act on, and reading it back would
|
|
194
|
+
// have this pass decide from another supervisor's counters — spawning a session for a cut that
|
|
195
|
+
// supervisor is already serving, and only then finding the write-back refused. Read as owned or not
|
|
196
|
+
// at all, the replaced loop ends here, quietly and before it does anything: the run is not
|
|
197
|
+
// unattended, because the supervisor that took the record over is watching it.
|
|
198
|
+
async function run_loop(target: string, ports: LoopPorts, interval_ms: number): Promise<LoopStop> {
|
|
199
|
+
let wake = run_wake.read_own_wake(target)
|
|
200
|
+
|
|
201
|
+
while (wake !== undefined) {
|
|
202
|
+
const stop = await run_pass(target, wake, ports)
|
|
203
|
+
|
|
204
|
+
if (stop !== undefined) return stop
|
|
205
|
+
|
|
206
|
+
await ports.sleep(next_interval(run_wake.read_own_wake(target), interval_ms, ports.now()))
|
|
207
|
+
wake = run_wake.read_own_wake(target)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return STOPPED_BY_PERSON
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const run_wake_loop = {
|
|
214
|
+
FAILED_REASON,
|
|
215
|
+
MAX_BACKOFF_FACTOR,
|
|
216
|
+
STOPPED_REASON,
|
|
217
|
+
next_interval,
|
|
218
|
+
run_loop,
|
|
219
|
+
step,
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export type { DriveResult, LoopPorts, LoopStop }
|
|
223
|
+
export { run_wake_loop }
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { agent_argv, type AgentArgvResult } from '#scripts/agent/agent-argv'
|
|
2
|
+
import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
3
|
+
import { claude_agent_argv } from '#scripts/agent/claude-agent-argv'
|
|
4
|
+
import { detached_launch, type LaunchArgv } from './detached-launch'
|
|
5
|
+
import { run_invocation } from './run-invocation'
|
|
6
|
+
|
|
7
|
+
// How the supervisor starts things: the next agent session, and — at `--start` — its own detached
|
|
8
|
+
// self. Both go through one `launch`, because the two differ only in what is being run
|
|
9
|
+
// (joshuafolkken/kit#1719).
|
|
10
|
+
//
|
|
11
|
+
// **The launch itself is no longer this file's** (joshuafolkken/kit#1749). `detached-launch.ts` holds
|
|
12
|
+
// it, because a delegated child dispatched into a lane needs the same mechanism and none of the
|
|
13
|
+
// invocation parsing this supervisor needs. What stays here is the constants naming the agent CLI and
|
|
14
|
+
// the two argument vectors this supervisor composes.
|
|
15
|
+
//
|
|
16
|
+
// **The invocation grammar is no longer this file's either** (joshuafolkken/kit#1774; folded into
|
|
17
|
+
// `backlogrun` by joshuafolkken/kit#1984). `run-carry.ts` reads the same grammar to say which of a
|
|
18
|
+
// `backlogrun`'s named issues are still outstanding — so it is `run-invocation.ts`'s, imported
|
|
19
|
+
// rather than restated. What that move does **not** change is the rebuild-from-constants design: the
|
|
20
|
+
// invocation handed to the agent CLI is still composed out of that module's own constants and
|
|
21
|
+
// validated integers; a judgment handoff adds the driver's result after that validated invocation.
|
|
22
|
+
//
|
|
23
|
+
// **The agent CLI is a constant, not configuration, and it is the Claude adapter's constant.** It was
|
|
24
|
+
// an environment variable first (`JOSH_WAKE_COMMAND`), which put the choice of *which binary runs* in
|
|
25
|
+
// reach of anything that can set an environment — and this binary runs unattended, overnight, in the
|
|
26
|
+
// person's own checkout with the person's own credentials. Shape-checking the name does not address
|
|
27
|
+
// that; removing the choice does. The two names below are aliases of that one constant rather than a
|
|
28
|
+
// second copy of it (joshuafolkken/kit#1749).
|
|
29
|
+
//
|
|
30
|
+
// **The waker adds nothing to what may be run.** The argument vector is the constant command plus an
|
|
31
|
+
// invocation rebuilt to say exactly what the record said, and nothing here writes a label: `auto-ok`
|
|
32
|
+
// stays a person's to apply, so a woken session is offered by exactly the rules the first one was. A
|
|
33
|
+
// pool that grew across the seam is `backlogrun-steps.md` → "What one invocation approves", not the
|
|
34
|
+
// waker's doing (joshuafolkken/kit#1675).
|
|
35
|
+
const WAKE_COMMAND = claude_agent_argv.AGENT_COMMAND
|
|
36
|
+
const WAKE_FLAGS = claude_agent_argv.AGENT_FLAGS
|
|
37
|
+
const LOOP_FLAG = '--loop'
|
|
38
|
+
const INTERVAL_FLAG = '--interval'
|
|
39
|
+
const SUPERVISOR_SESSION = 'run-wake-supervisor'
|
|
40
|
+
|
|
41
|
+
function scheduler_profile(): AgentProfile | undefined {
|
|
42
|
+
const resolved = agent_role_profile.resolve(agent_role_profile.SCHEDULER)
|
|
43
|
+
if (resolved.kind === 'profile') return resolved.profile
|
|
44
|
+
|
|
45
|
+
console.error(resolved.note)
|
|
46
|
+
|
|
47
|
+
return undefined
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function supervisor_environment(profile: AgentProfile): Record<string, string> {
|
|
51
|
+
return profile.provider === 'openai'
|
|
52
|
+
? { CODEX_THREAD_ID: SUPERVISOR_SESSION }
|
|
53
|
+
: { CLAUDE_CODE_CHILD_SESSION: SUPERVISOR_SESSION }
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// **What comes back is always the rebuilt text, and it is refused unless it matches the record.** The
|
|
57
|
+
// two requirements are separate. Returning the rebuilt string is what severs the flow from the file;
|
|
58
|
+
// requiring it to match is what keeps the wake usable, because the woken session hands its prompt
|
|
59
|
+
// straight back to `run:carry --begin`, where `is_handed_off_to` compares it to the record character
|
|
60
|
+
// for character. A record the rebuild would rewrite — odd spacing, or a value written `05` — is
|
|
61
|
+
// therefore refused here, and the supervisor stops at once with a note, where waking on it would launch
|
|
62
|
+
// three sessions that each decline to claim the record and take half an hour to say so.
|
|
63
|
+
//
|
|
64
|
+
// It goes on the command line last and as one argument, never interpolated into a command string: it is
|
|
65
|
+
// the prompt the woken session is given, not a list of arguments to the agent CLI. The split happens
|
|
66
|
+
// here, to read the record; the pieces are one argument again before they leave.
|
|
67
|
+
function safe_invocation(invocation: string): string | undefined {
|
|
68
|
+
if (!detached_launch.is_safe_value(invocation)) return undefined
|
|
69
|
+
|
|
70
|
+
const rebuilt = run_invocation.rebuild(invocation)
|
|
71
|
+
|
|
72
|
+
return rebuilt === invocation ? rebuilt : undefined
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// **The two failure modes are kept apart, not folded into one `undefined`** (joshuafolkken/kit#1932).
|
|
76
|
+
// An unmatched or unsafe invocation is `undefined` and the caller names it as one; a rejected effort
|
|
77
|
+
// override carries the role resolver's own note through the `rejected` variant, so a
|
|
78
|
+
// `JOSH_SCHEDULER_EFFORT` typo is reported as the env typo it is rather than as unreadable carried text.
|
|
79
|
+
// **`session_id` forces the woken session's transcript id, and only where a work tree is given**
|
|
80
|
+
// (joshuafolkken/kit#2407). A wake always resolves both a profile and the primary checkout, so it
|
|
81
|
+
// reaches the `with_profile_in` branch; the cwd-less branch stays for callers that force nothing.
|
|
82
|
+
function profiled_argv(
|
|
83
|
+
invocation: string,
|
|
84
|
+
profile: AgentProfile,
|
|
85
|
+
cwd?: string,
|
|
86
|
+
session_id?: string,
|
|
87
|
+
): AgentArgvResult {
|
|
88
|
+
return cwd === undefined
|
|
89
|
+
? agent_argv.with_profile(invocation, profile)
|
|
90
|
+
: agent_argv.with_profile_in(invocation, profile, cwd, session_id)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function resolved_argv(invocation: string, cwd?: string): AgentArgvResult {
|
|
94
|
+
return cwd === undefined
|
|
95
|
+
? agent_argv.resolve(invocation, agent_role_profile.SCHEDULER)
|
|
96
|
+
: agent_argv.resolve_in(invocation, agent_role_profile.SCHEDULER, cwd)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function wake_argv(
|
|
100
|
+
invocation: string,
|
|
101
|
+
profile?: AgentProfile,
|
|
102
|
+
cwd?: string,
|
|
103
|
+
session?: string | { id: string; material: string },
|
|
104
|
+
): AgentArgvResult | undefined {
|
|
105
|
+
const matched = safe_invocation(invocation)
|
|
106
|
+
if (matched === undefined) return undefined
|
|
107
|
+
const prompt =
|
|
108
|
+
typeof session === 'object' ? `${matched}\n\nDriver handoff:\n${session.material}` : matched
|
|
109
|
+
const session_id = typeof session === 'object' ? session.id : session
|
|
110
|
+
|
|
111
|
+
return profile === undefined
|
|
112
|
+
? resolved_argv(prompt, cwd)
|
|
113
|
+
: profiled_argv(prompt, profile, cwd, session_id)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Re-invoking this very script under the same runner, which is what makes the supervisor outlive the
|
|
117
|
+
// session that started it. `execArgv` is carried across rather than dropped, because the loader flags
|
|
118
|
+
// are what let the runner execute a TypeScript entry point at all — without them the detached process
|
|
119
|
+
// starts and immediately fails on the syntax.
|
|
120
|
+
//
|
|
121
|
+
// **The interval is forwarded rather than dropped.** `--start --interval 15` accepts the flag, so a
|
|
122
|
+
// supervisor that then polled at the default would be silently ignoring what it was told.
|
|
123
|
+
function supervisor_argv(script_path: string, interval?: string): LaunchArgv {
|
|
124
|
+
const chosen = interval === undefined ? [] : [INTERVAL_FLAG, interval]
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
command: process.execPath,
|
|
128
|
+
args: [...process.execArgv, script_path, LOOP_FLAG, ...chosen],
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// **`ensure_log`, `is_safe_argv` and `launch` are re-exported rather than reimplemented.** They are
|
|
133
|
+
// `detached-launch.ts`'s now; naming them here keeps `run:wake`'s own callers reading one namespace,
|
|
134
|
+
// and there is exactly one implementation behind both names (joshuafolkken/kit#1749).
|
|
135
|
+
const run_wake_session = {
|
|
136
|
+
INTERVAL_FLAG,
|
|
137
|
+
LOOP_FLAG,
|
|
138
|
+
WAKE_COMMAND,
|
|
139
|
+
WAKE_FLAGS,
|
|
140
|
+
ensure_log: detached_launch.ensure_log,
|
|
141
|
+
is_safe_argv: detached_launch.is_safe_argv,
|
|
142
|
+
launch: detached_launch.launch,
|
|
143
|
+
scheduler_profile,
|
|
144
|
+
supervisor_argv,
|
|
145
|
+
supervisor_environment,
|
|
146
|
+
wake_argv,
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export type { LaunchRequest, LaunchResult } from './detached-launch'
|
|
150
|
+
export { run_wake_session }
|