@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,340 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plugins
|
|
3
|
+
description: |
|
|
4
|
+
Plugin development system for this Next.js application.
|
|
5
|
+
Covers plugin structure, configuration, lifecycle hooks, registry integration, environment variables, and testing patterns.
|
|
6
|
+
CRITICAL: Includes MANDATORY dependency management rules for NPM distribution.
|
|
7
|
+
Use this skill when creating, modifying, or validating plugins.
|
|
8
|
+
allowed-tools: Read, Glob, Grep, Bash
|
|
9
|
+
version: 2.1.0
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Plugins Skill
|
|
13
|
+
|
|
14
|
+
Patterns for developing plugins in this Next.js application.
|
|
15
|
+
|
|
16
|
+
## Architecture Overview
|
|
17
|
+
|
|
18
|
+
### Model B Distribution: Plugin Locations
|
|
19
|
+
|
|
20
|
+
| Context | Plugin Location | Reason |
|
|
21
|
+
|---------|-----------------|--------|
|
|
22
|
+
| **Monorepo** (development) | `plugins/<plugin-name>/` | Workspace package |
|
|
23
|
+
| **Consumer project** | `contents/plugins/<plugin-name>/` | Copied by CLI (not node_modules) |
|
|
24
|
+
|
|
25
|
+
> **CRITICAL**: NPM packages are for DISTRIBUTION. In consumer projects, code is COPIED to `/contents/plugins/`, NOT kept in `node_modules`.
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
Plugin Structure (Monorepo):
|
|
29
|
+
plugins/
|
|
30
|
+
└── [plugin-name]/
|
|
31
|
+
├── package.json # REQUIRED: peerDependencies
|
|
32
|
+
├── plugin.config.ts # Plugin configuration (REQUIRED)
|
|
33
|
+
├── README.md # Documentation (REQUIRED)
|
|
34
|
+
├── .env.example # Environment template (REQUIRED)
|
|
35
|
+
├── types/ # TypeScript definitions
|
|
36
|
+
├── lib/ # Core logic
|
|
37
|
+
├── hooks/ # React hooks
|
|
38
|
+
├── components/ # React components
|
|
39
|
+
├── providers/ # Context providers
|
|
40
|
+
├── api/ # API endpoints
|
|
41
|
+
├── entities/ # Plugin entities (optional)
|
|
42
|
+
└── docs/ # Documentation
|
|
43
|
+
|
|
44
|
+
Plugin Types: utility | service | configuration
|
|
45
|
+
→ See references/plugin-types.md for detailed structures
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## MANDATORY: NPM Distribution & Dependency Management
|
|
51
|
+
|
|
52
|
+
### Fundamental Principle
|
|
53
|
+
|
|
54
|
+
> **If `@nextsparkjs/core` has a dependency, plugins MUST declare it as `peerDependency`, NEVER as `dependency`.**
|
|
55
|
+
|
|
56
|
+
### Why It's MANDATORY
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
❌ WRONG - Duplicate dependencies (FORBIDDEN):
|
|
60
|
+
┌─────────────────────────────────────────────────┐
|
|
61
|
+
│ node_modules/ │
|
|
62
|
+
│ ├── @nextsparkjs/core/ │
|
|
63
|
+
│ │ └── node_modules/zod@4.1.5 ← Instance 1 │
|
|
64
|
+
│ ├── @nextsparkjs/plugin-ai/ │
|
|
65
|
+
│ │ └── node_modules/zod@4.1.5 ← Instance 2 │
|
|
66
|
+
│ └── @nextsparkjs/plugin-langchain/ │
|
|
67
|
+
│ └── node_modules/zod@3.23.0 ← Instance 3! │
|
|
68
|
+
└─────────────────────────────────────────────────┘
|
|
69
|
+
Result: Type conflicts, instanceof errors, bloated bundle
|
|
70
|
+
|
|
71
|
+
✅ CORRECT - Single instance (MANDATORY):
|
|
72
|
+
┌─────────────────────────────────────────────────┐
|
|
73
|
+
│ node_modules/ │
|
|
74
|
+
│ ├── zod@4.1.5 ← ONE single instance (hoisted) │
|
|
75
|
+
│ ├── @nextsparkjs/core/ (provides zod) │
|
|
76
|
+
│ ├── @nextsparkjs/plugin-ai/ (uses host's zod) │
|
|
77
|
+
│ └── @nextsparkjs/plugin-langchain/ (uses zod) │
|
|
78
|
+
└─────────────────────────────────────────────────┘
|
|
79
|
+
Result: No conflicts, optimized bundle
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Dependency Classification
|
|
83
|
+
|
|
84
|
+
| Category | Type | Examples |
|
|
85
|
+
|----------|------|----------|
|
|
86
|
+
| **Singleton libraries** | `peerDependencies` | zod, react, react-dom, next |
|
|
87
|
+
| **Shared with core** | `peerDependencies` | @tanstack/react-query, lucide-react |
|
|
88
|
+
| **Plugin-exclusive** | `dependencies` | @ai-sdk/*, @langchain/* |
|
|
89
|
+
|
|
90
|
+
### Dependencies Core Provides (NEVER duplicate)
|
|
91
|
+
|
|
92
|
+
```json
|
|
93
|
+
{
|
|
94
|
+
"zod": "^4.1.5",
|
|
95
|
+
"@tanstack/react-query": "^5.85.0",
|
|
96
|
+
"lucide-react": "^0.539.0",
|
|
97
|
+
"class-variance-authority": "^0.7.1",
|
|
98
|
+
"clsx": "^2.1.1",
|
|
99
|
+
"tailwind-merge": "^3.3.1",
|
|
100
|
+
"date-fns": "^4.1.0",
|
|
101
|
+
"react-hook-form": "^7.62.0",
|
|
102
|
+
"sonner": "^2.0.7",
|
|
103
|
+
"next-intl": "^4.3.4",
|
|
104
|
+
"better-auth": "^1.3.5"
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### MANDATORY package.json Template
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"name": "@nextsparkjs/plugin-NAME",
|
|
113
|
+
"version": "1.0.0",
|
|
114
|
+
"private": false,
|
|
115
|
+
"main": "./plugin.config.ts",
|
|
116
|
+
"dependencies": {
|
|
117
|
+
"@ai-sdk/anthropic": "^2.0.17" // ✅ Only THIS plugin uses it
|
|
118
|
+
},
|
|
119
|
+
"peerDependencies": {
|
|
120
|
+
"@nextsparkjs/core": "workspace:*",
|
|
121
|
+
"next": "^15.0.0",
|
|
122
|
+
"react": "^19.0.0",
|
|
123
|
+
"zod": "^4.0.0"
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## When to Use This Skill
|
|
131
|
+
|
|
132
|
+
- Creating new plugins
|
|
133
|
+
- Understanding plugin structure
|
|
134
|
+
- Implementing plugin lifecycle hooks
|
|
135
|
+
- Configuring plugin environment variables
|
|
136
|
+
- Integrating plugins with the registry
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Plugin Configuration (REQUIRED)
|
|
141
|
+
|
|
142
|
+
Every plugin MUST have a `plugin.config.ts` file:
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
import { z } from 'zod'
|
|
146
|
+
import type { PluginConfig } from '@/core/types/plugin'
|
|
147
|
+
|
|
148
|
+
const MyPluginConfigSchema = z.object({
|
|
149
|
+
apiKey: z.string().min(1),
|
|
150
|
+
timeout: z.number().min(1000).default(5000),
|
|
151
|
+
debugMode: z.boolean().default(false)
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
export const myPluginConfig: PluginConfig = {
|
|
155
|
+
name: 'my-plugin',
|
|
156
|
+
version: '1.0.0',
|
|
157
|
+
displayName: 'My Custom Plugin',
|
|
158
|
+
description: 'Clear description of plugin functionality',
|
|
159
|
+
enabled: true,
|
|
160
|
+
dependencies: [],
|
|
161
|
+
|
|
162
|
+
components: { MyComponent: undefined },
|
|
163
|
+
services: { useMyService: undefined },
|
|
164
|
+
|
|
165
|
+
hooks: {
|
|
166
|
+
async onLoad() { console.log('[My Plugin] Loading...') },
|
|
167
|
+
async onActivate() { console.log('[My Plugin] Activated') },
|
|
168
|
+
async onDeactivate() { console.log('[My Plugin] Deactivated') },
|
|
169
|
+
async onUnload() { console.log('[My Plugin] Unloaded') }
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export default myPluginConfig
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Environment Variables Pattern
|
|
179
|
+
|
|
180
|
+
### ⭐ Centralized Plugin Env Loader (RECOMMENDED)
|
|
181
|
+
|
|
182
|
+
Use the core's centralized env-loader for automatic plugin `.env` loading:
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
// contents/plugins/my-plugin/lib/plugin-env.ts
|
|
186
|
+
import { getPluginEnv } from '@nextsparkjs/core/lib/plugins/env-loader'
|
|
187
|
+
|
|
188
|
+
const env = getPluginEnv('my-plugin')
|
|
189
|
+
const apiKey = env.MY_PLUGIN_API_KEY
|
|
190
|
+
const enabled = env.MY_PLUGIN_ENABLED === 'true'
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Priority System
|
|
194
|
+
|
|
195
|
+
1. **Plugin `.env`** (`contents/plugins/my-plugin/.env`) - Highest priority
|
|
196
|
+
2. **Root `.env`** (project root) - Fallback
|
|
197
|
+
3. **Built-in defaults** - Lowest priority
|
|
198
|
+
|
|
199
|
+
### Namespace-Based Architecture
|
|
200
|
+
|
|
201
|
+
**SHARED Variables (root `.env`):**
|
|
202
|
+
- `DATABASE_URL`, `BETTER_AUTH_SECRET`
|
|
203
|
+
- `ANTHROPIC_API_KEY`, `OPENAI_API_KEY` (can be shared across plugins)
|
|
204
|
+
|
|
205
|
+
**PLUGIN Variables (plugin `.env` with prefix):**
|
|
206
|
+
- All plugin-specific variables MUST use `MY_PLUGIN_*` namespace
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
# contents/plugins/my-plugin/.env.example
|
|
210
|
+
# Plugin-specific configuration
|
|
211
|
+
MY_PLUGIN_ENABLED=true
|
|
212
|
+
MY_PLUGIN_DEBUG=false
|
|
213
|
+
MY_PLUGIN_API_KEY=your-api-key-here
|
|
214
|
+
MY_PLUGIN_TIMEOUT=5000
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Required Files
|
|
218
|
+
|
|
219
|
+
| File | Purpose |
|
|
220
|
+
|------|---------|
|
|
221
|
+
| `.env.example` | Template with all variables documented |
|
|
222
|
+
| `lib/plugin-env.ts` | Type-safe wrapper using core's env-loader |
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Plugin Registry Integration
|
|
227
|
+
|
|
228
|
+
### Auto-Generated Registry
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
// core/lib/registries/plugin-registry.ts (AUTO-GENERATED)
|
|
232
|
+
export const PLUGIN_REGISTRY: Record<string, PluginRegistryEntry> = {
|
|
233
|
+
'my-plugin': {
|
|
234
|
+
name: 'my-plugin',
|
|
235
|
+
config: myPluginConfig,
|
|
236
|
+
hasAPI: true,
|
|
237
|
+
apiPath: '/api/plugin/my-plugin',
|
|
238
|
+
hasComponents: true
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Rebuild Registry
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
# After creating or modifying plugins
|
|
247
|
+
node core/scripts/build/registry.mjs
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## Scripts
|
|
253
|
+
|
|
254
|
+
### Scaffold New Plugin
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
python .claude/skills/plugins/scripts/scaffold-plugin.py \
|
|
258
|
+
--name "my-plugin" \
|
|
259
|
+
--type "service" \
|
|
260
|
+
--features "components,hooks,api"
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Anti-Patterns
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
// ❌ NEVER: Put dependencies that core already has
|
|
269
|
+
{
|
|
270
|
+
"dependencies": {
|
|
271
|
+
"zod": "^4.0.0", // ❌ Core has it → peerDependency
|
|
272
|
+
"react": "^19.0.0" // ❌ Core has it → peerDependency
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// ❌ NEVER: Put global variables in plugin .env
|
|
277
|
+
// USE_LOCAL_AI=true // WRONG - This overrides root .env!
|
|
278
|
+
|
|
279
|
+
// ❌ NEVER: Hardcode configuration
|
|
280
|
+
const config = { apiKey: 'hardcoded-key' }
|
|
281
|
+
|
|
282
|
+
// ❌ NEVER: Skip error handling in handlers
|
|
283
|
+
export async function badProcess(data: any) {
|
|
284
|
+
return await externalAPI(data) // No try/catch
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// ❌ NEVER: Use any types
|
|
288
|
+
export interface BadInterface { data: any }
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Checklist
|
|
294
|
+
|
|
295
|
+
### Before Creating (MANDATORY)
|
|
296
|
+
|
|
297
|
+
- [ ] Verify if dependencies are already in core
|
|
298
|
+
- [ ] If in core → declare as `peerDependencies`
|
|
299
|
+
- [ ] If NOT in core → declare as `dependencies`
|
|
300
|
+
- [ ] NEVER duplicate: zod, react, next, @tanstack/*, lucide-react
|
|
301
|
+
|
|
302
|
+
### During Development
|
|
303
|
+
|
|
304
|
+
- [ ] Plugin name follows kebab-case convention
|
|
305
|
+
- [ ] `plugin.config.ts` with all required fields
|
|
306
|
+
- [ ] `README.md` with usage documentation
|
|
307
|
+
- [ ] `.env.example` with namespaced variables only
|
|
308
|
+
- [ ] `lib/plugin-env.ts` using core's env-loader
|
|
309
|
+
- [ ] Types defined in `types/` directory
|
|
310
|
+
- [ ] All variables use `MY_PLUGIN_*` namespace
|
|
311
|
+
- [ ] Components have `data-cy` selectors
|
|
312
|
+
|
|
313
|
+
### After Implementation
|
|
314
|
+
|
|
315
|
+
- [ ] Run `node core/scripts/build/registry.mjs`
|
|
316
|
+
- [ ] Unit tests with 90%+ coverage
|
|
317
|
+
- [ ] E2E tests with Page Object Model
|
|
318
|
+
- [ ] Build passes: `pnpm build`
|
|
319
|
+
|
|
320
|
+
### Validate Dependencies
|
|
321
|
+
|
|
322
|
+
```bash
|
|
323
|
+
pnpm ls zod # Should show ONE version only
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## References
|
|
329
|
+
|
|
330
|
+
- `references/plugin-types.md` - Detailed plugin type structures
|
|
331
|
+
- `references/plugin-templates.md` - Component, hook, API templates
|
|
332
|
+
- `references/plugin-testing.md` - Testing patterns and POMs
|
|
333
|
+
|
|
334
|
+
## Related Skills
|
|
335
|
+
|
|
336
|
+
- `monorepo-architecture` - Package hierarchy and dependency rules
|
|
337
|
+
- `cypress-selectors` - Selector patterns for plugin components
|
|
338
|
+
- `tanstack-query` - Data fetching in plugin hooks
|
|
339
|
+
- `zod-validation` - Input validation for plugin APIs
|
|
340
|
+
- `registry-system` - Plugin registry integration
|