{"slug":"ops-deploy","title":"ops-deploy","summary":"Deploy status across all projects. Shows ECS service versions, Vercel deployments, recent deploys, pending deploys, and CI/CD pipeline state.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-14T20:43:19.134974Z","repo":{"url":"https://github.com/davepoon/buildwithclaude","stars":3556,"forks":535,"license":"MIT","updatedAt":"2026-09-27T03:56:38Z"},"bodyHtml":"<hr>\n<p>name: ops-deploy\ndescription: Deploy status across all projects. Shows ECS service versions, Vercel deployments, recent deploys, pending deploys, and CI/CD pipeline state.\nargument-hint: \"[project-alias|ecs|vercel|all]\"\nallowed-tools:</p>\n<ul>\n<li>Bash</li>\n<li>Read</li>\n<li>Grep</li>\n<li>Glob</li>\n<li>Skill</li>\n<li>Agent</li>\n<li>TeamCreate</li>\n<li>SendMessage</li>\n<li>AskUserQuestion</li>\n<li>TaskCreate</li>\n<li>TaskUpdate</li>\n<li>Monitor</li>\n<li>WebFetch</li>\n<li>mcp__claude_ai_Vercel__list_deployments</li>\n<li>mcp__claude_ai_Vercel__list_projects</li>\n<li>mcp__claude_ai_Vercel__get_deployment</li>\n<li>mcp__claude_ai_Vercel__get_runtime_logs</li>\n<li>mcp__claude_ai_Vercel__get_deployment_build_logs\neffort: low\nmaxTurns: 20\ndisallowedTools:</li>\n<li>Edit</li>\n<li>Write</li>\n<li>NotebookEdit</li>\n</ul>\n<hr>\n<h1>OPS ► DEPLOY STATUS</h1>\n<h2>Runtime Context</h2>\n<p>Before executing, load available context:</p>\n<ol>\n<li><p><strong>Preferences</strong>: Read <code>${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json</code></p>\n<ul>\n<li><code>timezone</code> — display all deploy timestamps in the correct timezone</li>\n</ul>\n</li>\n<li><p><strong>Daemon health</strong>: Read <code>${CLAUDE_PLUGIN_DATA_DIR}/daemon-health.json</code></p>\n<ul>\n<li>Check <code>infra-monitor</code> status — if not running, note that ECS data may be stale</li>\n</ul>\n</li>\n<li><p><strong>Secrets</strong>: AWS and Vercel credentials required.</p>\n<h3>Secret Resolution</h3>\n<ul>\n<li>AWS: check <code>$AWS_PROFILE</code> / <code>$AWS_ACCESS_KEY_ID</code> → <code>doppler secrets get AWS_ACCESS_KEY_ID --plain</code> → vault query cmd from prefs</li>\n<li>Vercel token: check <code>$VERCEL_TOKEN</code> → <code>doppler secrets get VERCEL_TOKEN --plain</code> → vault</li>\n</ul>\n</li>\n</ol>\n<h2>CLI/API Reference</h2>\n<h3>aws CLI</h3>\n<table>\n<thead>\n<tr>\n<th>Command</th>\n<th>Usage</th>\n<th>Output</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>aws ecs list-clusters --output json</code></td>\n<td>All ECS clusters</td>\n<td><code>{clusterArns: [...]}</code></td>\n</tr>\n<tr>\n<td><code>aws ecs list-services --cluster &lt;name&gt; --output json</code></td>\n<td>Services in cluster</td>\n<td><code>{serviceArns: [...]}</code></td>\n</tr>\n<tr>\n<td><code>aws ecs describe-services --cluster &lt;name&gt; --services &lt;arn&gt; --output json</code></td>\n<td>Service health</td>\n<td><code>{services: [{serviceName, status, runningCount, desiredCount, pendingCount}]}</code></td>\n</tr>\n<tr>\n<td><code>aws logs tail /ecs/&lt;service&gt; --since 1h --format short</code></td>\n<td>ECS logs</td>\n<td>Log lines</td>\n</tr>\n</tbody>\n</table>\n<h3>gh CLI (GitHub)</h3>\n<table>\n<thead>\n<tr>\n<th>Command</th>\n<th>Usage</th>\n<th>Output</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>gh run list --repo &lt;owner/repo&gt; --limit 5 --json status,conclusion,name,headBranch,createdAt,databaseId</code></td>\n<td>CI runs</td>\n<td>JSON array</td>\n</tr>\n<tr>\n<td><code>gh run view &lt;id&gt; --repo &lt;repo&gt; --log-failed</code></td>\n<td>Failed CI logs</td>\n<td>Log output</td>\n</tr>\n<tr>\n<td><code>gh run watch &lt;run-id&gt; --repo &lt;repo&gt;</code></td>\n<td>Stream CI run</td>\n<td>Live output (use with Monitor)</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Agent Teams support</h2>\n<p>If <code>CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1</code> is set, use <strong>Agent Teams</strong> when checking deploy platforms in parallel. This enables:</p>\n<ul>\n<li>Agents share context and can coordinate mid-flight</li>\n<li>You can steer priorities in real-time</li>\n<li>Agents report progress as they complete</li>\n</ul>\n<p><strong>Team setup</strong> (only when flag is enabled):</p>\n<pre><code>TeamCreate(\"deploy-team\")\nAgent(team_name=\"deploy-team\", name=\"ecs-checker\", prompt=\"List all ECS clusters and describe service health, running/desired counts\")\nAgent(team_name=\"deploy-team\", name=\"vercel-checker\", prompt=\"List Vercel projects and recent deployments with status\")\nAgent(team_name=\"deploy-team\", name=\"ci-checker\", prompt=\"Check GitHub Actions runs across all registered repos for failures\")\n</code></pre>\n<p>If the flag is NOT set, use standard fire-and-forget subagents.</p>\n<h2>Phase 1 — Gather deploy data in parallel</h2>\n<h3>ECS services (all clusters)</h3>\n<pre><code>${CLAUDE_PLUGIN_ROOT}/bin/ops-infra 2&gt;/dev/null || \\\naws ecs list-clusters --output json 2&gt;/dev/null\n</code></pre>\n<h3>ECS service details</h3>\n<pre><code>for cluster in $(aws ecs list-clusters --output json 2&gt;/dev/null | jq -r '.clusterArns[]'); do\n  cluster_name=$(basename \"$cluster\")\n  aws ecs list-services --cluster \"$cluster_name\" --output json 2&gt;/dev/null | \\\n    jq -r '.serviceArns[]' | while read svc; do\n    aws ecs describe-services --cluster \"$cluster_name\" --services \"$svc\" \\\n      --output json 2&gt;/dev/null | jq '.services[] | {name: .serviceName, desired: .desiredCount, running: .runningCount, pending: .pendingCount, image: (.taskDefinition // \"unknown\"), status: .status}'\n  done\ndone\n</code></pre>\n<h3>Recent GitHub Actions runs (registry-driven)</h3>\n<pre><code>REGISTRY=\"${CLAUDE_PLUGIN_ROOT}/scripts/registry.json\"\n[ -f \"$REGISTRY\" ] || REGISTRY=\"${CLAUDE_PLUGIN_ROOT}/scripts/registry.example.json\"\nfor repo in $(jq -r '.projects[] | select(.gsd == true) | .repos[]' \"$REGISTRY\" 2&gt;/dev/null); do\n  echo \"=== $repo ===\"\n  gh run list --repo \"$repo\" --limit 5 --json status,conclusion,name,headBranch,createdAt,databaseId 2&gt;/dev/null\ndone\n</code></pre>\n<h3>Vercel deployments</h3>\n<p>Use <code>mcp__claude_ai_Vercel__list_projects</code> then <code>mcp__claude_ai_Vercel__list_deployments</code> for each project (limit 5 per project).</p>\n<hr>\n<h2>Phase 2 — Render dashboard</h2>\n<pre><code>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n OPS ► DEPLOY STATUS — [timestamp]\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nECS SERVICES\n CLUSTER    SERVICE         D/R/P   STATUS   LAST DEPLOY\n ─────────────────────────────────────────────────────\n [cluster]  [service]       [x/x/x] ACTIVE   [time ago]\n ...\n\nVERCEL DEPLOYMENTS\n PROJECT     ENV        STATUS    COMMIT    DEPLOYED\n ─────────────────────────────────────────────────────\n [project]   production  READY    [sha]     [time ago]\n ...\n\nCI/CD PIPELINE\n REPO              BRANCH   WORKFLOW        STATUS    AGE\n ─────────────────────────────────────────────────────\n example-api       main     Deploy API      ✓ success  2h\n example-web       dev      Build            ✗ failure  1h\n ...\n\nPENDING DEPLOYS (branch ready, not yet deployed)\n [repo] [branch] [PR#] [CI status] → needs merge to trigger\n\n──────────────────────────────────────────────────────\n</code></pre>\n<p>After rendering, use <strong>batched AskUserQuestion calls</strong> (max 4 options each). Only show actions relevant to the current state (e.g., skip \"View logs for failing service\" if nothing is failing). If &lt;=4 relevant actions, use a single call. If &gt;4, batch:</p>\n<p>AskUserQuestion call 1:</p>\n<pre><code>  [View logs for [failing service]]\n  [Trigger manual deploy for [project]]\n  [View build logs for [failing CI run]]\n  [More actions...]\n</code></pre>\n<p>AskUserQuestion call 2 (only if \"More actions...\"):</p>\n<pre><code>  [Check Vercel [project] runtime logs]\n  [Open GitHub Actions for [repo]]\n  [Back to dashboard]\n</code></pre>\n<hr>\n<h2>Deep-dive by project</h2>\n<p>If <code>$ARGUMENTS</code> has a project alias, show only that project's deploy info + last 10 CI runs + option to view logs.</p>\n<p>For failing deploys: offer to view logs via <code>mcp__claude_ai_Vercel__get_deployment_build_logs</code> or ECS CloudWatch logs.</p>\n<p><strong>If user selects manual deploy (option b)</strong>, confirm with <code>AskUserQuestion</code> before triggering:</p>\n<pre><code>Trigger deploy for [project]:\n  Environment: [production/staging]\n  Branch: [branch]\n  Last commit: [sha] — [message]\n\n  [Deploy now]  [View diff since last deploy first]  [Cancel]\n</code></pre>\n<p><strong>If user selects to view logs</strong>, show the logs and use <code>AskUserQuestion</code>:</p>\n<pre><code>  [Dispatch fix agent for this failure]  [Redeploy]  [Back to dashboard]\n</code></pre>\n<hr>\n<h2>Native tool usage</h2>\n<h3>Monitor — live deploy streaming</h3>\n<p>When watching a deploy in progress, use <code>Monitor</code> to stream logs:</p>\n<pre><code>Monitor(command: \"gh run watch &lt;run-id&gt; --repo &lt;repo&gt;\")\n</code></pre>\n<p>For ECS deploys: <code>Monitor(command: \"aws ecs wait services-stable --cluster &lt;cluster&gt; --services &lt;service&gt;\")</code></p>\n<h3>Tasks — deploy tracking</h3>\n<p>Use <code>TaskCreate</code> per project being deployed. Update with <code>TaskUpdate</code> as deploys succeed/fail.</p>\n<h3>WebFetch — Vercel fallback</h3>\n<p>When Vercel MCP tools are unavailable, use <code>WebFetch</code> with the Vercel API directly:</p>\n<pre><code>WebFetch(url: \"https://api.vercel.com/v6/deployments?projectId=&lt;id&gt;&amp;limit=5\", headers: {\"Authorization\": \"Bearer $VERCEL_TOKEN\"})\n</code></pre>\n","files":[{"path":"SKILL.md","sizeBytes":8208,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-14T20:43:27.772565Z","sha256":"890165C6981904B3B221118253461FCD4C49A0A6DBE08A5B67CF901CA4E92333","sizeBytes":3235},"review":null,"source":{"repositoryUrl":"https://github.com/davepoon/buildwithclaude","path":"plugins/claude-ops/skills/ops-deploy","license":"MIT","commit":"6178ae2b0900b3600419853206de1dddf0f28311","subtreeSha":"D6E2DC48D35EDBD232171F2ABB1887D7EC9472A88BC1F0500B945BBEA20B115D","lastSyncedAt":"2026-09-27T19:47:46.68834Z"},"reviewedAt":"2026-09-14T20:43:54.8344Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/davepoon/buildwithclaude/tree/main/plugins/claude-ops/skills/ops-deploy"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install davepoon-buildwithclaude@llmmart"},{"target":"git","command":"git clone https://github.com/davepoon/buildwithclaude.git"}]}