<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/</id>
    <title>eslint-plugin-typedoc Blog</title>
    <updated>2026-03-11T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/"/>
    <subtitle>Updates, architecture notes, and practical guidance for eslint-plugin-typedoc users.</subtitle>
    <icon>https://nick2bad4u.github.io/eslint-plugin-typedoc/img/favicon.ico</icon>
    <rights>© 2026 Nick2bad4u</rights>
    <entry>
        <title type="html"><![CDATA[Keeping Rule Docs and Presets in Sync]]></title>
        <id>https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/keeping-rule-docs-and-presets-in-sync/</id>
        <link href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/keeping-rule-docs-and-presets-in-sync/"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[How eslint-plugin-typefest keeps docs tables, preset matrices, and rule metadata aligned through canonical generators.]]></summary>
        <content type="html"><![CDATA[<p>Documentation drift is one of the easiest ways to lose trust in a lint plugin.</p>
<!-- -->
<p>This repository treats metadata-to-doc synchronization as a first-class quality gate, not a best-effort cleanup task.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="The-core-principle">The core principle<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/keeping-rule-docs-and-presets-in-sync/#The-core-principle" class="hash-link" aria-label="Direct link to The core principle" title="Direct link to The core principle" translate="no">​</a></h2>
<p>Human-written explanation should stay human.</p>
<p>Mechanically derivable data should be generated and tested.</p>
<p>For us, that includes:</p>
<ul>
<li class="">README rules matrix</li>
<li class="">presets rules matrix</li>
<li class="">rule metadata snapshots and integrity contracts</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="What-this-prevents">What this prevents<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/keeping-rule-docs-and-presets-in-sync/#What-this-prevents" class="hash-link" aria-label="Direct link to What this prevents" title="Direct link to What this prevents" translate="no">​</a></h2>
<p>Without canonical generation, drift appears quickly:</p>
<ul>
<li class="">rule added to a preset but matrix unchanged</li>
<li class="">fix/suggestion capability changes but docs lag</li>
<li class="">links and IDs diverge between source and docs</li>
</ul>
<p>That leads to wrong migration guidance and unnecessary issue churn.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="How-we-enforce-it">How we enforce it<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/keeping-rule-docs-and-presets-in-sync/#How-we-enforce-it" class="hash-link" aria-label="Direct link to How we enforce it" title="Direct link to How we enforce it" translate="no">​</a></h2>
<ul>
<li class="">sync scripts produce canonical matrix sections</li>
<li class="">CI checks fail when docs and generated sections diverge</li>
<li class="">docs integrity tests enforce stable heading/catalog conventions</li>
</ul>
<p>The result is less manual bookkeeping and fewer review-time surprises.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Practical-maintenance-advice">Practical maintenance advice<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/keeping-rule-docs-and-presets-in-sync/#Practical-maintenance-advice" class="hash-link" aria-label="Direct link to Practical maintenance advice" title="Direct link to Practical maintenance advice" translate="no">​</a></h2>
<p>When changing rules or preset composition:</p>
<ol>
<li class="">update rule source and metadata</li>
<li class="">run matrix sync scripts</li>
<li class="">run docs integrity and snapshot suites</li>
<li class="">only then review prose-level docs edits</li>
</ol>
<p>This ordering keeps intent and generated truth aligned.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Related-docs">Related docs<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/keeping-rule-docs-and-presets-in-sync/#Related-docs" class="hash-link" aria-label="Direct link to Related docs" title="Direct link to Related docs" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/developer/charts/rule-catalog-and-doc-sync" target="_blank" rel="noopener noreferrer" class="">Rule catalog and docs synchronization chart</a></li>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/developer/charts/preset-composition-and-rule-matrix" target="_blank" rel="noopener noreferrer" class="">Preset composition and rule matrix chart</a></li>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/presets" target="_blank" rel="noopener noreferrer" class="">Presets page</a></li>
</ul>]]></content>
        <author>
            <name>Nick2bad4u</name>
            <uri>https://github.com/Nick2bad4u</uri>
        </author>
        <category label="eslint" term="eslint"/>
        <category label="documentation" term="documentation"/>
        <category label="automation" term="automation"/>
        <category label="adr" term="adr"/>
        <category label="quality" term="quality"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Type-Aware Linting Without Surprises]]></title>
        <id>https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/type-aware-linting-without-surprises/</id>
        <link href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/type-aware-linting-without-surprises/"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Practical adoption strategy for typed ESLint rules using guard-first execution and predictable fallbacks.]]></summary>
        <content type="html"><![CDATA[<p>Type-aware rules are powerful, but they become noisy fast when parser-service assumptions are unclear.</p>
<!-- -->
<p>The goal is not “run typed rules everywhere immediately.” The goal is predictable behavior under real project conditions.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="The-contract-we-want">The contract we want<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/type-aware-linting-without-surprises/#The-contract-we-want" class="hash-link" aria-label="Direct link to The contract we want" title="Direct link to The contract we want" translate="no">​</a></h2>
<p>A healthy typed-rule setup has three explicit outcomes:</p>
<ol>
<li class=""><strong>Typed path available</strong>: semantic checks run with parser services + checker.</li>
<li class=""><strong>Optional typed path unavailable</strong>: semantic branch is skipped safely.</li>
<li class=""><strong>Required typed path unavailable</strong>: fail fast with a clear configuration signal.</li>
</ol>
<p>That split keeps failures actionable and prevents silent drift.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Why-guard-first-design-matters">Why guard-first design matters<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/type-aware-linting-without-surprises/#Why-guard-first-design-matters" class="hash-link" aria-label="Direct link to Why guard-first design matters" title="Direct link to Why guard-first design matters" translate="no">​</a></h2>
<p>In large codebases, parser-service availability is not uniform:</p>
<ul>
<li class="">different <code>tsconfig</code> scopes</li>
<li class="">mixed package boundaries</li>
<li class="">generated or excluded files</li>
</ul>
<p>Guard-first execution avoids brittle behavior by making typed entry conditions explicit.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Rollout-pattern-that-works">Rollout pattern that works<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/type-aware-linting-without-surprises/#Rollout-pattern-that-works" class="hash-link" aria-label="Direct link to Rollout pattern that works" title="Direct link to Rollout pattern that works" translate="no">​</a></h2>
<ul>
<li class="">Start in one folder/package.</li>
<li class="">Measure with <code>--stats</code> before and after enabling typed checks.</li>
<li class="">Promote from <code>warn</code> to <code>error</code> once baseline noise is gone.</li>
<li class="">Expand scope only when performance and diagnostics stay stable.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="What-to-track">What to track<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/type-aware-linting-without-surprises/#What-to-track" class="hash-link" aria-label="Direct link to What to track" title="Direct link to What to track" translate="no">​</a></h2>
<ul>
<li class="">typed-rule error rate tied to config gaps</li>
<li class="">lint runtime deltas after enabling typed presets</li>
<li class="">rule-level hotspots that call checker APIs most often</li>
</ul>
<p>If those stay stable, typed linting remains a quality upgrade instead of a workflow tax.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Related-docs">Related docs<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/type-aware-linting-without-surprises/#Related-docs" class="hash-link" aria-label="Direct link to Related docs" title="Direct link to Related docs" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/developer/typed-paths" target="_blank" rel="noopener noreferrer" class="">Typed service path inventory</a></li>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/developer/charts/typed-rule-semantic-analysis-flow" target="_blank" rel="noopener noreferrer" class="">Typed rule semantic analysis flow</a></li>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/guides/type-aware-linting-readiness" target="_blank" rel="noopener noreferrer" class="">Type-aware linting readiness guide</a></li>
</ul>]]></content>
        <author>
            <name>Nick2bad4u</name>
            <uri>https://github.com/Nick2bad4u</uri>
        </author>
        <category label="eslint" term="eslint"/>
        <category label="typescript" term="typescript"/>
        <category label="parser-services" term="parser-services"/>
        <category label="architecture" term="architecture"/>
        <category label="performance" term="performance"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Designing Safe Autofixes for eslint-plugin-typefest]]></title>
        <id>https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/</id>
        <link href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/"/>
        <updated>2026-02-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[How eslint-plugin-typefest decides between automatic fixes and suggestions to protect runtime behavior.]]></summary>
        <content type="html"><![CDATA[<p>Autofix is one of the biggest quality-of-life features in ESLint, but it is also one of the fastest ways to damage trust if a rule gets it wrong.</p>
<!-- -->
<p>In this plugin, a fix is not accepted just because it is convenient. A fix must be safe.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="The-safety-bar">The safety bar<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/#The-safety-bar" class="hash-link" aria-label="Direct link to The safety bar" title="Direct link to The safety bar" translate="no">​</a></h2>
<p>Before a fixer is enabled, the rule needs confidence in three areas:</p>
<ol>
<li class=""><strong>Semantic stability:</strong> The rewritten code must keep the same runtime meaning.</li>
<li class=""><strong>Syntactic stability:</strong> The output must stay valid TypeScript in real files.</li>
<li class=""><strong>Formatting stability:</strong> The change should cooperate with normal formatter and linter workflows.</li>
</ol>
<p>If any of those checks are uncertain, we downgrade to a suggestion.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Fix-versus-suggestion">Fix versus suggestion<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/#Fix-versus-suggestion" class="hash-link" aria-label="Direct link to Fix versus suggestion" title="Direct link to Fix versus suggestion" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Use-fix-when">Use <code>fix</code> when<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/#Use-fix-when" class="hash-link" aria-label="Direct link to Use-fix-when" title="Direct link to Use-fix-when" translate="no">​</a></h3>
<ul>
<li class="">the transformation is deterministic,</li>
<li class="">there are no ambiguous symbols or scope collisions,</li>
<li class="">and the replacement can be generated from source text without structural guesswork.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Use-suggest-when">Use <code>suggest</code> when<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/#Use-suggest-when" class="hash-link" aria-label="Direct link to Use-suggest-when" title="Direct link to Use-suggest-when" translate="no">​</a></h3>
<ul>
<li class="">there is a meaningful chance of behavior change,</li>
<li class="">user intent cannot be derived from syntax alone,</li>
<li class="">or code style constraints vary across teams.</li>
</ul>
<p>This keeps automation helpful without becoming risky.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Why-this-matters-in-TypeScript-heavy-codebases">Why this matters in TypeScript-heavy codebases<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/#Why-this-matters-in-TypeScript-heavy-codebases" class="hash-link" aria-label="Direct link to Why this matters in TypeScript-heavy codebases" title="Direct link to Why this matters in TypeScript-heavy codebases" translate="no">​</a></h2>
<p>TypeScript projects frequently rely on utility types, narrowings, and overloaded APIs. Small rewrites can accidentally change constraints or type inference behavior.</p>
<p>A conservative strategy means developers still get guidance and one-click migrations, but only in places where the rule can prove safety.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Practical-rollout-advice">Practical rollout advice<a href="https://nick2bad4u.github.io/eslint-plugin-typedoc/blog/designing-safe-autofixes-for-eslint-plugin-typefest/#Practical-rollout-advice" class="hash-link" aria-label="Direct link to Practical rollout advice" title="Direct link to Practical rollout advice" translate="no">​</a></h2>
<p>If your team is adopting this plugin:</p>
<ol>
<li class="">Start with a baseline preset.</li>
<li class="">Enable autofix in CI only after reviewing suggestion quality.</li>
<li class="">Move stricter rules from suggestion-first to fix-first once confidence is high.</li>
</ol>
<p>That progression gives teams predictable upgrades instead of disruptive churn.</p>]]></content>
        <author>
            <name>Nick2bad4u</name>
            <uri>https://github.com/Nick2bad4u</uri>
        </author>
        <category label="eslint" term="eslint"/>
        <category label="autofix" term="autofix"/>
        <category label="typescript" term="typescript"/>
        <category label="static-analysis" term="static-analysis"/>
        <category label="developer-experience" term="developer-experience"/>
    </entry>
</feed>