@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,105 @@
|
|
|
1
|
+
// Reading a GitHub issue or pull-request URL as an identity: which repository it is in, and which
|
|
2
|
+
// number. `josh notify` resolves the repository a notification is *about* this way, because the
|
|
3
|
+
// working directory answers a different question — which repository the session happens to be
|
|
4
|
+
// running in. A notification filed about another repository used to carry that repository's URL
|
|
5
|
+
// under this repository's name (joshuafolkken/kit#903), and the same mismatch survived for a
|
|
6
|
+
// notification carrying only a pull-request URL until joshuafolkken/kit#994 added the second form
|
|
7
|
+
// here rather than beside it.
|
|
8
|
+
//
|
|
9
|
+
// Two other modules read a URL for something narrower and keep their own patterns. `git-epic-parse`
|
|
10
|
+
// scans an epic body for task-list rows, so its regex is anchored to the row marker and runs
|
|
11
|
+
// globally over a document; `propagate-steps` takes the trailing number of whatever URL
|
|
12
|
+
// `gh issue create` just printed, where the repository is already known. This one is for a caller
|
|
13
|
+
// holding a single URL and needing the repository it names.
|
|
14
|
+
const NAME_WITH_OWNER_SEPARATOR = '/'
|
|
15
|
+
const GITHUB_URL_PREFIX = 'https://github.com/'
|
|
16
|
+
// The prefix as regex source, so the host is written once and the two patterns below cannot drift
|
|
17
|
+
// apart from it or from each other. Only the dots need escaping in a URL of this shape.
|
|
18
|
+
const GITHUB_URL_PREFIX_SOURCE = GITHUB_URL_PREFIX.replaceAll('.', String.raw`\.`)
|
|
19
|
+
const REPOSITORY_SOURCE = `^${GITHUB_URL_PREFIX_SOURCE}([^/]+)/([^/]+)`
|
|
20
|
+
// `\b` after the number, so `.../issues/431x` is refused rather than read as issue 431 — the
|
|
21
|
+
// caller's fallback is the working directory, which is a visibly wrong answer rather than a
|
|
22
|
+
// plausible one. A trailing `#anchor` or `?query` still parses, since neither is a word character.
|
|
23
|
+
const ISSUE_URL_PATTERN = new RegExp(String.raw`${REPOSITORY_SOURCE}/issues/(\d+)\b`, 'u')
|
|
24
|
+
// The same shape for a pull request. `git-pr-followup` used to carry its own copy of this, anchored
|
|
25
|
+
// to the end of the string; reading `.../pull/12/files` now yields the repository it names instead
|
|
26
|
+
// of nothing, which is the better answer for every caller (joshuafolkken/kit#994).
|
|
27
|
+
const PULL_URL_PATTERN = new RegExp(String.raw`${REPOSITORY_SOURCE}/pull/(\d+)\b`, 'u')
|
|
28
|
+
|
|
29
|
+
// What both forms answer: which repository the URL names.
|
|
30
|
+
interface RepoIdentity {
|
|
31
|
+
owner: string
|
|
32
|
+
repo: string
|
|
33
|
+
// `owner/repo`, the form a repository-scoped REST path takes — kept beside the parts so no caller
|
|
34
|
+
// re-joins them.
|
|
35
|
+
name_with_owner: string
|
|
36
|
+
// `https://github.com/owner/repo`, so a caller building a sibling URL does not rebuild the host.
|
|
37
|
+
base_url: string
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// The two forms carry their number under different names on purpose. A pull target is then not
|
|
41
|
+
// assignable where an issue target is expected, so handing a PR number to a reader that asks the
|
|
42
|
+
// issue endpoint is a compile error rather than a notification carrying an unrelated issue's title
|
|
43
|
+
// — the joshuafolkken/kit#903 mismatch class, which this module exists to close.
|
|
44
|
+
interface IssueUrlTarget extends RepoIdentity {
|
|
45
|
+
issue_number: string
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface PullUrlTarget extends RepoIdentity {
|
|
49
|
+
pull_number: string
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// `undefined` for anything that is not a github.com issue URL, including an absent one: every
|
|
53
|
+
// caller's fallback is the same either way, so a thrown error would only move the branch.
|
|
54
|
+
//
|
|
55
|
+
// The destructuring defaults in `build_target` are unreachable — a match fills all three groups —
|
|
56
|
+
// and exist because `noUncheckedIndexedAccess` types them as optional.
|
|
57
|
+
interface ParsedUrl {
|
|
58
|
+
target: RepoIdentity
|
|
59
|
+
number: string
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function build_target(match: RegExpExecArray): ParsedUrl {
|
|
63
|
+
const [, owner = '', repo = '', number = ''] = match
|
|
64
|
+
|
|
65
|
+
const name_with_owner = `${owner}${NAME_WITH_OWNER_SEPARATOR}${repo}`
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
target: {
|
|
69
|
+
owner,
|
|
70
|
+
repo,
|
|
71
|
+
name_with_owner,
|
|
72
|
+
base_url: `${GITHUB_URL_PREFIX}${name_with_owner}`,
|
|
73
|
+
},
|
|
74
|
+
number,
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function parse_with(pattern: RegExp, url: string | undefined): ParsedUrl | undefined {
|
|
79
|
+
const match = pattern.exec(url ?? '')
|
|
80
|
+
if (match === null) return undefined
|
|
81
|
+
|
|
82
|
+
return build_target(match)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function parse(issue_url: string | undefined): IssueUrlTarget | undefined {
|
|
86
|
+
const parsed = parse_with(ISSUE_URL_PATTERN, issue_url)
|
|
87
|
+
if (parsed === undefined) return undefined
|
|
88
|
+
|
|
89
|
+
return { ...parsed.target, issue_number: parsed.number }
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// A pull-request URL names the same repository an issue URL does. `josh notify` reads it when it was
|
|
93
|
+
// given no `--issue-url`, so a completion notification carrying only a PR link stops being filed
|
|
94
|
+
// under the working directory's repository (joshuafolkken/kit#994).
|
|
95
|
+
function parse_pull(pull_url: string | undefined): PullUrlTarget | undefined {
|
|
96
|
+
const parsed = parse_with(PULL_URL_PATTERN, pull_url)
|
|
97
|
+
if (parsed === undefined) return undefined
|
|
98
|
+
|
|
99
|
+
return { ...parsed.target, pull_number: parsed.number }
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const github_issue_url = { parse, parse_pull }
|
|
103
|
+
|
|
104
|
+
export { github_issue_url }
|
|
105
|
+
export type { IssueUrlTarget, RepoIdentity }
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { git_spawn } from './git-spawn'
|
|
2
|
+
|
|
3
|
+
// The local branches `josh ms` removes after it syncs (joshuafolkken/kit#2504). The repository
|
|
4
|
+
// deletes a pull request's remote branch at the merge, and nothing removed the local copy: measured on
|
|
5
|
+
// 2026-09-24, 212 of the primary checkout's 244 local branches tracked an upstream that was `[gone]`.
|
|
6
|
+
//
|
|
7
|
+
// **A branch is removed only when all three hold** — its upstream is gone, it is merged into the
|
|
8
|
+
// default branch, and no work tree has it checked out. Gone alone is not enough: a branch whose remote
|
|
9
|
+
// was deleted by hand before its work merged still holds the only copy of it. A branch with no
|
|
10
|
+
// upstream at all is never gone, so a local-only branch stays.
|
|
11
|
+
//
|
|
12
|
+
// **One `for-each-ref` read carries the work-tree answer too** — `%(worktreepath)` is git's own
|
|
13
|
+
// record of which tree holds the branch, so no `git worktree list` parse is repeated here.
|
|
14
|
+
|
|
15
|
+
const FIELD_SEPARATOR = '\t'
|
|
16
|
+
const GONE_TRACK = '[gone]'
|
|
17
|
+
// `lstrip=2` rather than `short`: `short` prints `heads/<name>` for a branch whose name a tag shares,
|
|
18
|
+
// and `git branch -d` would then be handed a name it cannot find.
|
|
19
|
+
const BRANCH_NAME = '%(refname:lstrip=2)'
|
|
20
|
+
const RECORD_FORMAT = [BRANCH_NAME, '%(upstream:track)', '%(upstream)', '%(worktreepath)'].join(
|
|
21
|
+
FIELD_SEPARATOR,
|
|
22
|
+
)
|
|
23
|
+
const LOCAL_HEADS = 'refs/heads'
|
|
24
|
+
const REMOTE_HEADS = 'refs/remotes/'
|
|
25
|
+
const FOR_EACH_REF = 'for-each-ref'
|
|
26
|
+
const NAME_FIELD = 0
|
|
27
|
+
const TRACK_FIELD = 1
|
|
28
|
+
const UPSTREAM_FIELD = 2
|
|
29
|
+
const WORKTREE_FIELD = 3
|
|
30
|
+
|
|
31
|
+
interface BranchRecord {
|
|
32
|
+
name: string
|
|
33
|
+
is_gone: boolean
|
|
34
|
+
is_checked_out: boolean
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface PruneResult {
|
|
38
|
+
deleted: Array<string>
|
|
39
|
+
failed: Array<string>
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function non_empty_lines(output: string): Array<string> {
|
|
43
|
+
return output.split('\n').filter((line) => line.trim() !== '')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function parse_record(line: string): BranchRecord {
|
|
47
|
+
const fields = line.split(FIELD_SEPARATOR)
|
|
48
|
+
|
|
49
|
+
return {
|
|
50
|
+
name: fields[NAME_FIELD] ?? '',
|
|
51
|
+
is_gone:
|
|
52
|
+
fields[TRACK_FIELD] === GONE_TRACK && (fields[UPSTREAM_FIELD] ?? '').startsWith(REMOTE_HEADS),
|
|
53
|
+
is_checked_out: (fields[WORKTREE_FIELD] ?? '') !== '',
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function parse_records(output: string): Array<BranchRecord> {
|
|
58
|
+
return non_empty_lines(output).map((line) => parse_record(line))
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function select_prunable(
|
|
62
|
+
records: ReadonlyArray<BranchRecord>,
|
|
63
|
+
merged: ReadonlySet<string>,
|
|
64
|
+
default_branch: string,
|
|
65
|
+
): Array<string> {
|
|
66
|
+
return records
|
|
67
|
+
.filter((record) => record.is_gone && !record.is_checked_out && merged.has(record.name))
|
|
68
|
+
.map((record) => record.name)
|
|
69
|
+
.filter((name) => name !== default_branch)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function read_candidates(default_branch: string): Promise<Array<string>> {
|
|
73
|
+
const records = await git_spawn.read([FOR_EACH_REF, `--format=${RECORD_FORMAT}`, LOCAL_HEADS])
|
|
74
|
+
const merged = await git_spawn.read([
|
|
75
|
+
FOR_EACH_REF,
|
|
76
|
+
`--merged=refs/heads/${default_branch}`,
|
|
77
|
+
`--format=${BRANCH_NAME}`,
|
|
78
|
+
LOCAL_HEADS,
|
|
79
|
+
])
|
|
80
|
+
|
|
81
|
+
return select_prunable(parse_records(records), new Set(non_empty_lines(merged)), default_branch)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// `-d` rather than `-D` is the second net under the merged check: git refuses a branch it does not
|
|
85
|
+
// itself see as merged, so a disagreement between the two reads leaves the branch rather than a lost
|
|
86
|
+
// commit. One refusal does not stop the rest, and is reported rather than thrown.
|
|
87
|
+
async function delete_each(names: ReadonlyArray<string>): Promise<PruneResult> {
|
|
88
|
+
const result: PruneResult = { deleted: [], failed: [] }
|
|
89
|
+
|
|
90
|
+
for (const name of names) {
|
|
91
|
+
try {
|
|
92
|
+
await git_spawn.read(['branch', '-d', name])
|
|
93
|
+
result.deleted.push(name)
|
|
94
|
+
} catch {
|
|
95
|
+
result.failed.push(name)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return result
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// `fetch --prune` first, because `[gone]` is read from the remote-tracking refs and those outlive the
|
|
103
|
+
// remote branch until something prunes them.
|
|
104
|
+
async function prune(default_branch: string): Promise<PruneResult> {
|
|
105
|
+
await git_spawn.read(['fetch', '--prune'])
|
|
106
|
+
|
|
107
|
+
return await delete_each(await read_candidates(default_branch))
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const gone_branch = { parse_records, prune, select_prunable }
|
|
111
|
+
|
|
112
|
+
export type { BranchRecord, PruneResult }
|
|
113
|
+
export { gone_branch }
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
// The workflow label names, defined once. The epic auto-close, the epic validator, the issue-prep
|
|
2
|
+
// labeler and the next-issues display all key on these exact strings, and a drifted copy would
|
|
3
|
+
// fail silently — an epic filtered on the wrong name is simply never closed or never excluded.
|
|
4
|
+
const EPIC_LABEL = 'epic'
|
|
5
|
+
const IN_PROGRESS_LABEL = 'in-progress'
|
|
6
|
+
// Parks a child that cannot advance without a person deciding something. `epic:next` is what reads
|
|
7
|
+
// it: a parked child is why a run reports "nothing left that time will fix" rather than waiting
|
|
8
|
+
// forever (joshuafolkken/kit#860).
|
|
9
|
+
const NEEDS_DECISION_LABEL = 'needs-decision'
|
|
10
|
+
// Opts one issue outside any epic into unattended execution (joshuafolkken/kit#906). **Only a
|
|
11
|
+
// person applies it.** `epicrun #<E>` approves the merges inside `#<E>`; this label is the only way
|
|
12
|
+
// a person extends that approval past the epic's edge, so a label an AI could apply to itself would
|
|
13
|
+
// let an unattended run widen its own authorization — which is not a guard at all.
|
|
14
|
+
const AUTO_OK_LABEL = 'auto-ok'
|
|
15
|
+
// Degrades one issue's run to a `halfrun`-shaped stop: it is implemented and taken through the
|
|
16
|
+
// verification gate, and then nothing is committed, pushed, opened as a pull request or merged
|
|
17
|
+
// (joshuafolkken/kit#1125). **Only a person applies it**, exactly as strongly as `auto-ok` — a mark a
|
|
18
|
+
// run could clear for itself is not a mark.
|
|
19
|
+
//
|
|
20
|
+
// It is the opposite of `auto-ok` in what it does and its twin in who may apply it: one widens
|
|
21
|
+
// unattended execution past an epic's edge, the other withholds the last step of it. `auto-ok`
|
|
22
|
+
// answers "may this run at all", this one answers "may its result ship without a person looking".
|
|
23
|
+
//
|
|
24
|
+
// **Not `needs-decision`, and the difference is what the two sets below encode.** A parked issue is
|
|
25
|
+
// one a run must not *start*; this one is started, and only its ending is withheld. So it stays out
|
|
26
|
+
// of `NOT_DIRECTLY_RUNNABLE_LABELS` — an issue nobody would ever offer cannot be implemented — and
|
|
27
|
+
// out of `epic-busy.ts`'s parked set, because a stopped child leaves uncommitted work in the
|
|
28
|
+
// checkout and must go on holding the repository. Read as parked in either place, the next child
|
|
29
|
+
// would start on top of that work.
|
|
30
|
+
const NEEDS_HUMAN_REVIEW_LABEL = 'needs-human-review'
|
|
31
|
+
// Marks an issue whose work a run verified is **already merged** (joshuafolkken/kit#1679). Closing
|
|
32
|
+
// an Issue is Tier C, so a run that reaches that conclusion may not act on it — and before this
|
|
33
|
+
// label there was no exit that was not Tier C: `fullrun #1656` verified the work was already in
|
|
34
|
+
// `main` from joshuafolkken/kit#1623 and closed the Issue itself.
|
|
35
|
+
//
|
|
36
|
+
// **It is not `needs-decision`, and the difference is the whole reason it exists.** A parked issue
|
|
37
|
+
// waits for an answer nobody has given; this one has its answer already — the work is done, and all
|
|
38
|
+
// that is left is the close, which is a person's. Parked, it goes back into the offer the moment a
|
|
39
|
+
// person clears the label, and the next run repeats the same investigation.
|
|
40
|
+
//
|
|
41
|
+
// **Only a person removes it, by closing the issue.** A run applies it; nothing in the workflow
|
|
42
|
+
// takes it off, because taking it off asserts the work is *not* done, which is the same claim in
|
|
43
|
+
// reverse and is no more a run's to make.
|
|
44
|
+
const ALREADY_DONE_LABEL = 'already-done'
|
|
45
|
+
|
|
46
|
+
// The four labels that mean an open issue must not be handed to a run as it stands: an `epic`
|
|
47
|
+
// tracks a batch and is never run directly (its children are), `in-progress` is already claimed by
|
|
48
|
+
// a running workflow, `needs-decision` was parked precisely because it cannot advance without a
|
|
49
|
+
// person, and `already-done` names work that is already merged. Held here rather than in either
|
|
50
|
+
// caller because both the next-issues display and the `auto-ok` pickup ask the same question, and
|
|
51
|
+
// two copies would answer it differently the first time one of them gained another label.
|
|
52
|
+
//
|
|
53
|
+
// **`needs-human-review` is deliberately not among them.** It withholds the end of a run, not its
|
|
54
|
+
// start: an issue carrying it is implemented and verified like any other and only stops before the
|
|
55
|
+
// commit. Excluded here it would never be offered, so the work it asks a person to look at would
|
|
56
|
+
// never be produced — the label would silently become a second `needs-decision`.
|
|
57
|
+
const NOT_DIRECTLY_RUNNABLE_LABELS: ReadonlySet<string> = new Set([
|
|
58
|
+
EPIC_LABEL,
|
|
59
|
+
IN_PROGRESS_LABEL,
|
|
60
|
+
NEEDS_DECISION_LABEL,
|
|
61
|
+
ALREADY_DONE_LABEL,
|
|
62
|
+
])
|
|
63
|
+
|
|
64
|
+
// joshuafolkken/kit#1083: filing-route labels, applied at filing time so the backlog's composition —
|
|
65
|
+
// a review-cap carry-forward vs a split child vs a Tier A in-implementation filing — is countable
|
|
66
|
+
// with `gh api "repos/{owner}/{repo}/issues?labels=<route>"` instead of grepping issue bodies by
|
|
67
|
+
// hand, which is how the 2026-08-30 breakdown was produced and why it did not reproduce. Purely
|
|
68
|
+
// informational: unlike the three above, a route label says nothing about whether an issue may run,
|
|
69
|
+
// so none of them joins NOT_DIRECTLY_RUNNABLE_LABELS. The names are duplicated as literals in the
|
|
70
|
+
// filing procedures (prose cannot import this module); `scripts/rules/filing-route-label.test.ts` keys the
|
|
71
|
+
// docs to these constants so a filing command that drops the label fails rather than drifting.
|
|
72
|
+
//
|
|
73
|
+
// joshuafolkken/kit#1518 added a fourth: an interrupt is a defect found in *this* repository that
|
|
74
|
+
// does not block the run that found it, and which the WIP cap would otherwise push into the
|
|
75
|
+
// discretionary exit — the route joshuafolkken/kit#1517 took, surviving only as a comment on another
|
|
76
|
+
// issue. It is not `route:tier-a`: that one is a filing the run is blocked by (an upstream defect or
|
|
77
|
+
// a prerequisite), and reading the two as one is what lost #1517.
|
|
78
|
+
const INTERRUPT_ROUTE_LABEL = 'route:interrupt'
|
|
79
|
+
const REVIEW_CAP_ROUTE_LABEL = 'route:review-cap'
|
|
80
|
+
const SPLIT_ROUTE_LABEL = 'route:split'
|
|
81
|
+
const TIER_A_ROUTE_LABEL = 'route:tier-a'
|
|
82
|
+
|
|
83
|
+
// The route labels with the metadata `gh api ... labels` needs, in one place so a repository is
|
|
84
|
+
// provisioned from the single source rather than from scattered creation commands. Applying one at
|
|
85
|
+
// issue-creation time already auto-creates a missing label (REST, with a generated color and no
|
|
86
|
+
// description); creating them here first is what gives each its stable color and description.
|
|
87
|
+
const FILING_ROUTE_LABELS: ReadonlyArray<{
|
|
88
|
+
name: string
|
|
89
|
+
color: string
|
|
90
|
+
description: string
|
|
91
|
+
}> = [
|
|
92
|
+
{
|
|
93
|
+
name: INTERRUPT_ROUTE_LABEL,
|
|
94
|
+
// Not `5319e7`, which is the `epic` label's purple: in a listing an interrupt would render as
|
|
95
|
+
// an epic, and the two are read at a glance rather than by name.
|
|
96
|
+
color: '1d76db',
|
|
97
|
+
// Keyed to the tests rather than to severity. "A serious defect" is the self-assessment
|
|
98
|
+
// `wip-cap.md` bans as a criterion, and this string is what a person reads in `gh label list`.
|
|
99
|
+
description: 'Filed past the WIP cap — meets one of the three interrupt tests (wip-cap.md)',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: REVIEW_CAP_ROUTE_LABEL,
|
|
103
|
+
color: 'eab308',
|
|
104
|
+
description:
|
|
105
|
+
"Filed by the review round cap's carry-forward (prompts/review.md → Review round cap)",
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: SPLIT_ROUTE_LABEL,
|
|
109
|
+
color: '0e8a16',
|
|
110
|
+
description: 'A child issue created by a split (split-assessment.md)',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: TIER_A_ROUTE_LABEL,
|
|
114
|
+
color: 'd93f0b',
|
|
115
|
+
description: 'Filed Tier A during implementation — an upstream defect or a prerequisite',
|
|
116
|
+
},
|
|
117
|
+
]
|
|
118
|
+
|
|
119
|
+
// joshuafolkken/kit#1729: the depth of an issue's subject, recorded as a label at filing time.
|
|
120
|
+
//
|
|
121
|
+
// **The definition is not here.** `.claude/skills/workflow-commands/observation-filing.md` → "The depth test",
|
|
122
|
+
// is the single source: depth 0 is what a consumer of this package touches, depth 1 the run
|
|
123
|
+
// orchestration that executes an Issue, depth 2 what measures a run. These constants are the
|
|
124
|
+
// recording of that table, never a second copy of it — a label whose description restated the rule
|
|
125
|
+
// would be the clone `CLAUDE.md` prohibits, and the descriptions below therefore name the section
|
|
126
|
+
// rather than paraphrase it.
|
|
127
|
+
//
|
|
128
|
+
// **Why a label at all.** joshuafolkken/kit#1698 set a measurable target — the share of open issues
|
|
129
|
+
// at depth 0 — and left nothing that records a depth, so the share could only be obtained by reading
|
|
130
|
+
// every open issue's body by hand. Two hand counts a day apart disagreed on the denominator and were
|
|
131
|
+
// therefore not comparable, which is the failure a recorded label removes.
|
|
132
|
+
//
|
|
133
|
+
// **The depth is read off the subject, so a run applies it.** Unlike `auto-ok` and
|
|
134
|
+
// `needs-human-review` this is not a person's judgement about authorization; it is the same reading
|
|
135
|
+
// §2i already asks a run to make before it files, and none of the three withholds or widens anything
|
|
136
|
+
// a run may do.
|
|
137
|
+
const DEPTH_0_LABEL = 'depth:0'
|
|
138
|
+
const DEPTH_1_LABEL = 'depth:1'
|
|
139
|
+
const DEPTH_2_LABEL = 'depth:2'
|
|
140
|
+
|
|
141
|
+
// Ordered shallowest first, which is what makes `depth_label_of` deterministic: an issue carrying
|
|
142
|
+
// more than one depth label counts as the **lowest** depth present, the one closest to the consumer.
|
|
143
|
+
// Without a fixed tie-break the same listing measured twice could answer differently, which is the
|
|
144
|
+
// whole defect joshuafolkken/kit#1729 was filed for.
|
|
145
|
+
const DEPTH_LABEL_ORDER: ReadonlyArray<string> = [DEPTH_0_LABEL, DEPTH_1_LABEL, DEPTH_2_LABEL]
|
|
146
|
+
|
|
147
|
+
// The metadata `gh api ... labels` needs, in the shape `FILING_ROUTE_LABELS` above uses and for the
|
|
148
|
+
// same reason: applying a label at issue-creation auto-creates it with a generated color and no
|
|
149
|
+
// description, so provisioning from here is what gives each one a stable color a reader can scan by.
|
|
150
|
+
// Green, amber and pale blue, so the consumer-facing depth is the one that stands out in a listing.
|
|
151
|
+
//
|
|
152
|
+
// **The provisioning command lives in `observation-filing.md`**, because prose cannot import this module —
|
|
153
|
+
// the same split `FILING_ROUTE_LABELS` above lives with. `scripts/rules/issue-depth-label.test.ts` keys
|
|
154
|
+
// those three command lines to this array, so a color changed here without the document fails.
|
|
155
|
+
const DEPTH_LABELS: ReadonlyArray<{
|
|
156
|
+
name: string
|
|
157
|
+
color: string
|
|
158
|
+
description: string
|
|
159
|
+
}> = [
|
|
160
|
+
{
|
|
161
|
+
name: DEPTH_0_LABEL,
|
|
162
|
+
color: '0e8a16',
|
|
163
|
+
description: 'Depth 0 — what a consumer of this package touches (SKILL.md §2i)',
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: DEPTH_1_LABEL,
|
|
167
|
+
color: 'fbc02d',
|
|
168
|
+
description: 'Depth 1 — the run orchestration that executes an Issue (SKILL.md §2i)',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
name: DEPTH_2_LABEL,
|
|
172
|
+
color: 'c5def5',
|
|
173
|
+
description: 'Depth 2 — what measures a run (SKILL.md §2i)',
|
|
174
|
+
},
|
|
175
|
+
]
|
|
176
|
+
|
|
177
|
+
// The shape `gh issue list --json labels` returns; narrowed here so the predicate below takes any
|
|
178
|
+
// listing row without importing a schema.
|
|
179
|
+
interface LabelReference {
|
|
180
|
+
name: string
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// GitHub keeps the casing a label was created with and treats `Epic` and `epic` as one label, so a
|
|
184
|
+
// repository that predates these scripts can answer with either spelling — every membership test
|
|
185
|
+
// lowercases, which is why the comparison lives here rather than at each call site.
|
|
186
|
+
function has_any_label(
|
|
187
|
+
labels: ReadonlyArray<LabelReference> | undefined,
|
|
188
|
+
wanted: ReadonlySet<string>,
|
|
189
|
+
): boolean {
|
|
190
|
+
return (labels ?? []).some((label) => wanted.has(label.name.toLowerCase()))
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// **The spelling GitHub actually stored**, matched by the same case-insensitive comparison every
|
|
194
|
+
// membership test above uses, or `undefined` where the issue does not carry the label at all.
|
|
195
|
+
//
|
|
196
|
+
// A membership test answers whether the label is there; a *removal* has to name it, and
|
|
197
|
+
// `DELETE …/issues/<N>/labels/<name>` names it in the path. Lowercasing the wanted name and sending
|
|
198
|
+
// that would be a second comparison — GitHub's, on a spelling we did not read — so the removal reads
|
|
199
|
+
// the stored one and sends it back (joshuafolkken/kit#1794).
|
|
200
|
+
function label_name_of(labels: ReadonlyArray<string>, wanted: string): string | undefined {
|
|
201
|
+
const target = wanted.toLowerCase()
|
|
202
|
+
|
|
203
|
+
return labels.find((label) => label.toLowerCase() === target)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// The same comparison for a caller holding label *names* rather than listing rows. `EpicChild.labels`
|
|
207
|
+
// is an array of strings (`scripts/epic/epic-graph.ts`), which is the one shape `has_any_label` cannot
|
|
208
|
+
// take — so `epic-classify.ts` and `git-epic-validate.ts` each grew a raw case-sensitive
|
|
209
|
+
// `Array.includes` instead, and an `Epic`-cased label walked past both. Kept here beside the rule it
|
|
210
|
+
// implements rather than at either call site, for the reason the comment above gives.
|
|
211
|
+
//
|
|
212
|
+
// Expressed through `label_name_of` rather than repeating its `.toLowerCase()` loop: one comparison,
|
|
213
|
+
// so a membership test and a removal can never disagree about what counts as the same label.
|
|
214
|
+
function has_label_name(labels: ReadonlyArray<string>, wanted: string): boolean {
|
|
215
|
+
return label_name_of(labels, wanted) !== undefined
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// The depth recorded on one listing row, or `undefined` where none is — the reading every share
|
|
219
|
+
// measurement makes. Lowercased through the same comparison as every other membership test above,
|
|
220
|
+
// because GitHub keeps the casing a label was created with and `Depth:0` is the same label.
|
|
221
|
+
function depth_label_of(labels: ReadonlyArray<LabelReference> | undefined): string | undefined {
|
|
222
|
+
const names = new Set((labels ?? []).map((label) => label.name.toLowerCase()))
|
|
223
|
+
|
|
224
|
+
return DEPTH_LABEL_ORDER.find((name) => names.has(name))
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Every workflow label this package manages. The label-reference scan
|
|
228
|
+
// (`scripts/document/label-reference.test.ts`, joshuafolkken/kit#1923) reads this to check that no
|
|
229
|
+
// document operates on a label name that does not exist here — a stale or mistyped `labels[]=…`
|
|
230
|
+
// otherwise fails silently at run time. One source, so a label added above joins the scan without a
|
|
231
|
+
// second edit.
|
|
232
|
+
// Applied to an Issue whose second review round was skipped, so the condition stays auditable
|
|
233
|
+
// (`prompts/review.md` → "When round 2 is skipped entirely, and when it is not"). Provisioned inline
|
|
234
|
+
// by the run that applies it rather than through `FILING_ROUTE_LABELS`, but still a managed label the
|
|
235
|
+
// documents operate on, so the label-reference scan has to know it.
|
|
236
|
+
const REVIEW_ROUND2_SKIPPED_LABEL = 'review-round2-skipped'
|
|
237
|
+
|
|
238
|
+
const ALL_LABELS: ReadonlySet<string> = new Set([
|
|
239
|
+
EPIC_LABEL,
|
|
240
|
+
IN_PROGRESS_LABEL,
|
|
241
|
+
NEEDS_DECISION_LABEL,
|
|
242
|
+
AUTO_OK_LABEL,
|
|
243
|
+
NEEDS_HUMAN_REVIEW_LABEL,
|
|
244
|
+
ALREADY_DONE_LABEL,
|
|
245
|
+
INTERRUPT_ROUTE_LABEL,
|
|
246
|
+
REVIEW_CAP_ROUTE_LABEL,
|
|
247
|
+
REVIEW_ROUND2_SKIPPED_LABEL,
|
|
248
|
+
SPLIT_ROUTE_LABEL,
|
|
249
|
+
TIER_A_ROUTE_LABEL,
|
|
250
|
+
DEPTH_0_LABEL,
|
|
251
|
+
DEPTH_1_LABEL,
|
|
252
|
+
DEPTH_2_LABEL,
|
|
253
|
+
])
|
|
254
|
+
|
|
255
|
+
export {
|
|
256
|
+
ALL_LABELS,
|
|
257
|
+
ALREADY_DONE_LABEL,
|
|
258
|
+
AUTO_OK_LABEL,
|
|
259
|
+
depth_label_of,
|
|
260
|
+
DEPTH_0_LABEL,
|
|
261
|
+
DEPTH_1_LABEL,
|
|
262
|
+
DEPTH_2_LABEL,
|
|
263
|
+
DEPTH_LABEL_ORDER,
|
|
264
|
+
DEPTH_LABELS,
|
|
265
|
+
EPIC_LABEL,
|
|
266
|
+
FILING_ROUTE_LABELS,
|
|
267
|
+
has_any_label,
|
|
268
|
+
has_label_name,
|
|
269
|
+
IN_PROGRESS_LABEL,
|
|
270
|
+
INTERRUPT_ROUTE_LABEL,
|
|
271
|
+
label_name_of,
|
|
272
|
+
NEEDS_DECISION_LABEL,
|
|
273
|
+
NEEDS_HUMAN_REVIEW_LABEL,
|
|
274
|
+
NOT_DIRECTLY_RUNNABLE_LABELS,
|
|
275
|
+
REVIEW_CAP_ROUTE_LABEL,
|
|
276
|
+
REVIEW_ROUND2_SKIPPED_LABEL,
|
|
277
|
+
SPLIT_ROUTE_LABEL,
|
|
278
|
+
TIER_A_ROUTE_LABEL,
|
|
279
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { MAX_SCANNED } from './git-gh-issue-list'
|
|
2
|
+
|
|
3
|
+
// Why an open-issue listing stopped short of the end of the backlog, or that it did not
|
|
4
|
+
// (joshuafolkken/kit#1067).
|
|
5
|
+
//
|
|
6
|
+
// Every caller of `issue_list` asks this same question, and before this the answer was written
|
|
7
|
+
// out again at each of them — `rows.length >= LIMIT` in `epic:bundle` and the `auto-ok` pickup, a
|
|
8
|
+
// near-identical `cutoff_of` in `epic:audit`, and nothing at all in the two that most needed it. One
|
|
9
|
+
// definition instead, so a caller cannot quietly disagree with the others about what "I saw
|
|
10
|
+
// everything" means.
|
|
11
|
+
//
|
|
12
|
+
// The two cutoffs are told apart because they cite different numbers and send a reader to different
|
|
13
|
+
// knobs: `row_limit` is the caller's own `limit`, which it can raise, and `page_ceiling` is the
|
|
14
|
+
// paging's `MAX_PAGES`, which it cannot.
|
|
15
|
+
type ScanCutoff = 'none' | 'row_limit' | 'page_ceiling'
|
|
16
|
+
|
|
17
|
+
// The two are mutually exclusive by construction — the paging stops as soon as `limit` rows have
|
|
18
|
+
// been selected, so a listing that filled `limit` never reached the ceiling — and `row_limit` is
|
|
19
|
+
// checked first so that stays true even if the paging changes.
|
|
20
|
+
//
|
|
21
|
+
// Exactly `limit` rows answers `row_limit` though nothing may have been missed, and exactly
|
|
22
|
+
// `MAX_SCANNED` open items answers `page_ceiling` for the same boundary reason
|
|
23
|
+
// `git-gh-issue-list.ts` records. Erring toward "I may not have seen everything" is the safe
|
|
24
|
+
// direction for every caller here; the alternative spends a request on each capped run to rule out
|
|
25
|
+
// one boundary.
|
|
26
|
+
function cutoff_of(row_count: number, limit: number, is_capped: boolean): ScanCutoff {
|
|
27
|
+
if (row_count >= limit) return 'row_limit'
|
|
28
|
+
|
|
29
|
+
return is_capped ? 'page_ceiling' : 'none'
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// What the page ceiling cut off, said once. Each caller words its own *consequence* — an epic past
|
|
33
|
+
// the cut hides something different from a backlog issue past it — but the cause is one fact, and a
|
|
34
|
+
// second spelling of it would cite a number that does not match `MAX_SCANNED`.
|
|
35
|
+
const PAGE_CEILING_CAUSE = `stopped at the ${String(MAX_SCANNED)}-issue page ceiling`
|
|
36
|
+
|
|
37
|
+
// Why this listing stopped, as a phrase to drop into the caller's own sentence — or `undefined` when
|
|
38
|
+
// it ran out and there is nothing to say.
|
|
39
|
+
//
|
|
40
|
+
// `row_limit_cause` is passed rather than built here because the noun differs at every call site: an
|
|
41
|
+
// issue cap, an epic cap, a match cap. What is shared is the *dispatch* — which of the two numbers a
|
|
42
|
+
// reader has to be given — and writing it out at each caller is what let one of them cite the wrong
|
|
43
|
+
// one.
|
|
44
|
+
function cutoff_cause(cutoff: ScanCutoff, row_limit_cause: string): string | undefined {
|
|
45
|
+
if (cutoff === 'row_limit') return row_limit_cause
|
|
46
|
+
|
|
47
|
+
return cutoff === 'page_ceiling' ? PAGE_CEILING_CAUSE : undefined
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export type { ScanCutoff }
|
|
51
|
+
export { cutoff_of, cutoff_cause, PAGE_CEILING_CAUSE }
|