@cloudgrid-io/mcp 0.16.1 → 0.17.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.
Files changed (133) hide show
  1. package/README.md +39 -39
  2. package/package.json +1 -1
  3. package/src/corpus/capability-map.md +7 -7
  4. package/src/corpus/cloudgrid-yaml.md +5 -5
  5. package/src/corpus/cookbook.md +1 -1
  6. package/src/corpus/install.md +1 -1
  7. package/src/corpus/rules/publish-fallbacks.md +1 -1
  8. package/src/corpus/skill-claim.md +1 -1
  9. package/src/corpus/skill-drop.md +2 -2
  10. package/src/corpus/skill-login.md +2 -2
  11. package/src/corpus/skills-readme.md +1 -1
  12. package/src/corpus/templates/ai-knowledge-base/AGENTS.md +1 -1
  13. package/src/corpus/templates/ai-knowledge-base/index.md +1 -1
  14. package/src/corpus/templates/api-docs/README.md +3 -3
  15. package/src/corpus/templates/api-docs/index.md +3 -3
  16. package/src/corpus/templates/appointment-booking/AGENTS.md +9 -9
  17. package/src/corpus/templates/appointment-booking/index.md +6 -6
  18. package/src/corpus/templates/approval-workflow/AGENTS.md +2 -2
  19. package/src/corpus/templates/approval-workflow/index.md +2 -2
  20. package/src/corpus/templates/billing-dashboard/index.md +1 -1
  21. package/src/corpus/templates/calendar-scheduler/AGENTS.md +1 -1
  22. package/src/corpus/templates/calendar-scheduler/index.md +1 -1
  23. package/src/corpus/templates/changelog/README.md +3 -3
  24. package/src/corpus/templates/changelog/index.md +3 -3
  25. package/src/corpus/templates/company-website/README.md +3 -3
  26. package/src/corpus/templates/company-website/cloudgrid.yaml +1 -1
  27. package/src/corpus/templates/company-website/index.md +3 -3
  28. package/src/corpus/templates/course-platform/index.md +1 -1
  29. package/src/corpus/templates/dashboard/cloudgrid.yaml +1 -1
  30. package/src/corpus/templates/dashboard/index.md +3 -3
  31. package/src/corpus/templates/deck/cloudgrid.yaml +1 -1
  32. package/src/corpus/templates/deck/index.md +3 -3
  33. package/src/corpus/templates/docs-site/README.md +3 -3
  34. package/src/corpus/templates/docs-site/index.md +3 -3
  35. package/src/corpus/templates/forum/AGENTS.md +6 -6
  36. package/src/corpus/templates/forum/index.md +1 -1
  37. package/src/corpus/templates/hr-portal/index.md +1 -1
  38. package/src/corpus/templates/internal-tools-portal/index.md +1 -1
  39. package/src/corpus/templates/landing-page/cloudgrid.yaml +1 -1
  40. package/src/corpus/templates/landing-page/index.md +3 -3
  41. package/src/corpus/templates/lms/index.md +1 -1
  42. package/src/corpus/templates/marketplace/AGENTS.md +1 -1
  43. package/src/corpus/templates/marketplace/index.md +1 -1
  44. package/src/corpus/templates/membership-site/AGENTS.md +9 -9
  45. package/src/corpus/templates/membership-site/index.md +6 -6
  46. package/src/corpus/templates/online-store/index.md +1 -1
  47. package/src/corpus/templates/portfolio/README.md +3 -3
  48. package/src/corpus/templates/portfolio/index.md +3 -3
  49. package/src/corpus/templates/product-launch/README.md +3 -3
  50. package/src/corpus/templates/product-launch/cloudgrid.yaml +1 -1
  51. package/src/corpus/templates/product-launch/index.md +3 -3
  52. package/src/corpus/templates/report/cloudgrid.yaml +1 -1
  53. package/src/corpus/templates/report/index.md +3 -3
  54. package/src/corpus/templates/restaurant-reservations/AGENTS.md +9 -9
  55. package/src/corpus/templates/restaurant-reservations/index.md +2 -2
  56. package/src/corpus/templates/saas-marketing/README.md +3 -3
  57. package/src/corpus/templates/saas-marketing/index.md +3 -3
  58. package/src/corpus/templates/status-page/README.md +3 -3
  59. package/src/corpus/templates/status-page/index.md +3 -3
  60. package/src/corpus/templates/subscription-management/AGENTS.md +9 -9
  61. package/src/corpus/templates/subscription-management/index.md +6 -6
  62. package/src/corpus/templates/waitlist/README.md +3 -3
  63. package/src/corpus/templates/waitlist/index.md +3 -3
  64. package/src/corpus/templates/web-app/cloudgrid.yaml +1 -1
  65. package/src/corpus/templates/web-app/index.md +3 -3
  66. package/src/corpus/troubleshooting/deploy-errors.md +1 -1
  67. package/src/corpus/troubleshooting/persistent-apps.md +1 -1
  68. package/src/corpus/usage.md +2 -2
  69. package/src/corpus/workflows/admin-dashboard.md +6 -6
  70. package/src/corpus/workflows/ai-app.md +8 -8
  71. package/src/corpus/workflows/ai-knowledge-base.md +6 -6
  72. package/src/corpus/workflows/analytics-dashboard.md +6 -6
  73. package/src/corpus/workflows/api-dashboard.md +6 -6
  74. package/src/corpus/workflows/api-docs.md +3 -3
  75. package/src/corpus/workflows/api-service.md +8 -8
  76. package/src/corpus/workflows/app-with-data.md +8 -8
  77. package/src/corpus/workflows/appointment-booking.md +8 -8
  78. package/src/corpus/workflows/approval-workflow.md +6 -6
  79. package/src/corpus/workflows/billing-dashboard.md +8 -8
  80. package/src/corpus/workflows/blog-cms.md +6 -6
  81. package/src/corpus/workflows/booking-system.md +7 -7
  82. package/src/corpus/workflows/calendar-scheduler.md +6 -6
  83. package/src/corpus/workflows/changelog.md +3 -3
  84. package/src/corpus/workflows/company-website.md +4 -4
  85. package/src/corpus/workflows/course-platform.md +7 -7
  86. package/src/corpus/workflows/crm.md +7 -7
  87. package/src/corpus/workflows/dashboard.md +4 -4
  88. package/src/corpus/workflows/directory.md +6 -6
  89. package/src/corpus/workflows/docs-site.md +3 -3
  90. package/src/corpus/workflows/erp.md +7 -7
  91. package/src/corpus/workflows/event-board.md +6 -6
  92. package/src/corpus/workflows/expense-tracker.md +6 -6
  93. package/src/corpus/workflows/feature-request-board.md +6 -6
  94. package/src/corpus/workflows/financial-dashboard.md +6 -6
  95. package/src/corpus/workflows/forum.md +7 -7
  96. package/src/corpus/workflows/hr-portal.md +7 -7
  97. package/src/corpus/workflows/internal-tools-portal.md +7 -7
  98. package/src/corpus/workflows/inventory.md +6 -6
  99. package/src/corpus/workflows/invoice.md +6 -6
  100. package/src/corpus/workflows/job-board.md +6 -6
  101. package/src/corpus/workflows/kanban.md +7 -7
  102. package/src/corpus/workflows/landing-page.md +4 -4
  103. package/src/corpus/workflows/lms.md +7 -7
  104. package/src/corpus/workflows/marketplace.md +6 -6
  105. package/src/corpus/workflows/membership-site.md +8 -8
  106. package/src/corpus/workflows/monitoring-dashboard.md +6 -6
  107. package/src/corpus/workflows/online-store.md +8 -8
  108. package/src/corpus/workflows/portfolio.md +3 -3
  109. package/src/corpus/workflows/presentation.md +4 -4
  110. package/src/corpus/workflows/product-catalog.md +6 -6
  111. package/src/corpus/workflows/product-launch.md +4 -4
  112. package/src/corpus/workflows/project-management.md +6 -6
  113. package/src/corpus/workflows/property-listings.md +6 -6
  114. package/src/corpus/workflows/quiz-platform.md +6 -6
  115. package/src/corpus/workflows/report.md +4 -4
  116. package/src/corpus/workflows/restaurant-reservations.md +7 -7
  117. package/src/corpus/workflows/revenue-dashboard.md +6 -6
  118. package/src/corpus/workflows/saas-marketing.md +3 -3
  119. package/src/corpus/workflows/semantic-search.md +7 -7
  120. package/src/corpus/workflows/status-page.md +3 -3
  121. package/src/corpus/workflows/subscription-management.md +8 -8
  122. package/src/corpus/workflows/task-manager.md +6 -6
  123. package/src/corpus/workflows/ticket-system.md +6 -6
  124. package/src/corpus/workflows/time-tracking.md +6 -6
  125. package/src/corpus/workflows/travel-booking.md +7 -7
  126. package/src/corpus/workflows/waitlist.md +3 -3
  127. package/src/corpus/workflows/web-app.md +4 -4
  128. package/src/docs.js +5 -5
  129. package/src/index.js +1 -1
  130. package/src/tools.js +191 -142
  131. package/src/web.js +1 -1
  132. package/src/widgets/live-result.html +1 -1
  133. package/src/widgets/org-picker.html +1 -1
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
- | `gridctl_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
- | `gridctl_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
- | `gridctl_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
- | `gridctl_fork` | `POST /api/v2/runtimes/:id/fork` | Start a new entity from an existing runtime (lineage recorded). Needs sign-in. |
68
- | `gridctl_download` | `GET /api/v2/runtimes/:id/source` | Signed 15-minute source-bundle URLs. Needs sign-in. |
69
- | `gridctl_login` | `GET /auth/login` | Start a CLI-free sign-in; returns a URL to open. Direct API. |
70
- | `gridctl_login_status` | `GET /auth/status` | Finish the sign-in; saves the token to the shared CLI credentials. |
71
- | `gridctl_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
- `gridctl_drop`, `gridctl_claim`, `gridctl_visibility`, and the two
74
- `gridctl_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. `gridctl_login` writes the same
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
- | `gridctl_init` | `cloudgrid init` | Register an app or agent; optionally seed a web service. |
83
- | `gridctl_logs` | `cloudgrid logs` | Snapshot of recent logs. Does not stream. Read-only. |
84
- | `gridctl_share` | `cloudgrid visibility set` | Set visibility, default link. |
85
- | `gridctl_feedback` | `cloudgrid feedback list` | Read the org feedback feed. Read-only. |
86
- | `gridctl_whoami` | `cloudgrid whoami` | Show the signed-in user and active org. Read-only. |
87
- | `gridctl_use` | `cloudgrid use` | Switch the active org. |
88
- | `gridctl_logout` | `cloudgrid logout` | Sign out and clear local credentials. Destructive. |
89
- | `gridctl_status` | `cloudgrid status` | Org dashboard or entity detail. Read-only. |
90
- | `gridctl_info` | `cloudgrid info` | Entity metadata. Read-only. |
91
- | `gridctl_get` | `cloudgrid get grids\|entities\|spaces` | List grids, entities, or spaces. Read-only. |
92
- | `gridctl_describe_grid` | `cloudgrid describe grid <slug>` | Grid detail. Read-only. |
93
- | `gridctl_pickup` | `cloudgrid pickup <name>` | Download an entity's source and bind the folder. |
94
- | `gridctl_rename` | `cloudgrid rename` | Rename an entity's display name. |
95
- | `gridctl_unplug` | `cloudgrid unplug` | Take an entity off the grid. Destructive; requires confirm. |
96
- | `gridctl_delete` | `cloudgrid delete entity` | Archive an inspiration. Destructive; requires confirm. |
97
- | `gridctl_rollback` | `cloudgrid rollback` | Rollback to a previous version. |
98
- | `gridctl_versions` | `cloudgrid versions` | List published versions. Read-only. |
99
- | `gridctl_env` | `cloudgrid env` | Get, set, or list environment variables. |
100
- | `gridctl_secrets` | `cloudgrid secrets` | Set or list secret names. Never returns secret values. |
101
- | `gridctl_scaffold` | `cloudgrid scaffold` | Generate starter files. |
102
- | `gridctl_doctor` | `cloudgrid doctor` | Run local diagnostics. Read-only. |
103
- | `gridctl_open` | `cloudgrid open --print` | Return the public URL. Does not open a browser. Read-only. |
104
-
105
- `gridctl_share` and `gridctl_visibility` overlap on purpose: `gridctl_share`
106
- wraps the CLI and defaults to `link`; `gridctl_visibility` is direct API, takes an
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 `gridctl_feedback` tool end to end:
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
- - `gridctl_logs` never uses `--follow`; a streaming call would never return.
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.16.1",
3
+ "version": "0.17.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,14 @@ 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
- - **static → inspiration** (instant, any client / any edition) via `gridctl_drop`.
7
+ - **static → inspiration** (instant, any client / any edition) via `grid_drop`.
8
8
  - **anything needing `needs:` → runtime** (async build, **local edition** only)
9
- via `gridctl_plug` on a linked folder.
9
+ via `grid_plug` on a linked folder.
10
10
 
11
- Fetch this doc any time with `gridctl_fetch("doc", "capability-map")`. For the full
11
+ Fetch this doc any time with `grid_fetch("doc", "capability-map")`. For the full
12
12
  cloudgrid.yaml schema (every field, the `needs:` injection table, the
13
13
  requires-vs-needs caveat, validation rules), fetch the companion reference:
14
- `gridctl_fetch("doc", "cloudgrid-yaml")`.
14
+ `grid_fetch("doc", "cloudgrid-yaml")`.
15
15
 
16
16
  ## The 59 templates
17
17
 
@@ -137,7 +137,7 @@ chunks in Mongo and cosine-rank in-app until it lands.
137
137
  `needs:` is a MAP declaring infrastructure capabilities. Values are `true` or an
138
138
  engine hint. Cron is NOT a need — it is a **service type** (`type: cron` with
139
139
  `schedule` + `timezone`). See the full cloudgrid.yaml reference §5–§6 via
140
- `gridctl_fetch("doc", "cloudgrid-yaml")`.
140
+ `grid_fetch("doc", "cloudgrid-yaml")`.
141
141
 
142
142
  | `needs:` key | Provides | Injected env var(s) | Status |
143
143
  |---|---|---|---|
@@ -173,9 +173,9 @@ engine hint. Cron is NOT a need — it is a **service type** (`type: cron` with
173
173
  `api-service`); talks to an LLM → `ai: true` + `database` (`ai-app`); scheduled
174
174
  work → a `type: cron` service (Python/Node, supported on 0.14.0). (Held for now:
175
175
  RAG's ideal `vector: pgvector`, #1545 — store embeddings in Mongo until it lands.)
176
- 3. Static (`needs: none`) → publish as an inspiration with `gridctl_drop`
176
+ 3. Static (`needs: none`) → publish as an inspiration with `grid_drop`
177
177
  (instant, any edition). Anything with a `needs:` → runtime, local edition,
178
- `gridctl_plug` a linked folder, then poll to a live URL.
178
+ `grid_plug` a linked folder, then poll to a live URL.
179
179
 
180
180
  ## FAQ
181
181
 
@@ -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 `gridctl_fetch("doc", "cloudgrid-yaml")`.
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
- > `gridctl_fetch("doc", "capability-map")`.
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
@@ -28,7 +28,7 @@ These are the shapes verified against live deploys. Copy one and adapt it.
28
28
  ### Static site → deploys as an inspiration (instant)
29
29
 
30
30
  A single-file / static bundle. No `needs:`. Publishes instantly via
31
- `gridctl_drop`, works on any edition (hosted or local).
31
+ `grid_drop`, works on any edition (hosted or local).
32
32
 
33
33
  ```yaml
34
34
  name: landing-page
@@ -540,7 +540,7 @@ Bake these into any yaml you author:
540
540
  it**; use `needs:` instead.
541
541
  - **`needs:` and `requires:` together are HARD-REJECTED** by the validator ("use
542
542
  one or the other"). So author **`needs:`-only** — never set both.
543
- - **Static single-file pages deploy as inspirations** via `gridctl_drop` — instant,
543
+ - **Static single-file pages deploy as inspirations** via `grid_drop` — instant,
544
544
  synchronous, works on the hosted edition and any client.
545
545
  - **A `cloudgrid.yaml` with `services:` makes it a runtime** — async build,
546
546
  **local edition only** (Claude Desktop/Code or the CLI, not hosted). `plug`
@@ -565,5 +565,5 @@ needs:
565
565
  ---
566
566
 
567
567
  *This doc is the agent-facing distribution of the platform's canonical
568
- `cloudgrid-yaml-reference.md`. See also `gridctl_fetch("doc", "capability-map")`
568
+ `cloudgrid-yaml-reference.md`. See also `grid_fetch("doc", "capability-map")`
569
569
  for matching a user intent to a template + the `needs:` injection status.*
@@ -74,7 +74,7 @@ curl -sS -X POST https://api.cloudgrid.io/api/v2/plug \
74
74
  The response includes `url` (the live link — use it verbatim), `entity_id`,
75
75
  `owner_token` (keep both to update the drop later), and `claim_url` (sign in
76
76
  before it expires to keep it). This is what the `cloudgrid-drop` skill and the
77
- `gridctl_drop` MCP tool do for you. It is anonymous and serves inspirations
77
+ `grid_drop` MCP tool do for you. It is anonymous and serves inspirations
78
78
  only; a full app needs the signed-in `plug` flow above.
79
79
 
80
80
  ## Update your drop in place
@@ -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
- `gridctl_login` tool on first use.
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 (`gridctl plug <path>` or
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 `gridctl_claim` tool does this for you, and remembers the entity id +
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.
@@ -78,7 +78,7 @@ A signed-in drop returns HTTP 202 with `entity_id`, `url`, `slug` + `grid` and n
78
78
  not compose it. The org is taken from the `X-CloudGrid-Org` header — there is no
79
79
  `org_slug` form field. If the user is a member of several orgs and the header is
80
80
  missing, the API replies with the list of orgs to choose from. The MCP
81
- `gridctl_drop` tool does this automatically when credentials are present.
81
+ `grid_drop` tool does this automatically when credentials are present.
82
82
 
83
83
  ## Re-plug: update the same URL in place
84
84
 
@@ -120,7 +120,7 @@ Rules that matter:
120
120
  - An anonymous edit without a valid `owner_token` returns **401**.
121
121
  - Anonymous edits count against the same daily anonymous cap as creates.
122
122
  - Only re-plug when the user is iterating on an existing artifact. If they want a
123
- separate new link, omit `target_entity_id` (the MCP `gridctl_drop` tool's
123
+ separate new link, omit `target_entity_id` (the MCP `grid_drop` tool's
124
124
  `fresh` flag does the same: it forces a new entity instead of updating).
125
125
 
126
126
  ## After the drop
@@ -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 `gridctl_login` and
85
- `gridctl_login_status`, which handle the polling and the credentials write for
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.
@@ -33,7 +33,7 @@ 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 (`gridctl_start`, `gridctl_fetch`, and the
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
 
@@ -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 `gridctl_init`) an app `<name>` — creates the entity +
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:** `gridctl_fetch("template", "ai-knowledge-base")` → read
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 `gridctl_drop` and works on every
6
+ no external CDNs). It deploys instantly via `grid_drop` and works on every
7
7
  CloudGrid edition, including hosted.
8
8
 
9
9
  ## Fill it in
10
10
 
11
- Fetch the template with `gridctl_fetch("template", "api-docs")`, then replace the
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 `gridctl plug`.
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,14 @@ 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 **`gridctl_drop`** (or `gridctl_plug` with the inline
8
+ To publish this page, use **`grid_drop`** (or `grid_plug` with the inline
9
9
  HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
10
10
  edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
11
11
  directory (`type: static`) is ONLY for plugging the page as an OWNED static
12
- runtime (async, local edition only); the fast path is `gridctl_drop`.
12
+ runtime (async, local edition only); the fast path is `grid_drop`.
13
13
 
14
14
  The fillable HTML is the real template — fetch it with
15
- `gridctl_fetch("template", "api-docs")` and fill in the user's content.
15
+ `grid_fetch("template", "api-docs")` and fill in the user's content.
16
16
 
17
17
  ## cloudgrid.yaml (reference only)
18
18
 
@@ -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
- `gridctl_fetch("template", "app-with-data")`.
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 `gridctl_secrets` (or `grid secrets set`), then
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. `gridctl_login_status` → `gridctl_login` if needed. Respect the grid picker
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. `gridctl_init` an app `<name>` FIRST — it creates the entity, writes
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: `gridctl_secrets` for `auth-provider-key` (and, if taking
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
- → `gridctl_env` / `services.web.env`. Do NOT set `DATABASE_MONGODB_URL`
175
+ → `grid_env` / `services.web.env`. Do NOT set `DATABASE_MONGODB_URL`
176
176
  yourself — the grid injects it.
177
- 5. `gridctl_plug` to deploy. A runtime deploy is **ASYNC** — the first response
178
- is `status: building`, not a live URL. Poll `gridctl_status` (or the returned
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 `gridctl_drop`) instead, then stop the runtime
191
+ static "book us" landing page (via `grid_drop`) 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
- - `gridctl_fetch("template", "appointment-booking")` — this blueprint (`cloudgrid.yaml` + `AGENTS.md`).
14
- - `gridctl_fetch("template", "app-with-data")` — the proven Next.js + Mongo shape to extend (lazy db client, App-Router API).
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 `gridctl_secrets`, and the deployer injects them at runtime. Read lazily;
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
- `gridctl_init` first (creates the entity + link.json), write the app under
69
- `services/web/`, set the vault secrets with `gridctl_secrets`, `gridctl_plug`
70
- (async — poll `gridctl_status` to a live URL). If taking deposits, register the
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
- `gridctl_fetch("template", "app-with-data")`, then adapt it to the collections
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. `gridctl_init` an app `<name>` — creates the entity, `.cloudgrid/link.json`,
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
- - `gridctl_fetch("template", "approval-workflow")` → this blueprint:
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
- - `gridctl_fetch("template", "app-with-data")` → the concrete Next.js + Mongo
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 `gridctl_fetch("template", "billing-dashboard")` and read **`AGENTS.md`** — it
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
@@ -200,7 +200,7 @@ Runtime app → **local edition** only (Claude Desktop / Claude Code / CLI); the
200
200
  hosted edition cannot build a runtime container. Order matters — `plug` needs a
201
201
  linked directory, so `init` first.
202
202
 
203
- 1. `grid init` (or `gridctl_init`) an app `<name>` — creates the entity +
203
+ 1. `grid init` (or `grid_init`) an app `<name>` — creates the entity +
204
204
  `.cloudgrid/link.json` and a starter `cloudgrid.yaml` with empty `services:{}`.
205
205
  2. Fill: put the app under `services/web/` and set `cloudgrid.yaml` to this
206
206
  blueprint's active fields (`services.web` nextjs `/`, `needs:{database:true}`).
@@ -11,7 +11,7 @@ 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:** `gridctl_fetch("template", "calendar-scheduler")` → read
14
+ - **Structure guide:** `grid_fetch("template", "calendar-scheduler")` → read
15
15
  **`AGENTS.md`** (file tree, Mongo collections, CloudGrid injection table,
16
16
  optional auth/payments layers, the cron reminder shape blocked on #1543, deploy
17
17
  steps, edition note).
@@ -3,12 +3,12 @@
3
3
  A single self-contained HTML changelog / release-notes page: reverse-chronological versioned entries, each with a date and tagged change items (added / fixed / changed / removed).
4
4
 
5
5
  Static inspiration — a single self-contained `index.html` (inline CSS and JS,
6
- no external CDNs). It deploys instantly via `gridctl_drop` and works on every
6
+ no external CDNs). It deploys instantly via `grid_drop` and works on every
7
7
  CloudGrid edition, including hosted.
8
8
 
9
9
  ## Fill it in
10
10
 
11
- Fetch the template with `gridctl_fetch("template", "changelog")`, then replace the
11
+ Fetch the template with `grid_fetch("template", "changelog")`, then replace the
12
12
  placeholders:
13
13
 
14
14
  - The product name and page intro.
@@ -21,7 +21,7 @@ stylesheets, fonts, or large embedded media.
21
21
  ## Deploy
22
22
 
23
23
  - Hosted MCP edition: call the drop tool with the HTML.
24
- - Local MCP / CLI edition: write the HTML to a file and run `gridctl plug`.
24
+ - Local MCP / CLI edition: write the HTML to a file and run `grid plug`.
25
25
 
26
26
  It deploys as an inspiration and returns a live share URL right away. Re-deploy
27
27
  with the same entity id to update the same URL.
@@ -5,14 +5,14 @@ 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 **`gridctl_drop`** (or `gridctl_plug` with the inline
8
+ To publish this page, use **`grid_drop`** (or `grid_plug` with the inline
9
9
  HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
10
10
  edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
11
11
  directory (`type: static`) is ONLY for plugging the page as an OWNED static
12
- runtime (async, local edition only); the fast path is `gridctl_drop`.
12
+ runtime (async, local edition only); the fast path is `grid_drop`.
13
13
 
14
14
  The fillable HTML is the real template — fetch it with
15
- `gridctl_fetch("template", "changelog")` and fill in the user's content.
15
+ `grid_fetch("template", "changelog")` and fill in the user's content.
16
16
 
17
17
  ## cloudgrid.yaml (reference only)
18
18
 
@@ -10,14 +10,14 @@ wire it to your own email service or form endpoint if you want real submissions.
10
10
 
11
11
  ## How it deploys
12
12
 
13
- To publish this page, use **`gridctl_drop`** (or `gridctl_plug` with the inline
13
+ To publish this page, use **`grid_drop`** (or `grid_plug` with the inline
14
14
  HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
15
15
  edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
16
16
  directory (`type: static`) is ONLY for plugging the page as an OWNED static
17
- runtime (async, local edition only); the fast path is `gridctl_drop`.
17
+ runtime (async, local edition only); the fast path is `grid_drop`.
18
18
 
19
19
  The fillable HTML is the real template — fetch it with
20
- `gridctl_fetch("template", "company-website")` and fill in the user's content.
20
+ `grid_fetch("template", "company-website")` and fill in the user's content.
21
21
 
22
22
  ## How to adapt
23
23
 
@@ -11,7 +11,7 @@
11
11
  # ignored by the parser, so the file deploys to exactly the active fields.
12
12
  #
13
13
  # company-website is a STATIC template (type: static, path: /) with no needs.
14
- # The fast path deploys the page as an INSPIRATION via gridctl_drop (instant,
14
+ # The fast path deploys the page as an INSPIRATION via grid_drop (instant,
15
15
  # works on hosted). This cloudgrid.yaml is the reference for plugging it as an
16
16
  # OWNED static runtime; the active fields are exactly: name + services.web.
17
17
  #
@@ -6,14 +6,14 @@ Inline CSS + inline JS only (no external scripts, stylesheets, fonts, or CDNs).
6
6
 
7
7
  ## How it deploys
8
8
 
9
- To publish this page, use **`gridctl_drop`** (or `gridctl_plug` with the inline
9
+ To publish this page, use **`grid_drop`** (or `grid_plug` with the inline
10
10
  HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
11
11
  edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
12
12
  directory (`type: static`) is ONLY for plugging the page as an OWNED static
13
- runtime (async, local edition only); the fast path is `gridctl_drop`.
13
+ runtime (async, local edition only); the fast path is `grid_drop`.
14
14
 
15
15
  The fillable HTML is the real template — fetch it with
16
- `gridctl_fetch("template", "company-website")` and fill in the user's content.
16
+ `grid_fetch("template", "company-website")` and fill in the user's content.
17
17
 
18
18
  ## cloudgrid.yaml (reference only)
19
19
 
@@ -7,7 +7,7 @@ Next.js + Mongo app with auth and payments.
7
7
  **This is a blueprint, not app code.** It ships the correct `cloudgrid.yaml` and
8
8
  an `AGENTS.md` structure guide. Read `AGENTS.md`, then build the app under
9
9
  `services/web/` following it. Fetch the guide with
10
- `gridctl_fetch("template", "course-platform")`.
10
+ `grid_fetch("template", "course-platform")`.
11
11
 
12
12
  **Key rules:**
13
13
 
@@ -16,7 +16,7 @@
16
16
  # THIS TEMPLATE (dashboard): a single self-contained static page. The active fields
17
17
  # are exactly name + services.web{type: static, path: /}; there are no needs.
18
18
  # This cloudgrid.yaml is the reference for plugging it as an OWNED static
19
- # runtime; the fast path is to deploy it as an INSPIRATION via gridctl_drop
19
+ # runtime; the fast path is to deploy it as an INSPIRATION via grid_drop
20
20
  # (instant, and works on the hosted edition too).
21
21
  # ============================================================================
22
22
 
@@ -5,14 +5,14 @@ no `needs:`. 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 **`gridctl_drop`** (or `gridctl_plug` with the inline
8
+ To publish this page, use **`grid_drop`** (or `grid_plug` with the inline
9
9
  HTML): it deploys as an **inspiration** — instant, and works on the **hosted**
10
10
  edition (Claude Web) as well as local. The reference `cloudgrid.yaml` in this
11
11
  directory (`type: static`) is ONLY for plugging the page as an OWNED static
12
- runtime (async, local edition only); the fast path is `gridctl_drop`.
12
+ runtime (async, local edition only); the fast path is `grid_drop`.
13
13
 
14
14
  The fillable HTML is the real template — fetch it with
15
- `gridctl_fetch("template", "dashboard")` and fill in the user's content.
15
+ `grid_fetch("template", "dashboard")` and fill in the user's content.
16
16
 
17
17
  ## cloudgrid.yaml (reference only)
18
18