@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,397 @@
|
|
|
1
|
+
import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
|
|
2
|
+
import {
|
|
3
|
+
time_transcript_line,
|
|
4
|
+
type TranscriptLine,
|
|
5
|
+
} from '#scripts/time-runtime/time-transcript-line'
|
|
6
|
+
import { delivered_rules, type MeasuredRule } from './delivered-rules'
|
|
7
|
+
|
|
8
|
+
// What a rule is worth on the channel that carries it when its delivery has not fired
|
|
9
|
+
// (joshuafolkken/kit#1525).
|
|
10
|
+
//
|
|
11
|
+
// **It exists because the eviction order was decided by protection rather than by value.**
|
|
12
|
+
// `.claude/skills/workflow-commands/rule-residency.md` recorded that when a rule is trimmed to keep a
|
|
13
|
+
// byte count, the sentence that goes is the one no marker pinned (joshuafolkken/kit#951) — so the
|
|
14
|
+
// least-defended text leaves, never the least-useful. Nothing in the repository could tell the two
|
|
15
|
+
// apart: `scripts/josh/hook-decision.ts` keeps a once-per-run stamp that answers "has this fired
|
|
16
|
+
// yet", never "how often", and no other counter exists.
|
|
17
|
+
//
|
|
18
|
+
// **The window before a delivery fires is the rule's absence, and it is already recorded.** A
|
|
19
|
+
// trigger-delivered rule refuses at most once per run, so every session holds a stretch in which the
|
|
20
|
+
// hook has said nothing and only the carried text — the resident copy, where there is one — is
|
|
21
|
+
// asking for compliance. Whether the run complied in that stretch is visible in the transcript.
|
|
22
|
+
//
|
|
23
|
+
// **The unit of observation is a run, not a file.** A session's delegated units are separate
|
|
24
|
+
// transcripts, and counting them as sessions would score a parent that counted open Issues and then
|
|
25
|
+
// delegated the filing as "trigger reached, not kept" on the unit while missing it on the parent. So
|
|
26
|
+
// a caller hands in every text belonging to one run together, and the reading is taken across them.
|
|
27
|
+
//
|
|
28
|
+
// **A rule with no `keeps` predicate is reported as unmeasured rather than as compliant.** Naming
|
|
29
|
+
// the act that counts as keeping a rule is the rule's own business, so it lives on the enumeration
|
|
30
|
+
// beside the trigger; a rule that has not declared one is a rule nothing here can score. Scoring it
|
|
31
|
+
// 0 would read as "never kept" and scoring it 1 as "always kept", and both are claims the data does
|
|
32
|
+
// not make.
|
|
33
|
+
|
|
34
|
+
// Enough of a refusal to identify which rule spoke. The reasons share a `⛔ ` prefix and diverge
|
|
35
|
+
// immediately after it, so the first clause separates them without pinning a whole paragraph that
|
|
36
|
+
// re-wraps whenever the text is edited.
|
|
37
|
+
const REASON_SIGNATURE_LENGTH = 48
|
|
38
|
+
const PERCENT = 100
|
|
39
|
+
// **A refusal is an errored result, which is what separates it from a read of the file it is written
|
|
40
|
+
// in.** Every signature exists verbatim in the module its rule is written in — the six delivered
|
|
41
|
+
// rules in `scripts/rules/delivered-rules.ts`, the batching row's in
|
|
42
|
+
// `scripts/time/time-batch-guard.ts` — so a session that
|
|
43
|
+
// merely opened that file carries the text too — and did so in a result whose `is_error` is false.
|
|
44
|
+
//
|
|
45
|
+
// **That fact is read off the parsed block, never off the raw line** (joshuafolkken/kit#1642). The
|
|
46
|
+
// test it replaced was `line.includes('"is_error":true')`, which is two mistakes at once: it is
|
|
47
|
+
// whitespace- and key-order-sensitive, so a serializer emitting `"is_error": true` would take every
|
|
48
|
+
// rule's `refused` column to zero — indistinguishable from a hook that never fired — and it is
|
|
49
|
+
// scoped to the *line* rather than to the block, so an errored result sitting beside a successful
|
|
50
|
+
// one lent the successful one's text its failure.
|
|
51
|
+
|
|
52
|
+
interface RuleReading {
|
|
53
|
+
id: string
|
|
54
|
+
// Runs that reached the situation the rule governs. The denominator: a run that never reaches it
|
|
55
|
+
// says nothing about whether the rule would have been kept. **The trigger is that situation only
|
|
56
|
+
// for a rule whose trigger is a neutral act** — filing an Issue, reading one — which a run keeping
|
|
57
|
+
// the rule still performs. Where the trigger is the violation itself, a run that kept the rule
|
|
58
|
+
// never trips it, so the row declares `reaches` and a run counts once it has reached *either* —
|
|
59
|
+
// the union, which equals `reaches` for every row whose trigger it covers
|
|
60
|
+
// (joshuafolkken/kit#1643).
|
|
61
|
+
sessions: number
|
|
62
|
+
// Of those, the runs that kept the rule unaided — before the trigger fired, or without it firing
|
|
63
|
+
// at all, which is the ordinary case for a row that declares `reaches`. The compliance the carried
|
|
64
|
+
// text earns with no help from the hook.
|
|
65
|
+
unaided_kept: number
|
|
66
|
+
// Of those, the runs in which a refusal was actually delivered.
|
|
67
|
+
refusals: number
|
|
68
|
+
// Whether the rule declares what keeping it looks like. False makes `unaided_kept` meaningless.
|
|
69
|
+
is_measurable: boolean
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
interface IssuedCall {
|
|
73
|
+
name: string
|
|
74
|
+
input: unknown
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// **What a predicate is asked against beside the call: the turn it went out in, and the run it belongs
|
|
78
|
+
// to** (joshuafolkken/kit#1867). The two travel as one parameter because every observer below takes
|
|
79
|
+
// both, and passing them separately would put each one over the four-parameter limit. `run` is every
|
|
80
|
+
// call the run issued, in timeline order, so a predicate reading it sees the whole run whatever point
|
|
81
|
+
// of it the walk has reached — which is right for `reaches`, a question about *whether* the situation
|
|
82
|
+
// arose rather than about when.
|
|
83
|
+
//
|
|
84
|
+
// **The two predicates are not symmetric about it, and a `keeps` reading `run` would be wrong.**
|
|
85
|
+
// Keeping is deliberately gated on "before the trigger" — `observe_before_trigger` stops crediting
|
|
86
|
+
// once the refusal has landed, because compliance after it is the delivery's contribution rather than
|
|
87
|
+
// the carried text's. A `keeps` answering from the whole run would see straight past that gate and
|
|
88
|
+
// credit exactly the compliance this measurement exists to exclude.
|
|
89
|
+
interface CallContext {
|
|
90
|
+
turn: ReadonlyArray<IssuedCall>
|
|
91
|
+
run: ReadonlyArray<IssuedCall>
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
interface RuleState {
|
|
95
|
+
is_kept: boolean
|
|
96
|
+
is_reached: boolean
|
|
97
|
+
is_triggered: boolean
|
|
98
|
+
is_refused: boolean
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function blank_states(): Map<string, RuleState> {
|
|
102
|
+
const entries = delivered_rules.MEASURED_RULES.map((rule): [string, RuleState] => [
|
|
103
|
+
rule.id,
|
|
104
|
+
{ is_kept: false, is_reached: false, is_triggered: false, is_refused: false },
|
|
105
|
+
])
|
|
106
|
+
|
|
107
|
+
return new Map(entries)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// **Keeping only counts before the trigger.** After the refusal the run complies because it was made
|
|
111
|
+
// to, which is the delivery's contribution and not the carried text's.
|
|
112
|
+
//
|
|
113
|
+
// **A row may declare no call-shaped trigger at all** (joshuafolkken/kit#1792). The batching guard
|
|
114
|
+
// decides on the turns *behind* a call, so no predicate given one call could say whether it was
|
|
115
|
+
// about to be refused; what the transcript records instead is the refusal, and `observe_error` below
|
|
116
|
+
// is what closes the window for such a row.
|
|
117
|
+
function keeps_the_rule(rule: MeasuredRule, call: IssuedCall, context: CallContext): boolean {
|
|
118
|
+
return rule.keeps?.(call, context.turn, context.run) === true
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function is_the_trigger(rule: MeasuredRule, call: IssuedCall): boolean {
|
|
122
|
+
return rule.is_trigger?.(call) === true
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function observe_before_trigger(
|
|
126
|
+
rule: MeasuredRule,
|
|
127
|
+
state: RuleState,
|
|
128
|
+
call: IssuedCall,
|
|
129
|
+
context: CallContext,
|
|
130
|
+
): void {
|
|
131
|
+
if (state.is_triggered) return
|
|
132
|
+
|
|
133
|
+
if (keeps_the_rule(rule, call, context)) state.is_kept = true
|
|
134
|
+
if (is_the_trigger(rule, call)) state.is_triggered = true
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// **Reaching the situation is recorded whenever it happens, before the trigger or after.** It is the
|
|
138
|
+
// denominator, not the compliance: a run that pushed compliantly and then pushed again in the
|
|
139
|
+
// foreground still reached the situation exactly once as far as the reading is concerned.
|
|
140
|
+
function observe_call(
|
|
141
|
+
rule: MeasuredRule,
|
|
142
|
+
state: RuleState,
|
|
143
|
+
call: IssuedCall,
|
|
144
|
+
context: CallContext,
|
|
145
|
+
): void {
|
|
146
|
+
if (rule.reaches?.(call, context.turn, context.run) === true) state.is_reached = true
|
|
147
|
+
|
|
148
|
+
observe_before_trigger(rule, state, call, context)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// One transcript line, parsed once, as the two things a reading is taken from: the calls it issued
|
|
152
|
+
// and the bodies of the results the harness wrote back as failures.
|
|
153
|
+
interface DatedLine {
|
|
154
|
+
at_ms: number
|
|
155
|
+
message_id: string
|
|
156
|
+
calls: Array<IssuedCall>
|
|
157
|
+
errors: Array<string>
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function calls_of(parsed: TranscriptLine): Array<IssuedCall> {
|
|
161
|
+
return parsed.blocks
|
|
162
|
+
.filter((block) => block.type === cost_blocks.TOOL_USE_TYPE)
|
|
163
|
+
.map((block) => ({ name: block.name, input: block.input }))
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// `is_error` is three-valued, so the comparison is against `true` rather than a truthiness test: a
|
|
167
|
+
// block that carried no such field is a tool that reports no outcome, not a call that failed.
|
|
168
|
+
function errors_of(parsed: TranscriptLine): Array<string> {
|
|
169
|
+
return parsed.blocks
|
|
170
|
+
.filter((block) => block.is_error === true)
|
|
171
|
+
.map((block) => block.error_text)
|
|
172
|
+
.filter((text) => text !== '')
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function dated_line(line: string): DatedLine | undefined {
|
|
176
|
+
const parsed = line === '' ? undefined : time_transcript_line.parse_line(line)
|
|
177
|
+
|
|
178
|
+
if (parsed === undefined) return undefined
|
|
179
|
+
|
|
180
|
+
return {
|
|
181
|
+
at_ms: parsed.timestamp_ms,
|
|
182
|
+
message_id: parsed.message_id,
|
|
183
|
+
calls: calls_of(parsed),
|
|
184
|
+
errors: errors_of(parsed),
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// **A turn is a message id, not a line** (joshuafolkken/kit#1792). Claude Code writes one line per
|
|
189
|
+
// content block and repeats the message id on each, so a turn that thought and then issued two calls
|
|
190
|
+
// is three lines carrying one id — the same reading `time-round-trips.ts` takes, for the same reason.
|
|
191
|
+
// Read per line, a batched turn is indistinguishable from two turns of one call, which is the whole
|
|
192
|
+
// subject of the batching rule scored exactly backwards: measured that way over 297 recorded runs it
|
|
193
|
+
// read 3 kept of 276, against 47 refusals.
|
|
194
|
+
//
|
|
195
|
+
// **An absent id joins nothing, and the fold is by id rather than by adjacency.** The empty string is
|
|
196
|
+
// shared by every line that carries none — a result, an attachment, a queue record — so folding on it
|
|
197
|
+
// would merge unrelated turns; and those same lines sit *between* the blocks of one message, so a
|
|
198
|
+
// fold that only compared each entry with the one before it would split most batched turns back into
|
|
199
|
+
// single-call ones. Read that way over this checkout's last 8 sessions, 520 messages issued more than
|
|
200
|
+
// one call and only 58 turns came back with more than one. `time-round-trips.ts` → `turn_key` takes
|
|
201
|
+
// the same reading, and this is that function's shape: an id keys a turn, and a line without one is
|
|
202
|
+
// its own.
|
|
203
|
+
function turn_key(entry: DatedLine, index: number): string {
|
|
204
|
+
if (entry.message_id === time_transcript_line.NO_MESSAGE_ID) return `#${String(index)}`
|
|
205
|
+
|
|
206
|
+
return entry.message_id
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// **The turn a call belongs to, gathered by id but never moved** (joshuafolkken/kit#1804). A folded
|
|
210
|
+
// turn used to be *placed* where it opened, which both grouped a message's calls and reordered them:
|
|
211
|
+
// a background unit's call landing between two blocks of a parent message was read after the whole
|
|
212
|
+
// parent turn instead of at its own instant. This gathers each message's calls without touching the
|
|
213
|
+
// timeline order — the reading walks the lines in the order `dated_lines_of` sorted them and asks
|
|
214
|
+
// this map only for a call's siblings. A line with no id keys a turn of its own, so its context is
|
|
215
|
+
// its own calls.
|
|
216
|
+
function turns_by_key(entries: ReadonlyArray<DatedLine>): Map<string, Array<IssuedCall>> {
|
|
217
|
+
const turns = new Map<string, Array<IssuedCall>>()
|
|
218
|
+
|
|
219
|
+
for (const [index, entry] of entries.entries()) {
|
|
220
|
+
const key = turn_key(entry, index)
|
|
221
|
+
const opened = turns.get(key)
|
|
222
|
+
|
|
223
|
+
if (opened === undefined) turns.set(key, [...entry.calls])
|
|
224
|
+
else opened.push(...entry.calls)
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return turns
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// **A refusal's body is the reason and nothing else, from its first character.** The hook denies a
|
|
231
|
+
// call on behalf of the one row whose trigger fired and writes that row's reason back as the whole
|
|
232
|
+
// result, which is why the speaker is identified by what the body *opens* with rather than by what
|
|
233
|
+
// it carries somewhere inside.
|
|
234
|
+
//
|
|
235
|
+
// **That is what stops a dump of the enumeration being read as a refusal by every rule at once**
|
|
236
|
+
// (joshuafolkken/kit#1642). One `cat scripts/rules/delivered-rules.ts && false` writes a single
|
|
237
|
+
// errored result carrying all six reasons verbatim, and a containment test credited a refusal to
|
|
238
|
+
// each of them; the file opens with its imports, so under this test nothing claims it. Position is
|
|
239
|
+
// what separates the two, so no count of how many signatures appear is needed — and a body naming
|
|
240
|
+
// several can no longer be attributed to any of them.
|
|
241
|
+
function refused_id(text: string): string | undefined {
|
|
242
|
+
const found = delivered_rules.MEASURED_RULES.find((rule) =>
|
|
243
|
+
text.trimStart().startsWith(rule.reason.slice(0, REASON_SIGNATURE_LENGTH)),
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
return found?.id
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function observe_error(states: Map<string, RuleState>, text: string): void {
|
|
250
|
+
const id = refused_id(text)
|
|
251
|
+
const state = id === undefined ? undefined : states.get(id)
|
|
252
|
+
|
|
253
|
+
if (state === undefined) return
|
|
254
|
+
|
|
255
|
+
state.is_refused = true
|
|
256
|
+
// **A delivered refusal is the trigger, whatever a predicate said** (joshuafolkken/kit#1792). The
|
|
257
|
+
// hook refuses only where the rule bound, so the window in which compliance is the carried text's
|
|
258
|
+
// closes here — for the six rows this is already true by the time the result comes back, and for
|
|
259
|
+
// a row declaring no call-shaped trigger it is the only thing that can close it.
|
|
260
|
+
state.is_triggered = true
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function observe_for_rule(
|
|
264
|
+
rule: MeasuredRule,
|
|
265
|
+
state: RuleState,
|
|
266
|
+
calls: ReadonlyArray<IssuedCall>,
|
|
267
|
+
context: CallContext,
|
|
268
|
+
): void {
|
|
269
|
+
// This line's own calls, read in order; `context.turn` is every call the message issued, so a
|
|
270
|
+
// call's siblings are the rest of the turn it went out in even where the transcript split them
|
|
271
|
+
// across lines. The two coincide except when a message spans several lines
|
|
272
|
+
// (joshuafolkken/kit#1804).
|
|
273
|
+
for (const call of calls) observe_call(rule, state, call, context)
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function observe_calls(
|
|
277
|
+
states: Map<string, RuleState>,
|
|
278
|
+
calls: ReadonlyArray<IssuedCall>,
|
|
279
|
+
context: CallContext,
|
|
280
|
+
): void {
|
|
281
|
+
for (const rule of delivered_rules.MEASURED_RULES) {
|
|
282
|
+
const state = states.get(rule.id)
|
|
283
|
+
|
|
284
|
+
if (state !== undefined) observe_for_rule(rule, state, calls, context)
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function observe_line(
|
|
289
|
+
states: Map<string, RuleState>,
|
|
290
|
+
entry: DatedLine,
|
|
291
|
+
context: CallContext,
|
|
292
|
+
): void {
|
|
293
|
+
observe_calls(states, entry.calls, context)
|
|
294
|
+
|
|
295
|
+
for (const text of entry.errors) observe_error(states, text)
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// **One timeline, ordered by timestamp — not the files read back to back.** "Kept before the
|
|
299
|
+
// trigger" is a question about *when*, and a run's texts arrive newest-file-first from
|
|
300
|
+
// `list_sessions`. Concatenating them would let a filing in the parent precede the count made inside
|
|
301
|
+
// a unit that returned before it, scoring the run "trigger reached, not kept" — the same miscount
|
|
302
|
+
// the fold was introduced to remove, arrived at from the other side.
|
|
303
|
+
function dated_lines_of(text: string): Array<DatedLine> {
|
|
304
|
+
return text
|
|
305
|
+
.split('\n')
|
|
306
|
+
.map((line) => dated_line(line))
|
|
307
|
+
.filter((entry): entry is DatedLine => entry !== undefined)
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
function timeline_of(texts: ReadonlyArray<string>): Array<DatedLine> {
|
|
311
|
+
return texts
|
|
312
|
+
.flatMap((text) => dated_lines_of(text))
|
|
313
|
+
.toSorted((left, right) => left.at_ms - right.at_ms)
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Every text belonging to one run — the session transcript and the transcripts of the units it
|
|
317
|
+
// delegated — read as one timeline. The lines are walked in timestamp order; `turns_by_key` supplies
|
|
318
|
+
// each call the rest of its message as context, so grouping no longer reorders the reading
|
|
319
|
+
// (joshuafolkken/kit#1804), and the run's own calls ride beside it for the one predicate that has to
|
|
320
|
+
// ask about the run rather than the turn (joshuafolkken/kit#1867).
|
|
321
|
+
function read_run(texts: ReadonlyArray<string>): Map<string, RuleState> {
|
|
322
|
+
const states = blank_states()
|
|
323
|
+
const entries = timeline_of(texts)
|
|
324
|
+
const turns = turns_by_key(entries)
|
|
325
|
+
const run = entries.flatMap((entry) => entry.calls)
|
|
326
|
+
|
|
327
|
+
for (const [index, entry] of entries.entries()) {
|
|
328
|
+
const turn = turns.get(turn_key(entry, index)) ?? entry.calls
|
|
329
|
+
|
|
330
|
+
observe_line(states, entry, { turn, run })
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return states
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
function credit(reading: RuleReading, state: RuleState): void {
|
|
337
|
+
reading.sessions += 1
|
|
338
|
+
reading.unaided_kept += state.is_kept ? 1 : 0
|
|
339
|
+
reading.refusals += state.is_refused ? 1 : 0
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function reading_to_credit(
|
|
343
|
+
readings: Map<string, RuleReading>,
|
|
344
|
+
id: string,
|
|
345
|
+
state: RuleState,
|
|
346
|
+
): RuleReading | undefined {
|
|
347
|
+
return state.is_triggered || state.is_reached ? readings.get(id) : undefined
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function apply_run(readings: Map<string, RuleReading>, states: Map<string, RuleState>): void {
|
|
351
|
+
for (const [id, state] of states) {
|
|
352
|
+
const reading = reading_to_credit(readings, id, state)
|
|
353
|
+
|
|
354
|
+
if (reading !== undefined) credit(reading, state)
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function blank_readings(): Map<string, RuleReading> {
|
|
359
|
+
const entries = delivered_rules.MEASURED_RULES.map((rule): [string, RuleReading] => [
|
|
360
|
+
rule.id,
|
|
361
|
+
{
|
|
362
|
+
id: rule.id,
|
|
363
|
+
sessions: 0,
|
|
364
|
+
unaided_kept: 0,
|
|
365
|
+
refusals: 0,
|
|
366
|
+
is_measurable: rule.keeps !== undefined,
|
|
367
|
+
},
|
|
368
|
+
])
|
|
369
|
+
|
|
370
|
+
return new Map(entries)
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// The compliance the carried text earns on its own, as a percentage. `undefined` where the rule
|
|
374
|
+
// declares no `keeps` predicate; a rule no run reached is reported separately by `sessions`.
|
|
375
|
+
function unaided_rate(reading: RuleReading): number | undefined {
|
|
376
|
+
if (!reading.is_measurable || reading.sessions === 0) return undefined
|
|
377
|
+
|
|
378
|
+
return Math.round((reading.unaided_kept / reading.sessions) * PERCENT)
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// **Runs, not files.** Each element is every transcript belonging to one run, so a caller may read
|
|
382
|
+
// one run at a time and never hold the corpus.
|
|
383
|
+
function measure(runs: Iterable<ReadonlyArray<string>>): ReadonlyArray<RuleReading> {
|
|
384
|
+
const readings = blank_readings()
|
|
385
|
+
|
|
386
|
+
for (const texts of runs) apply_run(readings, read_run(texts))
|
|
387
|
+
|
|
388
|
+
// Enumeration order, so a caller's table matches the registry rather than insertion order.
|
|
389
|
+
return delivered_rules.MEASURED_RULES.map((rule) => readings.get(rule.id)).filter(
|
|
390
|
+
(reading): reading is RuleReading => reading !== undefined,
|
|
391
|
+
)
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
const rule_value = { REASON_SIGNATURE_LENGTH, measure, unaided_rate }
|
|
395
|
+
|
|
396
|
+
export type { RuleReading }
|
|
397
|
+
export { rule_value }
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
|
|
2
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
3
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
4
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
5
|
+
import { shell_segments } from './shell-segments'
|
|
6
|
+
|
|
7
|
+
// The trigger and the decision behind the `run-tail` row of `delivered-rules.ts`
|
|
8
|
+
// (joshuafolkken/kit#1510).
|
|
9
|
+
//
|
|
10
|
+
// **Two stops, one cause.** `fullrun #1501` ran 45m03s on about 17 minutes of work. Of the 25 idle
|
|
11
|
+
// minutes, 6m28s was a `pnpm josh git -y` issued in the **foreground** with a 900-second tool
|
|
12
|
+
// timeout — above the harness's 600-second cap, so the harness detached it at the cap and nothing
|
|
13
|
+
// read the output file afterwards — and 6m06s was bare CI: the push landed, the turn ended, and the
|
|
14
|
+
// merge started only when the person asked whether it was merging. Both halves handed the deciding
|
|
15
|
+
// of when to look back to something that was never going to decide it.
|
|
16
|
+
//
|
|
17
|
+
// **So the refusal is put in front of the foreground call, which is the last call before the seam.**
|
|
18
|
+
// A turn ending between the push and `pnpm josh followup` is an *absence* of a call, and no
|
|
19
|
+
// `PreToolUse` hook can see one; the foreground push is a call, and refusing it delivers both halves
|
|
20
|
+
// at the one moment they still bind. That is the same reading joshuafolkken/kit#1570 took for a wait
|
|
21
|
+
// timer and joshuafolkken/kit#1556 for a verification behind a pipe.
|
|
22
|
+
//
|
|
23
|
+
// **Backgrounding is what closes the seam, rather than a second rule about turns.** A command issued
|
|
24
|
+
// with `run_in_background` re-invokes the run when it exits, so the completion notification is what
|
|
25
|
+
// resumes the tail — not a person noticing the silence. joshuafolkken/kit#1333 had already
|
|
26
|
+
// established the same end state as a procedure, and symptom 2 is its regression; prose that had to
|
|
27
|
+
// be remembered was what regressed, so this time the moment is named as a call.
|
|
28
|
+
//
|
|
29
|
+
// **A call already made properly is not a trigger.** Reissued with `run_in_background`, the same
|
|
30
|
+
// command falls through and the run pays nothing — the shape `is_body_only_issue_read` takes for a
|
|
31
|
+
// read that already asked for the comments.
|
|
32
|
+
|
|
33
|
+
// **Anchored at the segment's command position, never searched anywhere in the line** — the
|
|
34
|
+
// correction `time-shell.ts` records for `JOSH_PATTERN`. This repository's commit messages and Issue
|
|
35
|
+
// comments name josh subcommands constantly, and a loose search would refuse a `git commit` whose
|
|
36
|
+
// message quotes the step.
|
|
37
|
+
//
|
|
38
|
+
// **What may stand in front of it is what `time-shell.ts`'s own walker skips**, so the two readers of
|
|
39
|
+
// one command cannot disagree: an opening subshell parenthesis, environment assignments, and the
|
|
40
|
+
// package-manager wrapper in either of its spellings. Left out, `JOSH_CI_TIMEOUT_SECONDS=600 pnpm
|
|
41
|
+
// josh git -y` and `(pnpm josh git -y)` are silently not the push step, and the run pays the tail the
|
|
42
|
+
// rule exists to stop. `g` is the alias `josh-command-map.ts` resolves to `git`.
|
|
43
|
+
const SEGMENT_PREFIX = String.raw`(?:\(\s*)?(?:[A-Za-z_][A-Za-z0-9_]*=\S*\s+)*(?:npx\s+|pnpm\s+(?:exec\s+|run\s+)?)?`
|
|
44
|
+
// A closing parenthesis ends a word as a space does, so every boundary below admits it — without
|
|
45
|
+
// that, a subshell defeats the flag test even where it does not defeat the command test.
|
|
46
|
+
const WORD_END = String.raw`(?=\s|$|\))`
|
|
47
|
+
const PUSH_STEP_SEGMENT = new RegExp(String.raw`^${SEGMENT_PREFIX}josh\s+(?:git|g)${WORD_END}`, 'u')
|
|
48
|
+
// The confirmation flag, which is what makes it the run's own commit-push-PR step rather than a
|
|
49
|
+
// person's interactive invocation.
|
|
50
|
+
const CONFIRMED_FLAG = new RegExp(String.raw`(?:^|\s)(?:-y|--yes)${WORD_END}`, 'u')
|
|
51
|
+
// **The documented recovery path is not this step.** `pnpm josh git -y --skip-commit --skip-push`
|
|
52
|
+
// opens the pull request for a push that already landed (`CLAUDE.md` → Git Rules): seconds, and no
|
|
53
|
+
// tail to save. Refusing it would spend a delivery on a call the rule has nothing to say about.
|
|
54
|
+
const SKIPS_THE_PUSH = new RegExp(String.raw`(?:^|\s)--skip-push${WORD_END}`, 'u')
|
|
55
|
+
|
|
56
|
+
// How the harness names a deliberately detached call. Its presence is the whole of the exemption:
|
|
57
|
+
// the completion notification exists, so nothing has to remember to look.
|
|
58
|
+
const BACKGROUND_KEY = 'run_in_background'
|
|
59
|
+
|
|
60
|
+
// **A flag is only a flag outside the quotes**, and `josh git` takes the pull-request title as a
|
|
61
|
+
// positional argument — so this repository's own titles quote flag names constantly. Left in, the
|
|
62
|
+
// commit that shipped this very rule (`… "Exclude --skip-push from the run-tail trigger #1510"`)
|
|
63
|
+
// would have exempted itself from it. Quoted spans are blanked rather than removed, so two words
|
|
64
|
+
// either side of one cannot be joined into a third.
|
|
65
|
+
const QUOTED_SPAN = /"[^"]*"|'[^']*'/gu
|
|
66
|
+
|
|
67
|
+
function flags_of(segment: string): string {
|
|
68
|
+
return segment.replaceAll(QUOTED_SPAN, ' ')
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function is_push_step_segment(segment: string): boolean {
|
|
72
|
+
if (!PUSH_STEP_SEGMENT.test(segment)) return false
|
|
73
|
+
|
|
74
|
+
const flags = flags_of(segment)
|
|
75
|
+
|
|
76
|
+
if (SKIPS_THE_PUSH.test(flags)) return false
|
|
77
|
+
|
|
78
|
+
return CONFIRMED_FLAG.test(flags)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Whether this command runs the commit, push and pull-request step. Judged from the call alone. */
|
|
82
|
+
function is_push_step(command: string): boolean {
|
|
83
|
+
return shell_segments.segments_of(command).some((segment) => is_push_step_segment(segment))
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function is_backgrounded(input: unknown): boolean {
|
|
87
|
+
if (!json_value.is_record(input)) return false
|
|
88
|
+
|
|
89
|
+
return input[BACKGROUND_KEY] === true
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The occasion this rule governs: the push step, in either spelling (joshuafolkken/kit#1643).
|
|
94
|
+
*
|
|
95
|
+
* It is the denominator `scripts/rules/rule-value.ts` reads for this row, because the trigger below
|
|
96
|
+
* fires only on the foreground spelling — a run that detached every push never trips it, so the rate
|
|
97
|
+
* would otherwise be taken over runs that pushed in the foreground at least once.
|
|
98
|
+
*
|
|
99
|
+
* **The tool name is checked here rather than through `on_bash_command`**, because the trigger and
|
|
100
|
+
* the compliance test both read a second field of the input and that helper hands over only the
|
|
101
|
+
* command string. Refusing a write tool is out of the question for the reason `delivered-rules.ts`
|
|
102
|
+
* gives — a denied `Edit` leaves its siblings applied and itself not.
|
|
103
|
+
*/
|
|
104
|
+
function is_push_step_call(call: GuardedCall): boolean {
|
|
105
|
+
if (call.name !== cost_blocks.BASH_TOOL) return false
|
|
106
|
+
|
|
107
|
+
return is_push_step(time_shell.bash_command(call.input))
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Keeping the rule: the same push step, issued detached. */
|
|
111
|
+
function is_backgrounded_push_step(call: GuardedCall): boolean {
|
|
112
|
+
if (!is_backgrounded(call.input)) return false
|
|
113
|
+
|
|
114
|
+
return is_push_step_call(call)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** The trigger: the push step issued in the foreground. */
|
|
118
|
+
function is_foreground_push_step(call: GuardedCall): boolean {
|
|
119
|
+
if (is_backgrounded(call.input)) return false
|
|
120
|
+
|
|
121
|
+
return is_push_step_call(call)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Fires on every foreground push, not once per run.
|
|
126
|
+
*
|
|
127
|
+
* **The subject is a recurring act, which is the test `DeliveredRule.decide` states.** Once per run
|
|
128
|
+
* is right for a rule a run then obeys — read the comments, count the Issues — because the refusal
|
|
129
|
+
* changes what the run *knows*. A push does not work that way: a `queue` or an `epicrun` issues one
|
|
130
|
+
* per child, and a round-2 fix commit issues a second inside a single `fullrun`. Refused once and
|
|
131
|
+
* free afterwards, every push but the first is back to the run's own self-restraint, which is the
|
|
132
|
+
* thing joshuafolkken/kit#1333 already measured failing.
|
|
133
|
+
*
|
|
134
|
+
* **It also removes the stand-aside this row has no use for.** `is_first_delivery` stays silent for
|
|
135
|
+
* ten seconds after the batching guard stamps any refusal; the push step is never a candidate of that
|
|
136
|
+
* guard, so standing aside there was pure loss — in a `fullrun` with one push, the rule would be lost
|
|
137
|
+
* for the whole run with nothing recorded to say so. A row that decides for itself is asked
|
|
138
|
+
* unconditionally, and this one records nothing, so `can_record` has nothing to protect.
|
|
139
|
+
*/
|
|
140
|
+
function decide(): boolean {
|
|
141
|
+
return true
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// The instruction in the shape a refusal can carry: what the call is about to cost, the reissue that
|
|
145
|
+
// avoids it, and the half a run forgets once the push has landed. The measurement is named because it
|
|
146
|
+
// is what makes the rule believable — the work was 17 minutes and the run was 45.
|
|
147
|
+
const RUN_TAIL_REASON =
|
|
148
|
+
'⛔ run tail: this issues the commit-push-PR step in the foreground, where the harness decides ' +
|
|
149
|
+
'when to stop waiting. Reissue it with `run_in_background` set. In `fullrun #1501` this call was ' +
|
|
150
|
+
'given a 900-second timeout, the harness detached it at its own 600-second cap, and nothing read ' +
|
|
151
|
+
'the output for a further 6m28s — 45m03s of wall clock on about 17 minutes of work ' +
|
|
152
|
+
'(joshuafolkken/kit#1510). **Never give a foreground call a timeout above the harness cap**: the ' +
|
|
153
|
+
'cap decides, not the number. A backgrounded call re-invokes you when it exits, so the completion ' +
|
|
154
|
+
'notification is what resumes the run. **When it arrives, the turn that reads it goes straight ' +
|
|
155
|
+
'through any branch-2 filing and `pnpm josh epic:bundle` to `pnpm josh followup` — the turn never ' +
|
|
156
|
+
'ends at the push.** CI went green 6m06s before the merge started in that run, and it started ' +
|
|
157
|
+
'only because the person asked; joshuafolkken/kit#1333 had already settled that the merge is ' +
|
|
158
|
+
'issued in the turn the review closes. While the push runs, do the work that writes nothing — ' +
|
|
159
|
+
'drafting the completion body to a file, deciding the branch-2 disposition. `pnpm josh followup` ' +
|
|
160
|
+
'itself stays in the **foreground** — nearly every step after it reads its result. But a tail ' +
|
|
161
|
+
'does follow the merge, measured at 3.0 min and 5.9% of a run (joshuafolkken/kit#1462), so ' +
|
|
162
|
+
'empty it beforehand: the steps that read the merge result stay after `followup`, and the rest ' +
|
|
163
|
+
'are composed in the turn that issues it, bar the one exception background-commands.md names. The ' +
|
|
164
|
+
'procedure is `.claude/skills/workflow-commands/background-commands.md`, "A command that can take ' +
|
|
165
|
+
'minutes is issued in the background". **This rule fires on every foreground push, not once per ' +
|
|
166
|
+
'run**, so ' +
|
|
167
|
+
'reissuing the same call in the foreground will be refused again.'
|
|
168
|
+
|
|
169
|
+
const run_tail = {
|
|
170
|
+
RUN_TAIL_REASON,
|
|
171
|
+
decide,
|
|
172
|
+
is_backgrounded_push_step,
|
|
173
|
+
is_foreground_push_step,
|
|
174
|
+
is_push_step,
|
|
175
|
+
is_push_step_call,
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export { run_tail }
|