@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,253 @@
|
|
|
1
|
+
import type { FollowupStage } from '#scripts/git/git-followup-stages'
|
|
2
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
3
|
+
import { z } from 'zod'
|
|
4
|
+
import { time_background } from './time-background'
|
|
5
|
+
import { time_followup_stage } from './time-followup-stage'
|
|
6
|
+
import { time_instant } from './time-instant'
|
|
7
|
+
import { time_reported_failure } from './time-reported-failure'
|
|
8
|
+
|
|
9
|
+
// One line of a session transcript, read into the shape the span walk works on
|
|
10
|
+
// (joshuafolkken/kit#1406).
|
|
11
|
+
//
|
|
12
|
+
// It moved out of `time-spans.ts` when that file passed its length limit — the seam that file is
|
|
13
|
+
// already cut along elsewhere (`time-shell.ts`, `time-single-check.ts`), where the *reading* of a
|
|
14
|
+
// field lives beside the field and the arithmetic stays next door. What is here is the JSONL shape
|
|
15
|
+
// and nothing about time: schemas, the two records a line yields, and the parse that turns a string
|
|
16
|
+
// into one.
|
|
17
|
+
//
|
|
18
|
+
// **The block reader is not `cost-blocks.ts` and could not have been.** That module flattens every
|
|
19
|
+
// line into one list of blocks for a token estimate, dropping the `id` / `tool_use_id` pair a call is
|
|
20
|
+
// matched to its result by and the line boundary a timestamp belongs to. Both are the whole input
|
|
21
|
+
// here.
|
|
22
|
+
|
|
23
|
+
const BLOCK_SCHEMA = z.object({
|
|
24
|
+
type: z.string().nullish(),
|
|
25
|
+
name: z.string().nullish(),
|
|
26
|
+
id: z.string().nullish(),
|
|
27
|
+
|
|
28
|
+
tool_use_id: z.string().nullish(),
|
|
29
|
+
input: z.unknown().nullish(),
|
|
30
|
+
// Whether the harness wrote this result back as a failure (joshuafolkken/kit#1309). Present on a
|
|
31
|
+
// `tool_result` block and on nothing else, and absent even there for the tools that never report
|
|
32
|
+
// one — which is why it is read as three answers rather than as a boolean with a default.
|
|
33
|
+
is_error: z.boolean().nullish(),
|
|
34
|
+
// What the call printed. Read only to recover the outcome a pipeline threw away
|
|
35
|
+
// (joshuafolkken/kit#1361): it is kept as flattened text rather than as blocks, because that is
|
|
36
|
+
// the whole of what `time-reported-failure.ts` asks of it.
|
|
37
|
+
content: z.unknown().nullish(),
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
const CONTENT_SCHEMA = z.union([z.string(), z.array(BLOCK_SCHEMA)])
|
|
41
|
+
// `id` is the assistant *message* the line belongs to, and Claude Code writes one line per content
|
|
42
|
+
// block — a turn that thought and then issued two calls is three lines carrying one id
|
|
43
|
+
// (joshuafolkken/kit#1329). Anything asking "how many calls did that turn make" therefore has to
|
|
44
|
+
// group by this field; counting one line's blocks answers one, whatever the turn actually did. Since
|
|
45
|
+
// joshuafolkken/kit#1406 the same field is what says how many *turns* a run had.
|
|
46
|
+
const MESSAGE_SCHEMA = z.object({ id: z.string().nullish(), content: CONTENT_SCHEMA.nullish() })
|
|
47
|
+
|
|
48
|
+
const LINE_SCHEMA = z.object({
|
|
49
|
+
type: z.string().nullish(),
|
|
50
|
+
timestamp: z.string().nullish(),
|
|
51
|
+
// The branch the line was written on, which is where the issue number lives — `josh git` names a
|
|
52
|
+
// branch `<N>-<slug>`. Read here rather than re-parsed by a second reader so `josh time --issue`
|
|
53
|
+
// and `josh cost --issue` answer from the same field (joshuafolkken/kit#1268).
|
|
54
|
+
gitBranch: z.string().nullish(),
|
|
55
|
+
// The two fields outside `message` that the harness writes an end-of-task notice on
|
|
56
|
+
// (joshuafolkken/kit#1696). **Both are read as `unknown` rather than as strings**: a schema
|
|
57
|
+
// insisting on a string here would reject every line whose `content` is a list of blocks — which is
|
|
58
|
+
// most of them — and a rejected line is dropped from the timeline entirely, so the shares would stop
|
|
59
|
+
// reconstructing the elapsed time. The shape is checked at the read below instead.
|
|
60
|
+
content: z.unknown().nullish(),
|
|
61
|
+
attachment: z.unknown().nullish(),
|
|
62
|
+
message: MESSAGE_SCHEMA.nullish(),
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
const UNKNOWN_BRANCH = ''
|
|
66
|
+
// The field an attachment line carries the notice in. Named rather than written as a literal for the
|
|
67
|
+
// reason `time-background.ts`'s `BASH_ID_KEY` is: `dot-notation` rewrote `record['prompt']` into
|
|
68
|
+
// `record.prompt`, which a value read as an index-signature record does not have — until
|
|
69
|
+
// joshuafolkken/kit#1783 switched that fix off. The name is kept for its own sake.
|
|
70
|
+
const PROMPT_KEY = 'prompt'
|
|
71
|
+
const NO_MESSAGE_ID = ''
|
|
72
|
+
// How much of an errored body is kept (joshuafolkken/kit#1642). A refusal's body *is* the reason the
|
|
73
|
+
// harness wrote back, from its first character, so an opening this long identifies the speaker
|
|
74
|
+
// without retaining the output of every failed command a session ran.
|
|
75
|
+
const ERROR_TEXT_LIMIT = 256
|
|
76
|
+
// The icon every guard refusal opens with (joshuafolkken/kit#1913). It is not `status_icons.FAIL_ICON`
|
|
77
|
+
// — that one (`✗`) marks a josh check's failing item, which `has_failure_line` scans for; this one
|
|
78
|
+
// marks a PreToolUse hook's *deny* reason, which is a different body carried in a different result. No
|
|
79
|
+
// shared constant exists because each guard writes the literal in its own reason, so the one place a
|
|
80
|
+
// refusal is *detected* names it here.
|
|
81
|
+
const REFUSAL_MARKER = '⛔'
|
|
82
|
+
|
|
83
|
+
interface Block {
|
|
84
|
+
type: string
|
|
85
|
+
name: string
|
|
86
|
+
id: string
|
|
87
|
+
result_id: string
|
|
88
|
+
input: unknown
|
|
89
|
+
// `undefined` where the block carried no `is_error` field, which is a different fact from
|
|
90
|
+
// `false`: one is a tool that reports no outcome, the other a call that succeeded.
|
|
91
|
+
is_error: boolean | undefined
|
|
92
|
+
// Whether the body carried a line opening with josh's failure icon — the one bit of it anything
|
|
93
|
+
// reads (joshuafolkken/kit#1361). The text itself is deliberately not kept: a field holding it
|
|
94
|
+
// would retain every byte the session's tools printed for the length of the parse.
|
|
95
|
+
has_failure_line: boolean
|
|
96
|
+
// The stage rows a `pnpm josh followup` call printed into its own output
|
|
97
|
+
// (joshuafolkken/kit#1445). Read here for the same reason the bit above is, and it obeys the same
|
|
98
|
+
// prohibition: what is kept is the ten-odd parsed laps, never the body they were read from. Empty
|
|
99
|
+
// for every other tool result, which is nearly all of them.
|
|
100
|
+
followup_stages: ReadonlyArray<FollowupStage>
|
|
101
|
+
// The opening of the body of a result the harness wrote back as a failure, and `''` for every
|
|
102
|
+
// other block (joshuafolkken/kit#1642). It obeys the same prohibition as the two fields above —
|
|
103
|
+
// what is kept is a bounded opening, never the whole body — and it exists so a reader asking
|
|
104
|
+
// which refusal a line carried can be answered from the parsed block rather than by matching
|
|
105
|
+
// `"is_error":true` against the raw line, a test one whitespace in the serializer defeats and
|
|
106
|
+
// which cannot tell one errored block from another on the same line.
|
|
107
|
+
error_text: string
|
|
108
|
+
// Which guard refused this call, read off the opening of an errored result and `''` for every other
|
|
109
|
+
// block (joshuafolkken/kit#1913). It obeys the same prohibition as `error_text` — what is kept is a
|
|
110
|
+
// short label, never the body — and it exists so the per-guard refusal breakdown can be answered from
|
|
111
|
+
// the parsed block rather than by re-scanning the body downstream. `''` where the result was not a
|
|
112
|
+
// `⛔` refusal, so a reader tells "no guard spoke" from "this guard spoke" without a second parse.
|
|
113
|
+
refusal_guard: string
|
|
114
|
+
// The id the harness assigned to a command it took into the background, and `''` for every other
|
|
115
|
+
// block (joshuafolkken/kit#1662). It is the fourth field read off the body under the same
|
|
116
|
+
// prohibition as the three above — what is kept is the id, never the text it was read from — and
|
|
117
|
+
// it is what pairs a launch with the call that later reads its output, so the minutes the command
|
|
118
|
+
// actually ran can be placed on the timeline instead of only the seconds its launch call took.
|
|
119
|
+
background_id: string
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
interface TranscriptLine {
|
|
123
|
+
type: string
|
|
124
|
+
timestamp_ms: number
|
|
125
|
+
branch: string
|
|
126
|
+
// The background run this line is the harness's end-of-task notice for, and `''` for every other
|
|
127
|
+
// line (joshuafolkken/kit#1696). It is read here rather than downstream for the reason every
|
|
128
|
+
// derived field above is: the notice is the line's whole content, which a span does not keep, and
|
|
129
|
+
// it is the only thing in a transcript that says a command had *finished* rather than merely been
|
|
130
|
+
// looked at.
|
|
131
|
+
finished_background: string
|
|
132
|
+
// The assistant message this line is one block of, or `''` where the line carries none — a user
|
|
133
|
+
// line, or an assistant line written without an id. The empty string is never treated as a group:
|
|
134
|
+
// every line lacking an id would otherwise fall into one bucket spanning the whole file.
|
|
135
|
+
message_id: string
|
|
136
|
+
blocks: Array<Block>
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// The four string fields, defaulted together and apart from the two that are not strings. Split out
|
|
140
|
+
// so neither half carries every `??` in the block: read as one function the defaulting alone reached
|
|
141
|
+
// the complexity limit, and the next field added would have had to be squeezed in beside them.
|
|
142
|
+
function block_names(
|
|
143
|
+
raw: z.infer<typeof BLOCK_SCHEMA>,
|
|
144
|
+
): Pick<Block, 'type' | 'name' | 'id' | 'result_id'> {
|
|
145
|
+
return {
|
|
146
|
+
type: raw.type ?? '',
|
|
147
|
+
name: raw.name ?? '',
|
|
148
|
+
id: raw.id ?? '',
|
|
149
|
+
result_id: raw.tool_use_id ?? '',
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// **A refusal is identified by what its body opens with, never by what it carries inside**
|
|
154
|
+
// (joshuafolkken/kit#1913). The hook denies a call on behalf of the one guard whose trigger fired and
|
|
155
|
+
// writes that guard's reason back as the whole result, so the speaker is the token after the `⛔` and
|
|
156
|
+
// before the first `:` — `⛔ pre-gate cut: …` is `pre-gate cut`. A reason with no colon (a headline
|
|
157
|
+
// like `⛔ scoped checks not green on this tree`) is taken whole. Reading the opening rather than
|
|
158
|
+
// searching the body is what stops a result that merely quoted a reason being read as a refusal.
|
|
159
|
+
function guard_from_refusal(text: string): string {
|
|
160
|
+
const trimmed = text.trimStart()
|
|
161
|
+
if (!trimmed.startsWith(REFUSAL_MARKER)) return ''
|
|
162
|
+
|
|
163
|
+
const headline = trimmed.slice(REFUSAL_MARKER.length).split('\n', 1)[0]?.trimStart() ?? ''
|
|
164
|
+
const colon = headline.indexOf(':')
|
|
165
|
+
|
|
166
|
+
return (colon === -1 ? headline : headline.slice(0, colon)).trim()
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// **The body is flattened once and both readers are handed the text.** `result_text` is what turns a
|
|
170
|
+
// content field that may be a string or a list of blocks into one string, and it is idempotent on a
|
|
171
|
+
// string — so passing its own output back to `has_failure_line` reads exactly as passing the raw
|
|
172
|
+
// field did, at one flattening instead of two (joshuafolkken/kit#1445).
|
|
173
|
+
function to_block(raw: z.infer<typeof BLOCK_SCHEMA>): Block {
|
|
174
|
+
const text = time_reported_failure.result_text(raw.content)
|
|
175
|
+
const is_error = raw.is_error ?? undefined
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
...block_names(raw),
|
|
179
|
+
input: raw.input,
|
|
180
|
+
is_error,
|
|
181
|
+
has_failure_line: time_reported_failure.has_failure_line(text),
|
|
182
|
+
followup_stages: time_followup_stage.read_stages(text),
|
|
183
|
+
error_text: is_error === true ? text.slice(0, ERROR_TEXT_LIMIT) : '',
|
|
184
|
+
refusal_guard: is_error === true ? guard_from_refusal(text) : '',
|
|
185
|
+
background_id: time_background.launch_id(text),
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// A user turn written as a bare string carries no blocks, which is exactly right: it is a prompt,
|
|
190
|
+
// and a prompt has no tool result to match.
|
|
191
|
+
function to_blocks(
|
|
192
|
+
content: string | Array<z.infer<typeof BLOCK_SCHEMA>> | null | undefined,
|
|
193
|
+
): Array<Block> {
|
|
194
|
+
return typeof content === 'string' || content === null || content === undefined
|
|
195
|
+
? []
|
|
196
|
+
: content.map((block) => to_block(block))
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// The two fields read off `message`, taken together because they are one reading: an assistant turn
|
|
200
|
+
// is written as one line per content block with the message's id repeated on each, so the id is what
|
|
201
|
+
// says which blocks belonged to the same turn.
|
|
202
|
+
function message_fields(
|
|
203
|
+
message: z.infer<typeof MESSAGE_SCHEMA> | null | undefined,
|
|
204
|
+
): Pick<TranscriptLine, 'message_id' | 'blocks'> {
|
|
205
|
+
return { message_id: message?.id ?? NO_MESSAGE_ID, blocks: to_blocks(message?.content) }
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// **One notice reaches the transcript on any of three line kinds, and which of them a session holds
|
|
209
|
+
// varies** (joshuafolkken/kit#1696). The harness writes it on a `queue-operation` line when the notice
|
|
210
|
+
// is generated, on an `attachment` line when it is delivered, and on a `user` line where it enters the
|
|
211
|
+
// conversation — and a run measured against one carrier alone came back unmeasured whenever the
|
|
212
|
+
// session happened to hold a different one. All three are read, and `time_background.finished_at`
|
|
213
|
+
// keeps the earliest instant per id, so what is paired with the launch is when the task *ended* rather
|
|
214
|
+
// than when the run was told about it.
|
|
215
|
+
function notice_text(data: z.infer<typeof LINE_SCHEMA>): string {
|
|
216
|
+
const attachment = json_value.is_record(data.attachment) ? data.attachment[PROMPT_KEY] : undefined
|
|
217
|
+
const carried = [data.message?.content, data.content, attachment]
|
|
218
|
+
|
|
219
|
+
return carried.find((one): one is string => typeof one === 'string') ?? ''
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// A line without a parseable timestamp is dropped rather than dated: it has no place on a timeline,
|
|
223
|
+
// and inventing one would move every span around it.
|
|
224
|
+
function to_line(data: z.infer<typeof LINE_SCHEMA>): TranscriptLine | undefined {
|
|
225
|
+
const timestamp_ms = time_instant.parse_instant(data.timestamp)
|
|
226
|
+
|
|
227
|
+
if (timestamp_ms === undefined) return undefined
|
|
228
|
+
|
|
229
|
+
return {
|
|
230
|
+
type: data.type ?? '',
|
|
231
|
+
timestamp_ms,
|
|
232
|
+
branch: data.gitBranch ?? UNKNOWN_BRANCH,
|
|
233
|
+
finished_background: time_background.finished_id(notice_text(data)),
|
|
234
|
+
...message_fields(data.message),
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function parse_line(line: string): TranscriptLine | undefined {
|
|
239
|
+
const parsed = LINE_SCHEMA.safeParse(json_value.parse_or_undefined(line))
|
|
240
|
+
|
|
241
|
+
return parsed.success ? to_line(parsed.data) : undefined
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const time_transcript_line = {
|
|
245
|
+
ERROR_TEXT_LIMIT,
|
|
246
|
+
REFUSAL_MARKER,
|
|
247
|
+
NO_MESSAGE_ID,
|
|
248
|
+
guard_from_refusal,
|
|
249
|
+
parse_line,
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export type { Block, TranscriptLine }
|
|
253
|
+
export { time_transcript_line }
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { time_bundle_call } from './time-bundle-call'
|
|
2
|
+
import { time_markers } from './time-markers'
|
|
3
|
+
|
|
4
|
+
// Which files one tool call **wrote** (joshuafolkken/kit#1472).
|
|
5
|
+
//
|
|
6
|
+
// **A span keeps no tool input**, so anything read off the input has to be read while the input is
|
|
7
|
+
// still in hand — the reason `marker`, `targets` and `check_key` are already carried on `ToolCall`
|
|
8
|
+
// rather than re-derived later. What was missing is the other half of that pair: a span said what a
|
|
9
|
+
// call *named*, and never what it *changed*.
|
|
10
|
+
//
|
|
11
|
+
// **Two writes were therefore invisible, and both made the unedited count too large.**
|
|
12
|
+
// `investigation-reads.ts` subtracts an edit from the set of files a run has read and not edited, and
|
|
13
|
+
// it could only subtract what a span could describe:
|
|
14
|
+
//
|
|
15
|
+
// - `sed -i` labels as `Bash: sed`, exactly as the `sed -n` that is this repository's main reading
|
|
16
|
+
// command does, so a file written in place was counted as read and never taken back out.
|
|
17
|
+
// `CLAUDE.md` allows a small `sed -i` explicitly, so this is daily rather than exceptional.
|
|
18
|
+
// - `MultiEdit` and `NotebookEdit` are edit tools for `time-markers.ts` but not bundleable ones for
|
|
19
|
+
// `time-bundle-call.ts`, so their spans arrived carrying `EDIT_MARKER` and `targets: []` — a
|
|
20
|
+
// subtraction with nothing to subtract.
|
|
21
|
+
//
|
|
22
|
+
// **This module is the one place that answers the question**, so the two callers cannot come to
|
|
23
|
+
// disagree about it, and it reuses the extraction `time-bundle-call.ts` already owns rather than
|
|
24
|
+
// writing a second one: `tool_targets` for a tool's own path fields, `targets_in` for a shell line.
|
|
25
|
+
// Nothing here widens `BUNDLEABLE_TOOLS` — that set is what the batching measurement of
|
|
26
|
+
// joshuafolkken/kit#1390 is defined over, and a call that writes is deliberately not bundleable.
|
|
27
|
+
|
|
28
|
+
// **Whether a line is an in-place `sed` is `time-bundle-call.ts`'s answer, not a second one here**
|
|
29
|
+
// (joshuafolkken/kit#1509). That module needs the same test as a boolean for the batching sequences,
|
|
30
|
+
// and while the two were written separately they disagreed in both directions at once — one read the
|
|
31
|
+
// whole line, so a piped `grep -i` made a read into a write; the other missed a bundled `sed -ni`, so
|
|
32
|
+
// one span could carry `writes: ['x.ts']` beside `is_writing: false`. The segment scoping and the
|
|
33
|
+
// quote removal that keep both honest are stated at `write_segment` there.
|
|
34
|
+
//
|
|
35
|
+
// **This is still not `time-batch-guard.ts`'s `WRITING_WORDS`, which excludes `sed` outright rather
|
|
36
|
+
// than testing for `-i`** (that file states the choice at its own constant). Those answer different
|
|
37
|
+
// questions and must differ: refusing a call half-applies a turn, so that guard treats every `sed` as
|
|
38
|
+
// a write and errs toward allowing. What this module adds is *which* files, which a boolean could
|
|
39
|
+
// not — and this set is subtracted, so an over-claim would delete a genuine pending read.
|
|
40
|
+
|
|
41
|
+
// What a `Bash` line wrote. Only an in-place `sed` is claimed: a `>` redirection and a heredoc write
|
|
42
|
+
// too, but naming them here would also claim the file the same line *read*, and this set is
|
|
43
|
+
// subtracted rather than added — an over-claim silently removes a genuine pending read.
|
|
44
|
+
//
|
|
45
|
+
// The targets are read from the same segment the predicate answered about, so a file named in a later
|
|
46
|
+
// pipeline stage cannot be claimed as written by the first one.
|
|
47
|
+
function bash_writes(command: string): ReadonlyArray<string> {
|
|
48
|
+
const segment = time_bundle_call.write_segment(command)
|
|
49
|
+
|
|
50
|
+
return time_bundle_call.is_in_place_sed(segment) ? time_bundle_call.targets_in(segment) : []
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// What a non-`Bash` call wrote: its path fields, when the tool is one `time-markers.ts` already
|
|
54
|
+
// recognizes as opening implementation. Asking that module rather than keeping a second edit-tool set
|
|
55
|
+
// is what makes `MultiEdit` and `NotebookEdit` answer here without being added anywhere new.
|
|
56
|
+
function tool_writes(name: string, input: unknown): ReadonlyArray<string> {
|
|
57
|
+
if (time_markers.tool_marker(name, input) !== time_markers.EDIT_MARKER) return []
|
|
58
|
+
|
|
59
|
+
return time_bundle_call.tool_targets(input)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// **No `call_writes` beside these two.** `time-bundle-call.ts` has a `call_facts` because a
|
|
63
|
+
// `PreToolUse` payload asks it about a raw invocation; nothing asks this module that — the live guard
|
|
64
|
+
// never refuses an in-place `sed` or a `MultiEdit` in the first place — and an unwrapping entry point
|
|
65
|
+
// with no caller is a second place for `Bash` handling to drift.
|
|
66
|
+
const time_writes = {
|
|
67
|
+
bash_writes,
|
|
68
|
+
tool_writes,
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export { time_writes }
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { readdirSync, readFileSync } from 'node:fs'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { fileURLToPath } from 'node:url'
|
|
5
|
+
import { changed_paths } from '#scripts/git/changed-paths'
|
|
6
|
+
import { git_command } from '#scripts/git/git-command'
|
|
7
|
+
import { ui_routes } from './ui-routes'
|
|
8
|
+
|
|
9
|
+
// `josh ui:routes [--staged]` — list the screenshot-target routes the current change touches
|
|
10
|
+
// (joshuafolkken/kit#2182).
|
|
11
|
+
//
|
|
12
|
+
// The derivation lives in `ui-routes.ts`; this file is the I/O around it: read the changed paths
|
|
13
|
+
// (the branch diff, or the staged diff with `--staged`), and resolve a shared component to the routes
|
|
14
|
+
// that import it by scanning `src/routes`. A change that derives no route prints that plainly rather
|
|
15
|
+
// than guessing, matching the `verify-ui` skill's "do not guess".
|
|
16
|
+
|
|
17
|
+
const ARGV_OFFSET = 2
|
|
18
|
+
const USAGE = 'Usage: josh ui:routes [--staged]'
|
|
19
|
+
const STAGED_FLAG = '--staged'
|
|
20
|
+
const ROUTES_DIR = 'src/routes'
|
|
21
|
+
const PATH_SEPARATOR = '/'
|
|
22
|
+
const FAILURE_EXIT_CODE = 1
|
|
23
|
+
const NO_ROUTES_MESSAGE =
|
|
24
|
+
'no route derived from this change — name the screen to capture, do not guess'
|
|
25
|
+
|
|
26
|
+
interface RouteFile {
|
|
27
|
+
absolute: string
|
|
28
|
+
relative: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type ImporterFinder = (component: string) => Array<string>
|
|
32
|
+
|
|
33
|
+
// `undefined` on an unknown flag rather than a default: a misspelled flag makes the invocation
|
|
34
|
+
// unreadable, and an unreadable invocation is refused, not answered.
|
|
35
|
+
function parse_staged(argv: ReadonlyArray<string>): boolean | undefined {
|
|
36
|
+
if (argv.some((argument) => argument !== STAGED_FLAG)) return undefined
|
|
37
|
+
|
|
38
|
+
return argv.includes(STAGED_FLAG)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function base_name(file: string): string {
|
|
42
|
+
return file.slice(file.lastIndexOf(PATH_SEPARATOR) + 1)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function to_route_file(root: string, directory: string, name: string): RouteFile {
|
|
46
|
+
const absolute = path.join(directory, name)
|
|
47
|
+
|
|
48
|
+
return { absolute, relative: path.relative(root, absolute).split(path.sep).join(PATH_SEPARATOR) }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function route_files(root: string): Array<RouteFile> {
|
|
52
|
+
try {
|
|
53
|
+
return readdirSync(path.join(root, ROUTES_DIR), { recursive: true, withFileTypes: true })
|
|
54
|
+
.filter((entry) => entry.isFile())
|
|
55
|
+
.map((entry) => to_route_file(root, entry.parentPath, entry.name))
|
|
56
|
+
} catch {
|
|
57
|
+
return []
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function read_text(file: string): string {
|
|
62
|
+
try {
|
|
63
|
+
return readFileSync(file, 'utf8')
|
|
64
|
+
} catch {
|
|
65
|
+
return ''
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// A route file imports the component when its source names the component's file — the import
|
|
70
|
+
// statement carries the `.svelte` path. Over-inclusion is the safe direction for a candidate list: a
|
|
71
|
+
// spare route is dropped by the reader, a missing one is never captured.
|
|
72
|
+
function build_find_importers(files: ReadonlyArray<RouteFile>): ImporterFinder {
|
|
73
|
+
return (component) =>
|
|
74
|
+
files
|
|
75
|
+
.filter((file) => read_text(file.absolute).includes(base_name(component)))
|
|
76
|
+
.map((file) => file.relative)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function print_routes(routes: ReadonlyArray<string>): void {
|
|
80
|
+
if (routes.length === 0) {
|
|
81
|
+
console.info(NO_ROUTES_MESSAGE)
|
|
82
|
+
|
|
83
|
+
return
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
for (const route of routes) console.info(route)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
90
|
+
const is_staged = parse_staged(argv)
|
|
91
|
+
|
|
92
|
+
if (is_staged === undefined) {
|
|
93
|
+
console.error(USAGE)
|
|
94
|
+
|
|
95
|
+
return FAILURE_EXIT_CODE
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const changed = await changed_paths.read_changed_paths(is_staged)
|
|
99
|
+
const find_importers = build_find_importers(route_files(await git_command.repository_root()))
|
|
100
|
+
|
|
101
|
+
print_routes(ui_routes.derive_routes(changed, find_importers))
|
|
102
|
+
|
|
103
|
+
return 0
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
107
|
+
process.exitCode = await run(argv)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const ui_routes_cli = {
|
|
111
|
+
build_find_importers,
|
|
112
|
+
main,
|
|
113
|
+
parse_staged,
|
|
114
|
+
print_routes,
|
|
115
|
+
route_files,
|
|
116
|
+
run,
|
|
117
|
+
USAGE,
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
121
|
+
|
|
122
|
+
export { ui_routes_cli }
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// The screenshot-target routes a change touches, derived from the diff rather than chosen by eye
|
|
2
|
+
// (joshuafolkken/kit#2182).
|
|
3
|
+
//
|
|
4
|
+
// The `verify-ui` skill's §1 asked the reader to read `git diff` and name the routes whose
|
|
5
|
+
// components, styles or copy it touches — but in SvelteKit a file path maps to a route path
|
|
6
|
+
// mechanically, so the candidate list is computed. What stays a judgement is the narrowing "pick the
|
|
7
|
+
// ones a reader would notice"; this module produces the candidates that judgement chooses from.
|
|
8
|
+
//
|
|
9
|
+
// A changed route file (`+page`/`+layout`) contributes its own route; a changed shared component
|
|
10
|
+
// contributes the routes that render it, found through an injected `find_importers` so the file-system
|
|
11
|
+
// scan stays in the CLI and this derivation stays pure. The import scan is one level deep: a component
|
|
12
|
+
// imported only by another component, never directly by a route, yields no candidate here.
|
|
13
|
+
|
|
14
|
+
const ROUTES_PREFIX = 'src/routes/'
|
|
15
|
+
const SVELTE_EXTENSION = '.svelte'
|
|
16
|
+
const ROUTE_SEPARATOR = '/'
|
|
17
|
+
// A route-defining file renders UI: `+page*` is the page, `+layout*` wraps it. `+server`/`+error` are
|
|
18
|
+
// not screenshot targets, so they are treated as shared files (imported by nothing, they contribute
|
|
19
|
+
// nothing).
|
|
20
|
+
const ROUTE_FILE_PATTERN = /^\+(page|layout)\b/u
|
|
21
|
+
|
|
22
|
+
function is_under_routes(file: string): boolean {
|
|
23
|
+
return file.startsWith(ROUTES_PREFIX)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function base_name(file: string): string {
|
|
27
|
+
return file.slice(file.lastIndexOf(ROUTE_SEPARATOR) + 1)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function is_route_file(file: string): boolean {
|
|
31
|
+
return is_under_routes(file) && ROUTE_FILE_PATTERN.test(base_name(file))
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// A `.svelte` file that is not a route file — a `$lib` component, or a component that sits beside
|
|
35
|
+
// routes. Its own path names no route, so its routes are its importers'.
|
|
36
|
+
function is_shared_svelte(file: string): boolean {
|
|
37
|
+
return file.endsWith(SVELTE_EXTENSION) && !is_route_file(file)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// A route group directory — `(marketing)` — is organizational and contributes no URL segment, so it
|
|
41
|
+
// is dropped from the path (SvelteKit routing).
|
|
42
|
+
function is_group_segment(segment: string): boolean {
|
|
43
|
+
return segment.startsWith('(') && segment.endsWith(')')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function route_path_of(file: string): string | undefined {
|
|
47
|
+
if (!is_route_file(file)) return undefined
|
|
48
|
+
|
|
49
|
+
const segments = file
|
|
50
|
+
.slice(ROUTES_PREFIX.length)
|
|
51
|
+
.split(ROUTE_SEPARATOR)
|
|
52
|
+
.slice(0, -1)
|
|
53
|
+
.filter((segment) => !is_group_segment(segment))
|
|
54
|
+
|
|
55
|
+
return `${ROUTE_SEPARATOR}${segments.join(ROUTE_SEPARATOR)}`
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function is_route(value: string | undefined): value is string {
|
|
59
|
+
return value !== undefined
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function routes_via_component(
|
|
63
|
+
component: string,
|
|
64
|
+
find_importers: (component: string) => ReadonlyArray<string>,
|
|
65
|
+
): Array<string> {
|
|
66
|
+
return find_importers(component)
|
|
67
|
+
.map((importer) => route_path_of(importer))
|
|
68
|
+
.filter(is_route)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function routes_of_path(
|
|
72
|
+
file: string,
|
|
73
|
+
find_importers: (component: string) => ReadonlyArray<string>,
|
|
74
|
+
): Array<string> {
|
|
75
|
+
const direct = route_path_of(file)
|
|
76
|
+
if (direct !== undefined) return [direct]
|
|
77
|
+
if (!is_shared_svelte(file)) return []
|
|
78
|
+
|
|
79
|
+
return routes_via_component(file, find_importers)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// The screenshot-target candidates for a set of changed paths, deduplicated and ordered. An empty
|
|
83
|
+
// result is the honest "no route derived" the CLI reports rather than guessing.
|
|
84
|
+
function derive_routes(
|
|
85
|
+
changed: ReadonlyArray<string>,
|
|
86
|
+
find_importers: (component: string) => ReadonlyArray<string>,
|
|
87
|
+
): Array<string> {
|
|
88
|
+
const routes = changed.flatMap((file) => routes_of_path(file, find_importers))
|
|
89
|
+
|
|
90
|
+
return [...new Set(routes)].toSorted((first, second) => first.localeCompare(second))
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const ui_routes = {
|
|
94
|
+
derive_routes,
|
|
95
|
+
is_route_file,
|
|
96
|
+
is_shared_svelte,
|
|
97
|
+
route_path_of,
|
|
98
|
+
ROUTES_PREFIX,
|
|
99
|
+
SVELTE_EXTENSION,
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export { ui_routes }
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { readFileSync, writeFileSync } from 'node:fs'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { fileURLToPath } from 'node:url'
|
|
5
|
+
import { json_object_schema, package_with_version_schema } from '#scripts/lib/schemas'
|
|
6
|
+
import semver from 'semver'
|
|
7
|
+
|
|
8
|
+
const VALID_BUMP_TYPES = ['major', 'minor', 'patch'] as const
|
|
9
|
+
type BumpType = (typeof VALID_BUMP_TYPES)[number]
|
|
10
|
+
|
|
11
|
+
const PACKAGE_JSON_INDENT = '\t'
|
|
12
|
+
|
|
13
|
+
function compute_new_version(version: string, bump_type: BumpType): string {
|
|
14
|
+
const new_version = semver.inc(version, bump_type)
|
|
15
|
+
|
|
16
|
+
if (new_version === null) throw new Error(`Invalid version format: ${version}`)
|
|
17
|
+
|
|
18
|
+
return new_version
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function package_json_path(): string {
|
|
22
|
+
return path.join(process.cwd(), 'package.json')
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// **Set the version to an already-decided number.** `bump_version` below is this plus the decision;
|
|
26
|
+
// `pnpm josh release` supplies its own, because a release raises the version by as many minors as
|
|
27
|
+
// main has taken merges rather than by one (joshuafolkken/kit#1169). Written once so the two agree
|
|
28
|
+
// on the file's shape and indentation.
|
|
29
|
+
function write_version(new_version: string): void {
|
|
30
|
+
const package_path = package_json_path()
|
|
31
|
+
const package_json = json_object_schema.parse(JSON.parse(readFileSync(package_path, 'utf8')))
|
|
32
|
+
|
|
33
|
+
writeFileSync(
|
|
34
|
+
package_path,
|
|
35
|
+
`${JSON.stringify({ ...package_json, version: new_version }, undefined, PACKAGE_JSON_INDENT)}\n`,
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function read_current_version(): string {
|
|
40
|
+
const file_content = readFileSync(package_json_path(), 'utf8')
|
|
41
|
+
|
|
42
|
+
return package_with_version_schema.parse(JSON.parse(file_content)).version
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function bump_version(bump_type: BumpType): void {
|
|
46
|
+
const new_version = compute_new_version(read_current_version(), bump_type)
|
|
47
|
+
|
|
48
|
+
write_version(new_version)
|
|
49
|
+
console.info(new_version)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function main(): void {
|
|
53
|
+
const ARGV_INDEX = 2
|
|
54
|
+
const bump_type = process.argv[ARGV_INDEX] ?? 'minor'
|
|
55
|
+
|
|
56
|
+
if (!VALID_BUMP_TYPES.includes(bump_type as BumpType)) {
|
|
57
|
+
console.error(`Usage: tsx scripts/version/bump-version.ts [major|minor|patch]`)
|
|
58
|
+
process.exit(1)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
bump_version(bump_type as BumpType)
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.error(error instanceof Error ? error.message : String(error))
|
|
65
|
+
process.exit(1)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
70
|
+
|
|
71
|
+
export { bump_version, compute_new_version, write_version }
|