@cloudgrid-io/mcp 0.13.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 +68 -7
- package/src/corpus/templates/_cloudgrid.yaml.reference +228 -0
- package/src/corpus/templates/admin-dashboard/cloudgrid.yaml +226 -8
- package/src/corpus/templates/admin-dashboard/index.md +3 -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/cloudgrid.yaml +222 -4
- package/src/corpus/templates/api-docs/index.md +3 -5
- 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/cloudgrid.yaml +222 -4
- package/src/corpus/templates/changelog/index.md +3 -5
- 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/cloudgrid.yaml +226 -8
- package/src/corpus/templates/crm/index.md +3 -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/cloudgrid.yaml +222 -4
- package/src/corpus/templates/docs-site/index.md +3 -5
- 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/cloudgrid.yaml +226 -8
- package/src/corpus/templates/kanban/index.md +3 -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/cloudgrid.yaml +222 -4
- package/src/corpus/templates/portfolio/index.md +3 -5
- 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/cloudgrid.yaml +222 -4
- package/src/corpus/templates/saas-marketing/index.md +3 -5
- package/src/corpus/templates/status-page/cloudgrid.yaml +222 -4
- package/src/corpus/templates/status-page/index.md +3 -5
- 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/cloudgrid.yaml +226 -8
- package/src/corpus/templates/task-manager/index.md +3 -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/cloudgrid.yaml +222 -4
- package/src/corpus/templates/waitlist/index.md +3 -5
- package/src/corpus/templates/web-app/cloudgrid.yaml +228 -4
- package/src/corpus/templates/web-app/index.md +3 -5
- 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/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/company-website.md +46 -0
- package/src/corpus/workflows/course-platform.md +126 -0
- package/src/corpus/workflows/directory.md +101 -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/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/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/subscription-management.md +141 -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
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: blog-cms
|
|
3
|
+
when: blog, CMS, content site with posts, publishing platform, articles — a persistent app that stores and publishes posts (title, body, tags, published flag). 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 blog / CMS on the grid — a `posts` collection (title, slug, body, tags, published, createdAt) with a public list, a single-post page, and an admin create/delete screen. 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: blog-cms
|
|
12
|
+
|
|
13
|
+
The user wants a blog, content site, or CMS that **remembers** its posts — a
|
|
14
|
+
publishing platform whose articles survive refresh and are shared across
|
|
15
|
+
sessions. That is a **runtime app** backed by the grid's shared Mongo, not a
|
|
16
|
+
static page. It is the same proven shape as `app-with-data`, with a `posts`
|
|
17
|
+
domain (title, slug, body, tags, published, createdAt): a public post list, a
|
|
18
|
+
single-post page at `/posts/[slug]`, and an admin screen to create and delete
|
|
19
|
+
posts (drafts stay off the public list).
|
|
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-blog
|
|
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", "blog-cms")`. It is a minimal, real Next.js +
|
|
68
|
+
`mongodb`-driver blog under `services/web/`: a lazy client in
|
|
69
|
+
`services/web/lib/db.js`, an App-Router GET/POST/DELETE route on a `posts`
|
|
70
|
+
collection, a server-component list page, a single-post page at
|
|
71
|
+
`app/posts/[slug]/page.js`, and an admin server page + client form.
|
|
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
|
+
- **Keep DB-reading pages and the API route `export const dynamic =
|
|
78
|
+
"force-dynamic"`** so they read/write live data instead of being
|
|
79
|
+
statically prerendered at build.
|
|
80
|
+
|
|
81
|
+
## 5. (Optional) Run locally
|
|
82
|
+
|
|
83
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo
|
|
84
|
+
before deploying. Don't require it.
|
|
85
|
+
|
|
86
|
+
## 6. Config
|
|
87
|
+
|
|
88
|
+
- API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
|
|
89
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
|
|
90
|
+
legacy `MONGODB_URL`) — the grid injects them.
|
|
91
|
+
|
|
92
|
+
## 7. Deploy (async)
|
|
93
|
+
|
|
94
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
95
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
96
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
97
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
98
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
99
|
+
|
|
100
|
+
## 8. Return the live URL + iterate
|
|
101
|
+
|
|
102
|
+
Give the user the live blog URL — that is the deliverable. To iterate, re-plug
|
|
103
|
+
the SAME entity so it updates the same URL. Keep it honest: async build,
|
|
104
|
+
local-edition only, credentials injected by the grid.
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: booking-system
|
|
3
|
+
when: booking system, reservations, appointment booking, scheduling — a persistent app where users reserve time slots / appointments that survive refresh and are shared across sessions. Needs a database → runtime → local edition.
|
|
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. BLUEPRINT — ships structure + cloudgrid.yaml, not app code; read AGENTS.md and build. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL). Payment/auth secrets via the `vault:` block → env vars. Reminder cron is NOT yet deployable (platform issue #1543)."
|
|
9
|
+
summary: "Build a persistent Next.js + Mongo appointment / reservation booking system on the grid — `services`, `availabilityRules`, `bookings` collections with slot-availability logic, Stripe checkout, an auth provider, and a (pending) reminder cron. This is a BLUEPRINT: fetch it, read AGENTS.md for the file tree + data model + CloudGrid wiring, then build the app under services/web/. Edition-gate first, scaffold, declare needs:{database:true} (not requires:), map secrets via vault:, deploy async, poll to a live URL."
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Workflow: booking-system
|
|
13
|
+
|
|
14
|
+
The user wants a booking / reservations / appointment-scheduling app that
|
|
15
|
+
**remembers** its bookings — reservations that survive refresh and are shared
|
|
16
|
+
across sessions. That is a **runtime app** backed by the grid's shared Mongo, not
|
|
17
|
+
a static page. The proven runtime shape is the same as `app-with-data` (Next.js +
|
|
18
|
+
lazy Mongo client under `services/web/`), with a booking domain (bookable
|
|
19
|
+
`services`, `availabilityRules`, and `bookings` with slot-overlap protection),
|
|
20
|
+
Stripe checkout for paid appointments, an auth provider for accounts, and a
|
|
21
|
+
scheduled reminder job.
|
|
22
|
+
|
|
23
|
+
**This is a BLUEPRINT.** It does NOT ship prewritten app code — it ships the
|
|
24
|
+
annotated `cloudgrid.yaml` and an `AGENTS.md` structure guide (file tree, Mongo
|
|
25
|
+
data model, and CloudGrid wiring). Fetch it, **read `AGENTS.md`**, then build the
|
|
26
|
+
app under `services/web/` following it.
|
|
27
|
+
|
|
28
|
+
Follow this recipe. Be honest that a runtime deploy is async (not instant like a
|
|
29
|
+
static drop), that it needs the local edition, and that the reminder **cron
|
|
30
|
+
service is not yet deployable** (platform issue #1543).
|
|
31
|
+
|
|
32
|
+
## 1. Edition check FIRST (hard gate)
|
|
33
|
+
|
|
34
|
+
A persistent app is a built + deployed container. It requires the **local
|
|
35
|
+
edition** (Claude Desktop / Claude Code) or the CLI.
|
|
36
|
+
|
|
37
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
38
|
+
hosted is inline-only and can only publish static pages. Tell the user plainly,
|
|
39
|
+
offer a **static preview** instead, and STOP the runtime path here.
|
|
40
|
+
- **Local edition:** continue.
|
|
41
|
+
|
|
42
|
+
## 2. Auth + grid
|
|
43
|
+
|
|
44
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
45
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
46
|
+
grid, ask which to use; do not assume a target.
|
|
47
|
+
|
|
48
|
+
## 3. Read the blueprint, then scaffold
|
|
49
|
+
|
|
50
|
+
1. Fetch the blueprint: `gridctl_fetch("template", "booking-system")`. **Read its
|
|
51
|
+
`AGENTS.md`** — it is the structure guide (file tree under `services/web/`, the
|
|
52
|
+
`services` / `availabilityRules` / `bookings` collections + the double-booking
|
|
53
|
+
guard, how CloudGrid injects the DB and vault secrets, how to wire Stripe +
|
|
54
|
+
auth, and the reminder-cron design).
|
|
55
|
+
2. `gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
|
|
56
|
+
and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a
|
|
57
|
+
linked directory, so run `init` FIRST.
|
|
58
|
+
|
|
59
|
+
## 4. Build the app + set cloudgrid.yaml
|
|
60
|
+
|
|
61
|
+
1. Build the files under **`services/web/`** per the AGENTS.md file tree. **App
|
|
62
|
+
code MUST live under `services/<name>/`** — `path:` is the URL mount, NOT the
|
|
63
|
+
filesystem path.
|
|
64
|
+
2. Set `cloudgrid.yaml` to the blueprint shape:
|
|
65
|
+
```yaml
|
|
66
|
+
name: my-booking
|
|
67
|
+
vault:
|
|
68
|
+
STRIPE_KEY: stripe-live-key
|
|
69
|
+
STRIPE_WEBHOOK_SECRET: stripe-webhook-secret
|
|
70
|
+
AUTH_PROVIDER_KEY: auth-provider-key
|
|
71
|
+
services:
|
|
72
|
+
web:
|
|
73
|
+
type: nextjs
|
|
74
|
+
path: /
|
|
75
|
+
needs:
|
|
76
|
+
database: true
|
|
77
|
+
```
|
|
78
|
+
**Declare the datastore with `needs: { database: true }`** — the canonical
|
|
79
|
+
shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
|
|
80
|
+
the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't
|
|
81
|
+
author new yaml with it, and never set `needs:` and `requires:` together (the
|
|
82
|
+
validator rejects it).
|
|
83
|
+
3. **Read every injected var lazily** (inside a getter), never at module top level
|
|
84
|
+
— `process.env.DATABASE_MONGODB_URL || process.env.MONGODB_URL`, and the vault
|
|
85
|
+
secrets (`STRIPE_KEY`, etc.) the same way. A top-level read fails `next build`.
|
|
86
|
+
4. **Keep the reminder cron COMMENTED.** cron deploy is PENDING platform issue
|
|
87
|
+
#1543 — `plug` rejects a `type: cron` service. Ship `web` alone; use the
|
|
88
|
+
stopgap in AGENTS.md §7 for reminders until #1543 lands.
|
|
89
|
+
|
|
90
|
+
## 5. Config (secrets)
|
|
91
|
+
|
|
92
|
+
- Payment/auth secrets → add the vault items with `gridctl_secrets` (e.g.
|
|
93
|
+
`stripe-live-key`, `stripe-webhook-secret`, `auth-provider-key`) BEFORE plug so
|
|
94
|
+
the `vault:` mappings resolve. Non-secret config → `gridctl_env`.
|
|
95
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` / legacy
|
|
96
|
+
`MONGODB_URL`) — the grid injects them.
|
|
97
|
+
|
|
98
|
+
## 6. (Optional) Run locally
|
|
99
|
+
|
|
100
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo +
|
|
101
|
+
vault env vars before deploying. Good for testing slot/availability logic. Don't
|
|
102
|
+
require it.
|
|
103
|
+
|
|
104
|
+
## 7. Deploy (async)
|
|
105
|
+
|
|
106
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
107
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
108
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
109
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
110
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
111
|
+
|
|
112
|
+
## 8. Return the live URL + iterate
|
|
113
|
+
|
|
114
|
+
Give the user the live app URL — that is the deliverable. To iterate, re-plug the
|
|
115
|
+
SAME entity so it updates the same URL. Keep it honest: async build, local-edition
|
|
116
|
+
only, credentials injected by the grid, and the reminder cron pending #1543.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: calendar-scheduler
|
|
3
|
+
when: "calendar scheduler, team calendar, scheduling app, meeting scheduler"
|
|
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). Scheduled reminders want a type:cron service — BLOCKED on platform issue #1543 (documented, not yet deployable). Optional auth/payments/reminder secrets map through a vault: block (AUTH_PROVIDER_KEY / STRIPE_KEY / SENDGRID_API_KEY) with grid secrets set."
|
|
9
|
+
summary: "A BLUEPRINT for a calendar / scheduling app — events, availability slots, timezones + recurrence, optional bookings, on persistent Next.js + Mongo. This is not fill-in-the-blanks app code; it ships structure + cloudgrid.yaml. Fetch the template, read AGENTS.md for the file tree / collections / CloudGrid wiring (needs + optional vault) + the cron reminder shape (blocked on #1543), then BUILD the app under services/web/ following it, and deploy async to a live URL (local edition only)."
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Workflow: calendar-scheduler
|
|
13
|
+
|
|
14
|
+
The user wants a calendar / scheduling app — a **team calendar**, a **meeting
|
|
15
|
+
scheduler**, or a booking-style **scheduling app**. That is a **persistent runtime
|
|
16
|
+
app** (Next.js + the grid's shared Mongo) whose domain is **events and
|
|
17
|
+
availability**: events on a calendar, bookable time slots, timezones, recurrence,
|
|
18
|
+
and (eventually) scheduled reminders. It is the `app-with-data` / `crm` shape with
|
|
19
|
+
a time/availability domain.
|
|
20
|
+
|
|
21
|
+
**This is a BLUEPRINT.** Unlike a fill-in-the-blanks template, it ships
|
|
22
|
+
*structure* — a `cloudgrid.yaml` and an `AGENTS.md` structure guide — not finished
|
|
23
|
+
app code. The recipe is: fetch it, **read `AGENTS.md`**, then **build** the app
|
|
24
|
+
following it. Be honest that a runtime deploy is async and needs the local edition.
|
|
25
|
+
|
|
26
|
+
## 1. Edition check FIRST (hard gate)
|
|
27
|
+
|
|
28
|
+
A calendar scheduler is a built + deployed container (Next.js + Mongo). It
|
|
29
|
+
requires the **local edition** (Claude Desktop / Claude Code) or the CLI.
|
|
30
|
+
|
|
31
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
32
|
+
hosted is inline-only and can only publish static pages. Tell the user plainly,
|
|
33
|
+
offer a **static calendar mockup** instead, and STOP the runtime path here.
|
|
34
|
+
- **Local edition:** continue.
|
|
35
|
+
|
|
36
|
+
## 2. Auth + grid
|
|
37
|
+
|
|
38
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
39
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
40
|
+
grid, ask which to use; do not assume a target.
|
|
41
|
+
|
|
42
|
+
## 3. Fetch the blueprint and READ AGENTS.md
|
|
43
|
+
|
|
44
|
+
`gridctl_fetch("template", "calendar-scheduler")`. The deliverable is the
|
|
45
|
+
**`AGENTS.md` structure guide** — read it before writing anything. It defines:
|
|
46
|
+
- the `services/web/` file tree (calendar page, event + booking routes, `lib/`),
|
|
47
|
+
- the Mongo collections (`events`, `availability`, optional `bookings`) + fields,
|
|
48
|
+
- the CloudGrid injection table (needs + optional vault + AI gateway),
|
|
49
|
+
- the optional auth (Clerk/Auth0 + `ownerId`) and payments (Stripe Checkout +
|
|
50
|
+
signed webhook) layers,
|
|
51
|
+
- the intended **cron reminder** service shape — **BLOCKED on platform issue
|
|
52
|
+
#1543** (documented, not yet deployable),
|
|
53
|
+
- the deploy flow.
|
|
54
|
+
|
|
55
|
+
There is no app code to copy — you generate it from the guide.
|
|
56
|
+
|
|
57
|
+
## 4. Scaffold + fill cloudgrid.yaml
|
|
58
|
+
|
|
59
|
+
`gridctl_init` an app `<name>` FIRST (creates the entity + `.cloudgrid/link.json`
|
|
60
|
+
and a starter `cloudgrid.yaml` with empty `services:{}`; `plug` needs a linked
|
|
61
|
+
directory). Then put the app under **`services/web/`** and set `cloudgrid.yaml` to
|
|
62
|
+
the blueprint's active fields:
|
|
63
|
+
|
|
64
|
+
```yaml
|
|
65
|
+
name: my-calendar
|
|
66
|
+
services:
|
|
67
|
+
web:
|
|
68
|
+
type: nextjs
|
|
69
|
+
path: /
|
|
70
|
+
needs:
|
|
71
|
+
database: true
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**App code MUST live under `services/<name>/`** — `path:` is the URL mount, NOT
|
|
75
|
+
the filesystem path. **Declare `needs: { database: true }`** (canonical) — the
|
|
76
|
+
deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (+ legacy
|
|
77
|
+
`MONGODB_URL`). `requires:` is the deprecated v1 alias; never author it and never
|
|
78
|
+
set `needs:` and `requires:` together (the validator rejects the combination).
|
|
79
|
+
Add a `vault:` entry only when you actually layer in auth / payments / reminders.
|
|
80
|
+
|
|
81
|
+
## 5. Build the app following AGENTS.md
|
|
82
|
+
|
|
83
|
+
Generate the files under `services/web/` per the guide:
|
|
84
|
+
- **Lazy getter** for Mongo — read `process.env.DATABASE_MONGODB_URL` (legacy
|
|
85
|
+
`MONGODB_URL` fallback) **inside** a getter, never at module top level (a
|
|
86
|
+
top-level read fails `next build`). Same lazy pattern for any Stripe/auth client.
|
|
87
|
+
- **Store all times as UTC `Date` in Mongo**; convert at the edges. Keep timezone
|
|
88
|
+
/ recurrence / overlap logic in a pure `lib/time.js` (expand RRULEs at read
|
|
89
|
+
time — do not store every instance).
|
|
90
|
+
- Range-query events for the visible window (`startAt < end && endAt > start`);
|
|
91
|
+
index `{ ownerId: 1, startAt: 1 }`.
|
|
92
|
+
- (Optional) auth: init an SDK in `lib/auth.js` from `AUTH_PROVIDER_KEY`, stamp
|
|
93
|
+
`ownerId` on writes, gate write APIs in `middleware.js`, keep the public
|
|
94
|
+
`book/[slug]` page open.
|
|
95
|
+
- (Optional) payments: Stripe Checkout for paid bookings + a signature-verified
|
|
96
|
+
webhook (read the RAW body before verifying).
|
|
97
|
+
|
|
98
|
+
## 6. Scheduled reminders (cron) — BLOCKED on #1543
|
|
99
|
+
|
|
100
|
+
Reminders want a second service of `type: cron` (scan due reminders every few
|
|
101
|
+
minutes, send mail/SMS). **Cron deploy is a PENDING platform issue (#1543)** — do
|
|
102
|
+
NOT uncomment the cron `reminders` service in `cloudgrid.yaml` yet; it will not
|
|
103
|
+
schedule. Ship the HTTP app now and add cron once #1543 lands. If the user needs
|
|
104
|
+
reminders sooner, use the interim workaround in AGENTS.md §5 (an external
|
|
105
|
+
scheduler hitting an authenticated `POST /api/cron/reminders` route on `web`).
|
|
106
|
+
|
|
107
|
+
## 7. Config / secrets
|
|
108
|
+
|
|
109
|
+
- Map any secrets in the `vault:` block, then **store the values**:
|
|
110
|
+
`grid secrets set auth-provider-key …`, `grid secrets set stripe-live-key sk_live_…`,
|
|
111
|
+
`grid secrets set sendgrid-key SG.…`. Non-secret public config → `gridctl_env`.
|
|
112
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` / legacy
|
|
113
|
+
`MONGODB_URL`) — the grid injects them.
|
|
114
|
+
|
|
115
|
+
## 8. (Optional) Run locally
|
|
116
|
+
|
|
117
|
+
Mention the user can `grid dev` to run locally against the injected dev Mongo (+
|
|
118
|
+
secrets) before deploying. Don't require it.
|
|
119
|
+
|
|
120
|
+
## 9. Deploy (async)
|
|
121
|
+
|
|
122
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
123
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
124
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
125
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
126
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
127
|
+
|
|
128
|
+
## 10. Return the live URL + iterate
|
|
129
|
+
|
|
130
|
+
Give the user the live app URL — the deliverable. To iterate, re-plug the SAME
|
|
131
|
+
entity so it updates the same URL. Keep it honest: this is a blueprint you built
|
|
132
|
+
from, the build is async, it is local-edition only, Mongo is injected via `needs`,
|
|
133
|
+
optional secrets via `vault` + `grid secrets set`, and scheduled reminders wait on
|
|
134
|
+
platform issue #1543.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: company-website
|
|
3
|
+
when: company website, business site, corporate site, about-us site, small-business homepage
|
|
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 company-website template, fill it with the user's content across hero/about/services/team/contact, deploy it, and return the live share URL.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Workflow: company-website
|
|
12
|
+
|
|
13
|
+
Detect the intent ("build me a company website / business site / about-us page
|
|
14
|
+
for X") and follow this recipe. Do not ask setup questions first; use sensible
|
|
15
|
+
defaults from what the user tells you and build.
|
|
16
|
+
|
|
17
|
+
1. **Fetch the template.** Call `gridctl_fetch("template", "company-website")` to
|
|
18
|
+
load the self-contained multi-section HTML company site.
|
|
19
|
+
2. **(Optional) Fetch the example.** Call `gridctl_fetch("example", "company-website")`
|
|
20
|
+
to see a filled site as a reference for tone and structure.
|
|
21
|
+
3. **Fill the template.** Replace the `{{PLACEHOLDER}}` tokens with the user's
|
|
22
|
+
content, section by section:
|
|
23
|
+
- **Identity + hero:** company name, tagline, headline, subheadline, and the
|
|
24
|
+
two call-to-action labels.
|
|
25
|
+
- **About:** headline, two short paragraphs, and four stat number/label pairs.
|
|
26
|
+
- **Services:** one card per offering — a single-emoji icon, title, and short
|
|
27
|
+
description. Duplicate a `.card` block between the `SERVICES_START` /
|
|
28
|
+
`SERVICES_END` comments to add more.
|
|
29
|
+
- **Team:** one member per person — avatar initials, name, role, short bio.
|
|
30
|
+
Duplicate a `.member` block between `TEAM_START` / `TEAM_END` to add more.
|
|
31
|
+
- **Contact:** headline, subheadline, email, phone, address, hours.
|
|
32
|
+
- Keep it a single self-contained HTML file. Do not add external scripts,
|
|
33
|
+
stylesheets, fonts, or large embedded media. Recolor via the `:root` CSS
|
|
34
|
+
variables (`--accent`, `--bg`, `--fg`) if the user has brand colors.
|
|
35
|
+
4. **Deploy.** Deploy the filled HTML:
|
|
36
|
+
- Hosted MCP edition: call the drop tool with the HTML.
|
|
37
|
+
- Local MCP / CLI edition: write the HTML to a file and run `gridctl plug`.
|
|
38
|
+
A company website is an inspiration and deploys synchronously, so you get a
|
|
39
|
+
URL right away.
|
|
40
|
+
5. **Return the live share URL.** Give the user the URL that serves the page.
|
|
41
|
+
For revisions, re-deploy with the entity id from the first deploy — it updates
|
|
42
|
+
the same share URL, so the user iterates on one link.
|
|
43
|
+
|
|
44
|
+
Keep the whole flow tight: fetch, fill, deploy, share. The contact form is
|
|
45
|
+
client-side only; mention the user can wire it to their own email service or
|
|
46
|
+
form endpoint if they want real submissions.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: course-platform
|
|
3
|
+
when: "course platform, sell online courses, teachable-style"
|
|
4
|
+
needs: database
|
|
5
|
+
deploy: runtime
|
|
6
|
+
editions: local
|
|
7
|
+
kind: blueprint
|
|
8
|
+
capabilities_note: "persistent — needs a database (Mongo) plus auth + Stripe payments (vault-injected secrets). Runtime app, async build, local edition only. Declare the canonical needs:{database:true}; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL). Secrets (STRIPE_KEY, STRIPE_WEBHOOK_SECRET, AUTH_PROVIDER_KEY) come from the vault: block."
|
|
9
|
+
summary: "Build a Teachable-style course platform on the grid — sell online courses, gate lessons behind a Stripe purchase, track per-student progress. This is a BLUEPRINT — the template ships the correct cloudgrid.yaml + an AGENTS.md structure guide (file tree, Mongo collections courses/lessons/enrollments/progress, env/vault wiring, auth + Stripe checkout/webhook routes, async deploy). Read AGENTS.md, then build the app under services/web/ following it. Edition-gate first, scaffold, wire DATABASE_MONGODB_URL and vault secrets lazily, declare needs:{database:true} (not requires:), deploy async, poll to a live URL."
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Workflow: course-platform
|
|
13
|
+
|
|
14
|
+
The user wants a Teachable-style course platform: sell online courses, gate
|
|
15
|
+
lessons behind a Stripe purchase, and track each student's lesson progress. That
|
|
16
|
+
is a **persistent runtime app** — Next.js + the grid's shared Mongo, with auth
|
|
17
|
+
and payments — not a static page.
|
|
18
|
+
|
|
19
|
+
**This is a blueprint.** The template does NOT ship runnable app code. It ships
|
|
20
|
+
the correct `cloudgrid.yaml` and an `AGENTS.md` structure guide. Your job is to
|
|
21
|
+
**read `AGENTS.md`, then build the app under `services/web/` following it.**
|
|
22
|
+
|
|
23
|
+
Be honest that a runtime deploy is async (not instant like a static drop) and
|
|
24
|
+
that it needs the local edition.
|
|
25
|
+
|
|
26
|
+
## 1. Edition check FIRST (hard gate)
|
|
27
|
+
|
|
28
|
+
A course platform is a built + deployed container. It requires the **local
|
|
29
|
+
edition** (Claude Desktop / Claude Code) or the CLI.
|
|
30
|
+
|
|
31
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
32
|
+
hosted is inline-only and can only publish static pages. Tell the user plainly,
|
|
33
|
+
offer a **static course landing page** instead, and STOP the runtime path here.
|
|
34
|
+
- **Local edition:** continue.
|
|
35
|
+
|
|
36
|
+
## 2. Auth + grid
|
|
37
|
+
|
|
38
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
39
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
40
|
+
grid, ask which to use; do not assume a target.
|
|
41
|
+
|
|
42
|
+
## 3. Read the blueprint
|
|
43
|
+
|
|
44
|
+
Fetch the structure guide: `gridctl_fetch("template", "course-platform")`. It
|
|
45
|
+
contains AGENTS.md — the CloudGrid-specific spec you must follow:
|
|
46
|
+
|
|
47
|
+
- the file tree under `services/web/` (catalog page, course detail, gated lesson
|
|
48
|
+
player, dashboard, and the API routes: courses, enrollments, progress, checkout,
|
|
49
|
+
Stripe webhook),
|
|
50
|
+
- the Mongo collections + fields (`courses`, `lessons`, `enrollments`,
|
|
51
|
+
`progress`) and the access rule (a lesson is viewable if `isFreePreview` OR an
|
|
52
|
+
`enrollments` doc exists — enforced on the server),
|
|
53
|
+
- how CloudGrid injects the DB URL and the vault secrets,
|
|
54
|
+
- how to wire auth (a provider SDK like Clerk/Auth0) and Stripe (checkout +
|
|
55
|
+
webhook routes),
|
|
56
|
+
- the async deploy steps.
|
|
57
|
+
|
|
58
|
+
## 4. Scaffold + fill cloudgrid.yaml
|
|
59
|
+
|
|
60
|
+
`gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
|
|
61
|
+
and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. Run `init` FIRST —
|
|
62
|
+
`plug` needs a linked directory. Then set `cloudgrid.yaml` to the shape below and
|
|
63
|
+
write the app under **`services/web/`** (`path: /` is the URL mount, NOT the
|
|
64
|
+
filesystem path).
|
|
65
|
+
|
|
66
|
+
```yaml
|
|
67
|
+
name: my-courses
|
|
68
|
+
vault:
|
|
69
|
+
STRIPE_KEY: stripe-live-key
|
|
70
|
+
STRIPE_WEBHOOK_SECRET: stripe-webhook-secret
|
|
71
|
+
AUTH_PROVIDER_KEY: auth-provider-key
|
|
72
|
+
services:
|
|
73
|
+
web:
|
|
74
|
+
type: nextjs
|
|
75
|
+
path: /
|
|
76
|
+
needs:
|
|
77
|
+
database: true
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Declare the datastore with `needs: { database: true }`** — the canonical shape.
|
|
81
|
+
The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus the legacy
|
|
82
|
+
`MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't author new
|
|
83
|
+
yaml with it, and never set `needs:` and `requires:` together (the validator
|
|
84
|
+
rejects it).
|
|
85
|
+
|
|
86
|
+
## 5. Build the app (following AGENTS.md)
|
|
87
|
+
|
|
88
|
+
Build the Next.js app under `services/web/` per the guide. Critical CloudGrid
|
|
89
|
+
rules:
|
|
90
|
+
|
|
91
|
+
- **Read every injected var LAZILY, inside a getter — never at module top level**,
|
|
92
|
+
or `next build` fails. That covers `process.env.DATABASE_MONGODB_URL` (legacy
|
|
93
|
+
`MONGODB_URL` fallback) in `lib/db.js`, and the vault secrets `STRIPE_KEY` /
|
|
94
|
+
`STRIPE_WEBHOOK_SECRET` in `lib/stripe.js` and `AUTH_PROVIDER_KEY` in
|
|
95
|
+
`lib/auth.js`.
|
|
96
|
+
- **Access is granted by the Stripe webhook**, not the checkout redirect: on
|
|
97
|
+
`checkout.session.completed`, create the `enrollments` doc. Verify the webhook
|
|
98
|
+
signature with `STRIPE_WEBHOOK_SECRET` against the RAW body.
|
|
99
|
+
- **Gate the lesson player on the server** — check enrollment (or free preview),
|
|
100
|
+
never rely on hiding UI.
|
|
101
|
+
|
|
102
|
+
## 6. Config (secrets + env)
|
|
103
|
+
|
|
104
|
+
- Secrets → `gridctl_secrets`: `grid secrets set stripe-live-key`,
|
|
105
|
+
`grid secrets set stripe-webhook-secret`, `grid secrets set auth-provider-key`.
|
|
106
|
+
The `vault:` block injects them as `STRIPE_KEY`, `STRIPE_WEBHOOK_SECRET`,
|
|
107
|
+
`AUTH_PROVIDER_KEY`.
|
|
108
|
+
- Non-secret config (e.g. the auth **publishable** key) → `gridctl_env`.
|
|
109
|
+
- Do **NOT** set the DB vars yourself (`DATABASE_MONGODB_URL` / legacy
|
|
110
|
+
`MONGODB_URL`) — the grid injects them.
|
|
111
|
+
|
|
112
|
+
## 7. Deploy (async)
|
|
113
|
+
|
|
114
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
115
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
116
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
117
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
118
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
119
|
+
|
|
120
|
+
## 8. Wire Stripe + return the live URL
|
|
121
|
+
|
|
122
|
+
Register the Stripe webhook to `https://<live-url>/api/webhooks/stripe` in the
|
|
123
|
+
Stripe dashboard, and set its signing secret into the `stripe-webhook-secret`
|
|
124
|
+
vault item. Give the user the live app URL — that is the deliverable. To iterate,
|
|
125
|
+
re-plug the SAME entity so it updates the same URL. Keep it honest: async build,
|
|
126
|
+
local-edition only, credentials injected by the grid.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: directory
|
|
3
|
+
when: directory, business directory, member directory, listings directory — a persistent app that stores and shows searchable/filterable listings. 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 directory on the grid — an `entries` collection (name, category, url, description) with a searchable/filterable list plus add / 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: directory
|
|
12
|
+
|
|
13
|
+
The user wants a **directory** — a searchable, filterable list of listings that
|
|
14
|
+
**remembers** its entries: a business directory, member directory, or listings
|
|
15
|
+
directory whose records survive refresh and are shared across sessions. That is
|
|
16
|
+
a **runtime app** backed by the grid's shared Mongo, not a static page. It is the
|
|
17
|
+
same proven shape as `app-with-data`, with an `entries` domain (name, category,
|
|
18
|
+
url, description) and a list view with live search + category filtering and
|
|
19
|
+
per-row delete.
|
|
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-directory
|
|
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", "directory")`. It is a minimal, real Next.js +
|
|
68
|
+
`mongodb`-driver directory under `services/web/`: a lazy client in
|
|
69
|
+
`services/web/lib/db.js`, an App-Router GET/POST/DELETE route on an
|
|
70
|
+
`entries` collection, a server-component page, and a client list with search +
|
|
71
|
+
category 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.
|