@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,150 @@
|
|
|
1
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
// `josh ship`'s durable stage record, and the decision of which stage a resumed ship may pass over
|
|
5
|
+
// (joshuafolkken/kit#2426). The composite used to be a straight line with no memory: a ship that died
|
|
6
|
+
// after its push re-ran the gate, and nothing checked whether the commit, the push or the merge had
|
|
7
|
+
// already happened.
|
|
8
|
+
//
|
|
9
|
+
// **The record is a hint; the repository's actual state is the authority.** A record can be lost — a
|
|
10
|
+
// temp directory wiped — or outlived by the tree it describes, when new work was committed after it
|
|
11
|
+
// was written. So every skip below is decided from the observed state first, and a recorded stage is
|
|
12
|
+
// honored only where that state still corroborates it: a lost record re-derives the same answer from
|
|
13
|
+
// the state, and a stale one is overruled by it. Neither can produce a second commit, push or merge.
|
|
14
|
+
//
|
|
15
|
+
// **The gate is never skipped on the record's word.** It is passed over only once its output — a
|
|
16
|
+
// commit — exists; otherwise it runs, and `josh gate`'s own tree-keyed green record is what makes a
|
|
17
|
+
// re-run on an unchanged tree a reuse rather than a second execution. No quality gate is folded away.
|
|
18
|
+
|
|
19
|
+
const STAGE = {
|
|
20
|
+
REVIEW: 'review',
|
|
21
|
+
GATE: 'gate',
|
|
22
|
+
COMMIT: 'commit',
|
|
23
|
+
ROUND_TWO: 'round-2',
|
|
24
|
+
FOLLOWUP: 'followup',
|
|
25
|
+
REPORT: 'report',
|
|
26
|
+
} as const
|
|
27
|
+
|
|
28
|
+
type Stage = (typeof STAGE)[keyof typeof STAGE]
|
|
29
|
+
|
|
30
|
+
// Where one stage is on the event stream: started, succeeded, failed, or passed over as already done.
|
|
31
|
+
const PHASE = {
|
|
32
|
+
START: 'start',
|
|
33
|
+
DONE: 'done',
|
|
34
|
+
FAILED: 'failed',
|
|
35
|
+
SKIPPED: 'skipped',
|
|
36
|
+
} as const
|
|
37
|
+
|
|
38
|
+
type Phase = (typeof PHASE)[keyof typeof PHASE]
|
|
39
|
+
|
|
40
|
+
interface ShipState {
|
|
41
|
+
is_committed: boolean
|
|
42
|
+
is_pushed: boolean
|
|
43
|
+
is_merged: boolean
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const RECORD_PREFIX = 'josh-ship-stages-'
|
|
47
|
+
const RECORD_SEPARATOR = '-'
|
|
48
|
+
const SKIP_COMMIT_FLAG = '--skip-commit'
|
|
49
|
+
const SKIP_PUSH_FLAG = '--skip-push'
|
|
50
|
+
|
|
51
|
+
const record_schema = z.object({ done: z.array(z.string()) })
|
|
52
|
+
|
|
53
|
+
// Keyed on the repository and the issue: every lane of one repository shares the common git directory,
|
|
54
|
+
// and two issues shipping from two lanes keep two records.
|
|
55
|
+
function record_path(repository: string, issue: string): string {
|
|
56
|
+
return stamp_file.stamp_path(`${RECORD_PREFIX}${issue}${RECORD_SEPARATOR}`, repository)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function parse_done(raw: string): ReadonlySet<string> {
|
|
60
|
+
try {
|
|
61
|
+
return new Set(record_schema.parse(JSON.parse(raw)).done)
|
|
62
|
+
} catch {
|
|
63
|
+
return new Set()
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// The stages the record says completed. An absent, planted or malformed record reads as none — the
|
|
68
|
+
// state decides from there, so "no record" is always the safe answer.
|
|
69
|
+
function read_done(target: string): ReadonlySet<string> {
|
|
70
|
+
const raw = stamp_file.read_stamp_text(target)
|
|
71
|
+
|
|
72
|
+
return raw === undefined ? new Set() : parse_done(raw)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function mark_done(target: string, stage: Stage): void {
|
|
76
|
+
const done = new Set([...read_done(target), stage])
|
|
77
|
+
|
|
78
|
+
stamp_file.replace_stamp(target, { done: [...done] })
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Removed once the report stage completes, so a later ship of the same issue starts from the gate.
|
|
82
|
+
function clear(target: string): void {
|
|
83
|
+
stamp_file.remove_stamp(target)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Committed and on origin: the only state in which the commit stage has nothing left but the pull
|
|
87
|
+
// request, which `git -y` already finds rather than duplicates.
|
|
88
|
+
function is_shipped(state: ShipState): boolean {
|
|
89
|
+
return state.is_committed && state.is_pushed
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const DONE_BY: Record<Stage, (done: ReadonlySet<string>, state: ShipState) => boolean> = {
|
|
93
|
+
// The `--review` round (joshuafolkken/kit#2427) precedes the commit, so a commit is its output as it
|
|
94
|
+
// is the gate's. A record alone is not honored: before a commit the tree may have been edited since
|
|
95
|
+
// the recorded round, and only a commit pins the tree that round read.
|
|
96
|
+
[STAGE.REVIEW]: (_done, state) => state.is_merged || state.is_committed,
|
|
97
|
+
[STAGE.GATE]: (_done, state) => state.is_merged || state.is_committed,
|
|
98
|
+
[STAGE.COMMIT]: (done, state) => state.is_merged || (done.has(STAGE.COMMIT) && is_shipped(state)),
|
|
99
|
+
// The round-2 pass (joshuafolkken/kit#2489) reads the pushed fix delta, so its record is honored only
|
|
100
|
+
// while that push still stands — new work pushed on top reruns it.
|
|
101
|
+
[STAGE.ROUND_TWO]: (done, state) =>
|
|
102
|
+
state.is_merged || (done.has(STAGE.ROUND_TWO) && is_shipped(state)),
|
|
103
|
+
// A recorded followup still needs the shipped state: a record left by a merged ship whose report
|
|
104
|
+
// failed must not pass over the followup of new, not-yet-pushed work on the same issue.
|
|
105
|
+
[STAGE.FOLLOWUP]: (done, state) =>
|
|
106
|
+
state.is_merged || (done.has(STAGE.FOLLOWUP) && is_shipped(state)),
|
|
107
|
+
[STAGE.REPORT]: (done) => done.has(STAGE.REPORT),
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// A supplied PR body is work only the commit stage delivers (joshuafolkken/kit#2446): a rerun carrying
|
|
111
|
+
// the live-execution evidence a refused `followup` asked for reruns `git -y`, whose skip flags leave the
|
|
112
|
+
// commit and push alone while the body reaches the already-open pull request.
|
|
113
|
+
function is_done(
|
|
114
|
+
stage: Stage,
|
|
115
|
+
done: ReadonlySet<string>,
|
|
116
|
+
state: ShipState,
|
|
117
|
+
has_body = false,
|
|
118
|
+
): boolean {
|
|
119
|
+
if (has_body && stage === STAGE.COMMIT && !state.is_merged) return false
|
|
120
|
+
|
|
121
|
+
return DONE_BY[stage](done, state)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// The `git -y` flags that keep a resumed commit stage from repeating what already happened: an
|
|
125
|
+
// existing commit is not made again, and a commit already on origin is not pushed again. A push is
|
|
126
|
+
// skipped only on top of a skipped commit — new work committed now must still be pushed.
|
|
127
|
+
function commit_flags(state: ShipState): ReadonlyArray<string> {
|
|
128
|
+
if (!state.is_committed) return []
|
|
129
|
+
|
|
130
|
+
return state.is_pushed ? [SKIP_COMMIT_FLAG, SKIP_PUSH_FLAG] : [SKIP_COMMIT_FLAG]
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function event_text(issue: string, stage: Stage, phase: Phase): string {
|
|
134
|
+
return `#${issue} ${stage} ${phase}`
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const run_ship_stage = {
|
|
138
|
+
PHASE,
|
|
139
|
+
STAGE,
|
|
140
|
+
clear,
|
|
141
|
+
commit_flags,
|
|
142
|
+
event_text,
|
|
143
|
+
is_done,
|
|
144
|
+
mark_done,
|
|
145
|
+
read_done,
|
|
146
|
+
record_path,
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export type { Phase, ShipState, Stage }
|
|
150
|
+
export { run_ship_stage }
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// `josh ship "<title> #<N>"` — the one call that ships a finished change (joshuafolkken/kit#2398). It
|
|
2
|
+
// folds the fixed commit-to-report region a run spent a dozen round trips on — the gate, the
|
|
3
|
+
// commit/push/PR (`git -y`), the CI-wait merge (`followup`) and the report bookkeeping (`run:tail`) —
|
|
4
|
+
// into one composite, extending the post-merge fold of `run:tail` (joshuafolkken/kit#2372) into the
|
|
5
|
+
// body of the region. The region is fixed procedure; the one decision it carried — disposing of a
|
|
6
|
+
// review finding — stays in front of this command, so nothing a reader had to judge is folded away.
|
|
7
|
+
//
|
|
8
|
+
// **This module is the pure half**, kept apart from the chaining CLI the way `run-tail.ts` is. Unlike
|
|
9
|
+
// `run:tail`, ship stops at the first failed step: a red gate must never reach the commit, so the
|
|
10
|
+
// composite ends at the failure, and the report names the step that failed so the run reads only it.
|
|
11
|
+
|
|
12
|
+
const REVIEW_HEADER = '=== review ==='
|
|
13
|
+
const GATE_HEADER = '=== gate ==='
|
|
14
|
+
const COMMIT_HEADER = '=== commit/push/PR ==='
|
|
15
|
+
const ROUND_TWO_HEADER = '=== round-2 review ==='
|
|
16
|
+
const FOLLOWUP_HEADER = '=== followup ==='
|
|
17
|
+
const REPORT_HEADER = '=== report ==='
|
|
18
|
+
const SECTION_SEPARATOR = '\n\n'
|
|
19
|
+
const STOPPED_PREFIX = 'stopped at: '
|
|
20
|
+
// The body of a stage a resumed ship passed over (joshuafolkken/kit#2426) — a success, so the report
|
|
21
|
+
// still shows every stage under its header and the reader sees which ones this call did not repeat.
|
|
22
|
+
const SKIPPED_BODY = 'skipped — already done'
|
|
23
|
+
|
|
24
|
+
const SUCCESS_EXIT_CODE = 0
|
|
25
|
+
const FAILURE_EXIT_CODE = 1
|
|
26
|
+
|
|
27
|
+
interface ShipSection {
|
|
28
|
+
header: string
|
|
29
|
+
body: string
|
|
30
|
+
code: number
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function section_report(section: ShipSection): string {
|
|
34
|
+
return `${section.header}\n${section.body}`
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// The step that stopped the ship, or `undefined` when every executed step was green. Because the
|
|
38
|
+
// composite breaks at the first failure, this is the last section whenever one exists.
|
|
39
|
+
function failed_section(sections: ReadonlyArray<ShipSection>): ShipSection | undefined {
|
|
40
|
+
return sections.find((section) => section.code !== SUCCESS_EXIT_CODE)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The executed steps under their headers, closed with the name of the step that stopped the run so the
|
|
44
|
+
// reader sees which one to fix without counting sections.
|
|
45
|
+
function format_report(sections: ReadonlyArray<ShipSection>): string {
|
|
46
|
+
const body = sections.map((section) => section_report(section)).join(SECTION_SEPARATOR)
|
|
47
|
+
const failed = failed_section(sections)
|
|
48
|
+
|
|
49
|
+
if (failed === undefined) return body
|
|
50
|
+
|
|
51
|
+
return `${body}${SECTION_SEPARATOR}${STOPPED_PREFIX}${failed.header}`
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Non-zero when any executed step failed — the composite only ever collects a failed step as its last,
|
|
55
|
+
// so this reads the same clean/red verdict as the loop that stopped there.
|
|
56
|
+
function exit_code(sections: ReadonlyArray<ShipSection>): number {
|
|
57
|
+
const is_clean = sections.every((section) => section.code === SUCCESS_EXIT_CODE)
|
|
58
|
+
|
|
59
|
+
return is_clean ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const run_ship = {
|
|
63
|
+
COMMIT_HEADER,
|
|
64
|
+
FOLLOWUP_HEADER,
|
|
65
|
+
GATE_HEADER,
|
|
66
|
+
REPORT_HEADER,
|
|
67
|
+
REVIEW_HEADER,
|
|
68
|
+
ROUND_TWO_HEADER,
|
|
69
|
+
SKIPPED_BODY,
|
|
70
|
+
STOPPED_PREFIX,
|
|
71
|
+
SUCCESS_EXIT_CODE,
|
|
72
|
+
exit_code,
|
|
73
|
+
failed_section,
|
|
74
|
+
format_report,
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export type { ShipSection }
|
|
78
|
+
export { run_ship }
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { parseArgs } from 'node:util'
|
|
4
|
+
import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
|
|
5
|
+
import { issue_state_cli, type StateRead } from '#scripts/issue/issue-state-cli'
|
|
6
|
+
import { run_carry, type CarryRead } from './run-carry'
|
|
7
|
+
import { run_status, type StatusParts } from './run-status'
|
|
8
|
+
|
|
9
|
+
// `josh run:status <N>` — one call for the read-only status a run glances at (joshuafolkken/kit#2165):
|
|
10
|
+
// the issue's state and labels (`issue:state`), the session's hand-off verdict (`cost --cut`), and the
|
|
11
|
+
// invocation's carry counters (`run:carry`). Each is reused rather than reproduced, and the two async
|
|
12
|
+
// reads run concurrently, so three round trips become one.
|
|
13
|
+
//
|
|
14
|
+
// **Nothing here writes.** The claim `run:hold` makes and the clock mark `run:progress` records are
|
|
15
|
+
// deliberately out: this command answers "where does this run stand", and a status read that mutated
|
|
16
|
+
// the thing it read is the bug the read-only pin (`run-status-cli.test.ts`) exists to catch. The merge
|
|
17
|
+
// event keeps its own composite (`run:merge`), which is where the same three facts are read to *act*.
|
|
18
|
+
|
|
19
|
+
const SUCCESS_EXIT_CODE = 0
|
|
20
|
+
const FAILURE_EXIT_CODE = 1
|
|
21
|
+
const ARGV_OFFSET = 2
|
|
22
|
+
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
23
|
+
const USAGE = 'Usage: josh run:status <issue-number> [--repo <owner/repo>]'
|
|
24
|
+
const CARRY_NONE_NOTE = 'no run recorded here'
|
|
25
|
+
const CARRY_UNREADABLE_NOTE = '(run record not bundled: unreadable)'
|
|
26
|
+
const CARRY_SUMMARY_NONE = 'none'
|
|
27
|
+
const CARRY_SUMMARY_EXPIRED = 'expired'
|
|
28
|
+
const CARRY_SUMMARY_UNREADABLE = 'unreadable'
|
|
29
|
+
const MERGED_SUFFIX = ' merged'
|
|
30
|
+
|
|
31
|
+
const OPTIONS = { repo: { type: 'string' } } as const
|
|
32
|
+
|
|
33
|
+
interface StatusRequest {
|
|
34
|
+
issue_number: string
|
|
35
|
+
repo?: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface StatusReads {
|
|
39
|
+
state: StateRead
|
|
40
|
+
carry: CarryRead
|
|
41
|
+
cost: CostVerdict
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
interface ParsedArguments {
|
|
45
|
+
positionals: ReadonlyArray<string>
|
|
46
|
+
values: { repo?: string }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function read_args(argv: ReadonlyArray<string>): ParsedArguments | undefined {
|
|
50
|
+
try {
|
|
51
|
+
return parseArgs({ args: [...argv], options: OPTIONS, allowPositionals: true, strict: true })
|
|
52
|
+
} catch {
|
|
53
|
+
return undefined
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Exactly one issue number, or the call is refused: `run:status` reports one run, and a second number
|
|
58
|
+
// would print a second issue's state a caller reads as this run's own.
|
|
59
|
+
function valid_issue(positionals: ReadonlyArray<string>): string | undefined {
|
|
60
|
+
const [first, ...rest] = positionals
|
|
61
|
+
|
|
62
|
+
if (first === undefined || rest.length > 0) return undefined
|
|
63
|
+
|
|
64
|
+
return ISSUE_NUMBER_PATTERN.test(first) ? first : undefined
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function parse(argv: ReadonlyArray<string>): StatusRequest | undefined {
|
|
68
|
+
const parsed = read_args(argv)
|
|
69
|
+
|
|
70
|
+
if (parsed === undefined) return undefined
|
|
71
|
+
|
|
72
|
+
const issue_number = valid_issue(parsed.positionals)
|
|
73
|
+
|
|
74
|
+
if (issue_number === undefined) return undefined
|
|
75
|
+
|
|
76
|
+
const { repo } = parsed.values
|
|
77
|
+
|
|
78
|
+
return repo === undefined ? { issue_number } : { issue_number, repo }
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// The carry record is keyed on the common git directory every lane of one repository shares, resolved
|
|
82
|
+
// the way `run-carry` resolves it. An unreadable git directory is reported as an unreadable record
|
|
83
|
+
// rather than invented as `none`, the same distinction `run-carry` keeps.
|
|
84
|
+
async function read_carry_record(): Promise<CarryRead> {
|
|
85
|
+
const directory = await run_carry.repository_directory()
|
|
86
|
+
|
|
87
|
+
if (directory === undefined) return { kind: 'unreadable' }
|
|
88
|
+
|
|
89
|
+
return run_carry.read_carry(run_carry.carry_path(directory))
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async function gather(request: StatusRequest): Promise<StatusReads> {
|
|
93
|
+
const [state, carry] = await Promise.all([
|
|
94
|
+
issue_state_cli.read_issue(request.issue_number, request.repo),
|
|
95
|
+
read_carry_record(),
|
|
96
|
+
])
|
|
97
|
+
|
|
98
|
+
return { state, carry, cost: cost_cli.session_verdict() }
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// One note for a read that produced nothing, naming which of the two it was — the same distinction
|
|
102
|
+
// `issue:state` keeps, so a bundled failure still tells a retry from an answer.
|
|
103
|
+
function failure_note(issue_number: string, kind: string): string {
|
|
104
|
+
return `(issue #${issue_number} not bundled: ${kind})`
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function carry_summary(carry: CarryRead): string {
|
|
108
|
+
if (carry.kind === 'carried') return `${String(carry.carry.merged)}${MERGED_SUFFIX}`
|
|
109
|
+
if (carry.kind === 'expired') return CARRY_SUMMARY_EXPIRED
|
|
110
|
+
if (carry.kind === 'unreadable') return CARRY_SUMMARY_UNREADABLE
|
|
111
|
+
|
|
112
|
+
return CARRY_SUMMARY_NONE
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function carry_detail(carry: CarryRead): string {
|
|
116
|
+
if (carry.kind === 'carried' || carry.kind === 'expired') {
|
|
117
|
+
return run_carry.describe_carry(carry.carry)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (carry.kind === 'unreadable') return CARRY_UNREADABLE_NOTE
|
|
121
|
+
|
|
122
|
+
return CARRY_NONE_NOTE
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function to_parts(issue_number: string, reads: StatusReads): StatusParts {
|
|
126
|
+
const state = reads.state.kind === 'state' ? reads.state.state : undefined
|
|
127
|
+
const state_failure = state === undefined ? failure_note(issue_number, reads.state.kind) : ''
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
issue_number,
|
|
131
|
+
state,
|
|
132
|
+
state_failure,
|
|
133
|
+
cost_verdict: reads.cost,
|
|
134
|
+
carry_summary: carry_summary(reads.carry),
|
|
135
|
+
carry_detail: carry_detail(reads.carry),
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Non-zero when any of the three could not answer: a failed state read, an unreadable carry record, or
|
|
140
|
+
// a session that cannot be priced. A `none` carry is a valid answer — no run is recorded — so it is
|
|
141
|
+
// not a failure, exactly as `issue:state` treats a resolved state.
|
|
142
|
+
function exit_code(reads: StatusReads): number {
|
|
143
|
+
const is_complete =
|
|
144
|
+
reads.state.kind === 'state' &&
|
|
145
|
+
reads.carry.kind !== 'unreadable' &&
|
|
146
|
+
reads.cost !== cost_cli.UNMEASURABLE_VERDICT
|
|
147
|
+
|
|
148
|
+
return is_complete ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
152
|
+
const request = parse(argv)
|
|
153
|
+
|
|
154
|
+
if (request === undefined) {
|
|
155
|
+
console.error(USAGE)
|
|
156
|
+
|
|
157
|
+
return FAILURE_EXIT_CODE
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const reads = await gather(request)
|
|
161
|
+
|
|
162
|
+
console.info(run_status.format_report(to_parts(request.issue_number, reads)))
|
|
163
|
+
|
|
164
|
+
return exit_code(reads)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
168
|
+
process.exitCode = await run(argv)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const run_status_cli = { USAGE, parse, run }
|
|
172
|
+
|
|
173
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
174
|
+
|
|
175
|
+
export { run_status_cli }
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { issue_state, type IssueState } from '#scripts/issue/issue-state'
|
|
2
|
+
|
|
3
|
+
// `josh run:status <N>` — the read-only status a run glances at, assembled into one report
|
|
4
|
+
// (joshuafolkken/kit#2165). A run reads three independent facts to know where it stands — the issue's
|
|
5
|
+
// own state, whether the session has crossed the hand-off budget, and its own carry counters — and
|
|
6
|
+
// the procedure had it type `issue:state`, `cost --cut` and `run:carry` as three separate steps. This
|
|
7
|
+
// joins the answers those three commands give, reusing each rather than reproducing it.
|
|
8
|
+
//
|
|
9
|
+
// **It is read-only, and that is the whole point** — the merge event has its own composite
|
|
10
|
+
// (`run:merge`), and the pre-edit reads have theirs (`run:prep`); what was left was the passive glance
|
|
11
|
+
// a resumed session or a non-merge decision takes, which must not write. `run:hold`'s claim and
|
|
12
|
+
// `run:progress`'s clock mark are excluded for exactly that reason.
|
|
13
|
+
//
|
|
14
|
+
// The leading summary line carries the three facts on one line — the state, the cost verdict and the
|
|
15
|
+
// carry summary — so the glance is read off the first line without parsing the sections below it.
|
|
16
|
+
|
|
17
|
+
const SUMMARY_PREFIX = 'status #'
|
|
18
|
+
const STATE_LABEL = 'state: '
|
|
19
|
+
const COST_LABEL = 'cost: '
|
|
20
|
+
const RUN_LABEL = 'run: '
|
|
21
|
+
const FIELD_SEPARATOR = ' · '
|
|
22
|
+
const SUMMARY_DASH = ' — '
|
|
23
|
+
const UNKNOWN = '?'
|
|
24
|
+
const STATE_HEADER = '=== state ==='
|
|
25
|
+
const COST_HEADER = '=== cost ==='
|
|
26
|
+
const RUN_HEADER = '=== run ==='
|
|
27
|
+
const SECTION_SEPARATOR = '\n\n'
|
|
28
|
+
|
|
29
|
+
interface StatusParts {
|
|
30
|
+
issue_number: string
|
|
31
|
+
// `undefined` when the state read failed; `state_failure` then carries the note that stands in for
|
|
32
|
+
// the three-line block, so a bundled failure never prints as an empty state.
|
|
33
|
+
state: IssueState | undefined
|
|
34
|
+
state_failure: string
|
|
35
|
+
cost_verdict: string
|
|
36
|
+
// The one-liner form (`2 merged`, `none`, `unreadable`) and the full body, computed by the CLI so
|
|
37
|
+
// this formatter stays a pure string join, exactly as `run-prep` computes its latest scope.
|
|
38
|
+
carry_summary: string
|
|
39
|
+
carry_detail: string
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function summary(parts: StatusParts): string {
|
|
43
|
+
const state_value = parts.state === undefined ? UNKNOWN : parts.state.state
|
|
44
|
+
const fields = [
|
|
45
|
+
`${STATE_LABEL}${state_value}`,
|
|
46
|
+
`${COST_LABEL}${parts.cost_verdict}`,
|
|
47
|
+
`${RUN_LABEL}${parts.carry_summary}`,
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
return `${SUMMARY_PREFIX}${parts.issue_number}${SUMMARY_DASH}${fields.join(FIELD_SEPARATOR)}`
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// The state's three lines come from `issue:state`'s own formatter, so the spelling a document compares
|
|
54
|
+
// against — `human_review: yes` included — is the one this bundle prints.
|
|
55
|
+
function state_body(parts: StatusParts): string {
|
|
56
|
+
return parts.state === undefined
|
|
57
|
+
? parts.state_failure
|
|
58
|
+
: issue_state.format_issue_state(parts.state)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function section(header: string, body: string): string {
|
|
62
|
+
return `${header}\n${body}`
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function format_report(parts: StatusParts): string {
|
|
66
|
+
return [
|
|
67
|
+
summary(parts),
|
|
68
|
+
section(STATE_HEADER, state_body(parts)),
|
|
69
|
+
section(COST_HEADER, parts.cost_verdict),
|
|
70
|
+
section(RUN_HEADER, parts.carry_detail),
|
|
71
|
+
].join(SECTION_SEPARATOR)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const run_status = { COST_HEADER, RUN_HEADER, STATE_HEADER, SUMMARY_PREFIX, format_report }
|
|
75
|
+
|
|
76
|
+
export type { StatusParts }
|
|
77
|
+
export { run_status }
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { doctor_consumer } from '#scripts/doctor/doctor-consumer'
|
|
4
|
+
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
5
|
+
import { find_package_directory } from '#scripts/josh/josh-logic'
|
|
6
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
7
|
+
import { run_carry, type CarryRead } from './run-carry'
|
|
8
|
+
import { run_event_scope } from './run-event-scope'
|
|
9
|
+
import { run_event_stream } from './run-event-stream'
|
|
10
|
+
import { run_prep_cli } from './run-prep-cli'
|
|
11
|
+
import { run_step, type StepInput } from './run-step'
|
|
12
|
+
|
|
13
|
+
// `josh run:step <N>` — print the run's next single action, computed from the event stream, the carry
|
|
14
|
+
// record and the issue state (joshuafolkken/kit#2248). It reads exactly those three, never the
|
|
15
|
+
// conversation: the issue facts through `run:prep`'s own gather (so this and `run:next` never answer
|
|
16
|
+
// from different reads), the newest event off the stream, and the carry record's kind. The reader runs
|
|
17
|
+
// the printed line, returns the result through `run:event`, and asks again — the loop `run:step`
|
|
18
|
+
// exists to close.
|
|
19
|
+
|
|
20
|
+
const SUCCESS_EXIT_CODE = 0
|
|
21
|
+
const FAILURE_EXIT_CODE = 1
|
|
22
|
+
const ARGV_OFFSET = 2
|
|
23
|
+
const USAGE = 'Usage: josh run:step <issue-number>'
|
|
24
|
+
// The opt-in switch that gates the end-of-run retrospective (joshuafolkken/kit#2370). Read here rather
|
|
25
|
+
// than in `run-step.ts` so the position logic stays a pure function of its input; it defaults off, so an
|
|
26
|
+
// unset variable prints no retrospective step.
|
|
27
|
+
const RETROSPECTIVE_ENV_KEY = 'JOSH_RETROSPECTIVE'
|
|
28
|
+
|
|
29
|
+
interface RunReads {
|
|
30
|
+
carry_kind: CarryRead['kind']
|
|
31
|
+
is_retrospective_done: boolean
|
|
32
|
+
last_event: string | undefined
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// The run-level reads, keyed on the common git directory both the carry and the event stream share. A
|
|
36
|
+
// directory that cannot be read leaves the position unknowable, which `next_action` answers `unknown`.
|
|
37
|
+
function read_run(directory: string | undefined, issue_number: string): RunReads {
|
|
38
|
+
if (directory === undefined) {
|
|
39
|
+
return { carry_kind: 'unreadable', is_retrospective_done: false, last_event: undefined }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const carry = run_carry.read_carry(run_carry.carry_path(directory))
|
|
43
|
+
const events = run_event_stream.read_events(run_event_stream.target_of(directory))
|
|
44
|
+
// The last event *within this invocation's scope*, not the raw newest one: a stale event a previous
|
|
45
|
+
// invocation left on the stream must not be read as this run's position (joshuafolkken/kit#2395). The
|
|
46
|
+
// observed defect was a `run:step` that printed `wait` on a fresh run because an old `child-launch` was
|
|
47
|
+
// still the stream's tail. Another issue's detached ship supervisor is left out the same way
|
|
48
|
+
// (joshuafolkken/kit#2428).
|
|
49
|
+
const last = run_event_scope.last_issue_event(
|
|
50
|
+
events,
|
|
51
|
+
run_event_scope.scope_of(carry),
|
|
52
|
+
issue_number,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
carry_kind: carry.kind,
|
|
57
|
+
is_retrospective_done: run_carry.retrospective_done_of(carry),
|
|
58
|
+
last_event: last?.kind,
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function gather(issue_number: string): Promise<StepInput> {
|
|
63
|
+
const reads = await run_prep_cli.gather(issue_number)
|
|
64
|
+
const parts = run_prep_cli.to_parts(issue_number, reads)
|
|
65
|
+
const run_reads = read_run(await run_carry.repository_directory(), issue_number)
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
issue_number,
|
|
69
|
+
state: parts.state?.state,
|
|
70
|
+
is_human_review: parts.state?.is_human_review ?? false,
|
|
71
|
+
latest_scope: parts.latest_scope,
|
|
72
|
+
last_event: run_reads.last_event,
|
|
73
|
+
carry_kind: run_reads.carry_kind,
|
|
74
|
+
is_retrospective_done: run_reads.is_retrospective_done,
|
|
75
|
+
is_lane_child: lane_child_marker.is_child_of(process.cwd()),
|
|
76
|
+
is_consumer: doctor_consumer.is_kit_consumer(find_package_directory(process.cwd())),
|
|
77
|
+
is_retrospective_enabled: hook_decision.is_switch_opt_in(RETROSPECTIVE_ENV_KEY),
|
|
78
|
+
has_changes: parts.has_changes,
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
83
|
+
const issue_number = run_prep_cli.parse_number(argv)
|
|
84
|
+
|
|
85
|
+
if (issue_number === undefined) {
|
|
86
|
+
console.error(USAGE)
|
|
87
|
+
|
|
88
|
+
return FAILURE_EXIT_CODE
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const input = await gather(issue_number)
|
|
92
|
+
|
|
93
|
+
console.info(run_step.next_action(input).line)
|
|
94
|
+
|
|
95
|
+
// A state that could not be read exits non-zero, exactly as `run:prep` and `run:next` exit on the
|
|
96
|
+
// same failure, so a position missing its issue state is never read as a confident next step.
|
|
97
|
+
return input.state === undefined ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
101
|
+
// Load `.env` on the real command path only, so `JOSH_RETROSPECTIVE` set there reaches `gather`; the
|
|
102
|
+
// unit tests call `run`/`gather` directly and are never swayed by a developer's `.env`.
|
|
103
|
+
hook_decision.load_environment_file()
|
|
104
|
+
process.exitCode = await run(argv)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const run_step_cli = { USAGE, gather, main, run }
|
|
108
|
+
|
|
109
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
110
|
+
|
|
111
|
+
export { run_step_cli }
|