@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,151 @@
|
|
|
1
|
+
import {
|
|
2
|
+
package_scout,
|
|
3
|
+
type PackageMetrics,
|
|
4
|
+
type RankedTable,
|
|
5
|
+
type TierVerdict,
|
|
6
|
+
} from './package-scout'
|
|
7
|
+
|
|
8
|
+
// The printed shape of `josh pkg:scout` — one line per candidate with each metric labelled, then a
|
|
9
|
+
// verdict line that names whether the choice is a Tier A pick or a Tier B question
|
|
10
|
+
// (joshuafolkken/kit#2216). Formatting is pure so the layout and the verdict wording are unit-tested
|
|
11
|
+
// without a registry.
|
|
12
|
+
|
|
13
|
+
// The blank shown for a metric the registry did not report — a fact absent, never a zero measured.
|
|
14
|
+
const UNKNOWN = '—'
|
|
15
|
+
// The rank marker (`#1`) is padded to this width so the names after it line up.
|
|
16
|
+
const RANK_WIDTH = 4
|
|
17
|
+
// The column the package name is padded to, so the labelled metrics after it line up down the table.
|
|
18
|
+
const NAME_WIDTH = 28
|
|
19
|
+
// Score is printed to two decimals; the near-tie gap is a fraction shown as a whole-number percent.
|
|
20
|
+
const SCORE_DIGITS = 2
|
|
21
|
+
const PERCENT = 100
|
|
22
|
+
// The number of characters an ISO timestamp carries before the time — `2025-08-01T…` → `2025-08-01`.
|
|
23
|
+
const DATE_LENGTH = 10
|
|
24
|
+
|
|
25
|
+
// Binary units: the registry reports `dist.unpackedSize` in bytes, and package sizes are read in KiB
|
|
26
|
+
// and MiB in practice.
|
|
27
|
+
const BYTE_STEP = 1024
|
|
28
|
+
const SIZE_UNITS: ReadonlyArray<string> = ['B', 'KB', 'MB', 'GB']
|
|
29
|
+
const SIZE_DIGITS = 1
|
|
30
|
+
// Digits are grouped in threes from the right — 12345 → 12,345.
|
|
31
|
+
const GROUP_SIZE = 3
|
|
32
|
+
|
|
33
|
+
// Thousands grouping without Intl, so the output does not vary with the runtime's ICU data, and
|
|
34
|
+
// without a look-ahead regex, whose backtracking is super-linear.
|
|
35
|
+
function group_thousands(value: number): string {
|
|
36
|
+
const text = String(value)
|
|
37
|
+
const groups: Array<string> = []
|
|
38
|
+
|
|
39
|
+
for (let end = text.length; end > 0; end -= GROUP_SIZE) {
|
|
40
|
+
groups.unshift(text.slice(Math.max(0, end - GROUP_SIZE), end))
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return groups.join(',')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function format_downloads(weekly: number | undefined): string {
|
|
47
|
+
return weekly === undefined ? UNKNOWN : `${group_thousands(weekly)}/wk`
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function format_date(published: string | undefined): string {
|
|
51
|
+
return published === undefined ? UNKNOWN : published.slice(0, DATE_LENGTH)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Step down to the largest unit the size does not overflow, capped at the last unit for anything huge.
|
|
55
|
+
function scale_bytes(bytes: number): readonly [number, number] {
|
|
56
|
+
let value = bytes
|
|
57
|
+
let index = 0
|
|
58
|
+
|
|
59
|
+
while (value >= BYTE_STEP && index < SIZE_UNITS.length - 1) {
|
|
60
|
+
value /= BYTE_STEP
|
|
61
|
+
index += 1
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return [value, index]
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function format_size(bytes: number | undefined): string {
|
|
68
|
+
if (bytes === undefined) return UNKNOWN
|
|
69
|
+
|
|
70
|
+
const [value, index] = scale_bytes(bytes)
|
|
71
|
+
const digits = index === 0 ? 0 : SIZE_DIGITS
|
|
72
|
+
|
|
73
|
+
return `${value.toFixed(digits)} ${SIZE_UNITS[index] ?? 'B'}`
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function format_row(index: number, metrics: PackageMetrics): string {
|
|
77
|
+
const name = `${metrics.name}@${metrics.version}`
|
|
78
|
+
|
|
79
|
+
return [
|
|
80
|
+
`#${String(index + 1)}`.padEnd(RANK_WIDTH),
|
|
81
|
+
name.padEnd(NAME_WIDTH),
|
|
82
|
+
`score ${metrics.score.toFixed(SCORE_DIGITS)}`,
|
|
83
|
+
`dl ${format_downloads(metrics.weekly_downloads)}`,
|
|
84
|
+
`pub ${format_date(metrics.last_publish)}`,
|
|
85
|
+
`types ${metrics.has_bundled_types ? '✓' : '✗'}`,
|
|
86
|
+
`lic ${metrics.license ?? UNKNOWN}`,
|
|
87
|
+
`size ${format_size(metrics.install_size_bytes)}`,
|
|
88
|
+
].join(' ')
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const NO_CANDIDATES_LINE = 'Candidates: none — no package on the registry matched these keywords.'
|
|
92
|
+
|
|
93
|
+
function format_percent(fraction: number): string {
|
|
94
|
+
return `${String(Math.round(fraction * PERCENT))}%`
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// A lone candidate has nothing to be close to, so it is the pick by default — the verdict vocabulary
|
|
98
|
+
// still reads `clear` so a caller keys off one word rather than counting rows.
|
|
99
|
+
function format_single(metrics: PackageMetrics): string {
|
|
100
|
+
return `Tier: clear — only ${metrics.name} matched; it is the pick (Tier A).`
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function name_or_blank(metrics: PackageMetrics | undefined): string {
|
|
104
|
+
return metrics?.name ?? ''
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function lead_line(table: RankedTable): string {
|
|
108
|
+
const [first, second] = table.ranked
|
|
109
|
+
const names = `${name_or_blank(first)} leads ${name_or_blank(second)}`
|
|
110
|
+
|
|
111
|
+
return `${names} by ${format_percent(table.gap ?? 0)}`
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function format_pair(table: RankedTable, verdict: TierVerdict): string {
|
|
115
|
+
const threshold = format_percent(package_scout.NEAR_TIE_THRESHOLD)
|
|
116
|
+
const lead = lead_line(table)
|
|
117
|
+
|
|
118
|
+
if (verdict === 'clear') return `Tier: clear — ${lead} (≥ ${threshold}); select it (Tier A).`
|
|
119
|
+
|
|
120
|
+
return `Tier: close — ${lead} (< ${threshold}); ask the user (Tier B).`
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function format_verdict(table: RankedTable): string {
|
|
124
|
+
const [first] = table.ranked
|
|
125
|
+
|
|
126
|
+
if (first === undefined) return NO_CANDIDATES_LINE
|
|
127
|
+
if (table.verdict === undefined) return format_single(first)
|
|
128
|
+
|
|
129
|
+
return format_pair(table, table.verdict)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function format_table(table: RankedTable): string {
|
|
133
|
+
if (table.ranked.length === 0) return NO_CANDIDATES_LINE
|
|
134
|
+
|
|
135
|
+
const rows = table.ranked.map((metrics, index) => format_row(index, metrics))
|
|
136
|
+
|
|
137
|
+
return [...rows, '', format_verdict(table)].join('\n')
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const package_scout_format = {
|
|
141
|
+
NO_CANDIDATES_LINE,
|
|
142
|
+
group_thousands,
|
|
143
|
+
format_downloads,
|
|
144
|
+
format_date,
|
|
145
|
+
format_size,
|
|
146
|
+
format_row,
|
|
147
|
+
format_verdict,
|
|
148
|
+
format_table,
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export { package_scout_format }
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// The measured metrics behind `josh pkg:scout` — the ranking of package candidates and the near-tie
|
|
2
|
+
// verdict that turns the Package-First "clearly best (Tier A) / genuine toss-up (Tier B)" branch from
|
|
3
|
+
// an impression into a computed answer (joshuafolkken/kit#2216).
|
|
4
|
+
//
|
|
5
|
+
// This module is the pure half: it takes candidates already gathered from the npm registry and
|
|
6
|
+
// answers two things — the order they rank in, and whether the top two are close enough that the
|
|
7
|
+
// choice is a Tier B question rather than a Tier A pick. The network reads live in
|
|
8
|
+
// `package-scout-cli.ts`, so the transform and the boundary are unit-tested without a registry.
|
|
9
|
+
|
|
10
|
+
// The relative lead below which the top two candidates are a near-tie. The registry's `score.final`
|
|
11
|
+
// is a relevance-weighted number of no fixed scale, so the gap is read as a fraction of the leader's
|
|
12
|
+
// score — `(top − second) / top` — rather than as an absolute difference. A leader ahead by less than
|
|
13
|
+
// this fraction is inside the noise, so the choice is the user's (Tier B) rather than the run's.
|
|
14
|
+
const NEAR_TIE_THRESHOLD = 0.15
|
|
15
|
+
|
|
16
|
+
// One candidate's registry facts, gathered per package: the version metadata (bundled types, license,
|
|
17
|
+
// unpacked size) that the search listing does not carry. Every field present, some absent as
|
|
18
|
+
// `undefined` — a fact the registry did not report is a blank in the row, never a scan that failed.
|
|
19
|
+
interface RegistryFacts {
|
|
20
|
+
has_bundled_types: boolean
|
|
21
|
+
license: string | undefined
|
|
22
|
+
install_size_bytes: number | undefined
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// A candidate as the search listing reports it: its name, the version searched, npm's composite score
|
|
26
|
+
// (the ranking key), and the version's publish date. The score is what the near-tie verdict reads.
|
|
27
|
+
interface SearchCandidate {
|
|
28
|
+
name: string
|
|
29
|
+
version: string
|
|
30
|
+
score: number
|
|
31
|
+
last_publish: string | undefined
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// A candidate with every measured metric folded together, one row of the ranking table.
|
|
35
|
+
interface PackageMetrics {
|
|
36
|
+
name: string
|
|
37
|
+
version: string
|
|
38
|
+
// npm's composite score (quality + popularity + maintenance), the ranking key.
|
|
39
|
+
score: number
|
|
40
|
+
weekly_downloads: number | undefined
|
|
41
|
+
last_publish: string | undefined
|
|
42
|
+
has_bundled_types: boolean
|
|
43
|
+
license: string | undefined
|
|
44
|
+
install_size_bytes: number | undefined
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// `clear` — the top candidate leads by more than the near-tie threshold, so it is the Tier A pick.
|
|
48
|
+
// `close` — the top two are within it, so the choice is a Tier B question for the user.
|
|
49
|
+
type TierVerdict = 'clear' | 'close'
|
|
50
|
+
|
|
51
|
+
interface RankedTable {
|
|
52
|
+
ranked: ReadonlyArray<PackageMetrics>
|
|
53
|
+
// The relative lead of the top two, undefined when fewer than two candidates ranked.
|
|
54
|
+
gap: number | undefined
|
|
55
|
+
// The verdict, undefined when there is nothing to compare (0 or 1 candidate).
|
|
56
|
+
verdict: TierVerdict | undefined
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// The search listing and the per-package facts, folded into one row. The two are gathered from
|
|
60
|
+
// separate registry reads, so a candidate whose facts read failed still ranks on its search score.
|
|
61
|
+
function to_metrics(
|
|
62
|
+
candidate: SearchCandidate,
|
|
63
|
+
facts: RegistryFacts,
|
|
64
|
+
weekly_downloads: number | undefined,
|
|
65
|
+
): PackageMetrics {
|
|
66
|
+
return {
|
|
67
|
+
name: candidate.name,
|
|
68
|
+
version: candidate.version,
|
|
69
|
+
score: candidate.score,
|
|
70
|
+
last_publish: candidate.last_publish,
|
|
71
|
+
has_bundled_types: facts.has_bundled_types,
|
|
72
|
+
license: facts.license,
|
|
73
|
+
install_size_bytes: facts.install_size_bytes,
|
|
74
|
+
weekly_downloads,
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Strongest first. Ties keep input order, which reads less arbitrarily than an unstable sort — and an
|
|
79
|
+
// equal score is exactly the near-tie the verdict then reports rather than something the order hides.
|
|
80
|
+
function rank(candidates: ReadonlyArray<PackageMetrics>): Array<PackageMetrics> {
|
|
81
|
+
return [...candidates].toSorted((left, right) => right.score - left.score)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// The lead of the top candidate over the next as a fraction of the leader's score, or undefined when
|
|
85
|
+
// there is no pair to compare. Scaled by the leader so the threshold holds whatever the score's range:
|
|
86
|
+
// a leader whose score is zero has no lead over an equal runner-up, so the gap is zero (a near-tie).
|
|
87
|
+
function tie_gap(ranked: ReadonlyArray<PackageMetrics>): number | undefined {
|
|
88
|
+
const [first, second] = ranked
|
|
89
|
+
|
|
90
|
+
if (first === undefined || second === undefined) return undefined
|
|
91
|
+
if (first.score <= 0) return 0
|
|
92
|
+
|
|
93
|
+
return (first.score - second.score) / first.score
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function verdict_of(gap: number | undefined): TierVerdict | undefined {
|
|
97
|
+
if (gap === undefined) return undefined
|
|
98
|
+
|
|
99
|
+
return gap < NEAR_TIE_THRESHOLD ? 'close' : 'clear'
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// The whole answer: the candidates in order, the top-two gap, and whether that gap makes the choice a
|
|
103
|
+
// Tier A pick or a Tier B question.
|
|
104
|
+
function build_table(candidates: ReadonlyArray<PackageMetrics>): RankedTable {
|
|
105
|
+
const ranked = rank(candidates)
|
|
106
|
+
const gap = tie_gap(ranked)
|
|
107
|
+
|
|
108
|
+
return { ranked, gap, verdict: verdict_of(gap) }
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const package_scout = {
|
|
112
|
+
NEAR_TIE_THRESHOLD,
|
|
113
|
+
to_metrics,
|
|
114
|
+
rank,
|
|
115
|
+
tie_gap,
|
|
116
|
+
verdict_of,
|
|
117
|
+
build_table,
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export type { PackageMetrics, RankedTable, RegistryFacts, SearchCandidate, TierVerdict }
|
|
121
|
+
export { package_scout }
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { ports, type PortEnvironment } from '#ports'
|
|
4
|
+
|
|
5
|
+
const SUCCESS_EXIT_CODE = 0
|
|
6
|
+
const USAGE_EXIT_CODE = 1
|
|
7
|
+
const FAILURE_EXIT_CODE = 1
|
|
8
|
+
const EXPECTED_ARGUMENT_COUNT = 1
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
type PortName = 'dev' | 'preview'
|
|
12
|
+
|
|
13
|
+
interface PortResult {
|
|
14
|
+
text: string
|
|
15
|
+
exit_code: number
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const RESOLVERS: Record<PortName, (environment?: PortEnvironment) => number> = {
|
|
19
|
+
dev: ports.resolve_development_port,
|
|
20
|
+
preview: ports.resolve_preview_port,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const PORT_NAMES: ReadonlyArray<string> = Object.keys(RESOLVERS)
|
|
24
|
+
const USAGE = `Usage: josh port <${PORT_NAMES.join('|')}>`
|
|
25
|
+
|
|
26
|
+
function is_port_name(value: string | undefined): value is PortName {
|
|
27
|
+
return value !== undefined && Object.hasOwn(RESOLVERS, value)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Shell contexts cannot import the resolver, so `$(josh port preview)` is how a package.json
|
|
31
|
+
// script stays on kit's single port definition instead of re-deriving the arithmetic. The output is
|
|
32
|
+
// substituted straight into a command line, so success prints the number and nothing else; anything
|
|
33
|
+
// else would corrupt the port argument it feeds. The documented form calls the binary rather than
|
|
34
|
+
// `pnpm josh`, because a `pnpm run` wrapper writes its own `[ELIFECYCLE]` line and any install log
|
|
35
|
+
// to that same stream and nothing here can suppress them (#825).
|
|
36
|
+
function run(argv: ReadonlyArray<string>, environment?: PortEnvironment): PortResult {
|
|
37
|
+
const [name] = argv
|
|
38
|
+
|
|
39
|
+
// An extra argument is refused rather than ignored: `josh port dev preview` printing the dev
|
|
40
|
+
// port would feed a silently wrong number into the command line that substitutes it.
|
|
41
|
+
if (argv.length !== EXPECTED_ARGUMENT_COUNT || !is_port_name(name)) {
|
|
42
|
+
return { text: USAGE, exit_code: USAGE_EXIT_CODE }
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// An invalid `PORT_SEED` throws out of the resolver. Reporting the message alone keeps the
|
|
46
|
+
// failure readable in the terminal that ran `pnpm preview`, where a raw stack trace would bury
|
|
47
|
+
// the one line saying which variable to fix.
|
|
48
|
+
try {
|
|
49
|
+
return { text: String(RESOLVERS[name](environment)), exit_code: SUCCESS_EXIT_CODE }
|
|
50
|
+
} catch (error) {
|
|
51
|
+
return {
|
|
52
|
+
text: error instanceof Error ? error.message : String(error),
|
|
53
|
+
exit_code: FAILURE_EXIT_CODE,
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// #826: the resolver finds `.env` at the project root, where `pnpm run` starts the scripts that
|
|
59
|
+
// substitute this command's output. It replaces the `--env-file-if-exists=.env` tsx flag this
|
|
60
|
+
// command used to carry, which resolved relative to the working directory instead — so running the
|
|
61
|
+
// command from a subdirectory answered with the unseeded port while `playwright.config.ts`, which
|
|
62
|
+
// already uses this resolver, answered with the seeded one. One reader, one file.
|
|
63
|
+
function main(argv: ReadonlyArray<string>): void {
|
|
64
|
+
ports.load_environment_file()
|
|
65
|
+
|
|
66
|
+
const { text, exit_code } = run(argv)
|
|
67
|
+
|
|
68
|
+
if (exit_code === SUCCESS_EXIT_CODE) {
|
|
69
|
+
console.info(text)
|
|
70
|
+
|
|
71
|
+
return
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
console.error(text)
|
|
75
|
+
process.exit(exit_code)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const port_command = {
|
|
79
|
+
is_port_name,
|
|
80
|
+
run,
|
|
81
|
+
PORT_NAMES,
|
|
82
|
+
USAGE,
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
86
|
+
|
|
87
|
+
export { port_command }
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { propagate_git } from './propagate-git'
|
|
2
|
+
import type { StepResult } from './propagate-run'
|
|
3
|
+
|
|
4
|
+
// Where `josh git` actually stopped inside a consumer, and what it left there.
|
|
5
|
+
//
|
|
6
|
+
// `josh git` is three things under one command — stage and commit, push, open the pull request — and
|
|
7
|
+
// a failed spawn reports one exit code for all three. The run's report then appended "upgrade/sync
|
|
8
|
+
// changes left uncommitted" to that code, which names the *first* of the three: so a consumer whose
|
|
9
|
+
// pre-push hook refused the push was reported as a consumer whose sync never got committed, and the
|
|
10
|
+
// reader went looking at a sync that had worked (joshuafolkken/kit#1417).
|
|
11
|
+
//
|
|
12
|
+
// **Nothing here changes whether a push is blocked.** A consumer's pre-push gate refusing a push is
|
|
13
|
+
// the gate doing its job, and the probes below are read-only. What is fixed is the sentence.
|
|
14
|
+
|
|
15
|
+
// The last lines of `josh git`'s own output are what name the check that stopped it: a pre-push hook
|
|
16
|
+
// prints its steps as it runs them and ends on the one that failed, and git's refusal follows. Three
|
|
17
|
+
// lines carry that pair without breaking the report's one-line-per-consumer shape.
|
|
18
|
+
const TAIL_LINE_COUNT = 3
|
|
19
|
+
const TAIL_SEPARATOR = ' / '
|
|
20
|
+
// eslint-disable-next-line no-control-regex -- the escape sequences to strip are control characters
|
|
21
|
+
const ANSI_PATTERN = /\[[0-9;?]*[ -/]*[@-~]/gu
|
|
22
|
+
const LINE_BREAK_PATTERN = /[\r\n]/u
|
|
23
|
+
const TAIL_LABEL = 'last output: '
|
|
24
|
+
const NO_COMMIT = 'nothing was committed'
|
|
25
|
+
const NOT_OPENED = 'the branch reached origin, but the pull request was not opened'
|
|
26
|
+
const HOOK_REFUSED = "but the consumer's pre-push hook refused the push"
|
|
27
|
+
const PUSH_FAILED = 'but the push did not reach origin'
|
|
28
|
+
const NOTHING_LEFT = 'nothing was left behind'
|
|
29
|
+
const LEFTOVER_LABEL = 'left behind: '
|
|
30
|
+
const LEFTOVER_JOIN = ' and '
|
|
31
|
+
const UNCOMMITTED = 'uncommitted changes'
|
|
32
|
+
|
|
33
|
+
// The facts one classification is made from, gathered once so the decision itself stays pure and
|
|
34
|
+
// testable without a repository.
|
|
35
|
+
interface GitStepState {
|
|
36
|
+
// The feature branch `josh git` created, or nothing when the checkout is still on its default
|
|
37
|
+
// branch — which is what a failure before the branch existed looks like. Written as "present,
|
|
38
|
+
// possibly undefined" rather than optional: `exactOptionalPropertyTypes` is on and the probes
|
|
39
|
+
// below answer `undefined` rather than omitting the key, which is the same reason
|
|
40
|
+
// `git-fixture-workspace.ts` declares `restore_environment` this way.
|
|
41
|
+
branch: string | undefined
|
|
42
|
+
// The commit that branch carries beyond the default branch, or nothing when it carries none.
|
|
43
|
+
head_commit: string | undefined
|
|
44
|
+
is_tree_clean: boolean
|
|
45
|
+
is_on_remote: boolean
|
|
46
|
+
is_push_hook_blocked: boolean
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// The remote half of the state, kept apart because it is the half that costs network round trips.
|
|
50
|
+
interface PushState {
|
|
51
|
+
is_on_remote: boolean
|
|
52
|
+
is_push_hook_blocked: boolean
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const NOT_PUSHED: PushState = { is_on_remote: false, is_push_hook_blocked: false }
|
|
56
|
+
|
|
57
|
+
function push_reason(state: GitStepState): string {
|
|
58
|
+
return state.is_push_hook_blocked ? HOOK_REFUSED : PUSH_FAILED
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Which of `josh git`'s three sub-steps stopped, read from what the consumer's repository holds now.
|
|
62
|
+
function describe_failure(state: GitStepState): string {
|
|
63
|
+
const { branch, head_commit } = state
|
|
64
|
+
if (branch === undefined || head_commit === undefined) return NO_COMMIT
|
|
65
|
+
if (state.is_on_remote) return NOT_OPENED
|
|
66
|
+
|
|
67
|
+
return `committed ${head_commit} on ${branch}, ${push_reason(state)}`
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// The last lines of one stream. Split on carriage returns as well as newlines, because a push's
|
|
71
|
+
// progress meter and pnpm's spinners overwrite one line with `\r` — counted as a single line, one of
|
|
72
|
+
// them alone would fill a tail slot with kilobytes. Escape sequences go for the same reason: this
|
|
73
|
+
// text lands in a report that is one line per consumer.
|
|
74
|
+
function stream_tail(text: string): string {
|
|
75
|
+
return text
|
|
76
|
+
.replaceAll(ANSI_PATTERN, '')
|
|
77
|
+
.split(LINE_BREAK_PATTERN)
|
|
78
|
+
.map((line) => line.trim())
|
|
79
|
+
.filter((line) => line !== '')
|
|
80
|
+
.slice(-TAIL_LINE_COUNT)
|
|
81
|
+
.join(TAIL_SEPARATOR)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// `josh git`'s own last lines, folded onto one. It is the *last* lines that matter, because a hook
|
|
85
|
+
// that stops mid-run ends on the check that stopped it — the one fact nothing else in the run keeps.
|
|
86
|
+
//
|
|
87
|
+
// **Each stream is tailed separately**, and that is not tidiness: git writes its refusal to stderr
|
|
88
|
+
// while a hook's own progress commonly goes to stdout, so a tail taken across the two concatenated
|
|
89
|
+
// would be all stderr whenever stderr had enough lines — dropping exactly the hook output this
|
|
90
|
+
// exists to carry. A synchronous spawn cannot interleave them, so neither is allowed to crowd the
|
|
91
|
+
// other out.
|
|
92
|
+
function output_tail(streams: ReadonlyArray<string>): string {
|
|
93
|
+
const tails = streams.map((text) => stream_tail(text)).filter((tail) => tail !== '')
|
|
94
|
+
|
|
95
|
+
if (tails.length === 0) return ''
|
|
96
|
+
|
|
97
|
+
return ` — ${TAIL_LABEL}${tails.join(TAIL_SEPARATOR)}`
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// What the failure left in the consumer, read from the tree rather than from which step ran. A
|
|
101
|
+
// `josh git` that got as far as committing left no uncommitted changes at all, so the standing note
|
|
102
|
+
// — the one saying the upgrade and the sync are still sitting there uncommitted — is false exactly
|
|
103
|
+
// where this module is reached.
|
|
104
|
+
function leftover_note(state: GitStepState): string {
|
|
105
|
+
const parts: Array<string> = []
|
|
106
|
+
|
|
107
|
+
if (!state.is_tree_clean) parts.push(UNCOMMITTED)
|
|
108
|
+
if (state.branch !== undefined) parts.push(`the branch ${state.branch}`)
|
|
109
|
+
if (parts.length === 0) return NOTHING_LEFT
|
|
110
|
+
|
|
111
|
+
return `${LEFTOVER_LABEL}${parts.join(LEFTOVER_JOIN)}`
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// The branch `josh git` created, or nothing when the checkout never left its default branch.
|
|
115
|
+
function feature_branch(repository_path: string, default_name: string): string | undefined {
|
|
116
|
+
const branch = propagate_git.current_branch(repository_path)
|
|
117
|
+
|
|
118
|
+
return branch === undefined || branch === default_name ? undefined : branch
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Asked only where there is a commit that could have been pushed. A branch carrying no commit of its
|
|
122
|
+
// own was never pushed, and asking anyway would spend two network round trips on a question the
|
|
123
|
+
// classification above never reaches.
|
|
124
|
+
function read_push_state(
|
|
125
|
+
repository_path: string,
|
|
126
|
+
branch: string | undefined,
|
|
127
|
+
head_commit: string | undefined,
|
|
128
|
+
): PushState {
|
|
129
|
+
if (branch === undefined || head_commit === undefined) return NOT_PUSHED
|
|
130
|
+
|
|
131
|
+
if (propagate_git.has_remote_branch(repository_path, branch)) {
|
|
132
|
+
return { is_on_remote: true, is_push_hook_blocked: false }
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// The real push has already failed by the time this runs — that is what made the step fail — so a
|
|
136
|
+
// dry run that goes through with the hooks out of the way says the hook is what stopped it. The
|
|
137
|
+
// hook has to exist for that to follow, and the local check is asked first so a consumer with no
|
|
138
|
+
// hook costs no round trip at all.
|
|
139
|
+
return {
|
|
140
|
+
is_on_remote: false,
|
|
141
|
+
is_push_hook_blocked:
|
|
142
|
+
propagate_git.has_pre_push_hook(repository_path) &&
|
|
143
|
+
propagate_git.can_push_without_hooks(repository_path, branch),
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function read_state(repository_path: string): GitStepState {
|
|
148
|
+
const default_name = propagate_git.default_branch(repository_path)
|
|
149
|
+
const branch = feature_branch(repository_path, default_name)
|
|
150
|
+
const head_commit =
|
|
151
|
+
branch === undefined ? undefined : propagate_git.commit_ahead(repository_path, default_name)
|
|
152
|
+
|
|
153
|
+
return {
|
|
154
|
+
branch,
|
|
155
|
+
head_commit,
|
|
156
|
+
is_tree_clean: propagate_git.is_clean(repository_path),
|
|
157
|
+
...read_push_state(repository_path, branch, head_commit),
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Replace `josh git`'s bare exit code with the sub-step that produced it, and record what that
|
|
162
|
+
// failure left in the consumer. Both are probed from the consumer's own repository, because the exit
|
|
163
|
+
// code is the same one whichever of the three sub-steps stopped.
|
|
164
|
+
function attribute(
|
|
165
|
+
repository_path: string,
|
|
166
|
+
result: StepResult,
|
|
167
|
+
streams: ReadonlyArray<string>,
|
|
168
|
+
): StepResult {
|
|
169
|
+
const state = read_state(repository_path)
|
|
170
|
+
const detail = `${result.detail ?? 'failed'} — ${describe_failure(state)}${output_tail(streams)}`
|
|
171
|
+
|
|
172
|
+
return { ...result, detail, leftover: leftover_note(state) }
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const propagate_git_failure = {
|
|
176
|
+
HOOK_REFUSED,
|
|
177
|
+
NOTHING_LEFT,
|
|
178
|
+
NO_COMMIT,
|
|
179
|
+
NOT_OPENED,
|
|
180
|
+
PUSH_FAILED,
|
|
181
|
+
TAIL_LINE_COUNT,
|
|
182
|
+
UNCOMMITTED,
|
|
183
|
+
attribute,
|
|
184
|
+
describe_failure,
|
|
185
|
+
leftover_note,
|
|
186
|
+
output_tail,
|
|
187
|
+
read_state,
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export type { GitStepState }
|
|
191
|
+
export { propagate_git_failure }
|