Skip to content

Navigation Menu

Sign in
Sign up

Privacy and Security

auroracapital edited this page Apr 18, 2026 · 4 revisions

Privacy and Security

Exactly what claude-ops touches on your machine — and everything it doesn't.

Transparency No telemetry License: MIT Audit ready Local only

Important

This page is exhaustive as of v1.7.0 (30 skills / 14 agents). If something the plugin does isn't listed here, it doesn't do it. The source is MIT-licensed and publicly auditable at Lifecycle-Innovations-Limited/claude-ops.

v1.0+ additions this page covers: monitor-agent (Haiku 4.5) polls your configured Datadog / New Relic / OpenTelemetry endpoints read-only for /ops:monitor · /ops:integrate registers new SaaS APIs to your local partners.json only · /ops:settings updates credentials locally in your plugin data dir. No new outbound destinations beyond what you explicitly configured. v1.7.0 adds: /ops:gtm go-to-market planner, marketing-optimizer agent, MCP auto-reconnect (PreToolUse hook), wacli --follow fix.


TL;DR

Property Status
Phones home / sends telemetry Never
Uploads credentials anywhere Never
Reads files outside registry + plugin data dir Never (except during one-time /ops:setup auto-scan)
Sends messages without user action Never
Accesses camera, mic, clipboard Never
Scans ~/.ssh/ Never
Destroys data without per-action confirmation Never — Rule 5
Source code auditable Yes — MIT, public repo
Uninstall cleans up everything Yes — /ops:uninstall

What this plugin accesses

Credential auto-scan sources (only during /ops:setup)

When you run /ops:setup, the wizard probes these sources to find credentials you already have — so you don't have to paste anything already on disk. This runs only during setup; never in the background, never during normal skill execution.

flowchart LR
 Start["/ops:setup"] --> Scan[Universal auto-scan]
 Scan --> E1[Env variables<br/>printenv]
 Scan --> E2[Shell profiles<br/>~/.zshrc, ~/.bashrc,<br/>~/.zprofile, ~/.envrc]
 Scan --> E3[Doppler<br/>doppler secrets get]
 Scan --> E4[1Password<br/>op]
 Scan --> E5[Dashlane<br/>dcli]
 Scan --> E6[Bitwarden<br/>bw]
 Scan --> E7[macOS Keychain<br/>security find-generic-password]
 Scan --> E8[~/.claude.json<br/>mcpServers, read-only]
 Scan --> E9[Chrome history<br/>URLs only, never content]
 Scan --> E10[Persistent browser profile<br/>opt-in, only for Slack fallback]
 E1 & E2 & E3 & E4 & E5 & E6 & E7 & E8 & E9 & E10 --> Result[Scan result]
 Result --> Show[Show to user]
 Show --> Decide[User decides: use / paste / skip]
 classDef scan fill:#6366f1,color:#fff,stroke:#4338ca
 classDef source fill:#22c55e,color:#fff,stroke:#15803d
 classDef user fill:#f59e0b,color:#fff,stroke:#b45309
 class Scan,Result scan
 class E1,E2,E3,E4,E5,E6,E7,E8,E9,E10 source
 class Start,Show,Decide user
Loading

Detailed source table

# Source Command Scope Purpose
1 Env variables printenv <VAR> Current shell Already-exported secrets
2 Shell profiles grep on ~/.zshrc, ~/.bashrc, ~/.zprofile, ~/.envrc, ~/.config/fish/config.fish Regex for VAR= or export VAR= Persistent exports + direnv
3 Doppler doppler secrets get <VAR> --plain across all projects/configs Only if command -v doppler succeeds Central secrets vault
4 1Password op item get ... Only if op installed Password manager
5 Dashlane dcli password <service> Only if dcli installed Password manager
6 Bitwarden bw get item <service> Only if bw installed Password manager
7 macOS Keychain security find-generic-password -s <service> -w macOS only, per service name System vault
8 Claude Code settings Read ~/.claude.json mcpServers Read-only, never written Reuse existing MCP tokens
9 Chrome history sqlite3 "~/Library/Application Support/Google/Chrome/Default/History" "SELECT url FROM urls WHERE url LIKE '%admin%'" URL list only — never page content Identify service domains (e.g., yourstore.myshopify.com)
10 Browser profile Playwright with persistent profile at ~/.claude-ops/slack-profile Opt-in only — user must choose Playwright fallback for Slack Extract xoxc-... token for Slack local-token path

Note

Chrome history reads URLs only. The plugin never reads page contents, cookies, passwords, or autofill data. The URL list helps identify which services you use (e.g., "you visited store.myshopify.com/admin so you probably have a Shopify store"). The Slack Playwright fallback is the only browser-data path, and it runs only if you explicitly select it.

Every discovered credential is confirmed before use

Per Rule 3, the wizard never silently uses a discovered credential. You always see:

Found credential for SHOPIFY_ADMIN_TOKEN:
 [A] shell env + ~/.zshrc + Dashlane — shpat_508b...682e (matched 3 sources)
 [B] Doppler (project: mystore, config: prd) — shpat_9f2c...a17b (different!)
 [C] Paste a different one
 [D] Skip

What it does NOT access

Important

This list is as important as the access list. These are deliberate non-behaviors, verified in code review.

Category Status
Cloud uploads Nothing is uploaded. Every scan is a local file read.
Telemetry No analytics. No usage metrics. No crash reports. No pings.
Clipboard Never read. Never written.
Camera / microphone Never accessed. /ops:voice uses API-key services with audio data you provide explicitly.
Disk-wide scans Every scan is a targeted path: shell profiles, specific CLI outputs, registry projects, plugin data dir. No find / -name ....
SSH keys ~/.ssh/ is never read. Ever.
System keychains (other services) Only probed with an explicit service-name whitelist (slack-xoxc, doppler-token, etc.) — never a blanket dump.
Browser data Except the URL-only Chrome history query and the opt-in Slack Playwright path — nothing. No cookies, no passwords, no autofill, no bookmarks, no downloads.
Other users on the machine Nothing in /Users/<other>/ is touched.
Message content exfiltration wacli/gog message content stays on your machine. Claude API calls happen for skill execution, same as any Claude Code session — no separate uploads by this plugin.

What the background daemons do — exhaustive list

Note

The daemon runs seven services. Each one has a precise set of inputs and outputs documented here. See Daemon Guide for the scheduling mechanics.

briefing-pre-warm · every 2 min

  • Reads: scripts/registry.json, last gather output
  • Calls: aws, gh, wacli (local SQLite), gog (local cache), Shopify/Klaviyo/Meta Ads/GA4/Search Console APIs only if configured by the user. /ops:monitor additionally reaches Datadog / New Relic / OpenTelemetry endpoints only on-demand (never from the daemon).
  • Writes: ~/.claude/plugins/data/ops-ops-marketplace/daemon-cache.json
  • Outbound network: only to the user's own configured APIs. Nothing to claude-ops infrastructure (there is none).

wacli-sync · continuous

  • Reads: wacli local SQLite DB
  • Calls: WhatsApp's servers via the WhatsApp Web protocol (same servers as your existing wacli install; claude-ops adds no new endpoints)
  • Writes: ~/.wacli/.health, wacli's local SQLite

memory-extractor · every 30 min

  • Reads: wacli local SQLite, gog local cache
  • Calls: Claude Haiku 4.5 (Anthropic API) to summarize — same API any Claude Code session uses
  • Writes: ~/.claude/plugins/data/ops-ops-marketplace/memories/*.md (mode 600)
  • Note: Message content is processed transiently by the Haiku prompt. The plugin does not send any additional telemetry to Anthropic beyond the API call itself.

inbox-digest · every 4 hours

  • Reads: wacli SQLite, gog cache, Slack MCP (if configured), Telegram MCP (if configured)
  • Writes: inbox digest log in plugin data dir
  • Network: only to user-configured MCP endpoints

store-health · daily at 09:00

  • Reads: registry
  • Calls: Shopify Admin API only — no other platforms
  • Writes: store-health report in plugin data dir

competitor-intel · weekly Mon 10:00

  • Reads: user-specified competitor domains in preferences.json
  • Calls: public websites (scraping) + Telegram bot for notifications (if configured)
  • Writes: weekly brief in plugin data dir

message-listener · continuous

  • Reads: wacli + Telegram local state
  • Writes: local event log the daemon picks up
  • Never sends messages outbound on its own. Skills in an interactive Claude Code session are the only thing that can send.

Security best practices the plugin uses

Practice How
File permissions umask 077 when writing preferences.json and memories/*.md (mode 600, user-only)
Credentials in Claude Code config Stored via userConfig in ~/.claude.json (Claude Code's encrypted store), never in plaintext files the plugin controls
Gitignore everywhere registry.json, preferences.json, .planning/, .claude/worktrees/, .env*, *.log — all ignored
Secret-commit prevention tests/test-no-secrets.sh grep-checks for common leak patterns pre-commit
Rule 0 enforcement Every skill is scrubbed of real names/emails/store URLs — public-repo hygiene pass documented in Changelog
Rule 3 confirmation Every discovered credential shown to user before use
Rule 5 destructive block No rm -rf, no git push --force, no aws delete-* without per-action confirmation
No destructive AWS ops delete-*, stop-*, terminate-* blocked at the skill level
Append-only shell profiles .zshrc / .bashrc are never rewritten — only appended to
Reference-token support doppler:KEY_NAME resolution means secrets never leave the vault
PreToolUse fails closed Health degradation causes warnings, not silent stale-auth retries

Credential resolution chain

When a skill needs a secret at runtime, it walks this chain — stopping at the first source that returns a value:

flowchart LR
 Skill[Skill needs<br/>API_KEY] --> S1{Doppler<br/>reference?}
 S1 -->|Yes| D[doppler secrets get]
 S1 -->|No| S2{Password<br/>manager?}
 S2 -->|Yes| PM[op/dcli/bw/keychain]
 S2 -->|No| S3{Keychain<br/>direct?}
 S3 -->|Yes| K[security find-generic-password]
 S3 -->|No| S4{Env var?}
 S4 -->|Yes| E[printenv]
 S4 -->|No| UC[userConfig<br/>~/.claude.json]
 D --> Use[Use value]
 PM --> Use
 K --> Use
 E --> Use
 UC --> Use
 classDef vault fill:#22c55e,color:#fff,stroke:#15803d
 classDef fallback fill:#f59e0b,color:#fff,stroke:#b45309
 class D,PM,K vault
 class E,UC fallback
Loading

Tip

The vault-first ordering means if you use Doppler or a password manager, your secrets live there and the plugin just references them. With doppler:KEY_NAME tokens, the literal secret value never touches the plugin's config files.


Minimizing user burden

  • Auto-scan first, ask second. If your key is in Doppler, you never paste it.
  • Reference tokens. doppler:KEY_NAME keeps secrets in the vault even in preferences.json.
  • Fail-closed health checks. PreToolUse hooks warn instead of silently retrying with stale auth — you always know when the plugin is operating in degraded state.

Your rights

Important

You have full control. The plugin is MIT-licensed source code running on your machine. You own the data it creates.

Right How
Full uninstall /ops:uninstall removes credentials, cached files, memories, registry, plist, shell env
Inspect every memory Plain markdown at ~/.claude/plugins/data/ops-ops-marketplace/memories/ — read/edit/delete
Inspect every cache Plain JSON at ~/.claude/plugins/data/ops-ops-marketplace/daemon-cache.json
Inspect every log Plain text at ~/.claude/plugins/data/ops-ops-marketplace/logs/
Edit the source Fork the repo, modify, re-install from local checkout (claude --plugin-dir)
Audit the source Lifecycle-Innovations-Limited/claude-ops — MIT
Report issues GitHub Issues

Clean uninstall checklist

/ops:uninstall

Removes:

  • ~/Library/LaunchAgents/com.claude-ops.daemon.plist (macOS)
  • ~/.claude/plugins/data/ops-ops-marketplace/ (preferences, memories, cache, logs)
  • ~/.claude-ops/ (Playwright profile if used)
  • ~/.wacli/.health (if you want — the uninstall asks)
  • The CLAUDE_PLUGIN_ROOT export line in .zshrc / .bashrc
  • The plugin entry in Claude Code's marketplace

Keeps (by default — you decide per-item):

  • Your wacli install + session (that's a separate tool)
  • Your gog install + session (that's a separate tool)
  • Your Doppler / 1Password / Bitwarden installs
  • Your ~/.claude.json Claude Code settings (the plugin never owned them)

Threat model

What the plugin protects against (and what it doesn't)

Protected against

  • Accidental credential commitstest-no-secrets.sh + gitignored prefs + registry
  • Silent stale-auth errors — PreToolUse fails closed with visible warnings
  • Unauthorized destructive ops — Rule 5 per-action confirmation
  • Public S3 bucket driftinfra-monitor flags them as high-priority fires
  • Privilege escalation from example code — all examples use example.com / $ENV_VAR / your-org

Not in scope

  • Compromised Anthropic API — if Anthropic is breached, Claude API calls are at risk. Use Anthropic's enterprise controls.
  • Compromised machine — if your machine is rooted, nothing the plugin does protects the files. Use full-disk encryption.
  • Supply-chain attack on npm deps — the plugin pins dependencies in package.json. Review before npm install.
  • Malicious MCP server — if you install a third-party MCP server that misbehaves, that's a Claude Code concern, not claude-ops.

See also

Clone this wiki locally

AltStyle によって変換されたページ (->オリジナル) /