{"record":{"id":"a842e6741d9a2a34","repo":"tauri-apps/tauri","slug":"couldn-t-find-capabilities-directory-at","errorCode":null,"errorMessage":"Couldn't find capabilities directory at {}","messagePattern":"Couldn't find capabilities directory at (.+?)","errorType":"validation","errorClass":"Error::GenericError","httpStatus":null,"severity":"error","filePath":"crates/tauri-cli/src/acl/permission/add.rs","lineNumber":142,"sourceCode":"\n#[derive(Debug, Parser)]\n#[clap(about = \"Add a permission to capabilities\")]\npub struct Options {\n  /// Permission to add.\n  pub identifier: String,\n  /// Capability to add the permission to.\n  pub capability: Option<String>,\n}\n\npub fn command(options: Options) -> Result<()> {\n  let dir = match resolve_tauri_dir() {\n    Some(t) => t,\n    None => std::env::current_dir().context(\"failed to resolve current directory\")?,\n  };\n\n  let capabilities_dir = dir.join(\"capabilities\");\n  if !capabilities_dir.exists() {\n    crate::error::bail!(\n      \"Couldn't find capabilities directory at {}\",\n      dunce::simplified(&capabilities_dir).display()\n    );\n  }\n\n  let known_plugins = crate::helpers::plugins::known_plugins();\n  let known_plugin = options\n    .identifier\n    .split_once(':')\n    .and_then(|(plugin, _permission)| known_plugins.get(&plugin));\n\n  let capabilities_iter = std::fs::read_dir(&capabilities_dir)\n    .fs_context(\n      \"failed to read capabilities directory\",\n      capabilities_dir.clone(),\n    )?\n    .flatten()\n    .filter(|e| e.file_type().map(|e| e.is_file()).unwrap_or_default())","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/tauri-apps/tauri/blob/52e4b6e71d8632a7e648f866c442e287ecddee34/crates/tauri-cli/src/acl/permission/add.rs#L124-L160","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"#!/usr/bin/env bash\n# run before invoking tauri permission add / tauri add\nTAURI_DIR=\"$(git rev-parse --show-toplevel 2>/dev/null)/src-tauri\"\n[ -f \"$TAURI_DIR/tauri.conf.json\" ] || TAURI_DIR=\"$PWD\"\nif [ ! -d \"$TAURI_DIR/capabilities\" ]; then\n  echo \"capabilities/ missing in $TAURI_DIR\" >&2\n  mkdir -p \"$TAURI_DIR/capabilities\"   # or abort here\nfi","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["tauri-cli","acl","capabilities","filesystem","project-structure"],"backgroundTag":"missing-required-directory","analyzedSha":"52e4b6e71d8632a7e648f866c442e287ecddee34","analyzedAt":"2026-08-20T13:59:20.734Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}