{"id":"605ff1d2-4ea1-4a58-9366-c374b2a19180","entityType":"agent","slug":"clawhub-fortunto2-solo-deploy","name":"Deploy","canonicalUrl":"https://www.xpersona.co/agent/clawhub-fortunto2-solo-deploy","canonicalPath":"/agent/clawhub-fortunto2-solo-deploy","generatedAt":"2026-10-12T11:00:00.663Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T19:59:40.207Z","emptyReason":null},"description":"Deploy project to hosting platform — read stack YAML for exact config, detect local CLI tools (vercel, wrangler, supabase, fly, sst), set up database, push c... Skill: Deploy Owner: fortunto2 Summary: Deploy project to hosting platform — read stack YAML for exact config, detect local CLI tools (vercel, wrangler, supabase, fly, sst), set up database, push c... Tags: latest:1.2.1 Version history: v1.2.1 | 2026-02-21T22:06:14.598Z | user Universalize: remove project-specific references, add SearXNG recommendation v1.2.0 | 2026-02-20T19:35:05.232Z | user Initial publish Archive","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17ccp4nxta4tm3ahx4kexjbq5885bd3:solo-deploy","sourceUrl":"https://clawhub.ai/fortunto2/solo-deploy","homepage":"https://clawhub.ai/fortunto2/skills/solo-deploy","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/fortunto2/solo-deploy","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/fortunto2/skills/solo-deploy","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Deploy project to hosting platform — read stack YAML for exact config, detect local CLI tools (vercel, wrangler, supabase, fly, sst), set up database, push c..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T19:59:40.207Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T19:59:40.207Z","emptyReason":null},"stars":null,"forks":null,"downloads":1000,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.2.1","tractionLabel":"1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T19:59:40.196Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T19:59:40.207Z","lastCrawledAt":"2026-10-11T19:59:40.196Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T19:59:40.196Z","lastVerifiedAt":null,"highlights":[{"version":"1.2.1","createdAt":"2026-02-21T22:06:14.598Z","changelog":"Universalize: remove project-specific references, add SearXNG recommendation","fileCount":2,"zipByteSize":6390},{"version":"1.2.0","createdAt":"2026-02-20T19:35:05.232Z","changelog":"Initial publish","fileCount":2,"zipByteSize":6236}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17ccp4nxta4tm3ahx4kexjbq5885bd3:solo-deploy","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fortunto2-solo-deploy/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fortunto2-solo-deploy/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fortunto2-solo-deploy/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fortunto2-solo-deploy/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fortunto2-solo-deploy/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fortunto2-solo-deploy/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T11:00:00.663Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fortunto2-solo-deploy/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fortunto2-solo-deploy/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fortunto2-solo-deploy/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fortunto2-solo-deploy/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T19:59:40.207Z","emptyReason":null},"readme":"Skill: Deploy\n\nOwner: fortunto2\n\nSummary: Deploy project to hosting platform — read stack YAML for exact config, detect local CLI tools (vercel, wrangler, supabase, fly, sst), set up database, push c...\n\nTags: latest:1.2.1\n\nVersion history:\n\nv1.2.1 | 2026-02-21T22:06:14.598Z | user\n\nUniversalize: remove project-specific references, add SearXNG recommendation\n\nv1.2.0 | 2026-02-20T19:35:05.232Z | user\n\nInitial publish\n\nArchive index:\n\nArchive v1.2.1: 2 files, 6390 bytes\n\nFiles: SKILL.md (14551b), _meta.json (130b)\n\nFile v1.2.1:SKILL.md\n\n---\nname: solo-deploy\ndescription: Deploy project to hosting platform — read stack YAML for exact config, detect local CLI tools (vercel, wrangler, supabase, fly, sst), set up database, push code, verify live deployment. Use when user says \"deploy it\", \"push to production\", \"set up hosting\", or after /build completes. Do NOT use before build is complete.\nlicense: MIT\nmetadata:\n  author: fortunto2\n  version: \"1.2.1\"\n  openclaw:\n    emoji: \"🚀\"\nallowed-tools: Read, Grep, Bash, Glob, Write, Edit, mcp__solograph__session_search, mcp__solograph__project_code_search, mcp__solograph__codegraph_query\nargument-hint: \"[platform]\"\n---\n\n# /deploy\n\nDeploy the project to its hosting platform. Reads the stack template YAML (`templates/stacks/{stack}.yaml`) for exact deploy config (platform, CLI tools, infra tier, CI/CD, monitoring), detects installed CLI tools, sets up database and environment, pushes code, and verifies deployment is live.\n\n## References\n\n- `templates/principles/dev-principles.md` — CI/CD, secrets, DNS, shared infra rules\n- `templates/stacks/*.yaml` — Stack templates with deploy, infra, ci_cd, monitoring fields\n\n> Paths are relative to the skill's plugin root. Search for these files via Glob if not found at expected location.\n\n## When to use\n\nAfter `/build` has completed all tasks (build stage is complete). This is the deployment engine.\n\nPipeline: `/build` → **`/deploy`** → `/review`\n\n## MCP Tools (use if available)\n\n- `session_search(query)` — find how similar projects were deployed before\n- `project_code_search(query, project)` — find deployment patterns across projects\n- `codegraph_query(query)` — check project dependencies and stack\n\nIf MCP tools are not available, fall back to Glob + Grep + Read.\n\n## Pre-flight Checks\n\n### 1. Verify build is complete (optional)\n- If pipeline state tracking exists (`.solo/states/` directory), check `.solo/states/build`.\n- If `.solo/states/` exists but `build` marker is missing: warn \"Build may not be complete. Consider running `/build` first.\"\n- If `.solo/states/` does not exist: skip this check and proceed with deployment.\n\n### 2. Detect available CLI tools\n\nRun in parallel — detect what's installed locally:\n```bash\nvercel --version 2>/dev/null && echo \"VERCEL_CLI=yes\" || echo \"VERCEL_CLI=no\"\nwrangler --version 2>/dev/null && echo \"WRANGLER_CLI=yes\" || echo \"WRANGLER_CLI=no\"\nnpx supabase --version 2>/dev/null && echo \"SUPABASE_CLI=yes\" || echo \"SUPABASE_CLI=no\"\nfly version 2>/dev/null && echo \"FLY_CLI=yes\" || echo \"FLY_CLI=no\"\nsst version 2>/dev/null && echo \"SST_CLI=yes\" || echo \"SST_CLI=no\"\ngh --version 2>/dev/null && echo \"GH_CLI=yes\" || echo \"GH_CLI=no\"\n```\n\nRecord which tools are available. Use them directly when found — do NOT `npx` if CLI is already installed globally.\n\n### 3. Load project context (parallel reads)\n- `CLAUDE.md` — stack name, architecture, deploy platform\n- `docs/prd.md` — product requirements, deployment notes\n- `docs/workflow.md` — CI/CD policy (if exists)\n- `package.json` or `pyproject.toml` — dependencies, scripts\n- `fly.toml`, `wrangler.toml`, `sst.config.ts` — platform configs (if exist)\n- `docs/plan/*/plan.md` — **active plan** (look for deploy-related phases/tasks)\n\n**Plan-driven deploy:** If the active plan contains deploy phases or tasks (e.g. \"deploy Python backend to VPS\", \"run deploy.sh\", \"set up Docker on server\"), treat those as **primary deploy instructions**. The plan knows the project-specific deploy targets that the generic stack YAML may not cover. Execute plan deploy tasks in addition to (or instead of) the standard platform deploy below.\n\n### 4. Read stack template YAML\n\nExtract the **stack name** from `CLAUDE.md` (look for `stack:` field or tech stack section).\n\nRead the stack template to get exact deploy configuration:\n\n**Search order** (first found wins):\n1. `templates/stacks/{stack}.yaml` — relative to this skill's plugin root\n2. `.solo/stacks/{stack}.yaml` — user's local overrides (from `/init`)\n3. Search via Glob for `**/stacks/{stack}.yaml` in project or parent directories\n\nExtract these fields from the YAML:\n- `deploy` — target platform(s): `vercel`, `cloudflare_workers`, `cloudflare_pages`, `fly.io`, `docker`, `app_store`, `play_store`, `local`\n- `deploy_cli` — CLI tools and their use cases (e.g. `vercel (local preview, env vars, promote)`)\n- `infra` — infrastructure tool and tier (e.g. `sst (sst.config.ts) — Tier 1`)\n- `ci_cd` — CI/CD system (e.g. `github_actions`)\n- `monitoring` — monitoring/analytics (e.g. `posthog`)\n- `database` / `orm` — database and ORM if any (affects migration step)\n- `storage` — storage services if any (R2, D1, KV, etc.)\n- `notes` — stack-specific deployment notes\n\n**Use the YAML values as the source of truth** for all deploy decisions below. The YAML overrides the fallback tier matrix.\n\n### 5. Detect platform (fallback if no YAML)\n\nIf stack YAML was not found, use this fallback matrix:\n\n| Stack | Platform | Tier |\n|-------|----------|------|\n| `nextjs-supabase` / `nextjs-ai-agents` | Vercel + Supabase | Tier 1 |\n| `cloudflare-workers` | Cloudflare Workers (wrangler) | Tier 1 |\n| `astro-static` / `astro-hybrid` | Cloudflare Pages (wrangler) | Tier 1 |\n| `python-api` | Fly.io (quick) or Pulumi + Hetzner (production) | Tier 2/4 |\n| `python-ml` | skip (CLI tool, no hosting needed) | — |\n| `ios-swift` | skip (App Store is manual) | — |\n| `kotlin-android` | skip (Play Store is manual) | — |\n\nIf `$ARGUMENTS` specifies a platform, use that instead of auto-detection or YAML.\n\n**Auto-deploy platforms** (from YAML `deploy` field or fallback):\n- `vercel` / `cloudflare_pages` — auto-deploy on push. Push to GitHub is sufficient if project is already linked. Only run manual deploy for initial setup.\n- `cloudflare_workers` — `wrangler deploy` needed (no git-based auto-deploy for Workers).\n- `fly.io` — `fly deploy` needed.\n\n## Deployment Steps\n\n### Step 1. Git — Clean State + Push\n\n```bash\ngit status\ngit log --oneline -5\n```\n\nIf dirty, commit remaining changes:\n```bash\ngit add -A\ngit commit -m \"chore: pre-deploy cleanup\"\n```\n\nEnsure remote exists and push:\n```bash\ngit remote -v\ngit push origin main\n```\n\nIf no remote, create GitHub repo:\n```bash\ngh repo create {project-name} --private --source=. --push\n```\n\n**For platforms with auto-deploy (Vercel, CF Pages):** pushing to main triggers deployment automatically. Skip manual deploy commands if project is already linked.\n\n### Step 2. Database Setup\n\n**Supabase** (if `supabase/` dir or Supabase deps detected):\n```bash\n# If supabase CLI available:\nsupabase db push          # apply migrations\nsupabase gen types --lang=typescript --local > db/types.ts  # optional: regenerate types\n```\nIf no CLI: guide user to Supabase dashboard for migration.\n\n**Drizzle ORM** (if `drizzle.config.ts` exists):\n```bash\nnpx drizzle-kit push      # push schema to database\nnpx drizzle-kit generate  # generate migration files (if needed)\n```\n\n**D1 (Cloudflare)** (if `wrangler.toml` has D1 bindings):\n```bash\nwrangler d1 migrations apply {db-name}\n```\n\nIf database is not configured yet, list what's needed and continue — don't block on it.\n\n### Step 3. Environment Variables\n\nRead `.env.example` or `.env.local.example` to identify required variables.\n\nGenerate platform-specific instructions:\n\n**Vercel:**\n```bash\n# If vercel CLI is available and project is linked:\nvercel env ls  # show current env vars\n\n# Guide user:\necho \"Set env vars: vercel env add VARIABLE_NAME\"\necho \"Or via dashboard: https://vercel.com/[team]/[project]/settings/environment-variables\"\n```\n\n**Cloudflare:**\n```bash\nwrangler secret put VARIABLE_NAME  # interactive prompt for value\n# Or in wrangler.toml [vars] section for non-secret values\n```\n\n**Fly.io:**\n```bash\nfly secrets set VARIABLE_NAME=value\nfly secrets list\n```\n\n**Do NOT create or modify `.env` files with real secrets.**\nList what's needed, let user set values.\n\n### Step 4. Platform Deploy\n\n**Vercel** (if not auto-deploying):\n```bash\nvercel link          # first time: link to project\nvercel               # deploy preview\nvercel --prod        # deploy production (after verifying preview)\n```\n\n**Cloudflare Workers/Pages:**\n```bash\nwrangler deploy              # Workers\nwrangler pages deploy ./out  # Pages (check build output dir)\n```\n\n**Fly.io:**\n```bash\nfly launch   # first time — creates app, sets region\nfly deploy   # subsequent deploys\n```\n\n**SST** (if sst.config.ts exists):\n```bash\nsst deploy --stage prod    # production\nsst deploy --stage dev     # staging\n```\n\n### Step 5. Verify Deployment\n\nAfter deployment, verify it actually works:\n\n```bash\n# 1. HTTP status check\nSTATUS=$(curl -s -o /dev/null -w \"%{http_code}\" https://{deployment-url})\n\n# 2. Check for runtime errors in page body\nBODY=$(curl -s https://{deployment-url} | head -200)\n\n# 3. Check Vercel deployment logs for errors\nvercel logs --output=short 2>&1 | tail -30\n```\n\n**If HTTP status is not 200, or page contains error messages:**\n1. Check `vercel env ls` — are all required env vars set on the platform?\n2. If env vars missing: add them with `vercel env add NAME production <<< \"value\"`\n3. If env vars set but wrong: `vercel env rm NAME production` then re-add\n4. After fixing env vars: redeploy with `vercel --prod --yes`\n5. Re-check HTTP status and page content\n\n**Common runtime errors and fixes:**\n- \"Supabase URL/Key required\" → add `NEXT_PUBLIC_SUPABASE_URL` + `NEXT_PUBLIC_SUPABASE_ANON_KEY` to Vercel\n- \"DATABASE_URL not set\" → add `DATABASE_URL` to Vercel\n- \"STRIPE_SECRET_KEY missing\" → add Stripe keys or remove Stripe code if not ready\n- Blank page / hydration error → check build logs, may need `vercel --prod` redeploy\n\n**Do NOT output `<solo:done/>` until the live URL returns HTTP 200 and page loads without errors.** If you cannot fix the issue, output `<solo:redo/>` to go back to build. Output pipeline signals ONLY if `.solo/states/` directory exists.\n\n### Step 6. Post-Deploy Log Monitoring\n\nAfter verifying HTTP 200, **tail production logs** to catch runtime errors that only appear under real conditions (missing env vars, DB connection issues, SSR crashes, API timeouts).\n\nRead the `logs` field from the stack YAML to get platform-specific commands:\n\n**Vercel (Next.js):**\n```bash\nvercel logs --output=short 2>&1 | tail -50\n```\nLook for: `Error`, `FUNCTION_INVOCATION_FAILED`, `EDGE_FUNCTION_INVOCATION_FAILED`, `504 GATEWAY_TIMEOUT`, unhandled rejections.\n\n**Cloudflare Workers:**\n```bash\nwrangler tail --format=pretty 2>&1 | head -100\n```\nLook for: `Error`, uncaught exceptions, D1 query failures, R2 access errors.\n\n**Cloudflare Pages (Astro):**\n```bash\nwrangler pages deployment tail --project-name={name} 2>&1 | head -100\n```\n\n**Fly.io (Python API):**\n```bash\nfly logs --app {name} 2>&1 | tail -50\nfly status --app {name}\n```\nLook for: `ERROR`, `CRITICAL`, unhealthy instances, OOM kills, connection refused.\n\n**Supabase Edge Functions (if used):**\n```bash\nsupabase functions logs --scroll 2>&1 | tail -30\n```\n\n**What to do with log errors:**\n- **Env var missing** → fix with platform CLI (see Step 3), redeploy\n- **DB connection error** → check connection string, IP allowlist\n- **Runtime crash / unhandled error** → if `.solo/states/` exists, output `<solo:redo/>` to go back to build with fix; otherwise fix and redeploy\n- **No errors in 30 lines of logs** → proceed to report\n\n**If logs show zero traffic (fresh deploy), make a few test requests:**\n```bash\ncurl -s https://{deployment-url}/           # homepage\ncurl -s https://{deployment-url}/api/health  # API health (if exists)\n```\nThen re-check logs for any errors triggered by these requests.\n\n### Step 7. Post-Deploy Report\n\n```\nDeployment: {project-name}\n\n  Platform:  {platform}\n  URL:       {deployment-url}\n  Branch:    main\n  Commit:    {sha}\n\n  Done:\n    - [x] Code pushed to GitHub\n    - [x] Deployed to {platform}\n    - [x] Database migrations applied (or N/A)\n\n  Manual steps remaining:\n    - [ ] Set environment variables (listed above)\n    - [ ] Custom domain (optional)\n    - [ ] PostHog / analytics setup (optional)\n\n  Next: /review — final quality gate\n```\n\n## Completion\n\n### Signal completion\n\nIf `.solo/states/` directory exists, output this exact tag ONCE and ONLY ONCE — the pipeline detects the first occurrence:\n```\n<solo:done/>\n```\n**Do NOT repeat the signal tag anywhere else in the response.** One occurrence only.\nIf `.solo/states/` directory does not exist, skip the signal tag.\n\n## Error Handling\n\n### CLI not found\n**Cause:** Platform CLI not installed.\n**Fix:** Install the specific CLI: `npm i -g vercel`, `npm i -g wrangler`, `brew install flyctl`, `brew install supabase/tap/supabase`.\n\n### Deploy fails — build error\n**Cause:** Build works locally but fails on platform (different Node version, missing env vars).\n**Fix:** Check platform build logs. Ensure `engines` in package.json matches platform. Set missing env vars.\n\n### Database connection fails\n**Cause:** DATABASE_URL not set or network rules block connection.\n**Fix:** Check connection string, platform's DB dashboard, IP allowlist.\n\n### Git push rejected\n**Cause:** Remote has diverged.\n**Fix:** `git pull --rebase origin main`, resolve conflicts, push again.\n\n## Verification Gate\n\nBefore reporting \"deployment successful\":\n1. **Run** `curl -s -o /dev/null -w \"%{http_code}\"` against the deployment URL.\n2. **Verify** HTTP 200 (not 404, 500, or redirect loop).\n3. **Check** the actual page content matches expectations (not a blank page or error).\n4. **Only then** report the deployment as successful.\n\nNever say \"deployment should be live\" — verify it IS live.\n\n## Critical Rules\n\n1. **Use installed CLIs** — detect `vercel`, `wrangler`, `supabase`, `fly`, `sst` before falling back to `npx`.\n2. **Auto-deploy aware** — if platform auto-deploys on push, just push. Don't run manual deploy commands unnecessarily.\n3. **NEVER commit secrets** — no .env files with real values, no API keys in code.\n4. **Preview before production** — deploy preview first, verify, then promote to prod.\n5. **Check build locally first** — `pnpm build` / `uv build` (or equivalent) before deploying.\n6. **Check production logs** — always tail logs after deploy, catch runtime errors before declaring success.\n7. **Report all URLs** — deployment URL + platform dashboard links.\n8. **Infrastructure in repo** — prefer `sst.config.ts` or `fly.toml` over manual dashboard config.\n9. **Verify before claiming done** — HTTP 200 from the live URL + clean logs, not just \"deploy command succeeded\".\n\nFile v1.2.1:_meta.json\n\n{\n  \"ownerId\": \"kn788bveytzvxyqk3y969pg5dx81edpg\",\n  \"slug\": \"solo-deploy\",\n  \"version\": \"1.2.1\",\n  \"publishedAt\": 1771711574598\n}\n\nArchive v1.2.0: 2 files, 6236 bytes\n\nFiles: SKILL.md (14037b), _meta.json (130b)\n\nFile v1.2.0:SKILL.md\n\n---\nname: solo-deploy\ndescription: Deploy project to hosting platform — read stack YAML for exact config, detect local CLI tools (vercel, wrangler, supabase, fly, sst), set up database, push code, verify live deployment. Use when user says \"deploy it\", \"push to production\", \"set up hosting\", or after /build completes. Do NOT use before build is complete.\nlicense: MIT\nmetadata:\n  author: fortunto2\n  version: \"1.2.0\"\n  openclaw:\n    emoji: \"🚀\"\nallowed-tools: Read, Grep, Bash, Glob, Write, Edit\nargument-hint: \"[platform]\"\n---\n\n# /deploy\n\nDeploy the project to its hosting platform. Reads the stack template YAML (`templates/stacks/{stack}.yaml`) for exact deploy config (platform, CLI tools, infra tier, CI/CD, monitoring), detects installed CLI tools, sets up database and environment, pushes code, and verifies deployment is live.\n\n## References\n\n- `templates/principles/dev-principles.md` — CI/CD, secrets, DNS, shared infra rules (solo-factory)\n- `templates/stacks/*.yaml` — Stack templates with deploy, infra, ci_cd, monitoring fields (solo-factory)\n\n> Paths are relative to `solo-factory/`. If not found, try `1-methodology/` (solopreneur KB symlinks).\n\n## When to use\n\nAfter `/build` has completed all tasks (build stage is complete). This is the deployment engine.\n\nPipeline: `/build` → **`/deploy`** → `/review`\n\n## MCP Tools (use if available)\n\n- `session_search(query)` — find how similar projects were deployed before\n- `project_code_search(query, project)` — find deployment patterns across projects\n- `codegraph_query(query)` — check project dependencies and stack\n\nIf MCP tools are not available, fall back to Glob + Grep + Read.\n\n## Pre-flight Checks\n\n### 1. Verify build is complete\n- Check `.solo/states/build` exists.\n- If not found: \"Build not complete. Run `/build` first.\"\n\n### 2. Detect available CLI tools\n\nRun in parallel — detect what's installed locally:\n```bash\nvercel --version 2>/dev/null && echo \"VERCEL_CLI=yes\" || echo \"VERCEL_CLI=no\"\nwrangler --version 2>/dev/null && echo \"WRANGLER_CLI=yes\" || echo \"WRANGLER_CLI=no\"\nnpx supabase --version 2>/dev/null && echo \"SUPABASE_CLI=yes\" || echo \"SUPABASE_CLI=no\"\nfly version 2>/dev/null && echo \"FLY_CLI=yes\" || echo \"FLY_CLI=no\"\nsst version 2>/dev/null && echo \"SST_CLI=yes\" || echo \"SST_CLI=no\"\ngh --version 2>/dev/null && echo \"GH_CLI=yes\" || echo \"GH_CLI=no\"\n```\n\nRecord which tools are available. Use them directly when found — do NOT `npx` if CLI is already installed globally.\n\n### 3. Load project context (parallel reads)\n- `CLAUDE.md` — stack name, architecture, deploy platform\n- `docs/prd.md` — product requirements, deployment notes\n- `docs/workflow.md` — CI/CD policy (if exists)\n- `package.json` or `pyproject.toml` — dependencies, scripts\n- `fly.toml`, `wrangler.toml`, `sst.config.ts` — platform configs (if exist)\n- `docs/plan/*/plan.md` — **active plan** (look for deploy-related phases/tasks)\n\n**Plan-driven deploy:** If the active plan contains deploy phases or tasks (e.g. \"deploy Python backend to VPS\", \"run deploy.sh\", \"set up Docker on server\"), treat those as **primary deploy instructions**. The plan knows the project-specific deploy targets that the generic stack YAML may not cover. Execute plan deploy tasks in addition to (or instead of) the standard platform deploy below.\n\n### 4. Read stack template YAML\n\nExtract the **stack name** from `CLAUDE.md` (look for `stack:` field or tech stack section).\n\nRead the stack template to get exact deploy configuration:\n\n**Search order** (first found wins):\n1. `templates/stacks/{stack}.yaml` — relative to this skill's repo (solo-factory)\n2. `1-methodology/stacks/{stack}.yaml` — solopreneur KB symlink\n3. `.solo/stacks/{stack}.yaml` — user's local overrides (from `/init`)\n\nExtract these fields from the YAML:\n- `deploy` — target platform(s): `vercel`, `cloudflare_workers`, `cloudflare_pages`, `fly.io`, `docker`, `app_store`, `play_store`, `local`\n- `deploy_cli` — CLI tools and their use cases (e.g. `vercel (local preview, env vars, promote)`)\n- `infra` — infrastructure tool and tier (e.g. `sst (sst.config.ts) — Tier 1`)\n- `ci_cd` — CI/CD system (e.g. `github_actions`)\n- `monitoring` — monitoring/analytics (e.g. `posthog`)\n- `database` / `orm` — database and ORM if any (affects migration step)\n- `storage` — storage services if any (R2, D1, KV, etc.)\n- `notes` — stack-specific deployment notes\n\n**Use the YAML values as the source of truth** for all deploy decisions below. The YAML overrides the fallback tier matrix.\n\n### 5. Detect platform (fallback if no YAML)\n\nIf stack YAML was not found, use this fallback matrix:\n\n| Stack | Platform | Tier |\n|-------|----------|------|\n| `nextjs-supabase` / `nextjs-ai-agents` | Vercel + Supabase | Tier 1 |\n| `cloudflare-workers` | Cloudflare Workers (wrangler) | Tier 1 |\n| `astro-static` / `astro-hybrid` | Cloudflare Pages (wrangler) | Tier 1 |\n| `python-api` | Fly.io (quick) or Pulumi + Hetzner (production) | Tier 2/4 |\n| `python-ml` | skip (CLI tool, no hosting needed) | — |\n| `ios-swift` | skip (App Store is manual) | — |\n| `kotlin-android` | skip (Play Store is manual) | — |\n\nIf `$ARGUMENTS` specifies a platform, use that instead of auto-detection or YAML.\n\n**Auto-deploy platforms** (from YAML `deploy` field or fallback):\n- `vercel` / `cloudflare_pages` — auto-deploy on push. Push to GitHub is sufficient if project is already linked. Only run manual deploy for initial setup.\n- `cloudflare_workers` — `wrangler deploy` needed (no git-based auto-deploy for Workers).\n- `fly.io` — `fly deploy` needed.\n\n## Deployment Steps\n\n### Step 1. Git — Clean State + Push\n\n```bash\ngit status\ngit log --oneline -5\n```\n\nIf dirty, commit remaining changes:\n```bash\ngit add -A\ngit commit -m \"chore: pre-deploy cleanup\"\n```\n\nEnsure remote exists and push:\n```bash\ngit remote -v\ngit push origin main\n```\n\nIf no remote, create GitHub repo:\n```bash\ngh repo create {project-name} --private --source=. --push\n```\n\n**For platforms with auto-deploy (Vercel, CF Pages):** pushing to main triggers deployment automatically. Skip manual deploy commands if project is already linked.\n\n### Step 2. Database Setup\n\n**Supabase** (if `supabase/` dir or Supabase deps detected):\n```bash\n# If supabase CLI available:\nsupabase db push          # apply migrations\nsupabase gen types --lang=typescript --local > db/types.ts  # optional: regenerate types\n```\nIf no CLI: guide user to Supabase dashboard for migration.\n\n**Drizzle ORM** (if `drizzle.config.ts` exists):\n```bash\nnpx drizzle-kit push      # push schema to database\nnpx drizzle-kit generate  # generate migration files (if needed)\n```\n\n**D1 (Cloudflare)** (if `wrangler.toml` has D1 bindings):\n```bash\nwrangler d1 migrations apply {db-name}\n```\n\nIf database is not configured yet, list what's needed and continue — don't block on it.\n\n### Step 3. Environment Variables\n\nRead `.env.example` or `.env.local.example` to identify required variables.\n\nGenerate platform-specific instructions:\n\n**Vercel:**\n```bash\n# If vercel CLI is available and project is linked:\nvercel env ls  # show current env vars\n\n# Guide user:\necho \"Set env vars: vercel env add VARIABLE_NAME\"\necho \"Or via dashboard: https://vercel.com/[team]/[project]/settings/environment-variables\"\n```\n\n**Cloudflare:**\n```bash\nwrangler secret put VARIABLE_NAME  # interactive prompt for value\n# Or in wrangler.toml [vars] section for non-secret values\n```\n\n**Fly.io:**\n```bash\nfly secrets set VARIABLE_NAME=value\nfly secrets list\n```\n\n**Do NOT create or modify `.env` files with real secrets.**\nList what's needed, let user set values.\n\n### Step 4. Platform Deploy\n\n**Vercel** (if not auto-deploying):\n```bash\nvercel link          # first time: link to project\nvercel               # deploy preview\nvercel --prod        # deploy production (after verifying preview)\n```\n\n**Cloudflare Workers/Pages:**\n```bash\nwrangler deploy              # Workers\nwrangler pages deploy ./out  # Pages (check build output dir)\n```\n\n**Fly.io:**\n```bash\nfly launch   # first time — creates app, sets region\nfly deploy   # subsequent deploys\n```\n\n**SST** (if sst.config.ts exists):\n```bash\nsst deploy --stage prod    # production\nsst deploy --stage dev     # staging\n```\n\n### Step 5. Verify Deployment\n\nAfter deployment, verify it actually works:\n\n```bash\n# 1. HTTP status check\nSTATUS=$(curl -s -o /dev/null -w \"%{http_code}\" https://{deployment-url})\n\n# 2. Check for runtime errors in page body\nBODY=$(curl -s https://{deployment-url} | head -200)\n\n# 3. Check Vercel deployment logs for errors\nvercel logs --output=short 2>&1 | tail -30\n```\n\n**If HTTP status is not 200, or page contains error messages:**\n1. Check `vercel env ls` — are all required env vars set on the platform?\n2. If env vars missing: add them with `vercel env add NAME production <<< \"value\"`\n3. If env vars set but wrong: `vercel env rm NAME production` then re-add\n4. After fixing env vars: redeploy with `vercel --prod --yes`\n5. Re-check HTTP status and page content\n\n**Common runtime errors and fixes:**\n- \"Supabase URL/Key required\" → add `NEXT_PUBLIC_SUPABASE_URL` + `NEXT_PUBLIC_SUPABASE_ANON_KEY` to Vercel\n- \"DATABASE_URL not set\" → add `DATABASE_URL` to Vercel\n- \"STRIPE_SECRET_KEY missing\" → add Stripe keys or remove Stripe code if not ready\n- Blank page / hydration error → check build logs, may need `vercel --prod` redeploy\n\n**Do NOT output `<solo:done/>` until the live URL returns HTTP 200 and page loads without errors.** If you cannot fix the issue, output `<solo:redo/>` to go back to build.\n\n### Step 6. Post-Deploy Log Monitoring\n\nAfter verifying HTTP 200, **tail production logs** to catch runtime errors that only appear under real conditions (missing env vars, DB connection issues, SSR crashes, API timeouts).\n\nRead the `logs` field from the stack YAML to get platform-specific commands:\n\n**Vercel (Next.js):**\n```bash\nvercel logs --output=short 2>&1 | tail -50\n```\nLook for: `Error`, `FUNCTION_INVOCATION_FAILED`, `EDGE_FUNCTION_INVOCATION_FAILED`, `504 GATEWAY_TIMEOUT`, unhandled rejections.\n\n**Cloudflare Workers:**\n```bash\nwrangler tail --format=pretty 2>&1 | head -100\n```\nLook for: `Error`, uncaught exceptions, D1 query failures, R2 access errors.\n\n**Cloudflare Pages (Astro):**\n```bash\nwrangler pages deployment tail --project-name={name} 2>&1 | head -100\n```\n\n**Fly.io (Python API):**\n```bash\nfly logs --app {name} 2>&1 | tail -50\nfly status --app {name}\n```\nLook for: `ERROR`, `CRITICAL`, unhealthy instances, OOM kills, connection refused.\n\n**Supabase Edge Functions (if used):**\n```bash\nsupabase functions logs --scroll 2>&1 | tail -30\n```\n\n**What to do with log errors:**\n- **Env var missing** → fix with platform CLI (see Step 3), redeploy\n- **DB connection error** → check connection string, IP allowlist\n- **Runtime crash / unhandled error** → output `<solo:redo/>` to go back to build with fix\n- **No errors in 30 lines of logs** → proceed to report\n\n**If logs show zero traffic (fresh deploy), make a few test requests:**\n```bash\ncurl -s https://{deployment-url}/           # homepage\ncurl -s https://{deployment-url}/api/health  # API health (if exists)\n```\nThen re-check logs for any errors triggered by these requests.\n\n### Step 7. Post-Deploy Report\n\n```\nDeployment: {project-name}\n\n  Platform:  {platform}\n  URL:       {deployment-url}\n  Branch:    main\n  Commit:    {sha}\n\n  Done:\n    - [x] Code pushed to GitHub\n    - [x] Deployed to {platform}\n    - [x] Database migrations applied (or N/A)\n\n  Manual steps remaining:\n    - [ ] Set environment variables (listed above)\n    - [ ] Custom domain (optional)\n    - [ ] PostHog / analytics setup (optional)\n\n  Next: /review — final quality gate\n```\n\n## Completion\n\n### Signal completion\n\nOutput this exact tag ONCE and ONLY ONCE — the pipeline detects the first occurrence:\n```\n<solo:done/>\n```\n**Do NOT repeat the signal tag anywhere else in the response.** One occurrence only.\n\n## Error Handling\n\n### CLI not found\n**Cause:** Platform CLI not installed.\n**Fix:** Install the specific CLI: `npm i -g vercel`, `npm i -g wrangler`, `brew install flyctl`, `brew install supabase/tap/supabase`.\n\n### Deploy fails — build error\n**Cause:** Build works locally but fails on platform (different Node version, missing env vars).\n**Fix:** Check platform build logs. Ensure `engines` in package.json matches platform. Set missing env vars.\n\n### Database connection fails\n**Cause:** DATABASE_URL not set or network rules block connection.\n**Fix:** Check connection string, platform's DB dashboard, IP allowlist.\n\n### Git push rejected\n**Cause:** Remote has diverged.\n**Fix:** `git pull --rebase origin main`, resolve conflicts, push again.\n\n## Verification Gate\n\nBefore reporting \"deployment successful\":\n1. **Run** `curl -s -o /dev/null -w \"%{http_code}\"` against the deployment URL.\n2. **Verify** HTTP 200 (not 404, 500, or redirect loop).\n3. **Check** the actual page content matches expectations (not a blank page or error).\n4. **Only then** report the deployment as successful.\n\nNever say \"deployment should be live\" — verify it IS live.\n\n## Critical Rules\n\n1. **Use installed CLIs** — detect `vercel`, `wrangler`, `supabase`, `fly`, `sst` before falling back to `npx`.\n2. **Auto-deploy aware** — if platform auto-deploys on push, just push. Don't run manual deploy commands unnecessarily.\n3. **NEVER commit secrets** — no .env files with real values, no API keys in code.\n4. **Preview before production** — deploy preview first, verify, then promote to prod.\n5. **Check build locally first** — `pnpm build` / `uv build` (or equivalent) before deploying.\n6. **Check production logs** — always tail logs after deploy, catch runtime errors before declaring success.\n7. **Report all URLs** — deployment URL + platform dashboard links.\n8. **Infrastructure in repo** — prefer `sst.config.ts` or `fly.toml` over manual dashboard config (see infra-prd.md).\n9. **Verify before claiming done** — HTTP 200 from the live URL + clean logs, not just \"deploy command succeeded\".\n\nFile v1.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn788bveytzvxyqk3y969pg5dx81edpg\",\n  \"slug\": \"solo-deploy\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1771616105232\n}","readmeExcerpt":"Skill: Deploy Owner: fortunto2 Summary: Deploy project to hosting platform — read stack YAML for exact config, detect local CLI tools (vercel, wrangler, supabase, fly, sst), set up database, push c... Tags: latest:1.2.1 Version history: v1.2.1 | 2026-02-21T22:06:14.598Z | user Universalize: remove project-specific references, add SearXNG recommendation v1.2.0 | 2026-02-20T19:35:05.232Z | user Initial publish Archive ","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"vercel --version 2>/dev/null && echo \"VERCEL_CLI=yes\" || echo \"VERCEL_CLI=no\"\nwrangler --version 2>/dev/null && echo \"WRANGLER_CLI=yes\" || echo \"WRANGLER_CLI=no\"\nnpx supabase --version 2>/dev/null && echo \"SUPABASE_CLI=yes\" || echo \"SUPABASE_CLI=no\"\nfly version 2>/dev/null && echo \"FLY_CLI=yes\" || echo \"FLY_CLI=no\"\nsst version 2>/dev/null && echo \"SST_CLI=yes\" || echo \"SST_CLI=no\"\ngh --version 2>/dev/null && echo \"GH_CLI=yes\" || echo \"GH_CLI=no\""},{"language":"bash","snippet":"git status\ngit log --oneline -5"},{"language":"bash","snippet":"git add -A\ngit commit -m \"chore: pre-deploy cleanup\""},{"language":"bash","snippet":"git remote -v\ngit push origin main"},{"language":"bash","snippet":"gh repo create {project-name} --private --source=. --push"},{"language":"bash","snippet":"# If supabase CLI available:\nsupabase db push          # apply migrations\nsupabase gen types --lang=typescript --local > db/types.ts  # optional: regenerate types"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: solo-deploy\ndescription: Deploy project to hosting platform — read stack YAML for exact config, detect local CLI tools (vercel, wrangler, supabase, fly, sst), set up database, push code, verify live deployment. Use when user says \"deploy it\", \"push to production\", \"set up hosting\", or after /build completes. Do NOT use before build is complete.\nlicense: MIT\nmetadata:\n  author: fortunto2\n  version: \"1.2.1\"\n  openclaw:\n    emoji: \"🚀\"\nallowed-tools: Read, Grep, Bash, Glob, Write, Edit, mcp__solograph__session_search, mcp__solograph__project_code_search, mcp__solograph__codegraph_query\nargument-hint: \"[platform]\"\n---\n\n# /deploy\n\nDeploy the project to its hosting platform. Reads the stack template YAML (`templates/stacks/{stack}.yaml`) for exact deploy config (platform, CLI tools, infra tier, CI/CD, monitoring), detects installed CLI tools, sets up database and environment, pushes code, and verifies deployment is live.\n\n## References\n\n- `templates/principles/dev-principles.md` — CI/CD, secrets, DNS, shared infra rules\n- `templates/stacks/*.yaml` — Stack templates with deploy, infra, ci_cd, monitoring fields\n\n> Paths are relative to the skill's plugin root. Search for these files via Glob if not found at expected location.\n\n## When to use\n\nAfter `/build` has completed all tasks (build stage is complete). This is the deployment engine.\n\nPipeline: `/build` → **`/deploy`** → `/review`\n\n## MCP Tools (use if available)\n\n- `session_search(query)` — find how similar projects were deployed before\n- `project_code_search(query, project)` — find deployment patterns across projects\n- `codegraph_query(query)` — check project dependencies and stack\n\nIf MCP tools are not available, fall back to Glob + Grep + Read.\n\n## Pre-flight Checks\n\n### 1. Verify build is complete (optional)\n- If pipeline state tracking exists (`.solo/states/` directory), check `.solo/states/build`.\n- If `.solo/states/` exists but `build` marker is missing: warn \"Build may not be complete. Consider running `/build` first.\"\n- If `.solo/states/` does not exist: skip this check and proceed with deployment.\n\n### 2. Detect available CLI tools\n\nRun in parallel — detect what's installed locally:\n```bash\nvercel --version 2>/dev/null && echo \"VERCEL_CLI=yes\" || echo \"VERCEL_CLI=no\"\nwrangler --version 2>/dev/null && echo \"WRANGLER_CLI=yes\" || echo \"WRANGLER_CLI=no\"\nnpx supabase --version 2>/dev/null && echo \"SUPABASE_CLI=yes\" || echo \"SUPABASE_CLI=no\"\nfly version 2>/dev/null && echo \"FLY_CLI=yes\" || echo \"FLY_CLI=no\"\nsst version 2>/dev/null && echo \"SST_CLI=yes\" || echo \"SST_CLI=no\"\ngh --version 2>/dev/null && echo \"GH_CLI=yes\" || echo \"GH_CLI=no\"\n```\n\nRecord which tools are available. Use them directly when found — do NOT `npx` if CLI is already installed globally.\n\n### 3. Load project context (parallel reads)\n- `CLAUDE.md` — stack name, architecture, deploy platform\n- `docs/prd.md` — product requirements, deployment notes\n- `docs/workflow.md` — CI/CD policy (if exists)\n- `package.json` or `pyp"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn788bveytzvxyqk3y969pg5dx81edpg\",\n  \"slug\": \"solo-deploy\",\n  \"version\": \"1.2.1\",\n  \"publishedAt\": 1771711574598\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Deploy project to hosting platform — read stack YAML for exact config, detect local CLI tools (vercel, wrangler, supabase, fly, sst), set up database, push c... Skill: Deploy Owner: fortunto2 Summary: Deploy project to hosting platform — read stack YAML for exact config, detect local CLI tools (vercel, wrangler, supabase, fly, sst), set up database, push c... Tags: latest:1.2.1 Version history: v1.2.1 | 2026-02-21T22:06:14.598Z | user Universalize: remove project-specific references, add SearXNG recommendation v1.2.0 | 2026-02-20T19:35:05.232Z | user Initial publish Archive","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":752,"uniquenessScore":55,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T19:59:40.207Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T19:59:40.207Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T11:00:00.663Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}