@synopackageland/cli 0.6.0 → 0.7.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 (585) hide show
  1. package/CHANGELOG.md +613 -0
  2. package/README.md +81 -78
  3. package/dist/add.js +39 -16
  4. package/dist/authorization-sdk.d.ts +7 -0
  5. package/dist/authorization-sdk.js +7 -0
  6. package/dist/build-spk/delegate-scope.d.ts +6 -0
  7. package/dist/build-spk/delegate-scope.js +34 -0
  8. package/dist/build-spk/dsm-arch.d.ts +7 -1
  9. package/dist/build-spk/dsm-arch.js +24 -28
  10. package/dist/build-spk/dsm-platforms.json +39 -0
  11. package/dist/build-spk/dsm-version.d.ts +11 -0
  12. package/dist/build-spk/dsm-version.js +17 -0
  13. package/dist/build-spk/gateway.d.ts +1 -1
  14. package/dist/build-spk/gateway.js +2 -2
  15. package/dist/build-spk/generator.js +30 -5
  16. package/dist/build-spk/notices.js +4 -1
  17. package/dist/build-spk/resource-worker.js +3 -0
  18. package/dist/build-spk/wizard-messages.d.ts +66 -0
  19. package/dist/build-spk/wizard-messages.js +75 -9
  20. package/dist/cli.js +30 -18
  21. package/dist/contract/schema-validate.js +8 -0
  22. package/dist/contract/validate.js +30 -0
  23. package/dist/deploy/deploy.d.ts +1 -1
  24. package/dist/deploy/deploy.js +8 -0
  25. package/dist/deploy/plan.js +1 -1
  26. package/dist/deploy/spk-version.js +1 -1
  27. package/dist/error-registry.js +46 -13
  28. package/dist/host/dsm-client.d.ts +8 -4
  29. package/dist/host/dsm-client.js +10 -4
  30. package/dist/host/types.d.ts +2 -1
  31. package/dist/info.js +18 -2
  32. package/dist/init.d.ts +3 -0
  33. package/dist/init.js +49 -18
  34. package/dist/package-metadata.d.ts +21 -0
  35. package/dist/package-metadata.js +101 -0
  36. package/dist/portal/alias.d.ts +25 -0
  37. package/dist/portal/alias.js +48 -0
  38. package/dist/portal/package.d.ts +33 -0
  39. package/dist/portal/package.js +116 -0
  40. package/dist/runtime/delegate-contract.d.ts +79 -0
  41. package/dist/runtime/delegate-contract.js +27 -0
  42. package/dist/runtime/executor-build.d.ts +1 -1
  43. package/dist/runtime/executor-build.js +5 -4
  44. package/dist/runtime/executor-inspect.d.ts +3 -0
  45. package/dist/runtime/executor-inspect.js +11 -5
  46. package/dist/runtime/executor-policy.d.ts +12 -0
  47. package/dist/runtime/executor-policy.js +43 -3
  48. package/dist/runtime/executor-scope-task.d.ts +4 -0
  49. package/dist/runtime/executor-scope-task.js +21 -0
  50. package/dist/runtime/executor-tasks.d.ts +2 -1
  51. package/dist/runtime/executor-tasks.js +4 -4
  52. package/dist/skill.js +1 -0
  53. package/dist/standalone/api-permissions.d.ts +10 -0
  54. package/dist/standalone/api-permissions.js +19 -2
  55. package/dist/standalone/background.d.ts +16 -0
  56. package/dist/standalone/background.js +69 -2
  57. package/dist/standalone/binary.d.ts +1 -1
  58. package/dist/standalone/binary.js +22 -8
  59. package/dist/standalone/build.d.ts +1 -1
  60. package/dist/standalone/build.js +38 -8
  61. package/dist/standalone/daemon.d.ts +1 -1
  62. package/dist/standalone/daemon.js +2 -1
  63. package/dist/standalone/dsm-window.d.ts +3 -1
  64. package/dist/standalone/dsm-window.js +72 -15
  65. package/dist/standalone/inspect-spk.d.ts +9 -1
  66. package/dist/standalone/inspect-spk.js +119 -26
  67. package/dist/standalone/lifecycle.js +86 -8
  68. package/dist/standalone/manifest.d.ts +13 -0
  69. package/dist/standalone/manifest.js +57 -8
  70. package/dist/standalone/native-authorization-window.d.ts +2 -0
  71. package/dist/standalone/native-authorization-window.js +30 -0
  72. package/dist/standalone/native-layout.d.ts +82 -0
  73. package/dist/standalone/native-layout.js +377 -0
  74. package/dist/standalone/native-root-window.d.ts +26 -0
  75. package/dist/standalone/native-root-window.js +282 -0
  76. package/dist/standalone/portal-window.d.ts +21 -0
  77. package/dist/standalone/portal-window.js +155 -0
  78. package/dist/standalone/portal.d.ts +4 -0
  79. package/dist/standalone/portal.js +4 -0
  80. package/dist/standalone/resource.d.ts +5 -3
  81. package/dist/standalone/resource.js +6 -3
  82. package/dist/standalone/root-window.js +62 -15
  83. package/dist/standalone/spk.d.ts +1 -1
  84. package/dist/standalone/spk.js +25 -7
  85. package/dist/templates/_daemon/main_test.go +61 -8
  86. package/dist/templates/_executor/README.md +127 -16
  87. package/dist/templates/_executor/anchor.go +146 -0
  88. package/dist/templates/_executor/anchor_test.go +126 -0
  89. package/dist/templates/_executor/apppriv_review_test.go +1 -1
  90. package/dist/templates/_executor/cancel_contract_test.go +236 -0
  91. package/dist/templates/_executor/copy.go +64 -0
  92. package/dist/templates/_executor/copy_test.go +88 -0
  93. package/dist/templates/_executor/dsm.go +23 -10
  94. package/dist/templates/_executor/dsm_test.go +95 -1
  95. package/dist/templates/_executor/executor.go +260 -49
  96. package/dist/templates/_executor/executor_test.go +36 -6
  97. package/dist/templates/_executor/identity.go +27 -1
  98. package/dist/templates/_executor/identity_kernel_linux_test.go +60 -0
  99. package/dist/templates/_executor/identity_linux.go +82 -0
  100. package/dist/templates/_executor/identity_security_test.go +43 -0
  101. package/dist/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
  102. package/dist/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
  103. package/dist/templates/_executor/internal/taskscript/boot.sh +9 -9
  104. package/dist/templates/_executor/internal/taskscript/cmd/main.go +2 -2
  105. package/dist/templates/_executor/internal/taskscript/control.sh +15 -10
  106. package/dist/templates/_executor/internal/taskscript/tasks.go +5 -3
  107. package/dist/templates/_executor/lifecycle_test.go +11 -0
  108. package/dist/templates/_executor/link_linux.go +28 -0
  109. package/dist/templates/_executor/long_running_test.go +530 -0
  110. package/dist/templates/_executor/main.go +72 -20
  111. package/dist/templates/_executor/move_linux.go +490 -0
  112. package/dist/templates/_executor/move_linux_test.go +460 -0
  113. package/dist/templates/_executor/move_validation.go +46 -0
  114. package/dist/templates/_executor/move_validation_test.go +187 -0
  115. package/dist/templates/_executor/operations.go +926 -0
  116. package/dist/templates/_executor/platform_linux.go +24 -173
  117. package/dist/templates/_executor/platform_linux_test.go +9 -65
  118. package/dist/templates/_executor/platform_other.go +30 -4
  119. package/dist/templates/_executor/process.go +3 -0
  120. package/dist/templates/_executor/records.go +242 -0
  121. package/dist/templates/_executor/scope_cancel_contract_test.go +91 -0
  122. package/dist/templates/_executor/scope_client.go +37 -0
  123. package/dist/templates/_executor/scope_contract.go +12 -0
  124. package/dist/templates/_executor/selected_scope.go +146 -0
  125. package/dist/templates/_executor/selected_scope_test.go +186 -0
  126. package/dist/templates/_executor/status_disabled_test.go +33 -0
  127. package/dist/templates/_executor/store.go +4 -3
  128. package/dist/templates/_executor/supervise.go +109 -0
  129. package/dist/templates/_executor/supervise_test.go +130 -0
  130. package/dist/templates/_executor/task_race_review_test.go +1 -1
  131. package/dist/templates/_executor/tasks.go +7 -8
  132. package/dist/templates/_executor/tasks_review_test.go +1 -1
  133. package/dist/templates/_executor/tasks_test.go +4 -4
  134. package/dist/templates/_executor/watch.go +8 -0
  135. package/dist/templates/_executor/watch_test.go +23 -2
  136. package/dist/templates/_executor/write_review_linux_test.go +4 -12
  137. package/dist/templates/_shared/AGENTS.md +129 -0
  138. package/dist/templates/binary/dsm-package.yaml +24 -0
  139. package/dist/templates/binary/i18n/messages/de.json +4 -0
  140. package/dist/templates/binary/i18n/messages/en.json +4 -0
  141. package/dist/templates/binary/i18n/messages/es.json +4 -0
  142. package/dist/templates/binary/i18n/messages/fr.json +4 -0
  143. package/dist/templates/binary/i18n/messages/it.json +4 -0
  144. package/dist/templates/binary/i18n/messages/ja.json +4 -0
  145. package/dist/templates/binary/i18n/messages/ko.json +4 -0
  146. package/dist/templates/binary/i18n/messages/zh-CN.json +4 -0
  147. package/dist/templates/binary/i18n/messages/zh-TW.json +4 -0
  148. package/dist/templates/binary/ui/app.js +19 -4
  149. package/dist/templates/native-authorization/AuthorizationGate.vue +91 -0
  150. package/dist/templates/native-authorization/i18n/de.json +37 -0
  151. package/dist/templates/native-authorization/i18n/en.json +37 -0
  152. package/dist/templates/native-authorization/i18n/es.json +37 -0
  153. package/dist/templates/native-authorization/i18n/fr.json +37 -0
  154. package/dist/templates/native-authorization/i18n/index.ts +15 -0
  155. package/dist/templates/native-authorization/i18n/it.json +37 -0
  156. package/dist/templates/native-authorization/i18n/ja.json +37 -0
  157. package/dist/templates/native-authorization/i18n/ko.json +37 -0
  158. package/dist/templates/native-authorization/i18n/zh-CN.json +37 -0
  159. package/dist/templates/native-authorization/i18n/zh-TW.json +37 -0
  160. package/dist/templates/native-go/README.md +43 -10
  161. package/dist/templates/native-go/backend/cmd/app/main.go +27 -7
  162. package/dist/templates/native-go/backend/internal/api/entry_test.go +47 -0
  163. package/dist/templates/native-go/backend/internal/api/permissions_test.go +3 -3
  164. package/dist/templates/native-go/backend/internal/api/registry.go +11 -0
  165. package/dist/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
  166. package/dist/templates/native-go/backend/internal/api/server.go +18 -5
  167. package/dist/templates/native-go/backend/internal/app/delegate_config.go +57 -0
  168. package/dist/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
  169. package/dist/templates/native-go/backend/internal/app/portal.go +30 -0
  170. package/dist/templates/native-go/backend/internal/app/portal_test.go +55 -0
  171. package/dist/templates/native-go/backend/internal/app/routes.go +8 -2
  172. package/dist/templates/native-go/backend/internal/background/runner.go +1 -1
  173. package/dist/templates/native-go/backend/internal/background/store.go +16 -14
  174. package/dist/templates/native-go/backend/internal/dsm/admin.go +8 -2
  175. package/dist/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
  176. package/dist/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
  177. package/dist/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
  178. package/dist/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
  179. package/dist/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
  180. package/dist/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
  181. package/dist/templates/native-go/backend/internal/dsm/entry.go +177 -0
  182. package/dist/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
  183. package/dist/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
  184. package/dist/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
  185. package/dist/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
  186. package/dist/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
  187. package/dist/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
  188. package/dist/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
  189. package/dist/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
  190. package/dist/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
  191. package/dist/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
  192. package/dist/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
  193. package/dist/templates/native-go/backend/internal/filestation/service.go +1 -1
  194. package/dist/templates/native-go/backend/internal/portal/portal.go +138 -0
  195. package/dist/templates/native-go/backend/internal/portal/portal_test.go +89 -0
  196. package/dist/templates/native-go/dsm-package.yaml +20 -1
  197. package/dist/templates/native-go/i18n/glossary.json +2 -1
  198. package/dist/templates/native-go/i18n/messages/de.json +1 -0
  199. package/dist/templates/native-go/i18n/messages/en.json +1 -0
  200. package/dist/templates/native-go/i18n/messages/es.json +1 -0
  201. package/dist/templates/native-go/i18n/messages/fr.json +1 -0
  202. package/dist/templates/native-go/i18n/messages/it.json +1 -0
  203. package/dist/templates/native-go/i18n/messages/ja.json +1 -0
  204. package/dist/templates/native-go/i18n/messages/ko.json +1 -0
  205. package/dist/templates/native-go/i18n/messages/zh-CN.json +1 -0
  206. package/dist/templates/native-go/i18n/messages/zh-TW.json +1 -0
  207. package/dist/templates/native-go/ui/app.css +10 -0
  208. package/dist/templates/native-go/ui/app.js +11 -1
  209. package/dist/templates/native-go-delegate/DELEGATE.md +126 -5
  210. package/dist/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
  211. package/dist/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
  212. package/dist/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
  213. package/dist/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
  214. package/dist/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
  215. package/dist/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
  216. package/dist/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
  217. package/dist/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
  218. package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
  219. package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
  220. package/dist/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
  221. package/dist/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
  222. package/dist/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
  223. package/dist/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
  224. package/dist/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
  225. package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
  226. package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
  227. package/dist/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
  228. package/dist/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
  229. package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
  230. package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
  231. package/dist/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
  232. package/dist/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
  233. package/dist/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
  234. package/dist/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
  235. package/dist/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
  236. package/dist/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
  237. package/dist/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
  238. package/dist/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
  239. package/dist/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
  240. package/dist/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
  241. package/dist/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
  242. package/dist/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
  243. package/dist/templates/native-go-delegate/test.sh +1 -0
  244. package/dist/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
  245. package/dist/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
  246. package/dist/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
  247. package/dist/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
  248. package/dist/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
  249. package/dist/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
  250. package/dist/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
  251. package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
  252. package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
  253. package/dist/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
  254. package/dist/templates/native-go-vue/README.md +4 -0
  255. package/dist/templates/native-go-vue/frontend/package-lock.json +4 -4
  256. package/dist/templates/native-go-vue/frontend/package.json +1 -1
  257. package/dist/templates/native-go-vue/frontend/src/App.vue +18 -13
  258. package/dist/templates/native-go-vue/frontend/src/context.ts +31 -0
  259. package/dist/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +52 -8
  260. package/dist/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
  261. package/dist/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
  262. package/dist/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
  263. package/dist/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +4 -2
  264. package/dist/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
  265. package/dist/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
  266. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/de.json +46 -0
  267. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/en.json +12 -2
  268. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/es.json +46 -0
  269. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +46 -0
  270. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/it.json +46 -0
  271. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +46 -0
  272. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +46 -0
  273. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
  274. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
  275. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
  276. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
  277. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
  278. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
  279. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
  280. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
  281. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
  282. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +46 -0
  283. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +15 -5
  284. package/dist/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
  285. package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
  286. package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
  287. package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
  288. package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
  289. package/dist/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
  290. package/dist/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
  291. package/dist/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
  292. package/dist/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
  293. package/dist/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
  294. package/dist/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
  295. package/dist/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
  296. package/dist/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
  297. package/dist/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
  298. package/dist/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
  299. package/dist/templates/native-go-vue/frontend/src/i18n.ts +13 -0
  300. package/dist/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
  301. package/dist/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
  302. package/dist/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
  303. package/dist/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
  304. package/dist/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
  305. package/dist/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
  306. package/dist/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
  307. package/dist/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
  308. package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
  309. package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
  310. package/dist/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
  311. package/dist/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
  312. package/dist/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
  313. package/dist/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
  314. package/dist/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
  315. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
  316. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
  317. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
  318. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
  319. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
  320. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
  321. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
  322. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
  323. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
  324. package/dist/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
  325. package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
  326. package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
  327. package/dist/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
  328. package/dist/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
  329. package/dist/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
  330. package/dist/validate.js +2 -1
  331. package/package.json +12 -2
  332. package/schema/package-metadata.schema.json +101 -0
  333. package/schema/synology-app.schema.json +112 -0
  334. package/skills/SKILL.md +109 -3
  335. package/skills/reference/create.md +101 -2
  336. package/skills/reference/deploy.md +2 -2
  337. package/skills/reference/files.md +113 -2
  338. package/skills/reference/identity.md +70 -1
  339. package/skills/reference/portal.md +17 -0
  340. package/skills/reference/ui-vue.md +12 -0
  341. package/templates/_daemon/main_test.go +61 -8
  342. package/templates/_executor/README.md +127 -16
  343. package/templates/_executor/anchor.go +146 -0
  344. package/templates/_executor/anchor_test.go +126 -0
  345. package/templates/_executor/apppriv_review_test.go +1 -1
  346. package/templates/_executor/cancel_contract_test.go +236 -0
  347. package/templates/_executor/copy.go +64 -0
  348. package/templates/_executor/copy_test.go +88 -0
  349. package/templates/_executor/dsm.go +23 -10
  350. package/templates/_executor/dsm_test.go +95 -1
  351. package/templates/_executor/executor.go +260 -49
  352. package/templates/_executor/executor_test.go +36 -6
  353. package/templates/_executor/identity.go +27 -1
  354. package/templates/_executor/identity_kernel_linux_test.go +60 -0
  355. package/templates/_executor/identity_linux.go +82 -0
  356. package/templates/_executor/identity_security_test.go +43 -0
  357. package/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
  358. package/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
  359. package/templates/_executor/internal/taskscript/boot.sh +9 -9
  360. package/templates/_executor/internal/taskscript/cmd/main.go +2 -2
  361. package/templates/_executor/internal/taskscript/control.sh +15 -10
  362. package/templates/_executor/internal/taskscript/tasks.go +5 -3
  363. package/templates/_executor/lifecycle_test.go +11 -0
  364. package/templates/_executor/link_linux.go +28 -0
  365. package/templates/_executor/long_running_test.go +530 -0
  366. package/templates/_executor/main.go +72 -20
  367. package/templates/_executor/move_linux.go +490 -0
  368. package/templates/_executor/move_linux_test.go +460 -0
  369. package/templates/_executor/move_validation.go +46 -0
  370. package/templates/_executor/move_validation_test.go +187 -0
  371. package/templates/_executor/operations.go +926 -0
  372. package/templates/_executor/platform_linux.go +24 -173
  373. package/templates/_executor/platform_linux_test.go +9 -65
  374. package/templates/_executor/platform_other.go +30 -4
  375. package/templates/_executor/process.go +3 -0
  376. package/templates/_executor/records.go +242 -0
  377. package/templates/_executor/scope_cancel_contract_test.go +91 -0
  378. package/templates/_executor/scope_client.go +37 -0
  379. package/templates/_executor/scope_contract.go +12 -0
  380. package/templates/_executor/selected_scope.go +146 -0
  381. package/templates/_executor/selected_scope_test.go +186 -0
  382. package/templates/_executor/status_disabled_test.go +33 -0
  383. package/templates/_executor/store.go +4 -3
  384. package/templates/_executor/supervise.go +109 -0
  385. package/templates/_executor/supervise_test.go +130 -0
  386. package/templates/_executor/task_race_review_test.go +1 -1
  387. package/templates/_executor/tasks.go +7 -8
  388. package/templates/_executor/tasks_review_test.go +1 -1
  389. package/templates/_executor/tasks_test.go +4 -4
  390. package/templates/_executor/watch.go +8 -0
  391. package/templates/_executor/watch_test.go +23 -2
  392. package/templates/_executor/write_review_linux_test.go +4 -12
  393. package/templates/_shared/AGENTS.md +129 -0
  394. package/templates/binary/dsm-package.yaml +24 -0
  395. package/templates/binary/i18n/messages/de.json +4 -0
  396. package/templates/binary/i18n/messages/en.json +4 -0
  397. package/templates/binary/i18n/messages/es.json +4 -0
  398. package/templates/binary/i18n/messages/fr.json +4 -0
  399. package/templates/binary/i18n/messages/it.json +4 -0
  400. package/templates/binary/i18n/messages/ja.json +4 -0
  401. package/templates/binary/i18n/messages/ko.json +4 -0
  402. package/templates/binary/i18n/messages/zh-CN.json +4 -0
  403. package/templates/binary/i18n/messages/zh-TW.json +4 -0
  404. package/templates/binary/ui/app.js +19 -4
  405. package/templates/native-authorization/AuthorizationGate.vue +91 -0
  406. package/templates/native-authorization/i18n/de.json +37 -0
  407. package/templates/native-authorization/i18n/en.json +37 -0
  408. package/templates/native-authorization/i18n/es.json +37 -0
  409. package/templates/native-authorization/i18n/fr.json +37 -0
  410. package/templates/native-authorization/i18n/index.ts +15 -0
  411. package/templates/native-authorization/i18n/it.json +37 -0
  412. package/templates/native-authorization/i18n/ja.json +37 -0
  413. package/templates/native-authorization/i18n/ko.json +37 -0
  414. package/templates/native-authorization/i18n/zh-CN.json +37 -0
  415. package/templates/native-authorization/i18n/zh-TW.json +37 -0
  416. package/templates/native-go/README.md +43 -10
  417. package/templates/native-go/backend/cmd/app/main.go +27 -7
  418. package/templates/native-go/backend/internal/api/entry_test.go +47 -0
  419. package/templates/native-go/backend/internal/api/permissions_test.go +3 -3
  420. package/templates/native-go/backend/internal/api/registry.go +11 -0
  421. package/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
  422. package/templates/native-go/backend/internal/api/server.go +18 -5
  423. package/templates/native-go/backend/internal/app/delegate_config.go +57 -0
  424. package/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
  425. package/templates/native-go/backend/internal/app/portal.go +30 -0
  426. package/templates/native-go/backend/internal/app/portal_test.go +55 -0
  427. package/templates/native-go/backend/internal/app/routes.go +8 -2
  428. package/templates/native-go/backend/internal/background/runner.go +1 -1
  429. package/templates/native-go/backend/internal/background/store.go +16 -14
  430. package/templates/native-go/backend/internal/dsm/admin.go +8 -2
  431. package/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
  432. package/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
  433. package/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
  434. package/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
  435. package/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
  436. package/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
  437. package/templates/native-go/backend/internal/dsm/entry.go +177 -0
  438. package/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
  439. package/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
  440. package/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
  441. package/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
  442. package/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
  443. package/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
  444. package/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
  445. package/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
  446. package/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
  447. package/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
  448. package/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
  449. package/templates/native-go/backend/internal/filestation/service.go +1 -1
  450. package/templates/native-go/backend/internal/portal/portal.go +138 -0
  451. package/templates/native-go/backend/internal/portal/portal_test.go +89 -0
  452. package/templates/native-go/dsm-package.yaml +20 -1
  453. package/templates/native-go/i18n/glossary.json +2 -1
  454. package/templates/native-go/i18n/messages/de.json +1 -0
  455. package/templates/native-go/i18n/messages/en.json +1 -0
  456. package/templates/native-go/i18n/messages/es.json +1 -0
  457. package/templates/native-go/i18n/messages/fr.json +1 -0
  458. package/templates/native-go/i18n/messages/it.json +1 -0
  459. package/templates/native-go/i18n/messages/ja.json +1 -0
  460. package/templates/native-go/i18n/messages/ko.json +1 -0
  461. package/templates/native-go/i18n/messages/zh-CN.json +1 -0
  462. package/templates/native-go/i18n/messages/zh-TW.json +1 -0
  463. package/templates/native-go/ui/app.css +10 -0
  464. package/templates/native-go/ui/app.js +11 -1
  465. package/templates/native-go-delegate/DELEGATE.md +126 -5
  466. package/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
  467. package/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
  468. package/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
  469. package/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
  470. package/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
  471. package/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
  472. package/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
  473. package/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
  474. package/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
  475. package/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
  476. package/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
  477. package/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
  478. package/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
  479. package/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
  480. package/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
  481. package/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
  482. package/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
  483. package/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
  484. package/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
  485. package/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
  486. package/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
  487. package/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
  488. package/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
  489. package/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
  490. package/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
  491. package/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
  492. package/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
  493. package/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
  494. package/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
  495. package/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
  496. package/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
  497. package/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
  498. package/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
  499. package/templates/native-go-delegate/test.sh +1 -0
  500. package/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
  501. package/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
  502. package/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
  503. package/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
  504. package/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
  505. package/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
  506. package/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
  507. package/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
  508. package/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
  509. package/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
  510. package/templates/native-go-vue/README.md +4 -0
  511. package/templates/native-go-vue/frontend/package-lock.json +4 -4
  512. package/templates/native-go-vue/frontend/package.json +1 -1
  513. package/templates/native-go-vue/frontend/src/App.vue +18 -13
  514. package/templates/native-go-vue/frontend/src/context.ts +31 -0
  515. package/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +52 -8
  516. package/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
  517. package/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
  518. package/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
  519. package/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +4 -2
  520. package/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
  521. package/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
  522. package/templates/native-go-vue/frontend/src/delegate/i18n/de.json +46 -0
  523. package/templates/native-go-vue/frontend/src/delegate/i18n/en.json +12 -2
  524. package/templates/native-go-vue/frontend/src/delegate/i18n/es.json +46 -0
  525. package/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +46 -0
  526. package/templates/native-go-vue/frontend/src/delegate/i18n/it.json +46 -0
  527. package/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +46 -0
  528. package/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +46 -0
  529. package/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
  530. package/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
  531. package/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
  532. package/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
  533. package/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
  534. package/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
  535. package/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
  536. package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
  537. package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
  538. package/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +46 -0
  539. package/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +15 -5
  540. package/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
  541. package/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
  542. package/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
  543. package/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
  544. package/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
  545. package/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
  546. package/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
  547. package/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
  548. package/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
  549. package/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
  550. package/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
  551. package/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
  552. package/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
  553. package/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
  554. package/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
  555. package/templates/native-go-vue/frontend/src/i18n.ts +13 -0
  556. package/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
  557. package/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
  558. package/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
  559. package/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
  560. package/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
  561. package/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
  562. package/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
  563. package/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
  564. package/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
  565. package/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
  566. package/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
  567. package/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
  568. package/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
  569. package/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
  570. package/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
  571. package/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
  572. package/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
  573. package/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
  574. package/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
  575. package/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
  576. package/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
  577. package/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
  578. package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
  579. package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
  580. package/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
  581. package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
  582. package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
  583. package/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
  584. package/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
  585. package/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,613 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ## 0.7.0 (2026-10-10)
6
+
7
+ Rebuild packages to pick up template, hook and executor changes. The executor
8
+ digest changed: apps approved under an earlier CLI need one administrator
9
+ approval after upgrading.
10
+
11
+ ### Delegate: save destinations that last until revoked
12
+
13
+ - `init --with delegate` / `add delegate` now declare `operations:
14
+ [files.moveFromStaging]`, `destinations: [save]`, `lifetime: until-revoked`,
15
+ `scope: install-selected`. Existing TTL declarations (`files.list` …
16
+ `files.write`, `scope: home`) keep their API and limits.
17
+ - The install wizard pre-selects home or a local share and an administrator
18
+ confirms it once. Choosing a destination in the SDK NasPicker grants it until
19
+ revoked, after fresh DSM session, UID and write checks; administrators run as
20
+ their own UID, never root. Read the choice from `delegate.status`
21
+ `selection`, `sdk.destination(key)` or Go `Service.Destination`.
22
+ - Daemon and export producers save through Go `Service.MoveFromStaging`. The
23
+ generated Background saves page (`createBackgroundSaveFacade`) lists, cancels
24
+ and revokes them and includes a working example (`ExportExample`). Daemon can
25
+ combine with an until-revoked delegate worker.
26
+ - Retrying `MoveFromStaging` with the same params never copies twice. Journal
27
+ errors `canceled`, `jobs_busy` and `jobs_unavailable` are retryable;
28
+ `spool_unsafe` and `journal_corrupt` are terminal.
29
+ - Cancel is idempotent per reference and survives executor crash, package
30
+ restart and logout. Revoke, scope change and disable settle copies in flight
31
+ as `canceled` with that reason (for example `scope-changed`); a scope change
32
+ no longer restarts the executor. Poll `ctx.executor.status()` while a change
33
+ answers `blocked`.
34
+ - Full device lifecycle acceptance (install → setup → reboot → upgrade → revoke
35
+ → uninstall) is still pending.
36
+
37
+ ### Executor
38
+
39
+ - Upgrades keep approval: each SPK writes its executor SHA-256 into INFO
40
+ (`synopkgland_executor_sha256`), and a new executor that matches it installs
41
+ without PasswordConfirm as long as the policy is unchanged. Policy changes
42
+ (operations, scope, destinations, root scripts) still need approval. `inspect`
43
+ refuses a missing, duplicated or different anchor.
44
+ - A root supervisor restarts the monitor after a crash or kill (1–60 s
45
+ backoff), so delegate and rootOps recover without a reboot.
46
+ - Every write publishes only through the executor handshake. A copy whose
47
+ executor died stops within 1 MiB and removes its `.part`; a lost publish
48
+ receipt settles `committed` without copying again.
49
+ - A package without an executor can add one in place on upgrade. Upgrade does
50
+ not approve an install-selected scope; confirm it in Settings.
51
+ - Uninstalling a stopped package no longer leaves root tasks and the monitor
52
+ running for ten minutes; the hook waits at most 50 s for the executor to clean
53
+ up.
54
+
55
+ ### Native layout: per-architecture INFO trust anchors
56
+
57
+ - `layout.anchors` maps `<key>_sha256` to a payload file. `build` writes that
58
+ architecture's SHA-256 of the file into INFO, so a product root helper can
59
+ trust a new build through the root-owned INFO instead of reapproval. Keys
60
+ match `^[a-z][a-z0-9_]{0,48}_sha256$`, the `synopkgland_` prefix is reserved,
61
+ and at most 16 are allowed. `inspect` refuses a changed, duplicated, missing
62
+ or undeclared anchor.
63
+
64
+ ### App entry and Application Privileges
65
+
66
+ - `entry: admin-only` admits administrators only, on every route including the
67
+ SDK routes; ordinary users get `admin_required`. `entry: app-privilege`
68
+ registers the app in Control Panel > Application Privileges and gates every
69
+ route on DSM's decision (`app_privilege_denied`). Omitting `entry` keeps the
70
+ previous behaviour and byte-identical SPKs.
71
+ - With an `entry`, an app route marked `authenticated` or `public` fails with
72
+ `STANDALONE_ENTRY_WIDENED`. `inspect` prints the entry mode and flags
73
+ `ENTRY_LAUNCHER_MISMATCH`.
74
+ - The executor applies the same rule: moves for a user DSM no longer allows are
75
+ refused (`APP_DENIED`).
76
+ - `ctx.user = {name, isAdmin}` lets UIs hide administrator settings; guard them
77
+ on the server with Go `api.RequireAdmin(caller)`.
78
+ - On Linux 3.10 kernels without `memfd_create` (DSM 7 on x86_64 avoton,
79
+ braswell, bromolow, grantley) the administrator and App Privileges bridges run
80
+ from an unlinked file in the package's own tmp instead of failing. That path
81
+ has no memfd seal. Verified on DSM 7.1.1 with an armv7 build only; no x86_64
82
+ Linux 3.10 model has been tested.
83
+
84
+ ### Application Portal
85
+
86
+ - `portal: {}` or `portal: {alias}` (native) and `integration.web.portal`
87
+ (Compose DSM-window apps); `synopkgland add portal` adds it. The install
88
+ wizard prefills the alias, upgrades keep it and an administrator activates it.
89
+ - `ctx.portal.mountPanel(element)` shows the link, or the alias form to
90
+ administrators; the Vue and plain starters mount it.
91
+ - A portal needs `os_min_ver` 7.3.2-86009 or later (DSM 7.1.1 rejects it with
92
+ error 320; 7.2 is untested). validate/build fail with
93
+ `STANDALONE_PORTAL_MIN_DSM` / `CONTRACT_PORTAL_MIN_DSM`, and `add portal`
94
+ raises a lower `os_min_ver`.
95
+
96
+ ### Catalog metadata
97
+
98
+ - An optional `metadata:` block (contact/support email, homepage, source and
99
+ issues URLs, license, localized long description, changelog, screenshots) is
100
+ validated and written to INFO for the package catalog.
101
+ - `metadata.changelog` may be a per-language map. Package Center shows one line
102
+ in the NAS language, so put the most important change first.
103
+
104
+ ### Native authorization
105
+
106
+ - `authorization_required` gains `reason: upgrade_reapproval` when an upgrade
107
+ revoked the old grant; the Gate template explains the next step in nine
108
+ languages. Products that sync the Gate need their helper to write and clear
109
+ the reason-only tombstone, which grants nothing.
110
+
111
+ ### Lifecycle
112
+
113
+ - Background packages restart a package user systemd manager that lost its
114
+ runtime socket; a failed worker start names the unit, exit code and socket
115
+ state.
116
+ - Stopping the worker is idempotent, fixing uninstall failure 314 for
117
+ delegate+daemon+jobs.
118
+
119
+ ### Templates in nine languages
120
+
121
+ - All template UI text and install, upgrade and uninstall wizard messages come
122
+ from catalogs in the nine DSM languages and follow DSM glossary wording. Sizes
123
+ use DSM's 1024-based KB/MB/GB. Rebuilt Vue and binary SPKs change bytes;
124
+ plain-UI SPKs are unchanged.
125
+ - Vue templates pin public `@synopackageland/ui@0.8.1`; the upload FilePicker
126
+ states `max 16 GB`.
127
+
128
+ ### armv7 (32-bit ARM) for native-go and binary packages
129
+
130
+ - `arches` accepts `armv7` (INFO `alpine alpine4k armada38x monaco`, DSM 7.2+);
131
+ the default stays `[x86_64, aarch64]`. It covers the Go CGI (plain or Vue UI),
132
+ `backend.kind: binary`, jobs, daemon, root-ops and delegate. Container
133
+ projects refuse it with `CONTAINER_ARCH_UNSUPPORTED`.
134
+ - The plain native-go CGI was verified on a DS416 (DSM 7.1.1, `alpine4k`).
135
+ armv7 jobs, daemon, executor and lifecycle helper are built and checked but
136
+ not yet verified on a NAS; `armada38x` and `monaco` are untested.
137
+ - `deploy` detects armv7 from an Annapurna Labs CPU and asks for `--arch` on a
138
+ Marvell CPU. x86_64 and aarch64 bridge, executor and lifecycle bytes are
139
+ unchanged by the armv7 work.
140
+
141
+ ### Packaging
142
+
143
+ - The npm tarball includes this CHANGELOG.md.
144
+
145
+ ### 繁體中文摘要
146
+
147
+ - 升級後重新建置套件;executor digest 改變,舊版 CLI 核准過的 app 需要管理員再核准一次。
148
+ - delegate:預設改為長期存檔目的地(`files.moveFromStaging`、安裝時選 scope、管理員確認一次、
149
+ 在 NasPicker 選目的地即授權至撤銷);Background saves 頁、`MoveFromStaging` 重送不重複複製、
150
+ 取消跨重啟保留。完整裝置生命週期驗收仍待完成。
151
+ - executor:INFO 錨定 executor SHA-256,policy 不變的升級免再核准;root supervisor 異常後自動重啟;
152
+ 卸載已停止的套件不再殘留 root task。
153
+ - 原生 layout:`layout.anchors` 依架構把 payload 檔 SHA-256 寫進 INFO,作為產品 root helper 的信任錨點。
154
+ - `entry: admin-only | app-privilege`(DSM 應用程式權限)、`ctx.user.isAdmin`、`api.RequireAdmin`;
155
+ 未宣告 entry 的 SPK 不變。Linux 3.10 無 memfd_create 時 bridge 改由套件 tmp 執行(無 memfd seal)。
156
+ - Application Portal(`portal:`、`add portal`、`ctx.portal`),需 os_min_ver 7.3.2-86009 以上;
157
+ 目錄 `metadata:` 寫入 INFO,`metadata.changelog` 可依語言分開。
158
+ - 授權契約新增 `reason: upgrade_reapproval`;背景套件 user manager 恢復、卸載 314 修正。
159
+ - 範本與安裝精靈全部九語系並依 DSM 用語;Vue 範本固定 UI 0.8.1。
160
+ - armv7(DSM 7.2+)支援 native-go 與 binary;plain CGI 已在 DS416 實機驗證,jobs/daemon/executor 尚未實機驗證。
161
+ - npm 套件附 CHANGELOG.md。
162
+
163
+ ## 0.6.1
164
+
165
+ - Restore native product packaging as a formal schema 2 `backend: {kind: native}`
166
+ route. Keep project-owned multi-binary payload/metadata layout, prepare/compile
167
+ argv hooks, HTTPS/SHA-256 toolkit acquisition and x86_64/aarch64/armv8/armv7.
168
+ `check`, `build` and `inspect --json` preserve package-only lifecycle/systemd
169
+ registration and reject root service accounts, privileged execution prefixes,
170
+ symlinks, setuid files and corrupt toolkit/payload inventories.
171
+ - Restore `@synopackageland/cli/authorization-sdk` as an explicit native-product
172
+ adapter with exact pinned-task identity, fresh administrator approval and
173
+ withdrawal-before-task-removal; do not change generated Go executor semantics.
174
+ Export `./native-layout` and retain direct `./dist/*` imports.
175
+ - Document field migration from schema 1 without changing product bootstrap pins,
176
+ per-build revocation/reapproval or dynamic DSM ABI declarations. Schema 1 remains
177
+ rejected; no compatibility aliases for retired CLI commands. Generated schema 2
178
+ check/build/status/logs and Connect/Gopeed APIs remain unchanged.
179
+ - Align SKILL.md with the shipped delegate/rootOps executor implementation and
180
+ its documented device acceptance boundaries.
181
+ - 正式補回 schema 2 原生產品 layout/hooks/toolkit/三架構及 authorization SDK。
182
+ lifecycle/systemd 維持 package account;root 僅由產品明確核准 digest,
183
+ 不自動授權、不取消逐 build 撤權再授權。新增 Reclaim 欄位 migration 指引。
184
+
185
+ ## 0.6.0
186
+
187
+ - Adopt UI 0.8.0 and its renamed `syno-pkg-land-ui` executable (no old alias).
188
+ Pin generated Vue apps and all overlays to the public npm artifact and integrity.
189
+ Skills discover the installed prompt/catalog/describe contract with
190
+ `npx --no syno-pkg-land-ui`; one-off use explicitly selects the npm package.
191
+ Render defaults to `syno-pkg-land-ui-render`. CSS/data selectors use the
192
+ `syno-pkg-land-ui` namespace without old aliases (including select attributes).
193
+ Add a regression audit for executable names and retired CSS/data selectors in
194
+ skills, templates, source, tests, docs and scripts; only released history is exempt.
195
+ 跟進 UI 0.8.0 的 CLI 改名及公開 npm integrity;AI 指引維持版本無關,
196
+ 使用已安裝契約,並防止指令名與 selector 回退。預設截圖目錄改為
197
+ `syno-pkg-land-ui-render`;CSS/data selector 全面使用新 namespace,不保留 alias。
198
+
199
+ - Add version-independent Vue UI guidance alongside JSON UI guidance. All
200
+ generated projects include AGENTS.md and a CLAUDE.md pointer to discover the
201
+ bundled skills and run local check/build/inspect before authorized NAS work.
202
+ Template design notes use installed UI contracts while dependency pins remain.
203
+ 新增 Vue UI skill;所有 scaffold 提供 AI 入口與本機驗證流程,設計文件依已安裝
204
+ SDK 契約,依賴鎖定不變。
205
+
206
+ - **Breaking: remove `./authorization-sdk` and the legacy root authorization
207
+ templates and adapters.** Use delegate/root-ops capabilities and the protected
208
+ executor with one-time administrator approval; no compatibility exports remain.
209
+ **不保留相容**:移除 `./authorization-sdk` 與舊 root authorization 模板/adapter,
210
+ 改用 delegate/root-ops 能力及受保護 executor 的一次管理員核准。
211
+
212
+ - Pin generated Vue apps to public `@synopackageland/ui@0.8.0` with its npm
213
+ integrity; keep bounded app-local modal roots, embedded CSS and unique mount
214
+ ID prefixes, and explicitly retain DSM window layout at wide sizes.
215
+ Add `skill show ui-json` with installed prompt/catalog/schema discovery,
216
+ strict validation and screenshot/layout checks through the published `syno-pkg-land-ui`
217
+ package bin. Update the template
218
+ DOM test dependency and website configuration to remove gate warnings.
219
+ Vue 模板固定公開 UI 0.8.0 與 integrity,維持 DSM 的 app scope、embedded CSS、
220
+ 唯一 mount ID 與 window layout;新增不固定版本的 JSON UI skill,依已安裝
221
+ catalog/schema 產生、嚴格驗證並 render,直接使用套件的 `syno-pkg-land-ui` bin。
222
+
223
+ - **Delegate (C), P2/v10 (through 26030e74):** `init --with delegate` / `add delegate` imply jobs;
224
+ manifest operations use the five fixed files.* IDs with home/shared scope.
225
+ The worker stages downloads and writes as the consenting user after browser
226
+ close, without overwriting existing files or retaining DSM credentials.
227
+ C/R share one-password boot/control task setup and digest approval; stop pauses,
228
+ start resumes identical pins, changed policy requires reapproval, and uninstall
229
+ requests asynchronous own-task/protected-state purge (normally seconds with a
230
+ healthy monitor), with manual cleanup guidance. Task deletion requires byte-for-byte
231
+ equality with canonical scripts regenerated from package identity and approved pins.
232
+ Purge reapproval recreates tasks and writes `start` before boot; mailbox failure
233
+ blocks boot. Local fake-DSM/real-executor lifecycle tests cover this recovery.
234
+ Package-directory/INFO identity absence immediately pauses the socket/requests,
235
+ retaining the monitor, approved runtime, delegations and tasks. Polling every
236
+ 500 ms must confirm 10 continuous minutes of absence before fallback purge;
237
+ reappearance or unverifiable absence resets the timer, with uncertainty staying paused.
238
+ Recovery rereads even an unchanged mailbox: matching-pin `start` resumes,
239
+ changed pins stay paused/needs-admin-approval, `stop` stays paused, and `purge`
240
+ immediately clears state. Temporary DSM-upgrade gaps preserve protected state;
241
+ preuninst purge remains immediate, with asynchronous cleanup. Boot's absent-package
242
+ retained-pin purge remains immediate. Local tests cover upgrade gaps, recovery,
243
+ timer/reset rules and immediate preuninst purge; device acceptance remains separate.
244
+ Malformed AppPriv responses fail closed, including duplicate keys/target entries,
245
+ null/missing data and nested error keys. Matching token header aliases are allowed;
246
+ conflicting/repeated headers, duplicate id cookies and controls are refused.
247
+ Empty/partial caller auth never falls back to worker revoke. Job admission reserves
248
+ before creating grants outside the journal lock; retry `jobs_busy` with the same key.
249
+ Writes fsync an exclusive hidden temporary then publish a hard link without overwrite;
250
+ cancellation cleans the temporary and leaves no partial final file.
251
+ Add bilingual developer and administrator guides covering typed Files, stable
252
+ errors, AppPriv defaults/denies and DSM-retained directories/accounts.
253
+ Full device lifecycle acceptance remains separate from source/local tests.
254
+ Delegate 隱含 jobs;以本人身分離線寫檔、不覆寫、不保存 DSM 憑證。
255
+ C/R 共用一次密碼設定與 digest 核准;中英文文件說明委託/撤銷、
256
+ typed Files、穩定錯誤碼、paused/purge、手動清理與 DSM 保留界線。
257
+ AppPriv 異常回應 fail-closed;token alias 同值允許、衝突/重複及控制字元拒絕,
258
+ 空/不完整 caller auth 不降級為 worker。`jobs_busy` 沿用相同 key 重試。
259
+ 隱藏暫存檔 fsync 後以 hard link 發布,不覆寫、取消不留半個正式檔。
260
+ 特權清理非同步,monitor 正常時通常數秒完成;刪 task 前完整 script 須逐字相符。
261
+ Purge 後重新確認密碼、重建 task,boot 前 mailbox 重設 `start`;寫入失敗不執行 boot。
262
+ 套件目錄/INFO identity 消失立即關 socket、取消/drain 請求並暫停,保留 monitor、
263
+ 核准 runtime、委託與 task;每 500 ms 輪詢確認連續消失達 10 分鐘才後備 purge。
264
+ 重新出現或無法確認消失皆重設計時;無法確認時維持 paused。
265
+ 恢復時重讀未變 mailbox:`start` 且 pins 相同才恢復,pins 改變維持 paused/
266
+ needs-admin-approval,`stop` 維持暫停,`purge` 立即清理。DSM 升級短暫空窗不誤清;
267
+ preuninst purge 仍立即處理、非同步清理;boot 套件不存在時驗 retained pins 立即 purge 不變。
268
+ 本機測試涵蓋升級空窗、恢復、計時/重設及 preuninst 立即 purge,不代表裝置驗收。
269
+
270
+ - **Breaking: schema 2 and task-based CLI, with no compatibility layer.**
271
+ Native-go and binary now use dsm-package.yaml schema 2 with backend.kind and
272
+ declared capabilities. Use init → check → build → deploy → status, positional
273
+ inspect <spk> and logs. The former build-spk/validate/info/log commands, native
274
+ layout/native.yaml, native privilege/background/fileStation fields and old
275
+ capability flags are removed; there are no aliases or migration shims.
276
+ Schema 2 uses --with files,jobs,delegate,login,root-ops or add to extend native-go:
277
+ private owner-bound data/jobs (A), live caller-session files/tree/transfers (B),
278
+ standalone identity (I), offline delegation (C), and fixed administrator
279
+ operations (R). C/R share one-time protected executor approval.
280
+ Manifest delegate.operations uses
281
+ files.list/files.info/files.createFolder/files.checkPermission/files.write
282
+ directly. Check/build/inspect/deploy/status support structured JSON results.
283
+ Compose retains its separate contract and uses init -t compose, optionally
284
+ importing with --from. No publish or signing command is added.
285
+ **不保留相容**:native-go/binary 改用 schema 2;CLI 依工作流程改名,
286
+ 移除舊欄位、旗標、指令與 native layout,不提供 alias 或 shim。
287
+ A/B/I/C/R 以能力宣告選用;C/R 共用 executor 一次核准。
288
+
289
+ - Generate background submit/schedule keys with cryptographic getRandomValues,
290
+ which works on DSM HTTP; do not require secure-context randomUUID.
291
+ 背景工作及排程以 getRandomValues 產生請求鍵,可在 DSM HTTP 使用;
292
+ 不再依賴僅限安全環境的 randomUUID。
293
+
294
+ - Give interactive File Station uploads their own bounded twenty-minute
295
+ response-header deadline without changing the shared metadata transport.
296
+ 互動 File Station 上傳使用獨立的二十分鐘回應標頭期限,不修改共用查詢 transport;
297
+ 保留目前 session、不覆寫、不重試及寫入結果不確定契約。
298
+
299
+ - Frame native-Go CGI JSON with exact byte lengths, including Unicode and
300
+ refusal/serialization failures; retain DSM's HTTP-200 JSON error convention.
301
+ native-Go CGI JSON(含 Unicode、拒絕及序列化失敗)提供精確位元組長度,
302
+ 並保留 DSM 的 HTTP 200 JSON 錯誤契約。
303
+
304
+ - Replace R2 publication with a private GitHub catalog and streamed Release SPKs.
305
+ - Serve live bilingual catalog pages and architecture-specific manual downloads.
306
+ - Remove the two web demo templates; retain native-go, binary and the single compose template.
307
+
308
+ ## 0.5.3
309
+
310
+ - Ship the native-go root authorization template with build-pinned plans,
311
+ the canonical Vue gate and nine language catalogs, explicit native approval,
312
+ exact disabled tasks, bounded legacy terminal proof and lifecycle withdrawal.
313
+ - Export `@synopackageland/cli/authorization-sdk` for reviewed native-layout
314
+ adapters to consume the same host runtimes and canonical template resources.
315
+ - Let an explicitly supplied native-layout withdrawal callback finish before
316
+ removing tasks; failed or missing callbacks abort withdrawal.
317
+ - Legacy DSM authorization has no server-enforced one-use create token;
318
+ modern DSM keeps its native one-use PasswordConfirm token contract.
319
+ - Isolate packed Docker runtime smoke in temporary share directories and its
320
+ own Compose project, including owned-volume cleanup. The 0.5.1 release tag
321
+ did not publish because the existing smoke omitted installer share values.
322
+ - Use a pinned long-running imported runtime fixture for readiness smoke;
323
+ the default hello-world demo exits immediately. The 0.5.2 workflow was
324
+ cancelled before publication when CI exposed that fixture race.
325
+ - Retain bounded artifact-test diagnostics up to eight MiB and propagate
326
+ real frontend test failures rather than hitting Node's default buffer limit.
327
+
328
+ ## 0.5.0
329
+
330
+ - Add opt-in native layout packaging for existing products: argv-only build hooks,
331
+ checksum-pinned HTTPS toolkit caching, custom package-user metadata/payload
332
+ layouts, explicit ELF linkage assertions, DSM armv8/armv7 and build overrides.
333
+ - Inspect native layouts with complete payload hash/mode and INFO checksum checks;
334
+ generated templates retain their existing privilege and architecture contracts.
335
+
336
+ - **GitHub CI and tag-based npm releases** (CI-LAND). Add shared full gates, Docker
337
+ runtime/tarball smoke and credential-free release dry runs for both npm packages.
338
+ Version tags require matching metadata, default-branch ancestry, an unpublished
339
+ version and versioned CHANGELOG notes. Push scripts now use the existing GitHub
340
+ origin; `push:all` preserves the separate Community Apps synchronization.
341
+
342
+ - **Vue templates pin UI 0.5.7 and let the UI text follow the app locale**
343
+ (TEMPLATE-UI-057). Every `native-go --ui vue` project pins
344
+ `@synopackageland/ui@0.5.7` (integrity `sha512-egHKoU4J...`). Each app root now wraps
345
+ its content in `ConfigProvider locale`, set from the DSM language by the template's
346
+ existing `uiLocale()` mapping, so the UI's built-in text follows it in the nine
347
+ built-in locales. The template drops the per-control `FilePicker` locale and the
348
+ `Link` `download-label` that only repeated those defaults; a template test requires
349
+ the provider and rejects those overrides. 0.5.7 also resolves `FormItem`
350
+ `direction="auto"` by the item's own width, stacks `SettingsRow` below 520px and
351
+ keeps `KeyValueRow` values wrapping; the template needed no mitigation for any of
352
+ these. Existing 0.5.6 projects upgrade by regenerating, or by changing the pin and
353
+ re-running `npm ci`.
354
+ - **Vue templates use the UI controls instead of native form elements**
355
+ (TEMPLATE-SELECT). The job form's worker and operation pickers and the
356
+ background schedule interval are now `Select`; the schedule consent is a
357
+ `Checkbox`; the job, schedule, sample-note and folder forms are `Form` +
358
+ `FormItem` + `FormActions` (vertical, controls capped at `md`), and the
359
+ hand-written `.integration-field` label CSS is gone. Labels are wired to
360
+ `Input` and `Textarea` through the FormItem control id. A template test now
361
+ fails when any `.vue` file renders a native `<select>`, `<option>`,
362
+ `<textarea>` or `<label>`, or a `FormItem` outside a vertical `Form`. Three UI
363
+ gaps remain and are not worked around with custom components: `Select` does
364
+ not take the FormItem control id (each Select carries a labelled
365
+ `role="group"` so it keeps an accessible name), the upload stays a native
366
+ `<input type="file">` because `FilePicker` hard-codes English "Choose files" and
367
+ "max" text, and the file download keeps a native `<a>` (no link component).
368
+ Existing projects pick this up only by regenerating; nothing changes in the
369
+ manifest, routes or backend.
370
+ - **Tarball smoke covers the default Vue UI and explicit plain UI**
371
+ (SMOKE-PACK-VUE). Install each generated Vue frontend with its lockfile before
372
+ building; keep both architectures and explicit root fixtures, then binary and
373
+ container packaging. The container smoke now selects `--arch x86_64` for
374
+ `-o app.spk` and its deployment plan, as explicit output requires one arch.
375
+ Docker runtime QA is opt-in with `smoke-pack.sh --docker`
376
+ and is explicitly skipped otherwise. Failed npm UI builds without installed
377
+ dependencies now name the UI directory and suggest `npm ci` (or `npm install`
378
+ without a lockfile) before retrying `build`; builds never install implicitly.
379
+
380
+ - **Vue templates pin UI 0.5.5 and use PageContent** (TEMPLATE-UI-055). Every
381
+ `native-go --ui vue` project pins `@synopackageland/ui@0.5.5` (integrity
382
+ `sha512-pLQmZqNH...`). The sidebar shell now wraps the page header and the page
383
+ content in the library `PageContent`, so a maximised window keeps both on the
384
+ same left and right edges; the page area scrolls inside it. 0.5.5 also adds
385
+ `CardGrid`, `FormActions`, `RepeatRows` and `fieldWidth`; the template has no
386
+ card lists or custom width CSS, so it needs none of them. Default change to
387
+ know when upgrading: form controls are capped at `md` (320px) unless you pass
388
+ `field-width="full"`. Existing 0.5.4 projects upgrade by re-running `npm ci`
389
+ after the pin change.
390
+
391
+ - **Vue templates pin UI 0.5.4** (TEMPLATE-UI-054). Every `native-go --ui vue`
392
+ project now pins `@synopackageland/ui@0.5.4` (integrity `sha512-mzuGUO+8...`).
393
+ 0.5.4 is visual only and changes nothing in the template source: under the
394
+ embedded theme, Card, EmptyState, PageHeader and WizardStep titles no longer
395
+ carry a default margin, the expand buttons of SettingsSection, Card and
396
+ ExpandableItem lose their grey box, and dashed separators draw only the bottom
397
+ edge. Existing 0.5.3 projects upgrade by re-running `npm ci` after the pin change.
398
+
399
+ - **Root tasks retain DSM 7.1 support.** Probe `list v3` and use the legacy
400
+ `create v3`, `list v2`, `get v3`, `run/delete v2`, and `view v1` only on code
401
+ 103. Preserve native password confirmation while distinguishing tokenless
402
+ success from cancellation; DSM 7.1 has no server-side root-creation password
403
+ token. Require a new successful completion record within a bounded deadline,
404
+ exact task identity, and no mutation retries. Root init, validation, and build
405
+ keep a consistent minimum of DSM 7.1-42661.
406
+ - **Vue templates pin UI 0.5.3** (TEMPLATE-UI-053). Every `native-go --ui vue`
407
+ project pins `@synopackageland/ui@0.5.3` in `frontend/package.json` and its
408
+ npmjs lockfile (integrity `sha512-ieKdf0nB...`). 0.4.2 to 0.5.3 is additive for
409
+ the template: new components (Select search and groups, Combobox,
410
+ MultipleSelect, SuperboxSelect, Grid/Row/Col, Space, Affix, Breadcrumb,
411
+ Pagination, SegmentControl, Card, Panel, Fieldset, Form, Notification, and more),
412
+ DataGrid grouping/expansion/reorder, checkable and draggable TreeView, DropdownMenu
413
+ submenus, and `Input`/`Dialog`/`SettingsSection`/`Callout` options with unchanged
414
+ defaults. Visual changes: Tabs and SectionTabs share a sliding marker with a
415
+ 160ms panel fade, the Spinner is a full rotating ring (both honour
416
+ `prefers-reduced-motion`), selected tab labels are blue, and the DataGrid footer
417
+ draws both borders and fills its flex container. The template needed no API
418
+ change; it now uses the library `Checkbox` and `Input` for the consent and limit
419
+ fields instead of native inputs. Existing 0.4.2 projects upgrade by re-running
420
+ `npm ci` after the pin change.
421
+
422
+ - **Templates never copy a local `node_modules`/`dist`** (TEMPLATE-COPY). A
423
+ template checkout used for development could leak its own install directory or
424
+ build output into a generated project, shadowing the project's `npm ci`.
425
+
426
+ - **Vue templates pin UI 0.4.2** (TEMPLATE-UI-042). Every `native-go --ui vue`
427
+ project pins `@synopackageland/ui@0.4.2` in `frontend/package.json` and its
428
+ npmjs lockfile. 0.4.1/0.4.2 are visual, backward-compatible control changes with
429
+ no API change: controls share the `--ui-control-*` tokens and
430
+ `--ui-radius-control`, so overriding `--ui-radius-sm`/`--ui-radius-md` no longer
431
+ reshapes them; a disabled grey button keeps its surface, a loading button keeps
432
+ full strength, and the Switch track padding is reset. Existing 0.4.0 projects
433
+ upgrade by re-running `npm ci` after the pin change.
434
+
435
+ - **Private-copy background schedules (S1-a)**: hourly/daily/weekly owner-scoped
436
+ creation, disable/delete, 8-definition limit, durable atomic trigger checkpoints,
437
+ missed-without-catch-up recovery, revision mismatch disable and explicit admin
438
+ re-enable. The Vue panel covers nine locales. Imported/pinned copies count toward
439
+ quotas; completed results never replay and owner purge also removes schedules.
440
+ Package account only, no stored credentials or offline personal ACL access.
441
+ Evidence: local gates and vt-nas DSM 7.4 x86_64 controlled-due-time tests
442
+ (two runs per owner, stop/start, +1 upgrade, disable and fresh normal1 browser
443
+ readback). This is not an hour-long cadence or reboot guarantee.
444
+
445
+ - **Minimum DSM 7.1 and multiple architectures** (DSM-COMPAT). Every template now declares
446
+ `os_min_ver: "7.1-42661"` (DSM 7.1; before: `7.2-64570`, `7.2-69057` or `7.2-60000`).
447
+ `init --min-dsm` and `build --min-dsm` take `7.0`, `7.1`, `7.2` or a full
448
+ `7.x-build` to override it. `build --arch` accepts a comma-separated list
449
+ - **Per-runtime minimum DSM and multiple architectures** (DSM-COMPAT, DSM-COMPAT-2).
450
+ `native-go` and `binary` declare `os_min_ver: "7.1-42661"` (DSM 7.1; before:
451
+ `7.2-64570`, `7.2-69057` or `7.2-60000`). The container templates declare
452
+ `7.2.1-69057` (DSM 7.2.1), and `init --min-dsm`/`build --min-dsm` refuse a
453
+ container value below it (`MIN_DSM_CONTAINER_FLOOR`) because Container Manager's
454
+ docker-project worker only exists from DSM 7.2.1; `inspect` reports the same
455
+ gap on an already-built container SPK. `--min-dsm` takes `7.0`, `7.1`, `7.2`,
456
+ `7.2.1` or a full `7.x-build`. `build --arch` accepts a comma-separated list
457
+ (`x86_64,aarch64`); without it every family is built, one SPK per family (binary and
458
+ gateway container Apps used to require `--arch`). `inspect` flags an INFO `arch`
459
+ that mixes families or names an unknown platform, a CGI built for another family than
460
+ INFO declares, and an `os_min_ver` that is not a DSM 7 `<version>-<build>`. The
461
+ x86_64 INFO platform list now includes `kvmcloud`, `epyc7003` and `epyc7003ntb`.
462
+ Only DSM 7.4 x86_64 has been run.
463
+ - **Ordinary-user background jobs (U1)**: administrators may independently enable
464
+ `allowOrdinaryUsers`. Fresh DSM username/UID ownership isolates list/get/cancel/result,
465
+ counts and idempotency keys; unknown UIDs fail closed. Per-owner admission is bounded
466
+ to 2 pending jobs and 1 MiB including reserved results, under the same spool lock.
467
+ Administrators can cancel all jobs and explicitly purge an exact owner with durable
468
+ audit and running-job drain. The Vue panel and all nine locales cover both roles.
469
+ No root or stored user credentials; S1-a adds private-copy schedules below.
470
+
471
+ - **Container gateway directory groups** (GW-DIRECTORY-GROUPS). Accounts absent
472
+ from `/etc/passwd` now resolve groups through DSM NSS using the fixed `/usr/bin/id`
473
+ as the package account. Qualified `DOMAIN\group` and `group@domain` names retain
474
+ their exact domain and case, including internal spaces; lookup failure denies.
475
+ The SDK caches nothing (TTL 0); DSM NSS caches and already-open streams remain
476
+ limitations. AD resolver allow/deny checks passed in a non-root DSM 7.4 package
477
+ CGI; LDAP, AD-user browser login and group-removal propagation remain unverified.
478
+ Rebuild container SPKs to obtain the change.
479
+
480
+ - **`synopkgland images pin` resolves and writes container image digests**
481
+ (IMAGE-DIGEST-CLI). It reads every service image in `compose.yaml`, asks the
482
+ registry for the current multi-arch manifest digest over the OCI Distribution
483
+ API (anonymous Bearer token flow for Docker Hub and ghcr; no Docker daemon or
484
+ `buildx`), and rewrites the reference to `tag@sha256:…` in place, keeping
485
+ comments and file layout. `--check` reports unpinned and stale pins without
486
+ writing and exits non-zero. `inspect`'s unpinned-image finding now points at
487
+ the command. Evidence: local unit tests against a fake registry plus one manual
488
+ Docker Hub resolution of `busybox:1.36`; not verified on a real DSM.
489
+ - **Container upgrade wizard no longer breaks on an untouched Run-as control; numeric
490
+ command arguments are rejected for every Compose route** (WIZARD-LIVE-CHECK).
491
+ Measured on vt-nas (DSM 7.4-90069) with the `compose-import` template: an untouched
492
+ upgrade submitted `RUN_AS` pre-filled with the name of the first Shared Folder, `preinst`
493
+ failed, and DSM, which removes the old version before it runs the new `preinst`, left the
494
+ package not installed (data kept). A `dsm_user` now has the same "Change Container Run-as"
495
+ box as a Shared Folder: on an upgrade the submitted user only counts when that box (or
496
+ `deploy --run-as`) is set; otherwise the installed user is kept. Also on vt-nas: the
497
+ Docker Project worker drops YAML quotes, so `command: ["sleep", "3600"]` ended the
498
+ install as broken (`failed to acquire postinst worker`). `synopkgland check` and
499
+ `build` already rejected that on the static route; the dynamic route (install
500
+ parameters, which includes `compose-import`) now rejects it too
501
+ (`COMPOSE_NUMERIC_COMMAND_ARG_FORBIDDEN`).
502
+ - **`install.sharedFolder`** (T-0120): native-go packages can declare a Shared Folder (`select` wizard or `create`
503
+ via DSM `data-share`), stored by name in `var/config.json`; `init --shared-folder select|create` and an `inspect`
504
+ check are included. In `select` mode the administrator grants the package account access afterwards.
505
+ - **Container gateway accepts a query SynoToken; known limit with DSM CSRF protection on**
506
+ (GW-QUERY-TOKEN). On `GET`, `HEAD` and `OPTIONS` with an empty `X-SYNO-TOKEN`, the
507
+ gateway hands a `?SynoToken=` value to `authenticate.cgi` (header wins; still stripped
508
+ upstream); state-changing methods are unchanged. Measured on DSM 7.4 with "Improve
509
+ protection against cross-site request forgery attacks" on: opening a container App
510
+ from the DSM desktop sends no token at all, so the gateway answers `401`
511
+ `session_required`. Known limitation: turn the setting off or use the `native-go`
512
+ template.
513
+ - **Container gateway: readable errors, SSE and WebSocket** (GW-ERRORS-WS). DSM's web
514
+ server replaces the body and headers of any CGI reply with status `403`, `404`,
515
+ `500`, `502`, `503` or `504` by its generic error page (measured on DSM 7.4-90069;
516
+ every other status passes whole). The gateway therefore no longer sends those
517
+ statuses itself: `forbidden` and `token_required` arrive as `401`, a stopped
518
+ container as `521` with `Retry-After`, a timeout as `524`, an invalid reply as
519
+ `520`; every gateway error carries `X-Synopkgland-Error` (the code) and, for a
520
+ stand-in, `X-Synopkgland-Status` (the status it replaces). **Behaviour change:**
521
+ those statuses were `403`/`503`/`504`/`502`/`500` before. A request header
522
+ `X-Synopkgland-Keep-Error-Body: 1` makes the same swap for the container's own
523
+ error replies so an App can read its JSON error bodies. Server-Sent Events pass
524
+ through unbuffered and **WebSocket now works** (it answered `501`): DSM hands both
525
+ directions of an upgraded connection to the CGI, which the gateway uses; the
526
+ handshake must pass the same same-origin check as a state-changing request
527
+ (`cross_site_blocked`), because a browser cannot add `X-SYNO-TOKEN` to a handshake. Other protocol upgrades stay
528
+ `501`. See [Container access control](/docs/guides/container-access/).
529
+ - Fix: **`dsm-groups` with `groups: [users]` let nobody in.** DSM keeps no member
530
+ list for `users` (every local account has it as its primary group), so the gateway,
531
+ which only read member lists from `/etc/group`, answered `403` to everyone, including
532
+ administrators (reproduced on vt-nas). The gateway now also counts the primary gid
533
+ from `/etc/passwd` as membership and fails closed if it cannot read that file.
534
+ Rebuild the SPK to pick it up. Real-account `dsm-groups`/`dsm-admins` checks passed on
535
+ vt-nas (x86_64); the aarch64 gateway is verified in an arm64 Linux VM only, not on an
536
+ aarch64 DSM NAS.
537
+ - **Gateway CSRF check no longer relies on the SynoToken value** (GW-TOKEN). On a NAS
538
+ where DSM's "Improve protection against cross-site request forgery attacks" is off (vt-nas: `enable_syno_token="no"`), DSM
539
+ issues one fixed placeholder token to every session and validates nothing. The container
540
+ gateway now also requires `Sec-Fetch-Site: same-origin` and/or an `Origin` equal to the
541
+ request `Host` for `POST`/`PUT`/`PATCH`/`DELETE` (answer `cross_site_blocked`, sent as `401` because DSM replaces `403` bodies) and a
542
+ well-formed `X-SYNO-TOKEN`; safe methods are unchanged. Browsers that send neither
543
+ header on a state-changing request are refused. Verified on a real DSM 7.4 as an
544
+ administrator and an ordinary user (foreign `Origin`, `null`, `Sec-Fetch-Site`
545
+ cross-site/same-site, missing evidence refused; same-origin passes). The token path with
546
+ the DSM setting on is untested. Rebuild container SPKs to pick it up. See
547
+ [Container access](/docs/guides/container-access/).
548
+ - **Container templates pin their image by digest** (CONTAINER-PULL): `hello-files` and `compose-import` now use
549
+ `image: <tag>@sha256:…`. `build` writes `force_pull: false` into the
550
+ `docker-project` resource when every service image is digest-pinned and keeps
551
+ `force_pull: true` while any image is a bare tag, so an install no longer
552
+ re-resolves a moving tag that other containers share. `inspect` reports each
553
+ service whose image is not digest-pinned. Behaviour for projects with unpinned
554
+ images is unchanged. Not verified on a real DSM.
555
+ - **Breaking: container Apps are DSM-authenticated by default.** A container App
556
+ with an `adminport` is now served through a gateway CGI
557
+ (`/webman/3rdparty/<package>/cgi/gateway.cgi/…`) that runs as the package
558
+ account, checks the DSM session and forwards to the container. Without a valid
559
+ session it answers `401`; unsafe methods need `X-SYNO-TOKEN`; a stopped container
560
+ gives `521` with `Retry-After` (not `503`: DSM would replace its body). New `integration.web.access`: `dsm-users`
561
+ (default), `dsm-admins`, `dsm-groups` (+ `groups`), `public`. No Web Station
562
+ portal is registered unless `public`. The container port must be bound to
563
+ loopback (`127.0.0.1:<adminport>:<port>`): `check` fails with
564
+ `COMPOSE_GATEWAY_PORT_EXPOSED`, and `inspect`/`inspect` report
565
+ `CONTAINER_PORT_EXPOSED` and `CONTAINER_ANONYMOUS_PORTAL`. The gateway is
566
+ compiled Go, so building such an App needs Go and `--arch`, and the SPK is no
567
+ longer `noarch`. Privilege stays `run-as: package` with no root task.
568
+ **Migration:** bind the Compose port to `127.0.0.1`, rebuild with a higher
569
+ `build` and an `--arch`, then upgrade (the old `/<alias>/` portal and bookmarks
570
+ go away); or set `integration.web.access: public` to keep the anonymous
571
+ behaviour. See `website` guide “Container access control”.
572
+ - Add best-effort `revealFile` selection recovery using File Station 1.4.x
573
+ private structures, with feature detection and silent cancellation on absent or
574
+ throwing APIs. One AppLaunch binds its callback receiver; only that receiver's
575
+ model may be selected once. Interaction, navigation away, close, disposal and
576
+ replacement requests cancel observers. Named bounds are 5000 ms total, 100 ms
577
+ checks and 300 ms quiet time, without device latency proof. `requested` still
578
+ does not mean `selected`. Actual effectiveness on DSM 7.4 / File Station 1.4.4
579
+ awaits a rebuilt-SPK device matrix; no device fix is claimed.
580
+
581
+ - Fix `ctx.host.activateWindow()` to prefer DSM `toFront()`, calling `show()`
582
+ first for hidden/minimized windows; `activate()` remains a compatibility
583
+ fallback. `requestClose()` follows DSM standalone truthiness: falsy values
584
+ (including desktop `undefined`) permit the normal close path, while a truthy
585
+ standalone-main check refuses it. `canClose === false` and host listeners still
586
+ veto. Both methods return `requested`, not completion proof; rebuilt-SPK DSM
587
+ validation remains pending. Source: `7553c24`, `2842634`.
588
+ - Add opt-in package-owned foreground `daemon` to native manifests, with
589
+ generated supervision and lifecycle hooks. Daemon-free packages keep their
590
+ existing lifecycle; no machine-wide service is required.
591
+ - Add per-mount `ctx.host` platform/title adapters, guarded window activation
592
+ and close requests, app/external-URL navigation, resize/reopen subscription
593
+ cleanup, and File Station folder navigation/file reveal. Standalone web uses
594
+ explicit fallbacks; file reveal is not preview. File preview/details/settings
595
+ and host theme/language subscriptions remain unsupported. Final DSM runtime
596
+ behavior and ordinary-user navigation permissions still need NAS validation.
597
+ - Fix SPK inspection to read the build-specific unique window bundle.
598
+
599
+ ### Known limitations
600
+
601
+ - **File reveal remains a request:** on DSM 7.4-90069 with File Station
602
+ 1.4.4-2221, one `ctx.host.revealFile()` call was observed opening the correct
603
+ folder without selecting/highlighting the file. A new synthetic fixture retest
604
+ selected the file with both `/home` and `/homes/admin` inputs, once each
605
+ (confidence **high**). The earlier non-selection was not reproduced; its cause
606
+ remains **unknown**. `requested` only means a selection request was issued;
607
+ it does not guarantee selection, preview, existence or ACL access. No runtime
608
+ fix is claimed. Source: V1 device validation and fixture retest, 2026-10-04.
609
+ - Vue templates pin public `@synopackageland/ui@0.4.0`, including app-scoped
610
+ modals and unique mount IDs, with npmjs-only lockfiles and imports. External
611
+ developers do not need an internal registry account.
612
+ - CLI 0.4.0 targets npmjs `latest`; versions 0.1.0–0.3.10 remain available without
613
+ deprecation or unpublishing.