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.
- checksums.yaml +7 -0
- data/.ace-defaults/core/settings.yml +36 -0
- data/CHANGELOG.md +460 -0
- data/LICENSE +21 -0
- data/README.md +34 -0
- data/Rakefile +14 -0
- data/lib/ace/core/atoms/command_executor.rb +239 -0
- data/lib/ace/core/atoms/config_summary.rb +220 -0
- data/lib/ace/core/atoms/env_parser.rb +76 -0
- data/lib/ace/core/atoms/file_reader.rb +184 -0
- data/lib/ace/core/atoms/glob_expander.rb +175 -0
- data/lib/ace/core/atoms/process_terminator.rb +39 -0
- data/lib/ace/core/atoms/template_parser.rb +222 -0
- data/lib/ace/core/cli/config_summary_mixin.rb +55 -0
- data/lib/ace/core/cli.rb +192 -0
- data/lib/ace/core/config_discovery.rb +176 -0
- data/lib/ace/core/errors.rb +14 -0
- data/lib/ace/core/models/config_templates.rb +87 -0
- data/lib/ace/core/molecules/env_loader.rb +128 -0
- data/lib/ace/core/molecules/file_aggregator.rb +196 -0
- data/lib/ace/core/molecules/frontmatter_free_policy.rb +34 -0
- data/lib/ace/core/molecules/output_formatter.rb +433 -0
- data/lib/ace/core/molecules/prompt_cache_manager.rb +141 -0
- data/lib/ace/core/organisms/config_diff.rb +187 -0
- data/lib/ace/core/organisms/config_initializer.rb +125 -0
- data/lib/ace/core/organisms/environment_manager.rb +142 -0
- data/lib/ace/core/version.rb +7 -0
- data/lib/ace/core.rb +144 -0
- metadata +115 -0
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: []
|