@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,267 @@
|
|
|
1
|
+
# What stays resident, and how much — `SKILL.md` §3's body
|
|
2
|
+
|
|
3
|
+
**This is `SKILL.md` → §3's body, and it is read when a rule is being placed, moved or retired — not
|
|
4
|
+
at any entry** (joshuafolkken/kit#1797, joshuafolkken/kit#2161). **Nothing in a run reaches it.** The
|
|
5
|
+
moment it binds is a turn spent editing `CLAUDE.md` or one of these documents, which is why it costs a
|
|
6
|
+
workflow entry nothing to leave it here. `SKILL.md` → §3 keeps the heading and points here; the
|
|
7
|
+
questions that decide *whether* a rule stays now live below, alongside the procedure that decides *how
|
|
8
|
+
much* of it does. The `rule:value` readings this file used to carry no longer gate reduction — that
|
|
9
|
+
gating was retracted on 2026-09-13 (joshuafolkken/kit#1931 → `## Decisions`) and they are retained
|
|
10
|
+
below only as history.
|
|
11
|
+
|
|
12
|
+
## Whether a rule stays
|
|
13
|
+
|
|
14
|
+
**Before either question below, ask question 0:** `prompts/collaboration-workflow/residency.md` → question 0 — can the rule's answer be computed from mechanically readable inputs alone? If yes, it is a decision oracle and neither question below applies; `pnpm josh oracle:list` shows the existing ones. Only a no reaches the ordering question.
|
|
15
|
+
|
|
16
|
+
**Then ask the ordering question:** `prompts/collaboration-workflow/residency.md` → ordering question — does the rule decide *when or in what order* to act rather than *what*? If so it belongs in the run driver's state transitions (`pnpm josh run:step`, `scripts/run/run-step.ts`), not either channel below. Only a rule that decides *what* reaches the first question.
|
|
17
|
+
|
|
18
|
+
**The first question is whether the rule's trigger can be named:**
|
|
19
|
+
|
|
20
|
+
> **Can the moment the rule begins to bind be named as one tool call?**
|
|
21
|
+
|
|
22
|
+
**A rule whose trigger can be named moves its body out of `CLAUDE.md`.** It goes on the enumeration in
|
|
23
|
+
`prompts/collaboration-workflow/rule-delivery.md`, and a hook refuses that call and states the rule —
|
|
24
|
+
cheaper than resident prose, because it costs nothing on every other turn, and **stronger, because a
|
|
25
|
+
refusal cannot be skimmed past**. **Relocating is not deleting** — the rule's text survives, on a
|
|
26
|
+
stronger channel.
|
|
27
|
+
|
|
28
|
+
**What stays behind is the trigger and the criterion, one line, because the channel reaches one
|
|
29
|
+
harness.** `CLAUDE.md` is agent-agnostic by construction — `AGENTS.md`, `GEMINI.md` and `.cursorrules`
|
|
30
|
+
are pointers to it, and a Codex, Gemini or Cursor session runs no `.claude/settings.json` hook at all;
|
|
31
|
+
so does a Claude Code session with the guard's own off-switch set. **The gain is the body, not the
|
|
32
|
+
line.** A rule may leave residency entirely only where the agent that has to obey it is always this
|
|
33
|
+
harness.
|
|
34
|
+
|
|
35
|
+
Only a rule whose trigger cannot be named reaches the second question:
|
|
36
|
+
|
|
37
|
+
**A rule stays in `CLAUDE.md` if and only if it has to fire on a turn where no skill was loaded.** That
|
|
38
|
+
test has exactly one input: when does the rule first bind — before a command has started, or after.
|
|
39
|
+
Everything a run reaches only *after* it has read this skill is routed to from `CLAUDE.md`, never
|
|
40
|
+
restated there.
|
|
41
|
+
|
|
42
|
+
`CLAUDE.md` is the only document this section is about. `AGENTS.md` and `GEMINI.md` hold no rules at
|
|
43
|
+
all — they are pointers to it.
|
|
44
|
+
|
|
45
|
+
### The second question: how much of a resident rule is resident
|
|
46
|
+
|
|
47
|
+
The criterion above decides **whether** a rule stays. It says nothing about **how much of it** stays,
|
|
48
|
+
and for a long time nothing did — so a rule that passed arrived with its whole procedure attached,
|
|
49
|
+
and `CLAUDE.md` grew back to within 585 bytes of its ceiling with the procedures already moved out
|
|
50
|
+
(joshuafolkken/kit#964).
|
|
51
|
+
|
|
52
|
+
**A resident rule is written as its trigger plus a pointer.** Two things and no third:
|
|
53
|
+
|
|
54
|
+
1. **The trigger** — the situation that fires it, and the one instruction that must be obeyed before
|
|
55
|
+
anything else is read. Written so an agent that reads nothing further still does the safe thing:
|
|
56
|
+
stops, files, refuses, asks.
|
|
57
|
+
2. **The pointer** — the topic file under `prompts/collaboration-workflow/` or the skill file that holds
|
|
58
|
+
the procedure, named exactly enough to open without searching.
|
|
59
|
+
|
|
60
|
+
Everything else — the steps, the worked examples, the rationale, the failure it was written after —
|
|
61
|
+
belongs at the pointer. **The test is whether the resident text still produces correct behavior on a
|
|
62
|
+
turn where the pointer is never opened.** If dropping a sentence would let an agent proceed wrongly
|
|
63
|
+
rather than merely proceed less well informed, that sentence is part of the trigger. If dropping it
|
|
64
|
+
only costs context, it belongs at the pointer.
|
|
65
|
+
|
|
66
|
+
**Trimming is moving, and deleting is the exception that has to be earned.** Before a sentence leaves
|
|
67
|
+
`CLAUDE.md` it has to exist at the pointer, and the marker suite that pinned it has to be re-pointed
|
|
68
|
+
there rather than dropped. A canonical section that is thinner than the resident copy is the normal
|
|
69
|
+
case, not a reason to delete — the resident text is then the fuller version, and it is moved in
|
|
70
|
+
before it is cut out.
|
|
71
|
+
|
|
72
|
+
**A system that can only move eventually jams, so one route out exists — and it is narrow**
|
|
73
|
+
(joshuafolkken/kit#1525). A rule is *retired* rather than moved only where deleting it cannot change
|
|
74
|
+
what any agent does, and that has to be shown rather than argued:
|
|
75
|
+
|
|
76
|
+
1. **It is a clone of text that has a declared single source**, and the source is named in the same
|
|
77
|
+
document. Where the two differ the copy is the wrong one, so nothing can correctly depend on it.
|
|
78
|
+
2. **It carries no sentence that exists nowhere else** — checked against the source it duplicates,
|
|
79
|
+
not against a memory of it.
|
|
80
|
+
3. **No marker suite pins it**, so no assertion is being dropped along with it.
|
|
81
|
+
|
|
82
|
+
**"It looks redundant" satisfies none of the three, and a rule with a firing test, a marker, or a
|
|
83
|
+
measured effect is not a candidate at all.** Every rule in these documents was written after a
|
|
84
|
+
specific failure; one that changes nothing today may simply be one whose failure has not recurred
|
|
85
|
+
*because it is there*. When the three do not all hold, the finding is recorded as a candidate with
|
|
86
|
+
its evidence and left standing — a listed candidate costs nothing and can be taken up later, while a
|
|
87
|
+
wrongly deleted rule fails silently, months later, in a run nobody is watching.
|
|
88
|
+
|
|
89
|
+
**The scope of this list is every resident rule that has an on-demand counterpart** — a skill or an
|
|
90
|
+
on-demand prompt carrying the procedure the resident text routes to. Those are the rules the
|
|
91
|
+
criterion is *about*: each one could have moved, and stayed for a reason worth naming. Within that
|
|
92
|
+
scope the list is exhaustive, and a rule with a counterpart that is resident without appearing here
|
|
93
|
+
has not been checked.
|
|
94
|
+
|
|
95
|
+
Counting by skill would draw the line in the wrong place — `verify-ui` is routed to as readily as
|
|
96
|
+
this skill is, and one entry below routes to `prompts/review.md`, which is not a skill at all.
|
|
97
|
+
|
|
98
|
+
Outside the scope the documents carry a great deal more — the naming conventions, the quality
|
|
99
|
+
limits, the code-change rules, Package-First. **None of that belongs on this list**: there is no
|
|
100
|
+
on-demand copy for them to have moved to, so the question the criterion asks does not arise, and
|
|
101
|
+
their absence here is correct rather than an omission (joshuafolkken/kit#955).
|
|
102
|
+
|
|
103
|
+
Within that scope, every rule that passes the test is resident in full, and a marker suite asserts
|
|
104
|
+
each one present in `CLAUDE.md` — `scripts/claude/workflow-skills.test.ts` for most of them,
|
|
105
|
+
`scripts/claude/verify-ui-skill.test.ts` for the UI gate,
|
|
106
|
+
`scripts/document/document-markers.test.ts` for the follow-up filing step, and
|
|
107
|
+
`scripts/document/document-markers.test.ts` for the file-editing prohibition. **A trigger-delivered rule
|
|
108
|
+
is pinned differently** — by what its refusal says and by the trigger firing, in
|
|
109
|
+
`scripts/rules/turn-batching-rule.test.ts`, `scripts/backlog/backlog-manufacturing-rule.test.ts` and
|
|
110
|
+
`scripts/rules/delivered-rules.test.ts`, with only its one-line trigger asserted resident:
|
|
111
|
+
|
|
112
|
+
- **Explicit invocation required** — it decides whether a workflow starts at all, so it binds on the
|
|
113
|
+
turn the user types the keyword, which is before anything here has been read.
|
|
114
|
+
- **The mid-workflow stop notification** — most pauses that need it (an upstream-Issue interrupt, a
|
|
115
|
+
Tier C confirmation) happen on turns carrying no workflow keyword at all.
|
|
116
|
+
- **The `overrides` prohibition** and **the `devEngines` prohibition** — a dependency command can be
|
|
117
|
+
run on any turn, including one that never loads `dependency-update`, and by the time the skill
|
|
118
|
+
would be read the pin has already been rewritten.
|
|
119
|
+
- **The follow-up filing step after the review round cap** — filing the Issue and bundling it into an
|
|
120
|
+
epic. A pre-commit self-review runs outside any workflow as readily as inside one, and the Issue it
|
|
121
|
+
files is orphaned just the same; the step has to be readable on a turn that never typed a keyword.
|
|
122
|
+
Its full form is in `prompts/review.md` → "Review round cap" (joshuafolkken/kit#946).
|
|
123
|
+
- **The UI-verification gate** — a rendered change is not done until the screen has been looked at,
|
|
124
|
+
and the procedure for capturing it is `verify-ui`. The gate binds whenever a UI change is reported
|
|
125
|
+
finished, which is routinely a turn with no workflow keyword typed and no skill loaded.
|
|
126
|
+
- **The three `josh epic:*` rules that bind outside those commands** — recording a decision removes
|
|
127
|
+
that child's `needs-decision` label, fixing what `epic:audit` finds is Tier A, and an epic in
|
|
128
|
+
another repository is referenced as `owner/repo#N`. Each fires on a turn where no `epic:*` command
|
|
129
|
+
was run: the moment an issue is filed, or a decision written. The commands' own procedures are in
|
|
130
|
+
`.claude/skills/epic-commands/`, which is where everything else about them lives.
|
|
131
|
+
- **The prohibition on carrying a file's new text inside a shell command** — an edit happens on any
|
|
132
|
+
turn at all, and there is no skill that a run loads *before* editing. Placed on demand, this one
|
|
133
|
+
rule would never fire once, which reads exactly like having deleted it. The measured cost, the
|
|
134
|
+
allowed/prohibited table and the reasoning are at
|
|
135
|
+
`prompts/collaboration-workflow/file-edits.md`; what stays resident is the instruction and the
|
|
136
|
+
criterion that decides it — whether the command carries the replacement wholesale, not which tool
|
|
137
|
+
was used (joshuafolkken/kit#1150). **The same criterion binds the Edit itself**: rewriting a whole
|
|
138
|
+
file to fix the three lines a review named carries the replacement wholesale exactly as a heredoc
|
|
139
|
+
does, so the resident instruction covers it in one clause and the three cases that justify writing
|
|
140
|
+
a file whole stay at the pointer (joshuafolkken/kit#1260).
|
|
141
|
+
|
|
142
|
+
**These left this list at the first question, and are delivered by a hook instead**
|
|
143
|
+
(joshuafolkken/kit#1524). None lost a sentence; each is pinned by the firing test named beside it
|
|
144
|
+
rather than by a residency marker, and `prompts/collaboration-workflow/rule-delivery.md` is the
|
|
145
|
+
enumeration and the single source of what a turn where the trigger does not fire means. **The four
|
|
146
|
+
described below are not the whole set** — the enumeration has grown to nine rows, of which
|
|
147
|
+
`scripts/rules/delivered-rules.ts` carries seven and two are their own binaries. The count that used to
|
|
148
|
+
open this paragraph said `Four` and had been wrong since the fifth row landed, which is what a
|
|
149
|
+
restated count does; it is gone rather than corrected, because a number kept in two places drifts
|
|
150
|
+
again (joshuafolkken/kit#1525).
|
|
151
|
+
|
|
152
|
+
- **The instruction to put independent calls in one turn** — `pnpm josh batch:guard` refuses the
|
|
153
|
+
`Bash`, `Edit` or `Read` call that would make a third consecutive single-call turn, and states the criterion
|
|
154
|
+
there. **`Edit` joined `Bash` in joshuafolkken/kit#1762, and `Read` in joshuafolkken/kit#1798**, because edits carry most of the recoverable
|
|
155
|
+
round trips and the guard could not reach one of them, and because a cluster holding one `Read` was breaking the wiring rather than the count.
|
|
156
|
+
It was resident through every run the topic file measures, and moved none of them, so what the
|
|
157
|
+
relocation gave up is prose that was not being obeyed
|
|
158
|
+
(`prompts/collaboration-workflow/turn-batching.md`, `scripts/rules/turn-batching-rule.test.ts`).
|
|
159
|
+
- **The backlog WIP cap** — `pnpm josh rule:guard` refuses the `Bash` call that files an Issue
|
|
160
|
+
(`gh issue create`, or a `title`-bearing POST to `…/issues`) and delivers the count, the refusal,
|
|
161
|
+
both exemptions and the three tests that decide the interrupt one — the three kept whole, because a
|
|
162
|
+
delivery saying only "an interrupt is exempt" hands the deciding back to judgement
|
|
163
|
+
(joshuafolkken/kit#1518). A comment endpoint is not a filing and is left alone
|
|
164
|
+
(`prompts/collaboration-workflow/wip-cap.md`, `scripts/backlog/backlog-manufacturing-rule.test.ts`).
|
|
165
|
+
- **The Issue's comments** — `pnpm josh rule:guard` refuses the `Bash` call that reads an Issue's
|
|
166
|
+
body without them (`gh issue view <N>`, or a `GET` of a path ending `…/issues/<N>`) and hands over
|
|
167
|
+
the reissue that carries them plus the rule for a comment that contradicts the body. It is the one
|
|
168
|
+
row whose trigger `batch:guard` also considers, so it stands aside on that guard's turn and fires
|
|
169
|
+
on the reissue. §2g is the procedure and stays here, because a session that runs no hooks still
|
|
170
|
+
owes the read (`prompts/collaboration-workflow/rule-delivery.md`,
|
|
171
|
+
`scripts/rules/delivered-rules.test.ts`).
|
|
172
|
+
- **The prohibition on putting a body inside shell double quotes** — `pnpm josh rule:guard` refuses
|
|
173
|
+
the `Bash` call whose inline body value carries a backtick or a `$`, the two characters this
|
|
174
|
+
harness's zsh was measured to evaluate there, and hands back the path-shaped spellings
|
|
175
|
+
(`--body-file`, `--field body=@<path>`, `--notify-message-file`). **The trigger reads the body, not
|
|
176
|
+
the flag**: every worked example in these documents passes a placeholder, which is inert, so keying
|
|
177
|
+
on the flag would refuse the turns where the rule is already kept. It is also the one row whose
|
|
178
|
+
trigger deliberately overlaps another — a filing whose body carries a backtick is `wip-cap`'s
|
|
179
|
+
first, and this one's on the reissue. A one-line trigger stays resident because a hook reaches
|
|
180
|
+
Claude Code alone (`prompts/collaboration-workflow/shell-body.md`,
|
|
181
|
+
`scripts/rules/shell-body-rule.test.ts`, joshuafolkken/kit#1198).
|
|
182
|
+
|
|
183
|
+
These do not pass it, and live in a skill instead: the split assessment (`split-assessment.md`), a
|
|
184
|
+
prerequisite discovered mid-run (§2d, with each entry's branch in
|
|
185
|
+
`fullrun.md` / `halfrun.md` / `backlogrun.md`), a named `backlogrun` item's acceptance
|
|
186
|
+
of an Issue that is not an epic and its park-and-continue behavior (`backlogrun.md`), the whole
|
|
187
|
+
verification gate and merge chain (`chain-rule.md` / `followup.md`), and the post-update verification
|
|
188
|
+
procedure (`.claude/skills/dependency-update/`) that the two prohibitions above route to.
|
|
189
|
+
|
|
190
|
+
The `auto-ok` pickup and its "only a person applies the label" rule (`backlogrun.md`) are the borderline
|
|
191
|
+
case worth naming, because a prohibition on writing usually *is* resident. It is not, and the reason
|
|
192
|
+
is that `auto-ok` exists nowhere but the documents that also forbid an agent applying it: a turn that
|
|
193
|
+
opens none of them is a turn on which the label is never reached, so residency would buy nothing.
|
|
194
|
+
|
|
195
|
+
**The criterion is not advisory.** `scripts/claude/workflow-skills.test.ts` caps each document at
|
|
196
|
+
`RESIDENT_CEILING_BYTES` and requires headroom under it, so a procedure restated resident costs
|
|
197
|
+
budget that the next genuinely-resident rule then has to take back out of existing prose.
|
|
198
|
+
|
|
199
|
+
**The freeze on reducing resident text was lifted on 2026-09-13** (joshuafolkken/kit#1931 →
|
|
200
|
+
`## Decisions`, carried out in joshuafolkken/kit#1924). Until then `rule:value` was read as a
|
|
201
|
+
gate on reduction: three successive readings each retired nothing, and `CLAUDE.md` stayed at ~56 KB
|
|
202
|
+
while its duplicated procedure bodies — the completion gate, the pre-commit self-review, the Step 0
|
|
203
|
+
report format, the upstream-interrupt procedure — sat resident beside pointers that already held them.
|
|
204
|
+
**That gating is retracted.** `rule:value` remains a *measurement* — a low unaided-keep ratio is still
|
|
205
|
+
evidence a resident copy earns its place — but a reading that retires nothing no longer freezes the
|
|
206
|
+
document, and a resident copy whose body is duplicated at a declared pointer is trimmed to its trigger
|
|
207
|
+
under **Trimming is moving** above, without waiting for a reading to license it. **The readings below
|
|
208
|
+
are retained as history of how the gate was applied, not as a live constraint.**
|
|
209
|
+
|
|
210
|
+
**What leaves when the budget binds is decided by measurement, not by which sentence a marker
|
|
211
|
+
happened to pin** (joshuafolkken/kit#1525). The old order was the reverse: a rule edited to keep a
|
|
212
|
+
byte count lost whichever neighboring sentence was not pinned by a marker, so the least-defended
|
|
213
|
+
text went rather than the least-useful one, and the bias grew with every rule added
|
|
214
|
+
(joshuafolkken/kit#951). `rule:value` replaces that with a reading — over this checkout's
|
|
215
|
+
recorded sessions it reports, per trigger-delivered rule, how often the run had already kept the rule
|
|
216
|
+
at the moment the trigger fired. **That window is the rule's absence**, because the hook has said
|
|
217
|
+
nothing yet and only the carried text is asking; the ratio is what the carried text earns unaided.
|
|
218
|
+
|
|
219
|
+
**The first reading refused the deletion it was built to justify, which is why the measurement runs
|
|
220
|
+
first.** Over 220 recorded runs the WIP cap — which keeps a resident copy — was kept unaided in 55% of
|
|
221
|
+
the runs that reached it, while the Issue-comments rule, which has **no** resident copy, managed
|
|
222
|
+
15%. The resident text was the obvious candidate on a reading of the prose, since the refusal repeats
|
|
223
|
+
it almost word for word; the number says it is doing a great deal of work and must stay.
|
|
224
|
+
|
|
225
|
+
**The second reading covers every rule, and it found no candidate either** (joshuafolkken/kit#1643).
|
|
226
|
+
The first reading could score only two rows, so nobody could tell whether the candidates were
|
|
227
|
+
exhausted or merely unmeasured. All six now declare a compliance test, and over 225 recorded runs they
|
|
228
|
+
read: `shell-body` 81%, `early-heartbeat` 67%, `wip-cap` 57%, `issue-comments` 15%,
|
|
229
|
+
`piped-verification` 13%, `run-tail` 4%. **The two rules that keep a resident copy are the two at the
|
|
230
|
+
top** — `shell-body` at 81% and `wip-cap` at 57% — and exactly one rule without a copy sits between
|
|
231
|
+
them: `early-heartbeat`, at 67% over **18 runs**, the smallest denominator in the table by a factor of
|
|
232
|
+
five. So the resident copies are earning their place, and **nothing is retired on this reading**. The
|
|
233
|
+
figures move as the corpus grows, so the next run of this question re-reads them rather than quoting
|
|
234
|
+
these.
|
|
235
|
+
|
|
236
|
+
**The third reading added the row the table had never carried, and it changed no verdict either**
|
|
237
|
+
(joshuafolkken/kit#1792). The batching guard is delivered by a binary of its own, so it sat outside
|
|
238
|
+
the registry `rule:value` read and the most-cited resident rule in the repository had no continuous
|
|
239
|
+
reading at all. Over 297 recorded runs it reads **86% unaided over 276 runs, with 47 refusals** — the
|
|
240
|
+
top of the table, so it too is earning its place and nothing is retired on this reading. **The row is scored on its refusal rather than on a trigger**, because whether a call would
|
|
241
|
+
be refused depends on the turns behind it, which is also where the turn-is-a-message-id correction the
|
|
242
|
+
first reading of the row exposed came from.
|
|
243
|
+
|
|
244
|
+
**Measuring the four needed a distinction the first reading did not have, and it is the half worth
|
|
245
|
+
carrying forward.** A rule's denominator is the situation it governs, and that is the trigger only
|
|
246
|
+
where the trigger is a *neutral* act — filing an Issue, reading one — which a run keeping the rule
|
|
247
|
+
performs anyway. The other four fire only on the violation: a run that backgrounded every push never
|
|
248
|
+
trips `run-tail`. Scored against the trigger they would all have read near zero, and near zero reads
|
|
249
|
+
as "the carried text earns nothing" — **a manufactured retirement candidate, which is the one outcome
|
|
250
|
+
this measurement exists to prevent**. Such a row declares `reaches` instead, the governed act in
|
|
251
|
+
either spelling.
|
|
252
|
+
|
|
253
|
+
**The three tests then refused every remaining candidate, and that is the route working rather than
|
|
254
|
+
failing.** The four resident one-liners left behind by trigger delivery all fail test 2: the
|
|
255
|
+
paragraph above records why a line stays behind when the hook reaches one harness, so each carries a
|
|
256
|
+
sentence that exists nowhere else. The duplicate list of delivered rules in
|
|
257
|
+
`prompts/collaboration-workflow/residency.md` looked like a clean test-1 case — a stale summary
|
|
258
|
+
sitting directly beneath a pointer to its own single source — and fails test 3, because
|
|
259
|
+
`scripts/rules/shell-body-rule.test.ts` and `scripts/rules/turn-batching-rule.test.ts` each assert that a
|
|
260
|
+
delivered rule is listed there. **Being pinned is what test 3 is for**: that assertion is the design
|
|
261
|
+
requirement it looks like an accident of. Only the restated count above was retired. **A run that
|
|
262
|
+
finds nothing retirable records the candidates with their evidence and stops there**, rather than
|
|
263
|
+
lowering the bar until a deletion appears. A rule
|
|
264
|
+
scoring `-` has declared no compliance test and is **unmeasured, never zero** — it is not thereby a
|
|
265
|
+
candidate.
|
|
266
|
+
|
|
267
|
+
**The fourth reading swept the eight mechanization PRs of the reduction epic (joshuafolkken/kit#2117–#2124) and retired nothing, which is again the route working** (joshuafolkken/kit#2125). Each PR that moved a judgement into a command trimmed its own resident prose to trigger-plus-pointer as it landed, so the sweep found no procedure restated in full: the mechanized triggers — the computable-answer question 0 (`oracle:list`), `test:declared`, `issue:scout` and the filing cap, the shell-body guard, `repo:party`, and the fixed-shape linters (`issue:lint` / `report:lint`) — each already resolve to their declared single source (`prompts/collaboration-workflow/residency.md`, `rule-delivery.md`, `wip-cap.md`, `shell-body.md`, `upstream-interrupt.md`, `report-format.md`) rather than carrying the procedure resident. **The one candidate the sweep raised was the `Stop` hook's arrival** (joshuafolkken/kit#2121): the resident `CLAUDE.md` → "Mid-workflow stop notification" section looked like a delivered rule whose copy could shrink to a one-liner, but it fails test 3 — `scripts/document/document-markers.test.ts` pins its heading and `scripts/claude/workflow-skills.test.ts` pins its `notify` command and its `parseArgs` line — and it fails test 2, because `stop-rules.ts`'s `STOP_NOTIFY_REASON` names this very section as the single source the delivered text points at, so trimming it would strand the pointer. The hold-release and issue-citation stop rules introduced no resident duplication at all: their single sources are `SKILL.md` → §2f and `issue-citation.md`, which the hook points to, and the resident issue-citation text was already a one-line trigger. **What the sweep reclaimed was a stale byte-budget record, not prose**: `chain-rule.md` was reduced in joshuafolkken/kit#2078 but its recorded size was never lowered, so the ratchet in `scripts/document/document-byte-budget.ts` was tightened 18,031 → 6,240 to hold that reduction. **The reclamation was only possible because nothing enforced it** — the ratchet's growth guard catches a document that swells past its ceiling but is blind to one that shrinks and leaves its record standing, which is how chain-rule.md's stale-loose entry survived two reduction epics unseen. So a staleness guard was added beside it (`recorded ≤ actual + slack`): an unrecorded shrink now fails `pnpm josh gate` rather than drifting, so the next reduction epic finds nothing stale to reclaim.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# The split assessment — one definition, every entry point
|
|
2
|
+
|
|
3
|
+
Before any entry point starts work on an Issue, decide whether the request is really **one**
|
|
4
|
+
deliverable or several. This file is the single definition; every command applies it identically.
|
|
5
|
+
|
|
6
|
+
## The question
|
|
7
|
+
|
|
8
|
+
**The default is not to split.** Two questions have to answer yes **together**; either one alone
|
|
9
|
+
leaves the work as one Issue:
|
|
10
|
+
|
|
11
|
+
1. **Does the request contain two or more deliverables that could each be merged separately?**
|
|
12
|
+
2. **Does the whole of it clearly exceed what one verification gate can confirm in one pass?** The
|
|
13
|
+
guide is **about 10 changed files and about 400 changed lines** (test files excluded).
|
|
14
|
+
Under that, it is one Issue however many separable pieces a reader can name inside it.
|
|
15
|
+
|
|
16
|
+
Separately mergeable is still the first test, and it is unchanged: a change that must land in one
|
|
17
|
+
commit to be correct is one deliverable however big it is. What changed is that **separability alone
|
|
18
|
+
no longer splits anything** — it is now a necessary condition rather than a sufficient one.
|
|
19
|
+
|
|
20
|
+
**The guide is a guide, and "clearly" is the operative word.** A run that has to argue itself past the
|
|
21
|
+
numbers has already answered no. They are read against the whole request's estimate, not against the
|
|
22
|
+
diff a first pass happens to produce, and a request that lands at 11 files is not thereby a split.
|
|
23
|
+
|
|
24
|
+
## The same two questions decide the filing-time fold
|
|
25
|
+
|
|
26
|
+
**The entry's split decision and the filing-time fold decision are the same two conditions, stated
|
|
27
|
+
here once.** This assessment asks whether *one request* is several deliverables; the fold decision asks
|
|
28
|
+
whether *several findings from one session* are one Issue — and reads the **same two questions in the
|
|
29
|
+
same conjunction**: separability, and whether the whole clearly exceeds one gate.
|
|
30
|
+
`pnpm josh issue:fold "<title>" …` answers `fold` / `separate` / `no-fold-needed`; its size half is
|
|
31
|
+
`pnpm josh split:assess`, called not recomputed, and `separate` needs both halves exactly as `split`
|
|
32
|
+
does. **There is no second criterion.** §2i's observation, the review round cap's branch 2 and §2d's
|
|
33
|
+
prerequisite each route a second filing through it, delivered by `pnpm josh rule:guard` at the run's
|
|
34
|
+
second `gh api … issues` call, never the first.
|
|
35
|
+
|
|
36
|
+
## Why the default is not to split
|
|
37
|
+
|
|
38
|
+
**The rules were manufacturing Issues faster than runs could close them.** Execution was never the
|
|
39
|
+
bottleneck; arrival was, and this assessment was one of the routes producing it: `route:split`
|
|
40
|
+
accounted for **28 of the 119 open Issues (24%)**.
|
|
41
|
+
|
|
42
|
+
**Separability is not scarce, which is why a test made only of it splits nearly everything.** Almost
|
|
43
|
+
any request can be described as several deliverables that could each ship alone, so the old test bit on
|
|
44
|
+
requests worth a handful of lines. The second question is what makes the test bite only where one Issue
|
|
45
|
+
would genuinely be unverifiable in one pass. The review round cap's default and the WIP cap changed
|
|
46
|
+
alongside it, in one commit.
|
|
47
|
+
|
|
48
|
+
## Diff size is not a reason to split, and that is measured
|
|
49
|
+
|
|
50
|
+
**Size is a bar a split has to clear; it is never a reason to split.** Question 2 is a *minimum* — below
|
|
51
|
+
it the work stays whole — and nothing makes a large diff a reason to divide one. Splitting an Issue in
|
|
52
|
+
two to shorten review round 1 lengthens it, because each Issue pays round 1's fixed cost again while
|
|
53
|
+
the size-dependent part is merely divided between the halves (measured in joshuafolkken/kit#1436:
|
|
54
|
+
round 1's cost is dominated by a fixed part that two Issues pay twice, so there is no diff size at
|
|
55
|
+
which splitting to cut it pays). **A proposal to add a size threshold that splits more is required to
|
|
56
|
+
say why that data does not reach it.**
|
|
57
|
+
|
|
58
|
+
**The size half is measured, not eyeballed — `pnpm josh split:assess`.** It counts the branch's
|
|
59
|
+
changed files and changed lines with test files excluded and answers `split` / `single` on size
|
|
60
|
+
alone, so the guide can be checked against real diffs after the fact rather than trusted from an
|
|
61
|
+
estimate. It answers the **size** question only; separability (question 1) stays a judgement, which is
|
|
62
|
+
why a `split` from this command is the size condition met, not a decision to divide the Issue.
|
|
63
|
+
|
|
64
|
+
## What each entry point does with the answer
|
|
65
|
+
|
|
66
|
+
| Entry | Single | Two or more |
|
|
67
|
+
| --- | --- | --- |
|
|
68
|
+
| `kickoff new` | Create one Issue, post the plan, stop | Create the children, create a **new epic**, stop |
|
|
69
|
+
| `kickoff #N` | Post the plan on `#N`, stop | Create the children, then **promote `#N`** or create a new epic (below), stop |
|
|
70
|
+
| `fullrun new` / `halfrun new` | Proceed as usual | Create the children and the epic, then **stop** |
|
|
71
|
+
| `fullrun #N` / `halfrun #N` | Proceed as usual | Create the children, promote or create the epic, then **stop** |
|
|
72
|
+
|
|
73
|
+
## A prerequisite is not a split
|
|
74
|
+
|
|
75
|
+
"This needs something else done first" is a different answer from "this is really several things". A
|
|
76
|
+
split means the request in hand contains two or more deliverables; a prerequisite means it is still
|
|
77
|
+
**one** deliverable that has another one in front of it. The prerequisite rule is `SKILL.md` → §2d, its
|
|
78
|
+
single source; each entry's own branch is in `backlogrun-park.md` → "A prerequisite discovered mid-run" and, for
|
|
79
|
+
the stopping entry points, in `fullrun.md` / `halfrun.md`.
|
|
80
|
+
|
|
81
|
+
## Two or more always means an epic
|
|
82
|
+
|
|
83
|
+
**Splitting into two or more Issues always creates an epic. There is no count threshold and no ordering
|
|
84
|
+
condition to evaluate.** This is about what follows a split, never about whether to make one — the bar
|
|
85
|
+
for that is "The question" above. **An entry point that applies a different condition is a defect** —
|
|
86
|
+
the whole point of one definition is that where the split was noticed cannot change what happens next.
|
|
87
|
+
|
|
88
|
+
The epic is the non-closing home for the split rationale. A comment on the first child is buried the
|
|
89
|
+
moment that child merges and closes.
|
|
90
|
+
|
|
91
|
+
**Each split child is filed with the `route:split` label**, so the backlog's composition stays
|
|
92
|
+
countable by filing route rather than by grepping issue bodies.
|
|
93
|
+
|
|
94
|
+
## Promote, or create a new epic
|
|
95
|
+
|
|
96
|
+
`kickoff #N` and the `#N` runs have one branch, and it is Tier A — decide it and record the reasoning
|
|
97
|
+
on the Issue, without asking.
|
|
98
|
+
|
|
99
|
+
- **`#N` is a request, a discussion, or a container → promote it.**
|
|
100
|
+
`pnpm josh epic --promote <N> <N1> <N2> ... [--ordered]`. The body is appended to, never replaced.
|
|
101
|
+
- **`#N` is itself one of the deliverables → keep `#N` as a child and create a new epic.** A bug report
|
|
102
|
+
that turns out to need three fixes is the case: promoting the report would leave the report itself
|
|
103
|
+
with nowhere to live.
|
|
104
|
+
|
|
105
|
+
## `backlogrun` is the one entry that does not stop
|
|
106
|
+
|
|
107
|
+
`backlogrun` asked for the batch's authorization, so a split found under it is filed and continued through
|
|
108
|
+
rather than stopped — including when the `backlogrun` was given a bare, non-epic Issue, where the split is
|
|
109
|
+
what creates the epic (`backlogrun-child.md` → "When `#N` is not an epic"). The assessment itself is identical;
|
|
110
|
+
only what follows the answer differs.
|
|
111
|
+
|
|
112
|
+
## Finding a split mid-run stops the run
|
|
113
|
+
|
|
114
|
+
`fullrun` and `halfrun` **stop** after filing the children and the epic. They do not continue into
|
|
115
|
+
implementation, and they do not silently become a `backlogrun`. Typing `fullrun` approved implementing and
|
|
116
|
+
merging **one** Issue; a batch of N is a different authorization. Report what was filed and end with:
|
|
117
|
+
|
|
118
|
+
> Please run `backlogrun #<E> --only` to execute this epic.
|
|
119
|
+
|
|
120
|
+
## There is no `kickoff epic`
|
|
121
|
+
|
|
122
|
+
A separate keyword for "split this conversation into an epic" would duplicate `kickoff new` exactly,
|
|
123
|
+
leaving a person to decide which of two commands to type for one job. The assessment above is how a
|
|
124
|
+
split is reached from every entry.
|
|
125
|
+
|
|
126
|
+
## Issues filed separately, found related later
|
|
127
|
+
|
|
128
|
+
Issues that were filed at different times and turn out to be related afterwards are **not** a split — a
|
|
129
|
+
split is about one request in hand containing several deliverables. That case is outside this
|
|
130
|
+
assessment, and `pnpm josh epic --promote` is what handles it.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# The `owner/repo#` prefix — which repository the run acts on
|
|
2
|
+
|
|
3
|
+
**This is `SKILL.md` → §2c's body, read at its point of use — the moment an entry is typed with an
|
|
4
|
+
`owner/repo#` prefix (or a short `repo#` name), not at any entry** (joshuafolkken/kit#2161). A run
|
|
5
|
+
given a bare `#N` or `new` targets the session's own repository and never reaches it, so it costs a
|
|
6
|
+
workflow entry nothing to leave it here. `SKILL.md` → §2c keeps the trigger and points here.
|
|
7
|
+
|
|
8
|
+
Every entry point takes the target repository in front of the Issue reference. Without it the target
|
|
9
|
+
is the repository the session runs in.
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
kickoff joshuafolkken/kit#412
|
|
13
|
+
kickoff kit#new
|
|
14
|
+
kickoff kit#new "<title>"
|
|
15
|
+
fullrun joshuafolkken/app-kit#12
|
|
16
|
+
halfrun kit#412
|
|
17
|
+
backlogrun kit#1 kit#2
|
|
18
|
+
backlogrun joshuafolkken/kit#858 --only
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- **One definition, every entry point.** The prefix goes where `#N` goes, so no new keyword is added,
|
|
22
|
+
and `owner/repo#new` stands in the same slot as `owner/repo#N`.
|
|
23
|
+
- **A short name expands by prefixing the session repository's owner** — `pnpm josh repo:party`
|
|
24
|
+
computes the party — and **never by searching kit#869's map**, which answers where a checkout is
|
|
25
|
+
rather than which repository is meant. A short name therefore satisfies the first-party test (owner
|
|
26
|
+
equality) by construction, so **there is structurally no path by which a short name resolves to a
|
|
27
|
+
third-party target**, and a repository that is not checked out here is still a valid `kickoff`
|
|
28
|
+
target. A name that does not exist fails as `gh` not found: report it, never read it as a near-miss
|
|
29
|
+
for another name.
|
|
30
|
+
- **It is not the standing prohibition on a bare `#N`.** What that forbids is a bare *Issue number*,
|
|
31
|
+
which resolves without complaint to a different issue of the same number; a bare *repository* name
|
|
32
|
+
whose owner is determined has no such failure mode.
|
|
33
|
+
- **An explicit owner that is not the session's is a third-party target, and it stops the run.**
|
|
34
|
+
`fullrun <other-owner>/repo#12` names a tracker we do not own, and every write there is Tier C
|
|
35
|
+
(`CLAUDE.md` → "Third-party repositories are Tier C"). **Decide it mechanically** with
|
|
36
|
+
`pnpm josh repo:party <owner/repo>` — a `third-party` verdict stops the run. Typing the prefix is not the
|
|
37
|
+
explicit instruction that rule requires. **Send a `confirmation` Telegram and stop** — nothing has
|
|
38
|
+
been produced yet, so there is no finding to record and no draft to prepare.
|
|
39
|
+
- **No prefix leaves the behavior exactly as it was** — the target is the session's repository.
|
|
40
|
+
- **`kickoff` needs no checkout**: name the target repository in the path of every `gh api` call and
|
|
41
|
+
never clone. The one exception is the split path's epic, since `pnpm josh epic` only writes the
|
|
42
|
+
repository it runs in — run it in that repository's checkout, or fall back to `gh api
|
|
43
|
+
repos/<owner/repo>/labels …` followed by `gh api repos/<owner/repo>/issues -f title="<epic-title>" -f
|
|
44
|
+
'labels[]=epic' -f body="<body>"`, and report that `epic:check` could not be run. The promote arm has
|
|
45
|
+
no such fallback: with no checkout there, file the children and stop.
|
|
46
|
+
- **The implementing entries require a checkout and never create one — when the target is another
|
|
47
|
+
repository.** A prefix naming the session's own repository changes nothing (`fullrun kit#412` in the
|
|
48
|
+
kit checkout behaves exactly as `fullrun #412`). Otherwise resolve the checkout from `pnpm josh
|
|
49
|
+
doctor`'s map; **no checkout there, or a tree that is not clean, stops the run** with a
|
|
50
|
+
`confirmation` Telegram — cloning decides the layout of someone's machine for them, and a dirty tree
|
|
51
|
+
holds work that is not yours to stash. Otherwise the commands that act on the target execute in that
|
|
52
|
+
checkout.
|
|
53
|
+
- **A named epic is exempt from the whole bullet above**: `owner/repo#E` names where the *epic* lives,
|
|
54
|
+
not where its children are implemented. Its state is read against that repository through `gh api`,
|
|
55
|
+
so that repository needs no checkout. The checkout rules bind each child at implementation time,
|
|
56
|
+
against **that child's** repository ("Concurrency" in `backlogrun.md`).
|
|
57
|
+
- **Independent of `into <target>`**: this says which repository the run acts on, `into` says which
|
|
58
|
+
epic the artifact joins — `kickoff kit#new into joshuafolkken/kit#909` is one correct line.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# The working-tree hold — one run per tree
|
|
2
|
+
|
|
3
|
+
**This is the body of `SKILL.md` §2f, relocated here so the entry read carries the trigger and the
|
|
4
|
+
pointer, not the procedure** (joshuafolkken/kit#2189). `SKILL.md` §2f is the resident stub, and
|
|
5
|
+
`fullrun.md` / `halfrun.md` route here for the definition. It is read at its point of use — the moment
|
|
6
|
+
a run is about to claim or release the tree.
|
|
7
|
+
|
|
8
|
+
**Ask `pnpm josh run:hold` before anything else, and obey what it answers.** It is the first call of
|
|
9
|
+
`fullrun` and `halfrun` alike — before the title is normalized, before `git switch main`, and **before
|
|
10
|
+
a `new` entry files its Issue**, because a run stopped after the filing has already left behind the
|
|
11
|
+
artifact it should not have created.
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pnpm josh run:hold <N> # a `#N` entry point ; alias: josh rh
|
|
15
|
+
pnpm josh run:hold # a `new` entry point, before the issue exists
|
|
16
|
+
pnpm josh run:release <N> # that same run releasing its own record ; alias: josh rr
|
|
17
|
+
pnpm josh run:release # the bare form releases the unnumbered run's own record
|
|
18
|
+
pnpm josh run:release --force # a record left behind by a run that has ended
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- **`hold` — this run now holds the tree. Continue.**
|
|
22
|
+
- **`busy` — another run holds it. Stop.** Send a `confirmation` Telegram carrying what the command
|
|
23
|
+
printed on stderr (the holder, when the record was written, and the release command) and stop.
|
|
24
|
+
**File nothing, create no branch, edit nothing.**
|
|
25
|
+
- **`unknown` — nothing was established. Stop the same way.** It is not "the tree is free".
|
|
26
|
+
|
|
27
|
+
**The unit is the working tree, and `epic-busy.ts` is not reused for it.** That read answers about a
|
|
28
|
+
*repository* and implements `backlogrun`'s one-child-per-repository rule; what these entry points contend
|
|
29
|
+
for is one branch, one index and one uncommitted diff, and a linked work tree has its own three.
|
|
30
|
+
**`backlogrun`'s own guard is unchanged** — the two layers guard different resources.
|
|
31
|
+
|
|
32
|
+
**`kickoff` does not claim it, and that is an exemption rather than an omission.** `kickoff` touches
|
|
33
|
+
none of branch, index or uncommitted diff: it reads the Issue, normalizes the title, posts the plan,
|
|
34
|
+
notifies and stops, every one of those against GitHub. It is a fact about the command rather than a
|
|
35
|
+
judgement made at the entry, and it changes nothing for `fullrun` or `halfrun`.
|
|
36
|
+
|
|
37
|
+
**Claim it in the checkout the run will edit.** The record is keyed to the work tree the command runs
|
|
38
|
+
in, so a cross-repository `fullrun owner/repo#N` resolves that repository's checkout from `pnpm josh
|
|
39
|
+
doctor` **first** — that resolution is a read and writes nothing — and claims there.
|
|
40
|
+
|
|
41
|
+
**A release names the run it belongs to.** `pnpm josh run:release <N>` removes the record only where the
|
|
42
|
+
record names `<N>`, the bare form only the unnumbered run's, and a record belonging to anything else
|
|
43
|
+
answers **`held`** and is left standing. **`pnpm josh run:release --force` is the one spelling that
|
|
44
|
+
removes a record this run did not write**, and the `busy` stop message names it rather than the
|
|
45
|
+
ordinary one.
|
|
46
|
+
|
|
47
|
+
**Release what the claim recorded, which is not always the Issue number.** A `#N` entry claimed `<N>`
|
|
48
|
+
and releases `<N>`; a **`new` entry claimed before its Issue existed**, so it releases with the
|
|
49
|
+
**bare** form however many numbers the run has acquired since — so a `fullrun new` that stops on a
|
|
50
|
+
split types `pnpm josh run:release`, not `pnpm josh run:release <N>`.
|
|
51
|
+
|
|
52
|
+
**Releasing is the run's, not a person's memory.** `pnpm josh followup` releases the hold on a merged
|
|
53
|
+
run, and a record abandoned by a crashed session expires after 8 hours. **A stop that leaves the tree
|
|
54
|
+
clean releases it explicitly**: a `fullrun` / `halfrun` that stops on a split, a prerequisite or a
|
|
55
|
+
third-party target ends with `pnpm josh run:release <N>` (bare where that run entered as `new`).
|
|
56
|
+
**`halfrun`'s stop before commit keeps the hold**, and so does a `needs-human-review` stop: the
|
|
57
|
+
uncommitted work still in the tree is exactly what a second run would trample, so the release command
|
|
58
|
+
goes in the stop report and the Telegram for the person to type. **An expired record over a tree that
|
|
59
|
+
still has uncommitted changes does not free it**: the command answers `busy` and says to commit, stash,
|
|
60
|
+
or release once the work is done; only an expired record over a clean tree is replaced.
|
|
61
|
+
|
|
62
|
+
**The batch entry points claim per child, not per batch.** `backlogrun` never
|
|
63
|
+
call it themselves; each child runs the `fullrun` procedure, so it claims on entry and `pnpm josh
|
|
64
|
+
followup` releases it at that child's merge. The command's behavior and the answer table are
|
|
65
|
+
`docs/josh-commands.md` → "`josh run:hold` / `josh run:release`"; this file is the single source of
|
|
66
|
+
the procedure.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "kit",
|
|
3
|
+
"description": "The joshuafolkken/kit plugin marketplace — ships kit's distributed Claude Code skills to consumer projects.",
|
|
4
|
+
"owner": {
|
|
5
|
+
"name": "joshuafolkken",
|
|
6
|
+
"url": "https://github.com/joshuafolkken"
|
|
7
|
+
},
|
|
8
|
+
"plugins": [
|
|
9
|
+
{
|
|
10
|
+
"name": "kit",
|
|
11
|
+
"source": "./.claude",
|
|
12
|
+
"description": "joshuafolkken/kit distributed skills: Issue-driven workflow commands, epic:* commands, post-dependency-update verification, the UI-verification gate."
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|
package/.coderabbit.yaml
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
language: en-US
|
|
2
|
+
|
|
3
|
+
reviews:
|
|
4
|
+
profile: chill
|
|
5
|
+
high_level_summary: false
|
|
6
|
+
changed_files_summary: false
|
|
7
|
+
sequence_diagrams: false
|
|
8
|
+
poem: false
|
|
9
|
+
auto_review:
|
|
10
|
+
enabled: true
|
|
11
|
+
drafts: false
|
|
12
|
+
|
|
13
|
+
finishing_touches:
|
|
14
|
+
docstrings:
|
|
15
|
+
enabled: false
|
|
16
|
+
unit_tests:
|
|
17
|
+
enabled: false
|
|
18
|
+
|
|
19
|
+
path_filters:
|
|
20
|
+
- '!src/lib/paraglide/**'
|
|
21
|
+
- '!messages/**'
|
|
22
|
+
- '!pnpm-lock.yaml'
|
|
23
|
+
- '!worker-configuration.d.ts'
|
|
24
|
+
- '!**/*.d.ts'
|
|
25
|
+
- '!drizzle/**'
|
|
26
|
+
- '!static/**'
|
|
27
|
+
- '!*.config.*'
|
|
28
|
+
|
|
29
|
+
knowledge_base:
|
|
30
|
+
opt_out: true
|
|
31
|
+
|
|
32
|
+
tools:
|
|
33
|
+
github-checks:
|
|
34
|
+
enabled: false
|
|
35
|
+
languagetool:
|
|
36
|
+
enabled: false
|
|
37
|
+
shellcheck:
|
|
38
|
+
enabled: false
|
|
39
|
+
markdownlint:
|
|
40
|
+
enabled: false
|
|
41
|
+
ast-grep:
|
|
42
|
+
essential_rules: false
|
|
43
|
+
biome:
|
|
44
|
+
enabled: false
|
|
45
|
+
gitleaks:
|
|
46
|
+
enabled: true
|
|
47
|
+
hadolint:
|
|
48
|
+
enabled: false
|
|
49
|
+
yamllint:
|
|
50
|
+
enabled: false
|