ace-support-core 0.29.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.
data/lib/ace/core.rb ADDED
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "core/version"
4
+ require_relative "core/errors"
5
+
6
+ # Import ace-config for generic configuration cascade
7
+ require "ace/support/config"
8
+
9
+ # Import ace-support-fs for filesystem utilities (also re-exported by ace-config)
10
+ require "ace/support/fs"
11
+
12
+ # Ace-specific components
13
+ require_relative "core/atoms/config_summary"
14
+ require_relative "core/atoms/command_executor"
15
+ require_relative "core/organisms/environment_manager"
16
+ require_relative "core/config_discovery"
17
+
18
+ # CLI infrastructure — main classes now live in ace-support-cli
19
+ require "ace/support/cli"
20
+ require_relative "core/cli/config_summary_mixin"
21
+
22
+ module Ace
23
+ module Core
24
+ # Main module providing config cascade and environment management
25
+ class << self
26
+ # Resolve configuration with cascade using ace-config
27
+ # @return [Models::Config] Resolved configuration
28
+ def config
29
+ cached_resolver.resolve
30
+ end
31
+
32
+ # Get configuration value by key path or namespace
33
+ # @param namespace_or_keys [String, Symbol, Array] Namespace name or key path
34
+ # @param file [String, nil] Optional file name for namespace
35
+ # @param keys [Array<String,Symbol>] Additional key path after namespace
36
+ # @return [Object] Configuration value
37
+ def get(namespace_or_keys, *keys, file: nil)
38
+ resolver = cached_resolver
39
+
40
+ # If first arg looks like a namespace, resolve it
41
+ if namespace_or_keys.is_a?(String) && namespace_or_keys.match?(/^[a-z]+$/)
42
+ config = if file
43
+ # Use resolve_namespace for single-file case (cleaner API)
44
+ resolver.resolve_namespace(namespace_or_keys, filename: file)
45
+ else
46
+ # Use resolve_file for glob pattern case (resolve_namespace doesn't support globs)
47
+ resolver.resolve_file(namespace_glob_patterns(namespace_or_keys))
48
+ end
49
+ keys.empty? ? config.data : config.get(*keys)
50
+ else
51
+ # Traditional key path lookup
52
+ resolver.get(namespace_or_keys, *keys)
53
+ end
54
+ end
55
+
56
+ # Build glob patterns for all YAML files in a namespace directory
57
+ # @param namespace [String] Namespace name
58
+ # @return [Array<String>] Glob patterns for .yml and .yaml files
59
+ # @api private
60
+ def namespace_glob_patterns(namespace)
61
+ ["#{namespace}/*.yml", "#{namespace}/*.yaml"]
62
+ end
63
+
64
+ # Load environment variables
65
+ # @param root [String] Project root path
66
+ # @return [Hash] Loaded variables
67
+ def load_environment(root: Dir.pwd)
68
+ manager = Organisms::EnvironmentManager.new(root_path: root)
69
+ manager.load
70
+ end
71
+
72
+ # Create default configuration
73
+ # @param path [String] Where to create config
74
+ # @return [Models::Config] Created config
75
+ def create_default_config(path = "./.ace/core/config.yml")
76
+ ::Ace::Support::Config::Organisms::ConfigResolver.create_default(path)
77
+ end
78
+
79
+ # Get environment manager
80
+ # @param root [String] Project root
81
+ # @return [Organisms::EnvironmentManager] Environment manager
82
+ def environment(root: Dir.pwd)
83
+ Organisms::EnvironmentManager.new(root_path: root)
84
+ end
85
+
86
+ # Get environment variable from cascade without polluting ENV
87
+ # First checks ENV, then loads from .ace/.env cascade
88
+ # @param key [String] Environment variable name
89
+ # @param default [Object] Default value if not found
90
+ # @return [String, Object] Variable value or default
91
+ def get_env(key, default = nil)
92
+ # Check ENV first for already-set variables
93
+ return ENV[key] if ENV.key?(key) && !ENV[key].to_s.empty?
94
+
95
+ # Load from cascade (cached for performance)
96
+ cascade_vars[key] || default
97
+ end
98
+
99
+ # Clear the cascade cache (useful for testing or reloading)
100
+ def clear_env_cache
101
+ @cascade_vars = nil
102
+ end
103
+
104
+ # Reset all cached configuration state
105
+ # Per ADR-022, this method allows test isolation
106
+ def reset_config!
107
+ @cached_resolver = nil
108
+ ::Ace::Support::Config.reset_config!
109
+ clear_env_cache
110
+ end
111
+
112
+ private
113
+
114
+ # Cached resolver instance for performance
115
+ # Avoids repeated filesystem traversal on every config/get call
116
+ def cached_resolver
117
+ @cached_resolver ||= ::Ace::Support::Config.create(
118
+ config_dir: ".ace",
119
+ defaults_dir: resolve_defaults_dir,
120
+ gem_path: gem_root_path
121
+ )
122
+ end
123
+
124
+ # Defaults directory for gem configuration
125
+ def resolve_defaults_dir
126
+ ".ace-defaults"
127
+ end
128
+
129
+ # Get gem root path for loading bundled defaults
130
+ def gem_root_path
131
+ spec = ::Gem.loaded_specs["ace-support-core"]
132
+ spec&.gem_dir || File.expand_path("../../..", __dir__)
133
+ end
134
+
135
+ # Cached cascade variables
136
+ def cascade_vars
137
+ @cascade_vars ||= begin
138
+ require_relative "core/molecules/env_loader"
139
+ Molecules::EnvLoader.load_cascade
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ace-support-core
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.29.0
5
+ platform: ruby
6
+ authors:
7
+ - Michal Czyz
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: ace-support-config
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '0.7'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '0.7'
26
+ - !ruby/object:Gem::Dependency
27
+ name: ace-support-fs
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.2'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.2'
40
+ - !ruby/object:Gem::Dependency
41
+ name: ace-support-cli
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.6'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.6'
54
+ description: Foundational infrastructure gem providing configuration cascade resolution,
55
+ environment variable handling, and shared utilities for all ace-* gems. Library-only
56
+ gem following ace-support-* pattern for infrastructure components.
57
+ email:
58
+ - mc@cs3b.com
59
+ executables: []
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".ace-defaults/core/settings.yml"
64
+ - CHANGELOG.md
65
+ - LICENSE
66
+ - README.md
67
+ - Rakefile
68
+ - lib/ace/core.rb
69
+ - lib/ace/core/atoms/command_executor.rb
70
+ - lib/ace/core/atoms/config_summary.rb
71
+ - lib/ace/core/atoms/env_parser.rb
72
+ - lib/ace/core/atoms/file_reader.rb
73
+ - lib/ace/core/atoms/glob_expander.rb
74
+ - lib/ace/core/atoms/process_terminator.rb
75
+ - lib/ace/core/atoms/template_parser.rb
76
+ - lib/ace/core/cli.rb
77
+ - lib/ace/core/cli/config_summary_mixin.rb
78
+ - lib/ace/core/config_discovery.rb
79
+ - lib/ace/core/errors.rb
80
+ - lib/ace/core/models/config_templates.rb
81
+ - lib/ace/core/molecules/env_loader.rb
82
+ - lib/ace/core/molecules/file_aggregator.rb
83
+ - lib/ace/core/molecules/frontmatter_free_policy.rb
84
+ - lib/ace/core/molecules/output_formatter.rb
85
+ - lib/ace/core/molecules/prompt_cache_manager.rb
86
+ - lib/ace/core/organisms/config_diff.rb
87
+ - lib/ace/core/organisms/config_initializer.rb
88
+ - lib/ace/core/organisms/environment_manager.rb
89
+ - lib/ace/core/version.rb
90
+ homepage: https://github.com/cs3b/ace
91
+ licenses:
92
+ - MIT
93
+ metadata:
94
+ allowed_push_host: https://rubygems.org
95
+ homepage_uri: https://github.com/cs3b/ace
96
+ source_code_uri: https://github.com/cs3b/ace
97
+ changelog_uri: https://github.com/cs3b/ace/blob/main/ace-support-core/CHANGELOG.md
98
+ rdoc_options: []
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: 3.2.0
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ requirements: []
112
+ rubygems_version: 3.6.9
113
+ specification_version: 4
114
+ summary: Core configuration cascade and shared functionality for ace-* gems
115
+ test_files: []