diff --git a/analysis/file-types.mdx b/analysis/file-types.mdx
index d25bc65..57fe3a8 100644
--- a/analysis/file-types.mdx
+++ b/analysis/file-types.mdx
@@ -294,6 +294,6 @@ Fallow analyzes more than `.js` and `.ts` files. It extracts imports and exports
How fallow builds the module graph and detects unused code.
- 123 framework plugins for automatic entry point detection.
+ Built-in framework plugins for automatic entry point detection.
diff --git a/cli/list.mdx b/cli/list.mdx
index 079c830..aeeef1d 100644
--- a/cli/list.mdx
+++ b/cli/list.mdx
@@ -8,7 +8,7 @@ icon: "terminal"
Inspect what fallow discovered in your project. Use this command to debug configuration issues or verify that the right files, entry points, plugins, and boundary zones are being picked up.
- Use `fallow list --plugins` to verify which of the 123 built-in plugins are active for your project.
+ Use `fallow list --plugins` to verify which built-in plugins are active for your project.
```bash
@@ -166,7 +166,7 @@ Each entry point shows how it was discovered. The plugin name tells you which fr
- Full list of fallow's 123 built-in framework plugins.
+ Full list of fallow's built-in framework plugins.
Create plugins for frameworks fallow doesn't cover yet.
diff --git a/explanations/fallow-vs-linters.mdx b/explanations/fallow-vs-linters.mdx
index f7764e7..3953374 100644
--- a/explanations/fallow-vs-linters.mdx
+++ b/explanations/fallow-vs-linters.mdx
@@ -230,7 +230,7 @@ This page compares fallow to linters. For a comparison with knip (which operates
Full guide for GitHub Actions, GitLab CI, and other pipelines.
- All 15 issue types fallow detects, with examples.
+ Fallow's dead code and dependency findings, with examples.
Entry points, ignore patterns, severity rules.
diff --git a/frameworks/built-in.mdx b/frameworks/built-in.mdx
index 02b1be1..1dc38b5 100644
--- a/frameworks/built-in.mdx
+++ b/frameworks/built-in.mdx
@@ -1,11 +1,11 @@
---
title: "Built-in plugins"
-description: "Fallow ships with 123 built-in plugins for Next.js, Vite, Jest, Tailwind, ESLint, and more. Auto-detected framework conventions for accurate analysis."
+description: "Built-in plugins for Next.js, Vite, Jest, Tailwind, ESLint, and more. Auto-detected framework conventions for accurate analysis."
keywords: ["plugins", "frameworks", "Next.js", "Vite", "Jest", "Tailwind", "ESLint", "auto-detect"]
icon: "puzzle-piece"
---
-Fallow ships with 123 built-in plugins for the most popular TypeScript and JavaScript tools. Each plugin teaches fallow about framework-specific conventions: entry points, config files, used exports, and tooling dependencies. Analysis is accurate out of the box.
+Fallow ships with built-in plugins for popular TypeScript and JavaScript tools. Each plugin teaches fallow about framework-specific conventions: entry points, config files, used exports, and tooling dependencies. Analysis is accurate out of the box.
Most plugins activate automatically when the relevant package is in your `package.json`. Some plugins (ESLint, Vitest) also activate when a config file is present in the workspace root, even without the package. This covers monorepos where the tool is installed at the root but workspace packages have their own config files.
diff --git a/frameworks/custom-plugins.mdx b/frameworks/custom-plugins.mdx
index d02e3ce..6baa2e3 100644
--- a/frameworks/custom-plugins.mdx
+++ b/frameworks/custom-plugins.mdx
@@ -289,7 +289,7 @@ Then reference it in your plugin file:
- Browse the 123 built-in framework plugins.
+ Browse the built-in framework and tooling plugins.
Verify active plugins and inspect project metadata.
diff --git a/public-content-manifest.json b/public-content-manifest.json
index b7b22ff..8112f1e 100644
--- a/public-content-manifest.json
+++ b/public-content-manifest.json
@@ -7,7 +7,7 @@
"visibility": "public-only"
},
"content": {
- "sha256": "d03d1879614f4121d68dc53e4741c7634303d0cd893b0b310817d9e4a82c1f65",
+ "sha256": "1aafc525f4eca77b68d05a92968ddbf2c42e04eb4fed8040a4b213ffecadbdce",
"files": [
{
"path": ".mintignore",
@@ -51,8 +51,8 @@
},
{
"path": "analysis/file-types.mdx",
- "bytes": 13669,
- "sha256": "1639607fd94f64d07b66ded784a895d56f8f59baac2bff13776920964b358f97"
+ "bytes": 13674,
+ "sha256": "ef9360427d4092bbc0a7b2f2de081f4f424d5d52ae83f13d80e7a7837b056bc2"
},
{
"path": "analysis/index.mdx",
@@ -151,8 +151,8 @@
},
{
"path": "cli/list.mdx",
- "bytes": 7367,
- "sha256": "e6a3c8805620c4cb8f95d525eaa07adedcdacd142ea70badc09a4cf023dbed3a"
+ "bytes": 7352,
+ "sha256": "1ab27749c71ebbb6b24310b8236aedd559063345a2a7fdae7a42b70af7efe24b"
},
{
"path": "cli/migrate.mdx",
@@ -276,8 +276,8 @@
},
{
"path": "explanations/fallow-vs-linters.mdx",
- "bytes": 14162,
- "sha256": "2687fe40a9be14f2f0dc9b52407eb2ce9365d2342e773abc469daf43dd7f5858"
+ "bytes": 14171,
+ "sha256": "943e4995863ba5238b46f2242d565af191d7bd8cc9f681d863519ffc662ef75f"
},
{
"path": "explanations/health.mdx",
@@ -306,13 +306,13 @@
},
{
"path": "frameworks/built-in.mdx",
- "bytes": 11860,
- "sha256": "24362a926d721f046adc54dd768ff115b1d4dfc1207fe685cb349c2c9cb958dd"
+ "bytes": 11825,
+ "sha256": "13e615841e97e7e7e227bb476241c97e406f38a82e67ce8a4b124782d10d384b"
},
{
"path": "frameworks/custom-plugins.mdx",
- "bytes": 12441,
- "sha256": "a1f273c3c2dd1d384f1051d49249d1f5f6fa98c823ad1b88554d25b7716e0983"
+ "bytes": 12449,
+ "sha256": "53c1155d268ee89a301b9926633c6421877b0afa34142dd749d667ee46028984"
},
{
"path": "frameworks/react.mdx",
@@ -431,8 +431,8 @@
},
{
"path": "quickstart.mdx",
- "bytes": 6598,
- "sha256": "d2617700651f2b49ee78ab82ffdac0bbc61ba59cef07a3f13416d5289d1f23f9"
+ "bytes": 6594,
+ "sha256": "f37ac024b0e48a30d9c69e3d7ecba6b621e7af052e3abbe6c650189ec469e009"
}
]
}
diff --git a/quickstart.mdx b/quickstart.mdx
index 170c20b..edb05a7 100644
--- a/quickstart.mdx
+++ b/quickstart.mdx
@@ -22,7 +22,7 @@ That runs three analyses in one pass:
- **Health**: complexity hotspots and refactor targets
- 123 built-in plugins cover Next.js, Vite, Ember, Wuchale, Jest, Tailwind, PandaCSS, Contentlayer, tap, tsd, and more. No configuration needed for the first run.
+ Built-in plugins cover Next.js, Vite, Ember, Wuchale, Jest, Tailwind, PandaCSS, Contentlayer, tap, tsd, and more. No configuration needed for the first run.
## 2. Run the focused commands you'll use most
diff --git a/scripts/public-content.mjs b/scripts/public-content.mjs
index b36d0e5..354611e 100644
--- a/scripts/public-content.mjs
+++ b/scripts/public-content.mjs
@@ -73,10 +73,14 @@ const LEAK_MARKERS = [
label: "private documentation alias",
pattern: /(?:^|[^\w-])\.internal\//u,
},
+ {
+ label: "plain private documentation root",
+ pattern: /(?:^|[\s([{"'=`])internal\//u,
+ },
{
label: "private cloud repository link",
pattern:
- /(?:^|[^A-Za-z0-9-])github\.com\.?(?::\d+)?(?::|\/)+fallow-rs\/fallow-cloud(?:\.git)?(?=$|[^A-Za-z0-9._-])/iu,
+ /(?:^|[^A-Za-z0-9-])github\.com\.?(?::\d+)?(?::|\/)+fallow-rs\/fallow-cloud(?:\.git)?(?=$|[/?#:\s`),.])/iu,
},
{
label: "non-public Fallow decision link",
diff --git a/scripts/public-content.test.mjs b/scripts/public-content.test.mjs
index ce7626c..6e8428c 100644
--- a/scripts/public-content.test.mjs
+++ b/scripts/public-content.test.mjs
@@ -140,6 +140,19 @@ test("public content rejects private documentation markers", async () => {
);
});
+test("public content rejects a backtick-wrapped plain private root", async () => {
+ const root = await createFixture();
+ await writeFile(
+ join(root, "analysis", "health.mdx"),
+ "Read `internal/runbook.md`\n",
+ );
+
+ await assert.rejects(
+ buildManifest(root),
+ /Found plain private documentation root/u,
+ );
+});
+
test("public content rejects private repository links", async () => {
const root = await createFixture();
await writeFile(