@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,425 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: create-plugin
|
|
3
|
+
description: |
|
|
4
|
+
Guide for creating new plugins from preset template.
|
|
5
|
+
CRITICAL: Includes MANDATORY dependency management and Model B distribution rules.
|
|
6
|
+
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
7
|
+
version: "2.0"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Create Plugin Skill
|
|
11
|
+
|
|
12
|
+
Complete guide for scaffolding and configuring new plugins from the preset template.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## ⚠️ MANDATORY: Model B Distribution
|
|
17
|
+
|
|
18
|
+
> **Los paquetes NPM son para DISTRIBUCIÓN. En proyectos de usuario, el código se COPIA a `/contents/plugins/`.**
|
|
19
|
+
|
|
20
|
+
### Estructura según contexto:
|
|
21
|
+
|
|
22
|
+
| Contexto | Plugin Location |
|
|
23
|
+
|----------|-----------------|
|
|
24
|
+
| **Monorepo** (desarrollo) | `plugins/<plugin-name>/` |
|
|
25
|
+
| **Proyecto usuario** | `contents/plugins/<plugin-name>/` (copiado por CLI) |
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## ⚠️ MANDATORY: package.json Template
|
|
30
|
+
|
|
31
|
+
Cada plugin DEBE tener un `package.json` con esta estructura:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"name": "@nextsparkjs/plugin-NOMBRE",
|
|
36
|
+
"version": "1.0.0",
|
|
37
|
+
"private": false,
|
|
38
|
+
"main": "./plugin.config.ts",
|
|
39
|
+
"requiredPlugins": [],
|
|
40
|
+
"dependencies": {
|
|
41
|
+
// SOLO dependencias EXCLUSIVAS de este plugin que NO están en core
|
|
42
|
+
},
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"@nextsparkjs/core": "workspace:*",
|
|
45
|
+
"next": "^15.0.0",
|
|
46
|
+
"react": "^19.0.0",
|
|
47
|
+
"react-dom": "^19.0.0",
|
|
48
|
+
"zod": "^4.0.0"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**REGLA CRÍTICA**: Si core tiene una dependencia, el plugin DEBE declararla como `peerDependency`, NUNCA como `dependency`.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Prerequisites
|
|
58
|
+
|
|
59
|
+
- **Command:** `pnpm create:plugin <plugin-name>`
|
|
60
|
+
- **Preset Location:** `core/templates/contents/plugins/starter/`
|
|
61
|
+
- **Output Location (monorepo):** `plugins/<plugin-name>/`
|
|
62
|
+
- **Output Location (user project):** `contents/plugins/<plugin-name>/`
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Step 1: Gather Requirements
|
|
67
|
+
|
|
68
|
+
Before creating ANY plugin, collect:
|
|
69
|
+
|
|
70
|
+
```markdown
|
|
71
|
+
Required Information:
|
|
72
|
+
1. Plugin name (lowercase, hyphenated slug)
|
|
73
|
+
2. Display name (human-readable)
|
|
74
|
+
3. Description (purpose of the plugin)
|
|
75
|
+
4. Author (team or individual)
|
|
76
|
+
5. Complexity level (utility | service | full)
|
|
77
|
+
6. Primary functionality (what problem does it solve?)
|
|
78
|
+
7. Has entities? (yes/no)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Complexity Levels
|
|
82
|
+
|
|
83
|
+
| Level | Includes | Use When |
|
|
84
|
+
|-------|----------|----------|
|
|
85
|
+
| `utility` | lib/core.ts, types | Simple helper functions, utilities |
|
|
86
|
+
| `service` | API + components + hooks | Most plugins - external API integration |
|
|
87
|
+
| `full` | Entities + migrations + everything | Complex plugins with own database tables |
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Step 2: Create Plugin from Preset
|
|
92
|
+
|
|
93
|
+
### Basic Usage
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
pnpm create:plugin <plugin-name>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### With Options
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
pnpm create:plugin <plugin-name> \
|
|
103
|
+
--description "Plugin description" \
|
|
104
|
+
--author "Author Name" \
|
|
105
|
+
--display-name "Display Name" \
|
|
106
|
+
--complexity service
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Example
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
pnpm create:plugin analytics \
|
|
113
|
+
--description "User analytics and metrics tracking" \
|
|
114
|
+
--author "Development Team" \
|
|
115
|
+
--display-name "Analytics" \
|
|
116
|
+
--complexity service
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Step 3: Plugin Structure Created
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
plugins/<plugin-name>/ # Monorepo location
|
|
125
|
+
├── plugin.config.ts # Plugin configuration
|
|
126
|
+
├── README.md # Plugin documentation
|
|
127
|
+
├── .env.example # Environment variables template
|
|
128
|
+
├── api/
|
|
129
|
+
│ └── example/route.ts # Example API endpoint
|
|
130
|
+
├── lib/
|
|
131
|
+
│ ├── core.ts # Core plugin logic
|
|
132
|
+
│ ├── types.ts # TypeScript types
|
|
133
|
+
│ └── plugin-env.ts # Env loader wrapper (REQUIRED)
|
|
134
|
+
├── components/
|
|
135
|
+
│ └── ExampleWidget.tsx # Example UI component
|
|
136
|
+
├── hooks/
|
|
137
|
+
│ └── usePlugin.ts # Custom React hook
|
|
138
|
+
├── entities/ # (if complexity: full)
|
|
139
|
+
│ └── [entity]/ # Each entity has 4 required files
|
|
140
|
+
│ ├── [entity].config.ts
|
|
141
|
+
│ ├── [entity].fields.ts
|
|
142
|
+
│ ├── [entity].types.ts
|
|
143
|
+
│ ├── [entity].service.ts
|
|
144
|
+
│ └── messages/
|
|
145
|
+
├── migrations/ # (if complexity: full)
|
|
146
|
+
│ └── README.md
|
|
147
|
+
├── messages/
|
|
148
|
+
│ ├── en.json # English translations
|
|
149
|
+
│ └── es.json # Spanish translations
|
|
150
|
+
└── tests/
|
|
151
|
+
└── plugin.test.ts # Unit tests
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Step 4: Customize Configuration
|
|
157
|
+
|
|
158
|
+
### 4.1 plugin.config.ts - Plugin Identity
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
import type { PluginConfig } from '@/core/types/plugins'
|
|
162
|
+
import { exampleFunction } from './lib/core'
|
|
163
|
+
|
|
164
|
+
export const myPluginConfig: PluginConfig = {
|
|
165
|
+
name: 'my-plugin',
|
|
166
|
+
displayName: 'My Plugin',
|
|
167
|
+
version: '1.0.0',
|
|
168
|
+
description: 'Plugin description',
|
|
169
|
+
enabled: true,
|
|
170
|
+
|
|
171
|
+
// Dependencies on other plugins
|
|
172
|
+
dependencies: [], // e.g., ['auth', 'analytics']
|
|
173
|
+
|
|
174
|
+
// Exported API
|
|
175
|
+
api: {
|
|
176
|
+
exampleFunction,
|
|
177
|
+
},
|
|
178
|
+
|
|
179
|
+
// Lifecycle hooks
|
|
180
|
+
hooks: {
|
|
181
|
+
onLoad: async () => {
|
|
182
|
+
console.log('[My Plugin] Loading...')
|
|
183
|
+
},
|
|
184
|
+
onActivate: async () => {
|
|
185
|
+
console.log('[My Plugin] Activated')
|
|
186
|
+
},
|
|
187
|
+
onDeactivate: async () => {
|
|
188
|
+
console.log('[My Plugin] Deactivated')
|
|
189
|
+
},
|
|
190
|
+
onUnload: async () => {
|
|
191
|
+
console.log('[My Plugin] Unloaded')
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 4.2 lib/types.ts - TypeScript Definitions
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
export interface MyPluginConfig {
|
|
201
|
+
apiKey?: string
|
|
202
|
+
baseUrl?: string
|
|
203
|
+
debug?: boolean
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export interface MyPluginResult {
|
|
207
|
+
success: boolean
|
|
208
|
+
data?: unknown
|
|
209
|
+
message: string
|
|
210
|
+
timestamp: number
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### 4.3 .env.example - Environment Variables
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
# ============================================
|
|
218
|
+
# MY PLUGIN CONFIGURATION
|
|
219
|
+
# ============================================
|
|
220
|
+
# Copy this file to .env
|
|
221
|
+
# Priority: Plugin .env > Root .env > Defaults
|
|
222
|
+
|
|
223
|
+
# Required for production
|
|
224
|
+
MY_PLUGIN_API_KEY=your-api-key-here
|
|
225
|
+
|
|
226
|
+
# Optional configuration
|
|
227
|
+
MY_PLUGIN_BASE_URL=https://api.example.com
|
|
228
|
+
MY_PLUGIN_DEBUG=false
|
|
229
|
+
MY_PLUGIN_ENABLED=true
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### 4.4 lib/plugin-env.ts - Centralized Env Loader (REQUIRED)
|
|
233
|
+
|
|
234
|
+
Every plugin MUST use the core's centralized env-loader:
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
// plugins/my-plugin/lib/plugin-env.ts
|
|
238
|
+
import { getPluginEnv } from '@nextsparkjs/core/lib/plugins/env-loader'
|
|
239
|
+
|
|
240
|
+
interface MyPluginEnvConfig {
|
|
241
|
+
MY_PLUGIN_API_KEY?: string
|
|
242
|
+
MY_PLUGIN_BASE_URL?: string
|
|
243
|
+
MY_PLUGIN_DEBUG?: string
|
|
244
|
+
MY_PLUGIN_ENABLED?: string
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
class PluginEnvironment {
|
|
248
|
+
private static instance: PluginEnvironment
|
|
249
|
+
private config: MyPluginEnvConfig = {}
|
|
250
|
+
private loaded = false
|
|
251
|
+
|
|
252
|
+
private constructor() {
|
|
253
|
+
this.loadEnvironment()
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
public static getInstance(): PluginEnvironment {
|
|
257
|
+
if (!PluginEnvironment.instance) {
|
|
258
|
+
PluginEnvironment.instance = new PluginEnvironment()
|
|
259
|
+
}
|
|
260
|
+
return PluginEnvironment.instance
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
private loadEnvironment(): void {
|
|
264
|
+
if (this.loaded) return
|
|
265
|
+
|
|
266
|
+
const env = getPluginEnv('my-plugin')
|
|
267
|
+
this.config = {
|
|
268
|
+
MY_PLUGIN_API_KEY: env.MY_PLUGIN_API_KEY,
|
|
269
|
+
MY_PLUGIN_BASE_URL: env.MY_PLUGIN_BASE_URL || 'https://api.example.com',
|
|
270
|
+
MY_PLUGIN_DEBUG: env.MY_PLUGIN_DEBUG || 'false',
|
|
271
|
+
MY_PLUGIN_ENABLED: env.MY_PLUGIN_ENABLED || 'true',
|
|
272
|
+
}
|
|
273
|
+
this.loaded = true
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
public getApiKey(): string | undefined {
|
|
277
|
+
return this.config.MY_PLUGIN_API_KEY
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
public getBaseUrl(): string {
|
|
281
|
+
return this.config.MY_PLUGIN_BASE_URL || 'https://api.example.com'
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
public isDebugEnabled(): boolean {
|
|
285
|
+
return this.config.MY_PLUGIN_DEBUG === 'true'
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
public isPluginEnabled(): boolean {
|
|
289
|
+
return this.config.MY_PLUGIN_ENABLED !== 'false'
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
export const pluginEnv = PluginEnvironment.getInstance()
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**Benefits:**
|
|
297
|
+
- ✅ Plugin .env takes priority over root .env
|
|
298
|
+
- ✅ Automatic fallback to root .env for shared variables
|
|
299
|
+
- ✅ Type-safe configuration access
|
|
300
|
+
- ✅ Singleton pattern for performance
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## Step 5: Register Plugin in Sandbox Theme
|
|
305
|
+
|
|
306
|
+
**Critical Step**: Add the plugin to the plugin-sandbox theme for testing.
|
|
307
|
+
|
|
308
|
+
```typescript
|
|
309
|
+
// contents/themes/plugin-sandbox/config/theme.config.ts
|
|
310
|
+
export const pluginSandboxThemeConfig: ThemeConfig = {
|
|
311
|
+
plugins: [
|
|
312
|
+
'my-plugin', // <-- Add your new plugin here
|
|
313
|
+
],
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
Then rebuild the registry:
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
node core/scripts/build/registry.mjs
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Step 6: Verify Plugin Setup
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
# 1. Verify plugin structure
|
|
329
|
+
ls -la plugins/<plugin-name>/
|
|
330
|
+
|
|
331
|
+
# 2. Verify package.json has correct peerDependencies
|
|
332
|
+
cat plugins/<plugin-name>/package.json
|
|
333
|
+
|
|
334
|
+
# 3. Build registry to include new plugin
|
|
335
|
+
node core/scripts/build/registry.mjs
|
|
336
|
+
|
|
337
|
+
# 4. Verify plugin appears in registry
|
|
338
|
+
grep "<plugin-name>" core/lib/registries/plugin-registry.ts
|
|
339
|
+
|
|
340
|
+
# 5. Verify no duplicate dependencies
|
|
341
|
+
pnpm ls zod # Should show ONE version
|
|
342
|
+
|
|
343
|
+
# 6. Verify no TypeScript errors
|
|
344
|
+
pnpm tsc --noEmit
|
|
345
|
+
|
|
346
|
+
# 7. Test plugin activation (optional)
|
|
347
|
+
# Set NEXT_PUBLIC_ACTIVE_THEME=plugin-sandbox in .env.local
|
|
348
|
+
# Run: pnpm dev
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## Entity Structure (for full complexity plugins)
|
|
354
|
+
|
|
355
|
+
Each entity requires 4 files:
|
|
356
|
+
|
|
357
|
+
| File | Purpose |
|
|
358
|
+
|------|---------|
|
|
359
|
+
| `[entity].config.ts` | Entity configuration |
|
|
360
|
+
| `[entity].fields.ts` | Field definitions |
|
|
361
|
+
| `[entity].types.ts` | TypeScript types |
|
|
362
|
+
| `[entity].service.ts` | Data access service |
|
|
363
|
+
|
|
364
|
+
**Reference:** `core/templates/contents/themes/starter/entities/tasks/`
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## Verification Checklist
|
|
369
|
+
|
|
370
|
+
### Antes de crear (OBLIGATORIO):
|
|
371
|
+
- [ ] Verificar si las dependencias que necesito ya están en core
|
|
372
|
+
- [ ] Si están en core → declararlas como `peerDependencies`
|
|
373
|
+
- [ ] Si NO están en core → declararlas como `dependencies`
|
|
374
|
+
|
|
375
|
+
### Después de crear:
|
|
376
|
+
- [ ] Plugin name follows naming conventions (lowercase, hyphenated)
|
|
377
|
+
- [ ] All preset files created successfully
|
|
378
|
+
- [ ] **package.json** tiene nombre `@nextsparkjs/plugin-<name>`
|
|
379
|
+
- [ ] **package.json** tiene `peerDependencies` correctas (no duplicar core)
|
|
380
|
+
- [ ] plugin.config.ts has correct metadata
|
|
381
|
+
- [ ] lib/types.ts has appropriate interfaces
|
|
382
|
+
- [ ] **lib/plugin-env.ts** uses core's env-loader
|
|
383
|
+
- [ ] .env.example documents all environment variables
|
|
384
|
+
- [ ] Plugin registered in plugin-sandbox theme
|
|
385
|
+
- [ ] Registry rebuilt: `node core/scripts/build/registry.mjs`
|
|
386
|
+
- [ ] Plugin appears in PLUGIN_REGISTRY
|
|
387
|
+
- [ ] No duplicate dependencies: `pnpm ls zod` shows ONE version
|
|
388
|
+
- [ ] No TypeScript errors: `pnpm tsc --noEmit`
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## Anti-Patterns
|
|
393
|
+
|
|
394
|
+
| Pattern | Why It's Wrong | Correct Approach |
|
|
395
|
+
|---------|----------------|------------------|
|
|
396
|
+
| Manual file creation | Missing files, wrong structure | Use `pnpm create:plugin` |
|
|
397
|
+
| Skipping sandbox registration | Can't test plugin | Add to plugin-sandbox theme |
|
|
398
|
+
| Skipping registry rebuild | Plugin won't be recognized | Run `node core/scripts/build/registry.mjs` |
|
|
399
|
+
| Modifying core files | Architecture violation | Only work in `contents/plugins/` |
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## Next Steps After Creation
|
|
404
|
+
|
|
405
|
+
After scaffolding the plugin, continue with implementation:
|
|
406
|
+
|
|
407
|
+
1. **Implement core business logic** in `lib/`
|
|
408
|
+
2. **Create API endpoints** if needed
|
|
409
|
+
3. **Build UI components** in `components/`
|
|
410
|
+
4. **Add entities** if the plugin manages data
|
|
411
|
+
5. **Run verification checklist** above
|
|
412
|
+
|
|
413
|
+
### Environment Setup
|
|
414
|
+
```bash
|
|
415
|
+
NEXT_PUBLIC_ACTIVE_THEME='plugin-sandbox'
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
---
|
|
419
|
+
|
|
420
|
+
## Related Documentation
|
|
421
|
+
|
|
422
|
+
- **`monorepo-architecture` skill** - CRITICAL: Package hierarchy, dependency rules, Model B distribution
|
|
423
|
+
- **`plugins` skill** - Plugin development patterns and dependency management
|
|
424
|
+
- Entity System: `core/docs/04-entities/`
|
|
425
|
+
- Registry System: `core/docs/03-registry-system/`
|