@synopackageland/cli 0.6.1 → 0.7.1

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 (640) hide show
  1. package/CHANGELOG.md +846 -0
  2. package/README.md +81 -89
  3. package/dist/add.d.ts +4 -1
  4. package/dist/add.js +45 -17
  5. package/dist/build-spk/delegate-scope.d.ts +6 -0
  6. package/dist/build-spk/delegate-scope.js +34 -0
  7. package/dist/build-spk/dsm-arch.d.ts +7 -1
  8. package/dist/build-spk/dsm-arch.js +24 -28
  9. package/dist/build-spk/dsm-platforms.json +42 -0
  10. package/dist/build-spk/dsm-version.d.ts +11 -0
  11. package/dist/build-spk/dsm-version.js +17 -0
  12. package/dist/build-spk/gateway.js +8 -4
  13. package/dist/build-spk/generator.js +30 -5
  14. package/dist/build-spk/go-toolchain.d.ts +20 -0
  15. package/dist/build-spk/go-toolchain.js +44 -0
  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 +28 -14
  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/native-install-values.d.ts +17 -0
  26. package/dist/deploy/native-install-values.js +32 -0
  27. package/dist/deploy/plan.d.ts +6 -2
  28. package/dist/deploy/plan.js +58 -7
  29. package/dist/deploy/spk-version.js +1 -1
  30. package/dist/error-registry.js +54 -20
  31. package/dist/host/dsm-client.d.ts +8 -4
  32. package/dist/host/dsm-client.js +63 -21
  33. package/dist/host/dsm-http.js +24 -2
  34. package/dist/host/types.d.ts +3 -1
  35. package/dist/info.js +45 -10
  36. package/dist/init.d.ts +3 -0
  37. package/dist/init.js +50 -19
  38. package/dist/package-metadata.d.ts +21 -0
  39. package/dist/package-metadata.js +101 -0
  40. package/dist/portal/alias.d.ts +25 -0
  41. package/dist/portal/alias.js +48 -0
  42. package/dist/portal/package.d.ts +33 -0
  43. package/dist/portal/package.js +116 -0
  44. package/dist/runtime/delegate-contract.d.ts +79 -0
  45. package/dist/runtime/delegate-contract.js +27 -0
  46. package/dist/runtime/dsm-version.d.ts +6 -0
  47. package/dist/runtime/dsm-version.js +8 -0
  48. package/dist/runtime/executor-build.js +10 -6
  49. package/dist/runtime/executor-inspect.d.ts +3 -0
  50. package/dist/runtime/executor-inspect.js +11 -5
  51. package/dist/runtime/executor-policy.d.ts +12 -0
  52. package/dist/runtime/executor-policy.js +43 -3
  53. package/dist/runtime/executor-scope-task.d.ts +4 -0
  54. package/dist/runtime/executor-scope-task.js +21 -0
  55. package/dist/runtime/executor-tasks.d.ts +2 -1
  56. package/dist/runtime/executor-tasks.js +4 -4
  57. package/dist/skill.js +1 -0
  58. package/dist/standalone/api-permissions.d.ts +10 -0
  59. package/dist/standalone/api-permissions.js +19 -2
  60. package/dist/standalone/background.d.ts +16 -0
  61. package/dist/standalone/background.js +69 -2
  62. package/dist/standalone/binary.d.ts +1 -1
  63. package/dist/standalone/binary.js +22 -8
  64. package/dist/standalone/build.d.ts +1 -1
  65. package/dist/standalone/build.js +38 -8
  66. package/dist/standalone/daemon.d.ts +1 -0
  67. package/dist/standalone/daemon.js +10 -5
  68. package/dist/standalone/dsm-window.d.ts +3 -1
  69. package/dist/standalone/dsm-window.js +78 -49
  70. package/dist/standalone/inspect-spk.d.ts +8 -0
  71. package/dist/standalone/inspect-spk.js +110 -27
  72. package/dist/standalone/lifecycle.js +86 -8
  73. package/dist/standalone/manifest.d.ts +13 -0
  74. package/dist/standalone/manifest.js +57 -8
  75. package/dist/standalone/native-authorization-window.d.ts +1 -1
  76. package/dist/standalone/native-authorization-window.js +9 -1
  77. package/dist/standalone/native-layout.d.ts +3 -0
  78. package/dist/standalone/native-layout.js +37 -5
  79. package/dist/standalone/native-root-window.d.ts +4 -2
  80. package/dist/standalone/native-root-window.js +33 -18
  81. package/dist/standalone/portal-window.d.ts +21 -0
  82. package/dist/standalone/portal-window.js +155 -0
  83. package/dist/standalone/portal.d.ts +4 -0
  84. package/dist/standalone/portal.js +4 -0
  85. package/dist/standalone/resource.d.ts +5 -3
  86. package/dist/standalone/resource.js +6 -3
  87. package/dist/standalone/root-window.d.ts +4 -1
  88. package/dist/standalone/root-window.js +193 -36
  89. package/dist/standalone/spk.d.ts +1 -1
  90. package/dist/standalone/spk.js +25 -7
  91. package/dist/templates/_daemon/go.mod +1 -1
  92. package/dist/templates/_daemon/main.go +6 -3
  93. package/dist/templates/_daemon/main_test.go +82 -9
  94. package/dist/templates/_daemon/testdata/child.go +3 -0
  95. package/dist/templates/_executor/README.md +130 -16
  96. package/dist/templates/_executor/anchor.go +156 -0
  97. package/dist/templates/_executor/anchor_test.go +161 -0
  98. package/dist/templates/_executor/apppriv_review_test.go +1 -1
  99. package/dist/templates/_executor/cancel_contract_test.go +236 -0
  100. package/dist/templates/_executor/copy.go +64 -0
  101. package/dist/templates/_executor/copy_test.go +88 -0
  102. package/dist/templates/_executor/digest_review_test.go +2 -2
  103. package/dist/templates/_executor/dsm.go +63 -13
  104. package/dist/templates/_executor/dsm_test.go +95 -1
  105. package/dist/templates/_executor/executor.go +260 -49
  106. package/dist/templates/_executor/executor_test.go +36 -6
  107. package/dist/templates/_executor/go.mod +2 -0
  108. package/dist/templates/_executor/identity.go +27 -1
  109. package/dist/templates/_executor/identity_kernel_linux_test.go +60 -0
  110. package/dist/templates/_executor/identity_linux.go +82 -0
  111. package/dist/templates/_executor/identity_security_test.go +43 -0
  112. package/dist/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
  113. package/dist/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
  114. package/dist/templates/_executor/internal/taskscript/boot.sh +9 -9
  115. package/dist/templates/_executor/internal/taskscript/cmd/main.go +2 -2
  116. package/dist/templates/_executor/internal/taskscript/control.sh +15 -10
  117. package/dist/templates/_executor/internal/taskscript/tasks.go +5 -3
  118. package/dist/templates/_executor/lifecycle_test.go +11 -0
  119. package/dist/templates/_executor/link_linux.go +28 -0
  120. package/dist/templates/_executor/long_running_test.go +530 -0
  121. package/dist/templates/_executor/main.go +83 -25
  122. package/dist/templates/_executor/managed.go +3 -3
  123. package/dist/templates/_executor/managed_test.go +3 -3
  124. package/dist/templates/_executor/move_linux.go +490 -0
  125. package/dist/templates/_executor/move_linux_test.go +460 -0
  126. package/dist/templates/_executor/move_validation.go +46 -0
  127. package/dist/templates/_executor/move_validation_test.go +187 -0
  128. package/dist/templates/_executor/operations.go +926 -0
  129. package/dist/templates/_executor/path_test.go +18 -0
  130. package/dist/templates/_executor/pid.go +37 -0
  131. package/dist/templates/_executor/pid_test.go +113 -0
  132. package/dist/templates/_executor/platform_linux.go +24 -173
  133. package/dist/templates/_executor/platform_linux_test.go +9 -65
  134. package/dist/templates/_executor/platform_other.go +38 -4
  135. package/dist/templates/_executor/process.go +3 -0
  136. package/dist/templates/_executor/purge_log.go +18 -0
  137. package/dist/templates/_executor/records.go +242 -0
  138. package/dist/templates/_executor/scope_cancel_contract_test.go +91 -0
  139. package/dist/templates/_executor/scope_client.go +37 -0
  140. package/dist/templates/_executor/scope_contract.go +12 -0
  141. package/dist/templates/_executor/selected_scope.go +146 -0
  142. package/dist/templates/_executor/selected_scope_test.go +186 -0
  143. package/dist/templates/_executor/status_disabled_test.go +33 -0
  144. package/dist/templates/_executor/store.go +4 -3
  145. package/dist/templates/_executor/supervise.go +109 -0
  146. package/dist/templates/_executor/supervise_test.go +130 -0
  147. package/dist/templates/_executor/task_race_review_test.go +1 -1
  148. package/dist/templates/_executor/tasks.go +52 -15
  149. package/dist/templates/_executor/tasks_dsm71_test.go +114 -0
  150. package/dist/templates/_executor/tasks_review_test.go +1 -1
  151. package/dist/templates/_executor/tasks_test.go +62 -5
  152. package/dist/templates/_executor/upgrade_watch_test.go +13 -5
  153. package/dist/templates/_executor/watch.go +8 -0
  154. package/dist/templates/_executor/watch_test.go +23 -2
  155. package/dist/templates/_executor/write_review_linux_test.go +4 -12
  156. package/dist/templates/_gateway/go.mod +2 -0
  157. package/dist/templates/_shared/AGENTS.md +129 -0
  158. package/dist/templates/binary/dsm-package.yaml +24 -0
  159. package/dist/templates/binary/i18n/messages/de.json +4 -0
  160. package/dist/templates/binary/i18n/messages/en.json +4 -0
  161. package/dist/templates/binary/i18n/messages/es.json +4 -0
  162. package/dist/templates/binary/i18n/messages/fr.json +4 -0
  163. package/dist/templates/binary/i18n/messages/it.json +4 -0
  164. package/dist/templates/binary/i18n/messages/ja.json +4 -0
  165. package/dist/templates/binary/i18n/messages/ko.json +4 -0
  166. package/dist/templates/binary/i18n/messages/zh-CN.json +4 -0
  167. package/dist/templates/binary/i18n/messages/zh-TW.json +4 -0
  168. package/dist/templates/binary/ui/app.js +19 -4
  169. package/dist/templates/native-authorization/AuthorizationGate.vue +5 -3
  170. package/dist/templates/native-authorization/i18n/de.json +1 -0
  171. package/dist/templates/native-authorization/i18n/en.json +1 -0
  172. package/dist/templates/native-authorization/i18n/es.json +2 -1
  173. package/dist/templates/native-authorization/i18n/fr.json +1 -0
  174. package/dist/templates/native-authorization/i18n/it.json +11 -10
  175. package/dist/templates/native-authorization/i18n/ja.json +1 -0
  176. package/dist/templates/native-authorization/i18n/ko.json +10 -9
  177. package/dist/templates/native-authorization/i18n/zh-CN.json +6 -5
  178. package/dist/templates/native-authorization/i18n/zh-TW.json +6 -5
  179. package/dist/templates/native-go/README.md +43 -10
  180. package/dist/templates/native-go/backend/cmd/app/main.go +27 -7
  181. package/dist/templates/native-go/backend/go.mod +1 -1
  182. package/dist/templates/native-go/backend/internal/api/entry_test.go +47 -0
  183. package/dist/templates/native-go/backend/internal/api/permissions_test.go +3 -3
  184. package/dist/templates/native-go/backend/internal/api/registry.go +11 -0
  185. package/dist/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
  186. package/dist/templates/native-go/backend/internal/api/server.go +18 -5
  187. package/dist/templates/native-go/backend/internal/app/delegate_config.go +57 -0
  188. package/dist/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
  189. package/dist/templates/native-go/backend/internal/app/portal.go +30 -0
  190. package/dist/templates/native-go/backend/internal/app/portal_test.go +55 -0
  191. package/dist/templates/native-go/backend/internal/app/routes.go +8 -2
  192. package/dist/templates/native-go/backend/internal/background/runner.go +1 -1
  193. package/dist/templates/native-go/backend/internal/background/store.go +16 -14
  194. package/dist/templates/native-go/backend/internal/dsm/admin.go +8 -2
  195. package/dist/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
  196. package/dist/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
  197. package/dist/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
  198. package/dist/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
  199. package/dist/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
  200. package/dist/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
  201. package/dist/templates/native-go/backend/internal/dsm/entry.go +177 -0
  202. package/dist/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
  203. package/dist/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
  204. package/dist/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
  205. package/dist/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
  206. package/dist/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
  207. package/dist/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
  208. package/dist/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
  209. package/dist/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
  210. package/dist/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
  211. package/dist/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
  212. package/dist/templates/native-go/backend/internal/filestation/client.go +39 -3
  213. package/dist/templates/native-go/backend/internal/filestation/download_dsm71_test.go +82 -0
  214. package/dist/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
  215. package/dist/templates/native-go/backend/internal/filestation/service.go +1 -1
  216. package/dist/templates/native-go/backend/internal/identity/README.md +5 -1
  217. package/dist/templates/native-go/backend/internal/identity/dsm.go +24 -5
  218. package/dist/templates/native-go/backend/internal/identity/http.go +1 -1
  219. package/dist/templates/native-go/backend/internal/identity/identity_test.go +48 -1
  220. package/dist/templates/native-go/backend/internal/identity/service.go +1 -1
  221. package/dist/templates/native-go/backend/internal/portal/portal.go +138 -0
  222. package/dist/templates/native-go/backend/internal/portal/portal_test.go +89 -0
  223. package/dist/templates/native-go/dsm-package.yaml +20 -1
  224. package/dist/templates/native-go/i18n/glossary.json +2 -1
  225. package/dist/templates/native-go/i18n/messages/de.json +1 -0
  226. package/dist/templates/native-go/i18n/messages/en.json +1 -0
  227. package/dist/templates/native-go/i18n/messages/es.json +1 -0
  228. package/dist/templates/native-go/i18n/messages/fr.json +1 -0
  229. package/dist/templates/native-go/i18n/messages/it.json +1 -0
  230. package/dist/templates/native-go/i18n/messages/ja.json +1 -0
  231. package/dist/templates/native-go/i18n/messages/ko.json +1 -0
  232. package/dist/templates/native-go/i18n/messages/zh-CN.json +1 -0
  233. package/dist/templates/native-go/i18n/messages/zh-TW.json +1 -0
  234. package/dist/templates/native-go/ui/app.css +10 -0
  235. package/dist/templates/native-go/ui/app.js +11 -1
  236. package/dist/templates/native-go-delegate/DELEGATE.md +126 -5
  237. package/dist/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
  238. package/dist/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
  239. package/dist/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
  240. package/dist/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
  241. package/dist/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
  242. package/dist/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
  243. package/dist/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
  244. package/dist/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
  245. package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
  246. package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
  247. package/dist/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
  248. package/dist/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
  249. package/dist/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
  250. package/dist/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
  251. package/dist/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
  252. package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
  253. package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
  254. package/dist/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
  255. package/dist/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
  256. package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
  257. package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
  258. package/dist/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
  259. package/dist/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
  260. package/dist/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
  261. package/dist/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
  262. package/dist/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
  263. package/dist/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
  264. package/dist/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
  265. package/dist/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
  266. package/dist/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
  267. package/dist/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
  268. package/dist/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
  269. package/dist/templates/native-go-delegate/frontend/test/delegate.test.ts +15 -0
  270. package/dist/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
  271. package/dist/templates/native-go-delegate/test.sh +1 -0
  272. package/dist/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
  273. package/dist/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
  274. package/dist/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
  275. package/dist/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
  276. package/dist/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
  277. package/dist/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
  278. package/dist/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
  279. package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
  280. package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
  281. package/dist/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
  282. package/dist/templates/native-go-root-ops/backend/internal/app/executor.go +30 -2
  283. package/dist/templates/native-go-root-ops/backend/internal/app/executor_test.go +64 -0
  284. package/dist/templates/native-go-vue/README.md +4 -0
  285. package/dist/templates/native-go-vue/frontend/package-lock.json +4 -4
  286. package/dist/templates/native-go-vue/frontend/package.json +1 -1
  287. package/dist/templates/native-go-vue/frontend/src/App.vue +18 -13
  288. package/dist/templates/native-go-vue/frontend/src/context.ts +31 -0
  289. package/dist/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +54 -9
  290. package/dist/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
  291. package/dist/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
  292. package/dist/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
  293. package/dist/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +23 -0
  294. package/dist/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +8 -2
  295. package/dist/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
  296. package/dist/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
  297. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/de.json +47 -0
  298. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/en.json +13 -2
  299. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/es.json +47 -0
  300. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +47 -0
  301. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/it.json +47 -0
  302. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +47 -0
  303. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +47 -0
  304. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
  305. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
  306. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
  307. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
  308. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
  309. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
  310. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
  311. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
  312. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
  313. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +47 -0
  314. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +16 -5
  315. package/dist/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
  316. package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
  317. package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
  318. package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
  319. package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
  320. package/dist/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
  321. package/dist/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
  322. package/dist/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
  323. package/dist/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
  324. package/dist/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
  325. package/dist/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
  326. package/dist/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
  327. package/dist/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
  328. package/dist/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
  329. package/dist/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
  330. package/dist/templates/native-go-vue/frontend/src/i18n.ts +13 -0
  331. package/dist/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
  332. package/dist/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
  333. package/dist/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
  334. package/dist/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
  335. package/dist/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
  336. package/dist/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
  337. package/dist/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
  338. package/dist/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
  339. package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
  340. package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
  341. package/dist/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
  342. package/dist/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
  343. package/dist/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
  344. package/dist/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
  345. package/dist/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
  346. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
  347. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
  348. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
  349. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
  350. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
  351. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
  352. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
  353. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
  354. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
  355. package/dist/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
  356. package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
  357. package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
  358. package/dist/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
  359. package/dist/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
  360. package/dist/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
  361. package/package.json +5 -1
  362. package/schema/package-metadata.schema.json +101 -0
  363. package/schema/synology-app.schema.json +112 -0
  364. package/skills/SKILL.md +106 -4
  365. package/skills/reference/create.md +101 -2
  366. package/skills/reference/deploy.md +2 -2
  367. package/skills/reference/files.md +113 -2
  368. package/skills/reference/identity.md +70 -1
  369. package/skills/reference/portal.md +17 -0
  370. package/skills/reference/ui-vue.md +12 -0
  371. package/templates/_daemon/go.mod +1 -1
  372. package/templates/_daemon/main.go +6 -3
  373. package/templates/_daemon/main_test.go +82 -9
  374. package/templates/_daemon/testdata/child.go +3 -0
  375. package/templates/_executor/README.md +130 -16
  376. package/templates/_executor/anchor.go +156 -0
  377. package/templates/_executor/anchor_test.go +161 -0
  378. package/templates/_executor/apppriv_review_test.go +1 -1
  379. package/templates/_executor/cancel_contract_test.go +236 -0
  380. package/templates/_executor/copy.go +64 -0
  381. package/templates/_executor/copy_test.go +88 -0
  382. package/templates/_executor/digest_review_test.go +2 -2
  383. package/templates/_executor/dsm.go +63 -13
  384. package/templates/_executor/dsm_test.go +95 -1
  385. package/templates/_executor/executor.go +260 -49
  386. package/templates/_executor/executor_test.go +36 -6
  387. package/templates/_executor/go.mod +2 -0
  388. package/templates/_executor/identity.go +27 -1
  389. package/templates/_executor/identity_kernel_linux_test.go +60 -0
  390. package/templates/_executor/identity_linux.go +82 -0
  391. package/templates/_executor/identity_security_test.go +43 -0
  392. package/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
  393. package/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
  394. package/templates/_executor/internal/taskscript/boot.sh +9 -9
  395. package/templates/_executor/internal/taskscript/cmd/main.go +2 -2
  396. package/templates/_executor/internal/taskscript/control.sh +15 -10
  397. package/templates/_executor/internal/taskscript/tasks.go +5 -3
  398. package/templates/_executor/lifecycle_test.go +11 -0
  399. package/templates/_executor/link_linux.go +28 -0
  400. package/templates/_executor/long_running_test.go +530 -0
  401. package/templates/_executor/main.go +83 -25
  402. package/templates/_executor/managed.go +3 -3
  403. package/templates/_executor/managed_test.go +3 -3
  404. package/templates/_executor/move_linux.go +490 -0
  405. package/templates/_executor/move_linux_test.go +460 -0
  406. package/templates/_executor/move_validation.go +46 -0
  407. package/templates/_executor/move_validation_test.go +187 -0
  408. package/templates/_executor/operations.go +926 -0
  409. package/templates/_executor/path_test.go +18 -0
  410. package/templates/_executor/pid.go +37 -0
  411. package/templates/_executor/pid_test.go +113 -0
  412. package/templates/_executor/platform_linux.go +24 -173
  413. package/templates/_executor/platform_linux_test.go +9 -65
  414. package/templates/_executor/platform_other.go +38 -4
  415. package/templates/_executor/process.go +3 -0
  416. package/templates/_executor/purge_log.go +18 -0
  417. package/templates/_executor/records.go +242 -0
  418. package/templates/_executor/scope_cancel_contract_test.go +91 -0
  419. package/templates/_executor/scope_client.go +37 -0
  420. package/templates/_executor/scope_contract.go +12 -0
  421. package/templates/_executor/selected_scope.go +146 -0
  422. package/templates/_executor/selected_scope_test.go +186 -0
  423. package/templates/_executor/status_disabled_test.go +33 -0
  424. package/templates/_executor/store.go +4 -3
  425. package/templates/_executor/supervise.go +109 -0
  426. package/templates/_executor/supervise_test.go +130 -0
  427. package/templates/_executor/task_race_review_test.go +1 -1
  428. package/templates/_executor/tasks.go +52 -15
  429. package/templates/_executor/tasks_dsm71_test.go +114 -0
  430. package/templates/_executor/tasks_review_test.go +1 -1
  431. package/templates/_executor/tasks_test.go +62 -5
  432. package/templates/_executor/upgrade_watch_test.go +13 -5
  433. package/templates/_executor/watch.go +8 -0
  434. package/templates/_executor/watch_test.go +23 -2
  435. package/templates/_executor/write_review_linux_test.go +4 -12
  436. package/templates/_gateway/go.mod +2 -0
  437. package/templates/_shared/AGENTS.md +129 -0
  438. package/templates/binary/dsm-package.yaml +24 -0
  439. package/templates/binary/i18n/messages/de.json +4 -0
  440. package/templates/binary/i18n/messages/en.json +4 -0
  441. package/templates/binary/i18n/messages/es.json +4 -0
  442. package/templates/binary/i18n/messages/fr.json +4 -0
  443. package/templates/binary/i18n/messages/it.json +4 -0
  444. package/templates/binary/i18n/messages/ja.json +4 -0
  445. package/templates/binary/i18n/messages/ko.json +4 -0
  446. package/templates/binary/i18n/messages/zh-CN.json +4 -0
  447. package/templates/binary/i18n/messages/zh-TW.json +4 -0
  448. package/templates/binary/ui/app.js +19 -4
  449. package/templates/native-authorization/AuthorizationGate.vue +5 -3
  450. package/templates/native-authorization/i18n/de.json +1 -0
  451. package/templates/native-authorization/i18n/en.json +1 -0
  452. package/templates/native-authorization/i18n/es.json +2 -1
  453. package/templates/native-authorization/i18n/fr.json +1 -0
  454. package/templates/native-authorization/i18n/it.json +11 -10
  455. package/templates/native-authorization/i18n/ja.json +1 -0
  456. package/templates/native-authorization/i18n/ko.json +10 -9
  457. package/templates/native-authorization/i18n/zh-CN.json +6 -5
  458. package/templates/native-authorization/i18n/zh-TW.json +6 -5
  459. package/templates/native-go/README.md +43 -10
  460. package/templates/native-go/backend/cmd/app/main.go +27 -7
  461. package/templates/native-go/backend/go.mod +1 -1
  462. package/templates/native-go/backend/internal/api/entry_test.go +47 -0
  463. package/templates/native-go/backend/internal/api/permissions_test.go +3 -3
  464. package/templates/native-go/backend/internal/api/registry.go +11 -0
  465. package/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
  466. package/templates/native-go/backend/internal/api/server.go +18 -5
  467. package/templates/native-go/backend/internal/app/delegate_config.go +57 -0
  468. package/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
  469. package/templates/native-go/backend/internal/app/portal.go +30 -0
  470. package/templates/native-go/backend/internal/app/portal_test.go +55 -0
  471. package/templates/native-go/backend/internal/app/routes.go +8 -2
  472. package/templates/native-go/backend/internal/background/runner.go +1 -1
  473. package/templates/native-go/backend/internal/background/store.go +16 -14
  474. package/templates/native-go/backend/internal/dsm/admin.go +8 -2
  475. package/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
  476. package/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
  477. package/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
  478. package/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
  479. package/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
  480. package/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
  481. package/templates/native-go/backend/internal/dsm/entry.go +177 -0
  482. package/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
  483. package/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
  484. package/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
  485. package/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
  486. package/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
  487. package/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
  488. package/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
  489. package/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
  490. package/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
  491. package/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
  492. package/templates/native-go/backend/internal/filestation/client.go +39 -3
  493. package/templates/native-go/backend/internal/filestation/download_dsm71_test.go +82 -0
  494. package/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
  495. package/templates/native-go/backend/internal/filestation/service.go +1 -1
  496. package/templates/native-go/backend/internal/identity/README.md +5 -1
  497. package/templates/native-go/backend/internal/identity/dsm.go +24 -5
  498. package/templates/native-go/backend/internal/identity/http.go +1 -1
  499. package/templates/native-go/backend/internal/identity/identity_test.go +48 -1
  500. package/templates/native-go/backend/internal/identity/service.go +1 -1
  501. package/templates/native-go/backend/internal/portal/portal.go +138 -0
  502. package/templates/native-go/backend/internal/portal/portal_test.go +89 -0
  503. package/templates/native-go/dsm-package.yaml +20 -1
  504. package/templates/native-go/i18n/glossary.json +2 -1
  505. package/templates/native-go/i18n/messages/de.json +1 -0
  506. package/templates/native-go/i18n/messages/en.json +1 -0
  507. package/templates/native-go/i18n/messages/es.json +1 -0
  508. package/templates/native-go/i18n/messages/fr.json +1 -0
  509. package/templates/native-go/i18n/messages/it.json +1 -0
  510. package/templates/native-go/i18n/messages/ja.json +1 -0
  511. package/templates/native-go/i18n/messages/ko.json +1 -0
  512. package/templates/native-go/i18n/messages/zh-CN.json +1 -0
  513. package/templates/native-go/i18n/messages/zh-TW.json +1 -0
  514. package/templates/native-go/ui/app.css +10 -0
  515. package/templates/native-go/ui/app.js +11 -1
  516. package/templates/native-go-delegate/DELEGATE.md +126 -5
  517. package/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
  518. package/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
  519. package/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
  520. package/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
  521. package/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
  522. package/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
  523. package/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
  524. package/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
  525. package/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
  526. package/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
  527. package/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
  528. package/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
  529. package/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
  530. package/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
  531. package/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
  532. package/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
  533. package/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
  534. package/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
  535. package/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
  536. package/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
  537. package/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
  538. package/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
  539. package/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
  540. package/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
  541. package/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
  542. package/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
  543. package/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
  544. package/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
  545. package/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
  546. package/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
  547. package/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
  548. package/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
  549. package/templates/native-go-delegate/frontend/test/delegate.test.ts +15 -0
  550. package/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
  551. package/templates/native-go-delegate/test.sh +1 -0
  552. package/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
  553. package/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
  554. package/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
  555. package/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
  556. package/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
  557. package/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
  558. package/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
  559. package/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
  560. package/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
  561. package/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
  562. package/templates/native-go-root-ops/backend/internal/app/executor.go +30 -2
  563. package/templates/native-go-root-ops/backend/internal/app/executor_test.go +64 -0
  564. package/templates/native-go-vue/README.md +4 -0
  565. package/templates/native-go-vue/frontend/package-lock.json +4 -4
  566. package/templates/native-go-vue/frontend/package.json +1 -1
  567. package/templates/native-go-vue/frontend/src/App.vue +18 -13
  568. package/templates/native-go-vue/frontend/src/context.ts +31 -0
  569. package/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +54 -9
  570. package/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
  571. package/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
  572. package/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
  573. package/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +23 -0
  574. package/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +8 -2
  575. package/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
  576. package/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
  577. package/templates/native-go-vue/frontend/src/delegate/i18n/de.json +47 -0
  578. package/templates/native-go-vue/frontend/src/delegate/i18n/en.json +13 -2
  579. package/templates/native-go-vue/frontend/src/delegate/i18n/es.json +47 -0
  580. package/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +47 -0
  581. package/templates/native-go-vue/frontend/src/delegate/i18n/it.json +47 -0
  582. package/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +47 -0
  583. package/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +47 -0
  584. package/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
  585. package/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
  586. package/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
  587. package/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
  588. package/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
  589. package/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
  590. package/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
  591. package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
  592. package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
  593. package/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +47 -0
  594. package/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +16 -5
  595. package/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
  596. package/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
  597. package/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
  598. package/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
  599. package/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
  600. package/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
  601. package/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
  602. package/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
  603. package/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
  604. package/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
  605. package/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
  606. package/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
  607. package/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
  608. package/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
  609. package/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
  610. package/templates/native-go-vue/frontend/src/i18n.ts +13 -0
  611. package/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
  612. package/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
  613. package/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
  614. package/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
  615. package/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
  616. package/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
  617. package/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
  618. package/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
  619. package/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
  620. package/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
  621. package/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
  622. package/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
  623. package/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
  624. package/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
  625. package/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
  626. package/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
  627. package/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
  628. package/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
  629. package/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
  630. package/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
  631. package/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
  632. package/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
  633. package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
  634. package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
  635. package/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
  636. package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
  637. package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
  638. package/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
  639. package/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
  640. package/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "title": "Carpetas NAS — File Station",
3
- "ownPermissions": "Las operaciones usan tu sesión DSM y tus permisos actuales de File Station.",
3
+ "ownPermissions": "Las operaciones usan su sesión DSM y sus permisos actuales de File Station.",
4
4
  "choose": "Elegir carpeta",
5
5
  "confirm": "Confirmar selección",
6
6
  "refresh": "Actualizar carpetas",
@@ -14,15 +14,15 @@
14
14
  "cancel": "Cancelar",
15
15
  "close": "Cerrar",
16
16
  "loadMore": "Cargar más",
17
- "errorSession": "La sesión DSM caducó. Inicia sesión en DSM y actualiza las carpetas.",
17
+ "errorSession": "La sesión DSM caducó. Inicie sesión en DSM y actualice las carpetas.",
18
18
  "errorDenied": "No tiene permiso para acceder a este archivo o carpeta. Elija otra carpeta.",
19
- "errorNotFound": "El archivo o la carpeta ya no existe. Actualiza la lista.",
20
- "errorConflict": "Ya existe un archivo o carpeta con ese nombre. Usa otro nombre.",
21
- "errorUncertain": "La operación puede haber terminado. Actualiza las selecciones o el destino y comprueba el resultado antes de enviarla de nuevo.",
22
- "errorInvalid": "Carpeta, nombre o solicitud inválidos. Revisa los datos.",
23
- "errorUnavailable": "File Station no está disponible o falta el adaptador de sesión. Actualiza más tarde.",
24
- "errorCanceled": "Solicitud cancelada. Actualiza antes de continuar.",
25
- "errorTimeout": "La solicitud agotó el tiempo. Actualiza la lista antes de continuar.",
19
+ "errorNotFound": "El archivo o la carpeta ya no existe. Actualice la lista.",
20
+ "errorConflict": "Ya existe un archivo o carpeta con ese nombre. Use otro nombre.",
21
+ "errorUncertain": "La operación puede haber terminado. Actualice las selecciones o el destino y compruebe el resultado antes de enviarla de nuevo.",
22
+ "errorInvalid": "Carpeta, nombre o solicitud no válidos. Revise los datos.",
23
+ "errorUnavailable": "File Station no está disponible o falta el adaptador de sesión. Actualice más tarde.",
24
+ "errorCanceled": "Solicitud cancelada. Actualice antes de continuar.",
25
+ "errorTimeout": "La solicitud agotó el tiempo. Actualice la lista antes de continuar.",
26
26
  "metadata": "Metadatos",
27
27
  "fileKind": "Archivo",
28
28
  "directoryKind": "Carpeta",
@@ -37,5 +37,5 @@
37
37
  "download": "Descargar",
38
38
  "uploaded": "Archivo subido.",
39
39
  "errorDSM": "Inicie sesión en DSM con este nombre de host para acceder a los archivos NAS. El inicio de sesión en la App por sí solo no permite usar File Station.",
40
- "errorUploadSize": "Seleccione un archivo de hasta 16 GiB."
40
+ "errorUploadSize": "Seleccione un archivo de hasta 16 GB."
41
41
  }
@@ -37,5 +37,5 @@
37
37
  "download": "Télécharger",
38
38
  "uploaded": "Fichier téléversé.",
39
39
  "errorDSM": "Connectez-vous à DSM sur ce nom d’hôte pour accéder aux fichiers NAS. La connexion à l’App seule ne permet pas d’utiliser File Station.",
40
- "errorUploadSize": "Choisissez un fichier de 16 GiB maximum."
40
+ "errorUploadSize": "Choisissez un fichier de 16 GB maximum."
41
41
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "title": "Cartelle NAS — File Station",
3
- "ownPermissions": "Le operazioni usano la tua sessione DSM e i permessi File Station attuali.",
3
+ "ownPermissions": "Le operazioni usano la sessione DSM corrente e i relativi permessi File Station.",
4
4
  "choose": "Scegli cartella",
5
5
  "confirm": "Conferma selezione",
6
6
  "refresh": "Aggiorna cartelle",
@@ -14,15 +14,15 @@
14
14
  "cancel": "Annulla",
15
15
  "close": "Chiudi",
16
16
  "loadMore": "Carica altro",
17
- "errorSession": "Sessione DSM scaduta. Accedi di nuovo a DSM e aggiorna le cartelle.",
18
- "errorDenied": "Non hai il permesso di accedere a questo file o cartella. Scegli un’altra cartella.",
19
- "errorNotFound": "Il file o la cartella non esiste più. Aggiorna l’elenco.",
20
- "errorConflict": "Esiste già un file o una cartella con questo nome. Scegli un altro nome.",
21
- "errorUncertain": "L’operazione potrebbe essere completata. Aggiorna selezioni o destinazione e controlla il risultato prima di inviarla di nuovo.",
22
- "errorInvalid": "Cartella, nome o richiesta non validi. Controlla i dati.",
23
- "errorUnavailable": "File Station non disponibile o adattatore di sessione mancante. Aggiorna più tardi.",
24
- "errorCanceled": "Richiesta annullata. Aggiorna prima di continuare.",
25
- "errorTimeout": "Tempo scaduto. Aggiorna l’elenco prima di continuare.",
17
+ "errorSession": "Sessione DSM scaduta. Accedere di nuovo a DSM e aggiornare le cartelle.",
18
+ "errorDenied": "Nessun permesso di accesso a questo file o cartella. Scegliere un’altra cartella.",
19
+ "errorNotFound": "Il file o la cartella non esiste più. Aggiornare l’elenco.",
20
+ "errorConflict": "Esiste già un file o una cartella con questo nome. Scegliere un altro nome.",
21
+ "errorUncertain": "L’operazione potrebbe essere stata completata. Aggiornare selezioni o destinazione e controllare il risultato prima di inviarla di nuovo.",
22
+ "errorInvalid": "Cartella, nome o richiesta non validi. Controllare i dati.",
23
+ "errorUnavailable": "File Station non disponibile o adattatore di sessione mancante. Aggiornare più tardi.",
24
+ "errorCanceled": "Richiesta annullata. Aggiornare prima di continuare.",
25
+ "errorTimeout": "Tempo scaduto. Aggiornare l’elenco prima di continuare.",
26
26
  "metadata": "Metadati",
27
27
  "fileKind": "File",
28
28
  "directoryKind": "Cartella",
@@ -36,6 +36,6 @@
36
36
  "upload": "Carica",
37
37
  "download": "Scarica",
38
38
  "uploaded": "File caricato.",
39
- "errorDSM": "Accedi a DSM con questo nome host per accedere ai file NAS. Il solo accesso all’App non consente di usare File Station.",
40
- "errorUploadSize": "Seleziona un file fino a 16 GiB."
39
+ "errorDSM": "Accedere a DSM con questo nome host per accedere ai file NAS. Il solo accesso all’App non consente di usare File Station.",
40
+ "errorUploadSize": "Selezionare un file fino a 16 GB."
41
41
  }
@@ -1,12 +1,12 @@
1
1
  {
2
- "title": "NAS フォルダー — File Station",
2
+ "title": "NAS フォルダ — File Station",
3
3
  "ownPermissions": "自分の DSM セッションと現在の File Station 権限で操作します。",
4
- "choose": "フォルダーを選択",
4
+ "choose": "フォルダを選択",
5
5
  "confirm": "選択を確定",
6
- "refresh": "フォルダーを更新",
6
+ "refresh": "フォルダを最新の情報に更新",
7
7
  "loading": "読み込み中…",
8
- "emptyFolder": "空のフォルダーです。",
9
- "roots": "フォルダー",
8
+ "emptyFolder": "空のフォルダです。",
9
+ "roots": "フォルダ",
10
10
  "back": "戻る",
11
11
  "select": "{name} を選択",
12
12
  "open": "{name} を開く",
@@ -14,18 +14,18 @@
14
14
  "cancel": "キャンセル",
15
15
  "close": "閉じる",
16
16
  "loadMore": "さらに読み込む",
17
- "errorSession": "DSM セッションが期限切れです。DSM に再ログインし、フォルダーを更新してください。",
17
+ "errorSession": "DSM セッションが期限切れです。DSM に再ログインし、フォルダを最新の情報に更新してください。",
18
18
  "errorDenied": "このファイルまたはフォルダにアクセスする権限がありません。別のフォルダを選択してください。",
19
- "errorNotFound": "ファイルまたはフォルダーがありません。一覧を更新してください。",
20
- "errorConflict": "同名のファイルまたはフォルダーがあります。別の名前を指定してください。",
21
- "errorUncertain": "操作が完了した可能性があります。再送信する前に選択または保存先を更新し、結果を確認してください。",
22
- "errorInvalid": "フォルダー、ファイル名またはリクエストが無効です。入力を確認してください。",
23
- "errorUnavailable": "File Station が利用できないか、このパッケージにセッション adapter がありません。後で更新してください。",
24
- "errorCanceled": "リクエストをキャンセルしました。更新してから続けてください。",
25
- "errorTimeout": "リクエストがタイムアウトしました。一覧を更新してください。",
19
+ "errorNotFound": "ファイルまたはフォルダがありません。一覧を最新の情報に更新してください。",
20
+ "errorConflict": "同名のファイルまたはフォルダがあります。別の名前を指定してください。",
21
+ "errorUncertain": "操作が完了した可能性があります。再送信する前に選択または保存先を最新の情報に更新し、結果を確認してください。",
22
+ "errorInvalid": "フォルダ、ファイル名またはリクエストが無効です。入力を確認してください。",
23
+ "errorUnavailable": "File Station が利用できないか、このパッケージにセッション adapter がありません。後で最新の情報に更新してください。",
24
+ "errorCanceled": "リクエストをキャンセルしました。最新の情報に更新してから続けてください。",
25
+ "errorTimeout": "リクエストがタイムアウトしました。一覧を最新の情報に更新してください。",
26
26
  "metadata": "情報",
27
27
  "fileKind": "ファイル",
28
- "directoryKind": "フォルダー",
28
+ "directoryKind": "フォルダ",
29
29
  "nameColumn": "名前",
30
30
  "kindColumn": "種類",
31
31
  "sizeColumn": "バイト",
@@ -37,5 +37,5 @@
37
37
  "download": "ダウンロード",
38
38
  "uploaded": "ファイルをアップロードしました。",
39
39
  "errorDSM": "NAS ファイルを利用するには同じホスト名で DSM にサインインしてください。App のログインだけでは File Station を利用できません。",
40
- "errorUploadSize": "16 GiB 以下のファイルを 1 個選択してください。"
40
+ "errorUploadSize": "16 GB 以下のファイルを 1 つ選択してください。"
41
41
  }
@@ -12,17 +12,17 @@
12
12
  "open": "{name} 열기",
13
13
  "selected": "선택됨: {name}",
14
14
  "cancel": "취소",
15
- "close": "닫기",
15
+ "close": "종료",
16
16
  "loadMore": "더 불러오기",
17
- "errorSession": "DSM 세션이 만료되었습니다. DSM에 다시 로그인한 후 폴더를 새로 고치세요.",
18
- "errorDenied": "이 파일 또는 폴더에 접근할 권한이 없습니다. 다른 폴더를 선택하세요.",
19
- "errorNotFound": "파일 또는 폴더가 없습니다. 목록을 새로 고치세요.",
20
- "errorConflict": "같은 이름의 파일 또는 폴더가 있습니다. 다른 이름을 사용하세요.",
21
- "errorUncertain": "작업이 완료되었을 수 있습니다. 다시 제출하기 전에 선택 또는 대상 폴더를 새로 고쳐 결과를 확인하세요.",
22
- "errorInvalid": "폴더, 파일 이름 또는 요청이 잘못되었습니다. 입력을 확인하세요.",
23
- "errorUnavailable": "File Station을 사용할 수 없거나 패키지에 세션 adapter가 없습니다. 나중에 새로 고치세요.",
24
- "errorCanceled": "요청이 취소되었습니다. 새로 고친 후 계속하세요.",
25
- "errorTimeout": "요청 시간이 초과되었습니다. 목록을 새로 고치세요.",
17
+ "errorSession": "DSM 세션이 만료되었습니다. DSM에 다시 로그인한 후 폴더를 새로 고치십시오.",
18
+ "errorDenied": "이 파일 또는 폴더에 접근할 권한이 없습니다. 다른 폴더를 선택하십시오.",
19
+ "errorNotFound": "파일 또는 폴더가 없습니다. 목록을 새로 고치십시오.",
20
+ "errorConflict": "같은 이름의 파일 또는 폴더가 있습니다. 다른 이름을 사용하십시오.",
21
+ "errorUncertain": "작업이 완료되었을 수 있습니다. 다시 제출하기 전에 선택 또는 대상 폴더를 새로 고쳐 결과를 확인하십시오.",
22
+ "errorInvalid": "폴더, 파일 이름 또는 요청이 잘못되었습니다. 입력을 확인하십시오.",
23
+ "errorUnavailable": "File Station을 사용할 수 없거나 패키지에 세션 adapter가 없습니다. 나중에 새로 고치십시오.",
24
+ "errorCanceled": "요청이 취소되었습니다. 새로 고친 후 계속하십시오.",
25
+ "errorTimeout": "요청 시간이 초과되었습니다. 목록을 새로 고치십시오.",
26
26
  "metadata": "정보",
27
27
  "fileKind": "파일",
28
28
  "directoryKind": "폴더",
@@ -36,6 +36,6 @@
36
36
  "upload": "업로드",
37
37
  "download": "다운로드",
38
38
  "uploaded": "파일을 업로드했습니다.",
39
- "errorDSM": "NAS 파일에 접근하려면 같은 호스트 이름에서 DSM에 로그인하세요. App 로그인만으로는 File Station을 사용할 수 없습니다.",
40
- "errorUploadSize": "16 GiB 이하의 파일 하나를 선택하세요."
39
+ "errorDSM": "NAS 파일에 접근하려면 같은 호스트 이름에서 DSM에 로그인하십시오. App 로그인만으로는 File Station을 사용할 수 없습니다.",
40
+ "errorUploadSize": "16 GB 이하의 파일 하나를 선택하십시오."
41
41
  }
@@ -37,5 +37,5 @@
37
37
  "download": "下载",
38
38
  "uploaded": "文件已上传。",
39
39
  "errorDSM": "请在同一主机名登录 DSM,以访问 NAS 文件。只有 App 登录无法使用 File Station。",
40
- "errorUploadSize": "请选择一个不超过 16 GiB 的文件。"
40
+ "errorUploadSize": "请选择一个不超过 16 GB 的文件。"
41
41
  }
@@ -37,5 +37,5 @@
37
37
  "download": "下載",
38
38
  "uploaded": "檔案已上傳。",
39
39
  "errorDSM": "請在同一主機名稱登入 DSM,以存取 NAS 檔案。只有 App 登入無法使用 File Station。",
40
- "errorUploadSize": "請選擇一個不超過 16 GiB 的檔案。"
40
+ "errorUploadSize": "請選擇一個不超過 16 GB 的檔案。"
41
41
  }
@@ -0,0 +1,39 @@
1
+ <script setup lang="ts">
2
+ import {onBeforeUnmount,onMounted,ref} from 'vue'
3
+ import {Button,Callout,Form,FormActions,FormItem,Input,Link,SettingsSection} from '@synopackageland/ui'
4
+ import type {PortalAccess,PortalStatus} from '../context'
5
+ // SDK text in DSM's language comes with ctx.portal; DSM decides who may change the alias.
6
+ const props=defineProps<{portal:PortalAccess}>()
7
+ const m=props.portal.messages
8
+ const status=ref<PortalStatus>(),alias=ref(''),busy=ref(false),error=ref('')
9
+ let disposed=false
10
+ function show(next:PortalStatus){if(disposed)return;status.value=next;alias.value=next.alias||next.defaultAlias}
11
+ async function run(change:()=>Promise<PortalStatus>){
12
+ if(busy.value)return
13
+ busy.value=true;error.value=''
14
+ try{show(await change())}
15
+ catch(e){if(!disposed)error.value=m[(e as {code?:string})?.code||'']||m.portal_unavailable}
16
+ finally{if(!disposed)busy.value=false}
17
+ }
18
+ onMounted(()=>void props.portal.status().then(show))
19
+ onBeforeUnmount(()=>{disposed=true})
20
+ </script>
21
+ <template>
22
+ <SettingsSection v-if="status" :title="m.title" :collapsible="false" :aria-busy="busy">
23
+ <p v-if="status.state==='active'">{{ m.link }} <Link :href="status.url" external>{{ status.url }}</Link></p>
24
+ <template v-if="status.canManage">
25
+ <p v-if="status.state!=='active'">{{ m.inactive }}</p>
26
+ <Form @submit.prevent="run(()=>portal.apply(alias))">
27
+ <FormItem :label="m.alias" label-for="portal-alias"><Input id="portal-alias" v-model="alias" maxlength="64" autocomplete="off" :disabled="busy" /></FormItem>
28
+ <FormActions>
29
+ <Button type="submit" variant="primary" :disabled="busy">{{ m.apply }}</Button>
30
+ <Button v-if="status.state==='active'" variant="secondary" :disabled="busy" @click="run(()=>portal.disable())">{{ m.disable }}</Button>
31
+ </FormActions>
32
+ </Form>
33
+ <Button variant="secondary" @click="portal.openControlPanel()">{{ m.advanced }}</Button>
34
+ </template>
35
+ <Button v-else-if="status.controlPanel" variant="secondary" @click="portal.openControlPanel()">{{ m.controlPanel }}</Button>
36
+ <p v-else-if="status.state!=='active'">{{ m.askAdmin }}</p>
37
+ <Callout v-if="error" tone="danger"><span role="alert">{{ error }}</span></Callout>
38
+ </SettingsSection>
39
+ </template>
@@ -1,4 +1,4 @@
1
1
  {
2
- "status": "État",
2
+ "status": "Statut",
3
3
  "background": "Tâches en arrière-plan"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
- "status": "ステータス",
2
+ "status": "状態",
3
3
  "background": "バックグラウンドジョブ"
4
4
  }
@@ -41,3 +41,17 @@ test('failed status loading offers a retry and releases the mounting class',asyn
41
41
  f.app.unmount();expect(f.root.classList.contains('dsmapp-vue-root')).toBe(false)
42
42
  }finally{f.close()}
43
43
  })
44
+ test('a portal app shows the Application Portal section on the status page',async()=>{
45
+ const without=fixture('Plain')
46
+ const f=fixture('Portal')
47
+ try{
48
+ await settle();expect(without.root.textContent).not.toContain('Application Portal')
49
+ f.app.unmount()
50
+ const status={state:'active',alias:'portal',url:'https://nas.example/portal/',canManage:false,controlPanel:false,defaultAlias:'portal'} as const
51
+ f.ctx.portal={messages:{title:'Application Portal',link:'Direct link:'},status:vi.fn(async()=>status),apply:vi.fn(),disable:vi.fn(),openControlPanel:vi.fn(),mountPanel:vi.fn()}
52
+ const app=mount(f.root,f.ctx);await settle()
53
+ expect(f.root.textContent).toContain('Application Portal')
54
+ expect(f.root.querySelector('a[href="https://nas.example/portal/"]')).not.toBeNull()
55
+ app.unmount()
56
+ }finally{without.close();f.root.remove()}
57
+ })
@@ -0,0 +1,71 @@
1
+ // @vitest-environment jsdom
2
+ import {expect,test,vi} from 'vitest'
3
+ import {createApp,h,nextTick} from 'vue'
4
+ import {AppRoot} from '@synopackageland/ui'
5
+ import PortalSettings from '../src/portal/PortalSettings.vue'
6
+ import type {PortalAccess,PortalStatus} from '../src/context'
7
+
8
+ const messages={title:'Application Portal',link:'Direct link:',inactive:'Not active.',askAdmin:'Ask an administrator',alias:'Alias',apply:'Apply',disable:'Turn off',advanced:'Advanced',controlPanel:'Open Control Panel',portal_alias_in_use:'Alias in use',portal_unavailable:'DSM refused'}
9
+ const base:PortalStatus={state:'inactive',canManage:false,controlPanel:false,defaultAlias:'my-app'}
10
+ function access(status:PortalStatus,overrides:Partial<PortalAccess>={}):PortalAccess{
11
+ return {messages,status:vi.fn(async()=>status),apply:vi.fn(async()=>status),disable:vi.fn(async()=>status),openControlPanel:vi.fn(),mountPanel:vi.fn(),...overrides}
12
+ }
13
+ async function mount(portal:PortalAccess){
14
+ const root=document.createElement('div');document.body.append(root)
15
+ const app=createApp({render:()=>h(AppRoot,{},()=>h(PortalSettings,{portal}))})
16
+ app.mount(root);await nextTick();await nextTick();await new Promise(r=>setTimeout(r));await nextTick()
17
+ return {root,unmount(){app.unmount();root.remove()}}
18
+ }
19
+ const buttons=(root:HTMLElement)=>[...root.querySelectorAll('button')].map(b=>b.textContent?.trim())
20
+
21
+ test('an ordinary user sees the active link and nothing to change',async()=>{
22
+ const {root,unmount}=await mount(access({...base,state:'active',alias:'my-app',url:'https://nas.example/my-app/'}))
23
+ try{
24
+ expect(root.querySelector('a')?.getAttribute('href')).toBe('https://nas.example/my-app/')
25
+ expect(root.querySelector('input')).toBeNull();expect(root.querySelector('button')).toBeNull()
26
+ }finally{unmount()}
27
+ })
28
+
29
+ test('an ordinary user without an active alias is asked to contact an administrator',async()=>{
30
+ const {root,unmount}=await mount(access({...base,state:'unavailable'}))
31
+ try{
32
+ expect(root.textContent).toContain('Ask an administrator')
33
+ expect(root.querySelector('a,input,button')).toBeNull()
34
+ }finally{unmount()}
35
+ })
36
+
37
+ test('an administrator applies the prefilled alias and sees DSM refusals as portal text',async()=>{
38
+ const apply=vi.fn(async()=>Promise.reject({code:'portal_alias_in_use'}))
39
+ const portal=access({...base,canManage:true},{apply})
40
+ const {root,unmount}=await mount(portal)
41
+ try{
42
+ const input=root.querySelector('input')!
43
+ expect(input.value).toBe('my-app')
44
+ root.querySelector('form')!.dispatchEvent(new Event('submit',{cancelable:true}))
45
+ await new Promise(r=>setTimeout(r));await nextTick()
46
+ expect(apply).toHaveBeenCalledWith('my-app')
47
+ expect(root.querySelector('[role="alert"]')?.textContent).toContain('Alias in use')
48
+ ;[...root.querySelectorAll('button')].find(b=>b.textContent?.includes('Advanced'))!.click()
49
+ expect(portal.openControlPanel).toHaveBeenCalled()
50
+ }finally{unmount()}
51
+ })
52
+
53
+ test('an administrator turns an active alias off',async()=>{
54
+ const portal=access({...base,state:'active',alias:'my-app',url:'https://nas.example/my-app/',canManage:true})
55
+ const {root,unmount}=await mount(portal)
56
+ try{
57
+ expect(root.querySelector('a')?.getAttribute('href')).toBe('https://nas.example/my-app/')
58
+ ;[...root.querySelectorAll('button')].find(b=>b.textContent?.includes('Turn off'))!.click()
59
+ await nextTick()
60
+ expect(portal.disable).toHaveBeenCalled()
61
+ }finally{unmount()}
62
+ })
63
+
64
+ test('an administrator without DSM portal support gets only the Control Panel shortcut',async()=>{
65
+ const portal=access({...base,state:'unavailable',controlPanel:true})
66
+ const {root,unmount}=await mount(portal)
67
+ try{
68
+ expect(root.querySelector('input')).toBeNull()
69
+ expect(buttons(root)).toEqual(['Open Control Panel'])
70
+ }finally{unmount()}
71
+ })
@@ -0,0 +1,50 @@
1
+ // @vitest-environment jsdom
2
+ // @vitest-environment-options {"url":"https://nas.test"}
3
+ import {expect,test,vi} from 'vitest'
4
+ import {nextTick} from 'vue'
5
+ import {mount} from '../src/main'
6
+ import type {Context} from '../src/context'
7
+ import {appCopy} from '../src/i18n'
8
+ import {identityCopy} from '../src/identity/i18n'
9
+ async function settle(){for(let i=0;i<20;i++){await Promise.resolve();await nextTick()}}
10
+ const buttons=(root:HTMLElement)=>[...root.querySelectorAll('button')].map(b=>b.textContent?.trim())
11
+ function start(locale:string,call:(method:string)=>Promise<unknown>){
12
+ const ctx={locale,call:vi.fn(call),reopen(){return ()=>{}}} as unknown as Context
13
+ const root=document.createElement('div');document.body.append(root)
14
+ const app=mount(root,ctx)
15
+ return {root,close(){app.unmount();root.remove()}}
16
+ }
17
+ test('the status page and its errors follow the DSM language',async()=>{
18
+ const copy=appCopy('ger')
19
+ const {root,close}=start('de',async method=>{
20
+ if(method==='app.status')return {package:'Pkg',version:'1',user:'admin',admin:true}
21
+ if(method==='greeting.get')throw {code:'admin_required'}
22
+ throw {code:'unknown_method'}
23
+ })
24
+ try{
25
+ await settle()
26
+ expect(buttons(root)).toContain(copy.refresh)
27
+ expect(root.textContent).toContain(copy.statusTitle)
28
+ expect(root.textContent).toContain(copy.greeting)
29
+ expect(root.textContent).toContain(copy.errors.admin_required)
30
+ expect(root.querySelector('[aria-label]')?.getAttribute('aria-label')).not.toBe('Package settings')
31
+ }finally{close()}
32
+ })
33
+ test('unknown failures name the code in the DSM language',()=>{
34
+ expect(appCopy('ja').errors.request_failed).toContain('{code}')
35
+ })
36
+ test('the sign-in page and its session notices follow the DSM language',async()=>{
37
+ const copy=identityCopy('jpn')
38
+ const {root,close}=start('ja',async method=>{
39
+ if(method==='identity.status')return {enabled:true}
40
+ if(method==='identity.session')return {user:'alice',uid:'1',expiresAt:new Date(Date.now()-1000).toISOString()}
41
+ throw {code:'session_required'}
42
+ })
43
+ try{
44
+ await settle()
45
+ expect(root.textContent).toContain(copy.title)
46
+ expect(buttons(root)).toEqual(expect.arrayContaining([copy.signIn,copy.continueDSM]))
47
+ expect(root.querySelector('[role="status"]')?.textContent).toBe(copy.notices.expired)
48
+ expect(root.textContent).not.toMatch(/Sign in|Account|Password|session/)
49
+ }finally{close()}
50
+ })
package/package.json CHANGED
@@ -1,13 +1,17 @@
1
1
  {
2
2
  "name": "@synopackageland/cli",
3
- "version": "0.6.1",
3
+ "version": "0.7.1",
4
4
  "description": "Syno Package Land Developer Kit CLI",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "synopkgland": "./dist/bin.js"
8
8
  },
9
+ "engines": {
10
+ "node": ">=22.12"
11
+ },
9
12
  "files": [
10
13
  "dist",
14
+ "CHANGELOG.md",
11
15
  "templates",
12
16
  "schema",
13
17
  "skills"
@@ -0,0 +1,101 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "properties": {
6
+ "changelog": {
7
+ "oneOf": [
8
+ {
9
+ "type": "string",
10
+ "maxLength": 16000
11
+ },
12
+ {
13
+ "type": "object",
14
+ "maxProperties": 32,
15
+ "additionalProperties": {
16
+ "type": "string",
17
+ "maxLength": 16000
18
+ }
19
+ }
20
+ ]
21
+ },
22
+ "contact_email": {
23
+ "type": "string",
24
+ "maxLength": 16000,
25
+ "pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"
26
+ },
27
+ "support_email": {
28
+ "type": "string",
29
+ "maxLength": 16000,
30
+ "pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"
31
+ },
32
+ "homepage": {
33
+ "type": "string",
34
+ "maxLength": 16000,
35
+ "pattern": "^https?://"
36
+ },
37
+ "source_url": {
38
+ "type": "string",
39
+ "maxLength": 16000,
40
+ "pattern": "^https?://"
41
+ },
42
+ "issues_url": {
43
+ "type": "string",
44
+ "maxLength": 16000,
45
+ "pattern": "^https?://"
46
+ },
47
+ "license": {
48
+ "type": "string",
49
+ "maxLength": 16000
50
+ },
51
+ "maintainer_url": {
52
+ "type": "string",
53
+ "maxLength": 16000,
54
+ "pattern": "^https?://"
55
+ },
56
+ "distributor": {
57
+ "type": "string",
58
+ "maxLength": 16000
59
+ },
60
+ "distributor_url": {
61
+ "type": "string",
62
+ "maxLength": 16000,
63
+ "pattern": "^https?://"
64
+ },
65
+ "support_url": {
66
+ "type": "string",
67
+ "maxLength": 16000,
68
+ "pattern": "^(https?://|mailto:)"
69
+ },
70
+ "helpurl": {
71
+ "type": "string",
72
+ "maxLength": 16000,
73
+ "pattern": "^https?://"
74
+ },
75
+ "long_description": {
76
+ "oneOf": [
77
+ {
78
+ "type": "string",
79
+ "maxLength": 16000
80
+ },
81
+ {
82
+ "type": "object",
83
+ "maxProperties": 32,
84
+ "additionalProperties": {
85
+ "type": "string",
86
+ "maxLength": 16000
87
+ }
88
+ }
89
+ ]
90
+ },
91
+ "screenshots": {
92
+ "type": "array",
93
+ "maxItems": 12,
94
+ "items": {
95
+ "type": "string",
96
+ "pattern": "^https?://",
97
+ "maxLength": 2048
98
+ }
99
+ }
100
+ }
101
+ }
@@ -118,6 +118,18 @@
118
118
  "pattern": "^(?:[A-Za-z0-9._-]{1,64}|[A-Za-z0-9._-]{1,64}\\\\[A-Za-z0-9._-](?:[A-Za-z0-9._ -]{0,126}[A-Za-z0-9._-])?|[A-Za-z0-9._-](?:[A-Za-z0-9._ -]{0,126}[A-Za-z0-9._-])?@[A-Za-z0-9._-]{1,64})$(?![\\s\\S])"
119
119
  },
120
120
  "description": "DSM group names allowed in; only with access: dsm-groups."
121
+ },
122
+ "portal": {
123
+ "type": "object",
124
+ "properties": {
125
+ "alias": {
126
+ "type": "string",
127
+ "pattern": "^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$",
128
+ "description": "Default DSM Application Portal alias (https://<nas>/<alias>/). Omit to use the package name. An administrator still applies it."
129
+ }
130
+ },
131
+ "additionalProperties": false,
132
+ "description": "Register the App in DSM Control Panel > Login Portal > Applications. Needs launch: dsm-window behind the DSM gateway (access other than public) and os_min_ver 7.3.2-86009 or later. Registration alone exposes nothing."
121
133
  }
122
134
  },
123
135
  "additionalProperties": true
@@ -149,6 +161,106 @@
149
161
  "type": "boolean"
150
162
  }
151
163
  }
164
+ },
165
+ "metadata": {
166
+ "type": "object",
167
+ "additionalProperties": false,
168
+ "properties": {
169
+ "changelog": {
170
+ "oneOf": [
171
+ {
172
+ "type": "string",
173
+ "maxLength": 16000
174
+ },
175
+ {
176
+ "type": "object",
177
+ "maxProperties": 32,
178
+ "additionalProperties": {
179
+ "type": "string",
180
+ "maxLength": 16000
181
+ }
182
+ }
183
+ ]
184
+ },
185
+ "contact_email": {
186
+ "type": "string",
187
+ "maxLength": 16000,
188
+ "pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"
189
+ },
190
+ "support_email": {
191
+ "type": "string",
192
+ "maxLength": 16000,
193
+ "pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"
194
+ },
195
+ "homepage": {
196
+ "type": "string",
197
+ "maxLength": 16000,
198
+ "pattern": "^https?://"
199
+ },
200
+ "source_url": {
201
+ "type": "string",
202
+ "maxLength": 16000,
203
+ "pattern": "^https?://"
204
+ },
205
+ "issues_url": {
206
+ "type": "string",
207
+ "maxLength": 16000,
208
+ "pattern": "^https?://"
209
+ },
210
+ "license": {
211
+ "type": "string",
212
+ "maxLength": 16000
213
+ },
214
+ "maintainer_url": {
215
+ "type": "string",
216
+ "maxLength": 16000,
217
+ "pattern": "^https?://"
218
+ },
219
+ "distributor": {
220
+ "type": "string",
221
+ "maxLength": 16000
222
+ },
223
+ "distributor_url": {
224
+ "type": "string",
225
+ "maxLength": 16000,
226
+ "pattern": "^https?://"
227
+ },
228
+ "support_url": {
229
+ "type": "string",
230
+ "maxLength": 16000,
231
+ "pattern": "^(https?://|mailto:)"
232
+ },
233
+ "helpurl": {
234
+ "type": "string",
235
+ "maxLength": 16000,
236
+ "pattern": "^https?://"
237
+ },
238
+ "long_description": {
239
+ "oneOf": [
240
+ {
241
+ "type": "string",
242
+ "maxLength": 16000
243
+ },
244
+ {
245
+ "type": "object",
246
+ "maxProperties": 32,
247
+ "additionalProperties": {
248
+ "type": "string",
249
+ "maxLength": 16000
250
+ }
251
+ }
252
+ ]
253
+ },
254
+ "screenshots": {
255
+ "type": "array",
256
+ "maxItems": 12,
257
+ "items": {
258
+ "type": "string",
259
+ "pattern": "^https?://",
260
+ "maxLength": 2048
261
+ }
262
+ }
263
+ }
152
264
  }
153
265
  },
154
266
  "additionalProperties": true