@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,49 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { text } from 'node:stream/consumers'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { report_lint } from './report-lint'
|
|
5
|
+
|
|
6
|
+
// `josh report:lint` — read a two-layer work summary candidate from stdin and print `ok`, or the
|
|
7
|
+
// mechanical violations one per line, exiting non-zero so it works as a gate (joshuafolkken/kit#2123).
|
|
8
|
+
|
|
9
|
+
const SUCCESS_EXIT_CODE = 0
|
|
10
|
+
const FAILURE_EXIT_CODE = 1
|
|
11
|
+
const OK_MESSAGE = 'ok'
|
|
12
|
+
const NO_INPUT_MESSAGE =
|
|
13
|
+
'✖ nothing on stdin — pipe the work summary in, e.g. `pnpm josh report:lint < summary.md`'
|
|
14
|
+
|
|
15
|
+
function run(summary: string): number {
|
|
16
|
+
if (summary.trim().length === 0) {
|
|
17
|
+
console.error(NO_INPUT_MESSAGE)
|
|
18
|
+
|
|
19
|
+
return FAILURE_EXIT_CODE
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const violations = report_lint.lint_report(summary)
|
|
23
|
+
|
|
24
|
+
if (violations.length === 0) {
|
|
25
|
+
console.info(OK_MESSAGE)
|
|
26
|
+
|
|
27
|
+
return SUCCESS_EXIT_CODE
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
console.error(violations.join('\n'))
|
|
31
|
+
|
|
32
|
+
return FAILURE_EXIT_CODE
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function read_and_run(): Promise<number> {
|
|
36
|
+
if (process.stdin.isTTY) return run('')
|
|
37
|
+
|
|
38
|
+
return run(await text(process.stdin))
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function main(): Promise<void> {
|
|
42
|
+
process.exitCode = await read_and_run()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const report_lint_cli = { run, OK_MESSAGE }
|
|
46
|
+
|
|
47
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
|
|
48
|
+
|
|
49
|
+
export { report_lint_cli }
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
// The mechanical half of the two-layer work summary (`CLAUDE.md` Step 0, single-sourced in
|
|
2
|
+
// `prompts/collaboration-workflow/report-format.md`) is a fixed shape, yet only an advisory echo in
|
|
3
|
+
// the `UserPromptSubmit` hook ever mentions it and nothing reads the summary an agent actually
|
|
4
|
+
// wrote. This checks the half a machine can: the labels are present, the overview lines stay inside
|
|
5
|
+
// their length, nothing wraps the summary in a code fence, and no file path or CLI flag leaks into
|
|
6
|
+
// the overview. The judgement half — whether the subject is concrete — is deliberately left out,
|
|
7
|
+
// because a machine cannot answer it (joshuafolkken/kit#2123).
|
|
8
|
+
|
|
9
|
+
// The session-facing labels are Japanese because that is the form the summary is written in
|
|
10
|
+
// (`JOSH_SESSION_LANG` defaults to `ja`); `report-format.md`'s template is the single source and the
|
|
11
|
+
// document test pins that these match it.
|
|
12
|
+
const OVERVIEW_LABEL = '■ 概要'
|
|
13
|
+
const OVERVIEW_ITEM_LABELS = ['今こうなっている', 'こう直す', '確かめ方'] as const
|
|
14
|
+
const DETAILS_LABEL = '技術詳細'
|
|
15
|
+
const CHANGES_LABEL = '変更とテスト'
|
|
16
|
+
const REQUIRED_LABELS: ReadonlyArray<string> = [
|
|
17
|
+
OVERVIEW_LABEL,
|
|
18
|
+
...OVERVIEW_ITEM_LABELS,
|
|
19
|
+
DETAILS_LABEL,
|
|
20
|
+
CHANGES_LABEL,
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
// 80–100 chars is the guide; the ceiling is what a machine can enforce, so an overview sentence over
|
|
24
|
+
// this many characters is the violation and the lower bound stays the writer's judgement.
|
|
25
|
+
const MAX_OVERVIEW_CHARS = 100
|
|
26
|
+
const ITEM_LINE_PREFIX = '- '
|
|
27
|
+
// A file path (a slash segment, or a bare name with a source extension) or a long CLI flag — the
|
|
28
|
+
// internal identifiers `report-format.md` bans from the overview. A function or type name cannot be
|
|
29
|
+
// told from an ordinary word mechanically, so it is left to the judgement half.
|
|
30
|
+
const PATH_SEGMENT_PATTERN = /[\w-]\/[\w-]/u
|
|
31
|
+
const FILE_EXTENSION_PATTERN = /\.(?:ts|tsx|js|jsx|mjs|cjs|svelte|json|yaml|yml|css)\b/u
|
|
32
|
+
const CLI_FLAG_PATTERN = /(?:^|\s)--[a-z]/u
|
|
33
|
+
const BOLD_MARKER = '**'
|
|
34
|
+
const LEADING_LABEL_PUNCTUATION = /^[\s::]+/u
|
|
35
|
+
|
|
36
|
+
// The case-based test declaration (joshuafolkken/kit#2246): the changes section carries a first tier
|
|
37
|
+
// of fixed-vocabulary cases — each non-applicable one crossed out with a reason — and a second tier
|
|
38
|
+
// of at-least-three "if it breaks" conditions. This checks the mechanical half: the two tier markers
|
|
39
|
+
// are present, an N/A cross-out carries a reason, and the second tier holds enough conditions (or the
|
|
40
|
+
// "never breaks" escape). Whether the cases are the right ones stays the judgement half.
|
|
41
|
+
// `report-format.md` is the single source and the document test pins these against it.
|
|
42
|
+
const CASE_LABEL = 'ケース'
|
|
43
|
+
const CASE_VOCABULARY: ReadonlyArray<string> = [
|
|
44
|
+
'正常',
|
|
45
|
+
'空・0件',
|
|
46
|
+
'1件',
|
|
47
|
+
'多数',
|
|
48
|
+
'境界',
|
|
49
|
+
'不正入力',
|
|
50
|
+
'重複',
|
|
51
|
+
'順序',
|
|
52
|
+
'null',
|
|
53
|
+
]
|
|
54
|
+
const BREAK_LABEL = '壊れるとしたら'
|
|
55
|
+
const NA_LABEL = '該当なし'
|
|
56
|
+
const NO_BREAK_ESCAPE = 'どう呼ばれても壊れない'
|
|
57
|
+
const MIN_BREAK_CONDITIONS = 3
|
|
58
|
+
const LIST_ITEM_PATTERN = /^\s*(?:\d+\.|[-*])\s+/u
|
|
59
|
+
const REASON_SEPARATORS = /^[\s::—|、,.。-]+/u
|
|
60
|
+
|
|
61
|
+
function first_content_line(summary: string): string {
|
|
62
|
+
return (
|
|
63
|
+
summary
|
|
64
|
+
.split('\n')
|
|
65
|
+
.find((line) => line.trim().length > 0)
|
|
66
|
+
?.trim() ?? ''
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function is_fenced(summary: string): boolean {
|
|
71
|
+
return first_content_line(summary).startsWith('```')
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function missing_labels(summary: string): ReadonlyArray<string> {
|
|
75
|
+
return REQUIRED_LABELS.filter((label) => !summary.includes(label))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function line_index_of(lines: ReadonlyArray<string>, label: string): number {
|
|
79
|
+
return lines.findIndex((line) => line.includes(label))
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// The overview region is the lines between OVERVIEW_LABEL and DETAILS_LABEL; the length and intrusion
|
|
83
|
+
// checks apply there alone, since the CHANGES_LABEL region legitimately carries file paths.
|
|
84
|
+
function overview_lines(summary: string): ReadonlyArray<string> {
|
|
85
|
+
const lines = summary.split('\n')
|
|
86
|
+
const start = line_index_of(lines, OVERVIEW_LABEL)
|
|
87
|
+
if (start < 0) return []
|
|
88
|
+
|
|
89
|
+
const after = lines.slice(start + 1)
|
|
90
|
+
const end = line_index_of(after, DETAILS_LABEL)
|
|
91
|
+
|
|
92
|
+
return (end < 0 ? after : after.slice(0, end)).filter((line) => line.startsWith(ITEM_LINE_PREFIX))
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// The sentence after `- **label**: ` — the text past the first bold pair's closing marker, with the
|
|
96
|
+
// leading colon and spaces stripped. Only the label's own `**…**` is stripped, so inline emphasis
|
|
97
|
+
// later in the sentence stays inside the checked text; a line with no bold pair falls back to `- `.
|
|
98
|
+
function item_sentence(line: string): string {
|
|
99
|
+
const open = line.indexOf(BOLD_MARKER)
|
|
100
|
+
const close = open === -1 ? -1 : line.indexOf(BOLD_MARKER, open + BOLD_MARKER.length)
|
|
101
|
+
const raw =
|
|
102
|
+
close === -1 ? line.slice(ITEM_LINE_PREFIX.length) : line.slice(close + BOLD_MARKER.length)
|
|
103
|
+
|
|
104
|
+
return raw.replace(LEADING_LABEL_PUNCTUATION, '').trim()
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function over_length_sentences(summary: string): ReadonlyArray<string> {
|
|
108
|
+
return overview_lines(summary)
|
|
109
|
+
.map((line) => item_sentence(line))
|
|
110
|
+
.filter((sentence) => sentence.length > MAX_OVERVIEW_CHARS)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function has_path_or_flag(sentence: string): boolean {
|
|
114
|
+
return (
|
|
115
|
+
PATH_SEGMENT_PATTERN.test(sentence) ||
|
|
116
|
+
FILE_EXTENSION_PATTERN.test(sentence) ||
|
|
117
|
+
CLI_FLAG_PATTERN.test(sentence)
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function intruding_sentences(summary: string): ReadonlyArray<string> {
|
|
122
|
+
return overview_lines(summary)
|
|
123
|
+
.map((line) => item_sentence(line))
|
|
124
|
+
.filter((sentence) => has_path_or_flag(sentence))
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function fence_violation(summary: string): ReadonlyArray<string> {
|
|
128
|
+
return is_fenced(summary)
|
|
129
|
+
? ['✖ the summary is wrapped in a code fence — write it as plain markdown']
|
|
130
|
+
: []
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function label_violations(summary: string): ReadonlyArray<string> {
|
|
134
|
+
return missing_labels(summary).map((label) => `✖ missing label: ${label}`)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function length_violations(summary: string): ReadonlyArray<string> {
|
|
138
|
+
return over_length_sentences(summary).map(
|
|
139
|
+
(sentence) => `✖ overview line over ${String(MAX_OVERVIEW_CHARS)} chars: ${sentence}`,
|
|
140
|
+
)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function intrusion_violations(summary: string): ReadonlyArray<string> {
|
|
144
|
+
return intruding_sentences(summary).map(
|
|
145
|
+
(sentence) => `✖ file path or CLI flag in the overview: ${sentence}`,
|
|
146
|
+
)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// The changes region is every line after CHANGES_LABEL; the case checks apply there, since the two
|
|
150
|
+
// tiers and their markers live under the changes section alone.
|
|
151
|
+
function changes_region_lines(summary: string): ReadonlyArray<string> {
|
|
152
|
+
const lines = summary.split('\n')
|
|
153
|
+
const start = line_index_of(lines, CHANGES_LABEL)
|
|
154
|
+
|
|
155
|
+
return start < 0 ? [] : lines.slice(start + 1)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// The case checks run only when the section exists — a wholly missing section is already a missing
|
|
159
|
+
// label, so gating here keeps one absence from printing as two violations.
|
|
160
|
+
function has_changes_section(summary: string): boolean {
|
|
161
|
+
return summary.includes(CHANGES_LABEL)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// The text after the N/A marker in a segment, with separators stripped — empty means no reason given.
|
|
165
|
+
function reason_after_na(segment: string): string {
|
|
166
|
+
return segment
|
|
167
|
+
.slice(segment.indexOf(NA_LABEL) + NA_LABEL.length)
|
|
168
|
+
.replace(REASON_SEPARATORS, '')
|
|
169
|
+
.trim()
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Cases are listed on one line separated by `/`, so each N/A cross-out is checked in its own segment
|
|
173
|
+
// — a reasonless second cross-out on a line whose first one carries a reason must not escape.
|
|
174
|
+
function line_has_reasonless_na(line: string): boolean {
|
|
175
|
+
return line
|
|
176
|
+
.split('/')
|
|
177
|
+
.some((segment) => segment.includes(NA_LABEL) && reason_after_na(segment).length === 0)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function na_lines_without_reason(lines: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
181
|
+
return lines.filter((line) => line_has_reasonless_na(line))
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function break_marker_index(lines: ReadonlyArray<string>): number {
|
|
185
|
+
return lines.findIndex((line) => line.includes(BREAK_LABEL))
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// The count of list items after the second-tier marker. Over-counting a later change block's items
|
|
189
|
+
// only relaxes the check, never fires a false violation, so the simple whole-tail count is enough.
|
|
190
|
+
function break_condition_count(lines: ReadonlyArray<string>): number {
|
|
191
|
+
const start = break_marker_index(lines)
|
|
192
|
+
if (start < 0) return 0
|
|
193
|
+
|
|
194
|
+
return lines.slice(start + 1).filter((line) => LIST_ITEM_PATTERN.test(line)).length
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function case_line_violations(summary: string): ReadonlyArray<string> {
|
|
198
|
+
if (!has_changes_section(summary)) return []
|
|
199
|
+
if (changes_region_lines(summary).some((line) => line.includes(CASE_LABEL))) return []
|
|
200
|
+
|
|
201
|
+
return [`✖ no case tier (${CASE_LABEL}:) in ${CHANGES_LABEL}`]
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function na_reason_violations(summary: string): ReadonlyArray<string> {
|
|
205
|
+
if (!has_changes_section(summary)) return []
|
|
206
|
+
|
|
207
|
+
return na_lines_without_reason(changes_region_lines(summary)).map(
|
|
208
|
+
() => `✖ ${NA_LABEL} without a reason — say why the case does not apply`,
|
|
209
|
+
)
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function break_violations(summary: string): ReadonlyArray<string> {
|
|
213
|
+
if (!has_changes_section(summary)) return []
|
|
214
|
+
|
|
215
|
+
const lines = changes_region_lines(summary)
|
|
216
|
+
if (lines.some((line) => line.includes(NO_BREAK_ESCAPE))) return []
|
|
217
|
+
if (break_marker_index(lines) < 0) return [`✖ no ${BREAK_LABEL} tier in ${CHANGES_LABEL}`]
|
|
218
|
+
if (break_condition_count(lines) >= MIN_BREAK_CONDITIONS) return []
|
|
219
|
+
|
|
220
|
+
return [
|
|
221
|
+
`✖ ${BREAK_LABEL} needs ${String(MIN_BREAK_CONDITIONS)} conditions or "${NO_BREAK_ESCAPE}"`,
|
|
222
|
+
]
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Every violation the mechanical checks find, in a fixed order; an empty array is a clean summary.
|
|
226
|
+
function lint_report(summary: string): ReadonlyArray<string> {
|
|
227
|
+
return [
|
|
228
|
+
...fence_violation(summary),
|
|
229
|
+
...label_violations(summary),
|
|
230
|
+
...length_violations(summary),
|
|
231
|
+
...intrusion_violations(summary),
|
|
232
|
+
...case_line_violations(summary),
|
|
233
|
+
...na_reason_violations(summary),
|
|
234
|
+
...break_violations(summary),
|
|
235
|
+
]
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const report_lint = {
|
|
239
|
+
lint_report,
|
|
240
|
+
REQUIRED_LABELS,
|
|
241
|
+
MAX_OVERVIEW_CHARS,
|
|
242
|
+
CASE_LABEL,
|
|
243
|
+
CASE_VOCABULARY,
|
|
244
|
+
BREAK_LABEL,
|
|
245
|
+
NA_LABEL,
|
|
246
|
+
NO_BREAK_ESCAPE,
|
|
247
|
+
MIN_BREAK_CONDITIONS,
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export { report_lint }
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { readFile } from 'node:fs/promises'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { cost_run_report, type RunCostReport } from '#scripts/cost/cost-run-report'
|
|
5
|
+
import { cost_run_tree } from '#scripts/cost/cost-run-tree'
|
|
6
|
+
import { observation_ledger_home } from '#scripts/observations/observation-ledger-home'
|
|
7
|
+
import { observation_ledger_line } from '#scripts/observations/observation-ledger-line'
|
|
8
|
+
import { review_finding_ledger } from '#scripts/review/review-finding-ledger'
|
|
9
|
+
import { run_carry } from '#scripts/run/run-carry'
|
|
10
|
+
import { run_event_scope, type EventScope } from '#scripts/run/run-event-scope'
|
|
11
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/run-event-stream'
|
|
12
|
+
import { retrospective, type RetrospectiveInputs } from './retrospective'
|
|
13
|
+
|
|
14
|
+
// `josh retrospective` — the end-of-run retrospective (joshuafolkken/kit#2328). It is the aggregation
|
|
15
|
+
// half: it gathers the four measurements that already exist and prints the digest `retrospective.ts`
|
|
16
|
+
// composes, so the retrospective step has one place to read the run it just finished. **When to run it
|
|
17
|
+
// is the run driver's** — `run:step` prints it at the stop position, once per invocation — and **what to
|
|
18
|
+
// file from it is `retrospective.md`'s**; this only reads and shapes.
|
|
19
|
+
//
|
|
20
|
+
// **Kit-only.** It reads kit's own development run — its transcript store, its review ledger, its event
|
|
21
|
+
// stream — so it means nothing in a consumer project and is dropped from a consumer's help and refused
|
|
22
|
+
// there, through the existing `is_kit_only` declaration rather than a new judgement.
|
|
23
|
+
|
|
24
|
+
const SUCCESS_EXIT_CODE = 0
|
|
25
|
+
// `read_from` returns every event past the given position, so zero is "the whole stream from the start".
|
|
26
|
+
const STREAM_START = 0
|
|
27
|
+
|
|
28
|
+
function read_cost(cwd: string): RunCostReport | undefined {
|
|
29
|
+
const tree = cost_run_tree.load(cwd, undefined)
|
|
30
|
+
|
|
31
|
+
if (tree === undefined) return undefined
|
|
32
|
+
|
|
33
|
+
return cost_run_report.build(tree.run_count, tree.unattributed_count, tree.nodes)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function read_ledger(): Promise<string> {
|
|
37
|
+
try {
|
|
38
|
+
return await readFile(observation_ledger_home.ledger_path(), 'utf8')
|
|
39
|
+
} catch {
|
|
40
|
+
return ''
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function ledger_entries(content: string): Array<string> {
|
|
45
|
+
return content.split('\n').filter((line) => observation_ledger_line.is_ledger_entry_line(line))
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface RunRead {
|
|
49
|
+
events: ReadonlyArray<RunEvent>
|
|
50
|
+
scope: EventScope
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// The stream and the scope that bounds it, read from the one directory the carry record and the event stream
|
|
54
|
+
// share (joshuafolkken/kit#2395). The whole stream is read — `scoped_events` filters it to this invocation —
|
|
55
|
+
// and an unresolvable directory has no record to scope with, which is the undetermined answer an absent
|
|
56
|
+
// record gives.
|
|
57
|
+
async function read_run(): Promise<RunRead> {
|
|
58
|
+
const directory = await run_carry.repository_directory()
|
|
59
|
+
|
|
60
|
+
if (directory === undefined) return { events: [], scope: run_event_scope.UNKNOWN_EVENT_SCOPE }
|
|
61
|
+
|
|
62
|
+
const target = run_event_stream.target_of(directory)
|
|
63
|
+
const { events } = run_event_stream.read_from(target, STREAM_START)
|
|
64
|
+
const scope = run_event_scope.scope_of(run_carry.read_carry(run_carry.carry_path(directory)))
|
|
65
|
+
|
|
66
|
+
return { events, scope }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function gather(cwd: string): Promise<RetrospectiveInputs> {
|
|
70
|
+
const ledger = await read_ledger()
|
|
71
|
+
const run_read = await read_run()
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
cost: read_cost(cwd),
|
|
75
|
+
findings: review_finding_ledger.category_counts(ledger),
|
|
76
|
+
zero_rounds: review_finding_ledger.zero_round_count(ledger),
|
|
77
|
+
observations: ledger_entries(ledger),
|
|
78
|
+
events: run_read.events,
|
|
79
|
+
scope: run_read.scope,
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function run(cwd: string = process.cwd()): Promise<number> {
|
|
84
|
+
console.info(retrospective.compose(await gather(cwd)))
|
|
85
|
+
|
|
86
|
+
return SUCCESS_EXIT_CODE
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async function main(): Promise<void> {
|
|
90
|
+
process.exitCode = await run()
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const retrospective_cli = { gather, run, main }
|
|
94
|
+
|
|
95
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
|
|
96
|
+
|
|
97
|
+
export { retrospective_cli }
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { cost_format } from '#scripts/cost-runtime/cost-format'
|
|
2
|
+
import type { RunCostReport } from '#scripts/cost/cost-run-report'
|
|
3
|
+
import type { RoleTotals } from '#scripts/cost/cost-run-roles'
|
|
4
|
+
import type { CategoryCount } from '#scripts/review/review-finding-ledger'
|
|
5
|
+
import { run_event_scope, type EventScope } from '#scripts/run/run-event-scope'
|
|
6
|
+
import type { RunEvent } from '#scripts/run/run-event-stream'
|
|
7
|
+
|
|
8
|
+
// The composition half of `josh retrospective` — the end-of-run retrospective's aggregation
|
|
9
|
+
// (joshuafolkken/kit#2328). A run that drains its backlog has spent time and money that nobody reads;
|
|
10
|
+
// this folds the four measurements that already exist — the run tree's cost and time
|
|
11
|
+
// (`cost-run-report.ts`), the recurring review findings (`review-finding-ledger.ts`), the observation
|
|
12
|
+
// ledger and the run's own event stream — into one digest, so the retrospective step has something to
|
|
13
|
+
// weigh. It adds no new measurement, per the observation-filing rule against readerless numbers; every
|
|
14
|
+
// input here is read from a command that was already keeping it.
|
|
15
|
+
//
|
|
16
|
+
// **It is a pure function of the four inputs.** The gathering — loading the run tree, reading the
|
|
17
|
+
// ledger, opening the stream — is the CLI's; this shapes what they return and nothing else, so the
|
|
18
|
+
// digest is unit-tested against fixed inputs rather than against a live store.
|
|
19
|
+
|
|
20
|
+
const MS_PER_MINUTE = 60_000
|
|
21
|
+
const PERCENT = 100
|
|
22
|
+
// A role whose share of the run's wall clock runs this far ahead of its share of the cost is time the
|
|
23
|
+
// run spent waiting rather than working — the disparity the retrospective exists to surface (the wake
|
|
24
|
+
// role in the baseline sat at 52% of the time for 25% of the cost, a gap of 0.27).
|
|
25
|
+
const WAITING_GAP = 0.2
|
|
26
|
+
|
|
27
|
+
// The friction each event kind marks — a place the run did not run straight through — counted back
|
|
28
|
+
// over the whole run. A plan, a child launch, a merge and a PR opening are the run working as intended,
|
|
29
|
+
// so they are not friction and are left out.
|
|
30
|
+
const FRICTION_KINDS = ['park', 'outage', 'cut', 'review-round'] as const
|
|
31
|
+
|
|
32
|
+
interface RetrospectiveInputs {
|
|
33
|
+
cost: RunCostReport | undefined
|
|
34
|
+
findings: ReadonlyArray<CategoryCount>
|
|
35
|
+
zero_rounds: number
|
|
36
|
+
// The observation ledger's entry lines, already filtered to entries by the caller.
|
|
37
|
+
observations: ReadonlyArray<string>
|
|
38
|
+
events: ReadonlyArray<RunEvent>
|
|
39
|
+
// Which invocation the friction count covers (joshuafolkken/kit#2395). The stream is the repository's
|
|
40
|
+
// event log, not this run's, so a digest handed the whole of it would report a previous invocation's
|
|
41
|
+
// cut and park as this run's friction — the very numbers the retrospective weighs to file improvement
|
|
42
|
+
// issues. The scope is `run-event-scope.ts`'s, shared with `run:report` and `run:step`.
|
|
43
|
+
scope: EventScope
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const CLOSING =
|
|
47
|
+
'Weigh these against retrospective.md: file the improvements worth carrying into the next run, and stack the rest in the observation ledger.'
|
|
48
|
+
|
|
49
|
+
function minutes(ms: number): string {
|
|
50
|
+
return String(Math.round(ms / MS_PER_MINUTE))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function percent(share: number): string {
|
|
54
|
+
return `${String(Math.round(share * PERCENT))}%`
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// A role's time share running ahead of its cost share is the run waiting rather than working, so it is
|
|
58
|
+
// called out; a role that pays its way carries no note.
|
|
59
|
+
function waiting_note(role: RoleTotals): string {
|
|
60
|
+
return role.elapsed_share - role.cost_share >= WAITING_GAP ? ' — waiting-heavy' : ''
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function role_line(role: RoleTotals): string {
|
|
64
|
+
const spent = `${percent(role.cost_share)} cost, ${percent(role.elapsed_share)} time`
|
|
65
|
+
|
|
66
|
+
return ` ${role.role}: ${spent}${waiting_note(role)}`
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function cost_lines(cost: RunCostReport | undefined): Array<string> {
|
|
70
|
+
if (cost === undefined) return ['Run cost & time: no run transcripts found']
|
|
71
|
+
|
|
72
|
+
const totals = `${String(cost.session_count)} session(s), ${minutes(cost.total_elapsed_ms)} min, ${cost_format.format_usd(cost.total_usd)}`
|
|
73
|
+
|
|
74
|
+
return [`Run cost & time: ${totals}`, ...cost.roles.map((role) => role_line(role))]
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function findings_lines(
|
|
78
|
+
findings: ReadonlyArray<CategoryCount>,
|
|
79
|
+
zero_rounds: number,
|
|
80
|
+
): Array<string> {
|
|
81
|
+
const denominator = `${String(zero_rounds)} zero-finding round(s)`
|
|
82
|
+
|
|
83
|
+
if (findings.length === 0) return [`Review findings: none recorded (${denominator})`]
|
|
84
|
+
|
|
85
|
+
const body = findings.map((entry) => ` ${entry.category}: ${String(entry.count)}`)
|
|
86
|
+
|
|
87
|
+
return [`Review findings (${denominator}):`, ...body]
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function observation_lines(observations: ReadonlyArray<string>): Array<string> {
|
|
91
|
+
return [`Observation ledger: ${String(observations.length)} entry(ies) held`]
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function friction_count(events: ReadonlyArray<RunEvent>, kind: string): number {
|
|
95
|
+
return events.filter((event) => event.kind === kind).length
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// This invocation's friction, counted over its own events only. An undetermined scope falls to an empty
|
|
99
|
+
// list rather than the whole stream (joshuafolkken/kit#2395): counting every invocation's friction as this
|
|
100
|
+
// run's is the defect, so the safe fall is to attribute nothing that cannot be attributed.
|
|
101
|
+
function friction_lines(events: ReadonlyArray<RunEvent>, scope: EventScope): Array<string> {
|
|
102
|
+
const scoped = run_event_scope.scoped_events(events, scope) ?? []
|
|
103
|
+
const counts = FRICTION_KINDS.map((kind) => `${kind} ${String(friction_count(scoped, kind))}`)
|
|
104
|
+
|
|
105
|
+
return [`Run events: ${counts.join(', ')}`]
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// The four sections in a fixed order, separated by blank lines, closed by the pointer that hands the
|
|
109
|
+
// judgement — which improvements are worth filing — to `retrospective.md`.
|
|
110
|
+
function compose(inputs: RetrospectiveInputs): string {
|
|
111
|
+
return [
|
|
112
|
+
...cost_lines(inputs.cost),
|
|
113
|
+
'',
|
|
114
|
+
...findings_lines(inputs.findings, inputs.zero_rounds),
|
|
115
|
+
'',
|
|
116
|
+
...observation_lines(inputs.observations),
|
|
117
|
+
'',
|
|
118
|
+
...friction_lines(inputs.events, inputs.scope),
|
|
119
|
+
'',
|
|
120
|
+
CLOSING,
|
|
121
|
+
].join('\n')
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const retrospective = { CLOSING, FRICTION_KINDS, WAITING_GAP, compose }
|
|
125
|
+
|
|
126
|
+
export type { RetrospectiveInputs }
|
|
127
|
+
export { retrospective }
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { disposition } from './disposition-logic'
|
|
4
|
+
|
|
5
|
+
// `josh disposition <path...>` — the machine half of the three-way review disposition
|
|
6
|
+
// (joshuafolkken/kit#2181). It prints `runtime` when any named path reaches a runtime path — a
|
|
7
|
+
// runtime code path, a distributed artifact a consumer reads, or the verification guarding either —
|
|
8
|
+
// and `non-runtime` when every path is inert. `prompts/review.md` → "Three-way disposition after the
|
|
9
|
+
// cap" leaves the run one judgement after this: whether the finding is a confirmed defect.
|
|
10
|
+
|
|
11
|
+
const ARGV_OFFSET = 2
|
|
12
|
+
const USAGE = 'Usage: josh disposition <path...>'
|
|
13
|
+
const FAILURE_EXIT_CODE = 1
|
|
14
|
+
|
|
15
|
+
function reason_line(paths: ReadonlyArray<string>): string {
|
|
16
|
+
const reaching = disposition.reaching_paths(paths)
|
|
17
|
+
|
|
18
|
+
return reaching.length === 0
|
|
19
|
+
? 'every path is inert — the finding cannot escape this repository'
|
|
20
|
+
: `reaches through: ${reaching.join(', ')}`
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function run(argv: ReadonlyArray<string>): number {
|
|
24
|
+
if (argv.length === 0) {
|
|
25
|
+
console.error(USAGE)
|
|
26
|
+
|
|
27
|
+
return FAILURE_EXIT_CODE
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
process.stdout.write(`${disposition.disposition_for(argv)}\n`)
|
|
31
|
+
process.stderr.write(`${reason_line(argv)}\n`)
|
|
32
|
+
|
|
33
|
+
return 0
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function main(argv: ReadonlyArray<string>): void {
|
|
37
|
+
process.exitCode = run(argv)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const disposition_cli = { USAGE, main, reason_line, run }
|
|
41
|
+
|
|
42
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
43
|
+
|
|
44
|
+
export { disposition_cli }
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { review_level } from './review-level'
|
|
2
|
+
|
|
3
|
+
// Whether a review finding reaches a runtime path — the half of the three-way disposition a machine
|
|
4
|
+
// can answer (joshuafolkken/kit#2181). `prompts/review.md` → "Three-way disposition after the cap"
|
|
5
|
+
// routes a non-High finding to branch 2 (file it) only when it is a **confirmed defect that reaches a
|
|
6
|
+
// runtime code path**. "Reaches" is read exactly as the review-level rubric reads it — a runtime code
|
|
7
|
+
// path, a distributed artifact a consumer reads, or the verification guarding either — which is the
|
|
8
|
+
// same question `review-level.ts`'s inert set answers by its complement.
|
|
9
|
+
//
|
|
10
|
+
// **The classifier is shared, not copied.** `is_inert` is the single source of "cannot escape this
|
|
11
|
+
// repository", and this reuses it rather than re-listing the paths — a distinct answer from
|
|
12
|
+
// `test-declared-logic.ts`'s `EXEMPT_*`, which asks whether an automated test could have caught the
|
|
13
|
+
// defect and so keeps documentation exempt. Disposition asks whether the finding escapes, and a
|
|
14
|
+
// distributed document does; that is why it shares the inert set and not the exempt one
|
|
15
|
+
// (decision recorded on the issue, 2026-09-21).
|
|
16
|
+
|
|
17
|
+
type Disposition = 'runtime' | 'non-runtime'
|
|
18
|
+
|
|
19
|
+
const RUNTIME: Disposition = 'runtime'
|
|
20
|
+
const NON_RUNTIME: Disposition = 'non-runtime'
|
|
21
|
+
|
|
22
|
+
// A finding reaches a runtime path when any path it touches is non-inert. Every path inert means the
|
|
23
|
+
// finding cannot escape — `non-runtime`. No path at all takes `runtime`, the file-eligible answer, for
|
|
24
|
+
// the same reason `level_for` gives an empty diff the default level: a caller that failed to read the
|
|
25
|
+
// finding's paths must not be handed the drop-eligible verdict as though it had.
|
|
26
|
+
function disposition_for(paths: ReadonlyArray<string>): Disposition {
|
|
27
|
+
const named = paths.map((path) => path.trim()).filter((path) => path !== '')
|
|
28
|
+
|
|
29
|
+
if (named.length === 0) return RUNTIME
|
|
30
|
+
|
|
31
|
+
return named.every((path) => review_level.is_inert(path)) ? NON_RUNTIME : RUNTIME
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// The non-inert paths that made the finding reach — so the answer can say why, mirroring
|
|
35
|
+
// `review_level.deciding_paths`.
|
|
36
|
+
function reaching_paths(paths: ReadonlyArray<string>): Array<string> {
|
|
37
|
+
return paths
|
|
38
|
+
.map((path) => path.trim())
|
|
39
|
+
.filter((path) => path !== '' && !review_level.is_inert(path))
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const disposition = { NON_RUNTIME, RUNTIME, disposition_for, reaching_paths }
|
|
43
|
+
|
|
44
|
+
export type { Disposition }
|
|
45
|
+
export { disposition }
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { git_command } from '#scripts/git/git-command'
|
|
2
|
+
import { git_gh_command } from '#scripts/git/git-gh-command'
|
|
3
|
+
import { reproduction_measure } from '#scripts/issue/reproduction-measure'
|
|
4
|
+
import { test_declared_logic, type Verdict } from '#scripts/test/test-declared-logic'
|
|
5
|
+
|
|
6
|
+
// joshuafolkken/kit#2446. "Done" meant lint, types and unit tests were green and the review found
|
|
7
|
+
// nothing — proof the code is right in isolation, never that the feature works where it runs. The
|
|
8
|
+
// recent defects (#2402, #2419, #2393) all came through that gap. **This is the seam where it closes**:
|
|
9
|
+
// a runtime change merges only once its pull request carries the acceptance criteria run for real —
|
|
10
|
+
// the command and the output it actually printed, in the evidence section `EVIDENCE_HEADING` names.
|
|
11
|
+
//
|
|
12
|
+
// **Two single sources, no new judgement.** Which change needs evidence is `josh test:declared`'s
|
|
13
|
+
// runtime-path classification, read against the branch diff rather than the working tree (a followup
|
|
14
|
+
// runs after the commit, when `git status` is empty). What counts as evidence is `issue:lint`'s
|
|
15
|
+
// reproduction-section parser, so a prose "confirmed it works" is refused here exactly as it is there.
|
|
16
|
+
|
|
17
|
+
const EVIDENCE_HEADING = '## 実機証跡'
|
|
18
|
+
|
|
19
|
+
function verdict_for(paths: ReadonlyArray<string>, body: string | undefined): Verdict {
|
|
20
|
+
if (test_declared_logic.runtime_files(paths).length === 0) return 'exempt'
|
|
21
|
+
|
|
22
|
+
return reproduction_measure.has_command_output(body ?? '', EVIDENCE_HEADING)
|
|
23
|
+
? 'satisfied'
|
|
24
|
+
: 'required'
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// The diff is this checkout's, so it answers for the named branch only when that is the one checked
|
|
28
|
+
// out: a `followup --branch <lane>` run from `main` would read an empty diff as `exempt` and merge a
|
|
29
|
+
// runtime change with no evidence. Refused rather than guessed.
|
|
30
|
+
async function assert_checked_out(branch_name: string): Promise<void> {
|
|
31
|
+
const current = await git_command.branch()
|
|
32
|
+
|
|
33
|
+
if (current === branch_name) return
|
|
34
|
+
|
|
35
|
+
throw new Error(
|
|
36
|
+
`The ${EVIDENCE_HEADING} check reads this checkout's diff, which is ${current}, not ${branch_name}; run followup from ${branch_name}'s checkout.`,
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async function check(branch_name: string): Promise<Verdict> {
|
|
41
|
+
await assert_checked_out(branch_name)
|
|
42
|
+
|
|
43
|
+
const [names, body] = await Promise.all([
|
|
44
|
+
git_command.diff_main_names(),
|
|
45
|
+
git_gh_command.pr_get_body(branch_name),
|
|
46
|
+
])
|
|
47
|
+
|
|
48
|
+
return verdict_for(names.split('\n'), body)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function refusal_message(): string {
|
|
52
|
+
return [
|
|
53
|
+
`Merge refused: this pull request changes runtime code but its body has no ${EVIDENCE_HEADING} section.`,
|
|
54
|
+
'Run the acceptance criteria for real, then add the section: a backticked command followed by a',
|
|
55
|
+
'fenced block holding the output it actually printed (prose such as "confirmed" is not accepted).',
|
|
56
|
+
'Update the body with `gh api -X PATCH repos/{owner}/{repo}/pulls/<N> -F body=@<path>`, then re-run.',
|
|
57
|
+
].join('\n')
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const live_evidence = { EVIDENCE_HEADING, check, refusal_message, verdict_for }
|
|
61
|
+
|
|
62
|
+
export { live_evidence }
|