@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,103 @@
|
|
|
1
|
+
import { git_command } from '#scripts/git/git-command'
|
|
2
|
+
import { git_worktree } from '#scripts/git/git-worktree'
|
|
3
|
+
import { run_hold } from './run-hold'
|
|
4
|
+
import { run_preflight } from './run-preflight'
|
|
5
|
+
import { run_ship_stage, type ShipState } from './run-ship-stage'
|
|
6
|
+
|
|
7
|
+
// The read side of a resumed `josh ship` (joshuafolkken/kit#2426): the repository's actual state, asked
|
|
8
|
+
// before any stage runs, and where the stage record lives. `run-ship-stage.ts` decides from what this
|
|
9
|
+
// reads; this module only reads.
|
|
10
|
+
//
|
|
11
|
+
// **Every read that cannot complete answers `false`** — "not done yet" — so the stage runs and its own
|
|
12
|
+
// guard answers instead: `git -y` refuses an empty commit, a push of a commit origin already holds
|
|
13
|
+
// changes nothing, and `followup` reads the pull request itself before it merges.
|
|
14
|
+
|
|
15
|
+
const REPOSITORY_DIRECTORY_INDEX = 1
|
|
16
|
+
const REMOTE_SHA_INDEX = 0
|
|
17
|
+
const REMOTE_FIELD_SEPARATOR = /\s/u
|
|
18
|
+
const HEAD_REFERENCE = 'HEAD'
|
|
19
|
+
|
|
20
|
+
async function or_false(is_true: () => Promise<boolean>): Promise<boolean> {
|
|
21
|
+
try {
|
|
22
|
+
return await is_true()
|
|
23
|
+
} catch {
|
|
24
|
+
return false
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// A clean tree whose branch holds commits the default branch does not: the commit stage's output. A
|
|
29
|
+
// dirty tree is uncommitted work, whatever is already committed beneath it.
|
|
30
|
+
async function read_committed(): Promise<boolean> {
|
|
31
|
+
if (await run_hold.is_tree_dirty()) return false
|
|
32
|
+
|
|
33
|
+
const base = await git_command.default_branch_reference()
|
|
34
|
+
|
|
35
|
+
return (await git_command.commit_count_beyond(base, HEAD_REFERENCE)) > 0
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Origin's branch tip is this checkout's `HEAD` — the push has nothing left to send.
|
|
39
|
+
async function read_pushed(branch_name: string): Promise<boolean> {
|
|
40
|
+
const [remote, head] = await Promise.all([
|
|
41
|
+
git_worktree.ls_remote_branch(branch_name),
|
|
42
|
+
git_command.head_commit(),
|
|
43
|
+
])
|
|
44
|
+
|
|
45
|
+
return remote.split(REMOTE_FIELD_SEPARATOR)[REMOTE_SHA_INDEX] === head
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// The branch's pull request is merged **and** the default branch already holds `HEAD`. A branch whose
|
|
49
|
+
// earlier pull request merged and which has since gained commits still reads `MERGED` from GitHub, and
|
|
50
|
+
// taking that alone would skip the gate, the commit and the merge of the new work. A stale default
|
|
51
|
+
// branch reads as not merged, so `followup` runs and reads the pull request itself.
|
|
52
|
+
async function read_merged(branch_name: string): Promise<boolean> {
|
|
53
|
+
if ((await run_preflight.read_pr_state(branch_name)) !== run_preflight.MERGED_PR) return false
|
|
54
|
+
|
|
55
|
+
const base = await git_command.default_branch_reference()
|
|
56
|
+
|
|
57
|
+
return (await git_command.commit_count_beyond(base, HEAD_REFERENCE)) === 0
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const NOTHING_DONE: ShipState = { is_committed: false, is_pushed: false, is_merged: false }
|
|
61
|
+
|
|
62
|
+
async function read_branch_state(branch_name: string): Promise<ShipState> {
|
|
63
|
+
const [is_committed, is_pushed, is_merged] = await Promise.all([
|
|
64
|
+
or_false(read_committed),
|
|
65
|
+
or_false(async () => await read_pushed(branch_name)),
|
|
66
|
+
or_false(async () => await read_merged(branch_name)),
|
|
67
|
+
])
|
|
68
|
+
|
|
69
|
+
return { is_committed, is_pushed, is_merged }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// A branch that cannot be named leaves nothing to ask about, so it reads as nothing done.
|
|
73
|
+
async function read_state(): Promise<ShipState> {
|
|
74
|
+
try {
|
|
75
|
+
return await read_branch_state(await git_command.branch())
|
|
76
|
+
} catch {
|
|
77
|
+
return NOTHING_DONE
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// The common git directory every lane of the repository shares — what the stage record, the detached
|
|
82
|
+
// supervisor's log and its pid are keyed on (joshuafolkken/kit#2428) — or `undefined` outside one.
|
|
83
|
+
async function repository_directory(): Promise<string | undefined> {
|
|
84
|
+
try {
|
|
85
|
+
const directories = await git_command.git_directories()
|
|
86
|
+
|
|
87
|
+
return directories[REPOSITORY_DIRECTORY_INDEX]
|
|
88
|
+
} catch {
|
|
89
|
+
return undefined
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// The record's path for this issue, or `undefined` outside a repository — there is nothing to key on,
|
|
94
|
+
// and a ship without a record still resumes from the state alone.
|
|
95
|
+
async function record_target(issue: string): Promise<string | undefined> {
|
|
96
|
+
const repository = await repository_directory()
|
|
97
|
+
|
|
98
|
+
return repository === undefined ? undefined : run_ship_stage.record_path(repository, issue)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const run_ship_probe = { read_state, record_target, repository_directory }
|
|
102
|
+
|
|
103
|
+
export { run_ship_probe }
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
2
|
+
import { lane_child_invocation } from '#scripts/lane/lane-child-invocation'
|
|
3
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
4
|
+
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
5
|
+
import { lane_relaunch } from '#scripts/lane/lane-relaunch'
|
|
6
|
+
import { run_event_stream } from './run-event-stream'
|
|
7
|
+
import { run_event_stream_emit } from './run-event-stream-emit'
|
|
8
|
+
import type { Stage } from './run-ship-stage'
|
|
9
|
+
|
|
10
|
+
// How a detached `josh ship` supervisor hands a stopped stage back (joshuafolkken/kit#2428). The agent
|
|
11
|
+
// ended when it handed the region over, so a red gate, a High/Medium review, a failed push or red CI has
|
|
12
|
+
// nobody to read it — this is what gives it one, in two halves:
|
|
13
|
+
//
|
|
14
|
+
// 1. **A `ship-stop` position on the event stream**, naming the issue and the stage. `run:step` maps it to
|
|
15
|
+
// the command that prints the stopped report, so whoever asks next is pointed at the failure rather
|
|
16
|
+
// than rebuilding what happened.
|
|
17
|
+
// 2. **In a dispatched lane, a fresh child session relaunched into the lane** — the way the pre-gate cut
|
|
18
|
+
// relaunches one (`lane-relaunch.ts`) — with the ship-stop prompt, at the implementation phase's
|
|
19
|
+
// effort because a fix is judgement. It is started before the supervisor exits, so the parent's
|
|
20
|
+
// liveness poll never sees the lane empty. An OpenAI lane is left to its own supervisor, which starts
|
|
21
|
+
// no successor without a cut, so its parent books the stop exactly as it books any ended child.
|
|
22
|
+
//
|
|
23
|
+
// A ship run in an agent's own turn is not supervised and hands nothing back: its report is already in
|
|
24
|
+
// front of the agent that ran it.
|
|
25
|
+
|
|
26
|
+
const OPENAI_PROVIDER = 'openai'
|
|
27
|
+
|
|
28
|
+
type ReturnOutcome = 'relaunched' | 'recorded'
|
|
29
|
+
|
|
30
|
+
function stop_text(issue: string, stage: Stage): string {
|
|
31
|
+
return `#${issue} ${stage} failed — pnpm josh ship --log ${issue}`
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function can_relaunch(lane: LaneInfo | undefined): lane is LaneInfo {
|
|
35
|
+
return lane !== undefined && lane.profile?.provider !== OPENAI_PROVIDER
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function lane_to_relaunch(issue: string): Promise<LaneInfo | undefined> {
|
|
39
|
+
if (!lane_child_marker.is_child_of(process.cwd())) return undefined
|
|
40
|
+
|
|
41
|
+
const lane = await lane_registry.find_open_lane(issue)
|
|
42
|
+
|
|
43
|
+
return can_relaunch(lane) ? lane : undefined
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function note(text: string): void {
|
|
47
|
+
process.stderr.write(`${text}\n`)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function return_control(issue: string, stage: Stage): Promise<ReturnOutcome> {
|
|
51
|
+
await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.SHIP_STOP, stop_text(issue, stage))
|
|
52
|
+
|
|
53
|
+
const lane = await lane_to_relaunch(issue)
|
|
54
|
+
|
|
55
|
+
if (lane === undefined) return 'recorded'
|
|
56
|
+
|
|
57
|
+
const invocation = lane_child_invocation.ship_stop_invocation(issue)
|
|
58
|
+
const result = lane_relaunch.relaunch(
|
|
59
|
+
lane,
|
|
60
|
+
invocation,
|
|
61
|
+
agent_role_profile.IMPLEMENTATION_PHASE,
|
|
62
|
+
note,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
if (result.kind === 'launched') return 'relaunched'
|
|
66
|
+
|
|
67
|
+
note(`the lane child could not be relaunched: ${result.note}`)
|
|
68
|
+
|
|
69
|
+
return 'recorded'
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const run_ship_return = { return_control, stop_text }
|
|
73
|
+
|
|
74
|
+
export type { ReturnOutcome }
|
|
75
|
+
export { run_ship_return }
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { agent_argv } from '#scripts/agent/agent-argv'
|
|
2
|
+
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
3
|
+
import { gate_tree } from '#scripts/gate/gate-tree'
|
|
4
|
+
import { scoped_green } from '#scripts/gate/scoped-green'
|
|
5
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
6
|
+
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
7
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
8
|
+
import { detached_launch } from './detached-launch'
|
|
9
|
+
import { run_ship_review, type RoundOutcome, type ScoredVerdict } from './run-ship-review'
|
|
10
|
+
|
|
11
|
+
// The side effects of `josh ship --review` (joshuafolkken/kit#2427): the round-1 review the chain used
|
|
12
|
+
// to open, launch, join, attest and record across five agent turns, run by the supervisor beside the
|
|
13
|
+
// gate. Each step is the existing command or mechanism, composed rather than cloned:
|
|
14
|
+
//
|
|
15
|
+
// 1. `run:review` starts the gate detached and mints the brief — the nonce `review:attest` checks.
|
|
16
|
+
// 2. the reviewer is launched the way `run:wake` launches a session — `agent_argv` under the reviewer
|
|
17
|
+
// profile, `detached_launch.launch_attached` to wait for its exit — handed the brief by path.
|
|
18
|
+
// 3. `run:review --join` blocks a verdict over a red gate; `review:attest --check` refuses a review
|
|
19
|
+
// that read another checkout; `review:record` writes the round the merge gate reads.
|
|
20
|
+
//
|
|
21
|
+
// **Round 1's local fixes and round 2 stay inside the supervisor** (joshuafolkken/kit#2489). A round-1
|
|
22
|
+
// reviewer that fixed its local Mediums in place changed the tree the background gate read, so that
|
|
23
|
+
// join drains the gate rather than judging it — the ship's gate stage re-runs on the fixed tree. After
|
|
24
|
+
// the commit, `round_two_stage` asks `review:round2 --round-1-closed` whether the fix delta owes a
|
|
25
|
+
// second round, and on `required` runs it through the same commands the chain does: the scoped pair
|
|
26
|
+
// `review:brief` requires, `review:brief --round 2`, a fresh reviewer session, attest and record.
|
|
27
|
+
//
|
|
28
|
+
// **A precondition the supervisor can meet itself is met, not stopped on** (joshuafolkken/kit#2500).
|
|
29
|
+
// The scoped pair `run:review` and the local gate refuse without is run in place when this tree has no
|
|
30
|
+
// green record, and a round-1 fix is counted only once that pair is green on the fixed tree.
|
|
31
|
+
//
|
|
32
|
+
// **Every failure returns control to the agent**: a non-zero step, a reviewer that did not finish, an
|
|
33
|
+
// unreadable findings file, a High or an unfixed Medium in round 1, and anything but a clean round 2 —
|
|
34
|
+
// recorded first, because the round was attested, then routed back.
|
|
35
|
+
|
|
36
|
+
const SUCCESS_EXIT_CODE = 0
|
|
37
|
+
const FAILURE_EXIT_CODE = 1
|
|
38
|
+
const should_forward_stderr = true
|
|
39
|
+
const RUN_REVIEW = 'run:review'
|
|
40
|
+
const ATTEST_CHECK = ['review:attest', '--check']
|
|
41
|
+
const ROUND_TWO_DECISION = ['review:round2', '--round-1-closed']
|
|
42
|
+
const ROUND_TWO_BRIEF = ['review:brief', '--round', '2']
|
|
43
|
+
const ROUND_TWO_REQUIRED = 'required'
|
|
44
|
+
const BRIEF_PREFIX = 'josh-ship-review-brief-'
|
|
45
|
+
const FINDINGS_PREFIX = 'josh-ship-review-findings-'
|
|
46
|
+
const LOG_PREFIX = 'josh-ship-review-log-'
|
|
47
|
+
const BRIEF_SUFFIX = '.md'
|
|
48
|
+
const FINDINGS_SUFFIX = '.txt'
|
|
49
|
+
const LOG_SUFFIX = '.log'
|
|
50
|
+
const FIXED_JOIN_NOTE =
|
|
51
|
+
'the round-1 gate read the tree before the review fixes — drained, not judged; the gate stage re-runs it.'
|
|
52
|
+
const ROUND_TWO_SKIPPED_NOTE = 'round 2 not due — nothing left to verify; shipping on.'
|
|
53
|
+
|
|
54
|
+
type Phase = () => Promise<JoshResult>
|
|
55
|
+
type PromptOf = (brief_path: string, findings_path: string) => string
|
|
56
|
+
|
|
57
|
+
function failure(out: string): JoshResult {
|
|
58
|
+
return { code: FAILURE_EXIT_CODE, out }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function paths(root: string = PROJECT_ROOT): { brief: string; findings: string; log: string } {
|
|
62
|
+
return {
|
|
63
|
+
brief: stamp_file.stamp_path(BRIEF_PREFIX, root, BRIEF_SUFFIX),
|
|
64
|
+
findings: stamp_file.stamp_path(FINDINGS_PREFIX, root, FINDINGS_SUFFIX),
|
|
65
|
+
log: stamp_file.stamp_path(LOG_PREFIX, root, LOG_SUFFIX),
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function josh(argv: ReadonlyArray<string>): Promise<JoshResult> {
|
|
70
|
+
return await josh_command.josh_run(argv, should_forward_stderr)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function note(text: string): void {
|
|
74
|
+
process.stderr.write(`${text}\n`)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Under the reviewer profile — the same model and effort (`JOSH_REVIEWER_*` included) the chain's
|
|
78
|
+
// subagent is given — and waited on, so the join below runs only once the review has finished. Each
|
|
79
|
+
// call is its own process, so round 2 is a fresh session by construction.
|
|
80
|
+
async function run_session(prompt: string, log_path: string): Promise<JoshResult> {
|
|
81
|
+
const built = agent_argv.resolve_in(prompt, agent_role_profile.REVIEWER, PROJECT_ROOT)
|
|
82
|
+
|
|
83
|
+
if (built.kind === 'rejected') return failure(`reviewer profile rejected: ${built.note}`)
|
|
84
|
+
|
|
85
|
+
const request = { argv: built.argv, cwd: PROJECT_ROOT, log_path, profile: built.profile }
|
|
86
|
+
const result = await detached_launch.launch_attached(request, note)
|
|
87
|
+
|
|
88
|
+
if (result.kind === 'failed') return failure(`reviewer could not start: ${result.note}`)
|
|
89
|
+
if (result.exit_code !== SUCCESS_EXIT_CODE) return failure(`reviewer failed — log: ${log_path}`)
|
|
90
|
+
|
|
91
|
+
return { code: SUCCESS_EXIT_CODE, out: '' }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// The brief goes to a file and the previous round's findings are removed, so a reviewer that writes
|
|
95
|
+
// nothing reads as unfinished rather than as the last round's verdict.
|
|
96
|
+
async function launch_reviewer(brief: string, prompt_of: PromptOf): Promise<JoshResult> {
|
|
97
|
+
const target = paths()
|
|
98
|
+
|
|
99
|
+
stamp_file.write_text_stamp(target.brief, brief)
|
|
100
|
+
stamp_file.remove_stamp(target.findings)
|
|
101
|
+
|
|
102
|
+
return await run_session(prompt_of(target.brief, target.findings), target.log)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function current_verdict(): ReturnType<typeof run_ship_review.read_verdict> {
|
|
106
|
+
return run_ship_review.read_verdict(stamp_file.read_stamp_text(paths().findings))
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// A red join blocks unless the reviewer fixed findings in place: the background gate then read the
|
|
110
|
+
// tree before the fixes, so its verdict describes a tree that no longer exists. The join still ran to
|
|
111
|
+
// its end, so the gate stage that follows never races it.
|
|
112
|
+
async function join_gate(): Promise<JoshResult> {
|
|
113
|
+
const joined = await josh([RUN_REVIEW, '--join'])
|
|
114
|
+
|
|
115
|
+
if (joined.code === SUCCESS_EXIT_CODE) return joined
|
|
116
|
+
if (current_verdict().kind !== run_ship_review.VERDICT.FIXED) return joined
|
|
117
|
+
|
|
118
|
+
note(FIXED_JOIN_NOTE)
|
|
119
|
+
|
|
120
|
+
return { code: SUCCESS_EXIT_CODE, out: joined.out }
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async function record_and_route(
|
|
124
|
+
issue: string,
|
|
125
|
+
outcome_of: (verdict: ScoredVerdict) => RoundOutcome,
|
|
126
|
+
): Promise<JoshResult> {
|
|
127
|
+
const verdict = current_verdict()
|
|
128
|
+
|
|
129
|
+
if (verdict.kind === run_ship_review.VERDICT.INVALID) return failure(verdict.note)
|
|
130
|
+
|
|
131
|
+
const recorded = await josh(['review:record', '--issue', issue, ...verdict.specs])
|
|
132
|
+
|
|
133
|
+
if (recorded.code !== SUCCESS_EXIT_CODE) return recorded
|
|
134
|
+
|
|
135
|
+
const outcome = outcome_of(verdict)
|
|
136
|
+
const out = [...verdict.specs, outcome.note].join('\n')
|
|
137
|
+
|
|
138
|
+
return outcome.is_passing ? { code: SUCCESS_EXIT_CODE, out } : failure(out)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async function run_phases(phases: ReadonlyArray<Phase>): Promise<JoshResult> {
|
|
142
|
+
let last: JoshResult = { code: SUCCESS_EXIT_CODE, out: '' }
|
|
143
|
+
|
|
144
|
+
for (const phase of phases) {
|
|
145
|
+
last = await phase()
|
|
146
|
+
if (last.code !== SUCCESS_EXIT_CODE) return last
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return last
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// A brief-minting command, then a reviewer handed what it printed.
|
|
153
|
+
function reviewed(open: ReadonlyArray<string>, prompt_of: PromptOf): ReadonlyArray<Phase> {
|
|
154
|
+
const opened = { brief: '' }
|
|
155
|
+
|
|
156
|
+
return [
|
|
157
|
+
async () => {
|
|
158
|
+
const result = await josh(open)
|
|
159
|
+
|
|
160
|
+
opened.brief = result.out
|
|
161
|
+
|
|
162
|
+
return result
|
|
163
|
+
},
|
|
164
|
+
async () => await launch_reviewer(opened.brief, prompt_of),
|
|
165
|
+
]
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// The scoped pair's precondition, met by the supervisor itself rather than stopped on
|
|
169
|
+
// (joshuafolkken/kit#2500): only the checks with no green record for this tree run — the same
|
|
170
|
+
// question `review:brief` and the local gate refuse on — so a fresh record costs nothing and a stale
|
|
171
|
+
// or absent one costs a scoped run instead of a stop and a relaunched session. A check that genuinely
|
|
172
|
+
// fails still stops the ship, its output forwarded to the ship log.
|
|
173
|
+
async function scoped_pair(): Promise<JoshResult> {
|
|
174
|
+
const tree = await gate_tree.read_gate_tree()
|
|
175
|
+
const scripts = scoped_green.missing_scripts(tree.files, tree.base)
|
|
176
|
+
|
|
177
|
+
return await run_phases(scripts.map((script) => async () => await josh([script])))
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Fixes made in place are counted only once the scoped pair is green on the fixed tree. The reviewer is
|
|
181
|
+
// asked to leave it green; this is the check that it did, and a fix it could not get green is routed as
|
|
182
|
+
// the finding it still is — recorded, then stopped before the gate and the commit take it in.
|
|
183
|
+
async function round_one_record(issue: string): Promise<JoshResult> {
|
|
184
|
+
const is_fixed = current_verdict().kind === run_ship_review.VERDICT.FIXED
|
|
185
|
+
const checked = is_fixed ? await scoped_pair() : undefined
|
|
186
|
+
const is_verified = checked === undefined || checked.code === SUCCESS_EXIT_CODE
|
|
187
|
+
|
|
188
|
+
return await record_and_route(issue, (verdict) =>
|
|
189
|
+
is_verified ? run_ship_review.round_one_outcome(verdict) : run_ship_review.UNVERIFIED_OUTCOME,
|
|
190
|
+
)
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// The round-1 review, beside the gate: scoped pair → open → review → join → attest → record, stopping
|
|
194
|
+
// at the first that did not pass.
|
|
195
|
+
async function review_stage(issue: string): Promise<JoshResult> {
|
|
196
|
+
return await run_phases([
|
|
197
|
+
scoped_pair,
|
|
198
|
+
...reviewed([RUN_REVIEW], run_ship_review.reviewer_prompt),
|
|
199
|
+
join_gate,
|
|
200
|
+
async () => await josh(ATTEST_CHECK),
|
|
201
|
+
async () => await round_one_record(issue),
|
|
202
|
+
])
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// The round-2 verification pass, after the commit so it runs beside CI: due only when the round-1 fix
|
|
206
|
+
// delta says so, then scoped pair → brief → fresh reviewer → attest → record.
|
|
207
|
+
async function round_two_stage(issue: string): Promise<JoshResult> {
|
|
208
|
+
const decision = await josh(ROUND_TWO_DECISION)
|
|
209
|
+
const answer = decision.out.trim()
|
|
210
|
+
|
|
211
|
+
if (decision.code !== SUCCESS_EXIT_CODE) return decision
|
|
212
|
+
|
|
213
|
+
if (answer !== ROUND_TWO_REQUIRED) {
|
|
214
|
+
return { code: SUCCESS_EXIT_CODE, out: `${answer}\n${ROUND_TWO_SKIPPED_NOTE}` }
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return await run_phases([
|
|
218
|
+
scoped_pair,
|
|
219
|
+
...reviewed(ROUND_TWO_BRIEF, run_ship_review.verification_prompt),
|
|
220
|
+
async () => await josh(ATTEST_CHECK),
|
|
221
|
+
async () => await record_and_route(issue, run_ship_review.round_two_outcome),
|
|
222
|
+
])
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const run_ship_review_steps = { paths, review_stage, round_two_stage }
|
|
226
|
+
|
|
227
|
+
export { run_ship_review_steps }
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { review_finding_ledger } from '#scripts/review/review-finding-ledger'
|
|
2
|
+
import { review_record_cli } from '#scripts/review/review-record-cli'
|
|
3
|
+
|
|
4
|
+
// The pure half of `josh ship --review` (joshuafolkken/kit#2427): the one-line prompts the supervised
|
|
5
|
+
// reviewers are launched with, the verdict read back off the findings file each writes, and where that
|
|
6
|
+
// verdict routes the ship. Kept apart from the launch and the joins (`run-ship-review-steps.ts`) the way
|
|
7
|
+
// `run-review.ts` is kept apart from `run-review-steps.ts`, so every branch is pinned without a session
|
|
8
|
+
// ever starting.
|
|
9
|
+
//
|
|
10
|
+
// **The reviewer is the one the chain already runs.** Its prompt hands it the brief `run:review`
|
|
11
|
+
// printed — the same level, rubric, checkout and `review:attest` nonce a `/code-review` subagent was
|
|
12
|
+
// given — and asks only that the findings also be written in the `review:record` grammar, so the
|
|
13
|
+
// supervisor records and routes them without an agent reading the prose.
|
|
14
|
+
//
|
|
15
|
+
// **Round 1 fixes what is local; round 2 only reads** (joshuafolkken/kit#2489). The round-1 reviewer
|
|
16
|
+
// applies a Medium whose fix is small and local — the "small, local asks" `chain-rule.md` names — and
|
|
17
|
+
// marks that finding `fixed`, so the supervisor carries the ship through the gate, the commit and a
|
|
18
|
+
// round-2 verification pass instead of handing a lane child back for a fix it could not make. A High is
|
|
19
|
+
// never fixed in place and always blocks, as does a Medium left unfixed. The round-2 reviewer is a fresh
|
|
20
|
+
// session that edits nothing, and anything but a clean or Low-only verdict from it blocks.
|
|
21
|
+
|
|
22
|
+
const LINE_SEPARATOR = /\r?\n/u
|
|
23
|
+
const HIGH = 'high'
|
|
24
|
+
const MEDIUM = 'medium'
|
|
25
|
+
const FIXED_PREFIX = 'fixed '
|
|
26
|
+
|
|
27
|
+
const VERDICT = {
|
|
28
|
+
CLEAN: 'clean',
|
|
29
|
+
FIXED: 'fixed',
|
|
30
|
+
BLOCKING: 'blocking',
|
|
31
|
+
INVALID: 'invalid',
|
|
32
|
+
} as const
|
|
33
|
+
|
|
34
|
+
type ReviewVerdict =
|
|
35
|
+
| {
|
|
36
|
+
kind: typeof VERDICT.CLEAN | typeof VERDICT.FIXED | typeof VERDICT.BLOCKING
|
|
37
|
+
specs: ReadonlyArray<string>
|
|
38
|
+
}
|
|
39
|
+
| { kind: typeof VERDICT.INVALID; note: string }
|
|
40
|
+
|
|
41
|
+
type ScoredVerdict = Exclude<ReviewVerdict, { kind: typeof VERDICT.INVALID }>
|
|
42
|
+
|
|
43
|
+
// Whether a recorded round lets the ship go on, and the line the report closes that round with.
|
|
44
|
+
interface RoundOutcome {
|
|
45
|
+
is_passing: boolean
|
|
46
|
+
note: string
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface Finding {
|
|
50
|
+
spec: string
|
|
51
|
+
is_fixed: boolean
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const MISSING_NOTE = 'the reviewer wrote no findings file — the review did not complete'
|
|
55
|
+
const CLEAN_NOTE = 'review clean or Low-only — recorded; shipping on.'
|
|
56
|
+
const FIXED_NOTE =
|
|
57
|
+
'review fixes applied in place — recorded; the gate re-runs on the fixed tree and round 2 follows the commit.'
|
|
58
|
+
const BLOCKING_NOTE =
|
|
59
|
+
'review found High/Medium it did not fix — recorded; fix them, then take the round-2 route (`chain-rule.md`).'
|
|
60
|
+
const UNVERIFIED_OUTCOME: RoundOutcome = {
|
|
61
|
+
is_passing: false,
|
|
62
|
+
note: 'review fixes did not pass the scoped checks — recorded as unfixed; fix them, then take the round-2 route (`chain-rule.md`).',
|
|
63
|
+
}
|
|
64
|
+
const ROUND_TWO_CLEAN_NOTE = 'round 2 clean or Low-only — recorded; shipping on.'
|
|
65
|
+
const ROUND_TWO_BLOCKING_NOTE =
|
|
66
|
+
'round 2 found High/Medium or edited the tree — recorded; round 2 is final: fix, push and gate it, then run followup (`chain-rule.md` step 4).'
|
|
67
|
+
|
|
68
|
+
function findings_instruction(findings_path: string, fixed_clause: string): string {
|
|
69
|
+
const categories = review_finding_ledger.CATEGORIES.join(', ')
|
|
70
|
+
|
|
71
|
+
return [
|
|
72
|
+
`Then write every finding to ${findings_path}, one per line as <category>:<severity>:<file>[:<line>]`,
|
|
73
|
+
`(category one of ${categories}; severity high, medium or low)${fixed_clause},`,
|
|
74
|
+
'and an empty file when there is none.',
|
|
75
|
+
].join(' ')
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// One line, because `detached_launch` refuses an argument carrying a control character: the multi-line
|
|
79
|
+
// brief travels by path, never inline.
|
|
80
|
+
function reviewer_prompt(brief_path: string, findings_path: string): string {
|
|
81
|
+
return [
|
|
82
|
+
`Run a /code-review of this checkout: read the review brief at ${brief_path} and follow it exactly —`,
|
|
83
|
+
'the level on its first line, the rubric it names, the checkout it pins and its review:attest step.',
|
|
84
|
+
'Apply a fix only for a Medium finding whose fix is small and local — a one-function refactor, an',
|
|
85
|
+
'added test, an added guard; never fix a High or a change that reaches beyond one place, and never',
|
|
86
|
+
'commit, stage or push. After any fix, run `pnpm josh lint:related && pnpm josh test:related` and',
|
|
87
|
+
'return only once both are green; revert a fix you cannot get green and report that finding unfixed.',
|
|
88
|
+
findings_instruction(findings_path, `, prefixing a finding you fixed with "${FIXED_PREFIX}"`),
|
|
89
|
+
].join(' ')
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// The round-2 verification pass: a fresh session over the round-1 fix delta, reading only.
|
|
93
|
+
function verification_prompt(brief_path: string, findings_path: string): string {
|
|
94
|
+
return [
|
|
95
|
+
`Run a /code-review of this checkout — the round-2 verification pass over the round-1 fixes: read the`,
|
|
96
|
+
`review brief at ${brief_path} and follow it exactly — the level on its first line, the rubric it`,
|
|
97
|
+
'names, the checkout it pins and its review:attest step. Do not edit any file.',
|
|
98
|
+
findings_instruction(findings_path, ''),
|
|
99
|
+
].join(' ')
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function finding_of(line: string): Finding {
|
|
103
|
+
if (!line.startsWith(FIXED_PREFIX)) return { spec: line, is_fixed: false }
|
|
104
|
+
|
|
105
|
+
return { spec: line.slice(FIXED_PREFIX.length).trim(), is_fixed: true }
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function spec_findings(text: string): ReadonlyArray<Finding> {
|
|
109
|
+
return text
|
|
110
|
+
.split(LINE_SEPARATOR)
|
|
111
|
+
.map((line) => line.trim())
|
|
112
|
+
.filter((line) => line.length > 0)
|
|
113
|
+
.map((line) => finding_of(line))
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function is_recordable(finding: Finding): boolean {
|
|
117
|
+
return review_record_cli.parse_finding(finding.spec) !== undefined
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// A High blocks whether or not it is marked fixed — it is never fixed in place — and a Medium blocks
|
|
121
|
+
// unless the reviewer fixed it.
|
|
122
|
+
function is_blocking(finding: Finding): boolean {
|
|
123
|
+
const severity = review_record_cli.parse_finding(finding.spec)?.severity
|
|
124
|
+
|
|
125
|
+
return severity === HIGH || (severity === MEDIUM && !finding.is_fixed)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function scored_kind(findings: ReadonlyArray<Finding>): ScoredVerdict['kind'] {
|
|
129
|
+
if (findings.some((finding) => is_blocking(finding))) return VERDICT.BLOCKING
|
|
130
|
+
|
|
131
|
+
return findings.some((finding) => finding.is_fixed) ? VERDICT.FIXED : VERDICT.CLEAN
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Absent means the reviewer never finished; a line outside the grammar means its verdict cannot be
|
|
135
|
+
// recorded — both stop the ship rather than read as clean. The specs are recorded without the `fixed`
|
|
136
|
+
// mark: a fixed finding was still a finding of that round.
|
|
137
|
+
function read_verdict(text: string | undefined): ReviewVerdict {
|
|
138
|
+
if (text === undefined) return { kind: VERDICT.INVALID, note: MISSING_NOTE }
|
|
139
|
+
|
|
140
|
+
const findings = spec_findings(text)
|
|
141
|
+
const invalid = findings.find((finding) => !is_recordable(finding))
|
|
142
|
+
|
|
143
|
+
if (invalid !== undefined) {
|
|
144
|
+
return { kind: VERDICT.INVALID, note: `unreadable finding: ${invalid.spec}` }
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return { kind: scored_kind(findings), specs: findings.map((finding) => finding.spec) }
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Round 1 passes clean or with every blocking finding fixed in place; round 2 follows the commit.
|
|
151
|
+
function round_one_outcome(verdict: ScoredVerdict): RoundOutcome {
|
|
152
|
+
if (verdict.kind === VERDICT.BLOCKING) return { is_passing: false, note: BLOCKING_NOTE }
|
|
153
|
+
|
|
154
|
+
return { is_passing: true, note: verdict.kind === VERDICT.FIXED ? FIXED_NOTE : CLEAN_NOTE }
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Round 2 is final and reads only, so it passes clean or Low-only alone — a fix it made would itself be
|
|
158
|
+
// unreviewed.
|
|
159
|
+
function round_two_outcome(verdict: ScoredVerdict): RoundOutcome {
|
|
160
|
+
const is_passing = verdict.kind === VERDICT.CLEAN
|
|
161
|
+
|
|
162
|
+
return { is_passing, note: is_passing ? ROUND_TWO_CLEAN_NOTE : ROUND_TWO_BLOCKING_NOTE }
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const run_ship_review = {
|
|
166
|
+
FIXED_PREFIX,
|
|
167
|
+
UNVERIFIED_OUTCOME,
|
|
168
|
+
VERDICT,
|
|
169
|
+
read_verdict,
|
|
170
|
+
reviewer_prompt,
|
|
171
|
+
round_one_outcome,
|
|
172
|
+
round_two_outcome,
|
|
173
|
+
verification_prompt,
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export type { ReviewVerdict, RoundOutcome, ScoredVerdict }
|
|
177
|
+
export { run_ship_review }
|