ace-handbook 0.28.1 → 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 +4 -4
- data/.ace-defaults/handbook/config.yml +2 -1
- data/.ace-defaults/handbook/providers/agents.yml +2 -0
- data/CHANGELOG.md +12 -0
- data/README.md +2 -2
- data/lib/ace/handbook/atoms/provider_registry.rb +8 -9
- data/lib/ace/handbook/organisms/provider_syncer.rb +27 -12
- data/lib/ace/handbook/organisms/status_collector.rb +31 -4
- data/lib/ace/handbook/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 72ea6d4981e8c7686fa38ae9f12c868bb0d910b148ee8150d4de55b7d5ccc07e
|
|
4
|
+
data.tar.gz: aa19a72eb4faca05a8ddc78bfdff8dd1a19c7e5875ffae32da1d59097aec8630
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1c0ba11fdb8f55c87ce15642d34746c994b38480e920f98f2c3bfb447092fdaba2e9e69efac60d4a13e588242326db28c99d2b9b130093d9e331f05fd7862233
|
|
7
|
+
data.tar.gz: 82ccfe66ee207de57e86524684a28ba4f518a1c8ca252c49cc89dab3706ac7f305ddf56532883ffe64cc26ff8a7d8a0b618f22a48d247553387182414bd9e59f
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.29.0] - 2026-06-30
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Added the built-in `agents` skill projection target, generating `.agents/skills/` for default handbook sync.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- Changed plain `ace-handbook sync` and `ace-handbook status` to use the default/enabled projection set, with `agents` as the default when no providers are configured.
|
|
17
|
+
- Allowed explicit provider sync, such as `ace-handbook sync --provider codex`, even when the provider is not part of the default enabled set unless it is explicitly disabled.
|
|
18
|
+
|
|
19
|
+
### Technical
|
|
20
|
+
- Added regression coverage for default `.agents/skills` projection, explicit Codex projection, disabled-provider blocking, and default status filtering.
|
|
21
|
+
|
|
10
22
|
## [0.28.1] - 2026-04-23
|
|
11
23
|
|
|
12
24
|
### Changed
|
data/README.md
CHANGED
|
@@ -34,9 +34,9 @@
|
|
|
34
34
|
|
|
35
35
|
**Coordinate larger handbook deliveries** - use `/as-handbook-update-docs` to plan, execute, and synthesize multi-step documentation changes across package handbook assets.
|
|
36
36
|
|
|
37
|
-
**Integrate with resource discovery and context loading** - pair with [ace-nav](../ace-support-nav) for workflow and resource discovery, [ace-bundle](../ace-bundle) for loading complete workflow instructions, and provider integrations (`ace-handbook-integration-*`) that project canonical handbook skills into
|
|
37
|
+
**Integrate with resource discovery and context loading** - pair with [ace-nav](../ace-support-nav) for workflow and resource discovery, [ace-bundle](../ace-bundle) for loading complete workflow instructions, and provider integrations (`ace-handbook-integration-*`) that can project canonical handbook skills into harness-native folders on request.
|
|
38
38
|
|
|
39
|
-
**Sync and inspect
|
|
39
|
+
**Sync and inspect skill projections** - run `ace-handbook sync` to project canonical skills into `.agents/skills/` by default, or use `ace-handbook sync --provider PROVIDER` for harness-native folders such as `.codex/skills/`.
|
|
40
40
|
|
|
41
41
|
**Extend handbook content in normal projects** - put project-specific workflows, guides, cookbooks, templates, and skills under `.ace-handbook/` and discover them with protocol URLs (`wfi://`, `guide://`, `cookbook://`, `tmpl://`, `skill://`). See [Usage Guide](docs/usage.md) for path conventions.
|
|
42
42
|
|
|
@@ -7,13 +7,10 @@ module Ace
|
|
|
7
7
|
module Handbook
|
|
8
8
|
module Atoms
|
|
9
9
|
class ProviderRegistry
|
|
10
|
-
|
|
11
|
-
"ace-handbook-
|
|
12
|
-
".ace-defaults",
|
|
13
|
-
|
|
14
|
-
"providers",
|
|
15
|
-
"*.yml"
|
|
16
|
-
).freeze
|
|
10
|
+
LOCAL_MANIFEST_GLOBS = [
|
|
11
|
+
File.join("ace-handbook", ".ace-defaults", "handbook", "providers", "*.yml"),
|
|
12
|
+
File.join("ace-handbook-integration-*", ".ace-defaults", "handbook", "providers", "*.yml")
|
|
13
|
+
].freeze
|
|
17
14
|
|
|
18
15
|
attr_reader :project_root
|
|
19
16
|
|
|
@@ -54,12 +51,14 @@ module Ace
|
|
|
54
51
|
private
|
|
55
52
|
|
|
56
53
|
def local_manifest_paths
|
|
57
|
-
|
|
54
|
+
LOCAL_MANIFEST_GLOBS.flat_map do |glob|
|
|
55
|
+
Dir.glob(File.join(project_root, glob))
|
|
56
|
+
end.sort
|
|
58
57
|
end
|
|
59
58
|
|
|
60
59
|
def installed_manifest_paths
|
|
61
60
|
Gem::Specification.find_all.filter_map do |spec|
|
|
62
|
-
next unless spec.name.start_with?("ace-handbook-integration-")
|
|
61
|
+
next unless spec.name == "ace-handbook" || spec.name.start_with?("ace-handbook-integration-")
|
|
63
62
|
|
|
64
63
|
Dir.glob(File.join(spec.full_gem_path, ".ace-defaults", "handbook", "providers", "*.yml"))
|
|
65
64
|
end.flatten.sort
|
|
@@ -73,30 +73,45 @@ module Ace
|
|
|
73
73
|
end
|
|
74
74
|
|
|
75
75
|
def providers_to_sync(requested_provider)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
if requested_provider
|
|
77
|
+
provider = requested_provider.to_s
|
|
78
|
+
raise ArgumentError, "Unknown provider: #{provider}" unless registry.known?(provider)
|
|
79
|
+
if provider_disabled?(provider)
|
|
80
|
+
raise ArgumentError, "Provider '#{provider}' is disabled in handbook sync config"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
return [provider]
|
|
80
84
|
end
|
|
81
85
|
|
|
86
|
+
providers = default_sync_providers
|
|
82
87
|
unknown = providers.reject { |provider| registry.known?(provider) }
|
|
83
88
|
raise ArgumentError, "Unknown provider: #{unknown.join(", ")}" if unknown.any?
|
|
84
89
|
|
|
85
|
-
|
|
86
|
-
|
|
90
|
+
providers.reject { |provider| provider_disabled?(provider) }
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def default_sync_providers
|
|
94
|
+
enabled = enabled_providers
|
|
95
|
+
return enabled unless enabled.empty?
|
|
96
|
+
|
|
97
|
+
return ["agents"] if registry.known?("agents") && !provider_disabled?("agents")
|
|
87
98
|
|
|
88
|
-
|
|
99
|
+
registry.providers
|
|
89
100
|
end
|
|
90
101
|
|
|
91
|
-
def
|
|
102
|
+
def enabled_providers
|
|
92
103
|
sync_config = config.fetch("sync", {})
|
|
93
104
|
providers = sync_config.fetch("providers", {})
|
|
94
|
-
enabled = Array(providers["enabled"]).map(&:to_s)
|
|
95
|
-
disabled = Array(providers["disabled"]).map(&:to_s)
|
|
96
105
|
|
|
97
|
-
|
|
106
|
+
Array(providers["enabled"]).map(&:to_s)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def provider_disabled?(provider)
|
|
110
|
+
sync_config = config.fetch("sync", {})
|
|
111
|
+
providers = sync_config.fetch("providers", {})
|
|
112
|
+
disabled = Array(providers["disabled"]).map(&:to_s)
|
|
98
113
|
|
|
99
|
-
|
|
114
|
+
disabled.include?(provider.to_s)
|
|
100
115
|
end
|
|
101
116
|
|
|
102
117
|
def prepare_output_dir(output_dir)
|
|
@@ -150,22 +150,49 @@ module Ace
|
|
|
150
150
|
end
|
|
151
151
|
|
|
152
152
|
def selected_providers(provider)
|
|
153
|
-
selected =
|
|
153
|
+
selected = if provider
|
|
154
|
+
[provider.to_s]
|
|
155
|
+
else
|
|
156
|
+
default_status_providers
|
|
157
|
+
end
|
|
154
158
|
unknown = selected.reject { |provider_id| registry.known?(provider_id) }
|
|
155
159
|
raise ArgumentError, "Unknown provider: #{unknown.join(", ")}" if unknown.any?
|
|
156
160
|
|
|
157
161
|
selected
|
|
158
162
|
end
|
|
159
163
|
|
|
160
|
-
def
|
|
164
|
+
def default_status_providers
|
|
165
|
+
enabled = enabled_providers
|
|
166
|
+
return enabled unless enabled.empty?
|
|
167
|
+
|
|
168
|
+
return ["agents"] if registry.known?("agents") && !provider_disabled?("agents")
|
|
169
|
+
|
|
170
|
+
registry.providers.reject { |provider| provider_disabled?(provider) }
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def enabled_providers
|
|
174
|
+
sync_config = config.fetch("sync", {})
|
|
175
|
+
providers = sync_config.fetch("providers", {})
|
|
176
|
+
|
|
177
|
+
Array(providers["enabled"]).map(&:to_s)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def provider_disabled?(provider)
|
|
161
181
|
sync_config = config.fetch("sync", {})
|
|
162
182
|
providers = sync_config.fetch("providers", {})
|
|
163
|
-
enabled = Array(providers["enabled"]).map(&:to_s)
|
|
164
183
|
disabled = Array(providers["disabled"]).map(&:to_s)
|
|
165
184
|
|
|
185
|
+
disabled.include?(provider.to_s)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def provider_enabled?(provider)
|
|
189
|
+
enabled = enabled_providers
|
|
190
|
+
|
|
166
191
|
return enabled.include?(provider) unless enabled.empty?
|
|
167
192
|
|
|
168
|
-
|
|
193
|
+
return provider.to_s == "agents" if registry.known?("agents")
|
|
194
|
+
|
|
195
|
+
!provider_disabled?(provider)
|
|
169
196
|
end
|
|
170
197
|
|
|
171
198
|
def path_type(path)
|
data/lib/ace/handbook/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ace-handbook
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.29.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Michal Czyz
|
|
8
8
|
bindir: exe
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date: 2026-
|
|
10
|
+
date: 2026-06-30 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: ace-support-config
|
|
@@ -117,6 +117,7 @@ extensions: []
|
|
|
117
117
|
extra_rdoc_files: []
|
|
118
118
|
files:
|
|
119
119
|
- ".ace-defaults/handbook/config.yml"
|
|
120
|
+
- ".ace-defaults/handbook/providers/agents.yml"
|
|
120
121
|
- ".ace-defaults/nav/protocols/cookbook-sources/ace-handbook.yml"
|
|
121
122
|
- ".ace-defaults/nav/protocols/guide-sources/ace-handbook.yml"
|
|
122
123
|
- ".ace-defaults/nav/protocols/skill-sources/ace-handbook.yml"
|