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

  1. Run the command from inside the `src-tauri` directory (or any child of the directory containing `tauri.conf.json`)
  2. Create the missing folder and at least one capability: `mkdir src-tauri/capabilities` then add a capability JSON (or run `tauri capability add`)
  3. 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

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


AI-assisted analysis of tauri-apps/tauri@52e4b6e71d (2026-08-20). Data as JSON: /api/errors/a842e6741d9a2a34. Report an issue: GitHub.