@cloudgrid-io/mcp 0.16.2 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -39
- package/package.json +1 -1
- package/src/corpus/capability-map.md +15 -9
- package/src/corpus/cloudgrid-yaml.md +10 -8
- package/src/corpus/cookbook.md +4 -4
- package/src/corpus/install-for-agents.md +1 -2
- package/src/corpus/install.md +1 -1
- package/src/corpus/rules/publish-fallbacks.md +1 -1
- package/src/corpus/skill-claim.md +1 -1
- package/src/corpus/skill-login.md +2 -2
- package/src/corpus/skill-plug.md +69 -6
- package/src/corpus/skills-readme.md +10 -10
- package/src/corpus/templates/ai-knowledge-base/AGENTS.md +1 -1
- package/src/corpus/templates/ai-knowledge-base/index.md +1 -1
- package/src/corpus/templates/api-docs/README.md +3 -3
- package/src/corpus/templates/api-docs/index.md +3 -4
- package/src/corpus/templates/appointment-booking/AGENTS.md +9 -9
- package/src/corpus/templates/appointment-booking/index.md +6 -6
- package/src/corpus/templates/approval-workflow/AGENTS.md +2 -2
- package/src/corpus/templates/approval-workflow/index.md +2 -2
- package/src/corpus/templates/billing-dashboard/index.md +1 -1
- package/src/corpus/templates/calendar-scheduler/AGENTS.md +1 -1
- package/src/corpus/templates/calendar-scheduler/index.md +1 -1
- package/src/corpus/templates/changelog/README.md +3 -3
- package/src/corpus/templates/changelog/index.md +3 -4
- package/src/corpus/templates/company-website/README.md +3 -4
- package/src/corpus/templates/company-website/cloudgrid.yaml +1 -1
- package/src/corpus/templates/company-website/index.md +3 -4
- package/src/corpus/templates/course-platform/index.md +1 -1
- package/src/corpus/templates/dashboard/cloudgrid.yaml +1 -1
- package/src/corpus/templates/dashboard/index.md +3 -4
- package/src/corpus/templates/deck/cloudgrid.yaml +1 -1
- package/src/corpus/templates/deck/index.md +3 -4
- package/src/corpus/templates/docs-site/README.md +3 -3
- package/src/corpus/templates/docs-site/index.md +3 -4
- package/src/corpus/templates/forum/AGENTS.md +6 -6
- package/src/corpus/templates/forum/index.md +1 -1
- package/src/corpus/templates/hr-portal/index.md +1 -1
- package/src/corpus/templates/internal-tools-portal/index.md +1 -1
- package/src/corpus/templates/landing-page/cloudgrid.yaml +1 -1
- package/src/corpus/templates/landing-page/index.md +3 -4
- package/src/corpus/templates/lms/index.md +1 -1
- package/src/corpus/templates/marketplace/AGENTS.md +1 -1
- package/src/corpus/templates/marketplace/index.md +1 -1
- package/src/corpus/templates/membership-site/AGENTS.md +9 -9
- package/src/corpus/templates/membership-site/index.md +6 -6
- package/src/corpus/templates/online-store/index.md +1 -1
- package/src/corpus/templates/portfolio/README.md +3 -3
- package/src/corpus/templates/portfolio/index.md +3 -4
- package/src/corpus/templates/product-launch/README.md +3 -4
- package/src/corpus/templates/product-launch/cloudgrid.yaml +1 -1
- package/src/corpus/templates/product-launch/index.md +3 -4
- package/src/corpus/templates/report/cloudgrid.yaml +1 -1
- package/src/corpus/templates/report/index.md +3 -4
- package/src/corpus/templates/restaurant-reservations/AGENTS.md +9 -9
- package/src/corpus/templates/restaurant-reservations/index.md +2 -2
- package/src/corpus/templates/saas-marketing/README.md +3 -3
- package/src/corpus/templates/saas-marketing/index.md +3 -4
- package/src/corpus/templates/status-page/README.md +3 -3
- package/src/corpus/templates/status-page/index.md +3 -4
- package/src/corpus/templates/subscription-management/AGENTS.md +9 -9
- package/src/corpus/templates/subscription-management/index.md +6 -6
- package/src/corpus/templates/waitlist/README.md +3 -3
- package/src/corpus/templates/waitlist/index.md +3 -4
- package/src/corpus/templates/web-app/cloudgrid.yaml +1 -1
- package/src/corpus/templates/web-app/index.md +3 -4
- package/src/corpus/troubleshooting/deploy-errors.md +1 -1
- package/src/corpus/troubleshooting/persistent-apps.md +1 -1
- package/src/corpus/usage.md +3 -3
- package/src/corpus/workflows/admin-dashboard.md +6 -6
- package/src/corpus/workflows/ai-app.md +8 -8
- package/src/corpus/workflows/ai-knowledge-base.md +6 -6
- package/src/corpus/workflows/analytics-dashboard.md +6 -6
- package/src/corpus/workflows/api-dashboard.md +6 -6
- package/src/corpus/workflows/api-docs.md +3 -3
- package/src/corpus/workflows/api-service.md +8 -8
- package/src/corpus/workflows/app-with-data.md +8 -8
- package/src/corpus/workflows/appointment-booking.md +8 -8
- package/src/corpus/workflows/approval-workflow.md +6 -6
- package/src/corpus/workflows/billing-dashboard.md +8 -8
- package/src/corpus/workflows/blog-cms.md +6 -6
- package/src/corpus/workflows/booking-system.md +7 -7
- package/src/corpus/workflows/calendar-scheduler.md +6 -6
- package/src/corpus/workflows/changelog.md +3 -3
- package/src/corpus/workflows/company-website.md +4 -4
- package/src/corpus/workflows/course-platform.md +7 -7
- package/src/corpus/workflows/crm.md +7 -7
- package/src/corpus/workflows/dashboard.md +4 -4
- package/src/corpus/workflows/directory.md +6 -6
- package/src/corpus/workflows/docs-site.md +3 -3
- package/src/corpus/workflows/erp.md +7 -7
- package/src/corpus/workflows/event-board.md +6 -6
- package/src/corpus/workflows/expense-tracker.md +6 -6
- package/src/corpus/workflows/feature-request-board.md +6 -6
- package/src/corpus/workflows/financial-dashboard.md +6 -6
- package/src/corpus/workflows/forum.md +7 -7
- package/src/corpus/workflows/hr-portal.md +7 -7
- package/src/corpus/workflows/internal-tools-portal.md +7 -7
- package/src/corpus/workflows/inventory.md +6 -6
- package/src/corpus/workflows/invoice.md +6 -6
- package/src/corpus/workflows/job-board.md +6 -6
- package/src/corpus/workflows/kanban.md +7 -7
- package/src/corpus/workflows/landing-page.md +4 -4
- package/src/corpus/workflows/lms.md +7 -7
- package/src/corpus/workflows/marketplace.md +6 -6
- package/src/corpus/workflows/membership-site.md +8 -8
- package/src/corpus/workflows/monitoring-dashboard.md +6 -6
- package/src/corpus/workflows/online-store.md +8 -8
- package/src/corpus/workflows/portfolio.md +3 -3
- package/src/corpus/workflows/presentation.md +4 -4
- package/src/corpus/workflows/product-catalog.md +6 -6
- package/src/corpus/workflows/product-launch.md +4 -4
- package/src/corpus/workflows/project-management.md +6 -6
- package/src/corpus/workflows/property-listings.md +6 -6
- package/src/corpus/workflows/quiz-platform.md +6 -6
- package/src/corpus/workflows/report.md +4 -4
- package/src/corpus/workflows/restaurant-reservations.md +7 -7
- package/src/corpus/workflows/revenue-dashboard.md +6 -6
- package/src/corpus/workflows/saas-marketing.md +3 -3
- package/src/corpus/workflows/semantic-search.md +7 -7
- package/src/corpus/workflows/status-page.md +3 -3
- package/src/corpus/workflows/subscription-management.md +8 -8
- package/src/corpus/workflows/task-manager.md +6 -6
- package/src/corpus/workflows/ticket-system.md +6 -6
- package/src/corpus/workflows/time-tracking.md +6 -6
- package/src/corpus/workflows/travel-booking.md +7 -7
- package/src/corpus/workflows/waitlist.md +3 -3
- package/src/corpus/workflows/web-app.md +4 -4
- package/src/docs.js +5 -5
- package/src/index.js +1 -1
- package/src/tools.js +329 -734
- package/src/web.js +2 -2
- package/src/widgets/live-result.html +1 -1
- package/src/widgets/org-picker.html +3 -3
- package/src/corpus/skill-drop.md +0 -140
package/README.md
CHANGED
|
@@ -61,49 +61,49 @@ It speaks MCP over stdio. Point any MCP client at the `cloudgrid-mcp` command.
|
|
|
61
61
|
|
|
62
62
|
| Tool | Wraps | Notes |
|
|
63
63
|
|---|---|---|
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
68
|
-
| `
|
|
69
|
-
| `
|
|
70
|
-
| `
|
|
71
|
-
| `
|
|
72
|
-
|
|
73
|
-
`
|
|
74
|
-
`
|
|
75
|
-
also work in the web edition where no CLI exists. `
|
|
64
|
+
| `grid_plug` | `POST /api/v2/plug` | The unified create/re-plug verb: create a new entity, or update the SAME entity in place with `target_entity_id` (same URL). Source via local `path` (local edition) or inline `artifact_files` (both). |
|
|
65
|
+
| `grid_drop` | `POST /api/v2/plug` | Artifact drop. Anonymous, or owned if signed in. Re-drops in a session update the same drop in place; anonymous drops return an `entity_id` + `owner_token` re-plug/claim handle. |
|
|
66
|
+
| `grid_claim` | `POST /api/v2/entities/:id/pickup` | Claim an anonymous drop into the signed-in account (the claim token IS the drop's owner token). Direct API. |
|
|
67
|
+
| `grid_fork` | `POST /api/v2/runtimes/:id/fork` | Start a new entity from an existing runtime (lineage recorded). Needs sign-in. |
|
|
68
|
+
| `grid_download` | `GET /api/v2/runtimes/:id/source` | Signed 15-minute source-bundle URLs. Needs sign-in. |
|
|
69
|
+
| `grid_login` | `GET /auth/login` | Start a CLI-free sign-in; returns a URL to open. Direct API. |
|
|
70
|
+
| `grid_login_status` | `GET /auth/status` | Finish the sign-in; saves the token to the shared CLI credentials. |
|
|
71
|
+
| `grid_visibility` | `PATCH /api/v2/inspirations/<id>` | Change who can see a drop (private, space, authenticated, org, link). Needs sign-in. Direct API; also in the web edition. |
|
|
72
|
+
|
|
73
|
+
`grid_drop`, `grid_claim`, `grid_visibility`, and the two
|
|
74
|
+
`grid_login` tools do not wrap the CLI -- they call the API directly, so they
|
|
75
|
+
also work in the web edition where no CLI exists. `grid_login` writes the same
|
|
76
76
|
`~/.cloudgrid/credentials` the CLI uses, so the two share one identity.
|
|
77
77
|
|
|
78
78
|
### CLI-wrapping tools (local edition only)
|
|
79
79
|
|
|
80
80
|
| Tool | Wraps | Notes |
|
|
81
81
|
|---|---|---|
|
|
82
|
-
| `
|
|
83
|
-
| `
|
|
84
|
-
| `
|
|
85
|
-
| `
|
|
86
|
-
| `
|
|
87
|
-
| `
|
|
88
|
-
| `
|
|
89
|
-
| `
|
|
90
|
-
| `
|
|
91
|
-
| `
|
|
92
|
-
| `
|
|
93
|
-
| `
|
|
94
|
-
| `
|
|
95
|
-
| `
|
|
96
|
-
| `
|
|
97
|
-
| `
|
|
98
|
-
| `
|
|
99
|
-
| `
|
|
100
|
-
| `
|
|
101
|
-
| `
|
|
102
|
-
| `
|
|
103
|
-
| `
|
|
104
|
-
|
|
105
|
-
`
|
|
106
|
-
wraps the CLI and defaults to `link`; `
|
|
82
|
+
| `grid_init` | `cloudgrid init` | Register an app or agent; optionally seed a web service. |
|
|
83
|
+
| `grid_logs` | `cloudgrid logs` | Snapshot of recent logs. Does not stream. Read-only. |
|
|
84
|
+
| `grid_share` | `cloudgrid visibility set` | Set visibility, default link. |
|
|
85
|
+
| `grid_feedback` | `cloudgrid feedback list` | Read the org feedback feed. Read-only. |
|
|
86
|
+
| `grid_whoami` | `cloudgrid whoami` | Show the signed-in user and active org. Read-only. |
|
|
87
|
+
| `grid_use` | `cloudgrid use` | Switch the active org. |
|
|
88
|
+
| `grid_logout` | `cloudgrid logout` | Sign out and clear local credentials. Destructive. |
|
|
89
|
+
| `grid_status` | `cloudgrid status` | Org dashboard or entity detail. Read-only. |
|
|
90
|
+
| `grid_info` | `cloudgrid info` | Entity metadata. Read-only. |
|
|
91
|
+
| `grid_get` | `cloudgrid get grids\|entities\|spaces` | List grids, entities, or spaces. Read-only. |
|
|
92
|
+
| `grid_describe_grid` | `cloudgrid describe grid <slug>` | Grid detail. Read-only. |
|
|
93
|
+
| `grid_pickup` | `cloudgrid pickup <name>` | Download an entity's source and bind the folder. |
|
|
94
|
+
| `grid_rename` | `cloudgrid rename` | Rename an entity's display name. |
|
|
95
|
+
| `grid_unplug` | `cloudgrid unplug` | Take an entity off the grid. Destructive; requires confirm. |
|
|
96
|
+
| `grid_delete` | `cloudgrid delete entity` | Archive an inspiration. Destructive; requires confirm. |
|
|
97
|
+
| `grid_rollback` | `cloudgrid rollback` | Rollback to a previous version. |
|
|
98
|
+
| `grid_versions` | `cloudgrid versions` | List published versions. Read-only. |
|
|
99
|
+
| `grid_env` | `cloudgrid env` | Get, set, or list environment variables. |
|
|
100
|
+
| `grid_secrets` | `cloudgrid secrets` | Set or list secret names. Never returns secret values. |
|
|
101
|
+
| `grid_scaffold` | `cloudgrid scaffold` | Generate starter files. |
|
|
102
|
+
| `grid_doctor` | `cloudgrid doctor` | Run local diagnostics. Read-only. |
|
|
103
|
+
| `grid_open` | `cloudgrid open --print` | Return the public URL. Does not open a browser. Read-only. |
|
|
104
|
+
|
|
105
|
+
`grid_share` and `grid_visibility` overlap on purpose: `grid_share`
|
|
106
|
+
wraps the CLI and defaults to `link`; `grid_visibility` is direct API, takes an
|
|
107
107
|
explicit scope, and defaults its target to the session's last drop -- it is the one
|
|
108
108
|
the web edition gets.
|
|
109
109
|
|
|
@@ -113,7 +113,7 @@ All tools carry MCP annotations (`readOnlyHint`, `destructiveHint`,
|
|
|
113
113
|
## Test
|
|
114
114
|
|
|
115
115
|
A smoke test spawns the server with a real MCP client, lists the tools, and calls
|
|
116
|
-
the read-only `
|
|
116
|
+
the read-only `grid_feedback` tool end to end:
|
|
117
117
|
|
|
118
118
|
```
|
|
119
119
|
cd mcp-server
|
|
@@ -127,5 +127,5 @@ It needs a logged-in CLI on `$PATH`.
|
|
|
127
127
|
|
|
128
128
|
- Shells out with `execFile` and an argument array, so there is no shell and no
|
|
129
129
|
injection surface.
|
|
130
|
-
- `
|
|
130
|
+
- `grid_logs` never uses `--follow`; a streaming call would never return.
|
|
131
131
|
- Stateless. Each call is one CLI invocation.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudgrid-io/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "MCP server for CloudGrid. Three editions: a local stdio server (full toolset), a hosted web server (light, CLI-free toolset), and a public docs server (search_cloudgrid_documentation) over MCP Streamable HTTP.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -4,14 +4,19 @@ This is the index an LLM uses to turn a user request into the right CloudGrid
|
|
|
4
4
|
template, the way Superpowers matches a skill's `when:`. Match the request to a
|
|
5
5
|
template by its `when:` triggers, adopt that template's `needs:`, then deploy:
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
> **One deploy verb: `grid_plug`.** Classify the artifact to pick the shape —
|
|
8
|
+
> ONE self-contained HTML page (CSS+JS inline, images/fonts as data: URIs) →
|
|
9
|
+
> **inspiration**; separate files/folders/assets or any `needs:` → **runtime app**.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
- **single self-contained HTML page → inspiration** (instant, any client / any
|
|
12
|
+
edition) via `grid_plug` with the inline `html` param.
|
|
13
|
+
- **separate files/folders/assets, or anything needing `needs:` → runtime app**
|
|
14
|
+
(async build, **local edition** only) via `grid_plug` on a linked folder.
|
|
15
|
+
|
|
16
|
+
Fetch this doc any time with `grid_fetch("doc", "capability-map")`. For the full
|
|
12
17
|
cloudgrid.yaml schema (every field, the `needs:` injection table, the
|
|
13
18
|
requires-vs-needs caveat, validation rules), fetch the companion reference:
|
|
14
|
-
`
|
|
19
|
+
`grid_fetch("doc", "cloudgrid-yaml")`.
|
|
15
20
|
|
|
16
21
|
## The 59 templates
|
|
17
22
|
|
|
@@ -137,7 +142,7 @@ chunks in Mongo and cosine-rank in-app until it lands.
|
|
|
137
142
|
`needs:` is a MAP declaring infrastructure capabilities. Values are `true` or an
|
|
138
143
|
engine hint. Cron is NOT a need — it is a **service type** (`type: cron` with
|
|
139
144
|
`schedule` + `timezone`). See the full cloudgrid.yaml reference §5–§6 via
|
|
140
|
-
`
|
|
145
|
+
`grid_fetch("doc", "cloudgrid-yaml")`.
|
|
141
146
|
|
|
142
147
|
| `needs:` key | Provides | Injected env var(s) | Status |
|
|
143
148
|
|---|---|---|---|
|
|
@@ -173,9 +178,10 @@ engine hint. Cron is NOT a need — it is a **service type** (`type: cron` with
|
|
|
173
178
|
`api-service`); talks to an LLM → `ai: true` + `database` (`ai-app`); scheduled
|
|
174
179
|
work → a `type: cron` service (Python/Node, supported on 0.14.0). (Held for now:
|
|
175
180
|
RAG's ideal `vector: pgvector`, #1545 — store embeddings in Mongo until it lands.)
|
|
176
|
-
3.
|
|
177
|
-
|
|
178
|
-
|
|
181
|
+
3. One self-contained HTML page (`needs: none`, assets inlined) → publish as an
|
|
182
|
+
inspiration with `grid_plug` and the inline `html` param (instant, any
|
|
183
|
+
edition). Separate files/folders/assets, or anything with a `needs:` →
|
|
184
|
+
runtime, local edition, `grid_plug` a linked folder, then poll to a live URL.
|
|
179
185
|
|
|
180
186
|
## FAQ
|
|
181
187
|
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
> of that reference — practically complete, not a verbatim dump. **Keep in sync**
|
|
6
6
|
> with the upstream: when the platform reference changes, update this doc.
|
|
7
7
|
>
|
|
8
|
-
> Fetch this doc any time with `
|
|
8
|
+
> Fetch this doc any time with `grid_fetch("doc", "cloudgrid-yaml")`.
|
|
9
9
|
> For matching an intent to a template, see the companion
|
|
10
|
-
> `
|
|
10
|
+
> `grid_fetch("doc", "capability-map")`.
|
|
11
11
|
|
|
12
12
|
`cloudgrid.yaml` is the manifest at the **root of your project** that defines your
|
|
13
13
|
entity (an app or an agent). It declares the services your entity runs, the
|
|
@@ -25,10 +25,11 @@ new yaml with it.
|
|
|
25
25
|
|
|
26
26
|
These are the shapes verified against live deploys. Copy one and adapt it.
|
|
27
27
|
|
|
28
|
-
###
|
|
28
|
+
### Single HTML page → deploys as an inspiration (instant)
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
`
|
|
30
|
+
One self-contained HTML page (CSS+JS inline, images/fonts as data: URIs). No
|
|
31
|
+
`needs:`. Publishes instantly via `grid_plug` with the inline `html` param,
|
|
32
|
+
works on any edition (hosted or local).
|
|
32
33
|
|
|
33
34
|
```yaml
|
|
34
35
|
name: landing-page
|
|
@@ -540,8 +541,9 @@ Bake these into any yaml you author:
|
|
|
540
541
|
it**; use `needs:` instead.
|
|
541
542
|
- **`needs:` and `requires:` together are HARD-REJECTED** by the validator ("use
|
|
542
543
|
one or the other"). So author **`needs:`-only** — never set both.
|
|
543
|
-
- **
|
|
544
|
-
synchronous, works on the hosted edition
|
|
544
|
+
- **A single self-contained HTML page deploys as an inspiration** via `grid_plug`
|
|
545
|
+
with the inline `html` param — instant, synchronous, works on the hosted edition
|
|
546
|
+
and any client.
|
|
545
547
|
- **A `cloudgrid.yaml` with `services:` makes it a runtime** — async build,
|
|
546
548
|
**local edition only** (Claude Desktop/Code or the CLI, not hosted). `plug`
|
|
547
549
|
returns `status: building`; poll status until live, then use the returned live
|
|
@@ -565,5 +567,5 @@ needs:
|
|
|
565
567
|
---
|
|
566
568
|
|
|
567
569
|
*This doc is the agent-facing distribution of the platform's canonical
|
|
568
|
-
`cloudgrid-yaml-reference.md`. See also `
|
|
570
|
+
`cloudgrid-yaml-reference.md`. See also `grid_fetch("doc", "capability-map")`
|
|
569
571
|
for matching a user intent to a template + the `needs:` injection status.*
|
package/src/corpus/cookbook.md
CHANGED
|
@@ -72,10 +72,10 @@ curl -sS -X POST https://api.cloudgrid.io/api/v2/plug \
|
|
|
72
72
|
```
|
|
73
73
|
|
|
74
74
|
The response includes `url` (the live link — use it verbatim), `entity_id`,
|
|
75
|
-
`owner_token` (keep both to update the
|
|
76
|
-
before it expires to keep it). This is what the `cloudgrid
|
|
77
|
-
`
|
|
78
|
-
only; a full app needs the signed-in `plug` flow above.
|
|
75
|
+
`owner_token` (keep both to update the page later), and `claim_url` (sign in
|
|
76
|
+
before it expires to keep it). This is what the `cloudgrid:plug` skill and the
|
|
77
|
+
`grid_plug` MCP tool (inline `html` param) do for you. It is anonymous and serves
|
|
78
|
+
inspirations only; a full app needs the signed-in `plug` flow above.
|
|
79
79
|
|
|
80
80
|
## Update your drop in place
|
|
81
81
|
|
|
@@ -31,11 +31,10 @@ Do not attempt to log in for them. Do not invent an auth flow.
|
|
|
31
31
|
The skills live in this repo, one directory per skill, each with a `SKILL.md`.
|
|
32
32
|
Load the `SKILL.md` for the action the user wants:
|
|
33
33
|
|
|
34
|
-
- `skills/drop/SKILL.md` — share an artifact, get a URL (no login needed)
|
|
35
34
|
- `skills/login/SKILL.md` — sign in, with or without the CLI
|
|
36
35
|
- `skills/claim/SKILL.md` — claim an anonymous drop into the account
|
|
37
36
|
- `skills/init/SKILL.md` — scaffold a new app or agent
|
|
38
|
-
- `skills/plug/SKILL.md` — deploy a directory
|
|
37
|
+
- `skills/plug/SKILL.md` — share a single HTML page or deploy a directory/URL, get a URL
|
|
39
38
|
- `skills/logs/SKILL.md` — tail logs
|
|
40
39
|
- `skills/share/SKILL.md` — make an entity shareable
|
|
41
40
|
- `skills/feedback/SKILL.md` — read the feedback feed
|
package/src/corpus/install.md
CHANGED
|
@@ -140,7 +140,7 @@ https://github.com/cloudgrid-io/mcp/releases/latest/download/cloudgrid.mcpb
|
|
|
140
140
|
|
|
141
141
|
The bundle carries the full local toolset (including the `cloudgrid` CLI), so deploy
|
|
142
142
|
and secrets tools work without a separate install. Sign in from chat with the
|
|
143
|
-
`
|
|
143
|
+
`grid_login` tool on first use.
|
|
144
144
|
|
|
145
145
|
## For agents
|
|
146
146
|
|
|
@@ -14,7 +14,7 @@ loops forever.
|
|
|
14
14
|
|
|
15
15
|
This is a known platform issue, not a mistake in your request. Do not retry with
|
|
16
16
|
different flag or path permutations — they will all fail the same way. If a
|
|
17
|
-
terminal is available, deploy from the CLI instead (`
|
|
17
|
+
terminal is available, deploy from the CLI instead (`grid plug <path>` or
|
|
18
18
|
`cloudgrid plug <path>`). If no terminal is available, stop and tell the user
|
|
19
19
|
this is a known issue and needs the CLI.
|
|
20
20
|
|
|
@@ -69,5 +69,5 @@ new_expires_at, role_granted: "owner", ... }`.
|
|
|
69
69
|
## Notes
|
|
70
70
|
|
|
71
71
|
- One pickup claims one entity. To claim several, repeat with each entity id + token.
|
|
72
|
-
- The MCP `
|
|
72
|
+
- The MCP `grid_claim` tool does this for you, and remembers the entity id +
|
|
73
73
|
token from the last anonymous drop so you can claim with no arguments.
|
|
@@ -81,6 +81,6 @@ made an anonymous drop earlier, this is the moment to offer to claim it.
|
|
|
81
81
|
|
|
82
82
|
- Enterprise single sign-on is not supported in this flow yet; those users sign in
|
|
83
83
|
through the Console for now.
|
|
84
|
-
- The MCP server exposes the same flow as `
|
|
85
|
-
`
|
|
84
|
+
- The MCP server exposes the same flow as `grid_login` and
|
|
85
|
+
`grid_login_status`, which handle the polling and the credentials write for
|
|
86
86
|
you.
|
package/src/corpus/skill-plug.md
CHANGED
|
@@ -1,18 +1,81 @@
|
|
|
1
1
|
---
|
|
2
|
-
version: 0.
|
|
2
|
+
version: 0.3.0
|
|
3
3
|
name: plug
|
|
4
4
|
description: |
|
|
5
|
-
Deploy a
|
|
6
|
-
publish,
|
|
7
|
-
|
|
5
|
+
Deploy or share a creation on CloudGrid and get a public URL. Use when the user
|
|
6
|
+
wants to ship, deploy, publish, share, send a friend a link, or go live — a
|
|
7
|
+
single HTML page or a full app. One self-contained HTML page publishes instantly
|
|
8
|
+
as an inspiration (any edition, no login needed); a multi-file app deploys from a
|
|
9
|
+
directory or URL. Wraps cloudgrid plug.
|
|
8
10
|
argument-hint: "[path-or-url]"
|
|
9
11
|
allowed-tools: Bash
|
|
10
12
|
---
|
|
11
13
|
|
|
12
14
|
# CloudGrid Plug
|
|
13
15
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
Deploy or share a creation and get a public URL. This is the one deploy/share verb
|
|
17
|
+
— a single HTML page or a full app — and the center of the build-and-ship loop.
|
|
18
|
+
|
|
19
|
+
## Classify the artifact first
|
|
20
|
+
|
|
21
|
+
- **ONE self-contained HTML page** (a single file — CSS+JS inline, images/fonts as
|
|
22
|
+
data: URIs; the normal hosted output) → an **inspiration**: instant, works on
|
|
23
|
+
**any edition**, no login required. See "Share a single HTML page" below.
|
|
24
|
+
- **Anything more** — separate files/folders, a real `assets/` dir, separate
|
|
25
|
+
`.css`/`.js`, multiple pages, a SPA build — **or** any data/server/LLM/cron need
|
|
26
|
+
→ a **runtime app**: `cloudgrid plug` on a linked folder, **local edition only**,
|
|
27
|
+
async build. See "Deploy an app" below.
|
|
28
|
+
|
|
29
|
+
## Share a single HTML page (the fast path)
|
|
30
|
+
|
|
31
|
+
No account and no CLI needed — that is the point: anyone can publish a page. Write
|
|
32
|
+
the page to a single self-contained HTML file (a full document starting with
|
|
33
|
+
`<!doctype html>` or `<html>`; wrap a fragment in a minimal document). HTML is
|
|
34
|
+
capped at 2 MB for anonymous publishes. Then POST it to the unified plug endpoint:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
curl -sS -X POST https://api.cloudgrid.io/api/v2/plug \
|
|
38
|
+
-F "artifact=@/path/to/index.html;type=text/html"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
The response is JSON (HTTP 201 anonymous). Read these fields:
|
|
42
|
+
|
|
43
|
+
- `url` — the live link, composed by the server. Use it verbatim; never compose a
|
|
44
|
+
URL from the slug yourself.
|
|
45
|
+
- `entity_id` — the durable handle for updating this page later (see re-plug below).
|
|
46
|
+
- `owner_token` — a JWT proving you made this page. It authorizes an anonymous
|
|
47
|
+
re-plug and doubles as the claim token; its lifetime matches the expiry (default
|
|
48
|
+
7 days). Persist it with `entity_id` and `url`.
|
|
49
|
+
- `claim_url` / `claim_message` — the link + nudge to sign in and keep it past expiry.
|
|
50
|
+
|
|
51
|
+
Signed in, publish into your own grid instead (owned, no claim needed):
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
JWT=$(jq -r .jwt ~/.cloudgrid/credentials 2>/dev/null)
|
|
55
|
+
ORG=$(grep -E '^\s*active_org_slug:' ~/.cloudgrid/config.yaml | awk '{print $2}')
|
|
56
|
+
curl -sS -X POST https://api.cloudgrid.io/api/v2/plug \
|
|
57
|
+
-H "Authorization: Bearer $JWT" -H "X-CloudGrid-Org: $ORG" \
|
|
58
|
+
-F "artifact=@/path/to/index.html;type=text/html"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The MCP `grid_plug` tool does all of this for you: pass the page as its inline
|
|
62
|
+
`html` param (it materializes one `index.html` and handles anon/claim/re-plug).
|
|
63
|
+
|
|
64
|
+
### Re-plug: update the same URL in place
|
|
65
|
+
|
|
66
|
+
`/api/v2/plug` is a unified create-or-update endpoint. The switch is the
|
|
67
|
+
`target_entity_id` form field: absent → create (new URL); present → update the
|
|
68
|
+
SAME entity (same slug, same URL, new content). Anonymously, prove ownership with
|
|
69
|
+
the `owner_token`; signed in, use your normal auth headers. Every anonymous edit
|
|
70
|
+
REFRESHES the `owner_token` (store the newest) and resets the expiry. Editing an
|
|
71
|
+
archived/expired page returns **409 `EDIT_REJECTED`** — it never silently creates.
|
|
72
|
+
|
|
73
|
+
Print the `url` on its own line so it can be copied in one go. A single page is an
|
|
74
|
+
**inspiration only** — a full app needs the deploy flow below.
|
|
75
|
+
|
|
76
|
+
## Deploy an app
|
|
77
|
+
|
|
78
|
+
Wraps `cloudgrid plug`. Prints the live URL when it is done.
|
|
16
79
|
|
|
17
80
|
## Step 0 — Bootstrap
|
|
18
81
|
|
|
@@ -33,13 +33,13 @@ behalf: scaffold, deploy, tail logs, share, read feedback. Everything here is fr
|
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
One install wires up everything: the skills, the SessionStart orientation
|
|
36
|
-
hook, and the CloudGrid MCP server (`
|
|
36
|
+
hook, and the CloudGrid MCP server (`grid_start`, `grid_fetch`, and the
|
|
37
37
|
CLI-wrapping tools). The MCP auto-starts when the plugin is enabled — no
|
|
38
38
|
separate `claude mcp add` needed.
|
|
39
39
|
|
|
40
|
-
The skills show under `/plugin` and `/skills` as `cloudgrid:
|
|
41
|
-
`cloudgrid:login`, … — or just say what you want ("
|
|
42
|
-
|
|
40
|
+
The skills show under `/plugin` and `/skills` as `cloudgrid:plug`,
|
|
41
|
+
`cloudgrid:login`, … — or just say what you want ("share this HTML page as a
|
|
42
|
+
link") and the right one triggers.
|
|
43
43
|
|
|
44
44
|
Or install with the `gh skill` extension:
|
|
45
45
|
|
|
@@ -48,7 +48,7 @@ behalf: scaffold, deploy, tail logs, share, read feedback. Everything here is fr
|
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
Other agents (Cursor, Cline, Gemini CLI): `npx skills add cloudgrid-io/skills`.
|
|
51
|
-
They install as `
|
|
51
|
+
They install as `plug`, `login`, … — the CloudGrid brand comes from the plugin
|
|
52
52
|
namespace, which those agents don't have.
|
|
53
53
|
|
|
54
54
|
Claude Desktop, claude.ai, ChatGPT, and every route in one place: [USAGE.md](USAGE.md).
|
|
@@ -56,21 +56,21 @@ behalf: scaffold, deploy, tail logs, share, read feedback. Everything here is fr
|
|
|
56
56
|
## Share something in one step, no login
|
|
57
57
|
|
|
58
58
|
```
|
|
59
|
-
/cloudgrid:
|
|
59
|
+
/cloudgrid:plug index.html
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
`cloudgrid:
|
|
63
|
-
|
|
62
|
+
`cloudgrid:plug` publishes a single HTML page (or deploys a full app) and hands
|
|
63
|
+
back a public URL. For a single page: no account, no CLI — the link lasts 7 days,
|
|
64
|
+
and you can sign in later to keep it.
|
|
64
65
|
|
|
65
66
|
## Skills
|
|
66
67
|
|
|
67
68
|
| Skill | Invoke | What it does |
|
|
68
69
|
|---|---|---|
|
|
69
|
-
| `drop` | `/cloudgrid:drop` | Share an HTML page or file, get a public URL. Login optional. |
|
|
70
70
|
| `login` | `/cloudgrid:login` | Sign in to CloudGrid, with or without the CLI. |
|
|
71
71
|
| `claim` | `/cloudgrid:claim` | Claim an anonymous drop into your account after signing in. |
|
|
72
72
|
| `init` | `/cloudgrid:init` | Scaffold a new app or agent. |
|
|
73
|
-
| `plug` | `/cloudgrid:plug` |
|
|
73
|
+
| `plug` | `/cloudgrid:plug` | Share a single HTML page (login optional) or deploy a directory/URL. Get a public URL. |
|
|
74
74
|
| `logs` | `/cloudgrid:logs` | Tail logs for an entity. |
|
|
75
75
|
| `share` | `/cloudgrid:share` | Make an entity shareable and print its URL. |
|
|
76
76
|
| `feedback` | `/cloudgrid:feedback` | Read the feedback feed. |
|
|
@@ -208,7 +208,7 @@ Runtime app → **local edition** only (Claude Desktop / Claude Code / CLI); the
|
|
|
208
208
|
hosted edition cannot build a runtime container. Order matters — `plug` needs a
|
|
209
209
|
linked directory, so `init` first.
|
|
210
210
|
|
|
211
|
-
1. `grid init` (or `
|
|
211
|
+
1. `grid init` (or `grid_init`) an app `<name>` — creates the entity +
|
|
212
212
|
`.cloudgrid/link.json` and a starter `cloudgrid.yaml` with empty `services:{}`.
|
|
213
213
|
2. Fill: put the app under `services/web/` and set `cloudgrid.yaml` to this
|
|
214
214
|
blueprint's active fields (`services.web` nextjs `/`, `needs:{ai:true,
|
|
@@ -11,7 +11,7 @@ the app following it.
|
|
|
11
11
|
`AGENTS.md`. Fetch the bundle, read `AGENTS.md`, then generate the files under
|
|
12
12
|
`services/web/` and deploy.
|
|
13
13
|
|
|
14
|
-
- **Structure guide:** `
|
|
14
|
+
- **Structure guide:** `grid_fetch("template", "ai-knowledge-base")` → read
|
|
15
15
|
**`AGENTS.md`** (file tree, Mongo collections, CloudGrid injection table, the
|
|
16
16
|
RAG loop, the pgvector #1545 note, optional auth/payments, deploy steps).
|
|
17
17
|
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
A single self-contained HTML API reference: a sidebar endpoint list, per-endpoint method badges (GET / POST / PUT / DELETE), a params table, and request / response examples in code blocks.
|
|
4
4
|
|
|
5
5
|
Static inspiration — a single self-contained `index.html` (inline CSS and JS,
|
|
6
|
-
no external CDNs). It deploys instantly via `
|
|
6
|
+
no external CDNs). It deploys instantly via `grid_plug` and works on every
|
|
7
7
|
CloudGrid edition, including hosted.
|
|
8
8
|
|
|
9
9
|
## Fill it in
|
|
10
10
|
|
|
11
|
-
Fetch the template with `
|
|
11
|
+
Fetch the template with `grid_fetch("template", "api-docs")`, then replace the
|
|
12
12
|
placeholders:
|
|
13
13
|
|
|
14
14
|
- The API name, base URL, and auth note.
|
|
@@ -22,7 +22,7 @@ stylesheets, fonts, or large embedded media.
|
|
|
22
22
|
## Deploy
|
|
23
23
|
|
|
24
24
|
- Hosted MCP edition: call the drop tool with the HTML.
|
|
25
|
-
- Local MCP / CLI edition: write the HTML to a file and run `
|
|
25
|
+
- Local MCP / CLI edition: write the HTML to a file and run `grid plug`.
|
|
26
26
|
|
|
27
27
|
It deploys as an inspiration and returns a live share URL right away. Re-deploy
|
|
28
28
|
with the same entity id to update the same URL.
|
|
@@ -5,14 +5,13 @@ State (if any) lives only in memory and is lost on refresh.
|
|
|
5
5
|
|
|
6
6
|
## How it deploys
|
|
7
7
|
|
|
8
|
-
To publish this page, use **`
|
|
9
|
-
HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
|
|
8
|
+
To publish this page, use **`grid_plug`** with the inline `html`: it deploys as an **inspiration** — instant, and works on the **hosted**
|
|
10
9
|
edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
|
|
11
10
|
directory (`type: static`) is ONLY for plugging the page as an OWNED static
|
|
12
|
-
runtime (async, local edition only); the fast path is `
|
|
11
|
+
runtime (async, local edition only); the fast path is `grid_plug`.
|
|
13
12
|
|
|
14
13
|
The fillable HTML is the real template — fetch it with
|
|
15
|
-
`
|
|
14
|
+
`grid_fetch("template", "api-docs")` and fill in the user's content.
|
|
16
15
|
|
|
17
16
|
## cloudgrid.yaml (reference only)
|
|
18
17
|
|
|
@@ -12,7 +12,7 @@ what make it deploy.
|
|
|
12
12
|
The proven persistent shape is `app-with-data` (Next.js + Mongo). This blueprint
|
|
13
13
|
extends it with auth, availability/slot logic, and optional Stripe deposits.
|
|
14
14
|
Fetch that template for the Mongo lazy-client and App-Router API pattern:
|
|
15
|
-
`
|
|
15
|
+
`grid_fetch("template", "app-with-data")`.
|
|
16
16
|
|
|
17
17
|
## 1. File tree
|
|
18
18
|
|
|
@@ -102,7 +102,7 @@ clients racing for the same slot cannot both win.
|
|
|
102
102
|
STRIPE_KEY: stripe-live-key # only if you take deposits
|
|
103
103
|
STRIPE_WEBHOOK_SECRET: stripe-webhook-secret # only if you take deposits
|
|
104
104
|
```
|
|
105
|
-
Set the vault items ONCE with `
|
|
105
|
+
Set the vault items ONCE with `grid_secrets` (or `grid secrets set`), then
|
|
106
106
|
the deployer injects each as the named env var (`process.env.AUTH_PROVIDER_KEY`,
|
|
107
107
|
`process.env.STRIPE_KEY`, …) at runtime and under `grid dev`. Do NOT commit
|
|
108
108
|
keys; do NOT set secrets in `services.web.env` (that block is for non-secret
|
|
@@ -161,21 +161,21 @@ you want client accounts.
|
|
|
161
161
|
|
|
162
162
|
## 5. Deploy steps
|
|
163
163
|
|
|
164
|
-
1. `
|
|
164
|
+
1. `grid_login_status` → `grid_login` if needed. Respect the grid picker
|
|
165
165
|
(ask which grid if the user has more than one).
|
|
166
|
-
2. `
|
|
166
|
+
2. `grid_init` an app `<name>` FIRST — it creates the entity, writes
|
|
167
167
|
`.cloudgrid/link.json`, and a `cloudgrid.yaml` with empty `services: {}`.
|
|
168
168
|
`plug` needs a linked directory.
|
|
169
169
|
3. Write the app under `services/web/` and set `cloudgrid.yaml` to the active
|
|
170
170
|
shape: `name` + `services.web{type: nextjs, path: /}` + `needs:{database:true}`
|
|
171
171
|
+ the `vault:` block. (Leave the `reminders` cron service COMMENTED — see §7.)
|
|
172
|
-
4. Set the secrets: `
|
|
172
|
+
4. Set the secrets: `grid_secrets` for `auth-provider-key` (and, if taking
|
|
173
173
|
deposits, `stripe-live-key`, `stripe-webhook-secret` — the vault item keys the
|
|
174
174
|
`vault:` block maps from). Non-secret config (auth publishable key, price ids)
|
|
175
|
-
→ `
|
|
175
|
+
→ `grid_env` / `services.web.env`. Do NOT set `DATABASE_MONGODB_URL`
|
|
176
176
|
yourself — the grid injects it.
|
|
177
|
-
5. `
|
|
178
|
-
is `status: building`, not a live URL. Poll `
|
|
177
|
+
5. `grid_plug` to deploy. A runtime deploy is **ASYNC** — the first response
|
|
178
|
+
is `status: building`, not a live URL. Poll `grid_status` (or the returned
|
|
179
179
|
poll_url) until live; surface a liveness signal while it builds, never a bare
|
|
180
180
|
silent wait.
|
|
181
181
|
6. If taking deposits, once live add the `/api/webhook` URL as the Stripe webhook
|
|
@@ -188,7 +188,7 @@ An appointment-booking app is a built + deployed runtime container, so it
|
|
|
188
188
|
requires the **local edition** (Claude Desktop / Claude Code) or the CLI. The
|
|
189
189
|
**hosted** edition (Claude Web / hosted MCP) is inline-only and can only publish
|
|
190
190
|
static pages — it CANNOT build this app. On hosted, say so plainly and offer a
|
|
191
|
-
static "book us" landing page (via `
|
|
191
|
+
static "book us" landing page (via `grid_plug`) instead, then stop the runtime
|
|
192
192
|
path.
|
|
193
193
|
|
|
194
194
|
## 7. Reminders (cron — PENDING platform issue #1543)
|
|
@@ -10,8 +10,8 @@ the providers/services/slot rules, then deploy (async — poll to a live URL).
|
|
|
10
10
|
Local edition only.
|
|
11
11
|
|
|
12
12
|
**Fetch the bundle:**
|
|
13
|
-
- `
|
|
14
|
-
- `
|
|
13
|
+
- `grid_fetch("template", "appointment-booking")` — this blueprint (`cloudgrid.yaml` + `AGENTS.md`).
|
|
14
|
+
- `grid_fetch("template", "app-with-data")` — the proven Next.js + Mongo shape to extend (lazy db client, App-Router API).
|
|
15
15
|
|
|
16
16
|
**Key rules:**
|
|
17
17
|
|
|
@@ -26,7 +26,7 @@ Local edition only.
|
|
|
26
26
|
the getter, never at module top level (top-level read fails `next build`).
|
|
27
27
|
4. **Secrets via the `vault:` block** → env vars. `AUTH_PROVIDER_KEY` (and, for
|
|
28
28
|
deposits, `STRIPE_KEY` / `STRIPE_WEBHOOK_SECRET`) map to vault items; set them
|
|
29
|
-
with `
|
|
29
|
+
with `grid_secrets`, and the deployer injects them at runtime. Read lazily;
|
|
30
30
|
do not commit keys or put secrets in `services.web.env`.
|
|
31
31
|
5. **No double-booking.** `appointments` is the source of truth for "taken";
|
|
32
32
|
compute open slots as availability minus booked, re-check at write time, and
|
|
@@ -65,8 +65,8 @@ vault:
|
|
|
65
65
|
|
|
66
66
|
## Deploy (async, local edition)
|
|
67
67
|
|
|
68
|
-
`
|
|
69
|
-
`services/web/`, set the vault secrets with `
|
|
70
|
-
(async — poll `
|
|
68
|
+
`grid_init` first (creates the entity + link.json), write the app under
|
|
69
|
+
`services/web/`, set the vault secrets with `grid_secrets`, `grid_plug`
|
|
70
|
+
(async — poll `grid_status` to a live URL). If taking deposits, register the
|
|
71
71
|
`/api/webhook` URL in Stripe and re-plug. Re-plug the same entity to update the
|
|
72
72
|
same URL.
|
|
@@ -9,7 +9,7 @@ then build the Next.js + Mongo app on the grid following the shape below.
|
|
|
9
9
|
The proven base shape is `app-with-data` (Next.js + Mongo, App Router, lazy DB
|
|
10
10
|
getter). This blueprint extends it with a state machine, roles, and
|
|
11
11
|
notifications. Fetch that template for the concrete Mongo/CRUD wiring:
|
|
12
|
-
`
|
|
12
|
+
`grid_fetch("template", "app-with-data")`, then adapt it to the collections
|
|
13
13
|
here.
|
|
14
14
|
|
|
15
15
|
## 1. File tree
|
|
@@ -146,7 +146,7 @@ routes and the UI agree on what is legal.
|
|
|
146
146
|
|
|
147
147
|
## 6. Deploy steps
|
|
148
148
|
|
|
149
|
-
1. `
|
|
149
|
+
1. `grid_init` an app `<name>` — creates the entity, `.cloudgrid/link.json`,
|
|
150
150
|
and a `cloudgrid.yaml` with an empty `services: {}`. Run `init` FIRST because
|
|
151
151
|
`plug` needs a linked directory.
|
|
152
152
|
2. Fill `cloudgrid.yaml` to this blueprint's shape (copy this template's file):
|
|
@@ -14,14 +14,14 @@ machine, and CloudGrid wiring, then build the app under `services/web/`.
|
|
|
14
14
|
|
|
15
15
|
## Fetch bundle
|
|
16
16
|
|
|
17
|
-
- `
|
|
17
|
+
- `grid_fetch("template", "approval-workflow")` → this blueprint:
|
|
18
18
|
- `AGENTS.md` — file tree, Mongo collections (`users`, `requests`, `steps`,
|
|
19
19
|
`audit`), the state machine, auth/payments wiring, deploy steps, edition note.
|
|
20
20
|
- `cloudgrid.yaml` — the full-annotated reference with only `name`,
|
|
21
21
|
`services.web { type: nextjs, path: / }`, and `needs: { database: true }`
|
|
22
22
|
active, plus a commented `vault:` block for `AUTH_PROVIDER_KEY`.
|
|
23
23
|
- `README.md` — one-paragraph what/why.
|
|
24
|
-
- `
|
|
24
|
+
- `grid_fetch("template", "app-with-data")` → the concrete Next.js + Mongo
|
|
25
25
|
CRUD wiring (lazy `lib/db.js`, App Router route, server page) to adapt from.
|
|
26
26
|
|
|
27
27
|
## Key rules
|
|
@@ -80,7 +80,7 @@ needs:
|
|
|
80
80
|
|
|
81
81
|
## Build it
|
|
82
82
|
|
|
83
|
-
Fetch `
|
|
83
|
+
Fetch `grid_fetch("template", "billing-dashboard")` and read **`AGENTS.md`** — it
|
|
84
84
|
has the checkout + webhook + usage wiring, the vault/secret setup, and the deploy
|
|
85
85
|
steps (`grid init` → write under `services/web/` → `grid secrets set` → `grid plug`,
|
|
86
86
|
async → poll to a live URL → register the webhook endpoint in Stripe). Adapt the
|