@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,242 @@
|
|
|
1
|
+
// The bare-`#N` predicate behind the `issue-citation` row of the stop guard (joshuafolkken/kit#2121),
|
|
2
|
+
// and the printing-side formatter that keeps a bare `#N` out of session-facing output in the first
|
|
3
|
+
// place (joshuafolkken/kit#2329).
|
|
4
|
+
//
|
|
5
|
+
// **Session-facing output cites an Issue as a number-link, never a bare `#N`.** `CLAUDE.md` and
|
|
6
|
+
// `prompts/collaboration-workflow/issue-citation.md` require `[#<N>](https://github.com/<owner>/<repo>/issues/<N>) — <short summary>`
|
|
7
|
+
// in what the person reads: a bare `#123` is not clickable and does not say which repository's Issue
|
|
8
|
+
// it is. The stop guard reads `last_assistant_message` — the turn's session-facing text — and this
|
|
9
|
+
// predicate answers whether a bare number slipped into it.
|
|
10
|
+
//
|
|
11
|
+
// **It blocks the stop, so a false positive costs a wasted turn** (joshuafolkken/kit#2247). The nudge
|
|
12
|
+
// now reaches the model rather than the person, so the detection is tightened to what is genuinely a
|
|
13
|
+
// bare citation: a `#N` inside a fenced code block, inside an inline-code span, on a quote line, or
|
|
14
|
+
// right after `PR` / `pull request` is not a citation slip and is skipped. The scan is line-based so
|
|
15
|
+
// each exclusion is decided from the one line the mention sits on.
|
|
16
|
+
//
|
|
17
|
+
// **`linkify` runs that same scan the other way** (joshuafolkken/kit#2329): a command whose stdout a
|
|
18
|
+
// run copies into its reply passes the text through it, and every bare `#N` the predicate would flag
|
|
19
|
+
// is rewritten to `[#N](url)` — which the predicate then reads as linked, so the material that fed the
|
|
20
|
+
// duplicate reply is fixed where it is printed rather than scolded after it reaches the screen. The
|
|
21
|
+
// same exclusions hold, so a `#N` in a fenced example or an already-linked reference is left untouched.
|
|
22
|
+
|
|
23
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
24
|
+
|
|
25
|
+
// An Issue number: `#` and its digits. One quantifier, no backtracking — the `#N` alone locates the
|
|
26
|
+
// mention, and any `owner/repo` prefix is read off the surrounding text (`repo_prefix`) rather than
|
|
27
|
+
// folded into the pattern, so the scan never carries two variable-length segments (sonar super-linear).
|
|
28
|
+
const ISSUE_NUMBER = /#\d+/gu
|
|
29
|
+
// The characters that bound an `owner/repo` prefix: whitespace, another `#`, and the brackets a
|
|
30
|
+
// citation or prose wraps a reference in. Tested one character at a time by the prefix scan, so that
|
|
31
|
+
// scan stays linear.
|
|
32
|
+
const REFERENCE_BOUNDARY = /[\s#()[\]<>|]/u
|
|
33
|
+
// A well-formed `owner/repo`: exactly one slash between two non-empty segments — the same shape
|
|
34
|
+
// `issue:cite`'s parser accepts. A path-like run (`src/lib`, `a/b/c`) is not one, so it is not emitted
|
|
35
|
+
// as a prefix that would make the suggested `issue:cite` call refuse the very reference it names.
|
|
36
|
+
const OWNER_REPO = /^[^\s/#]+\/[^\s/#]+$/u
|
|
37
|
+
// A markdown link, with its text captured as group 1: `[text](target)`. Each class excludes *both*
|
|
38
|
+
// of its delimiters — no `[`/`]` in the text, no `(`/`)` in the target — so neither star is ambiguous
|
|
39
|
+
// against a nested bracket and there is nothing to backtrack.
|
|
40
|
+
const MARKDOWN_LINK = /\[([^[\]]*)\]\([^()]*\)/gu
|
|
41
|
+
// A fenced-code delimiter line: three or more backticks or tildes after optional indentation — both
|
|
42
|
+
// delimiters CommonMark allows. Toggling on each one brackets the fenced block, so a `closes #N` shown
|
|
43
|
+
// in a `gh api` example never reads as a slip whichever fence the reply drew it with.
|
|
44
|
+
const FENCE_MARKER = /^\s*(?:`{3,}|~{3,})/u
|
|
45
|
+
// A quote line: a `>` after optional indentation. An Issue body quoted back carries its own `#N`, and
|
|
46
|
+
// a quote is not the run's own citation.
|
|
47
|
+
const QUOTE_LINE = /^\s*>/u
|
|
48
|
+
// A `#N` written as a PR reference: `PR` or `pull request` (word-bounded) right before it. `#N` alone
|
|
49
|
+
// cannot tell an Issue from a PR, but the preceding word can, and reading it needs no network round
|
|
50
|
+
// trip inside the hook.
|
|
51
|
+
const PR_PREFIX = /\b(?:pr|pull request)\s*$/iu
|
|
52
|
+
// Two backticks bracket one inline-code span, so an odd count of them before an index means the index
|
|
53
|
+
// sits inside a span.
|
|
54
|
+
const BACKTICK_PAIR = 2
|
|
55
|
+
|
|
56
|
+
// Whether a markdown link's *text* span — between the `[` and the `]`, never its `(target)` — covers
|
|
57
|
+
// `index`. A `#N` inside the text is the approved `[#N](url)` citation; one in the target is not
|
|
58
|
+
// reachable, since an issues URL carries no `#N`.
|
|
59
|
+
function text_span_covers(link: RegExpMatchArray, index: number): boolean {
|
|
60
|
+
const start = (link.index ?? 0) + 1
|
|
61
|
+
const end = start + (link[1] ?? '').length
|
|
62
|
+
|
|
63
|
+
return index >= start && index < end
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// The line is searched for a link whose text span covers this index, so `see [#12](url) and #34`
|
|
67
|
+
// reads the first as linked and the second as bare. The scan is line-based (`is_bare_at` passes one
|
|
68
|
+
// line), so a link and the `#N` it wraps must sit on the same line — which they always do.
|
|
69
|
+
function is_linked_at(line: string, index: number): boolean {
|
|
70
|
+
for (const link of line.matchAll(MARKDOWN_LINK)) {
|
|
71
|
+
if (text_span_covers(link, index)) return true
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return false
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// **The message text alone, never a GitHub-bound artifact.** An Issue body or comment is passed to
|
|
78
|
+
// `gh` as a `Bash` argument, not spoken in `last_assistant_message`, so those never reach here — which
|
|
79
|
+
// is exactly the "silent on GitHub-bound artifacts" behavior the issue asks for, obtained by what the
|
|
80
|
+
// stop guard reads rather than by a second exclusion here.
|
|
81
|
+
//
|
|
82
|
+
// The `owner/repo` written immediately before a `#N`, or '' when the mention is bare — the run of
|
|
83
|
+
// non-boundary characters ending at the `#`, kept only when it holds a `/`. Read backwards a
|
|
84
|
+
// character at a time so a repository name of any length costs its own length and no more.
|
|
85
|
+
function repo_prefix(message: string, hash_index: number): string {
|
|
86
|
+
let start = hash_index
|
|
87
|
+
while (start > 0 && !REFERENCE_BOUNDARY.test(message.charAt(start - 1))) start -= 1
|
|
88
|
+
|
|
89
|
+
const token = message.slice(start, hash_index)
|
|
90
|
+
|
|
91
|
+
return OWNER_REPO.test(token) ? token : ''
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Whether the index sits inside an inline-code span: an odd number of backticks precede it on the line.
|
|
95
|
+
function is_inline_code_at(line: string, index: number): boolean {
|
|
96
|
+
const backticks = line.slice(0, index).split('`').length - 1
|
|
97
|
+
|
|
98
|
+
return backticks % BACKTICK_PAIR === 1
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Whether the `#N` at this index on the line is a real bare citation rather than an excluded mention —
|
|
102
|
+
// a linked reference, an inline-code span, or a PR reference read off the word before it.
|
|
103
|
+
function is_bare_at(line: string, index: number): boolean {
|
|
104
|
+
if (is_linked_at(line, index) || is_inline_code_at(line, index)) return false
|
|
105
|
+
|
|
106
|
+
return !PR_PREFIX.test(line.slice(0, index))
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// One bare reference and where it sits on its line: the `#N` text, the index its `#` starts at, and
|
|
110
|
+
// the `owner/repo` prefix that precedes it (or ''). Shared so the collector and `linkify` read the
|
|
111
|
+
// line the same way and cannot drift about what counts as bare.
|
|
112
|
+
interface LineReference {
|
|
113
|
+
index: number
|
|
114
|
+
prefix: string
|
|
115
|
+
text: string
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// The bare references on one line, in order — the excluded mentions (linked, inline-code, PR) already
|
|
119
|
+
// dropped by `is_bare_at`, so a caller acts on citations alone.
|
|
120
|
+
function line_references(line: string): ReadonlyArray<LineReference> {
|
|
121
|
+
const references: Array<LineReference> = []
|
|
122
|
+
|
|
123
|
+
for (const match of line.matchAll(ISSUE_NUMBER)) {
|
|
124
|
+
const { index } = match
|
|
125
|
+
|
|
126
|
+
if (is_bare_at(line, index)) {
|
|
127
|
+
references.push({ index, prefix: repo_prefix(line, index), text: match[0] })
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return references
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// The bare references on one non-excluded line are appended in order, each carrying its `owner/repo`
|
|
135
|
+
// prefix when it had one.
|
|
136
|
+
function collect_line_references(line: string, found: Array<string>): void {
|
|
137
|
+
for (const reference of line_references(line)) found.push(`${reference.prefix}${reference.text}`)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// The message lines that sit outside every fenced-code block, with the fence delimiter lines
|
|
141
|
+
// themselves dropped: toggling on each delimiter brackets the block, so a `#N` shown in an example is
|
|
142
|
+
// never scanned.
|
|
143
|
+
function lines_outside_fences(message: string): ReadonlyArray<string> {
|
|
144
|
+
const lines: Array<string> = []
|
|
145
|
+
let is_in_fence = false
|
|
146
|
+
|
|
147
|
+
for (const line of message.split('\n')) {
|
|
148
|
+
if (FENCE_MARKER.test(line)) is_in_fence = !is_in_fence
|
|
149
|
+
else if (!is_in_fence) lines.push(line)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return lines
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// The run's own prose: the lines outside every fenced-code block and off every quote line. Shared with
|
|
156
|
+
// the filing-offer row of the stop guard (joshuafolkken/kit#2422), which asks the same "is this the
|
|
157
|
+
// run speaking, not an example or a quote" question of the same reply.
|
|
158
|
+
function prose_lines(message: string): ReadonlyArray<string> {
|
|
159
|
+
return lines_outside_fences(message).filter((line) => !QUOTE_LINE.test(line))
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// The bare references in the message, in the order they appear and de-duplicated: the block reason
|
|
163
|
+
// names them and turns them into `issue:cite` arguments, so a reference cited twice is not nudged
|
|
164
|
+
// about twice. Fenced-code blocks and quote lines are skipped, so a `#N` shown in an example or quoted
|
|
165
|
+
// from an Issue body is not read as the run's own citation.
|
|
166
|
+
function bare_references(message: string): ReadonlyArray<string> {
|
|
167
|
+
const found: Array<string> = []
|
|
168
|
+
|
|
169
|
+
for (const line of prose_lines(message)) collect_line_references(line, found)
|
|
170
|
+
|
|
171
|
+
return [...new Set(found)]
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function has_bare_reference(message: string): boolean {
|
|
175
|
+
return bare_references(message).length > 0
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// The token `issue:cite` takes for one reference: a qualified `owner/repo#N` is passed as-is, a bare
|
|
179
|
+
// `#N` loses its `#` so the command reads `issue:cite 123` rather than `issue:cite #123`.
|
|
180
|
+
function cite_argument(reference: string): string {
|
|
181
|
+
return reference.startsWith('#') ? reference.slice(1) : reference
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function cite_arguments(references: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
185
|
+
return references.map((reference) => cite_argument(reference))
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// One bare reference rewritten as a number-link: `[#N](url)` for a same-repo mention, or
|
|
189
|
+
// `[owner/repo#N](url)` for a qualified one — the label is the reference exactly as it was written, so
|
|
190
|
+
// the reader sees the number they would have, now clickable. The URL is `issue-cite`'s own assembly,
|
|
191
|
+
// reused rather than restated so the two agree on the shape of a link.
|
|
192
|
+
function reference_link(reference: LineReference, default_slug: string): string {
|
|
193
|
+
const slug = reference.prefix === '' ? default_slug : reference.prefix
|
|
194
|
+
const number = reference.text.slice(1)
|
|
195
|
+
|
|
196
|
+
return `[${reference.prefix}${reference.text}](${issue_cite.issue_url(slug, number)})`
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// One eligible line with every bare reference rewritten, left to right: a reference spans its
|
|
200
|
+
// `owner/repo` prefix through its `#N`, so the slice before it ends where the prefix begins and the
|
|
201
|
+
// cursor resumes after the `#N`.
|
|
202
|
+
function linkify_line(line: string, slug: string): string {
|
|
203
|
+
let result = ''
|
|
204
|
+
let cursor = 0
|
|
205
|
+
|
|
206
|
+
for (const reference of line_references(line)) {
|
|
207
|
+
const start = reference.index - reference.prefix.length
|
|
208
|
+
|
|
209
|
+
result += line.slice(cursor, start) + reference_link(reference, slug)
|
|
210
|
+
cursor = reference.index + reference.text.length
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return result + line.slice(cursor)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// A line is rewritten only outside a fenced block and off a quote line, and never the fence delimiter
|
|
217
|
+
// itself — the same three exclusions `bare_references` reads, so what `linkify` leaves bare is exactly
|
|
218
|
+
// what the predicate would not have flagged.
|
|
219
|
+
function rewrite_line(line: string, slug: string, is_in_fence: boolean): string {
|
|
220
|
+
if (is_in_fence || FENCE_MARKER.test(line) || QUOTE_LINE.test(line)) return line
|
|
221
|
+
|
|
222
|
+
return linkify_line(line, slug)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Session-facing text with every bare `#N` rewritten to a number-link against `slug` (`owner/repo`),
|
|
226
|
+
// so a command's stdout a run copies into its reply carries links rather than the bare references that
|
|
227
|
+
// fed the duplicate reply. Fence state is carried across lines, since a fenced block spans them.
|
|
228
|
+
function linkify(message: string, slug: string): string {
|
|
229
|
+
const out: Array<string> = []
|
|
230
|
+
let is_in_fence = false
|
|
231
|
+
|
|
232
|
+
for (const line of message.split('\n')) {
|
|
233
|
+
if (FENCE_MARKER.test(line)) is_in_fence = !is_in_fence
|
|
234
|
+
out.push(rewrite_line(line, slug, is_in_fence))
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return out.join('\n')
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const issue_citation = { bare_references, cite_arguments, has_bare_reference, linkify, prose_lines }
|
|
241
|
+
|
|
242
|
+
export { issue_citation }
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
2
|
+
import { bash_triggers } from './bash-triggers'
|
|
3
|
+
import { filing_cap } from './filing-cap'
|
|
4
|
+
import { shell_segments } from './shell-segments'
|
|
5
|
+
import { tail_commands } from './tail-commands'
|
|
6
|
+
|
|
7
|
+
// The trigger and the delivered text behind the `issue-fold` row of `delivered-rules.ts`
|
|
8
|
+
// (joshuafolkken/kit#2213).
|
|
9
|
+
//
|
|
10
|
+
// **A second filing in one run with no `pnpm josh issue:fold` in front of it, refused at that second
|
|
11
|
+
// filing.** A run that files several findings from one session should first ask whether they fold
|
|
12
|
+
// into one Issue — the filing-time counterpart to the split assessment. The **first** filing asks
|
|
13
|
+
// nothing: there is nothing yet to fold it with, which is why the rule stands down when no earlier
|
|
14
|
+
// filing is on the tail. From the second on the run holds two or more findings and the fold question
|
|
15
|
+
// binds. The input is mechanical — has the run filed before, did it fold — so it is a delivered rule
|
|
16
|
+
// rather than resident prose.
|
|
17
|
+
//
|
|
18
|
+
// **It is `issue-scout`'s shape, not `filing-cap`'s.** Once per run with an `already_satisfied`
|
|
19
|
+
// stand-down read off the tail: a filing with no prior filing is stood down (nothing to fold), and so
|
|
20
|
+
// is one the run has already folded. The refusal hands over the command rather than asking the run to
|
|
21
|
+
// "fold first". **No new predicate**: the filing trigger is `bash_triggers.is_issue_filing`, and the
|
|
22
|
+
// prior-filing count is `filing_cap.prior_filing_count`, both reused verbatim.
|
|
23
|
+
|
|
24
|
+
// `pnpm josh issue:fold`, the one act the rule asks for. The alias `isf` is expanded where the command
|
|
25
|
+
// is read, so the canonical name matches both spellings.
|
|
26
|
+
const FOLD_NAMES: ReadonlySet<string> = new Set(['issue:fold'])
|
|
27
|
+
|
|
28
|
+
// Keeping the rule: a call that runs the fold. Segment-wise, so a spelling quoted inside a filing's
|
|
29
|
+
// own body is not read as the fold that filing skipped.
|
|
30
|
+
function runs_the_fold(command: string): boolean {
|
|
31
|
+
return shell_segments
|
|
32
|
+
.segments_of(command)
|
|
33
|
+
.some((segment) => shell_segments.is_josh_command(segment, FOLD_NAMES))
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The `already_satisfied` stand-down. Two runs ask nothing new: one with no earlier filing — the first
|
|
37
|
+
// filing has nothing to fold with — and one that has already folded. Only the second-or-later filing
|
|
38
|
+
// of an unfolded run is left for the delivery. `prior_filing_count` counts real filings, excluding a
|
|
39
|
+
// guard-refused one, exactly as `filing-cap` reads it (no clones).
|
|
40
|
+
function already_folded(tail: string, _call: GuardedCall): boolean {
|
|
41
|
+
if (filing_cap.prior_filing_count(tail) === 0) return true
|
|
42
|
+
|
|
43
|
+
return tail_commands.prior_bash_commands(tail).some((command) => runs_the_fold(command))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// The instruction in the shape a refusal can carry: what the call skipped, the criterion it reuses,
|
|
47
|
+
// and the command that fixes it. The default is named because it is the half that makes the rule
|
|
48
|
+
// believable — fold is what a session's several findings do unless the size clearly forbids it.
|
|
49
|
+
const ISSUE_FOLD_REASON =
|
|
50
|
+
'⛔ issue fold: this run has filed an Issue before and is filing another with no `pnpm josh ' +
|
|
51
|
+
'issue:fold` between them. Several findings from one session fold into one Issue by default — the ' +
|
|
52
|
+
'filing-time counterpart to the split assessment, whose two questions it reuses: are the findings ' +
|
|
53
|
+
'separable, and does the whole clearly exceed one verification gate (the size half is ' +
|
|
54
|
+
'`split:assess`, called not recomputed). Reissue after folding: `pnpm josh issue:fold "<title>" ' +
|
|
55
|
+
'"<title>" …` — `fold` means file one Issue covering them, `separate` means file them apart ' +
|
|
56
|
+
'(separable findings whose combined size clears the split guide), and the default is `fold`. Add ' +
|
|
57
|
+
'`--not-separable` when they are really one deliverable. The procedure is ' +
|
|
58
|
+
'`.claude/skills/workflow-commands/split-assessment.md` → "The question". It fires once per run ' +
|
|
59
|
+
'and cannot repeat on the call in hand.'
|
|
60
|
+
|
|
61
|
+
// The enumeration row itself, so `delivered-rules.ts` spreads one entry rather than restating the
|
|
62
|
+
// trigger and reason it already single-sources here. Once per run with the stand-down above.
|
|
63
|
+
const ROW = {
|
|
64
|
+
id: 'issue-fold',
|
|
65
|
+
is_trigger: bash_triggers.on_bash_command(bash_triggers.is_issue_filing),
|
|
66
|
+
reason: ISSUE_FOLD_REASON,
|
|
67
|
+
already_satisfied: already_folded,
|
|
68
|
+
keeps: bash_triggers.on_bash_command(runs_the_fold),
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const issue_fold = { ISSUE_FOLD_REASON, ROW, already_folded, runs_the_fold }
|
|
72
|
+
|
|
73
|
+
export { issue_fold }
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
2
|
+
import { bash_triggers } from './bash-triggers'
|
|
3
|
+
import { shell_segments } from './shell-segments'
|
|
4
|
+
import { tail_commands } from './tail-commands'
|
|
5
|
+
|
|
6
|
+
// The trigger and the delivered text behind the `issue-scout` row of `delivered-rules.ts`
|
|
7
|
+
// (joshuafolkken/kit#2119).
|
|
8
|
+
//
|
|
9
|
+
// **A filing without `pnpm josh issue:scout` in front of it, refused at the filing itself.** §2e
|
|
10
|
+
// requires the scout before every `gh api … issues` call, and a duplicate is likeliest for the work
|
|
11
|
+
// that just finished — the one case self-restraint is least able to catch. The input is mechanical —
|
|
12
|
+
// did the run already run the scout — so it is a delivered rule rather than resident prose.
|
|
13
|
+
//
|
|
14
|
+
// **It is `issue-comments`'s shape, not the WIP cap's.** Like that row it is once per run with an
|
|
15
|
+
// `already_satisfied` stand-down read off the tail, and the refusal hands over the command rather than
|
|
16
|
+
// asking the run to "scout first" — a body-only read is refused so the reissue makes the comments
|
|
17
|
+
// present, and here a scout-less filing is refused so the reissue makes the scout present. **No new
|
|
18
|
+
// delivery path**: the trigger is `bash_triggers.is_issue_filing`, reused verbatim.
|
|
19
|
+
|
|
20
|
+
// `pnpm josh issue:scout`, the one act the rule asks for. The alias `isc` is expanded where the
|
|
21
|
+
// command is read, so the canonical name matches both spellings (joshuafolkken/kit#1789).
|
|
22
|
+
const SCOUT_NAMES: ReadonlySet<string> = new Set(['issue:scout'])
|
|
23
|
+
|
|
24
|
+
// Keeping the rule: a call that runs the scout. Segment-wise, so a spelling quoted inside a filing's
|
|
25
|
+
// own body is not read as the scout that filing skipped.
|
|
26
|
+
function runs_the_scout(command: string): boolean {
|
|
27
|
+
return shell_segments
|
|
28
|
+
.segments_of(command)
|
|
29
|
+
.some((segment) => shell_segments.is_josh_command(segment, SCOUT_NAMES))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// The `already_satisfied` stand-down: the run has already scouted, so this filing asks for nothing new.
|
|
33
|
+
// The tool-name gate the row's trigger applies has already passed, so `call` only marks the shape; the
|
|
34
|
+
// answer is entirely in the tail.
|
|
35
|
+
function already_scouted(tail: string, _call: GuardedCall): boolean {
|
|
36
|
+
return tail_commands.prior_bash_commands(tail).some((command) => runs_the_scout(command))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// The instruction in the shape a refusal can carry: what the call skipped, why it matters most here,
|
|
40
|
+
// and the command that fixes it. The duplicate risk is named because it is the half that makes the
|
|
41
|
+
// rule believable — the filing most likely to duplicate is the one about work that just finished.
|
|
42
|
+
const ISSUE_SCOUT_REASON =
|
|
43
|
+
'⛔ issue scout: this files an Issue with no `pnpm josh issue:scout` earlier in the run. A ' +
|
|
44
|
+
'duplicate is likeliest for the work that just finished, which is exactly where self-restraint is ' +
|
|
45
|
+
'weakest. Reissue after scouting: `pnpm josh issue:scout "<title>"` (add `--body "<one-line ' +
|
|
46
|
+
'summary, citing #N where the work follows one>"` so the epic half can answer), then read its ' +
|
|
47
|
+
'`Duplicates:` — an **open** candidate covering the same work stops the run rather than filing a ' +
|
|
48
|
+
'second Issue, and a `(closed)` one means the work is already done — before reissuing this filing. ' +
|
|
49
|
+
'The procedure is `.claude/skills/workflow-commands/SKILL.md` → §2e. It fires once per run and ' +
|
|
50
|
+
'cannot repeat on the call in hand.'
|
|
51
|
+
|
|
52
|
+
// The enumeration row itself, so `delivered-rules.ts` spreads one entry rather than restating the
|
|
53
|
+
// trigger and reason it already single-sources here. Once per run with the stand-down above.
|
|
54
|
+
const ROW = {
|
|
55
|
+
id: 'issue-scout',
|
|
56
|
+
is_trigger: bash_triggers.on_bash_command(bash_triggers.is_issue_filing),
|
|
57
|
+
reason: ISSUE_SCOUT_REASON,
|
|
58
|
+
already_satisfied: already_scouted,
|
|
59
|
+
keeps: bash_triggers.on_bash_command(runs_the_scout),
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const issue_scout = { ISSUE_SCOUT_REASON, ROW, already_scouted, runs_the_scout }
|
|
63
|
+
|
|
64
|
+
export { issue_scout }
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
2
|
+
import { bash_triggers } from './bash-triggers'
|
|
3
|
+
import { shell_segments } from './shell-segments'
|
|
4
|
+
|
|
5
|
+
// The trigger and the delivered text behind the `josh-git-bare` row of `delivered-rules.ts`
|
|
6
|
+
// (joshuafolkken/kit#2297): a `pnpm josh git` issued without `-y` / `--yes`.
|
|
7
|
+
//
|
|
8
|
+
// **A bare `pnpm josh git` cannot succeed from an agent, and it wastes the time it takes to fail.** The
|
|
9
|
+
// command prompts to confirm the staging, and with no TTY the prompt falls to its cancel branch —
|
|
10
|
+
// `Checking unstaged files... Found` → `Operation cancelled.` — so the run throws the time away and then
|
|
11
|
+
// reissues with `-y` (about 31 seconds in one measured lane). The confirmation flag is what makes it the
|
|
12
|
+
// run's own unattended commit-push-PR step rather than a person's interactive invocation.
|
|
13
|
+
//
|
|
14
|
+
// **It is not `run-tail`.** That row governs a `pnpm josh git -y` push already carrying the flag, issued
|
|
15
|
+
// in the *foreground* rather than backgrounded; this one governs a push that carries *no* flag at all.
|
|
16
|
+
// The two triggers are disjoint by the flag — `run-tail` requires it, this refuses its absence — so no
|
|
17
|
+
// two rows claim one command, which `delivered-rules-bash.test.ts` pins.
|
|
18
|
+
//
|
|
19
|
+
// **The stop is one shell call, so the rule is delivered rather than resident**
|
|
20
|
+
// (`prompts/collaboration-workflow/rule-delivery.md`). It fires on every occurrence: a bare invocation
|
|
21
|
+
// wastes the same time every time it is issued, so refused-once-and-free-after would put the next one
|
|
22
|
+
// back on the run's self-restraint — the disposition `git-force.ts` takes for the same reason.
|
|
23
|
+
|
|
24
|
+
// The `josh git` subcommand, in canonical form. `shell_segments.is_josh_command` canonicalizes an alias
|
|
25
|
+
// (`g`) before the match, so `pnpm josh g` arrives as `git`.
|
|
26
|
+
const GIT_COMMAND: ReadonlySet<string> = new Set(['git'])
|
|
27
|
+
|
|
28
|
+
// The confirmation flags that make the invocation unattended. Either spelling is enough; the recovery
|
|
29
|
+
// form `pnpm josh git -y --skip-commit --skip-push` carries `-y` and so is not bare.
|
|
30
|
+
const CONFIRM_FLAGS: ReadonlySet<string> = new Set(['-y', '--yes'])
|
|
31
|
+
|
|
32
|
+
function has_confirm_flag(args: ReadonlyArray<string>): boolean {
|
|
33
|
+
return args.some((argument) => CONFIRM_FLAGS.has(argument))
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// A segment that invokes `pnpm josh git` with no confirmation flag. The command test comes first, so the
|
|
37
|
+
// argument read runs only on a `josh git` segment. Segment-wise and alias-expanded for the reason every
|
|
38
|
+
// command predicate in this directory is: one shell line carries several commands, and a name quoted
|
|
39
|
+
// inside a body is not the command being invoked.
|
|
40
|
+
function is_bare_segment(segment: string): boolean {
|
|
41
|
+
if (!shell_segments.is_josh_command(segment, GIT_COMMAND)) return false
|
|
42
|
+
|
|
43
|
+
return !has_confirm_flag(time_shell.josh_arguments(segment))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function is_bare_josh_git(command: string): boolean {
|
|
47
|
+
return shell_segments.segments_of(command).some((segment) => is_bare_segment(segment))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// The instruction in the shape a refusal can carry: what the bare call does, why it fails, and the one
|
|
51
|
+
// form that works. Apostrophes are avoided so the single-quoted literal needs no escaping, as the
|
|
52
|
+
// sibling reasons do.
|
|
53
|
+
const JOSH_GIT_BARE_REASON =
|
|
54
|
+
'⛔ bare `pnpm josh git`: this prompts to confirm the staging, and with no TTY the prompt falls to ' +
|
|
55
|
+
'its cancel branch — `Checking unstaged files... Found` then `Operation cancelled.` — so the call ' +
|
|
56
|
+
'throws away the time it takes to fail (about 31 seconds in one measured lane) and you reissue it ' +
|
|
57
|
+
'with `-y` anyway (joshuafolkken/kit#2297). Run it unattended from the start: ' +
|
|
58
|
+
'`pnpm josh git -y "<title> #<N>"`. The recovery form that opens the PR for a push that already ' +
|
|
59
|
+
'landed is `pnpm josh git -y --skip-commit --skip-push`. This rule fires on every occurrence, not ' +
|
|
60
|
+
'once per run.'
|
|
61
|
+
|
|
62
|
+
// The row itself, so `delivered-rules.ts` spreads one entry. `is_trigger` reads the input through
|
|
63
|
+
// `on_bash_command` — the `Bash` tool-name gate every command row shares — and `decide` returns true so
|
|
64
|
+
// it refuses every occurrence. It declares no `keeps`: the corrected call is `pnpm josh git -y`, which is
|
|
65
|
+
// `run-tail`'s push step and scored there, so this row is reported unmeasured rather than double-counting
|
|
66
|
+
// it (`git-force.ts`).
|
|
67
|
+
const ROW = {
|
|
68
|
+
id: 'josh-git-bare',
|
|
69
|
+
is_trigger: bash_triggers.on_bash_command(is_bare_josh_git),
|
|
70
|
+
reason: JOSH_GIT_BARE_REASON,
|
|
71
|
+
decide: (): boolean => true,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const josh_git_bare = {
|
|
75
|
+
JOSH_GIT_BARE_REASON,
|
|
76
|
+
ROW,
|
|
77
|
+
is_bare_josh_git,
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export { josh_git_bare }
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
2
|
+
import { bash_triggers } from './bash-triggers'
|
|
3
|
+
import { shell_segments } from './shell-segments'
|
|
4
|
+
|
|
5
|
+
// A dispatched lane child is stopped from running its parent's budget commands, and told the live
|
|
6
|
+
// carry record is its parent's rather than a competing run (joshuafolkken/kit#2267).
|
|
7
|
+
//
|
|
8
|
+
// **A child read its own parent as a competitor and refused to implement.** On 2026-09-21, inside
|
|
9
|
+
// `backlogrun #2252`, a lane launched for #2258 stopped before touching a line: the child ran
|
|
10
|
+
// `pnpm josh run:merge`, was answered `busy`, and read that as another session holding the run budget
|
|
11
|
+
// over the same Issue. It parked #2258 with `needs-decision` and exited. **The "other session" was the
|
|
12
|
+
// parent that launched it** — the parent holds the repository's one carry budget, and every lane
|
|
13
|
+
// shares the common git directory that budget is keyed on, so the live owner a lane child reads is
|
|
14
|
+
// always its parent. `run:merge` and `run:carry` are the parent's own budget/ownership commands; a
|
|
15
|
+
// child has no business running either, and the `busy` it gets back is never a competitor.
|
|
16
|
+
//
|
|
17
|
+
// **The judgement material already exists.** `JOSH_LANE_CHILD` (`lane-child-marker.ts`) is the same
|
|
18
|
+
// mechanical human-or-child fact the pre-gate cut and the interactive-ask refusal already read: a
|
|
19
|
+
// person working in a lane carries no mark and sees no refusal, and a mark naming a *different* issue
|
|
20
|
+
// leaked in from a parent session and is read as absent. The budget/ownership path reads it here so
|
|
21
|
+
// the parent's record is resolved as the child's own parent, not a conflict.
|
|
22
|
+
//
|
|
23
|
+
// **The stop is one shell call, so the rule is delivered rather than resident** — a lane child is
|
|
24
|
+
// always a `claude -p` process, so this leaves residency entirely
|
|
25
|
+
// (`prompts/collaboration-workflow/rule-delivery.md`). It fires on every occurrence, not once per run:
|
|
26
|
+
// a child must never run these commands, so the route is always "continue implementing", never a
|
|
27
|
+
// reissue — the disposition `git-force.ts` and `lane-interactive-ask.ts` take for the same
|
|
28
|
+
// "must never happen" reason.
|
|
29
|
+
|
|
30
|
+
// The parent backlogrun budget/ownership commands. A child never runs either: `run:carry` begins and
|
|
31
|
+
// advances the run budget the parent owns, and `run:merge` counts a returned child into it. Named in
|
|
32
|
+
// canonical form only — `shell_segments.is_josh_command` canonicalizes an alias (`rc`, `rmg`) before
|
|
33
|
+
// the match, so `pnpm josh rmg` arrives as `run:merge`.
|
|
34
|
+
const RUN_BUDGET_COMMANDS: ReadonlySet<string> = new Set(['run:merge', 'run:carry'])
|
|
35
|
+
|
|
36
|
+
// A segment that invokes one of the parent's budget commands. Segment-wise and alias-expanded for the
|
|
37
|
+
// reason every command predicate in this directory is: one shell line carries several commands, and a
|
|
38
|
+
// name quoted inside a body is not the command being invoked.
|
|
39
|
+
function invokes_budget_command(command: string): boolean {
|
|
40
|
+
return shell_segments
|
|
41
|
+
.segments_of(command)
|
|
42
|
+
.some((segment) => shell_segments.is_josh_command(segment, RUN_BUDGET_COMMANDS))
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// **The command test comes first and the world is consulted second**, so the `is_child_of` read — the
|
|
46
|
+
// dispatch mark against this checkout's own issue — runs only on the handful of calls that invoke a
|
|
47
|
+
// budget command, not on every `Bash` call in the run. A person working in a lane carries no mark and
|
|
48
|
+
// sees no refusal, exactly as `lane-park.ts` and `lane-interactive-ask.ts` gate their own reads.
|
|
49
|
+
function is_carry_conflict(
|
|
50
|
+
command: string,
|
|
51
|
+
is_lane_child: boolean = lane_child_marker.is_child_of(process.cwd()),
|
|
52
|
+
): boolean {
|
|
53
|
+
if (!invokes_budget_command(command)) return false
|
|
54
|
+
|
|
55
|
+
return is_lane_child
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// The instruction in the shape a refusal can carry: what the child cannot do, why the record is not a
|
|
59
|
+
// conflict, and the mechanical branch to take instead — continue, never park or ask. **The procedure
|
|
60
|
+
// is named, not restated** — its single sources are `pre-gate-cut.md` and `backlogrun-progress.md` →
|
|
61
|
+
// "The hand-off", and a second copy here would be the clone `CLAUDE.md` prohibits. Apostrophes are
|
|
62
|
+
// avoided so the single-quoted literal needs no escaping, as the sibling reasons do.
|
|
63
|
+
const LANE_CARRY_CONFLICT_REASON =
|
|
64
|
+
'⛔ lane child carry conflict: this session is a dispatched lane child, and ' +
|
|
65
|
+
'`pnpm josh run:merge` / `pnpm josh run:carry` are the parent backlogrun budget commands — a child ' +
|
|
66
|
+
'must never run them. The live carry record here belongs to the parent that launched this child, ' +
|
|
67
|
+
'not to a competing run: the parent holds the one run budget for the repository, and every lane ' +
|
|
68
|
+
'shares the common git directory it is keyed on, so a live owner a lane child reads is always its ' +
|
|
69
|
+
'parent (joshuafolkken/kit#2267, measured 2026-09-21 in backlogrun #2252 — a child read run:merge ' +
|
|
70
|
+
'`busy` as a competitor and parked #2258 unimplemented). Do not run this command, and do not treat ' +
|
|
71
|
+
'it as a conflict: no `needs-decision`, no `confirmation` Telegram, no question to a person — a ' +
|
|
72
|
+
'dispatched child cannot ask, and there is nothing to decide. Continue implementing this Issue; the ' +
|
|
73
|
+
'parent owns the budget and counts the outcome at the return. The procedure is ' +
|
|
74
|
+
'`.claude/skills/workflow-commands/pre-gate-cut.md` and `backlogrun-progress.md` → "The hand-off". ' +
|
|
75
|
+
'This rule fires on every occurrence, not once per run.'
|
|
76
|
+
|
|
77
|
+
// The row itself, so `delivered-rules.ts` spreads one entry. `is_trigger` reads the input through
|
|
78
|
+
// `on_bash_command` — the `Bash` tool-name gate every command row shares — and `decide` returns true
|
|
79
|
+
// so it refuses every occurrence. It declares no `keeps`: continuing is the absence of a call, not a
|
|
80
|
+
// call, so the row is reported unmeasured rather than scored on an act that does not exist
|
|
81
|
+
// (`git-force.ts`).
|
|
82
|
+
const ROW = {
|
|
83
|
+
id: 'lane-carry-conflict',
|
|
84
|
+
is_trigger: bash_triggers.on_bash_command(is_carry_conflict),
|
|
85
|
+
reason: LANE_CARRY_CONFLICT_REASON,
|
|
86
|
+
decide: (): boolean => true,
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const lane_carry_conflict = {
|
|
90
|
+
LANE_CARRY_CONFLICT_REASON,
|
|
91
|
+
ROW,
|
|
92
|
+
invokes_budget_command,
|
|
93
|
+
is_carry_conflict,
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export { lane_carry_conflict }
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { interactive_ask } from '#scripts/agent/interactive-ask'
|
|
2
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
3
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
4
|
+
|
|
5
|
+
// A dispatched lane child's interactive ask is refused and routed to the park procedure, delivered at
|
|
6
|
+
// the call it binds on (joshuafolkken/kit#2201).
|
|
7
|
+
//
|
|
8
|
+
// **This is joshuafolkken/kit#2034's rule, moved one tool-call earlier.** #2034 gave a lane child that
|
|
9
|
+
// stops for a decision the right instruction — park the question on the Issue before it notifies — but
|
|
10
|
+
// wired it to the `confirmation` notify. A child that reaches for `AskUserQuestion` never gets that
|
|
11
|
+
// far: the ask is refused by the harness, the turn ends there, and #2034's guard never fires. Measured
|
|
12
|
+
// on 2026-09-20 inside `backlogrun #2163 --only`: #2178's child hit a Tier B branch, called
|
|
13
|
+
// `AskUserQuestion`, was refused, and died with the question stranded in its exit record's
|
|
14
|
+
// `permission_denials`. So the trigger is the ask itself, not the stop that a routed child would have
|
|
15
|
+
// reached afterward.
|
|
16
|
+
//
|
|
17
|
+
// **A hook denial is guidance, where the harness's own denial is death.** The harness refuses an
|
|
18
|
+
// interactive ask in a headless session by ending the turn; this rule refuses the same call with a
|
|
19
|
+
// `PreToolUse` deny, which returns to the model with the park procedure — so the refusal becomes an
|
|
20
|
+
// instruction the child can act on rather than the end of its run. That is the same shape
|
|
21
|
+
// `prompts/collaboration-workflow/rule-delivery.md` names: a rule whose trigger is one tool call is
|
|
22
|
+
// delivered by a hook that refuses it and states the rule.
|
|
23
|
+
//
|
|
24
|
+
// **It fires on every occurrence, not once per run.** An interactive ask must never succeed in a lane
|
|
25
|
+
// child, so refused-once-and-free-after would put the second ask back on the harness's fatal denial —
|
|
26
|
+
// the disposition `git-force.ts` takes for the same "must never happen" reason. The child's route is
|
|
27
|
+
// always the park, never a reissue of the ask.
|
|
28
|
+
//
|
|
29
|
+
// **The world is consulted after the tool name, never on every call.** `is_child_of` reads the
|
|
30
|
+
// dispatch mark against this checkout's own issue; the tool-name test runs first, so a run that never
|
|
31
|
+
// asks pays nothing for it, and a person working in a lane carries no mark and sees no refusal.
|
|
32
|
+
|
|
33
|
+
function is_interactive_ask(
|
|
34
|
+
call: GuardedCall,
|
|
35
|
+
is_lane_child: boolean = lane_child_marker.is_child_of(process.cwd()),
|
|
36
|
+
): boolean {
|
|
37
|
+
if (!interactive_ask.is_interactive_tool(call.name)) return false
|
|
38
|
+
|
|
39
|
+
return is_lane_child
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// The instruction in the shape a refusal can carry: what the child cannot do, what to do instead, and
|
|
43
|
+
// the pointer to the procedure. **The park is named, not restated** — its single source is
|
|
44
|
+
// `backlogrun-park.md` → "park and continue", and a second copy here would be the clone `CLAUDE.md`
|
|
45
|
+
// prohibits. The one command is spelled so the child is not left to reconstruct it from a doc read.
|
|
46
|
+
const LANE_INTERACTIVE_ASK_REASON =
|
|
47
|
+
'⛔ lane child interactive ask: this session is a dispatched lane child and cannot ask a person, so ' +
|
|
48
|
+
'this call is refused. Left to run it would end the turn with nothing on the Issue — the parent then ' +
|
|
49
|
+
'finds an OPEN Issue with `in-progress` and no question (joshuafolkken/kit#2201; joshuafolkken/kit#2034 ' +
|
|
50
|
+
'placed the same rule one tool-call too late). Do not ask: park the decision instead. Apply ' +
|
|
51
|
+
'`needs-decision` and post a comment carrying the question, the options and whether work was stashed — ' +
|
|
52
|
+
"`gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=needs-decision'` then " +
|
|
53
|
+
'`pnpm josh issue:comment <N> --body-file <path>` — then send the ' +
|
|
54
|
+
'`confirmation` Telegram and stop. The procedure is ' +
|
|
55
|
+
'`.claude/skills/workflow-commands/pre-gate-cut.md` → "A lane child records its park before it stops", ' +
|
|
56
|
+
'and the park itself is `backlogrun-park.md` → "park and continue". This rule fires on every ' +
|
|
57
|
+
'occurrence, not once per run.'
|
|
58
|
+
|
|
59
|
+
// The row itself, so `delivered-rules.ts` spreads one entry. `decide` returns true so it refuses every
|
|
60
|
+
// occurrence; it declares no `keeps` — not asking is the absence of a call, not a call, so the row is
|
|
61
|
+
// reported unmeasured rather than scored on an act that does not exist (`git-force.ts`).
|
|
62
|
+
const ROW = {
|
|
63
|
+
id: 'lane-interactive-ask',
|
|
64
|
+
is_trigger: is_interactive_ask,
|
|
65
|
+
reason: LANE_INTERACTIVE_ASK_REASON,
|
|
66
|
+
decide: (): boolean => true,
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const lane_interactive_ask = { LANE_INTERACTIVE_ASK_REASON, ROW, is_interactive_ask }
|
|
70
|
+
|
|
71
|
+
export { lane_interactive_ask }
|