@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,545 @@
|
|
|
1
|
+
import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
|
|
2
|
+
import type { FollowupStage } from '#scripts/git/git-followup-stages'
|
|
3
|
+
import { time_background } from './time-background'
|
|
4
|
+
import { time_bundle_call } from './time-bundle-call'
|
|
5
|
+
import { time_followup_stage } from './time-followup-stage'
|
|
6
|
+
import { time_markers, type PhaseMarker } from './time-markers'
|
|
7
|
+
import { time_reported_failure } from './time-reported-failure'
|
|
8
|
+
import { time_shell } from './time-shell'
|
|
9
|
+
import { time_single_check } from './time-single-check'
|
|
10
|
+
import { time_transcript_line, type Block, type TranscriptLine } from './time-transcript-line'
|
|
11
|
+
import { time_writes } from './time-writes'
|
|
12
|
+
|
|
13
|
+
const { NO_MESSAGE_ID, parse_line } = time_transcript_line
|
|
14
|
+
|
|
15
|
+
// Turning a session transcript into timed spans (joshuafolkken/kit#1267).
|
|
16
|
+
//
|
|
17
|
+
// `cost-*` reads the same files for what a run was billed. This reads the other axis: where its wall
|
|
18
|
+
// clock went. Discovery and reading are `cost-transcript.ts`'s and are reused rather than copied;
|
|
19
|
+
// what is here is the arithmetic, which has no counterpart on the cost side.
|
|
20
|
+
//
|
|
21
|
+
// **Reading one line is `time-transcript-line.ts`'s** since joshuafolkken/kit#1406, when this file
|
|
22
|
+
// passed its length limit — the schemas, the two records a line yields and the parse that produces
|
|
23
|
+
// them. `NO_MESSAGE_ID` and `parse_line` are re-exported below under the names they always had, so
|
|
24
|
+
// the move changed no call site. `cost_blocks`' three type constants are still imported rather than
|
|
25
|
+
// restated.
|
|
26
|
+
//
|
|
27
|
+
// **The partition is by gap, not by pair.** Every span is the interval between two consecutive
|
|
28
|
+
// events, classified by the *later* one: a span ending at an assistant line is model wait, one
|
|
29
|
+
// ending at a tool result is that tool's execution, one ending at a user prompt is human wait.
|
|
30
|
+
// Classifying by pairs instead would double-count parallel tool calls and leave the three shares
|
|
31
|
+
// summing to something other than the elapsed time — the property that makes two runs comparable.
|
|
32
|
+
// Measured against the three sessions joshuafolkken/kit#1267 restored by hand: 49.6 / 73.3 / 54.6
|
|
33
|
+
// minutes, every share within 0.4 points of the hand figure.
|
|
34
|
+
|
|
35
|
+
const ASSISTANT_TYPE = 'assistant'
|
|
36
|
+
const USER_TYPE = 'user'
|
|
37
|
+
const UNKNOWN_TOOL = 'unknown'
|
|
38
|
+
|
|
39
|
+
type SpanCategory = 'model' | 'tool' | 'human'
|
|
40
|
+
|
|
41
|
+
const MODEL_CATEGORY: SpanCategory = 'model'
|
|
42
|
+
const TOOL_CATEGORY: SpanCategory = 'tool'
|
|
43
|
+
const HUMAN_CATEGORY: SpanCategory = 'human'
|
|
44
|
+
|
|
45
|
+
// How the call this span paid for came back (joshuafolkken/kit#1309).
|
|
46
|
+
//
|
|
47
|
+
// **Three answers rather than two.** `unknown` is not a polite `ok`: a fifth of the tool results in
|
|
48
|
+
// the transcripts measured carry no `is_error` at all — a file read, an answered question — and
|
|
49
|
+
// folding those into `ok` would report a run as having failed nothing when nothing was read. It is
|
|
50
|
+
// also what a model span and a human span carry, since neither is a call and neither has an outcome
|
|
51
|
+
// to have.
|
|
52
|
+
type SpanOutcome = 'ok' | 'failed' | 'unknown'
|
|
53
|
+
|
|
54
|
+
const OK_OUTCOME: SpanOutcome = 'ok'
|
|
55
|
+
const FAILED_OUTCOME: SpanOutcome = 'failed'
|
|
56
|
+
const UNKNOWN_OUTCOME: SpanOutcome = 'unknown'
|
|
57
|
+
|
|
58
|
+
// What the result closing a span says about the call it belongs to, beyond the label read off the
|
|
59
|
+
// call itself. Two fields rather than one because both are answers about the *result* line and
|
|
60
|
+
// neither can be recovered from a span afterwards.
|
|
61
|
+
//
|
|
62
|
+
// **`call_id` is what makes two fragments of one call identifiable as one call.** A span bracketing a
|
|
63
|
+
// delegated unit comes back from `time_overlap.trim` as a head and a tail, and the two are told apart
|
|
64
|
+
// from a *different* call of the same tool only by this id — a label cannot do it, because two
|
|
65
|
+
// `Task` calls issued in the same turn share one.
|
|
66
|
+
interface ResultFacts {
|
|
67
|
+
call_id: string
|
|
68
|
+
outcome: SpanOutcome
|
|
69
|
+
// Which guard refused the call this result closed, and `''` for every non-refusal
|
|
70
|
+
// (joshuafolkken/kit#1913). Carried here for the reason `outcome` is: the result block is gone by
|
|
71
|
+
// the time the per-guard refusal breakdown aggregates, and only what was read off it survives.
|
|
72
|
+
refusal_guard: string
|
|
73
|
+
// The id the harness assigned when it took this call's command into the background, and `''` for
|
|
74
|
+
// every other result (joshuafolkken/kit#1662). Fourth field for the reason the others are here:
|
|
75
|
+
// the launch's body is the only place the id is written, and the body is gone by the time
|
|
76
|
+
// anything places the command on the timeline.
|
|
77
|
+
background_id: string
|
|
78
|
+
// The stage rows a `pnpm josh followup` call printed into its own output
|
|
79
|
+
// (joshuafolkken/kit#1445). Third field for the reason the two above are here: the result block is
|
|
80
|
+
// gone by the time anything aggregates, so what a table wants from it has to be read off it now.
|
|
81
|
+
// Empty for every span that is not a measured `followup` invocation.
|
|
82
|
+
followup_stages: ReadonlyArray<FollowupStage>
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const NO_RESULT: ResultFacts = {
|
|
86
|
+
call_id: '',
|
|
87
|
+
outcome: UNKNOWN_OUTCOME,
|
|
88
|
+
refusal_guard: '',
|
|
89
|
+
background_id: time_background.NO_BACKGROUND,
|
|
90
|
+
followup_stages: time_followup_stage.NO_STAGES,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// What a tool span is labelled with. `josh_command` is empty for everything that is not a
|
|
94
|
+
// `pnpm josh <cmd>` invocation, and the report drops empty labels rather than printing a bucket.
|
|
95
|
+
//
|
|
96
|
+
// `marker` names the workflow boundary the call is, for the phase breakdown that slices the same
|
|
97
|
+
// spans by stage (joshuafolkken/kit#1269). It is carried here rather than re-derived later because
|
|
98
|
+
// the tool's *input* is what decides it, and a span keeps no input — only the label read off it.
|
|
99
|
+
//
|
|
100
|
+
// `is_bundleable` and `targets` are carried for exactly that reason too (joshuafolkken/kit#1344).
|
|
101
|
+
// Whether a call could have gone out beside another, and what it names, are both read off the input —
|
|
102
|
+
// so a module asking about them after the fact would have nothing to read. `time-bundle-call.ts`
|
|
103
|
+
// decides both; the rule each one follows is stated there.
|
|
104
|
+
//
|
|
105
|
+
// `check_key` is the fourth, and the third time this reason has applied (joshuafolkken/kit#1383). Two
|
|
106
|
+
// runs of one verification check are the same call only if they named the same files, and the files
|
|
107
|
+
// are in the input — so `josh_command` alone cannot say, and nothing downstream could recover it.
|
|
108
|
+
// `time-single-check.ts` decides it.
|
|
109
|
+
//
|
|
110
|
+
// `message_id` is the fifth, and it is the one that says which *turn* a call belongs to
|
|
111
|
+
// (joshuafolkken/kit#1406). It is read off the line the `tool_use` block sat on rather than off the
|
|
112
|
+
// result that closes the span, because a `tool_result` line carries no message id at all — so a span
|
|
113
|
+
// that did not keep it here could never be attributed to the turn that issued it.
|
|
114
|
+
//
|
|
115
|
+
// `writes` is the sixth, and it is what `targets` could not say (joshuafolkken/kit#1472). `targets`
|
|
116
|
+
// names what a call mentioned; `marker` says a call was *an* edit but not of what, and for a tool
|
|
117
|
+
// outside `BUNDLEABLE_TOOLS` it arrived with no target at all. So a consumer subtracting edits from
|
|
118
|
+
// reads — `investigation-reads.ts` — had nothing to subtract for `MultiEdit` / `NotebookEdit`, and
|
|
119
|
+
// nothing at all to tell an in-place `sed -i` from the `sed -n` it shares a label with.
|
|
120
|
+
// `time-writes.ts` decides it, from the input this span is about to discard.
|
|
121
|
+
// `issue` is the seventh, and it is the one `branch` could not carry (joshuafolkken/kit#1617). Under
|
|
122
|
+
// lanes the session writing the transcript stays on the default branch while the work runs in a linked
|
|
123
|
+
// work tree, so `branch` names no issue on any line of the run; the `in-progress` label call does, and
|
|
124
|
+
// like every field above it that answer is read off the *input* a span is about to discard.
|
|
125
|
+
// `time_markers.NO_ISSUE` for every call that declares nothing, which is all but one call per run.
|
|
126
|
+
interface ToolCall {
|
|
127
|
+
label: string
|
|
128
|
+
josh_command: string
|
|
129
|
+
// Every josh subcommand the call ran, where `josh_command` is only the first (joshuafolkken/kit#1883).
|
|
130
|
+
// A chained `pnpm josh lint:related && pnpm josh test:related` carries both; the count tables expand
|
|
131
|
+
// it so the ones `josh_command` drops are still counted.
|
|
132
|
+
josh_commands: ReadonlyArray<string>
|
|
133
|
+
check_key: string
|
|
134
|
+
marker: PhaseMarker
|
|
135
|
+
is_bundleable: boolean
|
|
136
|
+
targets: ReadonlyArray<string>
|
|
137
|
+
// Carried beside `targets` because sharing a target means something different depending on it: a
|
|
138
|
+
// second write to one file is independent work, a read of a file just written is not
|
|
139
|
+
// (joshuafolkken/kit#1509).
|
|
140
|
+
is_writing: boolean
|
|
141
|
+
// Whether this is a subagent launch whose prompt builds on an earlier launch's finding
|
|
142
|
+
// (joshuafolkken/kit#1854). Carried for the reason every field here is — the prompt it is read from
|
|
143
|
+
// is the input, and a span keeps none. `time-agent-bundles.ts` reads it.
|
|
144
|
+
has_prior_reference: boolean
|
|
145
|
+
writes: ReadonlyArray<string>
|
|
146
|
+
message_id: string
|
|
147
|
+
issue: number
|
|
148
|
+
// The background run this call reads the output of, and `''` for every other call
|
|
149
|
+
// (joshuafolkken/kit#1662). It is the eighth field carried for the reason the seven above are:
|
|
150
|
+
// the id sits in the command string, which a span does not keep, and it is the only thing that
|
|
151
|
+
// says a `tail` two turns later is the join of a command started minutes ago.
|
|
152
|
+
reads_background: string
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const NO_CALL: ToolCall = {
|
|
156
|
+
label: '',
|
|
157
|
+
josh_command: '',
|
|
158
|
+
josh_commands: [],
|
|
159
|
+
check_key: time_single_check.NO_CHECK,
|
|
160
|
+
marker: time_markers.NO_MARKER,
|
|
161
|
+
message_id: NO_MESSAGE_ID,
|
|
162
|
+
writes: [],
|
|
163
|
+
issue: time_markers.NO_ISSUE,
|
|
164
|
+
reads_background: time_background.NO_BACKGROUND,
|
|
165
|
+
...time_bundle_call.not_bundleable(),
|
|
166
|
+
}
|
|
167
|
+
const UNKNOWN_CALL: ToolCall = {
|
|
168
|
+
label: UNKNOWN_TOOL,
|
|
169
|
+
josh_command: '',
|
|
170
|
+
josh_commands: [],
|
|
171
|
+
check_key: time_single_check.NO_CHECK,
|
|
172
|
+
marker: time_markers.NO_MARKER,
|
|
173
|
+
message_id: NO_MESSAGE_ID,
|
|
174
|
+
writes: [],
|
|
175
|
+
issue: time_markers.NO_ISSUE,
|
|
176
|
+
reads_background: time_background.NO_BACKGROUND,
|
|
177
|
+
...time_bundle_call.not_bundleable(),
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// `ended_ms` is the absolute instant the span closed, so `[ended_ms - duration_ms, ended_ms]` is the
|
|
181
|
+
// interval it occupied. A duration alone cannot say *when*, and two things need that: the CI wait,
|
|
182
|
+
// which is the part of the PR-open→merge window no span covers (joshuafolkken/kit#1268), and the
|
|
183
|
+
// phase breakdown that slices the same array by boundary (joshuafolkken/kit#1269).
|
|
184
|
+
//
|
|
185
|
+
// `branch` rides along for the same reason `cost-usage.ts` carries it on a record: it is what
|
|
186
|
+
// `cost_attribute` reads to decide which issue the span belongs to.
|
|
187
|
+
// The two `ResultFacts` fields are carried for the same reason `marker` is: the result block is gone
|
|
188
|
+
// by the time anything aggregates, and only what was read off it survives.
|
|
189
|
+
interface Span extends ToolCall, ResultFacts {
|
|
190
|
+
category: SpanCategory
|
|
191
|
+
duration_ms: number
|
|
192
|
+
// What the call itself took, before any of its minutes were handed to a delegated unit
|
|
193
|
+
// (joshuafolkken/kit#1591). Carried beside `duration_ms` rather than derived from it, because
|
|
194
|
+
// nothing downstream could recover it: `time_overlap.trim` replaces `duration_ms` and keeps no
|
|
195
|
+
// record of what it replaced.
|
|
196
|
+
//
|
|
197
|
+
// **The two answer different questions, and a report needs both.** `duration_ms` is this span's
|
|
198
|
+
// share of the run's wall clock, so the subtraction shortens it wherever a unit covered the same
|
|
199
|
+
// minutes — without that the four category shares stop reconstructing `elapsed_ms`, which is the
|
|
200
|
+
// double count joshuafolkken/kit#1287 fixed. This one is what a per-invocation row is asked for:
|
|
201
|
+
// a `Skill` call that really ran for five minutes was printed as 65 ms, because 65 ms is all the
|
|
202
|
+
// subtraction had left of it.
|
|
203
|
+
//
|
|
204
|
+
// It survives that subtraction because `trim` copies the span and overwrites only `duration_ms`
|
|
205
|
+
// and `ended_ms`, so every fragment of one call carries the same value — which is why the tables
|
|
206
|
+
// that read it count the first fragment and drop the continuations rather than summing them.
|
|
207
|
+
own_duration_ms: number
|
|
208
|
+
ended_ms: number
|
|
209
|
+
branch: string
|
|
210
|
+
// Whether this span is the *remainder* of a call whose middle was given to a delegated unit, cut
|
|
211
|
+
// out by `time_overlap.trim` (joshuafolkken/kit#1304). One call comes back as two spans there, so
|
|
212
|
+
// anything counting calls rather than intervals has to skip the second — the round-trip block and
|
|
213
|
+
// the per-tool table's `call_count` both do. Every span the transcript itself yields is `false`;
|
|
214
|
+
// only the subtraction sets it.
|
|
215
|
+
is_continuation: boolean
|
|
216
|
+
// The `pnpm josh <cmd>` this span ran *beside*, where it sits inside a backgrounded command's
|
|
217
|
+
// window, and `''` everywhere else (joshuafolkken/kit#1662). It is resolved after the walk rather
|
|
218
|
+
// than read off a call, because the window is not known until the join that closes it has been
|
|
219
|
+
// seen — so it has `is_continuation`'s shape rather than `marker`'s: every span the walk yields is
|
|
220
|
+
// empty, and only `time_background.positioned` sets it.
|
|
221
|
+
background_command: string
|
|
222
|
+
// When the harness said the command this span launched had finished, and `NO_FINISH` where nothing
|
|
223
|
+
// said (joshuafolkken/kit#1696). It is the notice's own instant rather than a reading's, so it is
|
|
224
|
+
// keyed to the launch by id at parse time — the notice sits on a line of its own, which is why no
|
|
225
|
+
// field read off this span's own result could carry it.
|
|
226
|
+
background_ended_ms: number
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
interface TimelineEvent extends ToolCall, ResultFacts {
|
|
230
|
+
timestamp_ms: number
|
|
231
|
+
branch: string
|
|
232
|
+
category: SpanCategory
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// The whole session: when it started, when it ended, and what it spent the interval on.
|
|
236
|
+
interface Timeline {
|
|
237
|
+
started_ms: number
|
|
238
|
+
ended_ms: number
|
|
239
|
+
spans: Array<Span>
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Everything but Bash: the tool's own name is the label, and nothing it runs is a shell command to
|
|
243
|
+
// read a check key, a josh command or a declared issue off.
|
|
244
|
+
function non_bash_call(name: string, input: unknown, message_id: string): ToolCall {
|
|
245
|
+
return {
|
|
246
|
+
label: name,
|
|
247
|
+
josh_command: '',
|
|
248
|
+
josh_commands: [],
|
|
249
|
+
check_key: time_single_check.NO_CHECK,
|
|
250
|
+
marker: time_markers.tool_marker(name, input),
|
|
251
|
+
message_id,
|
|
252
|
+
writes: time_writes.tool_writes(name, input),
|
|
253
|
+
issue: time_markers.NO_ISSUE,
|
|
254
|
+
// A non-Bash tool joins a backgrounded command too — `BashOutput` carries the shell id in a
|
|
255
|
+
// field of its own, `Monitor` names the same `…/tasks/<id>.output` path in a command — so the
|
|
256
|
+
// same reader is asked here rather than the field being left empty for every tool but `Bash`.
|
|
257
|
+
reads_background: time_background.read_id_of(input),
|
|
258
|
+
...time_bundle_call.tool_facts(name, input),
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function bash_call(input: unknown, message_id: string): ToolCall {
|
|
263
|
+
const command = time_shell.bash_command(input)
|
|
264
|
+
const josh_command = time_shell.josh_command_of(command)
|
|
265
|
+
|
|
266
|
+
return {
|
|
267
|
+
label: time_shell.bash_label(command),
|
|
268
|
+
josh_command,
|
|
269
|
+
josh_commands: time_shell.josh_commands_of(command),
|
|
270
|
+
check_key: time_single_check.check_key(josh_command, command),
|
|
271
|
+
marker: time_markers.bash_marker(command),
|
|
272
|
+
message_id,
|
|
273
|
+
writes: time_writes.bash_writes(command),
|
|
274
|
+
issue: time_markers.bash_issue(command),
|
|
275
|
+
reads_background: time_background.read_id_of(input),
|
|
276
|
+
...time_bundle_call.bash_facts(command),
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function to_tool_call(name: string, input: unknown, message_id: string): ToolCall {
|
|
281
|
+
if (name !== cost_blocks.BASH_TOOL) return non_bash_call(name, input, message_id)
|
|
282
|
+
|
|
283
|
+
return bash_call(input, message_id)
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Identified calls only. A `tool_use` written without an `id` would otherwise be registered under
|
|
287
|
+
// the empty string, where the next result that carries no `tool_use_id` would match it and be
|
|
288
|
+
// labelled with an unrelated tool — a wrong name where `UNKNOWN_TOOL` is the honest one.
|
|
289
|
+
// A `tool_use` block with the assistant message it was written under, which is the turn that issued
|
|
290
|
+
// it (joshuafolkken/kit#1406). The pair is kept rather than the block alone because the id lives on
|
|
291
|
+
// the *line* and the flatten below is where it would otherwise be lost.
|
|
292
|
+
interface IssuedCall {
|
|
293
|
+
block: Block
|
|
294
|
+
message_id: string
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function tool_use_blocks(lines: ReadonlyArray<TranscriptLine>): Array<IssuedCall> {
|
|
298
|
+
return lines.flatMap((line) =>
|
|
299
|
+
line.blocks
|
|
300
|
+
.filter((block) => block.type === cost_blocks.TOOL_USE_TYPE && block.id !== '')
|
|
301
|
+
.map((block) => ({ block, message_id: line.message_id })),
|
|
302
|
+
)
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Every call in the session, keyed by the id its result carries back. Built over the whole file
|
|
306
|
+
// first because a result can arrive many lines after the call that issued it.
|
|
307
|
+
function collect_calls(lines: ReadonlyArray<TranscriptLine>): Map<string, ToolCall> {
|
|
308
|
+
return new Map(
|
|
309
|
+
tool_use_blocks(lines).map(({ block, message_id }) => [
|
|
310
|
+
block.id,
|
|
311
|
+
to_tool_call(block.name, block.input, message_id),
|
|
312
|
+
]),
|
|
313
|
+
)
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// The first result on the line names the span. Claude Code writes one result per line, so this is
|
|
317
|
+
// the whole of it in practice; were it ever to write several, the gap would be charged to the first
|
|
318
|
+
// of them rather than divided — the three-way split stays exact either way, and only the per-tool
|
|
319
|
+
// table would be approximate.
|
|
320
|
+
function result_block(line: TranscriptLine): Block | undefined {
|
|
321
|
+
return line.blocks.find((block) => block.type === cost_blocks.TOOL_RESULT_TYPE)
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// One line's contribution to the timeline, with the two fields every event carries read from the
|
|
325
|
+
// line in one place. Written once rather than spelled out at each of the three return sites, which
|
|
326
|
+
// is what let `branch` be added without a fourth chance to forget it.
|
|
327
|
+
function event_of(
|
|
328
|
+
line: TranscriptLine,
|
|
329
|
+
category: SpanCategory,
|
|
330
|
+
call: ToolCall,
|
|
331
|
+
result: ResultFacts = NO_RESULT,
|
|
332
|
+
): TimelineEvent {
|
|
333
|
+
return { timestamp_ms: line.timestamp_ms, branch: line.branch, category, ...result, ...call }
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// A result that carried no `is_error` is `unknown` rather than `ok`: the tools that report no
|
|
337
|
+
// outcome — a file read, an answered question — would otherwise be counted as calls that succeeded,
|
|
338
|
+
// and a run whose whole transcript was written by them would report a measured zero failures.
|
|
339
|
+
//
|
|
340
|
+
// **What the command said outranks what the harness recorded, in one direction only**
|
|
341
|
+
// (joshuafolkken/kit#1361). A josh check run inside a pipeline exits with the pipe's status, so the
|
|
342
|
+
// harness writes `is_error: false` over a red gate; the failure line the command printed is the only
|
|
343
|
+
// surviving evidence, and it is read *before* the field. The reverse never happens — a call the
|
|
344
|
+
// harness marked failed is failed whatever it printed.
|
|
345
|
+
function outcome_of(result: Block, call: ToolCall): SpanOutcome {
|
|
346
|
+
if (time_reported_failure.is_reported_failure(call.josh_command, result.has_failure_line)) {
|
|
347
|
+
return FAILED_OUTCOME
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
if (result.is_error === undefined) return UNKNOWN_OUTCOME
|
|
351
|
+
|
|
352
|
+
return result.is_error ? FAILED_OUTCOME : OK_OUTCOME
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function facts_of(result: Block, call: ToolCall): ResultFacts {
|
|
356
|
+
return {
|
|
357
|
+
call_id: result.result_id,
|
|
358
|
+
outcome: outcome_of(result, call),
|
|
359
|
+
refusal_guard: result.refusal_guard,
|
|
360
|
+
background_id: result.background_id,
|
|
361
|
+
followup_stages: result.followup_stages,
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// A user line is one of two things, and only its blocks tell them apart: a tool result the harness
|
|
366
|
+
// wrote back, or a person typing.
|
|
367
|
+
function user_event(line: TranscriptLine, calls: ReadonlyMap<string, ToolCall>): TimelineEvent {
|
|
368
|
+
const result = result_block(line)
|
|
369
|
+
|
|
370
|
+
if (result === undefined) return event_of(line, HUMAN_CATEGORY, NO_CALL)
|
|
371
|
+
|
|
372
|
+
const call = calls.get(result.result_id) ?? UNKNOWN_CALL
|
|
373
|
+
|
|
374
|
+
return event_of(line, TOOL_CATEGORY, call, facts_of(result, call))
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function to_event(
|
|
378
|
+
line: TranscriptLine,
|
|
379
|
+
calls: ReadonlyMap<string, ToolCall>,
|
|
380
|
+
): TimelineEvent | undefined {
|
|
381
|
+
// **A model span carries the message its own line belongs to**, which is what makes a turn
|
|
382
|
+
// countable: Claude Code writes one line per content block and repeats the id on each, so the
|
|
383
|
+
// lines are what a naive count sees and the id is what says how many turns they were
|
|
384
|
+
// (joshuafolkken/kit#1406).
|
|
385
|
+
if (line.type === ASSISTANT_TYPE) {
|
|
386
|
+
return event_of(line, MODEL_CATEGORY, { ...NO_CALL, message_id: line.message_id })
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
return line.type === USER_TYPE ? user_event(line, calls) : undefined
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// Sorted rather than trusted in file order. Claude Code writes a few lines microseconds out of
|
|
393
|
+
// order, and an unsorted walk turns those into negative durations — clamping them would break the
|
|
394
|
+
// one property this partition has, that the shares add up to the elapsed time.
|
|
395
|
+
function to_events(
|
|
396
|
+
lines: ReadonlyArray<TranscriptLine>,
|
|
397
|
+
calls: ReadonlyMap<string, ToolCall>,
|
|
398
|
+
): Array<TimelineEvent> {
|
|
399
|
+
return lines
|
|
400
|
+
.map((line) => to_event(line, calls))
|
|
401
|
+
.filter((event): event is TimelineEvent => event !== undefined)
|
|
402
|
+
.toSorted((left, right) => left.timestamp_ms - right.timestamp_ms)
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// The span is named by the event that *closes* it, so the branch is that event's too: the work the
|
|
406
|
+
// interval paid for is the work the later line records, and taking the opening line's branch would
|
|
407
|
+
// attribute the first span after a `josh git` to whatever preceded the branch.
|
|
408
|
+
// The two durations of a span that nothing has taken a share of yet, which is every span a
|
|
409
|
+
// transcript itself yields and every span a test builds (joshuafolkken/kit#1591). Written once here
|
|
410
|
+
// so no builder can set one and forget the other — the drift would be silent, and would surface as a
|
|
411
|
+
// per-invocation row disagreeing with the transcript it was read from.
|
|
412
|
+
function equal_durations(duration_ms: number): Pick<Span, 'duration_ms' | 'own_duration_ms'> {
|
|
413
|
+
return { duration_ms, own_duration_ms: duration_ms }
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// The four background fields of a span nothing backgrounded, which is every span a test builds
|
|
417
|
+
// (joshuafolkken/kit#1662). Written once here for the reason `equal_durations` above is: three
|
|
418
|
+
// fixtures assemble a `Span` literal, and a field added to two of them is a drift that surfaces only
|
|
419
|
+
// as a table disagreeing with the transcript it was read from.
|
|
420
|
+
type BackgroundFields = Pick<
|
|
421
|
+
Span,
|
|
422
|
+
'background_id' | 'reads_background' | 'background_command' | 'background_ended_ms'
|
|
423
|
+
>
|
|
424
|
+
|
|
425
|
+
function no_background(): BackgroundFields {
|
|
426
|
+
const none = time_background.NO_BACKGROUND
|
|
427
|
+
|
|
428
|
+
return {
|
|
429
|
+
background_id: none,
|
|
430
|
+
reads_background: none,
|
|
431
|
+
background_command: none,
|
|
432
|
+
background_ended_ms: time_background.NO_FINISH,
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// When the harness said each backgrounded command ended, keyed by the id it assigned. Named so the
|
|
437
|
+
// signature below fits the line, and because the map is a fact about the whole transcript rather than
|
|
438
|
+
// about any one span.
|
|
439
|
+
type FinishedAt = ReadonlyMap<string, number>
|
|
440
|
+
|
|
441
|
+
// The same four fields on a span the walk yields, which is where three of them are still empty:
|
|
442
|
+
// `background_command` is resolved after the walk by `time_background.positioned`, and the instant the
|
|
443
|
+
// command ended comes from a notification line of its own rather than from this event.
|
|
444
|
+
function background_fields(event: TimelineEvent, finished: FinishedAt): BackgroundFields {
|
|
445
|
+
return {
|
|
446
|
+
background_id: event.background_id,
|
|
447
|
+
reads_background: event.reads_background,
|
|
448
|
+
background_command: time_background.NO_BACKGROUND,
|
|
449
|
+
background_ended_ms: finished.get(event.background_id) ?? time_background.NO_FINISH,
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// The four result-borne fields a span keeps, spread into `to_spans` so that builder stays inside its
|
|
454
|
+
// line limit — `background_id`, the fifth `ResultFacts` field, is set by `background_fields` instead.
|
|
455
|
+
function result_facts_of(
|
|
456
|
+
event: TimelineEvent,
|
|
457
|
+
): Pick<ResultFacts, 'call_id' | 'outcome' | 'refusal_guard' | 'followup_stages'> {
|
|
458
|
+
return {
|
|
459
|
+
call_id: event.call_id,
|
|
460
|
+
outcome: event.outcome,
|
|
461
|
+
refusal_guard: event.refusal_guard,
|
|
462
|
+
followup_stages: event.followup_stages,
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
function to_spans(events: ReadonlyArray<TimelineEvent>, finished: FinishedAt): Array<Span> {
|
|
467
|
+
return events.slice(1).map((event, index) => ({
|
|
468
|
+
category: event.category,
|
|
469
|
+
label: event.label,
|
|
470
|
+
josh_command: event.josh_command,
|
|
471
|
+
josh_commands: event.josh_commands,
|
|
472
|
+
check_key: event.check_key,
|
|
473
|
+
marker: event.marker,
|
|
474
|
+
is_bundleable: event.is_bundleable,
|
|
475
|
+
targets: event.targets,
|
|
476
|
+
is_writing: event.is_writing,
|
|
477
|
+
has_prior_reference: event.has_prior_reference,
|
|
478
|
+
writes: event.writes,
|
|
479
|
+
message_id: event.message_id,
|
|
480
|
+
issue: event.issue,
|
|
481
|
+
branch: event.branch,
|
|
482
|
+
...result_facts_of(event),
|
|
483
|
+
is_continuation: false,
|
|
484
|
+
...background_fields(event, finished),
|
|
485
|
+
ended_ms: event.timestamp_ms,
|
|
486
|
+
...equal_durations(event.timestamp_ms - (events[index]?.timestamp_ms ?? event.timestamp_ms)),
|
|
487
|
+
}))
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
function parse_timeline(text: string): Timeline {
|
|
491
|
+
const lines = text
|
|
492
|
+
.split('\n')
|
|
493
|
+
.map((line) => parse_line(line))
|
|
494
|
+
.filter((line): line is TranscriptLine => line !== undefined)
|
|
495
|
+
const events = to_events(lines, collect_calls(lines))
|
|
496
|
+
|
|
497
|
+
return {
|
|
498
|
+
started_ms: events[0]?.timestamp_ms ?? 0,
|
|
499
|
+
ended_ms: events.at(-1)?.timestamp_ms ?? 0,
|
|
500
|
+
// **The positioning happens here rather than in a caller** (joshuafolkken/kit#1662): a launch and
|
|
501
|
+
// the call that reads its output are in one transcript, and by the time spans have been merged
|
|
502
|
+
// across sessions and trimmed they are fragments rather than calls.
|
|
503
|
+
spans: time_background.positioned(to_spans(events, time_background.finished_at(lines))),
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// **"No span was read" is the one criterion every scope withholds a transcript figure on**
|
|
508
|
+
// (joshuafolkken/kit#1295). A run whose transcript could not be attributed, a child of an epic in
|
|
509
|
+
// that state, and a batch no child contributed to are the same fact asked at three scales, and each
|
|
510
|
+
// used to spell it out for itself — which is how the run scope came to print three `0.0 min` rows
|
|
511
|
+
// beside the epic scope's `not measured` for the very same child.
|
|
512
|
+
//
|
|
513
|
+
// It takes the count rather than the array so the three callers can pass what they hold: the spans
|
|
514
|
+
// themselves before a report exists, and `TimeReport.span_count` afterwards.
|
|
515
|
+
function has_transcript_data(span_count: number): boolean {
|
|
516
|
+
return span_count > 0
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
const time_spans = {
|
|
520
|
+
ASSISTANT_TYPE,
|
|
521
|
+
MODEL_CATEGORY,
|
|
522
|
+
TOOL_CATEGORY,
|
|
523
|
+
HUMAN_CATEGORY,
|
|
524
|
+
OK_OUTCOME,
|
|
525
|
+
FAILED_OUTCOME,
|
|
526
|
+
UNKNOWN_OUTCOME,
|
|
527
|
+
NO_MESSAGE_ID,
|
|
528
|
+
UNKNOWN_TOOL,
|
|
529
|
+
has_transcript_data,
|
|
530
|
+
equal_durations,
|
|
531
|
+
no_background,
|
|
532
|
+
// Re-exported so the suites that measure how a command is read keep asking one namespace, and so
|
|
533
|
+
// `time-shell.ts` moving out of this file changed no call site (joshuafolkken/kit#1344).
|
|
534
|
+
bash_label: time_shell.bash_label,
|
|
535
|
+
josh_command_of: time_shell.josh_command_of,
|
|
536
|
+
josh_commands_of: time_shell.josh_commands_of,
|
|
537
|
+
to_tool_call,
|
|
538
|
+
parse_line,
|
|
539
|
+
parse_timeline,
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
export type { Span, SpanOutcome }
|
|
543
|
+
export { time_spans }
|
|
544
|
+
|
|
545
|
+
export { type Block, type TranscriptLine } from './time-transcript-line'
|