Skip to content

chore(deps-dev): bump knip from 5.85.0 to 5.86.0#11

Closed
dependabot[bot] wants to merge 151 commits intomainfrom
dependabot/npm_and_yarn/knip-5.86.0
Closed

chore(deps-dev): bump knip from 5.85.0 to 5.86.0#11
dependabot[bot] wants to merge 151 commits intomainfrom
dependabot/npm_and_yarn/knip-5.86.0

Conversation

@dependabot
Copy link
Contributor

@dependabot dependabot bot commented on behalf of github Mar 11, 2026

Bumps knip from 5.85.0 to 5.86.0.

Release notes

Sourced from knip's releases.

Release 5.86.0

  • Rewrite import specifiers to use .ts extensions, remove tsx (#1548) (58674ade551d04ca38eea5b8273e8843eed7659d) - thanks @​wojtekmaj!
  • Add .spec-d to vitest entry files (#1556) (3123ab76745990b2483f9c8f26c9c9ad4500d4aa) - thanks @​yamachi4416!
  • Update docs for tsx → node (0418eba6dc6a0d5e1e56cce1c037b0ae6846bc64)
  • Auto-format (7142fd701f97f8a4115c4094d1007f2551c33537)
  • Add Qwik plugin (#1557) (fc668f4b59e40caddf8e9904fb50dc59de1a86f8) - thanks @​azat-io!
  • Fix Bun plugin to handle directory arguments in bun test (c112b6c68b13976e4b601c5169a09e748e67fd4f)
  • Update FAQ (b105a42610346f7b9a07071ab8f5d2d7c60b004f)
  • fix(plugin): swc with externalHelpers setting ignores @swc/helpers dependency (#1560) (4bcb1f5429d003e6e2b28e2bd65a64c849fe0786) - thanks @​bobaaaaa!
  • chore: git ignore artifacts (#1563) (4878724a6599bc80a9ef9c62d86d2805d7d8a914) - thanks @​unional!
  • Fix Vite plugin to respect root option for index.html entries (#1561) (67a56470f61cadfe1e771adc87385a98e398da2e) - thanks @​azat-io!
  • Fix Astro sharpImageService() false positive for unused sharp (#1559) (c36247cc034a14a846e94faafbdd2097f9a5d7d2) - thanks @​azat-io!
  • Fix up gitignore test (b2c3d086be6c76791d2b60b10944df3b7b52d9fc)
  • fix: normalize Windows backslash paths in fs.watch listener to fix --watch on Windows (#1558) (b86b421ec9f6bf1c930600c5109511712af3d224) - thanks @​Aiudadadadf!
  • Fix wrangler plugin not enabled by jsonc config (#1564) (00bb1be35386300e6ea302c14a9b15e3f6e03b35) - thanks @​DaniFoldi!
  • Edit AGENTS.md (a2aaf2f9983e24b881191403bd716bd1ee791c70)
  • Fix tsconfig presets marked as unlisted in strict mode (resolve #1568) (463d67dad5f105cc2a76ce847192a9a7d1fb8498)
  • oxcellent (8a602c7863b63b1a940584e2a0436b70d8650be8)
  • Refactor format test and use prettier for consistent results (b6afc01828f884f579747e6d8e425aa1b07a068f)
  • Sort package.json (d3a521b62d4ba5de05d3497b456cf9d225a743c8)
  • Add .git to GLOBAL_IGNORE_PATTERNS (resolve #1571) (4e95ffb45748fa1ae84548c1992d2947826d2667)
  • Detect Yarn plugins that are listed by their path alone (#1574) (de4c7d898f83a52ea80a374d9395bcb109f39c23) - thanks @​robintown!
  • Start using unbash (a5de2c4e49bda454f0e42b4e5bfae54024d27772)
  • Bump unbash & simplify bash parser further (57896d32c86412ad5941c67fbb2fc29882a5bafa)
  • Fix refs in workspaces fixture (#1578) (fbee3426ccc05eaf2fcaa069826cd3594f946db9)
  • Include a few more entry patterns with pageExtensions (resolve #1581) (c6a6d9e72b7674392cb58675befcc4c6bbb64e11)
  • Clean exit if --fix fixes all issues (resolve #1577) (c182c29e35748ff044048c578b6bf7dd99dae9a8)
  • Document JSDoc tag hints (0e7b6ae8d66650da9e4aad81aa2bb7cfbd985e57)
  • Update AGENTS.md (f845462736f9fb6349c7e4bfd0f72d76df473f8c)
  • Add openapi-ts plugin (#1579) (42d1b3f5f912b37ed73ab46dc0fe07a93135413b) - thanks @​jonahsnider!
  • Migrate from js-yamlyaml (fb042ae235e57b340d167bb7bb7d7ddb0fa5b1fb)
  • pnpm dedupe (2586254448e28bd54025f5726d23bf4f95c2e886)
  • Fix plugin list order (#1587) (519ae3aca72333978c674aab0e7376c7007deaaf) - thanks @​ikeyan!
  • Fix confusing test fixtures for openapi-ts plugin (#1591) (f0083cac6c51337b1b53ee499dadcd5fa5e209ba) - thanks @​jonahsnider!
  • Off-by-1 (7d7dec6fec59ab8cddca09688d4ad05cdece1aea)
  • Don't fix compiled files (pos off) (a9fdc77fa6321e469b718131df556c37289a7dbd)
  • Add aliases from any tsconfig file in typescript plugin (resolve #1347) (ced77c707d064c5067b6dc331e76d878dc4add87)
  • Support auto-imports in Nuxt plugin (#1517) (4ce27b2f793882bc3fc8f72813b4c0c6152e5168)
  • Fix + lint .ts extension in import specifiers (d349de315a37f5ae208522abe830f1c41732779a)
  • Safe ts.isInTopLevelContextisInTopLevelScope (1819c2050440f82eb30e7be9d271298e6b4c8f14)
  • Wrap session.handleFileChanges in try/catch (185afb8cc6b914df31ca0c22315190e44c2834da)
  • Improve MDX compiler (9205e2a9480182605975687ebc4282f9805da58b)
  • fix(playwright): Add missing built-in null reporter (#1596) (0f1ce7d1bba7a80ce0697378efd2be0968383a86) - thanks @​shrink!
  • Add package.json#imports as entry points (1fbe286046bd51653fff4139b4b8a0ef1ea04193)
  • Update some dependencies + dedupe (381241e2e1e1875da7e34baee6b5d00f0aef0295)
  • Add support for extends in nuxt plugin (9fcbdf5244f81820b9a2f53d5b320e6c54fba792)
  • Update release script (f446b4f08ca48f7b135eb9da34a6388249598f1e)
Commits
  • 5abbc4a Release knip@5.86.0
  • f446b4f Update release script
  • 9fcbdf5 Add support for extends in nuxt plugin
  • 381241e Update some dependencies + dedupe
  • 1fbe286 Add package.json#imports as entry points
  • 0f1ce7d fix(playwright): Add missing built-in null reporter (#1596)
  • 9205e2a Improve MDX compiler
  • 1819c20 Safe ts.isInTopLevelContextisInTopLevelScope
  • d349de3 Fix + lint .ts extension in import specifiers
  • 4ce27b2 Support auto-imports in Nuxt plugin (#1517)
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Mario Siric and others added 30 commits February 16, 2026 00:28
Codebase intelligence engine that generates research-backed AGENTS.md,
CLAUDE.md, and .cursorrules for AI coding tools.

Features:
- TypeScript/JavaScript codebase analysis via AST parsing
- Convention detection with confidence metrics (18+ conventions)
- Command extraction from package.json (npm, yarn, pnpm, bun)
- Package role inference from exports and dependencies
- Tier classification (Public API / Internal / Generated noise)
- Hierarchical output for monorepos (root + per-package files)
- Output formats: JSON, AGENTS.md, CLAUDE.md, .cursorrules
- Library API: analyze(), format(), formatAsHierarchy()

Tested against zod, hono, react-hook-form, changesets, shadcn/ui
with an average score of 8.3/10.
…all graph, existing docs awareness

- Config file analysis: turbo.json, biome.json, tsconfig, eslint, prettier, .env.example
- Dependency versioning: exact framework versions from package.json
- Lightweight call graph: cross-file function call tracking
- Existing docs awareness: detection + --merge mode with section delimiters
- Template updates: tech stack, call graph, build tool workflow rules
- Fixed TS 5.9 compatibility (canHaveModifiers guard)
- Generalized @msteams JSDoc references to @scope/my-package-name
- 130 tests (21 new)
…lassification, architecture enrichment

- Workspace-wide command scanning: discovers db:migrate, sync:bulk, dev:worker etc. from ALL package.json files in workspace
- Technology-aware workflow rules: composes specific "when X → do Y" rules from detected tech + discovered commands (e.g., "After modifying schema → run db:generate then db:migrate")
- Role classification fix: API servers and web apps correctly classified (was "utility library")
- Richer architecture serialization: names specific implementations (SmartRouter, RegExpRouter...) instead of generic descriptions, strips percentage stats
- Default model switched to Opus for higher quality output
- 180 tests (18 new)
Workstream A: Cleanup (-371 lines of noise)
- Deleted 6 noisy convention detectors (import-patterns, export-patterns, component-patterns, error-handling, graphql-patterns, telemetry-patterns)
- Convention registry: 14 → 8 detectors (all remaining produce high-signal output)
- ConventionCategory: 10 → 4 values
- Cleaned impact-classifier and anti-pattern-detector of deleted category references

Workstream B: Refactoring
- Split 611-line llm-adapter.ts into 5 focused modules in src/llm/ (client, serializer, template-selector, hierarchical, adapter)
- Adjusted budget limits: root 80-100 lines (was 60-80), package detail 100-150 (was 60-90)
- Simplified pattern-fingerprinter: 371 → 286 lines, concrete names instead of abstract shapes

Workstream C: New Features
- Example extractor: extracts real usage snippets from test files for public API exports
- Plugin system: loads custom detectors from package.json, .autodocs/plugins/, or --plugin flag
- Mermaid diagram generator: color-coded dependency graphs for multi-package analysis
- Telemetry detector moved to examples/plugins/ as reference plugin implementation

201 tests (25 new), all passing.
CRITICAL fixes (eliminated hallucinations):
- Stop merging monorepo root deps into package deps (Bug 1.1)
  Knip no longer shows React, Medusa no longer shows React in API
- Walk up to find nearest package.json name (Bug 2.1)
  Nitro shows "nitro" not "# src"
- Root runtime no longer contaminates package analysis (Bug 1.2)
  Effect no longer shows Bun when using pnpm
- Template minimum line enforcement (Bug 5.1)
  "MUST produce at least X lines" prevents under-target output

HIGH fixes:
- Import-verified framework detection (Bug 3.1)
  Frameworks must be actually imported by source files
- Enhanced validator: framework relevance + meaningless title checks (5.2, 7.3)
- Walk-up name resolution for src/ analysis (Bug 6.1)
- Test framework fallback to root devDeps in monorepos (Bug 3.3)

MEDIUM fixes:
- Config analyzer tracks source (package vs root) for linter/formatter (1.3)
- Workspace commands include package source for attribution (4.2)

LOW fixes:
- Skip workspace:* deps from framework detection (6.2)
- Sanitize remaining percentage patterns from convention output (5.3)
- Don't report extension split when all files are same type (6.3)
- Consistent package name usage (2.2)

222 tests (21 new), 2 new test fixtures (monorepo-scope, src-analysis)
Research-backed prompting improvements to eliminate LLM hallucinations:

1. Temperature = 0: maximize determinism, minimize creative hallucination
2. XML tag restructuring: <instructions> + <analysis> separation (Claude native)
3. Grounding rules: "You are a DATA FORMATTER, not a knowledge source"
4. Fill-in-the-blank templates: {INSERT: field reference} directives
5. Few-shot example: demonstrates grounding principle concretely
6. Word count enforcement: "at least 900 words" (LLMs handle words > lines)
7. Whitelist technology validator: flags ANY tech not in analysis data
8. Length validation + retry: rejects under-minimum output

Results on previously-failing repos:
- Knip: NO React (was hallucinated), 956 words (was ~400)
- MCP SDK: NO Bun (was hallucinated), 911 words
- Sanity: NO jest.mock (was hallucinated), 997 words
  Validator caught graphql+jest+biome hallucinations → retried → clean

249 tests (27 new), all passing.
Engine v3 avg: 5.5 (5.9 excl. 2 invalid target paths)
Human avg: 7.4 | Raw LLM avg: 7.0

Key findings:
- Grounding eliminated most hallucinations but not all (React in knip persists)
- 2/10 repos had invalid target paths (MCP SDK restructured, documenso renamed)
- Engine should fail gracefully on empty directories, not fabricate content
- Domain (4.8) and Workflow (5.1) remain the structural gap
- Engine excels at: commands, conventions, API surfaces, contribution patterns
- Engine cannot replace: domain knowledge, architectural rationale, team experience
…ination-proof

Core change: 13 of 15 AGENTS.md sections are now generated directly from
verified analysis data in code. No LLM = no hallucination for Commands,
Tech Stack, Public API, Dependencies, Conventions, Workflow Rules, etc.

LLM is used only for 2 synthesis sections:
- Architecture (micro-call with ONLY directory names + exports, no tech names)
- Domain terminology (micro-call with ONLY README first paragraph)

New module: src/deterministic-formatter.ts (561 lines)
- 13 section formatters producing markdown from StructuredAnalysis
- Assembly function combining deterministic + LLM sections
- README first paragraph extraction for domain context

CLI: --llm-synthesis flag
- "deterministic" (default): new approach
- "full": legacy full-LLM approach

279 tests (30 new), zero regressions.
…ADMAP

Replace 14 historical docs (~220KB) with 3 clean documents (~24KB).
Completed plans, superseded benchmarks, and research artifacts removed.
All benchmark scores, design decisions, and the meta-tool detection plan
are preserved in consolidated form.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Security:
- Fix path boundary check in symbol-graph (startsWith → relative)
- Add plugin path validation to prevent loading outside project root
- Truncate LLM error bodies to 200 chars to prevent key leakage
- Type LLM API response instead of using any cast
- Fix pre-existing type errors in config-analyzer return types

Performance:
- Eliminate O(N²) importCount computation in buildPublicAPI
  (pre-build Map in single pass instead of nested loop)

DRY:
- Extract shared buildConfidence() to convention-extractor
  (removes 8 identical local copies across detectors)
- Deduplicate stripConventionStats between serializer and formatter
- Sync ENGINE_VERSION constant to 0.3.0 (was stale at 0.1.0)

Cleanup:
- Remove as-any casts in file-discovery, command-extractor, pipeline
- Remove dead no-op filter in scanWorkspaceCommands
- Remove process.stderr.write from library code (llm/adapter)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…er/plugin packages

Tools like Knip import 15+ frameworks for plugin support. The engine previously
reported "Uses Express," "Uses React hooks" as conventions — misleading because
these tools ANALYZE frameworks, they don't USE them.

Adds a 3-signal cascading detector (reviewed through 12 adversarial reviews):
- Signal 1: peerDependencies (≥3 framework families) — highest confidence
- Signal 2: Dependency placement (≥4 devDep-only families) — high confidence
- Signal 3: Family count fallback (>5 families) — safety net

Key design decisions:
- Framework family deduplication (react+react-dom = 1 family, not 2)
- Format-time reclassification (analysis keeps all data, formatting decides)
- Dominant family exemption (host framework conventions preserved, gated on
  production deps + ≥3x import margin)
- Type-only imports excluded from all signals
- --no-meta-tool escape hatch

Also fixes type-only import gap in pipeline.ts allImportedModules collection
and 3 ecosystem detector fallback paths (import type was incorrectly counted
as framework usage).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Design document for the cascading multi-signal meta-tool detector.
Refined through 3 rounds of adversarial review (12 reviews from
GPT-5, Grok 4, Opus 4.6, Gemini 3 Pro).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Hook detector:
- Only report hook conventions if the package has value imports from
  React/Preact (not just any use* function export)
- Require ≥3 total hook calls for the "React hook usage distribution"
  convention (filters noise like a single useState in 2,427 files)

README extraction:
- Rewrite extractFirstParagraph to handle HTML blocks (<h1>, <div>,
  <a>, etc.) that are common at the top of READMEs (logos, badges)
- Require ≥20 characters of content before considering a line
- Skip domain terminology LLM call when README context is <50 chars

Verified: Knip no longer shows "React hooks used across source files"
convention. README extraction correctly finds the prose paragraph in
repos with HTML-heavy README headers (Knip, Excalidraw).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…, dead import

From external principal engineer review:

1. Workflow rules now generated for single-package analysis (not just
   monorepos). Biome, test framework, and Turbo rules fire from
   configAnalysis and packageCommands without needing workspace context.
2. Remove high-impact convention duplication — conventions were appearing
   in both Workflow Rules and Conventions sections. Removed from workflow
   rules (they belong in Conventions).
3. Fix monorepo title with trailing slash — split("/").pop() on
   "/foo/bar/" returned "". Now filters empty segments first.
4. Remove unused AntiPattern type import from deterministic-formatter.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- ARCHITECTURE.md: add meta-tool detection stage (#8 in pipeline),
  meta-tool-detector.ts to module inventory, update output architecture
  to mention supported frameworks section and format-time reclassification
- ROADMAP.md: complete rewrite reflecting current state (299 tests,
  meta-tool detection shipped, benchmark results), 4-phase plan
  (ship → distribute → quality → differentiation), explicit deprioritization
- Remove META-TOOL-DETECTION-PLAN.md (fully implemented in commit 6701aa7)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Auto-detects project structure and generates AGENTS.md without any flags:
- Monorepo detection from package.json workspaces, pnpm-workspace.yaml
- Package discovery from workspace glob patterns (packages/*, apps/*, etc.)
- Package manager detection from lockfiles
- API key availability check (JSON fallback when no key)
- Single-package: flat AGENTS.md output
- Multi-package: hierarchical root + per-package detail files

Tested on: own repo (single), Knip (6 packages), Effect (37 packages).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…stic output

- Quick Start now uses `npx autodocs-engine init` (zero-config)
- Tested On table updated: 10 repos with hallucination and meta-tool columns
- "How It Works" reflects 8-stage pipeline including meta-tool detection
- Library API examples use formatDeterministic (recommended over full-LLM)
- CLI reference includes init subcommand and --no-meta-tool flag
- Highlights hallucination-free output (14/16 deterministic sections)
- Contributing section updated with 307 test count

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Composite action that analyzes TypeScript repos on PRs and posts a
comment with detected commands, conventions, workflow rules, and
public API summary.

Usage:
  - uses: msiric/autodocs-engine@v1
    with:
      anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}

Features:
- Zero config — auto-detects project structure
- Updates existing comment on subsequent pushes (no spam)
- Works without API key (structural analysis only)
- Shows meta-tool detection results when applicable

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
File discovery now excludes common non-source directories from BOTH
the git ls-files path AND the filesystem walk fallback:
- fixtures, __fixtures__ (test data)
- examples, playground (demos)
- e2e (end-to-end test infrastructure)

Previously DEFAULT_EXCLUDE_DIRS only applied to the FS walk. The
git ls-files path returned all tracked files, causing test fixtures
to pollute analysis (React hooks from hooks-pkg fixture, commander
from fixture package.json, etc.).

Verified across 7 benchmark repos — all use these directory names
for non-source code (sanity, medusa, vercel/ai, effect, excalidraw,
knip, nitro).

Also commits the engine's own AGENTS.md — dogfooding the tool.
Clean output: correct commands, tech stack, public API, conventions.
No fixture pollution.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…iles

Team Knowledge:
Replace the generic "Add project-specific context here" placeholder with
contextual questions derived from the analysis. The engine asks 3-7 specific
questions it knows are important but can't answer from code alone:
- Directory patterns → "What's the process for adding a new detector?"
- Call graph complexity → "Are there changes requiring multiple file updates?"
- CLI detection → "CLI-specific behaviors AI tools should know about?"
- Missing CONTRIBUTING.md → "What's the contribution workflow?"
- Multiple commands → "Are there ordering requirements?"
- Test conventions → "What's the testing philosophy?"

Questions are HTML comments (clean when viewed, prompts when editing).

Fixture exclusion:
Apply DEFAULT_EXCLUDE_DIRS to git ls-files results (previously only applied
to FS walk fallback). Excludes fixtures/, __fixtures__/, examples/,
playground/, e2e/ from analysis. Knip drops from 2,427 to 858 files (65%
reduction) and no longer falsely triggers as meta-tool.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Strip "Feature: " prefix from directory purpose labels in prompted
questions. "8 feature: detectors files" → "8 detectors files".
Path now in backticks for readability.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New deterministic section computed from the existing call graph via BFS:

- High-impact functions: most callers (transitive via reverse BFS).
  "callLLMWithRetry has 9 callers — Moderate impact"
- Complex functions: most callees (orchestrators with many dependencies).
  "runPipeline calls 6 functions — Moderate complexity"

Computation in new src/impact-radius.ts:
- Builds reverse + forward adjacency maps from CallGraphEdge[]
- BFS for transitive reachability (callers-of-callers)
- In-degree (callers) and out-degree (calls) per function
- Impact/complexity labels based on count thresholds

No LLM involved — pure graph analysis on existing data.
Only shown when call graph has ≥10 edges.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…in signals

Three fixes to the role inferrer:

1. Remove get(?=[A-Z]) from data fetching pattern — matched "get" inside
   compound words (formatBudgetReport → "data fetching", getBoundingBox
   → "data fetching"). Every repo with getX functions was falsely tagged.

2. Raise domain signal threshold from ≥1 to ≥2 matches — a single
   validateOutput in an analysis engine shouldn't label the domain as
   "validation."

3. Prefer package.json description when available (>15 chars) over
   domain signal composition. Descriptions are author-written and
   accurate: "Codebase intelligence engine" beats "data fetching,
   validation."

Results across benchmark repos:
- autodocs-engine: "data fetching, validation" → "Codebase intelligence engine..."
- excalidraw: "CRUD, data fetching, UI rendering" → "Excalidraw as a React component"
- vercel-ai: "CRUD, data fetching, permissions" → "AI SDK by Vercel..."
- knip: "CLI tool" → "CLI tool — Find and fix unused dependencies..."

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Complete rewrite of BENCHMARKS.md reflecting the latest engine (v5):
- Structural validation: 0 hallucinations across all 10 repos
- Side-by-side comparison: what engine does better vs what humans do better
- Role descriptions now from package.json (all accurate)
- New sections documented: Change Impact, prompted Team Knowledge
- Historical v1-v3 scores preserved for context
- Clear "structural 60% vs operational 40%" positioning

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. GitHub Action multi-package: show all package names + stats for monorepos
   (was only showing packages[0])
2. GitHub Action errors: remove 2>/dev/null so failures appear in CI logs
   (was silently swallowing all errors)
3. Roadmap: remove turbo.json from monorepo detection claim (turbo.json is
   a build orchestrator, not a workspace declaration)
4. Team Knowledge: change from HTML comments to visible markdown checkboxes
   (AI tools and humans can now both see the prompted questions)
5. Impact labels: lower thresholds (Critical ≥15, High ≥8, Moderate ≥3)
   so 9-caller functions are "High" not "Moderate" in typical codebases
6. Filter test framework from Key Dependencies (vitest was #2 dep above
   typescript — already shown in Tech Stack, redundant in deps)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Computes file-to-file import coupling from the SymbolGraph's import graph
and generates workflow rules for high-coupling source files.

Example output:
  When modifying src/types.ts → Also check: src/analysis-builder.ts
  (17 symbols), src/ast-parser.ts (8 symbols), and 9 more

How it works:
- For each file, resolves relative imports to actual file paths
- Counts distinct imported symbols per source file
- Keeps high-coupling pairs (≥5 symbols from a single source)
- Groups by source file, generates rules for files with ≥3 dependents
- Caps at 5 rules, sorted by number of dependent files

The import graph is a transient structure on SymbolGraph that was
previously discarded after pipeline execution. Now captured before
disposal and stored as importChain on PackageAnalysis.

Rules integrate into the existing Workflow Rules section as standard
WorkflowRule objects alongside technology-aware rules.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extends contribution pattern detection from shallow ("create file in dir")
to deep recipes with 3 new signals:

1. Common imports: detects shared imports across ≥80% of sibling files
   e.g., "Import Convention, ConventionDetector from ../types.js (8/8 siblings)"

2. Export naming suffix: detects when ≥80% of exports share a suffix
   e.g., "Export as {name}Detector (naming convention)"

3. Registration file: detects external file that aggregates most exports
   e.g., "Register in src/convention-extractor.ts"

Also fixes T2 exclusion: detectors, llm modules, templates were invisible
because the detector only examined T1 (public API) files.

Results on benchmark repos:
- autodocs-engine: detectors pattern with 5 steps (was 0 — invisible)
- excalidraw: 33/39 actions import `register` from ./register
- vercel-ai: 4/5 embed files share Embedding/EmbeddingModel types

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Use export suffix or directory name as section header instead of
  generic "function" (### Detector, ### llm, ### Template)
- Remove duplicate "Create" line — the header showed the same info
  as step 1, now header shows example file and step 1 shows Create

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Mario Siric added 8 commits March 16, 2026 23:00
New CLI command generates a self-contained HTML report with 5 sections:

1. Module Dependencies — Mermaid directed graph of directory-level
   import relationships, edge thickness by symbol count
2. Co-Change Clusters — Grouped cards showing files that always change
   together, plus implicit coupling (co-change without imports)
3. Execution Flows — Step-by-step pipelines with co-change confidence
   scores (green=validated, gray=structural only)
4. Blast Radius Explorer — Interactive dropdown: select a file, see
   importers, co-change partners, and cluster membership
5. Conventions — DO/DON'T rules from 13 AST-based detectors

Self-contained HTML (Mermaid via CDN, everything else inline CSS/JS).
Dark mode support via prefers-color-scheme. XSS-safe (all output escaped).

Usage: npx autodocs-engine visualize [path]
Replaces Mermaid static graph with D3 force-directed topology:
- Nodes = directories, sized by file count, colored by cluster
- Edges = import relationships (solid) + co-change (dashed amber)
- Edge thickness proportional to symbol coupling strength
- Draggable nodes with force simulation
- Click node to see blast radius in side panel (importers,
  co-change partners, cluster membership)
- Click background to deselect
- Dark mode support via prefers-color-scheme
- Responsive layout (side panel collapses on mobile)

Also improves execution flow rendering with connected pipeline
boxes (no more arrow characters) and adds hover effects on
stat cards and cluster cards.

D3 v7 loaded via CDN (~90KB gzipped). File remains self-contained.
Complete rewrite of the visual report as a full-viewport interactive
experience. The graph IS the page — no dashboard, no sections, no
framework. Pure D3 on a dark canvas.

Design:
- Full-viewport SVG with dark (#0a0a0f) background
- Floating header with project name, type badge, and stat counters
- Three edge types visible simultaneously:
  solid gray = imports, dashed amber = co-change, dotted pink = implicit
- Nodes sized by file count, colored by cluster membership
- Click node: everything dims, connections highlight, slide-in panel
  shows blast radius (importers, co-change partners, cluster membership)
- SVG glow filter on selected nodes
- Bottom drawer for execution flows + conventions (collapsed by default)
- Legend in bottom-left corner

No daisyUI, no shadcn, no Tailwind, no framework — pure CSS + D3.
Self-contained HTML file, opens in any browser.
Adds visualizer, benchmarks, performance/security fixes, and
updated test count (781 across 54 files).
Two fixes for repos with many directories (e.g., cal.com: 139 dirs):

1. Node clamping: D3 tick handler now constrains all node positions
   to within 60px of viewport edges. Nodes can no longer escape
   the visible area regardless of force simulation dynamics.

2. Adaptive directory depth: when full-depth aggregation produces
   >30 directory nodes, progressively reduces path depth (3→2→1
   segments) until the node count fits. Cal.com: 139→14 nodes.

Also scales force parameters (charge, link distance, collision radius,
node size, font size) based on node count for consistent density across
small repos (12 nodes) and large repos (30+ nodes).
On macOS, /tmp is a symlink to /private/tmp. When a repo is at
/tmp/foo, resolve() gives /tmp/foo but git --show-toplevel returns
/private/tmp/foo. The relative() computation then produces a
traversal path instead of the expected prefix.

Fix: use realpathSync() on both repoDir and pkgDir before computing
relative paths against the git root. This resolves symlinks so that
relative() works correctly regardless of how the path was originally
specified.

Impact: hono went from 0 commits → 225 commits, 0 → 16 co-change
edges, 0 → 1 cluster when accessed via /tmp symlink path.
Visualization:
- Added "colored nodes = co-change cluster" to the legend (was unexplained)
- Fixed drawer toggle button floating above container (removed padding gap)

Co-change analysis:
- RECENCY_DAYS increased from 45 to 180 days. The 45-day window was
  too aggressive for monorepo packages with bursty development — Effect
  had 19 co-change pairs but 17 were filtered because the package's last
  active period was 60-150 days ago. At 180 days, 15 of 19 pairs survive.

Impact: Effect went from 0 co-change edges → 5 edges, 0 → 1 cluster,
0 → 3 implicit coupling. No benchmark regression (corpus uses static
fixture data, not live git analysis).
@dependabot dependabot bot force-pushed the dependabot/npm_and_yarn/knip-5.86.0 branch from dbcc4cd to 8a0b92f Compare March 17, 2026 00:57
Mario Siric added 7 commits March 17, 2026 02:08
…graph

Double-click any directory node to expand it into individual file nodes:
- Files arranged in a mini force simulation around the directory center
- Internal import edges (file→file within directory) shown as thin lines
- Internal co-change edges shown as dashed amber lines
- File node size proportional to import count (hub files are larger)
- Subtle ellipse background in cluster color marks the expanded region
- Click a file node for file-level blast radius in the side panel
- Double-click again or click background to collapse back

Data: filesByDir map added to graph JSON containing per-directory file
lists with name, path, and importedBy count. No additional engine
data needed — expansion uses the existing IM/CC arrays client-side.

Only one directory can be expanded at a time to prevent visual overload.
Directories with <2 files don't expand (nothing to show).
collapseDir now runs before closePanel to prevent opacity conflicts.
Restored node explicitly gets full opacity and normal circle styling.
Fixes the bug where clicking background after expanding a directory
would leave the directory node invisible.
Complete rewrite of graph model: instead of directory-level nodes with
expand/collapse, every file is a node from the start. Files naturally
cluster by directory via D3 force simulation (forceX/forceY toward
directory centroids spread evenly across the viewport).

Visual design:
- Each file is a circle sized by import count (hub files are larger)
- Color = directory group (consistent palette per directory)
- Large faded directory name labels float at cluster centroids
- Import edges as thin subtle lines, co-change as dashed amber,
  implicit coupling as dotted pink
- Labels shown only for files above an import threshold (reduces clutter)
- Click a file for blast radius detail in side panel

Removed all expand/collapse logic — simpler code, simpler UX, no
interaction bugs. Force parameters scale with node count (works from
10 to 150+ nodes).
Each directory's files are now enclosed in a rounded convex hull:
- Subtle colored fill (4% opacity) + thin colored stroke (12%)
- Directory name label positioned above the hull
- Hull dynamically reshapes as force simulation runs / nodes are dragged
- Handles 1-node (circle), 2-node (capsule), and 3+ node (polygon) cases

Makes it immediately clear which files belong to which directory
without needing the old expand/collapse interaction.
- Clusters spread across 76% of viewport (was 60%)
- Directory clustering force 0.35 (was 0.15) — much tighter grouping
- ALL file labels visible (was only high-import files)
- Bigger nodes (r=5-19px, was 3-9px)
- Prominent directory labels (13px bold, 70% opacity, above hull top)
- Directory labels are clickable — shows file list and co-change detail
- Larger hull padding (30px) for visual breathing room
- Clickable hull areas and panel items for fluid graph navigation
- Clickable edges with connection detail panel
- Full file extensions in labels (no more ambiguous stripped names)
- Selected node/folder visual emphasis (text size, hull border)
- CSS class-based dim/highlight (2800→640 DOM writes per selection)
- Remove SVG filter on edges (288 GPU blur passes → 0)
- Remove .raise() on edges (288 DOM reorders → 0)
- Pre-computed indexes: dirNodes map, adjacency list, resolved edge IDs
- Consolidated tick handler (3× filter scans per dir → 1 lookup)
@dependabot dependabot bot force-pushed the dependabot/npm_and_yarn/knip-5.86.0 branch from 8a0b92f to f65724a Compare March 17, 2026 02:21
@dependabot dependabot bot force-pushed the dependabot/npm_and_yarn/knip-5.86.0 branch from f65724a to 1247ad9 Compare March 17, 2026 02:24
Mario Siric added 2 commits March 17, 2026 03:31
Implicit coupling (co-change without import) is strictly more
informative than plain co-change for the same file pair. Skip
co-change edges when implicit coupling exists, making the pink
dotted lines visible instead of hidden behind yellow dashed ones.
@dependabot dependabot bot force-pushed the dependabot/npm_and_yarn/knip-5.86.0 branch from 1247ad9 to a8b2286 Compare March 17, 2026 02:33
Mario Siric and others added 2 commits March 17, 2026 03:56
Full rename across the entire codebase:
- npm package: autodocs-engine → synaps
- CLI binary: autodocs-engine → synaps
- Hook script: autodocs-hook.cjs → synaps-hook.cjs
- Environment vars: AUTODOCS_* → SYNAPS_*
- Config dir: ~/.autodocs/ → ~/.synaps/
- Config file: autodocs.config.json → synaps.config.json
- Log prefixes: [autodocs] → [synaps]
- MCP resource URIs: autodocs:// → synaps://
- Output files: autodocs-report.html → synaps-report.html
- HTML delimiters: autodocs:start/end → synaps:start/end
- All documentation and GitHub URLs updated
Bumps [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) from 5.85.0 to 5.86.0.
- [Release notes](https://github.com/webpro-nl/knip/releases)
- [Commits](https://github.com/webpro-nl/knip/commits/knip@5.86.0/packages/knip)

---
updated-dependencies:
- dependency-name: knip
  dependency-version: 5.86.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot bot force-pushed the dependabot/npm_and_yarn/knip-5.86.0 branch from a8b2286 to d5b2291 Compare March 17, 2026 02:57
@msiric msiric closed this Mar 17, 2026
@dependabot @github
Copy link
Contributor Author

dependabot bot commented on behalf of github Mar 17, 2026

OK, I won't notify you again about this release, but will get in touch when a new version is available. If you'd rather skip all updates until the next major or minor version, let me know by commenting @dependabot ignore this major version or @dependabot ignore this minor version. You can also ignore all major, minor, or patch releases for a dependency by adding an ignore condition with the desired update_types to your config file.

If you change your mind, just re-open this PR and I'll resolve any conflicts on it.

@dependabot dependabot bot deleted the dependabot/npm_and_yarn/knip-5.86.0 branch March 17, 2026 03:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant