{"_id":"829cli","_rev":"5-1ee86fd3b5be48e8000e89643657868d","name":"829cli","dist-tags":{"latest":"1.4.0"},"versions":{"1.0.0":{"name":"829cli","version":"1.0.0","keywords":["wpengine","wordpress","wp-cli","plugins"],"license":"MIT","_id":"829cli@1.0.0","maintainers":[{"name":"caleb829","email":"caleb@829llc.com"}],"os":["darwin","linux"],"bin":{"829":"bin/829cli.js"},"dist":{"shasum":"4957f1692a54bf7708dcf5701dee5a3895dd5ceb","tarball":"https://registry.npmjs.org/829cli/-/829cli-1.0.0.tgz","fileCount":5,"integrity":"sha512-A+LV8y65W9yWe73E4JJeJ0xDaSDCVLqGnsKDKNHDT4KM5Q2V2LP5REpxyB7LN+uesh6tC3nzjPu8cY+XeR1A8A==","signatures":[{"sig":"MEUCIB78Nl/OnZ6yYLUgelEWPv7Jz0ziIexfZSiDH9xCc9+yAiEA5sTzBEprwI7ybB2WrBjcnaprkyai20ghXBL5WvEuSbg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51393},"main":"./dist/cli.js","engines":{"node":">=18"},"gitHead":"3d85e5dc064f1f88646b51c77b6411d1aedc3139","scripts":{"dev":"tsx src/cli.ts","build":"tsup src/cli.ts --format cjs --out-dir dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"caleb829","email":"caleb@829llc.com"},"_npmVersion":"11.6.1","description":"829 Studios CLI tools — plugin management, SSH, and more","directories":{},"_nodeVersion":"20.19.1","dependencies":{"ssh2":"^1.15.0","axios":"^1.6.0","chalk":"^5.3.0","commander":"^12.0.0","cli-progress":"^3.12.0","@inquirer/search":"^3.0.0","@inquirer/prompts":"^7.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/ssh2":"^1.11.0","@types/cli-progress":"^3.11.0"},"_npmOperationalInternal":{"tmp":"tmp/829cli_1.0.0_1775239117498_0.1527372248703014","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"829cli","version":"1.1.1","keywords":["wpengine","wordpress","wp-cli","plugins"],"license":"MIT","_id":"829cli@1.1.1","maintainers":[{"name":"caleb829","email":"caleb@829llc.com"}],"os":["darwin","linux"],"bin":{"829":"bin/829cli.js"},"dist":{"shasum":"b08557a246bd87a43e8b10ba158b096ea55da0fd","tarball":"https://registry.npmjs.org/829cli/-/829cli-1.1.1.tgz","fileCount":5,"integrity":"sha512-5Fk8Ep9b83ceKnPc38N4kOIogJR8WYLqrsTIjIrDQVuJUNz0IM4tRRe4+UBX/kw1UkH0x6e3upAvgovFGioo9g==","signatures":[{"sig":"MEQCID3/rnkSM+uqI0Q2GpfKu5rquqortabSFjSbDcd3ieG1AiBeZOC+3de/j9Gl6FLyZR+WZLnOjmn23one/33ivUgF5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64292},"main":"./dist/cli.js","engines":{"node":">=18"},"gitHead":"7df73bccfdd57e072a6cb5098b7eb595e2e1bf73","scripts":{"dev":"tsx src/cli.ts","build":"tsup src/cli.ts --format cjs --out-dir dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"caleb829","email":"caleb@829llc.com"},"_npmVersion":"11.6.1","description":"829 Studios CLI tools — plugin management, SSH, and more","directories":{},"_nodeVersion":"20.19.1","dependencies":{"ssh2":"^1.15.0","axios":"^1.6.0","chalk":"^5.3.0","commander":"^12.0.0","cli-progress":"^3.12.0","@inquirer/search":"^3.0.0","@inquirer/prompts":"^7.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/ssh2":"^1.11.0","@types/cli-progress":"^3.11.0"},"_npmOperationalInternal":{"tmp":"tmp/829cli_1.1.1_1778703971040_0.1528102597033365","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"829cli","version":"1.3.0","keywords":["wpengine","wordpress","wp-cli","plugins"],"license":"MIT","_id":"829cli@1.3.0","maintainers":[{"name":"caleb829","email":"caleb@829llc.com"}],"os":["darwin","linux"],"bin":{"829":"bin/829cli.js"},"dist":{"shasum":"191140726af7aa54037280c81bee570c3fdd1e35","tarball":"https://registry.npmjs.org/829cli/-/829cli-1.3.0.tgz","fileCount":5,"integrity":"sha512-BWNXX2mpRGK9yIlSRcWDx0CWZZh12AanqMpfLjbw9mPhbezkD6ki82J7uWxRTcRnI6L6XCSlbl5Tb7hvzryShg==","signatures":[{"sig":"MEQCIBUZaIANzcV3P3ss4DMgWUlRnqOUBB562UToOjiADp1dAiBvePykV02AYfJ3CVU0CAp1P+9qOHD+EwngkzWB9e8JTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89313},"main":"./dist/cli.js","engines":{"node":">=18"},"gitHead":"fd206a46693adc984bf661bec2133eea7cd03cfa","scripts":{"dev":"tsx src/cli.ts","build":"tsup src/cli.ts --format cjs --out-dir dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"caleb829","email":"caleb@829llc.com"},"_npmVersion":"11.6.1","description":"829 Studios CLI tools — plugin management, SSH, and more","directories":{},"_nodeVersion":"20.19.1","dependencies":{"ssh2":"^1.15.0","axios":"^1.6.0","chalk":"^5.3.0","commander":"^12.0.0","cli-progress":"^3.12.0","@inquirer/search":"^3.0.0","@inquirer/prompts":"^7.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/ssh2":"^1.11.0","@types/cli-progress":"^3.11.0"},"_npmOperationalInternal":{"tmp":"tmp/829cli_1.3.0_1782251198646_0.02664024535291465","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"829cli","version":"1.4.0","keywords":["wpengine","wordpress","wp-cli","plugins"],"license":"MIT","_id":"829cli@1.4.0","maintainers":[{"name":"caleb829","email":"caleb@829llc.com"}],"os":["darwin","linux"],"bin":{"829":"bin/829cli.js"},"dist":{"shasum":"47e5f53d1e722956dbc8d502e2c296065c19442a","tarball":"https://registry.npmjs.org/829cli/-/829cli-1.4.0.tgz","fileCount":5,"integrity":"sha512-56sZCbXYj6d6QAKj1b15YtDxtKnUISQkFdWx0feah/u0LgAgFTTYrGjESEIy8UFzQggeoAVlE9mh1MEcHL6wRw==","signatures":[{"sig":"MEQCIAdHCsyTVRFhNoEGV5VKaY2VVRRnH74X/Y0XCdHl02sNAiBqqyTlJ1080R4oz6BP8L7+3zzs04QqHXk5Ea9NT6dkjw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136985},"main":"./dist/cli.js","engines":{"node":">=18"},"gitHead":"a64aa7adf946f1709e2ca4cd5c103b8c9bb2d79c","scripts":{"dev":"tsx src/cli.ts","build":"tsup src/cli.ts --format cjs --out-dir dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"caleb829","email":"caleb@829llc.com"},"_npmVersion":"11.6.1","description":"829 Studios CLI tools — plugin management, SSH, and more","directories":{},"_nodeVersion":"20.19.1","dependencies":{"ssh2":"^1.15.0","axios":"^1.6.0","chalk":"^4.1.2","xml2js":"^0.6.0","cheerio":"^1.2.0","p-limit":"^3.1.0","commander":"^12.0.0","puppeteer":"^24.0.0","cli-progress":"^3.12.0","@inquirer/search":"^3.0.0","@inquirer/prompts":"^7.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/ssh2":"^1.11.0","@types/xml2js":"^0.4.0","@types/cli-progress":"^3.11.0"},"_npmOperationalInternal":{"tmp":"tmp/829cli_1.4.0_1782406348394_0.3121863156464686","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-04-03T17:58:37.380Z","modified":"2026-06-25T18:31:39.393Z","1.0.0":"2026-04-03T17:58:37.678Z","1.1.1":"2026-05-13T20:26:11.204Z","1.3.0":"2026-06-23T21:46:38.809Z","1.4.0":"2026-06-25T16:52:28.540Z"},"license":"MIT","keywords":["wpengine","wordpress","wp-cli","plugins"],"description":"829 Studios CLI tools — plugin management, SSH, and more","maintainers":[{"email":"caleb@829llc.com","name":"caleb829"},{"email":"devon.riley@829llc.com","name":"devontriley829"}],"readme":"# 829\n\nCommand-line tools for managing WP Engine installs at scale — plugin management, SSH connections, portal access, user management, and more.\n\n---\n\n## Requirements\n\n- **Node.js** >= 18 ([nodejs.org](https://nodejs.org))\n- **WP Engine API credentials** — username and token from the [WP Engine User Portal](https://my.wpengine.com/api_access)\n- **SSH keys configured** for WP Engine ([docs](https://wpengine.com/support/ssh-gateway/))\n- **fzf** (optional, required for Tab autocomplete) — `brew install fzf`\n\n---\n\n## Installation\n\n```bash\nnpm install -g 829cli\n```\n\n---\n\n## First-time Setup\n\n### 1. Configure your API credentials\n\n```bash\n829 config\n```\n\nYou will be prompted for:\n- WP Engine API username\n- WP Engine API token\n- Default batch size (recommended: 20)\n- Default parallel jobs (recommended: 20)\n\nSettings are saved to `~/.829.json`.\n\n### 2. Sync your install list\n\n```bash\n829 installs sync\n```\n\nThis fetches all WP Engine installs from the API and caches them to `~/.829/installs.json`. Re-run any time your install list changes.\n\n### 3. Enable Tab autocomplete (zsh)\n\nAdd the following to your `~/.zshrc`:\n\n```zsh\neval \"$(829 completion zsh)\"\n```\n\nThen reload your shell:\n\n```zsh\nsource ~/.zshrc\n```\n\n> Requires `fzf`. Install with `brew install fzf`.\n>\n> For bash, use `eval \"$(829 completion bash)\"` in your `~/.bashrc`.\n\n---\n\n## Commands\n\n```\n829 config                      Configure API credentials and defaults\n829 installs sync               Fetch installs from the WP Engine API\n829 installs list               Browse cached installs\n\n829 ssh [install-id]            SSH into a WP Engine install\n829 portal [install-id]         Open install in the WP Engine portal\n\n829 portal user list            List all portal users across accounts (CSV)\n829 portal user add             Add a user to an account\n829 portal user delete          Remove a user from an account\n829 portal user promote         Change a user's role in an account\n\n829 plugin scan                 Scan plugin status across installs\n829 plugin activate             Activate a plugin across installs\n829 plugin deactivate           Deactivate a plugin across installs\n829 plugin update               Update a plugin across installs\n829 plugin delete               Delete a plugin across installs\n\n829 run                         Run a shell command across installs via SSH\n\n829 wpt provision               Install/update wordpress-tools and provision API keys\n829 wpt settings                Update wordpress-tools settings across installs\n829 wpt repair                  Fix misnamed wordpress-tools-main plugin folder\n\n829 cookies <sitemap-url>       Audit cookies/localStorage/sessionStorage across a site\n829 crawl <url>                 Crawl a site and export a CSV inventory of pages\n\n829 help                        Show all commands\n829 help <command>              Show detailed help for a command\n829 completion zsh              Print zsh completion script\n829 completion bash             Print bash completion script\n```\n\nRun `829 help` at any time for the full reference, or `829 help <command>` for detail on a specific command (e.g. `829 help plugin`, `829 help wpt`).\n\n---\n\n## SSH & Portal Autocomplete\n\nAfter enabling Tab completion, typing `829 ssh ` or `829 portal ` and pressing `Tab` opens an fzf picker:\n\n```\nINSTALL ID                DOMAIN                                                ENVIRONMENT\nabsoluteenerg1            absoluteenergy.com                                    🌐 production\nabsoluteenerstg           absoluteenergy.829stage.com                           📝 staging\nabsoluteenerdev           absoluteenergy.829dev.com                             ⚙️ development\n```\n\nArrow up/down to navigate, type to filter, Enter to connect or open.\n\n---\n\n## Plugin Scan\n\n`829 plugin scan` supports three slug modes:\n\n| Mode | Example | Behavior |\n|------|---------|----------|\n| Exact | `--plugin wordfence` | Single report, post-scan action prompt |\n| Multi-slug | `--plugin wordfence,woocommerce` | One report per plugin + combined comparison report |\n| Wildcard | `--plugin \"wordpress-tools*\"` | Matches any installed plugin name starting with that prefix |\n\nAfter an exact-slug scan you can immediately activate, deactivate, update, or delete the plugin on the matching installs.\n\n---\n\n## Run\n\n`829 run` executes an arbitrary shell command across any set of installs via SSH. The command is base64-encoded before sending so quotes and special characters are preserved.\n\n```bash\n829 run --cmd \"wp plugin install https://github.com/org/repo/releases/download/1.8.0/plugin-1.8.0.zip --force\"\n```\n\nOutput is saved to a CSV with columns: `name, primary_domain, exit_code, output`.\n\n---\n\n## Portal User Management\n\n`829 portal user list` iterates all WP Engine accounts and exports a CSV of every user:\n\n```\naccount_name, account_id, first_name, last_name, email, role, installs\n```\n\n`installs` is `all` for full-access roles, or a semicolon-separated list of install names for partial access.\n\n---\n\n## wordpress-tools\n\n### `829 wpt provision`\n\nInstalls or force-updates the wordpress-tools plugin from GitHub, activates it, generates a 32-character API key, and sets it — across any number of installs in one run.\n\n### `829 wpt settings`\n\nEnables or disables `restrict_plugin_management` across targeted installs.\n\n### `829 wpt repair`\n\nFixes installs where the plugin was installed from a GitHub ZIP archive, leaving the folder named `wordpress-tools-main` instead of `wordpress-tools`. Renames the folder and activates the plugin. If both folders exist, removes the stale one.\n\n---\n\n## Cookie Scraper\n\nAudits every cookie, localStorage entry, and sessionStorage entry set on a site's pages. Identifies the vendor behind each item (Google Analytics, HubSpot, Meta, etc.) and exports two CSV reports.\n\n**Scan via sitemap:**\n```bash\n829 cookies https://example.com/sitemap.xml\n```\n\n**Scan a single page:**\n```bash\n829 cookies https://example.com/about\n```\n\n**Scan a specific list of pages via JSON file:**\n```bash\n829 cookies --urls ./pages.json\n```\n\nThe JSON file should be a plain array of URLs:\n```json\n[\n  \"https://example.com/about\",\n  \"https://example.com/contact\",\n  \"https://example.com/services\"\n]\n```\n\n**Options:**\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `-u, --user <username>` | Basic auth username | — |\n| `-p, --pass <password>` | Basic auth password | — |\n| `-c, --concurrency <n>` | Pages to scrape in parallel | `3` |\n| `-o, --output <dir>` | Output directory for CSV files | `~/829-tools/reports/` |\n| `--max-pages <n>` | Cap number of pages (useful for testing) | — |\n| `--urls <file>` | JSON file containing an array of URLs to scan | — |\n| `--by-page` | Also generate the per-page detail report | — |\n| `--debug` | Print per-page cookie capture diagnostics | — |\n\n**Output files** (written to `~/829-tools/reports/` by default):\n\n- `cookie-summary-<timestamp>.csv` — one row per unique cookie/storage key, with vendor, domain, attributes, page count, and sample values\n- `cookie-by-page-<timestamp>.csv` — generated only when `--by-page` is passed; one row per item per page\n\n---\n\n## Site Crawler\n\nCrawls a site and exports a CSV inventory of every page with SEO-relevant data (status, title, meta, H1s, word count, links, etc.).\n\n**Crawl via sitemap:**\n```bash\n829 crawl https://example.com/sitemap.xml\n```\n\n**Crawl by following links from a start URL:**\n```bash\n829 crawl https://example.com --max-depth 3 --max-pages 200\n```\n\n**Render JS before parsing** (for SPAs / client-rendered sites):\n```bash\n829 crawl https://app.example.com --render\n```\n\n**Options:**\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `-u, --user <username>` | Basic auth username | — |\n| `-p, --pass <password>` | Basic auth password | — |\n| `-c, --concurrency <n>` | Pages to fetch in parallel | `5` (`3` with `--render`) |\n| `-o, --output <dir>` | Output directory for CSV files | `~/829-tools/reports/` |\n| `--max-pages <n>` | Cap the number of pages crawled | — |\n| `--max-depth <n>` | Max link depth from start URL (crawl mode only) | `5` |\n| `--urls <file>` | JSON file containing an array of URLs | — |\n| `--render` | Use Puppeteer to render JS before parsing | — |\n| `--ignore-robots` | Ignore robots.txt disallow rules | — |\n| `--debug` | Print per-page diagnostics | — |\n\n**Output:** `crawl-<timestamp>.csv` — one row per page with: `url`, `status_code`, `title`, `meta_description`, `h1`, `canonical`, `word_count`, `internal_links_count`, `external_links_count`, `images_missing_alt`, and more.\n\n---\n\n## Output Files\n\nReports and logs are written to `~/829-tools/`:\n\n```\n~/829-tools/reports/    CSV reports from scans, actions, provisioning, cookie audits, and crawls\n~/829-tools/logs/       Detailed logs of SSH session output\n```\n\n---\n\n## Updating\n\n```bash\nnpm update -g 829cli\n829 installs sync\n```\n","readmeFilename":"README.md"}