OPS on-demand: This skill should be used when the user asks to "update credentials", "ops settings", or…

MITAuto-check: notes

Install Ops Settings

skills CLI
$ npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-settings -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Lifecycle-Innovations-Limited/claude-ops ops-settings --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
ops-settings
GitHub stars
542
Token cost
~5.4k tokens
SKILL.md length
1,250 words
Files
2 (incl. references)
Skills in repo
67
Repo updated
First seen
Licence
MIT

At a glance

OPS on-demand: This skill should be used when the user asks to "update credentials", "ops settings", or…

  • Works in 6 steps: Show current value (masked):… → Use AskUserQuestion to confirm the… → For "Enter new value": prompt with… → …
  • Asks to update credentials
  • SKILL.md covers Runtime Context, Parse arguments, Credential Status Dashboard and Probe liveness, plus 7 more sections
  • Calls jq, curl and aws; reaches api.stripe.com and api.revenuecat.com; needs DOPPLER_TOKEN and GOOGLE_ACCESS_TOKEN

What it does

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.

When your agent uses it

  • Asks to update credentials

Example prompts

  • “update credentials”
  • “ops settings”
  • “/ops-settings”

Requirements

  • Node.js
  • A credential in DOPPLER_TOKEN
  • A credential in GOOGLE_ACCESS_TOKEN
  • Pre-approved tools (allowed-tools): Bash, Read, Write, Edit, AskUserQuestion

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Show current value (masked): sk_live_•••••••••••••••• (last 4 chars visible)
  2. Use AskUserQuestion to confirm the update action
  3. For "Enter new value": prompt with AskUserQuestion text input
  4. Write new value to preferences.json via jq update
  5. Run smoke test immediately after update (see Smoke Tests section)
  6. Report: ✅ Stripe key updated — smoke test passed or ⚠️ Key saved but smoke test failed

What it can do on your machine

Read from SKILL.md and the folder at commit 1aa0928. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Bash
    • Read
    • Write
    • Edit
    • AskUserQuestion

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • jq
    • curl
    • aws
    • stripe
    • shopify
    • python3
    • bash
    • gh
    • node
    • npx

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • api.stripe.com
    • api.revenuecat.com
    • slack.com
    • a.klaviyo.com
    • api.datadoghq.com
    • api.newrelic.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • DOPPLER_TOKEN
    • GOOGLE_ACCESS_TOKEN
    • POCKET_API_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~29
When it runs · the whole SKILL.md, loaded when a task matches
~5.4k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~5.6k

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.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Bash, Read, Write, Edit, AskUserQuestion

Automated 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.

SKILL.md

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.

Download SKILL.mdSave it as .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.
name
ops-settings
description
OPS on-demand: This skill should be used when the user asks to "update credentials", "ops settings", or…
allowed-tools
Bash, Read, Write, Edit, AskUserQuestion
argument-hint
[integration-name] [--status]
effort
low
maxTurns
20

Runtime Context

PREFS="${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json"
cat "$PREFS" 2>/dev/null || echo '{}'

OPS ► SETTINGS

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.

Parse arguments

  • --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 only

Credential Status Dashboard

Read 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
──────────────────────────────────────────────────────

Probe liveness

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.

Update an integration

When a specific integration is selected (via argument or user pick from dashboard):

  1. Show current value (masked): sk_live_•••••••••••••••• (last 4 chars visible)
  2. Use AskUserQuestion to confirm the update action:
    [Enter new value]  [Test current value]  [Clear this credential]  [Back to dashboard]
  3. For "Enter new value": prompt with AskUserQuestion text input
  4. Write new value to preferences.json via jq update:
    bash
    tmp=$(mktemp)
    jq --arg v "$NEW_VALUE" --arg k "$KEY_NAME" '.[$k] = $v' "$PREFS" > "$tmp" && mv "$tmp" "$PREFS"
  5. Run smoke test immediately after update (see Smoke Tests section)
  6. Report: ✅ Stripe key updated — smoke test passed or ⚠️ Key saved but smoke test failed: <reason>

Smoke Tests

| 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):

SurfacePrefs keysSmoke test (after . "${CLAUDE_PLUGIN_ROOT}/scripts/lib/organic-metrics-aggregator.sh")
Organic FB/IGmeta.access_token + meta.page_id / meta.instagram_business_idorganic_meta <project> | jq . → object with page_fans / ig_followers
YouTubeyoutube.refresh_token/client_id/client_secretorganic_youtube <project> | jq . → object with views
Search Consolegsc.site_url (+ gcloud ADC or $GOOGLE_ACCESS_TOKEN)organic_searchconsole <project> | jq . → object with clicks
Merchant Centermerchant_center.merchant_id (+ Google auth)merchant_status <project> | jq . → object with approved/disapproved

Autopilot Studio (per-project)

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:

bash
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:

bash
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):

  • Q1 — autonomy & kill switch: [autonomy_level] [envelope.kill_switch] [Back]
  • Q2 — envelope limits: [envelope.max_campaigns] [envelope.max_new_audiences] [envelope.max_daily_budget_usd] [More...]
  • Q3 — envelope allowlists: [envelope.objective_allowlist] [envelope.geo_allowlist] [Back]
  • Q4 — source & creative: [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):

bash
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.:

bash
# 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):

  • Lowering 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.
  • Setting envelope.kill_switch: true hard-stops all mutations on the next pass (stage-only, zero writes) regardless of autonomy_level.
  • The Credential Status Dashboard MUST surface autonomy_level and kill_switch for every project with autopilot.enabled == true.

Pocket

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.

View status

Read all four health files and print a compact status block:

bash
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
done

For 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.

View task counts
bash
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"
Toggle channels

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:

bash
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:

bash
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"
Show full SKILL.md (556 more words)Show less
Configure notifications (per-event)

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.

  1. 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].

  2. 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]
  3. Set the schedule for that event (one AskUserQuestion each, as needed):

    • Severity: [low] [medium] [high] (high bypasses quiet hours).
    • Cooldown: [60s] [5 min] [30 min] [No limit].
    • Quiet hours: [22:00–08:00] [None] [Custom…].
    • Active days: [Every day] [Weekdays] [Custom…].
  4. Write it to preferences.json (create the path if absent):

    bash
    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.)

  5. Test-send the event so the operator confirms routing without waiting for a real trigger:

    bash
    ops-pocket-notify "$EVENT" "test notification from /ops:setup" --severity "$SEVERITY" --dry-run --json

    Show 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].

Force a fresh Pocket pull

Run the watcher directly (picks up POCKET_API_KEY from keychain/env):

bash
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.

Restart notifier
bash
launchctl kickstart -k "gui/$(id -u)/com.claude-ops.pocket-activity-notifier"

Wait 3 seconds then print the updated .activity-notifier-health status.

View last 3 outbound notifications
bash
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)"

Daemon Services

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.

Display the daemon services table
bash
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
fi

Display 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 —.

Toggle a service on or off

Writes to the override file only — never edits daemon-services.default.json.

Confirm each toggle via AskUserQuestion ([Enable] / [Disable] / [Cancel]) before writing.

bash
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.

View last 5 log lines for a service
bash
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)"
Manually trigger a service
  • launchd-registered (plist-backed, e.g. whatsapp-bridge):
    bash
    launchctl kickstart -k "gui/$UID/com.<user>.${SERVICE_NAME}"
  • Cron-style / script-based (have a command pointing to a .sh file):
    bash
    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.

Home Automation (Homey Pro)

Route here when the user runs /ops:settings home or selects "Home Automation" from the dashboard.

View status
bash
PREFS="${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json"
jq '.home_automation // empty' "$PREFS" 2>/dev/null

Display 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 home

URL 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 home
Reconfigure

When the user selects [r] reconfigure, route to /ops:setup --section home (invoke the 3k-home sub-flow of the setup wizard).


Additional resources

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

Files

SKILL.md and 1 other file (references) in claude-ops/skills/ops-settings of Lifecycle-Innovations-Limited/claude-ops.

  • SKILL.md
  • references/details.md

Open the folder on GitHubat commit 1aa0928

Compare with similar skills

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.

Ops Settings compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Ops Settings this skillLifecycle-Innovations-Limited/claude-ops542—~5.4kAutomated safety check: NotesMIT
Firecrawl Build Onboardingfirecrawl/firecrawl190k1 repos~1.4kAutomated safety check: NotesISC
Minimax PDFpoco-ai/poco-claw1.4k6 repos~2.1kAutomated safety check: PassMIT
Get API Docs with chubandrewyng/context-hub14k1 repos~775Automated safety check: PassMIT
Stripe Projectsfossasia/eventyay1.7k5 repos~2kAutomated safety check: NotesApache-2.0
Effect Client WrapperUsefulSoftwareCo/executor4.1k1 repos~1.4kAutomated safety check: PassMIT

Similar skills

  • 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.

    190k GitHub starsUsed in 1 repo~1.4k tokens
    Backend & APIsAuto-check: notes
  • Minimax PDF

    poco-ai/poco-claw

    A skill your agent uses when visual quality and design identity matter for a PDF.

    1.4k GitHub starsUsed in 6 repos~2.1k tokens
    Documents & OfficeAuto-check passed
  • Get API Docs with chub

    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.

    14k GitHub starsUsed in 1 repo~775 tokens
    DevelopmentAuto-check passed
  • Stripe Projects

    fossasia/eventyay

    A skill your agent uses when the user wants to provision infrastructure or third-party services using Stripe Projects.

    1.7k GitHub starsUsed in 5 repos~2k tokens
    Backend & APIsAuto-check: notes
  • Effect Client Wrapper

    UsefulSoftwareCo/executor

    Pattern for wrapping third-party SDK clients (Stripe, Resend, AWS, etc.) with Effect.

    4.1k GitHub starsUsed in 1 repo~1.4k tokens
    DevelopmentAuto-check passed
  • Stripe Apps

    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.

    1.7k GitHub starsUsed in 1 repo~3.6k tokens
    Backend & APIsAuto-check passed

More from Lifecycle-Innovations-Limited/claude-ops

All 67 skills in this repo
  • Ops Dash

    Lifecycle-Innovations-Limited/claude-ops

    OPS on-demand: This skill should be used when the user asks to "ops dashboard", "pixel HQ", or…

    542 GitHub stars~4.7k tokensUpdated today
    Auto-check: notes
  • Ops Gtm

    Lifecycle-Innovations-Limited/claude-ops

    OPS on-demand: This skill should be used when the user asks to "go to market", "GTM plan", or…

    542 GitHub stars~3.7k tokensUpdated today
    Auto-check: notes
  • Ops Marketing

    Lifecycle-Innovations-Limited/claude-ops

    OPS on-demand: This skill should be used when the user asks to "klaviyo", "ads spend", or…

    542 GitHub stars~3.5k tokensUpdated today
    Auto-check: notes
  • Ops Socials

    Lifecycle-Innovations-Limited/claude-ops

    OPS on-demand: This skill should be used when the user asks to "tweet", "post to linkedin", or…

    542 GitHub stars~3.6k tokensUpdated today
    Auto-check: notes
  • Ops Yolo

    Lifecycle-Innovations-Limited/claude-ops

    OPS on-demand: This skill should be used when the user asks to "yolo mode", "run the business today"…

    542 GitHub stars~4k tokensUpdated today
    Auto-check: notes
  • Ops Monitor

    Lifecycle-Innovations-Limited/claude-ops

    OPS on-demand: This skill should be used when the user asks to "datadog", "APM alerts", or…

    542 GitHub starsUsed in 1 repo~1.5k tokens
    Auto-check: notes

Works with

Questions about Ops Settings

What does Ops Settings do?

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.

When should I use Ops Settings?

Ops Settings fits situations like: asks to update credentials.

How do I install Ops Settings in Claude Code?

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.

How do I install Ops Settings in Codex?

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.

Can I use Ops Settings in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Ops Settings need to run?

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.

Does Ops Settings access the network?

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.

Is Ops Settings safe to install?

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.

What licence does Ops Settings use?

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.

How many tokens does Ops Settings use?

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.

What are the alternatives to Ops Settings?

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.

Who maintains Ops Settings?

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.