@cloudgrid-io/mcp 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/corpus/capability-map.md +82 -2
- package/src/corpus/examples/crm/index.md +273 -0
- package/src/corpus/examples/kanban/index.md +256 -0
- package/src/corpus/templates/_cloudgrid.yaml.reference +228 -0
- package/src/corpus/templates/admin-dashboard/README.md +75 -0
- package/src/corpus/templates/admin-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/admin-dashboard/index.md +81 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/api/orders/route.js +64 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/api/users/route.js +63 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/layout.js +39 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/page.js +73 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/resource-table.js +94 -0
- package/src/corpus/templates/admin-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/admin-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/ai-app/cloudgrid.yaml +225 -11
- package/src/corpus/templates/ai-app/index.md +3 -11
- package/src/corpus/templates/ai-knowledge-base/AGENTS.md +254 -0
- package/src/corpus/templates/ai-knowledge-base/README.md +28 -0
- package/src/corpus/templates/ai-knowledge-base/cloudgrid.yaml +238 -0
- package/src/corpus/templates/ai-knowledge-base/index.md +81 -0
- package/src/corpus/templates/analytics-dashboard/README.md +85 -0
- package/src/corpus/templates/analytics-dashboard/cloudgrid.yaml +232 -0
- package/src/corpus/templates/analytics-dashboard/index.md +316 -0
- package/src/corpus/templates/analytics-dashboard/services/web/app/api/events/route.js +60 -0
- package/src/corpus/templates/analytics-dashboard/services/web/app/event-form.js +100 -0
- package/src/corpus/templates/analytics-dashboard/services/web/app/layout.js +41 -0
- package/src/corpus/templates/analytics-dashboard/services/web/app/page.js +54 -0
- package/src/corpus/templates/analytics-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/analytics-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/api-dashboard/README.md +84 -0
- package/src/corpus/templates/api-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/api-dashboard/index.md +310 -0
- package/src/corpus/templates/api-dashboard/services/web/app/api/requests/route.js +62 -0
- package/src/corpus/templates/api-dashboard/services/web/app/dashboard.js +156 -0
- package/src/corpus/templates/api-dashboard/services/web/app/layout.js +42 -0
- package/src/corpus/templates/api-dashboard/services/web/app/page.js +39 -0
- package/src/corpus/templates/api-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/api-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/api-docs/README.md +28 -0
- package/src/corpus/templates/api-docs/cloudgrid.yaml +228 -0
- package/src/corpus/templates/api-docs/index.html +136 -0
- package/src/corpus/templates/api-docs/index.md +28 -0
- package/src/corpus/templates/api-service/cloudgrid.yaml +224 -9
- package/src/corpus/templates/api-service/index.md +3 -11
- package/src/corpus/templates/app-with-data/cloudgrid.yaml +226 -8
- package/src/corpus/templates/app-with-data/index.md +3 -8
- package/src/corpus/templates/appointment-booking/AGENTS.md +223 -0
- package/src/corpus/templates/appointment-booking/README.md +16 -0
- package/src/corpus/templates/appointment-booking/cloudgrid.yaml +250 -0
- package/src/corpus/templates/appointment-booking/index.md +72 -0
- package/src/corpus/templates/approval-workflow/AGENTS.md +170 -0
- package/src/corpus/templates/approval-workflow/README.md +12 -0
- package/src/corpus/templates/approval-workflow/cloudgrid.yaml +237 -0
- package/src/corpus/templates/approval-workflow/index.md +58 -0
- package/src/corpus/templates/billing-dashboard/AGENTS.md +199 -0
- package/src/corpus/templates/billing-dashboard/README.md +18 -0
- package/src/corpus/templates/billing-dashboard/cloudgrid.yaml +235 -0
- package/src/corpus/templates/billing-dashboard/index.md +87 -0
- package/src/corpus/templates/blog-cms/README.md +94 -0
- package/src/corpus/templates/blog-cms/cloudgrid.yaml +233 -0
- package/src/corpus/templates/blog-cms/index.md +358 -0
- package/src/corpus/templates/blog-cms/services/web/app/admin/admin-editor.js +133 -0
- package/src/corpus/templates/blog-cms/services/web/app/admin/page.js +33 -0
- package/src/corpus/templates/blog-cms/services/web/app/api/posts/route.js +84 -0
- package/src/corpus/templates/blog-cms/services/web/app/layout.js +47 -0
- package/src/corpus/templates/blog-cms/services/web/app/page.js +56 -0
- package/src/corpus/templates/blog-cms/services/web/app/posts/[slug]/page.js +45 -0
- package/src/corpus/templates/blog-cms/services/web/lib/db.js +32 -0
- package/src/corpus/templates/blog-cms/services/web/package.json +16 -0
- package/src/corpus/templates/booking-system/AGENTS.md +189 -0
- package/src/corpus/templates/booking-system/README.md +17 -0
- package/src/corpus/templates/booking-system/cloudgrid.yaml +248 -0
- package/src/corpus/templates/booking-system/index.md +86 -0
- package/src/corpus/templates/calendar-scheduler/AGENTS.md +226 -0
- package/src/corpus/templates/calendar-scheduler/README.md +25 -0
- package/src/corpus/templates/calendar-scheduler/cloudgrid.yaml +259 -0
- package/src/corpus/templates/calendar-scheduler/index.md +85 -0
- package/src/corpus/templates/changelog/README.md +27 -0
- package/src/corpus/templates/changelog/cloudgrid.yaml +228 -0
- package/src/corpus/templates/changelog/index.html +80 -0
- package/src/corpus/templates/changelog/index.md +28 -0
- package/src/corpus/templates/company-website/README.md +54 -0
- package/src/corpus/templates/company-website/cloudgrid.yaml +233 -0
- package/src/corpus/templates/company-website/index.html +309 -0
- package/src/corpus/templates/company-website/index.md +29 -0
- package/src/corpus/templates/course-platform/AGENTS.md +161 -0
- package/src/corpus/templates/course-platform/README.md +26 -0
- package/src/corpus/templates/course-platform/cloudgrid.yaml +237 -0
- package/src/corpus/templates/course-platform/index.md +70 -0
- package/src/corpus/templates/crm/README.md +72 -0
- package/src/corpus/templates/crm/cloudgrid.yaml +233 -0
- package/src/corpus/templates/crm/index.md +71 -0
- package/src/corpus/templates/crm/services/web/app/api/contacts/route.js +80 -0
- package/src/corpus/templates/crm/services/web/app/contact-manager.js +102 -0
- package/src/corpus/templates/crm/services/web/app/layout.js +35 -0
- package/src/corpus/templates/crm/services/web/app/page.js +34 -0
- package/src/corpus/templates/crm/services/web/lib/db.js +32 -0
- package/src/corpus/templates/crm/services/web/package.json +16 -0
- package/src/corpus/templates/dashboard/cloudgrid.yaml +228 -4
- package/src/corpus/templates/dashboard/index.md +3 -5
- package/src/corpus/templates/deck/cloudgrid.yaml +228 -4
- package/src/corpus/templates/deck/index.md +3 -5
- package/src/corpus/templates/directory/README.md +75 -0
- package/src/corpus/templates/directory/cloudgrid.yaml +233 -0
- package/src/corpus/templates/directory/index.md +334 -0
- package/src/corpus/templates/directory/services/web/app/api/entries/route.js +63 -0
- package/src/corpus/templates/directory/services/web/app/directory-list.js +146 -0
- package/src/corpus/templates/directory/services/web/app/layout.js +44 -0
- package/src/corpus/templates/directory/services/web/app/page.js +38 -0
- package/src/corpus/templates/directory/services/web/lib/db.js +32 -0
- package/src/corpus/templates/directory/services/web/package.json +16 -0
- package/src/corpus/templates/docs-site/README.md +28 -0
- package/src/corpus/templates/docs-site/cloudgrid.yaml +228 -0
- package/src/corpus/templates/docs-site/index.html +122 -0
- package/src/corpus/templates/docs-site/index.md +28 -0
- package/src/corpus/templates/erp/AGENTS.md +116 -0
- package/src/corpus/templates/erp/README.md +17 -0
- package/src/corpus/templates/erp/cloudgrid.yaml +235 -0
- package/src/corpus/templates/erp/index.md +81 -0
- package/src/corpus/templates/event-board/README.md +74 -0
- package/src/corpus/templates/event-board/cloudgrid.yaml +233 -0
- package/src/corpus/templates/event-board/index.md +299 -0
- package/src/corpus/templates/event-board/services/web/app/api/events/route.js +61 -0
- package/src/corpus/templates/event-board/services/web/app/event-form.js +118 -0
- package/src/corpus/templates/event-board/services/web/app/layout.js +39 -0
- package/src/corpus/templates/event-board/services/web/app/page.js +34 -0
- package/src/corpus/templates/event-board/services/web/lib/db.js +32 -0
- package/src/corpus/templates/event-board/services/web/package.json +16 -0
- package/src/corpus/templates/expense-tracker/README.md +76 -0
- package/src/corpus/templates/expense-tracker/cloudgrid.yaml +233 -0
- package/src/corpus/templates/expense-tracker/index.md +305 -0
- package/src/corpus/templates/expense-tracker/services/web/app/api/expenses/route.js +61 -0
- package/src/corpus/templates/expense-tracker/services/web/app/expense-form.js +145 -0
- package/src/corpus/templates/expense-tracker/services/web/app/layout.js +42 -0
- package/src/corpus/templates/expense-tracker/services/web/app/page.js +34 -0
- package/src/corpus/templates/expense-tracker/services/web/lib/db.js +32 -0
- package/src/corpus/templates/expense-tracker/services/web/package.json +16 -0
- package/src/corpus/templates/feature-request-board/README.md +87 -0
- package/src/corpus/templates/feature-request-board/cloudgrid.yaml +233 -0
- package/src/corpus/templates/feature-request-board/index.md +317 -0
- package/src/corpus/templates/feature-request-board/services/web/app/api/requests/route.js +92 -0
- package/src/corpus/templates/feature-request-board/services/web/app/board.js +91 -0
- package/src/corpus/templates/feature-request-board/services/web/app/layout.js +43 -0
- package/src/corpus/templates/feature-request-board/services/web/app/page.js +35 -0
- package/src/corpus/templates/feature-request-board/services/web/lib/db.js +32 -0
- package/src/corpus/templates/feature-request-board/services/web/package.json +16 -0
- package/src/corpus/templates/financial-dashboard/README.md +80 -0
- package/src/corpus/templates/financial-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/financial-dashboard/index.md +326 -0
- package/src/corpus/templates/financial-dashboard/services/web/app/api/entries/route.js +63 -0
- package/src/corpus/templates/financial-dashboard/services/web/app/entry-board.js +130 -0
- package/src/corpus/templates/financial-dashboard/services/web/app/layout.js +46 -0
- package/src/corpus/templates/financial-dashboard/services/web/app/page.js +31 -0
- package/src/corpus/templates/financial-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/financial-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/forum/AGENTS.md +196 -0
- package/src/corpus/templates/forum/README.md +12 -0
- package/src/corpus/templates/forum/cloudgrid.yaml +237 -0
- package/src/corpus/templates/forum/index.md +66 -0
- package/src/corpus/templates/hr-portal/AGENTS.md +174 -0
- package/src/corpus/templates/hr-portal/README.md +14 -0
- package/src/corpus/templates/hr-portal/cloudgrid.yaml +237 -0
- package/src/corpus/templates/hr-portal/index.md +56 -0
- package/src/corpus/templates/internal-tools-portal/AGENTS.md +201 -0
- package/src/corpus/templates/internal-tools-portal/README.md +17 -0
- package/src/corpus/templates/internal-tools-portal/cloudgrid.yaml +237 -0
- package/src/corpus/templates/internal-tools-portal/index.md +62 -0
- package/src/corpus/templates/inventory/README.md +71 -0
- package/src/corpus/templates/inventory/cloudgrid.yaml +233 -0
- package/src/corpus/templates/inventory/index.md +68 -0
- package/src/corpus/templates/inventory/services/web/app/api/items/route.js +88 -0
- package/src/corpus/templates/inventory/services/web/app/inventory-manager.js +101 -0
- package/src/corpus/templates/inventory/services/web/app/layout.js +36 -0
- package/src/corpus/templates/inventory/services/web/app/page.js +37 -0
- package/src/corpus/templates/inventory/services/web/lib/db.js +32 -0
- package/src/corpus/templates/inventory/services/web/package.json +16 -0
- package/src/corpus/templates/invoice/README.md +71 -0
- package/src/corpus/templates/invoice/cloudgrid.yaml +233 -0
- package/src/corpus/templates/invoice/index.md +68 -0
- package/src/corpus/templates/invoice/services/web/app/api/invoices/route.js +82 -0
- package/src/corpus/templates/invoice/services/web/app/invoice-manager.js +101 -0
- package/src/corpus/templates/invoice/services/web/app/layout.js +35 -0
- package/src/corpus/templates/invoice/services/web/app/page.js +34 -0
- package/src/corpus/templates/invoice/services/web/lib/db.js +32 -0
- package/src/corpus/templates/invoice/services/web/package.json +16 -0
- package/src/corpus/templates/job-board/README.md +71 -0
- package/src/corpus/templates/job-board/cloudgrid.yaml +233 -0
- package/src/corpus/templates/job-board/index.md +68 -0
- package/src/corpus/templates/job-board/services/web/app/api/jobs/route.js +66 -0
- package/src/corpus/templates/job-board/services/web/app/job-board.js +73 -0
- package/src/corpus/templates/job-board/services/web/app/layout.js +35 -0
- package/src/corpus/templates/job-board/services/web/app/page.js +32 -0
- package/src/corpus/templates/job-board/services/web/lib/db.js +32 -0
- package/src/corpus/templates/job-board/services/web/package.json +16 -0
- package/src/corpus/templates/kanban/README.md +72 -0
- package/src/corpus/templates/kanban/cloudgrid.yaml +233 -0
- package/src/corpus/templates/kanban/index.md +71 -0
- package/src/corpus/templates/kanban/services/web/app/api/cards/route.js +70 -0
- package/src/corpus/templates/kanban/services/web/app/board.js +93 -0
- package/src/corpus/templates/kanban/services/web/app/layout.js +37 -0
- package/src/corpus/templates/kanban/services/web/app/page.js +32 -0
- package/src/corpus/templates/kanban/services/web/lib/db.js +32 -0
- package/src/corpus/templates/kanban/services/web/package.json +16 -0
- package/src/corpus/templates/landing-page/cloudgrid.yaml +228 -4
- package/src/corpus/templates/landing-page/index.md +3 -5
- package/src/corpus/templates/lms/AGENTS.md +193 -0
- package/src/corpus/templates/lms/README.md +27 -0
- package/src/corpus/templates/lms/cloudgrid.yaml +237 -0
- package/src/corpus/templates/lms/index.md +79 -0
- package/src/corpus/templates/marketplace/AGENTS.md +208 -0
- package/src/corpus/templates/marketplace/README.md +22 -0
- package/src/corpus/templates/marketplace/cloudgrid.yaml +233 -0
- package/src/corpus/templates/marketplace/index.md +76 -0
- package/src/corpus/templates/membership-site/AGENTS.md +160 -0
- package/src/corpus/templates/membership-site/README.md +18 -0
- package/src/corpus/templates/membership-site/cloudgrid.yaml +236 -0
- package/src/corpus/templates/membership-site/index.md +66 -0
- package/src/corpus/templates/monitoring-dashboard/README.md +84 -0
- package/src/corpus/templates/monitoring-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/monitoring-dashboard/index.md +328 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/app/api/checks/route.js +76 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/app/check-form.js +124 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/app/layout.js +44 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/app/page.js +49 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/online-store/AGENTS.md +153 -0
- package/src/corpus/templates/online-store/README.md +16 -0
- package/src/corpus/templates/online-store/cloudgrid.yaml +234 -0
- package/src/corpus/templates/online-store/index.md +81 -0
- package/src/corpus/templates/portfolio/README.md +29 -0
- package/src/corpus/templates/portfolio/cloudgrid.yaml +228 -0
- package/src/corpus/templates/portfolio/index.html +126 -0
- package/src/corpus/templates/portfolio/index.md +28 -0
- package/src/corpus/templates/product-catalog/README.md +74 -0
- package/src/corpus/templates/product-catalog/cloudgrid.yaml +232 -0
- package/src/corpus/templates/product-catalog/index.md +330 -0
- package/src/corpus/templates/product-catalog/services/web/app/api/products/route.js +69 -0
- package/src/corpus/templates/product-catalog/services/web/app/catalog.js +153 -0
- package/src/corpus/templates/product-catalog/services/web/app/layout.js +49 -0
- package/src/corpus/templates/product-catalog/services/web/app/page.js +36 -0
- package/src/corpus/templates/product-catalog/services/web/lib/db.js +32 -0
- package/src/corpus/templates/product-catalog/services/web/package.json +16 -0
- package/src/corpus/templates/product-launch/README.md +46 -0
- package/src/corpus/templates/product-launch/cloudgrid.yaml +234 -0
- package/src/corpus/templates/product-launch/index.html +320 -0
- package/src/corpus/templates/product-launch/index.md +34 -0
- package/src/corpus/templates/project-management/README.md +83 -0
- package/src/corpus/templates/project-management/cloudgrid.yaml +233 -0
- package/src/corpus/templates/project-management/index.md +346 -0
- package/src/corpus/templates/project-management/services/web/app/api/projects/route.js +48 -0
- package/src/corpus/templates/project-management/services/web/app/api/tasks/route.js +85 -0
- package/src/corpus/templates/project-management/services/web/app/board.js +182 -0
- package/src/corpus/templates/project-management/services/web/app/layout.js +45 -0
- package/src/corpus/templates/project-management/services/web/app/page.js +49 -0
- package/src/corpus/templates/project-management/services/web/lib/db.js +32 -0
- package/src/corpus/templates/project-management/services/web/package.json +16 -0
- package/src/corpus/templates/property-listings/README.md +76 -0
- package/src/corpus/templates/property-listings/cloudgrid.yaml +233 -0
- package/src/corpus/templates/property-listings/index.md +335 -0
- package/src/corpus/templates/property-listings/services/web/app/api/properties/route.js +73 -0
- package/src/corpus/templates/property-listings/services/web/app/layout.js +45 -0
- package/src/corpus/templates/property-listings/services/web/app/listings.js +152 -0
- package/src/corpus/templates/property-listings/services/web/app/page.js +53 -0
- package/src/corpus/templates/property-listings/services/web/lib/db.js +32 -0
- package/src/corpus/templates/property-listings/services/web/package.json +16 -0
- package/src/corpus/templates/quiz-platform/README.md +84 -0
- package/src/corpus/templates/quiz-platform/cloudgrid.yaml +233 -0
- package/src/corpus/templates/quiz-platform/index.md +313 -0
- package/src/corpus/templates/quiz-platform/services/web/app/api/questions/route.js +69 -0
- package/src/corpus/templates/quiz-platform/services/web/app/layout.js +47 -0
- package/src/corpus/templates/quiz-platform/services/web/app/page.js +37 -0
- package/src/corpus/templates/quiz-platform/services/web/app/quiz.js +188 -0
- package/src/corpus/templates/quiz-platform/services/web/lib/db.js +32 -0
- package/src/corpus/templates/quiz-platform/services/web/package.json +16 -0
- package/src/corpus/templates/report/cloudgrid.yaml +228 -4
- package/src/corpus/templates/report/index.md +3 -5
- package/src/corpus/templates/restaurant-reservations/AGENTS.md +258 -0
- package/src/corpus/templates/restaurant-reservations/README.md +17 -0
- package/src/corpus/templates/restaurant-reservations/cloudgrid.yaml +258 -0
- package/src/corpus/templates/restaurant-reservations/index.md +62 -0
- package/src/corpus/templates/revenue-dashboard/README.md +75 -0
- package/src/corpus/templates/revenue-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/revenue-dashboard/index.md +307 -0
- package/src/corpus/templates/revenue-dashboard/services/web/app/api/sales/route.js +60 -0
- package/src/corpus/templates/revenue-dashboard/services/web/app/layout.js +40 -0
- package/src/corpus/templates/revenue-dashboard/services/web/app/page.js +87 -0
- package/src/corpus/templates/revenue-dashboard/services/web/app/sale-form.js +63 -0
- package/src/corpus/templates/revenue-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/revenue-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/saas-marketing/README.md +30 -0
- package/src/corpus/templates/saas-marketing/cloudgrid.yaml +228 -0
- package/src/corpus/templates/saas-marketing/index.html +212 -0
- package/src/corpus/templates/saas-marketing/index.md +28 -0
- package/src/corpus/templates/status-page/README.md +28 -0
- package/src/corpus/templates/status-page/cloudgrid.yaml +228 -0
- package/src/corpus/templates/status-page/index.html +117 -0
- package/src/corpus/templates/status-page/index.md +28 -0
- package/src/corpus/templates/subscription-management/AGENTS.md +191 -0
- package/src/corpus/templates/subscription-management/README.md +21 -0
- package/src/corpus/templates/subscription-management/cloudgrid.yaml +236 -0
- package/src/corpus/templates/subscription-management/index.md +73 -0
- package/src/corpus/templates/task-manager/README.md +72 -0
- package/src/corpus/templates/task-manager/cloudgrid.yaml +233 -0
- package/src/corpus/templates/task-manager/index.md +71 -0
- package/src/corpus/templates/task-manager/services/web/app/api/tasks/route.js +77 -0
- package/src/corpus/templates/task-manager/services/web/app/layout.js +39 -0
- package/src/corpus/templates/task-manager/services/web/app/page.js +33 -0
- package/src/corpus/templates/task-manager/services/web/app/task-list.js +110 -0
- package/src/corpus/templates/task-manager/services/web/lib/db.js +32 -0
- package/src/corpus/templates/task-manager/services/web/package.json +16 -0
- package/src/corpus/templates/ticket-system/README.md +71 -0
- package/src/corpus/templates/ticket-system/cloudgrid.yaml +233 -0
- package/src/corpus/templates/ticket-system/index.md +68 -0
- package/src/corpus/templates/ticket-system/services/web/app/api/tickets/route.js +81 -0
- package/src/corpus/templates/ticket-system/services/web/app/layout.js +36 -0
- package/src/corpus/templates/ticket-system/services/web/app/page.js +35 -0
- package/src/corpus/templates/ticket-system/services/web/app/ticket-queue.js +112 -0
- package/src/corpus/templates/ticket-system/services/web/lib/db.js +32 -0
- package/src/corpus/templates/ticket-system/services/web/package.json +16 -0
- package/src/corpus/templates/time-tracking/README.md +81 -0
- package/src/corpus/templates/time-tracking/cloudgrid.yaml +233 -0
- package/src/corpus/templates/time-tracking/index.md +298 -0
- package/src/corpus/templates/time-tracking/services/web/app/api/entries/route.js +66 -0
- package/src/corpus/templates/time-tracking/services/web/app/entry-form.js +106 -0
- package/src/corpus/templates/time-tracking/services/web/app/layout.js +39 -0
- package/src/corpus/templates/time-tracking/services/web/app/page.js +30 -0
- package/src/corpus/templates/time-tracking/services/web/lib/db.js +32 -0
- package/src/corpus/templates/time-tracking/services/web/package.json +16 -0
- package/src/corpus/templates/travel-booking/AGENTS.md +207 -0
- package/src/corpus/templates/travel-booking/README.md +17 -0
- package/src/corpus/templates/travel-booking/cloudgrid.yaml +249 -0
- package/src/corpus/templates/travel-booking/index.md +88 -0
- package/src/corpus/templates/waitlist/README.md +38 -0
- package/src/corpus/templates/waitlist/cloudgrid.yaml +228 -0
- package/src/corpus/templates/waitlist/index.html +69 -0
- package/src/corpus/templates/waitlist/index.md +39 -0
- package/src/corpus/templates/web-app/cloudgrid.yaml +228 -4
- package/src/corpus/templates/web-app/index.md +3 -5
- package/src/corpus/workflows/admin-dashboard.md +102 -0
- package/src/corpus/workflows/ai-knowledge-base.md +137 -0
- package/src/corpus/workflows/analytics-dashboard.md +104 -0
- package/src/corpus/workflows/api-dashboard.md +102 -0
- package/src/corpus/workflows/api-docs.md +36 -0
- package/src/corpus/workflows/appointment-booking.md +143 -0
- package/src/corpus/workflows/approval-workflow.md +124 -0
- package/src/corpus/workflows/billing-dashboard.md +120 -0
- package/src/corpus/workflows/blog-cms.md +104 -0
- package/src/corpus/workflows/booking-system.md +116 -0
- package/src/corpus/workflows/calendar-scheduler.md +134 -0
- package/src/corpus/workflows/changelog.md +33 -0
- package/src/corpus/workflows/company-website.md +46 -0
- package/src/corpus/workflows/course-platform.md +126 -0
- package/src/corpus/workflows/crm.md +101 -0
- package/src/corpus/workflows/directory.md +101 -0
- package/src/corpus/workflows/docs-site.md +35 -0
- package/src/corpus/workflows/erp.md +125 -0
- package/src/corpus/workflows/event-board.md +102 -0
- package/src/corpus/workflows/expense-tracker.md +102 -0
- package/src/corpus/workflows/feature-request-board.md +105 -0
- package/src/corpus/workflows/financial-dashboard.md +103 -0
- package/src/corpus/workflows/forum.md +128 -0
- package/src/corpus/workflows/hr-portal.md +115 -0
- package/src/corpus/workflows/internal-tools-portal.md +125 -0
- package/src/corpus/workflows/inventory.md +101 -0
- package/src/corpus/workflows/invoice.md +101 -0
- package/src/corpus/workflows/job-board.md +101 -0
- package/src/corpus/workflows/kanban.md +102 -0
- package/src/corpus/workflows/lms.md +113 -0
- package/src/corpus/workflows/marketplace.md +123 -0
- package/src/corpus/workflows/membership-site.md +128 -0
- package/src/corpus/workflows/monitoring-dashboard.md +104 -0
- package/src/corpus/workflows/online-store.md +114 -0
- package/src/corpus/workflows/portfolio.md +35 -0
- package/src/corpus/workflows/product-catalog.md +105 -0
- package/src/corpus/workflows/product-launch.md +43 -0
- package/src/corpus/workflows/project-management.md +106 -0
- package/src/corpus/workflows/property-listings.md +101 -0
- package/src/corpus/workflows/quiz-platform.md +105 -0
- package/src/corpus/workflows/restaurant-reservations.md +123 -0
- package/src/corpus/workflows/revenue-dashboard.md +102 -0
- package/src/corpus/workflows/saas-marketing.md +37 -0
- package/src/corpus/workflows/status-page.md +35 -0
- package/src/corpus/workflows/subscription-management.md +141 -0
- package/src/corpus/workflows/task-manager.md +101 -0
- package/src/corpus/workflows/ticket-system.md +101 -0
- package/src/corpus/workflows/time-tracking.md +104 -0
- package/src/corpus/workflows/travel-booking.md +115 -0
- package/src/corpus/workflows/waitlist.md +42 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: restaurant-reservations
|
|
3
|
+
when: "restaurant website with reservations, table booking, restaurant site — a public Next.js site with menu content and a persistent reservations/table-booking collection backed by Mongo. Runtime app → local edition. This is a BLUEPRINT: read AGENTS.md for the structure, then build the app."
|
|
4
|
+
needs: database
|
|
5
|
+
deploy: runtime
|
|
6
|
+
editions: local
|
|
7
|
+
kind: blueprint
|
|
8
|
+
capabilities_note: "persistent — needs a database (Mongo). Runtime app, async build, local edition only. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL). Third-party secrets (Stripe deposit, email) go through the `vault:` block. A confirmation-reminder cron service is DESIGNED but NOT deployable yet (platform issue #1543)."
|
|
9
|
+
summary: "BLUEPRINT for a restaurant website with online reservations — a public Next.js + Mongo site (menu content + a reservations / table-booking collection) on the grid. It is structure + cloudgrid.yaml, not runnable code: fetch the template, READ AGENTS.md for the file tree, the menu/reservations/tables collections, and the CloudGrid wiring (DATABASE_MONGODB_URL injection, vault: for Stripe/email secrets, optional auth, deploy/poll), then build the app under services/web/ following it. needs:{database:true} (not requires:). Async runtime deploy, local edition only. Cron reminders are designed but PENDING #1543."
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Workflow: restaurant-reservations
|
|
13
|
+
|
|
14
|
+
The user wants a **restaurant website with online reservations** — a public site
|
|
15
|
+
with menu content and a booking form (optionally table booking) whose
|
|
16
|
+
reservations **persist** and are shared across sessions. That is a **runtime app**
|
|
17
|
+
backed by the grid's shared Mongo, not a static page.
|
|
18
|
+
|
|
19
|
+
**This is a BLUEPRINT.** The template does NOT contain app code — it ships a
|
|
20
|
+
`cloudgrid.yaml` and an `AGENTS.md` structure guide. The recipe is: fetch it,
|
|
21
|
+
**read `AGENTS.md`**, then build the app under `services/web/` following that
|
|
22
|
+
structure (the proven `app-with-data` shape, with a `reservations` domain).
|
|
23
|
+
|
|
24
|
+
Be honest that a runtime deploy is async (not instant like a static drop), that
|
|
25
|
+
it needs the local edition, and that the confirmation-reminder **cron** service
|
|
26
|
+
is designed but **not yet deployable** (platform issue #1543).
|
|
27
|
+
|
|
28
|
+
## 1. Edition check FIRST (hard gate)
|
|
29
|
+
|
|
30
|
+
A persistent app is a built + deployed container. It requires the **local
|
|
31
|
+
edition** (Claude Desktop / Claude Code) or the CLI.
|
|
32
|
+
|
|
33
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
34
|
+
hosted is inline-only and can only publish static pages. Tell the user plainly,
|
|
35
|
+
offer a **static menu page** (no bookings) instead, and STOP the runtime path.
|
|
36
|
+
- **Local edition:** continue.
|
|
37
|
+
|
|
38
|
+
## 2. Auth + grid
|
|
39
|
+
|
|
40
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
41
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
42
|
+
grid, ask which to use; do not assume a target.
|
|
43
|
+
|
|
44
|
+
## 3. Fetch the blueprint and READ AGENTS.md
|
|
45
|
+
|
|
46
|
+
`gridctl_fetch("template", "restaurant-reservations")`. This is a **blueprint**,
|
|
47
|
+
so the deliverable is `cloudgrid.yaml` + `AGENTS.md`, not app code.
|
|
48
|
+
|
|
49
|
+
**Read `AGENTS.md` before building.** It defines:
|
|
50
|
+
- the file tree (`services/web/{app/, lib/, api routes, package.json}`, optional
|
|
51
|
+
Stripe checkout + webhook routes, optional staff auth, a `services/reminder/`
|
|
52
|
+
cron job),
|
|
53
|
+
- the Mongo collections + fields (`menu`, `reservations`, `tables`),
|
|
54
|
+
- how CloudGrid injects the DB (`DATABASE_MONGODB_URL` / legacy `MONGODB_URL`) and
|
|
55
|
+
vault secrets, how to wire Stripe/auth, deploy steps, and the cron shape.
|
|
56
|
+
|
|
57
|
+
## 4. Scaffold + fill
|
|
58
|
+
|
|
59
|
+
1. `gridctl_init` an app `<name>` — creates the entity + `.cloudgrid/link.json`
|
|
60
|
+
and a `cloudgrid.yaml` with an EMPTY `services: {}`. Run `init` FIRST (plug
|
|
61
|
+
needs a linked directory).
|
|
62
|
+
2. Write the app under **`services/web/`** (`path:` is the URL mount, NOT the
|
|
63
|
+
filesystem path), following `AGENTS.md`.
|
|
64
|
+
3. Set `cloudgrid.yaml` to the blueprint's active fields:
|
|
65
|
+
```yaml
|
|
66
|
+
name: my-restaurant
|
|
67
|
+
vault:
|
|
68
|
+
STRIPE_KEY: stripe-live-key # only if taking a deposit
|
|
69
|
+
SENDGRID_API_KEY: sendgrid-key # confirmation / reminder email
|
|
70
|
+
services:
|
|
71
|
+
web:
|
|
72
|
+
type: nextjs
|
|
73
|
+
path: /
|
|
74
|
+
needs:
|
|
75
|
+
database: true
|
|
76
|
+
```
|
|
77
|
+
Declare `needs: { database: true }` (canonical) — the deployer provisions Mongo
|
|
78
|
+
and injects `DATABASE_MONGODB_URL` (+ legacy `MONGODB_URL`). `requires:` is the
|
|
79
|
+
deprecated v1 alias; never author it and never set `needs:` and `requires:`
|
|
80
|
+
together (the validator rejects the combination).
|
|
81
|
+
4. **Read the DB from `process.env.DATABASE_MONGODB_URL`** (legacy `MONGODB_URL`
|
|
82
|
+
fallback) behind a **lazy getter** — never at module top level, or `next build`
|
|
83
|
+
fails. Third-party keys come from the vault-injected env vars
|
|
84
|
+
(`process.env.STRIPE_KEY`, `process.env.SENDGRID_API_KEY`).
|
|
85
|
+
|
|
86
|
+
## 5. Config / secrets
|
|
87
|
+
|
|
88
|
+
- Secret values (Stripe, SendGrid, auth) → `gridctl_secrets` (the `vault:` block
|
|
89
|
+
maps them to env vars). Non-secret config (publishable keys, flags) →
|
|
90
|
+
`gridctl_env`.
|
|
91
|
+
- Do **NOT** set the DB vars yourself (`DATABASE_MONGODB_URL` / `MONGODB_URL`) —
|
|
92
|
+
the grid injects them.
|
|
93
|
+
|
|
94
|
+
## 6. (Optional) Run locally
|
|
95
|
+
|
|
96
|
+
`grid dev` runs Next.js with `DATABASE_MONGODB_URL` and vault vars injected
|
|
97
|
+
against dev Mongo. Seed the `menu` collection, test a booking. Don't require it.
|
|
98
|
+
|
|
99
|
+
## 7. Deploy (async)
|
|
100
|
+
|
|
101
|
+
Deploy `services/web/` with `gridctl_plug`. A **runtime deploy is ASYNC**: the
|
|
102
|
+
first response is `status: building`, NOT a live URL.
|
|
103
|
+
- Poll `gridctl_status` (or the returned poll URL) until live.
|
|
104
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
105
|
+
- Only once live, return the deployed app URL (NOT the build/log link).
|
|
106
|
+
- If Stripe deposits are on, register the live `/api/webhooks/stripe` URL in the
|
|
107
|
+
Stripe dashboard.
|
|
108
|
+
|
|
109
|
+
## 8. Cron reminders — PENDING #1543
|
|
110
|
+
|
|
111
|
+
The design includes a daily cron job that emails reminders to next-day bookings
|
|
112
|
+
(a `reminder:` cron service reading the same injected `DATABASE_MONGODB_URL` +
|
|
113
|
+
`SENDGRID_API_KEY`). **Cron deploy is not yet available (platform issue #1543)** —
|
|
114
|
+
keep the `reminder:` cron block **commented** in `cloudgrid.yaml`; an active cron
|
|
115
|
+
service will be rejected at plug until #1543 lands. Build the rest now; enable
|
|
116
|
+
cron once it ships. See `AGENTS.md` §7 for the intended shape and interim
|
|
117
|
+
workaround.
|
|
118
|
+
|
|
119
|
+
## 9. Return the live URL + iterate
|
|
120
|
+
|
|
121
|
+
Give the user the live app URL — that is the deliverable. To iterate, re-plug the
|
|
122
|
+
SAME entity so it updates the same URL. Keep it honest: blueprint you built out,
|
|
123
|
+
async build, local-edition only, DB + secrets injected by the grid, cron pending.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: revenue-dashboard
|
|
3
|
+
when: revenue dashboard, sales dashboard, MRR/revenue view — a persistent app that records sales and shows total revenue, a per-product breakdown, and recent activity. Needs a database → runtime → local edition.
|
|
4
|
+
needs: database
|
|
5
|
+
deploy: runtime
|
|
6
|
+
editions: local
|
|
7
|
+
capabilities_note: persistent — needs a database (Mongo). Runtime app, async build, local edition only. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL).
|
|
8
|
+
summary: Build a persistent Next.js + Mongo revenue dashboard on the grid — a `sales` collection (product, amount:number, at) rendered as a total-revenue figure, a per-product breakdown, and a recent-sales table with an add form. Edition-gate first, scaffold, put the app under services/web/, wire process.env.DATABASE_MONGODB_URL (legacy MONGODB_URL fallback) lazily, declare needs:{database:true} (not requires:), deploy async, poll to a live URL.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Workflow: revenue-dashboard
|
|
12
|
+
|
|
13
|
+
The user wants a revenue / sales dashboard that **remembers** its sales — a view
|
|
14
|
+
whose numbers survive refresh and are shared across sessions. That is a
|
|
15
|
+
**runtime app** backed by the grid's shared Mongo, not a static page. It is the
|
|
16
|
+
same proven shape as `app-with-data`, with a `sales` domain
|
|
17
|
+
(`product`, `amount` as a number, `at` timestamp) and a dashboard view: a total
|
|
18
|
+
revenue figure, a per-product breakdown, a recent-sales table, and an add form.
|
|
19
|
+
|
|
20
|
+
Follow this recipe. Be honest that a runtime deploy is async (not instant like a
|
|
21
|
+
static drop) and that it needs the local edition.
|
|
22
|
+
|
|
23
|
+
## 1. Edition check FIRST (hard gate)
|
|
24
|
+
|
|
25
|
+
A persistent app is a built + deployed container. It requires the **local
|
|
26
|
+
edition** (Claude Desktop / Claude Code) or the CLI.
|
|
27
|
+
|
|
28
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
29
|
+
hosted is inline-only and can only publish static pages. Tell the user
|
|
30
|
+
plainly, offer a **static version** instead, and STOP the runtime path here.
|
|
31
|
+
- **Local edition:** continue.
|
|
32
|
+
|
|
33
|
+
## 2. Auth + grid
|
|
34
|
+
|
|
35
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
36
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
37
|
+
grid, ask which to use; do not assume a target.
|
|
38
|
+
|
|
39
|
+
## 3. Scaffold
|
|
40
|
+
|
|
41
|
+
`gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
|
|
42
|
+
and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
|
|
43
|
+
directory, so run `init` FIRST. Then (a) write the app under **`services/web/`**,
|
|
44
|
+
and (b) fill `cloudgrid.yaml` to the shape below (`services.web` + `needs:
|
|
45
|
+
{ database: true }`).
|
|
46
|
+
|
|
47
|
+
## 4. Add the datastore + wire Mongo
|
|
48
|
+
|
|
49
|
+
1. Set `cloudgrid.yaml`. **App code MUST live under `services/<name>/`** —
|
|
50
|
+
`path:` is the URL mount, NOT the filesystem path.
|
|
51
|
+
```yaml
|
|
52
|
+
name: my-revenue-dashboard
|
|
53
|
+
services:
|
|
54
|
+
web:
|
|
55
|
+
type: nextjs
|
|
56
|
+
path: /
|
|
57
|
+
needs:
|
|
58
|
+
database: true
|
|
59
|
+
```
|
|
60
|
+
**Declare the datastore with `needs: { database: true }`** — the canonical
|
|
61
|
+
shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
|
|
62
|
+
the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't
|
|
63
|
+
author new yaml with it, and never set `needs:` and `requires:` together (the
|
|
64
|
+
validator rejects it).
|
|
65
|
+
2. Fetch the template for the Mongo wiring + CRUD shape:
|
|
66
|
+
`gridctl_fetch("template", "revenue-dashboard")`. It is a minimal, real
|
|
67
|
+
Next.js + `mongodb`-driver dashboard under `services/web/`: a lazy client in
|
|
68
|
+
`services/web/lib/db.js`, an App-Router GET/POST/DELETE route on a `sales`
|
|
69
|
+
collection, a server-component page that computes the total + per-product
|
|
70
|
+
breakdown + recent table, and a client add-sale form.
|
|
71
|
+
3. Adapt it (rename the collection, change fields, adjust the UI). **Read the DB
|
|
72
|
+
from `process.env.DATABASE_MONGODB_URL`** (legacy `process.env.MONGODB_URL`
|
|
73
|
+
fallback) — the grid injects it at dev-time and runtime.
|
|
74
|
+
- **Put the DB connection behind a lazy getter — never read the connection
|
|
75
|
+
string at module top level, or `next build` fails.**
|
|
76
|
+
- Sales documents are `{ product: string, amount: number, at: Date }`; keep
|
|
77
|
+
`amount` numeric so the total and breakdown sums are correct.
|
|
78
|
+
|
|
79
|
+
## 5. (Optional) Run locally
|
|
80
|
+
|
|
81
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo
|
|
82
|
+
before deploying. Don't require it.
|
|
83
|
+
|
|
84
|
+
## 6. Config
|
|
85
|
+
|
|
86
|
+
- API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
|
|
87
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
|
|
88
|
+
legacy `MONGODB_URL`) — the grid injects them.
|
|
89
|
+
|
|
90
|
+
## 7. Deploy (async)
|
|
91
|
+
|
|
92
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
93
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
94
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
95
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
96
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
97
|
+
|
|
98
|
+
## 8. Return the live URL + iterate
|
|
99
|
+
|
|
100
|
+
Give the user the live app URL — that is the deliverable. To iterate, re-plug the
|
|
101
|
+
SAME entity so it updates the same URL. Keep it honest: async build, local-edition
|
|
102
|
+
only, credentials injected by the grid.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: saas-marketing
|
|
3
|
+
when: SaaS marketing site, product marketing page, features and pricing page, multi-section product site with pricing tiers, testimonials, and FAQ. For a simpler single-message page, use landing-page instead.
|
|
4
|
+
needs: none
|
|
5
|
+
deploy: inspiration
|
|
6
|
+
editions: all
|
|
7
|
+
capabilities_note: static — no infrastructure. Publishes as an inspiration (instant, works on hosted) via gridctl_drop.
|
|
8
|
+
summary: Fetch the saas-marketing template, fill it with the user's product content, deploy it, and return the live share URL.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Workflow: saas-marketing
|
|
12
|
+
|
|
13
|
+
Detect the intent ("build me a SaaS marketing site / product page with pricing")
|
|
14
|
+
and follow this recipe. This is the richer sibling of `landing-page` — reach for
|
|
15
|
+
it when the request calls for pricing tiers, testimonials, and an FAQ, not just a
|
|
16
|
+
hero. For a plain single-section landing page, use `landing-page`. Do not ask
|
|
17
|
+
setup questions first; use sensible defaults and build.
|
|
18
|
+
|
|
19
|
+
1. **Fetch the template.** Call `gridctl_fetch("template", "saas-marketing")` to
|
|
20
|
+
load the self-contained HTML marketing site.
|
|
21
|
+
2. **Fill the template.** Replace the placeholders with the user's content:
|
|
22
|
+
- The product name, tagline, and hero eyebrow/headline/subheadline.
|
|
23
|
+
- The call-to-action label and (optional) target.
|
|
24
|
+
- One block per feature (title + short description).
|
|
25
|
+
- The three pricing plans (name, price, period, feature list). The middle
|
|
26
|
+
plan is marked "Most popular".
|
|
27
|
+
- The testimonial quotes and the FAQ question/answer pairs.
|
|
28
|
+
- Keep it a single self-contained HTML file. Do not add external scripts,
|
|
29
|
+
stylesheets, fonts, or large embedded media.
|
|
30
|
+
3. **Deploy.** Deploy the filled HTML:
|
|
31
|
+
- Hosted MCP edition: call the drop tool with the HTML.
|
|
32
|
+
- Local MCP / CLI edition: write the HTML to a file and run `gridctl plug`.
|
|
33
|
+
It is an inspiration and deploys synchronously, so you get a URL right away.
|
|
34
|
+
4. **Return the live share URL.** For revisions, re-deploy with the entity id
|
|
35
|
+
from the first deploy — it updates the same share URL.
|
|
36
|
+
|
|
37
|
+
Keep the whole flow tight: fetch, fill, deploy, share.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: status-page
|
|
3
|
+
when: status page, service status, uptime page, incident history, is-it-down page, system status board. Display-only — status is baked into the page, no live monitoring.
|
|
4
|
+
needs: none
|
|
5
|
+
deploy: inspiration
|
|
6
|
+
editions: all
|
|
7
|
+
capabilities_note: static — no infrastructure, status baked into the page. Publishes as an inspiration (instant, works on hosted) via gridctl_drop.
|
|
8
|
+
summary: Fetch the status-page template, fill it with the user's components and incidents, deploy it, and return the live share URL.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Workflow: status-page
|
|
12
|
+
|
|
13
|
+
Detect the intent ("build me a status page / uptime page for X") and follow this
|
|
14
|
+
recipe. This is a display-only static page — the status is baked into the markup,
|
|
15
|
+
there is no live polling. Do not ask setup questions first; use sensible defaults
|
|
16
|
+
and build.
|
|
17
|
+
|
|
18
|
+
1. **Fetch the template.** Call `gridctl_fetch("template", "status-page")` to load
|
|
19
|
+
the self-contained HTML status page (overall banner, component list with
|
|
20
|
+
up/degraded/down pills, per-component uptime bars, incident history).
|
|
21
|
+
2. **Fill the template.** Replace the placeholders with the user's content:
|
|
22
|
+
- The overall banner text and its state class (`ok` / `degraded` / `down`).
|
|
23
|
+
- One row per component: name, a status pill, and the 90-day uptime bar. Mark
|
|
24
|
+
any non-ok bar segments with class `degraded` or `down`.
|
|
25
|
+
- The incident history entries: date, title, state, and a short note.
|
|
26
|
+
- Keep it a single self-contained HTML file. Do not add external scripts,
|
|
27
|
+
stylesheets, fonts, or large embedded media.
|
|
28
|
+
3. **Deploy.** Deploy the filled HTML:
|
|
29
|
+
- Hosted MCP edition: call the drop tool with the HTML.
|
|
30
|
+
- Local MCP / CLI edition: write the HTML to a file and run `gridctl plug`.
|
|
31
|
+
It is an inspiration and deploys synchronously, so you get a URL right away.
|
|
32
|
+
4. **Return the live share URL.** For revisions, re-deploy with the entity id
|
|
33
|
+
from the first deploy — it updates the same share URL.
|
|
34
|
+
|
|
35
|
+
Keep the whole flow tight: fetch, fill, deploy, share.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: subscription-management
|
|
3
|
+
when: "subscription management, manage subscriptions, self-serve plans/billing"
|
|
4
|
+
needs: database
|
|
5
|
+
deploy: runtime
|
|
6
|
+
editions: local
|
|
7
|
+
kind: blueprint
|
|
8
|
+
capabilities_note: "persistent — needs a database (Mongo) plus Stripe subscription secrets. Runtime app, async build, local edition only. Declare needs { database: true } (deployer injects DATABASE_MONGODB_URL / legacy MONGODB_URL) and a vault block mapping STRIPE_KEY / STRIPE_WEBHOOK_SECRET to env vars. This is a BLUEPRINT — read AGENTS.md for the structure, then build."
|
|
9
|
+
summary: "Build a self-serve subscription-management app on the grid — a Next.js app where a signed-in customer views their current plan, changes/upgrades/downgrades or cancels it, and manages billing via the Stripe Billing Portal, with a Stripe webhook syncing local state and grid-shared Mongo (customers + subscriptions collections). This is a BLUEPRINT: fetch the template, read AGENTS.md for the file tree + CloudGrid wiring (needs database true, vault for Stripe secrets), build the app under services/web/, deploy async, poll to a live URL."
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Workflow: subscription-management
|
|
13
|
+
|
|
14
|
+
The user wants self-serve subscription management: a signed-in customer sees
|
|
15
|
+
their current plan, upgrades/downgrades or cancels it, and manages billing (card,
|
|
16
|
+
invoices, receipts) — with the app's state staying in sync with Stripe. That is a
|
|
17
|
+
**persistent runtime app** — a Next.js app backed by the grid's shared Mongo,
|
|
18
|
+
with Stripe subscription updates, the Stripe Billing Portal, and a webhook that
|
|
19
|
+
keeps local subscription state authoritative.
|
|
20
|
+
|
|
21
|
+
This is the **manage-what-you-already-have** surface. If the user actually wants
|
|
22
|
+
the sign-up + paywall + gated-content acquisition flow, that is the
|
|
23
|
+
`membership-site` workflow instead — the two share the same Stripe + Mongo wiring.
|
|
24
|
+
|
|
25
|
+
This is a **blueprint**, not a fill-in template. There is no finished app to
|
|
26
|
+
copy — there is a `cloudgrid.yaml` and a structure guide (`AGENTS.md`). Read the
|
|
27
|
+
guide, then build the app following it. Be honest that a runtime deploy is async
|
|
28
|
+
(not instant like a static drop) and that it needs the local edition.
|
|
29
|
+
|
|
30
|
+
## 1. Edition check FIRST (hard gate)
|
|
31
|
+
|
|
32
|
+
A subscription-management app is a built + deployed container. It requires the
|
|
33
|
+
**local edition** (Claude Desktop / Claude Code) or the CLI.
|
|
34
|
+
|
|
35
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
36
|
+
hosted is inline-only and can only publish static pages. Tell the user
|
|
37
|
+
plainly, offer a **static pricing/plans page** instead, and STOP the runtime
|
|
38
|
+
path here.
|
|
39
|
+
- **Local edition:** continue.
|
|
40
|
+
|
|
41
|
+
## 2. Auth + grid
|
|
42
|
+
|
|
43
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
44
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
45
|
+
grid, ask which to use; do not assume a target.
|
|
46
|
+
|
|
47
|
+
## 3. Read the blueprint
|
|
48
|
+
|
|
49
|
+
Fetch the template and read its structure guide — this is the core of the
|
|
50
|
+
workflow:
|
|
51
|
+
|
|
52
|
+
- `gridctl_fetch("template", "subscription-management")` — the `cloudgrid.yaml` +
|
|
53
|
+
**`AGENTS.md`**. AGENTS.md has the file tree, the Mongo collections
|
|
54
|
+
(`customers`, `subscriptions`), the CloudGrid injection table, and the Stripe
|
|
55
|
+
change-plan / cancel / billing-portal / webhook wiring. **Read it fully before
|
|
56
|
+
building.**
|
|
57
|
+
- `gridctl_fetch("template", "app-with-data")` — the proven Next.js + Mongo
|
|
58
|
+
shape this blueprint extends (lazy db client in `lib/db.js`, App-Router
|
|
59
|
+
GET/POST route). Imitate its wiring.
|
|
60
|
+
|
|
61
|
+
## 4. Scaffold
|
|
62
|
+
|
|
63
|
+
`gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
|
|
64
|
+
and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
|
|
65
|
+
directory, so run `init` FIRST. Then write the app under **`services/web/`** and
|
|
66
|
+
set `cloudgrid.yaml` to the active shape below.
|
|
67
|
+
|
|
68
|
+
## 5. Build the app following AGENTS.md
|
|
69
|
+
|
|
70
|
+
Build the file tree from AGENTS.md under `services/web/`: the lazy Mongo client,
|
|
71
|
+
the lazy Stripe client, the plan catalog (`lib/plans.js`), the auth middleware,
|
|
72
|
+
the subscription (change-plan) + cancel + billing-portal + webhook API routes,
|
|
73
|
+
and the `/account` dashboard. Adapt the plans and document fields to the user.
|
|
74
|
+
Key non-negotiables:
|
|
75
|
+
|
|
76
|
+
- **App code under `services/web/`** — `path:` is the URL mount, NOT the
|
|
77
|
+
filesystem path. Root files fail with `Service directory not found`.
|
|
78
|
+
- **Read the DB LAZILY** from `process.env.DATABASE_MONGODB_URL` (legacy
|
|
79
|
+
`process.env.MONGODB_URL` fallback) inside the getter — never at module top
|
|
80
|
+
level, or `next build` fails.
|
|
81
|
+
- **Read secrets LAZILY** too — `process.env.STRIPE_KEY`,
|
|
82
|
+
`STRIPE_WEBHOOK_SECRET` — inside getters, never top-level.
|
|
83
|
+
- **The webhook is the source of truth.** The change-plan and cancel APIs call
|
|
84
|
+
Stripe; do NOT write plan/status to Mongo there — let `/api/webhook` reconcile
|
|
85
|
+
the `subscriptions` collection so Stripe and Mongo never diverge. Read
|
|
86
|
+
plan/status server-side from Mongo; validate requested plans against
|
|
87
|
+
`lib/plans.js` (never accept an arbitrary price id from the client).
|
|
88
|
+
- **Tie every action to the signed-in user** — resolve `userRef` server-side and
|
|
89
|
+
only ever act on that user's `stripeCustomerId`.
|
|
90
|
+
|
|
91
|
+
`cloudgrid.yaml` active shape:
|
|
92
|
+
|
|
93
|
+
```yaml
|
|
94
|
+
name: my-subscription-management
|
|
95
|
+
services:
|
|
96
|
+
web:
|
|
97
|
+
type: nextjs
|
|
98
|
+
path: /
|
|
99
|
+
needs:
|
|
100
|
+
database: true
|
|
101
|
+
vault:
|
|
102
|
+
STRIPE_KEY: stripe-live-key
|
|
103
|
+
STRIPE_WEBHOOK_SECRET: stripe-webhook-secret
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Declare the datastore with `needs: { database: true }`** — the canonical
|
|
107
|
+
shape. `requires:` is the deprecated v1 alias; don't author new yaml with it, and
|
|
108
|
+
never set `needs:` and `requires:` together (the validator rejects it).
|
|
109
|
+
|
|
110
|
+
## 6. Config / secrets
|
|
111
|
+
|
|
112
|
+
- Stripe secrets → `gridctl_secrets` (set the vault items `stripe-live-key` and
|
|
113
|
+
`stripe-webhook-secret` that the `vault:` block maps from). The deployer
|
|
114
|
+
injects each as its env var at runtime and under `grid dev`. Add
|
|
115
|
+
`auth-provider-key` too if you use an auth SDK.
|
|
116
|
+
- Non-secret config (Stripe publishable key `NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY`,
|
|
117
|
+
price ids, auth publishable key) → `gridctl_env` / `services.web.env`.
|
|
118
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` / legacy
|
|
119
|
+
`MONGODB_URL`) — the grid injects them.
|
|
120
|
+
|
|
121
|
+
## 7. (Optional) Run locally
|
|
122
|
+
|
|
123
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo
|
|
124
|
+
and vault secrets before deploying. Don't require it.
|
|
125
|
+
|
|
126
|
+
## 8. Deploy (async)
|
|
127
|
+
|
|
128
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
129
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
130
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
131
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
132
|
+
- Once live, register the `/api/webhook` URL as the Stripe webhook endpoint,
|
|
133
|
+
copy the signing secret into the `stripe-webhook-secret` vault item, configure
|
|
134
|
+
the Billing Portal in the Stripe dashboard, and re-plug. Return the deployed
|
|
135
|
+
app URL (NOT the build/log link).
|
|
136
|
+
|
|
137
|
+
## 9. Return the live URL + iterate
|
|
138
|
+
|
|
139
|
+
Give the user the live app URL — that is the deliverable. To iterate, re-plug the
|
|
140
|
+
SAME entity so it updates the same URL. Keep it honest: async build, local-edition
|
|
141
|
+
only, DB injected by the grid, secrets injected from the vault.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: task-manager
|
|
3
|
+
when: task manager, to-do app (richer than the app-with-data starter), task list with due dates/priorities, complete-toggle + filter — a persistent task app that sticks across refresh. Needs a database → runtime → local edition.
|
|
4
|
+
needs: database
|
|
5
|
+
deploy: runtime
|
|
6
|
+
editions: local
|
|
7
|
+
capabilities_note: persistent — needs a database (Mongo). Runtime app, async build, local edition only. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL).
|
|
8
|
+
summary: Build a persistent Next.js + Mongo task manager on the grid — a `tasks` collection (title, done, due, priority) with a complete-toggle, active/done filter, add/delete. Richer than the bare app-with-data to-do. Edition-gate first, scaffold, put the app under services/web/, wire process.env.DATABASE_MONGODB_URL (legacy MONGODB_URL fallback) lazily, declare needs:{database:true} (not requires:), deploy async, poll to a live URL.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Workflow: task-manager
|
|
12
|
+
|
|
13
|
+
The user wants a task manager richer than the bare `app-with-data` to-do starter
|
|
14
|
+
— tasks with due dates and priorities, a complete-toggle, and an active/done
|
|
15
|
+
filter, all of which **stick** across refresh and are shared across sessions.
|
|
16
|
+
That is a **runtime app** backed by the grid's shared Mongo, not a static page.
|
|
17
|
+
It is the same proven shape as `app-with-data`, with a `tasks` domain (title,
|
|
18
|
+
done, due, priority of low/medium/high). (For the bare-minimum in-memory to-do,
|
|
19
|
+
use `app-with-data` instead.)
|
|
20
|
+
|
|
21
|
+
Follow this recipe. Be honest that a runtime deploy is async (not instant like a
|
|
22
|
+
static drop) and that it needs the local edition.
|
|
23
|
+
|
|
24
|
+
## 1. Edition check FIRST (hard gate)
|
|
25
|
+
|
|
26
|
+
A persistent app is a built + deployed container. It requires the **local
|
|
27
|
+
edition** (Claude Desktop / Claude Code) or the CLI.
|
|
28
|
+
|
|
29
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
30
|
+
hosted is inline-only and can only publish static pages. Tell the user
|
|
31
|
+
plainly, offer a **static version** instead, and STOP the runtime path here.
|
|
32
|
+
- **Local edition:** continue.
|
|
33
|
+
|
|
34
|
+
## 2. Auth + grid
|
|
35
|
+
|
|
36
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
37
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
38
|
+
grid, ask which to use; do not assume a target.
|
|
39
|
+
|
|
40
|
+
## 3. Scaffold
|
|
41
|
+
|
|
42
|
+
`gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
|
|
43
|
+
and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
|
|
44
|
+
directory, so run `init` FIRST. Then (a) write the app under **`services/web/`**,
|
|
45
|
+
and (b) fill `cloudgrid.yaml` to the shape below (`services.web` + `needs:
|
|
46
|
+
{ database: true }`).
|
|
47
|
+
|
|
48
|
+
## 4. Add the datastore + wire Mongo
|
|
49
|
+
|
|
50
|
+
1. Set `cloudgrid.yaml`. **App code MUST live under `services/<name>/`** —
|
|
51
|
+
`path:` is the URL mount, NOT the filesystem path.
|
|
52
|
+
```yaml
|
|
53
|
+
name: my-tasks
|
|
54
|
+
services:
|
|
55
|
+
web:
|
|
56
|
+
type: nextjs
|
|
57
|
+
path: /
|
|
58
|
+
needs:
|
|
59
|
+
database: true
|
|
60
|
+
```
|
|
61
|
+
**Declare the datastore with `needs: { database: true }`** — the canonical
|
|
62
|
+
shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
|
|
63
|
+
the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't
|
|
64
|
+
author new yaml with it, and never set `needs:` and `requires:` together (the
|
|
65
|
+
validator rejects it).
|
|
66
|
+
2. Fetch the template for the Mongo wiring + CRUD shape:
|
|
67
|
+
`gridctl_fetch("template", "task-manager")`. It is a minimal, real Next.js +
|
|
68
|
+
`mongodb`-driver task manager under `services/web/`: a lazy client in
|
|
69
|
+
`services/web/lib/db.js`, an App-Router GET/POST/PATCH/DELETE route on a
|
|
70
|
+
`tasks` collection (PATCH toggles done), a server-component page, and a client
|
|
71
|
+
list with an active/done filter.
|
|
72
|
+
3. Adapt it (rename the collection, change fields, adjust the UI). **Read the DB
|
|
73
|
+
from `process.env.DATABASE_MONGODB_URL`** (legacy `process.env.MONGODB_URL`
|
|
74
|
+
fallback) — the grid injects it at dev-time and runtime.
|
|
75
|
+
- **Put the DB connection behind a lazy getter — never read the connection
|
|
76
|
+
string at module top level, or `next build` fails.**
|
|
77
|
+
|
|
78
|
+
## 5. (Optional) Run locally
|
|
79
|
+
|
|
80
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo
|
|
81
|
+
before deploying. Don't require it.
|
|
82
|
+
|
|
83
|
+
## 6. Config
|
|
84
|
+
|
|
85
|
+
- API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
|
|
86
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
|
|
87
|
+
legacy `MONGODB_URL`) — the grid injects them.
|
|
88
|
+
|
|
89
|
+
## 7. Deploy (async)
|
|
90
|
+
|
|
91
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
92
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
93
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
94
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
95
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
96
|
+
|
|
97
|
+
## 8. Return the live URL + iterate
|
|
98
|
+
|
|
99
|
+
Give the user the live app URL — that is the deliverable. To iterate, re-plug the
|
|
100
|
+
SAME entity so it updates the same URL. Keep it honest: async build, local-edition
|
|
101
|
+
only, credentials injected by the grid.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ticket-system
|
|
3
|
+
when: ticket system, support tickets, helpdesk, issue tracker, support queue — a persistent app that stores tickets (subject, requester, status, priority, body) with status changes. Needs a database → runtime → local edition.
|
|
4
|
+
needs: database
|
|
5
|
+
deploy: runtime
|
|
6
|
+
editions: local
|
|
7
|
+
capabilities_note: persistent — needs a database (Mongo). Runtime app, async build, local edition only. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL).
|
|
8
|
+
summary: Build a persistent Next.js + Mongo support ticket queue on the grid — a `tickets` collection (subject, requester, status open/pending/closed, priority, body) with add / status-change / delete. Edition-gate first, scaffold, put the app under services/web/, wire process.env.DATABASE_MONGODB_URL (legacy MONGODB_URL fallback) lazily, declare needs:{database:true} (not requires:), deploy async, poll to a live URL.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Workflow: ticket-system
|
|
12
|
+
|
|
13
|
+
The user wants a tickets app that **remembers** its
|
|
14
|
+
records — they survive refresh and are shared across sessions. That is a
|
|
15
|
+
**runtime app** backed by the grid's shared Mongo, not a static page. It is the
|
|
16
|
+
same proven shape as `app-with-data`, with a `tickets` domain
|
|
17
|
+
(subject, requester, status of open/pending/closed, priority, body) and a table view with add, per-row status changes, and delete.
|
|
18
|
+
|
|
19
|
+
Follow this recipe. Be honest that a runtime deploy is async (not instant like a
|
|
20
|
+
static drop) and that it needs the local edition.
|
|
21
|
+
|
|
22
|
+
## 1. Edition check FIRST (hard gate)
|
|
23
|
+
|
|
24
|
+
A persistent app is a built + deployed container. It requires the **local
|
|
25
|
+
edition** (Claude Desktop / Claude Code) or the CLI.
|
|
26
|
+
|
|
27
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
28
|
+
hosted is inline-only and can only publish static pages. Tell the user
|
|
29
|
+
plainly, offer a **static version** instead, and STOP the runtime path here.
|
|
30
|
+
- **Local edition:** continue.
|
|
31
|
+
|
|
32
|
+
## 2. Auth + grid
|
|
33
|
+
|
|
34
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
35
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
36
|
+
grid, ask which to use; do not assume a target.
|
|
37
|
+
|
|
38
|
+
## 3. Scaffold
|
|
39
|
+
|
|
40
|
+
`gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
|
|
41
|
+
and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
|
|
42
|
+
directory, so run `init` FIRST. Then (a) write the app under **`services/web/`**,
|
|
43
|
+
and (b) fill `cloudgrid.yaml` to the shape below (`services.web` + `needs:
|
|
44
|
+
{ database: true }`).
|
|
45
|
+
|
|
46
|
+
## 4. Add the datastore + wire Mongo
|
|
47
|
+
|
|
48
|
+
1. Set `cloudgrid.yaml`. **App code MUST live under `services/<name>/`** —
|
|
49
|
+
`path:` is the URL mount, NOT the filesystem path.
|
|
50
|
+
```yaml
|
|
51
|
+
name: my-tickets
|
|
52
|
+
services:
|
|
53
|
+
web:
|
|
54
|
+
type: nextjs
|
|
55
|
+
path: /
|
|
56
|
+
needs:
|
|
57
|
+
database: true
|
|
58
|
+
```
|
|
59
|
+
**Declare the datastore with `needs: { database: true }`** — the canonical
|
|
60
|
+
shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
|
|
61
|
+
the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't
|
|
62
|
+
author new yaml with it, and never set `needs:` and `requires:` together (the
|
|
63
|
+
validator rejects it). The template ships this file in the **full-annotated
|
|
64
|
+
reference form** — every field present as a comment, only `name`,
|
|
65
|
+
`services.web`, and `needs.database` uncommented — so it deploys to exactly
|
|
66
|
+
those active fields.
|
|
67
|
+
2. Fetch the template for the Mongo wiring + CRUD shape:
|
|
68
|
+
`gridctl_fetch("template", "ticket-system")`. It is a minimal, real Next.js +
|
|
69
|
+
`mongodb`-driver app under `services/web/`: a lazy client in
|
|
70
|
+
`services/web/lib/db.js`, an App-Router GET/POST/PATCH (status)/DELETE route on a `tickets` collection, a
|
|
71
|
+
server-component page, and a client component.
|
|
72
|
+
3. Adapt it (rename the collection, change fields, adjust the UI). **Read the DB
|
|
73
|
+
from `process.env.DATABASE_MONGODB_URL`** (legacy `process.env.MONGODB_URL`
|
|
74
|
+
fallback) — the grid injects it at dev-time and runtime.
|
|
75
|
+
- **Put the DB connection behind a lazy getter — never read the connection
|
|
76
|
+
string at module top level, or `next build` fails.**
|
|
77
|
+
|
|
78
|
+
## 5. (Optional) Run locally
|
|
79
|
+
|
|
80
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo
|
|
81
|
+
before deploying. Don't require it.
|
|
82
|
+
|
|
83
|
+
## 6. Config
|
|
84
|
+
|
|
85
|
+
- API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
|
|
86
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
|
|
87
|
+
legacy `MONGODB_URL`) — the grid injects them.
|
|
88
|
+
|
|
89
|
+
## 7. Deploy (async)
|
|
90
|
+
|
|
91
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
92
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
93
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
94
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
95
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
96
|
+
|
|
97
|
+
## 8. Return the live URL + iterate
|
|
98
|
+
|
|
99
|
+
Give the user the live app URL — that is the deliverable. To iterate, re-plug the
|
|
100
|
+
SAME entity so it updates the same URL. Keep it honest: async build, local-edition
|
|
101
|
+
only, credentials injected by the grid.
|