@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.
Files changed (44) hide show
  1. package/README.md +212 -5
  2. package/dist/index.js +57 -34
  3. package/package.json +18 -2
  4. package/templates/base/.agents/skills/hugeicons/SKILL.md +335 -0
  5. package/templates/base/.agents/skills/hugeicons/references/icon-list-flutter.md +4552 -0
  6. package/templates/base/.agents/skills/hugeicons/references/icon-list.md +5476 -0
  7. package/templates/base/.agents/skills/motion/SKILL.md +75 -0
  8. package/templates/base/.agents/skills/motion/best-practices/base-ui.md +106 -0
  9. package/templates/base/.agents/skills/motion/best-practices/css-or-motion.md +20 -0
  10. package/templates/base/.agents/skills/motion/best-practices/index.md +95 -0
  11. package/templates/base/.agents/skills/motion/best-practices/motion.md +25 -0
  12. package/templates/base/.agents/skills/motion/best-practices/react.md +102 -0
  13. package/templates/base/.agents/skills/motion/best-practices/vue.md +37 -0
  14. package/templates/base/.agents/skills/motion/codex/index.md +95 -0
  15. package/templates/base/.agents/skills/motion/css-spring/index.md +70 -0
  16. package/templates/base/.agents/skills/motion/performance-audit/index.md +44 -0
  17. package/templates/base/.agents/skills/motion/transition-preview/index.md +51 -0
  18. package/templates/base/.agents/skills/turborepo/SKILL.md +26 -0
  19. package/templates/base/.agents/skills/upgrade-dependencies/SKILL.md +45 -11
  20. package/templates/base/.claude/agents/motion-reviewer.md +50 -0
  21. package/templates/base/.claude/skills/hugeicons/SKILL.md +335 -0
  22. package/templates/base/.claude/skills/hugeicons/references/icon-list-flutter.md +4552 -0
  23. package/templates/base/.claude/skills/hugeicons/references/icon-list.md +5476 -0
  24. package/templates/base/.claude/skills/motion/SKILL.md +75 -0
  25. package/templates/base/.claude/skills/motion/best-practices/base-ui.md +106 -0
  26. package/templates/base/.claude/skills/motion/best-practices/css-or-motion.md +20 -0
  27. package/templates/base/.claude/skills/motion/best-practices/index.md +95 -0
  28. package/templates/base/.claude/skills/motion/best-practices/motion.md +25 -0
  29. package/templates/base/.claude/skills/motion/best-practices/react.md +102 -0
  30. package/templates/base/.claude/skills/motion/best-practices/vue.md +37 -0
  31. package/templates/base/.claude/skills/motion/codex/index.md +95 -0
  32. package/templates/base/.claude/skills/motion/css-spring/index.md +70 -0
  33. package/templates/base/.claude/skills/motion/performance-audit/index.md +44 -0
  34. package/templates/base/.claude/skills/motion/transition-preview/index.md +51 -0
  35. package/templates/base/.claude/skills/turborepo/SKILL.md +26 -0
  36. package/templates/base/.claude/skills/upgrade-dependencies/SKILL.md +45 -11
  37. package/templates/base/_gitignore +36 -1
  38. package/templates/base/apps/web/public/favicon.svg +1 -0
  39. package/templates/base/apps/web/src/router.tsx +3 -1
  40. package/templates/base/apps/web/src/routes/__root.tsx +4 -1
  41. package/templates/base/package.json +1 -1
  42. package/templates/base/skills-lock.json +19 -1
  43. package/templates/integrations.json +22 -0
  44. 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:*`, `link:`, `file:`, `git`, `npm:` alias and URL specs.
19
- - Minimum age in minutes: `minimumReleaseAge` in `pnpm-workspace.yaml` or `.npmrc`; if unset, `1440`.
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 `all pins current` and stop.
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; the no-change report is `all pins current` plus this list.
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: [{ rel: "stylesheet", href: appCss }],
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">
@@ -2,7 +2,7 @@
2
2
  "name": "my-app",
3
3
  "private": true,
4
4
  "type": "module",
5
- "packageManager": "pnpm@12.11.0",
5
+ "packageManager": "pnpm@12.10.1",
6
6
  "engines": {
7
7
  "node": ">=22.18.0"
8
8
  },
@@ -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": "2d7bf36e581289fdcc3ffc592c1ec1d7457572baa72ba0d440229ef34bd7f6dd"
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.