用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/dvcrn/skills --skill fnox命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Install and configure PostHog in an Elixir/Phoenix project, including backend SDK, runtime configuration, an app-owned analytics boundary, identity wiring, JS client assets, template wiring, Plug middleware, and verification. Use when adding PostHog analytics or event capture to an Elixir or Phoenix application.
Install and configure Sentry in an Elixir or Phoenix project using official modern defaults, including runtime DSN configuration, Sentry.LoggerHandler with log message capture and rate limiting, Sentry.PlugContext placement, Cowboy/Bandit server detection, Oban error reporting, PII scrubbing, source code packaging for releases, and verification. Use when adding Sentry error monitoring or updating Sentry setup in an Elixir codebase.
SwiftUI state management using @Observable Store containers (Observation framework, iOS 17+), @Environment injection, store composition, derived state, and async mutation patterns. Use when designing or reviewing Store architecture, migrating from ObservableObject/Combine, translating React hooks or React Query patterns to SwiftUI, or implementing shared app-wide state containers.
正在显示 SKILL.md
| name | fnox |
| description | Manage secrets with fnox. Use when you need to use fnox, need to manage secrets or store something sensitive for a project. |
fnox is a secrets manager that:
fnox.toml (safe to commit to git)cd into a directory!fnox --help
fnox set <KEY> <VALUE> --provider <provider> (--profile <profile>)
We have 3 backends: age, 1password and keychain
fnox.toml is present, try to set a random secret with fnox set foo bar --provider age, this will:age is not configured in fnox.toml, set the following provider info:[providers.age]
type = "age"
recipients = ["age1c40s08d0necnrjmvtpd3y9l7ymre8vyh2pms7vpdw0ewdvgl03pseeqqyr"]
Caveats:
age is stored in fnox.toml itself: Use for all secrets we need locally. This will get checked into github
keychain is not stored in any file, but is only local for this machine. Use for secrets that we need on the entire OS level, but consider that we need a backup somewhere else. keychain is VERY fast1password is persisted across different machines on 1password servers. We should use this for all production secrets. Caveats: It's very slow to read, so not good for local development. fnox can also not directly set 1password secrets
By default we will put everything into age
Setting a secret works like this:
By default we will call fnox set or fnox get without any profile setting
Production variables are required to have a --profile production setting. So fnox set --profile production KEY value --provider age
Getting secrets work as the inverse of set:
fnox get <KEY> (--provider <provider>) (--profile <profile>)
--provider, it's all managed in fnox.toml--profile unless we use a variable that is set in a different profile, such as productionWe can also list out all configured secrets to see what has been set with:
fnox list
Use the following command to execute something with all secrets loaded:
fnox x -- <command>
mise.toml (you are allowed to write this file)fnox.toml (you are not allowed to write this file directly. Use fnox get fnox set fnox remove to manipulate)If unsure whether something is sensitive or not, ask the user. Do not make assumptions.
.envrc (direnv).envrc, put them into fnox.tomlexport XXX=$(fnox get XXX)fnox ex command to export everything from the current fnox vault, which you then need to source: source $(fnox ex) or fnox ex | sourcefnox must live in the 1Password vault configured for the onepass provider in fnox.toml (e.g., vault = "Fnox" or vault = "Development"). Items outside this vault will not resolve.fnox.toml.
OPENAI_API_KEY → MYPROJECT_OPENAI_API_KEYmyproject (optionally also tag environment: dev, staging, prod)fnox cannot create or update 1Password items. Always use the 1Password CLI (op) to create/update items, and only reference them from fnox.export OP_SERVICE_ACCOUNT_TOKEN=$(fnox get OP_SERVICE_ACCOUNT_TOKEN)
opCreate a password item (API key style):
op item create --category=password \
--title="MYPROJECT_OPENAI_API_KEY" \
--vault="Fnox" \
password="sk_live_..." \
--tags "myproject dev"
Create a login item (username/password style):
op item create --category=login \
--title="MYPROJECT_DATABASE" \
--vault="Fnox" \
username="db_user" \
password="super-secret" \
--tags "myproject dev"
Update tags or fields later:
op item edit "MYPROJECT_OPENAI_API_KEY" --vault "Fnox" --tags "myproject prod"
op item edit "MYPROJECT_DATABASE" --vault "Fnox" password="new-secret"
fnox.tomlUse any of the supported formats — item name (password field), item+field, or full op:// URI. Ensure the provider matches your 1Password provider key and the item resides in the configured vault.
[secrets]
# Item name → resolves the default 'password'/'credential' field
OPENAI_API_KEY = { provider = "onepass", value = "MYPROJECT_OPENAI_API_KEY" }
# Item + specific field
DB_USERNAME = { provider = "onepass", value = "MYPROJECT_DATABASE/username" }
DB_PASSWORD = { provider = "onepass", value = "MYPROJECT_DATABASE/password" }
# Full op:// URI (explicit vault/item/field)
OPENAI_API_KEY_URI = { provider = "onepass", value = "op://Fnox/MYPROJECT_OPENAI_API_KEY/credential" }
Correct vs Incorrect naming:
# Correct: fnox key is NOT prefixed; 1Password item IS prefixed
[secrets.GOOGLE_AI_API_KEY]
provider = "onepass"
value = "MYPROJECT_GOOGLE_AI_API_KEY"
# Incorrect: both sides prefixed (do not do this)
[secrets.MYPROJECT_GOOGLE_AI_API_KEY]
provider = "onepass"
value = "MYPROJECT_GOOGLE_AI_API_KEY"
Common fields: username, password, credential, url, notes.
fnoxexport OP_SERVICE_ACCOUNT_TOKEN=$(fnox get OP_SERVICE_ACCOUNT_TOKEN)
# Fetch values
fnox get OPENAI_API_KEY
fnox get DB_USERNAME
# Run a command with secrets loaded
fnox x -- <command>