@draekien/create-d9-app 0.0.5 → 0.0.7
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/README.md +212 -5
- package/dist/index.js +57 -34
- package/package.json +18 -2
- package/templates/base/.agents/skills/hugeicons/SKILL.md +335 -0
- package/templates/base/.agents/skills/hugeicons/references/icon-list-flutter.md +4552 -0
- package/templates/base/.agents/skills/hugeicons/references/icon-list.md +5476 -0
- package/templates/base/.agents/skills/motion/SKILL.md +75 -0
- package/templates/base/.agents/skills/motion/best-practices/base-ui.md +106 -0
- package/templates/base/.agents/skills/motion/best-practices/css-or-motion.md +20 -0
- package/templates/base/.agents/skills/motion/best-practices/index.md +95 -0
- package/templates/base/.agents/skills/motion/best-practices/motion.md +25 -0
- package/templates/base/.agents/skills/motion/best-practices/react.md +102 -0
- package/templates/base/.agents/skills/motion/best-practices/vue.md +37 -0
- package/templates/base/.agents/skills/motion/codex/index.md +95 -0
- package/templates/base/.agents/skills/motion/css-spring/index.md +70 -0
- package/templates/base/.agents/skills/motion/performance-audit/index.md +44 -0
- package/templates/base/.agents/skills/motion/transition-preview/index.md +51 -0
- package/templates/base/.agents/skills/turborepo/SKILL.md +26 -0
- package/templates/base/.agents/skills/upgrade-dependencies/SKILL.md +45 -11
- package/templates/base/.claude/agents/motion-reviewer.md +50 -0
- package/templates/base/.claude/skills/hugeicons/SKILL.md +335 -0
- package/templates/base/.claude/skills/hugeicons/references/icon-list-flutter.md +4552 -0
- package/templates/base/.claude/skills/hugeicons/references/icon-list.md +5476 -0
- package/templates/base/.claude/skills/motion/SKILL.md +75 -0
- package/templates/base/.claude/skills/motion/best-practices/base-ui.md +106 -0
- package/templates/base/.claude/skills/motion/best-practices/css-or-motion.md +20 -0
- package/templates/base/.claude/skills/motion/best-practices/index.md +95 -0
- package/templates/base/.claude/skills/motion/best-practices/motion.md +25 -0
- package/templates/base/.claude/skills/motion/best-practices/react.md +102 -0
- package/templates/base/.claude/skills/motion/best-practices/vue.md +37 -0
- package/templates/base/.claude/skills/motion/codex/index.md +95 -0
- package/templates/base/.claude/skills/motion/css-spring/index.md +70 -0
- package/templates/base/.claude/skills/motion/performance-audit/index.md +44 -0
- package/templates/base/.claude/skills/motion/transition-preview/index.md +51 -0
- package/templates/base/.claude/skills/turborepo/SKILL.md +26 -0
- package/templates/base/.claude/skills/upgrade-dependencies/SKILL.md +45 -11
- package/templates/base/_gitignore +36 -1
- package/templates/base/apps/web/public/favicon.svg +1 -0
- package/templates/base/apps/web/src/router.tsx +3 -1
- package/templates/base/apps/web/src/routes/__root.tsx +4 -1
- package/templates/base/package.json +1 -1
- package/templates/base/skills-lock.json +19 -1
- package/templates/integrations.json +22 -0
- package/templates/optional/motion-cursor-rule/.cursor/rules/motion.mdc +14 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# MotionScore performance audit
|
|
2
|
+
|
|
3
|
+
MotionScore grades every animation by its render-pipeline cost, from S
|
|
4
|
+
(compositor-only, near-zero) down to F (forced synchronous layout every
|
|
5
|
+
frame). Audits follow one written procedure so that a grade means the same
|
|
6
|
+
thing wherever it is produced.
|
|
7
|
+
|
|
8
|
+
## Fetch the methodology first
|
|
9
|
+
|
|
10
|
+
The full procedure — discovery patterns, the tier reference, per-property
|
|
11
|
+
tables, anti-pattern detection and the report format — is Motion+ content,
|
|
12
|
+
served by the **Motion+** MCP server as a resource:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
resources/read → motion://skills/performance-audit
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Read it in full before any audit and follow it exactly.** Do not audit from
|
|
19
|
+
memory: grades must be reproducible, and the served copy is the only current
|
|
20
|
+
one — it tracks the MotionScore scoring engine as it evolves.
|
|
21
|
+
|
|
22
|
+
## If the read is refused
|
|
23
|
+
|
|
24
|
+
- **Not signed in**: tell the user to sign in to the Motion+ MCP server from
|
|
25
|
+
the editor's MCP settings (in Cursor: Settings, MCP, Motion+, Log in).
|
|
26
|
+
- **Signed in without Motion+**: MotionScore audits are a Motion+
|
|
27
|
+
capability. Say so plainly and mention https://motion.dev/plus once. Do
|
|
28
|
+
not improvise a MotionScore grade from general knowledge.
|
|
29
|
+
|
|
30
|
+
## Runtime audits
|
|
31
|
+
|
|
32
|
+
When the prompt names a URL (a dev server, a deployed page) or asks for a
|
|
33
|
+
"runtime" audit, run:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
npx motionscore <url> --agent
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Static and runtime audits triangulate well: run both and merge findings as
|
|
40
|
+
the methodology describes.
|
|
41
|
+
|
|
42
|
+
After a successful runtime audit, offer once per conversation to save the
|
|
43
|
+
report to the signed-in account, where it builds into MotionScore history and
|
|
44
|
+
trends. Never withhold or trim the report over it.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Transition preview
|
|
2
|
+
|
|
3
|
+
Numbers are a poor way to describe how something feels. When the user is
|
|
4
|
+
iterating on the *feel* of a transition rather than on which property to
|
|
5
|
+
animate, show them the curve instead of describing it.
|
|
6
|
+
|
|
7
|
+
## The visual editor (Motion+)
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
open-transition-editor({ name, property, transition })
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Opens Motion's transition editor inline in the chat: a live preview, the curve,
|
|
14
|
+
and sliders for the values. The user tunes it until it feels right and presses
|
|
15
|
+
Apply, at which point the tuned transition arrives as a new message.
|
|
16
|
+
|
|
17
|
+
- **Pass the transition you actually found in the code**, so the editor opens
|
|
18
|
+
where the user already is rather than at a default.
|
|
19
|
+
- **name** labels the editor, e.g. `"Card hover"`.
|
|
20
|
+
- **property** drives the preview, e.g. `"transform"`, `"opacity"`.
|
|
21
|
+
- When Apply comes back, **write those exact values into the source.** Do not
|
|
22
|
+
re-derive or round them; the user chose them by eye.
|
|
23
|
+
|
|
24
|
+
This is a Motion+ benefit, and it needs a host that renders MCP Apps (Cursor
|
|
25
|
+
2.6 and later). In any other host the same call returns the transition as text
|
|
26
|
+
and nothing renders, which is a usable answer but not a preview — so prefer the
|
|
27
|
+
text route below when you know the host cannot show it.
|
|
28
|
+
|
|
29
|
+
## Without the editor
|
|
30
|
+
|
|
31
|
+
`generate-css-easing` returns the same curves as text, and a CSS `linear()` or
|
|
32
|
+
`cubic-bezier()` in the file is something the user can look at in their own
|
|
33
|
+
browser immediately. See [css-spring/index.md](../css-spring/index.md).
|
|
34
|
+
|
|
35
|
+
For named easings, the cubic-bezier control points are:
|
|
36
|
+
|
|
37
|
+
| Name | Control points |
|
|
38
|
+
| ----------- | ----------------------- |
|
|
39
|
+
| `ease` | `0.25, 0.1, 0.25, 1` |
|
|
40
|
+
| `easeIn` | `0.42, 0, 1, 1` |
|
|
41
|
+
| `easeOut` | `0, 0, 0.58, 1` |
|
|
42
|
+
| `easeInOut` | `0.42, 0, 0.58, 1` |
|
|
43
|
+
|
|
44
|
+
## Rendered curve images
|
|
45
|
+
|
|
46
|
+
The Motion AI Kit additionally ships `visualise-spring` and
|
|
47
|
+
`visualise-cubic-bezier`, which render a curve as a PNG for hosts that display
|
|
48
|
+
images inline. They are not part of this plugin. If the user asks for a curve
|
|
49
|
+
*image* specifically, point them at https://motion.dev/docs/ai-kit; otherwise
|
|
50
|
+
use the editor or the text curve above, which are better answers anyway because
|
|
51
|
+
they end with something in the file.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: turborepo
|
|
3
|
+
description: Configure and troubleshoot Turborepo repositories. Use when working with turbo.json, task pipelines, caching, Remote Cache, the turbo CLI, filtering, environment variables, package boundaries, monorepo structure, or CI workflows.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Turborepo
|
|
7
|
+
|
|
8
|
+
The complete Turborepo documentation ships inside the installed `turbo` package. Do not rely on this skill for framework guidance. Always read the bundled docs, which match the installed version exactly.
|
|
9
|
+
|
|
10
|
+
Start with:
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
node_modules/turbo/docs/README.md
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Use that task index to choose the smallest relevant documentation page. Read it before changing Turborepo configuration, package scripts, or CI workflows.
|
|
17
|
+
|
|
18
|
+
If the package manager uses a non-flat `node_modules` layout or a workspace link, resolve the package location first:
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
node -p "require.resolve('turbo/package.json')"
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Then read `docs/README.md` relative to the resolved package directory.
|
|
25
|
+
|
|
26
|
+
If `turbo` is not installed, inspect the repository's package manager and existing version constraints before adding it. After installation, use the bundled docs rather than guidance for a different release.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: upgrade-dependencies
|
|
3
3
|
description: Upgrades outdated patch and minor dependency pins in a pnpm, npm, yarn or bun workspace to exact versions, holds major upgrades until the developer confirms each one, runs build, check, typecheck and test, and reports every change. Applies when asked to "upgrade dependencies", "update packages", "bump versions", "update deps", or "confirm major upgrades".
|
|
4
4
|
argument-hint: "[--accept]"
|
|
5
|
-
allowed-tools: Bash(npm view *), Bash(gh release view *), Bash(gh api *), Bash(pnpm *), Bash(npm *), Bash(yarn *), Bash(bun *), Bash(git diff *), Bash(git status *)
|
|
5
|
+
allowed-tools: Bash(npm view *), Bash(node *), Bash(gh release view *), Bash(gh api *), Bash(pnpm *), Bash(npm *), Bash(yarn *), Bash(bun *), Bash(git diff *), Bash(git status *)
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Upgrade dependencies
|
|
@@ -15,17 +15,48 @@ Apply patch and minor upgrades without per-package confirmation. Apply a major o
|
|
|
15
15
|
|
|
16
16
|
- Package manager: root `package.json` field `packageManager` (`pnpm@11.25.0` means `pnpm`). Call it `<pm>` below.
|
|
17
17
|
- Manifests: root `package.json`, `apps/*/package.json`, `packages/*/package.json`.
|
|
18
|
-
- Pins: entries in `dependencies`, `devDependencies`, `optionalDependencies`. Skip `workspace
|
|
19
|
-
-
|
|
18
|
+
- Pins: entries in `dependencies`, `devDependencies`, `optionalDependencies`. Skip `catalog:`, `workspace:`, `link:`, `file:`, `git`, `npm:` alias and URL specs; record each skipped entry for the report.
|
|
19
|
+
- Non-exact pins (`^7.1.0`, `~7.1.0`, `>=7`, `*`, `latest`): the old version is `version` in `node_modules/<pkg>/package.json`, searched from the manifest's directory up to the root. Run `<pm> install` first if it is missing. Step 5 writes every such pin as an exact version, the new version if upgraded, else the old version.
|
|
20
|
+
- A package pinned in several manifests is one upgrade: one entry in every list, every pin set to the same new version, applied, held or reverted together. If the pins differ, the old version is the lowest.
|
|
21
|
+
- Minimum age in minutes: `minimumReleaseAge` in `pnpm-workspace.yaml`; if unset, `1440`. pnpm reads no other source in the workspace: `.npmrc` holds only auth and registry settings, and the `pnpm` field of `package.json` is ignored.
|
|
20
22
|
|
|
21
23
|
## 2. Find upgrades
|
|
22
24
|
|
|
23
|
-
Run once per distinct package name:
|
|
25
|
+
Run once per distinct package name, with the old version and the minimum age:
|
|
24
26
|
|
|
25
27
|
```sh
|
|
26
|
-
npm view <pkg> versions time --json
|
|
28
|
+
npm view <pkg> versions time dist-tags --json | node -e '
|
|
29
|
+
const [pin, minAge] = process.argv.slice(1)
|
|
30
|
+
const { versions, time, "dist-tags": tags } = JSON.parse(require("fs").readFileSync(0, "utf8"))
|
|
31
|
+
const parse = (v) => v.split(".").map(Number)
|
|
32
|
+
const line = ([a, b, c]) => (a ? [a] : b ? [0, b] : [0, 0, c]).join(".")
|
|
33
|
+
const newer = (a, b) => { const i = a.findIndex((n, j) => n !== b[j]); return i >= 0 && a[i] > b[i] }
|
|
34
|
+
const cutoff = Date.now() - minAge * 60000
|
|
35
|
+
const latest = parse(tags.latest)
|
|
36
|
+
const old = parse(pin)
|
|
37
|
+
let upgrade = null
|
|
38
|
+
let major = null
|
|
39
|
+
for (const v of [versions].flat()) {
|
|
40
|
+
if (v.includes("-") || Date.parse(time[v]) > cutoff) continue
|
|
41
|
+
const p = parse(v)
|
|
42
|
+
if (newer(p, latest) || !newer(p, old)) continue
|
|
43
|
+
if (line(p) === line(old)) {
|
|
44
|
+
if (!upgrade || newer(p, parse(upgrade))) upgrade = v
|
|
45
|
+
} else if (!major || newer(p, parse(major))) major = v
|
|
46
|
+
}
|
|
47
|
+
const type = upgrade && (parse(upgrade)[1] !== old[1] ? "minor" : "patch")
|
|
48
|
+
console.log(JSON.stringify({ upgrade, type, major }))
|
|
49
|
+
' <old-version> <minimum-age>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{"upgrade":"5.9.3","type":"patch","major":"7.0.2"}
|
|
27
54
|
```
|
|
28
55
|
|
|
56
|
+
`upgrade` is the patch or minor to apply, `major` the pending major; `null` means none. The snippet applies the rules below. Use it unchanged.
|
|
57
|
+
|
|
58
|
+
`npm view <pkg> versions time dist-tags --json` returns:
|
|
59
|
+
|
|
29
60
|
```json
|
|
30
61
|
{
|
|
31
62
|
"versions": ["5.9.2", "5.9.3", "6.0.0-beta", "6.0.2", "6.0.3"],
|
|
@@ -36,20 +67,21 @@ npm view <pkg> versions time --json
|
|
|
36
67
|
"6.0.0-beta": "2026-02-11T18:26:37.557Z",
|
|
37
68
|
"6.0.2": "2026-03-23T16:14:45.521Z",
|
|
38
69
|
"6.0.3": "2026-04-16T23:38:27.905Z"
|
|
39
|
-
}
|
|
70
|
+
},
|
|
71
|
+
"dist-tags": { "latest": "6.0.2", "next": "6.0.3" }
|
|
40
72
|
}
|
|
41
73
|
```
|
|
42
74
|
|
|
43
75
|
A package with one version returns `versions` as a string, not an array.
|
|
44
76
|
|
|
45
|
-
Candidates: versions without a `-` prerelease suffix, with `time[version]` at least the minimum age before now.
|
|
77
|
+
Candidates: versions without a `-` prerelease suffix, at or below `dist-tags.latest`, with `time[version]` at least the minimum age before now. In the example, `6.0.3` is not a candidate: it is above `latest`. Now is the system clock; `time` values are UTC.
|
|
46
78
|
|
|
47
79
|
- Same major as the pin, newer than the pin: take the highest. Type is `minor` if the minor differs, else `patch`.
|
|
48
80
|
- Higher major exists: record the highest eligible version as a pending major. Do not apply it before step 7.
|
|
49
81
|
- No candidate newer than the pin: current.
|
|
50
82
|
- A 0.x pin is compared by its first non-zero segment: 0.13 to 0.14 is a major, 0.13.0 to 0.13.1 is a patch.
|
|
51
83
|
|
|
52
|
-
A pin is current when it has no eligible patch or minor. If no pin has an eligible patch or minor, change no files and skip to step 7. If no major is pending either, report
|
|
84
|
+
A pin is current when it has no eligible patch or minor. If no pin has an eligible patch or minor and every pin is exact, change no files and skip to step 7. If no major is pending either, report as in step 8 and stop.
|
|
53
85
|
|
|
54
86
|
## 3. Read release notes
|
|
55
87
|
|
|
@@ -61,6 +93,7 @@ gh release view v<version> --repo <owner>/<repo> --json body
|
|
|
61
93
|
|
|
62
94
|
- Repository: `npm view <pkg> repository.url`.
|
|
63
95
|
- No GitHub release for the tag: read `CHANGELOG.md` in the repository for the same range.
|
|
96
|
+
- `@types/*` packages publish no GitHub releases and no changelog; record `no release notes`. For `@types/node`, also show the old and new versions against the `engines.node` floor in the root `package.json` and the output of `node -v`, and state that a newer major may type APIs the `engines.node` floor lacks.
|
|
64
97
|
- Record each breaking change, deprecation and migration step per package.
|
|
65
98
|
|
|
66
99
|
## 4. Surface and stop
|
|
@@ -72,7 +105,7 @@ Print one list of patch and minor upgrades: package, old version, new version, t
|
|
|
72
105
|
|
|
73
106
|
## 5. Apply
|
|
74
107
|
|
|
75
|
-
- Set each upgraded pin to the exact new version: no `^`, no `~`, no `latest`.
|
|
108
|
+
- Set each upgraded pin to the exact new version: no `^`, no `~`, no `latest`. Set each non-exact pin that is not upgraded to its exact old version.
|
|
76
109
|
- Run `<pm> install`.
|
|
77
110
|
- Run each project script with `<pm> run <script>` in this order: `build`, `check`, `typecheck`, `test`. Skip a script the root `package.json` does not define.
|
|
78
111
|
|
|
@@ -94,7 +127,7 @@ After the patch and minor list, print each pending major as its own entry: packa
|
|
|
94
127
|
|
|
95
128
|
## 8. Report
|
|
96
129
|
|
|
97
|
-
Print a table of changed packages, including applied majors
|
|
130
|
+
Print a table of changed packages, including applied majors and non-exact pins written as exact. With no changed package, print `all pins current` instead of the table.
|
|
98
131
|
|
|
99
132
|
| Package | Old | New | Type |
|
|
100
133
|
| --- | --- | --- | --- |
|
|
@@ -103,6 +136,7 @@ Print a table of changed packages, including applied majors:
|
|
|
103
136
|
|
|
104
137
|
Below it list:
|
|
105
138
|
|
|
106
|
-
- `held: major`: package, current version, newest eligible major, reason `declined` or `not confirmed`. List it even when every other pin is current
|
|
139
|
+
- `held: major`: package, current version, newest eligible major, reason `declined` or `not confirmed`. List it even when every other pin is current.
|
|
140
|
+
- `skipped`: package, manifest, spec, for every entry step 1 skipped.
|
|
107
141
|
- `held: check failed`: package, old version, attempted version, error text. For a major, the reason is `check failed` with the error text.
|
|
108
142
|
- Migrations applied, with the file changed.
|
|
@@ -1,7 +1,42 @@
|
|
|
1
|
+
# Dependencies
|
|
1
2
|
node_modules
|
|
3
|
+
|
|
4
|
+
# Build output
|
|
2
5
|
dist
|
|
3
|
-
.turbo
|
|
4
6
|
.output
|
|
5
7
|
.nitro
|
|
6
8
|
.tanstack
|
|
9
|
+
.cache
|
|
10
|
+
.vite
|
|
11
|
+
vite.config.ts.timestamp-*
|
|
12
|
+
*.tsbuildinfo
|
|
13
|
+
|
|
14
|
+
# Task cache
|
|
15
|
+
.turbo
|
|
16
|
+
|
|
17
|
+
# Tests
|
|
18
|
+
coverage
|
|
19
|
+
|
|
20
|
+
# Environment
|
|
21
|
+
.env
|
|
22
|
+
.env.*
|
|
23
|
+
!.env.example
|
|
24
|
+
|
|
25
|
+
# Agents
|
|
26
|
+
.claude/settings.local.json
|
|
27
|
+
.claude/worktrees
|
|
28
|
+
|
|
29
|
+
# Deploy
|
|
30
|
+
.vercel
|
|
31
|
+
|
|
32
|
+
# OS and editors
|
|
33
|
+
.DS_Store
|
|
34
|
+
Thumbs.db
|
|
35
|
+
.idea
|
|
36
|
+
.vscode/*
|
|
37
|
+
!.vscode/extensions.json
|
|
38
|
+
!.vscode/settings.json
|
|
39
|
+
|
|
40
|
+
# Logs and keys
|
|
7
41
|
*.log
|
|
42
|
+
*.pem
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><title>App</title><rect width="32" height="32" rx="6" fill="#0f172a"/><text x="16" y="22" text-anchor="middle" font-family="sans-serif" font-size="18" font-weight="700" fill="#f8fafc">d9</text></svg>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { QueryClient } from "@tanstack/react-query"
|
|
2
|
-
import { createRouter } from "@tanstack/react-router"
|
|
2
|
+
import { createRouter, ErrorComponent } from "@tanstack/react-router"
|
|
3
3
|
import { setupRouterSsrQueryIntegration } from "@tanstack/react-router-ssr-query"
|
|
4
4
|
import { routeTree } from "./routeTree.gen.ts"
|
|
5
5
|
|
|
@@ -13,6 +13,8 @@ export function getRouter() {
|
|
|
13
13
|
scrollRestoration: true,
|
|
14
14
|
defaultPreload: "intent",
|
|
15
15
|
defaultPreloadStaleTime: 0,
|
|
16
|
+
defaultErrorComponent: ({ error }) => <ErrorComponent error={error} />,
|
|
17
|
+
defaultNotFoundComponent: () => <p>Not found</p>,
|
|
16
18
|
})
|
|
17
19
|
|
|
18
20
|
setupRouterSsrQueryIntegration({ router, queryClient })
|
|
@@ -10,7 +10,10 @@ export const Route = createRootRouteWithContext<{ queryClient: QueryClient }>()(
|
|
|
10
10
|
{ name: "viewport", content: "width=device-width, initial-scale=1" },
|
|
11
11
|
{ title: "App" },
|
|
12
12
|
],
|
|
13
|
-
links: [
|
|
13
|
+
links: [
|
|
14
|
+
{ rel: "stylesheet", href: appCss },
|
|
15
|
+
{ rel: "icon", type: "image/svg+xml", href: "/favicon.svg" },
|
|
16
|
+
],
|
|
14
17
|
}),
|
|
15
18
|
component: () => (
|
|
16
19
|
<html lang="en">
|
|
@@ -1,11 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 1,
|
|
3
3
|
"skills": {
|
|
4
|
+
"hugeicons": {
|
|
5
|
+
"source": "hugeicons/hugeicons",
|
|
6
|
+
"sourceType": "github",
|
|
7
|
+
"skillPath": "skills/hugeicons/SKILL.md",
|
|
8
|
+
"computedHash": "4e65a89ca4417259b58c4e5c079d83fb977da214028334f504f18af820bbadcf"
|
|
9
|
+
},
|
|
10
|
+
"motion": {
|
|
11
|
+
"source": "motiondivision/ai-kit",
|
|
12
|
+
"sourceType": "github",
|
|
13
|
+
"skillPath": "plugins/motion/skills/motion/SKILL.md",
|
|
14
|
+
"computedHash": "76db0772da8f5056c4dc9433f8f8d691153f83ba4d4db20dfe38e19b5bb76809"
|
|
15
|
+
},
|
|
4
16
|
"shadcn": {
|
|
5
17
|
"source": "shadcn/ui",
|
|
6
18
|
"sourceType": "github",
|
|
7
19
|
"skillPath": "skills/shadcn/SKILL.md",
|
|
8
|
-
"computedHash": "
|
|
20
|
+
"computedHash": "da388f632cd83783c02967446e21941c9ee8291ccb43ba74c23f7d4e9b7c298c"
|
|
21
|
+
},
|
|
22
|
+
"turborepo": {
|
|
23
|
+
"source": "vercel/turborepo",
|
|
24
|
+
"sourceType": "github",
|
|
25
|
+
"skillPath": "skills/turborepo/SKILL.md",
|
|
26
|
+
"computedHash": "9681d8dfeb5e6cdff767f1bcaba5d7ac55732a9d6c02ee120f44229f8ec25e7e"
|
|
9
27
|
}
|
|
10
28
|
}
|
|
11
29
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"shadcn": {
|
|
3
|
+
"kind": "stdio",
|
|
4
|
+
"command": "npx",
|
|
5
|
+
"args": ["shadcn@4.21.4", "mcp"],
|
|
6
|
+
"default": true
|
|
7
|
+
},
|
|
8
|
+
"hugeicons": {
|
|
9
|
+
"kind": "stdio",
|
|
10
|
+
"command": "npx",
|
|
11
|
+
"args": ["-y", "@hugeicons/mcp-server@0.2.2"],
|
|
12
|
+
"default": true
|
|
13
|
+
},
|
|
14
|
+
"motion": { "kind": "http", "url": "https://mcp.motion.dev", "default": true },
|
|
15
|
+
"motion-plus": {
|
|
16
|
+
"kind": "http",
|
|
17
|
+
"url": "https://mcp.motion.dev/plus",
|
|
18
|
+
"login": "Motion+ sign-in",
|
|
19
|
+
"default": false
|
|
20
|
+
},
|
|
21
|
+
"motion-cursor-rule": { "kind": "overlay", "hint": "Cursor only", "default": false }
|
|
22
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Use the Motion skill for animation work, and never import from framer-motion
|
|
3
|
+
globs: ["**/*.{ts,tsx,js,jsx,vue,svelte,astro,css,scss,sass}"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
When a change in this file animates anything — CSS `transition`/`@keyframes`,
|
|
8
|
+
Motion (`motion`, `motion/react`, `motion-v`), a gesture, drag, scroll effect,
|
|
9
|
+
reveal or page transition — use the `motion` skill first. It carries the
|
|
10
|
+
official patterns, the docs search and the performance tiers.
|
|
11
|
+
|
|
12
|
+
Never import from `framer-motion`. The package is `motion` (`motion/react` for
|
|
13
|
+
React, `motion-v` for Vue). If this file still imports `framer-motion`, say so
|
|
14
|
+
and offer to migrate it.
|