@nextsparkjs/ai-workflow 0.1.0-beta.100
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/LICENSE +21 -0
- package/README.md +115 -0
- package/claude/_docs/workflows-optimizations.md +359 -0
- package/claude/agents/api-tester.md +634 -0
- package/claude/agents/architecture-supervisor.md +1351 -0
- package/claude/agents/backend-developer.md +997 -0
- package/claude/agents/backend-validator.md +417 -0
- package/claude/agents/bdd-docs-writer.md +737 -0
- package/claude/agents/block-developer.md +677 -0
- package/claude/agents/code-reviewer.md +1432 -0
- package/claude/agents/db-developer.md +721 -0
- package/claude/agents/db-validator.md +407 -0
- package/claude/agents/demo-video-generator.md +493 -0
- package/claude/agents/documentation-writer.md +1268 -0
- package/claude/agents/frontend-developer.md +1234 -0
- package/claude/agents/frontend-validator.md +777 -0
- package/claude/agents/functional-validator.md +630 -0
- package/claude/agents/mock-analyst.md +387 -0
- package/claude/agents/product-manager.md +963 -0
- package/claude/agents/qa-automation.md +1762 -0
- package/claude/agents/release-manager.md +634 -0
- package/claude/agents/selectors-translator.md +262 -0
- package/claude/agents/unit-test-writer.md +785 -0
- package/claude/agents/visual-comparator.md +329 -0
- package/claude/agents/workflow-maintainer.md +352 -0
- package/claude/commands/do/README.md +88 -0
- package/claude/commands/do/create-api.md +64 -0
- package/claude/commands/do/create-entity.md +66 -0
- package/claude/commands/do/create-migration.md +64 -0
- package/claude/commands/do/create-plugin.md +56 -0
- package/claude/commands/do/create-theme.md +70 -0
- package/claude/commands/do/mock-data.md +67 -0
- package/claude/commands/do/reset-db.md +71 -0
- package/claude/commands/do/setup-scheduled-action.md +75 -0
- package/claude/commands/do/sync-code-review.md +117 -0
- package/claude/commands/do/update-selectors.md +112 -0
- package/claude/commands/do/use-skills.md +90 -0
- package/claude/commands/do/validate-blocks.md +69 -0
- package/claude/commands/how-to/README.md +261 -0
- package/claude/commands/how-to/add-metadata.md +692 -0
- package/claude/commands/how-to/add-taxonomies.md +806 -0
- package/claude/commands/how-to/add-translations.md +571 -0
- package/claude/commands/how-to/create-api.md +577 -0
- package/claude/commands/how-to/create-block.md +575 -0
- package/claude/commands/how-to/create-child-entities.md +771 -0
- package/claude/commands/how-to/create-entity.md +597 -0
- package/claude/commands/how-to/create-migrations.md +605 -0
- package/claude/commands/how-to/create-plugin.md +654 -0
- package/claude/commands/how-to/customize-app.md +481 -0
- package/claude/commands/how-to/customize-dashboard.md +553 -0
- package/claude/commands/how-to/customize-theme.md +438 -0
- package/claude/commands/how-to/define-features-flows.md +632 -0
- package/claude/commands/how-to/deploy.md +507 -0
- package/claude/commands/how-to/handle-file-uploads.md +746 -0
- package/claude/commands/how-to/implement-search.md +1001 -0
- package/claude/commands/how-to/install-plugins.md +352 -0
- package/claude/commands/how-to/manage-test-coverage.md +984 -0
- package/claude/commands/how-to/run-tests.md +400 -0
- package/claude/commands/how-to/set-app-languages.md +601 -0
- package/claude/commands/how-to/set-plans-and-permissions.md +575 -0
- package/claude/commands/how-to/set-scheduled-actions.md +527 -0
- package/claude/commands/how-to/set-user-roles-and-permissions.md +550 -0
- package/claude/commands/how-to/setup-authentication.md +388 -0
- package/claude/commands/how-to/setup-claude-code.md +440 -0
- package/claude/commands/how-to/setup-database.md +274 -0
- package/claude/commands/how-to/setup-email-providers.md +598 -0
- package/claude/commands/how-to/setup-mobile-dev.md +627 -0
- package/claude/commands/how-to/start.md +500 -0
- package/claude/commands/how-to/use-devtools.md +639 -0
- package/claude/commands/how-to/use-superadmin.md +622 -0
- package/claude/commands/session/README.md +193 -0
- package/claude/commands/session/block-create.md +190 -0
- package/claude/commands/session/block-list.md +203 -0
- package/claude/commands/session/block-update.md +192 -0
- package/claude/commands/session/block-validate.md +218 -0
- package/claude/commands/session/changelog.md +115 -0
- package/claude/commands/session/close.md +225 -0
- package/claude/commands/session/commit.md +174 -0
- package/claude/commands/session/db-entity.md +206 -0
- package/claude/commands/session/db-fix.md +212 -0
- package/claude/commands/session/db-sample.md +206 -0
- package/claude/commands/session/demo.md +178 -0
- package/claude/commands/session/doc-bdd.md +207 -0
- package/claude/commands/session/doc-feature.md +218 -0
- package/claude/commands/session/doc-read.md +225 -0
- package/claude/commands/session/execute.md +204 -0
- package/claude/commands/session/explain.md +202 -0
- package/claude/commands/session/fix-bug.md +210 -0
- package/claude/commands/session/fix-build.md +182 -0
- package/claude/commands/session/fix-test.md +189 -0
- package/claude/commands/session/pending.md +232 -0
- package/claude/commands/session/refine.md +188 -0
- package/claude/commands/session/resume.md +192 -0
- package/claude/commands/session/review.md +192 -0
- package/claude/commands/session/scope-change.md +181 -0
- package/claude/commands/session/start-blocks.md +347 -0
- package/claude/commands/session/start.md +604 -0
- package/claude/commands/session/status.md +169 -0
- package/claude/commands/session/test-fix.md +221 -0
- package/claude/commands/session/test-run.md +203 -0
- package/claude/commands/session/test-write.md +242 -0
- package/claude/commands/session/validate.md +162 -0
- package/claude/config/context.json +40 -0
- package/claude/config/github.json +69 -0
- package/claude/config/github.schema.json +106 -0
- package/claude/config/team.json +46 -0
- package/claude/config/team.schema.json +106 -0
- package/claude/config/workspace.json +43 -0
- package/claude/config/workspace.schema.json +75 -0
- package/claude/skills/README.md +228 -0
- package/claude/skills/accessibility/SKILL.md +573 -0
- package/claude/skills/api-bypass-layers/SKILL.md +550 -0
- package/claude/skills/asana-integration/SKILL.md +499 -0
- package/claude/skills/better-auth/SKILL.md +666 -0
- package/claude/skills/billing-subscriptions/SKILL.md +660 -0
- package/claude/skills/block-decision-matrix/SKILL.md +359 -0
- package/claude/skills/clickup-integration/SKILL.md +434 -0
- package/claude/skills/core-theme-responsibilities/SKILL.md +485 -0
- package/claude/skills/create-plugin/SKILL.md +425 -0
- package/claude/skills/create-theme/SKILL.md +331 -0
- package/claude/skills/cypress-api/SKILL.md +511 -0
- package/claude/skills/cypress-api/scripts/generate-api-controller.py +329 -0
- package/claude/skills/cypress-api/scripts/generate-api-test.py +930 -0
- package/claude/skills/cypress-e2e/SKILL.md +526 -0
- package/claude/skills/cypress-e2e/scripts/extract-selectors.py +383 -0
- package/claude/skills/cypress-e2e/scripts/generate-uat-test.py +788 -0
- package/claude/skills/cypress-selectors/SKILL.md +309 -0
- package/claude/skills/cypress-selectors/scripts/extract-missing.py +243 -0
- package/claude/skills/cypress-selectors/scripts/generate-block-selectors.py +283 -0
- package/claude/skills/cypress-selectors/scripts/validate-selectors.py +145 -0
- package/claude/skills/database-migrations/SKILL.md +335 -0
- package/claude/skills/database-migrations/scripts/generate-sample-data.py +284 -0
- package/claude/skills/database-migrations/scripts/validate-migration.py +323 -0
- package/claude/skills/design-system/SKILL.md +682 -0
- package/claude/skills/documentation/SKILL.md +540 -0
- package/claude/skills/entity-api/SKILL.md +482 -0
- package/claude/skills/entity-system/SKILL.md +635 -0
- package/claude/skills/entity-system/scripts/generate-child-migration.py +298 -0
- package/claude/skills/entity-system/scripts/generate-metas-migration.py +233 -0
- package/claude/skills/entity-system/scripts/generate-migration.py +382 -0
- package/claude/skills/entity-system/scripts/generate-sample-data.py +418 -0
- package/claude/skills/entity-system/scripts/scaffold-entity.py +661 -0
- package/claude/skills/github/SKILL.md +467 -0
- package/claude/skills/i18n-nextintl/SKILL.md +302 -0
- package/claude/skills/i18n-nextintl/scripts/add-translation.py +243 -0
- package/claude/skills/i18n-nextintl/scripts/extract-hardcoded.py +246 -0
- package/claude/skills/i18n-nextintl/scripts/validate-translations.py +260 -0
- package/claude/skills/impact-analysis/SKILL.md +203 -0
- package/claude/skills/jest-unit/SKILL.md +306 -0
- package/claude/skills/jest-unit/references/component-testing.md +371 -0
- package/claude/skills/jest-unit/references/mocking-patterns.md +380 -0
- package/claude/skills/jest-unit/references/service-hook-testing.md +454 -0
- package/claude/skills/jira-integration/SKILL.md +539 -0
- package/claude/skills/media-library/SKILL.md +743 -0
- package/claude/skills/mock-analysis/SKILL.md +276 -0
- package/claude/skills/monorepo-architecture/SKILL.md +162 -0
- package/claude/skills/nextjs-api-development/SKILL.md +364 -0
- package/claude/skills/nextjs-api-development/scripts/generate-crud-tests.py +456 -0
- package/claude/skills/nextjs-api-development/scripts/scaffold-endpoint.py +481 -0
- package/claude/skills/nextjs-api-development/scripts/validate-api.py +283 -0
- package/claude/skills/notion-integration/SKILL.md +641 -0
- package/claude/skills/npm-development-workflow/SKILL.md +480 -0
- package/claude/skills/page-builder-blocks/SKILL.md +530 -0
- package/claude/skills/page-builder-blocks/scripts/scaffold-block.py +444 -0
- package/claude/skills/permissions-system/SKILL.md +619 -0
- package/claude/skills/plugins/SKILL.md +340 -0
- package/claude/skills/plugins/references/plugin-templates.md +414 -0
- package/claude/skills/plugins/references/plugin-testing.md +353 -0
- package/claude/skills/plugins/references/plugin-types.md +198 -0
- package/claude/skills/plugins/scripts/scaffold-plugin.py +443 -0
- package/claude/skills/pom-patterns/SKILL.md +452 -0
- package/claude/skills/pom-patterns/scripts/generate-pom.py +392 -0
- package/claude/skills/rate-limiting/SKILL.md +342 -0
- package/claude/skills/react-best-practices/AGENTS.md +2410 -0
- package/claude/skills/react-best-practices/README.md +123 -0
- package/claude/skills/react-best-practices/SKILL.md +125 -0
- package/claude/skills/react-best-practices/metadata.json +15 -0
- package/claude/skills/react-best-practices/rules/_sections.md +46 -0
- package/claude/skills/react-best-practices/rules/_template.md +28 -0
- package/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/claude/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/claude/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/claude/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/claude/skills/react-best-practices/rules/async-dependencies.md +36 -0
- package/claude/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/claude/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/claude/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/claude/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/claude/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/claude/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/claude/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/claude/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/claude/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/claude/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/claude/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/claude/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/claude/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/claude/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/claude/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/claude/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/claude/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/claude/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/claude/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/claude/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/claude/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/claude/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/claude/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/claude/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/claude/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/claude/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/claude/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/claude/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/claude/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/claude/skills/react-best-practices/rules/server-cache-react.md +76 -0
- package/claude/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/claude/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/claude/skills/react-patterns/SKILL.md +688 -0
- package/claude/skills/registry-system/SKILL.md +331 -0
- package/claude/skills/scheduled-actions/SKILL.md +671 -0
- package/claude/skills/scope-enforcement/SKILL.md +542 -0
- package/claude/skills/scope-enforcement/scripts/validate-scope.py +357 -0
- package/claude/skills/server-actions/SKILL.md +493 -0
- package/claude/skills/service-layer/SKILL.md +587 -0
- package/claude/skills/session-management/SKILL.md +266 -0
- package/claude/skills/session-management/scripts/create-session.py +166 -0
- package/claude/skills/session-management/scripts/iteration-close.sh +105 -0
- package/claude/skills/session-management/scripts/iteration-init.sh +180 -0
- package/claude/skills/session-management/scripts/session-archive.sh +87 -0
- package/claude/skills/session-management/scripts/session-close.sh +133 -0
- package/claude/skills/session-management/scripts/session-init.sh +225 -0
- package/claude/skills/session-management/scripts/session-list.sh +163 -0
- package/claude/skills/session-management/scripts/split-plan.sh +116 -0
- package/claude/skills/shadcn-components/SKILL.md +586 -0
- package/claude/skills/shadcn-theming/SKILL.md +446 -0
- package/claude/skills/suspense-loading/SKILL.md +280 -0
- package/claude/skills/tailwind-theming/SKILL.md +507 -0
- package/claude/skills/tanstack-query/SKILL.md +608 -0
- package/claude/skills/test-coverage/SKILL.md +239 -0
- package/claude/skills/web-design-guidelines/SKILL.md +39 -0
- package/claude/skills/zod-validation/SKILL.md +537 -0
- package/claude/templates/blocks/progress.md +86 -0
- package/claude/templates/iteration/changes.md +61 -0
- package/claude/templates/iteration/progress.md +55 -0
- package/claude/templates/log.md +31 -0
- package/claude/templates/story/context.md +77 -0
- package/claude/templates/story/pendings.md +37 -0
- package/claude/templates/story/plan.md +299 -0
- package/claude/templates/story/requirements.md +109 -0
- package/claude/templates/story/scope.json +10 -0
- package/claude/templates/story/tests.md +91 -0
- package/claude/templates/task/progress.md +58 -0
- package/claude/templates/task/requirements.md +54 -0
- package/claude/workflows/README.md +154 -0
- package/claude/workflows/blocks.md +614 -0
- package/claude/workflows/story.md +1207 -0
- package/claude/workflows/task.md +927 -0
- package/claude/workflows/tweak.md +527 -0
- package/cursor/.gitkeep +0 -0
- package/package.json +35 -0
- package/scripts/postinstall.mjs +198 -0
- package/scripts/setup.mjs +282 -0
- package/scripts/sync.mjs +209 -0
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
# /how-to:set-plans-and-permissions
|
|
2
|
+
|
|
3
|
+
Interactive guide to configure subscription plans, features, and billing in NextSpark.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Required Skills
|
|
8
|
+
|
|
9
|
+
Before executing, these skills provide deeper context:
|
|
10
|
+
- `.claude/skills/billing-subscriptions/SKILL.md` - Stripe integration and billing patterns
|
|
11
|
+
- `.claude/skills/permissions-system/SKILL.md` - Three-layer permission model
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Syntax
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
/how-to:set-plans-and-permissions
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Behavior
|
|
24
|
+
|
|
25
|
+
Guides the user through configuring subscription plans with features, usage limits, and Stripe integration.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Tutorial Structure
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
STEPS OVERVIEW (6 steps)
|
|
33
|
+
|
|
34
|
+
Step 1: Understanding the Billing System
|
|
35
|
+
└── Three-layer model: RBAC + Features + Quotas
|
|
36
|
+
|
|
37
|
+
Step 2: Define Features
|
|
38
|
+
└── Feature flags for plan-gating
|
|
39
|
+
|
|
40
|
+
Step 3: Define Usage Limits (Quotas)
|
|
41
|
+
└── Track and limit resource usage
|
|
42
|
+
|
|
43
|
+
Step 4: Configure Plans
|
|
44
|
+
└── Create free, pro, enterprise plans
|
|
45
|
+
|
|
46
|
+
Step 5: Set Up Stripe
|
|
47
|
+
└── Create products and prices
|
|
48
|
+
|
|
49
|
+
Step 6: Test the Checkout Flow
|
|
50
|
+
└── Verify the complete flow
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Step 1: Understanding the Billing System
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
59
|
+
📚 HOW TO: SET PLANS AND PERMISSIONS
|
|
60
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
61
|
+
|
|
62
|
+
STEP 1 OF 6: Understanding the Billing System
|
|
63
|
+
|
|
64
|
+
NextSpark uses a **three-layer permission model**:
|
|
65
|
+
|
|
66
|
+
┌─────────────────────────────────────────────┐
|
|
67
|
+
│ Layer 1: RBAC (Team Roles) │
|
|
68
|
+
│ "Can this role perform this action?" │
|
|
69
|
+
│ → owner, admin, member, viewer │
|
|
70
|
+
├─────────────────────────────────────────────┤
|
|
71
|
+
│ Layer 2: Features (Plan Gating) │
|
|
72
|
+
│ "Does this plan include this feature?" │
|
|
73
|
+
│ → advanced_analytics, api_access, etc. │
|
|
74
|
+
├─────────────────────────────────────────────┤
|
|
75
|
+
│ Layer 3: Quotas (Usage Limits) │
|
|
76
|
+
│ "Has this team exceeded their limit?" │
|
|
77
|
+
│ → team_members: 5, projects: 10, etc. │
|
|
78
|
+
└─────────────────────────────────────────────┘
|
|
79
|
+
|
|
80
|
+
RESULT = Permission ✓ AND Feature ✓ AND Quota ✓
|
|
81
|
+
|
|
82
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
83
|
+
|
|
84
|
+
📋 Example Check:
|
|
85
|
+
|
|
86
|
+
User wants to: Create a new project
|
|
87
|
+
|
|
88
|
+
Layer 1: Does user have "projects.create" permission? ✓
|
|
89
|
+
Layer 2: Does plan include "unlimited_projects" feature? ✓
|
|
90
|
+
Layer 3: Is team under the projects limit? ✓
|
|
91
|
+
|
|
92
|
+
→ Action allowed!
|
|
93
|
+
|
|
94
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
95
|
+
|
|
96
|
+
What would you like to do?
|
|
97
|
+
|
|
98
|
+
[1] Continue to Step 2 (Define Features)
|
|
99
|
+
[2] I have a question about the model
|
|
100
|
+
[3] Show me how checks work in code
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Step 2: Define Features
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
109
|
+
STEP 2 OF 6: Define Features
|
|
110
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
111
|
+
|
|
112
|
+
Features are boolean flags that enable functionality per plan:
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
// contents/themes/default/config/billing.config.ts
|
|
116
|
+
import type { BillingConfig } from '@/core/lib/billing/config-types'
|
|
117
|
+
|
|
118
|
+
export const billingConfig: BillingConfig = {
|
|
119
|
+
provider: 'stripe',
|
|
120
|
+
currency: 'usd',
|
|
121
|
+
defaultPlan: 'free',
|
|
122
|
+
|
|
123
|
+
// Define available features
|
|
124
|
+
features: {
|
|
125
|
+
// Analytics features
|
|
126
|
+
basic_analytics: {
|
|
127
|
+
name: 'billing.features.basic_analytics',
|
|
128
|
+
description: 'billing.features.basic_analytics_description',
|
|
129
|
+
},
|
|
130
|
+
advanced_analytics: {
|
|
131
|
+
name: 'billing.features.advanced_analytics',
|
|
132
|
+
description: 'billing.features.advanced_analytics_description',
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
// API features
|
|
136
|
+
api_access: {
|
|
137
|
+
name: 'billing.features.api_access',
|
|
138
|
+
description: 'billing.features.api_access_description',
|
|
139
|
+
},
|
|
140
|
+
webhooks: {
|
|
141
|
+
name: 'billing.features.webhooks',
|
|
142
|
+
description: 'billing.features.webhooks_description',
|
|
143
|
+
},
|
|
144
|
+
|
|
145
|
+
// Support features
|
|
146
|
+
priority_support: {
|
|
147
|
+
name: 'billing.features.priority_support',
|
|
148
|
+
description: 'billing.features.priority_support_description',
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
// Advanced features
|
|
152
|
+
custom_branding: {
|
|
153
|
+
name: 'billing.features.custom_branding',
|
|
154
|
+
description: 'billing.features.custom_branding_description',
|
|
155
|
+
},
|
|
156
|
+
white_label: {
|
|
157
|
+
name: 'billing.features.white_label',
|
|
158
|
+
description: 'billing.features.white_label_description',
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
// ... rest of config
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
167
|
+
|
|
168
|
+
📋 Check Feature in Code:
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
// Server-side
|
|
172
|
+
const membership = await MembershipService.get(userId, teamId)
|
|
173
|
+
|
|
174
|
+
if (membership.hasFeature('advanced_analytics')) {
|
|
175
|
+
// Show advanced analytics dashboard
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Client-side (React)
|
|
179
|
+
import { useHasFeature } from '@/core/lib/billing/hooks'
|
|
180
|
+
|
|
181
|
+
function AnalyticsDashboard() {
|
|
182
|
+
const hasAdvanced = useHasFeature('advanced_analytics')
|
|
183
|
+
|
|
184
|
+
return hasAdvanced ? <AdvancedCharts /> : <BasicCharts />
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
189
|
+
|
|
190
|
+
What would you like to do?
|
|
191
|
+
|
|
192
|
+
[1] Continue to Step 3 (Quotas)
|
|
193
|
+
[2] What features should I define?
|
|
194
|
+
[3] How do I show upgrade prompts?
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Step 3: Define Usage Limits (Quotas)
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
203
|
+
STEP 3 OF 6: Define Usage Limits (Quotas)
|
|
204
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
205
|
+
|
|
206
|
+
Quotas track and limit resource usage per team:
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
// contents/themes/default/config/billing.config.ts
|
|
210
|
+
|
|
211
|
+
export const billingConfig: BillingConfig = {
|
|
212
|
+
// ... features ...
|
|
213
|
+
|
|
214
|
+
// Define usage limits
|
|
215
|
+
limits: {
|
|
216
|
+
team_members: {
|
|
217
|
+
name: 'billing.limits.team_members',
|
|
218
|
+
unit: 'count',
|
|
219
|
+
resetPeriod: 'never', // Permanent limit
|
|
220
|
+
},
|
|
221
|
+
projects: {
|
|
222
|
+
name: 'billing.limits.projects',
|
|
223
|
+
unit: 'count',
|
|
224
|
+
resetPeriod: 'never',
|
|
225
|
+
},
|
|
226
|
+
storage_gb: {
|
|
227
|
+
name: 'billing.limits.storage',
|
|
228
|
+
unit: 'GB',
|
|
229
|
+
resetPeriod: 'never',
|
|
230
|
+
},
|
|
231
|
+
api_calls: {
|
|
232
|
+
name: 'billing.limits.api_calls',
|
|
233
|
+
unit: 'calls',
|
|
234
|
+
resetPeriod: 'monthly', // Resets each month
|
|
235
|
+
},
|
|
236
|
+
email_sends: {
|
|
237
|
+
name: 'billing.limits.email_sends',
|
|
238
|
+
unit: 'emails',
|
|
239
|
+
resetPeriod: 'monthly',
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
|
|
243
|
+
// Map actions to limits
|
|
244
|
+
actionMappings: {
|
|
245
|
+
limits: {
|
|
246
|
+
'team.members.invite': 'team_members',
|
|
247
|
+
'projects.create': 'projects',
|
|
248
|
+
'api.call': 'api_calls',
|
|
249
|
+
'email.send': 'email_sends',
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
256
|
+
|
|
257
|
+
📋 Reset Periods:
|
|
258
|
+
|
|
259
|
+
• 'never' - Permanent limit (team members, projects)
|
|
260
|
+
• 'monthly' - Resets on billing cycle (API calls)
|
|
261
|
+
• 'daily' - Resets daily (rate limiting)
|
|
262
|
+
|
|
263
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
264
|
+
|
|
265
|
+
📋 Check Quota in Code:
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
// Server-side check
|
|
269
|
+
const membership = await MembershipService.get(userId, teamId)
|
|
270
|
+
const quota = membership.checkQuota('projects', 1) // +1 project
|
|
271
|
+
|
|
272
|
+
if (!quota.allowed) {
|
|
273
|
+
return Response.json({
|
|
274
|
+
error: 'Project limit reached',
|
|
275
|
+
current: quota.current,
|
|
276
|
+
limit: quota.limit,
|
|
277
|
+
}, { status: 403 })
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Track usage after successful operation
|
|
281
|
+
await UsageService.trackUsage(teamId, 'projects', 1)
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
285
|
+
|
|
286
|
+
What would you like to do?
|
|
287
|
+
|
|
288
|
+
[1] Continue to Step 4 (Configure Plans)
|
|
289
|
+
[2] How does quota tracking work?
|
|
290
|
+
[3] Show me usage meter UI examples
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## Step 4: Configure Plans
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
299
|
+
STEP 4 OF 6: Configure Plans
|
|
300
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
301
|
+
|
|
302
|
+
Define your subscription plans:
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
// contents/themes/default/config/billing.config.ts
|
|
306
|
+
|
|
307
|
+
export const billingConfig: BillingConfig = {
|
|
308
|
+
// ... features, limits ...
|
|
309
|
+
|
|
310
|
+
plans: [
|
|
311
|
+
// FREE PLAN
|
|
312
|
+
{
|
|
313
|
+
slug: 'free',
|
|
314
|
+
name: 'billing.plans.free.name',
|
|
315
|
+
description: 'billing.plans.free.description',
|
|
316
|
+
type: 'free',
|
|
317
|
+
visibility: 'public',
|
|
318
|
+
price: { monthly: 0, yearly: 0 }, // In cents
|
|
319
|
+
trialDays: 0,
|
|
320
|
+
features: [
|
|
321
|
+
'basic_analytics',
|
|
322
|
+
],
|
|
323
|
+
limits: {
|
|
324
|
+
team_members: 3,
|
|
325
|
+
projects: 5,
|
|
326
|
+
storage_gb: 1,
|
|
327
|
+
api_calls: 1000,
|
|
328
|
+
email_sends: 100,
|
|
329
|
+
},
|
|
330
|
+
stripePriceIdMonthly: null,
|
|
331
|
+
stripePriceIdYearly: null,
|
|
332
|
+
},
|
|
333
|
+
|
|
334
|
+
// PRO PLAN
|
|
335
|
+
{
|
|
336
|
+
slug: 'pro',
|
|
337
|
+
name: 'billing.plans.pro.name',
|
|
338
|
+
description: 'billing.plans.pro.description',
|
|
339
|
+
type: 'paid',
|
|
340
|
+
visibility: 'public',
|
|
341
|
+
price: {
|
|
342
|
+
monthly: 2900, // $29.00
|
|
343
|
+
yearly: 29000, // $290.00 (16% savings)
|
|
344
|
+
},
|
|
345
|
+
trialDays: 14,
|
|
346
|
+
features: [
|
|
347
|
+
'basic_analytics',
|
|
348
|
+
'advanced_analytics',
|
|
349
|
+
'api_access',
|
|
350
|
+
'webhooks',
|
|
351
|
+
'priority_support',
|
|
352
|
+
],
|
|
353
|
+
limits: {
|
|
354
|
+
team_members: 15,
|
|
355
|
+
projects: 50,
|
|
356
|
+
storage_gb: 50,
|
|
357
|
+
api_calls: 100000,
|
|
358
|
+
email_sends: 5000,
|
|
359
|
+
},
|
|
360
|
+
stripePriceIdMonthly: 'price_xxx_monthly', // From Stripe
|
|
361
|
+
stripePriceIdYearly: 'price_xxx_yearly',
|
|
362
|
+
},
|
|
363
|
+
|
|
364
|
+
// ENTERPRISE PLAN
|
|
365
|
+
{
|
|
366
|
+
slug: 'enterprise',
|
|
367
|
+
name: 'billing.plans.enterprise.name',
|
|
368
|
+
description: 'billing.plans.enterprise.description',
|
|
369
|
+
type: 'enterprise',
|
|
370
|
+
visibility: 'hidden', // Contact sales only
|
|
371
|
+
features: ['*'], // All features
|
|
372
|
+
limits: {
|
|
373
|
+
team_members: -1, // -1 = Unlimited
|
|
374
|
+
projects: -1,
|
|
375
|
+
storage_gb: -1,
|
|
376
|
+
api_calls: -1,
|
|
377
|
+
email_sends: -1,
|
|
378
|
+
},
|
|
379
|
+
},
|
|
380
|
+
],
|
|
381
|
+
}
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
385
|
+
|
|
386
|
+
📋 Plan Types:
|
|
387
|
+
|
|
388
|
+
• 'free' - No payment required
|
|
389
|
+
• 'paid' - Requires Stripe subscription
|
|
390
|
+
• 'enterprise' - Custom pricing (contact sales)
|
|
391
|
+
|
|
392
|
+
📋 Visibility:
|
|
393
|
+
|
|
394
|
+
• 'public' - Shows on pricing page
|
|
395
|
+
• 'hidden' - Only via direct link or sales
|
|
396
|
+
|
|
397
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
398
|
+
|
|
399
|
+
What would you like to do?
|
|
400
|
+
|
|
401
|
+
[1] Continue to Step 5 (Stripe Setup)
|
|
402
|
+
[2] How do I add more plan tiers?
|
|
403
|
+
[3] Show me the pricing page component
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
## Step 5: Set Up Stripe
|
|
409
|
+
|
|
410
|
+
```
|
|
411
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
412
|
+
STEP 5 OF 6: Set Up Stripe
|
|
413
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
414
|
+
|
|
415
|
+
1️⃣ Create Stripe Products and Prices:
|
|
416
|
+
|
|
417
|
+
In Stripe Dashboard (dashboard.stripe.com):
|
|
418
|
+
|
|
419
|
+
• Products → Add Product → "Pro Plan"
|
|
420
|
+
• Add Price → $29/month → Copy price_xxx_monthly
|
|
421
|
+
• Add Price → $290/year → Copy price_xxx_yearly
|
|
422
|
+
|
|
423
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
424
|
+
|
|
425
|
+
2️⃣ Configure Environment Variables:
|
|
426
|
+
|
|
427
|
+
```env
|
|
428
|
+
# .env.local
|
|
429
|
+
STRIPE_SECRET_KEY=sk_test_xxx
|
|
430
|
+
STRIPE_PUBLISHABLE_KEY=pk_test_xxx
|
|
431
|
+
STRIPE_WEBHOOK_SECRET=whsec_xxx
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
435
|
+
|
|
436
|
+
3️⃣ Update Plan Price IDs:
|
|
437
|
+
|
|
438
|
+
```typescript
|
|
439
|
+
// In billing.config.ts
|
|
440
|
+
{
|
|
441
|
+
slug: 'pro',
|
|
442
|
+
// ...
|
|
443
|
+
stripePriceIdMonthly: 'price_1xxx', // From Stripe
|
|
444
|
+
stripePriceIdYearly: 'price_1yyy',
|
|
445
|
+
}
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
449
|
+
|
|
450
|
+
4️⃣ Set Up Webhook:
|
|
451
|
+
|
|
452
|
+
In Stripe Dashboard → Webhooks → Add endpoint:
|
|
453
|
+
|
|
454
|
+
URL: https://your-domain.com/api/v1/billing/webhooks/stripe
|
|
455
|
+
|
|
456
|
+
Events to listen for:
|
|
457
|
+
• checkout.session.completed
|
|
458
|
+
• invoice.paid
|
|
459
|
+
• invoice.payment_failed
|
|
460
|
+
• customer.subscription.updated
|
|
461
|
+
• customer.subscription.deleted
|
|
462
|
+
|
|
463
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
464
|
+
|
|
465
|
+
5️⃣ Test with Stripe CLI (development):
|
|
466
|
+
|
|
467
|
+
```bash
|
|
468
|
+
# Install Stripe CLI
|
|
469
|
+
stripe listen --forward-to localhost:3000/api/v1/billing/webhooks/stripe
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
473
|
+
|
|
474
|
+
What would you like to do?
|
|
475
|
+
|
|
476
|
+
[1] Continue to Step 6 (Test Checkout)
|
|
477
|
+
[2] I have questions about Stripe setup
|
|
478
|
+
[3] Help me set up webhook forwarding
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
---
|
|
482
|
+
|
|
483
|
+
## Step 6: Test the Checkout Flow
|
|
484
|
+
|
|
485
|
+
```
|
|
486
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
487
|
+
STEP 6 OF 6: Test the Checkout Flow
|
|
488
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
489
|
+
|
|
490
|
+
1️⃣ Add Translations:
|
|
491
|
+
|
|
492
|
+
```json
|
|
493
|
+
// contents/themes/default/messages/en.json
|
|
494
|
+
{
|
|
495
|
+
"billing": {
|
|
496
|
+
"plans": {
|
|
497
|
+
"free": {
|
|
498
|
+
"name": "Free",
|
|
499
|
+
"description": "Perfect for getting started"
|
|
500
|
+
},
|
|
501
|
+
"pro": {
|
|
502
|
+
"name": "Pro",
|
|
503
|
+
"description": "For growing teams and businesses"
|
|
504
|
+
},
|
|
505
|
+
"enterprise": {
|
|
506
|
+
"name": "Enterprise",
|
|
507
|
+
"description": "Custom solutions for large organizations"
|
|
508
|
+
}
|
|
509
|
+
},
|
|
510
|
+
"features": {
|
|
511
|
+
"basic_analytics": "Basic Analytics",
|
|
512
|
+
"advanced_analytics": "Advanced Analytics",
|
|
513
|
+
"api_access": "API Access",
|
|
514
|
+
"priority_support": "Priority Support"
|
|
515
|
+
},
|
|
516
|
+
"limits": {
|
|
517
|
+
"team_members": "Team Members",
|
|
518
|
+
"projects": "Projects",
|
|
519
|
+
"api_calls": "API Calls/month"
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
526
|
+
|
|
527
|
+
2️⃣ Rebuild Registry:
|
|
528
|
+
|
|
529
|
+
```bash
|
|
530
|
+
node core/scripts/build/registry.mjs
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
534
|
+
|
|
535
|
+
3️⃣ Test the Complete Flow:
|
|
536
|
+
|
|
537
|
+
• Go to /pricing (or /dashboard/settings/billing)
|
|
538
|
+
• Click "Upgrade to Pro"
|
|
539
|
+
• Use Stripe test card: 4242 4242 4242 4242
|
|
540
|
+
• Complete checkout
|
|
541
|
+
• Verify webhook updates subscription
|
|
542
|
+
• Check features are now available
|
|
543
|
+
|
|
544
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
545
|
+
|
|
546
|
+
📋 Test Cards:
|
|
547
|
+
|
|
548
|
+
• Success: 4242 4242 4242 4242
|
|
549
|
+
• Declined: 4000 0000 0000 0002
|
|
550
|
+
• 3D Secure: 4000 0027 6000 3184
|
|
551
|
+
|
|
552
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
553
|
+
|
|
554
|
+
✅ TUTORIAL STORY!
|
|
555
|
+
|
|
556
|
+
You've configured:
|
|
557
|
+
• Feature flags for plan gating
|
|
558
|
+
• Usage limits and quotas
|
|
559
|
+
• Subscription plans with pricing
|
|
560
|
+
• Stripe integration
|
|
561
|
+
|
|
562
|
+
📚 Related tutorials:
|
|
563
|
+
• /how-to:set-user-roles-and-permissions - RBAC configuration
|
|
564
|
+
• /how-to:create-api - Custom billing endpoints
|
|
565
|
+
|
|
566
|
+
🔙 Back to menu: /how-to:start
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
---
|
|
570
|
+
|
|
571
|
+
## Related Commands
|
|
572
|
+
|
|
573
|
+
| Command | Action |
|
|
574
|
+
|---------|--------|
|
|
575
|
+
| `/how-to:set-user-roles-and-permissions` | Configure team roles |
|