@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,113 @@
|
|
|
1
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
2
|
+
import { file_map_stamp, type FileMapStampAccess } from '#scripts/josh/file-map-stamp'
|
|
3
|
+
|
|
4
|
+
// The three records `josh review:brief` reads (joshuafolkken/kit#1241, joshuafolkken/kit#1242).
|
|
5
|
+
//
|
|
6
|
+
// **The gate stamp** is written by `josh gate` when all four checks pass, and answers "were lint, the
|
|
7
|
+
// type check, the spell check and the unit tests green on *this exact tree*". Without the tree half
|
|
8
|
+
// the brief would assert a result that a later edit had already invalidated, which is the one kind of
|
|
9
|
+
// report this repository refuses to make.
|
|
10
|
+
//
|
|
11
|
+
// **The in-flight marker** exists only while `josh gate` is running, and answers a question the gate
|
|
12
|
+
// stamp cannot: the review and the gate now start together, so at the moment the brief is composed
|
|
13
|
+
// the checks have usually not finished (joshuafolkken/kit#1242). Without it that state is
|
|
14
|
+
// indistinguishable from "no gate was ever run", and the review agent re-runs the unit suite the run
|
|
15
|
+
// is already running — the exact cost joshuafolkken/kit#1241 removed. **It asserts nothing about the
|
|
16
|
+
// result**, only that a gate was started on this tree and the run joins it before committing.
|
|
17
|
+
//
|
|
18
|
+
// **The marker names its writer by pid *and* start time** (joshuafolkken/kit#1245). A pid on its own
|
|
19
|
+
// is not a process: an interrupted gate leaves its marker behind, and once the operating system
|
|
20
|
+
// reissues that pid the liveness probe passes again and the marker resumes asserting a gate that
|
|
21
|
+
// ended. The pair closes that, because a reissued pid necessarily started after the record was
|
|
22
|
+
// written. **The marker was not made weaker to fix it** — dropping it, or having the brief ignore it,
|
|
23
|
+
// would put the re-run joshuafolkken/kit#1242 removed straight back.
|
|
24
|
+
//
|
|
25
|
+
// **A marker whose gate is gone is left where it is, and that is the decision rather than an
|
|
26
|
+
// oversight** (joshuafolkken/kit#1245's second question). Three things make leaving it correct here.
|
|
27
|
+
// The record is keyed per checkout, so exactly one file exists and nothing accumulates; the next
|
|
28
|
+
// `josh gate` overwrites it, since `write_stamp` unlinks before it creates; and the identity check
|
|
29
|
+
// makes a leftover inert for as long as it sits there. Removing it from the reader would buy none of
|
|
30
|
+
// that and would cost the one thing that matters: the reader deletes on "not running", which is also
|
|
31
|
+
// the answer a platform that cannot report a start time gives for a gate that **is** running — so the
|
|
32
|
+
// sweep would delete live markers there, and the next brief of that same run would lose the in-flight
|
|
33
|
+
// sentence. `unit-worker-share.ts` sweeps and is not inconsistent with this: its markers are keyed per
|
|
34
|
+
// pid, so they accumulate without bound, and that is what a sweep is for.
|
|
35
|
+
//
|
|
36
|
+
// **The round-1 snapshot** is written by the brief itself, so that `--round 2` can name the fix
|
|
37
|
+
// delta by comparison rather than by an agent recalling which files it edited.
|
|
38
|
+
//
|
|
39
|
+
// Both key on `PROJECT_ROOT` rather than the package directory: a globally installed `josh` has one
|
|
40
|
+
// package directory for every project on the machine, so keying on it would let a run in one project
|
|
41
|
+
// answer for another (the distinction joshuafolkken/kit#1215 drew for `josh latest:scope`).
|
|
42
|
+
//
|
|
43
|
+
// **`PROJECT_ROOT` is `process.cwd()`, so the two commands must run from the same directory to share
|
|
44
|
+
// a record.** That is deliberate rather than overlooked: run from different directories they simply
|
|
45
|
+
// miss each other, the brief finds no record, and it prints `Not verified` — the safe direction. The
|
|
46
|
+
// tree *inside* the record cannot be left to `cwd()` the same way, because there a mismatch resolves
|
|
47
|
+
// to "every file absent" on both sides and compares equal, so `review-tree.ts` asks git for the
|
|
48
|
+
// repository root instead.
|
|
49
|
+
|
|
50
|
+
// **The two scoped records** answer "were `josh lint:related` and `josh test:related` green on this
|
|
51
|
+
// exact tree" (joshuafolkken/kit#1511). They are separate from the gate stamp because they claim
|
|
52
|
+
// something narrower — the changed files rather than the whole project, and two checks rather than
|
|
53
|
+
// four — and folding them into one record would let a green from either half stand for the other.
|
|
54
|
+
// They are read by `scoped-green.ts`, which is where what they mean is written down; they live here
|
|
55
|
+
// because a stamp prefix declared anywhere else is a second place to look for the same kind of file.
|
|
56
|
+
const LINT_RELATED_PREFIX = 'josh-lint-related-stamp-'
|
|
57
|
+
const TEST_RELATED_PREFIX = 'josh-test-related-stamp-'
|
|
58
|
+
|
|
59
|
+
const GATE_PREFIX = 'josh-gate-stamp-'
|
|
60
|
+
const IN_FLIGHT_PREFIX = 'josh-gate-running-'
|
|
61
|
+
const ROUND_ONE_PREFIX = 'josh-review-round1-'
|
|
62
|
+
|
|
63
|
+
const gate_stamp: FileMapStampAccess = file_map_stamp.create(GATE_PREFIX, PROJECT_ROOT)
|
|
64
|
+
const in_flight_stamp: FileMapStampAccess = file_map_stamp.create(IN_FLIGHT_PREFIX, PROJECT_ROOT)
|
|
65
|
+
const round_one_stamp: FileMapStampAccess = file_map_stamp.create(ROUND_ONE_PREFIX, PROJECT_ROOT)
|
|
66
|
+
const lint_related_stamp: FileMapStampAccess = file_map_stamp.create(
|
|
67
|
+
LINT_RELATED_PREFIX,
|
|
68
|
+
PROJECT_ROOT,
|
|
69
|
+
)
|
|
70
|
+
const test_related_stamp: FileMapStampAccess = file_map_stamp.create(
|
|
71
|
+
TEST_RELATED_PREFIX,
|
|
72
|
+
PROJECT_ROOT,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
// **The round-1 snapshot's lifetime is one run, and something has to end it**
|
|
76
|
+
// (joshuafolkken/kit#1441). Since the record is written once and never retaken, one left on disk
|
|
77
|
+
// would be the record the **next** run's fix delta is measured against — so the run that ends removes
|
|
78
|
+
// it, and `josh followup` is where a run ends. That is the answer to "the same run or a new one" the
|
|
79
|
+
// retake guard needs, taken from the event itself rather than from a proxy for it.
|
|
80
|
+
//
|
|
81
|
+
// **Only one of the two directions is safe, which is why the caller is a single place.** A record
|
|
82
|
+
// this never reaches — a run that stopped before `followup`, a `--no-merge` invocation, a `halfrun`,
|
|
83
|
+
// a review run on its own — is measured from further back, so the next run's delta is wider and the
|
|
84
|
+
// answer is `required`. **Removing one out of turn is the unsafe direction**: the next round-1 brief
|
|
85
|
+
// finds nothing and writes a fresh record against the already-fixed tree, and arm A then fires on
|
|
86
|
+
// unreviewed fix code — the defect joshuafolkken/kit#1441 closed, reintroduced from the other side.
|
|
87
|
+
// So this is called from the end of a run that **merged**, and from nowhere else.
|
|
88
|
+
//
|
|
89
|
+
// Swallowed, and the caller is why: by the time this runs the pull request has already merged, so a
|
|
90
|
+
// temp-directory problem must not turn a completed run into a failed one.
|
|
91
|
+
function clear_round_one(target?: string): void {
|
|
92
|
+
try {
|
|
93
|
+
round_one_stamp.remove(target)
|
|
94
|
+
} catch {
|
|
95
|
+
/* a record left behind widens the next round rather than narrowing it */
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const review_stamps = {
|
|
100
|
+
clear_round_one,
|
|
101
|
+
GATE_PREFIX,
|
|
102
|
+
gate_stamp,
|
|
103
|
+
IN_FLIGHT_PREFIX,
|
|
104
|
+
in_flight_stamp,
|
|
105
|
+
LINT_RELATED_PREFIX,
|
|
106
|
+
lint_related_stamp,
|
|
107
|
+
ROUND_ONE_PREFIX,
|
|
108
|
+
round_one_stamp,
|
|
109
|
+
TEST_RELATED_PREFIX,
|
|
110
|
+
test_related_stamp,
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export { review_stamps }
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { changed_paths } from '#scripts/git/changed-paths'
|
|
4
|
+
import { git_command } from '#scripts/git/git-command'
|
|
5
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
6
|
+
|
|
7
|
+
// The tree `josh review:brief` records: every path the change touches, and the digest of its content
|
|
8
|
+
// (joshuafolkken/kit#1241).
|
|
9
|
+
//
|
|
10
|
+
// The path list is `#scripts/git/changed-paths`', the same reading `josh review:level` decides from
|
|
11
|
+
// — a second definition of "changed" would let the brief describe a different change from the level
|
|
12
|
+
// printed beside it.
|
|
13
|
+
//
|
|
14
|
+
// **The digests are what a `git diff` cannot give.** The implementation and a review's fixes are
|
|
15
|
+
// uncommitted in the same tree, so a diff cannot say which side of the review a change fell on; a
|
|
16
|
+
// digest taken before round 1 and compared after the fixes names exactly the fix delta.
|
|
17
|
+
|
|
18
|
+
// A path the change lists but the working tree does not hold — deleted, or renamed away. Recorded
|
|
19
|
+
// rather than dropped: a delete applied by a fix is part of the fix delta, and a dropped entry would
|
|
20
|
+
// read as "unchanged" on the comparison.
|
|
21
|
+
const ABSENT_DIGEST = 'absent'
|
|
22
|
+
|
|
23
|
+
function digest_of(root: string, relative: string): string {
|
|
24
|
+
try {
|
|
25
|
+
return stamp_file.digest(readFileSync(path.join(root, relative)))
|
|
26
|
+
} catch {
|
|
27
|
+
return ABSENT_DIGEST
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Sorted so two readings of one tree produce the same record byte for byte, which is what lets a
|
|
32
|
+
// stored stamp be compared against a fresh reading without a normalization step in between.
|
|
33
|
+
function tree_of(root: string, paths: ReadonlyArray<string>): Record<string, string> {
|
|
34
|
+
const sorted = [...paths].toSorted((left, right) => left.localeCompare(right))
|
|
35
|
+
|
|
36
|
+
return Object.fromEntries(sorted.map((relative) => [relative, digest_of(root, relative)]))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// **The root is asked of git, never taken from `process.cwd()` — nor from `PROJECT_ROOT`, which is
|
|
40
|
+
// defined as `process.cwd()`.** git prints repository-root-relative paths, so joining them onto the
|
|
41
|
+
// working directory resolves to nothing whenever a command runs from a subdirectory: every digest
|
|
42
|
+
// becomes `absent` on both sides of a comparison, and two such maps *agree*. The brief would then
|
|
43
|
+
// say the gate had verified an arbitrarily edited tree, and `--round 2` would report an empty fix
|
|
44
|
+
// delta. **A defect that answers "all clear" is the one shape this record cannot take**, which is why
|
|
45
|
+
// the root is resolved rather than assumed (measured from `scripts/`: 18 of 25 entries `absent`).
|
|
46
|
+
async function read_changed_tree(
|
|
47
|
+
paths?: ReadonlyArray<string>,
|
|
48
|
+
root?: string,
|
|
49
|
+
): Promise<Record<string, string>> {
|
|
50
|
+
return tree_of(
|
|
51
|
+
root ?? (await git_command.repository_root()),
|
|
52
|
+
paths ?? (await changed_paths.read_changed_paths(false)),
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const review_tree = { ABSENT_DIGEST, digest_of, read_changed_tree, tree_of }
|
|
57
|
+
|
|
58
|
+
export { review_tree }
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
|
|
2
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
3
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
4
|
+
|
|
5
|
+
// The two trigger helpers the enumeration in `delivered-rules.ts` is built from, held here so a rule
|
|
6
|
+
// that lives in its own module can build its own row without importing the enumeration back
|
|
7
|
+
// (joshuafolkken/kit#2119). `is_issue_filing` is the one three rows now share — the WIP cap, the scout
|
|
8
|
+
// gate and the per-run filing cap — so it could not stay a private function of the file that spreads
|
|
9
|
+
// their rows.
|
|
10
|
+
|
|
11
|
+
// **Only `Bash`, and the omission is deliberate** (joshuafolkken/kit#1390): Claude Code denies one
|
|
12
|
+
// call of a turn and runs the rest, so a refused `Edit` would leave its siblings applied and itself
|
|
13
|
+
// not. Every rule delivered by the enumeration is therefore one whose binding moment is a shell call —
|
|
14
|
+
// so the tool-name guard belongs here rather than to each row, and a row states only what it looks for
|
|
15
|
+
// in the command.
|
|
16
|
+
function on_bash_command(is_match: (command: string) => boolean): (call: GuardedCall) => boolean {
|
|
17
|
+
return function is_trigger(call: GuardedCall): boolean {
|
|
18
|
+
if (call.name !== cost_blocks.BASH_TOOL) return false
|
|
19
|
+
|
|
20
|
+
return is_match(time_shell.bash_command(call.input))
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// `gh issue create`, in any of the spellings a run reaches for.
|
|
25
|
+
const ISSUE_CREATE_COMMAND = /\bgh\s+(?:\S+\s+)*?issue\s+create\b/u
|
|
26
|
+
// `gh api …/issues` — the path segment has to *end* there, so a comment endpoint
|
|
27
|
+
// (`…/issues/1524/comments`) and a listing under it are both left alone.
|
|
28
|
+
const ISSUES_ENDPOINT = /repos\/[^\s'"]*\/issues(?=$|["'\s])/u
|
|
29
|
+
// A title field is what separates the POST that files from the GET that lists: `gh api …/issues`
|
|
30
|
+
// with no field is a listing, and a listing files nothing. **All four spellings**, `-F` included —
|
|
31
|
+
// it is `--field`'s short form and reads as a different flag to a pattern that only knows `-f`.
|
|
32
|
+
// A body passed with `--input <file>` carries the title inside the file and is not visible here;
|
|
33
|
+
// that limit is recorded beside the non-`gh` one in `prompts/collaboration-workflow/rule-delivery.md`.
|
|
34
|
+
const TITLE_FIELD = /(?:-f|-F|--field|--raw-field)\s*'?title=/u
|
|
35
|
+
|
|
36
|
+
function is_issue_filing(command: string): boolean {
|
|
37
|
+
if (ISSUE_CREATE_COMMAND.test(command)) return true
|
|
38
|
+
|
|
39
|
+
return ISSUES_ENDPOINT.test(command) && TITLE_FIELD.test(command)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const bash_triggers = { is_issue_filing, on_bash_command }
|
|
43
|
+
|
|
44
|
+
export { bash_triggers }
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
// The enumeration of decision oracles — commands that answer a rule question from mechanically
|
|
2
|
+
// readable inputs, making prose reasoning unnecessary (joshuafolkken/kit#2117).
|
|
3
|
+
//
|
|
4
|
+
// **Question 0 of the rule-placement criterion**: "Can the rule's answer be computed from
|
|
5
|
+
// mechanically readable inputs alone?" A yes means the rule is answered by a command on this list,
|
|
6
|
+
// not by prose. Single source: `prompts/collaboration-workflow/residency.md` → question 0.
|
|
7
|
+
//
|
|
8
|
+
// Anything not on this list is answered by prose or by a hook-delivered rule, never by a command.
|
|
9
|
+
|
|
10
|
+
// Paths that appear in more than one entry's `single_source` field.
|
|
11
|
+
const CHAIN_RULE_MD = '.claude/skills/workflow-commands/chain-rule.md'
|
|
12
|
+
const BACKLOGRUN_PROGRESS_MD = '.claude/skills/workflow-commands/backlogrun-progress.md'
|
|
13
|
+
const SKILL_2E = '.claude/skills/workflow-commands/SKILL.md → §2e'
|
|
14
|
+
const SPLIT_ASSESSMENT_QUESTION =
|
|
15
|
+
'.claude/skills/workflow-commands/split-assessment.md → The question'
|
|
16
|
+
const PRE_GATE_CUT_MD = '.claude/skills/workflow-commands/pre-gate-cut.md'
|
|
17
|
+
const BACKLOGRUN_MD = '.claude/skills/workflow-commands/backlogrun.md'
|
|
18
|
+
|
|
19
|
+
// The command reference in `docs/josh-commands.md` — one section per command, headed by the command
|
|
20
|
+
// itself. joshuafolkken/kit#2190 cut `backlogrun.md` back to a manifest of pointers, so a decision it
|
|
21
|
+
// used to carry inline (`run:merge`, `epic:next`, `backlog:budget`, `run:liveness`, `auto-ok:next`)
|
|
22
|
+
// now has its verdict contract only in this reference. That makes it the single source and the section
|
|
23
|
+
// a reader is routed to, in the same `file.md → \`josh <command>\`` form the `epic:reconcile` and
|
|
24
|
+
// `lane:list` entries already use. joshuafolkken/kit#2254.
|
|
25
|
+
const RUN_MERGE_REFERENCE = 'docs/josh-commands.md → `josh run:merge`'
|
|
26
|
+
const EPIC_NEXT_REFERENCE = 'docs/josh-commands.md → `josh epic:next`'
|
|
27
|
+
const BACKLOG_BUDGET_REFERENCE = 'docs/josh-commands.md → `josh backlog:budget`'
|
|
28
|
+
const RUN_LIVENESS_REFERENCE = 'docs/josh-commands.md → `josh run:liveness`'
|
|
29
|
+
const AUTO_OK_NEXT_REFERENCE = 'docs/josh-commands.md → `josh auto-ok:next`'
|
|
30
|
+
|
|
31
|
+
// Command used by two separate oracle entries (run:cut:resume and run:cut:gate).
|
|
32
|
+
const RUN_CUT_CMD = 'run:cut'
|
|
33
|
+
|
|
34
|
+
// Vocabulary tokens that appear in more than one oracle's vocabulary array.
|
|
35
|
+
const REQUIRED = 'required'
|
|
36
|
+
const SKIP = 'skip'
|
|
37
|
+
const STOP = 'stop'
|
|
38
|
+
const WAIT = 'wait'
|
|
39
|
+
const RETRY = 'retry'
|
|
40
|
+
const OVER = 'over'
|
|
41
|
+
const UNKNOWN = 'unknown'
|
|
42
|
+
const NONE = 'none'
|
|
43
|
+
const NOT_A_LANE = 'not-a-lane'
|
|
44
|
+
const BUSY = 'busy'
|
|
45
|
+
const HUMAN_REVIEW = 'human-review'
|
|
46
|
+
// Lane liveness verdicts shared by the lane:list oracle and asserted against `lane_occupancy` in its
|
|
47
|
+
// test. `LIVE` is the silent norm; `STOPPED` and `UNKNOWN` lead the difference lines.
|
|
48
|
+
const LIVE = 'live'
|
|
49
|
+
const STOPPED = 'stopped'
|
|
50
|
+
// The verdicts `epic --reconcile` prints; kept in step with the `git_epic_reconcile` constants in its
|
|
51
|
+
// test.
|
|
52
|
+
const RECONCILED = 'reconciled'
|
|
53
|
+
const NOTHING_TO_RECONCILE = 'nothing to reconcile'
|
|
54
|
+
|
|
55
|
+
// Arguments shared by more than one oracle entry.
|
|
56
|
+
const ISSUE_N_ARG = '<N>'
|
|
57
|
+
const EXCLUDE_ARG = '[--exclude <n>...]'
|
|
58
|
+
|
|
59
|
+
interface DecisionOracle {
|
|
60
|
+
// Short identifier used by the CLI and tests.
|
|
61
|
+
name: string
|
|
62
|
+
// The rule question the command answers.
|
|
63
|
+
decision: string
|
|
64
|
+
// The command subcommand (without the `pnpm josh` prefix). Omit when equal to `name`;
|
|
65
|
+
// `get_command()` returns the effective value.
|
|
66
|
+
command?: string
|
|
67
|
+
// The arguments to pass, shown in the printed listing.
|
|
68
|
+
args: string
|
|
69
|
+
// The fixed-vocabulary tokens the command emits — on standard output for a pure decision command,
|
|
70
|
+
// or on the difference lines of a listing command (`lane:list`) whose standard output is reserved
|
|
71
|
+
// for its listing. An issue number is not a vocabulary token; only the named string verdicts appear
|
|
72
|
+
// here, and each is kept in step with the constant its emitting module exports.
|
|
73
|
+
vocabulary: ReadonlyArray<string>
|
|
74
|
+
// The single-source document for the decision procedure, in `file.md → section` form.
|
|
75
|
+
single_source: string
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const DECISION_ORACLES: ReadonlyArray<DecisionOracle> = [
|
|
79
|
+
{
|
|
80
|
+
name: 'delegate',
|
|
81
|
+
decision: 'Whether a run step may be delegated to a cheaper execution tier',
|
|
82
|
+
args: '<step>',
|
|
83
|
+
vocabulary: ['delegate', 'keep'],
|
|
84
|
+
single_source: '.claude/skills/workflow-commands/SKILL.md → §2b',
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: 'review:level',
|
|
88
|
+
decision: 'The code-review level for the changed paths',
|
|
89
|
+
command: 'review:brief',
|
|
90
|
+
args: '--level-only',
|
|
91
|
+
vocabulary: ['low', 'medium', 'high', 'max'],
|
|
92
|
+
single_source: 'prompts/review.md',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: 'review:round2',
|
|
96
|
+
decision: 'Whether the second /code-review round is due',
|
|
97
|
+
args: '[--round-1-closed]',
|
|
98
|
+
vocabulary: [REQUIRED, SKIP],
|
|
99
|
+
single_source: CHAIN_RULE_MD,
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: 'disposition',
|
|
103
|
+
decision: 'Whether a review finding reaches a runtime path, so it may be filed',
|
|
104
|
+
args: '<path...>',
|
|
105
|
+
vocabulary: ['runtime', 'non-runtime'],
|
|
106
|
+
single_source: 'prompts/review.md → Three-way disposition after the cap',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'review:attest',
|
|
110
|
+
decision: 'Whether a /code-review attested the briefed checkout',
|
|
111
|
+
args: '--check',
|
|
112
|
+
vocabulary: ['ok', 'missing', 'mismatch', 'not-required'],
|
|
113
|
+
single_source: CHAIN_RULE_MD,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'latest:scope',
|
|
117
|
+
decision: 'Whether this run has to update dependencies first',
|
|
118
|
+
args: '',
|
|
119
|
+
vocabulary: [REQUIRED, SKIP],
|
|
120
|
+
single_source: '.claude/skills/workflow-commands/latest-gate.md',
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: 'run:hold',
|
|
124
|
+
decision: 'Whether this working tree is free for a run to claim',
|
|
125
|
+
args: `[${ISSUE_N_ARG}]`,
|
|
126
|
+
vocabulary: ['hold', BUSY, UNKNOWN],
|
|
127
|
+
single_source: '.claude/skills/workflow-commands/SKILL.md → §2f',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
name: 'cost:cut',
|
|
131
|
+
command: 'cost',
|
|
132
|
+
decision: 'Whether the session cost exceeds the hand-off threshold',
|
|
133
|
+
args: '--cut',
|
|
134
|
+
vocabulary: [OVER, 'under'],
|
|
135
|
+
single_source: BACKLOGRUN_PROGRESS_MD,
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: 'release:scope',
|
|
139
|
+
decision: 'Whether a release is owed after this merge',
|
|
140
|
+
args: '',
|
|
141
|
+
vocabulary: [REQUIRED, SKIP, UNKNOWN],
|
|
142
|
+
single_source: '.claude/skills/workflow-commands/followup-reference.md',
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
name: 'epic:bundle',
|
|
146
|
+
decision: 'Which epic a newly filed issue belongs to',
|
|
147
|
+
args: ISSUE_N_ARG,
|
|
148
|
+
vocabulary: ['add_to_epic', 'create_epic', 'ask', 'nothing_to_bundle'],
|
|
149
|
+
single_source: SKILL_2E,
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
name: 'issue:scout',
|
|
153
|
+
decision: 'Whether a matching open issue already exists before filing',
|
|
154
|
+
args: '<title>',
|
|
155
|
+
vocabulary: ['Duplicates:', 'Epic:'],
|
|
156
|
+
single_source: SKILL_2E,
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
name: 'issue:fold',
|
|
160
|
+
decision: 'Whether findings filed from one session fold into one issue or stay separate',
|
|
161
|
+
args: '<title...>',
|
|
162
|
+
vocabulary: ['fold', 'separate', 'no-fold-needed'],
|
|
163
|
+
single_source: SPLIT_ASSESSMENT_QUESTION,
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: 'pkg:scout',
|
|
167
|
+
decision: 'Whether the top package candidate is clearly best (Tier A) or a near-tie (Tier B)',
|
|
168
|
+
args: '<keywords>',
|
|
169
|
+
vocabulary: ['clear', 'close'],
|
|
170
|
+
single_source: 'CLAUDE.md → Package-First Development',
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: 'issue:lint',
|
|
174
|
+
decision:
|
|
175
|
+
'Whether a behavior-change issue declares a deliverable firing point and a re-runnable baseline',
|
|
176
|
+
args: '<path>',
|
|
177
|
+
vocabulary: ['ok', '✖ missing heading', '✖ firing point', '✖ baseline'],
|
|
178
|
+
single_source: 'prompts/collaboration-workflow/issue-template.md',
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
name: 'cases',
|
|
182
|
+
decision:
|
|
183
|
+
'Each boundary a change crosses (network, process, fs, time) and the abnormal cases it owes',
|
|
184
|
+
args: '<path...>',
|
|
185
|
+
vocabulary: ['network', 'process', 'fs', 'time', NONE],
|
|
186
|
+
single_source: 'prompts/collaboration-workflow/report-format.md → 変更とテスト',
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
name: 'issue:state',
|
|
190
|
+
decision: "An issue's state, labels, and human-review flag",
|
|
191
|
+
args: ISSUE_N_ARG,
|
|
192
|
+
vocabulary: ['human_review: yes', 'human_review: no'],
|
|
193
|
+
single_source: '.claude/skills/workflow-commands/SKILL.md → §2z',
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
name: 'run:cut:resume',
|
|
197
|
+
command: RUN_CUT_CMD,
|
|
198
|
+
decision: 'Whether a lane child is resuming prior work or starting fresh',
|
|
199
|
+
args: `--resume ${ISSUE_N_ARG}`,
|
|
200
|
+
vocabulary: ['fresh', 'resume', NOT_A_LANE],
|
|
201
|
+
single_source: PRE_GATE_CUT_MD,
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
name: 'run:cut:gate',
|
|
205
|
+
command: RUN_CUT_CMD,
|
|
206
|
+
decision: 'Whether a lane child should take its pre-gate cut now',
|
|
207
|
+
args: ISSUE_N_ARG,
|
|
208
|
+
vocabulary: ['cut', NOT_A_LANE],
|
|
209
|
+
single_source: PRE_GATE_CUT_MD,
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
name: 'backlog:budget',
|
|
213
|
+
decision: 'Whether a backlogrun may start more work, keep watching, or finish',
|
|
214
|
+
args: '',
|
|
215
|
+
vocabulary: ['run', 'watch', STOP],
|
|
216
|
+
single_source: BACKLOG_BUDGET_REFERENCE,
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
name: 'run:liveness',
|
|
220
|
+
decision: 'Whether a delegated unit is still working or has stopped without reporting',
|
|
221
|
+
args: `${ISSUE_N_ARG} --output <path>`,
|
|
222
|
+
vocabulary: ['alive', 'stopped', 'settled', 'undetermined'],
|
|
223
|
+
single_source: RUN_LIVENESS_REFERENCE,
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
name: 'stash:pop',
|
|
227
|
+
decision: 'Whether a named stash entry exists and can be applied',
|
|
228
|
+
args: '<message>',
|
|
229
|
+
vocabulary: ['popped', 'conflicted', 'no-match', 'ambiguous'],
|
|
230
|
+
single_source: '.claude/skills/workflow-commands/SKILL.md → §2d',
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
name: 'backlog:next',
|
|
234
|
+
decision: 'Which issue the backlog offers next, or whether to wait or stop',
|
|
235
|
+
args: EXCLUDE_ARG,
|
|
236
|
+
vocabulary: [WAIT, STOP, RETRY, 'error', NONE],
|
|
237
|
+
single_source: BACKLOGRUN_MD,
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
name: 'auto-ok:next',
|
|
241
|
+
decision: 'The next opted-in issue outside any epic, or none',
|
|
242
|
+
args: EXCLUDE_ARG,
|
|
243
|
+
vocabulary: [NONE],
|
|
244
|
+
single_source: AUTO_OK_NEXT_REFERENCE,
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
name: 'epic:next',
|
|
248
|
+
decision: "The next runnable child of an epic, or the epic's status",
|
|
249
|
+
args: '<epic>',
|
|
250
|
+
vocabulary: [WAIT, STOP, 'complete'],
|
|
251
|
+
single_source: EPIC_NEXT_REFERENCE,
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
name: 'run:merge',
|
|
255
|
+
decision: 'The post-merge batch step: confirm child, advance, or report a stop condition',
|
|
256
|
+
args: ISSUE_N_ARG,
|
|
257
|
+
vocabulary: [OVER, HUMAN_REVIEW, STOP, RETRY, BUSY],
|
|
258
|
+
single_source: RUN_MERGE_REFERENCE,
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
name: 'run:step',
|
|
262
|
+
decision: 'The run’s next single action, computed from the event stream, carry and issue state',
|
|
263
|
+
args: ISSUE_N_ARG,
|
|
264
|
+
// The non-command answers: `run:step` prints a runnable command for a phase with one to run, and
|
|
265
|
+
// one of these verdicts otherwise. A command line is not a vocabulary token, exactly as an issue
|
|
266
|
+
// number is not one for `backlog:next`.
|
|
267
|
+
vocabulary: [
|
|
268
|
+
'implement',
|
|
269
|
+
HUMAN_REVIEW,
|
|
270
|
+
'update-deps',
|
|
271
|
+
'already-done',
|
|
272
|
+
'keep-work',
|
|
273
|
+
WAIT,
|
|
274
|
+
STOP,
|
|
275
|
+
UNKNOWN,
|
|
276
|
+
],
|
|
277
|
+
single_source: BACKLOGRUN_MD,
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
name: 'refactor:scan',
|
|
281
|
+
decision: 'Whether the refactoring scope still holds high- or medium-priority candidates',
|
|
282
|
+
args: '',
|
|
283
|
+
vocabulary: ['clear', 'candidates', 'error'],
|
|
284
|
+
single_source: 'prompts/refactoring.md',
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
name: 'split:assess',
|
|
288
|
+
decision: 'Whether a change size clears the split guide (the split assessment size question)',
|
|
289
|
+
args: '[--json]',
|
|
290
|
+
vocabulary: ['split', 'single'],
|
|
291
|
+
single_source: SPLIT_ASSESSMENT_QUESTION,
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
name: 'sonar:hotspots',
|
|
295
|
+
decision: 'The Step B disposition for each SonarCloud hotspot on a pull request',
|
|
296
|
+
args: '<PR>',
|
|
297
|
+
vocabulary: ['excluded', 'local', 'fix', 'defer', 'unreadable'],
|
|
298
|
+
single_source: 'prompts/sonar-hotspot-handling.md',
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
name: 'clone:scan',
|
|
302
|
+
decision: 'Whether cross-file or cross-repository code duplication exists',
|
|
303
|
+
args: '',
|
|
304
|
+
vocabulary: ['clean', 'clones:'],
|
|
305
|
+
single_source: 'prompts/collaboration-workflow/no-clones.md',
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
name: 'epic:reconcile',
|
|
309
|
+
command: 'epic',
|
|
310
|
+
decision:
|
|
311
|
+
"Whether an epic's declaration matches its recorded relations, and the repair when it does not",
|
|
312
|
+
args: '--reconcile <E>',
|
|
313
|
+
vocabulary: [RECONCILED, NOTHING_TO_RECONCILE],
|
|
314
|
+
single_source: 'docs/josh-commands.md → `josh epic --reconcile`',
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
name: 'lane:list',
|
|
318
|
+
decision:
|
|
319
|
+
'Whether each in-progress issue holds a live lane, and the two-directional difference',
|
|
320
|
+
args: '',
|
|
321
|
+
vocabulary: [LIVE, STOPPED, UNKNOWN],
|
|
322
|
+
single_source: 'docs/josh-commands.md → The `in-progress` / lane difference',
|
|
323
|
+
},
|
|
324
|
+
]
|
|
325
|
+
|
|
326
|
+
// Returns the command name for an oracle entry. When `command` is omitted from the entry,
|
|
327
|
+
// the `name` field doubles as the command name.
|
|
328
|
+
function get_command(oracle: DecisionOracle): string {
|
|
329
|
+
return oracle.command ?? oracle.name
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function find_oracle(name: string): DecisionOracle | undefined {
|
|
333
|
+
return DECISION_ORACLES.find((oracle) => oracle.name === name.trim())
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const decision_oracle = {
|
|
337
|
+
DECISION_ORACLES,
|
|
338
|
+
find_oracle,
|
|
339
|
+
get_command,
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
export { decision_oracle }
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs'
|
|
2
|
+
import { tmpdir } from 'node:os'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { delivered_rules } from './delivered-rules'
|
|
5
|
+
|
|
6
|
+
// The payload machinery two delivery suites share (joshuafolkken/kit#2119). `delivered-rules.test.ts`
|
|
7
|
+
// had it first; the filing rules — the scout gate and the per-run cap — need the same temp transcript,
|
|
8
|
+
// payload envelope and per-rule stamp cleanup, so a second copy in `delivered-rules-filing.test.ts`
|
|
9
|
+
// would be the clone `CLAUDE.md` prohibits. Each suite calls `create_harness()` once, so each gets its
|
|
10
|
+
// own work directory and its own tracked transcripts.
|
|
11
|
+
|
|
12
|
+
const PRE_TOOL_USE = 'PreToolUse'
|
|
13
|
+
const BASH_TOOL = 'Bash'
|
|
14
|
+
|
|
15
|
+
interface Harness {
|
|
16
|
+
// The temp directory this harness's transcripts live under.
|
|
17
|
+
work: string
|
|
18
|
+
// Every transcript file written, so a suite can clean the batching stamp keyed on each of them.
|
|
19
|
+
written: ReadonlySet<string>
|
|
20
|
+
transcript_for: (name: string, text?: string) => string
|
|
21
|
+
payload_for: (transcript: string, command: string, tool_name?: string) => string
|
|
22
|
+
payload_of: (name: string, command: string, tool_name?: string, history?: string) => string
|
|
23
|
+
// Removes every rule's once-per-run stamp for every written transcript, then the work directory.
|
|
24
|
+
cleanup: () => void
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function payload_for(transcript: string, command: string, tool_name = BASH_TOOL): string {
|
|
28
|
+
return JSON.stringify({
|
|
29
|
+
hook_event_name: PRE_TOOL_USE,
|
|
30
|
+
transcript_path: transcript,
|
|
31
|
+
tool_name,
|
|
32
|
+
tool_input: { command },
|
|
33
|
+
})
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function create_harness(prefix = 'rule-guard-'): Harness {
|
|
37
|
+
const work = mkdtempSync(path.join(tmpdir(), prefix))
|
|
38
|
+
const written = new Set<string>()
|
|
39
|
+
|
|
40
|
+
// The trigger reads the call, never the history, so an empty transcript is the honest fixture — it
|
|
41
|
+
// proves the decision came from the command rather than from anything behind it.
|
|
42
|
+
function transcript_for(name: string, text = ''): string {
|
|
43
|
+
const target = path.join(work, `${name}.jsonl`)
|
|
44
|
+
|
|
45
|
+
writeFileSync(target, text)
|
|
46
|
+
written.add(target)
|
|
47
|
+
|
|
48
|
+
return target
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// `history` is the transcript behind the call, empty for a case that reads only the command.
|
|
52
|
+
function payload_of(name: string, command: string, tool_name = BASH_TOOL, history = ''): string {
|
|
53
|
+
return payload_for(transcript_for(name, history), command, tool_name)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function cleanup(): void {
|
|
57
|
+
for (const transcript of written) {
|
|
58
|
+
for (const rule of delivered_rules.DELIVERED_RULES) {
|
|
59
|
+
rmSync(delivered_rules.delivery_path(rule.id, transcript), { force: true })
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
rmSync(work, { recursive: true, force: true })
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return { work, written, transcript_for, payload_for, payload_of, cleanup }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const delivered_rules_harness = { create_harness }
|
|
70
|
+
|
|
71
|
+
export type { Harness }
|
|
72
|
+
export { delivered_rules_harness }
|