skills/env/SKILL.md
Manage credentials INSIDE the active ~/.claude/.env file — read which token/account to use for a given app (Simplicity vs Dataforce vs Ronan-personal), add or update a secret WITHOUT it passing through the chat (an interactive Terminal window prompts for it), and track secrets that were exposed in a transcript so they get rotated. Sibling to /ro:context (which switches WHICH env file is active). Use when the user wants to add an API key/token/secret, asks "which credential do I use for X", needs the env organized/labelled, or a secret was pasted into the chat and should be rotated.
npx skillsauth add RonanCodes/ronan-skills envInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
/ro:context decides which ~/.claude/.env.<context> file is active. /ro:env manages the credentials inside it: reading the right one, adding new ones safely, keeping it organised, and tracking exposures. Resolve the active file with ro context env (cwd-aware); ~/.claude/.env is a symlink to it.
Every section of the env file is tagged with one of three owners. Never guess — the tag tells you.
| Tag | What | Cloudflare account |
|---|---|---|
| [SIMPLICITY] | Simplicity Labs company infra. Bare names (CLOUDFLARE_API_TOKEN, _ACCOUNT_ID, _ZONE_ID) are the Simplicity defaults, kept bare for skill compatibility; _SIMPLICITY mirrors them. | fcc16bad… ("[email protected]'s Account") |
| [DATAFORCE] | The product (Simplicity × Taskforce). Runs on the Simplicity account; own keys always suffixed _DATAFORCE, or product-scoped (Google Ads, Shopify, Nango, Atlassian DAFO, ChatGPT GPT). | fcc16bad… (same account) |
| [PERSONAL] | Ronan's own side-projects, NOT Simplicity. Suffixes _RONAN, _LEKKERTAAL, _ADHD; also Pushover/Telegram/Neon-"factory"/VAPID. | c421a1b2… (ronanconnolly.dev / [email protected]) |
The file carries a LEGEND + DEPLOY CHEAT-SHEET at the top mirroring this. The dataforce repo's memory reference_dataforce_cf_credentials mirrors it too.
| App | Token | Account |
|---|---|---|
| Dataforce | CLOUDFLARE_API_TOKEN_DATAFORCE | CLOUDFLARE_ACCOUNT_ID_SIMPLICITY |
| Simplicity site | CLOUDFLARE_API_TOKEN (=_SIMPLICITY) | CLOUDFLARE_ACCOUNT_ID |
| lekkertaal / adhd | CLOUDFLARE_API_TOKEN_RONAN | _ADHD | CLOUDFLARE_ACCOUNT_ID_RONAN |
which <app> → just answer from the table above + grep -iE '<app>' "$(ro context env)".
Default path (agent-driven): launch an interactive Terminal window so the human types the secret there. The value never enters the conversation, never hits a tool result, never lands in argv/ps.
bash ~/Dev/ronan-skills/skills/env/scripts/add-secret.sh --launch ANTHROPIC_API_KEY_DATAFORCE DATAFORCE "Workspace key, dataforce chat"
That opens Terminal; the user pastes the value at a hidden read -rs prompt. The script then, on the real env file (symlink resolved):
.bak.<ts> backup first (non-destructive),# [OWNER] … block at the end,If the user is at the keyboard, they can run it themselves: prefix with ! in Claude Code, or run bash …/add-secret.sh --interactive KEY OWNER "comment" in any terminal.
Rule: if a user does paste a secret into the chat anyway, (1) still get it into the env (or wherever it belongs), and (2) immediately log it for rotation (next section) and tell them to rotate it — a value in the transcript is compromised.
When a secret is exposed (pasted in chat, screenshotted, committed), log it:
bash ~/Dev/ronan-skills/skills/env/scripts/rotate-queue.sh add CLOUDFLARE_API_TOKEN_DATAFORCE env "re-pasted in chat 2026-05-23"
bash ~/Dev/ronan-skills/skills/env/scripts/rotate-queue.sh list # see everything still to rotate
bash ~/Dev/ronan-skills/skills/env/scripts/rotate-queue.sh done CLOUDFLARE_API_TOKEN_DATAFORCE
Queue lives at ~/.claude/.secrets-rotate-queue.md (gitignored). list also greps the active env for CHAT-EXPOSED / ROTATE comment markers. At the start of any session that will touch deploys/secrets, run list and nudge the user on anything still OPEN.
Keep it self-documenting:
# --- [OWNER] … --- tag.add-secret.sh so you don't see it and can't typo it). The file is a symlink — edit the resolved target (readlink -f ~/.claude/.env), not the link._DATAFORCE, _RONAN, …), and add them via add-secret.sh with that OWNER tag./ro:context — switches the active profile/file. ro:env operates within whatever it resolves./ro:cf-ship, /ro:fly-deploy, /ro:cloudflare-dns — consume these credentials; point them at the cheat-sheet when they pick a token./ro:setup-wizard — first-run onboarding; ro:env is the ongoing per-secret manager.development
Close the loop on a Linear ticket when its work ships - move the status and post a deploy comment with the PR link, what shipped, and a try-it link, mentioning the collaborator. Used as the tail of /ro:linear-nightshift for every merged mirror, or manually after an ad-hoc build. Triggers on "linear update", "update the linear ticket", "mark NUT-x done", "tell eoin it shipped", "/ro:linear-update".
devops
Run a night-shift against a collaborator's Linear board. Pulls the team's Grilled tickets (/ro:linear-grill moves a ticket to Grilled once its questions are answered), VERIFIES the questions were actually answered (unanswered → bounce the ticket to the "Question for <name>" state), mirrors verified tickets to ephemeral GitHub issues with ready-for-agent, then runs the standard /ro:night-shift machinery on GitHub. Tail-calls /ro:linear-update for everything that merged + deployed. Triggers on "linear nightshift", "nightshift linear", "drain the linear board", "run the shift off linear", "/ro:linear-nightshift".
development
Grill a collaborator's Linear tickets and move every processed ticket to where it belongs. Resolves the board from the repo's .ro-linear.json, reads the collaborator's Backlog / Ready-for-agent issues, then per ticket either posts 3-5 decision-extracting questions (state moves to "Question for <name>") or confirms it build-ready (state moves to "Grilled", the gate /ro:linear-nightshift consumes); shipped-and-confirmed tickets close as Done. The async-collaborator counterpart of /ro:day-shift for people who never touch GitHub. Triggers on "grill linear", "grill eoin's tickets", "linear grill", "add questions to the linear tickets", "/ro:linear-grill".
development
--- name: about-page description: Add a standard About page to any web app, what it is, the tech stack, and an FAQ, wired into a footer link with a sticky footer. Built with Spartan + Tailwind (the canonical component layer) and falls back to semantic HTML so it ships reliably. Use whenever building, polishing, or shipping an app, every app should have one. Triggers on "add an about page", "about page", "footer about link", or as a standard step in app build/polish. category: frontend argument-h