@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,78 @@
|
|
|
1
|
+
import { has_stderr_field } from './git-gh-exec'
|
|
2
|
+
|
|
3
|
+
function get_error_message(error: unknown): string {
|
|
4
|
+
return error instanceof Error ? error.message : String(error)
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
function get_stderr_from_error(cause: Error): string | undefined {
|
|
8
|
+
if (!has_stderr_field(cause)) return undefined
|
|
9
|
+
|
|
10
|
+
const stderr = cause.stderr.trim()
|
|
11
|
+
|
|
12
|
+
return stderr.length > 0 ? stderr : undefined
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function get_error_message_from_cause(cause: Error): string | undefined {
|
|
16
|
+
const message = cause.message.trim()
|
|
17
|
+
|
|
18
|
+
if (message.length > 0) {
|
|
19
|
+
return message
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return get_stderr_from_error(cause)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function get_cause_message(cause: unknown): string | undefined {
|
|
26
|
+
if (cause instanceof Error) {
|
|
27
|
+
return get_error_message_from_cause(cause)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (typeof cause === 'string') {
|
|
31
|
+
return cause.trim()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return undefined
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function display_error_details(cause: unknown): void {
|
|
38
|
+
const cause_message = get_cause_message(cause)
|
|
39
|
+
|
|
40
|
+
if (cause_message === undefined || cause_message.length === 0) {
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
console.error('')
|
|
45
|
+
console.error('💡 Details:', cause_message)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function handle(error: unknown): void {
|
|
49
|
+
const error_message = get_error_message(error)
|
|
50
|
+
|
|
51
|
+
console.error('')
|
|
52
|
+
console.error('❌ Error:', error_message)
|
|
53
|
+
|
|
54
|
+
if (error instanceof Error && error.cause !== undefined) {
|
|
55
|
+
display_error_details(error.cause)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
console.error('')
|
|
59
|
+
process.exit(1)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function display_branch_mismatch_error(current_branch: string, target_branch_name: string): void {
|
|
63
|
+
console.error('')
|
|
64
|
+
console.error('❌ Branch mismatch detected')
|
|
65
|
+
console.error('')
|
|
66
|
+
console.error(`Current branch: ${current_branch}`)
|
|
67
|
+
console.error(`Expected branch: ${target_branch_name}`)
|
|
68
|
+
console.error('')
|
|
69
|
+
console.error('💡 Please update main branch to the latest and try again.')
|
|
70
|
+
process.exit(1)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const git_error = {
|
|
74
|
+
handle,
|
|
75
|
+
display_branch_mismatch_error,
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { git_error }
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Extract the exit code from a thrown execa error. Returns the numeric exit code,
|
|
2
|
+
// or undefined when the process was terminated by a signal or failed to spawn.
|
|
3
|
+
function get_exit_code(error: unknown): number | undefined {
|
|
4
|
+
if (typeof error !== 'object' || error === null) return undefined
|
|
5
|
+
if (!('exitCode' in error)) return undefined
|
|
6
|
+
|
|
7
|
+
const { exitCode: exit_code } = error
|
|
8
|
+
|
|
9
|
+
return typeof exit_code === 'number' ? exit_code : undefined
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// Whether execa killed this spawn on its own budget, which is the only reliable way to tell a
|
|
13
|
+
// timeout from any other non-zero exit — a killed process writes nothing of its own, so a hang that
|
|
14
|
+
// had printed one line first would otherwise be reported as whatever that line happened to say.
|
|
15
|
+
//
|
|
16
|
+
// It lives here rather than beside either caller because both `gh` and `git push` now pass a
|
|
17
|
+
// timeout, and a second copy of the same three lines is the duplication `CLAUDE.md` prohibits
|
|
18
|
+
// (joshuafolkken/kit#1251).
|
|
19
|
+
function has_timed_out(error: unknown): boolean {
|
|
20
|
+
if (typeof error !== 'object' || error === null || !('timedOut' in error)) return false
|
|
21
|
+
|
|
22
|
+
return error.timedOut === true
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// The error a spawned git command fails with. The exit code is carried on `cause` as well as in the
|
|
26
|
+
// message, because callers branch on it rather than parse it: `git_command.push` reads 128 there to
|
|
27
|
+
// decide whether to retry with `--set-upstream`.
|
|
28
|
+
function create_spawn_error(command: string, exit_code: number | undefined): Error {
|
|
29
|
+
const exit_code_string = exit_code === undefined ? 'unknown' : String(exit_code)
|
|
30
|
+
const error_message = `git ${command} exited with code ${exit_code_string}`
|
|
31
|
+
|
|
32
|
+
return new Error(error_message, { cause: { exit_code: exit_code_string } })
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { create_spawn_error, get_exit_code, has_timed_out }
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { mkdtempSync } from 'node:fs'
|
|
2
|
+
import { rm } from 'node:fs/promises'
|
|
3
|
+
import { tmpdir } from 'node:os'
|
|
4
|
+
import path from 'node:path'
|
|
5
|
+
import { execa } from 'execa'
|
|
6
|
+
import { git_location_environment } from './git-location-environment'
|
|
7
|
+
|
|
8
|
+
// The scaffolding a test needs to drive **real git** in a throwaway repository
|
|
9
|
+
// (joshuafolkken/kit#1533).
|
|
10
|
+
//
|
|
11
|
+
// Two suites need it — `lane-change-base.test.ts` builds a lane topology, `rename-changed-paths.test.ts`
|
|
12
|
+
// builds a branch that renames a file away — and neither can use a mocked git, because what each one
|
|
13
|
+
// asserts is a property of git itself rather than of an argument list this repository assembles.
|
|
14
|
+
//
|
|
15
|
+
// **It is one module rather than one copy per suite because this scaffolding has already had to be
|
|
16
|
+
// hardened once.** joshuafolkken/kit#1530 found these fixtures committing into the repository the
|
|
17
|
+
// suite was running in: under a git hook, `GIT_DIR` and `GIT_INDEX_FILE` beat `cwd` outright, and
|
|
18
|
+
// `git config user.email` wrote the fixture's identity into a `--local` config that every linked work
|
|
19
|
+
// tree shares. Both halves of that fix live below. A second copy would take the next such hardening
|
|
20
|
+
// in one place and silently keep the old behavior in the other — the clone `CLAUDE.md` prohibits.
|
|
21
|
+
|
|
22
|
+
// `restore_environment` is declared as "present, possibly undefined" rather than optional:
|
|
23
|
+
// `exactOptionalPropertyTypes` is on, so an optional property cannot be *assigned* `undefined`, and
|
|
24
|
+
// every suite here starts from a literal that has not opened a workspace yet.
|
|
25
|
+
interface FixtureWorkspace {
|
|
26
|
+
workspace: string
|
|
27
|
+
previous_cwd: string
|
|
28
|
+
restore_environment: (() => void) | undefined
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const MAIN_BRANCH = '--initial-branch=main'
|
|
32
|
+
|
|
33
|
+
// The name commits are authored under, exported because a suite asserts it: proving the identity
|
|
34
|
+
// reached the commit is half of proving it was never written into a config file.
|
|
35
|
+
const AUTHOR_NAME = 'Kit Fixture'
|
|
36
|
+
|
|
37
|
+
// **The identity rides on `-c` rather than being written with `git config`** (joshuafolkken/kit#1530).
|
|
38
|
+
// A `--local` write outlives the test and is shared by every work tree of the repository it lands in;
|
|
39
|
+
// an option is scoped to the one command.
|
|
40
|
+
const IDENTITY_OPTIONS: ReadonlyArray<string> = [
|
|
41
|
+
'-c',
|
|
42
|
+
'user.email=fixture@example.test',
|
|
43
|
+
'-c',
|
|
44
|
+
`user.name=${AUTHOR_NAME}`,
|
|
45
|
+
'-c',
|
|
46
|
+
'commit.gpgsign=false',
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
// **The environment is cleared rather than inherited** (joshuafolkken/kit#1530). Run from a git hook,
|
|
50
|
+
// this process holds `GIT_DIR` and `GIT_INDEX_FILE` pointing at the repository being pushed, and both
|
|
51
|
+
// beat `cwd` — so every command here would act on that repository instead of on the fixture.
|
|
52
|
+
async function git(cwd: string, arguments_: ReadonlyArray<string>): Promise<string> {
|
|
53
|
+
const { stdout } = await execa('git', [...IDENTITY_OPTIONS, ...arguments_], {
|
|
54
|
+
cwd,
|
|
55
|
+
env: git_location_environment.location_free_environment(),
|
|
56
|
+
extendEnv: true,
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
return stdout.trimEnd()
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Cleared for this process too, not only for the children `git` spawns: a suite's assertions drive
|
|
63
|
+
// `git_command`, which spawns git with no environment of its own and so inherits this one.
|
|
64
|
+
function open_workspace(prefix: string): FixtureWorkspace {
|
|
65
|
+
return {
|
|
66
|
+
restore_environment: git_location_environment.clear_git_location_variables(),
|
|
67
|
+
previous_cwd: process.cwd(),
|
|
68
|
+
workspace: mkdtempSync(path.join(tmpdir(), prefix)),
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function close_workspace(fixture: FixtureWorkspace): Promise<void> {
|
|
73
|
+
process.chdir(fixture.previous_cwd)
|
|
74
|
+
fixture.restore_environment?.()
|
|
75
|
+
await rm(fixture.workspace, { force: true, recursive: true })
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const git_fixture_workspace = {
|
|
79
|
+
AUTHOR_NAME,
|
|
80
|
+
close_workspace,
|
|
81
|
+
git,
|
|
82
|
+
IDENTITY_OPTIONS,
|
|
83
|
+
MAIN_BRANCH,
|
|
84
|
+
open_workspace,
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export type { FixtureWorkspace }
|
|
88
|
+
export { git_fixture_workspace }
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { git_gh_helpers } from './git-gh-helpers'
|
|
2
|
+
|
|
3
|
+
// joshuafolkken/kit#1539: everything a run does after its merge is cleanup, and a merge cannot be
|
|
4
|
+
// taken back. Those steps used to be plain sequential statements, so whichever of them threw first
|
|
5
|
+
// discarded every one after it — and the working-tree hold release is the last of them. Three runs
|
|
6
|
+
// (joshuafolkken/kit#1197, #1537, #1319) ended that way: merged, the issue closed, and the hold left
|
|
7
|
+
// behind for the next run to trip over.
|
|
8
|
+
//
|
|
9
|
+
// **A step is run on its own, and its failure never reaches the next one.** The whole point is that
|
|
10
|
+
// the steps are independent: the completion comment has nothing to do with the hold release, and
|
|
11
|
+
// letting one decide the other is wrong whatever made it fail — this Issue's own defect, a Telegram
|
|
12
|
+
// rate limit, or a Bad Gateway from GitHub.
|
|
13
|
+
//
|
|
14
|
+
// **Reported, never swallowed.** A cleanup that failed invisibly is a run that lies about what it
|
|
15
|
+
// did, so the failure is printed where the run is being watched, with the command that finishes the
|
|
16
|
+
// step by hand.
|
|
17
|
+
// `recovery` carries a command that genuinely finishes the step, and is **`undefined` where no such
|
|
18
|
+
// command exists** — the epic auto-close and the run report have no CLI entry point of their own, and
|
|
19
|
+
// naming a command that only *reports* would send the reader somewhere that cannot fix anything. It
|
|
20
|
+
// is stated rather than omitted so that every step answers the question one way or the other.
|
|
21
|
+
interface CleanupStep {
|
|
22
|
+
label: string
|
|
23
|
+
recovery: string | undefined
|
|
24
|
+
run: () => Promise<void>
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function report_failure(step: CleanupStep, error: unknown): void {
|
|
28
|
+
console.warn('')
|
|
29
|
+
console.warn(
|
|
30
|
+
`⚠️ ${step.label} failed after the merge: ${git_gh_helpers.get_error_message_with_stderr(error)}`,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
if (step.recovery !== undefined) console.warn(` Recovery: ${step.recovery}`)
|
|
34
|
+
console.warn('')
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Answers whether the step completed, so a caller can report what is left rather than having to
|
|
38
|
+
// catch anything itself.
|
|
39
|
+
async function run_step(step: CleanupStep): Promise<boolean> {
|
|
40
|
+
try {
|
|
41
|
+
await step.run()
|
|
42
|
+
|
|
43
|
+
return true
|
|
44
|
+
} catch (error) {
|
|
45
|
+
report_failure(step, error)
|
|
46
|
+
|
|
47
|
+
return false
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// **The guard is what a merge earned, and nothing else.** Before the merge nothing irreversible has
|
|
52
|
+
// happened and re-running `pnpm josh followup` is the whole recovery, so a failure there still ends
|
|
53
|
+
// the run — swallowing it would hide a real failure behind a report saying the merge had landed. One
|
|
54
|
+
// definition, so the two callers of this module cannot disagree about when a step is guarded.
|
|
55
|
+
async function run_guarded_step(is_guarded: boolean, step: CleanupStep): Promise<boolean> {
|
|
56
|
+
if (!is_guarded) {
|
|
57
|
+
await step.run()
|
|
58
|
+
|
|
59
|
+
return true
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return await run_step(step)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Every step runs, in order, however many of them fail. The answer is whether all of them completed.
|
|
66
|
+
async function run_guarded_steps(
|
|
67
|
+
is_guarded: boolean,
|
|
68
|
+
steps: ReadonlyArray<CleanupStep>,
|
|
69
|
+
): Promise<boolean> {
|
|
70
|
+
let is_complete = true
|
|
71
|
+
|
|
72
|
+
for (const step of steps) {
|
|
73
|
+
const is_done = await run_guarded_step(is_guarded, step)
|
|
74
|
+
|
|
75
|
+
if (!is_done) is_complete = false
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return is_complete
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const git_followup_cleanup = {
|
|
82
|
+
run_step,
|
|
83
|
+
run_guarded_step,
|
|
84
|
+
run_guarded_steps,
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export { git_followup_cleanup }
|
|
88
|
+
export type { CleanupStep }
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { observation_ledger } from '#scripts/observations/observation-ledger'
|
|
2
|
+
import { observation_ledger_home } from '#scripts/observations/observation-ledger-home'
|
|
3
|
+
import { observations_flush } from '#scripts/observations/observations-flush'
|
|
4
|
+
import { git_command } from './git-command'
|
|
5
|
+
import { git_followup_cleanup } from './git-followup-cleanup'
|
|
6
|
+
import { main_sync } from './main-sync'
|
|
7
|
+
|
|
8
|
+
// The observation ledger's only commit path is `pnpm josh observations:flush`, and until now no
|
|
9
|
+
// command's procedure called it (joshuafolkken/kit#1810). The ledger is excluded from ordinary
|
|
10
|
+
// staging (joshuafolkken/kit#1756), so an appended line stayed in the working tree until a person
|
|
11
|
+
// remembered to flush it — the same "a run that had to remember is the run that forgets" defect the
|
|
12
|
+
// staging side was built to avoid, left standing on the commit side. This wires the flush into
|
|
13
|
+
// `pnpm josh followup`, the one step that knows the merge has landed.
|
|
14
|
+
//
|
|
15
|
+
// **It runs before the working-tree hold is released** (`scripts-ai/git-followup-finish.ts`, whose
|
|
16
|
+
// `finish()` runs after `git_pr_followup.run()` returns), because a flush switches branches, and a
|
|
17
|
+
// hold released first would let another run grab the tree mid-switch.
|
|
18
|
+
|
|
19
|
+
const MAIN_SYNC_SUCCESS = 0
|
|
20
|
+
const FLUSH_RECOVERY = 'pnpm josh observations:flush'
|
|
21
|
+
const SYNC_FAILURE_MESSAGE =
|
|
22
|
+
'Could not return to the default branch to flush the observation ledger; `pnpm josh ms` printed the reason above.'
|
|
23
|
+
|
|
24
|
+
// `observations_flush.flush` requires the default branch, so the checkout is returned to it first.
|
|
25
|
+
// `main_sync.run` catches its own errors and answers with an exit code rather than throwing, so a
|
|
26
|
+
// checkout it could not move is turned into the throw the guarded step below reports.
|
|
27
|
+
async function sync_and_flush(): Promise<void> {
|
|
28
|
+
if ((await main_sync.run([])) !== MAIN_SYNC_SUCCESS) throw new Error(SYNC_FAILURE_MESSAGE)
|
|
29
|
+
|
|
30
|
+
console.info(await observations_flush.flush(new Date()))
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// **Short-circuits when the ledger holds no pending append.** That is every run that recorded no
|
|
34
|
+
// observation, so the ordinary run pays nothing. Guarded like its sibling tail steps (joshuafolkken/kit#1539): past the merge a flush
|
|
35
|
+
// failure is reported, never allowed to take the merge, the epic close and the hold release with it.
|
|
36
|
+
//
|
|
37
|
+
// **A lane skips it outright** (joshuafolkken/kit#2419). Its ledger is the primary checkout's
|
|
38
|
+
// (`observation-ledger-home.ts`), which this step cannot flush — `main_sync` refuses in a linked work
|
|
39
|
+
// tree — so the line waits in the primary checkout and the `backlogrun` commits every lane's lines at
|
|
40
|
+
// once through `pnpm josh run:carry --end` (joshuafolkken/kit#2492).
|
|
41
|
+
async function flush_ledger_step(should_merge: boolean): Promise<void> {
|
|
42
|
+
if (
|
|
43
|
+
!should_merge ||
|
|
44
|
+
observation_ledger_home.is_lane() ||
|
|
45
|
+
!observation_ledger.has_pending_append(await git_command.status())
|
|
46
|
+
) {
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// `should_merge` is always true past the early return; it is passed on as `run_guarded_step`'s
|
|
51
|
+
// guard flag rather than a literal `true` so this step stays identical to its sibling tail steps —
|
|
52
|
+
// hardcoding `true` would turn the guard on for a `--no-merge` run if the early return were ever
|
|
53
|
+
// dropped (the trap `in_progress_step` warns of).
|
|
54
|
+
await git_followup_cleanup.run_guarded_step(should_merge, {
|
|
55
|
+
label: 'The observation ledger flush',
|
|
56
|
+
recovery: FLUSH_RECOVERY,
|
|
57
|
+
run: sync_and_flush,
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const git_followup_flush = { flush_ledger_step }
|
|
62
|
+
|
|
63
|
+
export { git_followup_flush }
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { git_gh_command } from './git-gh-command'
|
|
3
|
+
import { IN_PROGRESS_LABEL, label_name_of } from './issue-labels'
|
|
4
|
+
import { parse_json_object_safe } from './parse-json-array'
|
|
5
|
+
import { issue_label_schema } from './schemas'
|
|
6
|
+
|
|
7
|
+
// **`in-progress` means "a run is holding this issue right now", and a merged run is not holding
|
|
8
|
+
// anything** (joshuafolkken/kit#1794). `pnpm josh followup` merged the pull request and closed the
|
|
9
|
+
// issue and left the label on it, so the mark stopped meaning what it says: the ledger entry
|
|
10
|
+
// `k:followup-leaves-in-progress-label` recorded it on 2026-09-11 and a second sighting the same day
|
|
11
|
+
// — both issues of one `queue` answering `labels: in-progress` after they had closed.
|
|
12
|
+
//
|
|
13
|
+
// **Nothing is broken today, and that is the whole of the argument for fixing it.** `epic:next`,
|
|
14
|
+
// `epic:busy`, `run:progress` and the `auto-ok` pickup each filter to open issues, so a closed issue
|
|
15
|
+
// carrying the label is invisible to all of them — until one of them loses that open filter, at
|
|
16
|
+
// which point the label is already on every issue the repository has ever run.
|
|
17
|
+
//
|
|
18
|
+
// `queue.md` does tell whoever finds one to take it off, but that is the **failed child**'s route.
|
|
19
|
+
// No procedure covered the ordinary ending: merged, closed, and still marked as running.
|
|
20
|
+
|
|
21
|
+
// The `number,labels,body` read answers labels as objects, and this is the one field of it this
|
|
22
|
+
// step needs. The element shape is `schemas.ts`'s rather than a second spelling of it; the wrapper
|
|
23
|
+
// is local because a read's *field list* is what multiplies helpers when it is shared
|
|
24
|
+
// (`git-gh-issue-read.ts`).
|
|
25
|
+
const labels_read_schema = z.object({ labels: z.array(issue_label_schema).optional() })
|
|
26
|
+
|
|
27
|
+
// **Read, then removed — never removed on a guess.** The removal names the label in the request
|
|
28
|
+
// path, so it has to name the spelling GitHub stored: GitHub keeps the casing a label was created
|
|
29
|
+
// with and treats `In-Progress` as the same label, and a repository spelling it that way is exactly
|
|
30
|
+
// the one joshuafolkken/kit#1132 was filed about. The comparison is `label_name_of`'s, the same one
|
|
31
|
+
// every other membership test in this codebase goes through.
|
|
32
|
+
function unreadable_error(issue_number: string): Error {
|
|
33
|
+
return new Error(`gh api answered no readable labels for issue #${issue_number}`)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function read_label_names(issue_number: string): Promise<ReadonlyArray<string>> {
|
|
37
|
+
const raw = await git_gh_command.issue_get_labels_and_body(issue_number)
|
|
38
|
+
if (raw === undefined) throw unreadable_error(issue_number)
|
|
39
|
+
|
|
40
|
+
const parsed = parse_json_object_safe(raw, labels_read_schema)
|
|
41
|
+
if (parsed === undefined) throw unreadable_error(issue_number)
|
|
42
|
+
|
|
43
|
+
return (parsed.labels ?? []).map((label) => label.name)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// **An issue that does not carry it is never written to**, which is what keeps the step silent on a
|
|
47
|
+
// run whose issue was never labelled — a `404` swallowed into a warning would report a failure where
|
|
48
|
+
// there was nothing to do. The read itself is always paid: one `number,labels,body` call per merged
|
|
49
|
+
// run, which is the read `git-epic-read.ts` already makes rather than a field list of its own.
|
|
50
|
+
//
|
|
51
|
+
// A run whose pull request named no issue has nothing to strip, so it returns rather than throwing:
|
|
52
|
+
// the number is recovered from the `closes #N` keyword, and its absence is already reported where
|
|
53
|
+
// the completion report is.
|
|
54
|
+
async function strip_in_progress(issue_number: string | undefined): Promise<void> {
|
|
55
|
+
if (issue_number === undefined) return
|
|
56
|
+
|
|
57
|
+
const stored = label_name_of(await read_label_names(issue_number), IN_PROGRESS_LABEL)
|
|
58
|
+
if (stored === undefined) return
|
|
59
|
+
|
|
60
|
+
await git_gh_command.issue_remove_label(issue_number, stored)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const git_followup_label = {
|
|
64
|
+
strip_in_progress,
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export { git_followup_label }
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { release_history, type HistoryReader } from '#scripts/release/release-history'
|
|
2
|
+
import { release_plan } from '#scripts/release/release-plan'
|
|
3
|
+
import { version_targets } from '#scripts/version/version-targets'
|
|
4
|
+
import { git_command } from './git-command'
|
|
5
|
+
|
|
6
|
+
// What the completion notification says about versions, now that children do not set one
|
|
7
|
+
// (joshuafolkken/kit#1486).
|
|
8
|
+
//
|
|
9
|
+
// **It used to read `package.json` and print `📦 project version: <v>`.** While every child ran
|
|
10
|
+
// `pnpm josh bump minor` that value was this run's shipping version. Children no longer bump — the
|
|
11
|
+
// version is decided from main's history by `pnpm josh release` — so the same read now returns the
|
|
12
|
+
// **previous** release, and printing it presents an unconfirmed shipping version as a fact.
|
|
13
|
+
//
|
|
14
|
+
// **What goes out instead is the number a release is made of**: how many merges main has taken since
|
|
15
|
+
// the version last changed. It is the count `pnpm josh release` itself acts on, taken from that
|
|
16
|
+
// command's own modules rather than re-derived here, and it doubles as the visible signal that a
|
|
17
|
+
// release is owed — a count that keeps climbing is a release nobody has run.
|
|
18
|
+
|
|
19
|
+
// **The Telegram is sent before the merge**, deliberately: `git-pr-followup.ts` cuts its wrap-up
|
|
20
|
+
// there because that is the last point at which the run can still fail safely. So the count taken
|
|
21
|
+
// there cannot include this run's own merge, and a bare number would be understated by exactly one.
|
|
22
|
+
// Saying so is the honest form of the same measurement. The console line printed after the merge
|
|
23
|
+
// passes `false` and carries no note, because by then the merge is on the remote and the fetch below
|
|
24
|
+
// brings it in; `scripts-ai/git-followup-finish.ts` is that caller, so **both branches of this flag
|
|
25
|
+
// are live**. What a run *does* about the count is `pnpm josh release:scope`, asked after the merge,
|
|
26
|
+
// which reads `read_pending` below rather than this line (joshuafolkken/kit#1582).
|
|
27
|
+
const MERGE_PENDING_NOTE = "— this run's merge is not counted; it lands next"
|
|
28
|
+
|
|
29
|
+
interface PendingReadOptions {
|
|
30
|
+
cwd?: string
|
|
31
|
+
reader?: HistoryReader
|
|
32
|
+
// Only a test passes this. Production always resolves the tip itself, so no caller can quietly
|
|
33
|
+
// point the count at a ref that is not main's.
|
|
34
|
+
tip?: string
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// **The note belongs to the line, not to the count** (joshuafolkken/kit#1582). `read_pending`
|
|
38
|
+
// returns a number and has no sentence to annotate, so `pnpm josh release:scope` — which wants the
|
|
39
|
+
// number alone — would otherwise have to pass a flag about wording it never prints.
|
|
40
|
+
interface PendingLineOptions extends PendingReadOptions {
|
|
41
|
+
is_merge_pending: boolean
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// **The count is read from the fetched default branch, never from `HEAD`.** `followup` runs on the
|
|
45
|
+
// feature branch, and `--first-parent` from a branch tip walks that branch rather than main — every
|
|
46
|
+
// merge main took after the branch was cut is not even an ancestor, so the number would be silently
|
|
47
|
+
// low and the line still say "on main". Fetching first is what makes it current, which is also what
|
|
48
|
+
// lets the post-merge console line — and `pnpm josh release:scope`, asked from a lane or a feature
|
|
49
|
+
// branch — count the merge that just landed (joshuafolkken/kit#1582).
|
|
50
|
+
async function read_tip(options: PendingReadOptions): Promise<string> {
|
|
51
|
+
if (options.tip !== undefined) return options.tip
|
|
52
|
+
|
|
53
|
+
const default_branch = await git_command.get_default_branch()
|
|
54
|
+
|
|
55
|
+
await git_command.fetch_branch(default_branch)
|
|
56
|
+
|
|
57
|
+
return `origin/${default_branch}`
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// **Undefined rather than a line reading zero.** A version that cannot be read, a fetch that could
|
|
61
|
+
// not run, or a history whose base the search cannot resolve is not "nothing is waiting to ship" —
|
|
62
|
+
// and a notification that said so would be the same class of false statement this module exists to
|
|
63
|
+
// remove.
|
|
64
|
+
// The manifest read is **inside** the `try` with the rest. `readFileSync` can throw after
|
|
65
|
+
// `existsSync` passed — EACCES, EISDIR, a racing write — and this function is called from
|
|
66
|
+
// `notify_completion`, which runs *before* `pr_merge`: an escaping rejection there would abort the
|
|
67
|
+
// run and lose a merge over a cosmetic line.
|
|
68
|
+
async function read_pending(options: PendingReadOptions): Promise<number | undefined> {
|
|
69
|
+
try {
|
|
70
|
+
const current_version = version_targets.read_workspace_version(options.cwd ?? process.cwd())
|
|
71
|
+
|
|
72
|
+
if (current_version === undefined) return undefined
|
|
73
|
+
|
|
74
|
+
const tip = await read_tip(options)
|
|
75
|
+
const plan = await release_history.read_release_plan(current_version, options.reader, tip)
|
|
76
|
+
|
|
77
|
+
return plan?.pending
|
|
78
|
+
} catch {
|
|
79
|
+
return undefined
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function pending_release_line(options: PendingLineOptions): Promise<string | undefined> {
|
|
84
|
+
const pending = await read_pending(options)
|
|
85
|
+
|
|
86
|
+
if (pending === undefined) return undefined
|
|
87
|
+
|
|
88
|
+
const line = release_plan.format_pending_line(pending)
|
|
89
|
+
|
|
90
|
+
return options.is_merge_pending ? `${line} ${MERGE_PENDING_NOTE}` : line
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const git_followup_pending = { MERGE_PENDING_NOTE, pending_release_line, read_pending }
|
|
94
|
+
|
|
95
|
+
export { git_followup_pending }
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { time_format } from '#scripts/time-runtime/time-format'
|
|
2
|
+
|
|
3
|
+
// Where `pnpm josh followup` spends its own wall clock (joshuafolkken/kit#1349).
|
|
4
|
+
//
|
|
5
|
+
// joshuafolkken/kit#1333 removed 19 seconds of dead air between reading a clean review and issuing
|
|
6
|
+
// the merge, and left the next stretch of the same 134 seconds unexamined: the **44 seconds
|
|
7
|
+
// `followup` spends on itself**. One invocation did nine things in order — the `closes #N`
|
|
8
|
+
// check, the three GitHub reads the notification needs, the required-check wait, the CodeRabbit line
|
|
9
|
+
// comments, the AI reviewers' top-level comments, the completion Telegram, the merge request, the
|
|
10
|
+
// completion comment and the epic auto-close — and not one of them had ever been timed. So every
|
|
11
|
+
// proposal to shorten it was a guess, and a guess made under time pressure falls on whichever stretch
|
|
12
|
+
// is easiest to cut rather than on the one that is long: the notification and the auto-close, which is
|
|
13
|
+
// exactly where the merge gate lives.
|
|
14
|
+
//
|
|
15
|
+
// **Those nine are seven printed rows now** (joshuafolkken/kit#1446): the four reads in front of the
|
|
16
|
+
// wait go out together and so do the two steps after the merge, and a lap measures an interval rather
|
|
17
|
+
// than a call. `STAGE` below is the list; the two names carrying `and` are the batches.
|
|
18
|
+
//
|
|
19
|
+
// **Laps, not a wrapper per stage.** The alternative was a `measure(name, () => …)` closure around
|
|
20
|
+
// each call, which reads well and rewrites every call site in the file it instruments — nine
|
|
21
|
+
// reformatted call sites in a file already at 260 of its 300 code lines. A lap records the interval
|
|
22
|
+
// since the previous mark, so instrumenting a stage is one line after it and the call itself is
|
|
23
|
+
// untouched. What it gives up is the stage still in flight when something throws, and
|
|
24
|
+
// `INTERRUPTED_STAGE` is how that is paid for rather than lost: the caller marks one final lap on the
|
|
25
|
+
// way out, so the failing stage's duration — the one a reader wants most — is still printed.
|
|
26
|
+
//
|
|
27
|
+
// **The printed line is the interface, and its prefix is single-sourced for the reason
|
|
28
|
+
// `status-icons.ts` single-sources its icon.** `josh time` reads what a josh command printed out of
|
|
29
|
+
// the transcript's tool result (`time-reported-failure.ts`), which is the only way anything can see
|
|
30
|
+
// inside a single Bash span — and a reader matching a string the printer is free to reword is a reader
|
|
31
|
+
// that goes quiet without failing. So the prefix is declared here and the printer builds its lines
|
|
32
|
+
// from it, which is what lets a reader be added later without matching a reworded string. **No reader
|
|
33
|
+
// exists yet** — `josh time` reports a `followup` span as a whole — and saying so is the point: the
|
|
34
|
+
// constant is preparation, not an integration.
|
|
35
|
+
//
|
|
36
|
+
// **Seconds come from `time_format`** rather than from a private formatter. `verification-gate.ts`
|
|
37
|
+
// already has one of its own (`48.2s`), and a third spelling of "how long did this take" in a
|
|
38
|
+
// repository whose own report reads these lines is the clone `CLAUDE.md` prohibits.
|
|
39
|
+
|
|
40
|
+
const STAGE_LINE_PREFIX = 'followup stage: '
|
|
41
|
+
const STAGE_TOTAL_PREFIX = 'followup stages total: '
|
|
42
|
+
// One wider than the longest name below, so the durations line up in one column without the reader
|
|
43
|
+
// having to count. **The extra one is load-bearing**: `padEnd` adds nothing once a name reaches the
|
|
44
|
+
// width, and `completion-and-epic-close` is 25 characters, so at 25 that row alone would run its
|
|
45
|
+
// duration straight onto its name (joshuafolkken/kit#1446). Parsing is unaffected either way — the
|
|
46
|
+
// fields are whitespace-separated.
|
|
47
|
+
const STAGE_NAME_WIDTH = 26
|
|
48
|
+
// Where the duration column starts, so the total lands under the stage durations rather than beside
|
|
49
|
+
// the label. Derived from the two constants above instead of written out, which is what keeps the
|
|
50
|
+
// block aligned when a longer stage name widens it.
|
|
51
|
+
const VALUE_COLUMN = STAGE_LINE_PREFIX.length + STAGE_NAME_WIDTH
|
|
52
|
+
const NO_DURATION = 0
|
|
53
|
+
|
|
54
|
+
// The stages, named once. They are the units a proposal to shorten `followup` would be written
|
|
55
|
+
// against, so a rename has to move the printer and whatever reads it together.
|
|
56
|
+
//
|
|
57
|
+
// **Two names say `and` because two stages became one** (joshuafolkken/kit#1446). Requests that need
|
|
58
|
+
// nothing from one another are now issued together, and a lap records an interval rather than a
|
|
59
|
+
// call — so a batch is one interval, and what it holds has to be readable from its name or the
|
|
60
|
+
// shortening becomes invisible to the very measurement that found it. `closes-and-context` is the
|
|
61
|
+
// former `closes-check` and `context`; `completion-and-epic-close` the former `completion-comment`
|
|
62
|
+
// and `epic-close`. **`checks-wait` is untouched, and deliberately so**: it is the merge gate, and
|
|
63
|
+
// this change only ever moved time that was not a wait.
|
|
64
|
+
const STAGE = {
|
|
65
|
+
closes_and_context: 'closes-and-context',
|
|
66
|
+
checks_wait: 'checks-wait',
|
|
67
|
+
coderabbit_comments: 'coderabbit-comments',
|
|
68
|
+
ai_review_comments: 'ai-review-comments',
|
|
69
|
+
telegram: 'telegram',
|
|
70
|
+
merge: 'merge',
|
|
71
|
+
completion_and_epic_close: 'completion-and-epic-close',
|
|
72
|
+
// The lap that was still running when a stage threw. `followup` exits non-zero on an AI-review
|
|
73
|
+
// blocker and on a red check, and those are the runs whose wait is longest — reporting nothing for
|
|
74
|
+
// them would leave the measurement blind to exactly the invocations worth measuring.
|
|
75
|
+
interrupted: 'interrupted',
|
|
76
|
+
} as const
|
|
77
|
+
|
|
78
|
+
interface FollowupStage {
|
|
79
|
+
name: string
|
|
80
|
+
duration_ms: number
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Mutable on purpose: the laps are recorded as the run passes them, and a log that returned a new
|
|
84
|
+
// value per lap would have every call site thread it back out.
|
|
85
|
+
//
|
|
86
|
+
// `last_ms` is `performance.now()`'s clock rather than `Date.now()`'s, for the reason
|
|
87
|
+
// `buffered-process.ts` states: it is monotonic, so a system clock adjusted mid-wait cannot produce a
|
|
88
|
+
// negative lap.
|
|
89
|
+
interface StageLog {
|
|
90
|
+
stages: Array<FollowupStage>
|
|
91
|
+
last_ms: number
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function new_log(): StageLog {
|
|
95
|
+
return { stages: [], last_ms: performance.now() }
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function lap(log: StageLog, name: string): void {
|
|
99
|
+
const now_ms = performance.now()
|
|
100
|
+
|
|
101
|
+
log.stages.push({ name, duration_ms: now_ms - log.last_ms })
|
|
102
|
+
log.last_ms = now_ms
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function total_ms(stages: ReadonlyArray<FollowupStage>): number {
|
|
106
|
+
return stages.reduce((sum, stage) => sum + stage.duration_ms, NO_DURATION)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function format_stage(stage: FollowupStage): string {
|
|
110
|
+
const name = stage.name.padEnd(STAGE_NAME_WIDTH)
|
|
111
|
+
|
|
112
|
+
return `${STAGE_LINE_PREFIX}${name}${time_format.format_seconds(stage.duration_ms)}`
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// **An empty log prints nothing at all**, rather than a total of zero: a `0.0 s` block would read as a
|
|
116
|
+
// measurement of a command that took no time. `git_pr_followup.run` cannot reach it — its `catch`
|
|
117
|
+
// marks `interrupted` before the print, so its log always holds a lap — so this is the answer for any
|
|
118
|
+
// other caller, and it is exercised by the unit test rather than by the command.
|
|
119
|
+
//
|
|
120
|
+
// **Every row is in seconds, including a `checks-wait` that ran for minutes.** `josh time` renders its
|
|
121
|
+
// own tables in minutes, but its rows are whole phases of a run, while these are the stages of one
|
|
122
|
+
// command and are read against each other: one unit keeps the rows comparable at a glance and the
|
|
123
|
+
// block parseable by one rule.
|
|
124
|
+
function format_stages(log: StageLog): Array<string> {
|
|
125
|
+
if (log.stages.length === 0) return []
|
|
126
|
+
|
|
127
|
+
const rows = log.stages.map((stage) => format_stage(stage))
|
|
128
|
+
const total = time_format.format_seconds(total_ms(log.stages))
|
|
129
|
+
|
|
130
|
+
return ['', ...rows, `${STAGE_TOTAL_PREFIX.padEnd(VALUE_COLUMN)}${total}`]
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function print_stages(log: StageLog): void {
|
|
134
|
+
for (const line of format_stages(log)) console.info(line)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const git_followup_stages = {
|
|
138
|
+
STAGE,
|
|
139
|
+
STAGE_LINE_PREFIX,
|
|
140
|
+
STAGE_TOTAL_PREFIX,
|
|
141
|
+
new_log,
|
|
142
|
+
lap,
|
|
143
|
+
total_ms,
|
|
144
|
+
format_stages,
|
|
145
|
+
print_stages,
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export type { FollowupStage, StageLog }
|
|
149
|
+
export { git_followup_stages }
|