@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,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: project-management
|
|
3
|
+
when: "project management, projects and tasks tracker, team project board — a persistent app that tracks projects and their tasks on a status board. 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 project management app on the grid — a `projects` collection (name) plus a `tasks` collection (projectId, title, status todo/doing/done, assignee) with a project list and a per-project task board. 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: project-management
|
|
12
|
+
|
|
13
|
+
The user wants a project & task tracker — a team project board that **remembers**
|
|
14
|
+
its projects and tasks so they survive refresh and are shared across sessions.
|
|
15
|
+
That is a **runtime app** backed by the grid's shared Mongo, not a static page.
|
|
16
|
+
It is the same proven shape as `app-with-data`, with two collections:
|
|
17
|
+
|
|
18
|
+
- **projects** — `{ name }`
|
|
19
|
+
- **tasks** — `{ projectId, title, status: todo | doing | done, assignee }`
|
|
20
|
+
|
|
21
|
+
The UI is a project list plus a per-project task board with three status columns
|
|
22
|
+
(to do / doing / done); cards move between columns and carry an optional assignee.
|
|
23
|
+
|
|
24
|
+
Follow this recipe. Be honest that a runtime deploy is async (not instant like a
|
|
25
|
+
static drop) and that it needs the local edition.
|
|
26
|
+
|
|
27
|
+
## 1. Edition check FIRST (hard gate)
|
|
28
|
+
|
|
29
|
+
A persistent app is a built + deployed container. It requires the **local
|
|
30
|
+
edition** (Claude Desktop / Claude Code) or the CLI.
|
|
31
|
+
|
|
32
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
33
|
+
hosted is inline-only and can only publish static pages. Tell the user
|
|
34
|
+
plainly, offer a **static version** instead, and STOP the runtime path here.
|
|
35
|
+
- **Local edition:** continue.
|
|
36
|
+
|
|
37
|
+
## 2. Auth + grid
|
|
38
|
+
|
|
39
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
40
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
41
|
+
grid, ask which to use; do not assume a target.
|
|
42
|
+
|
|
43
|
+
## 3. Scaffold
|
|
44
|
+
|
|
45
|
+
`gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
|
|
46
|
+
and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
|
|
47
|
+
directory, so run `init` FIRST. Then (a) write the app under **`services/web/`**,
|
|
48
|
+
and (b) fill `cloudgrid.yaml` to the shape below (`services.web` + `needs:
|
|
49
|
+
{ database: true }`).
|
|
50
|
+
|
|
51
|
+
## 4. Add the datastore + wire Mongo
|
|
52
|
+
|
|
53
|
+
1. Set `cloudgrid.yaml`. **App code MUST live under `services/<name>/`** —
|
|
54
|
+
`path:` is the URL mount, NOT the filesystem path.
|
|
55
|
+
```yaml
|
|
56
|
+
name: my-project-board
|
|
57
|
+
services:
|
|
58
|
+
web:
|
|
59
|
+
type: nextjs
|
|
60
|
+
path: /
|
|
61
|
+
needs:
|
|
62
|
+
database: true
|
|
63
|
+
```
|
|
64
|
+
**Declare the datastore with `needs: { database: true }`** — the canonical
|
|
65
|
+
shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
|
|
66
|
+
the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't
|
|
67
|
+
author new yaml with it, and never set `needs:` and `requires:` together (the
|
|
68
|
+
validator rejects it).
|
|
69
|
+
2. Fetch the template for the Mongo wiring + CRUD shape:
|
|
70
|
+
`gridctl_fetch("template", "project-management")`. It is a minimal, real
|
|
71
|
+
Next.js + `mongodb`-driver app under `services/web/`: a lazy client in
|
|
72
|
+
`services/web/lib/db.js`, an App-Router GET/POST/DELETE route on a `projects`
|
|
73
|
+
collection, a GET/POST/PATCH/DELETE route on a `tasks` collection, a
|
|
74
|
+
server-component page, and a client board component.
|
|
75
|
+
3. Adapt it (rename the collections, change fields, adjust the UI). **Read the DB
|
|
76
|
+
from `process.env.DATABASE_MONGODB_URL`** (legacy `process.env.MONGODB_URL`
|
|
77
|
+
fallback) — the grid injects it at dev-time and runtime.
|
|
78
|
+
- **Put the DB connection behind a lazy getter — never read the connection
|
|
79
|
+
string at module top level, or `next build` fails.**
|
|
80
|
+
- Every route file exports `const dynamic = "force-dynamic"` so data is never
|
|
81
|
+
cached.
|
|
82
|
+
|
|
83
|
+
## 5. (Optional) Run locally
|
|
84
|
+
|
|
85
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo
|
|
86
|
+
before deploying. Don't require it.
|
|
87
|
+
|
|
88
|
+
## 6. Config
|
|
89
|
+
|
|
90
|
+
- API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
|
|
91
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
|
|
92
|
+
legacy `MONGODB_URL`) — the grid injects them.
|
|
93
|
+
|
|
94
|
+
## 7. Deploy (async)
|
|
95
|
+
|
|
96
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
97
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
98
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
99
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
100
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
101
|
+
|
|
102
|
+
## 8. Return the live URL + iterate
|
|
103
|
+
|
|
104
|
+
Give the user the live app URL — that is the deliverable. To iterate, re-plug the
|
|
105
|
+
SAME entity so it updates the same URL. Keep it honest: async build, local-edition
|
|
106
|
+
only, credentials injected by the grid.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: property-listings
|
|
3
|
+
when: property listings, real estate site, rentals/homes listings — a persistent site that stores and browses properties by location and price. 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 property listings site on the grid — a `properties` collection (title, price:number, location, beds:number, description) with a card grid, a location/price filter, a detail view, and an admin add form. Edition-gate first, scaffold, put the app under services/web/, wire process.env.DATABASE_MONGODB_URL (legacy MONGODB_URL fallback) lazily, declare needs:{database:true} (not requires:), deploy async, poll to a live URL.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Workflow: property-listings
|
|
12
|
+
|
|
13
|
+
The user wants a real-estate / property listings site that **remembers** its
|
|
14
|
+
properties — listings that survive refresh and are shared across sessions. That
|
|
15
|
+
is a **runtime app** backed by the grid's shared Mongo, not a static page. It is
|
|
16
|
+
the same proven shape as `app-with-data`, with a `properties` domain
|
|
17
|
+
(title, price:number, location, beds:number, description) rendered as a card grid
|
|
18
|
+
with a location/price filter, a per-property detail view, and an admin add form.
|
|
19
|
+
|
|
20
|
+
Follow this recipe. Be honest that a runtime deploy is async (not instant like a
|
|
21
|
+
static drop) and that it needs the local edition.
|
|
22
|
+
|
|
23
|
+
## 1. Edition check FIRST (hard gate)
|
|
24
|
+
|
|
25
|
+
A persistent app is a built + deployed container. It requires the **local
|
|
26
|
+
edition** (Claude Desktop / Claude Code) or the CLI.
|
|
27
|
+
|
|
28
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
29
|
+
hosted is inline-only and can only publish static pages. Tell the user
|
|
30
|
+
plainly, offer a **static version** instead, and STOP the runtime path here.
|
|
31
|
+
- **Local edition:** continue.
|
|
32
|
+
|
|
33
|
+
## 2. Auth + grid
|
|
34
|
+
|
|
35
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
36
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
37
|
+
grid, ask which to use; do not assume a target.
|
|
38
|
+
|
|
39
|
+
## 3. Scaffold
|
|
40
|
+
|
|
41
|
+
`gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
|
|
42
|
+
and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
|
|
43
|
+
directory, so run `init` FIRST. Then (a) write the app under **`services/web/`**,
|
|
44
|
+
and (b) fill `cloudgrid.yaml` to the shape below (`services.web` + `needs:
|
|
45
|
+
{ database: true }`).
|
|
46
|
+
|
|
47
|
+
## 4. Add the datastore + wire Mongo
|
|
48
|
+
|
|
49
|
+
1. Set `cloudgrid.yaml`. **App code MUST live under `services/<name>/`** —
|
|
50
|
+
`path:` is the URL mount, NOT the filesystem path.
|
|
51
|
+
```yaml
|
|
52
|
+
name: my-listings
|
|
53
|
+
services:
|
|
54
|
+
web:
|
|
55
|
+
type: nextjs
|
|
56
|
+
path: /
|
|
57
|
+
needs:
|
|
58
|
+
database: true
|
|
59
|
+
```
|
|
60
|
+
**Declare the datastore with `needs: { database: true }`** — the canonical
|
|
61
|
+
shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
|
|
62
|
+
the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't
|
|
63
|
+
author new yaml with it, and never set `needs:` and `requires:` together (the
|
|
64
|
+
validator rejects it).
|
|
65
|
+
2. Fetch the template for the Mongo wiring + CRUD shape:
|
|
66
|
+
`gridctl_fetch("template", "property-listings")`. It is a minimal, real
|
|
67
|
+
Next.js + `mongodb`-driver listings site under `services/web/`: a lazy client
|
|
68
|
+
in `services/web/lib/db.js`, an App-Router GET/POST/DELETE route on a
|
|
69
|
+
`properties` collection (GET supports `?location=` and `?maxPrice=` filters), a
|
|
70
|
+
server-component page that reads + filters, and a client card grid with a
|
|
71
|
+
detail view and admin add 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
|
+
|
|
78
|
+
## 5. (Optional) Run locally
|
|
79
|
+
|
|
80
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo
|
|
81
|
+
before deploying. Don't require it.
|
|
82
|
+
|
|
83
|
+
## 6. Config
|
|
84
|
+
|
|
85
|
+
- API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
|
|
86
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
|
|
87
|
+
legacy `MONGODB_URL`) — the grid injects them.
|
|
88
|
+
|
|
89
|
+
## 7. Deploy (async)
|
|
90
|
+
|
|
91
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
92
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
93
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
94
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
95
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
96
|
+
|
|
97
|
+
## 8. Return the live URL + iterate
|
|
98
|
+
|
|
99
|
+
Give the user the live app URL — that is the deliverable. To iterate, re-plug the
|
|
100
|
+
SAME entity so it updates the same URL. Keep it honest: async build, local-edition
|
|
101
|
+
only, credentials injected by the grid.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: quiz-platform
|
|
3
|
+
when: quiz, quiz platform, trivia, assessment, questionnaire — a persistent app that stores questions and lets people take a scored quiz, with an admin form to add questions. 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 quiz/trivia platform on the grid — a `questions` collection ({ prompt, options: string[], answerIndex: number }) with a take-quiz UI that computes a score and an admin add-question 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: quiz-platform
|
|
12
|
+
|
|
13
|
+
The user wants a quiz / trivia / assessment app that **remembers** its questions
|
|
14
|
+
— a quiz whose question bank survives refresh and is shared across sessions.
|
|
15
|
+
That is a **runtime app** backed by the grid's shared Mongo, not a static page.
|
|
16
|
+
It is the same proven shape as `app-with-data`, with a `questions` domain
|
|
17
|
+
(`{ prompt: string, options: string[], answerIndex: number }`): a take-quiz UI
|
|
18
|
+
that lets a visitor pick one option per question and submit for a computed score,
|
|
19
|
+
plus an admin form that adds new questions.
|
|
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-quiz
|
|
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", "quiz-platform")`. It is a minimal, real Next.js +
|
|
68
|
+
`mongodb`-driver quiz platform under `services/web/`: a lazy client in
|
|
69
|
+
`services/web/lib/db.js`, an App-Router GET/POST/DELETE route on a
|
|
70
|
+
`questions` collection, a server-component page that reads the collection, and
|
|
71
|
+
a client component (`quiz.js`) that runs the take-quiz UI (score computed by
|
|
72
|
+
comparing each chosen option index against the question's `answerIndex`) and
|
|
73
|
+
an admin add-question 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 route handlers `export const dynamic = "force-dynamic"` so questions
|
|
80
|
+
are always read/written 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 quiz 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.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: restaurant-reservations
|
|
3
|
+
when: "restaurant website with reservations, table booking, restaurant site — a public Next.js site with menu content and a persistent reservations/table-booking collection backed by Mongo. Runtime app → local edition. This is a BLUEPRINT: read AGENTS.md for the structure, then build the app."
|
|
4
|
+
needs: database
|
|
5
|
+
deploy: runtime
|
|
6
|
+
editions: local
|
|
7
|
+
kind: blueprint
|
|
8
|
+
capabilities_note: "persistent — needs a database (Mongo). Runtime app, async build, local edition only. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL). Third-party secrets (Stripe deposit, email) go through the `vault:` block. A confirmation-reminder cron service is DESIGNED but NOT deployable yet (platform issue #1543)."
|
|
9
|
+
summary: "BLUEPRINT for a restaurant website with online reservations — a public Next.js + Mongo site (menu content + a reservations / table-booking collection) on the grid. It is structure + cloudgrid.yaml, not runnable code: fetch the template, READ AGENTS.md for the file tree, the menu/reservations/tables collections, and the CloudGrid wiring (DATABASE_MONGODB_URL injection, vault: for Stripe/email secrets, optional auth, deploy/poll), then build the app under services/web/ following it. needs:{database:true} (not requires:). Async runtime deploy, local edition only. Cron reminders are designed but PENDING #1543."
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Workflow: restaurant-reservations
|
|
13
|
+
|
|
14
|
+
The user wants a **restaurant website with online reservations** — a public site
|
|
15
|
+
with menu content and a booking form (optionally table booking) whose
|
|
16
|
+
reservations **persist** and are shared across sessions. That is a **runtime app**
|
|
17
|
+
backed by the grid's shared Mongo, not a static page.
|
|
18
|
+
|
|
19
|
+
**This is a BLUEPRINT.** The template does NOT contain app code — it ships a
|
|
20
|
+
`cloudgrid.yaml` and an `AGENTS.md` structure guide. The recipe is: fetch it,
|
|
21
|
+
**read `AGENTS.md`**, then build the app under `services/web/` following that
|
|
22
|
+
structure (the proven `app-with-data` shape, with a `reservations` domain).
|
|
23
|
+
|
|
24
|
+
Be honest that a runtime deploy is async (not instant like a static drop), that
|
|
25
|
+
it needs the local edition, and that the confirmation-reminder **cron** service
|
|
26
|
+
is designed but **not yet deployable** (platform issue #1543).
|
|
27
|
+
|
|
28
|
+
## 1. Edition check FIRST (hard gate)
|
|
29
|
+
|
|
30
|
+
A persistent app is a built + deployed container. It requires the **local
|
|
31
|
+
edition** (Claude Desktop / Claude Code) or the CLI.
|
|
32
|
+
|
|
33
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
34
|
+
hosted is inline-only and can only publish static pages. Tell the user plainly,
|
|
35
|
+
offer a **static menu page** (no bookings) instead, and STOP the runtime path.
|
|
36
|
+
- **Local edition:** continue.
|
|
37
|
+
|
|
38
|
+
## 2. Auth + grid
|
|
39
|
+
|
|
40
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
41
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
42
|
+
grid, ask which to use; do not assume a target.
|
|
43
|
+
|
|
44
|
+
## 3. Fetch the blueprint and READ AGENTS.md
|
|
45
|
+
|
|
46
|
+
`gridctl_fetch("template", "restaurant-reservations")`. This is a **blueprint**,
|
|
47
|
+
so the deliverable is `cloudgrid.yaml` + `AGENTS.md`, not app code.
|
|
48
|
+
|
|
49
|
+
**Read `AGENTS.md` before building.** It defines:
|
|
50
|
+
- the file tree (`services/web/{app/, lib/, api routes, package.json}`, optional
|
|
51
|
+
Stripe checkout + webhook routes, optional staff auth, a `services/reminder/`
|
|
52
|
+
cron job),
|
|
53
|
+
- the Mongo collections + fields (`menu`, `reservations`, `tables`),
|
|
54
|
+
- how CloudGrid injects the DB (`DATABASE_MONGODB_URL` / legacy `MONGODB_URL`) and
|
|
55
|
+
vault secrets, how to wire Stripe/auth, deploy steps, and the cron shape.
|
|
56
|
+
|
|
57
|
+
## 4. Scaffold + fill
|
|
58
|
+
|
|
59
|
+
1. `gridctl_init` an app `<name>` — creates the entity + `.cloudgrid/link.json`
|
|
60
|
+
and a `cloudgrid.yaml` with an EMPTY `services: {}`. Run `init` FIRST (plug
|
|
61
|
+
needs a linked directory).
|
|
62
|
+
2. Write the app under **`services/web/`** (`path:` is the URL mount, NOT the
|
|
63
|
+
filesystem path), following `AGENTS.md`.
|
|
64
|
+
3. Set `cloudgrid.yaml` to the blueprint's active fields:
|
|
65
|
+
```yaml
|
|
66
|
+
name: my-restaurant
|
|
67
|
+
vault:
|
|
68
|
+
STRIPE_KEY: stripe-live-key # only if taking a deposit
|
|
69
|
+
SENDGRID_API_KEY: sendgrid-key # confirmation / reminder email
|
|
70
|
+
services:
|
|
71
|
+
web:
|
|
72
|
+
type: nextjs
|
|
73
|
+
path: /
|
|
74
|
+
needs:
|
|
75
|
+
database: true
|
|
76
|
+
```
|
|
77
|
+
Declare `needs: { database: true }` (canonical) — the deployer provisions Mongo
|
|
78
|
+
and injects `DATABASE_MONGODB_URL` (+ legacy `MONGODB_URL`). `requires:` is the
|
|
79
|
+
deprecated v1 alias; never author it and never set `needs:` and `requires:`
|
|
80
|
+
together (the validator rejects the combination).
|
|
81
|
+
4. **Read the DB from `process.env.DATABASE_MONGODB_URL`** (legacy `MONGODB_URL`
|
|
82
|
+
fallback) behind a **lazy getter** — never at module top level, or `next build`
|
|
83
|
+
fails. Third-party keys come from the vault-injected env vars
|
|
84
|
+
(`process.env.STRIPE_KEY`, `process.env.SENDGRID_API_KEY`).
|
|
85
|
+
|
|
86
|
+
## 5. Config / secrets
|
|
87
|
+
|
|
88
|
+
- Secret values (Stripe, SendGrid, auth) → `gridctl_secrets` (the `vault:` block
|
|
89
|
+
maps them to env vars). Non-secret config (publishable keys, flags) →
|
|
90
|
+
`gridctl_env`.
|
|
91
|
+
- Do **NOT** set the DB vars yourself (`DATABASE_MONGODB_URL` / `MONGODB_URL`) —
|
|
92
|
+
the grid injects them.
|
|
93
|
+
|
|
94
|
+
## 6. (Optional) Run locally
|
|
95
|
+
|
|
96
|
+
`grid dev` runs Next.js with `DATABASE_MONGODB_URL` and vault vars injected
|
|
97
|
+
against dev Mongo. Seed the `menu` collection, test a booking. Don't require it.
|
|
98
|
+
|
|
99
|
+
## 7. Deploy (async)
|
|
100
|
+
|
|
101
|
+
Deploy `services/web/` with `gridctl_plug`. A **runtime deploy is ASYNC**: the
|
|
102
|
+
first response is `status: building`, NOT a live URL.
|
|
103
|
+
- Poll `gridctl_status` (or the returned poll URL) until live.
|
|
104
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
105
|
+
- Only once live, return the deployed app URL (NOT the build/log link).
|
|
106
|
+
- If Stripe deposits are on, register the live `/api/webhooks/stripe` URL in the
|
|
107
|
+
Stripe dashboard.
|
|
108
|
+
|
|
109
|
+
## 8. Cron reminders — PENDING #1543
|
|
110
|
+
|
|
111
|
+
The design includes a daily cron job that emails reminders to next-day bookings
|
|
112
|
+
(a `reminder:` cron service reading the same injected `DATABASE_MONGODB_URL` +
|
|
113
|
+
`SENDGRID_API_KEY`). **Cron deploy is not yet available (platform issue #1543)** —
|
|
114
|
+
keep the `reminder:` cron block **commented** in `cloudgrid.yaml`; an active cron
|
|
115
|
+
service will be rejected at plug until #1543 lands. Build the rest now; enable
|
|
116
|
+
cron once it ships. See `AGENTS.md` §7 for the intended shape and interim
|
|
117
|
+
workaround.
|
|
118
|
+
|
|
119
|
+
## 9. Return the live URL + iterate
|
|
120
|
+
|
|
121
|
+
Give the user the live app URL — that is the deliverable. To iterate, re-plug the
|
|
122
|
+
SAME entity so it updates the same URL. Keep it honest: blueprint you built out,
|
|
123
|
+
async build, local-edition only, DB + secrets injected by the grid, cron pending.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: revenue-dashboard
|
|
3
|
+
when: revenue dashboard, sales dashboard, MRR/revenue view — a persistent app that records sales and shows total revenue, a per-product breakdown, and recent activity. Needs a database → runtime → local edition.
|
|
4
|
+
needs: database
|
|
5
|
+
deploy: runtime
|
|
6
|
+
editions: local
|
|
7
|
+
capabilities_note: persistent — needs a database (Mongo). Runtime app, async build, local edition only. Declare the canonical `needs: { database: true }`; the deployer injects DATABASE_MONGODB_URL (+legacy MONGODB_URL).
|
|
8
|
+
summary: Build a persistent Next.js + Mongo revenue dashboard on the grid — a `sales` collection (product, amount:number, at) rendered as a total-revenue figure, a per-product breakdown, and a recent-sales table with an add form. Edition-gate first, scaffold, put the app under services/web/, wire process.env.DATABASE_MONGODB_URL (legacy MONGODB_URL fallback) lazily, declare needs:{database:true} (not requires:), deploy async, poll to a live URL.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Workflow: revenue-dashboard
|
|
12
|
+
|
|
13
|
+
The user wants a revenue / sales dashboard that **remembers** its sales — a view
|
|
14
|
+
whose numbers survive refresh and are shared across sessions. That is a
|
|
15
|
+
**runtime app** backed by the grid's shared Mongo, not a static page. It is the
|
|
16
|
+
same proven shape as `app-with-data`, with a `sales` domain
|
|
17
|
+
(`product`, `amount` as a number, `at` timestamp) and a dashboard view: a total
|
|
18
|
+
revenue figure, a per-product breakdown, a recent-sales table, and an add form.
|
|
19
|
+
|
|
20
|
+
Follow this recipe. Be honest that a runtime deploy is async (not instant like a
|
|
21
|
+
static drop) and that it needs the local edition.
|
|
22
|
+
|
|
23
|
+
## 1. Edition check FIRST (hard gate)
|
|
24
|
+
|
|
25
|
+
A persistent app is a built + deployed container. It requires the **local
|
|
26
|
+
edition** (Claude Desktop / Claude Code) or the CLI.
|
|
27
|
+
|
|
28
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
29
|
+
hosted is inline-only and can only publish static pages. Tell the user
|
|
30
|
+
plainly, offer a **static version** instead, and STOP the runtime path here.
|
|
31
|
+
- **Local edition:** continue.
|
|
32
|
+
|
|
33
|
+
## 2. Auth + grid
|
|
34
|
+
|
|
35
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
36
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
37
|
+
grid, ask which to use; do not assume a target.
|
|
38
|
+
|
|
39
|
+
## 3. Scaffold
|
|
40
|
+
|
|
41
|
+
`gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
|
|
42
|
+
and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
|
|
43
|
+
directory, so run `init` FIRST. Then (a) write the app under **`services/web/`**,
|
|
44
|
+
and (b) fill `cloudgrid.yaml` to the shape below (`services.web` + `needs:
|
|
45
|
+
{ database: true }`).
|
|
46
|
+
|
|
47
|
+
## 4. Add the datastore + wire Mongo
|
|
48
|
+
|
|
49
|
+
1. Set `cloudgrid.yaml`. **App code MUST live under `services/<name>/`** —
|
|
50
|
+
`path:` is the URL mount, NOT the filesystem path.
|
|
51
|
+
```yaml
|
|
52
|
+
name: my-revenue-dashboard
|
|
53
|
+
services:
|
|
54
|
+
web:
|
|
55
|
+
type: nextjs
|
|
56
|
+
path: /
|
|
57
|
+
needs:
|
|
58
|
+
database: true
|
|
59
|
+
```
|
|
60
|
+
**Declare the datastore with `needs: { database: true }`** — the canonical
|
|
61
|
+
shape. The deployer provisions Mongo and injects `DATABASE_MONGODB_URL` (plus
|
|
62
|
+
the legacy `MONGODB_URL` alias). `requires:` is the deprecated v1 alias; don't
|
|
63
|
+
author new yaml with it, and never set `needs:` and `requires:` together (the
|
|
64
|
+
validator rejects it).
|
|
65
|
+
2. Fetch the template for the Mongo wiring + CRUD shape:
|
|
66
|
+
`gridctl_fetch("template", "revenue-dashboard")`. It is a minimal, real
|
|
67
|
+
Next.js + `mongodb`-driver dashboard under `services/web/`: a lazy client in
|
|
68
|
+
`services/web/lib/db.js`, an App-Router GET/POST/DELETE route on a `sales`
|
|
69
|
+
collection, a server-component page that computes the total + per-product
|
|
70
|
+
breakdown + recent table, and a client add-sale form.
|
|
71
|
+
3. Adapt it (rename the collection, change fields, adjust the UI). **Read the DB
|
|
72
|
+
from `process.env.DATABASE_MONGODB_URL`** (legacy `process.env.MONGODB_URL`
|
|
73
|
+
fallback) — the grid injects it at dev-time and runtime.
|
|
74
|
+
- **Put the DB connection behind a lazy getter — never read the connection
|
|
75
|
+
string at module top level, or `next build` fails.**
|
|
76
|
+
- Sales documents are `{ product: string, amount: number, at: Date }`; keep
|
|
77
|
+
`amount` numeric so the total and breakdown sums are correct.
|
|
78
|
+
|
|
79
|
+
## 5. (Optional) Run locally
|
|
80
|
+
|
|
81
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo
|
|
82
|
+
before deploying. Don't require it.
|
|
83
|
+
|
|
84
|
+
## 6. Config
|
|
85
|
+
|
|
86
|
+
- API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
|
|
87
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
|
|
88
|
+
legacy `MONGODB_URL`) — the grid injects them.
|
|
89
|
+
|
|
90
|
+
## 7. Deploy (async)
|
|
91
|
+
|
|
92
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
93
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
94
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
95
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
96
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
97
|
+
|
|
98
|
+
## 8. Return the live URL + iterate
|
|
99
|
+
|
|
100
|
+
Give the user the live app URL — that is the deliverable. To iterate, re-plug the
|
|
101
|
+
SAME entity so it updates the same URL. Keep it honest: async build, local-edition
|
|
102
|
+
only, credentials injected by the grid.
|