@bovinphang/frontend-craft 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/.claude-plugin/marketplace.json +61 -0
  2. package/.claude-plugin/plugin.json +32 -0
  3. package/.mcp.json +44 -0
  4. package/CHANGELOG.md +229 -0
  5. package/CHANGELOG.zh-CN.md +228 -0
  6. package/CODE_OF_CONDUCT.md +34 -0
  7. package/CODE_OF_CONDUCT.zh-CN.md +34 -0
  8. package/CONTRIBUTING.md +356 -0
  9. package/CONTRIBUTING.zh-CN.md +356 -0
  10. package/LICENSE +21 -0
  11. package/README.md +467 -0
  12. package/README.openclaw.md +262 -0
  13. package/README.openclaw.zh-CN.md +262 -0
  14. package/README.zh-CN.md +467 -0
  15. package/SECURITY.md +44 -0
  16. package/SECURITY.zh-CN.md +44 -0
  17. package/agents/fec-architect.md +125 -0
  18. package/agents/fec-code-reviewer.md +152 -0
  19. package/agents/fec-debugger.md +44 -0
  20. package/agents/fec-design-token-mapper.md +75 -0
  21. package/agents/fec-doc-updater.md +30 -0
  22. package/agents/fec-e2e-runner.md +107 -0
  23. package/agents/fec-figma-implementer.md +104 -0
  24. package/agents/fec-performance-optimizer.md +293 -0
  25. package/agents/fec-refactor-cleaner.md +32 -0
  26. package/agents/fec-security-reviewer.md +116 -0
  27. package/agents/fec-test-planner.md +50 -0
  28. package/agents/fec-typescript-reviewer.md +142 -0
  29. package/agents/fec-ui-checker.md +120 -0
  30. package/commands/fec-debug.md +30 -0
  31. package/commands/fec-doc-sync.md +18 -0
  32. package/commands/fec-init.md +70 -0
  33. package/commands/fec-plan.md +94 -0
  34. package/commands/fec-refactor-clean.md +19 -0
  35. package/commands/fec-review.md +66 -0
  36. package/commands/fec-scaffold.md +205 -0
  37. package/commands/fec-tdd.md +21 -0
  38. package/dist/bin/frontend-craft.js +82 -0
  39. package/dist/hooks/fec-cleanup-claude-cache.js +4 -0
  40. package/dist/hooks/fec-format-changed-file.js +1 -0
  41. package/dist/hooks/fec-notify.js +1 -0
  42. package/dist/hooks/fec-run-tests.js +1 -0
  43. package/dist/hooks/fec-security-check.js +2 -0
  44. package/dist/hooks/fec-session-start.js +1 -0
  45. package/docs/example-prompts.md +124 -0
  46. package/docs/ja-JP/README.md +467 -0
  47. package/docs/ko-KR/README.md +467 -0
  48. package/docs/project-structure.md +119 -0
  49. package/docs/runtimes/antigravity.md +10 -0
  50. package/docs/runtimes/augment.md +10 -0
  51. package/docs/runtimes/claude.md +171 -0
  52. package/docs/runtimes/claude.zh-CN.md +169 -0
  53. package/docs/runtimes/cline.md +10 -0
  54. package/docs/runtimes/codebuddy.md +10 -0
  55. package/docs/runtimes/codex.md +10 -0
  56. package/docs/runtimes/copilot.md +10 -0
  57. package/docs/runtimes/cursor.md +10 -0
  58. package/docs/runtimes/gemini.md +10 -0
  59. package/docs/runtimes/kilo.md +10 -0
  60. package/docs/runtimes/openclaw.md +10 -0
  61. package/docs/runtimes/opencode.md +10 -0
  62. package/docs/runtimes/qoder.md +19 -0
  63. package/docs/runtimes/trae.md +10 -0
  64. package/docs/runtimes/windsurf.md +10 -0
  65. package/docs/superpowers/plans/2026-05-29-fec-debug.md +491 -0
  66. package/docs/superpowers/specs/2026-05-29-fec-debug-design.md +340 -0
  67. package/docs/zh-CN/example-prompts.md +124 -0
  68. package/docs/zh-CN/project-structure.md +119 -0
  69. package/docs/zh-TW/README.md +467 -0
  70. package/hooks/hooks.json +71 -0
  71. package/openclaw.plugin.json +26 -0
  72. package/package.json +101 -0
  73. package/skills/TEMPLATE.md +155 -0
  74. package/skills/eval_queries.json +890 -0
  75. package/skills/fec-accessibility-check/SKILL.md +39 -0
  76. package/skills/fec-accessibility-check/references/report-template.md +23 -0
  77. package/skills/fec-accessibility-check/references/screen-reader-testing.md +33 -0
  78. package/skills/fec-api-integration/SKILL.md +78 -0
  79. package/skills/fec-api-integration/references/integration-patterns.md +80 -0
  80. package/skills/fec-browser-storage/SKILL.md +34 -0
  81. package/skills/fec-browser-storage/references/storage-patterns.md +65 -0
  82. package/skills/fec-canvas-threejs/SKILL.md +66 -0
  83. package/skills/fec-canvas-threejs/references/rendering-patterns.md +67 -0
  84. package/skills/fec-canvas-threejs/references/shader-webgl-patterns.md +67 -0
  85. package/skills/fec-code-review/SKILL.md +135 -0
  86. package/skills/fec-code-review/references/report-template.md +29 -0
  87. package/skills/fec-component-testing/SKILL.md +119 -0
  88. package/skills/fec-data-fetching/SKILL.md +62 -0
  89. package/skills/fec-data-fetching/references/query-patterns.md +77 -0
  90. package/skills/fec-debug-framework/SKILL.md +162 -0
  91. package/skills/fec-dependency-upgrade/SKILL.md +34 -0
  92. package/skills/fec-dependency-upgrade/references/dependency-upgrade-workflow.md +56 -0
  93. package/skills/fec-doc-sync/SKILL.md +37 -0
  94. package/skills/fec-e2e-testing/SKILL.md +40 -0
  95. package/skills/fec-e2e-testing/references/e2e-advanced.md +176 -0
  96. package/skills/fec-e2e-testing/references/playwright-patterns.md +95 -0
  97. package/skills/fec-form-handling/SKILL.md +76 -0
  98. package/skills/fec-form-handling/references/advanced-form-patterns.md +72 -0
  99. package/skills/fec-implement-from-design/SKILL.md +122 -0
  100. package/skills/fec-implement-from-design/references/design-plan-template.md +36 -0
  101. package/skills/fec-legacy-to-modern-migration/SKILL.md +180 -0
  102. package/skills/fec-legacy-to-modern-migration/references/migration-report-template.md +41 -0
  103. package/skills/fec-legacy-web-standard/SKILL.md +35 -0
  104. package/skills/fec-legacy-web-standard/references/legacy-patterns.md +85 -0
  105. package/skills/fec-list-virtualization/SKILL.md +34 -0
  106. package/skills/fec-list-virtualization/references/virtualization-patterns.md +52 -0
  107. package/skills/fec-monorepo-project-standard/SKILL.md +142 -0
  108. package/skills/fec-motion-interaction/SKILL.md +66 -0
  109. package/skills/fec-motion-interaction/references/motion-patterns.md +112 -0
  110. package/skills/fec-nextjs-project-standard/SKILL.md +117 -0
  111. package/skills/fec-nuxt-project-standard/SKILL.md +122 -0
  112. package/skills/fec-performance-optimization/SKILL.md +72 -0
  113. package/skills/fec-pwa-implementation/SKILL.md +36 -0
  114. package/skills/fec-pwa-implementation/references/manifest-and-icons.md +53 -0
  115. package/skills/fec-pwa-implementation/references/service-worker-workbox.md +68 -0
  116. package/skills/fec-react-project-standard/SKILL.md +83 -0
  117. package/skills/fec-react-project-standard/references/react-project-details.md +642 -0
  118. package/skills/fec-refactor-clean/SKILL.md +48 -0
  119. package/skills/fec-responsive-layout/SKILL.md +34 -0
  120. package/skills/fec-responsive-layout/references/responsive-layout-patterns.md +59 -0
  121. package/skills/fec-route-protection/SKILL.md +135 -0
  122. package/skills/fec-security-review/SKILL.md +38 -0
  123. package/skills/fec-security-review/references/report-template.md +27 -0
  124. package/skills/fec-security-review/references/security-checklist.md +64 -0
  125. package/skills/fec-source-driven-development/SKILL.md +61 -0
  126. package/skills/fec-state-management/SKILL.md +140 -0
  127. package/skills/fec-state-management/references/state-patterns.md +109 -0
  128. package/skills/fec-storybook-component-doc/SKILL.md +37 -0
  129. package/skills/fec-storybook-component-doc/references/story-patterns.md +118 -0
  130. package/skills/fec-svg-animation/SKILL.md +148 -0
  131. package/skills/fec-tailwind-design-system/SKILL.md +34 -0
  132. package/skills/fec-tailwind-design-system/references/tailwind-system-patterns.md +55 -0
  133. package/skills/fec-tdd-workflow/SKILL.md +52 -0
  134. package/skills/fec-testing-strategy/SKILL.md +45 -0
  135. package/skills/fec-typescript-type-safety/SKILL.md +157 -0
  136. package/skills/fec-typescript-type-safety/references/type-safety-patterns.md +102 -0
  137. package/skills/fec-ui-design/SKILL.md +90 -0
  138. package/skills/fec-ui-design/data/product-rules.json +110 -0
  139. package/skills/fec-ui-design/data/stack-ui-rules.json +14 -0
  140. package/skills/fec-ui-design/data/style-archetypes.json +74 -0
  141. package/skills/fec-ui-design/data/ux-quality-rules.json +56 -0
  142. package/skills/fec-ui-design/references/design-intelligence.md +37 -0
  143. package/skills/fec-ui-design/references/master-page-overrides.md +30 -0
  144. package/skills/fec-ui-design/references/pre-delivery-checklist.md +33 -0
  145. package/skills/fec-ui-design/scripts/design-system.mjs +530 -0
  146. package/skills/fec-validation-fix/SKILL.md +48 -0
  147. package/skills/fec-vite-project-standard/SKILL.md +83 -0
  148. package/skills/fec-vue3-project-standard/SKILL.md +49 -0
  149. package/skills/fec-vue3-project-standard/references/vue3-project-details.md +547 -0
  150. package/skills/fec-web-workers/SKILL.md +36 -0
  151. package/skills/fec-web-workers/references/advanced-workers.md +54 -0
  152. package/skills/fec-web-workers/references/basic-worker.md +67 -0
  153. package/skills/metadata.json +1422 -0
  154. package/skills/relations.json +644 -0
  155. package/templates/claude/CLAUDE.md +106 -0
  156. package/templates/claude/settings.json +62 -0
  157. package/templates/codex/AGENTS.md +105 -0
  158. package/templates/codex/config.toml +32 -0
  159. package/templates/openclaw/AGENTS.md +101 -0
  160. package/templates/openclaw/OPENCLAW-CONFIG.md +12 -0
  161. package/templates/shared/rules/fec-agent-workflow.md +54 -0
  162. package/templates/shared/rules/fec-api-layer.md +99 -0
  163. package/templates/shared/rules/fec-ci-cd.md +128 -0
  164. package/templates/shared/rules/fec-code-comments.md +33 -0
  165. package/templates/shared/rules/fec-design-system.md +248 -0
  166. package/templates/shared/rules/fec-error-handling.md +200 -0
  167. package/templates/shared/rules/fec-git-conventions.md +73 -0
  168. package/templates/shared/rules/fec-i18n.md +112 -0
  169. package/templates/shared/rules/fec-naming-conventions.md +120 -0
  170. package/templates/shared/rules/fec-performance.md +101 -0
  171. package/templates/shared/rules/fec-react.md +82 -0
  172. package/templates/shared/rules/fec-refactoring.md +43 -0
  173. package/templates/shared/rules/fec-rendering-patterns.md +183 -0
  174. package/templates/shared/rules/fec-responsive-design.md +227 -0
  175. package/templates/shared/rules/fec-source-driven-development.md +31 -0
  176. package/templates/shared/rules/fec-state-management.md +163 -0
  177. package/templates/shared/rules/fec-testing.md +98 -0
  178. package/templates/shared/rules/fec-typescript.md +355 -0
  179. package/templates/shared/rules/fec-vue.md +64 -0
  180. package/templates/shared/rules/fec-working-modes.md +50 -0
@@ -0,0 +1,262 @@
1
+ # frontend-craft
2
+
3
+ [![Stars](https://img.shields.io/github/stars/bovinphang/frontend-craft?style=flat)](https://github.com/bovinphang/frontend-craft/stargazers)
4
+ [![CI](https://github.com/bovinphang/frontend-craft/actions/workflows/ci.yml/badge.svg)](https://github.com/bovinphang/frontend-craft/actions/workflows/ci.yml)
5
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
6
+ ![TypeScript](https://img.shields.io/badge/-TypeScript-3178C6?logo=typescript&logoColor=white)
7
+ ![Node](https://img.shields.io/badge/-Node.js-339933?logo=node.js&logoColor=white)
8
+
9
+ ---
10
+
11
+ <div align="center">
12
+
13
+ **Language / 语言**
14
+
15
+ [**English**](README.md) | [简体中文](README.zh-CN.md)
16
+
17
+ </div>
18
+
19
+ ---
20
+
21
+ **An OpenClaw native plugin build for frontend-craft.**
22
+
23
+ `frontend-craft` ships the OpenClaw-native package for [frontend-craft](https://github.com/bovinphang/frontend-craft): workflow skills, markdown commands, OpenClaw workspace templates, typed hooks, a design MCP reference, and the optional `frontend_craft_init_workspace` tool.
24
+
25
+ **Requirements:** Node.js **>= 22**, OpenClaw plugin API **>= 2026.4.20**.
26
+
27
+ ---
28
+
29
+ ## Quick Start
30
+
31
+ ### 1. Install
32
+
33
+ From ClawHub (recommended when published there):
34
+
35
+ ```bash
36
+ openclaw plugins install clawhub:frontend-craft
37
+ ```
38
+
39
+ From npm:
40
+
41
+ ```bash
42
+ openclaw plugins install frontend-craft
43
+ ```
44
+
45
+ From a local tarball built from the main repository:
46
+
47
+ ```bash
48
+ npm install
49
+ npm run pack:openclaw
50
+ openclaw plugins install ./frontend-craft-<version>.tgz
51
+ ```
52
+
53
+ For local development, link the package directory:
54
+
55
+ ```bash
56
+ openclaw plugins install -l /path/to/frontend-craft/npm-packages/openclaw
57
+ ```
58
+
59
+ ### 2. Enable The Plugin
60
+
61
+ The npm package name and plugin id are both `frontend-craft`.
62
+
63
+ ```json5
64
+ {
65
+ plugins: {
66
+ allow: ["frontend-craft"],
67
+ entries: {
68
+ "frontend-craft": {
69
+ enabled: true,
70
+ config: {
71
+ // Optional, see openclaw.plugin.json:
72
+ // formatAfterWrite: true,
73
+ // notifyOnAgentEnd: true,
74
+ },
75
+ },
76
+ },
77
+ },
78
+ }
79
+ ```
80
+
81
+ Restart the gateway after changing plugin configuration:
82
+
83
+ ```bash
84
+ openclaw gateway restart
85
+ openclaw plugins inspect frontend-craft
86
+ ```
87
+
88
+ ### 3. Initialize An OpenClaw Workspace
89
+
90
+ OpenClaw loads agent context from the agent workspace, often `~/.openclaw/workspace`. Use the optional `frontend_craft_init_workspace` tool with:
91
+
92
+ - `workspaceDir`: absolute path to the workspace root
93
+ - `overwriteAgents`: `true` only when replacing an existing `AGENTS.md`
94
+
95
+ The tool copies:
96
+
97
+ - `templates/openclaw/AGENTS.md` -> workspace `AGENTS.md`
98
+ - `templates/shared/rules/*.md` -> workspace `skills/frontend-craft-rules/`
99
+
100
+ You can also copy those files manually. See `templates/openclaw/OPENCLAW-CONFIG.md` for OpenClaw configuration notes.
101
+
102
+ ### 4. Configure Design MCP Servers
103
+
104
+ The bundled `.mcp.json` is a reference for Figma, Sketch, MasterGo, Pixso, and Modao. Native OpenClaw plugins do not automatically merge MCP config, so copy the `mcpServers` block into your embedded Pi / gateway MCP configuration.
105
+
106
+ Common environment variables:
107
+
108
+ | Variable | Tool |
109
+ | ---------------- | --------------- |
110
+ | `FIGMA_API_KEY` | Figma / Desktop |
111
+ | `SKETCH_API_KEY` | Sketch |
112
+ | `MG_MCP_TOKEN` | MasterGo |
113
+ | `MODAO_TOKEN` | Modao |
114
+
115
+ Pixso uses the local MCP URL shown in `.mcp.json`. MockingBot has no MCP integration; use screenshots or exported specs.
116
+
117
+ ---
118
+
119
+ ## Package Layout
120
+
121
+ ```text
122
+ frontend-craft/
123
+ |-- dist/ # Bundled OpenClaw plugin entry
124
+ |-- skills/ # Workflow skills
125
+ |-- commands/ # Markdown command specs loaded as skills
126
+ |-- templates/openclaw/ # OpenClaw AGENTS.md and config notes
127
+ |-- templates/shared/ # Shared frontend rules
128
+ |-- .mcp.json # Design MCP reference
129
+ |-- openclaw.plugin.json # Plugin metadata and config schema
130
+ |-- package.json
131
+ ```
132
+
133
+ ---
134
+
135
+ ## Features
136
+
137
+ ### Skills
138
+
139
+ | Skill | Purpose |
140
+ | -------------------------------- | ------------------------------------------------------------------------------------ |
141
+ | `fec-code-review` | Architecture, type safety, rendering, styles, accessibility, tests, security |
142
+ | `fec-security-review` | XSS, CSRF, sensitive data leakage, unsafe input handling |
143
+ | `fec-accessibility-check` | WCAG-oriented semantic structure, keyboard support, focus, labels |
144
+ | `fec-react-project-standard` | React + TypeScript project standards |
145
+ | `fec-vue3-project-standard` | Vue 3 + TypeScript project standards |
146
+ | `fec-implement-from-design` | Implement UI from Figma, Sketch, MasterGo, Pixso, Modao, or screenshots |
147
+ | `fec-validation-fix` | Run validation commands, diagnose failures, and fix safely |
148
+ | `fec-legacy-web-standard` | JavaScript + jQuery + HTML/CSS legacy frontend standards |
149
+ | `fec-legacy-to-modern-migration` | jQuery / MPA migration strategy to React or Vue + TypeScript |
150
+ | `fec-testing-strategy` | Testing layer selection, risk matrix, and coverage planning |
151
+ | `fec-e2e-testing` | Playwright / Cypress E2E structure, artifacts, CI, and flaky test handling |
152
+ | `fec-nextjs-project-standard` | Next.js App Router, SSR/SSG, routing, metadata, middleware |
153
+ | `fec-nuxt-project-standard` | Nuxt 3 SSR/SSG, composables, routing, middleware |
154
+ | `fec-monorepo-project-standard` | pnpm workspace, Turborepo, Nx structure and task orchestration |
155
+ | `fec-data-fetching` | TanStack Query / server-state fetching, caching, invalidation, optimistic updates |
156
+ | `fec-state-management` | State ownership, store selection, URL/server/form/local state boundaries |
157
+ | `fec-form-handling` | React Hook Form + Zod forms, dynamic fields, uploads, multi-step flows |
158
+ | `fec-tailwind-design-system` | Tailwind tokens, theme extension, variants, class governance, dark mode |
159
+ | `fec-responsive-layout` | Mobile-first layouts, container queries, data-dense responsive UI |
160
+ | `fec-browser-storage` | localStorage/sessionStorage/IndexedDB/Cookies selection and safe client persistence |
161
+ | `fec-route-protection` | Authenticated and permissioned routes for React Router, Next.js, Vue Router, Nuxt |
162
+ | `fec-component-testing` | React Testing Library / Vue Test Utils component tests and regression scenarios |
163
+ | `fec-storybook-component-doc` | Storybook component docs, addons, MDX, interaction and visual test integration |
164
+ | `fec-list-virtualization` | Large-list windowing with react-window / TanStack Virtual and measurement strategies |
165
+ | `fec-pwa-implementation` | Manifest, service worker, offline cache, install prompts, update handling |
166
+ | `fec-web-workers` | Web Worker integration, transferable objects, Comlink, worker pools |
167
+ | `fec-canvas-threejs` | Canvas 2D, Three.js, React Three Fiber, WebGL performance and accessibility |
168
+ | `fec-svg-animation` | SVG animation with CSS, Framer Motion, GSAP, reduced-motion fallbacks |
169
+ | `fec-ui-design` | UI direction, visual identity, polish, states, visual QA |
170
+ | `fec-typescript-type-safety` | Type contracts, DTO mapping, type guards, generics, and type-level checks |
171
+ | `fec-dependency-upgrade` | Dependency upgrades, lockfile review, CVE remediation, migration verification |
172
+ | `fec-vite-project-standard` | Vite config, env safety, HMR, dev proxy, build optimization, library mode |
173
+
174
+ ### Using skills (scenarios & examples)
175
+
176
+ Skills live under `skills/<id>/SKILL.md`. OpenClaw exposes them as plugin skill roots (`openclaw.plugin.json` lists `skills` and `commands`). The harness typically **auto-selects** a workflow when your plain-language request matches a skill’s frontmatter `description`; exact behavior depends on your OpenClaw / agent setup. You do **not** need to know internal skill ids—describe the outcome you want. (Power users may still mention an id if they know it.)
177
+
178
+ This section is a quick OpenClaw-oriented sample, not the full prompt catalog. For complete scenario-based prompts across skills, agents, commands, design workflows, testing, maintenance, and runtime setup, see [docs/example-prompts.md](docs/example-prompts.md).
179
+
180
+ **Tips**
181
+
182
+ - Point to **paths or components** when asking for reviews or refactors.
183
+ - For design-to-code, attach a **Figma link / node id**, **screenshot**, or say which MCP you configured.
184
+ - When lint, typecheck, tests, or build fail, name the **exact commands** you run if they are non-standard.
185
+
186
+ **OpenClaw quick scenarios and example prompts**
187
+
188
+ | Scenario | Skill (reference) | Example prompt (no skill names) |
189
+ | ------------------------------------------ | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
190
+ | PR or branch review before merge | `fec-code-review` | “Please review `src/features/checkout/` before I merge: architecture, types, a11y, and tests. Save a markdown report under `reports/`.” |
191
+ | Focus on XSS, secrets, dangerous DOM | `fec-security-review` | “Audit `src/lib/auth.ts` and anything that renders or stores user-controlled HTML for XSS and secret leaks; list fixes by severity.” |
192
+ | New dialog / form — keyboard & ARIA | `fec-accessibility-check` | “Check `src/components/ConfirmDialog.tsx` for keyboard traps, focus order, labels, and ARIA; suggest concrete fixes.” |
193
+ | Align a React module with team conventions | `fec-react-project-standard` | “We use React 18 and TanStack Query. Review `src/pages/Dashboard/` against solid React + TS patterns and our existing abstractions.” |
194
+ | Align a Vue module with team conventions | `fec-vue3-project-standard` | “Review `src/views/Settings.vue` and its composables for Vue 3 + TS best practices and consistency with the rest of the app.” |
195
+ | Implement from Figma / screenshot | `fec-implement-from-design` | “Implement this screen from Figma node `123:456`: match spacing and design tokens, reuse our `Button`, and note any assumptions.” |
196
+ | CI red or local script failures | `fec-validation-fix` | “`pnpm lint` and `pnpm test` are failing—find the root causes, fix them, and don’t weaken types or skip checks.” |
197
+ | Maintain jQuery / MPA legacy pages | `fec-legacy-web-standard` | “For `public/js/legacy/*.js`, suggest safe refactors and patterns that keep current behavior; we still ship this in production.” |
198
+ | Plan jQuery → React/Vue migration | `fec-legacy-to-modern-migration` | “We have `static/app.js` in jQuery + MPA. Outline a phased migration to React + TypeScript with risks and milestones.” |
199
+ | Plan frontend test coverage | `fec-testing-strategy` | “For this checkout refactor, map risks to static checks, unit/component tests, E2E, visual, a11y, and security coverage before we write tests.” |
200
+ | Add or stabilize E2E | `fec-e2e-testing` | “Add a Playwright smoke test for login; use a clear folder layout and Page Objects, and mention how to run it in CI.” |
201
+ | Next.js App Router feature | `fec-nextjs-project-standard` | “Review `app/(dashboard)/reports/page.tsx` and related server actions for Next.js App Router best practices (data fetching, errors, metadata).” |
202
+ | Nuxt 3 feature or layout | `fec-nuxt-project-standard` | “Review `pages/admin/*.vue` and `composables/useApi.ts` for Nuxt 3 SSR/data/composables conventions.” |
203
+ | Monorepo boundaries and tasks | `fec-monorepo-project-standard` | “`apps/web` depends on `packages/ui`—check package boundaries, workspace config, and Turborepo task graph for issues.” |
204
+ | Server-state data fetching | `fec-data-fetching` | “Review `src/queries/useReports.ts` for TanStack Query patterns: caching keys, invalidation, and optimistic updates.” |
205
+ | State ownership and store selection | `fec-state-management` | “Audit our dashboard state: decide what belongs in URL params, TanStack Query, local state, or the global store, then propose a safe migration.” |
206
+ | Complex form with validation | `fec-form-handling` | “Build a multi-step registration form with Zod validation, file upload, and dynamic conditional fields using React Hook Form.” |
207
+ | Add route guards to an app | `fec-route-protection` | “Secure the `/admin` routes in our React Router app: redirect unauthenticated users and enforce role-based access.” |
208
+ | Write component unit tests | `fec-component-testing` | “Add RTL tests for `src/components/UserCard.tsx`: render, user-event interactions, and snapshot for regression.” |
209
+ | Document a component library | `fec-storybook-component-doc` | “Set up Storybook for `packages/ui/` with MDX docs, accessibility addon, and interaction tests.” |
210
+ | Render thousands of list rows | `fec-list-virtualization` | “Our `ProductList` renders 10k items—virtualize it with react-window or TanStack Virtual and measure scroll performance.” |
211
+ | Add offline support | `fec-pwa-implementation` | “Make this React app a PWA: manifest, service worker, offline cache strategy, and install prompt.” |
212
+ | Heavy computation off main thread | `fec-web-workers` | “Move the image-processing logic to a Web Worker with Comlink to keep the UI responsive.” |
213
+ | Build an interactive 3D scene | `fec-canvas-threejs` | “Add a Three.js product viewer to `src/components/ProductViewer.tsx` with performance and fallback considerations.” |
214
+ | Add SVG motion to a landing page | `fec-svg-animation` | “Animate the hero SVG with Framer Motion, and ensure reduced-motion users get a static fallback.” |
215
+ | Design and polish UI | `fec-ui-design` | “Review `src/components/Dashboard.tsx` for UI direction, visual identity, spacing, states, and motion polish.” |
216
+ | Optimize Vite build config | `fec-vite-project-standard` | “Audit our `vite.config.ts` for HMR, dev proxy, env variable safety, and library mode best practices.” |
217
+
218
+ **Slash commands (markdown under `commands/`)**
219
+
220
+ These are loaded as command specs; use them when you want a **fixed checklist** instead of free-form matching. In chat, describe what you want—the agent can follow the matching command doc without you naming it. The table below lists common OpenClaw examples; the complete command prompt set is in [docs/example-prompts.md](docs/example-prompts.md#power-user-prompts).
221
+
222
+ | Command doc | When to use | Example (plain language) |
223
+ | ----------------- | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
224
+ | `fec-init.md` | Bootstrap **Claude-style** `.claude/` templates in a **project repo** (paths in the doc target `.claude/`). | “Initialize this repo’s `.claude/` with the frontend-craft templates and rules from the plugin; ask before overwriting.” |
225
+ | `fec-review.md` | Guided review + save `reports/code-review-*.md`. | “Review the files changed in my last commit and write a structured markdown report under `reports/`.” |
226
+ | `fec-scaffold.md` | Page / feature / component folder layout. | “Scaffold a new React page `UserDetail` with the usual `src/pages/...` layout and empty `components/` and `hooks/` folders.” |
227
+
228
+ ### Hooks
229
+
230
+ | Hook | Behavior |
231
+ | --------------------- | ------------------------------------------------------------------------------------- |
232
+ | `before_tool_call` | Blocks dangerous shell / exec-style commands |
233
+ | `after_tool_call` | Optionally runs Prettier on write/edit targets (`formatAfterWrite`, default on) |
234
+ | `before_prompt_build` | Prepends a one-time framework and package-manager hint per session |
235
+ | `agent_end` | Emits a completion bell/log line when a run succeeds (`notifyOnAgentEnd`, default on) |
236
+
237
+ ### Plugin Config
238
+
239
+ | Key | Type | Default | Meaning |
240
+ | ------------------ | ------- | ------- | ---------------------------------------------------------- |
241
+ | `formatAfterWrite` | boolean | `true` | Run Prettier after write/edit tool calls |
242
+ | `notifyOnAgentEnd` | boolean | `true` | Emit a completion bell/log line when an agent run succeeds |
243
+
244
+ ---
245
+
246
+ ## Build From Source
247
+
248
+ From the main `frontend-craft` repository:
249
+
250
+ ```bash
251
+ npm install
252
+ npm run typecheck:openclaw
253
+ npm run pack:openclaw
254
+ ```
255
+
256
+ `npm run pack:openclaw` builds and verifies the OpenClaw bundle, refreshes `npm-packages/openclaw`, and writes `frontend-craft-<version>.tgz` to the `npm-packages/openclaw/` directory.
257
+
258
+ ---
259
+
260
+ ## License
261
+
262
+ MIT
@@ -0,0 +1,262 @@
1
+ # frontend-craft
2
+
3
+ [![Stars](https://img.shields.io/github/stars/bovinphang/frontend-craft?style=flat)](https://github.com/bovinphang/frontend-craft/stargazers)
4
+ [![CI](https://github.com/bovinphang/frontend-craft/actions/workflows/ci.yml/badge.svg)](https://github.com/bovinphang/frontend-craft/actions/workflows/ci.yml)
5
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
6
+ ![TypeScript](https://img.shields.io/badge/-TypeScript-3178C6?logo=typescript&logoColor=white)
7
+ ![Node](https://img.shields.io/badge/-Node.js-339933?logo=node.js&logoColor=white)
8
+
9
+ ---
10
+
11
+ <div align="center">
12
+
13
+ **Language / 语言**
14
+
15
+ [English](README.md) | [**简体中文**](README.zh-CN.md)
16
+
17
+ </div>
18
+
19
+ ---
20
+
21
+ **面向 OpenClaw 的 frontend-craft 原生插件包。**
22
+
23
+ `frontend-craft` 是 [frontend-craft](https://github.com/bovinphang/frontend-craft) 的 OpenClaw 原生打包产物,包含工作流技能、Markdown 命令、OpenClaw 工作区模板、typed hooks、设计工具 MCP 参考配置,以及可选的 `frontend_craft_init_workspace` 初始化工具。
24
+
25
+ **环境要求:** Node.js **>= 22**,OpenClaw plugin API **>= 2026.4.20**。
26
+
27
+ ---
28
+
29
+ ## 快速开始
30
+
31
+ ### 1. 安装
32
+
33
+ 从 ClawHub 安装(发布后推荐):
34
+
35
+ ```bash
36
+ openclaw plugins install clawhub:frontend-craft
37
+ ```
38
+
39
+ 从 npm 安装:
40
+
41
+ ```bash
42
+ openclaw plugins install frontend-craft
43
+ ```
44
+
45
+ 从主仓库构建出的本地 tarball 安装:
46
+
47
+ ```bash
48
+ npm install
49
+ npm run pack:openclaw
50
+ openclaw plugins install ./frontend-craft-<version>.tgz
51
+ ```
52
+
53
+ 本地开发时可链接包目录:
54
+
55
+ ```bash
56
+ openclaw plugins install -l /path/to/frontend-craft/npm-packages/openclaw
57
+ ```
58
+
59
+ ### 2. 启用插件
60
+
61
+ npm 包名和 OpenClaw 插件 id 均为 `frontend-craft`。
62
+
63
+ ```json5
64
+ {
65
+ plugins: {
66
+ allow: ["frontend-craft"],
67
+ entries: {
68
+ "frontend-craft": {
69
+ enabled: true,
70
+ config: {
71
+ // 可选,字段见 openclaw.plugin.json:
72
+ // formatAfterWrite: true,
73
+ // notifyOnAgentEnd: true,
74
+ },
75
+ },
76
+ },
77
+ },
78
+ }
79
+ ```
80
+
81
+ 调整插件配置后重启网关:
82
+
83
+ ```bash
84
+ openclaw gateway restart
85
+ openclaw plugins inspect frontend-craft
86
+ ```
87
+
88
+ ### 3. 初始化 OpenClaw 工作区
89
+
90
+ OpenClaw 通常从代理工作区加载上下文,例如 `~/.openclaw/workspace`。可使用可选工具 `frontend_craft_init_workspace`,参数为:
91
+
92
+ - `workspaceDir`:工作区根目录的绝对路径
93
+ - `overwriteAgents`:仅在需要覆盖已有 `AGENTS.md` 时设为 `true`
94
+
95
+ 该工具会复制:
96
+
97
+ - `templates/openclaw/AGENTS.md` -> 工作区 `AGENTS.md`
98
+ - `templates/shared/rules/*.md` -> 工作区 `skills/frontend-craft-rules/`
99
+
100
+ 你也可以手工复制这些文件。OpenClaw 配置说明见 `templates/openclaw/OPENCLAW-CONFIG.md`。
101
+
102
+ ### 4. 配置设计工具 MCP
103
+
104
+ 包内 `.mcp.json` 是 Figma、Sketch、MasterGo、Pixso、墨刀的参考配置。OpenClaw 原生插件不会自动合并 MCP 配置,请将其中的 `mcpServers` 拷贝到 embedded Pi / 网关 MCP 配置中。
105
+
106
+ 常见环境变量:
107
+
108
+ | 变量 | 工具 |
109
+ | ---------------- | --------------- |
110
+ | `FIGMA_API_KEY` | Figma / Desktop |
111
+ | `SKETCH_API_KEY` | Sketch |
112
+ | `MG_MCP_TOKEN` | MasterGo |
113
+ | `MODAO_TOKEN` | 墨刀 |
114
+
115
+ Pixso 使用 `.mcp.json` 中的本地 MCP URL。摹客暂无 MCP 集成,请使用截图或导出标注。
116
+
117
+ ---
118
+
119
+ ## 包结构
120
+
121
+ ```text
122
+ frontend-craft/
123
+ |-- dist/ # 打包后的 OpenClaw 插件入口
124
+ |-- skills/ # 工作流技能
125
+ |-- commands/ # 作为技能加载的 Markdown 命令说明
126
+ |-- templates/openclaw/ # OpenClaw AGENTS.md 与配置说明
127
+ |-- templates/shared/ # 共享前端规则
128
+ |-- .mcp.json # 设计工具 MCP 参考配置
129
+ |-- openclaw.plugin.json # 插件元数据与配置 schema
130
+ |-- package.json
131
+ ```
132
+
133
+ ---
134
+
135
+ ## 功能概览
136
+
137
+ ### 技能
138
+
139
+ | 技能 | 用途 |
140
+ | -------------------------------- | -------------------------------------------------------------- |
141
+ | `fec-code-review` | 架构、类型安全、渲染、样式、可访问性、测试、安全评审 |
142
+ | `fec-security-review` | XSS、CSRF、敏感数据泄露、不安全输入处理 |
143
+ | `fec-accessibility-check` | 面向 WCAG 的语义结构、键盘支持、焦点、标签检查 |
144
+ | `fec-react-project-standard` | React + TypeScript 项目规范 |
145
+ | `fec-vue3-project-standard` | Vue 3 + TypeScript 项目规范 |
146
+ | `fec-implement-from-design` | 基于 Figma、Sketch、MasterGo、Pixso、墨刀或截图实现 UI |
147
+ | `fec-validation-fix` | 执行校验命令、分析失败并安全修复 |
148
+ | `fec-legacy-web-standard` | JavaScript + jQuery + HTML/CSS 传统前端规范 |
149
+ | `fec-legacy-to-modern-migration` | jQuery / MPA 迁移到 React 或 Vue + TypeScript 的策略 |
150
+ | `fec-testing-strategy` | 测试层级选择、风险矩阵与覆盖规划 |
151
+ | `fec-e2e-testing` | Playwright / Cypress E2E 结构、产物、CI 与不稳定用例治理 |
152
+ | `fec-nextjs-project-standard` | Next.js App Router、SSR/SSG、路由、元数据、中间件 |
153
+ | `fec-nuxt-project-standard` | Nuxt 3 SSR/SSG、组合式函数、路由、中间件 |
154
+ | `fec-monorepo-project-standard` | pnpm workspace、Turborepo、Nx 结构与任务编排 |
155
+ | `fec-data-fetching` | TanStack Query / 服务端状态获取、缓存、失效、乐观更新 |
156
+ | `fec-state-management` | 状态归属、store 选型、URL/服务端/表单/本地状态边界 |
157
+ | `fec-form-handling` | React Hook Form + Zod 表单、动态字段、上传、多步流程 |
158
+ | `fec-tailwind-design-system` | Tailwind token、主题扩展、组件变体、class 治理和暗色模式 |
159
+ | `fec-responsive-layout` | 移动优先布局、容器查询、数据密集型响应式界面 |
160
+ | `fec-browser-storage` | localStorage/sessionStorage/IndexedDB/Cookies 选型与安全持久化 |
161
+ | `fec-route-protection` | React Router、Next.js、Vue Router、Nuxt 的权限路由保护 |
162
+ | `fec-component-testing` | RTL / Vue Test Utils 组件测试与回归用例 |
163
+ | `fec-storybook-component-doc` | Storybook 组件文档、Addon、MDX、交互与视觉测试集成 |
164
+ | `fec-list-virtualization` | react-window / TanStack Virtual 大列表虚拟滚动 |
165
+ | `fec-pwa-implementation` | PWA manifest、Service Worker、离线缓存与安装提示 |
166
+ | `fec-web-workers` | Web Worker、Transferable、Comlink、Worker 池 |
167
+ | `fec-canvas-threejs` | Canvas 2D、Three.js、React Three Fiber、WebGL 性能与可访问性 |
168
+ | `fec-svg-animation` | CSS、Framer Motion、GSAP SVG 动画与 reduced-motion 降级 |
169
+ | `fec-ui-design` | UI 方向、视觉识别、界面打磨、状态与视觉 QA |
170
+ | `fec-typescript-type-safety` | 类型契约、DTO 映射、类型守卫、泛型和类型级检查 |
171
+ | `fec-dependency-upgrade` | 依赖升级、lockfile 评审、CVE 修复和迁移验证 |
172
+ | `fec-vite-project-standard` | Vite 配置、环境变量安全、HMR、开发代理、构建优化与库模式 |
173
+
174
+ ### 技能使用:场景与示例
175
+
176
+ 技能定义在 `skills/<id>/SKILL.md`。本插件在 `openclaw.plugin.json` 中将 `skills` 与 `commands` 注册为技能根。运行时一般会按各技能前置元数据里的 **description** 与当前任务做 **自动匹配**;具体行为取决于你的 OpenClaw / Agent 配置。**普通用户不必知道内部技能 id**,用自然语言说明目标即可;熟悉仓库的人若知道 id 也可以显式写出。
177
+
178
+ 本节是面向 OpenClaw 的快速示例,不是完整提示词清单。完整的按场景组织的提示词库覆盖 skills、agents、commands、设计工作流、测试、维护和 runtime 初始化,见 [docs/zh-CN/example-prompts.md](docs/zh-CN/example-prompts.md)。
179
+
180
+ **使用建议**
181
+
182
+ - 评审或重构时尽量带上 **文件路径、目录或组件名**。
183
+ - 设计还原请提供 **Figma 链接 / 节点 id、截图**,或说明已配置的设计 MCP。
184
+ - lint、类型检查、测试或构建失败时,请写明你实际执行的 **命令**(若与常见脚本不一致)。
185
+
186
+ **OpenClaw 快速场景与示例话术**
187
+
188
+ | 场景 | 技能(供查阅) | 示例话术(不出现技能名) |
189
+ | ---------------------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
190
+ | 合并前做 PR / 分支评审 | `fec-code-review` | 「合并前请评审 `src/features/checkout/`:架构、类型、无障碍和测试;把 Markdown 报告写到 `reports/`。」 |
191
+ | 聚焦 XSS、密钥、危险 DOM | `fec-security-review` | 「请审计 `src/lib/auth.ts` 以及所有渲染或存储用户 HTML 的代码,按严重程度列出 XSS 与密钥泄露风险及修复建议。」 |
192
+ | 新弹窗 / 表单 — 键盘与 ARIA | `fec-accessibility-check` | 「检查 `src/components/ConfirmDialog.tsx` 的键盘陷阱、焦点顺序、标签与 ARIA,并给出可落地的修改建议。」 |
193
+ | 对齐 React 工程约定 | `fec-react-project-standard` | 「我们使用 React 18 和 TanStack Query,请对照成熟 React + TS 实践评审 `src/pages/Dashboard/`,并贴合现有抽象。」 |
194
+ | 对齐 Vue 工程约定 | `fec-vue3-project-standard` | 「请评审 `src/views/Settings.vue` 及相关 composables,是否符合 Vue 3 + TS 惯例并与项目其余部分一致。」 |
195
+ | 按设计稿 / 截图实现 UI | `fec-implement-from-design` | 「请按 Figma 节点 `123:456` 实现该界面:间距与设计 Token 对齐,复用现有 `Button`,并说明假设条件。」 |
196
+ | CI 或本地脚本失败 | `fec-validation-fix` | 「`pnpm lint` 和 `pnpm test` 都挂了,请定位根因并修复,不要放宽类型或跳过检查。」 |
197
+ | 维护 jQuery / MPA 老页面 | `fec-legacy-web-standard` | 「`public/js/legacy/*.js` 仍在生产使用,请在保持行为的前提下给出可维护性改进与模式建议。」 |
198
+ | 规划 jQuery → React/Vue 迁移 | `fec-legacy-to-modern-migration` | 「我们有 `static/app.js` 的 jQuery + 多页应用,请输出迁到 React + TypeScript 的分阶段方案、风险与里程碑。」 |
199
+ | 规划前端测试覆盖 | `fec-testing-strategy` | 「这次 checkout 重构先别急着写测试,请把风险映射到静态检查、单元/组件、E2E、视觉、无障碍和安全覆盖。」 |
200
+ | 补充或稳定 E2E | `fec-e2e-testing` | 「请用 Playwright 给登录流程加冒烟用例:目录清晰、使用 Page Object,并说明如何在 CI 里跑。」 |
201
+ | Next.js App Router 功能 | `fec-nextjs-project-standard` | 「请评审 `app/(dashboard)/reports/page.tsx` 及相关 server actions 是否符合 Next.js App Router 最佳实践(数据获取、错误、元数据等)。」 |
202
+ | Nuxt 3 页面或布局 | `fec-nuxt-project-standard` | 「请评审 `pages/admin/*.vue` 与 `composables/useApi.ts` 是否符合 Nuxt 3 的 SSR、数据与组合式用法惯例。」 |
203
+ | Monorepo 边界与任务编排 | `fec-monorepo-project-standard` | 「`apps/web` 依赖 `packages/ui`,请检查包边界、workspace 配置和 Turborepo 任务图是否有问题。」 |
204
+ | 服务端数据获取 | `fec-data-fetching` | 「请评审 `src/queries/useReports.ts` 的 TanStack Query 模式:缓存 key、失效策略和乐观更新。」 |
205
+ | 状态归属与 store 选型 | `fec-state-management` | 「请审计 dashboard 的状态:哪些属于 URL 参数、TanStack Query、本地 state 或全局 store,并给出安全迁移方案。」 |
206
+ | 复杂表单与校验 | `fec-form-handling` | 「用 React Hook Form + Zod 构建多步注册表单,包含文件上传和动态条件字段。」 |
207
+ | 为应用添加路由守卫 | `fec-route-protection` | 「为 React Router 的 `/admin` 路由做权限保护:未登录用户重定向,基于角色控制访问。」 |
208
+ | 编写组件单元测试 | `fec-component-testing` | 「为 `src/components/UserCard.tsx` 编写 RTL 测试:渲染、user-event 交互和快照回归用例。」 |
209
+ | 组件库文档化 | `fec-storybook-component-doc` | 「为 `packages/ui/` 搭建 Storybook:MDX 文档、无障碍 addon 和交互测试。」 |
210
+ | 渲染上万条列表数据 | `fec-list-virtualization` | 「`ProductList` 渲染上万行太卡,请用 react-window 或 TanStack Virtual 做虚拟滚动并测量滚动性能。」 |
211
+ | 添加离线支持 | `fec-pwa-implementation` | 「把这个 React 应用做成 PWA:manifest、Service Worker、离线缓存策略和安装提示。」 |
212
+ | 重计算移出主线程 | `fec-web-workers` | 「把图片处理逻辑移到 Web Worker,用 Comlink 通信,保持 UI 响应。」 |
213
+ | 构建交互式 3D 场景 | `fec-canvas-threejs` | 「在 `src/components/ProductViewer.tsx` 添加 Three.js 产品展示,兼顾性能和降级方案。」 |
214
+ | 为落地页添加 SVG 动效 | `fec-svg-animation` | 「用 Framer Motion 为 hero 区 SVG 添加动画,并为 reduced-motion 用户提供静态降级方案。」 |
215
+ | 设计与打磨 UI | `fec-ui-design` | 「请评审 `src/components/Dashboard.tsx` 的 UI 方向、视觉识别、间距、状态和动效打磨。」 |
216
+ | 优化 Vite 构建配置 | `fec-vite-project-standard` | 「请审计 `vite.config.ts` 的 HMR、开发代理、环境变量安全和库模式最佳实践。」 |
217
+
218
+ **斜杠命令(`commands/` 下的 Markdown)**
219
+
220
+ 作为**固定步骤**的命令说明加载。对话里用自然语言描述要做的事即可,代理可按对应命令文档执行,**无需**说出命令文件名。下表只列出常见 OpenClaw 示例;完整命令提示词见 [docs/zh-CN/example-prompts.md](docs/zh-CN/example-prompts.md#高级用户提示词)。
221
+
222
+ | 命令文档 | 适用时机 | 示例(自然语言) |
223
+ | ----------------- | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
224
+ | `fec-init.md` | 在**业务仓库**里初始化 **Claude 风格** 的 `.claude/` 模板(文档内路径针对 `.claude/`)。 | 「请在本仓库初始化 `.claude/`,按插件提供的模板与规则复制;若已有文件请先问我是否覆盖。」 |
225
+ | `fec-review.md` | 引导式评审并保存 `reports/code-review-*.md`。 | 「请评审我上一次提交里改动的文件,并写一份结构化 Markdown 报告到 `reports/`。」 |
226
+ | `fec-scaffold.md` | 页面 / 功能 / 组件目录脚手架。 | 「请为 React 项目脚手架一个新页面 UserDetail:放在 `src/pages/...`,并带上空的 `components/` 与 `hooks/` 目录。」 |
227
+
228
+ ### Hooks
229
+
230
+ | Hook | 行为 |
231
+ | --------------------- | --------------------------------------------------------------------- |
232
+ | `before_tool_call` | 拦截危险 shell / exec 类命令 |
233
+ | `after_tool_call` | 可选地对 write/edit 目标运行 Prettier(`formatAfterWrite`,默认开启) |
234
+ | `before_prompt_build` | 每个会话追加一次框架与包管理器提示 |
235
+ | `agent_end` | 运行成功时输出完成提示音 / 日志行(`notifyOnAgentEnd`,默认开启) |
236
+
237
+ ### 插件配置
238
+
239
+ | 键 | 类型 | 默认 | 含义 |
240
+ | ------------------ | ------- | ------ | --------------------------------------- |
241
+ | `formatAfterWrite` | boolean | `true` | write/edit 工具调用后运行 Prettier |
242
+ | `notifyOnAgentEnd` | boolean | `true` | agent 运行成功时输出完成提示音 / 日志行 |
243
+
244
+ ---
245
+
246
+ ## 从源码构建
247
+
248
+ 在主 `frontend-craft` 仓库中执行:
249
+
250
+ ```bash
251
+ npm install
252
+ npm run typecheck:openclaw
253
+ npm run pack:openclaw
254
+ ```
255
+
256
+ `npm run pack:openclaw` 会构建并校验 OpenClaw bundle,刷新 `npm-packages/openclaw`,并在 `npm-packages/openclaw/` 目录下写出 `frontend-craft-<version>.tgz`。
257
+
258
+ ---
259
+
260
+ ## License
261
+
262
+ MIT