@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
package/README.md CHANGED
@@ -1,107 +1,99 @@
1
1
  # Syno Package Land CLI
2
2
 
3
- Create independent DSM packages by selecting a runtime and declaring the work your app needs.
3
+ `synopkgland` builds Synology DSM packages (SPK). Pick a template, declare what your app needs,
4
+ and the CLI checks, builds and installs the package.
4
5
 
5
- ```sh
6
- synopkgland init -t native-go --with files,jobs,login --package MyApp ./my-app
7
- (cd my-app/frontend && npm ci)
8
- synopkgland --project ./my-app check --json
9
- synopkgland --project ./my-app build --arch x86_64 --json
10
- synopkgland inspect ./my-app/dist/MyApp-0.1.0-0001-x86_64.spk --json
11
- synopkgland --project ./my-app deploy --dry-run --arch x86_64 --json
12
- # When installation on this configured NAS profile is intended:
13
- synopkgland --project ./my-app deploy --host my-nas --arch x86_64 --json
14
- synopkgland --project ./my-app status --host my-nas --json
15
- ```
16
-
17
- Native-go needs Go 1.25+ and defaults to Vue; install frontend dependencies before building. Use Node 22.19+ for the documented workflow. `--ui plain` skips the frontend npm build but cannot use standalone login. Binary packages a static Linux CGI that owns authentication. Compose imports an upstream project with `init -t compose --from ./compose.yaml`, or creates an example when the import option is omitted.
18
-
19
- ## Capabilities and authorization
20
-
21
- | Class | Declaration | Execution, limits and administrator action |
22
- | --- | --- | --- |
23
- | A | Base private settings/data; `--with jobs` | Package-account work bound to trusted username/UID; ordinary users can submit and access their own jobs without admin setup. Private copies do not retain source authority. |
24
- | B | `--with files` | Caller-session metadata, TreeView/DataGrid file tree, shared NasPicker, streaming upload/download. File Station enforces the caller's permissions; no capability setup. |
25
- | I | `--with login` | Same-host DSM cookie reuse, including another port, or HTTPS DSM account/password/OTP fallback. App session at most 15 minutes; sensitive operations revalidate live DSM cookie/UID. Vue required. |
26
- | C | `--with delegate` | One-time admin executor setup, revocable subject/job/operation/scope/expiry grants; DSM runner and uid-dropped writes enforce the user's own permissions. |
27
- | R | `--with root-ops` | Fixed root/*.sh, administrator only. Shares one-time digest-locked executor setup with C; every root request independently verifies an active administrator. |
28
-
29
- An App session identifies the person but does not create File Station authority. Files without a live DSM cookie return `dsm_session_required`; sensitive business methods may return `session_revalidation_required`. Sign in to DSM on the same hostname. P2 scope is a usage restriction, not the permission boundary; per-operation account/AppPriv checks must reject disabled accounts and denied application access. Digest-locked boot tasks restore the executor after reboot; complete integrated lifecycle acceptance remains pending.
30
-
31
- Generated native-go/binary require schema 2 `dsm-package.yaml`, with `backend: {kind: go, dir: backend}` or `backend: {kind: binary, files: {x86_64: prebuilt/api-x86_64}}`. Capability values are `files: session`, `jobs: true` (or `{worker: sha256-v1}`), `identity: standalone`, `rootOps: true`, `delegate: {operations: [files.write], scope: home}` inside `capabilities`. Jobs and daemon are mutually exclusive. Binary/compose do not support files/jobs/login/delegate; current rootOps also requires Go. Business route access comes from `backend/internal/api/permissions.json`; SDK-owned route policy cannot be overridden.
32
-
33
- See the [delegate guide](../../website/src/content/docs/docs/guides/delegate.md) ([繁體中文](../../website/src/content/docs/zh-tw/docs/guides/delegate.md)) and [administrator lifecycle checks](../../website/src/content/docs/docs/concepts/lifecycle.md) ([繁體中文](../../website/src/content/docs/zh-tw/docs/concepts/lifecycle.md)) for exact operations, errors and cleanup.
34
-
35
- ## Add capabilities and inspect readiness
6
+ Full documentation: <https://www.varvis.me/docs/> ([繁體中文](https://www.varvis.me/zh-tw/docs/)).
36
7
 
37
- `add files jobs login` updates the manifest and SDK-owned overlays while preserving App-owned handlers/pages. A differing overlay or modified SDK placeholder causes `ADD_FILE_CONFLICT`; review the listed paths. Already-declared capabilities are a no-op. Pristine SDK stubs and the generated route-policy test scaffold may be replaced only while matching the bundled base.
8
+ ## Install
38
9
 
39
- `check`, `build`, `inspect`, `deploy` and `status` support `--json`. Stdout contains one object; progress uses stderr; errors contain stable `code`, `message`, `hint`. `status --host <profile>` reports package state, Open URL and per-capability ready/needs-admin-approval/unsupported/blocked reasons. Installation success is separate from approval and runtime caller permissions. `logs` currently reads DSM package status diagnostics; it does not stream App/worker/executor logs and has no follow flag.
40
-
41
- ## Containers and distribution
42
-
43
- Compose retains its separate synology-app.yaml contract. `--share MEDIA_SHARE=photos`, `--run-as RUN_AS=alice` and `--param APP_MODE=prod` supply installation answers. Retain upstream container target paths. Fixed UID/GID mounts govern service access; upstream authentication remains explicit. The DSM gateway controls entry and does not supply a general per-user files capability. `dev`, `test` and `images pin` are Compose tools.
10
+ ```sh
11
+ npm install -g @synopackageland/cli --registry=https://registry.npmjs.org
12
+ ```
44
13
 
45
- `--dev` selects container development identities. Deploy uploads directly to the selected DSM host, never to a catalog. There is no release, signing or public-submit command.
14
+ Native Go apps need Go 1.25+ and npm. The CLI is tested on Node.js 22.19.
46
15
 
47
- Uninstall requests executor purge and verified own-task removal. If automatic cleanup is unavailable or skipped, an administrator must inspect surviving tasks and protected state. The Delete App Data checkbox does not prove complete deletion: retained DSM directories, account/group and symlink artifacts need readback. Full device lifecycle acceptance and DSM-update persistence remain separate.
16
+ ## Quick start
48
17
 
49
- See the bilingual website CLI and schema reference for the complete command/flag inventory; website tests compare it to this CLI's help output.
18
+ ```sh
19
+ synopkgland init -t native-go --with files,jobs,login --package MyApp my-app
20
+ cd my-app
21
+ (cd frontend && npm ci)
22
+ synopkgland check --json
23
+ synopkgland build --arch x86_64 --json
24
+ synopkgland inspect dist/MyApp-0.1.0-0001-x86_64.spk --json
25
+ synopkgland deploy --host my-nas --arch x86_64 --json
26
+ synopkgland status --host my-nas --json
27
+ ```
50
28
 
51
- ## AI authoring guidance
29
+ `deploy --dry-run` prints the deployment plan without connecting to a NAS. You can also install
30
+ the SPK with Package Center's Manual Install.
52
31
 
53
- Every scaffold includes AGENTS.md and a CLAUDE.md pointer. Start with
54
- `synopkgland skill list`, read `synopkgland skill show orchestrator`, then the
55
- relevant skill. `synopkgland skill path` locates the bundled reference files.
56
- For UI work, read `synopkgland skill show ui-vue` for direct Vue components and
57
- `synopkgland skill show ui-json` for optional JSON specs. Both use the installed
58
- UI contracts; the Vue template does not require JSON. Follow AGENTS.md's local
59
- check/build/inspect workflow and obtain authorization before connecting to NAS.
32
+ ## Templates
60
33
 
61
- For UI discovery, run `npx --no syno-pkg-land-ui catalog --json` and
62
- `npx --no syno-pkg-land-ui describe Button --json` from the installed frontend.
63
- Read its prompt and exported Vue docs/types before choosing component APIs.
64
- Use `syno-pkg-land-ui` directly in npm scripts; keep AI guidance version-independent.
34
+ | Template | Use it for | Manifest |
35
+ | --- | --- | --- |
36
+ | `native-go` | A Go backend with a Vue UI (or `--ui plain`) | `dsm-package.yaml` |
37
+ | `binary` | A static Linux program you build yourself | `dsm-package.yaml` |
38
+ | `compose` | An existing Docker Compose app (`--from compose.yaml`) | `synology-app.yaml` |
65
39
 
66
- For an empty directory or one-off discovery, select the package explicitly:
40
+ Existing native products with their own payload layout use `backend: {kind: native}` in
41
+ `dsm-package.yaml`.
67
42
 
68
- ```sh
69
- npx -y -p @synopackageland/ui syno-pkg-land-ui catalog
70
- ```
43
+ ## Capabilities
71
44
 
72
- The render output defaults to `syno-pkg-land-ui-render`; use `--out shots` to
73
- choose an artifact directory.
45
+ Add them with `init --with …` or later with `synopkgland add <capability…>`.
74
46
 
47
+ | Capability | What the app can do | Who approves |
48
+ | --- | --- | --- |
49
+ | `files` | Browse, read and write NAS files as the signed-in DSM user | Nobody; File Station applies that user's permissions |
50
+ | `jobs` | Run background jobs and schedules as the package | Nobody |
51
+ | `login` | Sign users in with their DSM account, without the DSM desktop | Nobody; requires HTTPS for password sign-in |
52
+ | `delegate` | Move files into a user's chosen folder while the user is offline | An administrator, once |
53
+ | `root-ops` | Run fixed `root/*.sh` scripts for administrators | An administrator, once |
54
+ | `portal` | Open the app from its own Application Portal alias | An administrator sets the alias; needs DSM 7.3.2-86009+ |
55
+
56
+ Delegate is implemented; its default operation is `files.moveFromStaging`.
57
+ Device lifecycle acceptance on real hardware is still pending for delegate and root operations.
58
+
59
+ ## Commands
60
+
61
+ | Command | Purpose |
62
+ | --- | --- |
63
+ | `init` | Create a project from a template |
64
+ | `add` | Add capabilities or `portal` to a project |
65
+ | `check` | Validate the manifest, capability combinations and Compose file |
66
+ | `build` | Build the SPK for one or more architectures |
67
+ | `inspect` | Inspect an SPK without installing it |
68
+ | `deploy` | Build and install on a NAS |
69
+ | `status` | Show package state, Open URL and capability readiness |
70
+ | `logs` | Show package status diagnostics |
71
+ | `dev`, `test`, `images` | Run, test and pin images for Compose projects |
72
+ | `skill` | Read the bundled guidance for AI assistants |
73
+
74
+ `--json` prints one JSON object on stdout: `{ok: true, command, data}` on success and
75
+ `{ok: false, code, message, hint}` on failure. See the
76
+ [CLI reference](https://www.varvis.me/docs/reference/cli/) and
77
+ [error codes](https://www.varvis.me/docs/reference/errors/).
78
+
79
+ ## AI assistants
80
+
81
+ Every project includes `AGENTS.md` and a `CLAUDE.md` pointer. Start with
82
+ `synopkgland skill list` and `synopkgland skill show orchestrator`. For UI work, read
83
+ `synopkgland skill show ui-vue` (Vue components) or `synopkgland skill show ui-json`
84
+ (JSON specs). From an installed frontend, `npx --no syno-pkg-land-ui catalog --json` lists the
85
+ UI components and `npx --no syno-pkg-land-ui describe Button --json` describes one.
75
86
 
76
87
  ## Licensing
77
88
 
78
- The CLI and original templates are MIT licensed, Copyright (c) 2026 synopkgland.
79
- Third-party components retain their own terms.
80
- Generated projects keep these template terms in `LICENSES/TEMPLATE.txt`.
81
- `init` does not create an app-level `LICENSE` or select a license for your work:
82
- choose your own terms and copyright holder in the project root `LICENSE`.
83
- Retain the template and dependency notices when distributing derived code.
84
-
85
- SPKs place legal material under the installed payload's `LICENSES/` directory:
86
- `TEMPLATE.txt`, optional developer `APP.txt`, Go's `GO-LICENSE`/`GO-PATENTS`,
87
- `GO-THIRD_PARTY_NOTICES.txt`, and the Vue `ui/` notice tree.
88
-
89
- Vue builds generate full notices plus `inventory.json` from the installed,
90
- locked production dependency tree. Missing text or a version mismatch fails the
91
- build. Run `npm ci` in the generated frontend before building.
92
-
93
- Keep `backend/THIRD_PARTY_NOTICES.txt` current if you change Go modules.
94
- The supplied notice inventory covers the pinned template dependencies and Go
95
- runtime; arbitrary developer binaries, Go module additions, container images,
96
- custom UI bundles and upstream applications need their own notice inventory.
97
-
98
- ### Existing native products
99
-
100
- Schema 2 also supports `backend: {kind: native}` with `layout` and `native` declarations.
101
- This preserves project-owned multi-executable payloads, metadata/conf, lifecycle hooks,
102
- checksum-pinned DSM toolkits and x86_64/aarch64/armv8/armv7 families. Lifecycle and
103
- systemd remain package-only; root task authorization is an explicit product responsibility.
104
- The separate `@synopackageland/cli/authorization-sdk` export provides the pinned-task
105
- host adapter and Vue authorization gate. Generated Go rootOps/delegate still use the executor.
106
- See the [native layout and migration guide](../../website/src/content/docs/docs/guides/native-layout.md)
107
- ([繁體中文](../../website/src/content/docs/zh-tw/docs/guides/native-layout.md)).
89
+ The CLI and its original templates are MIT licensed, Copyright (c) 2026 synopkgland.
90
+ Third-party components keep their own terms.
91
+
92
+ - Generated projects keep the template terms in `LICENSES/TEMPLATE.txt`. `init` does not choose a
93
+ license for your app: add your own `LICENSE`.
94
+ - An SPK carries its legal notices under `LICENSES/` in the installed payload: `TEMPLATE.txt`,
95
+ an optional `APP.txt`, Go's license, patents and third-party notices, and the Vue UI notices.
96
+ - Vue builds generate the UI notices from the installed, locked dependencies; run `npm ci` in
97
+ `frontend/` first. A missing notice or version mismatch fails the build.
98
+ - Keep `backend/THIRD_PARTY_NOTICES.txt` current when you change Go modules. Your own binaries,
99
+ added modules, container images and upstream apps need their own notices.
package/dist/add.d.ts CHANGED
@@ -1,4 +1,7 @@
1
- export declare function addCapabilities(root: string, requested: string[]): {
1
+ type AddResult = {
2
2
  added: string[];
3
3
  unchanged: string[];
4
+ notes?: string[];
4
5
  };
6
+ export declare function addCapabilities(root: string, requested: string[]): AddResult;
7
+ export {};
package/dist/add.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import { existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';
2
2
  import { tmpdir } from 'node:os';
3
3
  import { dirname, join, relative } from 'node:path';
4
- import { parseDocument } from 'yaml';
4
+ import { isScalar, parseDocument } from 'yaml';
5
5
  import { capabilityNames, capabilitySettings } from './capabilities.js';
6
- import { initFromTemplate } from './init.js';
6
+ import { initFromTemplate, nativeCapabilitySettings } from './init.js';
7
7
  import { templatesRoot } from './template-paths.js';
8
- import { DEFAULT_MIN_DSM, isDsmAtLeast } from './build-spk/dsm-version.js';
8
+ import { DEFAULT_MIN_DSM, isDsmAtLeast, PORTAL_MIN_DSM } from './build-spk/dsm-version.js';
9
9
  import { loadStandaloneManifest } from './standalone/manifest.js';
10
10
  const overlays = {
11
11
  jobs: ['native-go-jobs'],
@@ -46,7 +46,43 @@ function safePath(root, file) {
46
46
  }
47
47
  return true;
48
48
  }
49
+ /** Raise a lower os_min_ver to the floor a capability needs; a higher one stays. Returns the notice. */
50
+ function raiseOsMinVer(doc, current, floor, capability) {
51
+ const osMinVer = doc.get('os_min_ver', true);
52
+ if (!isScalar(osMinVer) || isDsmAtLeast(current, floor))
53
+ return [];
54
+ osMinVer.value = floor;
55
+ return [`os_min_ver raised from ${current} to ${floor}: ${capability} needs DSM ${floor} or later.`];
56
+ }
57
+ function withNotes(result, notes) {
58
+ const all = [...(result.notes ?? []), ...notes];
59
+ return all.length ? { ...result, notes: all } : result;
60
+ }
61
+ /**
62
+ * `portal: {}` in dsm-package.yaml; the Go and binary starters already carry the UI and backend side.
63
+ * A lower os_min_ver is raised to PORTAL_MIN_DSM, the oldest DSM verified to install a portal.
64
+ */
65
+ function addPortal(root, result) {
66
+ const loaded = loadStandaloneManifest(root);
67
+ if (!loaded.ok)
68
+ throw new Error(loaded.errors.map(e => `[${e.code}] ${e.message}`).join('\n'));
69
+ if (loaded.manifest.portal)
70
+ return { ...result, unchanged: [...result.unchanged, 'portal'] };
71
+ if (!safePath(root, 'dsm-package.yaml'))
72
+ throw new Error('[ADD_FILE_CONFLICT] 既有檔案與 SDK overlay 不同:dsm-package.yaml;請先移動或合併衝突,不會覆寫。');
73
+ const manifestPath = join(root, 'dsm-package.yaml');
74
+ const doc = parseDocument(readFileSync(manifestPath, 'utf8'));
75
+ doc.set('portal', doc.createNode({}, { flow: true }));
76
+ const notes = raiseOsMinVer(doc, loaded.manifest.os_min_ver, PORTAL_MIN_DSM, 'portal');
77
+ writeFileSync(manifestPath, String(doc));
78
+ return withNotes({ ...result, added: [...result.added, 'portal'] }, notes);
79
+ }
49
80
  export function addCapabilities(root, requested) {
81
+ const wanted = [...new Set(requested.flatMap(value => value.split(',')).map(value => value.trim()))];
82
+ if (wanted.includes('portal')) {
83
+ const rest = wanted.filter(name => name !== 'portal');
84
+ return addPortal(root, rest.length ? addCapabilities(root, rest) : { added: [], unchanged: [] });
85
+ }
50
86
  const names = capabilityNames(requested);
51
87
  const loaded = loadStandaloneManifest(root);
52
88
  if (!loaded.ok)
@@ -59,8 +95,8 @@ export function addCapabilities(root, requested) {
59
95
  const added = names.filter(name => !unchanged.includes(name));
60
96
  if (!added.length)
61
97
  return { added, unchanged };
62
- if ((added.includes('jobs') || added.includes('delegate')) && m.daemon)
63
- throw new Error('[CAPABILITY_COMBINATION_INVALID] daemon 與 capabilities.jobs 互斥。');
98
+ if (m.daemon && added.includes('jobs') && !added.includes('delegate') && m.capabilities.delegate?.lifetime !== 'until-revoked')
99
+ throw new Error('[CAPABILITY_COMBINATION_INVALID] daemon 僅可與 until-revoked delegate 固定 worker 共存。');
64
100
  if (m.backend.dir !== join(root, 'backend'))
65
101
  throw new Error('[ADD_LAYOUT_UNSUPPORTED] SDK overlay 需要 backend.dir: backend。');
66
102
  const work = mkdtempSync(join(tmpdir(), 'synopkgland-add-'));
@@ -96,11 +132,10 @@ export function addCapabilities(root, requested) {
96
132
  if (conflicts.length)
97
133
  throw new Error(`[ADD_FILE_CONFLICT] 既有檔案與 SDK overlay 不同:${conflicts.join(', ')};請先移動或合併衝突,不會覆寫。`);
98
134
  const doc = parseDocument(readFileSync(manifestPath, 'utf8'));
99
- for (const [key, value] of Object.entries(capabilitySettings(added)))
135
+ for (const [key, value] of Object.entries(nativeCapabilitySettings(added)))
100
136
  doc.setIn(['capabilities', key], value);
101
- // All semantic checks precede writes to the user's project.
102
- if (added.includes('root-ops') && !isDsmAtLeast(m.os_min_ver, DEFAULT_MIN_DSM))
103
- throw new Error('[STANDALONE_OS_MIN_VER_INVALID] rootOps 需要 DSM 7.1-42661 或以上。');
137
+ // rootOps needs DSM 7.1-42661 or later.
138
+ const notes = added.includes('root-ops') ? raiseOsMinVer(doc, m.os_min_ver, DEFAULT_MIN_DSM, 'root-ops') : [];
104
139
  for (const file of destinations) {
105
140
  const path = join(root, file);
106
141
  mkdirSync(dirname(path), { recursive: true });
@@ -108,15 +143,8 @@ export function addCapabilities(root, requested) {
108
143
  }
109
144
  for (const file of deletions)
110
145
  rmSync(join(root, file), { force: true });
111
- if (added.includes('delegate')) {
112
- const path = join(root, 'backend/internal/api/permissions.json');
113
- const policy = JSON.parse(readFileSync(path, 'utf8'));
114
- if (!Object.hasOwn(policy.methods, 'app.status'))
115
- policy.methods['app.status'] = 'authenticated';
116
- writeFileSync(path, JSON.stringify(policy, null, 2) + '\n');
117
- }
118
146
  writeFileSync(manifestPath, String(doc));
119
- return { added, unchanged };
147
+ return withNotes({ added, unchanged }, notes);
120
148
  }
121
149
  finally {
122
150
  rmSync(work, { recursive: true, force: true });
@@ -0,0 +1,6 @@
1
+ import type { InstallWizardStep } from './install-wizard.js';
2
+ import type { Translate } from './wizard-i18n.js';
3
+ export declare function renderDelegateScopeSteps(t: Translate): InstallWizardStep[];
4
+ /** Package-owned draft only. Preinst validates; postinst stores the same value.
5
+ * No shell evaluation of the share, no ACL changes, no protected-state access. */
6
+ export declare function renderDelegateInstallDraft(pkg: string, validateOnly: boolean): string;
@@ -0,0 +1,34 @@
1
+ import { sharedFolderCombobox } from './share-combobox.js';
2
+ export function renderDelegateScopeSteps(t) {
3
+ const box = sharedFolderCombobox(t, 'delegate_share');
4
+ box.desc = t('label.sharedFolder');
5
+ const item = box.subitems[0];
6
+ item.desc = t('label.sharedFolder');
7
+ item.validator = { allowBlank: true }; // Home works even on a NAS without local shares.
8
+ return [{ step_title: t('install.step'), items: [
9
+ { desc: t('consent.appOwnSpace') }, { desc: t('delegate.preselection') },
10
+ box, { type: 'multiselect', subitems: [{ key: 'delegate_home', desc: t('delegate.home'), defaultValue: false }] },
11
+ ] }];
12
+ }
13
+ /** Package-owned draft only. Preinst validates; postinst stores the same value.
14
+ * No shell evaluation of the share, no ACL changes, no protected-state access. */
15
+ export function renderDelegateInstallDraft(pkg, validateOnly) {
16
+ return `if [ "\${SYNOPKG_PKG_STATUS:-}" != UPGRADE ]; then
17
+ case "\${delegate_home:-false}" in
18
+ true|1|yes|on) selected_scope=home ;;
19
+ *)
20
+ selected_share="\${delegate_share:-}"
21
+ case "$selected_share" in
22
+ ''|.|*..*|*/*|*'\\'*|*:*|*'"'*|*'%'*|*[[:cntrl:]]*|[hH][oO][mM][eE]|[hH][oO][mM][eE][sS]|[[:space:]]*|*[[:space:]]) echo "Select a shared folder or choose home." >&2; exit 1 ;;
23
+ esac
24
+ selected_scope="shared:$selected_share" ;;
25
+ esac
26
+ ${validateOnly ? '' : ` umask 077
27
+ draft_dir="\${SYNOPKG_PKGVAR:-/var/packages/${pkg}/var}"
28
+ mkdir -p "$draft_dir"
29
+ draft_tmp="$draft_dir/.delegate-install.$$"
30
+ printf '{"schema":1,"scope":"%s"}\\n' "$selected_scope" > "$draft_tmp"
31
+ mv "$draft_tmp" "$draft_dir/delegate-install.json"
32
+ `}fi
33
+ `;
34
+ }
@@ -1,7 +1,13 @@
1
- export declare const NATIVE_ARCH_FAMILIES: readonly ["x86_64", "aarch64"];
1
+ export declare const NATIVE_ARCH_FAMILIES: readonly ["x86_64", "aarch64", "armv7"];
2
2
  export type NativeArchFamily = (typeof NATIVE_ARCH_FAMILIES)[number];
3
+ /** DSM ships Container Manager for x86_64 and aarch64 only. */
4
+ export declare const CONTAINER_ARCH_FAMILIES: readonly ["x86_64", "aarch64"];
5
+ export type ContainerArchFamily = (typeof CONTAINER_ARCH_FAMILIES)[number];
3
6
  export declare const NATIVE_ARCH_PLATFORMS: Record<NativeArchFamily, readonly string[]>;
7
+ /** The `go build` environment for a static Linux binary of this family. */
8
+ export declare function goBuildEnv(family: NativeArchFamily): Record<string, string>;
4
9
  export declare function isNativeArchFamily(value: string): value is NativeArchFamily;
10
+ export declare function isContainerArchFamily(value: string): value is ContainerArchFamily;
5
11
  /** `--arch x86_64,aarch64`: one or more families, in the given order, each once. */
6
12
  export declare function parseArchList(value: string): NativeArchFamily[];
7
13
  export declare function infoArchValue(family: NativeArchFamily): string;
@@ -1,36 +1,32 @@
1
- export const NATIVE_ARCH_FAMILIES = ["x86_64", "aarch64"];
1
+ import DSM_PLATFORMS from "./dsm-platforms.json" with { type: "json" };
2
+ export const NATIVE_ARCH_FAMILIES = ["x86_64", "aarch64", "armv7"];
3
+ /** DSM ships Container Manager for x86_64 and aarch64 only. */
4
+ export const CONTAINER_ARCH_FAMILIES = ["x86_64", "aarch64"];
5
+ /**
6
+ * INFO platforms per family: DSM's family members, then platforms listed
7
+ * explicitly. dsm-platforms.json is shared with package-source. armv7 omits
8
+ * armada370/375/xp and comcerto2k, which exist only on DSM 7.0/7.1, so DSM
9
+ * refuses the SPK there.
10
+ */
11
+ const platformsOf = (family) => [...DSM_PLATFORMS[family].members, ...DSM_PLATFORMS[family].platformOnly];
2
12
  export const NATIVE_ARCH_PLATFORMS = {
3
- x86_64: [
4
- "apollolake",
5
- "avoton",
6
- "braswell",
7
- "broadwell",
8
- "broadwellnk",
9
- "broadwellnkv2",
10
- "broadwellntbap",
11
- "bromolow",
12
- "cedarview",
13
- "denverton",
14
- "epyc7002",
15
- "epyc7003",
16
- "epyc7003ntb",
17
- "geminilake",
18
- "geminilakenk",
19
- "grantley",
20
- "icelaked",
21
- "kvmcloud",
22
- "kvmx64",
23
- "purley",
24
- "r1000",
25
- "r1000nk",
26
- "v1000",
27
- "v1000nk",
28
- ],
29
- aarch64: ["armada37xx", "rtd1296", "rtd1619b"],
13
+ x86_64: platformsOf("x86_64"),
14
+ aarch64: platformsOf("aarch64"),
15
+ armv7: platformsOf("armv7"),
30
16
  };
17
+ const GOARCH = { x86_64: "amd64", aarch64: "arm64", armv7: "arm" };
18
+ /** The `go build` environment for a static Linux binary of this family. */
19
+ export function goBuildEnv(family) {
20
+ const env = { CGO_ENABLED: "0", GOOS: "linux", GOARCH: GOARCH[family] };
21
+ // GOARM=7 needs VFPv3, which every DSM armv7 platform has.
22
+ return family === "armv7" ? { ...env, GOARM: "7" } : env;
23
+ }
31
24
  export function isNativeArchFamily(value) {
32
25
  return NATIVE_ARCH_FAMILIES.includes(value);
33
26
  }
27
+ export function isContainerArchFamily(value) {
28
+ return CONTAINER_ARCH_FAMILIES.includes(value);
29
+ }
34
30
  /** `--arch x86_64,aarch64`: one or more families, in the given order, each once. */
35
31
  export function parseArchList(value) {
36
32
  const families = [];
@@ -0,0 +1,42 @@
1
+ {
2
+ "x86_64": {
3
+ "members": [
4
+ "apollolake",
5
+ "avoton",
6
+ "braswell",
7
+ "broadwell",
8
+ "broadwellnk",
9
+ "broadwellnkv2",
10
+ "broadwellntb",
11
+ "broadwellntbap",
12
+ "bromolow",
13
+ "cedarview",
14
+ "coffeelake",
15
+ "denverton",
16
+ "epyc7002",
17
+ "epyc7003",
18
+ "epyc7003ntb",
19
+ "geminilake",
20
+ "geminilakenk",
21
+ "grantley",
22
+ "icelaked",
23
+ "kvmcloud",
24
+ "kvmx64",
25
+ "purley",
26
+ "r1000",
27
+ "r1000nk",
28
+ "skylaked",
29
+ "v1000",
30
+ "v1000nk"
31
+ ],
32
+ "platformOnly": []
33
+ },
34
+ "aarch64": {
35
+ "members": ["armada37xx", "rtd1296", "rtd1619", "rtd1619b"],
36
+ "platformOnly": []
37
+ },
38
+ "armv7": {
39
+ "members": ["alpine", "alpine4k"],
40
+ "platformOnly": ["armada38x", "monaco"]
41
+ }
42
+ }
@@ -6,9 +6,20 @@ export declare const DEFAULT_MIN_DSM: string;
6
6
  * would install and then fail to start.
7
7
  */
8
8
  export declare const CONTAINER_MIN_DSM: string;
9
+ /**
10
+ * DSM registers an Application Portal through the package's web-config
11
+ * app-portal resource. DSM 7.1.1-42962 refuses that resource in an unsigned
12
+ * package (error 320, "internal worker"); DSM 7.3.2-86009 and 7.4 install it.
13
+ * 7.2 and 7.3.0/7.3.1 are untested, so the floor is the oldest verified build.
14
+ */
15
+ export declare const PORTAL_MIN_DSM = "7.3.2-86009";
16
+ /** Why a portal package cannot declare `value`, and how to fix it; `field` names the portal key. */
17
+ export declare function portalMinDsmMessage(value: string, field: string): string;
9
18
  /** `true` when `value` is not older than `floor`, comparing version parts then build. */
10
19
  export declare function isDsmAtLeast(value: string, floor: string): boolean;
11
20
  /** Container Apps cannot declare an os_min_ver below {@link CONTAINER_MIN_DSM}. */
12
21
  export declare function assertContainerMinDsm(value: string): void;
22
+ /** A compose portal cannot be built for an os_min_ver below {@link PORTAL_MIN_DSM}. */
23
+ export declare function assertPortalMinDsm(value: string): void;
13
24
  /** `--min-dsm`: a release (`7.1`) or a full `<version>-<build>` string (`7.2-69057`). */
14
25
  export declare function resolveMinDsm(value: string): string;
@@ -13,6 +13,17 @@ export const DEFAULT_MIN_DSM = FIRST_BUILD["7.1"];
13
13
  * would install and then fail to start.
14
14
  */
15
15
  export const CONTAINER_MIN_DSM = FIRST_BUILD["7.2.1"];
16
+ /**
17
+ * DSM registers an Application Portal through the package's web-config
18
+ * app-portal resource. DSM 7.1.1-42962 refuses that resource in an unsigned
19
+ * package (error 320, "internal worker"); DSM 7.3.2-86009 and 7.4 install it.
20
+ * 7.2 and 7.3.0/7.3.1 are untested, so the floor is the oldest verified build.
21
+ */
22
+ export const PORTAL_MIN_DSM = "7.3.2-86009";
23
+ /** Why a portal package cannot declare `value`, and how to fix it; `field` names the portal key. */
24
+ export function portalMinDsmMessage(value, field) {
25
+ return `${field} 需要 DSM ${PORTAL_MIN_DSM} 以上,os_min_ver 是「${value}」。DSM 7.1.1 以錯誤 320 拒裝帶 portal(web-config app-portal)的未簽章套件;DSM 7.3.2 與 7.4 已驗證可裝,7.2 未驗證。請把 os_min_ver 提高到 ${PORTAL_MIN_DSM} 以上,或移除 ${field}。`;
26
+ }
16
27
  /** `true` when `value` is not older than `floor`, comparing version parts then build. */
17
28
  export function isDsmAtLeast(value, floor) {
18
29
  const [valueVersion, valueBuild] = value.split("-");
@@ -33,6 +44,12 @@ export function assertContainerMinDsm(value) {
33
44
  throw new Error(`[MIN_DSM_CONTAINER_FLOOR] 容器 App 需要 DSM ${CONTAINER_MIN_DSM} 以上(docker-project/Container Manager 從 DSM 7.2.1 才有),收到「${value}」。`);
34
45
  }
35
46
  }
47
+ /** A compose portal cannot be built for an os_min_ver below {@link PORTAL_MIN_DSM}. */
48
+ export function assertPortalMinDsm(value) {
49
+ if (!isDsmAtLeast(value, PORTAL_MIN_DSM)) {
50
+ throw new Error(`[CONTRACT_PORTAL_MIN_DSM] ${portalMinDsmMessage(value, "integration.web.portal")}`);
51
+ }
52
+ }
36
53
  const FULL_VERSION = /^7\.\d+(\.\d+)?-\d+$/;
37
54
  /** `--min-dsm`: a release (`7.1`) or a full `<version>-<build>` string (`7.2-69057`). */
38
55
  export function resolveMinDsm(value) {
@@ -4,12 +4,12 @@ import { checkCgiBinary } from "../standalone/binary.js";
4
4
  import { runCommand } from "../standalone/build.js";
5
5
  import { resolvedWebAccess } from "../contract/web-launch.js";
6
6
  import { templatesRoot } from "../template-paths.js";
7
+ import { PINNED_GO_HINT, pinnedGoBuildEnv, pinnedGoProblem } from "./go-toolchain.js";
7
8
  export { gatewayEntryPath } from "../contract/web-launch.js";
8
9
  /** Where the gateway CGI sits in the package payload; DSM serves `ui/` under /webman/3rdparty/<package>/. */
9
10
  export const GATEWAY_CGI_PAYLOAD = "ui/cgi/gateway.cgi";
10
11
  /** Readable copy of the baked-in configuration, for inspection; the CGI does not read it. */
11
12
  export const GATEWAY_CONFIG_PAYLOAD = "gateway.json";
12
- const GOARCH = { x86_64: "amd64", aarch64: "arm64" };
13
13
  const ACCESS = { "dsm-users": "users", "dsm-admins": "admins", "dsm-groups": "groups" };
14
14
  /** The access rule and container address the gateway enforces; undefined for an App without one. */
15
15
  export function gatewayConfig(contract, adminport) {
@@ -29,18 +29,22 @@ export function buildGatewayBinary(input) {
29
29
  const ldflags = ["-s", "-w", "-buildid=", `-X main.packageID=${input.packageId}`, `-X 'main.configJSON=${JSON.stringify(input.config)}'`].join(" ");
30
30
  const result = (input.run ?? runCommand)("go", ["build", "-trimpath", "-buildvcs=false", "-ldflags", ldflags, "-o", out, "."], {
31
31
  cwd: join(templatesRoot(), "_gateway"),
32
- env: { ...process.env, CGO_ENABLED: "0", GOOS: "linux", GOARCH: GOARCH[input.arch] },
32
+ env: { ...process.env, ...pinnedGoBuildEnv(input.arch) },
33
33
  });
34
34
  if (result.missing) {
35
- return { error: "GATEWAY_GO_MISSING", detail: "找不到 go 指令。DSM 驗證閘道需要 Go 1.24 以上版本(https://go.dev/dl/)才能建置。" };
35
+ return { error: "GATEWAY_GO_MISSING", detail: `找不到 go 指令。DSM 驗證閘道需要 Go 1.21 以上版本(https://go.dev/dl/)才能建置。${PINNED_GO_HINT}` };
36
36
  }
37
37
  if (result.status !== 0) {
38
- return { error: "GATEWAY_BUILD_FAILED", detail: `go build(${input.arch})失敗。\n${result.stderr}` };
38
+ return { error: "GATEWAY_BUILD_FAILED", detail: `go build(${input.arch})失敗。${PINNED_GO_HINT}\n${result.stderr}` };
39
39
  }
40
40
  const problem = checkCgiBinary(input.work, out, input.arch);
41
41
  if (problem) {
42
42
  return { error: "GATEWAY_BUILD_FAILED", detail: problem.message };
43
43
  }
44
+ const toolchainProblem = pinnedGoProblem(out);
45
+ if (toolchainProblem) {
46
+ return { error: "GATEWAY_BUILD_FAILED", detail: toolchainProblem };
47
+ }
44
48
  return { binary: out };
45
49
  }
46
50
  /** Puts the CGI (mode 0755) and its readable configuration into the package payload. */