{
  "id": "tauri-desktop-app",
  "type": "loadout",
  "title": "Tauri 2 desktop app, least privilege",
  "summary": "Tauri 2 rules and a permissions skill: capabilities for named windows, scoped fs and http, no shell execute, a CSP kept, plus a checker that flags wide grants.",
  "description": "Tauri 2 replaced the old allowlist with capabilities and permissions, and agents adding a feature tend to reach for the widest grant that makes it work: fs:default for every window, shell execute, http without a URL scope, CSP set to null. This loadout follows Tauri's security docs: the frontend is untrusted, capabilities name their windows, file and HTTP permissions carry scopes, commands validate their arguments. A small Node script checks capability files and tauri.conf.json, and the verifier runs it on a clean and a permissive project.\n",
  "highlights": [
    "Capabilities for named windows, never \"*\" with fs, shell or http",
    "Every fs and http permission carries an allow scope",
    "No shell execute or spawn; shell:allow-open or the opener plugin instead",
    "CSP kept in app.security.csp",
    "Checker script with clear findings, tested by the verifier"
  ],
  "version": "1.0.0",
  "license": "MIT",
  "author": {
    "name": "Agent Loadout",
    "url": "https://loadout.jnw-it.com"
  },
  "credits": [
    {
      "title": "Tauri docs: capabilities",
      "url": "https://v2.tauri.app/security/capabilities/"
    },
    {
      "title": "Tauri docs: permissions",
      "url": "https://v2.tauri.app/security/permissions/"
    },
    {
      "title": "Tauri docs: content security policy",
      "url": "https://v2.tauri.app/security/csp/"
    }
  ],
  "categories": [
    "security",
    "web-app"
  ],
  "stacks": [
    "tauri",
    "rust",
    "typescript"
  ],
  "files": [
    {
      "path": "AGENTS.md",
      "role": "instructions",
      "description": "Tauri 2 security model, Rust command rules and checks.",
      "skill": null,
      "agent": null,
      "install_to": {
        "claude-code": "AGENTS.md",
        "codex": "AGENTS.md",
        "cursor": "AGENTS.md",
        "gemini-cli": "AGENTS.md",
        "antigravity-cli": "AGENTS.md",
        "copilot": "AGENTS.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/AGENTS.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/latest/AGENTS.md",
      "bytes": 1929,
      "lang": "markdown",
      "content": "# AGENTS.md: Tauri 2 desktop app\n\nTauri 2 app: a web frontend (in `src/`) and a Rust core (in `src-tauri/`). The frontend is untrusted; the Rust side\ndecides what it may do.\n\n## Commands\n- Dev: `npm run tauri dev` (or the project's package manager). Build: `npm run tauri build`.\n- Rust checks, from `src-tauri/`: `cargo fmt --check`, `cargo clippy -- -D warnings`, `cargo test`.\n- Frontend checks: the project's lint, type-check and test scripts.\n- Permissions check after any change to capabilities or `tauri.conf.json`:\n  `node <skills dir>/tauri-permissions/scripts/check-capabilities.mjs src-tauri`.\n\n## Security model\n- Capabilities in `src-tauri/capabilities/` grant permissions to named windows. Grant the minimum; use the\n  `tauri-permissions` skill for any change.\n- Never `\"windows\": [\"*\"]` on a capability that grants file system, shell or HTTP access. Name the windows.\n- File system and HTTP permissions always carry a scope (`allow` paths such as `$APPDATA/**`, or exact URLs).\n- No `shell:allow-execute` or `shell:allow-spawn` unless the human asks; prefer `shell:allow-open` or the opener plugin.\n- Keep a Content Security Policy in `app.security.csp`. Never set it to null to make something load.\n- Remote URLs (`remote.urls`) get no command access unless the human approves each one.\n\n## Commands (Rust)\n- `#[tauri::command]` functions validate every argument. Paths from the frontend are resolved and checked against an\n  allowed base directory before use. Return `Result<T, String>` or a serialisable error type, never panic.\n- Long work runs async or on a background thread; the UI must not freeze.\n- Secrets live in the Rust side or the OS keychain, never in frontend code or `localStorage`.\n\n## Changes\n- Adding a plugin: `npm run tauri add <plugin>`, then grant only the permissions you use and justify each in the report.\n- Do not upgrade Tauri, plugins or the webview target as part of another change.\n"
    },
    {
      "path": "CLAUDE.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Claude Code.",
      "skill": null,
      "agent": "claude-code",
      "install_to": {
        "claude-code": "CLAUDE.md",
        "codex": null,
        "cursor": null,
        "gemini-cli": null,
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/CLAUDE.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/latest/CLAUDE.md",
      "bytes": 391,
      "lang": "markdown",
      "content": "# CLAUDE.md\n\n@AGENTS.md\n\n## Claude Code notes\n- Skills from this loadout live in `.claude/skills/`: `tauri-permissions`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"Tauri 2 desktop app, least privilege\" v1.0.0 — https://loadout.jnw-it.com/loadouts/tauri-desktop-app/ -->\n"
    },
    {
      "path": "GEMINI.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Gemini CLI.",
      "skill": null,
      "agent": "gemini-cli",
      "install_to": {
        "claude-code": null,
        "codex": null,
        "cursor": null,
        "gemini-cli": "GEMINI.md",
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/GEMINI.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/latest/GEMINI.md",
      "bytes": 392,
      "lang": "markdown",
      "content": "# GEMINI.md\n\n@./AGENTS.md\n\n## Gemini CLI notes\n- Skills from this loadout live in `.agents/skills/`: `tauri-permissions`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"Tauri 2 desktop app, least privilege\" v1.0.0 — https://loadout.jnw-it.com/loadouts/tauri-desktop-app/ -->\n"
    },
    {
      "path": "skills/tauri-permissions/SKILL.md",
      "role": "skill",
      "description": "Grant the narrowest permission, then check.",
      "skill": "tauri-permissions",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/tauri-permissions/SKILL.md",
        "codex": ".agents/skills/tauri-permissions/SKILL.md",
        "cursor": ".agents/skills/tauri-permissions/SKILL.md",
        "gemini-cli": ".agents/skills/tauri-permissions/SKILL.md",
        "antigravity-cli": ".agents/skills/tauri-permissions/SKILL.md",
        "copilot": ".agents/skills/tauri-permissions/SKILL.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/skills/tauri-permissions/SKILL.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/latest/skills/tauri-permissions/SKILL.md",
      "bytes": 1285,
      "lang": "markdown",
      "content": "---\nname: tauri-permissions\ndescription: Add or change Tauri 2 capabilities with least privilege (named windows, scoped fs and http permissions, no broad shell access, CSP kept) and run the capability check. Use when a feature needs a new plugin or permission.\n---\n\n# Tauri permissions\n\n1. Name the exact API the feature needs (for example \"read one JSON file in the app data folder\").\n2. Find the narrowest permission for it in the plugin's permission list (in `src-tauri/gen/schemas/` after a build, or\n   the plugin docs). Prefer a single `allow-<command>` permission to a plugin's `default` set.\n3. Add it to a capability file for the named window, with a scope:\n\n       { \"identifier\": \"fs:allow-read-text-file\", \"allow\": [{ \"path\": \"$APPDATA/settings.json\" }] }\n\n4. Do not widen an existing capability's windows. If another window needs it, add a second capability.\n5. Run the check: `node scripts/check-capabilities.mjs src-tauri`. It fails on wildcard windows with sensitive\n   permissions, unscoped fs or http permissions, shell execute or spawn, remote URLs with commands, and a missing or\n   null CSP. Fix every finding, or explain to the human why it is needed and get approval.\n6. Run the app and use the feature once. Report the permissions added and why each is needed.\n"
    },
    {
      "path": "skills/tauri-permissions/scripts/check-capabilities.mjs",
      "role": "reference",
      "description": "Flags wide or unscoped grants and a missing CSP.",
      "skill": "tauri-permissions",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/tauri-permissions/scripts/check-capabilities.mjs",
        "codex": ".agents/skills/tauri-permissions/scripts/check-capabilities.mjs",
        "cursor": ".agents/skills/tauri-permissions/scripts/check-capabilities.mjs",
        "gemini-cli": ".agents/skills/tauri-permissions/scripts/check-capabilities.mjs",
        "antigravity-cli": ".agents/skills/tauri-permissions/scripts/check-capabilities.mjs",
        "copilot": ".agents/skills/tauri-permissions/scripts/check-capabilities.mjs"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/skills/tauri-permissions/scripts/check-capabilities.mjs",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/latest/skills/tauri-permissions/scripts/check-capabilities.mjs",
      "bytes": 2626,
      "lang": "markdown",
      "content": "#!/usr/bin/env node\n// Least-privilege check for Tauri 2 capabilities. Usage: node check-capabilities.mjs <src-tauri dir>\n// Exit 1 with one line per finding; exit 0 and \"ok\" when clean. Reads JSON capability files and tauri.conf.json only.\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nconst root = process.argv[2] ?? \"src-tauri\";\nconst findings = [];\nconst SENSITIVE = /^(fs|shell|http|process|sql|store|websocket|upload):/;\nconst NEEDS_SCOPE = /^(fs|http):/;\nconst SHELL_EXEC = /^shell:(allow-execute|allow-spawn|allow-stdin-write|default)$/;\n\nconst readJson = (p) => {\n  try { return JSON.parse(fs.readFileSync(p, \"utf8\")); } catch (e) { findings.push(`${p}: not valid JSON (${e.message})`); return null; }\n};\n\nconst conf = readJson(path.join(root, \"tauri.conf.json\"));\nconst inline = conf?.app?.security?.capabilities?.filter((c) => typeof c === \"object\") ?? [];\nif (conf && !conf.app?.security?.csp) findings.push(\"tauri.conf.json: app.security.csp is missing or null; keep a Content Security Policy\");\n\nconst capDir = path.join(root, \"capabilities\");\nconst files = fs.existsSync(capDir) ? fs.readdirSync(capDir).filter((f) => f.endsWith(\".json\")) : [];\nconst caps = [\n  ...files.map((f) => ({ where: `capabilities/${f}`, cap: readJson(path.join(capDir, f)) })),\n  ...inline.map((c, i) => ({ where: `tauri.conf.json capability #${i + 1}`, cap: c })),\n].filter((x) => x.cap);\n\nfor (const { where, cap } of caps) {\n  const perms = (cap.permissions ?? []).map((p) => (typeof p === \"string\" ? { identifier: p } : p));\n  const wildcard = (cap.windows ?? []).includes(\"*\") || (cap.webviews ?? []).includes(\"*\");\n  for (const p of perms) {\n    const id = p.identifier ?? \"\";\n    if (wildcard && SENSITIVE.test(id)) findings.push(`${where}: ${id} granted to every window (\"*\"); name the windows`);\n    if (SHELL_EXEC.test(id)) findings.push(`${where}: ${id} lets the frontend run programs; use shell:allow-open or the opener plugin`);\n    const scoped = (p.allow ?? []).length > 0;\n    const isScopeOnly = /:scope/.test(id);\n    if (NEEDS_SCOPE.test(id) && !scoped && !isScopeOnly) findings.push(`${where}: ${id} has no \"allow\" scope; limit it to the paths or URLs you need`);\n  }\n  if (cap.remote?.urls?.length && perms.length) findings.push(`${where}: remote URLs ${cap.remote.urls.join(\", \")} get ${perms.length} permission(s); needs explicit approval`);\n}\n\nif (findings.length) {\n  for (const f of findings) console.log(`finding: ${f}`);\n  console.log(`${findings.length} finding(s) in ${caps.length} capability set(s)`);\n  process.exit(1);\n}\nconsole.log(`ok: ${caps.length} capability set(s), least privilege`);\n"
    }
  ],
  "requires": {
    "tools": [
      "node",
      "cargo"
    ],
    "env": [],
    "mcp": []
  },
  "tested": {
    "status": "untested",
    "last_run": null,
    "fixture": null,
    "per_agent": {
      "claude-code": "untested",
      "codex": "untested",
      "cursor": "untested",
      "gemini-cli": "untested",
      "antigravity-cli": "untested",
      "copilot": "untested"
    }
  },
  "security": {
    "scanned": true,
    "scanner": "intake-precheck/1",
    "verdict": "clean",
    "network": true,
    "scripts": [
      "check-capabilities.mjs"
    ],
    "notes": "tauri add and builds download packages from npm and crates.io. check-capabilities.mjs only reads local JSON files."
  },
  "featured": false,
  "deprecated": false,
  "last_checked": "2026-10-17",
  "published": "2026-10-17",
  "updated": "2026-10-17",
  "compatibility": {
    "claude-code": "native",
    "codex": "native",
    "cursor": "native",
    "gemini-cli": "native",
    "antigravity-cli": "native",
    "copilot": "native"
  },
  "counts": {
    "rules": 1,
    "skills": 1,
    "mcp": 0
  },
  "url": "https://loadout.jnw-it.com/loadouts/tauri-desktop-app/",
  "api_url": "https://loadout.jnw-it.com/api/loadouts/tauri-desktop-app.json",
  "verification": {
    "level": "verified-install",
    "status": "verified",
    "label": "Verified install",
    "verified": true,
    "checked_at": "2026-10-17T08:09:30Z",
    "commit": "03c1b9839c40eb1e44c0a2877baaa3978a96895c",
    "content_current": true,
    "agent_tests": "not-run",
    "counts": {
      "pass": 9,
      "fail": 0,
      "skip": 0,
      "not_applicable": 1
    },
    "meaning": "Level 1: automated checks on the files (parse, install paths, MCP config, safety scan, references, size, licence, starter build). No AI agent was run.",
    "checks": [
      {
        "id": "listing",
        "name": "Listing",
        "status": "pass",
        "summary": "Schema valid; 5 files declared, none missing or extra",
        "details": [
          "tested.status: untested (agent tests are separate from Level 1)"
        ]
      },
      {
        "id": "parse",
        "name": "Files parse",
        "status": "pass",
        "summary": "All 5 files parse; front matter valid",
        "details": []
      },
      {
        "id": "adapters",
        "name": "Adapters",
        "status": "pass",
        "summary": "CLAUDE.md and GEMINI.md import AGENTS.md and are up to date",
        "details": [
          "CLAUDE.md: matches the generator",
          "GEMINI.md: matches the generator"
        ]
      },
      {
        "id": "install-paths",
        "name": "Install paths",
        "status": "pass",
        "summary": "Correct paths for all 6 agents; layouts re-discovered",
        "details": [
          "Claude Code: 4 files, 1 skill in .claude/skills/",
          "Codex CLI: 3 files, 1 skill in .agents/skills/",
          "Cursor: 3 files, 1 skill in .agents/skills/",
          "Gemini CLI: 4 files, 1 skill in .agents/skills/",
          "Antigravity CLI: 3 files, 1 skill in .agents/skills/",
          "GitHub Copilot: 3 files, 1 skill in .agents/skills/"
        ]
      },
      {
        "id": "mcp",
        "name": "MCP config",
        "status": "n/a",
        "summary": "No MCP servers in this loadout",
        "details": []
      },
      {
        "id": "safety",
        "name": "Safety scan",
        "status": "pass",
        "summary": "Clean: no credentials, risky shell or hidden text",
        "details": [
          "Scanner intake-precheck/1: verdict clean; network no (listing says yes)"
        ]
      },
      {
        "id": "references",
        "name": "References",
        "status": "pass",
        "summary": "1 reference between files resolves for every agent",
        "details": []
      },
      {
        "id": "size",
        "name": "Size limits",
        "status": "pass",
        "summary": "5 files, 6.5 KB total; largest skills/tauri-permissions/scripts/check-capabilities.mjs 2.6 KB",
        "details": [
          "Limits: 30 files, 32 KB per file, 128 KB total, 500 lines per skill or rule"
        ]
      },
      {
        "id": "licence",
        "name": "Licence",
        "status": "pass",
        "summary": "MIT, by Agent Loadout; text in the repository LICENSE",
        "details": []
      },
      {
        "id": "starter-build",
        "name": "Starter build",
        "status": "pass",
        "summary": "The capability check passes a least-privilege Tauri 2 project and reports every problem in a permissive one: null CSP, wildcard windows, unscoped fs and http, shell execute and remote URLs with permissions",
        "details": [
          "Applied 7 loadout files at every agent's paths",
          "✓ least-privilege project passes: node .agents/skills/tauri-permissions/scripts/check-capabilities.mjs good",
          "✓ permissive project is caught: bash -c node .claude/skills/tauri-permissions/scripts/check-capabilities.mjs bad; test $? -eq 1 && echo caught",
          "Covers: Named windows, scoped fs permissions and shell:allow-open pass",
          "Covers: A null CSP is reported",
          "Covers: Wildcard windows with fs, shell or http, unscoped fs and http, shell execute and remote URLs with permissions are reported"
        ]
      }
    ]
  },
  "install": {
    "claude-code": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "CLAUDE.md",
          "target": "CLAUDE.md",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/CLAUDE.md",
          "role": "adapter"
        },
        {
          "path": "skills/tauri-permissions/SKILL.md",
          "target": ".claude/skills/tauri-permissions/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/skills/tauri-permissions/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/tauri-permissions/scripts/check-capabilities.mjs",
          "target": ".claude/skills/tauri-permissions/scripts/check-capabilities.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/skills/tauri-permissions/scripts/check-capabilities.mjs",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/tauri-desktop-app/claude-code.zip"
    },
    "codex": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/tauri-permissions/SKILL.md",
          "target": ".agents/skills/tauri-permissions/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/skills/tauri-permissions/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/tauri-permissions/scripts/check-capabilities.mjs",
          "target": ".agents/skills/tauri-permissions/scripts/check-capabilities.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/skills/tauri-permissions/scripts/check-capabilities.mjs",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/tauri-desktop-app/codex.zip"
    },
    "cursor": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/tauri-permissions/SKILL.md",
          "target": ".agents/skills/tauri-permissions/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/skills/tauri-permissions/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/tauri-permissions/scripts/check-capabilities.mjs",
          "target": ".agents/skills/tauri-permissions/scripts/check-capabilities.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/skills/tauri-permissions/scripts/check-capabilities.mjs",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/tauri-desktop-app/cursor.zip"
    },
    "gemini-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "GEMINI.md",
          "target": "GEMINI.md",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/GEMINI.md",
          "role": "adapter"
        },
        {
          "path": "skills/tauri-permissions/SKILL.md",
          "target": ".agents/skills/tauri-permissions/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/skills/tauri-permissions/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/tauri-permissions/scripts/check-capabilities.mjs",
          "target": ".agents/skills/tauri-permissions/scripts/check-capabilities.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/skills/tauri-permissions/scripts/check-capabilities.mjs",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/tauri-desktop-app/gemini-cli.zip"
    },
    "antigravity-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/tauri-permissions/SKILL.md",
          "target": ".agents/skills/tauri-permissions/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/skills/tauri-permissions/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/tauri-permissions/scripts/check-capabilities.mjs",
          "target": ".agents/skills/tauri-permissions/scripts/check-capabilities.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/skills/tauri-permissions/scripts/check-capabilities.mjs",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/tauri-desktop-app/antigravity-cli.zip"
    },
    "copilot": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/tauri-permissions/SKILL.md",
          "target": ".agents/skills/tauri-permissions/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/skills/tauri-permissions/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/tauri-permissions/scripts/check-capabilities.mjs",
          "target": ".agents/skills/tauri-permissions/scripts/check-capabilities.mjs",
          "raw_url": "https://loadout.jnw-it.com/raw/tauri-desktop-app/1.0.0/skills/tauri-permissions/scripts/check-capabilities.mjs",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/tauri-desktop-app/copilot.zip"
    }
  },
  "source_zip_url": "https://loadout.jnw-it.com/download/tauri-desktop-app/source.zip"
}