@cloudgrid-io/mcp 0.21.17 → 0.21.19
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 +2 -2
- package/package.json +10 -3
- package/src/corpus/cli-reference.md +8 -8
- package/src/corpus/cloudgrid-yaml.md +5 -5
- package/src/corpus/cookbook.md +1 -1
- package/src/corpus/playbook.md +1 -1
- package/src/corpus/skill-brain.md +1 -1
- package/src/corpus/skill-claim.md +2 -2
- package/src/corpus/skill-feedback.md +5 -5
- package/src/corpus/skill-plug.md +4 -4
- package/src/corpus/templates/_cloudgrid.yaml.reference +7 -7
- package/src/corpus/templates/admin-dashboard/cloudgrid.yaml +7 -7
- package/src/corpus/templates/ai-app/cloudgrid.yaml +7 -7
- package/src/corpus/templates/ai-knowledge-base/AGENTS.md +1 -1
- package/src/corpus/templates/ai-knowledge-base/cloudgrid.yaml +7 -7
- package/src/corpus/templates/analytics-dashboard/cloudgrid.yaml +7 -7
- package/src/corpus/templates/api-dashboard/cloudgrid.yaml +7 -7
- package/src/corpus/templates/api-docs/cloudgrid.yaml +7 -7
- package/src/corpus/templates/api-service/cloudgrid.yaml +7 -7
- package/src/corpus/templates/app-with-data/cloudgrid.yaml +7 -7
- package/src/corpus/templates/appointment-booking/cloudgrid.yaml +7 -7
- package/src/corpus/templates/approval-workflow/cloudgrid.yaml +7 -7
- package/src/corpus/templates/billing-dashboard/cloudgrid.yaml +7 -7
- package/src/corpus/templates/blog-cms/cloudgrid.yaml +7 -7
- package/src/corpus/templates/booking-system/cloudgrid.yaml +7 -7
- package/src/corpus/templates/calendar-scheduler/AGENTS.md +1 -1
- package/src/corpus/templates/calendar-scheduler/cloudgrid.yaml +7 -7
- package/src/corpus/templates/changelog/cloudgrid.yaml +7 -7
- package/src/corpus/templates/company-website/cloudgrid.yaml +7 -7
- package/src/corpus/templates/course-platform/cloudgrid.yaml +7 -7
- package/src/corpus/templates/crm/cloudgrid.yaml +7 -7
- package/src/corpus/templates/dashboard/cloudgrid.yaml +7 -7
- package/src/corpus/templates/deck/cloudgrid.yaml +7 -7
- package/src/corpus/templates/directory/cloudgrid.yaml +7 -7
- package/src/corpus/templates/docs-site/cloudgrid.yaml +7 -7
- package/src/corpus/templates/erp/cloudgrid.yaml +7 -7
- package/src/corpus/templates/event-board/cloudgrid.yaml +7 -7
- package/src/corpus/templates/expense-tracker/cloudgrid.yaml +7 -7
- package/src/corpus/templates/feature-request-board/cloudgrid.yaml +7 -7
- package/src/corpus/templates/financial-dashboard/cloudgrid.yaml +7 -7
- package/src/corpus/templates/forum/cloudgrid.yaml +7 -7
- package/src/corpus/templates/hr-portal/cloudgrid.yaml +7 -7
- package/src/corpus/templates/internal-tools-portal/cloudgrid.yaml +7 -7
- package/src/corpus/templates/inventory/cloudgrid.yaml +7 -7
- package/src/corpus/templates/invoice/cloudgrid.yaml +7 -7
- package/src/corpus/templates/job-board/cloudgrid.yaml +7 -7
- package/src/corpus/templates/kanban/cloudgrid.yaml +7 -7
- package/src/corpus/templates/landing-page/cloudgrid.yaml +7 -7
- package/src/corpus/templates/lms/cloudgrid.yaml +7 -7
- package/src/corpus/templates/marketplace/AGENTS.md +1 -1
- package/src/corpus/templates/marketplace/cloudgrid.yaml +7 -7
- package/src/corpus/templates/membership-site/cloudgrid.yaml +7 -7
- package/src/corpus/templates/monitoring-dashboard/cloudgrid.yaml +7 -7
- package/src/corpus/templates/multi-service/cloudgrid.yaml +7 -7
- package/src/corpus/templates/online-store/cloudgrid.yaml +7 -7
- package/src/corpus/templates/portfolio/cloudgrid.yaml +7 -7
- package/src/corpus/templates/product-catalog/cloudgrid.yaml +7 -7
- package/src/corpus/templates/product-launch/cloudgrid.yaml +7 -7
- package/src/corpus/templates/project-management/cloudgrid.yaml +7 -7
- package/src/corpus/templates/property-listings/cloudgrid.yaml +7 -7
- package/src/corpus/templates/quiz-platform/cloudgrid.yaml +7 -7
- package/src/corpus/templates/report/cloudgrid.yaml +7 -7
- package/src/corpus/templates/restaurant-reservations/cloudgrid.yaml +7 -7
- package/src/corpus/templates/revenue-dashboard/cloudgrid.yaml +7 -7
- package/src/corpus/templates/saas-marketing/cloudgrid.yaml +7 -7
- package/src/corpus/templates/semantic-search/cloudgrid.yaml +7 -7
- package/src/corpus/templates/semantic-search/services/backend/requirements.txt +2 -2
- package/src/corpus/templates/semantic-search/services/refresh/requirements.txt +2 -2
- package/src/corpus/templates/semantic-search/services/web/package-lock.json +3 -3
- package/src/corpus/templates/simple-semantic-search/cloudgrid.yaml +7 -7
- package/src/corpus/templates/status-page/cloudgrid.yaml +7 -7
- package/src/corpus/templates/subscription-management/cloudgrid.yaml +7 -7
- package/src/corpus/templates/task-manager/cloudgrid.yaml +7 -7
- package/src/corpus/templates/ticket-system/cloudgrid.yaml +7 -7
- package/src/corpus/templates/time-tracking/cloudgrid.yaml +7 -7
- package/src/corpus/templates/travel-booking/cloudgrid.yaml +7 -7
- package/src/corpus/templates/waitlist/cloudgrid.yaml +7 -7
- package/src/corpus/templates/web-app/cloudgrid.yaml +7 -7
- package/src/corpus/workflows/forum.md +1 -1
- package/src/corpus/workflows/simple-semantic-search.md +1 -1
- package/src/tools/constants.js +4 -1
- package/src/tools/deploy.js +37 -10
- package/src/tools/register.js +49 -58
- package/src/widgets/grid-login.html +14 -14
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
# Entity slug (REQUIRED). 2-42 chars, lowercase alphanumeric + hyphens.
|
|
21
21
|
# Must start and end with a letter or digit.
|
|
22
|
-
# Becomes part of your public URL: <name>-<4hex>--<
|
|
22
|
+
# Becomes part of your public URL: <name>-<4hex>--<grid>.cloudgrid.io
|
|
23
23
|
name: status-page
|
|
24
24
|
|
|
25
25
|
# One-line summary. Max 280 chars. If omitted, Grid Brain auto-generates one.
|
|
@@ -54,7 +54,7 @@ name: status-page
|
|
|
54
54
|
|
|
55
55
|
# ─── DEPLOY NOTIFICATIONS ──────────────────────────────────────────────────
|
|
56
56
|
|
|
57
|
-
# Slack notification to the
|
|
57
|
+
# Slack notification to the grid's default channel on deploy failure.
|
|
58
58
|
# true = notify (default), false = silent.
|
|
59
59
|
# notify: true
|
|
60
60
|
|
|
@@ -104,20 +104,20 @@ name: status-page
|
|
|
104
104
|
|
|
105
105
|
# Entities this app calls (outbound). Service-account token injected per pair.
|
|
106
106
|
# calls:
|
|
107
|
-
# -
|
|
107
|
+
# - atomic/billing-api
|
|
108
108
|
|
|
109
109
|
# Inbound caller policy — who can call YOUR entity.
|
|
110
110
|
# callers:
|
|
111
111
|
# policy: auto # 'auto' | 'manual' (default).
|
|
112
|
-
# scope: org # 'org' (default) | 'space' | 'explicit'.
|
|
112
|
+
# scope: org # 'org' (the whole grid; default) | 'space' | 'explicit'.
|
|
113
113
|
# fallback: deny # 'deny' (default) | 'warn'.
|
|
114
114
|
# # allowed_apps: # required only when scope: explicit
|
|
115
|
-
# # -
|
|
115
|
+
# # - atomic/frontend
|
|
116
116
|
|
|
117
117
|
|
|
118
118
|
# ─── VAULT ──────────────────────────────────────────────────────────────────
|
|
119
119
|
|
|
120
|
-
# Map
|
|
120
|
+
# Map grid vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
|
|
121
121
|
# vault:
|
|
122
122
|
# STRIPE_KEY: stripe-live-key
|
|
123
123
|
# SENDGRID_API_KEY: sendgrid-key
|
|
@@ -127,7 +127,7 @@ name: status-page
|
|
|
127
127
|
|
|
128
128
|
# connectors:
|
|
129
129
|
# - id: team-slack
|
|
130
|
-
# target: org # 'system' | 'org'.
|
|
130
|
+
# target: org # 'system' | 'org' (your grid).
|
|
131
131
|
# channel: "#deploys"
|
|
132
132
|
# hooks:
|
|
133
133
|
# - on: deploy.failed # release.published | deploy.failed | feedback.received | entity.created
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
# Entity slug (REQUIRED). 2-42 chars, lowercase alphanumeric + hyphens.
|
|
21
21
|
# Must start and end with a letter or digit.
|
|
22
|
-
# Becomes part of your public URL: <name>-<4hex>--<
|
|
22
|
+
# Becomes part of your public URL: <name>-<4hex>--<grid>.cloudgrid.io
|
|
23
23
|
name: subscription-management
|
|
24
24
|
|
|
25
25
|
# One-line summary. Max 280 chars. If omitted, Grid Brain auto-generates one.
|
|
@@ -54,7 +54,7 @@ name: subscription-management
|
|
|
54
54
|
|
|
55
55
|
# ─── DEPLOY NOTIFICATIONS ──────────────────────────────────────────────────
|
|
56
56
|
|
|
57
|
-
# Slack notification to the
|
|
57
|
+
# Slack notification to the grid's default channel on deploy failure.
|
|
58
58
|
# true = notify (default), false = silent.
|
|
59
59
|
# notify: true
|
|
60
60
|
|
|
@@ -104,20 +104,20 @@ name: subscription-management
|
|
|
104
104
|
|
|
105
105
|
# Entities this app calls (outbound). Service-account token injected per pair.
|
|
106
106
|
# calls:
|
|
107
|
-
# -
|
|
107
|
+
# - atomic/billing-api
|
|
108
108
|
|
|
109
109
|
# Inbound caller policy — who can call YOUR entity.
|
|
110
110
|
# callers:
|
|
111
111
|
# policy: auto # 'auto' | 'manual' (default).
|
|
112
|
-
# scope: org # 'org' (default) | 'space' | 'explicit'.
|
|
112
|
+
# scope: org # 'org' (the whole grid; default) | 'space' | 'explicit'.
|
|
113
113
|
# fallback: deny # 'deny' (default) | 'warn'.
|
|
114
114
|
# # allowed_apps: # required only when scope: explicit
|
|
115
|
-
# # -
|
|
115
|
+
# # - atomic/frontend
|
|
116
116
|
|
|
117
117
|
|
|
118
118
|
# ─── VAULT ──────────────────────────────────────────────────────────────────
|
|
119
119
|
|
|
120
|
-
# Map
|
|
120
|
+
# Map grid vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
|
|
121
121
|
# Self-serve subscription management needs Stripe secrets injected as env vars —
|
|
122
122
|
# this is the CloudGrid-correct way. Set the vault items once (grid secrets set),
|
|
123
123
|
# then the deployer injects each as the named env var at runtime and under
|
|
@@ -131,7 +131,7 @@ vault:
|
|
|
131
131
|
|
|
132
132
|
# connectors:
|
|
133
133
|
# - id: team-slack
|
|
134
|
-
# target: org # 'system' | 'org'.
|
|
134
|
+
# target: org # 'system' | 'org' (your grid).
|
|
135
135
|
# channel: "#deploys"
|
|
136
136
|
# hooks:
|
|
137
137
|
# - on: deploy.failed # release.published | deploy.failed | feedback.received | entity.created
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
# Entity slug (REQUIRED). 2-42 chars, lowercase alphanumeric + hyphens.
|
|
21
21
|
# Must start and end with a letter or digit.
|
|
22
|
-
# Becomes part of your public URL: <name>-<4hex>--<
|
|
22
|
+
# Becomes part of your public URL: <name>-<4hex>--<grid>.cloudgrid.io
|
|
23
23
|
name: my-tasks
|
|
24
24
|
|
|
25
25
|
# One-line summary. Max 280 chars. If omitted, Grid Brain auto-generates one.
|
|
@@ -54,7 +54,7 @@ name: my-tasks
|
|
|
54
54
|
|
|
55
55
|
# ─── DEPLOY NOTIFICATIONS ──────────────────────────────────────────────────
|
|
56
56
|
|
|
57
|
-
# Slack notification to the
|
|
57
|
+
# Slack notification to the grid's default channel on deploy failure.
|
|
58
58
|
# true = notify (default), false = silent.
|
|
59
59
|
# notify: true
|
|
60
60
|
|
|
@@ -104,20 +104,20 @@ name: my-tasks
|
|
|
104
104
|
|
|
105
105
|
# Entities this app calls (outbound). Service-account token injected per pair.
|
|
106
106
|
# calls:
|
|
107
|
-
# -
|
|
107
|
+
# - atomic/billing-api
|
|
108
108
|
|
|
109
109
|
# Inbound caller policy — who can call YOUR entity.
|
|
110
110
|
# callers:
|
|
111
111
|
# policy: auto # 'auto' | 'manual' (default).
|
|
112
|
-
# scope: org # 'org' (default) | 'space' | 'explicit'.
|
|
112
|
+
# scope: org # 'org' (the whole grid; default) | 'space' | 'explicit'.
|
|
113
113
|
# fallback: deny # 'deny' (default) | 'warn'.
|
|
114
114
|
# # allowed_apps: # required only when scope: explicit
|
|
115
|
-
# # -
|
|
115
|
+
# # - atomic/frontend
|
|
116
116
|
|
|
117
117
|
|
|
118
118
|
# ─── VAULT ──────────────────────────────────────────────────────────────────
|
|
119
119
|
|
|
120
|
-
# Map
|
|
120
|
+
# Map grid vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
|
|
121
121
|
# vault:
|
|
122
122
|
# STRIPE_KEY: stripe-live-key
|
|
123
123
|
# SENDGRID_API_KEY: sendgrid-key
|
|
@@ -127,7 +127,7 @@ name: my-tasks
|
|
|
127
127
|
|
|
128
128
|
# connectors:
|
|
129
129
|
# - id: team-slack
|
|
130
|
-
# target: org # 'system' | 'org'.
|
|
130
|
+
# target: org # 'system' | 'org' (your grid).
|
|
131
131
|
# channel: "#deploys"
|
|
132
132
|
# hooks:
|
|
133
133
|
# - on: deploy.failed # release.published | deploy.failed | feedback.received | entity.created
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
# Entity slug (REQUIRED). 2-42 chars, lowercase alphanumeric + hyphens.
|
|
21
21
|
# Must start and end with a letter or digit.
|
|
22
|
-
# Becomes part of your public URL: <name>-<4hex>--<
|
|
22
|
+
# Becomes part of your public URL: <name>-<4hex>--<grid>.cloudgrid.io
|
|
23
23
|
name: my-tickets
|
|
24
24
|
|
|
25
25
|
# One-line summary. Max 280 chars. If omitted, Grid Brain auto-generates one.
|
|
@@ -54,7 +54,7 @@ name: my-tickets
|
|
|
54
54
|
|
|
55
55
|
# ─── DEPLOY NOTIFICATIONS ──────────────────────────────────────────────────
|
|
56
56
|
|
|
57
|
-
# Slack notification to the
|
|
57
|
+
# Slack notification to the grid's default channel on deploy failure.
|
|
58
58
|
# true = notify (default), false = silent.
|
|
59
59
|
# notify: true
|
|
60
60
|
|
|
@@ -104,20 +104,20 @@ name: my-tickets
|
|
|
104
104
|
|
|
105
105
|
# Entities this app calls (outbound). Service-account token injected per pair.
|
|
106
106
|
# calls:
|
|
107
|
-
# -
|
|
107
|
+
# - atomic/billing-api
|
|
108
108
|
|
|
109
109
|
# Inbound caller policy — who can call YOUR entity.
|
|
110
110
|
# callers:
|
|
111
111
|
# policy: auto # 'auto' | 'manual' (default).
|
|
112
|
-
# scope: org # 'org' (default) | 'space' | 'explicit'.
|
|
112
|
+
# scope: org # 'org' (the whole grid; default) | 'space' | 'explicit'.
|
|
113
113
|
# fallback: deny # 'deny' (default) | 'warn'.
|
|
114
114
|
# # allowed_apps: # required only when scope: explicit
|
|
115
|
-
# # -
|
|
115
|
+
# # - atomic/frontend
|
|
116
116
|
|
|
117
117
|
|
|
118
118
|
# ─── VAULT ──────────────────────────────────────────────────────────────────
|
|
119
119
|
|
|
120
|
-
# Map
|
|
120
|
+
# Map grid vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
|
|
121
121
|
# vault:
|
|
122
122
|
# STRIPE_KEY: stripe-live-key
|
|
123
123
|
# SENDGRID_API_KEY: sendgrid-key
|
|
@@ -127,7 +127,7 @@ name: my-tickets
|
|
|
127
127
|
|
|
128
128
|
# connectors:
|
|
129
129
|
# - id: team-slack
|
|
130
|
-
# target: org # 'system' | 'org'.
|
|
130
|
+
# target: org # 'system' | 'org' (your grid).
|
|
131
131
|
# channel: "#deploys"
|
|
132
132
|
# hooks:
|
|
133
133
|
# - on: deploy.failed # release.published | deploy.failed | feedback.received | entity.created
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
# Entity slug (REQUIRED). 2-42 chars, lowercase alphanumeric + hyphens.
|
|
21
21
|
# Must start and end with a letter or digit.
|
|
22
|
-
# Becomes part of your public URL: <name>-<4hex>--<
|
|
22
|
+
# Becomes part of your public URL: <name>-<4hex>--<grid>.cloudgrid.io
|
|
23
23
|
name: time-tracking
|
|
24
24
|
|
|
25
25
|
# One-line summary. Max 280 chars. If omitted, Grid Brain auto-generates one.
|
|
@@ -54,7 +54,7 @@ name: time-tracking
|
|
|
54
54
|
|
|
55
55
|
# ─── DEPLOY NOTIFICATIONS ──────────────────────────────────────────────────
|
|
56
56
|
|
|
57
|
-
# Slack notification to the
|
|
57
|
+
# Slack notification to the grid's default channel on deploy failure.
|
|
58
58
|
# true = notify (default), false = silent.
|
|
59
59
|
# notify: true
|
|
60
60
|
|
|
@@ -104,20 +104,20 @@ name: time-tracking
|
|
|
104
104
|
|
|
105
105
|
# Entities this app calls (outbound). Service-account token injected per pair.
|
|
106
106
|
# calls:
|
|
107
|
-
# -
|
|
107
|
+
# - atomic/billing-api
|
|
108
108
|
|
|
109
109
|
# Inbound caller policy — who can call YOUR entity.
|
|
110
110
|
# callers:
|
|
111
111
|
# policy: auto # 'auto' | 'manual' (default).
|
|
112
|
-
# scope: org # 'org' (default) | 'space' | 'explicit'.
|
|
112
|
+
# scope: org # 'org' (the whole grid; default) | 'space' | 'explicit'.
|
|
113
113
|
# fallback: deny # 'deny' (default) | 'warn'.
|
|
114
114
|
# # allowed_apps: # required only when scope: explicit
|
|
115
|
-
# # -
|
|
115
|
+
# # - atomic/frontend
|
|
116
116
|
|
|
117
117
|
|
|
118
118
|
# ─── VAULT ──────────────────────────────────────────────────────────────────
|
|
119
119
|
|
|
120
|
-
# Map
|
|
120
|
+
# Map grid vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
|
|
121
121
|
# vault:
|
|
122
122
|
# STRIPE_KEY: stripe-live-key
|
|
123
123
|
# SENDGRID_API_KEY: sendgrid-key
|
|
@@ -127,7 +127,7 @@ name: time-tracking
|
|
|
127
127
|
|
|
128
128
|
# connectors:
|
|
129
129
|
# - id: team-slack
|
|
130
|
-
# target: org # 'system' | 'org'.
|
|
130
|
+
# target: org # 'system' | 'org' (your grid).
|
|
131
131
|
# channel: "#deploys"
|
|
132
132
|
# hooks:
|
|
133
133
|
# - on: deploy.failed # release.published | deploy.failed | feedback.received | entity.created
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
# Entity slug (REQUIRED). 2-42 chars, lowercase alphanumeric + hyphens.
|
|
21
21
|
# Must start and end with a letter or digit.
|
|
22
|
-
# Becomes part of your public URL: <name>-<4hex>--<
|
|
22
|
+
# Becomes part of your public URL: <name>-<4hex>--<grid>.cloudgrid.io
|
|
23
23
|
name: travel-booking
|
|
24
24
|
|
|
25
25
|
# One-line summary. Max 280 chars. If omitted, Grid Brain auto-generates one.
|
|
@@ -54,7 +54,7 @@ name: travel-booking
|
|
|
54
54
|
|
|
55
55
|
# ─── DEPLOY NOTIFICATIONS ──────────────────────────────────────────────────
|
|
56
56
|
|
|
57
|
-
# Slack notification to the
|
|
57
|
+
# Slack notification to the grid's default channel on deploy failure.
|
|
58
58
|
# true = notify (default), false = silent.
|
|
59
59
|
# notify: true
|
|
60
60
|
|
|
@@ -104,20 +104,20 @@ name: travel-booking
|
|
|
104
104
|
|
|
105
105
|
# Entities this app calls (outbound). Service-account token injected per pair.
|
|
106
106
|
# calls:
|
|
107
|
-
# -
|
|
107
|
+
# - atomic/billing-api
|
|
108
108
|
|
|
109
109
|
# Inbound caller policy — who can call YOUR entity.
|
|
110
110
|
# callers:
|
|
111
111
|
# policy: auto # 'auto' | 'manual' (default).
|
|
112
|
-
# scope: org # 'org' (default) | 'space' | 'explicit'.
|
|
112
|
+
# scope: org # 'org' (the whole grid; default) | 'space' | 'explicit'.
|
|
113
113
|
# fallback: deny # 'deny' (default) | 'warn'.
|
|
114
114
|
# # allowed_apps: # required only when scope: explicit
|
|
115
|
-
# # -
|
|
115
|
+
# # - atomic/frontend
|
|
116
116
|
|
|
117
117
|
|
|
118
118
|
# ─── VAULT ──────────────────────────────────────────────────────────────────
|
|
119
119
|
#
|
|
120
|
-
# Map
|
|
120
|
+
# Map grid vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
|
|
121
121
|
# A travel-booking portal needs payment + auth provider secrets. These are the
|
|
122
122
|
# CloudGrid-correct way to inject them — the platform resolves each vault item and
|
|
123
123
|
# sets the named env var at runtime. Add the vault items with `grid secrets set`
|
|
@@ -132,7 +132,7 @@ vault:
|
|
|
132
132
|
|
|
133
133
|
# connectors:
|
|
134
134
|
# - id: team-slack
|
|
135
|
-
# target: org # 'system' | 'org'.
|
|
135
|
+
# target: org # 'system' | 'org' (your grid).
|
|
136
136
|
# channel: "#deploys"
|
|
137
137
|
# hooks:
|
|
138
138
|
# - on: deploy.failed # release.published | deploy.failed | feedback.received | entity.created
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
# Entity slug (REQUIRED). 2-42 chars, lowercase alphanumeric + hyphens.
|
|
21
21
|
# Must start and end with a letter or digit.
|
|
22
|
-
# Becomes part of your public URL: <name>-<4hex>--<
|
|
22
|
+
# Becomes part of your public URL: <name>-<4hex>--<grid>.cloudgrid.io
|
|
23
23
|
name: waitlist
|
|
24
24
|
|
|
25
25
|
# One-line summary. Max 280 chars. If omitted, Grid Brain auto-generates one.
|
|
@@ -54,7 +54,7 @@ name: waitlist
|
|
|
54
54
|
|
|
55
55
|
# ─── DEPLOY NOTIFICATIONS ──────────────────────────────────────────────────
|
|
56
56
|
|
|
57
|
-
# Slack notification to the
|
|
57
|
+
# Slack notification to the grid's default channel on deploy failure.
|
|
58
58
|
# true = notify (default), false = silent.
|
|
59
59
|
# notify: true
|
|
60
60
|
|
|
@@ -104,20 +104,20 @@ name: waitlist
|
|
|
104
104
|
|
|
105
105
|
# Entities this app calls (outbound). Service-account token injected per pair.
|
|
106
106
|
# calls:
|
|
107
|
-
# -
|
|
107
|
+
# - atomic/billing-api
|
|
108
108
|
|
|
109
109
|
# Inbound caller policy — who can call YOUR entity.
|
|
110
110
|
# callers:
|
|
111
111
|
# policy: auto # 'auto' | 'manual' (default).
|
|
112
|
-
# scope: org # 'org' (default) | 'space' | 'explicit'.
|
|
112
|
+
# scope: org # 'org' (the whole grid; default) | 'space' | 'explicit'.
|
|
113
113
|
# fallback: deny # 'deny' (default) | 'warn'.
|
|
114
114
|
# # allowed_apps: # required only when scope: explicit
|
|
115
|
-
# # -
|
|
115
|
+
# # - atomic/frontend
|
|
116
116
|
|
|
117
117
|
|
|
118
118
|
# ─── VAULT ──────────────────────────────────────────────────────────────────
|
|
119
119
|
|
|
120
|
-
# Map
|
|
120
|
+
# Map grid vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
|
|
121
121
|
# vault:
|
|
122
122
|
# STRIPE_KEY: stripe-live-key
|
|
123
123
|
# SENDGRID_API_KEY: sendgrid-key
|
|
@@ -127,7 +127,7 @@ name: waitlist
|
|
|
127
127
|
|
|
128
128
|
# connectors:
|
|
129
129
|
# - id: team-slack
|
|
130
|
-
# target: org # 'system' | 'org'.
|
|
130
|
+
# target: org # 'system' | 'org' (your grid).
|
|
131
131
|
# channel: "#deploys"
|
|
132
132
|
# hooks:
|
|
133
133
|
# - on: deploy.failed # release.published | deploy.failed | feedback.received | entity.created
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
# Entity slug (REQUIRED). 2-42 chars, lowercase alphanumeric + hyphens.
|
|
27
27
|
# Must start and end with a letter or digit.
|
|
28
|
-
# Becomes part of your public URL: <name>-<4hex>--<
|
|
28
|
+
# Becomes part of your public URL: <name>-<4hex>--<grid>.cloudgrid.io
|
|
29
29
|
name: web-app
|
|
30
30
|
|
|
31
31
|
# One-line summary. Max 280 chars. If omitted, Grid Brain auto-generates one.
|
|
@@ -60,7 +60,7 @@ name: web-app
|
|
|
60
60
|
|
|
61
61
|
# ─── DEPLOY NOTIFICATIONS ──────────────────────────────────────────────────
|
|
62
62
|
|
|
63
|
-
# Slack notification to the
|
|
63
|
+
# Slack notification to the grid's default channel on deploy failure.
|
|
64
64
|
# true = notify (default), false = silent.
|
|
65
65
|
# notify: true
|
|
66
66
|
|
|
@@ -110,20 +110,20 @@ name: web-app
|
|
|
110
110
|
|
|
111
111
|
# Entities this app calls (outbound). Service-account token injected per pair.
|
|
112
112
|
# calls:
|
|
113
|
-
# -
|
|
113
|
+
# - atomic/billing-api
|
|
114
114
|
|
|
115
115
|
# Inbound caller policy — who can call YOUR entity.
|
|
116
116
|
# callers:
|
|
117
117
|
# policy: auto # 'auto' | 'manual' (default).
|
|
118
|
-
# scope: org # 'org' (default) | 'space' | 'explicit'.
|
|
118
|
+
# scope: org # 'org' (the whole grid; default) | 'space' | 'explicit'.
|
|
119
119
|
# fallback: deny # 'deny' (default) | 'warn'.
|
|
120
120
|
# # allowed_apps: # required only when scope: explicit
|
|
121
|
-
# # -
|
|
121
|
+
# # - atomic/frontend
|
|
122
122
|
|
|
123
123
|
|
|
124
124
|
# ─── VAULT ──────────────────────────────────────────────────────────────────
|
|
125
125
|
|
|
126
|
-
# Map
|
|
126
|
+
# Map grid vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
|
|
127
127
|
# vault:
|
|
128
128
|
# STRIPE_KEY: stripe-live-key
|
|
129
129
|
# SENDGRID_API_KEY: sendgrid-key
|
|
@@ -133,7 +133,7 @@ name: web-app
|
|
|
133
133
|
|
|
134
134
|
# connectors:
|
|
135
135
|
# - id: team-slack
|
|
136
|
-
# target: org # 'system' | 'org'.
|
|
136
|
+
# target: org # 'system' | 'org' (your grid).
|
|
137
137
|
# channel: "#deploys"
|
|
138
138
|
# hooks:
|
|
139
139
|
# - on: deploy.failed # release.published | deploy.failed | feedback.received | entity.created
|
|
@@ -8,7 +8,7 @@ kind: blueprint
|
|
|
8
8
|
capabilities_note: >-
|
|
9
9
|
persistent — needs a database (Mongo). Runtime app, async build, local edition
|
|
10
10
|
only. Sign-in-to-post auth via a hosted provider (Clerk/Auth0) with keys from
|
|
11
|
-
the
|
|
11
|
+
the grid vault (vault block maps items to env vars). Declare the canonical needs
|
|
12
12
|
database=true; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL).
|
|
13
13
|
BLUEPRINT — ships structure + cloudgrid.yaml, not app code.
|
|
14
14
|
summary: >-
|
|
@@ -52,7 +52,7 @@ grid plug # first plug registers the entity from cloudgrid.
|
|
|
52
52
|
grid visibility set <slug> link
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
`.cloudgrid/link.json` (entity_id /
|
|
55
|
+
`.cloudgrid/link.json` (entity_id / grid / slug binding) is WRITTEN BY THE CLI on
|
|
56
56
|
the first `grid plug` — never hand-author it. If the folder was copied from someone else's project,
|
|
57
57
|
`rm -rf .cloudgrid` first so `grid plug` doesn't update THEIR app.
|
|
58
58
|
|
package/src/tools/constants.js
CHANGED
|
@@ -27,7 +27,10 @@ export const ANON_HTML_MAX_BYTES = 2_000_000;
|
|
|
27
27
|
// ~6x stricter by design — a normal page is well under 1 MB, and past
|
|
28
28
|
// 25 MB the right shape is a folder plug (multipart, see deploy.js:756).
|
|
29
29
|
export const AUTHED_HTML_MAX_BYTES = 25_000_000;
|
|
30
|
-
|
|
30
|
+
// The Console's canonical host is my.cloudgrid.io (cloudgrid-io/cloudgrid#4135).
|
|
31
|
+
// console.cloudgrid.io stays as a permanent redirect, so links printed by
|
|
32
|
+
// earlier releases still land.
|
|
33
|
+
export const CONSOLE_URL = "https://my.cloudgrid.io/";
|
|
31
34
|
|
|
32
35
|
// The console link handed to a user AFTER a plug. When the grid slug is known it
|
|
33
36
|
// points at THAT grid (verified live: /home?grid=<slug> -> 200) instead of the
|
package/src/tools/deploy.js
CHANGED
|
@@ -20,6 +20,23 @@ import {
|
|
|
20
20
|
} from "./constants.js";
|
|
21
21
|
import { okResult } from "./util.js";
|
|
22
22
|
import { runCloudgrid } from "./cli.js";
|
|
23
|
+
import { decodeJwt } from "../auth.js";
|
|
24
|
+
import { logSafe } from "../web-observability.js";
|
|
25
|
+
|
|
26
|
+
// Publisher attribution (#395): on a signed-in CREATE, record WHO published, into
|
|
27
|
+
// WHICH grid, and whether the entity is ephemeral. Log a STABLE account id (the
|
|
28
|
+
// JWT `sub`) only — NEVER an email or token. Logs are not a private surface
|
|
29
|
+
// (redaction standard, #347/#353): identifiers and presence, never a value
|
|
30
|
+
// sensitive on its own. logSafe flattens control chars so the id cannot forge a
|
|
31
|
+
// log line. The emit is read from console.error at call time so tests can
|
|
32
|
+
// capture it.
|
|
33
|
+
export function logCreatePublisher(claims, grid, ephemeral, emit = (m) => console.error(m)) {
|
|
34
|
+
const sub = claims && typeof claims.sub === "string" && claims.sub.length > 0 ? claims.sub : null;
|
|
35
|
+
emit(
|
|
36
|
+
`cloudgrid-mcp: grid_plug create publisher user_id=${sub ? logSafe(sub) : "-"} ` +
|
|
37
|
+
`grid=${logSafe(grid || "-")} ephemeral=${ephemeral ? "true" : "false"}`,
|
|
38
|
+
);
|
|
39
|
+
}
|
|
23
40
|
|
|
24
41
|
/**
|
|
25
42
|
* The API refuses an infra-dependent write while a grid is still provisioning.
|
|
@@ -2211,6 +2228,18 @@ export async function runPlug(ctx, input, deps = {}) {
|
|
|
2211
2228
|
ctx.state.lastAnonClaim = null;
|
|
2212
2229
|
}
|
|
2213
2230
|
|
|
2231
|
+
// Publisher attribution (#395): every successful authed CREATE is logged with
|
|
2232
|
+
// the publisher's stable account id so the guest-drop blind spot is closed —
|
|
2233
|
+
// CREATE only (an edit re-plug keeps the owner's identity on the existing
|
|
2234
|
+
// entity) and the authed wire only (the owner-token guest wire is out of
|
|
2235
|
+
// scope). An inspiration is ephemeral (expires unless pinned); a runtime
|
|
2236
|
+
// app/agent is not.
|
|
2237
|
+
if (!isEdit && !useAnonWire) {
|
|
2238
|
+
const kind = data.detection?.kind ?? data.kind ?? null;
|
|
2239
|
+
const ephemeral = kind !== "app" && kind !== "agent";
|
|
2240
|
+
logCreatePublisher(decodeJwt(authToken), data.grid ?? orgSlug ?? grid ?? null, ephemeral);
|
|
2241
|
+
}
|
|
2242
|
+
|
|
2214
2243
|
// Confirm-before-claiming-live: a runtime build is async (status "building" +
|
|
2215
2244
|
// poll_url). Rather than returning immediately — which trained models to
|
|
2216
2245
|
// promise URLs that then 502'd — poll the deploy trace server-side for a short
|
|
@@ -2538,7 +2567,6 @@ export async function runVisibility(ctx, { target, visibility, inside, outside,
|
|
|
2538
2567
|
const normSpaces = [...new Set((spaces || []).map((s) => String(s).trim().toLowerCase()).filter(Boolean))];
|
|
2539
2568
|
const useAxes = inside !== undefined || outside !== undefined;
|
|
2540
2569
|
let body;
|
|
2541
|
-
let requested; // for the result text when the response is sparse
|
|
2542
2570
|
if (useAxes) {
|
|
2543
2571
|
if (visibility) throw new Error("Pass either `visibility` or the `inside`/`outside` axes, not both.");
|
|
2544
2572
|
if (!inside || !outside) {
|
|
@@ -2566,7 +2594,6 @@ export async function runVisibility(ctx, { target, visibility, inside, outside,
|
|
|
2566
2594
|
...(require_signin === true ? { require_signin: true } : {}),
|
|
2567
2595
|
...(inside === "spaces" ? { visibility_spaces: normSpaces } : {}),
|
|
2568
2596
|
};
|
|
2569
|
-
requested = `inside: ${inside}${inside === "spaces" ? ` (${normSpaces.join(", ")})` : ""}, outside: ${outside}${require_signin === true ? " (sign-in required)" : ""}`;
|
|
2570
2597
|
} else {
|
|
2571
2598
|
let mode = String(visibility || "").trim().toLowerCase();
|
|
2572
2599
|
if (!mode) throw new Error("Pass a visibility mode (private | grid | link), or the inside/outside axes.");
|
|
@@ -2586,7 +2613,6 @@ export async function runVisibility(ctx, { target, visibility, inside, outside,
|
|
|
2586
2613
|
throw new Error("`spaces` only applies with visibility: grid (or inside: spaces).");
|
|
2587
2614
|
}
|
|
2588
2615
|
body = { share_scope: "private", external_access: "link", require_signin: true };
|
|
2589
|
-
requested = "link with sign-in required (the retired 'authenticated')";
|
|
2590
2616
|
} else if (mode === "space") {
|
|
2591
2617
|
// `space` is a pure internal audience (share_scope: spaces, external_access:
|
|
2592
2618
|
// none). require_signin/indexed are external-link concerns — they have no
|
|
@@ -2601,7 +2627,6 @@ export async function runVisibility(ctx, { target, visibility, inside, outside,
|
|
|
2601
2627
|
throw new Error("'space' visibility needs the `spaces` list (which space slugs can see it) — or use inside: spaces with outside: none.");
|
|
2602
2628
|
}
|
|
2603
2629
|
body = { share_scope: "spaces", external_access: "none", visibility_spaces: normSpaces };
|
|
2604
|
-
requested = `selected spaces (${normSpaces.join(", ")})`;
|
|
2605
2630
|
} else if (mode === "private" || mode === "grid" || mode === "link") {
|
|
2606
2631
|
if (require_signin === true && mode !== "link") {
|
|
2607
2632
|
throw new Error("require_signin only applies with visibility: link (or outside: link).");
|
|
@@ -2627,12 +2652,10 @@ export async function runVisibility(ctx, { target, visibility, inside, outside,
|
|
|
2627
2652
|
throw new Error("require_signin cannot combine with indexed: a sign-in-gated link cannot be search-indexed.");
|
|
2628
2653
|
}
|
|
2629
2654
|
body = { share_scope: "private", external_access: "link", require_signin: true };
|
|
2630
|
-
requested = "link with sign-in required";
|
|
2631
2655
|
} else {
|
|
2632
2656
|
body = { visibility: mode };
|
|
2633
2657
|
if (mode === "grid" && normSpaces.length > 0) body.visibility_spaces = normSpaces;
|
|
2634
2658
|
if (mode === "link") body.link_indexed = indexed === true;
|
|
2635
|
-
requested = mode + (mode === "link" && indexed === true ? " (search-indexed)" : "");
|
|
2636
2659
|
}
|
|
2637
2660
|
} else {
|
|
2638
2661
|
throw new Error(`Unknown visibility '${visibility}'. Use private | grid | link (public = link alias), or the inside/outside axes.`);
|
|
@@ -2679,8 +2702,10 @@ export async function runVisibility(ctx, { target, visibility, inside, outside,
|
|
|
2679
2702
|
last = await patch(route === "runtime" ? runtimePath : inspirationPath);
|
|
2680
2703
|
if (last.res.ok) {
|
|
2681
2704
|
const d = last.data || {};
|
|
2682
|
-
//
|
|
2683
|
-
// the
|
|
2705
|
+
// The confirmation is always derived from the server's echo: stored
|
|
2706
|
+
// axes first, the legacy enum otherwise. Never the request (#372), so
|
|
2707
|
+
// a sparse echo says it is unconfirmed instead of repeating what was
|
|
2708
|
+
// asked for (the CLI's rule: a confirmation is never the typed value).
|
|
2684
2709
|
const lines = [];
|
|
2685
2710
|
if (d.share_scope || d.external_access) {
|
|
2686
2711
|
const insideLine =
|
|
@@ -2692,14 +2717,16 @@ export async function runVisibility(ctx, { target, visibility, inside, outside,
|
|
|
2692
2717
|
d.external_access === "link" ? `anyone with the link${d.require_signin ? " (signed-in accounts only)" : ""}${d.link_indexed ? ", search-indexed" : ""}` :
|
|
2693
2718
|
d.external_access === "public" ? "anyone, findable by search engines" : d.external_access;
|
|
2694
2719
|
lines.push(`Visibility set — inside the grid: ${insideLine}; outside: ${outsideLine}.`);
|
|
2720
|
+
} else if (d.visibility) {
|
|
2721
|
+
lines.push(`Visibility is now ${d.visibility}.`);
|
|
2695
2722
|
} else {
|
|
2696
|
-
lines.push(
|
|
2723
|
+
lines.push("The change was accepted, but the server did not report the stored visibility, so it is not confirmed here. Check it in the Console before telling the user it changed.");
|
|
2697
2724
|
}
|
|
2698
2725
|
if (d.url) lines.push(d.url);
|
|
2699
2726
|
return {
|
|
2700
2727
|
text: lines.join("\n"),
|
|
2701
2728
|
structured: {
|
|
2702
|
-
visibility: d.visibility ||
|
|
2729
|
+
visibility: d.visibility || undefined,
|
|
2703
2730
|
...(d.share_scope ? { share_scope: d.share_scope } : {}),
|
|
2704
2731
|
...(d.external_access ? { external_access: d.external_access } : {}),
|
|
2705
2732
|
...(d.require_signin !== undefined ? { require_signin: d.require_signin === true } : {}),
|