@synopackageland/templates 0.40.3 → 0.41.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 (44) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +26 -0
  3. package/package.json +1 -1
  4. package/templates/_shared/package.json +1 -1
  5. package/templates/binary/.env.example +5 -0
  6. package/templates/binary/README.md +2 -0
  7. package/templates/binary/gitignore +6 -0
  8. package/templates/compose/.env.example +5 -0
  9. package/templates/compose/README.md +11 -0
  10. package/templates/compose/dsm-package.yaml +1 -1
  11. package/templates/compose/gitignore +6 -0
  12. package/templates/native-go/.env.example +5 -0
  13. package/templates/native-go/README.md +11 -0
  14. package/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +1 -1
  15. package/templates/native-go/backend/go.mod +1 -1
  16. package/templates/native-go/backend/go.sum +2 -2
  17. package/templates/native-go/gitignore +6 -0
  18. package/templates/native-go-delegate/frontend/test/capability-panels.test.ts +10 -5
  19. package/templates/native-go-vue/README.md +13 -0
  20. package/templates/native-go-vue/frontend/package-lock.json +19 -28
  21. package/templates/native-go-vue/frontend/package.json +2 -2
  22. package/templates/native-go-vue/gitignore +6 -0
  23. package/templates/native-node/.env.example +5 -0
  24. package/templates/native-node/README.md +2 -0
  25. package/templates/native-node/backend/package-lock.json +1 -1
  26. package/templates/native-node/dsm-package.yaml +1 -1
  27. package/templates/native-node/gitignore +6 -0
  28. package/templates/native-node-vue/README.md +2 -0
  29. package/templates/native-node-vue/gitignore +6 -0
  30. package/templates/native-python/.env.example +5 -0
  31. package/templates/native-python/README.md +2 -0
  32. package/templates/native-python/dsm-package.yaml +1 -1
  33. package/templates/native-python/gitignore +6 -0
  34. package/templates/native-python-vue/README.md +2 -0
  35. package/templates/native-python-vue/gitignore +6 -0
  36. package/templates/native-rust/.env.example +5 -0
  37. package/templates/native-rust/README.md +2 -0
  38. package/templates/native-rust/backend/Cargo.lock +2 -2
  39. package/templates/native-rust/backend/Cargo.toml +1 -1
  40. package/templates/native-rust/gitignore +6 -0
  41. package/templates/native-rust-delegate/backend/Cargo.lock +2 -2
  42. package/templates/native-rust-delegate/backend/Cargo.toml +1 -1
  43. package/templates/native-rust-vue/README.md +2 -0
  44. package/templates/native-rust-vue/gitignore +6 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.41.0
4
+
5
+ - Require CLI `~0.49.0` in every generated project through the shared test scaffold
6
+ - Pin SDK/App 0.51.0 across Go, Python, Node.js, Rust and Compose templates, with the frontend SDK on `~0.51.0` and regenerated dependency locks
7
+ - Pin UI 0.20.5 to satisfy the frontend SDK peer dependency and retain reproducible Vue builds
8
+
9
+ ## 0.40.4
10
+
11
+ - Ignore private environment variants, key and certificate files, and npm credentials in every scaffold while keeping `.env.example` trackable
12
+ - Include placeholder-only environment examples for the optional AI tests
13
+ - Document secret storage under `synology/` for upstream forks without changing upstream ignore files
14
+ - Verify Git ignore behavior for every template and UI variant, including upstream forks, using the packed templates and actual CLI
15
+
3
16
  ## 0.40.3
4
17
 
5
18
  - Use CLI architecture names in local package tests and SDK constants in background-limit assertions
package/README.md CHANGED
@@ -354,6 +354,32 @@ configuration and DSM service definition, and upgrades retain the selection.
354
354
  Changing ports uses reinstall. Declare `{port: gateway_https}` runtime bindings
355
355
  when an upstream application needs its public port in its own configuration.
356
356
 
357
+ ## Secret files
358
+
359
+ Every scaffold ignores `.env`, `.env.*`, `*.pem`, `*.key`, `*.p12` and `.npmrc`
360
+ at any depth within its project. `.env.example` remains trackable and contains
361
+ only placeholders for the optional AI tests; those commands load `.env` from
362
+ their working directory. Copy the example only when configuring those tests.
363
+ Keep real credentials out of examples and commits.
364
+
365
+ Templates ship ignore files as `gitignore` because npm excludes `.gitignore`;
366
+ `synopkgland init` restores the `.gitignore` name in the generated project.
367
+ The scaffold tests use the actual packed templates to verify that behavior.
368
+
369
+ ### Upstream fork secret storage
370
+
371
+ For `init --upstream-fork`, all wrapper-owned files belong in `synology/`.
372
+ Store secrets in **`synology/.env`, never the fork root**, and run the optional
373
+ tests from `synology/`. Copy `synology/.env.example` only when configuring the
374
+ optional AI tests. Keep keys, certificates and private npm configuration under
375
+ `synology/` as well.
376
+
377
+ The upstream root `.gitignore` is not ours to edit and may not ignore a root
378
+ `.env`. The generated `synology/.gitignore` protects secrets inside `synology/`;
379
+ it cannot protect files in the parent directory. Preserve upstream ignore files
380
+ and history. Use the CLI's `synopkgland skill show upstream-fork` for the rest of
381
+ the fork workflow.
382
+
357
383
  ## App-open smoke
358
384
 
359
385
  Every generated project includes `tests/e2e/smoke.e2e.ts`, `e2e.config.ts` and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synopackageland/templates",
3
- "version": "0.40.3",
3
+ "version": "0.41.0",
4
4
  "description": "Project templates for synopkgland init: native-go, native-python, native-node and native-rust (plain or Vue, with jobs, delegate and root-ops overlays), binary and compose.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -11,7 +11,7 @@
11
11
  "e2e:ai": "node --env-file-if-exists=.env node_modules/@synopackageland/cli/dist/e2e/dsm.js tunnel -- e2e run --config e2e.ai.config.ts tests/e2e/action.ai.e2e.ts"
12
12
  },
13
13
  "devDependencies": {
14
- "@synopackageland/cli": "~0.48.20",
14
+ "@synopackageland/cli": "~0.49.0",
15
15
  "@e2e-dev/web": "^0.14.0",
16
16
  "e2e": "^0.19.0"
17
17
  }
@@ -0,0 +1,5 @@
1
+ # Optional AI tests only: replace these placeholders in your private .env.
2
+ # For an upstream fork, use synology/.env, never the fork root.
3
+ E2E_LLM_BASE_URL=https://api.example.com/v1
4
+ E2E_LLM_MODEL=replace-with-model
5
+ E2E_LLM_API_KEY=replace-with-api-key
@@ -2,6 +2,8 @@
2
2
 
3
3
  ## Local tests
4
4
 
5
+ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real credentials out of examples and commits.
6
+
5
7
  From the project root, install the test tools before running the optional tests:
6
8
 
7
9
  ```sh
@@ -4,3 +4,9 @@ dist/
4
4
  # Private NAS smoke sessions and credentials
5
5
  .e2e/
6
6
  .env
7
+ .env.*
8
+ !.env.example
9
+ *.pem
10
+ *.key
11
+ *.p12
12
+ .npmrc
@@ -0,0 +1,5 @@
1
+ # Optional AI tests only: replace these placeholders in your private .env.
2
+ # For an upstream fork, use synology/.env, never the fork root.
3
+ E2E_LLM_BASE_URL=https://api.example.com/v1
4
+ E2E_LLM_MODEL=replace-with-model
5
+ E2E_LLM_API_KEY=replace-with-api-key
@@ -2,6 +2,8 @@
2
2
 
3
3
  ## Local tests
4
4
 
5
+ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real credentials out of examples and commits.
6
+
5
7
  From the project root, install the test tools before running the optional tests:
6
8
 
7
9
  ```sh
@@ -14,3 +16,12 @@ After committing the generated root lockfile, use `npm ci --include=dev`.
14
16
  Configure the upstream image and its real readiness endpoint before
15
17
  `test:local`; see `AGENTS.md` for the Compose packaging workflow.
16
18
 
19
+ ## Secrets in an upstream fork
20
+
21
+ With `--upstream-fork`, store secrets in `synology/.env`, never in the fork root.
22
+ Run the optional tests from `synology/`; its `.gitignore` protects `.env`,
23
+ `.env.*`, `*.pem`, `*.key`, `*.p12` and `.npmrc`, while `.env.example` remains
24
+ trackable with placeholders only. The upstream root `.gitignore` is not ours
25
+ to edit and may not ignore a root `.env`.
26
+ See the [fork guide](https://github.com/synopackageland/syno-pkg-land-templates#upstream-fork-secret-storage).
27
+
@@ -23,7 +23,7 @@ compose:
23
23
  web: {service: web, port: 8080, health: {path: /, status: 200}}
24
24
  network: {egress: isolated}
25
25
  identity_gateway:
26
- sdk: 0.50.0
26
+ sdk: 0.51.0
27
27
  mode: none
28
28
  listen: {http: 28000}
29
29
  # Web Apps default to new-page through the shared app-launch resolver.
@@ -1,5 +1,11 @@
1
1
  node_modules/
2
2
  .e2e/
3
3
  .env
4
+ .env.*
5
+ !.env.example
6
+ *.pem
7
+ *.key
8
+ *.p12
9
+ .npmrc
4
10
  dist/
5
11
  *.spk
@@ -0,0 +1,5 @@
1
+ # Optional AI tests only: replace these placeholders in your private .env.
2
+ # For an upstream fork, use synology/.env, never the fork root.
3
+ E2E_LLM_BASE_URL=https://api.example.com/v1
4
+ E2E_LLM_MODEL=replace-with-model
5
+ E2E_LLM_API_KEY=replace-with-api-key
@@ -31,6 +31,8 @@ nonblocking job. See the SDK's [request deadline contract](https://github.com/sy
31
31
 
32
32
  ## Local tests
33
33
 
34
+ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real credentials out of examples and commits.
35
+
34
36
  From the project root, install the test tools before running the optional tests:
35
37
 
36
38
  ```sh
@@ -44,6 +46,15 @@ Before `npm run test:local`, prepare the backend and, for Vue, build the
44
46
  frontend using the steps below and the backend section in `AGENTS.md`, then
45
47
  run `synopkgland ctl generate`.
46
48
 
49
+ ## Secrets in an upstream fork
50
+
51
+ With `--upstream-fork`, store secrets in `synology/.env`, never in the fork root.
52
+ Run the optional tests from `synology/`; its `.gitignore` protects `.env`,
53
+ `.env.*`, `*.pem`, `*.key`, `*.p12` and `.npmrc`, while `.env.example` remains
54
+ trackable with placeholders only. The upstream root `.gitignore` is not ours
55
+ to edit and may not ignore a root `.env`.
56
+ See the [fork guide](https://github.com/synopackageland/syno-pkg-land-templates#upstream-fork-secret-storage).
57
+
47
58
  ## Quick start
48
59
 
49
60
  Needs Node.js with `synopkgland` installed, and Go 1.26.10.
@@ -1,6 +1,6 @@
1
1
  Native Go package build dependencies
2
2
 
3
- github.com/synopackageland/syno-pkg-land-sdk v0.50.0 (MIT)
3
+ github.com/synopackageland/syno-pkg-land-sdk v0.51.0 (MIT)
4
4
 
5
5
  Copyright (c) 2026 synopkgland
6
6
 
@@ -2,6 +2,6 @@ module __PACKAGE__
2
2
 
3
3
  go 1.26.10
4
4
 
5
- require github.com/synopackageland/syno-pkg-land-sdk v0.50.0
5
+ require github.com/synopackageland/syno-pkg-land-sdk v0.51.0
6
6
 
7
7
  require golang.org/x/sys v0.44.0 // indirect
@@ -1,4 +1,4 @@
1
- github.com/synopackageland/syno-pkg-land-sdk v0.50.0 h1:eaehFfsLqa18qFe0S3xjF/eaS3qg5ZSCycZdnGAvt7c=
2
- github.com/synopackageland/syno-pkg-land-sdk v0.50.0/go.mod h1:A4ZvKEQnCMk5offv/57Zsf1Z/pV1RmylS9cMfDqdBMQ=
1
+ github.com/synopackageland/syno-pkg-land-sdk v0.51.0 h1:DkFlrW3gsvUze8oqHtDJ+I4yrIdbFUyImqCcF4zWT0I=
2
+ github.com/synopackageland/syno-pkg-land-sdk v0.51.0/go.mod h1:A4ZvKEQnCMk5offv/57Zsf1Z/pV1RmylS9cMfDqdBMQ=
3
3
  golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
4
4
  golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
@@ -3,3 +3,9 @@ dist/
3
3
  # Private NAS smoke sessions and credentials
4
4
  .e2e/
5
5
  .env
6
+ .env.*
7
+ !.env.example
8
+ *.pem
9
+ *.key
10
+ *.p12
11
+ .npmrc
@@ -42,10 +42,13 @@ test('the default surface binds the real routes and the session-only picker',asy
42
42
  expect(url).toBe('/webapi/entry.cgi')
43
43
  const body=init?.body as URLSearchParams
44
44
  expect(body.get('api')).toBe('SYNO.FileStation.List')
45
- expect(body.get('method')).toBe('list_share')
46
- expect(body.get('SynoToken')).toBe('fixture-token')
45
+ expect(['list_share','list']).toContain(body.get('method'))
46
+ expect(body.has('SynoToken')).toBe(false)
47
+ expect(new Headers(init?.headers).get('X-SYNO-TOKEN')).toBe('fixture-token')
47
48
  expect(init?.credentials).toBe('same-origin')
48
- return new Response(JSON.stringify({success:true,data:{shares:[{name:'home',path:'/home',isdir:true}],offset:0,total:1}}))
49
+ if(body.get('method')==='list_share')return new Response(JSON.stringify({success:true,data:{shares:[{name:'home',path:'/home',isdir:true}],offset:0,total:1}}))
50
+ expect(body.get('folder_path')).toBe('/home')
51
+ return new Response(JSON.stringify({success:true,data:{files:[],offset:0,total:0}}))
49
52
  })
50
53
  vi.stubGlobal('fetch',fetch);cleanup.push(()=>vi.unstubAllGlobals())
51
54
  const call=vi.fn(async(method:string,params?:unknown)=>{
@@ -61,10 +64,12 @@ test('the default surface binds the real routes and the session-only picker',asy
61
64
  const root=render({call,locale:'en',files:{token:()=> 'fixture-token'}});await settle()
62
65
  button(root,'Choose folder').click();await settle()
63
66
  // The SDK picker selects a folder with a row click.
64
- const row=root.querySelector<HTMLElement>('tr[data-row-key="/home"]')!;expect(row).toBeTruthy();row.dispatchEvent(new MouseEvent('click',{bubbles:true}));await settle()
67
+ await vi.waitFor(()=>expect(root.querySelector('[data-row-key="/home"]')).toBeTruthy())
68
+ const row=root.querySelector<HTMLElement>('[data-row-key="/home"]')!;row.dispatchEvent(new MouseEvent('click',{bubbles:true}));await settle()
65
69
  button(root,'Confirm selection').click();await settle()
66
70
  expect(call).toHaveBeenCalledWith('delegate.select_destination',{key:'save',path:'/home'})
67
- expect(fetch).toHaveBeenCalledTimes(1)
71
+ // Selecting a folder prefetches its children through the same session-only provider.
72
+ await vi.waitFor(()=>expect(fetch).toHaveBeenCalledTimes(2))
68
73
  expect(call).not.toHaveBeenCalledWith('bg.browse',expect.anything())
69
74
  // The SDK hides the sample save unless an App opts in; the template opts in with sample-save.
70
75
  button(root,'Save example file').click();await settle()
@@ -9,6 +9,8 @@ files, portal, jobs and delegate components come from `@synopackageland/sdk/vue`
9
9
 
10
10
  ## Local tests
11
11
 
12
+ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real credentials out of examples and commits.
13
+
12
14
  From the project root, install the test tools before running the optional tests:
13
15
 
14
16
  ```sh
@@ -22,6 +24,17 @@ Before `npm run test:local`, prepare the backend and, for Vue, build the
22
24
  frontend using the steps below and the backend section in `AGENTS.md`, then
23
25
  run `synopkgland ctl generate`.
24
26
 
27
+ ## Secrets in an upstream fork
28
+
29
+ With `--upstream-fork`, store secrets in `synology/.env`, never in the fork root.
30
+ Run the optional tests from `synology/`; its `.gitignore` protects `.env`,
31
+ `.env.*`, `*.pem`, `*.key`, `*.p12` and `.npmrc`, while `.env.example` remains
32
+ trackable with placeholders only. The upstream root `.gitignore` is not ours
33
+ to edit and may not ignore a root `.env`.
34
+ See the [fork guide](https://github.com/synopackageland/syno-pkg-land-templates#upstream-fork-secret-storage).
35
+
36
+ ## Frontend
37
+
25
38
  ```sh
26
39
  cd frontend
27
40
  npm ci --include=dev
@@ -7,8 +7,8 @@
7
7
  "name": "native-dsm-vue-app",
8
8
  "dependencies": {
9
9
  "@lucide/vue": "1.48.0",
10
- "@synopackageland/sdk": "0.50.0",
11
- "@synopackageland/ui": "0.20.0",
10
+ "@synopackageland/sdk": "~0.51.0",
11
+ "@synopackageland/ui": "0.20.5",
12
12
  "vue": "3.5.43"
13
13
  },
14
14
  "devDependencies": {
@@ -1168,22 +1168,19 @@
1168
1168
  "license": "MIT"
1169
1169
  },
1170
1170
  "node_modules/@swc/helpers": {
1171
- "version": "0.5.23",
1172
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz",
1173
- "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==",
1174
- "license": "Apache-2.0",
1175
- "dependencies": {
1176
- "tslib": "^2.8.0"
1177
- }
1171
+ "version": "0.5.24",
1172
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.24.tgz",
1173
+ "integrity": "sha512-6tcXo4kA8HgGO7AVmawB57RYi/piBPYVHVcO6dXjX+SZw8GoHmi262sp4v2Ha2kNP9Cx84qei27yT+fjS1lxgg==",
1174
+ "license": "Apache-2.0"
1178
1175
  },
1179
1176
  "node_modules/@synopackageland/sdk": {
1180
- "version": "0.50.0",
1181
- "resolved": "https://registry.npmjs.org/@synopackageland/sdk/-/sdk-0.50.0.tgz",
1182
- "integrity": "sha512-9cc/aBNicwE/2Ospx1a/akBGU2B8B2cQg6i06LbpZe8rdDBuPdLmAZh5WIlREsUruetq0mfmlVoeQ8l/lrdZ3g==",
1177
+ "version": "0.51.0",
1178
+ "resolved": "https://registry.npmjs.org/@synopackageland/sdk/-/sdk-0.51.0.tgz",
1179
+ "integrity": "sha512-Ijv4n5B2YlDde4P2c3AZj0YPiO08ft+kUiNYIGfQiv3nbyniljX0k6nllG7oi85jD2gPrWQM+HIw7BVpU70WWg==",
1183
1180
  "license": "MIT",
1184
1181
  "peerDependencies": {
1185
1182
  "@lucide/vue": "^1.48.0",
1186
- "@synopackageland/ui": ">=0.10.1 <0.21.0",
1183
+ "@synopackageland/ui": ">=0.20.5 <0.21.0",
1187
1184
  "vue": "^3.5.0"
1188
1185
  },
1189
1186
  "peerDependenciesMeta": {
@@ -1196,9 +1193,9 @@
1196
1193
  }
1197
1194
  },
1198
1195
  "node_modules/@synopackageland/ui": {
1199
- "version": "0.20.0",
1200
- "resolved": "https://registry.npmjs.org/@synopackageland/ui/-/ui-0.20.0.tgz",
1201
- "integrity": "sha512-YoeMoI2s1jw+1fdyVjc2L9GzwaDCiCrj+zMQDOBiCCjPdPiOElENAbBm1vo/XKViVNhPoH4p3gXQEQxf4RRUXA==",
1196
+ "version": "0.20.5",
1197
+ "resolved": "https://registry.npmjs.org/@synopackageland/ui/-/ui-0.20.5.tgz",
1198
+ "integrity": "sha512-lyn3W+VvPu5BuZN1CMPZP3R7B1phUcqRzhmSmSJ8rubptPk1/wbfa91cLdYtRC9qKBBSnXlf6c9ibjkskf5qLQ==",
1202
1199
  "license": "MIT",
1203
1200
  "dependencies": {
1204
1201
  "@floating-ui/dom": "1.8.0",
@@ -2440,9 +2437,9 @@
2440
2437
  }
2441
2438
  },
2442
2439
  "node_modules/prosemirror-changeset": {
2443
- "version": "2.4.5",
2444
- "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.5.tgz",
2445
- "integrity": "sha512-hv3Qhsn5GyoferiBqL8euGvj3Y8Z+2Ef75NnPLChr5DTWArpPAjK6F96Yc0iM7SBYNDPQbQaA+xEtAR8NuWo9A==",
2440
+ "version": "2.4.6",
2441
+ "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.6.tgz",
2442
+ "integrity": "sha512-P0cY3DSLm4M2boUOCmHDyaID5o6HgWmb21Bvs9p8lLqfJjKBBEHG5Ma5qW5SCmwOYamtWOLf2k+yvt6077zlTg==",
2446
2443
  "license": "MIT",
2447
2444
  "dependencies": {
2448
2445
  "prosemirror-transform": "^1.0.0"
@@ -2559,9 +2556,9 @@
2559
2556
  }
2560
2557
  },
2561
2558
  "node_modules/prosemirror-transform": {
2562
- "version": "1.12.4",
2563
- "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.4.tgz",
2564
- "integrity": "sha512-2/WuPum3pn+O/Vi2vzpi8210ICUe2kIPXdLYjQ09Pv5DtT5bcKWMJhAKPBwvpPjpp5iOYUVwVEr0gOM1BY1Mgw==",
2559
+ "version": "1.12.5",
2560
+ "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.5.tgz",
2561
+ "integrity": "sha512-3EBXZBM4h3MKuWvs9sQ7IA0/v6jCqCZ4wC08PIvzY1VSQWDL90KEyfg5C0Ex52UJesf/QVogxvuBsZdKmLc3NQ==",
2565
2562
  "license": "MIT",
2566
2563
  "dependencies": {
2567
2564
  "prosemirror-model": "^1.21.0"
@@ -2783,12 +2780,6 @@
2783
2780
  "node": "^22.14.0 || >=24.0.0"
2784
2781
  }
2785
2782
  },
2786
- "node_modules/tslib": {
2787
- "version": "2.8.1",
2788
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
2789
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
2790
- "license": "0BSD"
2791
- },
2792
2783
  "node_modules/typescript": {
2793
2784
  "version": "5.9.3",
2794
2785
  "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
@@ -8,8 +8,8 @@
8
8
  },
9
9
  "dependencies": {
10
10
  "@lucide/vue": "1.48.0",
11
- "@synopackageland/sdk": "0.50.0",
12
- "@synopackageland/ui": "0.20.0",
11
+ "@synopackageland/sdk": "~0.51.0",
12
+ "@synopackageland/ui": "0.20.5",
13
13
  "vue": "3.5.43"
14
14
  },
15
15
  "devDependencies": {
@@ -4,3 +4,9 @@ node_modules/
4
4
  # Private NAS smoke sessions and credentials
5
5
  .e2e/
6
6
  .env
7
+ .env.*
8
+ !.env.example
9
+ *.pem
10
+ *.key
11
+ *.p12
12
+ .npmrc
@@ -0,0 +1,5 @@
1
+ # Optional AI tests only: replace these placeholders in your private .env.
2
+ # For an upstream fork, use synology/.env, never the fork root.
3
+ E2E_LLM_BASE_URL=https://api.example.com/v1
4
+ E2E_LLM_MODEL=replace-with-model
5
+ E2E_LLM_API_KEY=replace-with-api-key
@@ -31,6 +31,8 @@ nonblocking job. See the SDK's [request deadline contract](https://github.com/sy
31
31
 
32
32
  ## Local tests
33
33
 
34
+ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real credentials out of examples and commits.
35
+
34
36
  From the project root, install the test tools before running the optional tests:
35
37
 
36
38
  ```sh
@@ -49,7 +49,7 @@
49
49
  "license": "MIT"
50
50
  },
51
51
  "vendor/@synopackageland/app": {
52
- "version": "0.50.0",
52
+ "version": "0.51.0",
53
53
  "license": "MIT",
54
54
  "engines": {
55
55
  "node": ">=22"
@@ -49,7 +49,7 @@ backend:
49
49
  runtime: node
50
50
  dir: backend/app
51
51
  entry: main.js
52
- sdk: 0.50.0
52
+ sdk: 0.51.0
53
53
  node: { package: Node.js_v22 }
54
54
 
55
55
  ui:
@@ -6,3 +6,9 @@ backend/app/*.js
6
6
  # Private NAS smoke sessions and credentials
7
7
  .e2e/
8
8
  .env
9
+ .env.*
10
+ !.env.example
11
+ *.pem
12
+ *.key
13
+ *.p12
14
+ .npmrc
@@ -9,6 +9,8 @@ delegate components come from `@synopackageland/sdk/vue` (types from
9
9
 
10
10
  ## Local tests
11
11
 
12
+ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real credentials out of examples and commits.
13
+
12
14
  From the project root, install the test tools before running the optional tests:
13
15
 
14
16
  ```sh
@@ -6,3 +6,9 @@ backend/app/*.js
6
6
  # Private NAS smoke sessions and credentials
7
7
  .e2e/
8
8
  .env
9
+ .env.*
10
+ !.env.example
11
+ *.pem
12
+ *.key
13
+ *.p12
14
+ .npmrc
@@ -0,0 +1,5 @@
1
+ # Optional AI tests only: replace these placeholders in your private .env.
2
+ # For an upstream fork, use synology/.env, never the fork root.
3
+ E2E_LLM_BASE_URL=https://api.example.com/v1
4
+ E2E_LLM_MODEL=replace-with-model
5
+ E2E_LLM_API_KEY=replace-with-api-key
@@ -31,6 +31,8 @@ nonblocking job. See the SDK's [request deadline contract](https://github.com/sy
31
31
 
32
32
  ## Local tests
33
33
 
34
+ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real credentials out of examples and commits.
35
+
34
36
  From the project root, install the test tools before running the optional tests:
35
37
 
36
38
  ```sh
@@ -47,7 +47,7 @@ backend:
47
47
  runtime: python
48
48
  dir: backend/app
49
49
  entry: main.py
50
- sdk: 0.50.0
50
+ sdk: 0.51.0
51
51
 
52
52
  ui:
53
53
  # Non-UI-SDK frontends open a full page; Portal is a separate opt-in.
@@ -4,3 +4,9 @@ __pycache__/
4
4
  # Private NAS smoke sessions and credentials
5
5
  .e2e/
6
6
  .env
7
+ .env.*
8
+ !.env.example
9
+ *.pem
10
+ *.key
11
+ *.p12
12
+ .npmrc
@@ -9,6 +9,8 @@ delegate components come from `@synopackageland/sdk/vue` (types from
9
9
 
10
10
  ## Local tests
11
11
 
12
+ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real credentials out of examples and commits.
13
+
12
14
  From the project root, install the test tools before running the optional tests:
13
15
 
14
16
  ```sh
@@ -5,3 +5,9 @@ node_modules/
5
5
  # Private NAS smoke sessions and credentials
6
6
  .e2e/
7
7
  .env
8
+ .env.*
9
+ !.env.example
10
+ *.pem
11
+ *.key
12
+ *.p12
13
+ .npmrc
@@ -0,0 +1,5 @@
1
+ # Optional AI tests only: replace these placeholders in your private .env.
2
+ # For an upstream fork, use synology/.env, never the fork root.
3
+ E2E_LLM_BASE_URL=https://api.example.com/v1
4
+ E2E_LLM_MODEL=replace-with-model
5
+ E2E_LLM_API_KEY=replace-with-api-key
@@ -31,6 +31,8 @@ nonblocking job. See the SDK's [request deadline contract](https://github.com/sy
31
31
 
32
32
  ## Local tests
33
33
 
34
+ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real credentials out of examples and commits.
35
+
34
36
  From the project root, install the test tools before running the optional tests:
35
37
 
36
38
  ```sh
@@ -104,8 +104,8 @@ dependencies = [
104
104
 
105
105
  [[package]]
106
106
  name = "syno-pkg-land-app"
107
- version = "0.50.0"
108
- source = "git+https://github.com/synopackageland/syno-pkg-land-sdk?tag=v0.50.0#b1adac9407cf1338fa79741ebfcbdaa5c1698b6f"
107
+ version = "0.51.0"
108
+ source = "git+https://github.com/synopackageland/syno-pkg-land-sdk?tag=v0.51.0#fffdbb3781fe7f8c57294cdf082b1bf347c0957d"
109
109
  dependencies = [
110
110
  "libc",
111
111
  "serde",
@@ -9,7 +9,7 @@ libc = "0.2"
9
9
  serde = { version = "1", features = ["derive"] }
10
10
  serde_json = "1"
11
11
  # The SDK version is the tag; `synopkgland check` reads it from Cargo.lock.
12
- syno-pkg-land-app = { git = "https://github.com/synopackageland/syno-pkg-land-sdk", tag = "v0.50.0" }
12
+ syno-pkg-land-app = { git = "https://github.com/synopackageland/syno-pkg-land-sdk", tag = "v0.51.0" }
13
13
 
14
14
  [profile.release]
15
15
  # A handler panic becomes an "internal" reply; abort would end the App without one.
@@ -4,3 +4,9 @@ backend/target/
4
4
  # Private NAS smoke sessions and credentials
5
5
  .e2e/
6
6
  .env
7
+ .env.*
8
+ !.env.example
9
+ *.pem
10
+ *.key
11
+ *.p12
12
+ .npmrc
@@ -170,8 +170,8 @@ dependencies = [
170
170
 
171
171
  [[package]]
172
172
  name = "syno-pkg-land-app"
173
- version = "0.50.0"
174
- source = "git+https://github.com/synopackageland/syno-pkg-land-sdk?tag=v0.50.0#b1adac9407cf1338fa79741ebfcbdaa5c1698b6f"
173
+ version = "0.51.0"
174
+ source = "git+https://github.com/synopackageland/syno-pkg-land-sdk?tag=v0.51.0#fffdbb3781fe7f8c57294cdf082b1bf347c0957d"
175
175
  dependencies = [
176
176
  "libc",
177
177
  "serde",
@@ -10,7 +10,7 @@ libc = "0.2"
10
10
  serde = { version = "1", features = ["derive"] }
11
11
  serde_json = "1"
12
12
  # The SDK version is the tag; `synopkgland check` reads it from Cargo.lock.
13
- syno-pkg-land-app = { git = "https://github.com/synopackageland/syno-pkg-land-sdk", tag = "v0.50.0" }
13
+ syno-pkg-land-app = { git = "https://github.com/synopackageland/syno-pkg-land-sdk", tag = "v0.51.0" }
14
14
 
15
15
  [profile.release]
16
16
  # A handler panic becomes an "internal" reply; abort would end the App without one.
@@ -9,6 +9,8 @@ delegate components come from `@synopackageland/sdk/vue` (types from
9
9
 
10
10
  ## Local tests
11
11
 
12
+ Copy `.env.example` to the ignored `.env` only for optional AI tests; keep real credentials out of examples and commits.
13
+
12
14
  From the project root, install the test tools before running the optional tests:
13
15
 
14
16
  ```sh
@@ -5,3 +5,9 @@ backend/target/
5
5
  # Private NAS smoke sessions and credentials
6
6
  .e2e/
7
7
  .env
8
+ .env.*
9
+ !.env.example
10
+ *.pem
11
+ *.key
12
+ *.p12
13
+ .npmrc