@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,531 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, statSync } from 'node:fs'
|
|
2
|
+
import { homedir } from 'node:os'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { lane_paths } from '#scripts/lane/lane-paths'
|
|
5
|
+
import { cost_usage, type UsageRecord } from './cost-usage'
|
|
6
|
+
|
|
7
|
+
// Finding and reading Claude Code's session transcripts (joshuafolkken/kit#962).
|
|
8
|
+
//
|
|
9
|
+
// They live at `~/.claude/projects/<slug>/<session-id>.jsonl`, where the slug is the working
|
|
10
|
+
// directory with every character that is not a letter, digit or hyphen turned into a hyphen.
|
|
11
|
+
// Verified against this machine's own transcript directory: a working directory named
|
|
12
|
+
// `slug_probe.dir` produced `slug-probe-dir`, and no directory name there contains any other
|
|
13
|
+
// character. Replacing only `/` and `.` left every project whose path holds an underscore or a
|
|
14
|
+
// space resolving to a directory that does not exist, and the command then reported "no
|
|
15
|
+
// transcripts found" for a project whose transcripts were sitting right there.
|
|
16
|
+
//
|
|
17
|
+
// `homedir()` is otherwise forbidden under `scripts/` and this file is the single allowed exception
|
|
18
|
+
// — see `scripts/hooks/no-global-shim-write.test.ts`. The guard exists to stop a lifecycle hook *writing*
|
|
19
|
+
// to a shared, user-level location; this module only ever reads, and the test enforces that.
|
|
20
|
+
|
|
21
|
+
const TRANSCRIPT_ROOT = path.join('.claude', 'projects')
|
|
22
|
+
const TRANSCRIPT_EXTENSION = '.jsonl'
|
|
23
|
+
const SLUG_PATTERN = /[^a-zA-Z0-9-]/gu
|
|
24
|
+
|
|
25
|
+
// Where a delegated unit's transcript is written (joshuafolkken/kit#1285).
|
|
26
|
+
//
|
|
27
|
+
// `epicrun` and `queue` run each child in a delegated unit, and `gate-fix` / `survey` delegate one
|
|
28
|
+
// step of a run. **None of that lands beside the session's own transcript**: the unit writes to
|
|
29
|
+
// `<session-id>/subagents/agent-<agentId>.jsonl`, a subdirectory of the session that delegated it.
|
|
30
|
+
// A reader that lists only `*.jsonl` directly under the project slug therefore sees the parent
|
|
31
|
+
// waiting and none of the work — measured on epic #1272, whose four merged children reported as
|
|
32
|
+
// "CI wait only" with not one minute of implementation, gate or review attributed to any of them.
|
|
33
|
+
const UNIT_DIRECTORY = 'subagents'
|
|
34
|
+
// A unit's id is qualified by the session that delegated it, because an agent id alone reads as a
|
|
35
|
+
// session of its own — and `--session` has to be able to name one unambiguously.
|
|
36
|
+
const UNIT_ID_SEPARATOR = '/'
|
|
37
|
+
|
|
38
|
+
function project_slug(cwd: string): string {
|
|
39
|
+
return cwd.replaceAll(SLUG_PATTERN, '-')
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function transcript_directory(cwd: string, home: string = homedir()): string {
|
|
43
|
+
return path.join(home, TRANSCRIPT_ROOT, project_slug(cwd))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// The checkout a session's transcripts are filed under, which is not always the one a command runs
|
|
47
|
+
// in (joshuafolkken/kit#1617).
|
|
48
|
+
//
|
|
49
|
+
// **A lane is a checkout no session ever ran in.** `epicrun` gives each child a linked work tree and
|
|
50
|
+
// the child prefixes every command with it, but the Claude session itself stays in the main checkout
|
|
51
|
+
// — so the transcripts are filed under the main checkout's slug while `pnpm josh time` invoked from
|
|
52
|
+
// the lane asked for `~/.claude/projects/-Users-…--kit-lanes-1617`, a directory that does not exist.
|
|
53
|
+
// `read_directory` swallows a missing directory, so the walk listed nothing and every
|
|
54
|
+
// transcript-derived row reported as unmeasured — with no line anywhere saying the directory was
|
|
55
|
+
// absent rather than empty. Measured on 2026-09-09: six of six merged runs read `no transcript` from
|
|
56
|
+
// a lane, and `--issue 1597` read four transcripts from the main checkout in the same minute.
|
|
57
|
+
//
|
|
58
|
+
// **Git's own record says which checkout is the main one, and reading it needs no subprocess.** A
|
|
59
|
+
// linked work tree's `.git` is a *file* holding `gitdir: <main>/.git/worktrees/<name>`, so the main
|
|
60
|
+
// checkout is the text in front of that marker. A main checkout has a `.git` directory instead and
|
|
61
|
+
// comes back unchanged, and so does anything this cannot parse — the fallback is exactly the
|
|
62
|
+
// behavior it replaces, which is why a non-repository cwd is unaffected.
|
|
63
|
+
const GIT_ENTRY = '.git'
|
|
64
|
+
const GITDIR_PREFIX = 'gitdir:'
|
|
65
|
+
const WORKTREE_SEGMENT = `/${GIT_ENTRY}/worktrees/`
|
|
66
|
+
const NOT_FOUND = -1
|
|
67
|
+
|
|
68
|
+
function linked_worktree_gitdir(cwd: string): string {
|
|
69
|
+
try {
|
|
70
|
+
const contents = readFileSync(path.join(cwd, GIT_ENTRY), 'utf8').trim()
|
|
71
|
+
|
|
72
|
+
return contents.startsWith(GITDIR_PREFIX) ? contents.slice(GITDIR_PREFIX.length).trim() : ''
|
|
73
|
+
} catch {
|
|
74
|
+
return ''
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// **The pointer is resolved against the work tree before it is read.** Git writes a relative one
|
|
79
|
+
// whenever `worktree.useRelativePaths` is set or the tree was added with `--relative-paths`, and
|
|
80
|
+
// `gitdir: ../../kit/.git/worktrees/1617` sliced as text yields `../../kit` — which slugs to
|
|
81
|
+
// `------kit` and points the walk at a directory that does not exist, reproducing the very failure
|
|
82
|
+
// above with a nonsense path in the `No transcripts found under …` message. `path.resolve` returns an
|
|
83
|
+
// absolute pointer unchanged, so the common case is untouched.
|
|
84
|
+
function session_cwd(cwd: string): string {
|
|
85
|
+
const gitdir = linked_worktree_gitdir(cwd)
|
|
86
|
+
const absolute = gitdir === '' ? '' : path.resolve(cwd, gitdir)
|
|
87
|
+
const segment = absolute.indexOf(WORKTREE_SEGMENT)
|
|
88
|
+
|
|
89
|
+
return segment === NOT_FOUND ? cwd : absolute.slice(0, segment)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// An unreadable directory yields nothing; the caller reports that as a missing transcript rather
|
|
93
|
+
// than as a run that cost zero.
|
|
94
|
+
function read_directory(directory: string): Array<string> {
|
|
95
|
+
try {
|
|
96
|
+
return readdirSync(directory)
|
|
97
|
+
} catch {
|
|
98
|
+
return []
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// The lane transcript directories filed under a main checkout's lane root (joshuafolkken/kit#1832).
|
|
103
|
+
//
|
|
104
|
+
// **`session_cwd` resolved a lane to its main checkout, but nothing resolved a main checkout to its
|
|
105
|
+
// lanes.** From the main checkout `own === rewritten`, so the search collapsed to one directory and a
|
|
106
|
+
// lane run — the default execution form — went unmeasured: eleven of twenty recent merges read `no
|
|
107
|
+
// transcript`, every one of them a lane run.
|
|
108
|
+
//
|
|
109
|
+
// **The search is of the transcript store, not of the lane checkouts.** `lane:close` prunes a merged
|
|
110
|
+
// lane's work tree, so `<lane-root>/<issue>` is gone while `pnpm josh time --issue <that>` must still
|
|
111
|
+
// resolve — and it can, because the transcripts outlive the checkout: the project directory
|
|
112
|
+
// `~/.claude/projects/…--kit-lanes-<issue>` is present long after the tree. So this lists the project
|
|
113
|
+
// store by the slug prefix every lane of this repository shares — `lane_paths.lane_root` slugged, which
|
|
114
|
+
// honors `JOSH_LANE_ROOT` — rather than any directory that may no longer exist.
|
|
115
|
+
//
|
|
116
|
+
// **A lane's directory is its issue number**, so a lane project slug is exactly `<root-slug>-<digits>`:
|
|
117
|
+
// `lane_paths.lane_directory` joins the root with the issue and the registry sorts lanes by
|
|
118
|
+
// `Number(issue)`. Matching the digits rather than the bare prefix keeps out a coincidental sibling
|
|
119
|
+
// such as `.kit-lanes-backup` and a slug filed under a nested cwd — both share the prefix but are not a
|
|
120
|
+
// lane.
|
|
121
|
+
const LANE_ISSUE_SLUG = /^\d+$/u
|
|
122
|
+
|
|
123
|
+
function lane_transcript_directories(main_cwd: string, home: string): Array<string> {
|
|
124
|
+
const projects = path.join(home, TRANSCRIPT_ROOT)
|
|
125
|
+
const prefix = `${project_slug(lane_paths.lane_root(main_cwd))}-`
|
|
126
|
+
|
|
127
|
+
return read_directory(projects)
|
|
128
|
+
.filter((name) => name.startsWith(prefix) && LANE_ISSUE_SLUG.test(name.slice(prefix.length)))
|
|
129
|
+
.map((name) => path.join(projects, name))
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// The directories a run's transcripts might be filed under, given the working directory a command ran
|
|
133
|
+
// in. Two sources are legitimate, so both are searched and `list_sessions_across` merges what they
|
|
134
|
+
// hold:
|
|
135
|
+
// - the cwd's own slug — where a *dispatched* lane child writes, because `lane:dispatch` launches it
|
|
136
|
+
// as a `claude -p fullrun #N` process whose working directory is the lane (joshuafolkken/kit#1749);
|
|
137
|
+
// - every lane transcript directory under the main checkout's lane root — so a report run *from the
|
|
138
|
+
// main checkout* reaches the lane runs it dispatched (joshuafolkken/kit#1832).
|
|
139
|
+
//
|
|
140
|
+
// **A lane never reads the main checkout it resolves to (joshuafolkken/kit#2236).** The reverse of the
|
|
141
|
+
// second source — a lane reading the main checkout's slug — used to be searched as well (the
|
|
142
|
+
// joshuafolkken/kit#1617 case, a session that stayed in the main checkout and only prefixed its
|
|
143
|
+
// commands with the lane path). But `lane:dispatch` now runs the child *in* the lane, so the child's
|
|
144
|
+
// transcript is under the lane's own slug; the main slug held only a connected conversation session's
|
|
145
|
+
// transcript, which the child then measured as its own — its `--cut` verdict read that session's cost
|
|
146
|
+
// and every dispatched child stopped before implementing. So the main slug is no longer a candidate
|
|
147
|
+
// from a lane, and a lane's measurement reads its own records alone.
|
|
148
|
+
//
|
|
149
|
+
// **Only a checkout that resolves to itself reads the lane root**, which is what keeps the from-main
|
|
150
|
+
// case unchanged: a lane resolves to its main through `session_cwd`, so it never picks up its siblings
|
|
151
|
+
// (nor its main), and a submodule or non-repository cwd has a lane root nothing was ever filed under.
|
|
152
|
+
//
|
|
153
|
+
// Deduped, so a main checkout with no lanes, a submodule, or a `.git` this cannot parse searches
|
|
154
|
+
// exactly one directory as before.
|
|
155
|
+
//
|
|
156
|
+
// **The caller invokes this and hands the result to the two readers**, rather than either reader
|
|
157
|
+
// resolving the cwd itself. It is the single point a test redirects the walk into a temporary home,
|
|
158
|
+
// and a reader that re-resolved could name a directory the report never searched.
|
|
159
|
+
function transcript_directories(cwd: string, home: string = homedir()): Array<string> {
|
|
160
|
+
const own = transcript_directory(cwd, home)
|
|
161
|
+
const lanes = session_cwd(cwd) === cwd ? lane_transcript_directories(cwd, home) : []
|
|
162
|
+
|
|
163
|
+
return [...new Set([own, ...lanes])]
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
interface SessionFile {
|
|
167
|
+
session_id: string
|
|
168
|
+
path: string
|
|
169
|
+
modified_ms: number
|
|
170
|
+
// Whether this transcript is a delegated unit's rather than a session's own. Carried on the file
|
|
171
|
+
// because only the discovery knows where it was found, and two readers need the answer: the time
|
|
172
|
+
// side, which must not count a unit's work twice against the parent's wait for it, and the cost
|
|
173
|
+
// side, whose no-argument scope means "the session that just finished" rather than one of its
|
|
174
|
+
// units.
|
|
175
|
+
is_delegated: boolean
|
|
176
|
+
// How many `subagents/` levels down from a session's own transcript this was found: `0` for a
|
|
177
|
+
// session's own file, `1` for a unit it delegated, `2` for a unit that unit delegated, and so on
|
|
178
|
+
// (joshuafolkken/kit#1937). The filesystem is the only record of it — no transcript line carries a
|
|
179
|
+
// parent link — so the run-tree scope reads depth and the immediate parent from where the file sat.
|
|
180
|
+
depth: number
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const OWN_DEPTH = 0
|
|
184
|
+
|
|
185
|
+
function home_directory(): string {
|
|
186
|
+
return homedir()
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function to_session_file(
|
|
190
|
+
full_path: string,
|
|
191
|
+
session_id: string,
|
|
192
|
+
depth: number,
|
|
193
|
+
): SessionFile | undefined {
|
|
194
|
+
try {
|
|
195
|
+
return {
|
|
196
|
+
session_id,
|
|
197
|
+
path: full_path,
|
|
198
|
+
modified_ms: statSync(full_path).mtimeMs,
|
|
199
|
+
is_delegated: depth > OWN_DEPTH,
|
|
200
|
+
depth,
|
|
201
|
+
}
|
|
202
|
+
} catch {
|
|
203
|
+
return undefined
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function is_transcript(name: string): boolean {
|
|
208
|
+
return name.endsWith(TRANSCRIPT_EXTENSION)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function without_extension(name: string): string {
|
|
212
|
+
return name.slice(0, -TRANSCRIPT_EXTENSION.length)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function own_files(directory: string, names: ReadonlyArray<string>): Array<SessionFile> {
|
|
216
|
+
return names
|
|
217
|
+
.filter((name) => is_transcript(name))
|
|
218
|
+
.map((name) => to_session_file(path.join(directory, name), without_extension(name), OWN_DEPTH))
|
|
219
|
+
.filter((file): file is SessionFile => file !== undefined)
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Where one session's delegated units are written. Exported because the layout is this module's
|
|
223
|
+
// knowledge: a caller that rebuilds the path by hand is a second statement of where a unit lives,
|
|
224
|
+
// free to disagree with the one the discovery below walks.
|
|
225
|
+
function unit_directory(directory: string, session_id: string): string {
|
|
226
|
+
return path.join(directory, session_id, UNIT_DIRECTORY)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const UNIT_DEPTH = 1
|
|
230
|
+
|
|
231
|
+
// The `.jsonl` transcripts written directly under one `subagents/` directory, each a unit at this
|
|
232
|
+
// level.
|
|
233
|
+
function level_units(
|
|
234
|
+
subagents_directory: string,
|
|
235
|
+
prefix: string,
|
|
236
|
+
depth: number,
|
|
237
|
+
): Array<SessionFile> {
|
|
238
|
+
return read_directory(subagents_directory)
|
|
239
|
+
.filter((name) => is_transcript(name))
|
|
240
|
+
.map((name) =>
|
|
241
|
+
to_session_file(
|
|
242
|
+
path.join(subagents_directory, name),
|
|
243
|
+
`${prefix}${UNIT_ID_SEPARATOR}${without_extension(name)}`,
|
|
244
|
+
depth,
|
|
245
|
+
),
|
|
246
|
+
)
|
|
247
|
+
.filter((file): file is SessionFile => file !== undefined)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// The units under one `subagents/` directory, and — recursively — the units those units delegated in
|
|
251
|
+
// a `subagents/` of their own (joshuafolkken/kit#1937). A subdirectory beside the transcripts is an
|
|
252
|
+
// agent that itself delegated, so its own `subagents/` is walked one level deeper and the qualified
|
|
253
|
+
// id gains another segment. Nested units do not occur today — a subagent has no `Agent` tool to
|
|
254
|
+
// dispatch with — but the run-tree scope's depth is defined by this walk rather than by what exists.
|
|
255
|
+
function collect_units(
|
|
256
|
+
subagents_directory: string,
|
|
257
|
+
prefix: string,
|
|
258
|
+
depth: number,
|
|
259
|
+
): Array<SessionFile> {
|
|
260
|
+
const nested = read_directory(subagents_directory)
|
|
261
|
+
.filter((name) => !is_transcript(name))
|
|
262
|
+
.flatMap((name) =>
|
|
263
|
+
collect_units(
|
|
264
|
+
unit_directory(subagents_directory, name),
|
|
265
|
+
`${prefix}${UNIT_ID_SEPARATOR}${name}`,
|
|
266
|
+
depth + 1,
|
|
267
|
+
),
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
return [...level_units(subagents_directory, prefix, depth), ...nested]
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// The units one session delegated, at any depth. An entry with no `subagents/` yields nothing rather
|
|
274
|
+
// than throwing, so a session that never delegated — and the `memory/` and `tool-results/`
|
|
275
|
+
// directories Claude Code keeps beside the transcripts — cost one failed read each.
|
|
276
|
+
function unit_files(directory: string, session_name: string): Array<SessionFile> {
|
|
277
|
+
return collect_units(unit_directory(directory, session_name), session_name, UNIT_DEPTH)
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Newest first, so "the run that just finished" is the default with no argument.
|
|
281
|
+
//
|
|
282
|
+
// **A session's own transcript and its delegated units' are both listed.** A run that delegated
|
|
283
|
+
// wrote most of its work to the units and none of it to the file named after the session, so
|
|
284
|
+
// listing only the session files answers such a run with the parent's wait alone. The candidates
|
|
285
|
+
// for a unit directory are the entries that are *not* transcripts, which is why nothing here calls
|
|
286
|
+
// `statSync` to ask what an entry is: the answer that matters is whether a `subagents` inside it
|
|
287
|
+
// can be read.
|
|
288
|
+
function list_sessions(directory: string): Array<SessionFile> {
|
|
289
|
+
const names = read_directory(directory)
|
|
290
|
+
const units = names
|
|
291
|
+
.filter((name) => !is_transcript(name))
|
|
292
|
+
.flatMap((name) => unit_files(directory, name))
|
|
293
|
+
|
|
294
|
+
return [...own_files(directory, names), ...units].toSorted(
|
|
295
|
+
(left, right) => right.modified_ms - left.modified_ms,
|
|
296
|
+
)
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Every session found across a set of candidate directories (joshuafolkken/kit#1825), newest first and
|
|
300
|
+
// each `session_id` kept once. `transcript_directories` is what produces the set; a session file lives
|
|
301
|
+
// under exactly one slug, so the candidates normally hold disjoint sets and the dedupe is what keeps a
|
|
302
|
+
// run counted a single time should the same session ever surface under more than one candidate
|
|
303
|
+
// directory — a merge must not double what it measured.
|
|
304
|
+
function list_sessions_across(directories: ReadonlyArray<string>): Array<SessionFile> {
|
|
305
|
+
const seen = new Set<string>()
|
|
306
|
+
const merged = directories.flatMap((directory) => list_sessions(directory))
|
|
307
|
+
const newest_first = merged.toSorted((left, right) => right.modified_ms - left.modified_ms)
|
|
308
|
+
const kept: Array<SessionFile> = []
|
|
309
|
+
|
|
310
|
+
for (const file of newest_first) {
|
|
311
|
+
if (seen.has(file.session_id)) continue
|
|
312
|
+
seen.add(file.session_id)
|
|
313
|
+
kept.push(file)
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
return kept
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// The session a transcript belongs with: itself, or — for a delegated unit — the session that
|
|
320
|
+
// delegated it, which is the half of the unit's qualified id in front of the separator.
|
|
321
|
+
//
|
|
322
|
+
// **A reader that resolves an overlap needs this, not just `is_delegated`.** A unit's work overlaps
|
|
323
|
+
// the wait of the session that delegated it and nothing else: two unrelated sessions attributed to
|
|
324
|
+
// the same issue can run at the same wall clock — a batch in the background while someone works
|
|
325
|
+
// interactively — and treating every unit as covering every session would delete real work.
|
|
326
|
+
function owning_session_id(file: SessionFile): string {
|
|
327
|
+
const [owner] = file.session_id.split(UNIT_ID_SEPARATOR)
|
|
328
|
+
|
|
329
|
+
return owner ?? file.session_id
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// The immediate parent a delegated unit was written under: everything before the *last* separator of
|
|
333
|
+
// its qualified id (joshuafolkken/kit#1937). `owning_session_id` returns the *root* session — the id
|
|
334
|
+
// before the first separator — which the overlap reader needs; the run-tree scope needs the direct
|
|
335
|
+
// parent instead, so a depth-2 unit links to the depth-1 unit that spawned it rather than to the
|
|
336
|
+
// session at the top. A session's own file has no separator and is its own parent.
|
|
337
|
+
function parent_session_id(file: SessionFile): string {
|
|
338
|
+
const separator = file.session_id.lastIndexOf(UNIT_ID_SEPARATOR)
|
|
339
|
+
|
|
340
|
+
return separator === NOT_FOUND ? file.session_id : file.session_id.slice(0, separator)
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Which of a listing is "the run that just finished": the newest transcript that is a session's own
|
|
344
|
+
// rather than one of its delegated units (joshuafolkken/kit#1285).
|
|
345
|
+
//
|
|
346
|
+
// **A delegated unit is part of a run, not a run of its own**, and it writes the newer file whenever
|
|
347
|
+
// a session delegates — the parent is waiting while the unit works. Taking the head of the listing
|
|
348
|
+
// would therefore answer a no-argument `josh cost` with one child of the batch.
|
|
349
|
+
//
|
|
350
|
+
// **Zero when nothing qualifies**, which reads as "the newest transcript, of whatever kind". That is
|
|
351
|
+
// the right answer in both states it can arise from: a listing narrowed by
|
|
352
|
+
// `--session <parent>/agent-<id>` holds one unit and nothing else, and a whole listing holding only
|
|
353
|
+
// units is a project whose session files were pruned while their `subagents/` survived. In
|
|
354
|
+
// neither is refusing better — there is no session to prefer, a transcript really was found, and the
|
|
355
|
+
// scope line names it `<session-id>/agent-<agentId>`, so the report says which kind it read.
|
|
356
|
+
function latest_own_index(files: ReadonlyArray<SessionFile>): number {
|
|
357
|
+
const index = files.findIndex((file) => !file.is_delegated)
|
|
358
|
+
|
|
359
|
+
return index === -1 ? 0 : index
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// What one transcript yielded, including what it could not yield. The two failure counts are
|
|
363
|
+
// reported rather than folded into silence: a session whose lines are all unparseable and a session
|
|
364
|
+
// that genuinely cost nothing produce the same totals, and only these counts tell them apart.
|
|
365
|
+
interface SessionUsage {
|
|
366
|
+
session_id: string
|
|
367
|
+
records: Array<UsageRecord>
|
|
368
|
+
no_usage_lines: number
|
|
369
|
+
malformed_lines: number
|
|
370
|
+
is_readable: boolean
|
|
371
|
+
// The session's first request's whole billed input: the preamble that existed before any work
|
|
372
|
+
// happened. Computed here because only the session knows which of its records came first — a
|
|
373
|
+
// caller holding a filtered slice cannot recover it.
|
|
374
|
+
baseline_tokens: number
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Built per call rather than shared: a single `records: []` spread into every unreadable session
|
|
378
|
+
// would hand them all the same array instance.
|
|
379
|
+
function empty_session(): Omit<SessionUsage, 'session_id'> {
|
|
380
|
+
return {
|
|
381
|
+
records: [],
|
|
382
|
+
no_usage_lines: 0,
|
|
383
|
+
malformed_lines: 0,
|
|
384
|
+
is_readable: false,
|
|
385
|
+
baseline_tokens: 0,
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
function tally(content: string): Omit<SessionUsage, 'session_id'> {
|
|
390
|
+
const outcomes = content.split('\n').map((line) => cost_usage.parse_line(line))
|
|
391
|
+
const records: Array<UsageRecord> = outcomes.flatMap((outcome) =>
|
|
392
|
+
outcome.kind === 'record' ? [outcome.record] : [],
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
const unique = cost_usage.dedupe(records)
|
|
396
|
+
const [first] = unique
|
|
397
|
+
|
|
398
|
+
return {
|
|
399
|
+
records: unique,
|
|
400
|
+
no_usage_lines: outcomes.filter((outcome) => outcome.kind === 'no_usage').length,
|
|
401
|
+
malformed_lines: outcomes.filter((outcome) => outcome.kind === 'malformed').length,
|
|
402
|
+
is_readable: true,
|
|
403
|
+
baseline_tokens: first === undefined ? 0 : cost_usage.billed_input(first.totals),
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
function read_text(file_path: string): string | undefined {
|
|
408
|
+
try {
|
|
409
|
+
return readFileSync(file_path, 'utf8')
|
|
410
|
+
} catch {
|
|
411
|
+
return undefined
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
function read_session(file: SessionFile): SessionUsage {
|
|
416
|
+
const content = read_text(file.path)
|
|
417
|
+
|
|
418
|
+
if (content === undefined) return { session_id: file.session_id, ...empty_session() }
|
|
419
|
+
|
|
420
|
+
return { session_id: file.session_id, ...tally(content) }
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// The transcript's own text, for the readers that need the lines rather than the usage totals —
|
|
424
|
+
// `cost-blocks.ts` classifies what the conversation is made of and cannot work from `UsageRecord`s.
|
|
425
|
+
// An unreadable file yields an empty string, exactly as `read_session` yields an empty session:
|
|
426
|
+
// "could not be read" is already reported through `is_readable`, and throwing here would turn one
|
|
427
|
+
// missing session into a failed command.
|
|
428
|
+
function read_raw(file: SessionFile): string {
|
|
429
|
+
return read_text(file.path) ?? ''
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// The same read, with the failure left visible (joshuafolkken/kit#1439). **An unreadable transcript
|
|
433
|
+
// and an empty one are different answers**, and `read_raw` folds both to `''` — right for a reader
|
|
434
|
+
// that only wants lines to parse, and wrong for one that has to report a transcript as *not
|
|
435
|
+
// measured* rather than as measured at zero. `is_readable` on `SessionUsage` is the same distinction
|
|
436
|
+
// on the cost side; this is it for a caller that wants the text.
|
|
437
|
+
function read_optional(file: SessionFile): string | undefined {
|
|
438
|
+
return read_text(file.path)
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// One directory the search looked in, and whether it was there to look in. `exists` tells a directory
|
|
442
|
+
// that was absent from one that was present but held no transcript — the distinction
|
|
443
|
+
// joshuafolkken/kit#1617 found `read_directory` swallowing, which is what let a lane's missing slug
|
|
444
|
+
// read the same as an empty one and delayed finding this bug (joshuafolkken/kit#1825).
|
|
445
|
+
interface SearchedDirectory {
|
|
446
|
+
path: string
|
|
447
|
+
exists: boolean
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// **A missing directory and an empty one are different answers**, and `read_directory` folds both to
|
|
451
|
+
// an empty listing. This asks the filesystem the one question that separates them, so the missing
|
|
452
|
+
// message can report each candidate's real reason.
|
|
453
|
+
function directory_exists(directory: string): boolean {
|
|
454
|
+
try {
|
|
455
|
+
return statSync(directory).isDirectory()
|
|
456
|
+
} catch {
|
|
457
|
+
return false
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// The directories a search covered, each tagged with whether it existed — what the missing message is
|
|
462
|
+
// built from. Takes the same list `transcript_directories` handed the walk, so the report can never
|
|
463
|
+
// name a directory the search did not actually look in.
|
|
464
|
+
function searched_directories(directories: ReadonlyArray<string>): Array<SearchedDirectory> {
|
|
465
|
+
return directories.map((directory) => ({
|
|
466
|
+
path: directory,
|
|
467
|
+
exists: directory_exists(directory),
|
|
468
|
+
}))
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
function describe_searched(directory: SearchedDirectory): string {
|
|
472
|
+
return ` ${directory.path} — ${directory.exists ? 'no transcripts here' : 'no such directory'}`
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// What to say when the discovery above found nothing. It lives here rather than in either command
|
|
476
|
+
// because both `josh cost` and `josh time` reach it, and a second copy would drift the moment one of
|
|
477
|
+
// them learned something about where transcripts live (joshuafolkken/kit#1267). The message, not the
|
|
478
|
+
// printing: each command owns its own streams and exit code.
|
|
479
|
+
//
|
|
480
|
+
// **The directories are passed in, not resolved here.** The whole point of the message is to name
|
|
481
|
+
// where the command looked, so they have to be the same paths the search used — resolving them a
|
|
482
|
+
// second time can name a directory that was never searched. Both candidates are listed, each with its
|
|
483
|
+
// own reason (absent, or present but empty), so a run whose lane slug does not exist reads differently
|
|
484
|
+
// from one whose main slug exists and is empty (joshuafolkken/kit#1825).
|
|
485
|
+
//
|
|
486
|
+
// "No transcript was found" and "this run cost nothing" are different answers, and only one of them
|
|
487
|
+
// is ever true — which is why neither command may report an empty corpus as a zero.
|
|
488
|
+
function missing_message(
|
|
489
|
+
searched: ReadonlyArray<SearchedDirectory>,
|
|
490
|
+
session_id: string | undefined,
|
|
491
|
+
): Array<string> {
|
|
492
|
+
const lead =
|
|
493
|
+
session_id === undefined
|
|
494
|
+
? 'No transcripts found. Searched:'
|
|
495
|
+
: `No transcript named ${session_id}. Searched:`
|
|
496
|
+
const listed = searched.map((directory) => describe_searched(directory))
|
|
497
|
+
|
|
498
|
+
if (session_id !== undefined) return [lead, ...listed]
|
|
499
|
+
|
|
500
|
+
return [
|
|
501
|
+
lead,
|
|
502
|
+
...listed,
|
|
503
|
+
'Claude Code writes them per project; run this from the project it ran in.',
|
|
504
|
+
]
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
const cost_transcript = {
|
|
508
|
+
TRANSCRIPT_EXTENSION,
|
|
509
|
+
TRANSCRIPT_ROOT,
|
|
510
|
+
UNIT_DIRECTORY,
|
|
511
|
+
project_slug,
|
|
512
|
+
transcript_directory,
|
|
513
|
+
transcript_directories,
|
|
514
|
+
session_cwd,
|
|
515
|
+
unit_directory,
|
|
516
|
+
list_sessions,
|
|
517
|
+
list_sessions_across,
|
|
518
|
+
searched_directories,
|
|
519
|
+
owning_session_id,
|
|
520
|
+
parent_session_id,
|
|
521
|
+
latest_own_index,
|
|
522
|
+
tally,
|
|
523
|
+
read_session,
|
|
524
|
+
read_raw,
|
|
525
|
+
read_optional,
|
|
526
|
+
missing_message,
|
|
527
|
+
home_directory,
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
export type { SearchedDirectory, SessionFile, SessionUsage }
|
|
531
|
+
export { cost_transcript }
|