tauri-apps/tauri · error · Error::GenericError
Couldn't find capabilities directory at {}
Error message
Couldn't find capabilities directory at {} What it means
Thrown by `tauri permission add` (also invoked internally by `tauri add <plugin>` for the plugin's `default` permission) when the resolved project directory has no `capabilities/` subdirectory. The CLI resolves the Tauri directory with `resolve_tauri_dir()` (falling back to the current working directory), joins `capabilities`, and refuses to continue if that path does not exist, because there would be no capability file to insert the permission into.
Source
Thrown at crates/tauri-cli/src/acl/permission/add.rs:142
#[derive(Debug, Parser)]
#[clap(about = "Add a permission to capabilities")]
pub struct Options {
/// Permission to add.
pub identifier: String,
/// Capability to add the permission to.
pub capability: Option<String>,
}
pub fn command(options: Options) -> Result<()> {
let dir = match resolve_tauri_dir() {
Some(t) => t,
None => std::env::current_dir().context("failed to resolve current directory")?,
};
let capabilities_dir = dir.join("capabilities");
if !capabilities_dir.exists() {
crate::error::bail!(
"Couldn't find capabilities directory at {}",
dunce::simplified(&capabilities_dir).display()
);
}
let known_plugins = crate::helpers::plugins::known_plugins();
let known_plugin = options
.identifier
.split_once(':')
.and_then(|(plugin, _permission)| known_plugins.get(&plugin));
let capabilities_iter = std::fs::read_dir(&capabilities_dir)
.fs_context(
"failed to read capabilities directory",
capabilities_dir.clone(),
)?
.flatten()
.filter(|e| e.file_type().map(|e| e.is_file()).unwrap_or_default())View on GitHub (pinned to 52e4b6e71d)
Solutions
- Run the command from inside the `src-tauri` directory (or any child of the directory containing `tauri.conf.json`)
- Create the missing folder and at least one capability: `mkdir src-tauri/capabilities` then add a capability JSON (or run `tauri capability add`)
- If the project was never scaffolded, run `cargo tauri init` first so the standard layout is generated
Defensive patterns
Strategy: validation
Validate before calling
#!/usr/bin/env bash # run before invoking tauri permission add / tauri add TAURI_DIR="$(git rev-parse --show-toplevel 2>/dev/null)/src-tauri" [ -f "$TAURI_DIR/tauri.conf.json" ] || TAURI_DIR="$PWD" if [ ! -d "$TAURI_DIR/capabilities" ]; then echo "capabilities/ missing in $TAURI_DIR" >&2 mkdir -p "$TAURI_DIR/capabilities" # or abort here fi
Prevention
- Keep `src-tauri/capabilities/` tracked in version control with at least one capability file
- Run tauri CLI commands from `src-tauri` or the project root so `resolve_tauri_dir()` succeeds
- After `tauri init` or a v1->v2 migration, verify the capabilities folder exists before scripting permission commands
When it happens
Trigger: Running `tauri permission add fs:read` or `tauri add dialog` in a directory that is not a Tauri v2 project (no ancestor contains `src-tauri/tauri.conf.json`), running before `tauri init` has scaffolded the project, or after the `capabilities/` folder was deleted, renamed, or never created (e.g. projects hand-migrated from Tauri v1, which had no capabilities concept).
Common situations: Migrating a v1 app to v2 without running the migration/scaffolding; running the CLI from the repo root of a monorepo where the tauri dir cannot be resolved; CI jobs on a fresh clone when `capabilities/` is not tracked in version control.
Related errors
- You did not select any capabilities to update
- Could not find a capability to update
- failed to read capabilities
- invalid permission {p}
- permission file not found, please build your application onc
AI-assisted analysis of tauri-apps/tauri@52e4b6e71d (2026-08-20).
Data as JSON: /api/errors/a842e6741d9a2a34.
Report an issue: GitHub.