@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.
- package/CHANGELOG.md +846 -0
- package/README.md +81 -89
- package/dist/add.d.ts +4 -1
- package/dist/add.js +45 -17
- package/dist/build-spk/delegate-scope.d.ts +6 -0
- package/dist/build-spk/delegate-scope.js +34 -0
- package/dist/build-spk/dsm-arch.d.ts +7 -1
- package/dist/build-spk/dsm-arch.js +24 -28
- package/dist/build-spk/dsm-platforms.json +42 -0
- package/dist/build-spk/dsm-version.d.ts +11 -0
- package/dist/build-spk/dsm-version.js +17 -0
- package/dist/build-spk/gateway.js +8 -4
- package/dist/build-spk/generator.js +30 -5
- package/dist/build-spk/go-toolchain.d.ts +20 -0
- package/dist/build-spk/go-toolchain.js +44 -0
- package/dist/build-spk/notices.js +4 -1
- package/dist/build-spk/resource-worker.js +3 -0
- package/dist/build-spk/wizard-messages.d.ts +66 -0
- package/dist/build-spk/wizard-messages.js +75 -9
- package/dist/cli.js +28 -14
- package/dist/contract/schema-validate.js +8 -0
- package/dist/contract/validate.js +30 -0
- package/dist/deploy/deploy.d.ts +1 -1
- package/dist/deploy/deploy.js +8 -0
- package/dist/deploy/native-install-values.d.ts +17 -0
- package/dist/deploy/native-install-values.js +32 -0
- package/dist/deploy/plan.d.ts +6 -2
- package/dist/deploy/plan.js +58 -7
- package/dist/deploy/spk-version.js +1 -1
- package/dist/error-registry.js +54 -20
- package/dist/host/dsm-client.d.ts +8 -4
- package/dist/host/dsm-client.js +63 -21
- package/dist/host/dsm-http.js +24 -2
- package/dist/host/types.d.ts +3 -1
- package/dist/info.js +45 -10
- package/dist/init.d.ts +3 -0
- package/dist/init.js +50 -19
- package/dist/package-metadata.d.ts +21 -0
- package/dist/package-metadata.js +101 -0
- package/dist/portal/alias.d.ts +25 -0
- package/dist/portal/alias.js +48 -0
- package/dist/portal/package.d.ts +33 -0
- package/dist/portal/package.js +116 -0
- package/dist/runtime/delegate-contract.d.ts +79 -0
- package/dist/runtime/delegate-contract.js +27 -0
- package/dist/runtime/dsm-version.d.ts +6 -0
- package/dist/runtime/dsm-version.js +8 -0
- package/dist/runtime/executor-build.js +10 -6
- package/dist/runtime/executor-inspect.d.ts +3 -0
- package/dist/runtime/executor-inspect.js +11 -5
- package/dist/runtime/executor-policy.d.ts +12 -0
- package/dist/runtime/executor-policy.js +43 -3
- package/dist/runtime/executor-scope-task.d.ts +4 -0
- package/dist/runtime/executor-scope-task.js +21 -0
- package/dist/runtime/executor-tasks.d.ts +2 -1
- package/dist/runtime/executor-tasks.js +4 -4
- package/dist/skill.js +1 -0
- package/dist/standalone/api-permissions.d.ts +10 -0
- package/dist/standalone/api-permissions.js +19 -2
- package/dist/standalone/background.d.ts +16 -0
- package/dist/standalone/background.js +69 -2
- package/dist/standalone/binary.d.ts +1 -1
- package/dist/standalone/binary.js +22 -8
- package/dist/standalone/build.d.ts +1 -1
- package/dist/standalone/build.js +38 -8
- package/dist/standalone/daemon.d.ts +1 -0
- package/dist/standalone/daemon.js +10 -5
- package/dist/standalone/dsm-window.d.ts +3 -1
- package/dist/standalone/dsm-window.js +78 -49
- package/dist/standalone/inspect-spk.d.ts +8 -0
- package/dist/standalone/inspect-spk.js +110 -27
- package/dist/standalone/lifecycle.js +86 -8
- package/dist/standalone/manifest.d.ts +13 -0
- package/dist/standalone/manifest.js +57 -8
- package/dist/standalone/native-authorization-window.d.ts +1 -1
- package/dist/standalone/native-authorization-window.js +9 -1
- package/dist/standalone/native-layout.d.ts +3 -0
- package/dist/standalone/native-layout.js +37 -5
- package/dist/standalone/native-root-window.d.ts +4 -2
- package/dist/standalone/native-root-window.js +33 -18
- package/dist/standalone/portal-window.d.ts +21 -0
- package/dist/standalone/portal-window.js +155 -0
- package/dist/standalone/portal.d.ts +4 -0
- package/dist/standalone/portal.js +4 -0
- package/dist/standalone/resource.d.ts +5 -3
- package/dist/standalone/resource.js +6 -3
- package/dist/standalone/root-window.d.ts +4 -1
- package/dist/standalone/root-window.js +193 -36
- package/dist/standalone/spk.d.ts +1 -1
- package/dist/standalone/spk.js +25 -7
- package/dist/templates/_daemon/go.mod +1 -1
- package/dist/templates/_daemon/main.go +6 -3
- package/dist/templates/_daemon/main_test.go +82 -9
- package/dist/templates/_daemon/testdata/child.go +3 -0
- package/dist/templates/_executor/README.md +130 -16
- package/dist/templates/_executor/anchor.go +156 -0
- package/dist/templates/_executor/anchor_test.go +161 -0
- package/dist/templates/_executor/apppriv_review_test.go +1 -1
- package/dist/templates/_executor/cancel_contract_test.go +236 -0
- package/dist/templates/_executor/copy.go +64 -0
- package/dist/templates/_executor/copy_test.go +88 -0
- package/dist/templates/_executor/digest_review_test.go +2 -2
- package/dist/templates/_executor/dsm.go +63 -13
- package/dist/templates/_executor/dsm_test.go +95 -1
- package/dist/templates/_executor/executor.go +260 -49
- package/dist/templates/_executor/executor_test.go +36 -6
- package/dist/templates/_executor/go.mod +2 -0
- package/dist/templates/_executor/identity.go +27 -1
- package/dist/templates/_executor/identity_kernel_linux_test.go +60 -0
- package/dist/templates/_executor/identity_linux.go +82 -0
- package/dist/templates/_executor/identity_security_test.go +43 -0
- package/dist/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
- package/dist/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
- package/dist/templates/_executor/internal/taskscript/boot.sh +9 -9
- package/dist/templates/_executor/internal/taskscript/cmd/main.go +2 -2
- package/dist/templates/_executor/internal/taskscript/control.sh +15 -10
- package/dist/templates/_executor/internal/taskscript/tasks.go +5 -3
- package/dist/templates/_executor/lifecycle_test.go +11 -0
- package/dist/templates/_executor/link_linux.go +28 -0
- package/dist/templates/_executor/long_running_test.go +530 -0
- package/dist/templates/_executor/main.go +83 -25
- package/dist/templates/_executor/managed.go +3 -3
- package/dist/templates/_executor/managed_test.go +3 -3
- package/dist/templates/_executor/move_linux.go +490 -0
- package/dist/templates/_executor/move_linux_test.go +460 -0
- package/dist/templates/_executor/move_validation.go +46 -0
- package/dist/templates/_executor/move_validation_test.go +187 -0
- package/dist/templates/_executor/operations.go +926 -0
- package/dist/templates/_executor/path_test.go +18 -0
- package/dist/templates/_executor/pid.go +37 -0
- package/dist/templates/_executor/pid_test.go +113 -0
- package/dist/templates/_executor/platform_linux.go +24 -173
- package/dist/templates/_executor/platform_linux_test.go +9 -65
- package/dist/templates/_executor/platform_other.go +38 -4
- package/dist/templates/_executor/process.go +3 -0
- package/dist/templates/_executor/purge_log.go +18 -0
- package/dist/templates/_executor/records.go +242 -0
- package/dist/templates/_executor/scope_cancel_contract_test.go +91 -0
- package/dist/templates/_executor/scope_client.go +37 -0
- package/dist/templates/_executor/scope_contract.go +12 -0
- package/dist/templates/_executor/selected_scope.go +146 -0
- package/dist/templates/_executor/selected_scope_test.go +186 -0
- package/dist/templates/_executor/status_disabled_test.go +33 -0
- package/dist/templates/_executor/store.go +4 -3
- package/dist/templates/_executor/supervise.go +109 -0
- package/dist/templates/_executor/supervise_test.go +130 -0
- package/dist/templates/_executor/task_race_review_test.go +1 -1
- package/dist/templates/_executor/tasks.go +52 -15
- package/dist/templates/_executor/tasks_dsm71_test.go +114 -0
- package/dist/templates/_executor/tasks_review_test.go +1 -1
- package/dist/templates/_executor/tasks_test.go +62 -5
- package/dist/templates/_executor/upgrade_watch_test.go +13 -5
- package/dist/templates/_executor/watch.go +8 -0
- package/dist/templates/_executor/watch_test.go +23 -2
- package/dist/templates/_executor/write_review_linux_test.go +4 -12
- package/dist/templates/_gateway/go.mod +2 -0
- package/dist/templates/_shared/AGENTS.md +129 -0
- package/dist/templates/binary/dsm-package.yaml +24 -0
- package/dist/templates/binary/i18n/messages/de.json +4 -0
- package/dist/templates/binary/i18n/messages/en.json +4 -0
- package/dist/templates/binary/i18n/messages/es.json +4 -0
- package/dist/templates/binary/i18n/messages/fr.json +4 -0
- package/dist/templates/binary/i18n/messages/it.json +4 -0
- package/dist/templates/binary/i18n/messages/ja.json +4 -0
- package/dist/templates/binary/i18n/messages/ko.json +4 -0
- package/dist/templates/binary/i18n/messages/zh-CN.json +4 -0
- package/dist/templates/binary/i18n/messages/zh-TW.json +4 -0
- package/dist/templates/binary/ui/app.js +19 -4
- package/dist/templates/native-authorization/AuthorizationGate.vue +5 -3
- package/dist/templates/native-authorization/i18n/de.json +1 -0
- package/dist/templates/native-authorization/i18n/en.json +1 -0
- package/dist/templates/native-authorization/i18n/es.json +2 -1
- package/dist/templates/native-authorization/i18n/fr.json +1 -0
- package/dist/templates/native-authorization/i18n/it.json +11 -10
- package/dist/templates/native-authorization/i18n/ja.json +1 -0
- package/dist/templates/native-authorization/i18n/ko.json +10 -9
- package/dist/templates/native-authorization/i18n/zh-CN.json +6 -5
- package/dist/templates/native-authorization/i18n/zh-TW.json +6 -5
- package/dist/templates/native-go/README.md +43 -10
- package/dist/templates/native-go/backend/cmd/app/main.go +27 -7
- package/dist/templates/native-go/backend/go.mod +1 -1
- package/dist/templates/native-go/backend/internal/api/entry_test.go +47 -0
- package/dist/templates/native-go/backend/internal/api/permissions_test.go +3 -3
- package/dist/templates/native-go/backend/internal/api/registry.go +11 -0
- package/dist/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
- package/dist/templates/native-go/backend/internal/api/server.go +18 -5
- package/dist/templates/native-go/backend/internal/app/delegate_config.go +57 -0
- package/dist/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
- package/dist/templates/native-go/backend/internal/app/portal.go +30 -0
- package/dist/templates/native-go/backend/internal/app/portal_test.go +55 -0
- package/dist/templates/native-go/backend/internal/app/routes.go +8 -2
- package/dist/templates/native-go/backend/internal/background/runner.go +1 -1
- package/dist/templates/native-go/backend/internal/background/store.go +16 -14
- package/dist/templates/native-go/backend/internal/dsm/admin.go +8 -2
- package/dist/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
- package/dist/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
- package/dist/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
- package/dist/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
- package/dist/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
- package/dist/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
- package/dist/templates/native-go/backend/internal/dsm/entry.go +177 -0
- package/dist/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
- package/dist/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
- package/dist/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
- package/dist/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
- package/dist/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
- package/dist/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
- package/dist/templates/native-go/backend/internal/filestation/client.go +39 -3
- package/dist/templates/native-go/backend/internal/filestation/download_dsm71_test.go +82 -0
- package/dist/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
- package/dist/templates/native-go/backend/internal/filestation/service.go +1 -1
- package/dist/templates/native-go/backend/internal/identity/README.md +5 -1
- package/dist/templates/native-go/backend/internal/identity/dsm.go +24 -5
- package/dist/templates/native-go/backend/internal/identity/http.go +1 -1
- package/dist/templates/native-go/backend/internal/identity/identity_test.go +48 -1
- package/dist/templates/native-go/backend/internal/identity/service.go +1 -1
- package/dist/templates/native-go/backend/internal/portal/portal.go +138 -0
- package/dist/templates/native-go/backend/internal/portal/portal_test.go +89 -0
- package/dist/templates/native-go/dsm-package.yaml +20 -1
- package/dist/templates/native-go/i18n/glossary.json +2 -1
- package/dist/templates/native-go/i18n/messages/de.json +1 -0
- package/dist/templates/native-go/i18n/messages/en.json +1 -0
- package/dist/templates/native-go/i18n/messages/es.json +1 -0
- package/dist/templates/native-go/i18n/messages/fr.json +1 -0
- package/dist/templates/native-go/i18n/messages/it.json +1 -0
- package/dist/templates/native-go/i18n/messages/ja.json +1 -0
- package/dist/templates/native-go/i18n/messages/ko.json +1 -0
- package/dist/templates/native-go/i18n/messages/zh-CN.json +1 -0
- package/dist/templates/native-go/i18n/messages/zh-TW.json +1 -0
- package/dist/templates/native-go/ui/app.css +10 -0
- package/dist/templates/native-go/ui/app.js +11 -1
- package/dist/templates/native-go-delegate/DELEGATE.md +126 -5
- package/dist/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
- package/dist/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
- package/dist/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
- package/dist/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
- package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
- package/dist/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
- package/dist/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
- package/dist/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
- package/dist/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
- package/dist/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
- package/dist/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
- package/dist/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
- package/dist/templates/native-go-delegate/frontend/test/delegate.test.ts +15 -0
- package/dist/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
- package/dist/templates/native-go-delegate/test.sh +1 -0
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
- package/dist/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
- package/dist/templates/native-go-root-ops/backend/internal/app/executor.go +30 -2
- package/dist/templates/native-go-root-ops/backend/internal/app/executor_test.go +64 -0
- package/dist/templates/native-go-vue/README.md +4 -0
- package/dist/templates/native-go-vue/frontend/package-lock.json +4 -4
- package/dist/templates/native-go-vue/frontend/package.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/App.vue +18 -13
- package/dist/templates/native-go-vue/frontend/src/context.ts +31 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +54 -9
- package/dist/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
- package/dist/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +23 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +8 -2
- package/dist/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/de.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/en.json +13 -2
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/es.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/it.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +16 -5
- package/dist/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
- package/dist/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n.ts +13 -0
- package/dist/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
- package/dist/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
- package/dist/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
- package/dist/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
- package/dist/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
- package/dist/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
- package/dist/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
- package/dist/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
- package/package.json +5 -1
- package/schema/package-metadata.schema.json +101 -0
- package/schema/synology-app.schema.json +112 -0
- package/skills/SKILL.md +106 -4
- package/skills/reference/create.md +101 -2
- package/skills/reference/deploy.md +2 -2
- package/skills/reference/files.md +113 -2
- package/skills/reference/identity.md +70 -1
- package/skills/reference/portal.md +17 -0
- package/skills/reference/ui-vue.md +12 -0
- package/templates/_daemon/go.mod +1 -1
- package/templates/_daemon/main.go +6 -3
- package/templates/_daemon/main_test.go +82 -9
- package/templates/_daemon/testdata/child.go +3 -0
- package/templates/_executor/README.md +130 -16
- package/templates/_executor/anchor.go +156 -0
- package/templates/_executor/anchor_test.go +161 -0
- package/templates/_executor/apppriv_review_test.go +1 -1
- package/templates/_executor/cancel_contract_test.go +236 -0
- package/templates/_executor/copy.go +64 -0
- package/templates/_executor/copy_test.go +88 -0
- package/templates/_executor/digest_review_test.go +2 -2
- package/templates/_executor/dsm.go +63 -13
- package/templates/_executor/dsm_test.go +95 -1
- package/templates/_executor/executor.go +260 -49
- package/templates/_executor/executor_test.go +36 -6
- package/templates/_executor/go.mod +2 -0
- package/templates/_executor/identity.go +27 -1
- package/templates/_executor/identity_kernel_linux_test.go +60 -0
- package/templates/_executor/identity_linux.go +82 -0
- package/templates/_executor/identity_security_test.go +43 -0
- package/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
- package/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
- package/templates/_executor/internal/taskscript/boot.sh +9 -9
- package/templates/_executor/internal/taskscript/cmd/main.go +2 -2
- package/templates/_executor/internal/taskscript/control.sh +15 -10
- package/templates/_executor/internal/taskscript/tasks.go +5 -3
- package/templates/_executor/lifecycle_test.go +11 -0
- package/templates/_executor/link_linux.go +28 -0
- package/templates/_executor/long_running_test.go +530 -0
- package/templates/_executor/main.go +83 -25
- package/templates/_executor/managed.go +3 -3
- package/templates/_executor/managed_test.go +3 -3
- package/templates/_executor/move_linux.go +490 -0
- package/templates/_executor/move_linux_test.go +460 -0
- package/templates/_executor/move_validation.go +46 -0
- package/templates/_executor/move_validation_test.go +187 -0
- package/templates/_executor/operations.go +926 -0
- package/templates/_executor/path_test.go +18 -0
- package/templates/_executor/pid.go +37 -0
- package/templates/_executor/pid_test.go +113 -0
- package/templates/_executor/platform_linux.go +24 -173
- package/templates/_executor/platform_linux_test.go +9 -65
- package/templates/_executor/platform_other.go +38 -4
- package/templates/_executor/process.go +3 -0
- package/templates/_executor/purge_log.go +18 -0
- package/templates/_executor/records.go +242 -0
- package/templates/_executor/scope_cancel_contract_test.go +91 -0
- package/templates/_executor/scope_client.go +37 -0
- package/templates/_executor/scope_contract.go +12 -0
- package/templates/_executor/selected_scope.go +146 -0
- package/templates/_executor/selected_scope_test.go +186 -0
- package/templates/_executor/status_disabled_test.go +33 -0
- package/templates/_executor/store.go +4 -3
- package/templates/_executor/supervise.go +109 -0
- package/templates/_executor/supervise_test.go +130 -0
- package/templates/_executor/task_race_review_test.go +1 -1
- package/templates/_executor/tasks.go +52 -15
- package/templates/_executor/tasks_dsm71_test.go +114 -0
- package/templates/_executor/tasks_review_test.go +1 -1
- package/templates/_executor/tasks_test.go +62 -5
- package/templates/_executor/upgrade_watch_test.go +13 -5
- package/templates/_executor/watch.go +8 -0
- package/templates/_executor/watch_test.go +23 -2
- package/templates/_executor/write_review_linux_test.go +4 -12
- package/templates/_gateway/go.mod +2 -0
- package/templates/_shared/AGENTS.md +129 -0
- package/templates/binary/dsm-package.yaml +24 -0
- package/templates/binary/i18n/messages/de.json +4 -0
- package/templates/binary/i18n/messages/en.json +4 -0
- package/templates/binary/i18n/messages/es.json +4 -0
- package/templates/binary/i18n/messages/fr.json +4 -0
- package/templates/binary/i18n/messages/it.json +4 -0
- package/templates/binary/i18n/messages/ja.json +4 -0
- package/templates/binary/i18n/messages/ko.json +4 -0
- package/templates/binary/i18n/messages/zh-CN.json +4 -0
- package/templates/binary/i18n/messages/zh-TW.json +4 -0
- package/templates/binary/ui/app.js +19 -4
- package/templates/native-authorization/AuthorizationGate.vue +5 -3
- package/templates/native-authorization/i18n/de.json +1 -0
- package/templates/native-authorization/i18n/en.json +1 -0
- package/templates/native-authorization/i18n/es.json +2 -1
- package/templates/native-authorization/i18n/fr.json +1 -0
- package/templates/native-authorization/i18n/it.json +11 -10
- package/templates/native-authorization/i18n/ja.json +1 -0
- package/templates/native-authorization/i18n/ko.json +10 -9
- package/templates/native-authorization/i18n/zh-CN.json +6 -5
- package/templates/native-authorization/i18n/zh-TW.json +6 -5
- package/templates/native-go/README.md +43 -10
- package/templates/native-go/backend/cmd/app/main.go +27 -7
- package/templates/native-go/backend/go.mod +1 -1
- package/templates/native-go/backend/internal/api/entry_test.go +47 -0
- package/templates/native-go/backend/internal/api/permissions_test.go +3 -3
- package/templates/native-go/backend/internal/api/registry.go +11 -0
- package/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
- package/templates/native-go/backend/internal/api/server.go +18 -5
- package/templates/native-go/backend/internal/app/delegate_config.go +57 -0
- package/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
- package/templates/native-go/backend/internal/app/portal.go +30 -0
- package/templates/native-go/backend/internal/app/portal_test.go +55 -0
- package/templates/native-go/backend/internal/app/routes.go +8 -2
- package/templates/native-go/backend/internal/background/runner.go +1 -1
- package/templates/native-go/backend/internal/background/store.go +16 -14
- package/templates/native-go/backend/internal/dsm/admin.go +8 -2
- package/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
- package/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
- package/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
- package/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
- package/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
- package/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
- package/templates/native-go/backend/internal/dsm/entry.go +177 -0
- package/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
- package/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
- package/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
- package/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
- package/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
- package/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
- package/templates/native-go/backend/internal/filestation/client.go +39 -3
- package/templates/native-go/backend/internal/filestation/download_dsm71_test.go +82 -0
- package/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
- package/templates/native-go/backend/internal/filestation/service.go +1 -1
- package/templates/native-go/backend/internal/identity/README.md +5 -1
- package/templates/native-go/backend/internal/identity/dsm.go +24 -5
- package/templates/native-go/backend/internal/identity/http.go +1 -1
- package/templates/native-go/backend/internal/identity/identity_test.go +48 -1
- package/templates/native-go/backend/internal/identity/service.go +1 -1
- package/templates/native-go/backend/internal/portal/portal.go +138 -0
- package/templates/native-go/backend/internal/portal/portal_test.go +89 -0
- package/templates/native-go/dsm-package.yaml +20 -1
- package/templates/native-go/i18n/glossary.json +2 -1
- package/templates/native-go/i18n/messages/de.json +1 -0
- package/templates/native-go/i18n/messages/en.json +1 -0
- package/templates/native-go/i18n/messages/es.json +1 -0
- package/templates/native-go/i18n/messages/fr.json +1 -0
- package/templates/native-go/i18n/messages/it.json +1 -0
- package/templates/native-go/i18n/messages/ja.json +1 -0
- package/templates/native-go/i18n/messages/ko.json +1 -0
- package/templates/native-go/i18n/messages/zh-CN.json +1 -0
- package/templates/native-go/i18n/messages/zh-TW.json +1 -0
- package/templates/native-go/ui/app.css +10 -0
- package/templates/native-go/ui/app.js +11 -1
- package/templates/native-go-delegate/DELEGATE.md +126 -5
- package/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
- package/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
- package/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
- package/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
- package/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
- package/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
- package/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
- package/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
- package/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
- package/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
- package/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
- package/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
- package/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
- package/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
- package/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
- package/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
- package/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
- package/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
- package/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
- package/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
- package/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
- package/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
- package/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
- package/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
- package/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
- package/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
- package/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
- package/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
- package/templates/native-go-delegate/frontend/test/delegate.test.ts +15 -0
- package/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
- package/templates/native-go-delegate/test.sh +1 -0
- package/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
- package/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
- package/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
- package/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
- package/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
- package/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
- package/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
- package/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
- package/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
- package/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
- package/templates/native-go-root-ops/backend/internal/app/executor.go +30 -2
- package/templates/native-go-root-ops/backend/internal/app/executor_test.go +64 -0
- package/templates/native-go-vue/README.md +4 -0
- package/templates/native-go-vue/frontend/package-lock.json +4 -4
- package/templates/native-go-vue/frontend/package.json +1 -1
- package/templates/native-go-vue/frontend/src/App.vue +18 -13
- package/templates/native-go-vue/frontend/src/context.ts +31 -0
- package/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +54 -9
- package/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
- package/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
- package/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
- package/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +23 -0
- package/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +8 -2
- package/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
- package/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/de.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/en.json +13 -2
- package/templates/native-go-vue/frontend/src/delegate/i18n/es.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/it.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +16 -5
- package/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
- package/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
- package/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
- package/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
- package/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
- package/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
- package/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n.ts +13 -0
- package/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
- package/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
- package/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
- package/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
- package/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
- package/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
- package/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
- package/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
- package/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
- package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
- package/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
- package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
- package/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
- package/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
8
|
+
## Install
|
|
38
9
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
14
|
+
Native Go apps need Go 1.25+ and npm. The CLI is tested on Node.js 22.19.
|
|
46
15
|
|
|
47
|
-
|
|
16
|
+
## Quick start
|
|
48
17
|
|
|
49
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
40
|
+
Existing native products with their own payload layout use `backend: {kind: native}` in
|
|
41
|
+
`dsm-package.yaml`.
|
|
67
42
|
|
|
68
|
-
|
|
69
|
-
npx -y -p @synopackageland/ui syno-pkg-land-ui catalog
|
|
70
|
-
```
|
|
43
|
+
## Capabilities
|
|
71
44
|
|
|
72
|
-
|
|
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
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
`
|
|
87
|
-
`
|
|
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
|
-
|
|
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 (
|
|
63
|
-
throw new Error('[CAPABILITY_COMBINATION_INVALID] daemon
|
|
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(
|
|
135
|
+
for (const [key, value] of Object.entries(nativeCapabilitySettings(added)))
|
|
100
136
|
doc.setIn(['capabilities', key], value);
|
|
101
|
-
//
|
|
102
|
-
|
|
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
|
-
|
|
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
|
-
|
|
5
|
-
|
|
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,
|
|
32
|
+
env: { ...process.env, ...pinnedGoBuildEnv(input.arch) },
|
|
33
33
|
});
|
|
34
34
|
if (result.missing) {
|
|
35
|
-
return { error: "GATEWAY_GO_MISSING", detail:
|
|
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}
|
|
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. */
|