@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,122 @@
|
|
|
1
|
+
import { NEEDS_DECISION_LABEL } from '#scripts/git/issue-labels'
|
|
2
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
3
|
+
import { shell_segments } from './shell-segments'
|
|
4
|
+
|
|
5
|
+
// A dispatched lane child records its park before it stops, delivered at the call it binds on
|
|
6
|
+
// (joshuafolkken/kit#2034).
|
|
7
|
+
//
|
|
8
|
+
// **A lane child that stopped for a decision left no question behind.** A `backlogrun` dispatches a
|
|
9
|
+
// child as a detached `fullrun #<N>` process, and its only route to ask a person anything is to park
|
|
10
|
+
// the Issue — `needs-decision` plus a comment carrying the question. Measured twice in one run on
|
|
11
|
+
// 2026-09-14: #2012's child had its `AskUserQuestion` refused (it is headless), wrote the question
|
|
12
|
+
// into its final message, sent a `confirmation` Telegram and exited; #2011 wrote a Tier B decision to
|
|
13
|
+
// its final message and exited the same way. Neither left a label or a comment, so the parent found an
|
|
14
|
+
// OPEN Issue with `in-progress` and no question, and a person looking at the Issue could not tell what
|
|
15
|
+
// to answer. The child is the one process that knows the question, the options and whether it stashed,
|
|
16
|
+
// and that knowledge died with its turn.
|
|
17
|
+
//
|
|
18
|
+
// **The stop is one shell call, so the rule is delivered rather than resident.** `CLAUDE.md` mandates
|
|
19
|
+
// a `confirmation` Telegram before any mid-workflow stop, so `pnpm josh notify --task-type
|
|
20
|
+
// confirmation` is the call every lane-child stop passes through. The agent that obeys this is always
|
|
21
|
+
// a `claude -p` child, so the rule leaves residency entirely (`prompts/collaboration-workflow/rule-delivery.md`).
|
|
22
|
+
//
|
|
23
|
+
// **Why once per run and not a synchronous compliance check.** The pre-gate cut can stay silent on a
|
|
24
|
+
// compliant run because the cut record is a local file it reads synchronously; the park is a label on
|
|
25
|
+
// GitHub, which a `PreToolUse` guard cannot read (it answers synchronously, network calls are out).
|
|
26
|
+
// Scanning the transcript tail for the label instead is unsafe in the one direction that matters: a
|
|
27
|
+
// child that merely *read* `backlogrun-park.md`, whose prose carries the very `labels[]=needs-decision`
|
|
28
|
+
// command, would look compliant and the guard would fall silent on a real violation — the whole bug,
|
|
29
|
+
// reappearing inside its own check. So the row carries no `already_satisfied`: it fires once per run on
|
|
30
|
+
// the stop, the reason is a checklist rather than an accusation, and a child that already parked simply
|
|
31
|
+
// reissues. One wasted round trip on the compliant path is the safe direction; a missed park is not.
|
|
32
|
+
|
|
33
|
+
// `josh notify`, in either spelling — the alias `nf` is expanded to `notify` before this sees it, the
|
|
34
|
+
// same way `pre-gate-cut.ts` matches `gate` through `ga`.
|
|
35
|
+
const NOTIFY_COMMANDS: ReadonlySet<string> = new Set(['notify'])
|
|
36
|
+
// The task type that marks a stop waiting on a person, taken quoted or bare so `--task-type
|
|
37
|
+
// confirmation` and `--task-type=confirmation` read alike. A `progress` or `pr` notification is not a
|
|
38
|
+
// stop and never matches.
|
|
39
|
+
const CONFIRMATION_TASK_TYPE = /(?:^|\s)--task-type[=\s]+["']?confirmation\b/u
|
|
40
|
+
|
|
41
|
+
// A segment that sends the mid-workflow-stop Telegram. Segment-wise and alias-expanded for the reason
|
|
42
|
+
// every predicate in this directory is: one shell line carries several commands, and a name quoted
|
|
43
|
+
// inside a body is not the command being invoked.
|
|
44
|
+
function is_confirmation_notify(command: string): boolean {
|
|
45
|
+
return shell_segments
|
|
46
|
+
.segments_of(command)
|
|
47
|
+
.some(
|
|
48
|
+
(segment) =>
|
|
49
|
+
shell_segments.is_josh_command(segment, NOTIFY_COMMANDS) &&
|
|
50
|
+
CONFIRMATION_TASK_TYPE.test(segment),
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// The josh notify invocation in either spelling, anywhere in a blob of text. The stop guard
|
|
55
|
+
// (joshuafolkken/kit#2121) asks whether a confirmation notify was issued *this turn* by scanning the
|
|
56
|
+
// transcript tail rather than one command, so the "is it a stop notification" judgement stays here —
|
|
57
|
+
// the same `CONFIRMATION_TASK_TYPE` regex, never a second copy of it.
|
|
58
|
+
const NOTIFY_INVOCATION = /josh\s+(?:notify|nf)\b/u
|
|
59
|
+
|
|
60
|
+
// **A blob, not a single command, so it cannot be segmented.** The tail is raw transcript text with a
|
|
61
|
+
// notify command embedded in a JSONL string, so the two halves are tested against the whole: a josh
|
|
62
|
+
// notify appears and a `--task-type confirmation` appears. That is looser than `is_confirmation_notify`
|
|
63
|
+
// on purpose — the guard's safe direction is to read a real stop notification as present, so a run
|
|
64
|
+
// that sent one is never told it did not.
|
|
65
|
+
function mentions_confirmation_notify(text: string): boolean {
|
|
66
|
+
return NOTIFY_INVOCATION.test(text) && CONFIRMATION_TASK_TYPE.test(text)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// **The command test comes first and the world is consulted second**, so the `is_child_of` read — the
|
|
70
|
+
// dispatch mark against this checkout's own issue — runs only on the handful of calls that are a
|
|
71
|
+
// confirmation stop, not on every `Bash` call in the run. `is_child_of` is the same mechanical
|
|
72
|
+
// human-or-child fact the pre-gate cut reads: a person working in a lane carries no mark and sees no
|
|
73
|
+
// refusal, and a mark that leaked in naming another issue is read as a person too.
|
|
74
|
+
function is_unparked_stop(
|
|
75
|
+
command: string,
|
|
76
|
+
is_lane_child: boolean = lane_child_marker.is_child_of(process.cwd()),
|
|
77
|
+
): boolean {
|
|
78
|
+
if (!is_confirmation_notify(command)) return false
|
|
79
|
+
|
|
80
|
+
return is_lane_child
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// **Keeping this rule is applying `needs-decision`**, the one act the park asks for before the stop.
|
|
84
|
+
// It reads an actual `Bash` command — a label application by REST or by `gh issue edit` — never the
|
|
85
|
+
// transcript tail, so a doc read that quotes the command is not mistaken for the run making it.
|
|
86
|
+
const APPLIES_NEEDS_DECISION = new RegExp(
|
|
87
|
+
String.raw`(?:labels\[\]=|--add-label[= ]'?)${NEEDS_DECISION_LABEL}\b`,
|
|
88
|
+
'u',
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
function records_the_park(command: string): boolean {
|
|
92
|
+
return APPLIES_NEEDS_DECISION.test(command)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// The instruction in the shape a refusal can carry: what the stop must leave behind, how to record it,
|
|
96
|
+
// and the reissue sentence every delivery needs. **The park procedure is named, not restated** — the
|
|
97
|
+
// single source is `backlogrun-park.md` → "park and continue", and a second copy here would be the
|
|
98
|
+
// clone `CLAUDE.md` prohibits.
|
|
99
|
+
const LANE_PARK_REASON =
|
|
100
|
+
'⛔ lane child park: this session is a dispatched lane child, and a stop that waits on a person must ' +
|
|
101
|
+
'leave the question on the Issue before it sends this Telegram — otherwise the parent finds an OPEN ' +
|
|
102
|
+
'Issue with `in-progress` and no question, and a person cannot tell what to answer ' +
|
|
103
|
+
'(joshuafolkken/kit#2034 measured this twice in one run). The child is the only process that knows ' +
|
|
104
|
+
'the question, the options and whether it stashed, so it records the park itself rather than leaving ' +
|
|
105
|
+
'the parent to guess from a log. Before you notify and stop: apply `needs-decision` and post a ' +
|
|
106
|
+
'comment carrying the question, the options, and whether work was stashed — ' +
|
|
107
|
+
"`gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=needs-decision'` then " +
|
|
108
|
+
'`pnpm josh issue:comment <N> --body-file <path>`. If this stop is a ' +
|
|
109
|
+
'`needs-human-review` or `already-done` one, that label is already on the Issue and there is nothing ' +
|
|
110
|
+
'to add. Then reissue this notify — it fires once per run and cannot repeat on the call in hand. The ' +
|
|
111
|
+
'procedure is `.claude/skills/workflow-commands/pre-gate-cut.md` → "A lane child records its park ' +
|
|
112
|
+
'before it stops", and the park itself is `backlogrun-park.md` → "park and continue".'
|
|
113
|
+
|
|
114
|
+
const lane_park = {
|
|
115
|
+
LANE_PARK_REASON,
|
|
116
|
+
is_confirmation_notify,
|
|
117
|
+
is_unparked_stop,
|
|
118
|
+
mentions_confirmation_notify,
|
|
119
|
+
records_the_park,
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export { lane_park }
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
2
|
+
import { lane_paths } from '#scripts/lane/lane-paths'
|
|
3
|
+
import { bash_triggers } from './bash-triggers'
|
|
4
|
+
import { git_argv } from './git-argv'
|
|
5
|
+
import { shell_segments } from './shell-segments'
|
|
6
|
+
|
|
7
|
+
// A dispatched lane child is stopped from running `git switch main` — the fifth of the "always fails or
|
|
8
|
+
// answers nothing" misfires joshuafolkken/kit#2297 catalogued (joshuafolkken/kit#2313). A lane is a
|
|
9
|
+
// linked work tree, `main` is checked out by the primary work tree, and git allows one branch in one
|
|
10
|
+
// work tree at a time — so the call is **structurally guaranteed to fail** with `fatal: 'main' is
|
|
11
|
+
// already used by worktree at '<the primary checkout>'`. It was measured 11 times in the 2026-09-21
|
|
12
|
+
// backlogrun, always in a lane child.
|
|
13
|
+
//
|
|
14
|
+
// **The source is the parent's step, not the child's.** The distributed procedures write
|
|
15
|
+
// `git switch main && git pull` as the step before reading the dependency scope, and that is *correct in
|
|
16
|
+
// the primary checkout* (`backlogrun-lanes.md` → "Once per repository, before the first lane opens"). A
|
|
17
|
+
// child that runs the same line verbatim fails every time, and the failure is not free: a refused call
|
|
18
|
+
// drops the independent calls batched beside it (joshuafolkken/kit#2177), so a batching child loses the
|
|
19
|
+
// most. `josh main:sync` (`main-sync.ts`) already refuses inside a linked work tree for the same reason;
|
|
20
|
+
// this is the *raw* form of the same call, refused before it fails rather than after.
|
|
21
|
+
//
|
|
22
|
+
// **It refuses rather than rewrites, because a `PreToolUse` guard can only `allow` / `deny` a command,
|
|
23
|
+
// never substitute a different one** (joshuafolkken/kit#2313 decision comment). So the refusal hands back
|
|
24
|
+
// the next command, exactly as #2297 required of `test:declared`: the lane is already on its own issue
|
|
25
|
+
// branch, branched from a fresh default before it opened, and the latest default is brought in during the
|
|
26
|
+
// gate by `pnpm josh main:merge` — so skip the step and keep implementing on the current branch.
|
|
27
|
+
//
|
|
28
|
+
// **The branch is judged against the lane's own, not the name `main`.** `already used by worktree` is a
|
|
29
|
+
// property of any branch the primary work tree holds, not of the literal `main`, and the default branch
|
|
30
|
+
// differs per repository — so hardcoding `main` would both miss a renamed default and need an async
|
|
31
|
+
// `get_default_branch`. A lane child belongs on its own `<issue>-lane` branch; a `git switch` to anything
|
|
32
|
+
// else is the misfire. Its own branch is read synchronously from the checkout path
|
|
33
|
+
// (`lane_paths.lane_issue_of`), the weaker-but-synchronous lane test a guard is bound to
|
|
34
|
+
// (joshuafolkken/kit#1864). `git switch` alone is covered — it never means a pathspec, so there is no
|
|
35
|
+
// ambiguity — and `git checkout -- <path>` stays `worktree-guard.ts`'s.
|
|
36
|
+
//
|
|
37
|
+
// **The command test comes first and the world is consulted second**, so the lane read runs only on the
|
|
38
|
+
// handful of calls that are a plain branch switch, not on every `Bash` call — the ordering
|
|
39
|
+
// `lane-carry-conflict.ts` and `worktree-guard.ts` share. A person working in a lane carries no dispatch
|
|
40
|
+
// mark and sees no refusal. It fires on every occurrence, not once per run: a child must never run this,
|
|
41
|
+
// so the route is always "continue implementing", never a reissue (`git-force.ts`).
|
|
42
|
+
|
|
43
|
+
const SWITCH_SUBCOMMAND = 'switch'
|
|
44
|
+
|
|
45
|
+
// The flags under which a `git switch` does not collide with a branch the primary work tree holds: a
|
|
46
|
+
// create (`-c` / `-C` / `--create` / `--force-create`) moves to a branch nothing else can hold, and a
|
|
47
|
+
// detach (`-d` / `--detach`) checks out a commit with no branch at all. A segment carrying any of them is
|
|
48
|
+
// not the misfire this rule refuses.
|
|
49
|
+
const NON_COLLIDING_FLAGS: ReadonlySet<string> = new Set([
|
|
50
|
+
'-c',
|
|
51
|
+
'-C',
|
|
52
|
+
'--create',
|
|
53
|
+
'--force-create',
|
|
54
|
+
'-d',
|
|
55
|
+
'--detach',
|
|
56
|
+
])
|
|
57
|
+
|
|
58
|
+
const FLAG_PREFIX = '-'
|
|
59
|
+
|
|
60
|
+
// The branch a `git switch <branch>` selects, or `undefined` when the segment is not a plain branch
|
|
61
|
+
// switch: not a `switch` at all, a create/detach, or with no positional target (a bare `git switch`, or
|
|
62
|
+
// `git switch -` for the previous branch — `-` starts with the flag prefix, so it is never read as a
|
|
63
|
+
// target).
|
|
64
|
+
function switch_target(segment: string): string | undefined {
|
|
65
|
+
const call = git_argv.parse(segment)
|
|
66
|
+
|
|
67
|
+
if (call?.subcommand !== SWITCH_SUBCOMMAND) return undefined
|
|
68
|
+
if (call.args.some((argument) => NON_COLLIDING_FLAGS.has(argument))) return undefined
|
|
69
|
+
|
|
70
|
+
return call.args.find((argument) => !argument.startsWith(FLAG_PREFIX))
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Every branch a shell line's `git switch` segments select. A line carries several commands, so each
|
|
74
|
+
// segment is judged on its own — a `git switch main && git pull && git switch <issue>-lane` yields both
|
|
75
|
+
// targets, and the switch back to the lane's own branch is the one that keeps this silent.
|
|
76
|
+
function switch_targets(command: string): ReadonlyArray<string> {
|
|
77
|
+
return shell_segments
|
|
78
|
+
.segments_of(command)
|
|
79
|
+
.map((segment) => switch_target(segment))
|
|
80
|
+
.filter((target): target is string => target !== undefined)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// The lane's own branch — `<issue>-lane` — read from the checkout path, or `undefined` when the checkout
|
|
84
|
+
// is not a lane. A lane child is always in a lane, so this resolves whenever the mark below does.
|
|
85
|
+
function own_lane_branch(directory: string): string | undefined {
|
|
86
|
+
const issue = lane_paths.lane_issue_of(directory)
|
|
87
|
+
|
|
88
|
+
return issue === undefined ? undefined : lane_paths.lane_branch(issue)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// True when this session is a dispatched lane child switching to a branch that is not its own. The
|
|
92
|
+
// command test is first, so the dispatch mark and the lane branch are read only on a real branch switch.
|
|
93
|
+
function is_switch_away_from_lane(
|
|
94
|
+
command: string,
|
|
95
|
+
is_lane_child: boolean = lane_child_marker.is_child_of(process.cwd()),
|
|
96
|
+
own_branch: string | undefined = own_lane_branch(process.cwd()),
|
|
97
|
+
): boolean {
|
|
98
|
+
if (!is_lane_child || own_branch === undefined) return false
|
|
99
|
+
|
|
100
|
+
return switch_targets(command).some((target) => target !== own_branch)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// The instruction in the shape a refusal can carry: what the command does, why it cannot succeed, and the
|
|
104
|
+
// next command to run instead. The procedure is named, not restated — its single sources are
|
|
105
|
+
// `backlogrun-lanes.md` and `backlogrun-child.md`, and a second copy here would be the clone `CLAUDE.md`
|
|
106
|
+
// prohibits. Apostrophes are avoided so the single-quoted literal needs no escaping, as the siblings do.
|
|
107
|
+
const LANE_SWITCH_MAIN_REASON =
|
|
108
|
+
'⛔ lane child on `git switch main`: this session is a dispatched lane child, and switching to the ' +
|
|
109
|
+
'default branch here always fails — a lane is a linked work tree, the primary checkout holds the ' +
|
|
110
|
+
'default branch, and git allows one branch in one work tree at a time (`fatal: main is already used ' +
|
|
111
|
+
'by worktree at <the primary checkout>`, measured 11 times in the 2026-09-21 backlogrun). Do not ' +
|
|
112
|
+
'switch: the lane is already on its own issue branch, branched from a fresh default before it opened, ' +
|
|
113
|
+
'and the latest default is brought in during the gate by `pnpm josh main:merge`. So skip this step ' +
|
|
114
|
+
'and keep implementing on the current branch — no `git switch`, no `git pull`. `pnpm josh main:sync` ' +
|
|
115
|
+
'(`josh ms`) is refused in a lane for the same reason, and a lane is finished with `pnpm josh ' +
|
|
116
|
+
'lane:close <issue-number>`. The parent runs `git switch main && git pull` in the primary checkout ' +
|
|
117
|
+
'before each lane opens, never the child — `backlogrun-lanes.md` and `backlogrun-child.md` are the ' +
|
|
118
|
+
'single sources. This rule fires on every occurrence, not once per run.'
|
|
119
|
+
|
|
120
|
+
// The row itself, so `delivered-rules.ts` spreads one entry. `is_trigger` reads the input through
|
|
121
|
+
// `on_bash_command` — the `Bash` tool-name gate every command row shares — and `decide` returns true so
|
|
122
|
+
// it refuses every occurrence. It declares no `keeps`: continuing is the absence of a call, not a call,
|
|
123
|
+
// so the row is reported unmeasured rather than scored on an act that does not exist (`git-force.ts`).
|
|
124
|
+
const ROW = {
|
|
125
|
+
id: 'lane-switch-main',
|
|
126
|
+
is_trigger: bash_triggers.on_bash_command(is_switch_away_from_lane),
|
|
127
|
+
reason: LANE_SWITCH_MAIN_REASON,
|
|
128
|
+
decide: (): boolean => true,
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const lane_switch_main = {
|
|
132
|
+
LANE_SWITCH_MAIN_REASON,
|
|
133
|
+
ROW,
|
|
134
|
+
is_switch_away_from_lane,
|
|
135
|
+
switch_target,
|
|
136
|
+
switch_targets,
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export { lane_switch_main }
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
2
|
+
import { bash_triggers } from './bash-triggers'
|
|
3
|
+
import { decision_oracle } from './decision-oracle'
|
|
4
|
+
import type { DeliveredRule } from './delivered-rules'
|
|
5
|
+
import { oracle_firing, type FiringPoint } from './oracle-firing'
|
|
6
|
+
import { shell_segments } from './shell-segments'
|
|
7
|
+
import { tail_commands } from './tail-commands'
|
|
8
|
+
|
|
9
|
+
// The one generic rule that turns a declared firing point into a delivered guard (joshuafolkken/kit#2324).
|
|
10
|
+
// `oracle-firing.ts` records, per oracle, the action that must consult it first; this generates a
|
|
11
|
+
// `DeliveredRule` for each such oracle — refused when the run performs the governed action without
|
|
12
|
+
// having run the oracle's command earlier, stood down once it has.
|
|
13
|
+
//
|
|
14
|
+
// **It is `issue-scout`'s shape, generalized.** Each generated row is once per run with an
|
|
15
|
+
// `already_satisfied` stand-down read off the tail — refuse the governed call, hand back the command,
|
|
16
|
+
// stand down once that command is on the tail. What `issue-scout` and `issue-fold` hand-wrote per
|
|
17
|
+
// oracle, this reads from the registry: the refusal is assembled from the oracle's decision, command,
|
|
18
|
+
// answer vocabulary and single source, so no oracle carries a hand-written refusal of its own. **No new
|
|
19
|
+
// delivery path** — the rows join `DELIVERED_RULES` and fire through the same `create_transcript_guard`
|
|
20
|
+
// shell every other row uses.
|
|
21
|
+
|
|
22
|
+
// One oracle entry, aliased so the generated rows' signatures stay under the line limit.
|
|
23
|
+
type Oracle = (typeof decision_oracle.DECISION_ORACLES)[number]
|
|
24
|
+
|
|
25
|
+
// The oracle's own command, the one act each generated rule asks for. Matched in either spelling by
|
|
26
|
+
// `is_josh_command`, which expands the alias before comparing.
|
|
27
|
+
function command_names(oracle: Oracle): ReadonlySet<string> {
|
|
28
|
+
return new Set([decision_oracle.get_command(oracle)])
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Keeping the rule: a call that runs the oracle. Segment-wise, so a spelling quoted inside the governed
|
|
32
|
+
// call's own arguments is not read as the consultation it skipped.
|
|
33
|
+
function runs_the_oracle(command: string, names: ReadonlySet<string>): boolean {
|
|
34
|
+
return shell_segments
|
|
35
|
+
.segments_of(command)
|
|
36
|
+
.some((segment) => shell_segments.is_josh_command(segment, names))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// The full `pnpm josh <command> <args>` string the refusal hands back, from the registry alone.
|
|
40
|
+
function command_line(oracle: Oracle): string {
|
|
41
|
+
const command = decision_oracle.get_command(oracle)
|
|
42
|
+
|
|
43
|
+
return oracle.args ? `pnpm josh ${command} ${oracle.args}` : `pnpm josh ${command}`
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// The refusal, assembled from the registry so no oracle carries a hand-written one: what the call is
|
|
47
|
+
// doing, the decision it skipped, the command that answers it and the tokens that command emits, and
|
|
48
|
+
// the single source of the procedure.
|
|
49
|
+
function reason_for(oracle: Oracle, firing_point: FiringPoint): string {
|
|
50
|
+
return (
|
|
51
|
+
`⛔ decision oracle not consulted: this is ${firing_point.describes}, but the run has not run ` +
|
|
52
|
+
`\`${command_line(oracle)}\` first — the oracle that decides ${oracle.decision.toLowerCase()}. ` +
|
|
53
|
+
`It answers ${oracle.vocabulary.join(' | ')}; single source ${oracle.single_source}. Reissue ` +
|
|
54
|
+
`after running it and reading its verdict. It fires once per run and cannot repeat on the call ` +
|
|
55
|
+
`in hand.`
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function row_for(oracle: Oracle, firing_point: FiringPoint): DeliveredRule {
|
|
60
|
+
const names = command_names(oracle)
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
id: `oracle-consulted:${oracle.name}`,
|
|
64
|
+
is_trigger: bash_triggers.on_bash_command(firing_point.governs),
|
|
65
|
+
reason: reason_for(oracle, firing_point),
|
|
66
|
+
already_satisfied: (tail: string, _call: GuardedCall): boolean =>
|
|
67
|
+
tail_commands.prior_bash_commands(tail).some((command) => runs_the_oracle(command, names)),
|
|
68
|
+
keeps: bash_triggers.on_bash_command((command: string) => runs_the_oracle(command, names)),
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// One row per oracle that declared a firing point, in registry order. Spread into `DELIVERED_RULES`
|
|
73
|
+
// after the filing rows, so a firing point that overlaps a filing (`issue:lint`) delivers on the
|
|
74
|
+
// reissue rather than ahead of `wip-cap` / `issue-scout`.
|
|
75
|
+
const ROWS: ReadonlyArray<DeliveredRule> = oracle_firing
|
|
76
|
+
.firing_oracles()
|
|
77
|
+
.map(({ oracle, firing_point }) => row_for(oracle, firing_point))
|
|
78
|
+
|
|
79
|
+
const oracle_consulted = { ROWS, command_line, reason_for, row_for, runs_the_oracle }
|
|
80
|
+
|
|
81
|
+
export { oracle_consulted }
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { bash_triggers } from './bash-triggers'
|
|
2
|
+
import { decision_oracle } from './decision-oracle'
|
|
3
|
+
import { shell_segments } from './shell-segments'
|
|
4
|
+
|
|
5
|
+
// The firing-point declaration every decision oracle owes (joshuafolkken/kit#2324). An oracle records a
|
|
6
|
+
// *decision*, but nothing on the oracle entry says which action must consult it first — so the 32
|
|
7
|
+
// oracles have a command each and a firing point almost never. This module is the missing half: for
|
|
8
|
+
// every oracle name, either the governed action (a `FiringPoint`, matched as a Bash command) or the
|
|
9
|
+
// reason none can be named. A run adding an oracle must answer one or the other, and the totality is
|
|
10
|
+
// enforced by `oracle-firing.test.ts` rather than by judgement.
|
|
11
|
+
//
|
|
12
|
+
// **It lives beside `decision-oracle.ts`, not inside it**, because that file sits 15 code lines under
|
|
13
|
+
// the 300 ceiling and 32 declarations would breach it. The registry stays a printable enumeration; the
|
|
14
|
+
// firing points key off its names, and the test asserts the keys cover every oracle exactly once. The
|
|
15
|
+
// predicate lives on the declaration so a line fully names its own trigger — the generic guard
|
|
16
|
+
// (`oracle-consulted.ts`) reads it rather than carrying a second table keyed by name.
|
|
17
|
+
|
|
18
|
+
// The governed action an oracle must precede: a human description printed by `oracle:list`, and a Bash
|
|
19
|
+
// predicate the generic guard fires on.
|
|
20
|
+
interface FiringPoint {
|
|
21
|
+
describes: string
|
|
22
|
+
governs: (command: string) => boolean
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// **A package-add, not a bare install.** `pnpm add <pkg>` / `yarn add` / `bun add` add a dependency, as
|
|
26
|
+
// does `npm install <pkg>` with a package argument; a bare `pnpm install` reinstalls the lockfile and
|
|
27
|
+
// adds nothing, so it is left alone. Segment-wise, so a spelling quoted inside another command's body is
|
|
28
|
+
// not read as the add it is not.
|
|
29
|
+
const PACKAGE_ADD = /^(?:pnpm|yarn|bun)\s+add\s+\S|^npm\s+(?:install|i)\s+[^-\s]/u
|
|
30
|
+
|
|
31
|
+
function is_package_add(command: string): boolean {
|
|
32
|
+
return shell_segments.segments_of(command).some((segment) => PACKAGE_ADD.test(segment))
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// The two firing points wired — the oracles whose governed call can be named without guessing: the
|
|
36
|
+
// package add and the Issue filing. The rest declare why none can be named, so the unenforced oracles
|
|
37
|
+
// are visible rather than silently missing.
|
|
38
|
+
const FIRING: ReadonlyMap<string, FiringPoint> = new Map([
|
|
39
|
+
[
|
|
40
|
+
'pkg:scout',
|
|
41
|
+
{
|
|
42
|
+
describes: 'a package-add command (`pnpm add …`, `npm install <pkg>`)',
|
|
43
|
+
governs: is_package_add,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
[
|
|
47
|
+
'issue:lint',
|
|
48
|
+
{
|
|
49
|
+
describes: 'an Issue-filing call (`gh api …/issues`, `gh issue create`)',
|
|
50
|
+
governs: bash_triggers.is_issue_filing,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
])
|
|
54
|
+
|
|
55
|
+
// The reason an oracle names no firing point, in three recurring shapes plus the one-off reasons for
|
|
56
|
+
// oracles already gated or sequenced elsewhere. `PHASE` — the governed act is a run phase, not one
|
|
57
|
+
// shell call. `READ` — it answers a status question and governs no action of its own. `SELF` — the
|
|
58
|
+
// command is itself the act, with nothing earlier to gate. A guard for any of these would fire on the
|
|
59
|
+
// wrong turn or double-gate a call another rule already claims; `release:scope` (joshuafolkken/kit#2334)
|
|
60
|
+
// is the one that *trails* rather than gates — it reads state that only exists after the merge.
|
|
61
|
+
const PHASE =
|
|
62
|
+
'the act it governs is a phase of a run, not a single shell call a trigger can anchor on'
|
|
63
|
+
const READ = 'it answers a status question and governs no action of its own to gate before'
|
|
64
|
+
const SELF = 'the command is itself the governed act; there is no earlier call to gate before it'
|
|
65
|
+
|
|
66
|
+
const LATEST_SCOPE_REASON =
|
|
67
|
+
'the run it governs (`pnpm josh latest`) is already gated at its point of use by the latest-gate; ' +
|
|
68
|
+
'a firing here would double-gate it'
|
|
69
|
+
const EPIC_BUNDLE_REASON =
|
|
70
|
+
'it runs after a filing to place it, and that filing is already gated by `issue-scout`; it has no ' +
|
|
71
|
+
'earlier call of its own'
|
|
72
|
+
const RELEASE_SCOPE_REASON =
|
|
73
|
+
'it reads the release owed *after* `pnpm josh followup` has merged (`git_followup_pending`), so it ' +
|
|
74
|
+
'trails the merge rather than gating it; a firing on `followup` would gate a check that must run ' +
|
|
75
|
+
'once the merge is done, reading a pre-merge state that has not yet arrived'
|
|
76
|
+
|
|
77
|
+
const NOT_NAMED: ReadonlyMap<string, string> = new Map([
|
|
78
|
+
['release:scope', RELEASE_SCOPE_REASON],
|
|
79
|
+
['delegate', PHASE],
|
|
80
|
+
['review:level', READ],
|
|
81
|
+
['review:round2', READ],
|
|
82
|
+
['disposition', READ],
|
|
83
|
+
['review:attest', READ],
|
|
84
|
+
['latest:scope', LATEST_SCOPE_REASON],
|
|
85
|
+
['run:hold', SELF],
|
|
86
|
+
['cost:cut', READ],
|
|
87
|
+
['epic:bundle', EPIC_BUNDLE_REASON],
|
|
88
|
+
['issue:scout', 'the filing it governs is already gated by the `issue-scout` delivered rule'],
|
|
89
|
+
[
|
|
90
|
+
'issue:fold',
|
|
91
|
+
'the second filing it governs is already gated by the `issue-fold` delivered rule',
|
|
92
|
+
],
|
|
93
|
+
['cases', READ],
|
|
94
|
+
['issue:state', READ],
|
|
95
|
+
['run:cut:resume', SELF],
|
|
96
|
+
['run:cut:gate', SELF],
|
|
97
|
+
['backlog:budget', READ],
|
|
98
|
+
['run:liveness', READ],
|
|
99
|
+
['stash:pop', SELF],
|
|
100
|
+
['backlog:next', READ],
|
|
101
|
+
['auto-ok:next', READ],
|
|
102
|
+
['epic:next', READ],
|
|
103
|
+
['run:merge', PHASE],
|
|
104
|
+
['run:step', SELF],
|
|
105
|
+
['refactor:scan', PHASE],
|
|
106
|
+
['split:assess', PHASE],
|
|
107
|
+
['sonar:hotspots', READ],
|
|
108
|
+
['clone:scan', PHASE],
|
|
109
|
+
['epic:reconcile', SELF],
|
|
110
|
+
['lane:list', READ],
|
|
111
|
+
])
|
|
112
|
+
|
|
113
|
+
// The declaration for one oracle: a firing point, a reason none is named, or neither — the last is the
|
|
114
|
+
// undeclared state the test refuses.
|
|
115
|
+
interface FiringDeclaration {
|
|
116
|
+
firing_point?: FiringPoint
|
|
117
|
+
not_firing_reason?: string
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function declaration_for(name: string): FiringDeclaration {
|
|
121
|
+
const firing_point = FIRING.get(name)
|
|
122
|
+
|
|
123
|
+
if (firing_point !== undefined) return { firing_point }
|
|
124
|
+
|
|
125
|
+
const not_firing_reason = NOT_NAMED.get(name)
|
|
126
|
+
|
|
127
|
+
return not_firing_reason === undefined ? {} : { not_firing_reason }
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Every oracle that declares a firing point, paired with it — the generic guard's input.
|
|
131
|
+
function firing_oracles(): ReadonlyArray<{
|
|
132
|
+
oracle: (typeof decision_oracle.DECISION_ORACLES)[number]
|
|
133
|
+
firing_point: FiringPoint
|
|
134
|
+
}> {
|
|
135
|
+
return decision_oracle.DECISION_ORACLES.flatMap((oracle) => {
|
|
136
|
+
const firing_point = FIRING.get(oracle.name)
|
|
137
|
+
|
|
138
|
+
return firing_point === undefined ? [] : [{ oracle, firing_point }]
|
|
139
|
+
})
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const oracle_firing = {
|
|
143
|
+
FIRING,
|
|
144
|
+
NOT_NAMED,
|
|
145
|
+
declaration_for,
|
|
146
|
+
firing_oracles,
|
|
147
|
+
is_package_add,
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export type { FiringDeclaration, FiringPoint }
|
|
151
|
+
export { oracle_firing }
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { decision_oracle } from './decision-oracle'
|
|
4
|
+
import { oracle_firing } from './oracle-firing'
|
|
5
|
+
|
|
6
|
+
// `josh oracle:list` — print the decision oracles enumeration (joshuafolkken/kit#2117).
|
|
7
|
+
//
|
|
8
|
+
// A command rather than a paragraph: the criterion is `prompts/collaboration-workflow/residency.md`
|
|
9
|
+
// → question 0, and the list is what it points at. Adding an oracle here is the whole action;
|
|
10
|
+
// nothing else is updated.
|
|
11
|
+
|
|
12
|
+
const ARGV_OFFSET = 2
|
|
13
|
+
const INDENT = ' '
|
|
14
|
+
const FIELD_WIDTH = 10
|
|
15
|
+
|
|
16
|
+
function pad_field(label: string): string {
|
|
17
|
+
return label.padEnd(FIELD_WIDTH)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// The firing point an oracle governs, or the reason none is named — one line either way, so `oracle:list`
|
|
21
|
+
// shows at a glance which oracles a guard enforces and which stay visibly unenforced (joshuafolkken/kit#2324).
|
|
22
|
+
function firing_line(oracle: (typeof decision_oracle.DECISION_ORACLES)[0]): string {
|
|
23
|
+
const declaration = oracle_firing.declaration_for(oracle.name)
|
|
24
|
+
|
|
25
|
+
if (declaration.firing_point !== undefined) {
|
|
26
|
+
return `${INDENT}${INDENT}${pad_field('fires on')}${declaration.firing_point.describes}`
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return `${INDENT}${INDENT}${pad_field('no firing')}${declaration.not_firing_reason ?? ''}`
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function format_oracle(oracle: (typeof decision_oracle.DECISION_ORACLES)[0]): string {
|
|
33
|
+
const command = decision_oracle.get_command(oracle)
|
|
34
|
+
const command_with_args = oracle.args
|
|
35
|
+
? `pnpm josh ${command} ${oracle.args}`
|
|
36
|
+
: `pnpm josh ${command}`
|
|
37
|
+
|
|
38
|
+
return [
|
|
39
|
+
`${INDENT}${oracle.name}`,
|
|
40
|
+
`${INDENT}${INDENT}${pad_field('decision')}${oracle.decision}`,
|
|
41
|
+
`${INDENT}${INDENT}${pad_field('command')}${command_with_args}`,
|
|
42
|
+
`${INDENT}${INDENT}${pad_field('answers')}${oracle.vocabulary.join(' | ')}`,
|
|
43
|
+
firing_line(oracle),
|
|
44
|
+
`${INDENT}${INDENT}${pad_field('source')}${oracle.single_source}`,
|
|
45
|
+
].join('\n')
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function print_list(): void {
|
|
49
|
+
console.info('decision oracles:')
|
|
50
|
+
|
|
51
|
+
for (const oracle of decision_oracle.DECISION_ORACLES) {
|
|
52
|
+
console.info(format_oracle(oracle))
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function run(argv: ReadonlyArray<string>): number {
|
|
57
|
+
if (argv.length > 0) {
|
|
58
|
+
console.error('Usage: josh oracle:list')
|
|
59
|
+
|
|
60
|
+
return 1
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
print_list()
|
|
64
|
+
|
|
65
|
+
return 0
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function main(argv: ReadonlyArray<string>): void {
|
|
69
|
+
process.exitCode = run(argv)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const oracle_list_cli = {
|
|
73
|
+
format_oracle,
|
|
74
|
+
main,
|
|
75
|
+
print_list,
|
|
76
|
+
run,
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
80
|
+
|
|
81
|
+
export { oracle_list_cli }
|