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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5cbc07b0baed92baa1f2a9e74c58312d24c12a6f320af4585ca4c3bcd7a1638
4
- data.tar.gz: 92e6f8b56f9276c87aa28f72797544c4b0d48efcbbff3b97e91cccf3ac86ee86
3
+ metadata.gz: 72ea6d4981e8c7686fa38ae9f12c868bb0d910b148ee8150d4de55b7d5ccc07e
4
+ data.tar.gz: aa19a72eb4faca05a8ddc78bfdff8dd1a19c7e5875ffae32da1d59097aec8630
5
5
  SHA512:
6
- metadata.gz: e1738d08525b525968422776b5cf8357a321cec573d1807da28d3f0c6c3db8f0fd7366255cb1ee13a7f728e2dd27d315113489b6e6c3e558e1af6c51852237d3
7
- data.tar.gz: 50539492a46b43bc0da61ec4e6434a4521dfd3fd0fb402c02aa05aff2e01a838336f80fc7e83303d40158eb24295948e8ac3ce053caec36debb328e57426d580
6
+ metadata.gz: 1c0ba11fdb8f55c87ce15642d34746c994b38480e920f98f2c3bfb447092fdaba2e9e69efac60d4a13e588242326db28c99d2b9b130093d9e331f05fd7862233
7
+ data.tar.gz: 82ccfe66ee207de57e86524684a28ba4f518a1c8ca252c49cc89dab3706ac7f305ddf56532883ffe64cc26ff8a7d8a0b618f22a48d247553387182414bd9e59f
@@ -1,4 +1,5 @@
1
1
  sync:
2
2
  providers:
3
- enabled: []
3
+ enabled:
4
+ - agents
4
5
  disabled: []
@@ -0,0 +1,2 @@
1
+ provider: agents
2
+ output_dir: .agents/skills
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 provider-native folders.
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 provider integrations** - run `ace-handbook sync` to project canonical skills into provider-native folders and `ace-handbook status` to check integration health across all configured providers.
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
- LOCAL_MANIFEST_GLOB = File.join(
11
- "ace-handbook-integration-*",
12
- ".ace-defaults",
13
- "handbook",
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
- Dir.glob(File.join(project_root, LOCAL_MANIFEST_GLOB)).sort
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
- providers = if requested_provider
77
- [requested_provider.to_s]
78
- else
79
- registry.providers
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
- enabled = providers.select { |provider| provider_enabled?(provider) }
86
- return enabled if requested_provider.nil? || enabled.any?
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
- raise ArgumentError, "Provider '#{requested_provider}' is disabled in handbook sync config"
99
+ registry.providers
89
100
  end
90
101
 
91
- def provider_enabled?(provider)
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
- return enabled.include?(provider) unless enabled.empty?
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
- !disabled.include?(provider)
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 = provider ? [provider.to_s] : registry.providers
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 provider_enabled?(provider)
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
- !disabled.include?(provider)
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)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Ace
4
4
  module Handbook
5
- VERSION = '0.28.1'
5
+ VERSION = '0.29.0'
6
6
  end
7
7
  end
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.28.1
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-04-26 00:00:00.000000000 Z
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"