@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,210 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { setTimeout as sleep } from 'node:timers/promises'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { josh_environment_file } from '#scripts/josh/josh-environment-file'
|
|
5
|
+
import { session_language } from '#scripts/josh/session-language'
|
|
6
|
+
import { run_event_follow, type FollowPorts } from './run-event-follow'
|
|
7
|
+
import { run_event_render } from './run-event-render'
|
|
8
|
+
import { run_event_stream, type StreamRead } from './run-event-stream'
|
|
9
|
+
import { run_event_stream_emit } from './run-event-stream-emit'
|
|
10
|
+
import { run_event_watch } from './run-event-watch'
|
|
11
|
+
|
|
12
|
+
// `josh run:event` — the command a run's step calls to append to, or read back, the append-only event
|
|
13
|
+
// stream (joshuafolkken/kit#2205). The in-process seams (`run:merge`) append directly; the steps with no
|
|
14
|
+
// josh command at the point the event happens — a plan posted, a child launched, a PR opened, a stop —
|
|
15
|
+
// call `--append` here, so parent and lane child alike write to the one stream. `--from` is the woken
|
|
16
|
+
// reader's "everything since the position I last read"; `--last` is the degenerate single-event read.
|
|
17
|
+
//
|
|
18
|
+
// **`--follow` is one bounded read that waits** (joshuafolkken/kit#2207). It is `--from` that returns
|
|
19
|
+
// the moment an event is past the given position, and otherwise at the interval. The lines go to
|
|
20
|
+
// standard output and the position to read from next goes to standard error — the same before and after
|
|
21
|
+
// a session cut, because the stream is the run's and the position is the caller's.
|
|
22
|
+
//
|
|
23
|
+
// **`--watch` is the ambient surface: the same pass in a loop that never exits** (joshuafolkken/kit#2492),
|
|
24
|
+
// each event rendered in the session language (`run-event-render.ts`), for a person to keep open in a
|
|
25
|
+
// pane of their own. No conversation relays the stream any more — a session woken per event re-read its
|
|
26
|
+
// whole history each time, and outspent every lane of the run doing it.
|
|
27
|
+
|
|
28
|
+
const ARGV_OFFSET = 2
|
|
29
|
+
const SUCCESS_EXIT_CODE = 0
|
|
30
|
+
const FAILURE_EXIT_CODE = 1
|
|
31
|
+
const APPEND_FLAG = '--append'
|
|
32
|
+
const FROM_FLAG = '--from'
|
|
33
|
+
const FOLLOW_FLAG = '--follow'
|
|
34
|
+
const LAST_FLAG = '--last'
|
|
35
|
+
const WATCH_FLAG = '--watch'
|
|
36
|
+
const FLAG_INDEX = 0
|
|
37
|
+
const KIND_INDEX = 1
|
|
38
|
+
const POSITION_INDEX = 1
|
|
39
|
+
const TEXT_INDEX = 2
|
|
40
|
+
const USAGE =
|
|
41
|
+
'Usage: josh run:event --append <kind> <text> | --from <position> | --follow <position> | --watch [<position>] | --last'
|
|
42
|
+
|
|
43
|
+
function now_iso(): string {
|
|
44
|
+
return new Date().toISOString()
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function report_usage(): number {
|
|
48
|
+
process.stderr.write(`${USAGE}\n`)
|
|
49
|
+
|
|
50
|
+
return FAILURE_EXIT_CODE
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function run_append(kind: string, text: string): Promise<number> {
|
|
54
|
+
const target = await run_event_stream_emit.stream_target()
|
|
55
|
+
|
|
56
|
+
if (target === undefined) return report_usage()
|
|
57
|
+
|
|
58
|
+
const result = run_event_stream.append(target, kind, text, now_iso())
|
|
59
|
+
|
|
60
|
+
if (!result.appended) {
|
|
61
|
+
process.stderr.write(`not a session-facing event kind: ${kind}\n`)
|
|
62
|
+
|
|
63
|
+
return FAILURE_EXIT_CODE
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
process.stdout.write(`${String(result.position)}\n`)
|
|
67
|
+
|
|
68
|
+
return SUCCESS_EXIT_CODE
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function run_from(position_text: string | undefined): Promise<number> {
|
|
72
|
+
const target = await run_event_stream_emit.stream_target()
|
|
73
|
+
const position = Number(position_text)
|
|
74
|
+
|
|
75
|
+
if (target === undefined || position_text === undefined || !Number.isSafeInteger(position)) {
|
|
76
|
+
return report_usage()
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
process.stdout.write(`${JSON.stringify(run_event_stream.read_from(target, position))}\n`)
|
|
80
|
+
|
|
81
|
+
return SUCCESS_EXIT_CODE
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function follow_ports(target: string): FollowPorts {
|
|
85
|
+
return {
|
|
86
|
+
read: (position) => run_event_stream.read_from(target, position),
|
|
87
|
+
now: () => Date.now(),
|
|
88
|
+
sleep: async (milliseconds) => {
|
|
89
|
+
await sleep(milliseconds)
|
|
90
|
+
},
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// The events on standard output, and the next position on standard error for the caller to read back.
|
|
95
|
+
// An empty read is a quiet tick — nothing printed, the position unchanged.
|
|
96
|
+
function print_pass(read: StreamRead): void {
|
|
97
|
+
for (const event of read.events) {
|
|
98
|
+
process.stdout.write(`${run_event_stream.format_event(event)}\n`)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
process.stderr.write(`next_position: ${String(read.next_position)}\n`)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function follow_pass(target: string, position: number): Promise<StreamRead> {
|
|
105
|
+
return await run_event_follow.follow(follow_ports(target), position, {
|
|
106
|
+
interval_ms: run_event_follow.FOLLOW_INTERVAL_MS,
|
|
107
|
+
tick_ms: run_event_follow.FOLLOW_TICK_MS,
|
|
108
|
+
})
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async function run_follow(position_text: string | undefined): Promise<number> {
|
|
112
|
+
const target = await run_event_stream_emit.stream_target()
|
|
113
|
+
const position = Number(position_text)
|
|
114
|
+
|
|
115
|
+
if (target === undefined || position_text === undefined || !Number.isSafeInteger(position)) {
|
|
116
|
+
return report_usage()
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
print_pass(await follow_pass(target, position))
|
|
120
|
+
|
|
121
|
+
return SUCCESS_EXIT_CODE
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// With no position the pane starts at the stream's current end, so opening it shows what happens next
|
|
125
|
+
// rather than replaying the up-to-`EVENT_CAP` events already there.
|
|
126
|
+
function watch_start(target: string, position_text: string | undefined): number | undefined {
|
|
127
|
+
if (position_text === undefined) return run_event_stream.read_from(target, 0).next_position
|
|
128
|
+
|
|
129
|
+
const position = Number(position_text)
|
|
130
|
+
|
|
131
|
+
return Number.isSafeInteger(position) ? position : undefined
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async function run_watch(position_text: string | undefined): Promise<number> {
|
|
135
|
+
const target = await run_event_stream_emit.stream_target()
|
|
136
|
+
const position = target === undefined ? undefined : watch_start(target, position_text)
|
|
137
|
+
|
|
138
|
+
if (target === undefined || position === undefined) return report_usage()
|
|
139
|
+
|
|
140
|
+
const { lang } = session_language.resolve_session_lang()
|
|
141
|
+
|
|
142
|
+
await run_event_watch.watch(
|
|
143
|
+
{
|
|
144
|
+
pass: async (from) => await follow_pass(target, from),
|
|
145
|
+
write: (line) => process.stdout.write(`${line}\n`),
|
|
146
|
+
render: (event) => run_event_render.render(event, lang),
|
|
147
|
+
should_continue: () => true,
|
|
148
|
+
},
|
|
149
|
+
position,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
return SUCCESS_EXIT_CODE
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async function run_last(): Promise<number> {
|
|
156
|
+
const target = await run_event_stream_emit.stream_target()
|
|
157
|
+
|
|
158
|
+
if (target === undefined) return report_usage()
|
|
159
|
+
|
|
160
|
+
const last = run_event_stream.read_last(target)
|
|
161
|
+
|
|
162
|
+
process.stdout.write(`${last === undefined ? '' : JSON.stringify(last)}\n`)
|
|
163
|
+
|
|
164
|
+
return SUCCESS_EXIT_CODE
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function append_kind(argv: ReadonlyArray<string>): string {
|
|
168
|
+
return argv[KIND_INDEX] ?? ''
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function append_text(argv: ReadonlyArray<string>): string {
|
|
172
|
+
return argv.slice(TEXT_INDEX).join(' ')
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
type Mode = (argv: ReadonlyArray<string>) => Promise<number>
|
|
176
|
+
|
|
177
|
+
const MODES: ReadonlyMap<string, Mode> = new Map<string, Mode>([
|
|
178
|
+
[APPEND_FLAG, async (argv) => await run_append(append_kind(argv), append_text(argv))],
|
|
179
|
+
[FROM_FLAG, async (argv) => await run_from(argv[POSITION_INDEX])],
|
|
180
|
+
[FOLLOW_FLAG, async (argv) => await run_follow(argv[POSITION_INDEX])],
|
|
181
|
+
[WATCH_FLAG, async (argv) => await run_watch(argv[POSITION_INDEX])],
|
|
182
|
+
[LAST_FLAG, async () => await run_last()],
|
|
183
|
+
])
|
|
184
|
+
|
|
185
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
186
|
+
const mode = MODES.get(argv[FLAG_INDEX] ?? '')
|
|
187
|
+
|
|
188
|
+
return mode === undefined ? report_usage() : await mode(argv)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
192
|
+
process.exitCode = await run(argv)
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const run_event_cli = {
|
|
196
|
+
USAGE,
|
|
197
|
+
main,
|
|
198
|
+
run,
|
|
199
|
+
watch_start,
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// `.env` is read here rather than through the dispatcher's `tsx_arguments`, which would take this
|
|
203
|
+
// command off in-process dispatch: `--watch` renders in the `JOSH_SESSION_LANG` a person keeps there.
|
|
204
|
+
// Inside the guard, so a developer's own `.env` cannot decide what the unit tests see.
|
|
205
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
206
|
+
josh_environment_file.load_environment_file()
|
|
207
|
+
await main(process.argv.slice(ARGV_OFFSET))
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export { run_event_cli }
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { StreamRead } from './run-event-stream'
|
|
2
|
+
|
|
3
|
+
// The follow read behind `josh run:event --follow` and `--watch` (joshuafolkken/kit#2207). A reader
|
|
4
|
+
// asks the run's event stream for "everything since the position I last read" — and must see **both** a
|
|
5
|
+
// new event's arrival, promptly, and the interval passing when nothing new has happened, so a person
|
|
6
|
+
// watching sees progress land at once and still sees the run is alive when it is quiet.
|
|
7
|
+
//
|
|
8
|
+
// **This is one bounded pass, not the loop.** It returns as soon as any event is past the caller's
|
|
9
|
+
// position (the arrival), or when the interval elapses having found none (the quiet tick); the caller
|
|
10
|
+
// shows what came back and asks again from the returned position. The loop is `run-event-watch.ts`,
|
|
11
|
+
// run in a pane of its own rather than by a session restarting the pass (joshuafolkken/kit#2492).
|
|
12
|
+
//
|
|
13
|
+
// **It reads the run's stream, not a session's.** `read` is `run_event_stream.read_from` bound to the
|
|
14
|
+
// run-keyed target, and the position is the caller's own, so the pass answers the same before and after
|
|
15
|
+
// a `backlogrun` session cut: a cut changes who executes, never what the stream says or where a reader
|
|
16
|
+
// stands in it. That invariant is the point of the whole issue, and it is why this takes ports rather
|
|
17
|
+
// than resolving a target itself — the test drives it with a stream it controls and a clock it advances.
|
|
18
|
+
//
|
|
19
|
+
// **It is a poll, and deliberately not `run:progress`'s loop.** That one reads GitHub observations and
|
|
20
|
+
// exits on a silence interval; this one reads the appended stream and exits on a position advancing.
|
|
21
|
+
// The shapes rhyme, but the data source and the exit condition are different, so folding them together
|
|
22
|
+
// would couple two unrelated readers rather than remove a duplicate.
|
|
23
|
+
|
|
24
|
+
// The follow's quiet-tick cadence and how promptly it notices an arrival. The interval only bounds a
|
|
25
|
+
// wait that found nothing — an arrival returns within a tick of landing — so it can be as long as the
|
|
26
|
+
// heartbeat without making an arrival late, and the tick is a cheap `stat` of one file.
|
|
27
|
+
const MS_PER_SECOND = 1000
|
|
28
|
+
const SECONDS_PER_MINUTE = 60
|
|
29
|
+
const FOLLOW_INTERVAL_MINUTES = 20
|
|
30
|
+
const FOLLOW_INTERVAL_MS = FOLLOW_INTERVAL_MINUTES * SECONDS_PER_MINUTE * MS_PER_SECOND
|
|
31
|
+
const FOLLOW_TICK_MS = MS_PER_SECOND
|
|
32
|
+
|
|
33
|
+
interface FollowPorts {
|
|
34
|
+
read: (position: number) => StreamRead
|
|
35
|
+
now: () => number
|
|
36
|
+
sleep: (milliseconds: number) => Promise<void>
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface FollowOptions {
|
|
40
|
+
interval_ms: number
|
|
41
|
+
tick_ms: number
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Everything past `position`, returned the moment it exists or when the interval runs out. `deadline`
|
|
45
|
+
// is fixed once from the start, so the wait is the interval and not the interval per empty tick.
|
|
46
|
+
async function follow(
|
|
47
|
+
ports: FollowPorts,
|
|
48
|
+
position: number,
|
|
49
|
+
options: FollowOptions,
|
|
50
|
+
): Promise<StreamRead> {
|
|
51
|
+
const deadline = ports.now() + options.interval_ms
|
|
52
|
+
let read = ports.read(position)
|
|
53
|
+
|
|
54
|
+
while (read.events.length === 0 && ports.now() < deadline) {
|
|
55
|
+
await ports.sleep(options.tick_ms)
|
|
56
|
+
read = ports.read(position)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return read
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const run_event_follow = { FOLLOW_INTERVAL_MS, FOLLOW_TICK_MS, follow }
|
|
63
|
+
|
|
64
|
+
export type { FollowOptions, FollowPorts }
|
|
65
|
+
export { run_event_follow }
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { EventKind, RunEvent } from './run-event-stream'
|
|
2
|
+
|
|
3
|
+
// One run event as the line a person reads in the watch pane (joshuafolkken/kit#2492). The ambient tier
|
|
4
|
+
// used to be a session relaying `run:event --follow`, and every relay re-read that session's whole
|
|
5
|
+
// history; the pane is a script, so the wording a relaying session supplied is supplied here instead —
|
|
6
|
+
// one label per event kind, in the session language, beside the local clock time.
|
|
7
|
+
//
|
|
8
|
+
// **The kinds are a fixed enumeration** (`run-event-stream.ts` → `EVENT_KIND`), so a template table is
|
|
9
|
+
// the whole renderer; a kind the table does not name — a stream written by a newer kit — prints its raw
|
|
10
|
+
// kind rather than being dropped, so the pane never hides an event.
|
|
11
|
+
|
|
12
|
+
const JA = 'ja'
|
|
13
|
+
const FIELD_SEPARATOR = ' · '
|
|
14
|
+
const CLOCK_WIDTH = 2
|
|
15
|
+
const CLOCK_PAD = '0'
|
|
16
|
+
|
|
17
|
+
interface KindLabel {
|
|
18
|
+
ja: string
|
|
19
|
+
en: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Keyed by `EventKind`, so a kind added to the enumeration without a label fails the type check.
|
|
23
|
+
const KIND_LABELS: Readonly<Record<EventKind, KindLabel>> = {
|
|
24
|
+
plan: { ja: '計画', en: 'planned' },
|
|
25
|
+
'child-launch': { ja: '着手', en: 'launched' },
|
|
26
|
+
merge: { ja: 'マージ', en: 'merged' },
|
|
27
|
+
park: { ja: '保留', en: 'parked' },
|
|
28
|
+
split: { ja: '分割', en: 'split' },
|
|
29
|
+
outage: { ja: '障害', en: 'outage' },
|
|
30
|
+
cut: { ja: 'セッション交代', en: 'session cut' },
|
|
31
|
+
drain: { ja: 'バックログが空', en: 'backlog drained' },
|
|
32
|
+
stop: { ja: '停止', en: 'stopped' },
|
|
33
|
+
'pr-opened': { ja: 'PR 作成', en: 'PR opened' },
|
|
34
|
+
'review-round': { ja: 'レビュー', en: 'review round' },
|
|
35
|
+
retrospective: { ja: '振り返り', en: 'retrospective' },
|
|
36
|
+
stall: { ja: '滞留', en: 'stalled' },
|
|
37
|
+
stranded: { ja: '実行者なし', en: 'stranded' },
|
|
38
|
+
'ship-stage': { ja: '出荷の段階', en: 'ship stage' },
|
|
39
|
+
heartbeat: { ja: '生存確認', en: 'heartbeat' },
|
|
40
|
+
'ship-launch': { ja: '出荷を開始', en: 'ship launched' },
|
|
41
|
+
'ship-stop': { ja: '出荷が停止', en: 'ship stopped' },
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const LABELS_BY_KIND: ReadonlyMap<string, KindLabel> = new Map(Object.entries(KIND_LABELS))
|
|
45
|
+
|
|
46
|
+
function label_of(kind: string, lang: string): string {
|
|
47
|
+
const label = LABELS_BY_KIND.get(kind)
|
|
48
|
+
|
|
49
|
+
if (label === undefined) return kind
|
|
50
|
+
|
|
51
|
+
return lang === JA ? label.ja : label.en
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function two_digits(value: number): string {
|
|
55
|
+
return String(value).padStart(CLOCK_WIDTH, CLOCK_PAD)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// The local wall-clock `HH:MM` of the event, the reading a person watching a pane compares with the clock
|
|
59
|
+
// on their screen; an unparseable stamp is shown as written rather than as `NaN:NaN`.
|
|
60
|
+
function clock_of(at: string): string {
|
|
61
|
+
const date = new Date(at)
|
|
62
|
+
|
|
63
|
+
if (Number.isNaN(date.getTime())) return at
|
|
64
|
+
|
|
65
|
+
return `${two_digits(date.getHours())}:${two_digits(date.getMinutes())}`
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function render(event: RunEvent, lang: string): string {
|
|
69
|
+
return [clock_of(event.at), label_of(event.kind, lang), event.text].join(FIELD_SEPARATOR)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const run_event_render = { KIND_LABELS, clock_of, label_of, render }
|
|
73
|
+
|
|
74
|
+
export type { KindLabel }
|
|
75
|
+
export { run_event_render }
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { CarryRead } from './run-carry'
|
|
2
|
+
import { run_event_stream, type RunEvent } from './run-event-stream'
|
|
3
|
+
|
|
4
|
+
// The one place a stream consumer scopes the event stream to a single invocation (joshuafolkken/kit#2395).
|
|
5
|
+
// The stream is the repository's event log, not this run's — it outlives every invocation by design — so a
|
|
6
|
+
// consumer handed every event treats a previous invocation's merges, parks and cuts as its own. #2393 built
|
|
7
|
+
// the fix (the carry record's `started_at` as the lower bound, filtered by each event's own time) but left
|
|
8
|
+
// it private inside `run-report.ts`; every other consumer of the stream carried the same defect. This is that
|
|
9
|
+
// mechanism, published once, so `run:report`, the retrospective digest and `run:step` share one time filter
|
|
10
|
+
// rather than each writing it again — the second copy `CLAUDE.md` forbids as a clone.
|
|
11
|
+
//
|
|
12
|
+
// **It never rounds an undetermined scope back to the whole stream.** A scope that cannot be determined — no
|
|
13
|
+
// carry record, an unreadable one, or a start time that is not a time — answers `undefined`, and each
|
|
14
|
+
// consumer falls to the "could not determine" side rather than showing every invocation's events, which is
|
|
15
|
+
// exactly the rounding #2308 and #2393 named.
|
|
16
|
+
|
|
17
|
+
const SINCE_SCOPE = 'since'
|
|
18
|
+
const UNKNOWN_SCOPE = 'unknown'
|
|
19
|
+
|
|
20
|
+
// Which invocation a stream read covers. `since` carries the start time the carry record holds — and because
|
|
21
|
+
// that field survives a `--cut` unchanged, the events either side of a cut fall inside one scope without a
|
|
22
|
+
// consumer needing to know that cuts exist.
|
|
23
|
+
type EventScope = { kind: typeof SINCE_SCOPE; started_at: string } | { kind: typeof UNKNOWN_SCOPE }
|
|
24
|
+
|
|
25
|
+
const UNKNOWN_EVENT_SCOPE: EventScope = { kind: UNKNOWN_SCOPE }
|
|
26
|
+
|
|
27
|
+
// A moment on the clock, or nothing when the text is not a time. Both the scope's start and an event's own
|
|
28
|
+
// `at` go through it, so neither a corrupt record nor a truncated append is read as a moment.
|
|
29
|
+
function moment_of(at: string): number | undefined {
|
|
30
|
+
const parsed = Date.parse(at)
|
|
31
|
+
|
|
32
|
+
return Number.isNaN(parsed) ? undefined : parsed
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Whether one event belongs to the invocation that began at `floor`. An event whose `at` cannot be read is
|
|
36
|
+
// **out**: a consumer must show no line from before the start, and a line with no readable time cannot be
|
|
37
|
+
// shown to satisfy that.
|
|
38
|
+
function is_within(event: RunEvent, floor: number): boolean {
|
|
39
|
+
const at = moment_of(event.at)
|
|
40
|
+
|
|
41
|
+
return at !== undefined && at >= floor
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// This invocation's events, or `undefined` when the scope could not be determined. The two answers stay
|
|
45
|
+
// apart deliberately: an invocation that has done nothing yet is an empty list, an undetermined scope is
|
|
46
|
+
// `undefined`, and collapsing them is exactly what would round the unknown back to "render everything".
|
|
47
|
+
function scoped_events(
|
|
48
|
+
events: ReadonlyArray<RunEvent>,
|
|
49
|
+
scope: EventScope,
|
|
50
|
+
): ReadonlyArray<RunEvent> | undefined {
|
|
51
|
+
if (scope.kind === UNKNOWN_SCOPE) return undefined
|
|
52
|
+
|
|
53
|
+
const floor = moment_of(scope.started_at)
|
|
54
|
+
|
|
55
|
+
if (floor === undefined) return undefined
|
|
56
|
+
|
|
57
|
+
return events.filter((event) => is_within(event, floor))
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// The scope the run's own carry record implies. A record that reads at all names the invocation's start, and
|
|
61
|
+
// **an expired one names it just as well**: expiry is the budget's verdict on a run, not a gap in the record,
|
|
62
|
+
// so rounding it to unknown would withhold the scope from exactly the long runs that most need one. Only an
|
|
63
|
+
// absent or unreadable record leaves the scope undetermined.
|
|
64
|
+
function scope_of(read: CarryRead): EventScope {
|
|
65
|
+
if (read.kind === 'carried' || read.kind === 'expired') {
|
|
66
|
+
return { kind: SINCE_SCOPE, started_at: read.carry.started_at }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return UNKNOWN_EVENT_SCOPE
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// The newest event within scope, or `undefined` when the scope could not be determined or nothing falls
|
|
73
|
+
// inside it. The "last line" consumers read this rather than the raw newest event, so a stale event a
|
|
74
|
+
// previous invocation left on the stream is never read as this run's position (joshuafolkken/kit#2395).
|
|
75
|
+
function last_scoped_event(
|
|
76
|
+
events: ReadonlyArray<RunEvent>,
|
|
77
|
+
scope: EventScope,
|
|
78
|
+
): RunEvent | undefined {
|
|
79
|
+
// Trace events (a `josh ship` stage line, joshuafolkken/kit#2426) are skipped, as `read_last` skips
|
|
80
|
+
// them, so `run:step` reads the run's position rather than an unknown `ship-stage`.
|
|
81
|
+
return scoped_events(events, scope)?.findLast(
|
|
82
|
+
(event) => !run_event_stream.TRACE_KINDS.has(event.kind),
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// The positions a detached `josh ship` supervisor leaves (joshuafolkken/kit#2428). Each names its issue
|
|
87
|
+
// (`#<N> …`), so they are self-scoping where the carry scope is not: the stream is shared by every lane,
|
|
88
|
+
// and another lane's supervisor must never be read as this run's position.
|
|
89
|
+
const SHIP_POSITION_KINDS: ReadonlySet<string> = new Set([
|
|
90
|
+
run_event_stream.EVENT_KIND.SHIP_LAUNCH,
|
|
91
|
+
run_event_stream.EVENT_KIND.SHIP_STOP,
|
|
92
|
+
])
|
|
93
|
+
|
|
94
|
+
function is_foreign_ship_event(event: RunEvent, issue: string): boolean {
|
|
95
|
+
return SHIP_POSITION_KINDS.has(event.kind) && !event.text.startsWith(`#${issue} `)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function is_own_ship_event(event: RunEvent, issue: string): boolean {
|
|
99
|
+
return SHIP_POSITION_KINDS.has(event.kind) && !is_foreign_ship_event(event, issue)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// The newest position for one issue's run: the scoped last event with other issues' ship positions left
|
|
103
|
+
// out, and — where no scope applies, as in an interactive `fullrun` with no carry record — the issue's own
|
|
104
|
+
// newest ship position, which its issue number already scopes. A determined scope with nothing in it yet
|
|
105
|
+
// reads nothing: an earlier invocation's stop for the same issue is not this invocation's position.
|
|
106
|
+
function last_issue_event(
|
|
107
|
+
events: ReadonlyArray<RunEvent>,
|
|
108
|
+
scope: EventScope,
|
|
109
|
+
issue: string,
|
|
110
|
+
): RunEvent | undefined {
|
|
111
|
+
const own = events.filter((event) => !is_foreign_ship_event(event, issue))
|
|
112
|
+
|
|
113
|
+
if (scope.kind === SINCE_SCOPE) return last_scoped_event(own, scope)
|
|
114
|
+
|
|
115
|
+
return own.findLast((event) => is_own_ship_event(event, issue))
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const run_event_scope = {
|
|
119
|
+
UNKNOWN_EVENT_SCOPE,
|
|
120
|
+
last_issue_event,
|
|
121
|
+
last_scoped_event,
|
|
122
|
+
scope_of,
|
|
123
|
+
scoped_events,
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export type { EventScope }
|
|
127
|
+
export { run_event_scope }
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { run_carry } from './run-carry'
|
|
2
|
+
import { run_event_scope } from './run-event-scope'
|
|
3
|
+
import { run_event_stream, type RunEvent } from './run-event-stream'
|
|
4
|
+
|
|
5
|
+
// The write side of the run's event stream (joshuafolkken/kit#2205). It resolves the run's identity and
|
|
6
|
+
// appends, and it is where the "reporting must not break the work it reports on" contract is kept: every
|
|
7
|
+
// failure — a git call that hangs, a temp directory that cannot be written — is swallowed, so a lane
|
|
8
|
+
// child's own work never fails because an append did.
|
|
9
|
+
//
|
|
10
|
+
// **The key is `run-carry.ts`'s, not `run-progress-clock.ts`'s.** The report clock keys on the work
|
|
11
|
+
// tree's own git directory because two lanes are two clocks; this stream is the opposite — the parent
|
|
12
|
+
// session, a cut successor and every lane child are one run and append to one stream — so it keys on the
|
|
13
|
+
// common git directory the carry record uses, which every lane of one repository shares.
|
|
14
|
+
|
|
15
|
+
function now_iso(): string {
|
|
16
|
+
return new Date().toISOString()
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The stream's path for the run this checkout belongs to, or `undefined` when there is no git
|
|
21
|
+
* repository to key on — outside one there is no run identity, and no stream.
|
|
22
|
+
*/
|
|
23
|
+
async function stream_target(): Promise<string | undefined> {
|
|
24
|
+
const repository = await run_carry.repository_directory()
|
|
25
|
+
|
|
26
|
+
return repository === undefined ? undefined : run_event_stream.target_of(repository)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Append one session-facing event, best-effort. A kind outside the enumeration is refused by `append`;
|
|
31
|
+
* every error is swallowed, because the reporting path must never fail the work it reports on
|
|
32
|
+
* (joshuafolkken/kit#2205).
|
|
33
|
+
*/
|
|
34
|
+
async function emit(kind: string, text: string): Promise<void> {
|
|
35
|
+
try {
|
|
36
|
+
const target = await stream_target()
|
|
37
|
+
|
|
38
|
+
if (target === undefined) return
|
|
39
|
+
|
|
40
|
+
run_event_stream.append(target, kind, text, now_iso())
|
|
41
|
+
} catch {
|
|
42
|
+
// Reporting is best-effort: a failed append is dropped rather than raised into the caller's work.
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Append one event unless the newest event on the stream already carries this kind — so a marker a loop
|
|
48
|
+
* re-checks every poll is written once per episode rather than once per poll (joshuafolkken/kit#2335).
|
|
49
|
+
* The drain marker is the caller: `backlog:offer` runs every iteration of a watching loop, and one drain
|
|
50
|
+
* event per drain is what `run:step` reads to fire the retrospective a single time. Best-effort like
|
|
51
|
+
* `emit`: a failed resolve or read is swallowed rather than raised into the loop's work.
|
|
52
|
+
*
|
|
53
|
+
* **Returns whether it appended**, so a caller that pairs the marker with its own once-per-episode side
|
|
54
|
+
* effect — the stall detector sends one notification per stall (joshuafolkken/kit#2359) — fires that
|
|
55
|
+
* effect exactly when the marker was fresh. A skipped duplicate and a swallowed failure both read
|
|
56
|
+
* `false`: neither is a fresh episode.
|
|
57
|
+
*/
|
|
58
|
+
async function emit_once(kind: string, text: string): Promise<boolean> {
|
|
59
|
+
try {
|
|
60
|
+
const target = await stream_target()
|
|
61
|
+
|
|
62
|
+
if (target === undefined || run_event_stream.read_last(target)?.kind === kind) return false
|
|
63
|
+
|
|
64
|
+
return run_event_stream.append(target, kind, text, now_iso()).appended
|
|
65
|
+
} catch {
|
|
66
|
+
// Best-effort: a failed append is dropped rather than raised into the loop's work.
|
|
67
|
+
return false
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The events of the invocation now running: the stream outlives every invocation, so a marker a previous
|
|
72
|
+
// run left — a stall that ended with no dispatch after it — must not hold back this run's first one. An
|
|
73
|
+
// undetermined scope (no carry record) keeps the whole stream, the side that under-notifies rather than
|
|
74
|
+
// re-sends.
|
|
75
|
+
function invocation_events(repository: string, target: string): ReadonlyArray<RunEvent> {
|
|
76
|
+
const events = run_event_stream.read_events(target)
|
|
77
|
+
const scope = run_event_scope.scope_of(run_carry.read_carry(run_carry.carry_path(repository)))
|
|
78
|
+
|
|
79
|
+
return run_event_scope.scoped_events(events, scope) ?? events
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Append one event unless this kind is already on the stream since the newest `reset_kind` — the
|
|
84
|
+
* episode marker for a condition that holds across other events (joshuafolkken/kit#2464). `emit_once`'s
|
|
85
|
+
* newest-event test re-fired the stall notification each time a parallel lane appended a merge or a
|
|
86
|
+
* park; this ends the episode only at `reset_kind`. Returns whether it appended, as `emit_once` does.
|
|
87
|
+
*/
|
|
88
|
+
async function emit_once_since(kind: string, text: string, reset_kind: string): Promise<boolean> {
|
|
89
|
+
try {
|
|
90
|
+
const repository = await run_carry.repository_directory()
|
|
91
|
+
|
|
92
|
+
if (repository === undefined) return false
|
|
93
|
+
|
|
94
|
+
const target = run_event_stream.target_of(repository)
|
|
95
|
+
|
|
96
|
+
if (run_event_stream.has_since(invocation_events(repository, target), kind, reset_kind)) {
|
|
97
|
+
return false
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return run_event_stream.append(target, kind, text, now_iso()).appended
|
|
101
|
+
} catch {
|
|
102
|
+
// Best-effort: a failed append is dropped rather than raised into the caller's work.
|
|
103
|
+
return false
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// One progress heartbeat line onto the stream, so a relay reaches it across a cut (joshuafolkken/kit#2437).
|
|
108
|
+
async function emit_heartbeat(line: string): Promise<void> {
|
|
109
|
+
await emit(run_event_stream.EVENT_KIND.HEARTBEAT, line)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// The events of the invocation now running, for a reader restoring the run from its stream
|
|
113
|
+
// (`backlog:drive`, joshuafolkken/kit#2508). Fail-quiet like the writers: no repository or an unreadable
|
|
114
|
+
// stream is an empty invocation.
|
|
115
|
+
async function current_events(): Promise<ReadonlyArray<RunEvent>> {
|
|
116
|
+
try {
|
|
117
|
+
const repository = await run_carry.repository_directory()
|
|
118
|
+
|
|
119
|
+
if (repository === undefined) return []
|
|
120
|
+
|
|
121
|
+
const read = run_carry.read_carry(run_carry.carry_path(repository))
|
|
122
|
+
const scope = run_event_scope.scope_of(read)
|
|
123
|
+
const events = run_event_stream.read_events(run_event_stream.target_of(repository))
|
|
124
|
+
|
|
125
|
+
return run_event_scope.scoped_events(events, scope) ?? []
|
|
126
|
+
} catch {
|
|
127
|
+
return []
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const run_event_stream_emit = {
|
|
132
|
+
current_events,
|
|
133
|
+
emit,
|
|
134
|
+
emit_heartbeat,
|
|
135
|
+
emit_once,
|
|
136
|
+
emit_once_since,
|
|
137
|
+
stream_target,
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export { run_event_stream_emit }
|