[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-vercel-labs-konsistent-fix-violations":3,"mdc--61o8ma-key":36,"related-org-vercel-labs-konsistent-fix-violations":1869,"related-repo-vercel-labs-konsistent-fix-violations":2039},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":34,"mdContent":35},"konsistent-fix-violations","fix konsistent code violations","Run the konsistent CLI, review all reported violations, and fix them in the codebase. Use when the user wants to \"fix konsistent violations\", \"resolve konsistent errors\", \"clean up konsistent diagnostics\", \"make konsistent pass\", \"address structural convention violations\", or asks to run konsistent and act on the results. The skill is interactive: it requires explicit user decisions when many violations stem from the same rule (rule vs. code question), explicit user confirmation before modifying any code, and a triage step for non-trivial violations. For editing `konsistent.json`, this skill defers to the `konsistent-config` skill.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"vercel-labs","Vercel Labs","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fvercel-labs.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"TypeScript","typescript","tag",{"name":17,"slug":18,"type":15},"CLI","cli",{"name":20,"slug":21,"type":15},"Code Analysis","code-analysis",{"name":23,"slug":24,"type":15},"Debugging","debugging",130,"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fkonsistent","2026-07-17T06:04:12.52326",null,5,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":33},[],"CLI tool that enforces structural conventions in TypeScript codebases.","https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fkonsistent\u002Ftree\u002FHEAD\u002Fskills\u002Fkonsistent-fix-violations","---\nname: konsistent-fix-violations\ndescription: >\n  Run the konsistent CLI, review all reported violations, and fix them in the codebase.\n  Use when the user wants to \"fix konsistent violations\", \"resolve konsistent errors\",\n  \"clean up konsistent diagnostics\", \"make konsistent pass\", \"address structural convention\n  violations\", or asks to run konsistent and act on the results. The skill is interactive:\n  it requires explicit user decisions when many violations stem from the same rule (rule\n  vs. code question), explicit user confirmation before modifying any code, and a triage\n  step for non-trivial violations. For editing `konsistent.json`, this skill defers to the\n  `konsistent-config` skill.\n---\n\n# konsistent — Fix Violations\n\nRun `konsistent`, surface what is broken, and resolve violations. The hard part is not the mechanical fix — it is deciding **whether the rule or the code is wrong** when a single rule has many violations, and **which non-trivial violations are worth attempting** versus deferring.\n\nThe canonical workflow and per-predicate triage rubric are documented in `node_modules\u002Fkonsistent\u002Fdocs\u002Fguides\u002Ffixing-violations.md`. **Read it before classifying violations.** This skill layers strict gating, user confirmation, and `AskUserQuestion` interactions on top of that workflow.\n\n## Workflow (strict order)\n\n1. [Run the CLI](#1-run-the-cli) and collect all violations as JSON.\n2. [Group violations by rule](#2-group-violations-by-rule) and identify rules with high violation counts.\n3. [For each high-count rule, ask the user](#3-ask-the-user-rule-vs-code) whether to keep, change, or remove the rule.\n4. [Update `konsistent.json`](#4-update-konsistentjson-via-konsistent-config) via the `konsistent-config` skill if any rules need changes.\n5. [Re-run the CLI](#5-re-run-and-confirm-before-fixing) to refresh the violation list, then **stop and ask for explicit confirmation** before modifying any code.\n6. [Triage remaining violations](#6-triage-trivial-vs-non-trivial) into trivial vs. non-trivial.\n7. [Surface non-trivial violations](#7-surface-non-trivial-violations) to the user and let them decide how to handle each.\n8. [Fix the approved violations](#8-fix-approved-violations) and re-run the CLI to verify.\n\nDo not skip steps. Do not collapse them. The asks for user input at steps 3, 5, and 7 are non-negotiable.\n\n---\n\n## 1. Run the CLI\n\nDetermine the invocation in this order:\n\n1. If `package.json` has a `konsistent` script → use the project's package manager: `pnpm konsistent`, `npm run konsistent`, or `yarn konsistent` (match the lockfile \u002F `packageManager` field).\n2. Else, if `konsistent` is in `devDependencies` → run via the package runner: `pnpm exec konsistent`, `npx konsistent`, etc.\n3. Else, fall back to `npx konsistent`.\n\nRun the `check` command with JSON output and a high diagnostic cap so nothing is truncated:\n\n```bash\n\u003Crunner> konsistent check --format=json --max-diagnostics=1000\n```\n\nNote: when invoking via an `npm`\u002F`pnpm` script that already wraps `konsistent`, you may need `--` to forward flags:\n\n```bash\npnpm konsistent check --format=json --max-diagnostics=1000\n# OR if the script runs konsistent without args:\npnpm konsistent -- check --format=json --max-diagnostics=1000\n```\n\nThe JSON output is an array of `{ severity, conventionName, filePath, predicateName, message }`. Exit code is non-zero when errors are present; that is expected — read the JSON regardless. See `node_modules\u002Fkonsistent\u002Fdocs\u002Freference\u002Fcli.md` for the full output schema.\n\nIf the command fails for reasons other than violations (config not found, invalid config, missing dependency), stop and resolve the underlying issue first. Do not proceed.\n\n## 2. Group violations by rule\n\nAggregate the violations by `conventionName` (and optionally `predicateName`). Compute a count per group. Report the totals to the user briefly:\n\n> Found N violations across M conventions. Rule `X` has K violations; rule `Y` has J violations; …\n\nA rule is \"high-count\" when it has roughly **5+ violations** OR represents **more than half** of the violating files for that rule's path pattern. Use judgment — a rule with 4 violations across 4 files where the path pattern only matches 5 files is also high-count.\n\nWhy this matters: a rule with 1–2 violations almost always means the *code* is the outlier. A rule with many violations often means the *rule* itself encodes a convention the codebase has not actually adopted — fixing the code without questioning the rule produces churn and may overwrite the team's real convention.\n\n## 3. Ask the user: rule vs. code\n\nFor **each high-count rule**, explicitly ask the user to choose. Use the AskUserQuestion tool with concrete options. Do not infer — the user owns this decision.\n\nFrame the question with:\n- The rule's name \u002F description \u002F what it enforces.\n- **The codebase distribution** — count how many of the *matched* files conform vs. violate, and report the split (e.g. \"12 of 25 matched packages use pattern A; 13 use pattern B — codebase is roughly 50\u002F50\"). This framing dramatically improves the user's ability to decide.\n- A short summary of what convention the violating files actually follow (read 2–3 of them — what naming\u002Fstructure pattern do they share?).\n- A few representative examples (file paths or symbol names from each pattern).\n\nOffer at minimum these options:\n- **Keep the rule, fix the code** — code is the outlier; proceed to fix violations.\n- **Change the rule to match what the code does** — the violating pattern is the real convention; update `konsistent.json`.\n- **Remove the rule** — the convention isn't worth enforcing.\n- **Other** (free-text — e.g. relax to `severity: warning`, narrow the path pattern, add an exception via path negation).\n\n**Surface meaningful sub-options** when \"change the rule\" admits more than one specific shape. Don't collapse them. Examples of sub-options worth presenting:\n- File-naming variants: `${name}-options.ts` vs `${name}-model-options.ts`.\n- A **hybrid** rule that splits by a sub-pattern (e.g. \"single-word providers ending in `ai` use flat-case; everything else uses camelCase\") — this is encodable via `kebabToCamelMap` \u002F `kebabToPascalMap` overrides or `placeholderSatisfies` constraints.\n- Mixed-severity (`error` for the must-have, `warning` for the nice-to-have).\n\nIf the user picks \"change\", \"remove\", or \"other\", capture the specifics needed to execute the change in step 4.\n\nSkip this step for low-count rules — assume code is wrong and fix in step 8.\n\n## 4. Update `konsistent.json` via konsistent-config\n\nIf any rule needs to change based on step 3 decisions, **defer to the `konsistent-config` skill** for the actual edits. That skill knows the predicate catalog, path placeholder syntax, case map overrides, conditional\u002Fiterative blocks, and the project conventions for `konsistent.json`. Do not edit `konsistent.json` ad-hoc here.\n\nWhen delegating, hand over: the rule name(s) being changed, the user's decision, and the concrete change (e.g. \"change `exportFunctions` name template from `${name.toPascalCase()}Service` to `create${name.toPascalCase()}Service`\", \"add `severity: warning`\", \"add path negation for `packages\u002Ftest-utils`\").\n\nAfter the config is updated, validate:\n\n```bash\n\u003Crunner> konsistent validate\n```\n\nFix any config errors before continuing.\n\n## 5. Re-run and confirm before fixing\n\nAfter config changes (or after step 3 if no changes were needed), **re-run the CLI** to get a fresh violation list reflecting the new rules:\n\n```bash\n\u003Crunner> konsistent check --format=json --max-diagnostics=1000\n```\n\nReport the updated count to the user. Then **stop and ask for explicit confirmation** before touching any code:\n\n> \"Ready to start fixing N code violations. Proceed?\"\n\nUse AskUserQuestion with a clear yes\u002Fno. **Do not begin code edits until the user confirms.** This gate is the user's last chance to review the rule set before mass changes.\n\nIf the user says no or wants to adjust further, return to step 3 or 4.\n\n## 6. Triage: trivial vs. non-trivial\n\nOnce confirmed, classify each remaining violation. **Read `node_modules\u002Fkonsistent\u002Fdocs\u002Fguides\u002Ffixing-violations.md` for the per-predicate triage rubric and the search heuristics** before classifying.\n\nThe headline rules:\n\n- **Search the codebase first.** A \"missing\" file or export reported by `konsistent` very often already exists under a different name, in a different file, or in a different casing. These are still **trivial** fixes — rename, move, or re-export. Before marking anything non-trivial, search by exact name, case variants, stripped prefixes\u002Fsuffixes, distinctive word stems, sibling locations, and mirror existing successful matches.\n- **When in doubt, classify as non-trivial.** False positives in the trivial bucket are worse than in the non-trivial bucket — the former lead to bad code without user input. But do not classify as non-trivial without first searching: a quick grep often turns the violation trivial.\n\nThe full per-predicate rubric (haveType, haveFiles, export\u002FexportConstants, exportTypes, exportFunctions, exportInterfaces, exportClasses, import\u002FimportTypes) lives in `node_modules\u002Fkonsistent\u002Fdocs\u002Fguides\u002Ffixing-violations.md`.\n\n## 7. Surface non-trivial violations\n\nCompile the non-trivial violations into a clear list. For each, include:\n- File path and rule.\n- The violation message.\n- A one-line note on why it is non-trivial (e.g. \"type `FooConfig` does not exist anywhere in the repo\", \"would require splitting the existing class\").\n\nPresent the list to the user and ask, **per violation or per group**, which they want to:\n\n- **Defer** — leave for later. Offer two follow-ups:\n  - Draft a GitHub issue title\u002Fbody capturing the work (the user opens it).\n  - **Add path negation in `konsistent.json`** for the deferred files via the `konsistent-config` skill, so CI stays green and the rule still applies to all other matched files. Remove the negation when the deferred work lands.\n- **Attempt** — let the agent try; **prompt the user for additional context** that would help (intended types, examples to mirror, references to similar code).\n- **Skip** — explicitly mark as won't-do (e.g. the rule will be relaxed instead — note this and return to step 4 if needed).\n\nUse AskUserQuestion for the decision. For \"Attempt\", actively prompt for context — do not silently start a non-trivial change without input.\n\n## 8. Fix approved violations\n\n**Before editing any public API**, decide on backward-compatibility for renamed exports. This is the most important decision at the start of this step — answer it once, then apply uniformly across the run.\n\n### 8a. Ask: is the project in a breaking-change window?\n\nUse AskUserQuestion. Frame it: \"Renames will affect package-boundary exports. Are breaking changes acceptable, or do we need to keep back-compat via deprecated aliases?\"\n\n- **Breaking changes acceptable** (e.g. major-version bump, beta line, pre-1.0, internal-only project) — plain renames everywhere. No aliases. Skip 8b.\n- **Need back-compat** — proceed to 8b to identify which renames cross the package boundary; only those get aliases.\n\n### 8b. If back-compat is required, classify each rename\n\nBack-compat only matters for symbols exported across the **package boundary**. Internal renames within a package are noise to alias.\n\n- **Package-boundary export (public API)** — the symbol is reachable from outside the package via its entry points. Determine this by checking the `package.json` `exports` \u002F `main` \u002F `module` \u002F `types` fields and tracing what each entry point re-exports (typically `src\u002Findex.ts`). If reachable via any entry point → **alias required**.\n- **Internal-only export** — the `export` keyword is used between files within the same package, but the symbol is not reachable from any entry point. **No alias.** Rename freely and update intra-package call sites.\n\nFor monorepos, repeat this check per package — a rename in `packages\u002Ffoo\u002Fsrc\u002Futils.ts` may be internal to `foo` even if `foo`'s entry point exports many other symbols.\n\nFor each package-boundary rename, keep a deprecated alias alongside the new name in the entry point:\n\n```ts\nexport { newName } from \".\u002Fimpl\";\n\u002F** @deprecated Use `newName` instead. *\u002F\nexport { newName as oldName } from \".\u002Fimpl\";\n```\n\nUpdate intra-package callers to use the new name. Document the renames in the changelog if the project tracks one.\n\nSee `node_modules\u002Fkonsistent\u002Fdocs\u002Fguides\u002Ffixing-violations.md` for the rationale behind the package-boundary distinction.\n\nFix in this order:\n\n1. All trivial violations from step 6.\n2. The \"Attempt\" non-trivial violations from step 7, with the user's context.\n\nGroup fixes by file when possible to minimize churn. Do not re-run konsistent between individual fixes — batch the edits.\n\nWhen done, re-run the CLI:\n\n```bash\n\u003Crunner> konsistent check --format=json --max-diagnostics=1000\n```\n\nReport:\n- Violations resolved.\n- Violations remaining (deferred + any new ones introduced).\n- If new violations appeared, investigate before declaring complete.\n\nRun the project's checks to ensure code edits did not break anything else (read `package.json` for the actual scripts):\n\n```bash\npnpm typecheck\npnpm test\npnpm check\n```\n\n---\n\n## Important guardrails\n\n- **Never** edit `konsistent.json` to silence violations *after* step 4 without going back through step 3. The point of the rule-vs-code decision is to make it deliberate.\n- **Never** skip the confirmation gate at step 5. Even when there are zero high-count rules and no config changes, ask before mass-editing code.\n- **Never** classify a violation as trivial just because the message looks short. Read the file first; verify the target symbol\u002Ftype\u002Ffile actually exists.\n- When fixing renames, search for all references in the codebase and update them — do not leave dangling imports.\n- If running konsistent reveals zero violations, report that and stop. There is nothing to fix.\n",{"data":37,"body":38},{"name":4,"description":6},{"type":39,"children":40},"root",[41,49,79,107,114,229,234,238,244,249,351,364,428,464,538,559,564,570,591,616,635,654,660,672,677,713,718,775,785,873,878,883,896,929,973,978,1005,1010,1016,1028,1073,1084,1092,1104,1109,1115,1134,1139,1176,1187,1193,1198,1224,1236,1306,1311,1317,1327,1334,1339,1362,1368,1380,1468,1496,1501,1631,1636,1648,1653,1666,1671,1676,1721,1726,1744,1756,1799,1802,1808,1863],{"type":42,"tag":43,"props":44,"children":45},"element","h1",{"id":4},[46],{"type":47,"value":48},"text","konsistent — Fix Violations",{"type":42,"tag":50,"props":51,"children":52},"p",{},[53,55,62,64,70,72,77],{"type":47,"value":54},"Run ",{"type":42,"tag":56,"props":57,"children":59},"code",{"className":58},[],[60],{"type":47,"value":61},"konsistent",{"type":47,"value":63},", surface what is broken, and resolve violations. The hard part is not the mechanical fix — it is deciding ",{"type":42,"tag":65,"props":66,"children":67},"strong",{},[68],{"type":47,"value":69},"whether the rule or the code is wrong",{"type":47,"value":71}," when a single rule has many violations, and ",{"type":42,"tag":65,"props":73,"children":74},{},[75],{"type":47,"value":76},"which non-trivial violations are worth attempting",{"type":47,"value":78}," versus deferring.",{"type":42,"tag":50,"props":80,"children":81},{},[82,84,90,92,97,99,105],{"type":47,"value":83},"The canonical workflow and per-predicate triage rubric are documented in ",{"type":42,"tag":56,"props":85,"children":87},{"className":86},[],[88],{"type":47,"value":89},"node_modules\u002Fkonsistent\u002Fdocs\u002Fguides\u002Ffixing-violations.md",{"type":47,"value":91},". ",{"type":42,"tag":65,"props":93,"children":94},{},[95],{"type":47,"value":96},"Read it before classifying violations.",{"type":47,"value":98}," This skill layers strict gating, user confirmation, and ",{"type":42,"tag":56,"props":100,"children":102},{"className":101},[],[103],{"type":47,"value":104},"AskUserQuestion",{"type":47,"value":106}," interactions on top of that workflow.",{"type":42,"tag":108,"props":109,"children":111},"h2",{"id":110},"workflow-strict-order",[112],{"type":47,"value":113},"Workflow (strict order)",{"type":42,"tag":115,"props":116,"children":117},"ol",{},[118,131,142,153,178,196,207,218],{"type":42,"tag":119,"props":120,"children":121},"li",{},[122,129],{"type":42,"tag":123,"props":124,"children":126},"a",{"href":125},"#1-run-the-cli",[127],{"type":47,"value":128},"Run the CLI",{"type":47,"value":130}," and collect all violations as JSON.",{"type":42,"tag":119,"props":132,"children":133},{},[134,140],{"type":42,"tag":123,"props":135,"children":137},{"href":136},"#2-group-violations-by-rule",[138],{"type":47,"value":139},"Group violations by rule",{"type":47,"value":141}," and identify rules with high violation counts.",{"type":42,"tag":119,"props":143,"children":144},{},[145,151],{"type":42,"tag":123,"props":146,"children":148},{"href":147},"#3-ask-the-user-rule-vs-code",[149],{"type":47,"value":150},"For each high-count rule, ask the user",{"type":47,"value":152}," whether to keep, change, or remove the rule.",{"type":42,"tag":119,"props":154,"children":155},{},[156,168,170,176],{"type":42,"tag":123,"props":157,"children":159},{"href":158},"#4-update-konsistentjson-via-konsistent-config",[160,162],{"type":47,"value":161},"Update ",{"type":42,"tag":56,"props":163,"children":165},{"className":164},[],[166],{"type":47,"value":167},"konsistent.json",{"type":47,"value":169}," via the ",{"type":42,"tag":56,"props":171,"children":173},{"className":172},[],[174],{"type":47,"value":175},"konsistent-config",{"type":47,"value":177}," skill if any rules need changes.",{"type":42,"tag":119,"props":179,"children":180},{},[181,187,189,194],{"type":42,"tag":123,"props":182,"children":184},{"href":183},"#5-re-run-and-confirm-before-fixing",[185],{"type":47,"value":186},"Re-run the CLI",{"type":47,"value":188}," to refresh the violation list, then ",{"type":42,"tag":65,"props":190,"children":191},{},[192],{"type":47,"value":193},"stop and ask for explicit confirmation",{"type":47,"value":195}," before modifying any code.",{"type":42,"tag":119,"props":197,"children":198},{},[199,205],{"type":42,"tag":123,"props":200,"children":202},{"href":201},"#6-triage-trivial-vs-non-trivial",[203],{"type":47,"value":204},"Triage remaining violations",{"type":47,"value":206}," into trivial vs. non-trivial.",{"type":42,"tag":119,"props":208,"children":209},{},[210,216],{"type":42,"tag":123,"props":211,"children":213},{"href":212},"#7-surface-non-trivial-violations",[214],{"type":47,"value":215},"Surface non-trivial violations",{"type":47,"value":217}," to the user and let them decide how to handle each.",{"type":42,"tag":119,"props":219,"children":220},{},[221,227],{"type":42,"tag":123,"props":222,"children":224},{"href":223},"#8-fix-approved-violations",[225],{"type":47,"value":226},"Fix the approved violations",{"type":47,"value":228}," and re-run the CLI to verify.",{"type":42,"tag":50,"props":230,"children":231},{},[232],{"type":47,"value":233},"Do not skip steps. Do not collapse them. The asks for user input at steps 3, 5, and 7 are non-negotiable.",{"type":42,"tag":235,"props":236,"children":237},"hr",{},[],{"type":42,"tag":108,"props":239,"children":241},{"id":240},"_1-run-the-cli",[242],{"type":47,"value":243},"1. Run the CLI",{"type":42,"tag":50,"props":245,"children":246},{},[247],{"type":47,"value":248},"Determine the invocation in this order:",{"type":42,"tag":115,"props":250,"children":251},{},[252,304,339],{"type":42,"tag":119,"props":253,"children":254},{},[255,257,263,265,270,272,278,280,286,288,294,296,302],{"type":47,"value":256},"If ",{"type":42,"tag":56,"props":258,"children":260},{"className":259},[],[261],{"type":47,"value":262},"package.json",{"type":47,"value":264}," has a ",{"type":42,"tag":56,"props":266,"children":268},{"className":267},[],[269],{"type":47,"value":61},{"type":47,"value":271}," script → use the project's package manager: ",{"type":42,"tag":56,"props":273,"children":275},{"className":274},[],[276],{"type":47,"value":277},"pnpm konsistent",{"type":47,"value":279},", ",{"type":42,"tag":56,"props":281,"children":283},{"className":282},[],[284],{"type":47,"value":285},"npm run konsistent",{"type":47,"value":287},", or ",{"type":42,"tag":56,"props":289,"children":291},{"className":290},[],[292],{"type":47,"value":293},"yarn konsistent",{"type":47,"value":295}," (match the lockfile \u002F ",{"type":42,"tag":56,"props":297,"children":299},{"className":298},[],[300],{"type":47,"value":301},"packageManager",{"type":47,"value":303}," field).",{"type":42,"tag":119,"props":305,"children":306},{},[307,309,314,316,322,324,330,331,337],{"type":47,"value":308},"Else, if ",{"type":42,"tag":56,"props":310,"children":312},{"className":311},[],[313],{"type":47,"value":61},{"type":47,"value":315}," is in ",{"type":42,"tag":56,"props":317,"children":319},{"className":318},[],[320],{"type":47,"value":321},"devDependencies",{"type":47,"value":323}," → run via the package runner: ",{"type":42,"tag":56,"props":325,"children":327},{"className":326},[],[328],{"type":47,"value":329},"pnpm exec konsistent",{"type":47,"value":279},{"type":42,"tag":56,"props":332,"children":334},{"className":333},[],[335],{"type":47,"value":336},"npx konsistent",{"type":47,"value":338},", etc.",{"type":42,"tag":119,"props":340,"children":341},{},[342,344,349],{"type":47,"value":343},"Else, fall back to ",{"type":42,"tag":56,"props":345,"children":347},{"className":346},[],[348],{"type":47,"value":336},{"type":47,"value":350},".",{"type":42,"tag":50,"props":352,"children":353},{},[354,356,362],{"type":47,"value":355},"Run the ",{"type":42,"tag":56,"props":357,"children":359},{"className":358},[],[360],{"type":47,"value":361},"check",{"type":47,"value":363}," command with JSON output and a high diagnostic cap so nothing is truncated:",{"type":42,"tag":365,"props":366,"children":371},"pre",{"className":367,"code":368,"language":369,"meta":370,"style":370},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Crunner> konsistent check --format=json --max-diagnostics=1000\n","bash","",[372],{"type":42,"tag":56,"props":373,"children":374},{"__ignoreMap":370},[375],{"type":42,"tag":376,"props":377,"children":380},"span",{"class":378,"line":379},"line",1,[381,387,393,398,403,408,414,419,423],{"type":42,"tag":376,"props":382,"children":384},{"style":383},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[385],{"type":47,"value":386},"\u003C",{"type":42,"tag":376,"props":388,"children":390},{"style":389},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[391],{"type":47,"value":392},"runner",{"type":42,"tag":376,"props":394,"children":395},{"style":383},[396],{"type":47,"value":397},">",{"type":42,"tag":376,"props":399,"children":400},{"style":389},[401],{"type":47,"value":402}," konsistent check --format",{"type":42,"tag":376,"props":404,"children":405},{"style":383},[406],{"type":47,"value":407},"=",{"type":42,"tag":376,"props":409,"children":411},{"style":410},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[412],{"type":47,"value":413},"json",{"type":42,"tag":376,"props":415,"children":416},{"style":389},[417],{"type":47,"value":418}," --max-diagnostics",{"type":42,"tag":376,"props":420,"children":421},{"style":383},[422],{"type":47,"value":407},{"type":42,"tag":376,"props":424,"children":425},{"style":410},[426],{"type":47,"value":427},"1000\n",{"type":42,"tag":50,"props":429,"children":430},{},[431,433,439,441,447,449,454,456,462],{"type":47,"value":432},"Note: when invoking via an ",{"type":42,"tag":56,"props":434,"children":436},{"className":435},[],[437],{"type":47,"value":438},"npm",{"type":47,"value":440},"\u002F",{"type":42,"tag":56,"props":442,"children":444},{"className":443},[],[445],{"type":47,"value":446},"pnpm",{"type":47,"value":448}," script that already wraps ",{"type":42,"tag":56,"props":450,"children":452},{"className":451},[],[453],{"type":47,"value":61},{"type":47,"value":455},", you may need ",{"type":42,"tag":56,"props":457,"children":459},{"className":458},[],[460],{"type":47,"value":461},"--",{"type":47,"value":463}," to forward flags:",{"type":42,"tag":365,"props":465,"children":467},{"className":367,"code":466,"language":369,"meta":370,"style":370},"pnpm konsistent check --format=json --max-diagnostics=1000\n# OR if the script runs konsistent without args:\npnpm konsistent -- check --format=json --max-diagnostics=1000\n",[468],{"type":42,"tag":56,"props":469,"children":470},{"__ignoreMap":370},[471,499,509],{"type":42,"tag":376,"props":472,"children":473},{"class":378,"line":379},[474,479,484,489,494],{"type":42,"tag":376,"props":475,"children":477},{"style":476},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[478],{"type":47,"value":446},{"type":42,"tag":376,"props":480,"children":481},{"style":410},[482],{"type":47,"value":483}," konsistent",{"type":42,"tag":376,"props":485,"children":486},{"style":410},[487],{"type":47,"value":488}," check",{"type":42,"tag":376,"props":490,"children":491},{"style":410},[492],{"type":47,"value":493}," --format=json",{"type":42,"tag":376,"props":495,"children":496},{"style":410},[497],{"type":47,"value":498}," --max-diagnostics=1000\n",{"type":42,"tag":376,"props":500,"children":502},{"class":378,"line":501},2,[503],{"type":42,"tag":376,"props":504,"children":506},{"style":505},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[507],{"type":47,"value":508},"# OR if the script runs konsistent without args:\n",{"type":42,"tag":376,"props":510,"children":512},{"class":378,"line":511},3,[513,517,521,526,530,534],{"type":42,"tag":376,"props":514,"children":515},{"style":476},[516],{"type":47,"value":446},{"type":42,"tag":376,"props":518,"children":519},{"style":410},[520],{"type":47,"value":483},{"type":42,"tag":376,"props":522,"children":523},{"style":410},[524],{"type":47,"value":525}," --",{"type":42,"tag":376,"props":527,"children":528},{"style":410},[529],{"type":47,"value":488},{"type":42,"tag":376,"props":531,"children":532},{"style":410},[533],{"type":47,"value":493},{"type":42,"tag":376,"props":535,"children":536},{"style":410},[537],{"type":47,"value":498},{"type":42,"tag":50,"props":539,"children":540},{},[541,543,549,551,557],{"type":47,"value":542},"The JSON output is an array of ",{"type":42,"tag":56,"props":544,"children":546},{"className":545},[],[547],{"type":47,"value":548},"{ severity, conventionName, filePath, predicateName, message }",{"type":47,"value":550},". Exit code is non-zero when errors are present; that is expected — read the JSON regardless. See ",{"type":42,"tag":56,"props":552,"children":554},{"className":553},[],[555],{"type":47,"value":556},"node_modules\u002Fkonsistent\u002Fdocs\u002Freference\u002Fcli.md",{"type":47,"value":558}," for the full output schema.",{"type":42,"tag":50,"props":560,"children":561},{},[562],{"type":47,"value":563},"If the command fails for reasons other than violations (config not found, invalid config, missing dependency), stop and resolve the underlying issue first. Do not proceed.",{"type":42,"tag":108,"props":565,"children":567},{"id":566},"_2-group-violations-by-rule",[568],{"type":47,"value":569},"2. Group violations by rule",{"type":42,"tag":50,"props":571,"children":572},{},[573,575,581,583,589],{"type":47,"value":574},"Aggregate the violations by ",{"type":42,"tag":56,"props":576,"children":578},{"className":577},[],[579],{"type":47,"value":580},"conventionName",{"type":47,"value":582}," (and optionally ",{"type":42,"tag":56,"props":584,"children":586},{"className":585},[],[587],{"type":47,"value":588},"predicateName",{"type":47,"value":590},"). Compute a count per group. Report the totals to the user briefly:",{"type":42,"tag":592,"props":593,"children":594},"blockquote",{},[595],{"type":42,"tag":50,"props":596,"children":597},{},[598,600,606,608,614],{"type":47,"value":599},"Found N violations across M conventions. Rule ",{"type":42,"tag":56,"props":601,"children":603},{"className":602},[],[604],{"type":47,"value":605},"X",{"type":47,"value":607}," has K violations; rule ",{"type":42,"tag":56,"props":609,"children":611},{"className":610},[],[612],{"type":47,"value":613},"Y",{"type":47,"value":615}," has J violations; …",{"type":42,"tag":50,"props":617,"children":618},{},[619,621,626,628,633],{"type":47,"value":620},"A rule is \"high-count\" when it has roughly ",{"type":42,"tag":65,"props":622,"children":623},{},[624],{"type":47,"value":625},"5+ violations",{"type":47,"value":627}," OR represents ",{"type":42,"tag":65,"props":629,"children":630},{},[631],{"type":47,"value":632},"more than half",{"type":47,"value":634}," of the violating files for that rule's path pattern. Use judgment — a rule with 4 violations across 4 files where the path pattern only matches 5 files is also high-count.",{"type":42,"tag":50,"props":636,"children":637},{},[638,640,645,647,652],{"type":47,"value":639},"Why this matters: a rule with 1–2 violations almost always means the ",{"type":42,"tag":641,"props":642,"children":643},"em",{},[644],{"type":47,"value":56},{"type":47,"value":646}," is the outlier. A rule with many violations often means the ",{"type":42,"tag":641,"props":648,"children":649},{},[650],{"type":47,"value":651},"rule",{"type":47,"value":653}," itself encodes a convention the codebase has not actually adopted — fixing the code without questioning the rule produces churn and may overwrite the team's real convention.",{"type":42,"tag":108,"props":655,"children":657},{"id":656},"_3-ask-the-user-rule-vs-code",[658],{"type":47,"value":659},"3. Ask the user: rule vs. code",{"type":42,"tag":50,"props":661,"children":662},{},[663,665,670],{"type":47,"value":664},"For ",{"type":42,"tag":65,"props":666,"children":667},{},[668],{"type":47,"value":669},"each high-count rule",{"type":47,"value":671},", explicitly ask the user to choose. Use the AskUserQuestion tool with concrete options. Do not infer — the user owns this decision.",{"type":42,"tag":50,"props":673,"children":674},{},[675],{"type":47,"value":676},"Frame the question with:",{"type":42,"tag":678,"props":679,"children":680},"ul",{},[681,686,703,708],{"type":42,"tag":119,"props":682,"children":683},{},[684],{"type":47,"value":685},"The rule's name \u002F description \u002F what it enforces.",{"type":42,"tag":119,"props":687,"children":688},{},[689,694,696,701],{"type":42,"tag":65,"props":690,"children":691},{},[692],{"type":47,"value":693},"The codebase distribution",{"type":47,"value":695}," — count how many of the ",{"type":42,"tag":641,"props":697,"children":698},{},[699],{"type":47,"value":700},"matched",{"type":47,"value":702}," files conform vs. violate, and report the split (e.g. \"12 of 25 matched packages use pattern A; 13 use pattern B — codebase is roughly 50\u002F50\"). This framing dramatically improves the user's ability to decide.",{"type":42,"tag":119,"props":704,"children":705},{},[706],{"type":47,"value":707},"A short summary of what convention the violating files actually follow (read 2–3 of them — what naming\u002Fstructure pattern do they share?).",{"type":42,"tag":119,"props":709,"children":710},{},[711],{"type":47,"value":712},"A few representative examples (file paths or symbol names from each pattern).",{"type":42,"tag":50,"props":714,"children":715},{},[716],{"type":47,"value":717},"Offer at minimum these options:",{"type":42,"tag":678,"props":719,"children":720},{},[721,731,747,757],{"type":42,"tag":119,"props":722,"children":723},{},[724,729],{"type":42,"tag":65,"props":725,"children":726},{},[727],{"type":47,"value":728},"Keep the rule, fix the code",{"type":47,"value":730}," — code is the outlier; proceed to fix violations.",{"type":42,"tag":119,"props":732,"children":733},{},[734,739,741,746],{"type":42,"tag":65,"props":735,"children":736},{},[737],{"type":47,"value":738},"Change the rule to match what the code does",{"type":47,"value":740}," — the violating pattern is the real convention; update ",{"type":42,"tag":56,"props":742,"children":744},{"className":743},[],[745],{"type":47,"value":167},{"type":47,"value":350},{"type":42,"tag":119,"props":748,"children":749},{},[750,755],{"type":42,"tag":65,"props":751,"children":752},{},[753],{"type":47,"value":754},"Remove the rule",{"type":47,"value":756}," — the convention isn't worth enforcing.",{"type":42,"tag":119,"props":758,"children":759},{},[760,765,767,773],{"type":42,"tag":65,"props":761,"children":762},{},[763],{"type":47,"value":764},"Other",{"type":47,"value":766}," (free-text — e.g. relax to ",{"type":42,"tag":56,"props":768,"children":770},{"className":769},[],[771],{"type":47,"value":772},"severity: warning",{"type":47,"value":774},", narrow the path pattern, add an exception via path negation).",{"type":42,"tag":50,"props":776,"children":777},{},[778,783],{"type":42,"tag":65,"props":779,"children":780},{},[781],{"type":47,"value":782},"Surface meaningful sub-options",{"type":47,"value":784}," when \"change the rule\" admits more than one specific shape. Don't collapse them. Examples of sub-options worth presenting:",{"type":42,"tag":678,"props":786,"children":787},{},[788,808,852],{"type":42,"tag":119,"props":789,"children":790},{},[791,793,799,801,807],{"type":47,"value":792},"File-naming variants: ",{"type":42,"tag":56,"props":794,"children":796},{"className":795},[],[797],{"type":47,"value":798},"${name}-options.ts",{"type":47,"value":800}," vs ",{"type":42,"tag":56,"props":802,"children":804},{"className":803},[],[805],{"type":47,"value":806},"${name}-model-options.ts",{"type":47,"value":350},{"type":42,"tag":119,"props":809,"children":810},{},[811,813,818,820,826,828,834,836,842,844,850],{"type":47,"value":812},"A ",{"type":42,"tag":65,"props":814,"children":815},{},[816],{"type":47,"value":817},"hybrid",{"type":47,"value":819}," rule that splits by a sub-pattern (e.g. \"single-word providers ending in ",{"type":42,"tag":56,"props":821,"children":823},{"className":822},[],[824],{"type":47,"value":825},"ai",{"type":47,"value":827}," use flat-case; everything else uses camelCase\") — this is encodable via ",{"type":42,"tag":56,"props":829,"children":831},{"className":830},[],[832],{"type":47,"value":833},"kebabToCamelMap",{"type":47,"value":835}," \u002F ",{"type":42,"tag":56,"props":837,"children":839},{"className":838},[],[840],{"type":47,"value":841},"kebabToPascalMap",{"type":47,"value":843}," overrides or ",{"type":42,"tag":56,"props":845,"children":847},{"className":846},[],[848],{"type":47,"value":849},"placeholderSatisfies",{"type":47,"value":851}," constraints.",{"type":42,"tag":119,"props":853,"children":854},{},[855,857,863,865,871],{"type":47,"value":856},"Mixed-severity (",{"type":42,"tag":56,"props":858,"children":860},{"className":859},[],[861],{"type":47,"value":862},"error",{"type":47,"value":864}," for the must-have, ",{"type":42,"tag":56,"props":866,"children":868},{"className":867},[],[869],{"type":47,"value":870},"warning",{"type":47,"value":872}," for the nice-to-have).",{"type":42,"tag":50,"props":874,"children":875},{},[876],{"type":47,"value":877},"If the user picks \"change\", \"remove\", or \"other\", capture the specifics needed to execute the change in step 4.",{"type":42,"tag":50,"props":879,"children":880},{},[881],{"type":47,"value":882},"Skip this step for low-count rules — assume code is wrong and fix in step 8.",{"type":42,"tag":108,"props":884,"children":886},{"id":885},"_4-update-konsistentjson-via-konsistent-config",[887,889,894],{"type":47,"value":888},"4. Update ",{"type":42,"tag":56,"props":890,"children":892},{"className":891},[],[893],{"type":47,"value":167},{"type":47,"value":895}," via konsistent-config",{"type":42,"tag":50,"props":897,"children":898},{},[899,901,913,915,920,922,927],{"type":47,"value":900},"If any rule needs to change based on step 3 decisions, ",{"type":42,"tag":65,"props":902,"children":903},{},[904,906,911],{"type":47,"value":905},"defer to the ",{"type":42,"tag":56,"props":907,"children":909},{"className":908},[],[910],{"type":47,"value":175},{"type":47,"value":912}," skill",{"type":47,"value":914}," for the actual edits. That skill knows the predicate catalog, path placeholder syntax, case map overrides, conditional\u002Fiterative blocks, and the project conventions for ",{"type":42,"tag":56,"props":916,"children":918},{"className":917},[],[919],{"type":47,"value":167},{"type":47,"value":921},". Do not edit ",{"type":42,"tag":56,"props":923,"children":925},{"className":924},[],[926],{"type":47,"value":167},{"type":47,"value":928}," ad-hoc here.",{"type":42,"tag":50,"props":930,"children":931},{},[932,934,940,942,948,950,956,958,963,965,971],{"type":47,"value":933},"When delegating, hand over: the rule name(s) being changed, the user's decision, and the concrete change (e.g. \"change ",{"type":42,"tag":56,"props":935,"children":937},{"className":936},[],[938],{"type":47,"value":939},"exportFunctions",{"type":47,"value":941}," name template from ",{"type":42,"tag":56,"props":943,"children":945},{"className":944},[],[946],{"type":47,"value":947},"${name.toPascalCase()}Service",{"type":47,"value":949}," to ",{"type":42,"tag":56,"props":951,"children":953},{"className":952},[],[954],{"type":47,"value":955},"create${name.toPascalCase()}Service",{"type":47,"value":957},"\", \"add ",{"type":42,"tag":56,"props":959,"children":961},{"className":960},[],[962],{"type":47,"value":772},{"type":47,"value":964},"\", \"add path negation for ",{"type":42,"tag":56,"props":966,"children":968},{"className":967},[],[969],{"type":47,"value":970},"packages\u002Ftest-utils",{"type":47,"value":972},"\").",{"type":42,"tag":50,"props":974,"children":975},{},[976],{"type":47,"value":977},"After the config is updated, validate:",{"type":42,"tag":365,"props":979,"children":981},{"className":367,"code":980,"language":369,"meta":370,"style":370},"\u003Crunner> konsistent validate\n",[982],{"type":42,"tag":56,"props":983,"children":984},{"__ignoreMap":370},[985],{"type":42,"tag":376,"props":986,"children":987},{"class":378,"line":379},[988,992,996,1000],{"type":42,"tag":376,"props":989,"children":990},{"style":383},[991],{"type":47,"value":386},{"type":42,"tag":376,"props":993,"children":994},{"style":389},[995],{"type":47,"value":392},{"type":42,"tag":376,"props":997,"children":998},{"style":383},[999],{"type":47,"value":397},{"type":42,"tag":376,"props":1001,"children":1002},{"style":389},[1003],{"type":47,"value":1004}," konsistent validate\n",{"type":42,"tag":50,"props":1006,"children":1007},{},[1008],{"type":47,"value":1009},"Fix any config errors before continuing.",{"type":42,"tag":108,"props":1011,"children":1013},{"id":1012},"_5-re-run-and-confirm-before-fixing",[1014],{"type":47,"value":1015},"5. Re-run and confirm before fixing",{"type":42,"tag":50,"props":1017,"children":1018},{},[1019,1021,1026],{"type":47,"value":1020},"After config changes (or after step 3 if no changes were needed), ",{"type":42,"tag":65,"props":1022,"children":1023},{},[1024],{"type":47,"value":1025},"re-run the CLI",{"type":47,"value":1027}," to get a fresh violation list reflecting the new rules:",{"type":42,"tag":365,"props":1029,"children":1030},{"className":367,"code":368,"language":369,"meta":370,"style":370},[1031],{"type":42,"tag":56,"props":1032,"children":1033},{"__ignoreMap":370},[1034],{"type":42,"tag":376,"props":1035,"children":1036},{"class":378,"line":379},[1037,1041,1045,1049,1053,1057,1061,1065,1069],{"type":42,"tag":376,"props":1038,"children":1039},{"style":383},[1040],{"type":47,"value":386},{"type":42,"tag":376,"props":1042,"children":1043},{"style":389},[1044],{"type":47,"value":392},{"type":42,"tag":376,"props":1046,"children":1047},{"style":383},[1048],{"type":47,"value":397},{"type":42,"tag":376,"props":1050,"children":1051},{"style":389},[1052],{"type":47,"value":402},{"type":42,"tag":376,"props":1054,"children":1055},{"style":383},[1056],{"type":47,"value":407},{"type":42,"tag":376,"props":1058,"children":1059},{"style":410},[1060],{"type":47,"value":413},{"type":42,"tag":376,"props":1062,"children":1063},{"style":389},[1064],{"type":47,"value":418},{"type":42,"tag":376,"props":1066,"children":1067},{"style":383},[1068],{"type":47,"value":407},{"type":42,"tag":376,"props":1070,"children":1071},{"style":410},[1072],{"type":47,"value":427},{"type":42,"tag":50,"props":1074,"children":1075},{},[1076,1078,1082],{"type":47,"value":1077},"Report the updated count to the user. Then ",{"type":42,"tag":65,"props":1079,"children":1080},{},[1081],{"type":47,"value":193},{"type":47,"value":1083}," before touching any code:",{"type":42,"tag":592,"props":1085,"children":1086},{},[1087],{"type":42,"tag":50,"props":1088,"children":1089},{},[1090],{"type":47,"value":1091},"\"Ready to start fixing N code violations. Proceed?\"",{"type":42,"tag":50,"props":1093,"children":1094},{},[1095,1097,1102],{"type":47,"value":1096},"Use AskUserQuestion with a clear yes\u002Fno. ",{"type":42,"tag":65,"props":1098,"children":1099},{},[1100],{"type":47,"value":1101},"Do not begin code edits until the user confirms.",{"type":47,"value":1103}," This gate is the user's last chance to review the rule set before mass changes.",{"type":42,"tag":50,"props":1105,"children":1106},{},[1107],{"type":47,"value":1108},"If the user says no or wants to adjust further, return to step 3 or 4.",{"type":42,"tag":108,"props":1110,"children":1112},{"id":1111},"_6-triage-trivial-vs-non-trivial",[1113],{"type":47,"value":1114},"6. Triage: trivial vs. non-trivial",{"type":42,"tag":50,"props":1116,"children":1117},{},[1118,1120,1132],{"type":47,"value":1119},"Once confirmed, classify each remaining violation. ",{"type":42,"tag":65,"props":1121,"children":1122},{},[1123,1125,1130],{"type":47,"value":1124},"Read ",{"type":42,"tag":56,"props":1126,"children":1128},{"className":1127},[],[1129],{"type":47,"value":89},{"type":47,"value":1131}," for the per-predicate triage rubric and the search heuristics",{"type":47,"value":1133}," before classifying.",{"type":42,"tag":50,"props":1135,"children":1136},{},[1137],{"type":47,"value":1138},"The headline rules:",{"type":42,"tag":678,"props":1140,"children":1141},{},[1142,1166],{"type":42,"tag":119,"props":1143,"children":1144},{},[1145,1150,1152,1157,1159,1164],{"type":42,"tag":65,"props":1146,"children":1147},{},[1148],{"type":47,"value":1149},"Search the codebase first.",{"type":47,"value":1151}," A \"missing\" file or export reported by ",{"type":42,"tag":56,"props":1153,"children":1155},{"className":1154},[],[1156],{"type":47,"value":61},{"type":47,"value":1158}," very often already exists under a different name, in a different file, or in a different casing. These are still ",{"type":42,"tag":65,"props":1160,"children":1161},{},[1162],{"type":47,"value":1163},"trivial",{"type":47,"value":1165}," fixes — rename, move, or re-export. Before marking anything non-trivial, search by exact name, case variants, stripped prefixes\u002Fsuffixes, distinctive word stems, sibling locations, and mirror existing successful matches.",{"type":42,"tag":119,"props":1167,"children":1168},{},[1169,1174],{"type":42,"tag":65,"props":1170,"children":1171},{},[1172],{"type":47,"value":1173},"When in doubt, classify as non-trivial.",{"type":47,"value":1175}," False positives in the trivial bucket are worse than in the non-trivial bucket — the former lead to bad code without user input. But do not classify as non-trivial without first searching: a quick grep often turns the violation trivial.",{"type":42,"tag":50,"props":1177,"children":1178},{},[1179,1181,1186],{"type":47,"value":1180},"The full per-predicate rubric (haveType, haveFiles, export\u002FexportConstants, exportTypes, exportFunctions, exportInterfaces, exportClasses, import\u002FimportTypes) lives in ",{"type":42,"tag":56,"props":1182,"children":1184},{"className":1183},[],[1185],{"type":47,"value":89},{"type":47,"value":350},{"type":42,"tag":108,"props":1188,"children":1190},{"id":1189},"_7-surface-non-trivial-violations",[1191],{"type":47,"value":1192},"7. Surface non-trivial violations",{"type":42,"tag":50,"props":1194,"children":1195},{},[1196],{"type":47,"value":1197},"Compile the non-trivial violations into a clear list. For each, include:",{"type":42,"tag":678,"props":1199,"children":1200},{},[1201,1206,1211],{"type":42,"tag":119,"props":1202,"children":1203},{},[1204],{"type":47,"value":1205},"File path and rule.",{"type":42,"tag":119,"props":1207,"children":1208},{},[1209],{"type":47,"value":1210},"The violation message.",{"type":42,"tag":119,"props":1212,"children":1213},{},[1214,1216,1222],{"type":47,"value":1215},"A one-line note on why it is non-trivial (e.g. \"type ",{"type":42,"tag":56,"props":1217,"children":1219},{"className":1218},[],[1220],{"type":47,"value":1221},"FooConfig",{"type":47,"value":1223}," does not exist anywhere in the repo\", \"would require splitting the existing class\").",{"type":42,"tag":50,"props":1225,"children":1226},{},[1227,1229,1234],{"type":47,"value":1228},"Present the list to the user and ask, ",{"type":42,"tag":65,"props":1230,"children":1231},{},[1232],{"type":47,"value":1233},"per violation or per group",{"type":47,"value":1235},", which they want to:",{"type":42,"tag":678,"props":1237,"children":1238},{},[1239,1279,1296],{"type":42,"tag":119,"props":1240,"children":1241},{},[1242,1247,1249],{"type":42,"tag":65,"props":1243,"children":1244},{},[1245],{"type":47,"value":1246},"Defer",{"type":47,"value":1248}," — leave for later. Offer two follow-ups:\n",{"type":42,"tag":678,"props":1250,"children":1251},{},[1252,1257],{"type":42,"tag":119,"props":1253,"children":1254},{},[1255],{"type":47,"value":1256},"Draft a GitHub issue title\u002Fbody capturing the work (the user opens it).",{"type":42,"tag":119,"props":1258,"children":1259},{},[1260,1270,1272,1277],{"type":42,"tag":65,"props":1261,"children":1262},{},[1263,1265],{"type":47,"value":1264},"Add path negation in ",{"type":42,"tag":56,"props":1266,"children":1268},{"className":1267},[],[1269],{"type":47,"value":167},{"type":47,"value":1271}," for the deferred files via the ",{"type":42,"tag":56,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":47,"value":175},{"type":47,"value":1278}," skill, so CI stays green and the rule still applies to all other matched files. Remove the negation when the deferred work lands.",{"type":42,"tag":119,"props":1280,"children":1281},{},[1282,1287,1289,1294],{"type":42,"tag":65,"props":1283,"children":1284},{},[1285],{"type":47,"value":1286},"Attempt",{"type":47,"value":1288}," — let the agent try; ",{"type":42,"tag":65,"props":1290,"children":1291},{},[1292],{"type":47,"value":1293},"prompt the user for additional context",{"type":47,"value":1295}," that would help (intended types, examples to mirror, references to similar code).",{"type":42,"tag":119,"props":1297,"children":1298},{},[1299,1304],{"type":42,"tag":65,"props":1300,"children":1301},{},[1302],{"type":47,"value":1303},"Skip",{"type":47,"value":1305}," — explicitly mark as won't-do (e.g. the rule will be relaxed instead — note this and return to step 4 if needed).",{"type":42,"tag":50,"props":1307,"children":1308},{},[1309],{"type":47,"value":1310},"Use AskUserQuestion for the decision. For \"Attempt\", actively prompt for context — do not silently start a non-trivial change without input.",{"type":42,"tag":108,"props":1312,"children":1314},{"id":1313},"_8-fix-approved-violations",[1315],{"type":47,"value":1316},"8. Fix approved violations",{"type":42,"tag":50,"props":1318,"children":1319},{},[1320,1325],{"type":42,"tag":65,"props":1321,"children":1322},{},[1323],{"type":47,"value":1324},"Before editing any public API",{"type":47,"value":1326},", decide on backward-compatibility for renamed exports. This is the most important decision at the start of this step — answer it once, then apply uniformly across the run.",{"type":42,"tag":1328,"props":1329,"children":1331},"h3",{"id":1330},"_8a-ask-is-the-project-in-a-breaking-change-window",[1332],{"type":47,"value":1333},"8a. Ask: is the project in a breaking-change window?",{"type":42,"tag":50,"props":1335,"children":1336},{},[1337],{"type":47,"value":1338},"Use AskUserQuestion. Frame it: \"Renames will affect package-boundary exports. Are breaking changes acceptable, or do we need to keep back-compat via deprecated aliases?\"",{"type":42,"tag":678,"props":1340,"children":1341},{},[1342,1352],{"type":42,"tag":119,"props":1343,"children":1344},{},[1345,1350],{"type":42,"tag":65,"props":1346,"children":1347},{},[1348],{"type":47,"value":1349},"Breaking changes acceptable",{"type":47,"value":1351}," (e.g. major-version bump, beta line, pre-1.0, internal-only project) — plain renames everywhere. No aliases. Skip 8b.",{"type":42,"tag":119,"props":1353,"children":1354},{},[1355,1360],{"type":42,"tag":65,"props":1356,"children":1357},{},[1358],{"type":47,"value":1359},"Need back-compat",{"type":47,"value":1361}," — proceed to 8b to identify which renames cross the package boundary; only those get aliases.",{"type":42,"tag":1328,"props":1363,"children":1365},{"id":1364},"_8b-if-back-compat-is-required-classify-each-rename",[1366],{"type":47,"value":1367},"8b. If back-compat is required, classify each rename",{"type":42,"tag":50,"props":1369,"children":1370},{},[1371,1373,1378],{"type":47,"value":1372},"Back-compat only matters for symbols exported across the ",{"type":42,"tag":65,"props":1374,"children":1375},{},[1376],{"type":47,"value":1377},"package boundary",{"type":47,"value":1379},". Internal renames within a package are noise to alias.",{"type":42,"tag":678,"props":1381,"children":1382},{},[1383,1443],{"type":42,"tag":119,"props":1384,"children":1385},{},[1386,1391,1393,1398,1400,1406,1407,1413,1414,1420,1421,1427,1429,1435,1437,1442],{"type":42,"tag":65,"props":1387,"children":1388},{},[1389],{"type":47,"value":1390},"Package-boundary export (public API)",{"type":47,"value":1392}," — the symbol is reachable from outside the package via its entry points. Determine this by checking the ",{"type":42,"tag":56,"props":1394,"children":1396},{"className":1395},[],[1397],{"type":47,"value":262},{"type":47,"value":1399}," ",{"type":42,"tag":56,"props":1401,"children":1403},{"className":1402},[],[1404],{"type":47,"value":1405},"exports",{"type":47,"value":835},{"type":42,"tag":56,"props":1408,"children":1410},{"className":1409},[],[1411],{"type":47,"value":1412},"main",{"type":47,"value":835},{"type":42,"tag":56,"props":1415,"children":1417},{"className":1416},[],[1418],{"type":47,"value":1419},"module",{"type":47,"value":835},{"type":42,"tag":56,"props":1422,"children":1424},{"className":1423},[],[1425],{"type":47,"value":1426},"types",{"type":47,"value":1428}," fields and tracing what each entry point re-exports (typically ",{"type":42,"tag":56,"props":1430,"children":1432},{"className":1431},[],[1433],{"type":47,"value":1434},"src\u002Findex.ts",{"type":47,"value":1436},"). If reachable via any entry point → ",{"type":42,"tag":65,"props":1438,"children":1439},{},[1440],{"type":47,"value":1441},"alias required",{"type":47,"value":350},{"type":42,"tag":119,"props":1444,"children":1445},{},[1446,1451,1453,1459,1461,1466],{"type":42,"tag":65,"props":1447,"children":1448},{},[1449],{"type":47,"value":1450},"Internal-only export",{"type":47,"value":1452}," — the ",{"type":42,"tag":56,"props":1454,"children":1456},{"className":1455},[],[1457],{"type":47,"value":1458},"export",{"type":47,"value":1460}," keyword is used between files within the same package, but the symbol is not reachable from any entry point. ",{"type":42,"tag":65,"props":1462,"children":1463},{},[1464],{"type":47,"value":1465},"No alias.",{"type":47,"value":1467}," Rename freely and update intra-package call sites.",{"type":42,"tag":50,"props":1469,"children":1470},{},[1471,1473,1479,1481,1487,1489,1494],{"type":47,"value":1472},"For monorepos, repeat this check per package — a rename in ",{"type":42,"tag":56,"props":1474,"children":1476},{"className":1475},[],[1477],{"type":47,"value":1478},"packages\u002Ffoo\u002Fsrc\u002Futils.ts",{"type":47,"value":1480}," may be internal to ",{"type":42,"tag":56,"props":1482,"children":1484},{"className":1483},[],[1485],{"type":47,"value":1486},"foo",{"type":47,"value":1488}," even if ",{"type":42,"tag":56,"props":1490,"children":1492},{"className":1491},[],[1493],{"type":47,"value":1486},{"type":47,"value":1495},"'s entry point exports many other symbols.",{"type":42,"tag":50,"props":1497,"children":1498},{},[1499],{"type":47,"value":1500},"For each package-boundary rename, keep a deprecated alias alongside the new name in the entry point:",{"type":42,"tag":365,"props":1502,"children":1506},{"className":1503,"code":1504,"language":1505,"meta":370,"style":370},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export { newName } from \".\u002Fimpl\";\n\u002F** @deprecated Use `newName` instead. *\u002F\nexport { newName as oldName } from \".\u002Fimpl\";\n","ts",[1507],{"type":42,"tag":56,"props":1508,"children":1509},{"__ignoreMap":370},[1510,1558,1582],{"type":42,"tag":376,"props":1511,"children":1512},{"class":378,"line":379},[1513,1518,1523,1528,1533,1538,1543,1548,1553],{"type":42,"tag":376,"props":1514,"children":1516},{"style":1515},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[1517],{"type":47,"value":1458},{"type":42,"tag":376,"props":1519,"children":1520},{"style":383},[1521],{"type":47,"value":1522}," {",{"type":42,"tag":376,"props":1524,"children":1525},{"style":389},[1526],{"type":47,"value":1527}," newName",{"type":42,"tag":376,"props":1529,"children":1530},{"style":383},[1531],{"type":47,"value":1532}," }",{"type":42,"tag":376,"props":1534,"children":1535},{"style":1515},[1536],{"type":47,"value":1537}," from",{"type":42,"tag":376,"props":1539,"children":1540},{"style":383},[1541],{"type":47,"value":1542}," \"",{"type":42,"tag":376,"props":1544,"children":1545},{"style":410},[1546],{"type":47,"value":1547},".\u002Fimpl",{"type":42,"tag":376,"props":1549,"children":1550},{"style":383},[1551],{"type":47,"value":1552},"\"",{"type":42,"tag":376,"props":1554,"children":1555},{"style":383},[1556],{"type":47,"value":1557},";\n",{"type":42,"tag":376,"props":1559,"children":1560},{"class":378,"line":501},[1561,1566,1571,1577],{"type":42,"tag":376,"props":1562,"children":1563},{"style":505},[1564],{"type":47,"value":1565},"\u002F** ",{"type":42,"tag":376,"props":1567,"children":1568},{"style":1515},[1569],{"type":47,"value":1570},"@",{"type":42,"tag":376,"props":1572,"children":1574},{"style":1573},"--shiki-light:#9C3EDA;--shiki-light-font-style:italic;--shiki-default:#C792EA;--shiki-default-font-style:italic;--shiki-dark:#C792EA;--shiki-dark-font-style:italic",[1575],{"type":47,"value":1576},"deprecated",{"type":42,"tag":376,"props":1578,"children":1579},{"style":505},[1580],{"type":47,"value":1581}," Use `newName` instead. *\u002F\n",{"type":42,"tag":376,"props":1583,"children":1584},{"class":378,"line":511},[1585,1589,1593,1597,1602,1607,1611,1615,1619,1623,1627],{"type":42,"tag":376,"props":1586,"children":1587},{"style":1515},[1588],{"type":47,"value":1458},{"type":42,"tag":376,"props":1590,"children":1591},{"style":383},[1592],{"type":47,"value":1522},{"type":42,"tag":376,"props":1594,"children":1595},{"style":389},[1596],{"type":47,"value":1527},{"type":42,"tag":376,"props":1598,"children":1599},{"style":1515},[1600],{"type":47,"value":1601}," as",{"type":42,"tag":376,"props":1603,"children":1604},{"style":389},[1605],{"type":47,"value":1606}," oldName",{"type":42,"tag":376,"props":1608,"children":1609},{"style":383},[1610],{"type":47,"value":1532},{"type":42,"tag":376,"props":1612,"children":1613},{"style":1515},[1614],{"type":47,"value":1537},{"type":42,"tag":376,"props":1616,"children":1617},{"style":383},[1618],{"type":47,"value":1542},{"type":42,"tag":376,"props":1620,"children":1621},{"style":410},[1622],{"type":47,"value":1547},{"type":42,"tag":376,"props":1624,"children":1625},{"style":383},[1626],{"type":47,"value":1552},{"type":42,"tag":376,"props":1628,"children":1629},{"style":383},[1630],{"type":47,"value":1557},{"type":42,"tag":50,"props":1632,"children":1633},{},[1634],{"type":47,"value":1635},"Update intra-package callers to use the new name. Document the renames in the changelog if the project tracks one.",{"type":42,"tag":50,"props":1637,"children":1638},{},[1639,1641,1646],{"type":47,"value":1640},"See ",{"type":42,"tag":56,"props":1642,"children":1644},{"className":1643},[],[1645],{"type":47,"value":89},{"type":47,"value":1647}," for the rationale behind the package-boundary distinction.",{"type":42,"tag":50,"props":1649,"children":1650},{},[1651],{"type":47,"value":1652},"Fix in this order:",{"type":42,"tag":115,"props":1654,"children":1655},{},[1656,1661],{"type":42,"tag":119,"props":1657,"children":1658},{},[1659],{"type":47,"value":1660},"All trivial violations from step 6.",{"type":42,"tag":119,"props":1662,"children":1663},{},[1664],{"type":47,"value":1665},"The \"Attempt\" non-trivial violations from step 7, with the user's context.",{"type":42,"tag":50,"props":1667,"children":1668},{},[1669],{"type":47,"value":1670},"Group fixes by file when possible to minimize churn. Do not re-run konsistent between individual fixes — batch the edits.",{"type":42,"tag":50,"props":1672,"children":1673},{},[1674],{"type":47,"value":1675},"When done, re-run the CLI:",{"type":42,"tag":365,"props":1677,"children":1678},{"className":367,"code":368,"language":369,"meta":370,"style":370},[1679],{"type":42,"tag":56,"props":1680,"children":1681},{"__ignoreMap":370},[1682],{"type":42,"tag":376,"props":1683,"children":1684},{"class":378,"line":379},[1685,1689,1693,1697,1701,1705,1709,1713,1717],{"type":42,"tag":376,"props":1686,"children":1687},{"style":383},[1688],{"type":47,"value":386},{"type":42,"tag":376,"props":1690,"children":1691},{"style":389},[1692],{"type":47,"value":392},{"type":42,"tag":376,"props":1694,"children":1695},{"style":383},[1696],{"type":47,"value":397},{"type":42,"tag":376,"props":1698,"children":1699},{"style":389},[1700],{"type":47,"value":402},{"type":42,"tag":376,"props":1702,"children":1703},{"style":383},[1704],{"type":47,"value":407},{"type":42,"tag":376,"props":1706,"children":1707},{"style":410},[1708],{"type":47,"value":413},{"type":42,"tag":376,"props":1710,"children":1711},{"style":389},[1712],{"type":47,"value":418},{"type":42,"tag":376,"props":1714,"children":1715},{"style":383},[1716],{"type":47,"value":407},{"type":42,"tag":376,"props":1718,"children":1719},{"style":410},[1720],{"type":47,"value":427},{"type":42,"tag":50,"props":1722,"children":1723},{},[1724],{"type":47,"value":1725},"Report:",{"type":42,"tag":678,"props":1727,"children":1728},{},[1729,1734,1739],{"type":42,"tag":119,"props":1730,"children":1731},{},[1732],{"type":47,"value":1733},"Violations resolved.",{"type":42,"tag":119,"props":1735,"children":1736},{},[1737],{"type":47,"value":1738},"Violations remaining (deferred + any new ones introduced).",{"type":42,"tag":119,"props":1740,"children":1741},{},[1742],{"type":47,"value":1743},"If new violations appeared, investigate before declaring complete.",{"type":42,"tag":50,"props":1745,"children":1746},{},[1747,1749,1754],{"type":47,"value":1748},"Run the project's checks to ensure code edits did not break anything else (read ",{"type":42,"tag":56,"props":1750,"children":1752},{"className":1751},[],[1753],{"type":47,"value":262},{"type":47,"value":1755}," for the actual scripts):",{"type":42,"tag":365,"props":1757,"children":1759},{"className":367,"code":1758,"language":369,"meta":370,"style":370},"pnpm typecheck\npnpm test\npnpm check\n",[1760],{"type":42,"tag":56,"props":1761,"children":1762},{"__ignoreMap":370},[1763,1775,1787],{"type":42,"tag":376,"props":1764,"children":1765},{"class":378,"line":379},[1766,1770],{"type":42,"tag":376,"props":1767,"children":1768},{"style":476},[1769],{"type":47,"value":446},{"type":42,"tag":376,"props":1771,"children":1772},{"style":410},[1773],{"type":47,"value":1774}," typecheck\n",{"type":42,"tag":376,"props":1776,"children":1777},{"class":378,"line":501},[1778,1782],{"type":42,"tag":376,"props":1779,"children":1780},{"style":476},[1781],{"type":47,"value":446},{"type":42,"tag":376,"props":1783,"children":1784},{"style":410},[1785],{"type":47,"value":1786}," test\n",{"type":42,"tag":376,"props":1788,"children":1789},{"class":378,"line":511},[1790,1794],{"type":42,"tag":376,"props":1791,"children":1792},{"style":476},[1793],{"type":47,"value":446},{"type":42,"tag":376,"props":1795,"children":1796},{"style":410},[1797],{"type":47,"value":1798}," check\n",{"type":42,"tag":235,"props":1800,"children":1801},{},[],{"type":42,"tag":108,"props":1803,"children":1805},{"id":1804},"important-guardrails",[1806],{"type":47,"value":1807},"Important guardrails",{"type":42,"tag":678,"props":1809,"children":1810},{},[1811,1835,1844,1853,1858],{"type":42,"tag":119,"props":1812,"children":1813},{},[1814,1819,1821,1826,1828,1833],{"type":42,"tag":65,"props":1815,"children":1816},{},[1817],{"type":47,"value":1818},"Never",{"type":47,"value":1820}," edit ",{"type":42,"tag":56,"props":1822,"children":1824},{"className":1823},[],[1825],{"type":47,"value":167},{"type":47,"value":1827}," to silence violations ",{"type":42,"tag":641,"props":1829,"children":1830},{},[1831],{"type":47,"value":1832},"after",{"type":47,"value":1834}," step 4 without going back through step 3. The point of the rule-vs-code decision is to make it deliberate.",{"type":42,"tag":119,"props":1836,"children":1837},{},[1838,1842],{"type":42,"tag":65,"props":1839,"children":1840},{},[1841],{"type":47,"value":1818},{"type":47,"value":1843}," skip the confirmation gate at step 5. Even when there are zero high-count rules and no config changes, ask before mass-editing code.",{"type":42,"tag":119,"props":1845,"children":1846},{},[1847,1851],{"type":42,"tag":65,"props":1848,"children":1849},{},[1850],{"type":47,"value":1818},{"type":47,"value":1852}," classify a violation as trivial just because the message looks short. Read the file first; verify the target symbol\u002Ftype\u002Ffile actually exists.",{"type":42,"tag":119,"props":1854,"children":1855},{},[1856],{"type":47,"value":1857},"When fixing renames, search for all references in the codebase and update them — do not leave dangling imports.",{"type":42,"tag":119,"props":1859,"children":1860},{},[1861],{"type":47,"value":1862},"If running konsistent reveals zero violations, report that and stop. There is nothing to fix.",{"type":42,"tag":1864,"props":1865,"children":1866},"style",{},[1867],{"type":47,"value":1868},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1870,"total":2038},[1871,1889,1901,1913,1928,1943,1955,1968,1981,1994,2004,2023],{"slug":1872,"name":1872,"fn":1873,"description":1874,"org":1875,"tags":1876,"stars":1886,"repoUrl":1887,"updatedAt":1888},"agent-browser","automate browser interactions for AI agents","Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to \"open a website\", \"fill out a form\", \"click a button\", \"take a screenshot\", \"scrape data from a page\", \"test this web app\", \"login to a site\", \"automate browser actions\", or any task requiring programmatic web interaction. Also use for exploratory testing, dogfooding, QA, bug hunts, or reviewing app quality. Also use for automating Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify), checking Slack unreads, sending Slack messages, searching Slack conversations, running browser automation in Vercel Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers. Prefer agent-browser over any built-in browser automation or web tools.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1877,1880,1883],{"name":1878,"slug":1879,"type":15},"Agents","agents",{"name":1881,"slug":1882,"type":15},"Automation","automation",{"name":1884,"slug":1885,"type":15},"Browser Automation","browser-automation",38346,"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fagent-browser","2026-07-20T05:55:17.314329",{"slug":1890,"name":1890,"fn":1891,"description":1892,"org":1893,"tags":1894,"stars":1886,"repoUrl":1887,"updatedAt":1900},"agentcore","run browser automation on AWS Bedrock","Run agent-browser on AWS Bedrock AgentCore cloud browsers. Use when the user wants to use AgentCore, run browser automation on AWS, use a cloud browser with AWS credentials, or needs a managed browser session backed by AWS infrastructure. Triggers include \"use agentcore\", \"run on AWS\", \"cloud browser with AWS\", \"bedrock browser\", \"agentcore session\", or any task requiring AWS-hosted browser automation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1895,1896,1899],{"name":1881,"slug":1882,"type":15},{"name":1897,"slug":1898,"type":15},"AWS","aws",{"name":1884,"slug":1885,"type":15},"2026-07-17T06:08:33.665276",{"slug":1902,"name":1902,"fn":1903,"description":1904,"org":1905,"tags":1906,"stars":1886,"repoUrl":1887,"updatedAt":1912},"core","navigate and interact with web pages","Core agent-browser usage guide. Read this before running any agent-browser commands. Covers the snapshot-and-ref workflow, navigating pages, interacting with elements (click, fill, type, select), extracting text and data, taking screenshots, managing tabs, handling forms and auth, waiting for content, running multiple browser sessions in parallel, and troubleshooting common failures. Use when the user asks to interact with a website, fill a form, click something, extract data, take a screenshot, log into a site, test a web app, or automate any browser task.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1907,1908,1909],{"name":1878,"slug":1879,"type":15},{"name":1884,"slug":1885,"type":15},{"name":1910,"slug":1911,"type":15},"Navigation","navigation","2026-07-26T05:47:42.378419",{"slug":1914,"name":1914,"fn":1915,"description":1916,"org":1917,"tags":1918,"stars":1886,"repoUrl":1887,"updatedAt":1927},"derive-client","reverse engineer internal APIs from browser traffic","Reverse-engineer a website's internal API by recording browser traffic into a HAR file, then generate a standalone client or CLI that calls the endpoints directly, with no browser needed after the first recording. Use when asked to \"derive a client\", \"build a CLI for \u003Csite>\", \"reverse engineer this site's API\", \"record network requests\", \"turn this site into an API\", or when the same site will be automated repeatedly and direct HTTP calls would beat driving the browser every time.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1919,1922,1923,1924],{"name":1920,"slug":1921,"type":15},"API Development","api-development",{"name":1881,"slug":1882,"type":15},{"name":1884,"slug":1885,"type":15},{"name":1925,"slug":1926,"type":15},"Web Scraping","web-scraping","2026-07-20T06:24:11.928835",{"slug":1929,"name":1929,"fn":1930,"description":1931,"org":1932,"tags":1933,"stars":1886,"repoUrl":1887,"updatedAt":1942},"dogfood","perform exploratory testing on web applications","Systematically explore and test a web application to find bugs, UX issues, and other problems. Use when asked to \"dogfood\", \"QA\", \"exploratory test\", \"find issues\", \"bug hunt\", \"test this app\u002Fsite\u002Fplatform\", or review the quality of a web application. Produces a structured report with full reproduction evidence -- step-by-step screenshots, repro videos, and detailed repro steps for every issue -- so findings can be handed directly to the responsible teams.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1934,1935,1936,1939],{"name":1884,"slug":1885,"type":15},{"name":23,"slug":24,"type":15},{"name":1937,"slug":1938,"type":15},"QA","qa",{"name":1940,"slug":1941,"type":15},"Testing","testing","2026-07-17T06:07:41.421482",{"slug":1944,"name":1944,"fn":1945,"description":1946,"org":1947,"tags":1948,"stars":1886,"repoUrl":1887,"updatedAt":1954},"electron","automate Electron desktop applications","Automate Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify, etc.) using agent-browser via Chrome DevTools Protocol. Use when the user needs to interact with an Electron app, automate a desktop app, connect to a running app, control a native app, or test an Electron application. Triggers include \"automate Slack app\", \"control VS Code\", \"interact with Discord app\", \"test this Electron app\", \"connect to desktop app\", or any task requiring automation of a native Electron application.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1949,1950,1951],{"name":1878,"slug":1879,"type":15},{"name":1884,"slug":1885,"type":15},{"name":1952,"slug":1953,"type":15},"Desktop","desktop","2026-07-17T06:08:28.007783",{"slug":1956,"name":1956,"fn":1957,"description":1958,"org":1959,"tags":1960,"stars":1886,"repoUrl":1887,"updatedAt":1967},"slack","interact with Slack workspaces","Interact with Slack workspaces using browser automation. Use when the user needs to check unread channels, navigate Slack, send messages, extract data, find information, search conversations, or automate any Slack task. Triggers include \"check my Slack\", \"what channels have unreads\", \"send a message to\", \"search Slack for\", \"extract from Slack\", \"find who said\", or any task requiring programmatic Slack interaction.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1961,1962,1965],{"name":1884,"slug":1885,"type":15},{"name":1963,"slug":1964,"type":15},"Messaging","messaging",{"name":1966,"slug":1956,"type":15},"Slack","2026-07-17T06:08:27.679015",{"slug":1969,"name":1969,"fn":1970,"description":1971,"org":1972,"tags":1973,"stars":1886,"repoUrl":1887,"updatedAt":1980},"vercel-sandbox","run browser automation in Vercel Sandbox","Run agent-browser + Chrome inside Vercel Sandbox microVMs for browser automation from any Vercel-deployed app. Use when the user needs browser automation in a Vercel app (Next.js, SvelteKit, Nuxt, Remix, Astro, etc.), wants to run headless Chrome without binary size limits, needs persistent browser sessions across commands, or wants ephemeral isolated browser environments. Triggers include \"Vercel Sandbox browser\", \"microVM Chrome\", \"agent-browser in sandbox\", \"browser automation on Vercel\", or any task requiring Chrome in a Vercel Sandbox.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1974,1975,1976,1977],{"name":1881,"slug":1882,"type":15},{"name":1884,"slug":1885,"type":15},{"name":1940,"slug":1941,"type":15},{"name":1978,"slug":1979,"type":15},"Vercel","vercel","2026-07-17T06:08:28.349899",{"slug":1982,"name":1982,"fn":1983,"description":1984,"org":1985,"tags":1986,"stars":1991,"repoUrl":1992,"updatedAt":1993},"deploy-to-vercel","deploy applications to Vercel","Deploy applications and websites to Vercel. Use when the user requests deployment actions like \"deploy my app\", \"deploy and give me the link\", \"push this live\", or \"create a preview deployment\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1987,1990],{"name":1988,"slug":1989,"type":15},"Deployment","deployment",{"name":1978,"slug":1979,"type":15},28993,"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fagent-skills","2026-07-17T06:08:41.18374",{"slug":1995,"name":1995,"fn":1996,"description":1997,"org":1998,"tags":1999,"stars":1991,"repoUrl":1992,"updatedAt":2003},"vercel-cli-with-tokens","manage Vercel projects via CLI","Deploy and manage projects on Vercel using token-based authentication. Use when working with Vercel CLI using access tokens rather than interactive login — e.g. \"deploy to vercel\", \"set up vercel\", \"add environment variables to vercel\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2000,2001,2002],{"name":17,"slug":18,"type":15},{"name":1988,"slug":1989,"type":15},{"name":1978,"slug":1979,"type":15},"2026-07-17T06:08:41.84179",{"slug":2005,"name":2005,"fn":2006,"description":2007,"org":2008,"tags":2009,"stars":1991,"repoUrl":1992,"updatedAt":2022},"vercel-composition-patterns","implement scalable React composition patterns","React composition patterns that scale. Use when refactoring components with boolean prop proliferation, building flexible component libraries, or designing reusable APIs. Triggers on tasks involving compound components, render props, context providers, or component architecture. Includes React 19 API changes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2010,2013,2016,2019],{"name":2011,"slug":2012,"type":15},"Best Practices","best-practices",{"name":2014,"slug":2015,"type":15},"Frontend","frontend",{"name":2017,"slug":2018,"type":15},"React","react",{"name":2020,"slug":2021,"type":15},"UI Components","ui-components","2026-07-17T06:05:40.576913",{"slug":2024,"name":2024,"fn":2025,"description":2026,"org":2027,"tags":2028,"stars":1991,"repoUrl":1992,"updatedAt":2037},"vercel-optimize","optimize Vercel project performance and costs","Use for Vercel cost and performance optimization on deployed projects, especially Next.js, SvelteKit, Nuxt, and limited Astro apps. Collect Vercel metrics, usage, project config, and code scan results first; investigate only metric-backed candidates; produce ranked recommendations grounded in verified files and version-aware Vercel\u002Fframework docs. Trigger for Vercel bill reduction, slow or expensive routes, caching opportunities, Function Invocations, Build Minutes, Fast Data Transfer, Core Web Vitals, Bot Management, Fluid compute, or cost breakdown requests.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2029,2032,2033,2036],{"name":2030,"slug":2031,"type":15},"Cost Optimization","cost-optimization",{"name":1988,"slug":1989,"type":15},{"name":2034,"slug":2035,"type":15},"Performance","performance",{"name":1978,"slug":1979,"type":15},"2026-07-17T06:04:08.327515",100,{"items":2040,"total":501},[2041,2053],{"slug":175,"name":175,"fn":2042,"description":2043,"org":2044,"tags":2045,"stars":25,"repoUrl":26,"updatedAt":2052},"configure konsistent code structure enforcement","Create or modify a konsistent.json configuration file that enforces structural conventions in a TypeScript codebase. Use when the user wants to enforce consistent code structure, validate exports\u002Fimports across files, ensure directories contain required files, enforce naming patterns, add\u002Fremove\u002Fupdate convention rules, configure case map overrides for acronyms or special casing (kebabToPascalMap, kebabToCamelMap), or troubleshoot why konsistent is reporting violations. Triggers on: \"konsistent\", \"konsistent.json\", \"enforce conventions\", \"structural consistency\", \"consistent exports\", \"consistent structure\", \"code conventions config\", \"add convention\", \"update convention\", \"fix konsistent errors\", \"case map\", \"case override\", \"acronym casing\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2046,2047,2048,2051],{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":2049,"slug":2050,"type":15},"Configuration","configuration",{"name":13,"slug":14,"type":15},"2026-07-17T06:06:04.090179",{"slug":4,"name":4,"fn":5,"description":6,"org":2054,"tags":2055,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2056,2057,2058,2059],{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15}]