@synopackageland/cli 0.15.2 → 0.15.4
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 +16 -0
- package/README.md +3 -0
- package/dist/runtime/executor-digests.json +11 -0
- package/dist/standalone/compose.js +3 -3
- package/dist/standalone/daemon.js +2 -2
- package/dist/template-paths.d.ts +4 -0
- package/dist/template-paths.js +11 -0
- package/package.json +2 -2
- package/skills/reference/compose.md +2 -2
- package/skills/reference/create.md +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.15.4 (2026-10-18)
|
|
4
|
+
|
|
5
|
+
- Fix Compose import and undeclared SDK defaults after CLI-only patch releases. Resolve the SDK from the exactly pinned templates' Go module instead of assuming the CLI and SDK share a patch version; daemon-control defaults use the same source.
|
|
6
|
+
- Preserve explicit Compose and identity-gateway SDK declarations. Add subprocess regressions with differing CLI/SDK versions and no SDK source override, plus release smoke coverage for real Compose imports and headless manifests.
|
|
7
|
+
- Keep templates/SDK pinned to 0.15.2 and every executor/lifecycle digest entry unchanged. Upgrade from CLI 0.15.3 to 0.15.4 to restore `init -t compose --from`; SDK/helper bytes do not change and no new administrator reapproval requirement is introduced.
|
|
8
|
+
|
|
9
|
+
繁中摘要:修正 CLI 與 SDK patch 版本不同時,Compose 匯入/未宣告 SDK 的預設路徑下載不存在 SDK tag 的問題;改由固定 templates 的 Go module 讀取 SDK pin,daemon-control 預設值亦同步。保留明確 SDK 宣告的優先順序,新增無 source override 的版本拆分回歸測試與正式產物 smoke。templates/SDK 保持 0.15.2,全部 executor/lifecycle digest 不變;請由 CLI 0.15.3 升級至 0.15.4,不新增管理員重新核准要求。
|
|
10
|
+
|
|
11
|
+
## 0.15.3 (2026-10-18)
|
|
12
|
+
|
|
13
|
+
- Pin templates and SDK fixtures/examples to 0.15.2, including UI 0.12.0 scaffolds, concise UI copy/tokens and delegate DTO contract checks.
|
|
14
|
+
- Add the SDK 0.15.2 executor/lifecycle digest entry using Go 1.26.9; retain every earlier entry unchanged. All six digests match 0.15.1, so upgrading from 0.15.1 adds no administrator reapproval requirement. Apps upgrading from 0.15.0 retain the one-time approval introduced in SDK 0.15.1.
|
|
15
|
+
- Include CLI-5 shared OFF_GLOSSARY rules and CLI-6 command failure exit codes from CLI 0.15.2. CLI 0.15.2 was already published with templates 0.15.1; use 0.15.3 for the coordinated SDK/templates release.
|
|
16
|
+
|
|
17
|
+
繁中摘要:templates/SDK pins 同步 0.15.2,帶入 UI 0.12.0、精簡文案/token 與 DTO 契約檢查;保留 CLI-5 詞彙規則及 CLI-6 正確退出碼。新增 SDK 0.15.2 digest 表項,六個 digest 均與 0.15.1 相同,保留全部舊 pins;從 0.15.1 升級不新增重新核准要求,從 0.15.0 升級仍需完成一次管理員核准。CLI 0.15.2 已先發佈,因此本次協同發版使用 CLI 0.15.3。
|
|
18
|
+
|
|
3
19
|
## 0.15.2 (2026-10-18)
|
|
4
20
|
|
|
5
21
|
- Preserve command-set process exit codes instead of resetting them to 0 after CLI dispatch. `ctl` failures now reach scripts and CI with their documented exit codes; successful commands still exit 0 and uncaught exceptions exit 1.
|
package/README.md
CHANGED
|
@@ -61,6 +61,9 @@ children's `GOPRIVATE`, `GONOPROXY` and `GONOSUMDB`, preserving existing environ
|
|
|
61
61
|
`https://github.com/synopackageland/syno-pkg-land-sdk` (check with `git ls-remote`);
|
|
62
62
|
a failed fetch reports `SDK_DOWNLOAD_FAILED`.
|
|
63
63
|
|
|
64
|
+
CLI-only patch releases can differ from the SDK patch. Compose import and SDK defaults
|
|
65
|
+
read the SDK pin from the installed templates; explicit App SDK declarations take precedence.
|
|
66
|
+
|
|
64
67
|
`init` and `add` read their templates from `@synopackageland/templates`, an exact-pinned
|
|
65
68
|
dependency. For development against local checkouts, set `SYNOPKGLAND_TEMPLATES_DIR` to a
|
|
66
69
|
templates checkout and `SYNOPKGLAND_SDK_DIR` to an SDK checkout; SPKs built with
|
|
@@ -20,5 +20,16 @@
|
|
|
20
20
|
"armv7": "cafc97c89f5645c14a8cf31d6d9f258394ed6f2d086478a7aebd04d57c274b4e"
|
|
21
21
|
},
|
|
22
22
|
"goToolchain": "go1.26.9"
|
|
23
|
+
},
|
|
24
|
+
"0.15.2": {
|
|
25
|
+
"x86_64": "4f47fb43f6e60dbad064afb0bbec96dd009fa046670e2c4b590b128a855cb404",
|
|
26
|
+
"aarch64": "c903b09ad657a838f0c62b6688e65e9094572b22b969770fca92fcc3640a5364",
|
|
27
|
+
"armv7": "8178d90de7ea720530bb9496e50ed118086b0e57382d84675aadc68f482d219f",
|
|
28
|
+
"lifecycle": {
|
|
29
|
+
"x86_64": "d65500c4f04713a32b45d360059281391acfa5e00ee24895fdd2de7b82735372",
|
|
30
|
+
"aarch64": "94f6cd119186ff482b8aea56541dd1f9d53c147566bc1efdca6f5a1c86198331",
|
|
31
|
+
"armv7": "cafc97c89f5645c14a8cf31d6d9f258394ed6f2d086478a7aebd04d57c274b4e"
|
|
32
|
+
},
|
|
33
|
+
"goToolchain": "go1.26.9"
|
|
23
34
|
}
|
|
24
35
|
}
|
|
@@ -5,7 +5,7 @@ import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync
|
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
import { dirname, join } from "node:path";
|
|
7
7
|
import { parse } from "yaml";
|
|
8
|
-
import {
|
|
8
|
+
import { templateSdkVersion } from "../template-paths.js";
|
|
9
9
|
import { goChildEnv } from "../runtime/go-env.js";
|
|
10
10
|
import { sdkSource } from "../runtime/sdk-source.js";
|
|
11
11
|
import { readDaemon } from "./daemon.js";
|
|
@@ -69,7 +69,7 @@ export function readComposeApp(value, root, arches, fail, context = {}) {
|
|
|
69
69
|
if (value.sdk !== undefined &&
|
|
70
70
|
(typeof value.sdk !== "string" || !/^\d+\.\d+\.\d+$/.test(value.sdk)))
|
|
71
71
|
return invalid("compose.sdk must name the matching SDK release.", "SDK_COMPOSE_UNSUPPORTED");
|
|
72
|
-
const sdk = typeof value.sdk === "string" ? value.sdk : (context.sdk ??
|
|
72
|
+
const sdk = typeof value.sdk === "string" ? value.sdk : (context.sdk ?? templateSdkVersion());
|
|
73
73
|
let targets = {};
|
|
74
74
|
if (value.helpers !== undefined) {
|
|
75
75
|
const d = readDaemon({ exec: "_sso/gateway", targets: value.helpers }, root, arches, fail);
|
|
@@ -250,7 +250,7 @@ export function lockComposeImages(m, arch, resolveImages, imageProofs) {
|
|
|
250
250
|
return { ...m, compose };
|
|
251
251
|
}
|
|
252
252
|
export function composeInputs(root, file, envFile) {
|
|
253
|
-
const result = spawnSync(planner(
|
|
253
|
+
const result = spawnSync(planner(templateSdkVersion()), [
|
|
254
254
|
"sources",
|
|
255
255
|
"--root",
|
|
256
256
|
root,
|
|
@@ -3,7 +3,7 @@ import { chmodSync, copyFileSync, lstatSync, mkdirSync, readdirSync, realpathSyn
|
|
|
3
3
|
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
4
4
|
import { PINNED_GO_HINT, pinnedGoBuildEnv, pinnedGoProblem, } from "../build-spk/go-toolchain.js";
|
|
5
5
|
import { sdkSource, appSdkVersion } from "../runtime/sdk-source.js";
|
|
6
|
-
import {
|
|
6
|
+
import { templateSdkVersion } from "../template-paths.js";
|
|
7
7
|
import { checkCgiBinary } from "./binary.js";
|
|
8
8
|
import { composeDaemon, composeNetwork } from "./compose.js";
|
|
9
9
|
import { gatewayDaemon } from "./identity-gateway.js";
|
|
@@ -141,7 +141,7 @@ export async function buildDaemonControl(manifest, arch, work, run) {
|
|
|
141
141
|
(manifest.backend.kind === "go"
|
|
142
142
|
? appSdkVersion(manifest.backend)
|
|
143
143
|
: undefined) ??
|
|
144
|
-
|
|
144
|
+
templateSdkVersion()).goDir,
|
|
145
145
|
env: goChildEnv({ ...process.env, ...pinnedGoBuildEnv(arch) }),
|
|
146
146
|
});
|
|
147
147
|
if (result.missing || result.status !== 0)
|
package/dist/template-paths.d.ts
CHANGED
|
@@ -3,3 +3,7 @@
|
|
|
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;
|
|
6
|
+
/** The installed templates' SDK pin also supplies CLI-owned runtime defaults.
|
|
7
|
+
* CLI-only patch releases must never turn their own version into an SDK tag.
|
|
8
|
+
*/
|
|
9
|
+
export declare function templateSdkVersion(env?: NodeJS.ProcessEnv): string;
|
package/dist/template-paths.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
|
+
import { sdkRequirement } from "./runtime/sdk-source.js";
|
|
3
4
|
/**
|
|
4
5
|
* The scaffold templates come from the exactly pinned @synopackageland/templates
|
|
5
6
|
* package; SYNOPKGLAND_TEMPLATES_DIR points at a templates checkout instead.
|
|
@@ -14,3 +15,13 @@ export function templatesRoot(env = process.env, from = import.meta.url) {
|
|
|
14
15
|
throw new Error("[TEMPLATES_MISSING] @synopackageland/templates is not installed; reinstall @synopackageland/cli, or set SYNOPKGLAND_TEMPLATES_DIR to a templates checkout.");
|
|
15
16
|
}
|
|
16
17
|
}
|
|
18
|
+
/** The installed templates' SDK pin also supplies CLI-owned runtime defaults.
|
|
19
|
+
* CLI-only patch releases must never turn their own version into an SDK tag.
|
|
20
|
+
*/
|
|
21
|
+
export function templateSdkVersion(env = process.env) {
|
|
22
|
+
const version = sdkRequirement(join(templatesRoot(env), "native-go/backend"));
|
|
23
|
+
if (!version || !/^\d+\.\d+\.\d+$/.test(version)) {
|
|
24
|
+
throw new Error("[TEMPLATES_MISSING] The installed templates have no valid SDK pin; reinstall @synopackageland/templates.");
|
|
25
|
+
}
|
|
26
|
+
return version;
|
|
27
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@synopackageland/cli",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.4",
|
|
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.15.
|
|
30
|
+
"@synopackageland/templates": "0.15.2",
|
|
31
31
|
"ajv": "^8.17.1",
|
|
32
32
|
"commander": "^13.1.0",
|
|
33
33
|
"json-canonicalize": "^3.0.1",
|
|
@@ -23,7 +23,7 @@ compose:
|
|
|
23
23
|
network: {egress: isolated}
|
|
24
24
|
# Private package binds are rejected by DSM build; keep compatible upstream named volumes.
|
|
25
25
|
identity_gateway:
|
|
26
|
-
sdk: 0.15.
|
|
26
|
+
sdk: 0.15.2
|
|
27
27
|
mode: none
|
|
28
28
|
access: dsm-users
|
|
29
29
|
listen: {http: 28000}
|
|
@@ -151,7 +151,7 @@ declared availability readiness, LAN isolation/egress, protected grant lifecycle
|
|
|
151
151
|
ACLs, two-user visibility and clean install/upgrade/reboot/stop/uninstall before
|
|
152
152
|
calling the package supported on a NAS. No NAS is accessed by the build gate.
|
|
153
153
|
|
|
154
|
-
The unified Compose contract
|
|
154
|
+
The unified Compose contract uses SDK/templates 0.15.2 with CLI 0.15.4. Use the published, matching versions together; the legacy packaging route and bridge publish mode are removed.
|
|
155
155
|
|
|
156
156
|
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.
|
|
157
157
|
|
|
@@ -40,8 +40,8 @@ rootOps 與 delegate 已共用管理員 PasswordConfirm 核准的 protected exec
|
|
|
40
40
|
backend 寫 `runtime: python|node|rust`(`runtime: go` 等同 `kind: go`)。CGI 是 SDK 的 Go runtime(`bridge/cmd/runtime`),它驗證 DSM session、entry 與 `permissions.json` 後,以套件帳號(不是 root)每個請求啟動一次 App。App 放在 ui 以外的目錄,打包成 `target/app/`,build 寫入 `bridge.json`(spec/bridge/v1)並把它與 `permissions.json` 的 sha256 編進 runtime。
|
|
41
41
|
|
|
42
42
|
```yaml
|
|
43
|
-
backend: {runtime: python, dir: app, entry: main.py, sdk: 0.15.
|
|
44
|
-
backend: {runtime: node, dir: app, entry: main.mjs, sdk: 0.15.
|
|
43
|
+
backend: {runtime: python, dir: app, entry: main.py, sdk: 0.15.2}
|
|
44
|
+
backend: {runtime: node, dir: app, entry: main.mjs, sdk: 0.15.2, node: {package: Node.js_v20}}
|
|
45
45
|
backend: {runtime: rust, dir: app, entry: hello, methods: [hello.greet]}
|
|
46
46
|
```
|
|
47
47
|
|