@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,41 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { CSPELL_CACHE_FILE, CSPELL_CACHE_FLAGS } from '#scripts/josh/josh-command-types'
|
|
4
|
+
import { lane_cache_run } from '#scripts/lane/lane-cache-run'
|
|
5
|
+
import { buffered_process, FAIL_EXIT_CODE } from '#scripts/lib/buffered-process'
|
|
6
|
+
|
|
7
|
+
const ARGV_START = 2
|
|
8
|
+
// `--no-progress` turns off cspell's per-file `N/1607 <path> cached` line (joshuafolkken/kit#2296).
|
|
9
|
+
// Those lines ran to 1,607 of them — the whole output past the 8,000-character tool cap — so a gate
|
|
10
|
+
// that failed on one unknown word buried the failure under progress and a run could read only the
|
|
11
|
+
// first of several failures. The summary and the issue lines it prints are untouched; only the
|
|
12
|
+
// progress reporter is silenced.
|
|
13
|
+
const CSPELL_NO_PROGRESS = '--no-progress'
|
|
14
|
+
const CSPELL_ARGS = [
|
|
15
|
+
'exec',
|
|
16
|
+
'cspell',
|
|
17
|
+
'.',
|
|
18
|
+
'--dot',
|
|
19
|
+
CSPELL_NO_PROGRESS,
|
|
20
|
+
...CSPELL_CACHE_FLAGS,
|
|
21
|
+
] as const
|
|
22
|
+
|
|
23
|
+
// The wrapper puts cache transfer directly around cspell rather than around the whole gate (#2060),
|
|
24
|
+
// so a later failing check cannot prevent a completed cache from reaching the primary checkout.
|
|
25
|
+
async function run(extra_arguments: ReadonlyArray<string> = []): Promise<number> {
|
|
26
|
+
const result = await lane_cache_run.run(
|
|
27
|
+
CSPELL_CACHE_FILE,
|
|
28
|
+
async () => await buffered_process.run_buffered_process([...CSPELL_ARGS, ...extra_arguments]),
|
|
29
|
+
)
|
|
30
|
+
if (result.output) process.stdout.write(result.output)
|
|
31
|
+
|
|
32
|
+
return buffered_process.is_process_failed(result) ? FAIL_EXIT_CODE : 0
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
36
|
+
process.exitCode = await run(process.argv.slice(ARGV_START))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const cspell_cached = { run }
|
|
40
|
+
|
|
41
|
+
export { CSPELL_ARGS, cspell_cached }
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { ESLINT_CACHE_FILE, ESLINT_CACHE_FLAGS } from '#scripts/josh/josh-command-types'
|
|
4
|
+
import { lane_cache_run } from '#scripts/lane/lane-cache-run'
|
|
5
|
+
import {
|
|
6
|
+
buffered_process,
|
|
7
|
+
FAIL_EXIT_CODE,
|
|
8
|
+
type BufferedProcessResult,
|
|
9
|
+
} from '#scripts/lib/buffered-process'
|
|
10
|
+
|
|
11
|
+
const PRETTIER_ARGS = ['exec', 'prettier', '--check', '.'] as const
|
|
12
|
+
// This — not the `lint:eslint` map entry — is the eslint invocation `josh gate` reaches, so the
|
|
13
|
+
// cache flags come from the same constant the ignore rules are asserted against
|
|
14
|
+
// (joshuafolkken/kit#1256). A copy here would keep writing the old location the day that constant
|
|
15
|
+
// moves, with every test still green.
|
|
16
|
+
const ESLINT_ARGS = ['exec', 'eslint', '.', ...ESLINT_CACHE_FLAGS] as const
|
|
17
|
+
|
|
18
|
+
async function run_eslint(
|
|
19
|
+
eslint_args: ReadonlyArray<string>,
|
|
20
|
+
cache_file: string,
|
|
21
|
+
): Promise<BufferedProcessResult> {
|
|
22
|
+
return await lane_cache_run.run(
|
|
23
|
+
cache_file,
|
|
24
|
+
async () => await buffered_process.run_buffered_process(eslint_args),
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function write_output(result: BufferedProcessResult): void {
|
|
29
|
+
if (result.output) process.stdout.write(result.output)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function lint_exit_code(prettier: BufferedProcessResult, eslint: BufferedProcessResult): number {
|
|
33
|
+
return buffered_process.is_process_failed(prettier) || buffered_process.is_process_failed(eslint)
|
|
34
|
+
? FAIL_EXIT_CODE
|
|
35
|
+
: 0
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The two checks are run from here whether they were pointed at the whole tree or at one change's
|
|
39
|
+
// files, so `josh lint:related` reaches prettier and eslint through the same buffering, the same
|
|
40
|
+
// "one failure does not abort the other" reading, and the same exit code (joshuafolkken/kit#1298).
|
|
41
|
+
async function run_lint_checks(
|
|
42
|
+
prettier_args: ReadonlyArray<string>,
|
|
43
|
+
eslint_args: ReadonlyArray<string>,
|
|
44
|
+
eslint_cache_file: string = ESLINT_CACHE_FILE,
|
|
45
|
+
): Promise<number> {
|
|
46
|
+
const [prettier, eslint] = await Promise.all([
|
|
47
|
+
buffered_process.run_buffered_process(prettier_args),
|
|
48
|
+
run_eslint(eslint_args, eslint_cache_file),
|
|
49
|
+
])
|
|
50
|
+
|
|
51
|
+
write_output(prettier)
|
|
52
|
+
write_output(eslint)
|
|
53
|
+
|
|
54
|
+
return lint_exit_code(prettier, eslint)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function run_lint_parallel_checks(): Promise<number> {
|
|
58
|
+
return await run_lint_checks(PRETTIER_ARGS, ESLINT_ARGS)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// `process.exitCode` rather than `process.exit()`: both reports are buffered and written here in
|
|
62
|
+
// one go, and `process.exit()` truncates a piped stdout at its buffer size — which is exactly how
|
|
63
|
+
// this command is read when `josh gate` runs it as one of four concurrent checks. Setting the code
|
|
64
|
+
// lets the writes drain and the process end on its own, which it can, since both children have
|
|
65
|
+
// already exited by here.
|
|
66
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
67
|
+
process.exitCode = await run_lint_parallel_checks()
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const lint_parallel = { run_lint_checks, run_lint_parallel_checks }
|
|
71
|
+
|
|
72
|
+
export { ESLINT_ARGS, lint_parallel }
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import {
|
|
3
|
+
changed_file_scope,
|
|
4
|
+
type ChangedFileScope,
|
|
5
|
+
type ScopeInputs,
|
|
6
|
+
type ScopeVocabulary,
|
|
7
|
+
} from '#scripts/git/changed-file-scope'
|
|
8
|
+
import { ESLINT_RELATED_CACHE_FLAGS } from '#scripts/josh/josh-command-types'
|
|
9
|
+
|
|
10
|
+
// joshuafolkken/kit#1298: `josh lint` read the whole repository on every call, and an
|
|
11
|
+
// implementation loop calls it after every few edits. Measured across four runs with
|
|
12
|
+
// `pnpm josh time`, that came to 47–188 seconds per run — 18% of #1292's 1,043-second
|
|
13
|
+
// implementation phase, spent re-reading files the change never touched.
|
|
14
|
+
//
|
|
15
|
+
// **This narrowing is added in front of the whole check, never in place of it.** `josh gate` still
|
|
16
|
+
// runs `josh lint` over everything before the commit: a formatting rule can be broken by a file the
|
|
17
|
+
// change did not name (a shared config, a generated snapshot), and only the whole-tree run sees
|
|
18
|
+
// that. What the narrowing replaces is the repeat calls in between.
|
|
19
|
+
//
|
|
20
|
+
// The decision this file makes is which extensions the two linters read, and how each of them is
|
|
21
|
+
// asked about a file list instead of a directory. Everything it shares with `josh test:related` —
|
|
22
|
+
// reading the change, dropping what the tree no longer holds, and the two fallbacks — is
|
|
23
|
+
// `changed-file-scope.ts`.
|
|
24
|
+
|
|
25
|
+
// What prettier or eslint reads in a kit project. A changed image, font or archive is dropped
|
|
26
|
+
// rather than passed through: neither linter has anything to say about it, so a run narrowed to one
|
|
27
|
+
// of them would check nothing while reporting success.
|
|
28
|
+
//
|
|
29
|
+
// **A lock file is not dropped here** — `.yaml` and `.json` are on this list because a hand-written
|
|
30
|
+
// config of either kind is prettier's to check. `pnpm-lock.yaml` therefore reaches both children
|
|
31
|
+
// and is skipped by each on its own terms: `.prettierignore` names it, and eslint has no
|
|
32
|
+
// configuration matching it. That is the same treatment the whole-tree `josh lint` gives it.
|
|
33
|
+
const LINTABLE_EXTENSIONS: ReadonlySet<string> = new Set([
|
|
34
|
+
'.ts',
|
|
35
|
+
'.tsx',
|
|
36
|
+
'.mts',
|
|
37
|
+
'.cts',
|
|
38
|
+
'.js',
|
|
39
|
+
'.jsx',
|
|
40
|
+
'.mjs',
|
|
41
|
+
'.cjs',
|
|
42
|
+
'.svelte',
|
|
43
|
+
'.vue',
|
|
44
|
+
'.md',
|
|
45
|
+
'.mdx',
|
|
46
|
+
'.json',
|
|
47
|
+
'.jsonc',
|
|
48
|
+
'.json5',
|
|
49
|
+
'.yaml',
|
|
50
|
+
'.yml',
|
|
51
|
+
'.css',
|
|
52
|
+
'.scss',
|
|
53
|
+
'.less',
|
|
54
|
+
'.html',
|
|
55
|
+
'.graphql',
|
|
56
|
+
'.gql',
|
|
57
|
+
])
|
|
58
|
+
|
|
59
|
+
const NOTHING_LINTABLE_REASON = 'no changed file is one prettier or eslint reads'
|
|
60
|
+
|
|
61
|
+
const COMMAND_NAME = 'lint:related'
|
|
62
|
+
const COMMAND_LABEL = `josh ${COMMAND_NAME}`
|
|
63
|
+
|
|
64
|
+
const VOCABULARY: ScopeVocabulary = {
|
|
65
|
+
label: COMMAND_LABEL,
|
|
66
|
+
fallback_suffix: 'checking the whole tree instead',
|
|
67
|
+
narrowed_suffix: 'checking only them',
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// `--ignore-unknown` is what lets one file list go to prettier whole: a `.svelte` file prettier has
|
|
71
|
+
// no plugin for, or an extension it does not parse, is skipped rather than failing the run. Without
|
|
72
|
+
// it, prettier exits non-zero on the first file it cannot read, which is a failure about the file
|
|
73
|
+
// list rather than about the code.
|
|
74
|
+
const PRETTIER_ARGS = ['exec', 'prettier', '--check', '--ignore-unknown'] as const
|
|
75
|
+
// `--no-warn-ignored` is the counterpart on the eslint side. A changed `.md` or a file under an
|
|
76
|
+
// `ignores` entry is passed in with the rest, and eslint warns once per such file when it is named
|
|
77
|
+
// explicitly — noise that would bury the findings the run exists to show.
|
|
78
|
+
const ESLINT_ARGS = ['exec', 'eslint'] as const
|
|
79
|
+
const ESLINT_SCOPED_FLAGS = ['--no-warn-ignored'] as const
|
|
80
|
+
|
|
81
|
+
function is_lintable(file_path: string): boolean {
|
|
82
|
+
return LINTABLE_EXTENSIONS.has(path.extname(file_path))
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// The three inputs that make the shared narrowing this command's, handed over as one value so the
|
|
86
|
+
// CLI and the function below cannot disagree about any of them.
|
|
87
|
+
function scope_inputs(is_present: (file_path: string) => boolean): ScopeInputs {
|
|
88
|
+
return { is_present, is_selectable: is_lintable, nothing_reason: NOTHING_LINTABLE_REASON }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function describe_scope(scope: ChangedFileScope, root: string): string {
|
|
92
|
+
return changed_file_scope.describe_scope(scope, root, VOCABULARY)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function prettier_arguments(files: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
96
|
+
return [...PRETTIER_ARGS, ...files]
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// The cache file is this command's own rather than the gate's, because the two run at the same time
|
|
100
|
+
// (joshuafolkken/kit#1347). `josh gate` lints the whole tree beside the review while an
|
|
101
|
+
// implementation loop calls this command between edits, and each eslint run rewrites its cache file
|
|
102
|
+
// whole from the copy it loaded at start-up — so on one file the run that finished last discarded
|
|
103
|
+
// the other's entries, and a narrowed run finishing during a whole-tree run rolled the cache back to
|
|
104
|
+
// its pre-gate state.
|
|
105
|
+
//
|
|
106
|
+
// **The earlier comment here claimed the opposite and was reasoning about the wrong thing.** It said
|
|
107
|
+
// sharing let a narrowed run warm the gate's cache, since eslint leaves the entries a run did not
|
|
108
|
+
// visit alone; that holds for pruning and says nothing about two writers. It is the same judgement
|
|
109
|
+
// joshuafolkken/kit#1332 made for the edit hook, applied to the second place it was needed.
|
|
110
|
+
//
|
|
111
|
+
// **What is narrowed is still only the target list, never the gate.** `josh gate` runs `josh lint`
|
|
112
|
+
// over the whole tree before any commit; this file decides which files a repeat call reads.
|
|
113
|
+
function eslint_arguments(files: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
114
|
+
return [...ESLINT_ARGS, ...files, ...ESLINT_RELATED_CACHE_FLAGS, ...ESLINT_SCOPED_FLAGS]
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const lint_related_scope = {
|
|
118
|
+
COMMAND_LABEL,
|
|
119
|
+
COMMAND_NAME,
|
|
120
|
+
NOTHING_LINTABLE_REASON,
|
|
121
|
+
describe_scope,
|
|
122
|
+
eslint_arguments,
|
|
123
|
+
is_lintable,
|
|
124
|
+
prettier_arguments,
|
|
125
|
+
scope_inputs,
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export { lint_related_scope }
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { existsSync } from 'node:fs'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { document_byte_check } from '#scripts/document/document-byte-check'
|
|
5
|
+
import { scoped_green } from '#scripts/gate/scoped-green'
|
|
6
|
+
import { changed_file_scope, type ChangedFileScope } from '#scripts/git/changed-file-scope'
|
|
7
|
+
import { ESLINT_RELATED_CACHE_FILE } from '#scripts/josh/josh-command-types'
|
|
8
|
+
import { review_stamps } from '#scripts/review/review-stamps'
|
|
9
|
+
import { lint_parallel } from './lint-parallel'
|
|
10
|
+
import { lint_related_scope } from './lint-related-scope'
|
|
11
|
+
|
|
12
|
+
// `josh lint:related` — the lint check an implementation loop runs between edits
|
|
13
|
+
// (joshuafolkken/kit#1298). The narrowing itself is `lint-related-scope.ts` over the shared
|
|
14
|
+
// decision in `changed-file-scope.ts`; this is the process around it — how the run reaches the same
|
|
15
|
+
// two child processes `josh lint` runs.
|
|
16
|
+
|
|
17
|
+
// Flags are named rather than forwarded. `josh test:related` forwards them because it has one
|
|
18
|
+
// child; this has two, and prettier and eslint take different ones — `--fix` means something to
|
|
19
|
+
// eslint and nothing to `prettier --check`. Sending a flag to both would fail the run over the
|
|
20
|
+
// argument list, and dropping it silently would run a check the caller did not ask for, so the run
|
|
21
|
+
// says which arguments it ignored.
|
|
22
|
+
function report_ignored_flags(command_arguments: ReadonlyArray<string>): void {
|
|
23
|
+
const flags = changed_file_scope.flags_of(command_arguments)
|
|
24
|
+
|
|
25
|
+
if (flags.length === 0) return
|
|
26
|
+
|
|
27
|
+
process.stdout.write(
|
|
28
|
+
`${lint_related_scope.COMMAND_LABEL}: ignored — prettier and eslint take different flags: ${flags.join(' ')}\n`,
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// A fallback to the whole project is a superset of the changed files, so it vouches for them too —
|
|
33
|
+
// which is why the record below is written from either arm rather than only from the narrow one.
|
|
34
|
+
async function lint_exit_code(scope: ChangedFileScope): Promise<number> {
|
|
35
|
+
if (scope.mode === 'all') return await lint_parallel.run_lint_parallel_checks()
|
|
36
|
+
|
|
37
|
+
return await lint_parallel.run_lint_checks(
|
|
38
|
+
lint_related_scope.prettier_arguments(scope.files),
|
|
39
|
+
lint_related_scope.eslint_arguments(scope.files),
|
|
40
|
+
ESLINT_RELATED_CACHE_FILE,
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// The byte check over the same scope the lint just ran: the resolved file list when narrowed, and
|
|
45
|
+
// the whole budget when lint fell back to the whole tree — so the byte check is a superset in the
|
|
46
|
+
// fallback exactly as lint is, never an empty list that would pass silently (joshuafolkken/kit#2176).
|
|
47
|
+
function byte_check_exit_code(scope: ChangedFileScope, root: string): number {
|
|
48
|
+
if (scope.mode === 'all') return document_byte_check.check_all(root)
|
|
49
|
+
|
|
50
|
+
return document_byte_check.check_files(root, scope.files)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// The lint result folded together with the fast byte-ceiling check (joshuafolkken/kit#2176): the
|
|
54
|
+
// same check the gate's `document-byte-budget.test.ts` runs, brought forward to this between-edits
|
|
55
|
+
// path so a mandated documentation update over its ceiling surfaces in seconds. It reads no change
|
|
56
|
+
// of its own — it takes the files this run already resolved, so the git contract is the lint
|
|
57
|
+
// command's alone. A lint failure is reported as-is; only a green lint runs the byte check, so the
|
|
58
|
+
// two never race to the exit code, and a green tree here is green on both — which is what the record
|
|
59
|
+
// below then vouches for.
|
|
60
|
+
async function scoped_exit_code(scope: ChangedFileScope, root: string): Promise<number> {
|
|
61
|
+
const lint_exit = await lint_exit_code(scope)
|
|
62
|
+
if (lint_exit !== 0) return lint_exit
|
|
63
|
+
|
|
64
|
+
return byte_check_exit_code(scope, root)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// The narrowing line is printed before either child starts, so a scoped run is never read as a
|
|
68
|
+
// whole one, and a fallback says which of the two it was rather than looking like a narrow run
|
|
69
|
+
// that found nothing.
|
|
70
|
+
//
|
|
71
|
+
// **A green run leaves a record of the tree it was green on** (joshuafolkken/kit#1511), so
|
|
72
|
+
// `josh review:brief` can tell a tree this check has read from one it has not. What the record means,
|
|
73
|
+
// and the three states in which it is withheld, are `scoped-green.ts`.
|
|
74
|
+
async function run_related_lint(command_arguments: ReadonlyArray<string>): Promise<number> {
|
|
75
|
+
const root = await changed_file_scope.repository_root_or_cwd()
|
|
76
|
+
const scope = await changed_file_scope.resolve_command_scope({
|
|
77
|
+
command_arguments,
|
|
78
|
+
root,
|
|
79
|
+
inputs: lint_related_scope.scope_inputs(existsSync),
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
changed_file_scope.report_unusable_arguments(
|
|
83
|
+
command_arguments,
|
|
84
|
+
scope,
|
|
85
|
+
lint_related_scope.COMMAND_LABEL,
|
|
86
|
+
)
|
|
87
|
+
report_ignored_flags(command_arguments)
|
|
88
|
+
process.stdout.write(`${lint_related_scope.describe_scope(scope, root)}\n`)
|
|
89
|
+
|
|
90
|
+
const before = await scoped_green.read_before(command_arguments)
|
|
91
|
+
const exit_code = await scoped_exit_code(scope, root)
|
|
92
|
+
|
|
93
|
+
await scoped_green.record_if_green(review_stamps.lint_related_stamp, { before, exit_code })
|
|
94
|
+
|
|
95
|
+
return exit_code
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
99
|
+
process.exitCode = await run_related_lint(process.argv.slice(changed_file_scope.ARGV_START))
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const lint_related = { report_ignored_flags, run_related_lint }
|
|
103
|
+
|
|
104
|
+
export { lint_related }
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// The public surface a downstream distribution package imports to stamp the workflows it writes.
|
|
2
|
+
// Exported rather than left internal because the alternative is every distributor re-implementing
|
|
3
|
+
// the header, and a second implementation that spells the token differently or stacks a duplicate
|
|
4
|
+
// silently breaks the check that reads it (joshuafolkken/kit#844).
|
|
5
|
+
export { managed_marker_logic } from './managed-marker-logic'
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { is_workflow_destination } from '#scripts/claude/workflow-destination'
|
|
2
|
+
|
|
3
|
+
// Which package overwrites a given workflow is a question only that package can answer, and the
|
|
4
|
+
// answer has to survive being copied on: a consumer of a consumer receives `ci.yml` from kit and
|
|
5
|
+
// `dast.yml` from app-kit, and neither distributor knows what the other manages. So the answer is
|
|
6
|
+
// written into the artifact rather than kept in a list beside it — every distributor stamps its own
|
|
7
|
+
// output, and the auto-merge workflow reads the stamp off the very file it is asking about
|
|
8
|
+
// (joshuafolkken/kit#844).
|
|
9
|
+
//
|
|
10
|
+
// A list cannot reach that far. kit's write time is the only moment kit controls, and at that moment
|
|
11
|
+
// it knows nothing of what app-kit distributes; whichever sync ran last would decide the list, and
|
|
12
|
+
// the list would drift from the files it claims to describe — which is exactly the defect #844
|
|
13
|
+
// reports, one distribution tier below the loop #836 closed.
|
|
14
|
+
//
|
|
15
|
+
// The stamp also draws the line the old list could only describe in prose. `deploy-vps.yml` is
|
|
16
|
+
// patched by sync but written directly rather than through this transform, so it is never stamped
|
|
17
|
+
// and a bump to its own pins still merges — a property of how the file is written, not of anyone
|
|
18
|
+
// remembering to leave it out of a list.
|
|
19
|
+
// The note names no command, because the package on the line above is not always this one: a
|
|
20
|
+
// package built on kit distributes its own workflows through its own `sync`, and stamps them with
|
|
21
|
+
// its own name through this same function.
|
|
22
|
+
const MARKER_TOKEN = 'josh-managed-workflow:'
|
|
23
|
+
const MARKER_PREFIX = `# ${MARKER_TOKEN}`
|
|
24
|
+
const MARKER_NOTE = 'Overwritten on every sync of that package. Edit it there, not here.'
|
|
25
|
+
|
|
26
|
+
function marker_block(package_name: string): string {
|
|
27
|
+
return `${MARKER_PREFIX} ${package_name}\n# ${MARKER_NOTE}\n`
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Recognized by the first line rather than by the token appearing anywhere, because the auto-merge
|
|
31
|
+
// workflow declares the token in its own `env` to match on — a substring test would read that
|
|
32
|
+
// template as already stamped and skip it, leaving the one file that performs the check unmarked.
|
|
33
|
+
function is_marked(text: string): boolean {
|
|
34
|
+
return text.startsWith(MARKER_PREFIX)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// `package_name` is the distributor's own name, so a package built on kit stamps its files as its
|
|
38
|
+
// own rather than mis-attributing them to kit. The auto-merge workflow matches the token, not any
|
|
39
|
+
// particular name, so every tier's stamp is recognized by the same check.
|
|
40
|
+
//
|
|
41
|
+
// An already-stamped file is left alone whoever stamped it, because the name is for the human who
|
|
42
|
+
// opens the file and the check does not read it. Re-attributing a file one distributor stamped and
|
|
43
|
+
// another later overwrote is a real question, but not one with a consumer yet — it belongs with the
|
|
44
|
+
// package that first does it, not with a guess made here.
|
|
45
|
+
function apply_marker_for_destination(
|
|
46
|
+
destination: string,
|
|
47
|
+
text: string,
|
|
48
|
+
package_name: string,
|
|
49
|
+
): string {
|
|
50
|
+
if (!is_workflow_destination(destination)) return text
|
|
51
|
+
if (is_marked(text)) return text
|
|
52
|
+
|
|
53
|
+
return `${marker_block(package_name)}${text}`
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// `marker_block` stays out of the published surface: it composes a header unconditionally, so a
|
|
57
|
+
// distributor reaching for it instead of `apply_marker_for_destination` would stack a second one on
|
|
58
|
+
// every sync. The token and prefix are published because a consumer may want to match on them, and
|
|
59
|
+
// `is_marked` because that is the matching rule itself.
|
|
60
|
+
const managed_marker_logic = {
|
|
61
|
+
MARKER_TOKEN,
|
|
62
|
+
MARKER_PREFIX,
|
|
63
|
+
is_marked,
|
|
64
|
+
apply_marker_for_destination,
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export { managed_marker_logic }
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { repo_discovery } from '#scripts/discovery/repo-discovery'
|
|
3
|
+
import { OBSERVATION_LEDGER_PATH } from './observation-ledger'
|
|
4
|
+
|
|
5
|
+
// Where the observation ledger is read and written, whichever work tree a command runs in
|
|
6
|
+
// (joshuafolkken/kit#2419).
|
|
7
|
+
//
|
|
8
|
+
// **The ledger lives in the primary checkout, never in a lane.** A lane is a linked work tree that is
|
|
9
|
+
// closed once its branch merges, and the ledger is excluded from ordinary staging — so a line appended
|
|
10
|
+
// in a lane had no route to the default branch: `pnpm josh followup`'s flush needs `pnpm josh ms`,
|
|
11
|
+
// which a lane refuses, and `lane:close` does not carry the file. Resolving the ledger to the primary
|
|
12
|
+
// checkout at every reader and writer puts the line where the flush already works, rather than adding
|
|
13
|
+
// a second route that moves it there afterwards.
|
|
14
|
+
//
|
|
15
|
+
// The primary checkout is `repo_discovery.main_worktree`'s answer, reused rather than spelled again;
|
|
16
|
+
// in an ordinary checkout it is the given directory itself, so nothing outside a lane changes.
|
|
17
|
+
|
|
18
|
+
function ledger_root(cwd: string = process.cwd()): string {
|
|
19
|
+
return repo_discovery.main_worktree(cwd)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function is_lane(cwd: string = process.cwd()): boolean {
|
|
23
|
+
return path.resolve(ledger_root(cwd)) !== path.resolve(cwd)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function ledger_path(cwd: string = process.cwd()): string {
|
|
27
|
+
return path.join(ledger_root(cwd), OBSERVATION_LEDGER_PATH)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const observation_ledger_home = { is_lane, ledger_path, ledger_root }
|
|
31
|
+
|
|
32
|
+
export { observation_ledger_home }
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// The observation ledger's line grammar (`.claude/skills/workflow-commands/observation-filing.md`)
|
|
2
|
+
// is fixed — `- k:<slug> | d<n> | <YYYY-MM-DD> | <where> | <what>` — but the path was collected in
|
|
3
|
+
// `observation-ledger.ts` without a line ever being parsed, so a malformed append rode a flush
|
|
4
|
+
// through unremarked. This validates a ledger entry line and reports why a broken one is broken
|
|
5
|
+
// (joshuafolkken/kit#2123). The grammar is the single source's, pinned by the document test.
|
|
6
|
+
|
|
7
|
+
const KEY_PREFIX = '- k:'
|
|
8
|
+
const FIELD_SEPARATOR = ' | '
|
|
9
|
+
const FIELD_COUNT = 5
|
|
10
|
+
const SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u
|
|
11
|
+
// `d1` and up — never `d0`, since a depth-0 observation goes straight to an issue rather than the
|
|
12
|
+
// ledger.
|
|
13
|
+
const DEPTH_PATTERN = /^d[1-9]\d*$/u
|
|
14
|
+
const DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/u
|
|
15
|
+
const SLUG_REASON = 'the slug must be lowercase words joined by `-`'
|
|
16
|
+
const DEPTH_REASON = 'the depth must be `d1` or higher (never `d0`)'
|
|
17
|
+
const DATE_REASON = 'the date must be `YYYY-MM-DD`'
|
|
18
|
+
const WHERE_REASON = 'the `where` field is empty'
|
|
19
|
+
const WHAT_REASON = 'the `what` field is empty'
|
|
20
|
+
|
|
21
|
+
interface BrokenLine {
|
|
22
|
+
line: string
|
|
23
|
+
reason: string
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// A ledger entry line, as opposed to prose or a heading — only these are held to the grammar.
|
|
27
|
+
function is_ledger_entry_line(line: string): boolean {
|
|
28
|
+
return line.trimStart().startsWith(KEY_PREFIX)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function slug_of(first_field: string): string {
|
|
32
|
+
return first_field.trimStart().slice(KEY_PREFIX.length)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// The `?? ''` lives in these small helpers rather than in `field_reason`, so that function stays a
|
|
36
|
+
// single lookup with no branching of its own.
|
|
37
|
+
function is_present(field: string | undefined): boolean {
|
|
38
|
+
return (field ?? '').trim().length > 0
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function matches(pattern: RegExp, field: string | undefined): boolean {
|
|
42
|
+
return pattern.test(field ?? '')
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function slug_ok(key_field: string | undefined): boolean {
|
|
46
|
+
return SLUG_PATTERN.test(slug_of(key_field ?? ''))
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Each field's check paired with the reason it fails, so `field_reason` is a single lookup for the
|
|
50
|
+
// first failing field rather than a chain of branches.
|
|
51
|
+
function field_reason(fields: ReadonlyArray<string>): string | undefined {
|
|
52
|
+
const [key_field, depth, date, where, what] = fields
|
|
53
|
+
const checks: ReadonlyArray<readonly [boolean, string]> = [
|
|
54
|
+
[slug_ok(key_field), SLUG_REASON],
|
|
55
|
+
[matches(DEPTH_PATTERN, depth), DEPTH_REASON],
|
|
56
|
+
[matches(DATE_PATTERN, date), DATE_REASON],
|
|
57
|
+
[is_present(where), WHERE_REASON],
|
|
58
|
+
[is_present(what), WHAT_REASON],
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
return checks.find(([is_valid]) => !is_valid)?.[1]
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// The reason a ledger entry line breaks the grammar, or `undefined` when it conforms. Too few fields
|
|
65
|
+
// or a `|` inside `<what>` both land as the wrong field count, since a conforming `<what>` carries no
|
|
66
|
+
// vertical bar.
|
|
67
|
+
function line_reason(line: string): string | undefined {
|
|
68
|
+
const fields = line.split(FIELD_SEPARATOR)
|
|
69
|
+
|
|
70
|
+
if (fields.length !== FIELD_COUNT) {
|
|
71
|
+
return `expected ${String(FIELD_COUNT)} fields separated by " | " (a \`|\` in the last field is not allowed)`
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return field_reason(fields)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Every ledger entry line that breaks the grammar, paired with why; an empty array is a clean ledger.
|
|
78
|
+
function broken_ledger_lines(content: string): ReadonlyArray<BrokenLine> {
|
|
79
|
+
return content
|
|
80
|
+
.split('\n')
|
|
81
|
+
.filter((line) => is_ledger_entry_line(line))
|
|
82
|
+
.map((line) => ({ line, reason: line_reason(line) }))
|
|
83
|
+
.filter((entry): entry is BrokenLine => entry.reason !== undefined)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const observation_ledger_line = {
|
|
87
|
+
broken_ledger_lines,
|
|
88
|
+
is_ledger_entry_line,
|
|
89
|
+
line_reason,
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export type { BrokenLine }
|
|
93
|
+
export { observation_ledger_line }
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// The observation ledger's one path, named here rather than inside any of the places that act on it
|
|
2
|
+
// (joshuafolkken/kit#1756). `git-staging.ts` excludes it from every ordinary commit,
|
|
3
|
+
// `hook-gate-reuse.ts` excludes it from what a hook calls a carried tree, and
|
|
4
|
+
// `observations-flush.ts` is the only thing that stages it — so a literal in each would be three
|
|
5
|
+
// answers to one question, and a rename reaching only some of them would silently restore the
|
|
6
|
+
// contamination the exclusion exists to prevent.
|
|
7
|
+
const OBSERVATION_LEDGER_PATH = 'docs/observations.md'
|
|
8
|
+
|
|
9
|
+
// `git status --porcelain` prints `XY PATH`, so the path starts at the fourth character.
|
|
10
|
+
const STATUS_PATH_INDEX = 3
|
|
11
|
+
|
|
12
|
+
function status_path(line: string): string {
|
|
13
|
+
return line.slice(STATUS_PATH_INDEX).trim()
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function is_ledger_line(line: string): boolean {
|
|
17
|
+
return status_path(line) === OBSERVATION_LEDGER_PATH
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// **The one place that answers "does this working tree hold a pending observation append?"**
|
|
21
|
+
// `observations-flush.ts`'s `has_ledger_change` and `pnpm josh followup`'s pre-flush short-circuit
|
|
22
|
+
// both ask it (joshuafolkken/kit#1810), so a literal in each would be the clone the header above
|
|
23
|
+
// warns against. A blank porcelain line carries no ledger path, so `is_ledger_line` answers false for
|
|
24
|
+
// it and no filtering is needed.
|
|
25
|
+
function has_pending_append(status_output: string): boolean {
|
|
26
|
+
return status_output.split('\n').some((line) => is_ledger_line(line))
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const observation_ledger = {
|
|
30
|
+
has_pending_append,
|
|
31
|
+
is_ledger_line,
|
|
32
|
+
status_path,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { OBSERVATION_LEDGER_PATH, observation_ledger }
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { observation_ledger_home } from './observation-ledger-home'
|
|
4
|
+
import { observations_flush } from './observations-flush'
|
|
5
|
+
|
|
6
|
+
const FAILURE_EXIT_CODE = 1
|
|
7
|
+
|
|
8
|
+
function message_of(error: unknown): string {
|
|
9
|
+
return error instanceof Error ? error.message : String(error)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// **From a lane, the flush acts on the primary checkout** (joshuafolkken/kit#2419). That is where the
|
|
13
|
+
// ledger lives (`observation-ledger-home.ts`), and a lane's own checkout is never the one a flush may
|
|
14
|
+
// switch — so the process moves there first, and every refusal after it is about that checkout, which
|
|
15
|
+
// the prefix names so a "run `pnpm josh ms` first" is read as advice for the primary checkout.
|
|
16
|
+
function enter_ledger_home(): string {
|
|
17
|
+
if (!observation_ledger_home.is_lane()) return ''
|
|
18
|
+
|
|
19
|
+
const root = observation_ledger_home.ledger_root()
|
|
20
|
+
|
|
21
|
+
process.chdir(root)
|
|
22
|
+
|
|
23
|
+
return `The observation ledger lives in the primary checkout, so this flush acts on ${root}: `
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// The refusals are the command's whole safety story, so they are printed as the message rather than
|
|
27
|
+
// as a stack: "this checkout is on a feature branch" and "the tree holds somebody else's work" are
|
|
28
|
+
// both things the person fixes in one step, and a trace hides the sentence that says which.
|
|
29
|
+
async function main(): Promise<void> {
|
|
30
|
+
const prefix = enter_ledger_home()
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
console.info(`${prefix}${await observations_flush.flush(new Date())}`)
|
|
34
|
+
} catch (error) {
|
|
35
|
+
console.error(`${prefix}${message_of(error)}`)
|
|
36
|
+
process.exit(FAILURE_EXIT_CODE)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
|
|
41
|
+
|
|
42
|
+
export { main }
|