@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,149 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { fileURLToPath } from 'node:url'
|
|
5
|
+
import { git_command } from '#scripts/git/git-command'
|
|
6
|
+
import { managed_config_scope } from '#scripts/sync/managed-config-scope'
|
|
7
|
+
import { z } from 'zod'
|
|
8
|
+
import {
|
|
9
|
+
sonar_hotspots,
|
|
10
|
+
type ClassifiedHotspot,
|
|
11
|
+
type HotspotDisposition,
|
|
12
|
+
type HotspotFetch,
|
|
13
|
+
} from './sonar-hotspots'
|
|
14
|
+
|
|
15
|
+
// `josh sonar:hotspots <PR>` — fetch the SonarCloud hotspots on a pull request and print the Step B
|
|
16
|
+
// disposition of each (joshuafolkken/kit#2182).
|
|
17
|
+
//
|
|
18
|
+
// The decision itself lives in `sonar-hotspots.ts`; this file is the I/O around it: read the project
|
|
19
|
+
// key from `sonar-project.properties`, fetch the public search API, and answer the upstream-synced
|
|
20
|
+
// axis with `sync:scope`'s own detection — `managed_config_scope.has_managed_path`, so no
|
|
21
|
+
// distribution path list is copied here. A read that fails is printed as `unreadable`, told apart
|
|
22
|
+
// from a success that found no hotspots.
|
|
23
|
+
|
|
24
|
+
const ARGV_OFFSET = 2
|
|
25
|
+
const USAGE = 'Usage: josh sonar:hotspots <PR>'
|
|
26
|
+
const SONAR_HOST = 'https://sonarcloud.io'
|
|
27
|
+
const HOTSPOTS_PATH = '/api/hotspots/search'
|
|
28
|
+
const PROPERTIES_FILE = 'sonar-project.properties'
|
|
29
|
+
const PROJECT_KEY_PREFIX = 'sonar.projectKey='
|
|
30
|
+
const FETCH_TIMEOUT_MS = 10_000
|
|
31
|
+
const FAILURE_EXIT_CODE = 1
|
|
32
|
+
const UNKNOWN_LINE = '?'
|
|
33
|
+
|
|
34
|
+
// `looseObject` so a field SonarCloud adds later does not fail the parse; only the fields the
|
|
35
|
+
// disposition reads are declared. `ruleKey` keeps the API's own spelling.
|
|
36
|
+
const hotspot_schema = z.looseObject({
|
|
37
|
+
key: z.string(),
|
|
38
|
+
status: z.string(),
|
|
39
|
+
component: z.string(),
|
|
40
|
+
line: z.number().optional(),
|
|
41
|
+
ruleKey: z.string(),
|
|
42
|
+
resolution: z.string().optional(),
|
|
43
|
+
})
|
|
44
|
+
const response_schema = z.looseObject({ hotspots: z.array(hotspot_schema).optional() })
|
|
45
|
+
|
|
46
|
+
function read_project_key(root: string): string | undefined {
|
|
47
|
+
const file = path.join(root, PROPERTIES_FILE)
|
|
48
|
+
if (!existsSync(file)) return undefined
|
|
49
|
+
|
|
50
|
+
const line = readFileSync(file, 'utf8')
|
|
51
|
+
.split('\n')
|
|
52
|
+
.find((entry) => entry.startsWith(PROJECT_KEY_PREFIX))
|
|
53
|
+
|
|
54
|
+
return line?.slice(PROJECT_KEY_PREFIX.length).trim()
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function hotspots_url(project_key: string, pull_request: string): string {
|
|
58
|
+
const query = new URLSearchParams({ projectKey: project_key, pullRequest: pull_request })
|
|
59
|
+
|
|
60
|
+
return `${SONAR_HOST}${HOTSPOTS_PATH}?${query.toString()}`
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function fetch_hotspots(url: string): Promise<HotspotFetch> {
|
|
64
|
+
try {
|
|
65
|
+
const response = await fetch(url, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) })
|
|
66
|
+
if (!response.ok) return { error: `HTTP ${String(response.status)}` }
|
|
67
|
+
|
|
68
|
+
const parsed = response_schema.parse(await response.json())
|
|
69
|
+
|
|
70
|
+
return { hotspots: parsed.hotspots ?? [] }
|
|
71
|
+
} catch (error) {
|
|
72
|
+
return { error: error instanceof Error ? error.message : String(error) }
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function is_managed(component: string): boolean {
|
|
77
|
+
return managed_config_scope.has_managed_path([sonar_hotspots.component_path(component)])
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function format_hotspot(entry: ClassifiedHotspot): string {
|
|
81
|
+
const { hotspot, branch } = entry
|
|
82
|
+
const line = hotspot.line === undefined ? UNKNOWN_LINE : String(hotspot.line)
|
|
83
|
+
|
|
84
|
+
return `${hotspot.status}\t${hotspot.component}:${line}\t${hotspot.ruleKey}\t→ ${branch}`
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function print_disposition(disposition: HotspotDisposition): void {
|
|
88
|
+
if ('unreadable' in disposition) {
|
|
89
|
+
console.info(`${sonar_hotspots.UNREADABLE}: ${disposition.unreadable}`)
|
|
90
|
+
|
|
91
|
+
return
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (disposition.classified.length === 0) {
|
|
95
|
+
console.info('no hotspots on this pull request')
|
|
96
|
+
|
|
97
|
+
return
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
for (const entry of disposition.classified) console.info(format_hotspot(entry))
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async function fetch_and_print(project_key: string, pull_request: string): Promise<void> {
|
|
104
|
+
const fetched = await fetch_hotspots(hotspots_url(project_key, pull_request))
|
|
105
|
+
|
|
106
|
+
print_disposition(sonar_hotspots.classify_fetch(fetched, is_managed))
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
110
|
+
const [pull_request] = argv
|
|
111
|
+
|
|
112
|
+
if (pull_request === undefined || pull_request.startsWith('-')) {
|
|
113
|
+
console.error(USAGE)
|
|
114
|
+
|
|
115
|
+
return FAILURE_EXIT_CODE
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const project_key = read_project_key(await git_command.repository_root())
|
|
119
|
+
|
|
120
|
+
if (project_key === undefined) {
|
|
121
|
+
console.error(`no ${PROJECT_KEY_PREFIX} found in ${PROPERTIES_FILE}`)
|
|
122
|
+
|
|
123
|
+
return FAILURE_EXIT_CODE
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
await fetch_and_print(project_key, pull_request)
|
|
127
|
+
|
|
128
|
+
return 0
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
132
|
+
process.exitCode = await run(argv)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const sonar_hotspots_cli = {
|
|
136
|
+
fetch_hotspots,
|
|
137
|
+
format_hotspot,
|
|
138
|
+
hotspots_url,
|
|
139
|
+
is_managed,
|
|
140
|
+
main,
|
|
141
|
+
print_disposition,
|
|
142
|
+
read_project_key,
|
|
143
|
+
run,
|
|
144
|
+
USAGE,
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
148
|
+
|
|
149
|
+
export { sonar_hotspots_cli }
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// The Step B disposition for each SonarCloud hotspot on a pull request, computed rather than read by
|
|
2
|
+
// eye (joshuafolkken/kit#2182).
|
|
3
|
+
//
|
|
4
|
+
// `prompts/sonar-hotspot-handling.md` carried Step A and Step B as prose: the reader built the API
|
|
5
|
+
// URL by hand and then walked a decision table whose one mechanical branch key — "is this path
|
|
6
|
+
// upstream-synced?" — is already answered by `josh sync:scope`. This module is the conversion the
|
|
7
|
+
// table describes, so the only judgement left in prose is "is a TO_REVIEW hotspot really a false
|
|
8
|
+
// positive?".
|
|
9
|
+
//
|
|
10
|
+
// The upstream-synced axis is not re-derived here. The CLI passes an `is_managed` predicate built on
|
|
11
|
+
// `managed_config_scope.has_managed_path` — the same detection `josh sync:scope` runs — so no
|
|
12
|
+
// distribution path list is copied into this file.
|
|
13
|
+
|
|
14
|
+
// A hotspot needing review is a candidate suppression: on an upstream-synced path the suppression
|
|
15
|
+
// belongs in `sonar-project.properties` (`excluded`), on project-local code it is a local ignore
|
|
16
|
+
// (`local`). A hotspot SonarCloud has already reviewed carries its own resolution — a fixed one
|
|
17
|
+
// records a real issue (`fix`), any other resolved state is set aside (`defer`).
|
|
18
|
+
const EXCLUDED_BRANCH = 'excluded'
|
|
19
|
+
const LOCAL_BRANCH = 'local'
|
|
20
|
+
const FIX_BRANCH = 'fix'
|
|
21
|
+
const DEFER_BRANCH = 'defer'
|
|
22
|
+
|
|
23
|
+
// The fetch could not be read at all — rate-limited, offline, or a non-OK response. Named alongside
|
|
24
|
+
// the four branches so a caller cannot mistake a failed read for "no hotspots" (an empty success).
|
|
25
|
+
const UNREADABLE = 'unreadable'
|
|
26
|
+
|
|
27
|
+
const HOTSPOT_BRANCHES = [EXCLUDED_BRANCH, LOCAL_BRANCH, FIX_BRANCH, DEFER_BRANCH] as const
|
|
28
|
+
|
|
29
|
+
type HotspotBranch = (typeof HOTSPOT_BRANCHES)[number]
|
|
30
|
+
|
|
31
|
+
const TO_REVIEW_STATUS = 'TO_REVIEW'
|
|
32
|
+
const FIXED_RESOLUTION = 'FIXED'
|
|
33
|
+
|
|
34
|
+
// One hotspot as the public search API returns it. `component` is the SonarCloud component key
|
|
35
|
+
// (`<projectKey>:<path>`), not a bare path, so `component_path` strips the prefix before the managed
|
|
36
|
+
// check reads it.
|
|
37
|
+
// The optional fields carry `| undefined` explicitly: under `exactOptionalPropertyTypes` that is what
|
|
38
|
+
// lets the zod-parsed shape (`z.number().optional()` → `number | undefined`) assign to this type.
|
|
39
|
+
interface Hotspot {
|
|
40
|
+
key: string
|
|
41
|
+
status: string
|
|
42
|
+
component: string
|
|
43
|
+
line?: number | undefined
|
|
44
|
+
ruleKey: string
|
|
45
|
+
resolution?: string | undefined
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// The fetch outcome: the hotspots on success, or the reason the read failed. A discriminated union so
|
|
49
|
+
// the unreadable case is a value the caller handles, never an empty array it silently treats as clean.
|
|
50
|
+
type HotspotFetch = { hotspots: ReadonlyArray<Hotspot> } | { error: string }
|
|
51
|
+
|
|
52
|
+
interface ClassifiedHotspot {
|
|
53
|
+
hotspot: Hotspot
|
|
54
|
+
branch: HotspotBranch
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// The result of converting a whole fetch: one classified hotspot per entry, or the unreadable marker
|
|
58
|
+
// carrying the failure reason.
|
|
59
|
+
type HotspotDisposition = { classified: ReadonlyArray<ClassifiedHotspot> } | { unreadable: string }
|
|
60
|
+
|
|
61
|
+
// The repository-root-relative path a managed check reads. A SonarCloud component key is
|
|
62
|
+
// `<projectKey>:<path>`; a key with no colon (some API shapes) is already the path.
|
|
63
|
+
function component_path(component: string): string {
|
|
64
|
+
const separator_index = component.indexOf(':')
|
|
65
|
+
|
|
66
|
+
return separator_index === -1 ? component : component.slice(separator_index + 1)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function classify_hotspot(hotspot: Hotspot, is_managed: boolean): HotspotBranch {
|
|
70
|
+
if (hotspot.status === TO_REVIEW_STATUS) return is_managed ? EXCLUDED_BRANCH : LOCAL_BRANCH
|
|
71
|
+
|
|
72
|
+
return hotspot.resolution === FIXED_RESOLUTION ? FIX_BRANCH : DEFER_BRANCH
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function classify_one(
|
|
76
|
+
hotspot: Hotspot,
|
|
77
|
+
is_managed: (component: string) => boolean,
|
|
78
|
+
): ClassifiedHotspot {
|
|
79
|
+
return { hotspot, branch: classify_hotspot(hotspot, is_managed(hotspot.component)) }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// The conversion the whole command exists to perform: a fetch outcome becomes either a disposition
|
|
83
|
+
// per hotspot or the unreadable marker. `is_managed` answers the upstream-synced axis for a component
|
|
84
|
+
// key — the CLI builds it on `sync:scope`'s own detection.
|
|
85
|
+
function classify_fetch(
|
|
86
|
+
fetch: HotspotFetch,
|
|
87
|
+
is_managed: (component: string) => boolean,
|
|
88
|
+
): HotspotDisposition {
|
|
89
|
+
if ('error' in fetch) return { unreadable: fetch.error }
|
|
90
|
+
|
|
91
|
+
return { classified: fetch.hotspots.map((hotspot) => classify_one(hotspot, is_managed)) }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const sonar_hotspots = {
|
|
95
|
+
classify_fetch,
|
|
96
|
+
classify_hotspot,
|
|
97
|
+
component_path,
|
|
98
|
+
HOTSPOT_BRANCHES,
|
|
99
|
+
UNREADABLE,
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export {
|
|
103
|
+
sonar_hotspots,
|
|
104
|
+
EXCLUDED_BRANCH,
|
|
105
|
+
LOCAL_BRANCH,
|
|
106
|
+
FIX_BRANCH,
|
|
107
|
+
DEFER_BRANCH,
|
|
108
|
+
UNREADABLE,
|
|
109
|
+
HOTSPOT_BRANCHES,
|
|
110
|
+
}
|
|
111
|
+
export type { ClassifiedHotspot, Hotspot, HotspotBranch, HotspotDisposition, HotspotFetch }
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { git_command } from '#scripts/git/git-command'
|
|
4
|
+
import { path_decision } from '#scripts/josh/path-decision'
|
|
5
|
+
import { split_assess } from './split-assess'
|
|
6
|
+
|
|
7
|
+
// `josh split:assess` — measure a branch's change size, tests excluded, and answer the size question
|
|
8
|
+
// of the split assessment (joshuafolkken/kit#2218).
|
|
9
|
+
//
|
|
10
|
+
// A command rather than a paragraph for the reason every decision oracle is one: the "about 10 files /
|
|
11
|
+
// 400 lines" guide is a number, but the size behind it was estimated by eye, so no data ever
|
|
12
|
+
// accumulated to test the guide against. This counts the real diff after the fact, and answers
|
|
13
|
+
// `split` / `single` on size alone — separability stays a judgement, said so in the reason line.
|
|
14
|
+
// The question and the counting live in `split-assess.ts`; everything here is the invocation.
|
|
15
|
+
|
|
16
|
+
const ARGV_OFFSET = 2
|
|
17
|
+
const USAGE = 'Usage: josh split:assess [--json]'
|
|
18
|
+
const JSON_KEY = 'split'
|
|
19
|
+
const FAILURE_EXIT_CODE = 1
|
|
20
|
+
|
|
21
|
+
function parse_is_json(argv: ReadonlyArray<string>): boolean | undefined {
|
|
22
|
+
if (path_decision.has_unknown_flag(argv, [path_decision.JSON_FLAG])) return undefined
|
|
23
|
+
|
|
24
|
+
return argv.includes(path_decision.JSON_FLAG)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
28
|
+
const is_json = parse_is_json(argv)
|
|
29
|
+
|
|
30
|
+
if (is_json === undefined) {
|
|
31
|
+
console.error(USAGE)
|
|
32
|
+
|
|
33
|
+
return FAILURE_EXIT_CODE
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const measurement = split_assess.assess(await git_command.diff_main_numstat())
|
|
37
|
+
const reason = split_assess.reason(measurement)
|
|
38
|
+
|
|
39
|
+
path_decision.print_decision(JSON_KEY, measurement.verdict, reason, is_json)
|
|
40
|
+
|
|
41
|
+
return 0
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
45
|
+
process.exitCode = await run(argv)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const split_assess_cli = { JSON_KEY, USAGE, main, parse_is_json, run }
|
|
49
|
+
|
|
50
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
51
|
+
|
|
52
|
+
export { split_assess_cli }
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { test_declared_logic } from '#scripts/test/test-declared-logic'
|
|
2
|
+
|
|
3
|
+
// The size half of the split assessment, measured rather than estimated (joshuafolkken/kit#2218).
|
|
4
|
+
//
|
|
5
|
+
// `split-assessment.md` → "The question" asks two things, and only the second is mechanical: does the
|
|
6
|
+
// change **clearly exceed** what one verification gate confirms in one pass, the guide being about 10
|
|
7
|
+
// changed files and about 400 changed lines, test files excluded. The first — are there two or more
|
|
8
|
+
// separately-mergeable deliverables — stays a judgement, so this answers the size question alone and
|
|
9
|
+
// never claims to have decided the split.
|
|
10
|
+
//
|
|
11
|
+
// **The counting excludes test files, single-sourced from `test_declared_logic.is_test_file`.** The
|
|
12
|
+
// "test files excluded" clause in the guide and the `*.test.ts` / `*.e2e.ts` spelling are one fact;
|
|
13
|
+
// a second copy here would let the two drift.
|
|
14
|
+
|
|
15
|
+
type SplitVerdict = 'split' | 'single'
|
|
16
|
+
|
|
17
|
+
// One file's contribution to the change size: its path, and the lines it added plus the lines it
|
|
18
|
+
// removed. A binary file, which `git diff --numstat` prints as `-`, contributes zero changed lines.
|
|
19
|
+
interface FileChange {
|
|
20
|
+
path: string
|
|
21
|
+
changed_lines: number
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface SizeMeasurement {
|
|
25
|
+
files: number
|
|
26
|
+
lines: number
|
|
27
|
+
verdict: SplitVerdict
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// The guide from `split-assessment.md`. Strictly greater than: "about 10 changed files" and a change
|
|
31
|
+
// that "lands at 11 files is not thereby a split" put the bar above the round number, not at it.
|
|
32
|
+
const FILE_GUIDE = 10
|
|
33
|
+
const LINE_GUIDE = 400
|
|
34
|
+
|
|
35
|
+
const SPLIT_VERDICT: SplitVerdict = 'split'
|
|
36
|
+
const SINGLE_VERDICT: SplitVerdict = 'single'
|
|
37
|
+
|
|
38
|
+
const BINARY_MARKER = '-'
|
|
39
|
+
const NUMSTAT_FIELDS = 3
|
|
40
|
+
|
|
41
|
+
// A `-` count (binary file), or a missing field, reads as zero; anything else is coerced to a
|
|
42
|
+
// number, and an unparseable field also reads as zero rather than throwing on a row this was not
|
|
43
|
+
// meant to size.
|
|
44
|
+
function parse_count(field: string | undefined): number {
|
|
45
|
+
if (field === undefined || field === BINARY_MARKER) return 0
|
|
46
|
+
|
|
47
|
+
const value = Number(field)
|
|
48
|
+
|
|
49
|
+
return Number.isNaN(value) ? 0 : value
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// One `added\tdeleted\tpath` row into a `FileChange`, or `undefined` for a row that is not one.
|
|
53
|
+
function parse_row(row: string): FileChange | undefined {
|
|
54
|
+
const fields = row.split('\t')
|
|
55
|
+
|
|
56
|
+
if (fields.length < NUMSTAT_FIELDS) return undefined
|
|
57
|
+
|
|
58
|
+
const [added, deleted, ...path_parts] = fields
|
|
59
|
+
|
|
60
|
+
return { path: path_parts.join('\t'), changed_lines: parse_count(added) + parse_count(deleted) }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// The raw stdout of `git diff --numstat` into the changes it lists.
|
|
64
|
+
function parse_numstat(raw: string): Array<FileChange> {
|
|
65
|
+
return raw
|
|
66
|
+
.split('\n')
|
|
67
|
+
.map((line) => line.trim())
|
|
68
|
+
.filter((line) => line !== '')
|
|
69
|
+
.map((row) => parse_row(row))
|
|
70
|
+
.filter((change): change is FileChange => change !== undefined)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function non_test_changes(changes: ReadonlyArray<FileChange>): Array<FileChange> {
|
|
74
|
+
return changes.filter((change) => !test_declared_logic.is_test_file(change.path))
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// `split` only when **both** guides are exceeded together — the size condition a split has to clear,
|
|
78
|
+
// per `split-assessment.md`'s conservative default. Either one alone leaves the change one Issue.
|
|
79
|
+
function verdict_for(files: number, lines: number): SplitVerdict {
|
|
80
|
+
return files > FILE_GUIDE && lines > LINE_GUIDE ? SPLIT_VERDICT : SINGLE_VERDICT
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function measure(changes: ReadonlyArray<FileChange>): SizeMeasurement {
|
|
84
|
+
const runtime = non_test_changes(changes)
|
|
85
|
+
const lines = runtime.reduce((total, change) => total + change.changed_lines, 0)
|
|
86
|
+
|
|
87
|
+
return { files: runtime.length, lines, verdict: verdict_for(runtime.length, lines) }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// The size measurement of a raw `git diff --numstat`, the one call the CLI makes.
|
|
91
|
+
function assess(raw: string): SizeMeasurement {
|
|
92
|
+
return measure(parse_numstat(raw))
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const SPLIT_TAIL =
|
|
96
|
+
'both exceed the guide — the size condition for a split is met (separability is a separate judgement)'
|
|
97
|
+
const SINGLE_TAIL = 'under the guide on at least one axis — one Issue, however separable'
|
|
98
|
+
|
|
99
|
+
// The sentence printed on stderr: what was counted, against which guide, and what the verdict does
|
|
100
|
+
// and does not mean. Test files are already dropped from the counts, so the reason says so.
|
|
101
|
+
function reason(measurement: SizeMeasurement): string {
|
|
102
|
+
const counted = `${String(measurement.files)} changed file(s), ${String(measurement.lines)} changed line(s), tests excluded`
|
|
103
|
+
const guide = `guide ${String(FILE_GUIDE)} files / ${String(LINE_GUIDE)} lines`
|
|
104
|
+
const tail = measurement.verdict === SPLIT_VERDICT ? SPLIT_TAIL : SINGLE_TAIL
|
|
105
|
+
|
|
106
|
+
return `${counted} (${guide}) — ${tail}`
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const split_assess = {
|
|
110
|
+
FILE_GUIDE,
|
|
111
|
+
LINE_GUIDE,
|
|
112
|
+
SPLIT_VERDICT,
|
|
113
|
+
SINGLE_VERDICT,
|
|
114
|
+
assess,
|
|
115
|
+
measure,
|
|
116
|
+
non_test_changes,
|
|
117
|
+
parse_numstat,
|
|
118
|
+
parse_row,
|
|
119
|
+
reason,
|
|
120
|
+
verdict_for,
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export type { FileChange, SizeMeasurement, SplitVerdict }
|
|
124
|
+
export { split_assess }
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { PinDrift } from './workflow-pin-logic'
|
|
2
|
+
|
|
3
|
+
// Orchestration for `josh sync-dependabot-pins`: propagate a Dependabot action
|
|
4
|
+
// bump from .github/workflows into templates/workflows for one or more PRs.
|
|
5
|
+
// All git/gh side effects are injected via DependabotPinOps so the control flow
|
|
6
|
+
// (checkout order, drift-skip, dry-run no-op) is unit-testable without spawning.
|
|
7
|
+
const NO_PR_MESSAGE = 'No PR numbers supplied (e.g. `josh sdp 578 641`)'
|
|
8
|
+
const INVALID_PR_PREFIX = 'Invalid PR number: '
|
|
9
|
+
const DEPENDABOT_BRANCH_PREFIX = 'dependabot/'
|
|
10
|
+
const PR_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
11
|
+
|
|
12
|
+
interface DependabotPinOps {
|
|
13
|
+
get_current_branch: () => Promise<string>
|
|
14
|
+
get_pr_branch: (pr: number) => Promise<string>
|
|
15
|
+
checkout_pr: (pr: number) => Promise<void>
|
|
16
|
+
checkout_branch: (branch: string) => Promise<void>
|
|
17
|
+
sync_pins: () => Array<PinDrift>
|
|
18
|
+
stage_templates: () => Promise<void>
|
|
19
|
+
commit: (message: string) => Promise<void>
|
|
20
|
+
push: () => Promise<void>
|
|
21
|
+
log: (message: string) => void
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface SyncOptions {
|
|
25
|
+
is_dry_run: boolean
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface PrResult {
|
|
29
|
+
pr: number
|
|
30
|
+
synced_count: number
|
|
31
|
+
is_committed: boolean
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function build_commit_message(pr: number): string {
|
|
35
|
+
return `Sync template workflow pins (Dependabot #${String(pr)})`
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function parse_pr_number(token: string): number {
|
|
39
|
+
if (!PR_NUMBER_PATTERN.test(token)) throw new Error(`${INVALID_PR_PREFIX}${token}`)
|
|
40
|
+
|
|
41
|
+
const pr = Number(token)
|
|
42
|
+
if (!Number.isSafeInteger(pr)) throw new Error(`${INVALID_PR_PREFIX}${token}`)
|
|
43
|
+
|
|
44
|
+
return pr
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function parse_pr_numbers(tokens: ReadonlyArray<string>): Array<number> {
|
|
48
|
+
if (tokens.length === 0) throw new Error(NO_PR_MESSAGE)
|
|
49
|
+
|
|
50
|
+
return tokens.map((token) => parse_pr_number(token))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function commit_synced_pins(pr: number, ops: DependabotPinOps): Promise<void> {
|
|
54
|
+
await ops.stage_templates()
|
|
55
|
+
await ops.commit(build_commit_message(pr))
|
|
56
|
+
await ops.push()
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function skipped_result(pr: number): PrResult {
|
|
60
|
+
return { pr, synced_count: 0, is_committed: false }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function checkout_dependabot_pr(pr: number, ops: DependabotPinOps): Promise<boolean> {
|
|
64
|
+
await ops.checkout_pr(pr)
|
|
65
|
+
const branch = await ops.get_current_branch()
|
|
66
|
+
|
|
67
|
+
if (branch.startsWith(DEPENDABOT_BRANCH_PREFIX)) return true
|
|
68
|
+
|
|
69
|
+
ops.log(`#${String(pr)}: ${branch} is not a Dependabot branch — skipped`)
|
|
70
|
+
|
|
71
|
+
return false
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async function apply_pr(pr: number, ops: DependabotPinOps): Promise<PrResult> {
|
|
75
|
+
if (!(await checkout_dependabot_pr(pr, ops))) return skipped_result(pr)
|
|
76
|
+
|
|
77
|
+
const drifts = ops.sync_pins()
|
|
78
|
+
|
|
79
|
+
if (drifts.length === 0) {
|
|
80
|
+
ops.log(`#${String(pr)}: template pins already in sync — skipped`)
|
|
81
|
+
|
|
82
|
+
return skipped_result(pr)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
await commit_synced_pins(pr, ops)
|
|
86
|
+
ops.log(`#${String(pr)}: synced ${String(drifts.length)} pin(s) and pushed`)
|
|
87
|
+
|
|
88
|
+
return { pr, synced_count: drifts.length, is_committed: true }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function plan_pr(pr: number, ops: DependabotPinOps): Promise<PrResult> {
|
|
92
|
+
const branch = await ops.get_pr_branch(pr)
|
|
93
|
+
|
|
94
|
+
ops.log(`#${String(pr)} (${branch}): would sync template pins and push if drifted [dry-run]`)
|
|
95
|
+
|
|
96
|
+
return skipped_result(pr)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function process_pr(
|
|
100
|
+
pr: number,
|
|
101
|
+
options: SyncOptions,
|
|
102
|
+
ops: DependabotPinOps,
|
|
103
|
+
): Promise<PrResult> {
|
|
104
|
+
if (options.is_dry_run) return await plan_pr(pr, ops)
|
|
105
|
+
|
|
106
|
+
return await apply_pr(pr, ops)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async function run_sync(
|
|
110
|
+
prs: ReadonlyArray<number>,
|
|
111
|
+
options: SyncOptions,
|
|
112
|
+
ops: DependabotPinOps,
|
|
113
|
+
): Promise<Array<PrResult>> {
|
|
114
|
+
const start_branch = await ops.get_current_branch()
|
|
115
|
+
const results: Array<PrResult> = []
|
|
116
|
+
|
|
117
|
+
try {
|
|
118
|
+
for (const pr of prs) {
|
|
119
|
+
results.push(await process_pr(pr, options, ops))
|
|
120
|
+
}
|
|
121
|
+
} finally {
|
|
122
|
+
if (!options.is_dry_run) await ops.checkout_branch(start_branch)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return results
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const dependabot_pin_logic = {
|
|
129
|
+
build_commit_message,
|
|
130
|
+
parse_pr_numbers,
|
|
131
|
+
run_sync,
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export { dependabot_pin_logic }
|
|
135
|
+
export type { DependabotPinOps }
|