@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.
Files changed (84) hide show
  1. package/README.md +2 -2
  2. package/package.json +10 -3
  3. package/src/corpus/cli-reference.md +8 -8
  4. package/src/corpus/cloudgrid-yaml.md +5 -5
  5. package/src/corpus/cookbook.md +1 -1
  6. package/src/corpus/playbook.md +1 -1
  7. package/src/corpus/skill-brain.md +1 -1
  8. package/src/corpus/skill-claim.md +2 -2
  9. package/src/corpus/skill-feedback.md +5 -5
  10. package/src/corpus/skill-plug.md +4 -4
  11. package/src/corpus/templates/_cloudgrid.yaml.reference +7 -7
  12. package/src/corpus/templates/admin-dashboard/cloudgrid.yaml +7 -7
  13. package/src/corpus/templates/ai-app/cloudgrid.yaml +7 -7
  14. package/src/corpus/templates/ai-knowledge-base/AGENTS.md +1 -1
  15. package/src/corpus/templates/ai-knowledge-base/cloudgrid.yaml +7 -7
  16. package/src/corpus/templates/analytics-dashboard/cloudgrid.yaml +7 -7
  17. package/src/corpus/templates/api-dashboard/cloudgrid.yaml +7 -7
  18. package/src/corpus/templates/api-docs/cloudgrid.yaml +7 -7
  19. package/src/corpus/templates/api-service/cloudgrid.yaml +7 -7
  20. package/src/corpus/templates/app-with-data/cloudgrid.yaml +7 -7
  21. package/src/corpus/templates/appointment-booking/cloudgrid.yaml +7 -7
  22. package/src/corpus/templates/approval-workflow/cloudgrid.yaml +7 -7
  23. package/src/corpus/templates/billing-dashboard/cloudgrid.yaml +7 -7
  24. package/src/corpus/templates/blog-cms/cloudgrid.yaml +7 -7
  25. package/src/corpus/templates/booking-system/cloudgrid.yaml +7 -7
  26. package/src/corpus/templates/calendar-scheduler/AGENTS.md +1 -1
  27. package/src/corpus/templates/calendar-scheduler/cloudgrid.yaml +7 -7
  28. package/src/corpus/templates/changelog/cloudgrid.yaml +7 -7
  29. package/src/corpus/templates/company-website/cloudgrid.yaml +7 -7
  30. package/src/corpus/templates/course-platform/cloudgrid.yaml +7 -7
  31. package/src/corpus/templates/crm/cloudgrid.yaml +7 -7
  32. package/src/corpus/templates/dashboard/cloudgrid.yaml +7 -7
  33. package/src/corpus/templates/deck/cloudgrid.yaml +7 -7
  34. package/src/corpus/templates/directory/cloudgrid.yaml +7 -7
  35. package/src/corpus/templates/docs-site/cloudgrid.yaml +7 -7
  36. package/src/corpus/templates/erp/cloudgrid.yaml +7 -7
  37. package/src/corpus/templates/event-board/cloudgrid.yaml +7 -7
  38. package/src/corpus/templates/expense-tracker/cloudgrid.yaml +7 -7
  39. package/src/corpus/templates/feature-request-board/cloudgrid.yaml +7 -7
  40. package/src/corpus/templates/financial-dashboard/cloudgrid.yaml +7 -7
  41. package/src/corpus/templates/forum/cloudgrid.yaml +7 -7
  42. package/src/corpus/templates/hr-portal/cloudgrid.yaml +7 -7
  43. package/src/corpus/templates/internal-tools-portal/cloudgrid.yaml +7 -7
  44. package/src/corpus/templates/inventory/cloudgrid.yaml +7 -7
  45. package/src/corpus/templates/invoice/cloudgrid.yaml +7 -7
  46. package/src/corpus/templates/job-board/cloudgrid.yaml +7 -7
  47. package/src/corpus/templates/kanban/cloudgrid.yaml +7 -7
  48. package/src/corpus/templates/landing-page/cloudgrid.yaml +7 -7
  49. package/src/corpus/templates/lms/cloudgrid.yaml +7 -7
  50. package/src/corpus/templates/marketplace/AGENTS.md +1 -1
  51. package/src/corpus/templates/marketplace/cloudgrid.yaml +7 -7
  52. package/src/corpus/templates/membership-site/cloudgrid.yaml +7 -7
  53. package/src/corpus/templates/monitoring-dashboard/cloudgrid.yaml +7 -7
  54. package/src/corpus/templates/multi-service/cloudgrid.yaml +7 -7
  55. package/src/corpus/templates/online-store/cloudgrid.yaml +7 -7
  56. package/src/corpus/templates/portfolio/cloudgrid.yaml +7 -7
  57. package/src/corpus/templates/product-catalog/cloudgrid.yaml +7 -7
  58. package/src/corpus/templates/product-launch/cloudgrid.yaml +7 -7
  59. package/src/corpus/templates/project-management/cloudgrid.yaml +7 -7
  60. package/src/corpus/templates/property-listings/cloudgrid.yaml +7 -7
  61. package/src/corpus/templates/quiz-platform/cloudgrid.yaml +7 -7
  62. package/src/corpus/templates/report/cloudgrid.yaml +7 -7
  63. package/src/corpus/templates/restaurant-reservations/cloudgrid.yaml +7 -7
  64. package/src/corpus/templates/revenue-dashboard/cloudgrid.yaml +7 -7
  65. package/src/corpus/templates/saas-marketing/cloudgrid.yaml +7 -7
  66. package/src/corpus/templates/semantic-search/cloudgrid.yaml +7 -7
  67. package/src/corpus/templates/semantic-search/services/backend/requirements.txt +2 -2
  68. package/src/corpus/templates/semantic-search/services/refresh/requirements.txt +2 -2
  69. package/src/corpus/templates/semantic-search/services/web/package-lock.json +3 -3
  70. package/src/corpus/templates/simple-semantic-search/cloudgrid.yaml +7 -7
  71. package/src/corpus/templates/status-page/cloudgrid.yaml +7 -7
  72. package/src/corpus/templates/subscription-management/cloudgrid.yaml +7 -7
  73. package/src/corpus/templates/task-manager/cloudgrid.yaml +7 -7
  74. package/src/corpus/templates/ticket-system/cloudgrid.yaml +7 -7
  75. package/src/corpus/templates/time-tracking/cloudgrid.yaml +7 -7
  76. package/src/corpus/templates/travel-booking/cloudgrid.yaml +7 -7
  77. package/src/corpus/templates/waitlist/cloudgrid.yaml +7 -7
  78. package/src/corpus/templates/web-app/cloudgrid.yaml +7 -7
  79. package/src/corpus/workflows/forum.md +1 -1
  80. package/src/corpus/workflows/simple-semantic-search.md +1 -1
  81. package/src/tools/constants.js +4 -1
  82. package/src/tools/deploy.js +37 -10
  83. package/src/tools/register.js +49 -58
  84. 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>--<org>.cloudgrid.io
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 org's default channel on deploy failure.
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
- # - org:atomic/billing-api
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
- # # - org:atomic/frontend
115
+ # # - atomic/frontend
116
116
 
117
117
 
118
118
  # ─── VAULT ──────────────────────────────────────────────────────────────────
119
119
 
120
- # Map org vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
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>--<org>.cloudgrid.io
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 org's default channel on deploy failure.
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
- # - org:atomic/billing-api
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
- # # - org:atomic/frontend
115
+ # # - atomic/frontend
116
116
 
117
117
 
118
118
  # ─── VAULT ──────────────────────────────────────────────────────────────────
119
119
 
120
- # Map org vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
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>--<org>.cloudgrid.io
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 org's default channel on deploy failure.
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
- # - org:atomic/billing-api
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
- # # - org:atomic/frontend
115
+ # # - atomic/frontend
116
116
 
117
117
 
118
118
  # ─── VAULT ──────────────────────────────────────────────────────────────────
119
119
 
120
- # Map org vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
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>--<org>.cloudgrid.io
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 org's default channel on deploy failure.
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
- # - org:atomic/billing-api
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
- # # - org:atomic/frontend
115
+ # # - atomic/frontend
116
116
 
117
117
 
118
118
  # ─── VAULT ──────────────────────────────────────────────────────────────────
119
119
 
120
- # Map org vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
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>--<org>.cloudgrid.io
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 org's default channel on deploy failure.
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
- # - org:atomic/billing-api
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
- # # - org:atomic/frontend
115
+ # # - atomic/frontend
116
116
 
117
117
 
118
118
  # ─── VAULT ──────────────────────────────────────────────────────────────────
119
119
 
120
- # Map org vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
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>--<org>.cloudgrid.io
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 org's default channel on deploy failure.
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
- # - org:atomic/billing-api
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
- # # - org:atomic/frontend
115
+ # # - atomic/frontend
116
116
 
117
117
 
118
118
  # ─── VAULT ──────────────────────────────────────────────────────────────────
119
119
  #
120
- # Map org vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
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>--<org>.cloudgrid.io
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 org's default channel on deploy failure.
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
- # - org:atomic/billing-api
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
- # # - org:atomic/frontend
115
+ # # - atomic/frontend
116
116
 
117
117
 
118
118
  # ─── VAULT ──────────────────────────────────────────────────────────────────
119
119
 
120
- # Map org vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
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>--<org>.cloudgrid.io
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 org's default channel on deploy failure.
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
- # - org:atomic/billing-api
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
- # # - org:atomic/frontend
121
+ # # - atomic/frontend
122
122
 
123
123
 
124
124
  # ─── VAULT ──────────────────────────────────────────────────────────────────
125
125
 
126
- # Map org vault items to env vars. Keys UPPER_SNAKE_CASE; values = vault item keys.
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 org vault (vault block maps items to env vars). Declare the canonical needs
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 / org / slug binding) is WRITTEN BY THE CLI on
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
 
@@ -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
- export const CONSOLE_URL = "https://console.cloudgrid.io/";
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
@@ -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
- // Prefer the server's stored axes (stored axes are authoritative on
2683
- // the wire); fall back to what we asked for.
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(`Visibility is now ${d.visibility || requested}.`);
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 || (useAxes ? undefined : String(visibility || "").trim().toLowerCase() || undefined),
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 } : {}),