@synopackageland/cli 0.41.11 → 0.41.12

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/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.41.12 (2026-10-31)
4
+
5
+ - Remove the delegated WebAPI profile API-name and method-name word lists so
6
+ explicitly declared calls such as `SYNO.MailClient.Setting.SMTP` `list` pass
7
+ CLI profile validation. Keep name formats, exact API/method/version pins,
8
+ approval digests and all other checks, including SDK executor policy validation.
9
+ Pair with SDK/App 0.38.6 (executor/v0.38.6), which removes the matching
10
+ executor name blocklists; templates ~0.35.5 still pin SDK 0.38.2.
11
+
3
12
  ## 0.41.11 (2026-10-30)
4
13
 
5
14
  - Pre-pull inspected Compose image references on the NAS with byte progress, a
package/README.md CHANGED
@@ -88,7 +88,7 @@ alongside npm lockfiles. Do not disable checksum verification for public SDK
88
88
  packages. Private mirrors can use explicitly configured Go authentication and
89
89
  checksum settings; a failed fetch reports `SDK_DOWNLOAD_FAILED`.
90
90
 
91
- CLI 0.41.7 uses templates ~0.35.5, whose default SDK pin is 0.38.2. Compose import and SDK defaults
91
+ CLI 0.41.12 uses templates ~0.35.5, whose default SDK pin is 0.38.2. Compose import and SDK defaults
92
92
  read the SDK pin from the installed templates; explicit App SDK declarations take precedence.
93
93
  Every App method must be declared in the permissions table. Dynamic names and
94
94
  custom HTTP dispatchers are rejected. With SDK 0.33.0, use fixed
@@ -99,7 +99,7 @@ unimported development commands are excluded. Use
99
99
  authentication. See [App entry and registration](docs/app-entry.md).
100
100
 
101
101
  `init` and `add` read their templates from the locally installed
102
- `@synopackageland/templates`. CLI 0.41.7 depends on `~0.35.5`: npm installation or
102
+ `@synopackageland/templates`. CLI 0.41.12 depends on `~0.35.5`: npm installation or
103
103
  update can select the latest templates patch in the 0.35 minor line. Templates
104
104
  patches need only a templates release; update the npm installation to receive them.
105
105
  The CLI never fetches templates at runtime, so offline use works after installation;
@@ -344,9 +344,9 @@ capabilities:
344
344
 
345
345
  Use matching backend/frontend SDK pins. The profile participates in the
346
346
  normal executor approval digest; a profile change needs administrator approval.
347
- Users grant the named profile separately. The permanent denylist, current-user
348
- permission checks, bounded JSON and uncertain-outcome rules are in the SDK's
349
- executor/README.md.
347
+ Users grant the named profile separately. API and method names must have valid
348
+ formats, with each API, method and version listed exactly. Current-user permission
349
+ checks, bounded JSON and uncertain-outcome rules are in the SDK's executor/README.md.
350
350
 
351
351
  ## Raw WebAPI profiles
352
352
 
@@ -1,6 +1,4 @@
1
1
  const record = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
2
- const blocked = new Set(['api', 'entry', 'core', 'auth', 'authentication', 'filestation', 'package', 'packagemanager', 'packagemanagement', 'user', 'users', 'group', 'groups', 'permission', 'permissions', 'privilege', 'privileges', 'owner', 'sharing', 'admin', 'setting', 'settings', 'teamfolder', 'mailplusserver', 'directoryserver', 'taskscheduler', 'eventscheduler', 'request', 'batch', 'compound']);
3
- const methodBlocked = new Set(['auth', 'login', 'logout', 'sudo', 'permission', 'permissions', 'privilege', 'privileges', 'share', 'sharing', 'owner', 'admin']);
4
2
  export function validWebAPIProfiles(value) {
5
3
  if (!record(value) || !Object.keys(value).length || Object.keys(value).length > 32)
6
4
  return false;
@@ -11,10 +9,10 @@ export function validWebAPIProfiles(value) {
11
9
  if (p.raw_max_bytes !== undefined && (!Number.isSafeInteger(p.raw_max_bytes) || Number(p.raw_max_bytes) < 0 || Number(p.raw_max_bytes) > 10737418240))
12
10
  return false;
13
11
  for (const [api, methods] of Object.entries(p.apis)) {
14
- if (!/^SYNO\.[A-Za-z][A-Za-z0-9]*(\.[A-Za-z][A-Za-z0-9]*)*$/.test(api) || api.toLowerCase().split('.').slice(1).some(x => blocked.has(x)) || !record(methods) || !Object.keys(methods).length)
12
+ if (!/^SYNO\.[A-Za-z][A-Za-z0-9]*(\.[A-Za-z][A-Za-z0-9]*)*$/.test(api) || !record(methods) || !Object.keys(methods).length)
15
13
  return false;
16
14
  for (const [method, versions] of Object.entries(methods)) {
17
- if (!/^[a-z][a-z0-9_]{0,63}$/.test(method) || method.split('_').some(x => methodBlocked.has(x)) || !Array.isArray(versions) || !versions.length || new Set(versions).size !== versions.length || versions.some(x => !Number.isSafeInteger(x) || x < 1 || x > 65535))
15
+ if (!/^[a-z][a-z0-9_]{0,63}$/.test(method) || !Array.isArray(versions) || !versions.length || new Set(versions).size !== versions.length || versions.some(x => !Number.isSafeInteger(x) || x < 1 || x > 65535))
18
16
  return false;
19
17
  total += versions.length;
20
18
  if (total > 256)
@@ -1002,7 +1002,7 @@ function readCapabilities(value, c) {
1002
1002
  if (validWebAPIProfiles(setting))
1003
1003
  result.webapi = setting;
1004
1004
  else
1005
- c.fail("CAPABILITY_INVALID", "webapi requires named profiles with purpose and exact safe API/method/version lists.");
1005
+ c.fail("CAPABILITY_INVALID", "webapi requires named profiles with purpose and exact API/method/version lists.");
1006
1006
  }
1007
1007
  else if (name === "delegate") {
1008
1008
  if (validDelegate(setting))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synopackageland/cli",
3
- "version": "0.41.11",
3
+ "version": "0.41.12",
4
4
  "description": "Syno Package Land Developer Kit CLI",
5
5
  "type": "module",
6
6
  "bin": {
package/skills/SKILL.md CHANGED
@@ -26,7 +26,7 @@ Use this guide to initialize, build and inspect own applications or upstream OSS
26
26
 
27
27
  For an existing open-source App, first read [reference/upstream-fork.md](reference/upstream-fork.md): upstream fork/history + untouched upstream files + all packaging in `synology/`, official container images pinned by tag/index digest, native official release binaries pinned by SHA-256 or a source build hook, and a single tag-merge upgrade command. Use `init --upstream-fork`; never rewrite the App as a component. Integrated upstream Apps require direct DSM administrator entry without a separate App password or an OIDC/SSO server: supported trusted headers first, disabling native login second; the shipped OpenList pattern uses the existing SDK 0.17.3 token adapter (`mode: token`, `access: dsm-admins`, `entry: admin-only`) with server-side Authorization injection. All DSM admins share one upstream admin; token reset requires package restart; WebDAV retains its native credentials.
28
28
 
29
- Use SDK/App 0.38.3 and CLI 0.41.7 for App entry enforcement. Declare every App method
29
+ Use SDK/App 0.38.6 and CLI 0.41.12 for App entry enforcement. Declare every App method
30
30
  in the permissions table; dynamic names and unregistered HTTP dispatchers are rejected.
31
31
  Use fixed SDK routes and `identity_gateway.upstream_auth_paths` for client API
32
32
  paths that rely on upstream authentication. Read
@@ -1,6 +1,6 @@
1
1
  # Native installation settings
2
2
 
3
- Use SDK/App 0.38.3, CLI 0.41.7 and templates 0.35.5. Configure installation through the manifest and generated wizard; do not add App ACL writers, root hooks or independent port state.
3
+ Use SDK/App 0.38.6, CLI 0.41.12 and templates 0.35.5. Configure installation through the manifest and generated wizard; do not add App ACL writers, root hooks or independent port state.
4
4
 
5
5
  ```yaml
6
6
  install: