@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,123 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: marketplace
|
|
3
|
+
when: "marketplace, multi-vendor platform, two-sided marketplace"
|
|
4
|
+
needs: database
|
|
5
|
+
deploy: runtime
|
|
6
|
+
editions: local
|
|
7
|
+
kind: blueprint
|
|
8
|
+
capabilities_note: "persistent — needs a database (Mongo) and payment/auth secrets. Runtime app, async build, local edition only. Declare the canonical needs:{database:true}; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL). Map Stripe + auth secrets with a vault: block (STRIPE_KEY / STRIPE_WEBHOOK_SECRET / AUTH_PROVIDER_KEY) and grid secrets set the values."
|
|
9
|
+
summary: "A BLUEPRINT for a two-sided / multi-vendor marketplace — vendors, listings, orders, seller auth with roles, Stripe Connect payouts, and commission logic 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 + vault), then BUILD the app under services/web/ following it, and deploy async to a live URL (local edition only)."
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Workflow: marketplace
|
|
13
|
+
|
|
14
|
+
The user wants a two-sided / multi-vendor marketplace — many vendors listing
|
|
15
|
+
products, buyers ordering, the platform taking a commission and paying sellers
|
|
16
|
+
out. That is a **persistent runtime app** (Next.js + the grid's shared Mongo) with
|
|
17
|
+
three layered concerns: **seller auth with roles**, **Stripe Connect payouts**,
|
|
18
|
+
and **commission logic**. It is the `app-with-data` shape plus auth + payments.
|
|
19
|
+
|
|
20
|
+
**This is a BLUEPRINT.** Unlike a fill-in-the-blanks template, it ships
|
|
21
|
+
*structure* — a `cloudgrid.yaml` and an `AGENTS.md` structure guide — not finished
|
|
22
|
+
app code. The recipe is: fetch it, **read `AGENTS.md`**, then **build** the app
|
|
23
|
+
following it. Be honest that a runtime deploy is async and needs the local edition.
|
|
24
|
+
|
|
25
|
+
## 1. Edition check FIRST (hard gate)
|
|
26
|
+
|
|
27
|
+
A marketplace is a built + deployed container (Next.js + Mongo + Stripe). It
|
|
28
|
+
requires the **local edition** (Claude Desktop / Claude Code) or the CLI.
|
|
29
|
+
|
|
30
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
31
|
+
hosted is inline-only and can only publish static pages. Tell the user plainly,
|
|
32
|
+
offer a **static storefront mockup** instead, and STOP the runtime path here.
|
|
33
|
+
- **Local edition:** continue.
|
|
34
|
+
|
|
35
|
+
## 2. Auth + grid
|
|
36
|
+
|
|
37
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
38
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
39
|
+
grid, ask which to use; do not assume a target.
|
|
40
|
+
|
|
41
|
+
## 3. Fetch the blueprint and READ AGENTS.md
|
|
42
|
+
|
|
43
|
+
`gridctl_fetch("template", "marketplace")`. The deliverable is the **`AGENTS.md`
|
|
44
|
+
structure guide** — read it before writing anything. It defines:
|
|
45
|
+
- the `services/web/` file tree (pages, API routes, `lib/`),
|
|
46
|
+
- the Mongo collections (`vendors`, `listings`, `orders`) + fields,
|
|
47
|
+
- the CloudGrid injection table (needs + vault + AI gateway),
|
|
48
|
+
- how to wire auth (Clerk/Auth0 + a `role` claim) and payments (Stripe Connect
|
|
49
|
+
onboarding, Checkout with `application_fee` + `transfer_data.destination`, and a
|
|
50
|
+
signature-verified webhook),
|
|
51
|
+
- the deploy flow.
|
|
52
|
+
|
|
53
|
+
There is no app code to copy — you generate it from the guide.
|
|
54
|
+
|
|
55
|
+
## 4. Scaffold + fill cloudgrid.yaml
|
|
56
|
+
|
|
57
|
+
`gridctl_init` an app `<name>` FIRST (creates the entity + `.cloudgrid/link.json`
|
|
58
|
+
and a starter `cloudgrid.yaml` with empty `services:{}`; `plug` needs a linked
|
|
59
|
+
directory). Then put the app under **`services/web/`** and set `cloudgrid.yaml` to
|
|
60
|
+
the blueprint's active fields:
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
name: my-marketplace
|
|
64
|
+
services:
|
|
65
|
+
web:
|
|
66
|
+
type: nextjs
|
|
67
|
+
path: /
|
|
68
|
+
needs:
|
|
69
|
+
database: true
|
|
70
|
+
vault:
|
|
71
|
+
STRIPE_KEY: stripe-live-key
|
|
72
|
+
STRIPE_WEBHOOK_SECRET: stripe-webhook-secret
|
|
73
|
+
AUTH_PROVIDER_KEY: auth-provider-key
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**App code MUST live under `services/<name>/`** — `path:` is the URL mount, NOT
|
|
77
|
+
the filesystem path. **Declare `needs: { database: true }`** (canonical) — the
|
|
78
|
+
deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (+ legacy
|
|
79
|
+
`MONGODB_URL`). `requires:` is the deprecated v1 alias; never author it and never
|
|
80
|
+
set `needs:` and `requires:` together (the validator rejects the combination).
|
|
81
|
+
|
|
82
|
+
## 5. Build the app following AGENTS.md
|
|
83
|
+
|
|
84
|
+
Generate the files under `services/web/` per the guide:
|
|
85
|
+
- **Lazy getters** for injected values — read `process.env.DATABASE_MONGODB_URL`
|
|
86
|
+
(legacy `MONGODB_URL` fallback) and `process.env.STRIPE_KEY` **inside** a getter,
|
|
87
|
+
never at module top level (a top-level read fails `next build`).
|
|
88
|
+
- Auth SDK (Clerk/Auth0) in `lib/auth.js` from `AUTH_PROVIDER_KEY`; role-gate the
|
|
89
|
+
seller dashboard + seller API routes in `middleware.js`.
|
|
90
|
+
- Stripe Connect: onboarding account links, Checkout with the platform fee routed
|
|
91
|
+
via `application_fee_amount` + `transfer_data.destination`, and a webhook that
|
|
92
|
+
verifies the signature with `STRIPE_WEBHOOK_SECRET` before marking orders paid.
|
|
93
|
+
- Commission as a pure function (`lib/commission.js`); store money as integer cents.
|
|
94
|
+
|
|
95
|
+
## 6. Config / secrets
|
|
96
|
+
|
|
97
|
+
- Map secrets in the `vault:` block (done above), then **store the values**:
|
|
98
|
+
`grid secrets set stripe-live-key sk_live_…`,
|
|
99
|
+
`grid secrets set stripe-webhook-secret whsec_…`,
|
|
100
|
+
`grid secrets set auth-provider-key …`. Non-secret public config → `gridctl_env`.
|
|
101
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` / legacy
|
|
102
|
+
`MONGODB_URL`) — the grid injects them.
|
|
103
|
+
|
|
104
|
+
## 7. (Optional) Run locally
|
|
105
|
+
|
|
106
|
+
Mention the user can `grid dev` to run locally against the injected dev Mongo +
|
|
107
|
+
secrets before deploying. Don't require it.
|
|
108
|
+
|
|
109
|
+
## 8. Deploy (async)
|
|
110
|
+
|
|
111
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
112
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
113
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
114
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
115
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
116
|
+
|
|
117
|
+
## 9. Return the live URL + iterate
|
|
118
|
+
|
|
119
|
+
Give the user the live app URL — the deliverable. Point the Stripe webhook
|
|
120
|
+
endpoint at `<live-url>/api/webhooks/stripe`. To iterate, re-plug the SAME entity
|
|
121
|
+
so it updates the same URL. Keep it honest: this is a blueprint you built from,
|
|
122
|
+
the build is async, it is local-edition only, and credentials are injected by the
|
|
123
|
+
grid (Mongo via `needs`, Stripe/auth via `vault` + `grid secrets set`).
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: membership-site
|
|
3
|
+
when: "membership site, paid community, subscriber content, gated content"
|
|
4
|
+
needs: database
|
|
5
|
+
deploy: runtime
|
|
6
|
+
editions: local
|
|
7
|
+
kind: blueprint
|
|
8
|
+
capabilities_note: "persistent — needs a database (Mongo) plus auth + 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 / AUTH_PROVIDER_KEY to env vars. This is a BLUEPRINT — read AGENTS.md for the structure, then build."
|
|
9
|
+
summary: "Build a paid membership site on the grid — a Next.js app with user auth, Stripe subscription checkout, gated /members/* routes that check membership status, and grid-shared Mongo (users + memberships collections). This is a BLUEPRINT: fetch the template, read AGENTS.md for the file tree + CloudGrid wiring (needs database true, vault for Stripe/auth secrets), build the app under services/web/, deploy async, poll to a live URL."
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Workflow: membership-site
|
|
13
|
+
|
|
14
|
+
The user wants a paid membership site / subscriber community: visitors sign up,
|
|
15
|
+
subscribe via Stripe, and only paying members reach the gated content. That is a
|
|
16
|
+
**persistent runtime app** — a Next.js app backed by the grid's shared Mongo,
|
|
17
|
+
with auth and Stripe subscriptions, gated routes that check membership status.
|
|
18
|
+
|
|
19
|
+
This is a **blueprint**, not a fill-in template. There is no finished app to
|
|
20
|
+
copy — there is a `cloudgrid.yaml` and a structure guide (`AGENTS.md`). Read the
|
|
21
|
+
guide, then build the app following it. Be honest that a runtime deploy is async
|
|
22
|
+
(not instant like a static drop) and that it needs the local edition.
|
|
23
|
+
|
|
24
|
+
## 1. Edition check FIRST (hard gate)
|
|
25
|
+
|
|
26
|
+
A membership site 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 paywall-landing page** instead, and STOP the runtime
|
|
32
|
+
path here.
|
|
33
|
+
- **Local edition:** continue.
|
|
34
|
+
|
|
35
|
+
## 2. Auth + grid
|
|
36
|
+
|
|
37
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
38
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
39
|
+
grid, ask which to use; do not assume a target.
|
|
40
|
+
|
|
41
|
+
## 3. Read the blueprint
|
|
42
|
+
|
|
43
|
+
Fetch the template and read its structure guide — this is the core of the
|
|
44
|
+
workflow:
|
|
45
|
+
|
|
46
|
+
- `gridctl_fetch("template", "membership-site")` — the `cloudgrid.yaml` +
|
|
47
|
+
**`AGENTS.md`**. AGENTS.md has the file tree, the Mongo collections
|
|
48
|
+
(`users`, `memberships`), the CloudGrid injection table, and the auth + Stripe
|
|
49
|
+
wiring. **Read it fully before building.**
|
|
50
|
+
- `gridctl_fetch("template", "app-with-data")` — the proven Next.js + Mongo
|
|
51
|
+
shape this blueprint extends (lazy db client in `lib/db.js`, App-Router
|
|
52
|
+
GET/POST route). Imitate its wiring.
|
|
53
|
+
|
|
54
|
+
## 4. Scaffold
|
|
55
|
+
|
|
56
|
+
`gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
|
|
57
|
+
and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
|
|
58
|
+
directory, so run `init` FIRST. Then write the app under **`services/web/`** and
|
|
59
|
+
set `cloudgrid.yaml` to the active shape below.
|
|
60
|
+
|
|
61
|
+
## 5. Build the app following AGENTS.md
|
|
62
|
+
|
|
63
|
+
Build the file tree from AGENTS.md under `services/web/`: the lazy Mongo client,
|
|
64
|
+
the lazy Stripe client, the auth middleware, the checkout + webhook + me API
|
|
65
|
+
routes, the gated `/members/*` layout, and the pricing + landing pages. Adapt the
|
|
66
|
+
plans, content, and document fields to the user. Key non-negotiables:
|
|
67
|
+
|
|
68
|
+
- **App code under `services/web/`** — `path:` is the URL mount, NOT the
|
|
69
|
+
filesystem path. Root files fail with `Service directory not found`.
|
|
70
|
+
- **Read the DB LAZILY** from `process.env.DATABASE_MONGODB_URL` (legacy
|
|
71
|
+
`process.env.MONGODB_URL` fallback) inside the getter — never at module top
|
|
72
|
+
level, or `next build` fails.
|
|
73
|
+
- **Read secrets LAZILY** too — `process.env.STRIPE_KEY`,
|
|
74
|
+
`STRIPE_WEBHOOK_SECRET`, `AUTH_PROVIDER_KEY` — inside getters, never top-level.
|
|
75
|
+
- **Gate server-side.** The `memberships` collection is the source of truth for
|
|
76
|
+
"have you paid"; `app/members/layout.js` checks it server-side and redirects
|
|
77
|
+
non-members to `/pricing`. The Stripe webhook writes membership status.
|
|
78
|
+
|
|
79
|
+
`cloudgrid.yaml` active shape:
|
|
80
|
+
|
|
81
|
+
```yaml
|
|
82
|
+
name: my-membership-site
|
|
83
|
+
services:
|
|
84
|
+
web:
|
|
85
|
+
type: nextjs
|
|
86
|
+
path: /
|
|
87
|
+
needs:
|
|
88
|
+
database: true
|
|
89
|
+
vault:
|
|
90
|
+
STRIPE_KEY: stripe-live-key
|
|
91
|
+
STRIPE_WEBHOOK_SECRET: stripe-webhook-secret
|
|
92
|
+
AUTH_PROVIDER_KEY: auth-provider-key
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Declare the datastore with `needs: { database: true }`** — the canonical
|
|
96
|
+
shape. `requires:` is the deprecated v1 alias; don't author new yaml with it, and
|
|
97
|
+
never set `needs:` and `requires:` together (the validator rejects it).
|
|
98
|
+
|
|
99
|
+
## 6. Config / secrets
|
|
100
|
+
|
|
101
|
+
- Stripe + auth secrets → `gridctl_secrets` (set the vault items `stripe-live-key`,
|
|
102
|
+
`stripe-webhook-secret`, `auth-provider-key` that the `vault:` block maps from).
|
|
103
|
+
The deployer injects each as its env var at runtime and under `grid dev`.
|
|
104
|
+
- Non-secret config (auth publishable key `NEXT_PUBLIC_...`, Stripe price id) →
|
|
105
|
+
`gridctl_env` / `services.web.env`.
|
|
106
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` / legacy
|
|
107
|
+
`MONGODB_URL`) — the grid injects them.
|
|
108
|
+
|
|
109
|
+
## 7. (Optional) Run locally
|
|
110
|
+
|
|
111
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo
|
|
112
|
+
and vault secrets before deploying. Don't require it.
|
|
113
|
+
|
|
114
|
+
## 8. Deploy (async)
|
|
115
|
+
|
|
116
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
117
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
118
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
119
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
120
|
+
- Once live, register the `/api/webhook` URL as the Stripe webhook endpoint,
|
|
121
|
+
copy the signing secret into the `stripe-webhook-secret` vault item, and
|
|
122
|
+
re-plug. Return the deployed app URL (NOT the build/log link).
|
|
123
|
+
|
|
124
|
+
## 9. Return the live URL + iterate
|
|
125
|
+
|
|
126
|
+
Give the user the live app URL — that is the deliverable. To iterate, re-plug the
|
|
127
|
+
SAME entity so it updates the same URL. Keep it honest: async build, local-edition
|
|
128
|
+
only, DB injected by the grid, secrets injected from the vault.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: monitoring-dashboard
|
|
3
|
+
when: monitoring dashboard, service health board, uptime/incident monitor (data-backed) — a persistent app that records health checks per service and shows current status + history. 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 monitoring dashboard on the grid — a `checks` collection (service, status up/degraded/down, latencyMs, at) with a current-status grid + recent history and a POST-a-check 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: monitoring-dashboard
|
|
12
|
+
|
|
13
|
+
The user wants a monitoring dashboard / service health board / uptime monitor
|
|
14
|
+
that **remembers** its health checks — a board whose data survives refresh and is
|
|
15
|
+
shared across sessions. That is a **runtime app** backed by the grid's shared
|
|
16
|
+
Mongo, not a static page. It is the same proven shape as `app-with-data`, with a
|
|
17
|
+
`checks` domain (`service`, `status` of up/degraded/down, `latencyMs`, `at`), a
|
|
18
|
+
current-status grid (latest check per service) and a recent-history table, plus a
|
|
19
|
+
form that POSTs a new check.
|
|
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-dashboard
|
|
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", "monitoring-dashboard")`. It is a minimal, real
|
|
68
|
+
Next.js + `mongodb`-driver health board under `services/web/`: a lazy client
|
|
69
|
+
in `services/web/lib/db.js`, an App-Router GET/POST/DELETE route on a `checks`
|
|
70
|
+
collection, a server-component page that derives the status grid, and a client
|
|
71
|
+
component with the record-check form + status grid + history table.
|
|
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
|
+
- The `checks` route validates `status` against `up`/`degraded`/`down` and
|
|
78
|
+
`latencyMs` as an optional non-negative number; the status grid is the
|
|
79
|
+
latest check per service.
|
|
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 app URL — that is the deliverable. To iterate, re-plug the
|
|
103
|
+
SAME entity so it updates the same URL. Keep it honest: async build, local-edition
|
|
104
|
+
only, credentials injected by the grid.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: online-store
|
|
3
|
+
when: online store, e-commerce store, shop with checkout, sell products online
|
|
4
|
+
needs: database
|
|
5
|
+
deploy: runtime
|
|
6
|
+
editions: local
|
|
7
|
+
kind: blueprint
|
|
8
|
+
capabilities_note: persistent + payments — needs a database (Mongo) and Stripe. Runtime app, async build, local edition only. This is a BLUEPRINT — read the template's AGENTS.md for the structure, then build the app. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL). The Stripe key comes from the vault: block → STRIPE_KEY.
|
|
9
|
+
summary: Build a persistent Next.js + Mongo + Stripe online store on the grid — storefront, cart, /api/checkout Stripe session, signature-verified Stripe webhook, orders in Mongo. This is a BLUEPRINT: edition-gate first, scaffold, fetch the template and read AGENTS.md for the file tree + wiring, put the app under services/web/, wire process.env.DATABASE_MONGODB_URL lazily and STRIPE_KEY from the vault, declare needs:{database:true} (not requires:), deploy async, poll to a live URL, register the webhook in Stripe.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Workflow: online-store
|
|
13
|
+
|
|
14
|
+
The user wants to **sell products online** — a storefront with a cart and real
|
|
15
|
+
checkout. That is a **runtime app** backed by the grid's shared Mongo (`products`
|
|
16
|
+
+ `orders`) plus **Stripe** for payments: a `/api/checkout` route that creates a
|
|
17
|
+
Stripe Checkout Session and a signature-verified webhook that confirms payment
|
|
18
|
+
and records the order. Not a static page — it must remember products and orders.
|
|
19
|
+
|
|
20
|
+
**This is a BLUEPRINT.** The template ships the structure + `cloudgrid.yaml`, not
|
|
21
|
+
finished app code. The build shape is proven `app-with-data` (Next.js App Router,
|
|
22
|
+
lazy Mongo, app under `services/web/`) plus a second collection and Stripe wiring.
|
|
23
|
+
Be honest that a runtime deploy is async (not instant) and needs the local edition.
|
|
24
|
+
|
|
25
|
+
## 1. Edition check FIRST (hard gate)
|
|
26
|
+
|
|
27
|
+
A persistent store is a built + deployed container. It requires the **local
|
|
28
|
+
edition** (Claude Desktop / Claude Code) or the CLI.
|
|
29
|
+
|
|
30
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
31
|
+
hosted is inline-only and can only publish static pages. Say so plainly, offer
|
|
32
|
+
a **static storefront preview** instead, and STOP the runtime path here.
|
|
33
|
+
- **Local edition:** continue.
|
|
34
|
+
|
|
35
|
+
## 2. Auth + grid
|
|
36
|
+
|
|
37
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
38
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
39
|
+
grid, ask which to use; do not assume a target.
|
|
40
|
+
|
|
41
|
+
## 3. Scaffold
|
|
42
|
+
|
|
43
|
+
`gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
|
|
44
|
+
and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
|
|
45
|
+
directory, so run `init` FIRST.
|
|
46
|
+
|
|
47
|
+
## 4. Fetch the blueprint and read AGENTS.md
|
|
48
|
+
|
|
49
|
+
This is a blueprint — the structure guide is the deliverable, not copy-paste code.
|
|
50
|
+
|
|
51
|
+
1. `gridctl_fetch("template", "online-store")`.
|
|
52
|
+
2. **Read `AGENTS.md`** in the fetched template. It has: the file tree (app under
|
|
53
|
+
`services/web/`), the Mongo collections (`products`, `orders`) and their
|
|
54
|
+
fields, how the grid injects Mongo (`DATABASE_MONGODB_URL`) and the Stripe key
|
|
55
|
+
(the `vault:` block → `STRIPE_KEY`), the checkout + webhook wiring, and the
|
|
56
|
+
deploy steps. Build the app following it.
|
|
57
|
+
3. Set `cloudgrid.yaml` to the shape below. **App code MUST live under
|
|
58
|
+
`services/web/`** — `path:` is the URL mount, NOT the filesystem path.
|
|
59
|
+
```yaml
|
|
60
|
+
name: my-store
|
|
61
|
+
vault:
|
|
62
|
+
STRIPE_KEY: stripe-live-key
|
|
63
|
+
services:
|
|
64
|
+
web:
|
|
65
|
+
type: nextjs
|
|
66
|
+
path: /
|
|
67
|
+
needs:
|
|
68
|
+
database: true
|
|
69
|
+
```
|
|
70
|
+
**Declare the datastore with `needs: { database: true }`** — the canonical
|
|
71
|
+
shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
|
|
72
|
+
the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; never
|
|
73
|
+
set `needs:` and `requires:` together (the validator rejects it).
|
|
74
|
+
|
|
75
|
+
## 5. Build the app (following AGENTS.md)
|
|
76
|
+
|
|
77
|
+
- **Read the DB from `process.env.DATABASE_MONGODB_URL`** (legacy `MONGODB_URL`
|
|
78
|
+
fallback) inside a **lazy getter** — never at module top level, or `next build`
|
|
79
|
+
fails. Never hardcode a connection string.
|
|
80
|
+
- **Read the Stripe key from `process.env.STRIPE_KEY`** (injected by the `vault:`
|
|
81
|
+
block) lazily. Build Stripe line items from the server-side `products`
|
|
82
|
+
collection — never trust prices sent by the browser.
|
|
83
|
+
- The **webhook** reads the RAW request body (`await request.text()`), verifies
|
|
84
|
+
the Stripe signature, and upserts the `orders` doc by `stripeSessionId`
|
|
85
|
+
(idempotent), setting `status: "paid"` from the verified event.
|
|
86
|
+
- (Optional) `grid dev` to run locally against the injected Mongo + a Stripe test
|
|
87
|
+
key before deploying.
|
|
88
|
+
|
|
89
|
+
## 6. Config
|
|
90
|
+
|
|
91
|
+
- Stripe secrets → the vault: `gridctl_secrets` to set `stripe-live-key` (and a
|
|
92
|
+
`stripe-webhook-secret` if you map one). The `vault:` block turns them into env
|
|
93
|
+
vars. Non-secret config → `gridctl_env`.
|
|
94
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` /
|
|
95
|
+
`MONGODB_URL`) — the grid injects them.
|
|
96
|
+
|
|
97
|
+
## 7. Deploy (async)
|
|
98
|
+
|
|
99
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
100
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
101
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
102
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
103
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
104
|
+
|
|
105
|
+
## 8. Wire the Stripe webhook + return the live URL
|
|
106
|
+
|
|
107
|
+
1. Register `<live-url>/api/webhook` as a webhook endpoint in the Stripe
|
|
108
|
+
dashboard, copy its `whsec_…` secret into the vault, and re-`gridctl_plug` the
|
|
109
|
+
SAME entity if you changed the `vault:` mapping (same URL).
|
|
110
|
+
2. Give the user the live store URL — that is the deliverable. To iterate, re-plug
|
|
111
|
+
the SAME entity so it updates the same URL.
|
|
112
|
+
|
|
113
|
+
Keep it honest: blueprint (build from AGENTS.md), async build, local-edition only,
|
|
114
|
+
Mongo + Stripe credentials injected by the grid / vault.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: product-catalog
|
|
3
|
+
when: product catalog, product listings, catalog site, browse products (no checkout) — a persistent app that stores products and lets visitors browse them by category. 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). No checkout / payments.
|
|
8
|
+
summary: Build a persistent Next.js + Mongo product catalog on the grid — a `products` collection (name, price, category, description, inStock) with a grid view, category filter, and admin 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: product-catalog
|
|
12
|
+
|
|
13
|
+
The user wants a product catalog / product-listings site that **remembers** its
|
|
14
|
+
products — a catalog whose records 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 `products`
|
|
17
|
+
domain (name, price, category, description, inStock) rendered as a grid with a
|
|
18
|
+
category filter and an admin add/delete section.
|
|
19
|
+
|
|
20
|
+
This is browse-only — **no checkout, no cart, no payments**. If the user wants to
|
|
21
|
+
sell (cart, checkout, Stripe), that is a different, larger build; say so.
|
|
22
|
+
|
|
23
|
+
Follow this recipe. Be honest that a runtime deploy is async (not instant like a
|
|
24
|
+
static drop) and that it needs the local edition.
|
|
25
|
+
|
|
26
|
+
## 1. Edition check FIRST (hard gate)
|
|
27
|
+
|
|
28
|
+
A persistent app 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
|
|
33
|
+
plainly, offer a **static version** 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. Scaffold
|
|
43
|
+
|
|
44
|
+
`gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
|
|
45
|
+
and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
|
|
46
|
+
directory, so run `init` FIRST. Then (a) write the app under **`services/web/`**,
|
|
47
|
+
and (b) fill `cloudgrid.yaml` to the shape below (`services.web` + `needs:
|
|
48
|
+
{ database: true }`).
|
|
49
|
+
|
|
50
|
+
## 4. Add the datastore + wire Mongo
|
|
51
|
+
|
|
52
|
+
1. Set `cloudgrid.yaml`. **App code MUST live under `services/<name>/`** —
|
|
53
|
+
`path:` is the URL mount, NOT the filesystem path.
|
|
54
|
+
```yaml
|
|
55
|
+
name: my-catalog
|
|
56
|
+
services:
|
|
57
|
+
web:
|
|
58
|
+
type: nextjs
|
|
59
|
+
path: /
|
|
60
|
+
needs:
|
|
61
|
+
database: true
|
|
62
|
+
```
|
|
63
|
+
**Declare the datastore with `needs: { database: true }`** — the canonical
|
|
64
|
+
shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
|
|
65
|
+
the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't
|
|
66
|
+
author new yaml with it, and never set `needs:` and `requires:` together (the
|
|
67
|
+
validator rejects it).
|
|
68
|
+
2. Fetch the template for the Mongo wiring + CRUD shape:
|
|
69
|
+
`gridctl_fetch("template", "product-catalog")`. It is a minimal, real
|
|
70
|
+
Next.js + `mongodb`-driver catalog under `services/web/`: a lazy client in
|
|
71
|
+
`services/web/lib/db.js`, an App-Router GET/POST/DELETE route on a `products`
|
|
72
|
+
collection, a server-component page, and a client grid with a category filter
|
|
73
|
+
and an admin add/delete form.
|
|
74
|
+
3. Adapt it (rename the collection, change fields, adjust the UI). **Read the DB
|
|
75
|
+
from `process.env.DATABASE_MONGODB_URL`** (legacy `process.env.MONGODB_URL`
|
|
76
|
+
fallback) — the grid injects it at dev-time and runtime.
|
|
77
|
+
- **Put the DB connection behind a lazy getter — never read the connection
|
|
78
|
+
string at module top level, or `next build` fails.**
|
|
79
|
+
- Keep the API route `export const dynamic = "force-dynamic"` so listings are
|
|
80
|
+
always live.
|
|
81
|
+
|
|
82
|
+
## 5. (Optional) Run locally
|
|
83
|
+
|
|
84
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo
|
|
85
|
+
before deploying. Don't require it.
|
|
86
|
+
|
|
87
|
+
## 6. Config
|
|
88
|
+
|
|
89
|
+
- API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
|
|
90
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
|
|
91
|
+
legacy `MONGODB_URL`) — the grid injects them.
|
|
92
|
+
|
|
93
|
+
## 7. Deploy (async)
|
|
94
|
+
|
|
95
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
96
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
97
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
98
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
99
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
100
|
+
|
|
101
|
+
## 8. Return the live URL + iterate
|
|
102
|
+
|
|
103
|
+
Give the user the live catalog URL — that is the deliverable. To iterate, re-plug
|
|
104
|
+
the SAME entity so it updates the same URL. Keep it honest: async build,
|
|
105
|
+
local-edition only, credentials injected by the grid, browse-only (no checkout).
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: product-launch
|
|
3
|
+
when: product launch page, launch announcement, new product page, we just launched.
|
|
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 product-launch template, fill it with the user's product/launch content, deploy it, and return the live share URL.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Workflow: product-launch
|
|
12
|
+
|
|
13
|
+
Detect the intent ("build a launch page / announcement for our new product X")
|
|
14
|
+
and follow this recipe. Do not ask setup questions first; use sensible defaults
|
|
15
|
+
and build.
|
|
16
|
+
|
|
17
|
+
1. **Fetch the template.** Call `gridctl_fetch("template", "product-launch")` to
|
|
18
|
+
load the self-contained HTML launch-page template (hero + product image,
|
|
19
|
+
countdown, features, launch offer, social proof).
|
|
20
|
+
2. **(Optional) Fetch the example.** Call `gridctl_fetch("example", "product-launch")`
|
|
21
|
+
to see a filled launch page as a reference for tone and structure.
|
|
22
|
+
3. **Fill the template.** Replace the placeholders with the user's content:
|
|
23
|
+
- Product name, hero headline, subhead, launch badge, and CTA label/target.
|
|
24
|
+
- The **countdown target**: set `{{LAUNCH_DATETIME_ISO}}` to an ISO 8601
|
|
25
|
+
instant (e.g. `2026-09-01T09:00:00Z`). If unset/invalid it falls back to
|
|
26
|
+
+14 days.
|
|
27
|
+
- One block per key feature (title + short description).
|
|
28
|
+
- The launch offer (price, was-price, fine print, offer CTA).
|
|
29
|
+
- Social-proof stats and testimonials.
|
|
30
|
+
- Swap the hero product image (the inline `<svg>` in `.shot`) for a real
|
|
31
|
+
screenshot **only** as inline SVG or a `data:` URI. Keep it a single
|
|
32
|
+
self-contained HTML file — no external scripts, stylesheets, fonts, CDNs,
|
|
33
|
+
or large embedded media.
|
|
34
|
+
4. **Deploy.** Deploy the filled HTML:
|
|
35
|
+
- Hosted MCP edition: call the drop tool with the HTML.
|
|
36
|
+
- Local MCP / CLI edition: write the HTML to a file and run `gridctl plug`.
|
|
37
|
+
A launch page is an inspiration and deploys synchronously, so you get a URL
|
|
38
|
+
right away.
|
|
39
|
+
5. **Return the live share URL.** Give the user the URL that serves the page.
|
|
40
|
+
For revisions, re-deploy with the entity id from the first deploy — it updates
|
|
41
|
+
the same share URL, so the user iterates on one link.
|
|
42
|
+
|
|
43
|
+
Keep the whole flow tight: fetch, fill, deploy, share.
|