@synopackageland/cli 0.26.0 → 0.27.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.27.0 (2026-10-23)
4
+
5
+ - Depend on templates `~0.27.0` with SDK/App 0.27.0 and UI 0.14.9. Templates patches can ship independently and resolve during npm installation/update; runtime uses the installed templates without network fetching. SDK minor upgrades still require a CLI release for executor mappings/digests and `SDK_UNSUPPORTED` checks. New scaffolds use browser same-origin DSM file operations and the idle-storage fixes.
6
+ - Resolve SDK 0.27.0 to the new executor/v0.27.0 and ship all six verified executor/lifecycle digests. Preserve the previous 0.26.0 inventory and exact-version refusal for unrecorded patches. Protected Apps must rebuild and follow normal administrator approval.
7
+ - Keep Go 1.26.10 and the existing runtime/toolchain requirements. Rust crate publication and NAS/App upgrade certification are outside this release.
8
+
3
9
  ## 0.26.0 (2026-10-22)
4
10
 
5
11
  - Support SDK/App 0.26.x and pin templates 0.26.0, retaining UI 0.14.3 and executor/v0.24.0 with unchanged protected payload digests.
package/README.md CHANGED
@@ -64,8 +64,18 @@ a failed fetch reports `SDK_DOWNLOAD_FAILED`.
64
64
  CLI-only patch releases can differ from the SDK patch. Compose import and SDK defaults
65
65
  read the SDK pin from the installed templates; explicit App SDK declarations take precedence.
66
66
 
67
- `init` and `add` read their templates from `@synopackageland/templates`, an exact-pinned
68
- dependency. For development against local checkouts, set `SYNOPKGLAND_TEMPLATES_DIR` to a
67
+ `init` and `add` read their templates from the locally installed
68
+ `@synopackageland/templates`. CLI 0.27.0 depends on `~0.27.0`: npm installation or
69
+ update can select the latest templates patch in the 0.27 minor line. Templates
70
+ patches need only a templates release; update the npm installation to receive them.
71
+ The CLI never fetches templates at runtime, so offline use works after installation;
72
+ commit a lockfile and use `npm ci` to reproduce a chosen dependency tree.
73
+ The templates' SDK pin must stay in the CLI-supported minor line. An SDK minor
74
+ upgrade still needs a CLI release for its executor mapping/digests and
75
+ `SDK_UNSUPPORTED` checks. Runtime SDK defaults continue to come from the actual
76
+ installed templates, independently of the CLI patch version.
77
+
78
+ For development against local checkouts, set `SYNOPKGLAND_TEMPLATES_DIR` to a
69
79
  templates checkout and `SYNOPKGLAND_SDK_DIR` to an SDK checkout; SPKs built with
70
80
  `SYNOPKGLAND_SDK_DIR` warn `EXECUTOR_DIGEST_UNVERIFIED` and must not be published. A Vue project
71
81
  packs the local SDK into its frontend (`npm install --install-links`) without building it: run
@@ -81,7 +91,7 @@ This compares `OFF_GLOSSARY` and the Italian sentence rule, including regex sour
81
91
  flags. It supports declaration-only rules with read-only use in `glossaryProblems`;
82
92
  post-declaration mutations, aliases and other unsupported rule uses fail the check instead of
83
93
  comparing a partial snapshot. The command also fails on drift or missing source. It needs a checkout because templates
84
- 0.15.1 does not publish `scripts/test/i18n.test.mjs`. The npm gate runs this check when
94
+ does not publish `scripts/test/i18n.test.mjs`. The npm gate runs this check when
85
95
  `SYNOPKGLAND_TEMPLATES_DIR` is set; otherwise it explicitly reports that the drift check was skipped.
86
96
 
87
97
  ## Capabilities
@@ -9,5 +9,16 @@
9
9
  "armv7": "6d25fc972eba12e3ac68f8b6a95a45e9e5706ebe19ffc1ff774fc318acbeb90f"
10
10
  },
11
11
  "goToolchain": "go1.26.10"
12
+ },
13
+ "0.27.0": {
14
+ "x86_64": "35f760533c133f7ed99d62c11dc4696d06a56fd2d125d53291aa21743d8327cc",
15
+ "aarch64": "04dff10b52ca4c54e3e6a825c27bac876f296031d8f572f667e6902e18464e31",
16
+ "armv7": "8789b2663b683ae0a5a457b41ccfcff4d54be4c98dcd3af338622051ad24f943",
17
+ "lifecycle": {
18
+ "x86_64": "c6fbb377ecd5ec7ee5b96439f22091d9fa5965dfd616d510ca9445722f436721",
19
+ "aarch64": "a9ca1750d4d5cff4727dc29789e6eaf0a365cb0e674f1bb796971d82f2d4fa27",
20
+ "armv7": "6d25fc972eba12e3ac68f8b6a95a45e9e5706ebe19ffc1ff774fc318acbeb90f"
21
+ },
22
+ "goToolchain": "go1.26.10"
12
23
  }
13
24
  }
@@ -75,8 +75,8 @@ function goMod(backendDir) {
75
75
  return '';
76
76
  }
77
77
  }
78
- /** SDK releases that reuse an immutable executor release with identical payload bytes. */
79
- const EXECUTOR_RELEASES = { '0.21.0': '0.20.0', '0.21.1': '0.20.0', '0.22.0': '0.20.0', '0.23.0': '0.20.0', '0.23.1': '0.20.0', '0.23.2': '0.20.0', '0.24.1': '0.24.0', '0.25.0': '0.24.0', '0.26.0': '0.24.0' };
78
+ /** Explicit executor release pins; older SDK versions can reuse an immutable release with identical payload bytes. */
79
+ const EXECUTOR_RELEASES = { '0.21.0': '0.20.0', '0.21.1': '0.20.0', '0.22.0': '0.20.0', '0.23.0': '0.20.0', '0.23.1': '0.20.0', '0.23.2': '0.20.0', '0.24.1': '0.24.0', '0.25.0': '0.24.0', '0.26.0': '0.24.0', '0.27.0': '0.27.0' };
80
80
  /**
81
81
  * The module directories of one SDK version. SYNOPKGLAND_SDK_DIR names a
82
82
  * local sdk checkout (development and gates only); otherwise modules come from
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The scaffold templates come from the exactly pinned @synopackageland/templates
2
+ * The scaffold templates come from the locally installed @synopackageland/templates
3
3
  * package; SYNOPKGLAND_TEMPLATES_DIR points at a templates checkout instead.
4
4
  */
5
5
  export declare function templatesRoot(env?: NodeJS.ProcessEnv, from?: string): string;
@@ -2,7 +2,7 @@ import { createRequire } from "node:module";
2
2
  import { dirname, join } from "node:path";
3
3
  import { sdkRequirement } from "./runtime/sdk-source.js";
4
4
  /**
5
- * The scaffold templates come from the exactly pinned @synopackageland/templates
5
+ * The scaffold templates come from the locally installed @synopackageland/templates
6
6
  * package; SYNOPKGLAND_TEMPLATES_DIR points at a templates checkout instead.
7
7
  */
8
8
  export function templatesRoot(env = process.env, from = import.meta.url) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synopackageland/cli",
3
- "version": "0.26.0",
3
+ "version": "0.27.0",
4
4
  "description": "Syno Package Land Developer Kit CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -27,7 +27,7 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "@napi-rs/keyring": "^2.1.1",
30
- "@synopackageland/templates": "0.26.0",
30
+ "@synopackageland/templates": "~0.27.0",
31
31
  "ajv": "^8.17.1",
32
32
  "commander": "^13.1.0",
33
33
  "json-canonicalize": "^3.0.1",
package/skills/SKILL.md CHANGED
@@ -5,6 +5,14 @@ description: Initialize, extend, check, build, inspect, and deploy Synology appl
5
5
 
6
6
  # Independent Synology SPKs
7
7
 
8
+ CLI 0.27.x installs templates through `~0.27.0`. A templates patch needs only a
9
+ templates release; npm install/update selects a patch in that minor line. The CLI
10
+ uses the locally installed templates and reads their SDK pin for defaults; it
11
+ never downloads templates at runtime. Preserve the lockfile and use `npm ci` for
12
+ reproducible offline-ready installations. An SDK minor upgrade still requires a
13
+ CLI release with executor mappings/digests and `SDK_UNSUPPORTED` validation; a
14
+ templates patch must keep its SDK pin in the CLI-supported minor line.
15
+
8
16
  Before releasing an executor App, read [reference/approval-upgrades.md](reference/approval-upgrades.md). Run build/inspect with the previous released SPK as `--baseline` and include the approval difference in release notes. Without a comparable baseline, retention is unknown.
9
17
 
10
18
  Use this guide to initialize, build and inspect own applications or upstream OSS as independent packages. 依已實作能力區分 DSM session 檔案、私有 jobs 與 App 登入;delegate 已實作並隨 CLI 提供固定操作的離線委託(預設 `files.moveFromStaging`);共用 delegate/rootOps executor 的完整裝置生命週期驗收仍待完成,不得宣稱已通過;支援邊界依 delegate guide/support matrix,禁止發明新的身分平台。
@@ -25,6 +33,8 @@ Read [reference/lifecycle.md](reference/lifecycle.md) before editing `dsm-script
25
33
 
26
34
  Read [reference/ui-vue.md](reference/ui-vue.md) when editing Vue components in the native-go Vue template; use the installed SDK contracts, keep DSM embedding boundaries, and verify the actual app.
27
35
 
36
+ Buttons follow DSM's policy ([reference/ui-vue.md](reference/ui-vue.md#buttons), the UI package's `docs/button-policy.md`): only the bar that closes a dialog, wizard or form draws capsules, with Cancel/Reset first and one primary (or one danger to confirm a deletion) last; toolbar, page, section and row actions are grey tool buttons, Delete included; links go to `Link`. Choose the variant, never the shape.
37
+
28
38
  Read [reference/ui-json.md](reference/ui-json.md) when generating or editing JSON UI; discover the installed catalog, validate the spec, then render and fix layout issues.
29
39
 
30
40
  ## UI copywriting
@@ -232,7 +232,7 @@ declared availability readiness, LAN isolation/egress, protected grant lifecycle
232
232
  ACLs, two-user visibility and clean install/upgrade/reboot/stop/uninstall before
233
233
  calling the package supported on a NAS. No NAS is accessed by the build gate.
234
234
 
235
- The unified Compose contract uses SDK 0.17.3 and templates 0.17.5 with CLI 0.17.3. Use the published, matching versions together; the legacy packaging route and bridge publish mode are removed.
235
+ The unified Compose contract uses SDK 0.27.x with CLI 0.27.x and locally installed templates from `~0.27.0`. Templates patches can ship independently; npm install/update resolves them, and SDK defaults come from the installed templates. SDK minor upgrades still require a CLI release with executor mappings/digests and `SDK_UNSUPPORTED` checks. The CLI does not fetch templates at runtime. The legacy packaging route and bridge publish mode are removed.
236
236
 
237
237
  Primary override files, and each included override set, must share a directory. Cross-directory override bases are rejected before loader I/O. Included implicit .env files are confined, inventoried and preserved; symlinks are rejected.
238
238
 
@@ -61,6 +61,31 @@ Reuse the embedded theme's typography, spacing and public controls. Preserve
61
61
  loading, empty, error, disabled and permission states. Backend policies and DSM
62
62
  checks decide authority; component visibility cannot grant access.
63
63
 
64
+ ## Buttons
65
+
66
+ Follow DSM's button policy, in the installed
67
+ `node_modules/@synopackageland/ui/docs/button-policy.md`. Choose only the
68
+ `variant`; the container chooses the shape, so do not set `kind="action"`.
69
+
70
+ | Place | Use |
71
+ | --- | --- |
72
+ | Dialog, Sheet, Wizard footer; `FormActions`, `AppActionBar`, `Footbar`, Panel `#fbar` | capsule: Cancel or Reset `secondary`, then one `primary` last |
73
+ | Confirming a deletion | Dialog footer: Cancel, then one `danger` last |
74
+ | Toolbar, PageHeader, section or card body and `#footer`, beside a field | grey tool `Button` (Delete too) |
75
+ | List or grid row | `IconButton` with a `label` |
76
+ | Help, docs, external pages | `Link`, not a button |
77
+
78
+ - A capsule only ends something: it closes a dialog, applies a form or moves a
79
+ wizard. Disable this connection, Open or Check again stay tool buttons, even
80
+ in a `SettingsSection` `#footer`; put a section's Save / Cancel in `FormActions`.
81
+ - One main action per footer, placed last. Inside a page, `primary` only for
82
+ the one step that unblocks it (Sign in), at most one per section.
83
+ - Keep the default size; neighbouring buttons share one size. One refresh per
84
+ page, in the PageHeader.
85
+ - In development the UI warns in the console about a capsule outside a footer,
86
+ two main actions in a footer, or a main action that is not last. Clear these
87
+ warnings before handing over the app.
88
+
64
89
  ## Start fast
65
90
 
66
91
  Every api.cgi call pays DSM's session check (about 60–240 ms on a NAS), so