@cloudgrid-io/mcp 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/corpus/capability-map.md +82 -2
- package/src/corpus/examples/crm/index.md +273 -0
- package/src/corpus/examples/kanban/index.md +256 -0
- package/src/corpus/templates/_cloudgrid.yaml.reference +228 -0
- package/src/corpus/templates/admin-dashboard/README.md +75 -0
- package/src/corpus/templates/admin-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/admin-dashboard/index.md +81 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/api/orders/route.js +64 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/api/users/route.js +63 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/layout.js +39 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/page.js +73 -0
- package/src/corpus/templates/admin-dashboard/services/web/app/resource-table.js +94 -0
- package/src/corpus/templates/admin-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/admin-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/ai-app/cloudgrid.yaml +225 -11
- package/src/corpus/templates/ai-app/index.md +3 -11
- package/src/corpus/templates/ai-knowledge-base/AGENTS.md +254 -0
- package/src/corpus/templates/ai-knowledge-base/README.md +28 -0
- package/src/corpus/templates/ai-knowledge-base/cloudgrid.yaml +238 -0
- package/src/corpus/templates/ai-knowledge-base/index.md +81 -0
- package/src/corpus/templates/analytics-dashboard/README.md +85 -0
- package/src/corpus/templates/analytics-dashboard/cloudgrid.yaml +232 -0
- package/src/corpus/templates/analytics-dashboard/index.md +316 -0
- package/src/corpus/templates/analytics-dashboard/services/web/app/api/events/route.js +60 -0
- package/src/corpus/templates/analytics-dashboard/services/web/app/event-form.js +100 -0
- package/src/corpus/templates/analytics-dashboard/services/web/app/layout.js +41 -0
- package/src/corpus/templates/analytics-dashboard/services/web/app/page.js +54 -0
- package/src/corpus/templates/analytics-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/analytics-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/api-dashboard/README.md +84 -0
- package/src/corpus/templates/api-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/api-dashboard/index.md +310 -0
- package/src/corpus/templates/api-dashboard/services/web/app/api/requests/route.js +62 -0
- package/src/corpus/templates/api-dashboard/services/web/app/dashboard.js +156 -0
- package/src/corpus/templates/api-dashboard/services/web/app/layout.js +42 -0
- package/src/corpus/templates/api-dashboard/services/web/app/page.js +39 -0
- package/src/corpus/templates/api-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/api-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/api-docs/README.md +28 -0
- package/src/corpus/templates/api-docs/cloudgrid.yaml +228 -0
- package/src/corpus/templates/api-docs/index.html +136 -0
- package/src/corpus/templates/api-docs/index.md +28 -0
- package/src/corpus/templates/api-service/cloudgrid.yaml +224 -9
- package/src/corpus/templates/api-service/index.md +3 -11
- package/src/corpus/templates/app-with-data/cloudgrid.yaml +226 -8
- package/src/corpus/templates/app-with-data/index.md +3 -8
- package/src/corpus/templates/appointment-booking/AGENTS.md +223 -0
- package/src/corpus/templates/appointment-booking/README.md +16 -0
- package/src/corpus/templates/appointment-booking/cloudgrid.yaml +250 -0
- package/src/corpus/templates/appointment-booking/index.md +72 -0
- package/src/corpus/templates/approval-workflow/AGENTS.md +170 -0
- package/src/corpus/templates/approval-workflow/README.md +12 -0
- package/src/corpus/templates/approval-workflow/cloudgrid.yaml +237 -0
- package/src/corpus/templates/approval-workflow/index.md +58 -0
- package/src/corpus/templates/billing-dashboard/AGENTS.md +199 -0
- package/src/corpus/templates/billing-dashboard/README.md +18 -0
- package/src/corpus/templates/billing-dashboard/cloudgrid.yaml +235 -0
- package/src/corpus/templates/billing-dashboard/index.md +87 -0
- package/src/corpus/templates/blog-cms/README.md +94 -0
- package/src/corpus/templates/blog-cms/cloudgrid.yaml +233 -0
- package/src/corpus/templates/blog-cms/index.md +358 -0
- package/src/corpus/templates/blog-cms/services/web/app/admin/admin-editor.js +133 -0
- package/src/corpus/templates/blog-cms/services/web/app/admin/page.js +33 -0
- package/src/corpus/templates/blog-cms/services/web/app/api/posts/route.js +84 -0
- package/src/corpus/templates/blog-cms/services/web/app/layout.js +47 -0
- package/src/corpus/templates/blog-cms/services/web/app/page.js +56 -0
- package/src/corpus/templates/blog-cms/services/web/app/posts/[slug]/page.js +45 -0
- package/src/corpus/templates/blog-cms/services/web/lib/db.js +32 -0
- package/src/corpus/templates/blog-cms/services/web/package.json +16 -0
- package/src/corpus/templates/booking-system/AGENTS.md +189 -0
- package/src/corpus/templates/booking-system/README.md +17 -0
- package/src/corpus/templates/booking-system/cloudgrid.yaml +248 -0
- package/src/corpus/templates/booking-system/index.md +86 -0
- package/src/corpus/templates/calendar-scheduler/AGENTS.md +226 -0
- package/src/corpus/templates/calendar-scheduler/README.md +25 -0
- package/src/corpus/templates/calendar-scheduler/cloudgrid.yaml +259 -0
- package/src/corpus/templates/calendar-scheduler/index.md +85 -0
- package/src/corpus/templates/changelog/README.md +27 -0
- package/src/corpus/templates/changelog/cloudgrid.yaml +228 -0
- package/src/corpus/templates/changelog/index.html +80 -0
- package/src/corpus/templates/changelog/index.md +28 -0
- package/src/corpus/templates/company-website/README.md +54 -0
- package/src/corpus/templates/company-website/cloudgrid.yaml +233 -0
- package/src/corpus/templates/company-website/index.html +309 -0
- package/src/corpus/templates/company-website/index.md +29 -0
- package/src/corpus/templates/course-platform/AGENTS.md +161 -0
- package/src/corpus/templates/course-platform/README.md +26 -0
- package/src/corpus/templates/course-platform/cloudgrid.yaml +237 -0
- package/src/corpus/templates/course-platform/index.md +70 -0
- package/src/corpus/templates/crm/README.md +72 -0
- package/src/corpus/templates/crm/cloudgrid.yaml +233 -0
- package/src/corpus/templates/crm/index.md +71 -0
- package/src/corpus/templates/crm/services/web/app/api/contacts/route.js +80 -0
- package/src/corpus/templates/crm/services/web/app/contact-manager.js +102 -0
- package/src/corpus/templates/crm/services/web/app/layout.js +35 -0
- package/src/corpus/templates/crm/services/web/app/page.js +34 -0
- package/src/corpus/templates/crm/services/web/lib/db.js +32 -0
- package/src/corpus/templates/crm/services/web/package.json +16 -0
- package/src/corpus/templates/dashboard/cloudgrid.yaml +228 -4
- package/src/corpus/templates/dashboard/index.md +3 -5
- package/src/corpus/templates/deck/cloudgrid.yaml +228 -4
- package/src/corpus/templates/deck/index.md +3 -5
- package/src/corpus/templates/directory/README.md +75 -0
- package/src/corpus/templates/directory/cloudgrid.yaml +233 -0
- package/src/corpus/templates/directory/index.md +334 -0
- package/src/corpus/templates/directory/services/web/app/api/entries/route.js +63 -0
- package/src/corpus/templates/directory/services/web/app/directory-list.js +146 -0
- package/src/corpus/templates/directory/services/web/app/layout.js +44 -0
- package/src/corpus/templates/directory/services/web/app/page.js +38 -0
- package/src/corpus/templates/directory/services/web/lib/db.js +32 -0
- package/src/corpus/templates/directory/services/web/package.json +16 -0
- package/src/corpus/templates/docs-site/README.md +28 -0
- package/src/corpus/templates/docs-site/cloudgrid.yaml +228 -0
- package/src/corpus/templates/docs-site/index.html +122 -0
- package/src/corpus/templates/docs-site/index.md +28 -0
- package/src/corpus/templates/erp/AGENTS.md +116 -0
- package/src/corpus/templates/erp/README.md +17 -0
- package/src/corpus/templates/erp/cloudgrid.yaml +235 -0
- package/src/corpus/templates/erp/index.md +81 -0
- package/src/corpus/templates/event-board/README.md +74 -0
- package/src/corpus/templates/event-board/cloudgrid.yaml +233 -0
- package/src/corpus/templates/event-board/index.md +299 -0
- package/src/corpus/templates/event-board/services/web/app/api/events/route.js +61 -0
- package/src/corpus/templates/event-board/services/web/app/event-form.js +118 -0
- package/src/corpus/templates/event-board/services/web/app/layout.js +39 -0
- package/src/corpus/templates/event-board/services/web/app/page.js +34 -0
- package/src/corpus/templates/event-board/services/web/lib/db.js +32 -0
- package/src/corpus/templates/event-board/services/web/package.json +16 -0
- package/src/corpus/templates/expense-tracker/README.md +76 -0
- package/src/corpus/templates/expense-tracker/cloudgrid.yaml +233 -0
- package/src/corpus/templates/expense-tracker/index.md +305 -0
- package/src/corpus/templates/expense-tracker/services/web/app/api/expenses/route.js +61 -0
- package/src/corpus/templates/expense-tracker/services/web/app/expense-form.js +145 -0
- package/src/corpus/templates/expense-tracker/services/web/app/layout.js +42 -0
- package/src/corpus/templates/expense-tracker/services/web/app/page.js +34 -0
- package/src/corpus/templates/expense-tracker/services/web/lib/db.js +32 -0
- package/src/corpus/templates/expense-tracker/services/web/package.json +16 -0
- package/src/corpus/templates/feature-request-board/README.md +87 -0
- package/src/corpus/templates/feature-request-board/cloudgrid.yaml +233 -0
- package/src/corpus/templates/feature-request-board/index.md +317 -0
- package/src/corpus/templates/feature-request-board/services/web/app/api/requests/route.js +92 -0
- package/src/corpus/templates/feature-request-board/services/web/app/board.js +91 -0
- package/src/corpus/templates/feature-request-board/services/web/app/layout.js +43 -0
- package/src/corpus/templates/feature-request-board/services/web/app/page.js +35 -0
- package/src/corpus/templates/feature-request-board/services/web/lib/db.js +32 -0
- package/src/corpus/templates/feature-request-board/services/web/package.json +16 -0
- package/src/corpus/templates/financial-dashboard/README.md +80 -0
- package/src/corpus/templates/financial-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/financial-dashboard/index.md +326 -0
- package/src/corpus/templates/financial-dashboard/services/web/app/api/entries/route.js +63 -0
- package/src/corpus/templates/financial-dashboard/services/web/app/entry-board.js +130 -0
- package/src/corpus/templates/financial-dashboard/services/web/app/layout.js +46 -0
- package/src/corpus/templates/financial-dashboard/services/web/app/page.js +31 -0
- package/src/corpus/templates/financial-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/financial-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/forum/AGENTS.md +196 -0
- package/src/corpus/templates/forum/README.md +12 -0
- package/src/corpus/templates/forum/cloudgrid.yaml +237 -0
- package/src/corpus/templates/forum/index.md +66 -0
- package/src/corpus/templates/hr-portal/AGENTS.md +174 -0
- package/src/corpus/templates/hr-portal/README.md +14 -0
- package/src/corpus/templates/hr-portal/cloudgrid.yaml +237 -0
- package/src/corpus/templates/hr-portal/index.md +56 -0
- package/src/corpus/templates/internal-tools-portal/AGENTS.md +201 -0
- package/src/corpus/templates/internal-tools-portal/README.md +17 -0
- package/src/corpus/templates/internal-tools-portal/cloudgrid.yaml +237 -0
- package/src/corpus/templates/internal-tools-portal/index.md +62 -0
- package/src/corpus/templates/inventory/README.md +71 -0
- package/src/corpus/templates/inventory/cloudgrid.yaml +233 -0
- package/src/corpus/templates/inventory/index.md +68 -0
- package/src/corpus/templates/inventory/services/web/app/api/items/route.js +88 -0
- package/src/corpus/templates/inventory/services/web/app/inventory-manager.js +101 -0
- package/src/corpus/templates/inventory/services/web/app/layout.js +36 -0
- package/src/corpus/templates/inventory/services/web/app/page.js +37 -0
- package/src/corpus/templates/inventory/services/web/lib/db.js +32 -0
- package/src/corpus/templates/inventory/services/web/package.json +16 -0
- package/src/corpus/templates/invoice/README.md +71 -0
- package/src/corpus/templates/invoice/cloudgrid.yaml +233 -0
- package/src/corpus/templates/invoice/index.md +68 -0
- package/src/corpus/templates/invoice/services/web/app/api/invoices/route.js +82 -0
- package/src/corpus/templates/invoice/services/web/app/invoice-manager.js +101 -0
- package/src/corpus/templates/invoice/services/web/app/layout.js +35 -0
- package/src/corpus/templates/invoice/services/web/app/page.js +34 -0
- package/src/corpus/templates/invoice/services/web/lib/db.js +32 -0
- package/src/corpus/templates/invoice/services/web/package.json +16 -0
- package/src/corpus/templates/job-board/README.md +71 -0
- package/src/corpus/templates/job-board/cloudgrid.yaml +233 -0
- package/src/corpus/templates/job-board/index.md +68 -0
- package/src/corpus/templates/job-board/services/web/app/api/jobs/route.js +66 -0
- package/src/corpus/templates/job-board/services/web/app/job-board.js +73 -0
- package/src/corpus/templates/job-board/services/web/app/layout.js +35 -0
- package/src/corpus/templates/job-board/services/web/app/page.js +32 -0
- package/src/corpus/templates/job-board/services/web/lib/db.js +32 -0
- package/src/corpus/templates/job-board/services/web/package.json +16 -0
- package/src/corpus/templates/kanban/README.md +72 -0
- package/src/corpus/templates/kanban/cloudgrid.yaml +233 -0
- package/src/corpus/templates/kanban/index.md +71 -0
- package/src/corpus/templates/kanban/services/web/app/api/cards/route.js +70 -0
- package/src/corpus/templates/kanban/services/web/app/board.js +93 -0
- package/src/corpus/templates/kanban/services/web/app/layout.js +37 -0
- package/src/corpus/templates/kanban/services/web/app/page.js +32 -0
- package/src/corpus/templates/kanban/services/web/lib/db.js +32 -0
- package/src/corpus/templates/kanban/services/web/package.json +16 -0
- package/src/corpus/templates/landing-page/cloudgrid.yaml +228 -4
- package/src/corpus/templates/landing-page/index.md +3 -5
- package/src/corpus/templates/lms/AGENTS.md +193 -0
- package/src/corpus/templates/lms/README.md +27 -0
- package/src/corpus/templates/lms/cloudgrid.yaml +237 -0
- package/src/corpus/templates/lms/index.md +79 -0
- package/src/corpus/templates/marketplace/AGENTS.md +208 -0
- package/src/corpus/templates/marketplace/README.md +22 -0
- package/src/corpus/templates/marketplace/cloudgrid.yaml +233 -0
- package/src/corpus/templates/marketplace/index.md +76 -0
- package/src/corpus/templates/membership-site/AGENTS.md +160 -0
- package/src/corpus/templates/membership-site/README.md +18 -0
- package/src/corpus/templates/membership-site/cloudgrid.yaml +236 -0
- package/src/corpus/templates/membership-site/index.md +66 -0
- package/src/corpus/templates/monitoring-dashboard/README.md +84 -0
- package/src/corpus/templates/monitoring-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/monitoring-dashboard/index.md +328 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/app/api/checks/route.js +76 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/app/check-form.js +124 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/app/layout.js +44 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/app/page.js +49 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/monitoring-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/online-store/AGENTS.md +153 -0
- package/src/corpus/templates/online-store/README.md +16 -0
- package/src/corpus/templates/online-store/cloudgrid.yaml +234 -0
- package/src/corpus/templates/online-store/index.md +81 -0
- package/src/corpus/templates/portfolio/README.md +29 -0
- package/src/corpus/templates/portfolio/cloudgrid.yaml +228 -0
- package/src/corpus/templates/portfolio/index.html +126 -0
- package/src/corpus/templates/portfolio/index.md +28 -0
- package/src/corpus/templates/product-catalog/README.md +74 -0
- package/src/corpus/templates/product-catalog/cloudgrid.yaml +232 -0
- package/src/corpus/templates/product-catalog/index.md +330 -0
- package/src/corpus/templates/product-catalog/services/web/app/api/products/route.js +69 -0
- package/src/corpus/templates/product-catalog/services/web/app/catalog.js +153 -0
- package/src/corpus/templates/product-catalog/services/web/app/layout.js +49 -0
- package/src/corpus/templates/product-catalog/services/web/app/page.js +36 -0
- package/src/corpus/templates/product-catalog/services/web/lib/db.js +32 -0
- package/src/corpus/templates/product-catalog/services/web/package.json +16 -0
- package/src/corpus/templates/product-launch/README.md +46 -0
- package/src/corpus/templates/product-launch/cloudgrid.yaml +234 -0
- package/src/corpus/templates/product-launch/index.html +320 -0
- package/src/corpus/templates/product-launch/index.md +34 -0
- package/src/corpus/templates/project-management/README.md +83 -0
- package/src/corpus/templates/project-management/cloudgrid.yaml +233 -0
- package/src/corpus/templates/project-management/index.md +346 -0
- package/src/corpus/templates/project-management/services/web/app/api/projects/route.js +48 -0
- package/src/corpus/templates/project-management/services/web/app/api/tasks/route.js +85 -0
- package/src/corpus/templates/project-management/services/web/app/board.js +182 -0
- package/src/corpus/templates/project-management/services/web/app/layout.js +45 -0
- package/src/corpus/templates/project-management/services/web/app/page.js +49 -0
- package/src/corpus/templates/project-management/services/web/lib/db.js +32 -0
- package/src/corpus/templates/project-management/services/web/package.json +16 -0
- package/src/corpus/templates/property-listings/README.md +76 -0
- package/src/corpus/templates/property-listings/cloudgrid.yaml +233 -0
- package/src/corpus/templates/property-listings/index.md +335 -0
- package/src/corpus/templates/property-listings/services/web/app/api/properties/route.js +73 -0
- package/src/corpus/templates/property-listings/services/web/app/layout.js +45 -0
- package/src/corpus/templates/property-listings/services/web/app/listings.js +152 -0
- package/src/corpus/templates/property-listings/services/web/app/page.js +53 -0
- package/src/corpus/templates/property-listings/services/web/lib/db.js +32 -0
- package/src/corpus/templates/property-listings/services/web/package.json +16 -0
- package/src/corpus/templates/quiz-platform/README.md +84 -0
- package/src/corpus/templates/quiz-platform/cloudgrid.yaml +233 -0
- package/src/corpus/templates/quiz-platform/index.md +313 -0
- package/src/corpus/templates/quiz-platform/services/web/app/api/questions/route.js +69 -0
- package/src/corpus/templates/quiz-platform/services/web/app/layout.js +47 -0
- package/src/corpus/templates/quiz-platform/services/web/app/page.js +37 -0
- package/src/corpus/templates/quiz-platform/services/web/app/quiz.js +188 -0
- package/src/corpus/templates/quiz-platform/services/web/lib/db.js +32 -0
- package/src/corpus/templates/quiz-platform/services/web/package.json +16 -0
- package/src/corpus/templates/report/cloudgrid.yaml +228 -4
- package/src/corpus/templates/report/index.md +3 -5
- package/src/corpus/templates/restaurant-reservations/AGENTS.md +258 -0
- package/src/corpus/templates/restaurant-reservations/README.md +17 -0
- package/src/corpus/templates/restaurant-reservations/cloudgrid.yaml +258 -0
- package/src/corpus/templates/restaurant-reservations/index.md +62 -0
- package/src/corpus/templates/revenue-dashboard/README.md +75 -0
- package/src/corpus/templates/revenue-dashboard/cloudgrid.yaml +233 -0
- package/src/corpus/templates/revenue-dashboard/index.md +307 -0
- package/src/corpus/templates/revenue-dashboard/services/web/app/api/sales/route.js +60 -0
- package/src/corpus/templates/revenue-dashboard/services/web/app/layout.js +40 -0
- package/src/corpus/templates/revenue-dashboard/services/web/app/page.js +87 -0
- package/src/corpus/templates/revenue-dashboard/services/web/app/sale-form.js +63 -0
- package/src/corpus/templates/revenue-dashboard/services/web/lib/db.js +32 -0
- package/src/corpus/templates/revenue-dashboard/services/web/package.json +16 -0
- package/src/corpus/templates/saas-marketing/README.md +30 -0
- package/src/corpus/templates/saas-marketing/cloudgrid.yaml +228 -0
- package/src/corpus/templates/saas-marketing/index.html +212 -0
- package/src/corpus/templates/saas-marketing/index.md +28 -0
- package/src/corpus/templates/status-page/README.md +28 -0
- package/src/corpus/templates/status-page/cloudgrid.yaml +228 -0
- package/src/corpus/templates/status-page/index.html +117 -0
- package/src/corpus/templates/status-page/index.md +28 -0
- package/src/corpus/templates/subscription-management/AGENTS.md +191 -0
- package/src/corpus/templates/subscription-management/README.md +21 -0
- package/src/corpus/templates/subscription-management/cloudgrid.yaml +236 -0
- package/src/corpus/templates/subscription-management/index.md +73 -0
- package/src/corpus/templates/task-manager/README.md +72 -0
- package/src/corpus/templates/task-manager/cloudgrid.yaml +233 -0
- package/src/corpus/templates/task-manager/index.md +71 -0
- package/src/corpus/templates/task-manager/services/web/app/api/tasks/route.js +77 -0
- package/src/corpus/templates/task-manager/services/web/app/layout.js +39 -0
- package/src/corpus/templates/task-manager/services/web/app/page.js +33 -0
- package/src/corpus/templates/task-manager/services/web/app/task-list.js +110 -0
- package/src/corpus/templates/task-manager/services/web/lib/db.js +32 -0
- package/src/corpus/templates/task-manager/services/web/package.json +16 -0
- package/src/corpus/templates/ticket-system/README.md +71 -0
- package/src/corpus/templates/ticket-system/cloudgrid.yaml +233 -0
- package/src/corpus/templates/ticket-system/index.md +68 -0
- package/src/corpus/templates/ticket-system/services/web/app/api/tickets/route.js +81 -0
- package/src/corpus/templates/ticket-system/services/web/app/layout.js +36 -0
- package/src/corpus/templates/ticket-system/services/web/app/page.js +35 -0
- package/src/corpus/templates/ticket-system/services/web/app/ticket-queue.js +112 -0
- package/src/corpus/templates/ticket-system/services/web/lib/db.js +32 -0
- package/src/corpus/templates/ticket-system/services/web/package.json +16 -0
- package/src/corpus/templates/time-tracking/README.md +81 -0
- package/src/corpus/templates/time-tracking/cloudgrid.yaml +233 -0
- package/src/corpus/templates/time-tracking/index.md +298 -0
- package/src/corpus/templates/time-tracking/services/web/app/api/entries/route.js +66 -0
- package/src/corpus/templates/time-tracking/services/web/app/entry-form.js +106 -0
- package/src/corpus/templates/time-tracking/services/web/app/layout.js +39 -0
- package/src/corpus/templates/time-tracking/services/web/app/page.js +30 -0
- package/src/corpus/templates/time-tracking/services/web/lib/db.js +32 -0
- package/src/corpus/templates/time-tracking/services/web/package.json +16 -0
- package/src/corpus/templates/travel-booking/AGENTS.md +207 -0
- package/src/corpus/templates/travel-booking/README.md +17 -0
- package/src/corpus/templates/travel-booking/cloudgrid.yaml +249 -0
- package/src/corpus/templates/travel-booking/index.md +88 -0
- package/src/corpus/templates/waitlist/README.md +38 -0
- package/src/corpus/templates/waitlist/cloudgrid.yaml +228 -0
- package/src/corpus/templates/waitlist/index.html +69 -0
- package/src/corpus/templates/waitlist/index.md +39 -0
- package/src/corpus/templates/web-app/cloudgrid.yaml +228 -4
- package/src/corpus/templates/web-app/index.md +3 -5
- package/src/corpus/workflows/admin-dashboard.md +102 -0
- package/src/corpus/workflows/ai-knowledge-base.md +137 -0
- package/src/corpus/workflows/analytics-dashboard.md +104 -0
- package/src/corpus/workflows/api-dashboard.md +102 -0
- package/src/corpus/workflows/api-docs.md +36 -0
- package/src/corpus/workflows/appointment-booking.md +143 -0
- package/src/corpus/workflows/approval-workflow.md +124 -0
- package/src/corpus/workflows/billing-dashboard.md +120 -0
- package/src/corpus/workflows/blog-cms.md +104 -0
- package/src/corpus/workflows/booking-system.md +116 -0
- package/src/corpus/workflows/calendar-scheduler.md +134 -0
- package/src/corpus/workflows/changelog.md +33 -0
- package/src/corpus/workflows/company-website.md +46 -0
- package/src/corpus/workflows/course-platform.md +126 -0
- package/src/corpus/workflows/crm.md +101 -0
- package/src/corpus/workflows/directory.md +101 -0
- package/src/corpus/workflows/docs-site.md +35 -0
- package/src/corpus/workflows/erp.md +125 -0
- package/src/corpus/workflows/event-board.md +102 -0
- package/src/corpus/workflows/expense-tracker.md +102 -0
- package/src/corpus/workflows/feature-request-board.md +105 -0
- package/src/corpus/workflows/financial-dashboard.md +103 -0
- package/src/corpus/workflows/forum.md +128 -0
- package/src/corpus/workflows/hr-portal.md +115 -0
- package/src/corpus/workflows/internal-tools-portal.md +125 -0
- package/src/corpus/workflows/inventory.md +101 -0
- package/src/corpus/workflows/invoice.md +101 -0
- package/src/corpus/workflows/job-board.md +101 -0
- package/src/corpus/workflows/kanban.md +102 -0
- package/src/corpus/workflows/lms.md +113 -0
- package/src/corpus/workflows/marketplace.md +123 -0
- package/src/corpus/workflows/membership-site.md +128 -0
- package/src/corpus/workflows/monitoring-dashboard.md +104 -0
- package/src/corpus/workflows/online-store.md +114 -0
- package/src/corpus/workflows/portfolio.md +35 -0
- package/src/corpus/workflows/product-catalog.md +105 -0
- package/src/corpus/workflows/product-launch.md +43 -0
- package/src/corpus/workflows/project-management.md +106 -0
- package/src/corpus/workflows/property-listings.md +101 -0
- package/src/corpus/workflows/quiz-platform.md +105 -0
- package/src/corpus/workflows/restaurant-reservations.md +123 -0
- package/src/corpus/workflows/revenue-dashboard.md +102 -0
- package/src/corpus/workflows/saas-marketing.md +37 -0
- package/src/corpus/workflows/status-page.md +35 -0
- package/src/corpus/workflows/subscription-management.md +141 -0
- package/src/corpus/workflows/task-manager.md +101 -0
- package/src/corpus/workflows/ticket-system.md +101 -0
- package/src/corpus/workflows/time-tracking.md +104 -0
- package/src/corpus/workflows/travel-booking.md +115 -0
- package/src/corpus/workflows/waitlist.md +42 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: docs-site
|
|
3
|
+
when: documentation site, docs, developer docs, guide, manual, knowledge base, help center (static, content baked in). For an interactive API endpoint reference, use api-docs instead.
|
|
4
|
+
needs: none
|
|
5
|
+
deploy: inspiration
|
|
6
|
+
editions: all
|
|
7
|
+
capabilities_note: static — no infrastructure, content baked into the page. Publishes as an inspiration (instant, works on hosted) via gridctl_drop.
|
|
8
|
+
summary: Fetch the docs-site template, fill it with the user's documentation, deploy it, and return the live share URL.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Workflow: docs-site
|
|
12
|
+
|
|
13
|
+
Detect the intent ("build me a docs site / documentation for X") and follow this
|
|
14
|
+
recipe. For a REST API endpoint reference specifically, use `api-docs`. Do not
|
|
15
|
+
ask setup questions first; use sensible defaults and build.
|
|
16
|
+
|
|
17
|
+
1. **Fetch the template.** Call `gridctl_fetch("template", "docs-site")` to load
|
|
18
|
+
the self-contained HTML docs layout (sidebar nav, content column, code blocks,
|
|
19
|
+
client-side search box).
|
|
20
|
+
2. **Fill the template.** Replace the placeholders with the user's content:
|
|
21
|
+
- The project/doc name and the sidebar section links.
|
|
22
|
+
- One content section per topic (heading + prose + optional code block). Keep
|
|
23
|
+
each section id matching its sidebar anchor.
|
|
24
|
+
- The code blocks are plain `<pre><code>` — no external highlighter or CDN.
|
|
25
|
+
- Leave the inline search script as-is; it filters the sidebar client-side.
|
|
26
|
+
- Keep it a single self-contained HTML file. Do not add external scripts,
|
|
27
|
+
stylesheets, fonts, or large embedded media.
|
|
28
|
+
3. **Deploy.** Deploy the filled HTML:
|
|
29
|
+
- Hosted MCP edition: call the drop tool with the HTML.
|
|
30
|
+
- Local MCP / CLI edition: write the HTML to a file and run `gridctl plug`.
|
|
31
|
+
It is an inspiration and deploys synchronously, so you get a URL right away.
|
|
32
|
+
4. **Return the live share URL.** For revisions, re-deploy with the entity id
|
|
33
|
+
from the first deploy — it updates the same share URL.
|
|
34
|
+
|
|
35
|
+
Keep the whole flow tight: fetch, fill, deploy, share.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: erp
|
|
3
|
+
when: ERP, enterprise resource planning, integrated business system — a large, persistent multi-module app (inventory + orders + finance + HR) with auth/RBAC, backed by a database → runtime → local edition.
|
|
4
|
+
needs: database
|
|
5
|
+
deploy: runtime
|
|
6
|
+
editions: local
|
|
7
|
+
kind: blueprint
|
|
8
|
+
capabilities_note: persistent + large/multi-module — needs a database (Mongo) plus a provider SDK auth (Clerk/Auth0) and Stripe billing, with keys from the vault. Runtime app, async build, local edition only. Declare `needs: { database: true }` (deployer injects DATABASE_MONGODB_URL / legacy MONGODB_URL) and a `vault:` block for auth + Stripe keys. This is a BLUEPRINT — no app code ships; read AGENTS.md for the structure, then build.
|
|
9
|
+
summary: Build a persistent Next.js + Mongo ERP on the grid — inventory + orders + finance + HR modules in one App-Router service, with auth/RBAC (Clerk/Auth0, keys from vault:) and Stripe billing (STRIPE_KEY from vault:). Collections: items, orders, invoices, payments, employees. This is a BLUEPRINT: fetch it, read AGENTS.md for the file tree + CloudGrid wiring (DATABASE_MONGODB_URL, vault keys, deploy), then build the app under services/web/. Edition-gate first, scaffold, declare needs:{database:true} + vault: auth/Stripe keys (never requires:), deploy async, poll to a live URL.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Workflow: erp
|
|
13
|
+
|
|
14
|
+
The user wants an ERP / integrated business system — inventory, orders, finance,
|
|
15
|
+
and HR in one place, with authentication and role-based access (RBAC). Every
|
|
16
|
+
module's records must **remember** across refresh and be shared across users, so
|
|
17
|
+
this is a **large, persistent runtime app** backed by the grid's shared Mongo,
|
|
18
|
+
with a provider SDK for auth and Stripe for the finance module — not a static
|
|
19
|
+
page.
|
|
20
|
+
|
|
21
|
+
This is a **blueprint**, and it is large and multi-module. No app code ships.
|
|
22
|
+
Fetch the template, **read its `AGENTS.md` for the structure** (file tree, the
|
|
23
|
+
per-module Mongo collections — `items` / `orders` / `invoices` / `payments` /
|
|
24
|
+
`employees` — CloudGrid wiring for DB + vault-backed auth and Stripe keys, and
|
|
25
|
+
the deploy flow), then build the app following it.
|
|
26
|
+
|
|
27
|
+
Follow this recipe. Be honest that this is a big build, that a runtime deploy is
|
|
28
|
+
async (not instant like a static drop), and that it needs the local edition.
|
|
29
|
+
|
|
30
|
+
## 1. Edition check FIRST (hard gate)
|
|
31
|
+
|
|
32
|
+
A persistent, auth-gated multi-module app is a built + deployed container. It
|
|
33
|
+
requires the **local edition** (Claude Desktop / Claude Code) or the CLI.
|
|
34
|
+
|
|
35
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
36
|
+
hosted is inline-only and can only publish static pages. Tell the user plainly,
|
|
37
|
+
offer a **static mock** of one screen instead, and STOP the runtime path here.
|
|
38
|
+
- **Local edition:** continue.
|
|
39
|
+
|
|
40
|
+
## 2. Auth + grid
|
|
41
|
+
|
|
42
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
43
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
44
|
+
grid, ask which to use; do not assume a target.
|
|
45
|
+
|
|
46
|
+
## 3. Fetch the blueprint + read AGENTS.md
|
|
47
|
+
|
|
48
|
+
`gridctl_fetch("template", "erp")`. It returns `cloudgrid.yaml`, `AGENTS.md` (the
|
|
49
|
+
structure guide), and the README — **no app code**. Read `AGENTS.md` end to end
|
|
50
|
+
before writing anything: it defines the `services/web/` file tree, the Mongo
|
|
51
|
+
collections + fields per module, how CloudGrid injects the DB and the
|
|
52
|
+
vault-backed auth + Stripe keys, how to wire auth/RBAC and the Stripe
|
|
53
|
+
checkout/webhook flow, and the deploy steps. Because this is large, agree with
|
|
54
|
+
the user on which modules to build first (e.g. inventory + orders) rather than
|
|
55
|
+
all four at once.
|
|
56
|
+
|
|
57
|
+
## 4. Scaffold
|
|
58
|
+
|
|
59
|
+
`gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
|
|
60
|
+
and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
|
|
61
|
+
directory, so run `init` FIRST. Then (a) build the app under **`services/web/`**
|
|
62
|
+
following `AGENTS.md`, and (b) fill `cloudgrid.yaml` to the shape below.
|
|
63
|
+
|
|
64
|
+
## 5. Build the app + set cloudgrid.yaml
|
|
65
|
+
|
|
66
|
+
1. Build the Next.js App-Router app under `services/web/` per `AGENTS.md` — one
|
|
67
|
+
`web` service hosting each module as its own API-route group + UI page
|
|
68
|
+
(`inventory`, `orders`, `finance`, `hr`), the collections, auth middleware,
|
|
69
|
+
`lib/db.js` (lazy Mongo), `lib/auth.js` (session + `requireRole`), and
|
|
70
|
+
`lib/stripe.js` (lazy Stripe). **App code MUST live under `services/<name>/`**
|
|
71
|
+
— `path:` is the URL mount, NOT the filesystem path.
|
|
72
|
+
2. Set `cloudgrid.yaml` to the active shape:
|
|
73
|
+
```yaml
|
|
74
|
+
name: my-erp
|
|
75
|
+
vault:
|
|
76
|
+
AUTH_PROVIDER_KEY: auth-provider-secret # Clerk/Auth0 backend key (RBAC)
|
|
77
|
+
STRIPE_KEY: stripe-live-key # Stripe secret key (finance module)
|
|
78
|
+
services:
|
|
79
|
+
web:
|
|
80
|
+
type: nextjs
|
|
81
|
+
path: /
|
|
82
|
+
needs:
|
|
83
|
+
database: true
|
|
84
|
+
```
|
|
85
|
+
**Declare the datastore with `needs: { database: true }`** — the canonical
|
|
86
|
+
shape. The deployer provisions ONE Mongo (model each module as a collection in
|
|
87
|
+
it) and injects `DATABASE_MONGODB_URL` (plus the legacy `MONGODB_URL` alias).
|
|
88
|
+
Read it **lazily inside a getter**, never at module top level (a top-level read
|
|
89
|
+
fails `next build`). `requires:` is the deprecated v1 alias; don't author new
|
|
90
|
+
yaml with it, and never set `needs:` and `requires:` together (the validator
|
|
91
|
+
rejects it).
|
|
92
|
+
3. **Auth + Stripe keys come from the `vault:` block, not committed env files.**
|
|
93
|
+
The `vault:` map injects `AUTH_PROVIDER_KEY` and `STRIPE_KEY` as env vars at
|
|
94
|
+
build + runtime. (Add `ai: true` to `needs:` only if a module — e.g. demand
|
|
95
|
+
forecasting — actually uses the AI gateway.)
|
|
96
|
+
|
|
97
|
+
## 6. Config
|
|
98
|
+
|
|
99
|
+
- Create the vault items the `vault:` block references (the auth provider's
|
|
100
|
+
backend key and the Stripe secret key) — `gridctl_secrets` / vault UI. Never
|
|
101
|
+
commit them. Publishable/front-end auth keys → `gridctl_env`.
|
|
102
|
+
- Register the deployed `/api/finance/webhook` URL as the Stripe webhook endpoint
|
|
103
|
+
once the app is live.
|
|
104
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
|
|
105
|
+
legacy `MONGODB_URL`) — the grid injects them.
|
|
106
|
+
|
|
107
|
+
## 7. (Optional) Run locally
|
|
108
|
+
|
|
109
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo +
|
|
110
|
+
vault env vars before deploying. Don't require it.
|
|
111
|
+
|
|
112
|
+
## 8. Deploy (async)
|
|
113
|
+
|
|
114
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
115
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
116
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
117
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
118
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
119
|
+
|
|
120
|
+
## 9. Return the live URL + iterate
|
|
121
|
+
|
|
122
|
+
Give the user the live app URL — that is the deliverable. To iterate (add the
|
|
123
|
+
remaining modules, refine RBAC, wire more of finance), re-plug the SAME entity so
|
|
124
|
+
it updates the same URL. Keep it honest: large build, async deploy, local-edition
|
|
125
|
+
only, DB + auth + Stripe credentials injected by the grid / vault.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: event-board
|
|
3
|
+
when: event board, events listing, community events, meetup board — a persistent app that lists upcoming events (title, date, location, description) with add/delete, sorted by date. 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 event board on the grid — an `events` collection (title, date, location, description) shown as an upcoming list sorted by date, with 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: event-board
|
|
12
|
+
|
|
13
|
+
The user wants a community event board / events listing that **remembers** its
|
|
14
|
+
events — a board whose entries 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 an `events` domain
|
|
17
|
+
(title, date, location, description) shown as an upcoming list sorted by date
|
|
18
|
+
ascending (soonest first), with add and delete.
|
|
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-event-board
|
|
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", "event-board")`. It is a minimal, real Next.js +
|
|
67
|
+
`mongodb`-driver event board under `services/web/`: a lazy client in
|
|
68
|
+
`services/web/lib/db.js`, an App-Router GET/POST/DELETE route on an `events`
|
|
69
|
+
collection, a server-component page that reads events sorted by date, and a
|
|
70
|
+
client form + upcoming list.
|
|
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
|
+
- The upcoming board sorts by `date` ascending both server-side (`.sort({ date:
|
|
77
|
+
1 })`) and client-side after each add.
|
|
78
|
+
|
|
79
|
+
## 5. (Optional) Run locally
|
|
80
|
+
|
|
81
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo
|
|
82
|
+
before deploying. Don't require it.
|
|
83
|
+
|
|
84
|
+
## 6. Config
|
|
85
|
+
|
|
86
|
+
- API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
|
|
87
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
|
|
88
|
+
legacy `MONGODB_URL`) — the grid injects them.
|
|
89
|
+
|
|
90
|
+
## 7. Deploy (async)
|
|
91
|
+
|
|
92
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
93
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
94
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
95
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
96
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
97
|
+
|
|
98
|
+
## 8. Return the live URL + iterate
|
|
99
|
+
|
|
100
|
+
Give the user the live app URL — that is the deliverable. To iterate, re-plug the
|
|
101
|
+
SAME entity so it updates the same URL. Keep it honest: async build, local-edition
|
|
102
|
+
only, credentials injected by the grid.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: expense-tracker
|
|
3
|
+
when: expense tracker, spending log, budget tracker, expense report — a persistent app that logs expenses (description, amount, category, date), lists them, and totals 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).
|
|
8
|
+
summary: Build a persistent Next.js + Mongo expense tracker on the grid — an `expenses` collection (description, amount:number, category, date) with add / delete, a table view, and totals by category. 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: expense-tracker
|
|
12
|
+
|
|
13
|
+
The user wants an expense tracker / spending log / budget tracker that
|
|
14
|
+
**remembers** its expenses — records that 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 an `expenses`
|
|
17
|
+
domain (`description`, `amount` as a number, `category`, `date`), a table view,
|
|
18
|
+
and totals by category (plus a grand total).
|
|
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-expenses
|
|
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", "expense-tracker")`. It is a minimal, real Next.js +
|
|
67
|
+
`mongodb`-driver expense tracker under `services/web/`: a lazy client in
|
|
68
|
+
`services/web/lib/db.js`, an App-Router GET/POST/DELETE route on an `expenses`
|
|
69
|
+
collection, a server-component page, and a client form with a table + totals
|
|
70
|
+
by category.
|
|
71
|
+
3. Adapt it (adjust the category list, change fields, tweak the UI). **Read the
|
|
72
|
+
DB 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
|
+
- Store `amount` as a number and keep `date` as an ISO `YYYY-MM-DD` string so
|
|
77
|
+
totals and sorting stay simple.
|
|
78
|
+
|
|
79
|
+
## 5. (Optional) Run locally
|
|
80
|
+
|
|
81
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo
|
|
82
|
+
before deploying. Don't require it.
|
|
83
|
+
|
|
84
|
+
## 6. Config
|
|
85
|
+
|
|
86
|
+
- API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
|
|
87
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
|
|
88
|
+
legacy `MONGODB_URL`) — the grid injects them.
|
|
89
|
+
|
|
90
|
+
## 7. Deploy (async)
|
|
91
|
+
|
|
92
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
93
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
94
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
95
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
96
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
97
|
+
|
|
98
|
+
## 8. Return the live URL + iterate
|
|
99
|
+
|
|
100
|
+
Give the user the live app URL — that is the deliverable. To iterate, re-plug the
|
|
101
|
+
SAME entity so it updates the same URL. Keep it honest: async build, local-edition
|
|
102
|
+
only, credentials injected by the grid.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: feature-request-board
|
|
3
|
+
when: feature request board, feedback board, roadmap voting, idea board — a persistent app where users add requests and upvote them, each with a status. 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 feature request board on the grid — a `requests` collection (title, description, votes:number, status of open/planned/done) with list / upvote (atomic increment) / add. 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: feature-request-board
|
|
12
|
+
|
|
13
|
+
The user wants a feature request / feedback board — a page where people add
|
|
14
|
+
requests, **upvote** the ones they care about, and each request carries a status
|
|
15
|
+
(open / planned / done). Votes and requests must **persist** and be shared across
|
|
16
|
+
users, so this is a **runtime app** backed by the grid's shared Mongo, not a
|
|
17
|
+
static page. It is the same proven shape as `app-with-data`, with a `requests`
|
|
18
|
+
domain (title, description, votes:number, status) and a voting board view.
|
|
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 (a voting board whose state lives
|
|
31
|
+
in memory only, lost on refresh), 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-board
|
|
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", "feature-request-board")`. It is a minimal, real
|
|
68
|
+
Next.js + `mongodb`-driver board under `services/web/`: a lazy client in
|
|
69
|
+
`services/web/lib/db.js`, an App-Router GET/POST/PATCH/DELETE route on a
|
|
70
|
+
`requests` collection (PATCH does an atomic `$inc` upvote), a server-component
|
|
71
|
+
page, and a client voting board.
|
|
72
|
+
3. Adapt it (rename the collection, change fields, adjust the UI). The domain is
|
|
73
|
+
`requests { title, description, votes:number, status(open/planned/done) }`
|
|
74
|
+
with list (votes desc) + upvote (increment) + add. **Read the DB from
|
|
75
|
+
`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 vote increment atomic on the server (`$inc`), so concurrent upvotes
|
|
80
|
+
don't clobber each other.
|
|
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 app URL — that is the deliverable. To iterate, re-plug the
|
|
104
|
+
SAME entity so it updates the same URL. Keep it honest: async build, local-edition
|
|
105
|
+
only, credentials injected by the grid.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: financial-dashboard
|
|
3
|
+
when: financial dashboard, finance metrics, P&L, cashflow board — a persistent app that tracks income/expense entries by account and shows income/expense/net totals with a table. 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 financial dashboard on the grid — an `entries` collection (account, amount:number, type income/expense, at) with income/expense/net totals + table + 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: financial-dashboard
|
|
12
|
+
|
|
13
|
+
The user wants a financial dashboard / P&L / cashflow board that **remembers**
|
|
14
|
+
its numbers — income and expense entries whose records survive refresh and are
|
|
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 an
|
|
17
|
+
`entries` domain (account, amount:number, type of income/expense, at) and a
|
|
18
|
+
dashboard view: income / expense / net totals above a table with add and per-row
|
|
19
|
+
delete.
|
|
20
|
+
|
|
21
|
+
Follow this recipe. Be honest that a runtime deploy is async (not instant like a
|
|
22
|
+
static drop) and that it needs the local edition.
|
|
23
|
+
|
|
24
|
+
## 1. Edition check FIRST (hard gate)
|
|
25
|
+
|
|
26
|
+
A persistent app is a built + deployed container. It requires the **local
|
|
27
|
+
edition** (Claude Desktop / Claude Code) or the CLI.
|
|
28
|
+
|
|
29
|
+
- **Hosted edition (Claude Web / hosted MCP):** you CANNOT build a runtime app —
|
|
30
|
+
hosted is inline-only and can only publish static pages. Tell the user
|
|
31
|
+
plainly, offer a **static version** instead, and STOP the runtime path here.
|
|
32
|
+
- **Local edition:** continue.
|
|
33
|
+
|
|
34
|
+
## 2. Auth + grid
|
|
35
|
+
|
|
36
|
+
1. Ensure signed in: `gridctl_login_status`; if not, `gridctl_login`.
|
|
37
|
+
2. A grid is required. Respect the grid picker: if the user has more than one
|
|
38
|
+
grid, ask which to use; do not assume a target.
|
|
39
|
+
|
|
40
|
+
## 3. Scaffold
|
|
41
|
+
|
|
42
|
+
`gridctl_init` an app `<name>`. `init` creates the entity + `.cloudgrid/link.json`
|
|
43
|
+
and writes a `cloudgrid.yaml` with an EMPTY `services: {}`. `plug` needs a linked
|
|
44
|
+
directory, so run `init` FIRST. Then (a) write the app under **`services/web/`**,
|
|
45
|
+
and (b) fill `cloudgrid.yaml` to the shape below (`services.web` + `needs:
|
|
46
|
+
{ database: true }`).
|
|
47
|
+
|
|
48
|
+
## 4. Add the datastore + wire Mongo
|
|
49
|
+
|
|
50
|
+
1. Set `cloudgrid.yaml`. **App code MUST live under `services/<name>/`** —
|
|
51
|
+
`path:` is the URL mount, NOT the filesystem path.
|
|
52
|
+
```yaml
|
|
53
|
+
name: my-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", "financial-dashboard")`. It is a minimal, real
|
|
68
|
+
Next.js + `mongodb`-driver dashboard under `services/web/`: a lazy client in
|
|
69
|
+
`services/web/lib/db.js`, an App-Router GET/POST/DELETE route on an `entries`
|
|
70
|
+
collection, a server-component page that computes income/expense/net totals,
|
|
71
|
+
and a client board (totals cards + table + 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
|
+
- Keep the API route `export const dynamic = "force-dynamic"` so it always
|
|
78
|
+
reads/writes live data.
|
|
79
|
+
|
|
80
|
+
## 5. (Optional) Run locally
|
|
81
|
+
|
|
82
|
+
Mention that the user can `grid dev` to run locally against the injected Mongo
|
|
83
|
+
before deploying. Don't require it.
|
|
84
|
+
|
|
85
|
+
## 6. Config
|
|
86
|
+
|
|
87
|
+
- API keys / secrets → `gridctl_secrets`. Non-secret config → `gridctl_env`.
|
|
88
|
+
- Do **NOT** set the DB connection vars yourself (`DATABASE_MONGODB_URL` or the
|
|
89
|
+
legacy `MONGODB_URL`) — the grid injects them.
|
|
90
|
+
|
|
91
|
+
## 7. Deploy (async)
|
|
92
|
+
|
|
93
|
+
Deploy the folder with `gridctl_plug`. A **runtime deploy is ASYNC**: the first
|
|
94
|
+
response is `status: "building"`, NOT a live URL yet.
|
|
95
|
+
- Poll `gridctl_status` (or the returned poll_url) until the entity is live.
|
|
96
|
+
- Surface a liveness signal while it builds — never a bare silent wait.
|
|
97
|
+
- Only once it is live, return the deployed app URL (NOT the build/log link).
|
|
98
|
+
|
|
99
|
+
## 8. Return the live URL + iterate
|
|
100
|
+
|
|
101
|
+
Give the user the live app URL — that is the deliverable. To iterate, re-plug the
|
|
102
|
+
SAME entity so it updates the same URL. Keep it honest: async build, local-edition
|
|
103
|
+
only, credentials injected by the grid.
|