fallow recommend
Get a config proposal for your project that you can review before you write it. Fallow recommend is read-only and reports what fallow detected, a safe proposed config, and the decisions behind it, split into auto, default, and taste.
Get a config proposal for your project, with the reasons for each setting, before anything is written. fallow recommend examines the frameworks, workspace layout, and tooling of the project. It writes nothing, and it reports:
- what it detected
- a safe proposed config
- the decisions behind that proposal
A person or an agent can thus review the reasons, and does not have to trust a generated file.
Zero config is a valid end state. The fallow defaults are strong, and fallow fully supports a project with no config. recommend is for projects that want a config, and for agents that must write the config with the user and not guess.
fallow recommend
fallow recommend --format json
fallow init writes a config file. recommend is read-only. An agent uses it in these steps:
- Run
recommend --format json. - Apply the
autodecisions. - Tell the user about the
defaultdecisions. - Ask the user about the
tastedecisions. - Write the result, or run
init.
When fallow detects TypeScript, the default decisions point to optional type-aware analysis. They do not add it to proposed_config.
Decision tiers
Each proposed setting has a tier and a rationale:
| Tier | Meaning |
|---|---|
auto | Comes from detection, for example a detected framework, workspace layout, or test runner. Safe to apply as it is. |
default | A default that fallow tells you about and that you can override, or an optional capability. It changes proposed_config only when the proposed config contains its setting. |
taste | A subjective choice. Fallow shows it as an open question for the user, and does not decide it silently. |
Options
fallow recommend has no flags of its own. If you pass an existing config with
--config, the command reads it and takes it into account. Global flags such as --root,
--format, --quiet, --no-cache, and --threads apply.
JSON output
This example is for a single-package TypeScript project with Vitest. It shows two of the decisions. A real run also has taste decisions (for example ci-strictness) with an open question, and more default decisions.
{
"kind": "recommendation",
"schema_version": "1",
"detected": {
"is_monorepo": false,
"workspace_tool": null,
"workspace_patterns": [],
"has_typescript": true,
"test_framework": "Vitest",
"test_framework_ambiguous": false,
"ui_framework": null,
"frameworks_present": [],
"heterogeneous_frameworks": false,
"has_storybook": false,
"package_manager": null
},
"proposed_config": {
"$schema": "https://raw.githubusercontent.com/fallow-rs/fallow/main/schema.json",
"entry": ["src/index.{ts,tsx,js,jsx}", "src/main.{ts,tsx,js,jsx}"]
},
"decisions": [
{
"setting": "entry",
"value": ["src/index.{ts,tsx,js,jsx}", "src/main.{ts,tsx,js,jsx}"],
"rationale": "Assumes the src/index or src/main entry convention. Adjust for framework-routed apps or DI-wired entry points (fallow also auto-honors package.json exports/main/module for libraries).",
"kind": "auto",
"question": null
},
{
"setting": "typeAware.enabled",
"value": null,
"rationale": "Detected TypeScript. For exact symbol use across aliases, re-exports, class contracts, packages, or tests, run `fallow dead-code --type-aware` or set `typeAware.enabled` to true. This starts a slower semantic pass and does not replace tsc or Oxlint. Guide: https://docs.fallow.tools/analysis/type-aware",
"kind": "default",
"question": null
}
],
"note": "proposed_config is the safe, detection-derived baseline; resolve every taste decision with the user before finalizing. For the full set of valid config keys and their shapes, run `fallow config-schema`. Zero config is a valid stop: fallow's defaults are strong, so writing no config at all is fully supported.",
"config_schema_command": "fallow config-schema"
}
A taste decision has a question object with a header, the question text, and options. Each option has a label and a description.
Fallow reads package_manager only from the packageManager field in package.json. frameworks_present and heterogeneous_frameworks show if frameworks are in workspace packages and not in the root.