@synopackageland/templates 0.41.5 → 0.42.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 (29) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +9 -7
  3. package/package.json +5 -1
  4. package/templates/_shared/AGENTS.md +11 -11
  5. package/templates/_shared/package.json +3 -2
  6. package/templates/_shared/pnpm-lock.yaml +1636 -0
  7. package/templates/_shared/pnpm-workspace.yaml +2 -0
  8. package/templates/_shared/third-party-notices.mjs +75 -9
  9. package/templates/binary/README.md +3 -3
  10. package/templates/compose/README.md +3 -3
  11. package/templates/native-go/README.md +6 -6
  12. package/templates/native-go-vue/README.md +10 -10
  13. package/templates/native-go-vue/frontend/DESIGN.md +3 -3
  14. package/templates/native-go-vue/frontend/package.json +4 -2
  15. package/templates/native-go-vue/frontend/pnpm-lock.yaml +2269 -0
  16. package/templates/native-go-vue/frontend/pnpm-workspace.yaml +2 -0
  17. package/templates/native-node/README.md +8 -8
  18. package/templates/native-node/backend/app/package.json +2 -1
  19. package/templates/native-node/backend/app/pnpm-workspace.yaml +2 -0
  20. package/templates/native-node/backend/package.json +2 -1
  21. package/templates/native-node/backend/pnpm-lock.yaml +207 -0
  22. package/templates/native-node/dsm-package.yaml +1 -1
  23. package/templates/native-node-vue/README.md +9 -9
  24. package/templates/native-python/README.md +4 -4
  25. package/templates/native-python-vue/README.md +9 -9
  26. package/templates/native-rust/README.md +4 -4
  27. package/templates/native-rust-vue/README.md +9 -9
  28. package/templates/native-go-vue/frontend/package-lock.json +0 -3115
  29. package/templates/native-node/backend/package-lock.json +0 -59
@@ -0,0 +1,2 @@
1
+ allowBuilds:
2
+ esbuild: true
@@ -36,13 +36,13 @@ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real
36
36
  From the project root, install the test tools before running the optional tests:
37
37
 
38
38
  ```sh
39
- npm install --include=dev
40
- npm test
39
+ pnpm install --prod=false
40
+ pnpm test
41
41
  ```
42
42
 
43
43
  `NODE_ENV=production` skips devDependencies; `test:local` needs the CLI.
44
- After committing the generated root lockfile, use `npm ci --include=dev`.
45
- Before `npm run test:local`, prepare the backend and, for Vue, build the
44
+ After committing the generated root lockfile, use `pnpm install --frozen-lockfile --prod=false`.
45
+ Before `pnpm run test:local`, prepare the backend and, for Vue, build the
46
46
  frontend using the steps below and the backend section in `AGENTS.md`, then
47
47
  run `synopkgland ctl generate`.
48
48
 
@@ -51,14 +51,14 @@ run `synopkgland ctl generate`.
51
51
  Needs Node.js 20 or later with `synopkgland` installed. The SPK depends on DSM's **Node.js v20** package (INFO `install_dep_packages`).
52
52
 
53
53
  ```bash
54
- (cd backend && npm ci --include=dev && npm test && npm run build) # method tests, then app/*.js
54
+ (cd backend && pnpm install --frozen-lockfile --prod=false && pnpm test && pnpm run build) # method tests, then app/*.js
55
55
  synopkgland ctl generate
56
56
  synopkgland check
57
57
  synopkgland build # → dist/__PACKAGE__-0.1.0-0001-{x86_64,aarch64}.spk
58
58
  synopkgland inspect dist/__PACKAGE__-0.1.0-0001-x86_64.spk
59
59
  ```
60
60
 
61
- Run `npm run build` in `backend` before every `synopkgland check` or `build`: the SPK ships the compiled `backend/app`.
61
+ Run `pnpm run build` in `backend` before every `synopkgland check` or `build`: the SPK ships the compiled `backend/app`.
62
62
 
63
63
  Install: Package Center → Settings → General → Trust Level "Any publisher",
64
64
  then Manual Install with the SPK for your NAS's CPU. Open
@@ -76,9 +76,9 @@ as and what the backend reports.
76
76
  | `backend/src/routes.ts` | Your methods: `build` registers them | Yes — your backend |
77
77
  | `backend/src/jobs.ts`, `root-ops.ts`, `delegate.ts` | Capability examples (stubs unless `init --with` added them) | Yes |
78
78
  | `backend/src/main.ts` | Runs the App on the runtime's channel | Rarely |
79
- | `backend/app/` | `npm run build` output (`*.js`, ignored by git), `package.json` and `permissions.json`: the directory the SPK ships | No (generated) |
79
+ | `backend/app/` | `pnpm run build` output (`*.js`, ignored by git), `package.json` and `permissions.json`: the directory the SPK ships | No (generated) |
80
80
  | `backend/test/` | node:test tests; `call` plays the runtime | Yes |
81
- | `backend/package.json`, `package-lock.json` | TypeScript (NodeNext) and the Node SDK `@synopackageland/app` from `backend/vendor`, which `synopkgland init` copies from the SDK release | Dependencies |
81
+ | `backend/package.json`, `pnpm-lock.yaml` | TypeScript (NodeNext) and the Node SDK `@synopackageland/app` from `backend/vendor`, which `synopkgland init` copies from the SDK release | Dependencies |
82
82
  | `dist/` | Built SPKs (ignored by git) | No |
83
83
 
84
84
  `build` generates everything else: `INFO`, `conf/privilege`
@@ -1,4 +1,5 @@
1
1
  {
2
2
  "private": true,
3
- "type": "module"
3
+ "type": "module",
4
+ "packageManager": "pnpm@12.18.0"
4
5
  }
@@ -0,0 +1,2 @@
1
+ # Packaged App dependencies must be regular files.
2
+ nodeLinker: hoisted
@@ -13,5 +13,6 @@
13
13
  "devDependencies": {
14
14
  "@types/node": "18.19.130",
15
15
  "typescript": "5.9.3"
16
- }
16
+ },
17
+ "packageManager": "pnpm@12.18.0"
17
18
  }
@@ -0,0 +1,207 @@
1
+ ---
2
+ lockfileVersion: '9.0'
3
+
4
+ importers:
5
+
6
+ .:
7
+ configDependencies: {}
8
+ packageManagerDependencies:
9
+ pnpm:
10
+ specifier: 12.18.0
11
+ version: 12.18.0
12
+
13
+ packages:
14
+
15
+ '@pnpm/exe.android-arm64@12.18.0':
16
+ resolution: {integrity: sha512-fOF6IwgvnUKEmVedGqiAsNPfN2Ry8GvaqzSQOiF3RJFbpBfPKO/6YT54s1GjToyYinRxw9preHHPe4y2N3SzhA==}
17
+ cpu: [arm64]
18
+ os: [android]
19
+
20
+ '@pnpm/exe.android-x64@12.18.0':
21
+ resolution: {integrity: sha512-6OiolnaCsB3/GcJ9XNrenbUH3zFHRJ+5QynrMUUEyThbgnnCzWxa199hpQlOmxN4rAXuYQ0IYgWFNUZxyzg31Q==}
22
+ cpu: [x64]
23
+ os: [android]
24
+
25
+ '@pnpm/exe.darwin-arm64@12.18.0':
26
+ resolution: {integrity: sha512-zkq+4YzVIX39ETYLyC3W7LY7MpHEU/J3nRhHl4i2yPld2Cf2+rEKRh3ejJ4AmaQ77HHJLCktY4Z3jq0fpcxFXg==}
27
+ cpu: [arm64]
28
+ os: [darwin]
29
+
30
+ '@pnpm/exe.darwin-x64@12.18.0':
31
+ resolution: {integrity: sha512-qMsL9qx92unOTa6hgkfiTJv8ceZaTx0IQg7InhYDVX2ZrTECujaVEEVypnJK5m3eGUsP1KD7Y4qIgleCwfRsYw==}
32
+ cpu: [x64]
33
+ os: [darwin]
34
+
35
+ '@pnpm/exe.freebsd-x64@12.18.0':
36
+ resolution: {integrity: sha512-/9vy/4ms52cU4MjZ5NhHd6N2d9L9W0kARf5/ff2tweAHu0VeUzs/0qp/7ZHFuddm2Wa/m0AKQoPum9AVUCqKsw==}
37
+ cpu: [x64]
38
+ os: [freebsd]
39
+
40
+ '@pnpm/exe.linux-arm64-musl@12.18.0':
41
+ resolution: {integrity: sha512-Vp+TIMPPyackVCXkOdEKH/RmAn/r07EcIyrgZYQK7VrkksqZOie0GnWIx+85mPqeFEYCRtXIZAFJ9L4ceTndDg==}
42
+ cpu: [arm64]
43
+ os: [linux]
44
+ libc: [musl]
45
+
46
+ '@pnpm/exe.linux-arm64@12.18.0':
47
+ resolution: {integrity: sha512-2dpyVBCHT+FfpuQh9i+7MXAqNWYLCvD5vYr5p6Eimxoga8USLnjbUgyj72AOrO0hjc5ri3TEFP3jiyBHjkSZpQ==}
48
+ cpu: [arm64]
49
+ os: [linux]
50
+ libc: [glibc]
51
+
52
+ '@pnpm/exe.linux-ppc64@12.18.0':
53
+ resolution: {integrity: sha512-BBOOOfNJ2QwIIya3eKqOjiN4WNTszfRz7HCvw9XggcT7+ftMjNP8XJ/GfW+ltCBeUFR9d8WBVsr2m/NLjX2CZQ==}
54
+ cpu: [ppc64]
55
+ os: [linux]
56
+ libc: [glibc]
57
+
58
+ '@pnpm/exe.linux-riscv64@12.18.0':
59
+ resolution: {integrity: sha512-7kMN77xSOYJX8GPSH5RbNAc5oM61LMmcSUukDDUwllnZPXm8GRPskCNsTWy8SCw01Kr1FB+5SwGNMiTdiziLNQ==}
60
+ cpu: [riscv64]
61
+ os: [linux]
62
+ libc: [glibc]
63
+
64
+ '@pnpm/exe.linux-s390x@12.18.0':
65
+ resolution: {integrity: sha512-htuSCpEcmDzhKoJqXbPkvfr176dBHU0QIF5mWcRiqxRXAB/1JoYiMYotfjWpk+ztgpB9qlx4XnWlLFAf7gzc6g==}
66
+ cpu: [s390x]
67
+ os: [linux]
68
+ libc: [glibc]
69
+
70
+ '@pnpm/exe.linux-x64-musl@12.18.0':
71
+ resolution: {integrity: sha512-Uj+vzfIQ62kDP10x36yHZIXVs5ohdNtiPYwn5FhCLlNScHPo0OAI+ShGDtLofiBXKE7umu71Jmjm7N8a8zVcDw==}
72
+ cpu: [x64]
73
+ os: [linux]
74
+ libc: [musl]
75
+
76
+ '@pnpm/exe.linux-x64@12.18.0':
77
+ resolution: {integrity: sha512-OJ+X2wcraldCwj75pCIerWARQSRpdfj0eBTs/2ODyhfeW46ylOnjTIE/GKra6Mn6E72/gBmXS8igrUioa+F9fQ==}
78
+ cpu: [x64]
79
+ os: [linux]
80
+ libc: [glibc]
81
+
82
+ '@pnpm/exe.win32-arm64@12.18.0':
83
+ resolution: {integrity: sha512-wEY6jiACGcbhhi5yD59doHqNTndS7AaujaPmtWAu1DKkHru2hy5fJ9yUGecW72Ypaw2/I3BEprfMOopap2NQtw==}
84
+ cpu: [arm64]
85
+ os: [win32]
86
+
87
+ '@pnpm/exe.win32-x64@12.18.0':
88
+ resolution: {integrity: sha512-5FJkghO7RLRkQpWxeVEygW9XsmnNuxzPfXbgwFWCHsFyFhpDn/vOdL88ToQEM0Kt5igdW5s6U0/IDH8Dvkt3pg==}
89
+ cpu: [x64]
90
+ os: [win32]
91
+
92
+ pnpm@12.18.0:
93
+ resolution: {integrity: sha512-nXiC1dyCFH7PxOBiqjSDTgrQKWcQoYN6ERWuASEn02txCeMhrBWYod0KZVl2gbHpmRfhLtDXSerpEYeUM2O+sw==}
94
+ engines: {node: '>=18'}
95
+ hasBin: true
96
+
97
+ snapshots:
98
+
99
+ '@pnpm/exe.android-arm64@12.18.0':
100
+ optional: true
101
+
102
+ '@pnpm/exe.android-x64@12.18.0':
103
+ optional: true
104
+
105
+ '@pnpm/exe.darwin-arm64@12.18.0':
106
+ optional: true
107
+
108
+ '@pnpm/exe.darwin-x64@12.18.0':
109
+ optional: true
110
+
111
+ '@pnpm/exe.freebsd-x64@12.18.0':
112
+ optional: true
113
+
114
+ '@pnpm/exe.linux-arm64-musl@12.18.0':
115
+ optional: true
116
+
117
+ '@pnpm/exe.linux-arm64@12.18.0':
118
+ optional: true
119
+
120
+ '@pnpm/exe.linux-ppc64@12.18.0':
121
+ optional: true
122
+
123
+ '@pnpm/exe.linux-riscv64@12.18.0':
124
+ optional: true
125
+
126
+ '@pnpm/exe.linux-s390x@12.18.0':
127
+ optional: true
128
+
129
+ '@pnpm/exe.linux-x64-musl@12.18.0':
130
+ optional: true
131
+
132
+ '@pnpm/exe.linux-x64@12.18.0':
133
+ optional: true
134
+
135
+ '@pnpm/exe.win32-arm64@12.18.0':
136
+ optional: true
137
+
138
+ '@pnpm/exe.win32-x64@12.18.0':
139
+ optional: true
140
+
141
+ pnpm@12.18.0:
142
+ optionalDependencies:
143
+ '@pnpm/exe.android-arm64': 12.18.0
144
+ '@pnpm/exe.android-x64': 12.18.0
145
+ '@pnpm/exe.darwin-arm64': 12.18.0
146
+ '@pnpm/exe.darwin-x64': 12.18.0
147
+ '@pnpm/exe.freebsd-x64': 12.18.0
148
+ '@pnpm/exe.linux-arm64': 12.18.0
149
+ '@pnpm/exe.linux-arm64-musl': 12.18.0
150
+ '@pnpm/exe.linux-ppc64': 12.18.0
151
+ '@pnpm/exe.linux-riscv64': 12.18.0
152
+ '@pnpm/exe.linux-s390x': 12.18.0
153
+ '@pnpm/exe.linux-x64': 12.18.0
154
+ '@pnpm/exe.linux-x64-musl': 12.18.0
155
+ '@pnpm/exe.win32-arm64': 12.18.0
156
+ '@pnpm/exe.win32-x64': 12.18.0
157
+
158
+ ---
159
+ lockfileVersion: '9.0'
160
+
161
+ settings:
162
+ autoInstallPeers: true
163
+ excludeLinksFromLockfile: false
164
+
165
+ importers:
166
+
167
+ .:
168
+ dependencies:
169
+ '@synopackageland/app':
170
+ specifier: file:vendor/@synopackageland/app
171
+ version: file:vendor/@synopackageland/app
172
+ devDependencies:
173
+ '@types/node':
174
+ specifier: 18.19.130
175
+ version: 18.19.130
176
+ typescript:
177
+ specifier: 5.9.3
178
+ version: 5.9.3
179
+
180
+ packages:
181
+
182
+ '@synopackageland/app@file:vendor/@synopackageland/app':
183
+ resolution: {directory: vendor/@synopackageland/app, type: directory}
184
+ engines: {node: '>=22'}
185
+
186
+ '@types/node@18.19.130':
187
+ resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==}
188
+
189
+ typescript@5.9.3:
190
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
191
+ engines: {node: '>=14.17'}
192
+ hasBin: true
193
+
194
+ undici-types@5.26.5:
195
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
196
+
197
+ snapshots:
198
+
199
+ '@synopackageland/app@file:vendor/@synopackageland/app': {}
200
+
201
+ '@types/node@18.19.130':
202
+ dependencies:
203
+ undici-types: 5.26.5
204
+
205
+ typescript@5.9.3: {}
206
+
207
+ undici-types@5.26.5: {}
@@ -42,7 +42,7 @@ arches: [x86_64, aarch64]
42
42
  # and app/permissions.json, then runs `node main.js` in backend/app as the
43
43
  # package account, once per call, with Package Center's Node.js (node.package
44
44
  # becomes an install dependency). backend/src compiles to backend/app: run
45
- # `npm ci --include=dev` and `npm run build` in backend before check and build. sdk is the
45
+ # `pnpm install --frozen-lockfile --prod=false` and `pnpm run build` in backend before check and build. sdk is the
46
46
  # SDK release whose runtime and Node SDK (node_modules/@synopackageland/app)
47
47
  # the build ships; the build reads the methods from `main.js --describe`.
48
48
  backend:
@@ -14,21 +14,21 @@ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real
14
14
  From the project root, install the test tools before running the optional tests:
15
15
 
16
16
  ```sh
17
- npm install --include=dev
18
- npm test
17
+ pnpm install --prod=false
18
+ pnpm test
19
19
  ```
20
20
 
21
21
  `NODE_ENV=production` skips devDependencies; `test:local` needs the CLI.
22
- After committing the generated root lockfile, use `npm ci --include=dev`.
23
- Before `npm run test:local`, prepare the backend and, for Vue, build the
22
+ After committing the generated root lockfile, use `pnpm install --frozen-lockfile --prod=false`.
23
+ Before `pnpm run test:local`, prepare the backend and, for Vue, build the
24
24
  frontend using the steps below and the backend section in `AGENTS.md`, then
25
25
  run `synopkgland ctl generate`.
26
26
 
27
27
  ```sh
28
28
  cd frontend
29
- npm ci --include=dev
30
- npm test
31
- npm run build
29
+ pnpm install --frozen-lockfile --prod=false
30
+ pnpm test
31
+ pnpm run build
32
32
  ```
33
33
 
34
34
  The base app reads package status and edits the package greeting through
@@ -87,5 +87,5 @@ Import `themes/dsm7-embedded.css` and assign each mount a unique
87
87
 
88
88
  Start with AGENTS.md, `synopkgland skill list` and `synopkgland skill path`.
89
89
  Read `synopkgland skill show ui-vue` for direct Vue component work. For UI
90
- discovery, run `npx --no syno-pkg-land-ui catalog --json` and
91
- `npx --no syno-pkg-land-ui describe Button --json` from the installed frontend.
90
+ discovery, run `pnpm exec syno-pkg-land-ui catalog --json` and
91
+ `pnpm exec syno-pkg-land-ui describe Button --json` from the installed frontend.
@@ -36,13 +36,13 @@ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real
36
36
  From the project root, install the test tools before running the optional tests:
37
37
 
38
38
  ```sh
39
- npm install --include=dev
40
- npm test
39
+ pnpm install --prod=false
40
+ pnpm test
41
41
  ```
42
42
 
43
43
  `NODE_ENV=production` skips devDependencies; `test:local` needs the CLI.
44
- After committing the generated root lockfile, use `npm ci --include=dev`.
45
- Before `npm run test:local`, prepare the backend and, for Vue, build the
44
+ After committing the generated root lockfile, use `pnpm install --frozen-lockfile --prod=false`.
45
+ Before `pnpm run test:local`, prepare the backend and, for Vue, build the
46
46
  frontend using the steps below and the backend section in `AGENTS.md`, then
47
47
  run `synopkgland ctl generate`.
48
48
 
@@ -14,21 +14,21 @@ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real
14
14
  From the project root, install the test tools before running the optional tests:
15
15
 
16
16
  ```sh
17
- npm install --include=dev
18
- npm test
17
+ pnpm install --prod=false
18
+ pnpm test
19
19
  ```
20
20
 
21
21
  `NODE_ENV=production` skips devDependencies; `test:local` needs the CLI.
22
- After committing the generated root lockfile, use `npm ci --include=dev`.
23
- Before `npm run test:local`, prepare the backend and, for Vue, build the
22
+ After committing the generated root lockfile, use `pnpm install --frozen-lockfile --prod=false`.
23
+ Before `pnpm run test:local`, prepare the backend and, for Vue, build the
24
24
  frontend using the steps below and the backend section in `AGENTS.md`, then
25
25
  run `synopkgland ctl generate`.
26
26
 
27
27
  ```sh
28
28
  cd frontend
29
- npm ci --include=dev
30
- npm test
31
- npm run build
29
+ pnpm install --frozen-lockfile --prod=false
30
+ pnpm test
31
+ pnpm run build
32
32
  ```
33
33
 
34
34
  The base app reads package status and edits the package greeting through
@@ -87,5 +87,5 @@ Import `themes/dsm7-embedded.css` and assign each mount a unique
87
87
 
88
88
  Start with AGENTS.md, `synopkgland skill list` and `synopkgland skill path`.
89
89
  Read `synopkgland skill show ui-vue` for direct Vue component work. For UI
90
- discovery, run `npx --no syno-pkg-land-ui catalog --json` and
91
- `npx --no syno-pkg-land-ui describe Button --json` from the installed frontend.
90
+ discovery, run `pnpm exec syno-pkg-land-ui catalog --json` and
91
+ `pnpm exec syno-pkg-land-ui describe Button --json` from the installed frontend.
@@ -36,13 +36,13 @@ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real
36
36
  From the project root, install the test tools before running the optional tests:
37
37
 
38
38
  ```sh
39
- npm install --include=dev
40
- npm test
39
+ pnpm install --prod=false
40
+ pnpm test
41
41
  ```
42
42
 
43
43
  `NODE_ENV=production` skips devDependencies; `test:local` needs the CLI.
44
- After committing the generated root lockfile, use `npm ci --include=dev`.
45
- Before `npm run test:local`, prepare the backend and, for Vue, build the
44
+ After committing the generated root lockfile, use `pnpm install --frozen-lockfile --prod=false`.
45
+ Before `pnpm run test:local`, prepare the backend and, for Vue, build the
46
46
  frontend using the steps below and the backend section in `AGENTS.md`, then
47
47
  run `synopkgland ctl generate`.
48
48
 
@@ -14,21 +14,21 @@ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real
14
14
  From the project root, install the test tools before running the optional tests:
15
15
 
16
16
  ```sh
17
- npm install --include=dev
18
- npm test
17
+ pnpm install --prod=false
18
+ pnpm test
19
19
  ```
20
20
 
21
21
  `NODE_ENV=production` skips devDependencies; `test:local` needs the CLI.
22
- After committing the generated root lockfile, use `npm ci --include=dev`.
23
- Before `npm run test:local`, prepare the backend and, for Vue, build the
22
+ After committing the generated root lockfile, use `pnpm install --frozen-lockfile --prod=false`.
23
+ Before `pnpm run test:local`, prepare the backend and, for Vue, build the
24
24
  frontend using the steps below and the backend section in `AGENTS.md`, then
25
25
  run `synopkgland ctl generate`.
26
26
 
27
27
  ```sh
28
28
  cd frontend
29
- npm ci --include=dev
30
- npm test
31
- npm run build
29
+ pnpm install --frozen-lockfile --prod=false
30
+ pnpm test
31
+ pnpm run build
32
32
  ```
33
33
 
34
34
  The base app reads package status and edits the package greeting through
@@ -87,5 +87,5 @@ Import `themes/dsm7-embedded.css` and assign each mount a unique
87
87
 
88
88
  Start with AGENTS.md, `synopkgland skill list` and `synopkgland skill path`.
89
89
  Read `synopkgland skill show ui-vue` for direct Vue component work. For UI
90
- discovery, run `npx --no syno-pkg-land-ui catalog --json` and
91
- `npx --no syno-pkg-land-ui describe Button --json` from the installed frontend.
90
+ discovery, run `pnpm exec syno-pkg-land-ui catalog --json` and
91
+ `pnpm exec syno-pkg-land-ui describe Button --json` from the installed frontend.