From ac5c00c035513dbecfb6a097697b043184f83179 Mon Sep 17 00:00:00 2001 From: Erik Laco Date: Wed, 16 Sep 2026 15:27:13 +0200 Subject: [PATCH] add static sites and bump to 0.3.0 --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 5 +- .codex-plugin/plugin.json | 8 ++- CHANGELOG.md | 15 +++++ CONTRIBUTING.md | 2 +- README.md | 6 +- plugin.json | 5 +- skills/applications/SKILL.md | 37 ++++++------ skills/billing/SKILL.md | 2 +- skills/databases/SKILL.md | 2 +- skills/deploy/SKILL.md | 56 +++++++++++++++---- skills/deploy/references/codebase-analysis.md | 15 ++--- skills/domains/SKILL.md | 8 +-- skills/environment/SKILL.md | 9 +-- skills/projects/SKILL.md | 2 +- skills/storage/SKILL.md | 5 +- skills/troubleshoot/SKILL.md | 18 +++--- .../troubleshoot/references/error-patterns.md | 24 +++++++- 18 files changed, 154 insertions(+), 67 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index fd676b1..72019db 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ "plugins": [ { "name": "seenode", - "description": "Deploy, troubleshoot, and manage applications, databases, storage, domains, projects, and billing on Seenode via the hosted Seenode MCP.", + "description": "Deploy, troubleshoot, and manage static sites, web/worker/private applications, databases, storage, domains, projects, and billing on Seenode via the hosted Seenode MCP.", "author": { "name": "Seenode", "email": "help@seenode.com" diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 4d8f984..4dbde9b 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "seenode", - "version": "0.2.2", - "description": "Deploy, troubleshoot, and manage applications, databases, storage, domains, projects, and billing on Seenode via the hosted Seenode MCP.", + "version": "0.3.0", + "description": "Deploy, troubleshoot, and manage static sites, web/worker/private applications, databases, storage, domains, projects, and billing on Seenode via the hosted Seenode MCP.", "author": { "name": "Seenode", "email": "help@seenode.com" @@ -15,6 +15,7 @@ "hosting", "mcp", "applications", + "static-sites", "databases", "storage", "billing", diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 0a6433f..a4fcc43 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "seenode", - "version": "0.2.2", - "description": "Deploy, troubleshoot, and manage applications, databases, storage, domains, projects, and billing on Seenode via the hosted Seenode MCP.", + "version": "0.3.0", + "description": "Deploy, troubleshoot, and manage static sites, web/worker/private applications, databases, storage, domains, projects, and billing on Seenode via the hosted Seenode MCP.", "author": { "name": "Seenode", "email": "help@seenode.com", @@ -16,6 +16,7 @@ "hosting", "mcp", "applications", + "static-sites", "databases", "storage", "billing", @@ -26,7 +27,7 @@ "interface": { "displayName": "Seenode", "shortDescription": "Deploy and manage apps on Seenode", - "longDescription": "Connect ChatGPT and Codex to Seenode to deploy GitHub/GitLab apps, create and link MySQL/PostgreSQL databases, wait on deployments, inspect logs and metrics, manage environment variables and storage, attach custom domains, and check credits/billing. Authentication uses OAuth against the hosted Seenode MCP — no API keys in plugin config.", + "longDescription": "Connect ChatGPT and Codex to Seenode to deploy GitHub/GitLab apps including static sites, create and link MySQL/PostgreSQL databases, wait on deployments, inspect logs and metrics, manage environment variables and storage, attach custom domains, and check credits/billing. Authentication uses OAuth against the hosted Seenode MCP — no API keys in plugin config.", "developerName": "Seenode", "category": "Developer Tools", "capabilities": [ @@ -38,6 +39,7 @@ "termsOfServiceURL": "https://seenode.com/legal/terms-and-conditions", "defaultPrompt": [ "Deploy this repository to Seenode as a web app", + "Deploy this Vite SPA to Seenode as a static site", "Create a PostgreSQL database and link it to my Seenode app", "Why did my latest Seenode deployment fail?", "What is my Seenode credit balance?", diff --git a/CHANGELOG.md b/CHANGELOG.md index d324967..e807105 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.3.0] - 2026-09-11 + +### Added + +- Static sites as a first-class MCP product type (`application_type='static'`) +- Static deploy recipe: `inspect_repository` → `create_application` with `publish_directory` → `wait_for_deployment` (no database, run command, or port) + +### Changed + +- Skills and docs stop claiming static is not a product type +- Custom domains apply to **web and static** +- Static env vars are build-time — follow `set_environment_variables` with `create_deployment` +- Storage, restart, scale, and runtime metrics are documented as unsupported for static +- `update_build_settings` can change `publish_directory`; `update_application` can set `static_routes` / `static_headers` + ## [0.2.2] - 2026-08-09 ### Changed diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bab6c3c..ba7095a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,7 +32,7 @@ Thanks for helping improve the Seenode Agent Plugin. - Keep `SKILL.md` action-oriented; put deep checklists in `references/` - Frontmatter must include `name` and `description`; `name` must match the directory - Track the platform MCP tool registry (`platform/apps/mcp/service/tools/`): every registered tool should appear in at least one skill; do not invent tool names -- Document remaining gaps honestly (no destroy for apps/DBs/domains/projects/storage; no static-site/cron/blueprint/key-value types) +- Document remaining gaps honestly (no destroy for apps/DBs/domains/projects/storage; no cron/blueprint/key-value types) - Teach `create_database` → `get_database_state` → `link_database_to_application`; never teach pasting DB passwords - Prefer `wait_for_deployment` over busy-polling; confirm before billing money mutations - Prefer inspect → plan → mutate → verify diff --git a/README.md b/README.md index e5f1583..0e18295 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ This repository is a **portable Agent Plugin**: shared skills plus thin client a Use this plugin when you want an AI coding agent to: -- Deploy a GitHub or GitLab repo to Seenode as a web, worker, or private app +- Deploy a GitHub or GitLab repo to Seenode as a web, worker, private, or static app - Create and link managed MySQL/PostgreSQL databases (without pasting passwords) - Debug failed builds and runtime crashes with logs, metrics, wait/cancel helpers - Manage environment variables, custom domains, projects, storage volumes, and billing/credits @@ -38,6 +38,7 @@ After install, complete Seenode OAuth when prompted, then try a read-only smoke ## Example prompts - “Deploy this repository to Seenode as a web app.” +- “Deploy this Vite SPA to Seenode as a static site.” - “Create a PostgreSQL database, wait until it’s ready, and link it to my app.” - “Why did my latest Seenode deployment fail? Wait for the next deploy after you fix it.” - “What’s my Seenode credit balance in USD?” @@ -50,7 +51,7 @@ After install, complete Seenode OAuth when prompted, then try a read-only smoke |-------|---------| | [`deploy`](skills/deploy/SKILL.md) | End-to-end deploy: DB → inspect → app → link → wait | | [`troubleshoot`](skills/troubleshoot/SKILL.md) | Failed deploys and apps that won’t start | -| [`applications`](skills/applications/SKILL.md) | Discover and manage web/worker/private apps | +| [`applications`](skills/applications/SKILL.md) | Discover and manage web/worker/private/static apps | | [`environment`](skills/environment/SKILL.md) | Env vars and secrets (prefer DB link over paste) | | [`databases`](skills/databases/SKILL.md) | Create, update, rotate, and link managed DBs | | [`storage`](skills/storage/SKILL.md) | Persistent application volumes | @@ -61,7 +62,6 @@ After install, complete Seenode OAuth when prompted, then try a read-only smoke ### MCP gaps skills respect - No delete/destroy tools for apps, databases, domains, projects, or storage (only `delete_environment_variables`) -- No static-site / cron / blueprint / key-value product types on this MCP surface - Never fetch or echo raw DB passwords — use `link_database_to_application` ## Security diff --git a/plugin.json b/plugin.json index 154befb..99dfda6 100644 --- a/plugin.json +++ b/plugin.json @@ -1,8 +1,8 @@ { "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "seenode", - "version": "0.2.2", - "description": "Deploy, troubleshoot, and manage applications, databases, storage, domains, projects, and billing on Seenode via the hosted Seenode MCP.", + "version": "0.3.0", + "description": "Deploy, troubleshoot, and manage static sites, web/worker/private applications, databases, storage, domains, projects, and billing on Seenode via the hosted Seenode MCP.", "author": { "name": "Seenode", "email": "help@seenode.com", @@ -17,6 +17,7 @@ "hosting", "mcp", "applications", + "static-sites", "databases", "storage", "billing", diff --git a/skills/applications/SKILL.md b/skills/applications/SKILL.md index a929b2d..20e8844 100644 --- a/skills/applications/SKILL.md +++ b/skills/applications/SKILL.md @@ -1,10 +1,10 @@ --- name: applications -description: Discover and manage Seenode web, worker, and private applications — list/get apps, packages, build settings, restart/duplicate, scale, and trigger deployments. Use when the user asks about their Seenode apps, runtimes, build/start commands, ports, auto-deploy, or redeploys. +description: Discover and manage Seenode web, worker, private, and static applications — list/get apps, packages, build settings, restart/duplicate, scale, and trigger deployments. Use when the user asks about their Seenode apps, runtimes, build/start commands, ports, publish directory, auto-deploy, or redeploys. license: MIT metadata: author: Seenode - version: "0.2.2" + version: "0.3.0" category: applications --- @@ -12,19 +12,21 @@ metadata: ## Types -| Type | Public URL | Custom domains | Port | -|------|------------|----------------|------| -| `web` | Yes (`*.seenode.app`) | Yes | Required | -| `worker` | No | No | Usually omit | -| `private` | No (internal only) | No | Required | +| Type | Public URL | Custom domains | Port | Notes | +|------|------------|----------------|------|-------| +| `web` | Yes (`*.seenode.app`) | Yes | Required | Container | +| `worker` | No | No | Usually omit | Container | +| `private` | No (internal only) | No | Required | Container | +| `static` | Yes (`*.seenode.app`) | Yes | Omit | Git build → object storage; `publish_directory` required; no restart/scale/storage | -`list_applications` filters by type and defaults to `web`. Call again with `worker` / `private` when needed — there is no all-types list. +`list_applications` filters by type and defaults to `web`. Call again with `worker` / `private` / `static` when needed — there is no all-types list. ## Discovery ``` get_current_team() list_applications(application_type="web", project_id=null, page=1) +list_applications(application_type="static") get_application(application_id=...) get_build_settings(application_id=...) get_deployments(application_id=...) @@ -44,12 +46,14 @@ update_application( description=null, project_id=null, package_id=null, # paid tier from list_application_packages — needs credit approval - scale=null, # 1–10 instance multiplier; must be 1 when storage is attached - auto_deploy=null # deploy-on-push toggle + scale=null, # 1–10 instance multiplier; must be 1 when storage is attached; not for static + auto_deploy=null, # deploy-on-push toggle + static_routes=null, # static only: [{type: redirect|rewrite, source, destination}] + static_headers=null # static only: [{path, name, value}] ) ``` -Build/run commands, runtime image, port, root directory, and git branch are **not** here — use `update_build_settings`. Package ≠ runtime. +Build/run commands, runtime image, port, root directory, publish directory, and git branch are **not** here — use `update_build_settings`. Package ≠ runtime. Static routes/headers **are** here. ## Update build settings (redeploys) @@ -60,14 +64,15 @@ update_build_settings( run_command=null, image_id=null, # from list_images root_directory=null, + publish_directory=null, # static only port=null, git_branch=null ) ``` -Side effect: starts a new build/deployment immediately. Prefer `wait_for_deployment` afterwards; use `get_application_logs` on failure. +Side effect: starts a new build/deployment immediately. Prefer `wait_for_deployment` afterwards; use `get_application_logs` on failure. Static: pass `build_command` + `publish_directory`; omit `run_command` / `port`. -Runtime changes mean changing `image_id` / creating with `runtime` — never via env vars named `RUNTIME`. +Runtime changes mean changing `image_id` / creating with `runtime` — never via env vars named `RUNTIME`. Static `runtime` / `image_id` is the **build container** (default Node 22). ## Restart (no rebuild) @@ -75,7 +80,7 @@ Runtime changes mean changing `image_id` / creating with `runtime` — never via restart_application(application_id=...) ``` -Restarts running instances without rebuilding from git. Requires at least one prior successful deployment. Env-var changes already trigger a similar restart. +Restarts running instances without rebuilding from git. Requires at least one prior successful deployment. Env-var changes already trigger a similar restart. **Not supported for static** (API 400 — no running instances). ## Duplicate @@ -96,11 +101,11 @@ Omit `git_commit_sha` for the newest commit on the configured branch; pass a SHA ## Create -Prefer the **deploy** skill for new apps (`create_application`, optional `create_database` → `link_database_to_application`). Require pushed GitHub/GitLab repo + connected provider (`get_git_connections`). Use `inspect_repository` when build/run hints are unclear. +Prefer the **deploy** skill for new apps (`create_application`, optional `create_database` → `link_database_to_application`). Require pushed GitHub/GitLab repo + connected provider (`get_git_connections`). Use `inspect_repository` when build/run hints are unclear. Static: `application_type="static"` with `publish_directory` (and optional `client_side_routing`); skip DB/run/port. ## Storage -Persistent volumes: see the **storage** skill (`list_application_storage`, `create_application_storage`, …). Size tiers come from `list_storage_packages`. +Persistent volumes: see the **storage** skill (`list_application_storage`, `create_application_storage`, …). Size tiers come from `list_storage_packages`. **Not supported for static** (API 400). ## Safety diff --git a/skills/billing/SKILL.md b/skills/billing/SKILL.md index 8ccfdaa..5b4c50d 100644 --- a/skills/billing/SKILL.md +++ b/skills/billing/SKILL.md @@ -4,7 +4,7 @@ description: Inspect Seenode team credits, usage, spending, orders, and ledger; license: MIT metadata: author: Seenode - version: "0.2.2" + version: "0.3.0" category: billing --- diff --git a/skills/databases/SKILL.md b/skills/databases/SKILL.md index 19f7eea..532e028 100644 --- a/skills/databases/SKILL.md +++ b/skills/databases/SKILL.md @@ -4,7 +4,7 @@ description: Create, inspect, update, rotate, and link Seenode MySQL/PostgreSQL license: MIT metadata: author: Seenode - version: "0.2.2" + version: "0.3.0" category: databases --- diff --git a/skills/deploy/SKILL.md b/skills/deploy/SKILL.md index 09da123..bd2f81d 100644 --- a/skills/deploy/SKILL.md +++ b/skills/deploy/SKILL.md @@ -1,10 +1,10 @@ --- name: deploy -description: Deploy a GitHub or GitLab repository to Seenode end-to-end — preflight credits/team, create or reuse a database, inspect the repo, create a web/worker/private application, link the DB, wait for deployment, and return the *.seenode.app URL. Use when the user wants to deploy, host, publish, or ship an app on Seenode. +description: Deploy a GitHub or GitLab repository to Seenode end-to-end — preflight credits/team, create or reuse a database when needed, inspect the repo, create a web/worker/private/static application, link the DB, wait for deployment, and return the *.seenode.app URL. Use when the user wants to deploy, host, publish, or ship an app on Seenode. license: MIT metadata: author: Seenode - version: "0.2.2" + version: "0.3.0" category: deployment --- @@ -19,6 +19,7 @@ Seenode hosts: - **web** — public HTTP; gets a default `*.seenode.app` domain - **worker** — background process; no public URL - **private** — internal network only; no public URL / custom domains +- **static** — git build → object storage; free Static package; default `*.seenode.app` domain; no container - **MySQL / PostgreSQL** — managed databases (`database_type` is `mysql` or `postgresql`, never `postgres`) Apps deploy from **GitHub** or **GitLab**. Team context comes from the OAuth token — call `get_current_team` when you need to confirm where resources will land. @@ -33,12 +34,20 @@ create_project? → create_database → poll get_database_state Check `get_credit_balance` before paid creates. Quote `pricePerMonthUsd` / `creditBalanceUsd` only (never DIY cents→dollars). +Static-only shortcut (no DB): + +```text +inspect_repository → create_application(application_type="static", + build_command, publish_directory, client_side_routing?) + → wait_for_deployment → add_domain +``` + ### MCP capability gaps (do not invent workarounds) | Gap | What to do | |-----|------------| | No delete app/DB/domain/project/storage | Do not claim you can delete; send destructive cleanup to the dashboard. | -| No static-site / cron / blueprint / key-value product types | Stay within web/worker/private + managed DBs (+ optional app storage). | +| No cron / blueprint / key-value product types | Stay within web/worker/private/static + managed DBs (+ optional app storage on containers). | ## Prerequisites @@ -56,6 +65,7 @@ get_team_limits() get_team_services_brief() get_credit_balance() list_applications(application_type="web") +list_applications(application_type="static") ``` Optional project grouping: `list_projects` / `create_project` (see **projects** skill). Package upgrades and paid creates consume credit — confirm with the user when balance is low. @@ -93,7 +103,7 @@ Prefer explicit tags such as `node-22`, `python-3.12` (pass as `runtime` string) ### 5. Database (if needed) -If the app needs a DB: +Skip this step for **static** sites (no server, no DB link). If a container app needs a DB: 1. `list_databases` — reuse an existing team DB when appropriate (`get_database` / `get_database_state`). 2. To create: @@ -120,7 +130,9 @@ get_database_state(database_id=...) ### 6. Propose one plan, then create the application -Summarize for approval: app type, repo/branch, runtime, build/run commands, port, env keys (names only), DB plan, optional storage. Then: +Summarize for approval: app type, repo/branch, runtime, build/run commands (or publish directory), port, env keys (names only), DB plan, optional storage. Then: + +**Web / worker / private:** ``` create_application( @@ -141,12 +153,35 @@ create_application( ) ``` -For an existing app: `get_application` → `update_build_settings` and/or `set_environment_variables` → `create_deployment` / `wait_for_deployment` as needed. +**Static** (Vite/SPA with `commands.publishDirectory` and no start command, or the user asked for a static site). No database, run command, or port. Optional `runtime` / `image_id` selects the **build container** (defaults to Node 22): -Optional persistent volume (scale must be 1): see **storage** skill (`list_storage_packages`, `create_application_storage`). +``` +create_application( + git_repository="owner/repo", + git_provider="github"|"gitlab", + git_branch="|null", + application_type="static", + build_command="npm run build", + publish_directory="dist", + client_side_routing=true, # SPA rewrite /* → /index.html + root_directory=null, + environment_variables={...}, + secret_keys=["..."], + project_id=null|, + custom_name=null|"..." +) +``` + +Do **not** deploy a static SPA as `type=web` with a dummy `run_command`. + +For an existing app: `get_application` → `update_build_settings` (static: `publish_directory`, no `run_command`/`port`) and/or `set_environment_variables` → `create_deployment` / `wait_for_deployment`. Static env is **build-time** — always follow env changes with `create_deployment`. `update_application` can set `static_routes` / `static_headers` (no rebuild). + +Optional persistent volume (scale must be 1; **not for static**): see **storage** skill (`list_storage_packages`, `create_application_storage`). ### 7. Link the database (never paste passwords) +Skip for static. For container apps: + ``` link_database_to_application( application_id=..., @@ -185,7 +220,7 @@ Fix with the right tool (`update_build_settings`, `set_environment_variables`, ` ### 9. Optional custom domain -For `web` apps only — use the **domains** skill (`add_domain`, `check_domain_status`). +For `web` and `static` apps — use the **domains** skill (`add_domain`, `check_domain_status`). ### 10. Report success @@ -195,7 +230,8 @@ On `SUCCESSFUL`, summarize with a markdown link to the default domain, e.g. [Ope - Runtime ≠ env var → `list_images` / create `runtime` / `update_build_settings` - Package ≠ runtime → `list_application_packages` / `list_database_packages` + `update_application` / `update_database` -- Env changes **restart**; build-settings / `create_deployment` **rebuild** +- Env changes **restart** containers; build-settings / `create_deployment` **rebuild** +- Static env is **build-time** — `set_environment_variables` does not restart a container; follow with `create_deployment` - Speak credits and spend via `*Usd` fields only (`creditBalanceUsd`, `pricePerMonthUsd`; **billing** skill) ## Safety @@ -204,7 +240,7 @@ On `SUCCESSFUL`, summarize with a markdown link to the default domain, e.g. [Ope - Preserve MCP approval prompts — do not bypass user consent. - Never delete production resources via MCP (unsupported); never invent credentials. - Never paste secret env or DB password values into chat; say they were set or linked. -- Env-var changes **restart** instances; they do **not** rebuild from git. Build/runtime/port/command changes use `update_build_settings` and **do** redeploy. +- Env-var changes **restart** container instances; they do **not** rebuild from git. Build/runtime/port/command changes use `update_build_settings` and **do** redeploy. Static: env changes need `create_deployment`. ## Relevant tools diff --git a/skills/deploy/references/codebase-analysis.md b/skills/deploy/references/codebase-analysis.md index 71bda82..195de44 100644 --- a/skills/deploy/references/codebase-analysis.md +++ b/skills/deploy/references/codebase-analysis.md @@ -25,8 +25,8 @@ Prefer scripts already in the repo (`package.json` scripts, Makefile, Procfile, |-------------------|---------------|-------------| | Next.js (`next`) | `npm ci && npm run build` | `npm start` (or `npx next start`) | | Nest / Express / Fastify | `npm ci && npm run build` if `dist/` needed | `npm start` or `node dist/main.js` | -| Vite SPA + separate API | Deploy the **server** as web; static-only sites are not a Seenode product type via MCP — serve via the app or document the limitation | -| Remix / Nuxt / SvelteKit | Use framework start script after build | framework `start` | +| Vite SPA / static export with no backend | `npm ci && npm run build` | n/a — `application_type='static'` + `publish_directory` | +| Remix / Nuxt / SvelteKit (SSR / Node server) | Use framework start script after build | framework `start` | Install command must match the lockfile: `npm ci`, `pnpm i --frozen-lockfile`, `yarn install --frozen-lockfile`, or `bun install --frozen-lockfile`. @@ -89,7 +89,8 @@ Create with `create_database`, poll `get_database_state`, then `link_database_to | Need | Type | |------|------| -| Public HTTP API or website | `web` | +| Public HTTP API or website with a server | `web` | +| Vite/SPA/static export, no Node server | `static` (`publish_directory`, optional `client_side_routing`) | | Queue consumer / sidekiq / bull worker | `worker` | | Internal-only service | `private` | @@ -98,9 +99,9 @@ Create with `create_database`, poll `get_database_state`, then `link_database_to Before `create_application`, be able to state: 1. Repo + provider + branch -2. `application_type` + port (if any) -3. `runtime` or `image_id` -4. Exact `build_command` and `run_command` +2. `application_type` + port (if any) or `publish_directory` (static) +3. `runtime` or `image_id` (optional for static — build container defaults to Node 22) +4. Exact `build_command` and `run_command` (omit `run_command` for static) 5. `root_directory` if not repo root 6. Env keys to set (names) and which are secrets -7. Whether a managed DB will be created/reused and linked (not password-pasted) +7. Whether a managed DB will be created/reused and linked (not password-pasted; skip for static) diff --git a/skills/domains/SKILL.md b/skills/domains/SKILL.md index 83278ef..118e7a3 100644 --- a/skills/domains/SKILL.md +++ b/skills/domains/SKILL.md @@ -1,18 +1,18 @@ --- name: domains -description: Attach and update custom domains on Seenode web applications, show DNS records, and poll verification until DNS/TLS/routing are ready. Use when the user wants a custom domain, DNS setup, SSL status, default-domain changes, or to check if a domain is live on Seenode. +description: Attach and update custom domains on Seenode web and static applications, show DNS records, and poll verification until DNS/TLS/routing are ready. Use when the user wants a custom domain, DNS setup, SSL status, default-domain changes, or to check if a domain is live on Seenode. license: MIT metadata: author: Seenode - version: "0.2.2" + version: "0.3.0" category: networking --- # Custom domains on Seenode -Only **`web`** applications support custom domains. Workers and private apps do not. +Only **`web` and `static`** applications support custom domains. Workers and private apps do not. -Web apps already receive a default `*.seenode.app` domain on creation — use this skill for **custom** domains. +Web and static apps already receive a default `*.seenode.app` domain on creation — use this skill for **custom** domains. ## List current domains diff --git a/skills/environment/SKILL.md b/skills/environment/SKILL.md index 470ca77..f5439b6 100644 --- a/skills/environment/SKILL.md +++ b/skills/environment/SKILL.md @@ -4,7 +4,7 @@ description: Manage Seenode application environment variables and secrets — li license: MIT metadata: author: Seenode - version: "0.2.2" + version: "0.3.0" category: configuration --- @@ -12,9 +12,10 @@ metadata: ## Semantics (critical) -- **Set/delete env vars** applies config to the **running** application and **restarts** instances. -- Env changes do **not** rebuild from git. -- Changing runtime image, build/start command, port, root directory, or branch requires **`update_build_settings`** (redeploy), not env vars. +- **Set/delete env vars** on container apps applies config to the **running** application and **restarts** instances. +- Env changes do **not** rebuild from git for web/worker/private. +- **Static:** env is **build-time**. `set_environment_variables` does not restart a container — follow with `create_deployment` / `wait_for_deployment`. +- Changing runtime image, build/start command, port, root directory, publish directory, or branch requires **`update_build_settings`** (redeploy), not env vars. - Secrets marked via `secret_keys` are write-only — they cannot be read back. - For managed databases, prefer **`link_database_to_application`** over pasting `DATABASE_URL` / `DB_PASSWORD` into `set_environment_variables`. diff --git a/skills/projects/SKILL.md b/skills/projects/SKILL.md index 27218dd..4335c9d 100644 --- a/skills/projects/SKILL.md +++ b/skills/projects/SKILL.md @@ -4,7 +4,7 @@ description: Work with Seenode team context and optional project grouping — li license: MIT metadata: author: Seenode - version: "0.2.2" + version: "0.3.0" category: organization --- diff --git a/skills/storage/SKILL.md b/skills/storage/SKILL.md index c784bc9..8fe1a69 100644 --- a/skills/storage/SKILL.md +++ b/skills/storage/SKILL.md @@ -4,13 +4,13 @@ description: Manage persistent storage volumes on Seenode applications — list license: MIT metadata: author: Seenode - version: "0.2.2" + version: "0.3.0" category: storage --- # Application storage on Seenode -Persistent volumes attach to a single application. Apps may have **at most one** active volume. Scale must be **1** when storage is attached. +Persistent volumes attach to a single **container** application. Apps may have **at most one** active volume. Scale must be **1** when storage is attached. **Not supported for `type=static`** (API 400 — no container mount). ## Discover packages and volumes @@ -64,6 +64,7 @@ Use for capacity pressure while troubleshooting disk-full symptoms. - No delete-storage tool via MCP — remove volumes in the dashboard. - Do not attach storage when scale > 1; do not claim shrink/downgrade is possible. +- Do not attach storage to static sites. - Inspect before mutate; preserve MCP approval prompts. ## Relevant tools diff --git a/skills/troubleshoot/SKILL.md b/skills/troubleshoot/SKILL.md index ce4c606..3485661 100644 --- a/skills/troubleshoot/SKILL.md +++ b/skills/troubleshoot/SKILL.md @@ -4,7 +4,7 @@ description: Diagnose failed Seenode deployments and apps that will not start license: MIT metadata: author: Seenode - version: "0.2.2" + version: "0.3.0" category: debugging --- @@ -16,7 +16,7 @@ Identify the failing application, read deployment state and logs, classify the f ``` get_current_team() -list_applications(application_type="web") # also try worker / private +list_applications(application_type="web") # also try worker / private / static ``` If MCP auth fails, complete Seenode OAuth and retry. @@ -26,7 +26,7 @@ If MCP auth fails, complete Seenode OAuth and retry. ### 1. Identify the application ``` -list_applications(application_type="web"|"worker"|"private") +list_applications(application_type="web"|"worker"|"private"|"static") get_application(application_id=...) get_build_settings(application_id=...) ``` @@ -79,8 +79,9 @@ Match against [references/error-patterns.md](references/error-patterns.md). Comm - Port binding (`127.0.0.1` only, wrong port) - Build command / dependency failures - Database connection (re-link, do not paste passwords) -- OOM / high memory (metrics) +- OOM / high memory (metrics) — not for static (no containers) - Wrong runtime image +- Static: empty publish directory, missing SPA rewrite, `restart_application` 400 ### 5. Check metrics when relevant @@ -89,6 +90,8 @@ get_application_metrics(application_id=..., metric_type="memory", range_hours=1) get_application_metrics(application_id=..., metric_type="cpu", range_hours=1) ``` +Skip application metrics for **static** sites (no running containers). + For DB-related issues: ``` @@ -111,12 +114,13 @@ Prefer masked listing. Use `reveal_environment_variables` only when the user exp | Class | Fix tool | |-------|----------| | Runtime / build / start / port / branch / root dir | `update_build_settings` (triggers redeploy) | -| Missing or wrong non-DB env | `set_environment_variables` (restarts; no git rebuild) | +| Missing or wrong non-DB env | `set_environment_variables` (containers restart; static: follow with `create_deployment`) | | DB credentials / after password rotate | `link_database_to_application(..., overwrite=true)` | | Remove bad keys | `delete_environment_variables` | -| Process needs fresh start (no rebuild) | `restart_application` | +| Process needs fresh start (no rebuild) | `restart_application` (**not for static**) | | Code bug | Fix locally → commit/push → `create_deployment` | -| Metadata / scale / auto_deploy / package | `update_application` | +| Metadata / scale / auto_deploy / package | `update_application` (scale/package not for static) | +| Static routes/headers (SPA rewrite, redirects) | `update_application(..., static_routes=, static_headers=)` | | Stuck in-progress deploy | `cancel_deployment` then redeploy if needed | Carry forward omitted build-settings fields — the API replaces the whole record; the MCP tool carries forward omissions when used correctly. diff --git a/skills/troubleshoot/references/error-patterns.md b/skills/troubleshoot/references/error-patterns.md index b41e835..24882a3 100644 --- a/skills/troubleshoot/references/error-patterns.md +++ b/skills/troubleshoot/references/error-patterns.md @@ -30,7 +30,7 @@ Or for managed DBs: link_database_to_application(application_id=..., database_id=..., overwrite=true) ``` -Env updates restart instances; they do not rebuild. If the app needs a new build artifact, follow with `create_deployment` / `wait_for_deployment`. +Env updates restart instances; they do not rebuild. If the app needs a new build artifact, follow with `create_deployment` / `wait_for_deployment`. **Static:** env is always build-time — always follow with `create_deployment`. ## PORT_BINDING @@ -76,7 +76,7 @@ get_database_metrics(database_id=..., metric_type="connections") **Signals:** build succeeds, runtime exits immediately, `npm start` missing script, wrong module path (`dist/main` missing). -**Fix:** Correct `run_command` (and build output paths) via `update_build_settings`. Ensure build actually emits the files the start command expects. If settings look correct but the process is wedged, try `restart_application`. +**Fix:** Correct `run_command` (and build output paths) via `update_build_settings`. Ensure build actually emits the files the start command expects. If settings look correct but the process is wedged, try `restart_application` (not for static). ## OUT_OF_MEMORY @@ -116,6 +116,26 @@ get_application_metrics(application_id=..., metric_type="memory", range_hours=1) **Fix:** `cancel_deployment(application_id=..., deployment_uuid=...)` then investigate logs and redeploy with `create_deployment` / `wait_for_deployment` if appropriate. +## STATIC_PUBLISH_DIR + +**Signals:** empty publish directory after SUCCESSFUL deploy, origin 404s for every path, build logs say no files uploaded. + +**Checks:** `get_build_settings` → `publishDirectory`. Confirm the build emits that folder relative to `rootDirectory`. + +**Fix:** `update_build_settings(..., publish_directory="")` then `wait_for_deployment`. + +## STATIC_SPA_REWRITE + +**Signals:** `/` works but client-side routes 404 on refresh; deep links fail. + +**Fix:** `update_application` with `static_routes=[{type:"rewrite", source:"/*", destination:"/index.html"}]` (no rebuild), or create with `client_side_routing=true`. + +## STATIC_NO_CONTAINER + +**Signals:** `restart_application`, storage, scale, or application metrics return 400. + +**Fix:** Do not restart a static site. Env changes need `create_deployment`. Storage/scale/runtime metrics are unsupported. + ## Fix budget After **3** mutate → redeploy → verify cycles without success, stop, report the best root-cause hypothesis with log evidence, and ask before continuing.