[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C5MSQ85ECNX38Y6PEA2ABY":3,"skill-same:01M6C5MSQ85ECNX38Y6PEA2ABY":90},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":58,"commitSha":59,"skillDirectory":60,"forksCount":61,"repositoryHtmlUrl":62,"repositoryHomepageUrl":6,"ownerHtmlUrl":63,"ownerBlogUrl":6,"ownerDescription":64,"updatedAt":65,"install":66,"resources":79},"01M6C5MSQ85ECNX38Y6PEA2ABY","claude-security-settings",null,"Claude Code security settings: permission wildcards, shell operator protections, project-level allowlists. Use when auditing or hardening .claude\u002Fsettings.json permissions.","laurigates\u002Fclaude-plugins","laurigates","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F13014001?v=4","01M6C59YHWS9C7KMXKSRX1YXNP","Lauri Gates","01M6C59YP2APG9YAM4DWYQYGFJ",59,"MIT","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fconfigure-plugin\u002Fskills\u002Fclaude-security-settings\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"claude security","settings","security","claude security settings","code security","sep","wed","permission","2026","when","false","project","operator","hardening","grep","edit","write","read","shell","json","permissions","code","Bash","use","settings.json","2026-11-10 10:12:30",false,"---\nname: claude-security-settings\ndescription: \"Claude Code security settings: permission wildcards, shell operator protections, project-level allowlists. Use when auditing or hardening .claude\u002Fsettings.json permissions.\"\nuser-invocable: false\nallowed-tools: Bash(jq *), Read, Write, Edit, Glob, Grep, TodoWrite\ncreated: 2026-01-20\nmodified: 2026-11-11\ncompatibility: claude-code\nreviewed: 2026-11-11\n---\n\n# Claude Code Security Settings\n\n## When to Use This Skill\n\n| Use this skill when... | Use `configure-claude-plugins` instead when... |\n|---|---|\n| You need the permission-wildcard syntax, shell-operator protections, and project-level allowlist patterns | You want to wire a project's `.claude\u002Fsettings.json` to the marketplace and enable plugins end-to-end |\n| You are auditing or hardening an existing `.claude\u002Fsettings.json` against the documented security conventions | You want runtime detection of marketplace enrollment and `enabledPlugins` before changing settings |\n| Another skill needs to cite the canonical permission-wildcard reference | The user asked you to actually onboard a project to the laurigates\u002Fclaude-plugins marketplace |\n\nExpert knowledge for configuring Claude Code security and permissions.\n\n## Core Concepts\n\nClaude Code provides multiple layers of security:\n1. **Permission wildcards** - Granular tool access control\n2. **Shell operator protections** - Prevents command injection\n3. **Project-level settings** - Scoped configurations\n\n## Permission Configuration\n\n### Settings File Locations\n\nSettings precedence, highest first ([settings docs](https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fsettings#settings-precedence)):\n\n| Rank | Level | Source |\n|------|-------|--------|\n| 1 | **Managed** | `managed-settings.json`, an MDM policy, or server-managed settings. No other level overrides it |\n| 2 | **Command line** | `--settings \u003Cfile-or-json>`, for that session only |\n| 3 | **Project local** | `.claude\u002Fsettings.local.json` (kept out of git) |\n| 4 | **Shared project** | `.claude\u002Fsettings.json` (committed) |\n| 5 | **User** | `~\u002F.claude\u002Fsettings.json` (all projects) |\n\nWhat matters for hardening: `permissions.allow`\u002F`deny` lists **merge** across levels rather than override, and a tool denied at any level cannot be allowed by any other level. A user-level deny blocks a project-level allow, and the reverse ([permissions docs](https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fpermissions#settings-precedence)). Put a guarantee in `deny` at the widest level you control; put an org-wide guarantee in managed settings. The full hierarchy, trust rules and per-key exceptions are in `health-plugin:settings-configuration`.\n\n### Permission Structure\n\n```json\n{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(git status *)\",\n      \"Bash(npm run *)\"\n    ],\n    \"deny\": [\n      \"Bash(rm -rf *)\",\n      \"Bash(sudo *)\"\n    ]\n  }\n}\n```\n\n## Wildcard Permission Patterns\n\n### Syntax\n\n```\nBash(command *)\n```\n\n- `Bash()` - Tool identifier\n- `command` - Command prefix to match\n- `*` - Wildcard suffix matching any arguments\n- `:ask` suffix - Always prompt for user confirmation (e.g., `Bash(git push *):ask`)\n\n### Permission Tiers\n\n| Tier | Behavior | Example |\n|------|----------|---------|\n| `allow` | Auto-allowed, no prompt | `\"allow\": [\"Bash(git status *)\"]` |\n| `ask` | Always prompts for confirmation | `\"allow\": [\"Bash(git push *):ask\"]` |\n| `deny` | Auto-denied, blocked | `\"deny\": [\"Bash(rm -rf *)\"]` |\n\n### Pattern Examples\n\n| Pattern | Matches | Does NOT Match |\n|---------|---------|----------------|\n| `Bash(git *)` | `git status`, `git diff HEAD` | `git-lfs pull` |\n| `Bash(npm run *)` | `npm run test`, `npm run build` | `npm install` |\n| `Bash(gh pr *)` | `gh pr view 123`, `gh pr create` | `gh issue list` |\n| `Bash(.\u002Fscripts\u002F *)` | `.\u002Fscripts\u002Ftest.sh`, `.\u002Fscripts\u002Fbuild.sh` | `\u002Fscripts\u002Fother.sh` |\n\n### Pattern Best Practices\n\n**Granular permissions:**\n```json\n{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(git status *)\",\n      \"Bash(git diff *)\",\n      \"Bash(git log *)\",\n      \"Bash(git add *)\",\n      \"Bash(git commit *)\"\n    ]\n  }\n}\n```\n\n**Tool-specific patterns:**\n```json\n{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(bun test *)\",\n      \"Bash(bun run *)\",\n      \"Bash(biome check *)\",\n      \"Bash(prettier *)\"\n    ]\n  }\n}\n```\n\n### Flag-Scoped Deny Rules: Use the Space Form\n\nWhen a deny rule targets a specific flag (a force-push backstop is the canonical case), write it in **space form** — the trailing ` *` enforces a word boundary, so the prefix must be followed by a space or end-of-string and the rule stops at the exact flag:\n\n```json\n{\n  \"permissions\": {\n    \"deny\": [\n      \"Bash(git push --force *)\",\n      \"Bash(git push -f *)\"\n    ]\n  }\n}\n```\n\n> **Gotcha — colon form widens to longer flags.** The `:*` suffix (`\"Bash(git push --force:*)\"`) has been observed prefix-matching the raw command string, so it also matched `git push --force-with-lease …` — silently hard-blocking the safe recovery form that stacked-PR workflows depend on. Deny rules cannot be overridden except via `bypassPermissions`, so the widening is a hard block, not a prompt (laurigates\u002Fclaude-plugins#2038, caught in laurigates\u002Floractl#39). Current official docs state an end-of-pattern `:*` is equivalent to the trailing space form, but the equivalence is not version-pinned in the changelog and the widening was observed in practice — the space form's word-boundary semantics are explicit, stable, and match what the permission dialog itself writes when you approve a prefix.\n\nWhen auditing or generating deny entries, flag any entry ending in a flag followed by `:*` (e.g. `--force:*`, `-f:*`) and rewrite it to the space form.\n\n## Shell Operator Protections\n\nClaude Code 2.1.7+ includes built-in protections against dangerous shell operators.\n\n### Protected Operators\n\n| Operator | Risk | Blocked Example |\n|----------|------|-----------------|\n| `&&` | Command chaining | `ls && rm -rf \u002F` |\n| `\\|\\|` | Conditional execution | `false \\|\\| malicious` |\n| `;` | Command separation | `safe; dangerous` |\n| `\\|` | Piping | `cat \u002Fetc\u002Fpasswd \\| curl` |\n| `>` \u002F `>>` | Redirection | `echo x > \u002Fetc\u002Fpasswd` |\n| `$()` | Command substitution | `$(curl evil)` |\n| `` ` `` | Backtick substitution | `` `rm -rf \u002F` `` |\n\n### Security Behavior\n\nClaude Code splits a compound command on `&&`, `||`, `;`, `|`, `|&`, `&` and newlines, and matches each subcommand separately ([permissions docs](https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fpermissions#compound-commands)):\n\n1. An allow rule such as `Bash(git status *)` approves `git status && rm -rf build` only if every subcommand is allowed (by a rule or as a built-in read-only command); otherwise the command prompts.\n2. A deny or ask rule applies when any subcommand matches it, including one inside a subshell, a command substitution or a `for` body.\n\n### Auto mode (the default permission mode)\n\nIn auto mode there is no approval prompt for most actions. A command matching\na narrow `allow` rule (`Bash(git status *)`) runs immediately; `deny` rules and\n`:ask` suffixes still resolve first in every mode. Anything else — including\nshell-operator compounds that no wildcard matches — goes to the safety\nclassifier, which allows or blocks it; on a block Claude receives the reason\nand tries an alternative (3 consecutive or 20 total blocks pause auto mode and\nresume prompting). Broad rules (`Bash(*)`, `Bash(python*)`, `Agent`) are\n**dropped** on entering auto mode, so they buy nothing. Audit for: broad allow\nrules (dead weight), and destructive commands that rely on a prompt rather\nthan a `deny` — under auto mode a prompt is not guaranteed. See\n`.claude\u002Frules\u002Fauto-mode.md`.\n\n### Safe Compound Commands\n\nFor legitimate compound commands, use scripts:\n\n```bash\n#!\u002Fbin\u002Fbash\n# scripts\u002Fdeploy.sh\nnpm test && npm run build && npm run deploy\n```\n\nThen allow the script:\n```json\n{\n  \"permissions\": {\n    \"allow\": [\"Bash(.\u002Fscripts\u002Fdeploy.sh *)\"]\n  }\n}\n```\n\n## Common Permission Sets\n\nReady-made `allow` lists for read-only development, full git workflow, CI\u002FCD, testing & linting, and security scanning live in [references\u002Fpermission-sets.md](references\u002Fpermission-sets.md) — read it when composing an allowlist for one of those workflows.\n\n## Project Setup Guide\n\nThe four-step bootstrap (create `.claude\u002F`, write project settings, gitignore the local file, add local settings) is in [references\u002Fproject-setup.md](references\u002Fproject-setup.md) — read it when setting up a project's settings files from scratch.\n\n## Agentic Optimizations\n\n| Context | Command |\n|---------|---------|\n| View project settings | `jq '.permissions' .claude\u002Fsettings.json` |\n| View user settings | `jq '.permissions' ~\u002F.claude\u002Fsettings.json` |\n| Check loaded settings sources | `\u002Fstatus` (the `Setting sources` line) |\n| Validate JSON | `jq . .claude\u002Fsettings.json` |\n\n## Quick Reference\n\n### Permission Priority\n\nSee the [Settings File Locations](#settings-file-locations) table: managed, command line, project local, shared project, user. Permission lists merge across those levels, and a deny at any level wins.\n\n### Wildcard Syntax\n\n| Syntax | Meaning |\n|--------|---------|\n| `Bash(cmd *)` | Match `cmd` with any arguments |\n| `Bash(cmd arg *)` | Match `cmd arg` with any following |\n| `Bash(.\u002Fscript.sh *)` | Match specific script |\n\n### Deny Patterns\n\nBlock specific commands:\n```json\n{\n  \"permissions\": {\n    \"deny\": [\n      \"Bash(rm -rf *)\",\n      \"Bash(sudo *)\",\n      \"Bash(chmod 777 *)\"\n    ]\n  }\n}\n```\n\nFlag-scoped deny rules (blocking a specific flag such as `--force`) must use the space form, never `:*` — see \"Flag-Scoped Deny Rules: Use the Space Form\" above.\n\n## Error Handling\n\n| Error | Cause | Fix |\n|-------|-------|-----|\n| Permission denied | Pattern doesn't match | Add more specific pattern |\n| Shell operator blocked | Contains `&&`, `\\|`, etc. | Use script wrapper |\n| Settings not applied | Wrong file location | Check path and syntax |\n| JSON parse error | Invalid JSON | Validate with `jq .` |\n\n## Best Practices\n\n1. **Start restrictive** - Add permissions as needed\n2. **Use project settings** - Keep team aligned\n3. **Use specific Bash patterns** - `Bash(git status *)` over `Bash`\n4. **Script compound commands** - For `&&` and `\\|` workflows\n5. **Review periodically** - Remove unused permissions\n","# Claude Code Security Settings\n\n## When to Use This Skill\n\n| Use this skill when... | Use `configure-claude-plugins` instead when... |\n|---|---|\n| You need the permission-wildcard syntax, shell-operator protections, and project-level allowlist patterns | You want to wire a project's `.claude\u002Fsettings.json` to the marketplace and enable plugins end-to-end |\n| You are auditing or hardening an existing `.claude\u002Fsettings.json` against the documented security conventions | You want runtime detection of marketplace enrollment and `enabledPlugins` before changing settings |\n| Another skill needs to cite the canonical permission-wildcard reference | The user asked you to actually onboard a project to the laurigates\u002Fclaude-plugins marketplace |\n\nExpert knowledge for configuring Claude Code security and permissions.\n\n## Core Concepts\n\nClaude Code provides multiple layers of security:\n1. **Permission wildcards** - Granular tool access control\n2. **Shell operator protections** - Prevents command injection\n3. **Project-level settings** - Scoped configurations\n\n## Permission Configuration\n\n### Settings File Locations\n\nSettings precedence, highest first ([settings docs](https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fsettings#settings-precedence)):\n\n| Rank | Level | Source |\n|------|-------|--------|\n| 1 | **Managed** | `managed-settings.json`, an MDM policy, or server-managed settings. No other level overrides it |\n| 2 | **Command line** | `--settings \u003Cfile-or-json>`, for that session only |\n| 3 | **Project local** | `.claude\u002Fsettings.local.json` (kept out of git) |\n| 4 | **Shared project** | `.claude\u002Fsettings.json` (committed) |\n| 5 | **User** | `~\u002F.claude\u002Fsettings.json` (all projects) |\n\nWhat matters for hardening: `permissions.allow`\u002F`deny` lists **merge** across levels rather than override, and a tool denied at any level cannot be allowed by any other level. A user-level deny blocks a project-level allow, and the reverse ([permissions docs](https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fpermissions#settings-precedence)). Put a guarantee in `deny` at the widest level you control; put an org-wide guarantee in managed settings. The full hierarchy, trust rules and per-key exceptions are in `health-plugin:settings-configuration`.\n\n### Permission Structure\n\n```json\n{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(git status *)\",\n      \"Bash(npm run *)\"\n    ],\n    \"deny\": [\n      \"Bash(rm -rf *)\",\n      \"Bash(sudo *)\"\n    ]\n  }\n}\n```\n\n## Wildcard Permission Patterns\n\n### Syntax\n\n```\nBash(command *)\n```\n\n- `Bash()` - Tool identifier\n- `command` - Command prefix to match\n- `*` - Wildcard suffix matching any arguments\n- `:ask` suffix - Always prompt for user confirmation (e.g., `Bash(git push *):ask`)\n\n### Permission Tiers\n\n| Tier | Behavior | Example |\n|------|----------|---------|\n| `allow` | Auto-allowed, no prompt | `\"allow\": [\"Bash(git status *)\"]` |\n| `ask` | Always prompts for confirmation | `\"allow\": [\"Bash(git push *):ask\"]` |\n| `deny` | Auto-denied, blocked | `\"deny\": [\"Bash(rm -rf *)\"]` |\n\n### Pattern Examples\n\n| Pattern | Matches | Does NOT Match |\n|---------|---------|----------------|\n| `Bash(git *)` | `git status`, `git diff HEAD` | `git-lfs pull` |\n| `Bash(npm run *)` | `npm run test`, `npm run build` | `npm install` |\n| `Bash(gh pr *)` | `gh pr view 123`, `gh pr create` | `gh issue list` |\n| `Bash(.\u002Fscripts\u002F *)` | `.\u002Fscripts\u002Ftest.sh`, `.\u002Fscripts\u002Fbuild.sh` | `\u002Fscripts\u002Fother.sh` |\n\n### Pattern Best Practices\n\n**Granular permissions:**\n```json\n{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(git status *)\",\n      \"Bash(git diff *)\",\n      \"Bash(git log *)\",\n      \"Bash(git add *)\",\n      \"Bash(git commit *)\"\n    ]\n  }\n}\n```\n\n**Tool-specific patterns:**\n```json\n{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(bun test *)\",\n      \"Bash(bun run *)\",\n      \"Bash(biome check *)\",\n      \"Bash(prettier *)\"\n    ]\n  }\n}\n```\n\n### Flag-Scoped Deny Rules: Use the Space Form\n\nWhen a deny rule targets a specific flag (a force-push backstop is the canonical case), write it in **space form** — the trailing ` *` enforces a word boundary, so the prefix must be followed by a space or end-of-string and the rule stops at the exact flag:\n\n```json\n{\n  \"permissions\": {\n    \"deny\": [\n      \"Bash(git push --force *)\",\n      \"Bash(git push -f *)\"\n    ]\n  }\n}\n```\n\n> **Gotcha — colon form widens to longer flags.** The `:*` suffix (`\"Bash(git push --force:*)\"`) has been observed prefix-matching the raw command string, so it also matched `git push --force-with-lease …` — silently hard-blocking the safe recovery form that stacked-PR workflows depend on. Deny rules cannot be overridden except via `bypassPermissions`, so the widening is a hard block, not a prompt (laurigates\u002Fclaude-plugins#2038, caught in laurigates\u002Floractl#39). Current official docs state an end-of-pattern `:*` is equivalent to the trailing space form, but the equivalence is not version-pinned in the changelog and the widening was observed in practice — the space form's word-boundary semantics are explicit, stable, and match what the permission dialog itself writes when you approve a prefix.\n\nWhen auditing or generating deny entries, flag any entry ending in a flag followed by `:*` (e.g. `--force:*`, `-f:*`) and rewrite it to the space form.\n\n## Shell Operator Protections\n\nClaude Code 2.1.7+ includes built-in protections against dangerous shell operators.\n\n### Protected Operators\n\n| Operator | Risk | Blocked Example |\n|----------|------|-----------------|\n| `&&` | Command chaining | `ls && rm -rf \u002F` |\n| `\\|\\|` | Conditional execution | `false \\|\\| malicious` |\n| `;` | Command separation | `safe; dangerous` |\n| `\\|` | Piping | `cat \u002Fetc\u002Fpasswd \\| curl` |\n| `>` \u002F `>>` | Redirection | `echo x > \u002Fetc\u002Fpasswd` |\n| `$()` | Command substitution | `$(curl evil)` |\n| `` ` `` | Backtick substitution | `` `rm -rf \u002F` `` |\n\n### Security Behavior\n\nClaude Code splits a compound command on `&&`, `||`, `;`, `|`, `|&`, `&` and newlines, and matches each subcommand separately ([permissions docs](https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fpermissions#compound-commands)):\n\n1. An allow rule such as `Bash(git status *)` approves `git status && rm -rf build` only if every subcommand is allowed (by a rule or as a built-in read-only command); otherwise the command prompts.\n2. A deny or ask rule applies when any subcommand matches it, including one inside a subshell, a command substitution or a `for` body.\n\n### Auto mode (the default permission mode)\n\nIn auto mode there is no approval prompt for most actions. A command matching\na narrow `allow` rule (`Bash(git status *)`) runs immediately; `deny` rules and\n`:ask` suffixes still resolve first in every mode. Anything else — including\nshell-operator compounds that no wildcard matches — goes to the safety\nclassifier, which allows or blocks it; on a block Claude receives the reason\nand tries an alternative (3 consecutive or 20 total blocks pause auto mode and\nresume prompting). Broad rules (`Bash(*)`, `Bash(python*)`, `Agent`) are\n**dropped** on entering auto mode, so they buy nothing. Audit for: broad allow\nrules (dead weight), and destructive commands that rely on a prompt rather\nthan a `deny` — under auto mode a prompt is not guaranteed. See\n`.claude\u002Frules\u002Fauto-mode.md`.\n\n### Safe Compound Commands\n\nFor legitimate compound commands, use scripts:\n\n```bash\n#!\u002Fbin\u002Fbash\n# scripts\u002Fdeploy.sh\nnpm test && npm run build && npm run deploy\n```\n\nThen allow the script:\n```json\n{\n  \"permissions\": {\n    \"allow\": [\"Bash(.\u002Fscripts\u002Fdeploy.sh *)\"]\n  }\n}\n```\n\n## Common Permission Sets\n\nReady-made `allow` lists for read-only development, full git workflow, CI\u002FCD, testing & linting, and security scanning live in [references\u002Fpermission-sets.md](references\u002Fpermission-sets.md) — read it when composing an allowlist for one of those workflows.\n\n## Project Setup Guide\n\nThe four-step bootstrap (create `.claude\u002F`, write project settings, gitignore the local file, add local settings) is in [references\u002Fproject-setup.md](references\u002Fproject-setup.md) — read it when setting up a project's settings files from scratch.\n\n## Agentic Optimizations\n\n| Context | Command |\n|---------|---------|\n| View project settings | `jq '.permissions' .claude\u002Fsettings.json` |\n| View user settings | `jq '.permissions' ~\u002F.claude\u002Fsettings.json` |\n| Check loaded settings sources | `\u002Fstatus` (the `Setting sources` line) |\n| Validate JSON | `jq . .claude\u002Fsettings.json` |\n\n## Quick Reference\n\n### Permission Priority\n\nSee the [Settings File Locations](#settings-file-locations) table: managed, command line, project local, shared project, user. Permission lists merge across those levels, and a deny at any level wins.\n\n### Wildcard Syntax\n\n| Syntax | Meaning |\n|--------|---------|\n| `Bash(cmd *)` | Match `cmd` with any arguments |\n| `Bash(cmd arg *)` | Match `cmd arg` with any following |\n| `Bash(.\u002Fscript.sh *)` | Match specific script |\n\n### Deny Patterns\n\nBlock specific commands:\n```json\n{\n  \"permissions\": {\n    \"deny\": [\n      \"Bash(rm -rf *)\",\n      \"Bash(sudo *)\",\n      \"Bash(chmod 777 *)\"\n    ]\n  }\n}\n```\n\nFlag-scoped deny rules (blocking a specific flag such as `--force`) must use the space form, never `:*` — see \"Flag-Scoped Deny Rules: Use the Space Form\" above.\n\n## Error Handling\n\n| Error | Cause | Fix |\n|-------|-------|-----|\n| Permission denied | Pattern doesn't match | Add more specific pattern |\n| Shell operator blocked | Contains `&&`, `\\|`, etc. | Use script wrapper |\n| Settings not applied | Wrong file location | Check path and syntax |\n| JSON parse error | Invalid JSON | Validate with `jq .` |\n\n## Best Practices\n\n1. **Start restrictive** - Add permissions as needed\n2. **Use project settings** - Keep team aligned\n3. **Use specific Bash patterns** - `Bash(git status *)` over `Bash`\n4. **Script compound commands** - For `&&` and `\\|` workflows\n5. **Review periodically** - Remove unused permissions\n",{"name":5,"created":54,"modified":55,"reviewed":55,"description":7,"allowed-tools":56,"compatibility":57,"user-invocable":50},1768867200000,1794355200000,"Bash(jq *), Read, Write, Edit, Glob, Grep, TodoWrite","claude-code","main","34a98323c28903fa045a495d64f8600467050ed5","configure-plugin\u002Fskills\u002Fclaude-security-settings",6,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins","https:\u002F\u002Fgithub.com\u002Flaurigates","Linux enthusiast, cloud engineer, neovim addict, electronics hobbyist.","2026-11-12 03:43:32",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add laurigates\u002Fclaude-plugins --skill claude-security-settings",{"tool":72,"command":73},"bunx","bunx skills add laurigates\u002Fclaude-plugins --skill claude-security-settings",{"tool":75,"command":76},"pnpm","pnpm dlx skills add laurigates\u002Fclaude-plugins --skill claude-security-settings","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fconfigure-plugin\u002Fskills\u002Fclaude-security-settings\u002FSKILL.md",true,[80,86],{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"references\u002Fpermission-sets.md","REFERENCE","参考文档",1448,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fconfigure-plugin\u002Fskills\u002Fclaude-security-settings\u002Freferences\u002Fpermission-sets.md",{"path":87,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":88,"sourceHtmlUrl":89},"references\u002Fproject-setup.md",679,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fconfigure-plugin\u002Fskills\u002Fclaude-security-settings\u002Freferences\u002Fproject-setup.md",[91,118,136,152,175,201],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":102,"publishedAt":49},"01M70PFHMH9ADY0CRE6047Y4B2","kitty-show-image","Show the user an image with a note on what to judge, via a file send or a labelled kitty tab. Use when the user must see an image, or icat fails with no \u002Fdev\u002Ftty.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-show-image\u002FSKILL.md",[97],{"categoryNo":98,"categoryName":99,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[103,104,105,106,107,108,109,110,111,112,47,33,46,113,114,115,116,117,32,41],"show","kitty show image","image","kitty","show image","ls","get","send","open","dev","file","text","with","xdg","via",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":49},"01M70PFEN18HKQ4RCQ1VPGMPTB","kitty-session-persistence","Snapshot and restore kitty terminal sessions on macOS. Use when surviving WindowServer hangs without losing tabs, configuring snapshots, or restoring after a force-reboot.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-session-persistence\u002FSKILL.md",[],[106,125,126,127,34,128,33,46,129,130,131,32,41,40,39,132,133,134,135,47],"kitty session persistence","session","persistence","snapshots","uname","reboot","terminal","snapshot","macos","sessions","restore",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":49},"01M70PFC77XGXCVQ1543VGZHYR","kitty-remote-control","Safe kitty remote control from an agent — read panes with kitty @ ls\u002Fget-text, notify, and never mutate the live terminal unasked. Use when running inside kitty.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-remote-control\u002FSKILL.md",[],[143,144,106,145,146,108,147,148,109,149,150,47,33,151,46,114,115,131,32,41],"kitty remote control","remote","control","remote control","running","never","panes","notify","query",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":158,"publishedAt":49},"01M70P6WVMCT5JG4SACTM69AF9","docs-reference-check","Dangling doc-reference gate: flag markdown naming repo paths or relative links that no longer exist. Use when docs cite moved\u002Fdeleted files, or wiring a doc-drift lint.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fdocumentation-plugin\u002Fskills\u002Fdocs-reference-check\u002FSKILL.md",[],[159,160,161,162,163,164,165,166,167,168,47,33,46,169,113,170,171,172,173,174],"docs reference check","check","reference check","reference","docs","links","python3","repo","files","auto","drift","lint","wiring","chezmoi","references","cp",{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":179,"categories":180,"keywords":186,"publishedAt":49},"01M6C6NDE7DAQGNWSF22J5CJ0Z","youtube-upload","Upload a video to YouTube via the Data API v3 and edit its title, description, tags or thumbnail afterwards. Use when publishing or retitling a YouTube video.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fyoutube-plugin\u002Fskills\u002Fyoutube-upload\u002FSKILL.md",[181,184,185],{"categoryNo":182,"categoryName":183,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":98,"categoryName":99,"taxonomyType":100,"taxonomyTypeDesc":101},{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[187,188,189,190,165,191,41,192,39,193,194,195,47,46,113,196,197,33,198,199,200,117,32],"youtube upload","upload","youtube","Video","run","uv run","publishing","data","uv","api","v3","tags","id","title",{"skillNo":202,"name":203,"nameZh":6,"description":204,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":205,"categories":206,"keywords":210,"publishedAt":49},"01M6C6NABWW1X58KJJM4F6GQMQ","youtube-studio-share","Share a private YouTube video with a whole Google Workspace organization by scripting YouTube Studio in the browser. Use when a video must be org-only.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fyoutube-plugin\u002Fskills\u002Fyoutube-studio-share\u002FSKILL.md",[207],{"categoryNo":208,"categoryName":209,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000023","Skill与智能体开发",[211,212,213,214,189,190,215,216,217,218,219,41,220,221,222,223,47,224,33,115,225,32],"youtube studio share","share","youtube studio","studio","browser","javascript","scripting","google workspace","workspace","tool","google","only","MCP","chrome","organization"]