[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-vercel-labs-konsistent-config":3,"mdc--x1i1bg-key":36,"related-repo-vercel-labs-konsistent-config":1352,"related-org-vercel-labs-konsistent-config":1374},{"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-config","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},"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},"Configuration","configuration","tag",{"name":17,"slug":18,"type":15},"TypeScript","typescript",{"name":20,"slug":21,"type":15},"CLI","cli",{"name":23,"slug":24,"type":15},"Code Analysis","code-analysis",130,"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fkonsistent","2026-07-17T06:06:04.090179",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-config","---\nname: konsistent-config\ndescription: >\n  Create or modify a konsistent.json configuration file that enforces structural conventions in a TypeScript codebase.\n  Use when the user wants to enforce consistent code structure, validate exports\u002Fimports across files,\n  ensure directories contain required files, enforce naming patterns, add\u002Fremove\u002Fupdate convention rules,\n  configure case map overrides for acronyms or special casing (kebabToPascalMap, kebabToCamelMap),\n  or troubleshoot why konsistent is reporting violations.\n  Triggers on: \"konsistent\", \"konsistent.json\", \"enforce conventions\", \"structural consistency\",\n  \"consistent exports\", \"consistent structure\", \"code conventions config\", \"add convention\",\n  \"update convention\", \"fix konsistent errors\", \"case map\", \"case override\", \"acronym casing\".\n---\n\n# konsistent Configuration\n\nCreate or modify a `konsistent.json` file that enforces structural conventions for the project. The `konsistent` CLI checks filesystem structure and TypeScript exports\u002Fimports — it is not a style linter.\n\n## Core Objective\n\n**Important reminder:** DO NOT write a `konsistent.json` file that leads to zero errors when running the `konsistent` check. That would defeat the purpose. The objective is to create a `konsistent.json` file that identifies violations to patterns used in the codebase, even if they are not being 100% adhered to. Add conventions based on dominant patterns in the codebase, even if other instances violate those patterns.\n\nTreat the existing codebase as evidence from which to infer conventions, not as a specification that every convention must accept. Existing files that do not follow a dominant pattern are expected findings, not proof that the convention is wrong.\n\nA successful configuration can make `konsistent` exit with violations. The violations are the intended audit output. Only `konsistent validate` is expected to pass without errors.\n\n## Workflow\n\n### 1. Setting Up The `konsistent` CLI (only if not set up yet)\n\nCheck if the `konsistent` package is already installed:\n\n- `konsistent` available in root `package.json`\n- `node_modules\u002Fkonsistent` directory exists\n- a `konsistent` script exists in `package.json`\n\nIf not, the `konsistent` CLI must be installed first. Use the project's package manager. For example, with PNPM:\n\n```bash\npnpm add konsistent --save-dev\n```\n\nThen, ensure `package.json` has a `konsistent` script which invokes the `konsistent` CLI. At a minimum:\n\n```\n  \"scripts\": {\n    \"konsistent\": \"konsistent\"\n  }\n```\n\nIf or once all of these are ready, proceed to section 2.\n\n### 2. Determining Operation Mode Based on Presence Of `konsistent.json` File\n\n1. Check if `konsistent.json` already exists at the project root.\n2. Read `node_modules\u002Fkonsistent\u002Fkonsistent.schema.json` to confirm the authoritative shape.\n3. Read the relevant docs in `node_modules\u002Fkonsistent\u002Fdocs\u002F` (see [References](#references) below) before making changes.\n4. If `konsistent.json` exists: read it, then add\u002Fremove\u002Fupdate conventions as requested by the user.\n5. If `konsistent.json` does not exist: create it at the project root.\n\n### 3. Creating Or Editing The `konsistent.json` File\n\nExplore the user's codebase to understand existing structure and naming patterns. Refer to `node_modules\u002Fkonsistent\u002Fdocs\u002Fguides\u002Fexploring-codebases.md` for what to look out for.\n\nMake sure you review the codebase for structural conventions _holistically_. For large codebases with multiple layers of nested subdirectories, consider using subagents for individual sections of the codebase. Make each subagent aware of all the analysis requirements outlined in the following subsections, and use subagents to gather raw evidence rather than make final dominance decisions.\n\nWhen subagents explore separate sections, ensure their findings can be combined into complete relevant cohorts. Each subagent must report the scope it examined, the total instances in that scope, conforming and nonconforming counts, competing patterns, and representative examples. The primary agent must merge these findings, reconstruct each complete cohort, and decide dominance using the combined evidence. A pattern that is dominant within one delegated section is not necessarily dominant across the complete cohort.\n\nConsider conventions between related files as well, not only within a single file. Use the `haveFiles` predicate to ensure a specific other file exists based on the matched file, and use `for.files` to enforce conventions within specific other related files based on the matched file.\n\n#### Required Pattern Evidence\n\nDo not write the configuration until you have recorded the evidence for each candidate convention. For every candidate:\n\n1. Define the complete relevant cohort, such as all sibling packages, adapters, routes, or barrel files. Consider conventions between related files as well, not only within a single file.\n  - For example, use the `haveFiles` predicate to ensure a specific other file exists based on the matched file, and use `for.files` to enforce conventions within specific other related files based on the matched file.\n2. Count the total cohort, the conforming instances, and the nonconforming instances. Always include the denominator; a few matching examples alone do not establish dominance.\n3. Search for counterexamples as deliberately as you search for supporting examples. Inspect representative conforming and nonconforming instances.\n4. Compare competing patterns. By default, a candidate is dominant only when it occurs at least three times and accounts for at least two-thirds of the relevant cohort.\n5. When encountering competing patterns without a dominant \"winner\", pause and ask the user for which pattern to enforce (or whether to not enforce any of them).\n6. For each convention established (either by dominant candidate or by user decision), decide whether nonconforming instances are violations or belong to a genuinely different semantic cohort. Existing variation by itself does not establish a legitimate exception.\n\nUse an evidence table while exploring:\n\n| Candidate convention | Cohort | Follows | Violates | Competing patterns | Decision |\n| --- | --- | ---: | ---: | --- | --- |\n| Every package has `src\u002Findex.ts` | 12 packages | 10 | 2 | None | Enforce |\n| Service files use the `-service` suffix | 9 service files | 5 | 4 | `-service` vs. `-svc` | Ambiguous; ask user |\n\nDo not invent conditions that make all competing variants valid. If the evidence is ambiguous, pause and ask the user which convention to enforce or whether to enforce none of them.\n\n#### Adversarial Review\n\nBefore translating a candidate into configuration, try to disprove it:\n\n- Search the entire cohort rather than stopping after finding several supporting examples.\n- Look for a stronger competing convention or a semantic boundary that changes the cohort.\n- Check whether another tool already enforces the behavior.\n- Prefer a rule that exposes genuine outliers over one that explains every existing file.\n\nThe purpose of this review is to reject weak or invented patterns. It is not to eliminate violations of strong patterns.\n\nWhen modifying an existing config:\n\n- Preserve all conventions not related to the user's request.\n- Preserve existing `name`, `description`, and `severity` values unless asked to change them.\n- When adding conventions, append to the `conventions` array.\n- When the user reports violations, read the existing config and the violating files to determine whether to fix the config or advise fixing the code.\n\n#### Prohibited Optimization\n\nNEVER optimize the configuration for any of the following outcomes:\n\n- Zero reported violations.\n- Making every existing file valid.\n- Accommodating every observed variation.\n- Reducing the violation count after running the CLI.\n- Marking conventions with a `severity` of \"warning\" just to make the CLI pass with exit code 0.\n\nDo not weaken, narrow, condition, or exclude a convention solely because existing code violates it.\n\n#### Verification\n\nValidate the generated config by running `konsistent validate` via the `package.json` script (e.g. `pnpm konsistent validate`).\n\nAfter validation succeeds, freeze the evidence-based configuration and audit the actual codebase by running `konsistent` via the `package.json` script with no arguments. Treat reported violations as audit findings, not as configuration failures.\n\nA post-audit configuration change is allowed only when one of the following is true:\n\n- The configuration does not encode the pattern recorded in the evidence table.\n- The path pattern accidentally includes a separate semantic cohort.\n- The configuration uses the `konsistent` schema or predicate API incorrectly.\n- Newly discovered code changes the recorded evidence enough that the candidate is no longer dominant.\n\n“Existing files fail this rule” is never sufficient justification for changing the configuration. For every post-audit change, state which allowed reason applies and update the recorded evidence when relevant.\n\n## References\n\nAll canonical documentation lives in `node_modules\u002Fkonsistent\u002Fdocs\u002F` (published with the package). Read these before authoring config:\n\n- `node_modules\u002Fkonsistent\u002Fdocs\u002Freference\u002Fconfiguration.md` — top-level `konsistent.json` shape (version, conventions, severity, excludeFiles).\n- `node_modules\u002Fkonsistent\u002Fdocs\u002Freference\u002Fpredicates.md` — every `must` predicate (`haveType`, `haveFiles`, `export`, `exportTypes`, `exportConstants`, `exportFunctions`, `exportInterfaces`, `exportClasses`, `import`, `importTypes`).\n- `node_modules\u002Fkonsistent\u002Fdocs\u002Freference\u002Fpath-patterns.md` — globs, placeholders, case transformations (`toPascalCase`, `toCamelCase`, `toFlatCase`, `toNthSegment`, `extract`, …), negation.\n- `node_modules\u002Fkonsistent\u002Fdocs\u002Freference\u002Fconstraints.md` — `matches`, `segments` for inline path constraints and `if.placeholderSatisfies`.\n- `node_modules\u002Fkonsistent\u002Fdocs\u002Freference\u002Fconditional-rules.md` — `if` \u002F `for` \u002F `excludeFiles` blocks when `must` is an array.\n- `node_modules\u002Fkonsistent\u002Fdocs\u002Freference\u002Fcase-maps.md` — `kebabToPascalMap`, `kebabToCamelMap` for acronyms and special casing.\n- `node_modules\u002Fkonsistent\u002Fdocs\u002Fguides\u002Fexamples.md` — copy-pasteable common patterns (provider packages, factories, adapters, conditional rules, …).\n- `node_modules\u002Fkonsistent\u002Fdocs\u002Fguides\u002Fexploring-codebases.md` — pattern-identification approach before writing rules.\n\n## Configuration Syntax Recommendations\n\n- Use `name` on conventions to give them identifiable IDs (must be kebab-case).\n- Use `description` when the convention name alone isn't self-explanatory.\n- Prefer templates with case transformations over hardcoded names — this is `konsistent`'s key strength.\n- Group related predicates in one convention when they apply to the same path.\n- Use separate conventions for the same path when different severities are needed.\n- Use path negation to exclude known exceptions, but ONLY if it is a semantic category outside the convention's intended cohort, such as generated files, fixtures, vendored code, or a demonstrably distinct package category.\n\n## Configuration Syntax Pitfalls\n\n- Do not attempt to use `*` in declaration or export names. These wildcards are only allowed in path segments.\n\n## Completion Report\n\nWhen handing off the configuration, report:\n\n- Every inferred convention and its evidence ratio, such as 10 of 12 instances.\n- Representative conforming examples.\n- Representative violations surfaced by the audit, or an explicit statement that none were found.\n- Ambiguous candidate patterns that were intentionally skipped.\n- Every exclusion and the semantic reason it is outside the convention's cohort.\n\nDo not describe success as “`konsistent` passes.” Distinguish schema validation success from the codebase audit findings.\n",{"data":37,"body":38},{"name":4,"description":6},{"type":39,"children":40},"root",[41,50,73,80,112,117,137,143,157,169,218,230,269,295,305,310,323,397,409,422,435,440,461,468,473,481,501,530,535,675,680,686,691,714,719,724,779,785,790,825,830,836,863,881,886,916,921,926,938,1214,1220,1273,1279,1295,1301,1306,1334,1346],{"type":42,"tag":43,"props":44,"children":46},"element","h1",{"id":45},"konsistent-configuration",[47],{"type":48,"value":49},"text","konsistent Configuration",{"type":42,"tag":51,"props":52,"children":53},"p",{},[54,56,63,65,71],{"type":48,"value":55},"Create or modify a ",{"type":42,"tag":57,"props":58,"children":60},"code",{"className":59},[],[61],{"type":48,"value":62},"konsistent.json",{"type":48,"value":64}," file that enforces structural conventions for the project. The ",{"type":42,"tag":57,"props":66,"children":68},{"className":67},[],[69],{"type":48,"value":70},"konsistent",{"type":48,"value":72}," CLI checks filesystem structure and TypeScript exports\u002Fimports — it is not a style linter.",{"type":42,"tag":74,"props":75,"children":77},"h2",{"id":76},"core-objective",[78],{"type":48,"value":79},"Core Objective",{"type":42,"tag":51,"props":81,"children":82},{},[83,89,91,96,98,103,105,110],{"type":42,"tag":84,"props":85,"children":86},"strong",{},[87],{"type":48,"value":88},"Important reminder:",{"type":48,"value":90}," DO NOT write a ",{"type":42,"tag":57,"props":92,"children":94},{"className":93},[],[95],{"type":48,"value":62},{"type":48,"value":97}," file that leads to zero errors when running the ",{"type":42,"tag":57,"props":99,"children":101},{"className":100},[],[102],{"type":48,"value":70},{"type":48,"value":104}," check. That would defeat the purpose. The objective is to create a ",{"type":42,"tag":57,"props":106,"children":108},{"className":107},[],[109],{"type":48,"value":62},{"type":48,"value":111}," file that identifies violations to patterns used in the codebase, even if they are not being 100% adhered to. Add conventions based on dominant patterns in the codebase, even if other instances violate those patterns.",{"type":42,"tag":51,"props":113,"children":114},{},[115],{"type":48,"value":116},"Treat the existing codebase as evidence from which to infer conventions, not as a specification that every convention must accept. Existing files that do not follow a dominant pattern are expected findings, not proof that the convention is wrong.",{"type":42,"tag":51,"props":118,"children":119},{},[120,122,127,129,135],{"type":48,"value":121},"A successful configuration can make ",{"type":42,"tag":57,"props":123,"children":125},{"className":124},[],[126],{"type":48,"value":70},{"type":48,"value":128}," exit with violations. The violations are the intended audit output. Only ",{"type":42,"tag":57,"props":130,"children":132},{"className":131},[],[133],{"type":48,"value":134},"konsistent validate",{"type":48,"value":136}," is expected to pass without errors.",{"type":42,"tag":74,"props":138,"children":140},{"id":139},"workflow",[141],{"type":48,"value":142},"Workflow",{"type":42,"tag":144,"props":145,"children":147},"h3",{"id":146},"_1-setting-up-the-konsistent-cli-only-if-not-set-up-yet",[148,150,155],{"type":48,"value":149},"1. Setting Up The ",{"type":42,"tag":57,"props":151,"children":153},{"className":152},[],[154],{"type":48,"value":70},{"type":48,"value":156}," CLI (only if not set up yet)",{"type":42,"tag":51,"props":158,"children":159},{},[160,162,167],{"type":48,"value":161},"Check if the ",{"type":42,"tag":57,"props":163,"children":165},{"className":164},[],[166],{"type":48,"value":70},{"type":48,"value":168}," package is already installed:",{"type":42,"tag":170,"props":171,"children":172},"ul",{},[173,190,201],{"type":42,"tag":174,"props":175,"children":176},"li",{},[177,182,184],{"type":42,"tag":57,"props":178,"children":180},{"className":179},[],[181],{"type":48,"value":70},{"type":48,"value":183}," available in root ",{"type":42,"tag":57,"props":185,"children":187},{"className":186},[],[188],{"type":48,"value":189},"package.json",{"type":42,"tag":174,"props":191,"children":192},{},[193,199],{"type":42,"tag":57,"props":194,"children":196},{"className":195},[],[197],{"type":48,"value":198},"node_modules\u002Fkonsistent",{"type":48,"value":200}," directory exists",{"type":42,"tag":174,"props":202,"children":203},{},[204,206,211,213],{"type":48,"value":205},"a ",{"type":42,"tag":57,"props":207,"children":209},{"className":208},[],[210],{"type":48,"value":70},{"type":48,"value":212}," script exists in ",{"type":42,"tag":57,"props":214,"children":216},{"className":215},[],[217],{"type":48,"value":189},{"type":42,"tag":51,"props":219,"children":220},{},[221,223,228],{"type":48,"value":222},"If not, the ",{"type":42,"tag":57,"props":224,"children":226},{"className":225},[],[227],{"type":48,"value":70},{"type":48,"value":229}," CLI must be installed first. Use the project's package manager. For example, with PNPM:",{"type":42,"tag":231,"props":232,"children":237},"pre",{"className":233,"code":234,"language":235,"meta":236,"style":236},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add konsistent --save-dev\n","bash","",[238],{"type":42,"tag":57,"props":239,"children":240},{"__ignoreMap":236},[241],{"type":42,"tag":242,"props":243,"children":246},"span",{"class":244,"line":245},"line",1,[247,253,259,264],{"type":42,"tag":242,"props":248,"children":250},{"style":249},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[251],{"type":48,"value":252},"pnpm",{"type":42,"tag":242,"props":254,"children":256},{"style":255},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[257],{"type":48,"value":258}," add",{"type":42,"tag":242,"props":260,"children":261},{"style":255},[262],{"type":48,"value":263}," konsistent",{"type":42,"tag":242,"props":265,"children":266},{"style":255},[267],{"type":48,"value":268}," --save-dev\n",{"type":42,"tag":51,"props":270,"children":271},{},[272,274,279,281,286,288,293],{"type":48,"value":273},"Then, ensure ",{"type":42,"tag":57,"props":275,"children":277},{"className":276},[],[278],{"type":48,"value":189},{"type":48,"value":280}," has a ",{"type":42,"tag":57,"props":282,"children":284},{"className":283},[],[285],{"type":48,"value":70},{"type":48,"value":287}," script which invokes the ",{"type":42,"tag":57,"props":289,"children":291},{"className":290},[],[292],{"type":48,"value":70},{"type":48,"value":294}," CLI. At a minimum:",{"type":42,"tag":231,"props":296,"children":300},{"className":297,"code":299,"language":48},[298],"language-text","  \"scripts\": {\n    \"konsistent\": \"konsistent\"\n  }\n",[301],{"type":42,"tag":57,"props":302,"children":303},{"__ignoreMap":236},[304],{"type":48,"value":299},{"type":42,"tag":51,"props":306,"children":307},{},[308],{"type":48,"value":309},"If or once all of these are ready, proceed to section 2.",{"type":42,"tag":144,"props":311,"children":313},{"id":312},"_2-determining-operation-mode-based-on-presence-of-konsistentjson-file",[314,316,321],{"type":48,"value":315},"2. Determining Operation Mode Based on Presence Of ",{"type":42,"tag":57,"props":317,"children":319},{"className":318},[],[320],{"type":48,"value":62},{"type":48,"value":322}," File",{"type":42,"tag":324,"props":325,"children":326},"ol",{},[327,339,352,374,386],{"type":42,"tag":174,"props":328,"children":329},{},[330,332,337],{"type":48,"value":331},"Check if ",{"type":42,"tag":57,"props":333,"children":335},{"className":334},[],[336],{"type":48,"value":62},{"type":48,"value":338}," already exists at the project root.",{"type":42,"tag":174,"props":340,"children":341},{},[342,344,350],{"type":48,"value":343},"Read ",{"type":42,"tag":57,"props":345,"children":347},{"className":346},[],[348],{"type":48,"value":349},"node_modules\u002Fkonsistent\u002Fkonsistent.schema.json",{"type":48,"value":351}," to confirm the authoritative shape.",{"type":42,"tag":174,"props":353,"children":354},{},[355,357,363,365,372],{"type":48,"value":356},"Read the relevant docs in ",{"type":42,"tag":57,"props":358,"children":360},{"className":359},[],[361],{"type":48,"value":362},"node_modules\u002Fkonsistent\u002Fdocs\u002F",{"type":48,"value":364}," (see ",{"type":42,"tag":366,"props":367,"children":369},"a",{"href":368},"#references",[370],{"type":48,"value":371},"References",{"type":48,"value":373}," below) before making changes.",{"type":42,"tag":174,"props":375,"children":376},{},[377,379,384],{"type":48,"value":378},"If ",{"type":42,"tag":57,"props":380,"children":382},{"className":381},[],[383],{"type":48,"value":62},{"type":48,"value":385}," exists: read it, then add\u002Fremove\u002Fupdate conventions as requested by the user.",{"type":42,"tag":174,"props":387,"children":388},{},[389,390,395],{"type":48,"value":378},{"type":42,"tag":57,"props":391,"children":393},{"className":392},[],[394],{"type":48,"value":62},{"type":48,"value":396}," does not exist: create it at the project root.",{"type":42,"tag":144,"props":398,"children":400},{"id":399},"_3-creating-or-editing-the-konsistentjson-file",[401,403,408],{"type":48,"value":402},"3. Creating Or Editing The ",{"type":42,"tag":57,"props":404,"children":406},{"className":405},[],[407],{"type":48,"value":62},{"type":48,"value":322},{"type":42,"tag":51,"props":410,"children":411},{},[412,414,420],{"type":48,"value":413},"Explore the user's codebase to understand existing structure and naming patterns. Refer to ",{"type":42,"tag":57,"props":415,"children":417},{"className":416},[],[418],{"type":48,"value":419},"node_modules\u002Fkonsistent\u002Fdocs\u002Fguides\u002Fexploring-codebases.md",{"type":48,"value":421}," for what to look out for.",{"type":42,"tag":51,"props":423,"children":424},{},[425,427,433],{"type":48,"value":426},"Make sure you review the codebase for structural conventions ",{"type":42,"tag":428,"props":429,"children":430},"em",{},[431],{"type":48,"value":432},"holistically",{"type":48,"value":434},". For large codebases with multiple layers of nested subdirectories, consider using subagents for individual sections of the codebase. Make each subagent aware of all the analysis requirements outlined in the following subsections, and use subagents to gather raw evidence rather than make final dominance decisions.",{"type":42,"tag":51,"props":436,"children":437},{},[438],{"type":48,"value":439},"When subagents explore separate sections, ensure their findings can be combined into complete relevant cohorts. Each subagent must report the scope it examined, the total instances in that scope, conforming and nonconforming counts, competing patterns, and representative examples. The primary agent must merge these findings, reconstruct each complete cohort, and decide dominance using the combined evidence. A pattern that is dominant within one delegated section is not necessarily dominant across the complete cohort.",{"type":42,"tag":51,"props":441,"children":442},{},[443,445,451,453,459],{"type":48,"value":444},"Consider conventions between related files as well, not only within a single file. Use the ",{"type":42,"tag":57,"props":446,"children":448},{"className":447},[],[449],{"type":48,"value":450},"haveFiles",{"type":48,"value":452}," predicate to ensure a specific other file exists based on the matched file, and use ",{"type":42,"tag":57,"props":454,"children":456},{"className":455},[],[457],{"type":48,"value":458},"for.files",{"type":48,"value":460}," to enforce conventions within specific other related files based on the matched file.",{"type":42,"tag":462,"props":463,"children":465},"h4",{"id":464},"required-pattern-evidence",[466],{"type":48,"value":467},"Required Pattern Evidence",{"type":42,"tag":51,"props":469,"children":470},{},[471],{"type":48,"value":472},"Do not write the configuration until you have recorded the evidence for each candidate convention. For every candidate:",{"type":42,"tag":324,"props":474,"children":475},{},[476],{"type":42,"tag":174,"props":477,"children":478},{},[479],{"type":48,"value":480},"Define the complete relevant cohort, such as all sibling packages, adapters, routes, or barrel files. Consider conventions between related files as well, not only within a single file.",{"type":42,"tag":170,"props":482,"children":483},{},[484],{"type":42,"tag":174,"props":485,"children":486},{},[487,489,494,495,500],{"type":48,"value":488},"For example, use the ",{"type":42,"tag":57,"props":490,"children":492},{"className":491},[],[493],{"type":48,"value":450},{"type":48,"value":452},{"type":42,"tag":57,"props":496,"children":498},{"className":497},[],[499],{"type":48,"value":458},{"type":48,"value":460},{"type":42,"tag":324,"props":502,"children":504},{"start":503},2,[505,510,515,520,525],{"type":42,"tag":174,"props":506,"children":507},{},[508],{"type":48,"value":509},"Count the total cohort, the conforming instances, and the nonconforming instances. Always include the denominator; a few matching examples alone do not establish dominance.",{"type":42,"tag":174,"props":511,"children":512},{},[513],{"type":48,"value":514},"Search for counterexamples as deliberately as you search for supporting examples. Inspect representative conforming and nonconforming instances.",{"type":42,"tag":174,"props":516,"children":517},{},[518],{"type":48,"value":519},"Compare competing patterns. By default, a candidate is dominant only when it occurs at least three times and accounts for at least two-thirds of the relevant cohort.",{"type":42,"tag":174,"props":521,"children":522},{},[523],{"type":48,"value":524},"When encountering competing patterns without a dominant \"winner\", pause and ask the user for which pattern to enforce (or whether to not enforce any of them).",{"type":42,"tag":174,"props":526,"children":527},{},[528],{"type":48,"value":529},"For each convention established (either by dominant candidate or by user decision), decide whether nonconforming instances are violations or belong to a genuinely different semantic cohort. Existing variation by itself does not establish a legitimate exception.",{"type":42,"tag":51,"props":531,"children":532},{},[533],{"type":48,"value":534},"Use an evidence table while exploring:",{"type":42,"tag":536,"props":537,"children":538},"table",{},[539,579],{"type":42,"tag":540,"props":541,"children":542},"thead",{},[543],{"type":42,"tag":544,"props":545,"children":546},"tr",{},[547,553,558,564,569,574],{"type":42,"tag":548,"props":549,"children":550},"th",{},[551],{"type":48,"value":552},"Candidate convention",{"type":42,"tag":548,"props":554,"children":555},{},[556],{"type":48,"value":557},"Cohort",{"type":42,"tag":548,"props":559,"children":561},{"align":560},"right",[562],{"type":48,"value":563},"Follows",{"type":42,"tag":548,"props":565,"children":566},{"align":560},[567],{"type":48,"value":568},"Violates",{"type":42,"tag":548,"props":570,"children":571},{},[572],{"type":48,"value":573},"Competing patterns",{"type":42,"tag":548,"props":575,"children":576},{},[577],{"type":48,"value":578},"Decision",{"type":42,"tag":580,"props":581,"children":582},"tbody",{},[583,623],{"type":42,"tag":544,"props":584,"children":585},{},[586,598,603,608,613,618],{"type":42,"tag":587,"props":588,"children":589},"td",{},[590,592],{"type":48,"value":591},"Every package has ",{"type":42,"tag":57,"props":593,"children":595},{"className":594},[],[596],{"type":48,"value":597},"src\u002Findex.ts",{"type":42,"tag":587,"props":599,"children":600},{},[601],{"type":48,"value":602},"12 packages",{"type":42,"tag":587,"props":604,"children":605},{"align":560},[606],{"type":48,"value":607},"10",{"type":42,"tag":587,"props":609,"children":610},{"align":560},[611],{"type":48,"value":612},"2",{"type":42,"tag":587,"props":614,"children":615},{},[616],{"type":48,"value":617},"None",{"type":42,"tag":587,"props":619,"children":620},{},[621],{"type":48,"value":622},"Enforce",{"type":42,"tag":544,"props":624,"children":625},{},[626,639,644,649,654,670],{"type":42,"tag":587,"props":627,"children":628},{},[629,631,637],{"type":48,"value":630},"Service files use the ",{"type":42,"tag":57,"props":632,"children":634},{"className":633},[],[635],{"type":48,"value":636},"-service",{"type":48,"value":638}," suffix",{"type":42,"tag":587,"props":640,"children":641},{},[642],{"type":48,"value":643},"9 service files",{"type":42,"tag":587,"props":645,"children":646},{"align":560},[647],{"type":48,"value":648},"5",{"type":42,"tag":587,"props":650,"children":651},{"align":560},[652],{"type":48,"value":653},"4",{"type":42,"tag":587,"props":655,"children":656},{},[657,662,664],{"type":42,"tag":57,"props":658,"children":660},{"className":659},[],[661],{"type":48,"value":636},{"type":48,"value":663}," vs. ",{"type":42,"tag":57,"props":665,"children":667},{"className":666},[],[668],{"type":48,"value":669},"-svc",{"type":42,"tag":587,"props":671,"children":672},{},[673],{"type":48,"value":674},"Ambiguous; ask user",{"type":42,"tag":51,"props":676,"children":677},{},[678],{"type":48,"value":679},"Do not invent conditions that make all competing variants valid. If the evidence is ambiguous, pause and ask the user which convention to enforce or whether to enforce none of them.",{"type":42,"tag":462,"props":681,"children":683},{"id":682},"adversarial-review",[684],{"type":48,"value":685},"Adversarial Review",{"type":42,"tag":51,"props":687,"children":688},{},[689],{"type":48,"value":690},"Before translating a candidate into configuration, try to disprove it:",{"type":42,"tag":170,"props":692,"children":693},{},[694,699,704,709],{"type":42,"tag":174,"props":695,"children":696},{},[697],{"type":48,"value":698},"Search the entire cohort rather than stopping after finding several supporting examples.",{"type":42,"tag":174,"props":700,"children":701},{},[702],{"type":48,"value":703},"Look for a stronger competing convention or a semantic boundary that changes the cohort.",{"type":42,"tag":174,"props":705,"children":706},{},[707],{"type":48,"value":708},"Check whether another tool already enforces the behavior.",{"type":42,"tag":174,"props":710,"children":711},{},[712],{"type":48,"value":713},"Prefer a rule that exposes genuine outliers over one that explains every existing file.",{"type":42,"tag":51,"props":715,"children":716},{},[717],{"type":48,"value":718},"The purpose of this review is to reject weak or invented patterns. It is not to eliminate violations of strong patterns.",{"type":42,"tag":51,"props":720,"children":721},{},[722],{"type":48,"value":723},"When modifying an existing config:",{"type":42,"tag":170,"props":725,"children":726},{},[727,732,761,774],{"type":42,"tag":174,"props":728,"children":729},{},[730],{"type":48,"value":731},"Preserve all conventions not related to the user's request.",{"type":42,"tag":174,"props":733,"children":734},{},[735,737,743,745,751,753,759],{"type":48,"value":736},"Preserve existing ",{"type":42,"tag":57,"props":738,"children":740},{"className":739},[],[741],{"type":48,"value":742},"name",{"type":48,"value":744},", ",{"type":42,"tag":57,"props":746,"children":748},{"className":747},[],[749],{"type":48,"value":750},"description",{"type":48,"value":752},", and ",{"type":42,"tag":57,"props":754,"children":756},{"className":755},[],[757],{"type":48,"value":758},"severity",{"type":48,"value":760}," values unless asked to change them.",{"type":42,"tag":174,"props":762,"children":763},{},[764,766,772],{"type":48,"value":765},"When adding conventions, append to the ",{"type":42,"tag":57,"props":767,"children":769},{"className":768},[],[770],{"type":48,"value":771},"conventions",{"type":48,"value":773}," array.",{"type":42,"tag":174,"props":775,"children":776},{},[777],{"type":48,"value":778},"When the user reports violations, read the existing config and the violating files to determine whether to fix the config or advise fixing the code.",{"type":42,"tag":462,"props":780,"children":782},{"id":781},"prohibited-optimization",[783],{"type":48,"value":784},"Prohibited Optimization",{"type":42,"tag":51,"props":786,"children":787},{},[788],{"type":48,"value":789},"NEVER optimize the configuration for any of the following outcomes:",{"type":42,"tag":170,"props":791,"children":792},{},[793,798,803,808,813],{"type":42,"tag":174,"props":794,"children":795},{},[796],{"type":48,"value":797},"Zero reported violations.",{"type":42,"tag":174,"props":799,"children":800},{},[801],{"type":48,"value":802},"Making every existing file valid.",{"type":42,"tag":174,"props":804,"children":805},{},[806],{"type":48,"value":807},"Accommodating every observed variation.",{"type":42,"tag":174,"props":809,"children":810},{},[811],{"type":48,"value":812},"Reducing the violation count after running the CLI.",{"type":42,"tag":174,"props":814,"children":815},{},[816,818,823],{"type":48,"value":817},"Marking conventions with a ",{"type":42,"tag":57,"props":819,"children":821},{"className":820},[],[822],{"type":48,"value":758},{"type":48,"value":824}," of \"warning\" just to make the CLI pass with exit code 0.",{"type":42,"tag":51,"props":826,"children":827},{},[828],{"type":48,"value":829},"Do not weaken, narrow, condition, or exclude a convention solely because existing code violates it.",{"type":42,"tag":462,"props":831,"children":833},{"id":832},"verification",[834],{"type":48,"value":835},"Verification",{"type":42,"tag":51,"props":837,"children":838},{},[839,841,846,848,853,855,861],{"type":48,"value":840},"Validate the generated config by running ",{"type":42,"tag":57,"props":842,"children":844},{"className":843},[],[845],{"type":48,"value":134},{"type":48,"value":847}," via the ",{"type":42,"tag":57,"props":849,"children":851},{"className":850},[],[852],{"type":48,"value":189},{"type":48,"value":854}," script (e.g. ",{"type":42,"tag":57,"props":856,"children":858},{"className":857},[],[859],{"type":48,"value":860},"pnpm konsistent validate",{"type":48,"value":862},").",{"type":42,"tag":51,"props":864,"children":865},{},[866,868,873,874,879],{"type":48,"value":867},"After validation succeeds, freeze the evidence-based configuration and audit the actual codebase by running ",{"type":42,"tag":57,"props":869,"children":871},{"className":870},[],[872],{"type":48,"value":70},{"type":48,"value":847},{"type":42,"tag":57,"props":875,"children":877},{"className":876},[],[878],{"type":48,"value":189},{"type":48,"value":880}," script with no arguments. Treat reported violations as audit findings, not as configuration failures.",{"type":42,"tag":51,"props":882,"children":883},{},[884],{"type":48,"value":885},"A post-audit configuration change is allowed only when one of the following is true:",{"type":42,"tag":170,"props":887,"children":888},{},[889,894,899,911],{"type":42,"tag":174,"props":890,"children":891},{},[892],{"type":48,"value":893},"The configuration does not encode the pattern recorded in the evidence table.",{"type":42,"tag":174,"props":895,"children":896},{},[897],{"type":48,"value":898},"The path pattern accidentally includes a separate semantic cohort.",{"type":42,"tag":174,"props":900,"children":901},{},[902,904,909],{"type":48,"value":903},"The configuration uses the ",{"type":42,"tag":57,"props":905,"children":907},{"className":906},[],[908],{"type":48,"value":70},{"type":48,"value":910}," schema or predicate API incorrectly.",{"type":42,"tag":174,"props":912,"children":913},{},[914],{"type":48,"value":915},"Newly discovered code changes the recorded evidence enough that the candidate is no longer dominant.",{"type":42,"tag":51,"props":917,"children":918},{},[919],{"type":48,"value":920},"“Existing files fail this rule” is never sufficient justification for changing the configuration. For every post-audit change, state which allowed reason applies and update the recorded evidence when relevant.",{"type":42,"tag":74,"props":922,"children":924},{"id":923},"references",[925],{"type":48,"value":371},{"type":42,"tag":51,"props":927,"children":928},{},[929,931,936],{"type":48,"value":930},"All canonical documentation lives in ",{"type":42,"tag":57,"props":932,"children":934},{"className":933},[],[935],{"type":48,"value":362},{"type":48,"value":937}," (published with the package). Read these before authoring config:",{"type":42,"tag":170,"props":939,"children":940},{},[941,959,1047,1094,1128,1168,1193,1204],{"type":42,"tag":174,"props":942,"children":943},{},[944,950,952,957],{"type":42,"tag":57,"props":945,"children":947},{"className":946},[],[948],{"type":48,"value":949},"node_modules\u002Fkonsistent\u002Fdocs\u002Freference\u002Fconfiguration.md",{"type":48,"value":951}," — top-level ",{"type":42,"tag":57,"props":953,"children":955},{"className":954},[],[956],{"type":48,"value":62},{"type":48,"value":958}," shape (version, conventions, severity, excludeFiles).",{"type":42,"tag":174,"props":960,"children":961},{},[962,968,970,976,978,984,985,990,991,997,998,1004,1005,1011,1012,1018,1019,1025,1026,1032,1033,1039,1040,1046],{"type":42,"tag":57,"props":963,"children":965},{"className":964},[],[966],{"type":48,"value":967},"node_modules\u002Fkonsistent\u002Fdocs\u002Freference\u002Fpredicates.md",{"type":48,"value":969}," — every ",{"type":42,"tag":57,"props":971,"children":973},{"className":972},[],[974],{"type":48,"value":975},"must",{"type":48,"value":977}," predicate (",{"type":42,"tag":57,"props":979,"children":981},{"className":980},[],[982],{"type":48,"value":983},"haveType",{"type":48,"value":744},{"type":42,"tag":57,"props":986,"children":988},{"className":987},[],[989],{"type":48,"value":450},{"type":48,"value":744},{"type":42,"tag":57,"props":992,"children":994},{"className":993},[],[995],{"type":48,"value":996},"export",{"type":48,"value":744},{"type":42,"tag":57,"props":999,"children":1001},{"className":1000},[],[1002],{"type":48,"value":1003},"exportTypes",{"type":48,"value":744},{"type":42,"tag":57,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":48,"value":1010},"exportConstants",{"type":48,"value":744},{"type":42,"tag":57,"props":1013,"children":1015},{"className":1014},[],[1016],{"type":48,"value":1017},"exportFunctions",{"type":48,"value":744},{"type":42,"tag":57,"props":1020,"children":1022},{"className":1021},[],[1023],{"type":48,"value":1024},"exportInterfaces",{"type":48,"value":744},{"type":42,"tag":57,"props":1027,"children":1029},{"className":1028},[],[1030],{"type":48,"value":1031},"exportClasses",{"type":48,"value":744},{"type":42,"tag":57,"props":1034,"children":1036},{"className":1035},[],[1037],{"type":48,"value":1038},"import",{"type":48,"value":744},{"type":42,"tag":57,"props":1041,"children":1043},{"className":1042},[],[1044],{"type":48,"value":1045},"importTypes",{"type":48,"value":862},{"type":42,"tag":174,"props":1048,"children":1049},{},[1050,1056,1058,1064,1065,1071,1072,1078,1079,1085,1086,1092],{"type":42,"tag":57,"props":1051,"children":1053},{"className":1052},[],[1054],{"type":48,"value":1055},"node_modules\u002Fkonsistent\u002Fdocs\u002Freference\u002Fpath-patterns.md",{"type":48,"value":1057}," — globs, placeholders, case transformations (",{"type":42,"tag":57,"props":1059,"children":1061},{"className":1060},[],[1062],{"type":48,"value":1063},"toPascalCase",{"type":48,"value":744},{"type":42,"tag":57,"props":1066,"children":1068},{"className":1067},[],[1069],{"type":48,"value":1070},"toCamelCase",{"type":48,"value":744},{"type":42,"tag":57,"props":1073,"children":1075},{"className":1074},[],[1076],{"type":48,"value":1077},"toFlatCase",{"type":48,"value":744},{"type":42,"tag":57,"props":1080,"children":1082},{"className":1081},[],[1083],{"type":48,"value":1084},"toNthSegment",{"type":48,"value":744},{"type":42,"tag":57,"props":1087,"children":1089},{"className":1088},[],[1090],{"type":48,"value":1091},"extract",{"type":48,"value":1093},", …), negation.",{"type":42,"tag":174,"props":1095,"children":1096},{},[1097,1103,1105,1111,1112,1118,1120,1126],{"type":42,"tag":57,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":48,"value":1102},"node_modules\u002Fkonsistent\u002Fdocs\u002Freference\u002Fconstraints.md",{"type":48,"value":1104}," — ",{"type":42,"tag":57,"props":1106,"children":1108},{"className":1107},[],[1109],{"type":48,"value":1110},"matches",{"type":48,"value":744},{"type":42,"tag":57,"props":1113,"children":1115},{"className":1114},[],[1116],{"type":48,"value":1117},"segments",{"type":48,"value":1119}," for inline path constraints and ",{"type":42,"tag":57,"props":1121,"children":1123},{"className":1122},[],[1124],{"type":48,"value":1125},"if.placeholderSatisfies",{"type":48,"value":1127},".",{"type":42,"tag":174,"props":1129,"children":1130},{},[1131,1137,1138,1144,1146,1152,1153,1159,1161,1166],{"type":42,"tag":57,"props":1132,"children":1134},{"className":1133},[],[1135],{"type":48,"value":1136},"node_modules\u002Fkonsistent\u002Fdocs\u002Freference\u002Fconditional-rules.md",{"type":48,"value":1104},{"type":42,"tag":57,"props":1139,"children":1141},{"className":1140},[],[1142],{"type":48,"value":1143},"if",{"type":48,"value":1145}," \u002F ",{"type":42,"tag":57,"props":1147,"children":1149},{"className":1148},[],[1150],{"type":48,"value":1151},"for",{"type":48,"value":1145},{"type":42,"tag":57,"props":1154,"children":1156},{"className":1155},[],[1157],{"type":48,"value":1158},"excludeFiles",{"type":48,"value":1160}," blocks when ",{"type":42,"tag":57,"props":1162,"children":1164},{"className":1163},[],[1165],{"type":48,"value":975},{"type":48,"value":1167}," is an array.",{"type":42,"tag":174,"props":1169,"children":1170},{},[1171,1177,1178,1184,1185,1191],{"type":42,"tag":57,"props":1172,"children":1174},{"className":1173},[],[1175],{"type":48,"value":1176},"node_modules\u002Fkonsistent\u002Fdocs\u002Freference\u002Fcase-maps.md",{"type":48,"value":1104},{"type":42,"tag":57,"props":1179,"children":1181},{"className":1180},[],[1182],{"type":48,"value":1183},"kebabToPascalMap",{"type":48,"value":744},{"type":42,"tag":57,"props":1186,"children":1188},{"className":1187},[],[1189],{"type":48,"value":1190},"kebabToCamelMap",{"type":48,"value":1192}," for acronyms and special casing.",{"type":42,"tag":174,"props":1194,"children":1195},{},[1196,1202],{"type":42,"tag":57,"props":1197,"children":1199},{"className":1198},[],[1200],{"type":48,"value":1201},"node_modules\u002Fkonsistent\u002Fdocs\u002Fguides\u002Fexamples.md",{"type":48,"value":1203}," — copy-pasteable common patterns (provider packages, factories, adapters, conditional rules, …).",{"type":42,"tag":174,"props":1205,"children":1206},{},[1207,1212],{"type":42,"tag":57,"props":1208,"children":1210},{"className":1209},[],[1211],{"type":48,"value":419},{"type":48,"value":1213}," — pattern-identification approach before writing rules.",{"type":42,"tag":74,"props":1215,"children":1217},{"id":1216},"configuration-syntax-recommendations",[1218],{"type":48,"value":1219},"Configuration Syntax Recommendations",{"type":42,"tag":170,"props":1221,"children":1222},{},[1223,1235,1246,1258,1263,1268],{"type":42,"tag":174,"props":1224,"children":1225},{},[1226,1228,1233],{"type":48,"value":1227},"Use ",{"type":42,"tag":57,"props":1229,"children":1231},{"className":1230},[],[1232],{"type":48,"value":742},{"type":48,"value":1234}," on conventions to give them identifiable IDs (must be kebab-case).",{"type":42,"tag":174,"props":1236,"children":1237},{},[1238,1239,1244],{"type":48,"value":1227},{"type":42,"tag":57,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":48,"value":750},{"type":48,"value":1245}," when the convention name alone isn't self-explanatory.",{"type":42,"tag":174,"props":1247,"children":1248},{},[1249,1251,1256],{"type":48,"value":1250},"Prefer templates with case transformations over hardcoded names — this is ",{"type":42,"tag":57,"props":1252,"children":1254},{"className":1253},[],[1255],{"type":48,"value":70},{"type":48,"value":1257},"'s key strength.",{"type":42,"tag":174,"props":1259,"children":1260},{},[1261],{"type":48,"value":1262},"Group related predicates in one convention when they apply to the same path.",{"type":42,"tag":174,"props":1264,"children":1265},{},[1266],{"type":48,"value":1267},"Use separate conventions for the same path when different severities are needed.",{"type":42,"tag":174,"props":1269,"children":1270},{},[1271],{"type":48,"value":1272},"Use path negation to exclude known exceptions, but ONLY if it is a semantic category outside the convention's intended cohort, such as generated files, fixtures, vendored code, or a demonstrably distinct package category.",{"type":42,"tag":74,"props":1274,"children":1276},{"id":1275},"configuration-syntax-pitfalls",[1277],{"type":48,"value":1278},"Configuration Syntax Pitfalls",{"type":42,"tag":170,"props":1280,"children":1281},{},[1282],{"type":42,"tag":174,"props":1283,"children":1284},{},[1285,1287,1293],{"type":48,"value":1286},"Do not attempt to use ",{"type":42,"tag":57,"props":1288,"children":1290},{"className":1289},[],[1291],{"type":48,"value":1292},"*",{"type":48,"value":1294}," in declaration or export names. These wildcards are only allowed in path segments.",{"type":42,"tag":74,"props":1296,"children":1298},{"id":1297},"completion-report",[1299],{"type":48,"value":1300},"Completion Report",{"type":42,"tag":51,"props":1302,"children":1303},{},[1304],{"type":48,"value":1305},"When handing off the configuration, report:",{"type":42,"tag":170,"props":1307,"children":1308},{},[1309,1314,1319,1324,1329],{"type":42,"tag":174,"props":1310,"children":1311},{},[1312],{"type":48,"value":1313},"Every inferred convention and its evidence ratio, such as 10 of 12 instances.",{"type":42,"tag":174,"props":1315,"children":1316},{},[1317],{"type":48,"value":1318},"Representative conforming examples.",{"type":42,"tag":174,"props":1320,"children":1321},{},[1322],{"type":48,"value":1323},"Representative violations surfaced by the audit, or an explicit statement that none were found.",{"type":42,"tag":174,"props":1325,"children":1326},{},[1327],{"type":48,"value":1328},"Ambiguous candidate patterns that were intentionally skipped.",{"type":42,"tag":174,"props":1330,"children":1331},{},[1332],{"type":48,"value":1333},"Every exclusion and the semantic reason it is outside the convention's cohort.",{"type":42,"tag":51,"props":1335,"children":1336},{},[1337,1339,1344],{"type":48,"value":1338},"Do not describe success as “",{"type":42,"tag":57,"props":1340,"children":1342},{"className":1341},[],[1343],{"type":48,"value":70},{"type":48,"value":1345}," passes.” Distinguish schema validation success from the codebase audit findings.",{"type":42,"tag":1347,"props":1348,"children":1349},"style",{},[1350],{"type":48,"value":1351},"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":1353,"total":503},[1354,1361],{"slug":4,"name":4,"fn":5,"description":6,"org":1355,"tags":1356,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1357,1358,1359,1360],{"name":20,"slug":21,"type":15},{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"slug":1362,"name":1362,"fn":1363,"description":1364,"org":1365,"tags":1366,"stars":25,"repoUrl":26,"updatedAt":1373},"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},[1367,1368,1369,1372],{"name":20,"slug":21,"type":15},{"name":23,"slug":24,"type":15},{"name":1370,"slug":1371,"type":15},"Debugging","debugging",{"name":17,"slug":18,"type":15},"2026-07-17T06:04:12.52326",{"items":1375,"total":1543},[1376,1394,1406,1418,1433,1448,1460,1473,1486,1499,1509,1528],{"slug":1377,"name":1377,"fn":1378,"description":1379,"org":1380,"tags":1381,"stars":1391,"repoUrl":1392,"updatedAt":1393},"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},[1382,1385,1388],{"name":1383,"slug":1384,"type":15},"Agents","agents",{"name":1386,"slug":1387,"type":15},"Automation","automation",{"name":1389,"slug":1390,"type":15},"Browser Automation","browser-automation",38346,"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fagent-browser","2026-07-20T05:55:17.314329",{"slug":1395,"name":1395,"fn":1396,"description":1397,"org":1398,"tags":1399,"stars":1391,"repoUrl":1392,"updatedAt":1405},"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},[1400,1401,1404],{"name":1386,"slug":1387,"type":15},{"name":1402,"slug":1403,"type":15},"AWS","aws",{"name":1389,"slug":1390,"type":15},"2026-07-17T06:08:33.665276",{"slug":1407,"name":1407,"fn":1408,"description":1409,"org":1410,"tags":1411,"stars":1391,"repoUrl":1392,"updatedAt":1417},"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},[1412,1413,1414],{"name":1383,"slug":1384,"type":15},{"name":1389,"slug":1390,"type":15},{"name":1415,"slug":1416,"type":15},"Navigation","navigation","2026-07-26T05:47:42.378419",{"slug":1419,"name":1419,"fn":1420,"description":1421,"org":1422,"tags":1423,"stars":1391,"repoUrl":1392,"updatedAt":1432},"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},[1424,1427,1428,1429],{"name":1425,"slug":1426,"type":15},"API Development","api-development",{"name":1386,"slug":1387,"type":15},{"name":1389,"slug":1390,"type":15},{"name":1430,"slug":1431,"type":15},"Web Scraping","web-scraping","2026-07-20T06:24:11.928835",{"slug":1434,"name":1434,"fn":1435,"description":1436,"org":1437,"tags":1438,"stars":1391,"repoUrl":1392,"updatedAt":1447},"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},[1439,1440,1441,1444],{"name":1389,"slug":1390,"type":15},{"name":1370,"slug":1371,"type":15},{"name":1442,"slug":1443,"type":15},"QA","qa",{"name":1445,"slug":1446,"type":15},"Testing","testing","2026-07-17T06:07:41.421482",{"slug":1449,"name":1449,"fn":1450,"description":1451,"org":1452,"tags":1453,"stars":1391,"repoUrl":1392,"updatedAt":1459},"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},[1454,1455,1456],{"name":1383,"slug":1384,"type":15},{"name":1389,"slug":1390,"type":15},{"name":1457,"slug":1458,"type":15},"Desktop","desktop","2026-07-17T06:08:28.007783",{"slug":1461,"name":1461,"fn":1462,"description":1463,"org":1464,"tags":1465,"stars":1391,"repoUrl":1392,"updatedAt":1472},"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},[1466,1467,1470],{"name":1389,"slug":1390,"type":15},{"name":1468,"slug":1469,"type":15},"Messaging","messaging",{"name":1471,"slug":1461,"type":15},"Slack","2026-07-17T06:08:27.679015",{"slug":1474,"name":1474,"fn":1475,"description":1476,"org":1477,"tags":1478,"stars":1391,"repoUrl":1392,"updatedAt":1485},"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},[1479,1480,1481,1482],{"name":1386,"slug":1387,"type":15},{"name":1389,"slug":1390,"type":15},{"name":1445,"slug":1446,"type":15},{"name":1483,"slug":1484,"type":15},"Vercel","vercel","2026-07-17T06:08:28.349899",{"slug":1487,"name":1487,"fn":1488,"description":1489,"org":1490,"tags":1491,"stars":1496,"repoUrl":1497,"updatedAt":1498},"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},[1492,1495],{"name":1493,"slug":1494,"type":15},"Deployment","deployment",{"name":1483,"slug":1484,"type":15},28993,"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fagent-skills","2026-07-17T06:08:41.18374",{"slug":1500,"name":1500,"fn":1501,"description":1502,"org":1503,"tags":1504,"stars":1496,"repoUrl":1497,"updatedAt":1508},"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},[1505,1506,1507],{"name":20,"slug":21,"type":15},{"name":1493,"slug":1494,"type":15},{"name":1483,"slug":1484,"type":15},"2026-07-17T06:08:41.84179",{"slug":1510,"name":1510,"fn":1511,"description":1512,"org":1513,"tags":1514,"stars":1496,"repoUrl":1497,"updatedAt":1527},"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},[1515,1518,1521,1524],{"name":1516,"slug":1517,"type":15},"Best Practices","best-practices",{"name":1519,"slug":1520,"type":15},"Frontend","frontend",{"name":1522,"slug":1523,"type":15},"React","react",{"name":1525,"slug":1526,"type":15},"UI Components","ui-components","2026-07-17T06:05:40.576913",{"slug":1529,"name":1529,"fn":1530,"description":1531,"org":1532,"tags":1533,"stars":1496,"repoUrl":1497,"updatedAt":1542},"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},[1534,1537,1538,1541],{"name":1535,"slug":1536,"type":15},"Cost Optimization","cost-optimization",{"name":1493,"slug":1494,"type":15},{"name":1539,"slug":1540,"type":15},"Performance","performance",{"name":1483,"slug":1484,"type":15},"2026-07-17T06:04:08.327515",100]