@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,329 @@
|
|
|
1
|
+
import { agent_session_environment } from '#scripts/josh/agent-session-environment'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
const FIRST_PRINTABLE_CODE = 0x20
|
|
5
|
+
const DELETE_CODE = 0x7f
|
|
6
|
+
const FIRST_CODE_POINT = 0
|
|
7
|
+
const EMPTY_LENGTH = 0
|
|
8
|
+
const MAX_VALUE_LENGTH = 4096
|
|
9
|
+
|
|
10
|
+
const ROLE_SCHEMA = z.enum(['scheduler', 'worker', 'reviewer'])
|
|
11
|
+
const PROVIDER_SCHEMA = z.enum(['anthropic', 'openai'])
|
|
12
|
+
const EFFORT_SCHEMA = z.enum(['low', 'medium', 'high', 'xhigh', 'max'])
|
|
13
|
+
// The run phases effort may vary by (joshuafolkken/kit#2382). They are the cut boundaries a lane child
|
|
14
|
+
// resumes across — `run-cut.ts` imports these names for its own cut record, so the phase a run passes
|
|
15
|
+
// and the phase this table is keyed on cannot drift. A phase-less call resolves the role default, which
|
|
16
|
+
// is what keeps every existing caller unchanged.
|
|
17
|
+
const PHASE_SCHEMA = z.enum(['implementation', 'pre-gate'])
|
|
18
|
+
const PROFILE_SCHEMA = z.object({
|
|
19
|
+
provider: PROVIDER_SCHEMA.default('anthropic'),
|
|
20
|
+
role: ROLE_SCHEMA,
|
|
21
|
+
model: z.string(),
|
|
22
|
+
effort: EFFORT_SCHEMA,
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
type AgentRole = z.infer<typeof ROLE_SCHEMA>
|
|
26
|
+
type AgentProvider = z.infer<typeof PROVIDER_SCHEMA>
|
|
27
|
+
type AgentEffort = z.infer<typeof EFFORT_SCHEMA>
|
|
28
|
+
type AgentPhase = z.infer<typeof PHASE_SCHEMA>
|
|
29
|
+
type AgentProfile = z.infer<typeof PROFILE_SCHEMA>
|
|
30
|
+
type AgentEnvironment = Readonly<Record<string, string | undefined>>
|
|
31
|
+
type ProfileResult = { kind: 'profile'; profile: AgentProfile } | { kind: 'rejected'; note: string }
|
|
32
|
+
type Rejected = Extract<ProfileResult, { kind: 'rejected' }>
|
|
33
|
+
type EffortResult = Rejected | { kind: 'effort'; effort: AgentEffort }
|
|
34
|
+
type ProviderResult = Rejected | { kind: 'provider'; provider: AgentProvider }
|
|
35
|
+
|
|
36
|
+
const SCHEDULER: AgentRole = 'scheduler'
|
|
37
|
+
const WORKER: AgentRole = 'worker'
|
|
38
|
+
const REVIEWER: AgentRole = 'reviewer'
|
|
39
|
+
const IMPLEMENTATION_PHASE: AgentPhase = 'implementation'
|
|
40
|
+
const PRE_GATE_PHASE: AgentPhase = 'pre-gate'
|
|
41
|
+
const ANTHROPIC_PROVIDER: AgentProvider = 'anthropic'
|
|
42
|
+
const OPENAI_PROVIDER: AgentProvider = 'openai'
|
|
43
|
+
// **Pinned model ids, never a floating alias** (joshuafolkken/kit#2415). An alias such as `opus` moves
|
|
44
|
+
// whenever the CLI moves it, so a run log could not say which model produced it and a model migration
|
|
45
|
+
// could not be measured apart from everything else. A new lane records the id it resolved; a lane
|
|
46
|
+
// created before a migration keeps the model it recorded (`with_phase_effort` leaves it untouched).
|
|
47
|
+
const OPENAI_MODEL = 'gpt-6-sol'
|
|
48
|
+
const ANTHROPIC_MODEL = 'claude-opus-5-5'
|
|
49
|
+
const CODEX_SESSION_KEY = 'CODEX_THREAD_ID'
|
|
50
|
+
|
|
51
|
+
const DEFAULT_PROFILES: Readonly<Record<AgentRole, AgentProfile>> = {
|
|
52
|
+
scheduler: {
|
|
53
|
+
provider: ANTHROPIC_PROVIDER,
|
|
54
|
+
role: SCHEDULER,
|
|
55
|
+
model: ANTHROPIC_MODEL,
|
|
56
|
+
effort: 'medium',
|
|
57
|
+
},
|
|
58
|
+
worker: { provider: ANTHROPIC_PROVIDER, role: WORKER, model: ANTHROPIC_MODEL, effort: 'medium' },
|
|
59
|
+
reviewer: {
|
|
60
|
+
provider: ANTHROPIC_PROVIDER,
|
|
61
|
+
role: REVIEWER,
|
|
62
|
+
model: ANTHROPIC_MODEL,
|
|
63
|
+
effort: 'high',
|
|
64
|
+
},
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const OPENAI_PROFILES: Readonly<Record<AgentRole, AgentProfile>> = {
|
|
68
|
+
scheduler: { provider: OPENAI_PROVIDER, role: SCHEDULER, model: OPENAI_MODEL, effort: 'medium' },
|
|
69
|
+
worker: { provider: OPENAI_PROVIDER, role: WORKER, model: OPENAI_MODEL, effort: 'medium' },
|
|
70
|
+
reviewer: { provider: OPENAI_PROVIDER, role: REVIEWER, model: OPENAI_MODEL, effort: 'high' },
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const PROVIDER_PROFILES = { anthropic: DEFAULT_PROFILES, openai: OPENAI_PROFILES }
|
|
74
|
+
|
|
75
|
+
// **Effort as a function of the run phase, not the role alone** (joshuafolkken/kit#2382). For the first
|
|
76
|
+
// merge only the mechanical ship/bookkeeping region is lowered: the pre-gate resume drives the gate,
|
|
77
|
+
// commit, PR and merge, applying fixes the gate has already named — work SKILL.md §2b calls the opposite
|
|
78
|
+
// of judgement. The design-judgment implementation phases keep the role default, as does any role/phase
|
|
79
|
+
// with no entry, and the review's own judgement is the reviewer role's (`high`), untouched by lowering
|
|
80
|
+
// the worker here. The investigation phase — highest output density — is left for a later merge, once
|
|
81
|
+
// the delegation half of this Issue has moved its reading out.
|
|
82
|
+
const SHIP_EFFORT: AgentEffort = 'low'
|
|
83
|
+
type PhaseEffortTable = Partial<Record<AgentRole, Partial<Record<AgentPhase, AgentEffort>>>>
|
|
84
|
+
const PHASE_EFFORT: Readonly<PhaseEffortTable> = {
|
|
85
|
+
worker: { [PRE_GATE_PHASE]: SHIP_EFFORT },
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const ENV_KEYS: Readonly<Record<AgentRole, { model: string; effort: string }>> = {
|
|
89
|
+
scheduler: { model: 'JOSH_SCHEDULER_MODEL', effort: 'JOSH_SCHEDULER_EFFORT' },
|
|
90
|
+
worker: { model: 'JOSH_WORKER_MODEL', effort: 'JOSH_WORKER_EFFORT' },
|
|
91
|
+
reviewer: { model: 'JOSH_REVIEWER_MODEL', effort: 'JOSH_REVIEWER_EFFORT' },
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const LEGACY_WORKER_KEYS = { model: 'JOSH_LANE_MODEL', effort: 'JOSH_LANE_EFFORT' }
|
|
95
|
+
|
|
96
|
+
function is_control_character(character: string): boolean {
|
|
97
|
+
const code = character.codePointAt(FIRST_CODE_POINT) ?? FIRST_PRINTABLE_CODE
|
|
98
|
+
|
|
99
|
+
return code < FIRST_PRINTABLE_CODE || code === DELETE_CODE
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function is_safe_value(value: string): boolean {
|
|
103
|
+
if (value.length === EMPTY_LENGTH || value.length > MAX_VALUE_LENGTH) return false
|
|
104
|
+
|
|
105
|
+
for (const character of value) if (is_control_character(character)) return false
|
|
106
|
+
|
|
107
|
+
return true
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function trimmed(value: string | undefined): string | undefined {
|
|
111
|
+
const result = value?.trim()
|
|
112
|
+
|
|
113
|
+
return result === undefined || result.length === EMPTY_LENGTH ? undefined : result
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function override_value(
|
|
117
|
+
role: AgentRole,
|
|
118
|
+
field: 'model' | 'effort',
|
|
119
|
+
environment: AgentEnvironment,
|
|
120
|
+
): { key: string; value: string | undefined } {
|
|
121
|
+
const key = ENV_KEYS[role][field]
|
|
122
|
+
const value = trimmed(environment[key])
|
|
123
|
+
if (value !== undefined) return { key, value }
|
|
124
|
+
if (role !== WORKER) return { key, value: undefined }
|
|
125
|
+
|
|
126
|
+
const legacy = LEGACY_WORKER_KEYS[field]
|
|
127
|
+
const legacy_value = trimmed(environment[legacy])
|
|
128
|
+
|
|
129
|
+
return legacy_value === undefined
|
|
130
|
+
? { key, value: undefined }
|
|
131
|
+
: { key: legacy, value: legacy_value }
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function model_override(
|
|
135
|
+
role: AgentRole,
|
|
136
|
+
environment: AgentEnvironment,
|
|
137
|
+
provider: AgentProvider,
|
|
138
|
+
): { key: string; value: string | undefined } {
|
|
139
|
+
const key = ENV_KEYS[role].model
|
|
140
|
+
|
|
141
|
+
return provider === OPENAI_PROVIDER
|
|
142
|
+
? { key, value: undefined }
|
|
143
|
+
: override_value(role, 'model', environment)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function rejection(key: string, value: string, expected: string): Rejected {
|
|
147
|
+
return { kind: 'rejected', note: `${key}=${value} ${expected}, so the agent was not started` }
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function resolved_effort(
|
|
151
|
+
override: { key: string; value: string | undefined },
|
|
152
|
+
fallback: AgentEffort,
|
|
153
|
+
): EffortResult {
|
|
154
|
+
const parsed = EFFORT_SCHEMA.safeParse(override.value ?? fallback)
|
|
155
|
+
|
|
156
|
+
return parsed.success
|
|
157
|
+
? { kind: 'effort', effort: parsed.data }
|
|
158
|
+
: rejection(override.key, override.value ?? '', 'is not an allowed effort')
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function has_session(environment: AgentEnvironment, keys: ReadonlyArray<string>): boolean {
|
|
162
|
+
return keys.some((key) => trimmed(environment[key]) !== undefined)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function session_rejection(is_conflicting: boolean): Rejected {
|
|
166
|
+
const note = is_conflicting
|
|
167
|
+
? 'both Codex and Claude Code sessions were detected'
|
|
168
|
+
: 'no Codex or Claude Code session was detected'
|
|
169
|
+
|
|
170
|
+
return { kind: 'rejected', note }
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// The provider a detached launcher hands a process that is not itself an agent session
|
|
174
|
+
// (joshuafolkken/kit#2456). `detached_launch` strips the parent-session keys — the very keys the
|
|
175
|
+
// detection below reads — so a `josh ship --detach --review` supervisor could never resolve its reviewer.
|
|
176
|
+
// **It is a fallback, read only when no session is detected**: the mark is inherited by everything the
|
|
177
|
+
// supervisor starts, and a real session's own keys must keep deciding for that session.
|
|
178
|
+
const HANDED_PROVIDER_KEY = 'JOSH_AGENT_PROVIDER'
|
|
179
|
+
|
|
180
|
+
function handed_provider(environment: AgentEnvironment): ProviderResult {
|
|
181
|
+
const value = trimmed(environment[HANDED_PROVIDER_KEY])
|
|
182
|
+
if (value === undefined) return session_rejection(false)
|
|
183
|
+
const parsed = PROVIDER_SCHEMA.safeParse(value)
|
|
184
|
+
|
|
185
|
+
return parsed.success
|
|
186
|
+
? { kind: 'provider', provider: parsed.data }
|
|
187
|
+
: rejection(HANDED_PROVIDER_KEY, value, 'is not an allowed provider')
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// The session this process runs in, read from its own keys: `undefined` when none is detected.
|
|
191
|
+
function detected_provider(environment: AgentEnvironment): ProviderResult | undefined {
|
|
192
|
+
const has_codex = has_session(environment, [CODEX_SESSION_KEY])
|
|
193
|
+
const has_claude = has_session(environment, agent_session_environment.PARENT_SESSION_KEYS)
|
|
194
|
+
|
|
195
|
+
if (has_codex === has_claude) return has_codex ? session_rejection(true) : undefined
|
|
196
|
+
|
|
197
|
+
return { kind: 'provider', provider: has_codex ? OPENAI_PROVIDER : ANTHROPIC_PROVIDER }
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function resolve_provider(environment: AgentEnvironment = process.env): ProviderResult {
|
|
201
|
+
return detected_provider(environment) ?? handed_provider(environment)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// The mark a detached launch sets on its child: the provider this session resolved, or nothing when it
|
|
205
|
+
// resolved none — the child then fails the same way this session would have.
|
|
206
|
+
function handoff_environment(
|
|
207
|
+
environment: AgentEnvironment = process.env,
|
|
208
|
+
): Readonly<Record<string, string>> {
|
|
209
|
+
const selected = resolve_provider(environment)
|
|
210
|
+
|
|
211
|
+
return selected.kind === 'provider' ? { [HANDED_PROVIDER_KEY]: selected.provider } : {}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function validate(profile: AgentProfile, model_key: string): ProfileResult {
|
|
215
|
+
if (!is_safe_value(profile.model)) {
|
|
216
|
+
return rejection(model_key, profile.model, 'is not a safe model')
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return { kind: 'profile', profile }
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// The effort a phase resolves to before any env override: the phase's own value where the table names
|
|
223
|
+
// one, otherwise the fallback (joshuafolkken/kit#2382). A phase-less or unrecognized call returns the
|
|
224
|
+
// fallback unchanged, which is what keeps every existing caller reading the current default.
|
|
225
|
+
function phase_effort(
|
|
226
|
+
role: AgentRole,
|
|
227
|
+
phase: string | undefined,
|
|
228
|
+
fallback: AgentEffort,
|
|
229
|
+
): AgentEffort {
|
|
230
|
+
const parsed = PHASE_SCHEMA.safeParse(phase)
|
|
231
|
+
if (!parsed.success) return fallback
|
|
232
|
+
|
|
233
|
+
return PHASE_EFFORT[role]?.[parsed.data] ?? fallback
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// The effort a stored profile takes in a phase: an env override wins, then the phase value, then the
|
|
237
|
+
// profile's own effort (joshuafolkken/kit#2382). A cut relaunch that keeps a lane's stored model resolves
|
|
238
|
+
// the effort through this so a person's `JOSH_WORKER_EFFORT` is never overwritten by the phase value.
|
|
239
|
+
function overridden_effort(
|
|
240
|
+
profile: AgentProfile,
|
|
241
|
+
phase: string,
|
|
242
|
+
environment: AgentEnvironment,
|
|
243
|
+
): AgentEffort {
|
|
244
|
+
const parsed = EFFORT_SCHEMA.safeParse(override_value(profile.role, 'effort', environment).value)
|
|
245
|
+
|
|
246
|
+
return parsed.success ? parsed.data : phase_effort(profile.role, phase, profile.effort)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// A stored profile with its effort resolved for the phase the run is entering, its model and provider
|
|
250
|
+
// left as they were (joshuafolkken/kit#2382).
|
|
251
|
+
function with_phase_effort(
|
|
252
|
+
profile: AgentProfile,
|
|
253
|
+
phase: string,
|
|
254
|
+
environment: AgentEnvironment = process.env,
|
|
255
|
+
): AgentProfile {
|
|
256
|
+
return { ...profile, effort: overridden_effort(profile, phase, environment) }
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function resolve(
|
|
260
|
+
role: AgentRole,
|
|
261
|
+
environment: AgentEnvironment = process.env,
|
|
262
|
+
phase?: string,
|
|
263
|
+
): ProfileResult {
|
|
264
|
+
const selected = resolve_provider(environment)
|
|
265
|
+
if (selected.kind === 'rejected') return selected
|
|
266
|
+
const defaults = PROVIDER_PROFILES[selected.provider][role]
|
|
267
|
+
const model = model_override(role, environment, selected.provider)
|
|
268
|
+
const effort = override_value(role, 'effort', environment)
|
|
269
|
+
const resolved = resolved_effort(effort, phase_effort(role, phase, defaults.effort))
|
|
270
|
+
|
|
271
|
+
if (resolved.kind === 'rejected') return resolved
|
|
272
|
+
|
|
273
|
+
const profile: AgentProfile = {
|
|
274
|
+
provider: selected.provider,
|
|
275
|
+
role,
|
|
276
|
+
model: model.value ?? defaults.model,
|
|
277
|
+
effort: resolved.effort,
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return validate(profile, model.key)
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
function describe(profile: AgentProfile): string {
|
|
284
|
+
return `provider=${profile.provider} role=${profile.role} model=${profile.model} effort=${profile.effort}`
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function parse(value: unknown): AgentProfile | undefined {
|
|
288
|
+
const parsed = PROFILE_SCHEMA.safeParse(value)
|
|
289
|
+
|
|
290
|
+
return parsed.success && is_safe_value(parsed.data.model) ? parsed.data : undefined
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const agent_role_profile = {
|
|
294
|
+
DEFAULT_PROFILES,
|
|
295
|
+
EFFORT_SCHEMA,
|
|
296
|
+
ENV_KEYS,
|
|
297
|
+
HANDED_PROVIDER_KEY,
|
|
298
|
+
IMPLEMENTATION_PHASE,
|
|
299
|
+
LEGACY_WORKER_KEYS,
|
|
300
|
+
MAX_VALUE_LENGTH,
|
|
301
|
+
OPENAI_PROFILES,
|
|
302
|
+
PHASE_EFFORT,
|
|
303
|
+
PHASE_SCHEMA,
|
|
304
|
+
PRE_GATE_PHASE,
|
|
305
|
+
PROVIDER_SCHEMA,
|
|
306
|
+
PROFILE_SCHEMA,
|
|
307
|
+
REVIEWER,
|
|
308
|
+
SCHEDULER,
|
|
309
|
+
WORKER,
|
|
310
|
+
describe,
|
|
311
|
+
handoff_environment,
|
|
312
|
+
is_safe_value,
|
|
313
|
+
parse,
|
|
314
|
+
phase_effort,
|
|
315
|
+
resolve,
|
|
316
|
+
resolve_provider,
|
|
317
|
+
with_phase_effort,
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
export type {
|
|
321
|
+
AgentEffort,
|
|
322
|
+
AgentEnvironment,
|
|
323
|
+
AgentPhase,
|
|
324
|
+
AgentProfile,
|
|
325
|
+
AgentProvider,
|
|
326
|
+
AgentRole,
|
|
327
|
+
ProfileResult,
|
|
328
|
+
}
|
|
329
|
+
export { agent_role_profile }
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { ClaudeResultEvent } from './claude-result-event'
|
|
2
|
+
|
|
3
|
+
// Whether a dispatched lane child's exit record is an API-connection outage rather than a child that
|
|
4
|
+
// stopped mid-implementation on its own (joshuafolkken/kit#2240). Measured twice: on 2026-09-15 four
|
|
5
|
+
// children ended `The socket connection was closed unexpectedly`, and on 2026-09-21 a child spent all
|
|
6
|
+
// ten connection retries on `Unable to connect to API (ConnectionRefused)`. The parent read both as
|
|
7
|
+
// ordinary failures — `in-progress` stripped, `needs-decision` applied, counted against the
|
|
8
|
+
// consecutive-failure guard — when the child never reached the API at all.
|
|
9
|
+
//
|
|
10
|
+
// **The read is mechanical, never a similarity judgement.** A terminal `result` event that ends in
|
|
11
|
+
// error carries the harness's own error text in `reason`; an outage is that text containing one of a
|
|
12
|
+
// fixed set of transport-failure signatures. `is_error` is required — a child that finished a turn
|
|
13
|
+
// cleanly is not an outage however its prose reads — so the test is the error flag AND a known marker,
|
|
14
|
+
// not the marker alone.
|
|
15
|
+
|
|
16
|
+
// The transport-failure signatures a `reason` is matched against, lower-cased. Each is a stable
|
|
17
|
+
// substring the Anthropic client or the socket layer emits when the API could not be reached — the two
|
|
18
|
+
// observed on the issue plus the Node-level spellings the same failures surface as. Retry exhaustion
|
|
19
|
+
// needs no marker of its own: the client re-raises the underlying connection error after the last
|
|
20
|
+
// attempt, so the exhausted case ends in one of these exactly as a single attempt does.
|
|
21
|
+
const OUTAGE_MARKERS: ReadonlyArray<string> = [
|
|
22
|
+
'unable to connect to api',
|
|
23
|
+
'connectionrefused',
|
|
24
|
+
'econnrefused',
|
|
25
|
+
'connection refused',
|
|
26
|
+
'the socket connection was closed',
|
|
27
|
+
'socket hang up',
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
function matched_marker(reason: string): string | undefined {
|
|
31
|
+
const lower = reason.toLowerCase()
|
|
32
|
+
|
|
33
|
+
return OUTAGE_MARKERS.find((marker) => lower.includes(marker))
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The marker an exit record matched, or `undefined` when it is not an outage. A record that did not
|
|
37
|
+
// end in error, or carries no reason text, is never an outage — the marker is read only off an errored
|
|
38
|
+
// record's `reason`.
|
|
39
|
+
function outage_marker(record: ClaudeResultEvent | undefined): string | undefined {
|
|
40
|
+
if (record === undefined || !record.is_error || record.reason === undefined) return undefined
|
|
41
|
+
|
|
42
|
+
return matched_marker(record.reason)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function is_outage(record: ClaudeResultEvent | undefined): boolean {
|
|
46
|
+
return outage_marker(record) !== undefined
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const api_outage = { is_outage, outage_marker }
|
|
50
|
+
|
|
51
|
+
export { api_outage, OUTAGE_MARKERS }
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import {
|
|
4
|
+
agent_role_profile,
|
|
5
|
+
type AgentEnvironment,
|
|
6
|
+
type AgentProfile,
|
|
7
|
+
type AgentRole,
|
|
8
|
+
} from './agent-role-profile'
|
|
9
|
+
|
|
10
|
+
const AGENT_COMMAND = 'claude'
|
|
11
|
+
const AGENT_FLAGS: ReadonlyArray<string> = ['-p', '--verbose', '--output-format', 'stream-json']
|
|
12
|
+
const MODEL_FLAG = '--model'
|
|
13
|
+
const EFFORT_FLAG = '--effort'
|
|
14
|
+
// Resumes a stored session by id (joshuafolkken/kit#2317). An `outage` re-dispatch passes the
|
|
15
|
+
// disconnected child's `session_id` so the relaunched process continues that conversation — its
|
|
16
|
+
// accumulated context intact — rather than reading everything from scratch.
|
|
17
|
+
const RESUME_FLAG = '--resume'
|
|
18
|
+
// Forces a fresh session's id rather than resuming one (joshuafolkken/kit#2407). The wake supervisor
|
|
19
|
+
// generates the id, so it knows without asking the child which transcript that session will write —
|
|
20
|
+
// `<session-id>.jsonl` — and can later attribute a whiff to a session it actually started rather than
|
|
21
|
+
// to any transcript that happened to move while it was alive.
|
|
22
|
+
const SESSION_ID_FLAG = '--session-id'
|
|
23
|
+
// **A launched child carries only the tools a lane has ever used** (joshuafolkken/kit#2435). Every
|
|
24
|
+
// tool definition and every user-side claude.ai connector rides on each request's cached preamble, and
|
|
25
|
+
// across the lanes measured none of Artifact, Workflow or a connector was ever called, while
|
|
26
|
+
// AskUserQuestion has nobody to answer it in an unattended lane. Narrowing them cut the preamble by
|
|
27
|
+
// about 16,000 tokens per request. This list is the one place the set is kept.
|
|
28
|
+
const LAUNCHED_TOOLS: ReadonlyArray<string> = [
|
|
29
|
+
'Bash',
|
|
30
|
+
'Read',
|
|
31
|
+
'Edit',
|
|
32
|
+
'Write',
|
|
33
|
+
'Agent',
|
|
34
|
+
'Skill',
|
|
35
|
+
'ToolSearch',
|
|
36
|
+
'SendMessage',
|
|
37
|
+
'TaskStop',
|
|
38
|
+
'Monitor',
|
|
39
|
+
'TodoWrite',
|
|
40
|
+
'WebSearch',
|
|
41
|
+
'WebFetch',
|
|
42
|
+
]
|
|
43
|
+
const TOOLS_FLAG = '--tools'
|
|
44
|
+
// **Only the project's own MCP servers load** — the user's connectors are what the strict flag drops.
|
|
45
|
+
// A project with no `.mcp.json` gets the strict flag alone, which loads no server at all: that is
|
|
46
|
+
// what the project declared, and it is the same connector-free preamble.
|
|
47
|
+
const STRICT_MCP_FLAG = '--strict-mcp-config'
|
|
48
|
+
const MCP_CONFIG_FLAG = '--mcp-config'
|
|
49
|
+
const PROJECT_MCP_FILE = '.mcp.json'
|
|
50
|
+
|
|
51
|
+
interface ClaudeArgv {
|
|
52
|
+
command: string
|
|
53
|
+
args: ReadonlyArray<string>
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
type ClaudeArgvResult =
|
|
57
|
+
{ kind: 'argv'; argv: ClaudeArgv; profile: AgentProfile } | { kind: 'rejected'; note: string }
|
|
58
|
+
|
|
59
|
+
// **`session_id` is optional, so the id-forcing is additive.** Every existing caller composes the same
|
|
60
|
+
// vector it did before; only a caller that hands a forced id — the wake supervisor — gets the
|
|
61
|
+
// `--session-id` pair, sitting ahead of the model flags exactly where `--resume` sits in `build_resume`.
|
|
62
|
+
function session_id_flags(session_id: string | undefined): ReadonlyArray<string> {
|
|
63
|
+
return session_id === undefined ? [] : [SESSION_ID_FLAG, session_id]
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// The config is named by absolute path, resolved against the directory the child is launched in, so
|
|
67
|
+
// the flag means the same file whatever the child's own working directory turns out to be. The pair
|
|
68
|
+
// sits ahead of the model flags: `--mcp-config` takes several values, and the next flag is what ends it.
|
|
69
|
+
function tool_flags(cwd: string = process.cwd()): ReadonlyArray<string> {
|
|
70
|
+
const mcp_config = path.join(cwd, PROJECT_MCP_FILE)
|
|
71
|
+
const mcp_flags = existsSync(mcp_config)
|
|
72
|
+
? [STRICT_MCP_FLAG, MCP_CONFIG_FLAG, mcp_config]
|
|
73
|
+
: [STRICT_MCP_FLAG]
|
|
74
|
+
|
|
75
|
+
return [TOOLS_FLAG, LAUNCHED_TOOLS.join(','), ...mcp_flags]
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function build(
|
|
79
|
+
invocation: string,
|
|
80
|
+
profile: AgentProfile,
|
|
81
|
+
session_id?: string,
|
|
82
|
+
cwd?: string,
|
|
83
|
+
): ClaudeArgv {
|
|
84
|
+
return {
|
|
85
|
+
command: AGENT_COMMAND,
|
|
86
|
+
args: [
|
|
87
|
+
...AGENT_FLAGS,
|
|
88
|
+
...tool_flags(cwd),
|
|
89
|
+
...session_id_flags(session_id),
|
|
90
|
+
MODEL_FLAG,
|
|
91
|
+
profile.model,
|
|
92
|
+
EFFORT_FLAG,
|
|
93
|
+
profile.effort,
|
|
94
|
+
invocation,
|
|
95
|
+
],
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// The resume counterpart: the same vector with `--resume <session_id>` ahead of the model flags, so the
|
|
100
|
+
// relaunched child continues the stored session rather than opening a new one (joshuafolkken/kit#2317).
|
|
101
|
+
function build_resume(
|
|
102
|
+
invocation: string,
|
|
103
|
+
profile: AgentProfile,
|
|
104
|
+
session_id: string,
|
|
105
|
+
cwd?: string,
|
|
106
|
+
): ClaudeArgv {
|
|
107
|
+
return {
|
|
108
|
+
command: AGENT_COMMAND,
|
|
109
|
+
args: [
|
|
110
|
+
...AGENT_FLAGS,
|
|
111
|
+
...tool_flags(cwd),
|
|
112
|
+
RESUME_FLAG,
|
|
113
|
+
session_id,
|
|
114
|
+
MODEL_FLAG,
|
|
115
|
+
profile.model,
|
|
116
|
+
EFFORT_FLAG,
|
|
117
|
+
profile.effort,
|
|
118
|
+
invocation,
|
|
119
|
+
],
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function with_profile(invocation: string, profile: AgentProfile): ClaudeArgvResult {
|
|
124
|
+
return { kind: 'argv', argv: build(invocation, profile), profile }
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function resolve(
|
|
128
|
+
invocation: string,
|
|
129
|
+
role: AgentRole,
|
|
130
|
+
environment: AgentEnvironment = process.env,
|
|
131
|
+
): ClaudeArgvResult {
|
|
132
|
+
const result = agent_role_profile.resolve(role, environment)
|
|
133
|
+
|
|
134
|
+
if (result.kind === 'rejected') return result
|
|
135
|
+
|
|
136
|
+
return with_profile(invocation, result.profile)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const claude_agent_argv = {
|
|
140
|
+
AGENT_COMMAND,
|
|
141
|
+
AGENT_FLAGS,
|
|
142
|
+
LAUNCHED_TOOLS,
|
|
143
|
+
build,
|
|
144
|
+
build_resume,
|
|
145
|
+
resolve,
|
|
146
|
+
tool_flags,
|
|
147
|
+
with_profile,
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export type { ClaudeArgv, ClaudeArgvResult }
|
|
151
|
+
export { claude_agent_argv }
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { interactive_ask } from './interactive-ask'
|
|
3
|
+
|
|
4
|
+
const RESULT_EVENT_SCHEMA = z.looseObject({
|
|
5
|
+
type: z.literal('result'),
|
|
6
|
+
is_error: z.unknown().optional(),
|
|
7
|
+
subtype: z.unknown().optional(),
|
|
8
|
+
num_turns: z.unknown().optional(),
|
|
9
|
+
permission_denials: z.unknown().optional(),
|
|
10
|
+
result: z.unknown().optional(),
|
|
11
|
+
session_id: z.unknown().optional(),
|
|
12
|
+
usage: z.unknown().optional(),
|
|
13
|
+
})
|
|
14
|
+
const USAGE_SCHEMA = z.looseObject({
|
|
15
|
+
input_tokens: z.unknown().optional(),
|
|
16
|
+
cache_read_input_tokens: z.unknown().optional(),
|
|
17
|
+
output_tokens: z.unknown().optional(),
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
interface ClaudeResultEvent {
|
|
21
|
+
is_error: boolean
|
|
22
|
+
// The exit-record fields a supervisor classifies a dispatched lane child's ending from
|
|
23
|
+
// (joshuafolkken/kit#2139). `subtype` and `num_turns` describe how the turn ended, and
|
|
24
|
+
// `permission_denials` is the count of tool calls the harness refused — the direct cause of a child
|
|
25
|
+
// that stopped mid-implementation without parking, so a classifier can name it in the park comment.
|
|
26
|
+
subtype: string | undefined
|
|
27
|
+
num_turns: number | undefined
|
|
28
|
+
permission_denials: number
|
|
29
|
+
// The refused interactive ask lifted out of `permission_denials` (joshuafolkken/kit#2201). Where a
|
|
30
|
+
// child reached for `AskUserQuestion` and was refused, its question and options are stranded in the
|
|
31
|
+
// exit record; `run:ending` puts them into the park comment so a person can answer, instead of the
|
|
32
|
+
// parent opening the JSONL by hand. Undefined when no denial was an interactive ask.
|
|
33
|
+
refused_ask: string | undefined
|
|
34
|
+
reason: string | undefined
|
|
35
|
+
// The Claude Code session identifier the `-p --output-format stream-json` run wrote on its result
|
|
36
|
+
// event (joshuafolkken/kit#2317). An `outage` re-dispatch reads it to resume the disconnected child's
|
|
37
|
+
// stored session — recovering its accumulated context — rather than starting a fresh `fullrun`.
|
|
38
|
+
// Undefined when the event carried none, which sends the re-dispatch down the fresh fallback.
|
|
39
|
+
session_id: string | undefined
|
|
40
|
+
usage:
|
|
41
|
+
| {
|
|
42
|
+
input_tokens?: number | undefined
|
|
43
|
+
cached_input_tokens?: number | undefined
|
|
44
|
+
output_tokens?: number | undefined
|
|
45
|
+
}
|
|
46
|
+
| undefined
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function usable_reason(value: unknown): string | undefined {
|
|
50
|
+
return typeof value === 'string' && value.trim() !== '' ? value : undefined
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function numeric_value(value: unknown): number | undefined {
|
|
54
|
+
return typeof value === 'number' ? value : undefined
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// A missing or malformed `permission_denials` counts as zero refusals rather than an unknown, so the
|
|
58
|
+
// classifier reads "no denials" the same way whether the harness omitted the field or wrote an empty
|
|
59
|
+
// array. It is the array's length, never its contents — the count is what the park comment carries.
|
|
60
|
+
function denial_count(value: unknown): number {
|
|
61
|
+
return Array.isArray(value) ? value.length : 0
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function usage_of(value: unknown): ClaudeResultEvent['usage'] {
|
|
65
|
+
const parsed = USAGE_SCHEMA.safeParse(value)
|
|
66
|
+
if (!parsed.success) return undefined
|
|
67
|
+
const usage = {
|
|
68
|
+
input_tokens: numeric_value(parsed.data.input_tokens),
|
|
69
|
+
cached_input_tokens: numeric_value(parsed.data.cache_read_input_tokens),
|
|
70
|
+
output_tokens: numeric_value(parsed.data.output_tokens),
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return Object.values(usage).some((count) => count !== undefined) ? usage : undefined
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function decode(value: unknown): ClaudeResultEvent | undefined {
|
|
77
|
+
const parsed = RESULT_EVENT_SCHEMA.safeParse(value)
|
|
78
|
+
if (!parsed.success) return undefined
|
|
79
|
+
const is_error = parsed.data.is_error === true
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
is_error,
|
|
83
|
+
subtype: usable_reason(parsed.data.subtype),
|
|
84
|
+
num_turns: numeric_value(parsed.data.num_turns),
|
|
85
|
+
permission_denials: denial_count(parsed.data.permission_denials),
|
|
86
|
+
refused_ask: interactive_ask.refused_ask_of(parsed.data.permission_denials),
|
|
87
|
+
reason: is_error
|
|
88
|
+
? (usable_reason(parsed.data.result) ?? usable_reason(parsed.data.subtype))
|
|
89
|
+
: undefined,
|
|
90
|
+
session_id: usable_reason(parsed.data.session_id),
|
|
91
|
+
usage: usage_of(parsed.data.usage),
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const claude_result_event = { decode }
|
|
96
|
+
|
|
97
|
+
export type { ClaudeResultEvent }
|
|
98
|
+
export { claude_result_event }
|