Firecrawl Build Onboarding
firecrawl/firecrawl
Gets Firecrawl working in a project: signs you in through the browser, saves FIRECRAWL_API_KEY to .env and picks the first SDK or REST path.
OPS on-demand: This skill should be used when the user asks to "update credentials", "ops settings", or…
$ npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-settings -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Lifecycle-Innovations-Limited/claude-ops ops-settings --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Lifecycle-Innovations-Limited/claude-ops.git skills-src && mkdir -p .claude/skills && cp -r skills-src/claude-ops/skills/ops-settings .claude/skills/ops-settings && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "ops-settings" agent skill from https://github.com/Lifecycle-Innovations-Limited/claude-ops/tree/main/claude-ops/skills/ops-settings into .claude/skills/ops-settings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-settings", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Lifecycle-Innovations-Limited/claude-ops/tree/main/claude-ops/skills/ops-settingsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-settings -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Lifecycle-Innovations-Limited/claude-ops ops-settings --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Lifecycle-Innovations-Limited/claude-ops.git skills-src && mkdir -p .agents/skills && cp -r skills-src/claude-ops/skills/ops-settings .agents/skills/ops-settings && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ops-settings" agent skill from https://github.com/Lifecycle-Innovations-Limited/claude-ops/tree/main/claude-ops/skills/ops-settings into .agents/skills/ops-settings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-settings", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-settings -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Lifecycle-Innovations-Limited/claude-ops ops-settings --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Lifecycle-Innovations-Limited/claude-ops.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/claude-ops/skills/ops-settings .cursor/skills/ops-settings && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ops-settings" agent skill from https://github.com/Lifecycle-Innovations-Limited/claude-ops/tree/main/claude-ops/skills/ops-settings into .cursor/skills/ops-settings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-settings", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Lifecycle-Innovations-Limited/claude-ops.git --path claude-ops/skills/ops-settings--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-settings -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Lifecycle-Innovations-Limited/claude-ops ops-settings --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Lifecycle-Innovations-Limited/claude-ops.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/claude-ops/skills/ops-settings .gemini/skills/ops-settings && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ops-settings" agent skill from https://github.com/Lifecycle-Innovations-Limited/claude-ops/tree/main/claude-ops/skills/ops-settings into .gemini/skills/ops-settings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-settings", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Lifecycle-Innovations-Limited/claude-ops ops-settingsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-settings -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Lifecycle-Innovations-Limited/claude-ops.git skills-src && mkdir -p .github/skills && cp -r skills-src/claude-ops/skills/ops-settings .github/skills/ops-settings && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ops-settings" agent skill from https://github.com/Lifecycle-Innovations-Limited/claude-ops/tree/main/claude-ops/skills/ops-settings into .github/skills/ops-settings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-settings", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-settings -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Lifecycle-Innovations-Limited/claude-ops ops-settings --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Lifecycle-Innovations-Limited/claude-ops.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/claude-ops/skills/ops-settings .opencode/skills/ops-settings && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ops-settings" agent skill from https://github.com/Lifecycle-Innovations-Limited/claude-ops/tree/main/claude-ops/skills/ops-settings into .opencode/skills/ops-settings/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-settings", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ops-settingsOPS on-demand: This skill should be used when the user asks to "update credentials", "ops settings", or…
Ops Settings is an agent skill from Lifecycle-Innovations-Limited/claude-ops. OPS on-demand: This skill should be used when the user asks to "update credentials", "ops settings", or…
Its SKILL.md is about 5.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/details.md`).
It works with Stripe. The repository describes itself as: Business operating system for Claude Code — 57 skills, 21 agents, smart daemon. Unified inbox (WhatsApp/Email/Slack/Telegram), autonomous PR merge, full-AWS monitoring, revenue… The licence is MIT.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 1aa0928. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashReadWriteEditAskUserQuestionFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
jqcurlawsstripeshopifypython3bashghnodenpxFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.stripe.comapi.revenuecat.comslack.coma.klaviyo.comapi.datadoghq.comapi.newrelic.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
DOPPLER_TOKENGOOGLE_ACCESS_TOKENPOCKET_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ops Settings loads about 5.4k tokens when it runs, and up to ~5.6k if it reads all its reference files. Until then it costs about 29 tokens; SKILL.md has 1,250 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Bash, Read, Write, Edit, AskUserQuestionAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Lifecycle-Innovations-Limited/claude-ops at commit 1aa0928, republished under its MIT licence (© Lifecycle-Innovations-Limited). 1,250 words, ~5,406 tokens.
.claude/skills/ops-settings/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.PREFS="${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json"
cat "$PREFS" 2>/dev/null || echo '{}'Load ops-rules before acting. Public repo (no personal data). Outbound: one draft → one approval → one send. If AskUserQuestion / Workflow are missing, follow Rule 10 in ops-rules (Hermes: numbered options / two-turn Telegram card; delegate_task).
Manage credentials and integration config after initial setup.
--status or empty → show full credential status dashboard<integration-name> → jump directly to updating that integration (e.g. /ops:settings stripe)--status <integration-name> → show status of one integration onlyRead preferences.json. For each known integration, check whether the key exists and is non-empty. Also probe liveness where possible.
Display as a table:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► SETTINGS — Integration Status
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Integration Status Last Updated
─────────────────── ──────────── ─────────────
GitHub (gh cli) ✅ active (always active if gh auth status)
Stripe ✅ configured 2026-04-14
RevenueCat ✅ configured 2026-04-14
Telegram ✅ configured 2026-04-13
Slack ⚠️ missing —
Linear ✅ configured 2026-04-11
Sentry ⚠️ missing —
AWS ✅ active (always active if aws sts works)
Shopify ⚠️ missing —
Klaviyo ⚠️ missing —
Meta Ads ⚠️ missing —
GA4 ⚠️ missing —
Organic FB/IG ⚠️ missing —
YouTube ⚠️ missing —
Search Console ⚠️ missing —
Merchant Center ⚠️ missing —
ElevenLabs ⚠️ missing —
Datadog ⚠️ missing —
New Relic ⚠️ missing —
...
✅ N configured ⚠️ N missing
──────────────────────────────────────────────────────For integrations with a cheap health check, run it to distinguish "configured but expired" from "configured and active":
| Integration | Probe | Active signal |
| ----------- | ---------------------------------------------------------------------------------------------- | ------------------------------------- | --------- |
| Stripe | curl -s -o /dev/null -w "%{http_code}" -u "${stripe_key}:" https://api.stripe.com/v1/balance | 200 |
| GitHub | gh auth status 2>&1 | "Logged in" |
| AWS | aws sts get-caller-identity --output text 2>/dev/null | exits 0 |
| Linear | cat "$PREFS" | jq -r .linear_team | non-empty |
| Doppler MCP | Check if DOPPLER_TOKEN is set and valid | Token present and MCP server responds |
Show 🔴 expired if probe fails for a previously-configured key.
When a specific integration is selected (via argument or user pick from dashboard):
sk_live_•••••••••••••••• (last 4 chars visible)[Enter new value] [Test current value] [Clear this credential] [Back to dashboard]AskUserQuestion text inputpreferences.json via jq update:tmp=$(mktemp)
jq --arg v "$NEW_VALUE" --arg k "$KEY_NAME" '.[$k] = $v' "$PREFS" > "$tmp" && mv "$tmp" "$PREFS"✅ Stripe key updated — smoke test passed or ⚠️ Key saved but smoke test failed: <reason>| Integration | Smoke test command |
| ----------- | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
| Stripe | curl -s -u "${new_key}:" https://api.stripe.com/v1/balance \| jq .object → must be "balance" |
| RevenueCat | curl -s -H "Authorization: Bearer ${new_key}" "https://api.revenuecat.com/v2/projects" \| jq '.items \| length' → non-zero |
| Telegram | node ${CLAUDE_PLUGIN_ROOT}/telegram-server/index.js --health 2>&1 → "healthy" |
| Slack | curl -s -H "Authorization: Bearer ${new_token}" https://slack.com/api/auth.test \| jq .ok → true |
| Shopify | curl -s -H "X-Shopify-Access-Token: ${new_token}" "https://${store_url}/admin/api/2024-01/shop.json" \| jq .shop.name → non-null |
| Klaviyo | curl -s -H "Authorization: Klaviyo-API-Key ${new_key}" https://a.klaviyo.com/api/accounts/ \| jq '.data[0].id' → non-null |
| Datadog | curl -s -H "DD-API-KEY: ${new_key}" https://api.datadoghq.com/api/v1/validate \| jq .valid → true |
| New Relic | curl -s -H "Api-Key: ${new_key}" https://api.newrelic.com/v2/applications.json \| jq '.applications | length' → numeric |
| Doppler MCP | npx -y @dopplerhq/mcp-server --help 2>&1 with DOPPLER_TOKEN set | exits 0 |
Direct marketing surfaces (per-project keys under .marketing.projects.<p> — see
docs/integrations/direct-channel-wiring.md for the full key matrix). Status check:
key group present and non-empty → configured, else missing. Smoke test each via
scripts/lib/organic-metrics-aggregator.sh — a JSON object means live, null means
missing/broken creds (never render null as zeros):
| Surface | Prefs keys | Smoke test (after . "${CLAUDE_PLUGIN_ROOT}/scripts/lib/organic-metrics-aggregator.sh") |
|---|---|---|
| Organic FB/IG | meta.access_token + meta.page_id / meta.instagram_business_id | organic_meta <project> | jq . → object with page_fans / ig_followers |
| YouTube | youtube.refresh_token/client_id/client_secret | organic_youtube <project> | jq . → object with views |
| Search Console | gsc.site_url (+ gcloud ADC or $GOOGLE_ACCESS_TOKEN) | organic_searchconsole <project> | jq . → object with clicks |
| Merchant Center | merchant_center.merchant_id (+ Google auth) | merchant_status <project> | jq . → object with approved/disapproved |
Lets an operator view and edit per-project autopilot config without re-running setup. See skills/ops-marketing/SKILL.md → ## autopilot for the full field semantics.
List projects that have an autopilot block:
jq -r '.marketing.projects | to_entries[] | select(.value.autopilot) | .key' "$PREFS"If more than 4 projects, paginate the picker at 4 per AskUserQuestion page with [More...] as the bridge (Rule 1).
Show current config for the chosen project $P:
jq --arg p "$P" '.marketing.projects[$p].autopilot' "$PREFS"Editor. Drive edits via AskUserQuestion, batching the editable fields across multiple ≤4-option questions (Rule 1):
[autonomy_level] [envelope.kill_switch] [Back][envelope.max_campaigns] [envelope.max_new_audiences] [envelope.max_daily_budget_usd] [More...][envelope.objective_allowlist] [envelope.geo_allowlist] [Back][source.url] [creative_gen.daily_gen_spend_cap_usd] [creative_gen.neurons.enabled] [Back]For autonomy_level offer the 4 fixed values across one question: [create_once] [sandbox] [unrestricted] [Back]. Allowlists are comma-separated free text; numeric/boolean fields are free text or a 2-option toggle.
Merge-write pattern (mirrors the "Update an integration" jq pattern, nested under .marketing.projects[$p].autopilot — never clobber sibling keys):
tmp=$(mktemp)
jq --arg p "$P" --arg v "$V" \
'.marketing.projects[$p].autopilot.autonomy_level = $v' "$PREFS" > "$tmp" && mv "$tmp" "$PREFS"Use the matching jq path per field, e.g.:
# numeric envelope field (jq tonumber to keep it a number)
jq --arg p "$P" --argjson v "$V" \
'.marketing.projects[$p].autopilot.envelope.max_campaigns = $v' "$PREFS" > "$tmp" && mv "$tmp" "$PREFS"
# boolean kill switch
jq --arg p "$P" --argjson v true \
'.marketing.projects[$p].autopilot.envelope.kill_switch = $v' "$PREFS" > "$tmp" && mv "$tmp" "$PREFS"
# allowlist (comma-separated input -> JSON array)
jq --arg p "$P" --arg v "NL,US" \
'.marketing.projects[$p].autopilot.envelope.geo_allowlist = ($v | split(","))' \
"$PREFS" > "$tmp" && mv "$tmp" "$PREFS"
# source URL
jq --arg p "$P" --arg v "https://example.com" \
'.marketing.projects[$p].autopilot.source.url = $v' "$PREFS" > "$tmp" && mv "$tmp" "$PREFS"
# Gemini gen spend cap (must be <= daily_spend_cap_usd — validate before write)
jq --arg p "$P" --argjson v "$V" \
'.marketing.projects[$p].autopilot.creative_gen.daily_gen_spend_cap_usd = $v' \
"$PREFS" > "$tmp" && mv "$tmp" "$PREFS"
# Neurons external signal
jq --arg p "$P" --argjson v false \
'.marketing.projects[$p].autopilot.creative_gen.neurons.enabled = $v' \
"$PREFS" > "$tmp" && mv "$tmp" "$PREFS"Safety note (surface this before writing):
autonomy_level to unrestricted removes the default creation guardrail — autonomous campaign/audience/budget creation becomes bounded only by daily_spend_cap_usd. Confirm via AskUserQuestion ([Set unrestricted] / [Keep current]) before writing.envelope.kill_switch: true hard-stops all mutations on the next pass (stage-only, zero writes) regardless of autonomy_level.autonomy_level and kill_switch for every project with autopilot.enabled == true.Manages the voice-journal activity notifier (POCKET_API_KEY watcher + WhatsApp/email bridges + launchd agent).
Route here when the user runs /ops:settings pocket or selects "Pocket" from the dashboard.
Read all four health files and print a compact status block:
STATE_DIR="$HOME/.claude/state/pocket"
for f in .activity-notifier-health .out-queue-health .email-bridge-health .whatsapp-bridge-health; do
label="${f#.}"
label="${label%-health}"
content=$(cat "$STATE_DIR/$f" 2>/dev/null)
if [ -z "$content" ]; then
echo "$label: missing"
else
status=$(echo "$content" | jq -r '.status // "unknown"' 2>/dev/null)
msg=$(echo "$content" | jq -r '.message // ""' 2>/dev/null)
last=$(echo "$content" | jq -r '.last_run // ""' 2>/dev/null)
echo "$label: $status $msg ($last)"
fi
doneFor each service whose status is not "ok", flag it:
activity-notifier: ok (2026-05-20T12:34:56Z)
out-queue: ok sent=3 (2026-05-20T12:34:55Z)
email-bridge: disabled (2026-05-20T12:34:50Z)
whatsapp-bridge: ok scanned=12 routed=1 (2026-05-20T12:34:54Z)Show ✗ missing for any health file that does not exist.
STATE_DIR="$HOME/.claude/state/pocket"
echo "tasks.jsonl: $(wc -l < "$STATE_DIR/tasks.jsonl" 2>/dev/null || echo 0) lines"
echo "pending-triage.jsonl: $(wc -l < "$STATE_DIR/pending-triage.jsonl" 2>/dev/null || echo 0) lines"
echo "executor-results/: $(ls "$STATE_DIR/executor-results/" 2>/dev/null | wc -l | tr -d ' ') files"Ask AskUserQuestion:
Which Pocket notification channel setting would you like to change?
[Toggle WhatsApp] [Toggle Email] [Edit self-address] [Back]Toggle WhatsApp — read ~/.claude/state/pocket/whatsapp-config.json, flip .enabled, write back:
F="$HOME/.claude/state/pocket/whatsapp-config.json"
CUR=$(jq -r '.enabled' "$F" 2>/dev/null || echo false)
NEW=$([ "$CUR" = "true" ] && echo false || echo true)
jq --argjson v "$NEW" '.enabled = $v' "$F" > "${F}.tmp" && mv "${F}.tmp" "$F"
echo "WhatsApp notifications: $NEW"Toggle Email — same pattern with ~/.claude/state/pocket/email-config.json.
Edit self-address — show current email-config.json:.self_address, ask for new value via AskUserQuestion text input, write back:
F="$HOME/.claude/state/pocket/email-config.json"
jq --arg v "$NEW_ADDR" '.self_address = $v | .from_account = $v' "$F" > "${F}.tmp" && mv "${F}.tmp" "$F"Fine-grained, per-event routing for the whole pocket module, dispatched by
ops-pocket-notify and stored in preferences.json → pocket.notifications
(schema + event list: docs/pocket-notifications.md). This is the interactive
"which notifications, which channels, when" surface.
Pick the event to configure. The event list can exceed 4, so paginate per
Rule 1 (AskUserQuestion, ≤4 options, [More events…] to advance):
Which pocket event?
[env-broker.uid-rejected (security)] [env-broker.denied] [worker.failed] [More events…]Page 2: [worker.completed] [worker.spawned] [queue.stuck] [More events…],
page 3: [daemon.down] [Done].
Pick channels for that event (multi-select, ≤4 — only offer channels that
are configured per View status above):
Notify on <event> via: (multi-select)
[Telegram] [Email] [WhatsApp] [Slack]Set the schedule for that event (one AskUserQuestion each, as needed):
[low] [medium] [high] (high bypasses quiet hours).[60s] [5 min] [30 min] [No limit].[22:00–08:00] [None] [Custom…].[Every day] [Weekdays] [Custom…].Write it to preferences.json (create the path if absent):
PREFS="${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json"
tmp="$(mktemp)"
jq --arg ev "$EVENT" --argjson chans "$CHANNELS_JSON" --arg sev "$SEVERITY" \
--argjson cooldown "$COOLDOWN" \
'.pocket.notifications.events[$ev] = {channels: $chans, severity: $sev, schedule: {cooldown: $cooldown}}' \
"$PREFS" > "$tmp" && mv "$tmp" "$PREFS"(Merge quiet_hours / active_days into .schedule the same way when set.)
Test-send the event so the operator confirms routing without waiting for a real trigger:
ops-pocket-notify "$EVENT" "test notification from /ops:setup" --severity "$SEVERITY" --dry-run --jsonShow the fired channels (or the suppressed reason). Offer a real send
(drop --dry-run) for the chosen event so they see it land on the device.
Repeat from step 1 for the next event, or [Done].
Run the watcher directly (picks up POCKET_API_KEY from keychain/env):
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(ls -d "$HOME/.claude/plugins/cache/ops-marketplace/ops"/*/ 2>/dev/null | sort -V | tail -1)}"
python3 "$PLUGIN_ROOT/scripts/ops-cron-pocket-watcher.py"Report exit code and last line of ~/.claude/state/pocket/run.log.
launchctl kickstart -k "gui/$(id -u)/com.claude-ops.pocket-activity-notifier"Wait 3 seconds then print the updated .activity-notifier-health status.
STATE_DIR="$HOME/.claude/state/pocket"
echo "=== WhatsApp (out-queue-sent.jsonl) ==="
tail -3 "$STATE_DIR/out-queue-sent.jsonl" 2>/dev/null | jq -r '"\(.sent_at // .ts // "?") \(.message // .body // "" | .[0:80])"' 2>/dev/null || echo "(none)"
echo "=== Email (email-sent.jsonl) ==="
tail -3 "$STATE_DIR/email-sent.jsonl" 2>/dev/null | jq -r '"\(.sent_at // .ts // "?") \(.subject // "" | .[0:80])"' 2>/dev/null || echo "(none)"Manage background daemon services declared in daemon-services.default.json. Route here when the user runs /ops:settings daemons or selects "Daemon services" from the dashboard.
DAEMON_DEFAULT="${CLAUDE_PLUGIN_ROOT}/scripts/daemon-services.default.json"
DAEMON_OVERRIDE="${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/daemon-services.override.json"
# Merge: override file wins on matching service keys
if [ -f "$DAEMON_OVERRIDE" ]; then
jq -s '.[0].services * .[1].services' "$DAEMON_DEFAULT" "$DAEMON_OVERRIDE" 2>/dev/null
else
jq '.services' "$DAEMON_DEFAULT" 2>/dev/null
fiDisplay as a table (for each service, show enabled state, last_run age, and health status from the health_file if declared):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► SETTINGS — Daemon Services
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Service Enabled Last Run Health
──────────────────────── ───────── ──────────── ────────────
briefing-pre-warm ✅ on 2m ago ✓ ok
memory-extractor ✅ on 18m ago ✓ ok
message-listener ⏸ off — —
competitor-intel ⏸ off — —
marketing-autopilot ⏸ off — —
──────────────────────────────────────────────────────────────────For each enabled: true service with a health_file, expand ~ → $HOME, read the JSON file, extract .last_run and .status. Services with no health_file show —.
Writes to the override file only — never edits daemon-services.default.json.
Confirm each toggle via AskUserQuestion ([Enable] / [Disable] / [Cancel]) before writing.
DAEMON_OVERRIDE="${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/daemon-services.override.json"
tmp=$(mktemp)
# Enable:
jq --arg svc "$SERVICE_NAME" '.services[$svc].enabled = true' \
"${DAEMON_OVERRIDE}" > "$tmp" 2>/dev/null \
|| echo "{\"services\":{\"$SERVICE_NAME\":{\"enabled\":true}}}" > "$tmp"
mv "$tmp" "$DAEMON_OVERRIDE"
# Disable: same pattern with `= false`If the override file does not exist yet, initialise it with {"services":{}} before writing.
OPS_DATA_DIR="${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}"
tail -n 5 "$OPS_DATA_DIR/logs/${SERVICE_NAME}.log" 2>/dev/null || echo "(no log file found)"whatsapp-bridge):launchctl kickstart -k "gui/$UID/com.<user>.${SERVICE_NAME}"command pointing to a .sh file):COMMAND=$(jq -r ".services[\"$SERVICE_NAME\"].command" "$DAEMON_DEFAULT" \
| sed "s|\${CLAUDE_PLUGIN_ROOT}|${CLAUDE_PLUGIN_ROOT}|g")
bash "$COMMAND"Always confirm via AskUserQuestion ([Run now] / [Cancel]) before triggering.
Route here when the user runs /ops:settings home or selects "Home Automation" from the dashboard.
PREFS="${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json"
jq '.home_automation // empty' "$PREFS" 2>/dev/nullDisplay as a compact block:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► SETTINGS — Home Automation (Homey Pro)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Status: ✅ configured (or ⚠️ not configured)
Local URL: https://192.168.1.••• (mask all but last octet)
Local token: ••••••••••••abcd (last 4 chars only)
Cloud token: ✅ present (or ○ not set)
Homey ID: ✅ present (or ○ not set)
──────────────────────────────────────────────────────
[r] reconfigure → /ops:setup --section homeURL masking: replace all octets except the last with •••, e.g. https://192.168.1.42 → https://•••.•••.•••.42.
Token masking: show last 4 characters only, prefix with ••••••••••••.
If home_automation key is absent from preferences.json, show:
Status: ○ not configured — run /ops:setup --section homeWhen the user selects [r] reconfigure, route to /ops:setup --section home (invoke the 3k-home sub-flow of the setup wizard).
Channel, CLI, and edge-case detail lives in references/ next to this skill. Read those files before acting on a matching channel or sub-command. Do not skip them.
© Lifecycle-Innovations-Limited, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in claude-ops/skills/ops-settings of Lifecycle-Innovations-Limited/claude-ops.
Open the folder on GitHubat commit 1aa0928
Ops Settings next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ops Settings this skillLifecycle-Innovations-Limited/claude-ops | 542 | — | ~5.4k | Automated safety check: Notes | MIT | |
| Firecrawl Build Onboardingfirecrawl/firecrawl | 190k | 1 repos | ~1.4k | Automated safety check: Notes | ISC | |
| Minimax PDFpoco-ai/poco-claw | 1.4k | 6 repos | ~2.1k | Automated safety check: Pass | MIT | |
| Get API Docs with chubandrewyng/context-hub | 14k | 1 repos | ~775 | Automated safety check: Pass | MIT | |
| Stripe Projectsfossasia/eventyay | 1.7k | 5 repos | ~2k | Automated safety check: Notes | Apache-2.0 | |
| Effect Client WrapperUsefulSoftwareCo/executor | 4.1k | 1 repos | ~1.4k | Automated safety check: Pass | MIT |
firecrawl/firecrawl
Gets Firecrawl working in a project: signs you in through the browser, saves FIRECRAWL_API_KEY to .env and picks the first SDK or REST path.
poco-ai/poco-claw
A skill your agent uses when visual quality and design identity matter for a PDF.
andrewyng/context-hub
Fetches current documentation for third-party APIs and SDKs with the chub CLI before the agent writes code against them, instead of relying on remembered API shapes.
fossasia/eventyay
A skill your agent uses when the user wants to provision infrastructure or third-party services using Stripe Projects.
UsefulSoftwareCo/executor
Pattern for wrapping third-party SDK clients (Stripe, Resend, AWS, etc.) with Effect.
fossasia/eventyay
A skill your agent uses when building, modifying, or reviewing a Stripe App — or when the user describes something that implies one (e.g.
Lifecycle-Innovations-Limited/claude-ops
OPS on-demand: This skill should be used when the user asks to "ops dashboard", "pixel HQ", or…
Lifecycle-Innovations-Limited/claude-ops
OPS on-demand: This skill should be used when the user asks to "go to market", "GTM plan", or…
Lifecycle-Innovations-Limited/claude-ops
OPS on-demand: This skill should be used when the user asks to "klaviyo", "ads spend", or…
Lifecycle-Innovations-Limited/claude-ops
OPS on-demand: This skill should be used when the user asks to "tweet", "post to linkedin", or…
Lifecycle-Innovations-Limited/claude-ops
OPS on-demand: This skill should be used when the user asks to "yolo mode", "run the business today"…
Lifecycle-Innovations-Limited/claude-ops
OPS on-demand: This skill should be used when the user asks to "datadog", "APM alerts", or…
Works with
OPS on-demand: This skill should be used when the user asks to "update credentials", "ops settings", or…. Ops Settings is an agent skill from Lifecycle-Innovations-Limited/claude-ops.
Ops Settings fits situations like: asks to update credentials.
Run `npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-settings -a claude-code`. Or copy the skill folder (claude-ops/skills/ops-settings in Lifecycle-Innovations-Limited/claude-ops) into .claude/skills/ops-settings in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-settings -a codex`. Or copy the skill folder (claude-ops/skills/ops-settings in Lifecycle-Innovations-Limited/claude-ops) into .agents/skills/ops-settings in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-settings -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ops-settings, .gemini/skills/ops-settings, .github/skills/ops-settings and .opencode/skills/ops-settings in your project.
Going by SKILL.md and its folder, Ops Settings needs the command-line tools its instructions call (jq, curl, aws, stripe, shopify and python3) and credentials named DOPPLER_TOKEN, GOOGLE_ACCESS_TOKEN and POCKET_API_KEY. Our summary lists: Node.js; A credential in DOPPLER_TOKEN; A credential in GOOGLE_ACCESS_TOKEN. Its frontmatter pre-approves these tools: Bash, Read, Write, Edit, AskUserQuestion.
SKILL.md names 6 domains. In commands or code: api.stripe.com, api.revenuecat.com, slack.com, a.klaviyo.com, api.datadoghq.com and api.newrelic.com; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Ops Settings is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.4k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 155 tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Ops Settings: Firecrawl Build Onboarding (firecrawl/firecrawl, 190k stars), Minimax PDF (poco-ai/poco-claw, 1.4k stars), Get API Docs with chub (andrewyng/context-hub, 14k stars) and Stripe Projects (fossasia/eventyay, 1.7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Lifecycle-Innovations-Limited (a GitHub organization) maintains it in Lifecycle-Innovations-Limited/claude-ops, which has 542 GitHub stars. The repository holds 67 skills in this directory. The repository was last updated on October 9, 2026.
Source: Lifecycle-Innovations-Limited/claude-ops on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.