nvoi 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -5
  3. data/Gemfile.lock +17 -8
  4. data/Rakefile +1 -1
  5. data/lib/nvoi/cli/config/command.rb +46 -41
  6. data/lib/nvoi/cli/credentials/edit/command.rb +20 -20
  7. data/lib/nvoi/cli/credentials/show/command.rb +1 -1
  8. data/lib/nvoi/cli/db/command.rb +10 -10
  9. data/lib/nvoi/cli/delete/command.rb +2 -2
  10. data/lib/nvoi/cli/deploy/command.rb +2 -2
  11. data/lib/nvoi/cli/deploy/steps/configure_tunnel.rb +2 -2
  12. data/lib/nvoi/cli/deploy/steps/provision_server.rb +1 -1
  13. data/lib/nvoi/cli/deploy/steps/provision_volume.rb +1 -1
  14. data/lib/nvoi/cli/exec/command.rb +3 -3
  15. data/lib/nvoi/cli/logs/command.rb +2 -2
  16. data/lib/nvoi/cli/onboard/command.rb +176 -622
  17. data/lib/nvoi/cli/onboard/steps/app.rb +108 -0
  18. data/lib/nvoi/cli/onboard/steps/app_name.rb +26 -0
  19. data/lib/nvoi/cli/onboard/steps/compute.rb +139 -0
  20. data/lib/nvoi/cli/onboard/steps/database.rb +97 -0
  21. data/lib/nvoi/cli/onboard/steps/domain.rb +48 -0
  22. data/lib/nvoi/cli/onboard/steps/env.rb +67 -0
  23. data/lib/nvoi/cli/onboard/ui.rb +84 -0
  24. data/lib/nvoi/cli/unlock/command.rb +2 -2
  25. data/lib/nvoi/cli.rb +0 -32
  26. data/lib/nvoi/configuration/app_service.rb +54 -0
  27. data/lib/nvoi/configuration/application.rb +44 -0
  28. data/lib/nvoi/configuration/builder.rb +417 -0
  29. data/lib/nvoi/configuration/database.rb +56 -0
  30. data/lib/nvoi/configuration/deploy.rb +15 -0
  31. data/lib/nvoi/{objects/service_spec.rb → configuration/deployment.rb} +4 -3
  32. data/lib/nvoi/{objects/config_override.rb → configuration/override.rb} +4 -4
  33. data/lib/nvoi/configuration/providers.rb +78 -0
  34. data/lib/nvoi/configuration/result.rb +43 -0
  35. data/lib/nvoi/configuration/root.rb +234 -0
  36. data/lib/nvoi/configuration/server.rb +39 -0
  37. data/lib/nvoi/configuration/service.rb +62 -0
  38. data/lib/nvoi/external/cloud/aws.rb +12 -12
  39. data/lib/nvoi/external/cloud/hetzner.rb +7 -7
  40. data/lib/nvoi/external/cloud/scaleway.rb +7 -7
  41. data/lib/nvoi/external/cloud/types.rb +42 -0
  42. data/lib/nvoi/external/database/mysql.rb +1 -1
  43. data/lib/nvoi/external/database/postgres.rb +1 -1
  44. data/lib/nvoi/external/database/provider.rb +1 -1
  45. data/lib/nvoi/external/database/sqlite.rb +1 -1
  46. data/lib/nvoi/external/database/types.rb +55 -0
  47. data/lib/nvoi/external/dns/cloudflare.rb +6 -6
  48. data/lib/nvoi/external/dns/types.rb +24 -0
  49. data/lib/nvoi/utils/config_loader.rb +12 -12
  50. data/lib/nvoi/utils/credential_store.rb +4 -4
  51. data/lib/nvoi/utils/env_resolver.rb +3 -3
  52. data/lib/nvoi/utils/namer.rb +2 -2
  53. data/lib/nvoi/utils/presence.rb +23 -0
  54. data/lib/nvoi/version.rb +1 -1
  55. data/lib/nvoi.rb +2 -17
  56. metadata +95 -58
  57. data/.claude/todo/refactor/00-overview.md +0 -171
  58. data/.claude/todo/refactor/01-objects.md +0 -96
  59. data/.claude/todo/refactor/02-utils.md +0 -143
  60. data/.claude/todo/refactor/03-external-cloud.md +0 -164
  61. data/.claude/todo/refactor/04-external-dns.md +0 -104
  62. data/.claude/todo/refactor/05-external.md +0 -133
  63. data/.claude/todo/refactor/06-cli.md +0 -123
  64. data/.claude/todo/refactor/07-cli-deploy-command.md +0 -177
  65. data/.claude/todo/refactor/08-cli-deploy-steps.md +0 -201
  66. data/.claude/todo/refactor/09-cli-delete-command.md +0 -169
  67. data/.claude/todo/refactor/10-cli-exec-command.md +0 -157
  68. data/.claude/todo/refactor/11-cli-credentials-command.md +0 -190
  69. data/.claude/todo/refactor/12-cli-db-command.md +0 -128
  70. data/.claude/todo/refactor/_target.md +0 -79
  71. data/.claude/todo/refactor-execution/00-entrypoint.md +0 -49
  72. data/.claude/todo/refactor-execution/01-objects.md +0 -42
  73. data/.claude/todo/refactor-execution/02-utils.md +0 -41
  74. data/.claude/todo/refactor-execution/03-external-cloud.md +0 -38
  75. data/.claude/todo/refactor-execution/04-external-dns.md +0 -35
  76. data/.claude/todo/refactor-execution/05-external-other.md +0 -46
  77. data/.claude/todo/refactor-execution/06-cli-deploy.md +0 -45
  78. data/.claude/todo/refactor-execution/07-cli-delete.md +0 -43
  79. data/.claude/todo/refactor-execution/08-cli-exec.md +0 -30
  80. data/.claude/todo/refactor-execution/09-cli-credentials.md +0 -34
  81. data/.claude/todo/refactor-execution/10-cli-db.md +0 -31
  82. data/.claude/todo/refactor-execution/11-cli-router.md +0 -44
  83. data/.claude/todo/refactor-execution/12-cleanup.md +0 -120
  84. data/.claude/todo/refactor-execution/_monitoring-strategy.md +0 -126
  85. data/.claude/todo/scaleway.impl.md +0 -644
  86. data/.claude/todo/scaleway.reference.md +0 -520
  87. data/.claude/todos/buckets.md +0 -41
  88. data/.claude/todos.md +0 -550
  89. data/ingest +0 -0
  90. data/lib/nvoi/config_api/actions/app.rb +0 -53
  91. data/lib/nvoi/config_api/actions/compute_provider.rb +0 -55
  92. data/lib/nvoi/config_api/actions/database.rb +0 -70
  93. data/lib/nvoi/config_api/actions/domain_provider.rb +0 -40
  94. data/lib/nvoi/config_api/actions/env.rb +0 -32
  95. data/lib/nvoi/config_api/actions/init.rb +0 -67
  96. data/lib/nvoi/config_api/actions/secret.rb +0 -32
  97. data/lib/nvoi/config_api/actions/server.rb +0 -66
  98. data/lib/nvoi/config_api/actions/service.rb +0 -52
  99. data/lib/nvoi/config_api/actions/volume.rb +0 -40
  100. data/lib/nvoi/config_api/base.rb +0 -38
  101. data/lib/nvoi/config_api/result.rb +0 -26
  102. data/lib/nvoi/config_api.rb +0 -93
  103. data/lib/nvoi/objects/configuration.rb +0 -483
  104. data/lib/nvoi/objects/database.rb +0 -56
  105. data/lib/nvoi/objects/dns.rb +0 -14
  106. data/lib/nvoi/objects/firewall.rb +0 -11
  107. data/lib/nvoi/objects/network.rb +0 -11
  108. data/lib/nvoi/objects/server.rb +0 -14
  109. data/lib/nvoi/objects/tunnel.rb +0 -14
  110. data/lib/nvoi/objects/volume.rb +0 -17
@@ -1,70 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nvoi
4
- module ConfigApi
5
- module Actions
6
- class SetDatabase < Base
7
- ADAPTERS = %w[postgres postgresql mysql sqlite sqlite3].freeze
8
-
9
- protected
10
-
11
- def mutate(data, servers:, adapter:, image: nil, url: nil, user: nil, password: nil, database: nil, mount: nil, path: nil)
12
- raise ArgumentError, "servers is required" if servers.nil? || servers.empty?
13
- raise ArgumentError, "servers must be an array" unless servers.is_a?(Array)
14
- raise ArgumentError, "adapter is required" if adapter.nil? || adapter.to_s.empty?
15
- raise ArgumentError, "adapter must be one of: #{ADAPTERS.join(', ')}" unless ADAPTERS.include?(adapter.to_s.downcase)
16
-
17
- validate_server_refs(data, servers)
18
-
19
- secrets = build_secrets(adapter, user, password, database)
20
-
21
- app(data)["database"] = {
22
- "servers" => servers.map(&:to_s),
23
- "adapter" => adapter.to_s,
24
- "image" => image,
25
- "url" => url,
26
- "secrets" => secrets.empty? ? nil : secrets,
27
- "mount" => mount,
28
- "path" => path
29
- }.compact
30
- end
31
-
32
- private
33
-
34
- def validate_server_refs(data, servers)
35
- defined = (app(data)["servers"] || {}).keys
36
- servers.each do |ref|
37
- raise Errors::ConfigValidationError, "server '#{ref}' not found" unless defined.include?(ref.to_s)
38
- end
39
- end
40
-
41
- def build_secrets(adapter, user, password, database)
42
- case adapter.to_s.downcase
43
- when "postgres", "postgresql"
44
- {
45
- "POSTGRES_USER" => user,
46
- "POSTGRES_PASSWORD" => password,
47
- "POSTGRES_DB" => database
48
- }.compact
49
- when "mysql"
50
- {
51
- "MYSQL_USER" => user,
52
- "MYSQL_PASSWORD" => password,
53
- "MYSQL_DATABASE" => database
54
- }.compact
55
- else
56
- {}
57
- end
58
- end
59
- end
60
-
61
- class DeleteDatabase < Base
62
- protected
63
-
64
- def mutate(data, **)
65
- app(data).delete("database")
66
- end
67
- end
68
- end
69
- end
70
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nvoi
4
- module ConfigApi
5
- module Actions
6
- class SetDomainProvider < Base
7
- PROVIDERS = %w[cloudflare].freeze
8
-
9
- protected
10
-
11
- def mutate(data, provider:, **opts)
12
- raise ArgumentError, "provider is required" if provider.nil? || provider.to_s.empty?
13
- raise ArgumentError, "provider must be one of: #{PROVIDERS.join(', ')}" unless PROVIDERS.include?(provider.to_s)
14
-
15
- app(data)["domain_provider"] = { provider.to_s => build_config(provider.to_s, opts) }
16
- end
17
-
18
- private
19
-
20
- def build_config(provider, opts)
21
- case provider
22
- when "cloudflare"
23
- {
24
- "api_token" => opts[:api_token],
25
- "account_id" => opts[:account_id]
26
- }.compact
27
- end
28
- end
29
- end
30
-
31
- class DeleteDomainProvider < Base
32
- protected
33
-
34
- def mutate(data, **)
35
- app(data)["domain_provider"] = {}
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nvoi
4
- module ConfigApi
5
- module Actions
6
- class SetEnv < Base
7
- protected
8
-
9
- def mutate(data, key:, value:)
10
- raise ArgumentError, "key is required" if key.nil? || key.to_s.empty?
11
- raise ArgumentError, "value is required" if value.nil?
12
-
13
- app(data)["env"] ||= {}
14
- app(data)["env"][key.to_s] = value.to_s
15
- end
16
- end
17
-
18
- class DeleteEnv < Base
19
- protected
20
-
21
- def mutate(data, key:)
22
- raise ArgumentError, "key is required" if key.nil? || key.to_s.empty?
23
-
24
- env = app(data)["env"] || {}
25
- raise Errors::ConfigValidationError, "env '#{key}' not found" unless env.key?(key.to_s)
26
-
27
- env.delete(key.to_s)
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,67 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nvoi
4
- module ConfigApi
5
- module Actions
6
- class Init
7
- def call(name:, environment: "production")
8
- raise ArgumentError, "name is required" if name.nil? || name.to_s.empty?
9
-
10
- # Generate master key
11
- master_key = Utils::Crypto.generate_key
12
-
13
- # Generate SSH keypair (reuse existing utility)
14
- private_key, public_key = Utils::ConfigLoader.generate_keypair
15
-
16
- # Build initial config
17
- config_data = {
18
- "application" => {
19
- "name" => name.to_s,
20
- "environment" => environment.to_s,
21
- "domain_provider" => {},
22
- "compute_provider" => {},
23
- "servers" => {},
24
- "app" => {},
25
- "services" => {},
26
- "env" => {},
27
- "secrets" => {},
28
- "ssh_keys" => {
29
- "private_key" => private_key,
30
- "public_key" => public_key
31
- }
32
- }
33
- }
34
-
35
- # Encrypt config
36
- yaml = YAML.dump(config_data)
37
- encrypted_config = Utils::Crypto.encrypt(yaml, master_key)
38
-
39
- InitResult.new(
40
- config: encrypted_config,
41
- master_key:,
42
- ssh_public_key: public_key
43
- )
44
- rescue ArgumentError => e
45
- InitResult.new(error_type: :invalid_args, error_message: e.message)
46
- rescue Errors::ConfigError => e
47
- InitResult.new(error_type: :config_error, error_message: e.message)
48
- end
49
- end
50
-
51
- class InitResult
52
- attr_reader :config, :master_key, :ssh_public_key, :error_type, :error_message
53
-
54
- def initialize(config: nil, master_key: nil, ssh_public_key: nil, error_type: nil, error_message: nil)
55
- @config = config
56
- @master_key = master_key
57
- @ssh_public_key = ssh_public_key
58
- @error_type = error_type
59
- @error_message = error_message
60
- end
61
-
62
- def success? = @error_type.nil?
63
- def failure? = !success?
64
- end
65
- end
66
- end
67
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nvoi
4
- module ConfigApi
5
- module Actions
6
- class SetSecret < Base
7
- protected
8
-
9
- def mutate(data, key:, value:)
10
- raise ArgumentError, "key is required" if key.nil? || key.to_s.empty?
11
- raise ArgumentError, "value is required" if value.nil?
12
-
13
- app(data)["secrets"] ||= {}
14
- app(data)["secrets"][key.to_s] = value.to_s
15
- end
16
- end
17
-
18
- class DeleteSecret < Base
19
- protected
20
-
21
- def mutate(data, key:)
22
- raise ArgumentError, "key is required" if key.nil? || key.to_s.empty?
23
-
24
- secrets = app(data)["secrets"] || {}
25
- raise Errors::ConfigValidationError, "secret '#{key}' not found" unless secrets.key?(key.to_s)
26
-
27
- secrets.delete(key.to_s)
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nvoi
4
- module ConfigApi
5
- module Actions
6
- class SetServer < Base
7
- protected
8
-
9
- def mutate(data, name:, master: false, type: nil, location: nil, count: 1)
10
- raise ArgumentError, "name is required" if name.nil? || name.to_s.empty?
11
- raise ArgumentError, "count must be positive" if count && count < 1
12
-
13
- app(data)["servers"] ||= {}
14
- app(data)["servers"][name.to_s] = {
15
- "master" => master,
16
- "type" => type,
17
- "location" => location,
18
- "count" => count
19
- }.compact
20
- end
21
- end
22
-
23
- class DeleteServer < Base
24
- protected
25
-
26
- def mutate(data, name:)
27
- raise ArgumentError, "name is required" if name.nil? || name.to_s.empty?
28
-
29
- servers = app(data)["servers"] || {}
30
- raise Errors::ConfigValidationError, "server '#{name}' not found" unless servers.key?(name.to_s)
31
-
32
- servers.delete(name.to_s)
33
- end
34
-
35
- def validate(data)
36
- check_orphaned_references(data)
37
- end
38
-
39
- private
40
-
41
- def check_orphaned_references(data)
42
- servers = (app(data)["servers"] || {}).keys
43
-
44
- (app(data)["app"] || {}).each do |svc_name, svc|
45
- (svc["servers"] || []).each do |ref|
46
- raise Errors::ConfigValidationError, "app.#{svc_name} references non-existent server '#{ref}'" unless servers.include?(ref)
47
- end
48
- end
49
-
50
- db = app(data)["database"]
51
- if db
52
- (db["servers"] || []).each do |ref|
53
- raise Errors::ConfigValidationError, "database references non-existent server '#{ref}'" unless servers.include?(ref)
54
- end
55
- end
56
-
57
- (app(data)["services"] || {}).each do |svc_name, svc|
58
- (svc["servers"] || []).each do |ref|
59
- raise Errors::ConfigValidationError, "services.#{svc_name} references non-existent server '#{ref}'" unless servers.include?(ref)
60
- end
61
- end
62
- end
63
- end
64
- end
65
- end
66
- end
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nvoi
4
- module ConfigApi
5
- module Actions
6
- class SetService < Base
7
- protected
8
-
9
- def mutate(data, name:, servers:, image:, port: nil, command: nil, env: nil, mount: nil)
10
- raise ArgumentError, "name is required" if name.nil? || name.to_s.empty?
11
- raise ArgumentError, "servers is required" if servers.nil? || servers.empty?
12
- raise ArgumentError, "servers must be an array" unless servers.is_a?(Array)
13
- raise ArgumentError, "image is required" if image.nil? || image.to_s.empty?
14
-
15
- validate_server_refs(data, servers)
16
-
17
- app(data)["services"] ||= {}
18
- app(data)["services"][name.to_s] = {
19
- "servers" => servers.map(&:to_s),
20
- "image" => image.to_s,
21
- "port" => port,
22
- "command" => command,
23
- "env" => env,
24
- "mount" => mount
25
- }.compact
26
- end
27
-
28
- private
29
-
30
- def validate_server_refs(data, servers)
31
- defined = (app(data)["servers"] || {}).keys
32
- servers.each do |ref|
33
- raise Errors::ConfigValidationError, "server '#{ref}' not found" unless defined.include?(ref.to_s)
34
- end
35
- end
36
- end
37
-
38
- class DeleteService < Base
39
- protected
40
-
41
- def mutate(data, name:)
42
- raise ArgumentError, "name is required" if name.nil? || name.to_s.empty?
43
-
44
- services = app(data)["services"] || {}
45
- raise Errors::ConfigValidationError, "service '#{name}' not found" unless services.key?(name.to_s)
46
-
47
- services.delete(name.to_s)
48
- end
49
- end
50
- end
51
- end
52
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nvoi
4
- module ConfigApi
5
- module Actions
6
- class SetVolume < Base
7
- protected
8
-
9
- def mutate(data, server:, name:, size: 10)
10
- raise ArgumentError, "server is required" if server.nil? || server.to_s.empty?
11
- raise ArgumentError, "name is required" if name.nil? || name.to_s.empty?
12
- raise ArgumentError, "size must be positive" if size && size < 1
13
-
14
- servers = app(data)["servers"] ||= {}
15
- raise Errors::ConfigValidationError, "server '#{server}' not found" unless servers.key?(server.to_s)
16
-
17
- servers[server.to_s]["volumes"] ||= {}
18
- servers[server.to_s]["volumes"][name.to_s] = { "size" => size }
19
- end
20
- end
21
-
22
- class DeleteVolume < Base
23
- protected
24
-
25
- def mutate(data, server:, name:)
26
- raise ArgumentError, "server is required" if server.nil? || server.to_s.empty?
27
- raise ArgumentError, "name is required" if name.nil? || name.to_s.empty?
28
-
29
- servers = app(data)["servers"] || {}
30
- raise Errors::ConfigValidationError, "server '#{server}' not found" unless servers.key?(server.to_s)
31
-
32
- volumes = servers[server.to_s]["volumes"] || {}
33
- raise Errors::ConfigValidationError, "volume '#{name}' not found on server '#{server}'" unless volumes.key?(name.to_s)
34
-
35
- volumes.delete(name.to_s)
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nvoi
4
- module ConfigApi
5
- # Base class for config transformations.
6
- # Accepts a Hash, returns a Hash. No crypto - caller handles that.
7
- class Base
8
- def initialize(data)
9
- @data = data
10
- end
11
-
12
- def call(**args)
13
- mutate(@data, **args)
14
- validate(@data)
15
- Result.success(@data)
16
- rescue Errors::ConfigValidationError => e
17
- Result.failure(:validation_error, e.message)
18
- rescue ArgumentError => e
19
- Result.failure(:invalid_args, e.message)
20
- end
21
-
22
- protected
23
-
24
- def mutate(_data, **_args)
25
- raise NotImplementedError
26
- end
27
-
28
- def validate(_data)
29
- # Subclasses can override to add validation
30
- # Default: no validation (lightweight actions like set_env don't need full config validation)
31
- end
32
-
33
- def app(data)
34
- data["application"] ||= {}
35
- end
36
- end
37
- end
38
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nvoi
4
- module ConfigApi
5
- class Result
6
- attr_reader :data, :error_type, :error_message
7
-
8
- def self.success(data)
9
- new(data:)
10
- end
11
-
12
- def self.failure(type, message)
13
- new(error_type: type, error_message: message)
14
- end
15
-
16
- def initialize(data: nil, error_type: nil, error_message: nil)
17
- @data = data
18
- @error_type = error_type
19
- @error_message = error_message
20
- end
21
-
22
- def success? = @error_type.nil?
23
- def failure? = !success?
24
- end
25
- end
26
- end
@@ -1,93 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Nvoi
4
- module ConfigApi
5
- class << self
6
- # Init (creates new config - special case, handles crypto)
7
- def init(**args)
8
- Actions::Init.new.call(**args)
9
- end
10
-
11
- # Domain Provider
12
- def set_domain_provider(data, **args)
13
- Actions::SetDomainProvider.new(data).call(**args)
14
- end
15
-
16
- def delete_domain_provider(data)
17
- Actions::DeleteDomainProvider.new(data).call
18
- end
19
-
20
- # Compute Provider
21
- def set_compute_provider(data, **args)
22
- Actions::SetComputeProvider.new(data).call(**args)
23
- end
24
-
25
- def delete_compute_provider(data)
26
- Actions::DeleteComputeProvider.new(data).call
27
- end
28
-
29
- # Server
30
- def set_server(data, **args)
31
- Actions::SetServer.new(data).call(**args)
32
- end
33
-
34
- def delete_server(data, **args)
35
- Actions::DeleteServer.new(data).call(**args)
36
- end
37
-
38
- # Volume
39
- def set_volume(data, **args)
40
- Actions::SetVolume.new(data).call(**args)
41
- end
42
-
43
- def delete_volume(data, **args)
44
- Actions::DeleteVolume.new(data).call(**args)
45
- end
46
-
47
- # App
48
- def set_app(data, **args)
49
- Actions::SetApp.new(data).call(**args)
50
- end
51
-
52
- def delete_app(data, **args)
53
- Actions::DeleteApp.new(data).call(**args)
54
- end
55
-
56
- # Database
57
- def set_database(data, **args)
58
- Actions::SetDatabase.new(data).call(**args)
59
- end
60
-
61
- def delete_database(data)
62
- Actions::DeleteDatabase.new(data).call
63
- end
64
-
65
- # Secret
66
- def set_secret(data, **args)
67
- Actions::SetSecret.new(data).call(**args)
68
- end
69
-
70
- def delete_secret(data, **args)
71
- Actions::DeleteSecret.new(data).call(**args)
72
- end
73
-
74
- # Env
75
- def set_env(data, **args)
76
- Actions::SetEnv.new(data).call(**args)
77
- end
78
-
79
- def delete_env(data, **args)
80
- Actions::DeleteEnv.new(data).call(**args)
81
- end
82
-
83
- # Service
84
- def set_service(data, **args)
85
- Actions::SetService.new(data).call(**args)
86
- end
87
-
88
- def delete_service(data, **args)
89
- Actions::DeleteService.new(data).call(**args)
90
- end
91
- end
92
- end
93
- end