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.
fallow list
| Flag | Description |
|---|---|
--files | Show all discovered files |
--entry-points | Show entry point files |
--plugins | Show active plugins |
--boundaries | Show architecture boundary zones, rules, and per-zone file counts |
--workspaces | Show monorepo workspaces and workspace-discovery diagnostics (malformed package.json, unreachable glob matches, missing tsconfig references). Available as the fallow workspaces alias too. |
-f, --format <FORMAT> | Output format: human (default), json |
# Show active plugins
fallow list --plugins
# JSON output for scripting
fallow list --plugins --format jsonA malformed declared-workspace package.json, a workspace glob that matches a directory without package.json, or a tsconfig reference pointing at a missing directory all surface as workspace_diagnostics[] entries with a kind discriminator:
kind | When |
|---|---|
malformed-package-json | A declared workspace's package.json failed to parse. Includes the parse error. |
glob-matched-no-package-json | A workspace glob matched a directory that has no package.json (and is not in the conventional skip list or your ignorePatterns). Includes the matching pattern. |
malformed-tsconfig | tsconfig.json exists but failed to parse as JSONC. Includes the parse error. |
tsconfig-reference-dir-missing | tsconfig.json references a references[].path that does not exist. |
undeclared-workspace | A directory contains package.json but is not declared as a workspace. |
bun-lockb-override-resolution-skipped | The root package.json declares overrides, bun's legacy binary bun.lockb sits next to it, and no parseable text lockfile (bun.lock, pnpm-lock.yaml, package-lock.json, npm-shrinkwrap.json) was found to use instead, so the unused-dependency-overrides check is skipped and reports nothing. A yarn.lock or an unparseable bun.lock beside the bun.lockb does not prevent the skip. Run bun install --save-text-lockfile (bun 1.2 or newer) to write a text bun.lock, or delete the stale bun.lockb if the repository no longer uses bun. Emitted by the override analysis rather than workspace discovery, so it appears in dead-code, check, and health JSON and as one stderr warning. |
A malformed ROOT package.json is treated as a hard config-load error and exits 2 instead of warning; everything else is warn-and-continue so analysis still runs on the remaining workspaces. The same workspace-discovery diagnostics are emitted on fallow dead-code, fallow dupes, and fallow health JSON envelopes (omitted when empty), so CI consumers can gate on discovery problems without a separate command. Those analysis envelopes can also include source-discovery skip diagnostics: skipped-large-file and skipped-minified-file, each with size_bytes.
Boundaries: 6 zones, 6 rules, 1 logical group
Zones:
app 3 files src/app/**
features/auth 4 files src/features/auth/**
features/billing 5 files src/features/billing/**
features 3 files src/features/**
shared 8 files src/components/**, src/hooks/**, src/lib/**, ...
server 4 files src/server/**
Rules:
features/auth → shared, server
features/billing → shared, server
app → features/auth, features/billing, features, shared, server
features → shared, server, features/auth, features/billing
server → shared
shared (isolated, no imports allowed)
Logical groups:
features 12 files autoDiscover: src/features
children: features/auth, features/billing
The Logical groups: section appears whenever the config (or a preset) uses
autoDiscover to fan a parent zone out into one zone per child directory.
Each entry shows the user-authored parent name, the exact autoDiscover paths
as written, the discovered children, and a summed file count. The human output
puts misconfigured entries (invalid path, empty) first inside the section
and splits the file count into N files (X children + Y fallback) when the
parent has both patterns and autoDiscover (e.g. the Bulletproof preset).
The --format json output mirrors this in a parallel
boundaries.logical_groups[] array, with extra fields for round-trip config
tooling: auto_discover (verbatim user strings), source_zone_index (position
in the pre-expansion zones[]), status (ok / empty / invalid_path),
authored_rule (the pre-expansion rule keyed on the parent), fallback_zone (a
back-reference when the parent kept its own patterns and stayed in zones[]),
merged_from (parent zone indices when the same parent name was declared
twice), original_zone_root (echo of the parent's root subtree scope), and
child_source_indices (parallel to children, attributing each child to a
specific auto_discover entry). The full shape is documented in
docs/output-schema.json
under ListBoundariesOutput.
Active plugins:
- nextjs
- vite
- vitest
- playwright
- storybook
- eslint
- typescript
- tailwind
- drizzle
- commitlint
- sentry
Found 42 entry points
src/app/layout.tsx (Plugin: nextjs)
src/app/page.tsx (Plugin: nextjs)
src/instrumentation.ts (Plugin: nextjs)
src/proxy.ts (Plugin: nextjs)
src/lib/utils.test.ts (Plugin: vitest)
e2e/auth.setup.ts (Plugin: playwright)
.storybook/main.ts (Plugin: storybook)
drizzle.config.ts (Plugin: drizzle)
scripts/db-migrate.ts (PackageJsonScript)
scripts/db-seed.ts (PackageJsonScript)
...
Each entry point shows how it was discovered. The plugin name tells you which framework detected it.