@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,575 @@
|
|
|
1
|
+
import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
|
|
2
|
+
import { canonical_command } from '#scripts/josh/josh-command-map'
|
|
3
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
4
|
+
import { time_shell } from './time-shell'
|
|
5
|
+
|
|
6
|
+
const { BASH_TOOL } = cost_blocks
|
|
7
|
+
|
|
8
|
+
// What one call has to say about itself before anything can ask whether it could have gone out
|
|
9
|
+
// beside another (joshuafolkken/kit#1344).
|
|
10
|
+
//
|
|
11
|
+
// `time-round-trips.ts` counts how many times a run stopped, and `time-density.ts` says the count is
|
|
12
|
+
// too high while the run is still going. Neither can say **which** of those stops were avoidable, and
|
|
13
|
+
// that is the number joshuafolkken/kit#1344 was filed for: the estimate it carries — 33 of 136 round
|
|
14
|
+
// trips — was arithmetic on a target density, not a reading of what the run actually did.
|
|
15
|
+
//
|
|
16
|
+
// **Two facts, and both have to be read while the input is in hand.** A span keeps no input, for the
|
|
17
|
+
// reason `time-spans.ts` states beside `marker`: the tool's input is what decides the answer, and by
|
|
18
|
+
// the time anything aggregates, the input is gone. So this module answers at parse time and the span
|
|
19
|
+
// carries the answers, exactly as it already carries the phase marker.
|
|
20
|
+
//
|
|
21
|
+
// **The kind is an allow-list, never a deny-list.** A tool nobody classified must not count as
|
|
22
|
+
// bundleable merely because nobody excluded it — that is the direction that inflates the very figure
|
|
23
|
+
// this exists to establish. A missed entry under-reports, which is a floor; a wrong inclusion
|
|
24
|
+
// over-reports, which is a claim.
|
|
25
|
+
//
|
|
26
|
+
// **The targets are what makes a dependency visible without reading any output.** A call's result is
|
|
27
|
+
// deliberately not retained anywhere in this pipeline, so "did this call need that one's answer" can
|
|
28
|
+
// only be asked of the inputs. Two calls naming the same path — or one naming a directory the other
|
|
29
|
+
// reads inside of — are treated as ordered, which catches the search-then-read pair that is the most
|
|
30
|
+
// common real dependency in these transcripts. It also treats an unrelated pair that happens to share
|
|
31
|
+
// a path as ordered, which is the conservative half of the same rule.
|
|
32
|
+
|
|
33
|
+
// The tools whose calls are independent of one another by nature: they read, or they write a region
|
|
34
|
+
// of a file the harness applies in the order the turn issued them. Everything absent — `Task`,
|
|
35
|
+
// `Skill`, `AskUserQuestion`, `TodoWrite` — is either a delegation whose result the next call needs,
|
|
36
|
+
// or a stop for a person.
|
|
37
|
+
const BUNDLEABLE_TOOLS = new Set(['Edit', 'Glob', 'Grep', 'Read', 'WebFetch', 'WebSearch', 'Write'])
|
|
38
|
+
|
|
39
|
+
// The tools that launch a *fresh* subagent (joshuafolkken/kit#1854). Both spellings occur across
|
|
40
|
+
// harnesses — this one names it `Agent`, others `Task` — and `time-batch-guard.ts` already treats the
|
|
41
|
+
// two the same. They are deliberately not `time-parent-turns.ts`'s wider dispatch set: `SendMessage`
|
|
42
|
+
// continues an existing agent and is dependent by nature, so a fan-out could never have included it.
|
|
43
|
+
// **A launch is not bundleable** (it is absent from the set above), so it never enters the consecutive
|
|
44
|
+
// sequences; the spread-apart series in `time-agent-bundles.ts` is what reads this.
|
|
45
|
+
const LAUNCH_TOOLS = new Set(['Agent', 'Task'])
|
|
46
|
+
|
|
47
|
+
// A launch whose prompt builds on an earlier agent's *finding* rather than on the codebase as it
|
|
48
|
+
// stands — the one dependency `time-agent-bundles.ts` cannot see from an intervening write, because a
|
|
49
|
+
// read-only investigation chain writes nothing between its links (joshuafolkken/kit#1847). It is a
|
|
50
|
+
// marker scan and therefore a floor: a prompt that quotes the prior finding without any of these
|
|
51
|
+
// phrases reads as independent, which is the same output-only blind spot this module documents beside
|
|
52
|
+
// `targets`. It never over-calls — a marker present is treated as dependent, which drops the launch
|
|
53
|
+
// from the count.
|
|
54
|
+
const PRIOR_REFERENCE_MARKERS = [
|
|
55
|
+
'previous finding',
|
|
56
|
+
'prior finding',
|
|
57
|
+
'earlier finding',
|
|
58
|
+
'previous result',
|
|
59
|
+
'prior result',
|
|
60
|
+
'earlier result',
|
|
61
|
+
'based on the previous',
|
|
62
|
+
'based on the earlier',
|
|
63
|
+
'from the previous agent',
|
|
64
|
+
'from the prior agent',
|
|
65
|
+
'the finding above',
|
|
66
|
+
'as found earlier',
|
|
67
|
+
'as found above',
|
|
68
|
+
'building on the previous',
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
// The shell commands that inspect. A `Bash` call is bundleable only when its leading command — the
|
|
72
|
+
// word `time-spans.ts` already reads to label the row — is one of these.
|
|
73
|
+
//
|
|
74
|
+
// **`gh` is here because the Issue names `gh` queries as one of the three shapes that went out one
|
|
75
|
+
// per turn**, and its writes are excluded by the word scan below rather than by leaving the command
|
|
76
|
+
// out entirely. `git` is deliberately absent: `git status` and `git switch` are one word apart, and no
|
|
77
|
+
// reading of the leading word can tell them apart.
|
|
78
|
+
const READ_COMMANDS = new Set([
|
|
79
|
+
'awk',
|
|
80
|
+
'basename',
|
|
81
|
+
'cat',
|
|
82
|
+
'comm',
|
|
83
|
+
'cut',
|
|
84
|
+
'diff',
|
|
85
|
+
'dirname',
|
|
86
|
+
'du',
|
|
87
|
+
'echo',
|
|
88
|
+
'file',
|
|
89
|
+
'find',
|
|
90
|
+
'gh',
|
|
91
|
+
'grep',
|
|
92
|
+
'head',
|
|
93
|
+
'jq',
|
|
94
|
+
'ls',
|
|
95
|
+
'nl',
|
|
96
|
+
'printf',
|
|
97
|
+
'pwd',
|
|
98
|
+
'realpath',
|
|
99
|
+
'rg',
|
|
100
|
+
// **`sed -i` is deliberately not excluded.** An in-place edit is what `Edit` does, and `Edit` is on
|
|
101
|
+
// the allow-list above — a turn may issue several of them, so rejecting the shell spelling of the
|
|
102
|
+
// same thing would exclude a call the tool form counts. Two in-place edits of the *same* file are
|
|
103
|
+
// caught by the target test instead, which is where that ordering actually lives.
|
|
104
|
+
'sed',
|
|
105
|
+
'sort',
|
|
106
|
+
'stat',
|
|
107
|
+
'tail',
|
|
108
|
+
'tree',
|
|
109
|
+
'uniq',
|
|
110
|
+
'wc',
|
|
111
|
+
'which',
|
|
112
|
+
])
|
|
113
|
+
|
|
114
|
+
// Any of these anywhere in the command disqualifies it, whatever the leading word was. A chain is
|
|
115
|
+
// labelled by its first segment — `cat a && rm b` reads as `Bash: cat` — so the leading word alone
|
|
116
|
+
// says nothing about what the rest of the line does.
|
|
117
|
+
//
|
|
118
|
+
// **The `gh` write verbs are in the same set rather than a second one.** A scan that finds `create`
|
|
119
|
+
// inside a `grep` pattern rejects that call too, which is a call under-counted rather than a mutation
|
|
120
|
+
// counted as a read — the direction every rule in this module leans.
|
|
121
|
+
//
|
|
122
|
+
// **A redirection is deliberately absent.** `echo x > file` writes a file, which is what `Write` does,
|
|
123
|
+
// and `Write` is on the allow-list above — a turn may issue several of them, so rejecting the shell
|
|
124
|
+
// spelling of the same thing would exclude a call the tool form counts. What is rejected is work that
|
|
125
|
+
// changes state *other calls in the same turn would have to be ordered against*: the filesystem
|
|
126
|
+
// removals, and the `gh` verbs that write to GitHub.
|
|
127
|
+
const MUTATION_WORDS = new Set([
|
|
128
|
+
'--field',
|
|
129
|
+
'--method',
|
|
130
|
+
'--raw-field',
|
|
131
|
+
'-F',
|
|
132
|
+
'-X',
|
|
133
|
+
'-delete',
|
|
134
|
+
'-exec',
|
|
135
|
+
'-f',
|
|
136
|
+
'add',
|
|
137
|
+
'chmod',
|
|
138
|
+
'chown',
|
|
139
|
+
'close',
|
|
140
|
+
'comment',
|
|
141
|
+
'cp',
|
|
142
|
+
'create',
|
|
143
|
+
'dd',
|
|
144
|
+
'delete',
|
|
145
|
+
'edit',
|
|
146
|
+
'git',
|
|
147
|
+
'install',
|
|
148
|
+
'kill',
|
|
149
|
+
'ln',
|
|
150
|
+
'merge',
|
|
151
|
+
'mkdir',
|
|
152
|
+
'mv',
|
|
153
|
+
'node',
|
|
154
|
+
'npm',
|
|
155
|
+
'npx',
|
|
156
|
+
'pkill',
|
|
157
|
+
'pnpm',
|
|
158
|
+
'remove',
|
|
159
|
+
'rm',
|
|
160
|
+
'scp',
|
|
161
|
+
'secret',
|
|
162
|
+
'set',
|
|
163
|
+
'ssh',
|
|
164
|
+
'sudo',
|
|
165
|
+
'tee',
|
|
166
|
+
'touch',
|
|
167
|
+
'truncate',
|
|
168
|
+
'tsx',
|
|
169
|
+
'upload',
|
|
170
|
+
'wget',
|
|
171
|
+
])
|
|
172
|
+
|
|
173
|
+
// The read-only `pnpm josh` bookkeeping subcommands (joshuafolkken/kit#1875). Every `pnpm josh …`
|
|
174
|
+
// leads with `pnpm`, which is a mutation word above so the writing josh commands — `gate`, `followup`,
|
|
175
|
+
// `git` — are turned away; that same leading word turned the read-only ones away too, so the batching
|
|
176
|
+
// guard never saw the bookkeeping calls the Issue measured going out one per turn, and `Bundling:`
|
|
177
|
+
// never counted them recoverable. This is the read-only half, named canonically — an alias is resolved
|
|
178
|
+
// to its canonical name before the test. **A missed entry under-reports, which is a floor**, exactly
|
|
179
|
+
// as `READ_COMMANDS` does. **A subcommand that writes state or sends anything external is deliberately
|
|
180
|
+
// absent**: `run:progress --mark` writes a marker, `notify` sends a message, `main:sync` / `epic` /
|
|
181
|
+
// `run:hold` write — a wrong inclusion over-reports, which is a claim.
|
|
182
|
+
const READ_JOSH_SUBCOMMANDS: ReadonlySet<string> = new Set([
|
|
183
|
+
'backlog:budget',
|
|
184
|
+
'backlog:next',
|
|
185
|
+
'cost',
|
|
186
|
+
'delegate',
|
|
187
|
+
'epic:audit',
|
|
188
|
+
'epic:bundle',
|
|
189
|
+
'epic:check',
|
|
190
|
+
'epic:next',
|
|
191
|
+
'issue:read',
|
|
192
|
+
'issue:scout',
|
|
193
|
+
'issue:state',
|
|
194
|
+
'lane:list',
|
|
195
|
+
'latest:scope',
|
|
196
|
+
'release:scope',
|
|
197
|
+
'review:brief',
|
|
198
|
+
'review:round2',
|
|
199
|
+
'run:liveness',
|
|
200
|
+
])
|
|
201
|
+
|
|
202
|
+
// The launchers that put a `josh` subcommand on the line, and the word that names it. `pnpm josh`,
|
|
203
|
+
// `npx josh` and the bare `josh` name it as the word `josh`; `tsx scripts/josh/josh.ts` names it as a
|
|
204
|
+
// path ending in `josh.ts`. The subcommand is the token after whichever the scan finds first.
|
|
205
|
+
const JOSH_WORD = 'josh'
|
|
206
|
+
const JOSH_SCRIPT_SUFFIX = 'josh.ts'
|
|
207
|
+
|
|
208
|
+
// A shell operator that chains, pipes, redirects or substitutes. A `josh` read followed by one of
|
|
209
|
+
// these is not the simple bookkeeping call the allow-list is about, so it falls through to the ordinary
|
|
210
|
+
// read/mutation test rather than being trusted as a read — the same conservatism `has_mutation`
|
|
211
|
+
// applies to a `cat … && rm …` chain, which the launcher word `pnpm` would otherwise hide.
|
|
212
|
+
const COMMAND_CHAIN = /[|;&`>]|\$\(/u
|
|
213
|
+
|
|
214
|
+
// The subcommand token is split on whitespace alone, never `words_of`: the latter's separators include
|
|
215
|
+
// `:`, which would break `issue:state` into two tokens and lose the name.
|
|
216
|
+
const WHITESPACE_PATTERN = /\s+/u
|
|
217
|
+
|
|
218
|
+
// The input fields whose value *is* a target. Deliberately not every string field: `old_string`,
|
|
219
|
+
// `new_string` and `content` carry file bodies, and tokenizing those would pull every path the file
|
|
220
|
+
// happens to mention into the call's target set — where it would make unrelated calls look ordered.
|
|
221
|
+
const TARGET_FIELDS = ['file_path', 'notebook_path', 'path', 'url']
|
|
222
|
+
const TARGET_ARRAY_FIELD = 'file_paths'
|
|
223
|
+
|
|
224
|
+
// How many targets one call contributes. A `find` line naming twenty paths says nothing more about
|
|
225
|
+
// what it depends on than its first few do, and the set is carried on every span of a run.
|
|
226
|
+
const MAX_TARGETS = 8
|
|
227
|
+
|
|
228
|
+
const WORD_PATTERN = /[\s'"=(),;:|&]+/u
|
|
229
|
+
// The extension a path-shaped word may end in. Tested on the suffix alone rather than as an anchored
|
|
230
|
+
// alternation over the whole word, which backtracks super-linearly on a long token.
|
|
231
|
+
const EXTENSION_PATTERN = /^[A-Za-z]+$/u
|
|
232
|
+
const MAX_EXTENSION = 5
|
|
233
|
+
const AFTER_DOT = 1
|
|
234
|
+
// A dot at index 0 is a dotfile, not an extension, and `lastIndexOf` answers -1 for no dot at all.
|
|
235
|
+
const FIRST_INDEX = 0
|
|
236
|
+
// Trimmed with `startsWith` / `endsWith` rather than a regex: an unanchored `[…]+$` backtracks
|
|
237
|
+
// super-linearly on a long token, and the two forms that actually occur are one leading `./` and one
|
|
238
|
+
// trailing separator.
|
|
239
|
+
const CURRENT_DIRECTORY = './'
|
|
240
|
+
const LAST_CHARACTER = -1
|
|
241
|
+
const FLAG_PREFIX = '-'
|
|
242
|
+
const PATH_SEPARATOR = '/'
|
|
243
|
+
const MIN_TARGET_LENGTH = 3
|
|
244
|
+
|
|
245
|
+
// The tools that write. **Kept here rather than in the guard** (joshuafolkken/kit#1509): the guard
|
|
246
|
+
// held its own copy, and the sequence builder had no way to ask at all — so a run of edits to one
|
|
247
|
+
// file was read as a chain of dependent calls and no sequence ever formed. One answer, one place.
|
|
248
|
+
const WRITING_TOOLS: ReadonlySet<string> = new Set(['Edit', 'Write', 'NotebookEdit'])
|
|
249
|
+
|
|
250
|
+
// A shell line that writes even though its leading word reads. `sed` is the one that matters — it is
|
|
251
|
+
// in `READ_COMMANDS` because `sed -n` is a read, so `sed -i` would otherwise be classified as one.
|
|
252
|
+
const WRITING_WORDS: ReadonlySet<string> = new Set(['dd', 'sed', 'tee'])
|
|
253
|
+
|
|
254
|
+
const REDIRECTION = '>'
|
|
255
|
+
|
|
256
|
+
// The one bundleable shell spelling of an edit. `sed -n` prints and `sed -i` rewrites, so the flag is
|
|
257
|
+
// the whole of the difference.
|
|
258
|
+
const IN_PLACE_COMMAND = 'sed'
|
|
259
|
+
|
|
260
|
+
// The in-place flags, matched against one word at a time. `-i`, `-i.bak`, `--in-place=.bak` and a
|
|
261
|
+
// bundled `-ni` all write; `-n`, `-E` and `--expression` do not. The long form is anchored on its own
|
|
262
|
+
// because the short alternative cannot match a second leading dash.
|
|
263
|
+
//
|
|
264
|
+
// **A prefix test on `-i` alone missed the bundled spelling**, which is the one this repository's own
|
|
265
|
+
// instructions produce — `sed -ni 's/a/b/p'` wrote a file that `time-writes.ts` named in `writes`
|
|
266
|
+
// while this half answered `is_writing: false`, so one span contradicted itself.
|
|
267
|
+
const IN_PLACE_FLAG_PATTERN = /^--in-place\b|^-[A-Za-z]*i/u
|
|
268
|
+
|
|
269
|
+
// What a span carries so the sequences can be found later.
|
|
270
|
+
interface BundleFacts {
|
|
271
|
+
is_bundleable: boolean
|
|
272
|
+
targets: ReadonlyArray<string>
|
|
273
|
+
// Whether the call **certainly** rewrites what it names. **Two writes to one file do not depend on
|
|
274
|
+
// each other** — the text is already held, so both belong in one turn — while a write after a read
|
|
275
|
+
// of the same file genuinely does. `time-bundles.ts` reads this to tell the two apart
|
|
276
|
+
// (joshuafolkken/kit#1509).
|
|
277
|
+
is_writing: boolean
|
|
278
|
+
// Whether the call **might** write, which is a different question and needs the opposite bias.
|
|
279
|
+
//
|
|
280
|
+
// **The two were one field and that was a defect.** Refusing a write leaves a turn half applied, so
|
|
281
|
+
// the refusal test must over-call a line a write: a read wrongly excluded costs one un-refused
|
|
282
|
+
// call. The dependency test needs the opposite — a read wrongly called a write would have its
|
|
283
|
+
// dependency *removed*, so `sed -n '1,200p' x.ts` twice would read as a bundleable pair when the
|
|
284
|
+
// second may well have needed the first. Same bias, opposite consequences, so they are two fields.
|
|
285
|
+
may_write: boolean
|
|
286
|
+
// Whether this is a subagent launch whose prompt builds on an earlier launch's finding
|
|
287
|
+
// (joshuafolkken/kit#1854). `false` for every call that is not a launch, and for a launch whose
|
|
288
|
+
// prompt names no back-reference marker. `time-agent-bundles.ts` reads it to break a fan-out group
|
|
289
|
+
// that a read-only investigation chain would otherwise slip through, since such a chain writes
|
|
290
|
+
// nothing between its links for the intervening-write test to catch.
|
|
291
|
+
has_prior_reference: boolean
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// A function rather than a shared constant, so no two calls end up holding one `targets` array —
|
|
295
|
+
// belt and braces beside the `ReadonlyArray` above, which is what actually stops a writer. The two
|
|
296
|
+
// span constants in `time-spans.ts` are module-level and would otherwise share one array between
|
|
297
|
+
// every model and human span of a run.
|
|
298
|
+
function not_bundleable(): BundleFacts {
|
|
299
|
+
return {
|
|
300
|
+
is_bundleable: false,
|
|
301
|
+
targets: [],
|
|
302
|
+
is_writing: false,
|
|
303
|
+
may_write: false,
|
|
304
|
+
has_prior_reference: false,
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Whether a tool name is a fresh subagent launch. Exported so `time-agent-bundles.ts` reads the one
|
|
309
|
+
// set rather than keeping a second copy of it (joshuafolkken/kit#1854).
|
|
310
|
+
function is_launch_tool(name: string): boolean {
|
|
311
|
+
return LAUNCH_TOOLS.has(name)
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
function words_of(command: string): Array<string> {
|
|
315
|
+
return command.split(WORD_PATTERN).filter((word) => word !== '')
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// **A word is compared verbatim, never lower-cased or stripped of its flag dash.** `-X` is a flag and
|
|
319
|
+
// `-x` is a different one, and folding case would put both in one bucket. It does **not** keep a read
|
|
320
|
+
// out of the set: `-f` and `-F` are in it for `gh`, so `grep -F 'literal' path` is rejected too — a
|
|
321
|
+
// call under-counted, which is the direction this module leans everywhere.
|
|
322
|
+
function has_mutation(command: string): boolean {
|
|
323
|
+
return words_of(command).some((word) => MUTATION_WORDS.has(word))
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// The word after `josh` in a shell line, or `undefined` when the line invokes no `josh`. The launchers
|
|
327
|
+
// put `josh` at different offsets — `pnpm josh <sub>`, `npx josh <sub>`, the bare `josh <sub>`, and
|
|
328
|
+
// `tsx …/josh.ts <sub>` — so the subcommand is the token that follows the first of them the scan finds.
|
|
329
|
+
function josh_subcommand(command: string): string | undefined {
|
|
330
|
+
const tokens = command.split(WHITESPACE_PATTERN).filter((token) => token !== '')
|
|
331
|
+
const josh_index = tokens.findIndex(
|
|
332
|
+
(token) => token === JOSH_WORD || token.endsWith(JOSH_SCRIPT_SUFFIX),
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
return josh_index < FIRST_INDEX ? undefined : tokens[josh_index + 1]
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Whether a shell line is one of the read-only `josh` bookkeeping commands, and nothing else. A chained
|
|
339
|
+
// line falls through. An alias is resolved to its canonical name first — a run may type `josh ist` for
|
|
340
|
+
// `issue:state` — so the allow-list holds canonical names alone. Everything not on the list falls
|
|
341
|
+
// through to the read/mutation test, which is what keeps `josh gate` / `followup` / `git`
|
|
342
|
+
// non-bundleable (joshuafolkken/kit#1875).
|
|
343
|
+
function is_read_josh(command: string): boolean {
|
|
344
|
+
if (COMMAND_CHAIN.test(command)) return false
|
|
345
|
+
|
|
346
|
+
const subcommand = josh_subcommand(command)
|
|
347
|
+
if (subcommand === undefined) return false
|
|
348
|
+
|
|
349
|
+
return READ_JOSH_SUBCOMMANDS.has(canonical_command(subcommand))
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// **The conservative half.** A redirection writes whatever follows it, and the three words above
|
|
353
|
+
// write their argument. Kept wider than `has_mutation` deliberately, because it feeds the refusal
|
|
354
|
+
// test: over-calling a line a write costs one un-refused call, while under-calling it risks refusing
|
|
355
|
+
// an edit whose siblings would then land alone. It matches `>` as a character rather than a token, so
|
|
356
|
+
// `awk '$1 > 5'` is caught too — a call allowed that could have been refused, which is the safe
|
|
357
|
+
// direction here and **only** here.
|
|
358
|
+
function may_write_command(command: string): boolean {
|
|
359
|
+
if (command.includes(REDIRECTION)) return true
|
|
360
|
+
|
|
361
|
+
return words_of(command).some((word) => WRITING_WORDS.has(word))
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// **The certain half**, which the dependency test reads and which therefore may not over-call. The
|
|
365
|
+
// one shell line that certainly rewrites a file *and* is bundleable is the in-place `sed`: `sed` is on
|
|
366
|
+
// the read list because `sed -n` prints, so the flag is what separates the two spellings. Everything
|
|
367
|
+
// else answers `false` — a genuine write missed here only leaves a sequence broken the way it already
|
|
368
|
+
// was, while a read caught here would have its dependency removed, which is the failure that matters
|
|
369
|
+
// (joshuafolkken/kit#1509).
|
|
370
|
+
// **The one segment that runs the command, with its quoted text removed first — never the whole
|
|
371
|
+
// line.** Each half closes an over-call, and this predicate feeds the dependency test, so an
|
|
372
|
+
// over-call removes a dependency that is really there:
|
|
373
|
+
//
|
|
374
|
+
// - Scanned whole, `sed -n '1,200p' x.ts | grep -i handler` is an in-place write, because `grep`'s
|
|
375
|
+
// `-i` is a word of the line. Any single-dash `i` downstream does it — `grep -i`, `find -iname`,
|
|
376
|
+
// `diff -i`. `command_segment` is the same reader that decides what the span's own label is, so a
|
|
377
|
+
// later segment cannot answer for the first one.
|
|
378
|
+
// - Unquoted, a `sed` script's own `|` would be read as a pipeline before the segment is picked.
|
|
379
|
+
function write_segment(command: string): string {
|
|
380
|
+
return time_shell.command_segment(time_shell.unquoted(command))
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// **The certain half of the write question, asked in one place for both readers.** `time-writes.ts`
|
|
384
|
+
// answers *which* files an in-place `sed` wrote and this module answers *whether* it wrote at all;
|
|
385
|
+
// they were two implementations of the same test and disagreed in both directions
|
|
386
|
+
// (joshuafolkken/kit#1509). The predicate lives here because `time-writes.ts` already imports this
|
|
387
|
+
// module, so the reverse direction would be a cycle.
|
|
388
|
+
function is_in_place_sed(segment: string): boolean {
|
|
389
|
+
if (time_shell.leading_word(segment) !== IN_PLACE_COMMAND) return false
|
|
390
|
+
|
|
391
|
+
return words_of(segment).some((word) => IN_PLACE_FLAG_PATTERN.test(word))
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// `./scripts/x.ts` and `scripts/x.ts` are the same file, and a trailing slash on a directory is
|
|
395
|
+
// noise. Normalized here so the prefix comparison downstream is a plain string test rather than a
|
|
396
|
+
// path library's.
|
|
397
|
+
function normalize(word: string): string {
|
|
398
|
+
const head = word.startsWith(CURRENT_DIRECTORY) ? word.slice(CURRENT_DIRECTORY.length) : word
|
|
399
|
+
|
|
400
|
+
return head.endsWith(PATH_SEPARATOR) ? head.slice(0, LAST_CHARACTER) : head
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Path-shaped: it holds a separator, or it ends in a short extension. Either is enough to be worth
|
|
404
|
+
// comparing; a bare word like `scripts` is not, because it collides with prose.
|
|
405
|
+
function has_extension(word: string): boolean {
|
|
406
|
+
const dot = word.lastIndexOf('.')
|
|
407
|
+
|
|
408
|
+
if (dot <= FIRST_INDEX) return false
|
|
409
|
+
|
|
410
|
+
const suffix = word.slice(dot + AFTER_DOT)
|
|
411
|
+
|
|
412
|
+
return suffix.length <= MAX_EXTENSION && EXTENSION_PATTERN.test(suffix)
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
function is_target(word: string): boolean {
|
|
416
|
+
if (word.startsWith(FLAG_PREFIX) || word.length < MIN_TARGET_LENGTH) return false
|
|
417
|
+
|
|
418
|
+
return word.includes(PATH_SEPARATOR) || has_extension(word)
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
function targets_in(text: string): Array<string> {
|
|
422
|
+
return words_of(text)
|
|
423
|
+
.map((word) => normalize(word))
|
|
424
|
+
.filter((word) => is_target(word))
|
|
425
|
+
.slice(0, MAX_TARGETS)
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
function field_text(input: unknown, field: string): string {
|
|
429
|
+
if (!json_value.is_record(input)) return ''
|
|
430
|
+
|
|
431
|
+
const value = input[field]
|
|
432
|
+
|
|
433
|
+
return typeof value === 'string' ? value : ''
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
function field_targets(input: unknown): Array<string> {
|
|
437
|
+
if (!json_value.is_record(input)) return []
|
|
438
|
+
const value = input[TARGET_ARRAY_FIELD]
|
|
439
|
+
|
|
440
|
+
return Array.isArray(value)
|
|
441
|
+
? value.filter((entry): entry is string => typeof entry === 'string')
|
|
442
|
+
: []
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// A non-`Bash` tool names its target in a field, so the value is taken whole rather than tokenized: a
|
|
446
|
+
// path containing a space is one target, and splitting it would produce two that match nothing.
|
|
447
|
+
function tool_targets(input: unknown): Array<string> {
|
|
448
|
+
const scalar_targets = TARGET_FIELDS.map((field) => field_text(input, field))
|
|
449
|
+
const targets = [...scalar_targets, ...field_targets(input)].map((target) => normalize(target))
|
|
450
|
+
|
|
451
|
+
return [...new Set(targets)].filter((target) => target !== '')
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Whether a subagent launch's prompt builds on an earlier launch's finding. The prompt is the input
|
|
455
|
+
// field the launch carries, read here while the input is in hand for the reason the whole module is —
|
|
456
|
+
// a span keeps none. Lower-cased once so the markers stay a plain substring test.
|
|
457
|
+
function prompt_references_prior(input: unknown): boolean {
|
|
458
|
+
const prompt = field_text(input, 'prompt').toLowerCase()
|
|
459
|
+
|
|
460
|
+
return PRIOR_REFERENCE_MARKERS.some((marker) => prompt.includes(marker))
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// The facts for a call that is not `Bash`. The tool name decides the kind; the input decides the
|
|
464
|
+
// targets, and a tool that is not bundleable still has none read — nothing ever asks.
|
|
465
|
+
function tool_facts(name: string, input: unknown): BundleFacts {
|
|
466
|
+
// A tool names what it does, so here the two questions have the same answer.
|
|
467
|
+
const writes = { is_writing: WRITING_TOOLS.has(name), may_write: WRITING_TOOLS.has(name) }
|
|
468
|
+
// Only a launch is asked, and only a launch can answer `true` — a non-launch tool has no prompt to
|
|
469
|
+
// build on a prior finding (joshuafolkken/kit#1854).
|
|
470
|
+
const has_prior_reference = LAUNCH_TOOLS.has(name) && prompt_references_prior(input)
|
|
471
|
+
|
|
472
|
+
if (!BUNDLEABLE_TOOLS.has(name)) return { ...not_bundleable(), ...writes, has_prior_reference }
|
|
473
|
+
|
|
474
|
+
return { is_bundleable: true, targets: tool_targets(input), ...writes, has_prior_reference }
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// The facts for a `Bash` call. The leading command comes from `time-shell.ts` rather than from a
|
|
478
|
+
// second reader here — the two answers have to be the same one, or a call could be labelled by one
|
|
479
|
+
// command and classified by another.
|
|
480
|
+
//
|
|
481
|
+
// **The quoted spans come off before the targets are read** (joshuafolkken/kit#1611). `words_of`
|
|
482
|
+
// treats a quote as a separator rather than as a boundary, and `/` is not a separator at all — so
|
|
483
|
+
// `sed -i '' 's/old/new/' scripts/one.ts` yielded `s/old/new` beside the real path, and
|
|
484
|
+
// `investigation-reads.ts` then held a file that no edit could ever name pending for the rest of the
|
|
485
|
+
// run. **The write half of the same line already did this**, in `time-writes.ts` → `write_segment`;
|
|
486
|
+
// only the read half was left scanning the raw line, and the two halves of one `sed -i` disagreeing
|
|
487
|
+
// about what it named is the whole of the over-count.
|
|
488
|
+
//
|
|
489
|
+
// **It is done here rather than inside `targets_in`, which stays a plain tokenizer.** Both of its
|
|
490
|
+
// callers are shell lines and both now strip first, so the invariant its export comment states — one
|
|
491
|
+
// extraction, read and written alike — holds at the boundary instead of being hidden inside it.
|
|
492
|
+
//
|
|
493
|
+
// **`has_mutation` deliberately still reads the raw line.** Unquoting there would let a mutating word
|
|
494
|
+
// hide inside a quoted argument and make the call look bundleable, which is the loosening direction;
|
|
495
|
+
// this one only ever removes targets.
|
|
496
|
+
function bash_facts(command: string): BundleFacts {
|
|
497
|
+
const writes = {
|
|
498
|
+
is_writing: is_in_place_sed(write_segment(command)),
|
|
499
|
+
may_write: may_write_command(command),
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
// A read-only `josh` bookkeeping command is bundleable even though `pnpm` leads it and is a mutation
|
|
503
|
+
// word: the allow-list above is the read-only half the leading-word test could not reach
|
|
504
|
+
// (joshuafolkken/kit#1875). Its writes are already `false` — no `>`, no in-place `sed` — so the guard
|
|
505
|
+
// can refuse a run of them and `Bundling:` can count them recoverable.
|
|
506
|
+
if (is_read_josh(command)) {
|
|
507
|
+
return {
|
|
508
|
+
is_bundleable: true,
|
|
509
|
+
targets: targets_in(time_shell.unquoted(command)),
|
|
510
|
+
...writes,
|
|
511
|
+
has_prior_reference: false,
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
if (!READ_COMMANDS.has(time_shell.leading_word(command)) || has_mutation(command)) {
|
|
516
|
+
return { ...not_bundleable(), ...writes }
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
// A `Bash` call is never a subagent launch, so it never builds on a prior finding.
|
|
520
|
+
return {
|
|
521
|
+
is_bundleable: true,
|
|
522
|
+
targets: targets_in(time_shell.unquoted(command)),
|
|
523
|
+
...writes,
|
|
524
|
+
has_prior_reference: false,
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
// The facts for one call named the way a caller holding a raw tool invocation names it — a tool and
|
|
529
|
+
// its input, with nothing unwrapped yet (joshuafolkken/kit#1390).
|
|
530
|
+
//
|
|
531
|
+
// **It exists so the live guard and the parser cannot disagree about what a call is.** `time-spans.ts`
|
|
532
|
+
// reaches the two functions above directly because it has already read the shell command out of the
|
|
533
|
+
// input for the row's label; a `PreToolUse` payload has no such head start, and a second place
|
|
534
|
+
// remembering that `Bash` is the one tool whose input needs unwrapping is exactly the drift that would
|
|
535
|
+
// let a call be refused as bundleable and then counted as not.
|
|
536
|
+
function call_facts(name: string, input: unknown): BundleFacts {
|
|
537
|
+
if (name !== BASH_TOOL) return tool_facts(name, input)
|
|
538
|
+
|
|
539
|
+
return bash_facts(time_shell.bash_command(input))
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
const time_bundle_call = {
|
|
543
|
+
MAX_TARGETS,
|
|
544
|
+
not_bundleable,
|
|
545
|
+
bash_facts,
|
|
546
|
+
call_facts,
|
|
547
|
+
tool_facts,
|
|
548
|
+
// Exported for `time-agent-bundles.ts` (joshuafolkken/kit#1854), which asks the launch question of a
|
|
549
|
+
// span's `label` — the tool name for a non-Bash call — so the set lives in one place.
|
|
550
|
+
is_launch_tool,
|
|
551
|
+
// Exported for `time-writes.ts` (joshuafolkken/kit#1472), which asks what a call *wrote* rather
|
|
552
|
+
// than what it named. The extraction is the same one either way — a second copy of it would let a
|
|
553
|
+
// path be recognized as a target when read and missed when written.
|
|
554
|
+
targets_in,
|
|
555
|
+
tool_targets,
|
|
556
|
+
// Exported for the batching guard's own word scan (joshuafolkken/kit#1390), so the two scanners
|
|
557
|
+
// cannot come to disagree about where one word of a shell line ends and the next begins.
|
|
558
|
+
words_of,
|
|
559
|
+
// Exported for the read-fold notice (joshuafolkken/kit#2311), which offers `read:files <path>` only
|
|
560
|
+
// over file-shaped targets — a bare directory like `scripts/` is a target here but not something
|
|
561
|
+
// `read:files` can read, so the notice reuses this test rather than keep a second copy that could
|
|
562
|
+
// drift from what counts as a file path.
|
|
563
|
+
has_extension,
|
|
564
|
+
// Exported for `time-writes.ts` (joshuafolkken/kit#1509), which needs the same two answers to say
|
|
565
|
+
// *which* files an in-place `sed` wrote. Two copies of this test disagreed in both directions at
|
|
566
|
+
// once — one called a piped `grep -i` a write, the other missed a bundled `sed -ni`.
|
|
567
|
+
write_segment,
|
|
568
|
+
is_in_place_sed,
|
|
569
|
+
// Exported for the drift test in `time-bundle-call.test.ts` (joshuafolkken/kit#1875), which pins that
|
|
570
|
+
// every name here is a real `josh` command and none of them writes.
|
|
571
|
+
READ_JOSH_SUBCOMMANDS,
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
export type { BundleFacts }
|
|
575
|
+
export { time_bundle_call }
|