ace-handbook 0.19.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 (85) hide show
  1. checksums.yaml +7 -0
  2. data/.ace-defaults/handbook/config.yml +4 -0
  3. data/.ace-defaults/nav/protocols/guide-sources/ace-handbook.yml +19 -0
  4. data/.ace-defaults/nav/protocols/tmpl-sources/ace-handbook.yml +10 -0
  5. data/.ace-defaults/nav/protocols/wfi-sources/ace-handbook.yml +19 -0
  6. data/CHANGELOG.md +362 -0
  7. data/LICENSE +21 -0
  8. data/README.md +42 -0
  9. data/Rakefile +12 -0
  10. data/exe/ace-handbook +6 -0
  11. data/handbook/guides/ai-agent-integration.g.md +625 -0
  12. data/handbook/guides/atom-pattern.g.md +371 -0
  13. data/handbook/guides/changelog.g.md +333 -0
  14. data/handbook/guides/cli-dry-cli.g.md +276 -0
  15. data/handbook/guides/cli-support-cli.g.md +277 -0
  16. data/handbook/guides/coding-standards/ruby.md +41 -0
  17. data/handbook/guides/coding-standards/rust.md +19 -0
  18. data/handbook/guides/coding-standards/typescript.md +20 -0
  19. data/handbook/guides/coding-standards.g.md +134 -0
  20. data/handbook/guides/debug-troubleshooting.g.md +62 -0
  21. data/handbook/guides/error-handling/ruby.md +29 -0
  22. data/handbook/guides/error-handling/rust.md +59 -0
  23. data/handbook/guides/error-handling/typescript.md +38 -0
  24. data/handbook/guides/error-handling.g.md +207 -0
  25. data/handbook/guides/meta/agents-definition.g.md +823 -0
  26. data/handbook/guides/meta/guides-definition.g.md +322 -0
  27. data/handbook/guides/meta/markdown-definition.g.md +210 -0
  28. data/handbook/guides/meta/tools-definition.g.md +159 -0
  29. data/handbook/guides/meta/workflow-instructions-definition.g.md +367 -0
  30. data/handbook/guides/mono-repo-patterns.g.md +92 -0
  31. data/handbook/guides/multi-agent-research.g.md +251 -0
  32. data/handbook/guides/performance/ruby.md +25 -0
  33. data/handbook/guides/performance/rust.md +48 -0
  34. data/handbook/guides/performance/typescript.md +32 -0
  35. data/handbook/guides/performance.g.md +211 -0
  36. data/handbook/guides/prompt-caching.g.md +83 -0
  37. data/handbook/guides/quality-assurance/ruby.md +33 -0
  38. data/handbook/guides/quality-assurance/rust.md +41 -0
  39. data/handbook/guides/quality-assurance/typescript.md +49 -0
  40. data/handbook/guides/quality-assurance.g.md +222 -0
  41. data/handbook/guides/strategic-planning.g.md +69 -0
  42. data/handbook/guides/troubleshooting/ruby.md +21 -0
  43. data/handbook/guides/troubleshooting/rust.md +20 -0
  44. data/handbook/guides/troubleshooting/typescript.md +36 -0
  45. data/handbook/guides/workflow-context-embedding.g.md +286 -0
  46. data/handbook/skills/as-handbook-init-project/SKILL.md +34 -0
  47. data/handbook/skills/as-handbook-manage-agents/SKILL.md +35 -0
  48. data/handbook/skills/as-handbook-manage-guides/SKILL.md +35 -0
  49. data/handbook/skills/as-handbook-manage-workflows/SKILL.md +35 -0
  50. data/handbook/skills/as-handbook-parallel-research/SKILL.md +29 -0
  51. data/handbook/skills/as-handbook-perform-delivery/SKILL.md +35 -0
  52. data/handbook/skills/as-handbook-review-guides/SKILL.md +32 -0
  53. data/handbook/skills/as-handbook-review-workflows/SKILL.md +32 -0
  54. data/handbook/skills/as-handbook-synthesize-research/SKILL.md +29 -0
  55. data/handbook/skills/as-handbook-update-docs/SKILL.md +35 -0
  56. data/handbook/skills/as-release/SKILL.md +50 -0
  57. data/handbook/skills/as-release-bump-version/SKILL.md +28 -0
  58. data/handbook/skills/as-release-rubygems-publish/SKILL.md +58 -0
  59. data/handbook/skills/as-release-update-changelog/SKILL.md +28 -0
  60. data/handbook/templates/completed-work-documentation.md +59 -0
  61. data/handbook/templates/cookbooks/cookbook.template.md +237 -0
  62. data/handbook/templates/research-comparison.template.md +175 -0
  63. data/handbook/workflow-instructions/handbook/init-project.wf.md +629 -0
  64. data/handbook/workflow-instructions/handbook/manage-agents.wf.md +379 -0
  65. data/handbook/workflow-instructions/handbook/manage-guides.wf.md +294 -0
  66. data/handbook/workflow-instructions/handbook/manage-workflows.wf.md +292 -0
  67. data/handbook/workflow-instructions/handbook/parallel-research.wf.md +328 -0
  68. data/handbook/workflow-instructions/handbook/perform-delivery.wf.md +267 -0
  69. data/handbook/workflow-instructions/handbook/research.wf.md +247 -0
  70. data/handbook/workflow-instructions/handbook/review-guides.wf.md +348 -0
  71. data/handbook/workflow-instructions/handbook/review-workflows.wf.md +299 -0
  72. data/handbook/workflow-instructions/handbook/synthesize-research.wf.md +429 -0
  73. data/handbook/workflow-instructions/handbook/update-docs.wf.md +338 -0
  74. data/lib/ace/handbook/atoms/provider_registry.rb +70 -0
  75. data/lib/ace/handbook/cli/commands/status.rb +36 -0
  76. data/lib/ace/handbook/cli/commands/sync.rb +36 -0
  77. data/lib/ace/handbook/cli.rb +51 -0
  78. data/lib/ace/handbook/models/skill_document.rb +25 -0
  79. data/lib/ace/handbook/molecules/skill_projection.rb +54 -0
  80. data/lib/ace/handbook/organisms/provider_syncer.rb +106 -0
  81. data/lib/ace/handbook/organisms/skill_inventory.rb +54 -0
  82. data/lib/ace/handbook/organisms/status_collector.rb +181 -0
  83. data/lib/ace/handbook/version.rb +7 -0
  84. data/lib/ace/handbook.rb +28 -0
  85. metadata +227 -0
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+
5
+ module Ace
6
+ module Handbook
7
+ module Organisms
8
+ class ProviderSyncer
9
+ attr_reader :project_root, :registry, :inventory, :config
10
+
11
+ def initialize(
12
+ project_root: Ace::Handbook.project_root,
13
+ registry: nil,
14
+ inventory: nil,
15
+ config: nil
16
+ )
17
+ @project_root = project_root
18
+ @registry = registry || Atoms::ProviderRegistry.new(project_root: project_root)
19
+ @inventory = inventory || SkillInventory.new(project_root: project_root)
20
+ @config = config || Ace::Handbook.config.resolve_namespace("handbook").to_h
21
+ end
22
+
23
+ def sync(provider: nil)
24
+ providers_to_sync(provider).map { |provider_id| sync_provider(provider_id) }
25
+ end
26
+
27
+ private
28
+
29
+ def sync_provider(provider)
30
+ output_dir = File.join(project_root, registry.output_dir(provider))
31
+ prepare_output_dir(output_dir)
32
+
33
+ expected = {}
34
+ updated_files = 0
35
+
36
+ inventory.all.each do |skill|
37
+ next unless Molecules::SkillProjection.projection_targets(skill.frontmatter, registry: registry).include?(provider)
38
+
39
+ frontmatter = Molecules::SkillProjection.projected_frontmatter(skill.frontmatter, provider: provider)
40
+ rendered = Molecules::SkillProjection.render(frontmatter, skill.body)
41
+ output_path = File.join(output_dir, skill.name, "SKILL.md")
42
+ expected[skill.name] = output_path
43
+
44
+ FileUtils.mkdir_p(File.dirname(output_path))
45
+ next if File.exist?(output_path) && File.read(output_path) == rendered
46
+
47
+ File.write(output_path, rendered)
48
+ updated_files += 1
49
+ end
50
+
51
+ removed_entries = prune_stale_entries(output_dir, expected.keys)
52
+
53
+ {
54
+ provider: provider,
55
+ relative_output_dir: registry.output_dir(provider),
56
+ projected_skills: expected.size,
57
+ updated_files: updated_files,
58
+ removed_entries: removed_entries
59
+ }
60
+ end
61
+
62
+ def providers_to_sync(requested_provider)
63
+ providers = if requested_provider
64
+ [requested_provider.to_s]
65
+ else
66
+ registry.providers
67
+ end
68
+
69
+ unknown = providers.reject { |provider| registry.known?(provider) }
70
+ raise ArgumentError, "Unknown provider: #{unknown.join(", ")}" if unknown.any?
71
+
72
+ enabled = providers.select { |provider| provider_enabled?(provider) }
73
+ return enabled if requested_provider.nil? || enabled.any?
74
+
75
+ raise ArgumentError, "Provider '#{requested_provider}' is disabled in handbook sync config"
76
+ end
77
+
78
+ def provider_enabled?(provider)
79
+ sync_config = config.fetch("sync", {})
80
+ providers = sync_config.fetch("providers", {})
81
+ enabled = Array(providers["enabled"]).map(&:to_s)
82
+ disabled = Array(providers["disabled"]).map(&:to_s)
83
+
84
+ return enabled.include?(provider) unless enabled.empty?
85
+
86
+ !disabled.include?(provider)
87
+ end
88
+
89
+ def prepare_output_dir(output_dir)
90
+ if File.symlink?(output_dir) || File.file?(output_dir)
91
+ FileUtils.rm_rf(output_dir)
92
+ end
93
+
94
+ FileUtils.mkdir_p(output_dir)
95
+ end
96
+
97
+ def prune_stale_entries(output_dir, expected_skill_names)
98
+ existing = Dir.glob(File.join(output_dir, "*")).select { |path| File.directory?(path) }
99
+ stale = existing.reject { |path| expected_skill_names.include?(File.basename(path)) }
100
+ stale.each { |path| FileUtils.rm_rf(path) }
101
+ stale.size
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "date"
4
+ require "yaml"
5
+ require "ace/support/nav"
6
+
7
+ module Ace
8
+ module Handbook
9
+ module Organisms
10
+ class SkillInventory
11
+ FRONTMATTER_PATTERN = /\A---\s*\n(.*?)\n---\s*\n?(.*)\z/m
12
+
13
+ attr_reader :project_root
14
+
15
+ def initialize(project_root: Ace::Handbook.project_root)
16
+ @project_root = project_root
17
+ end
18
+
19
+ def all
20
+ scanner.find_resources("skill").filter_map do |resource|
21
+ parse_skill(resource.fetch(:path))
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def scanner
28
+ source_registry = Ace::Support::Nav::Molecules::SourceRegistry.new(start_path: project_root)
29
+ config_loader = Ace::Support::Nav::Molecules::ConfigLoader.new(
30
+ File.join(project_root, ".ace", "nav"),
31
+ source_registry: source_registry
32
+ )
33
+
34
+ Ace::Support::Nav::Molecules::ProtocolScanner.new(config_loader: config_loader)
35
+ end
36
+
37
+ def parse_skill(path)
38
+ content = File.read(path)
39
+ match = content.match(FRONTMATTER_PATTERN)
40
+ return nil unless match
41
+
42
+ frontmatter = YAML.safe_load(match[1], permitted_classes: [Date, Time], aliases: true) || {}
43
+ return nil unless frontmatter.is_a?(Hash) && frontmatter["name"]
44
+
45
+ Models::SkillDocument.new(
46
+ source_path: path,
47
+ frontmatter: frontmatter,
48
+ body: match[2]
49
+ )
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,181 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ace
4
+ module Handbook
5
+ module Organisms
6
+ class StatusCollector
7
+ attr_reader :project_root, :registry, :config, :inventory
8
+
9
+ def initialize(project_root: Ace::Handbook.project_root, registry: nil, inventory: nil, config: nil)
10
+ @project_root = project_root
11
+ @registry = registry || Atoms::ProviderRegistry.new(project_root: project_root)
12
+ @inventory = inventory || SkillInventory.new(project_root: project_root)
13
+ @config = config || Ace::Handbook.config.resolve_namespace("handbook").to_h
14
+ end
15
+
16
+ def collect(provider: nil)
17
+ skills = inventory.all
18
+
19
+ {
20
+ "canonical" => canonical_summary(skills),
21
+ "providers" => selected_providers(provider).map { |provider_id| provider_status(provider_id, skills) }
22
+ }
23
+ end
24
+
25
+ def to_table(snapshot)
26
+ summary_lines = canonical_summary_lines(snapshot.fetch("canonical"))
27
+ rows = snapshot.fetch("providers").map do |entry|
28
+ [
29
+ entry.fetch("provider"),
30
+ entry.fetch("enabled") ? "yes" : "no",
31
+ entry.fetch("path_type"),
32
+ entry.fetch("expected").to_s,
33
+ entry.fetch("installed").to_s,
34
+ entry.fetch("in_sync").to_s,
35
+ entry.fetch("outdated").to_s,
36
+ entry.fetch("missing").to_s,
37
+ entry.fetch("extra").to_s,
38
+ entry.fetch("relative_output_dir")
39
+ ]
40
+ end
41
+
42
+ widths = [
43
+ ["PROVIDER", *rows.map { |row| row[0] }].map(&:length).max,
44
+ ["ENABLED", *rows.map { |row| row[1] }].map(&:length).max,
45
+ ["TYPE", *rows.map { |row| row[2] }].map(&:length).max,
46
+ ["EXPECTED", *rows.map { |row| row[3] }].map(&:length).max,
47
+ ["INSTALLED", *rows.map { |row| row[4] }].map(&:length).max,
48
+ ["IN_SYNC", *rows.map { |row| row[5] }].map(&:length).max,
49
+ ["OUTDATED", *rows.map { |row| row[6] }].map(&:length).max,
50
+ ["MISSING", *rows.map { |row| row[7] }].map(&:length).max,
51
+ ["EXTRA", *rows.map { |row| row[8] }].map(&:length).max
52
+ ]
53
+
54
+ header = format(
55
+ "%-#{widths[0]}s %-#{widths[1]}s %-#{widths[2]}s %#{widths[3]}s %#{widths[4]}s %#{widths[5]}s %#{widths[6]}s %#{widths[7]}s %#{widths[8]}s %s",
56
+ "PROVIDER", "ENABLED", "TYPE", "EXPECTED", "INSTALLED", "IN_SYNC", "OUTDATED", "MISSING", "EXTRA", "PATH"
57
+ )
58
+ lines = rows.map do |provider, enabled, type, expected, installed, in_sync, outdated, missing, extra, path|
59
+ format(
60
+ "%-#{widths[0]}s %-#{widths[1]}s %-#{widths[2]}s %#{widths[3]}s %#{widths[4]}s %#{widths[5]}s %#{widths[6]}s %#{widths[7]}s %#{widths[8]}s %s",
61
+ provider, enabled, type, expected, installed, in_sync, outdated, missing, extra, path
62
+ )
63
+ end
64
+
65
+ (summary_lines + ["", header] + lines).join("\n")
66
+ end
67
+
68
+ private
69
+
70
+ def canonical_summary(skills)
71
+ counts = skills.group_by(&:source).transform_values(&:size)
72
+
73
+ {
74
+ "total" => skills.size,
75
+ "by_source" => counts.keys.sort.map do |source|
76
+ {"source" => source, "count" => counts.fetch(source)}
77
+ end
78
+ }
79
+ end
80
+
81
+ def provider_status(provider, skills)
82
+ relative_output_dir = registry.output_dir(provider)
83
+ output_dir = File.join(project_root, relative_output_dir)
84
+ expected = expected_projection_map(provider, skills)
85
+ installed_paths = installed_skill_paths(output_dir)
86
+ installed_names = installed_paths.map { |path| File.basename(File.dirname(path)) }
87
+
88
+ in_sync = 0
89
+ outdated = 0
90
+ extra = 0
91
+
92
+ installed_paths.each do |path|
93
+ skill_name = File.basename(File.dirname(path))
94
+ expected_content = expected[skill_name]
95
+
96
+ if expected_content.nil?
97
+ extra += 1
98
+ elsif File.read(path) == expected_content
99
+ in_sync += 1
100
+ else
101
+ outdated += 1
102
+ end
103
+ end
104
+
105
+ {
106
+ "provider" => provider,
107
+ "enabled" => provider_enabled?(provider),
108
+ "relative_output_dir" => relative_output_dir,
109
+ "output_dir" => output_dir,
110
+ "path_type" => path_type(output_dir),
111
+ "manifest_path" => registry.manifest(provider)["_manifest_path"],
112
+ "expected" => expected.size,
113
+ "installed" => installed_paths.size,
114
+ "in_sync" => in_sync,
115
+ "outdated" => outdated,
116
+ "missing" => (expected.keys - installed_names).size,
117
+ "extra" => extra
118
+ }
119
+ end
120
+
121
+ def expected_projection_map(provider, skills)
122
+ skills.each_with_object({}) do |skill, expected|
123
+ next unless Molecules::SkillProjection.projection_targets(skill.frontmatter, registry: registry).include?(provider)
124
+
125
+ frontmatter = Molecules::SkillProjection.projected_frontmatter(skill.frontmatter, provider: provider)
126
+ expected[skill.name] = Molecules::SkillProjection.render(frontmatter, skill.body)
127
+ end
128
+ end
129
+
130
+ def installed_skill_paths(output_dir)
131
+ return [] unless Dir.exist?(output_dir)
132
+
133
+ Dir.glob(File.join(output_dir, "*", "SKILL.md")).sort
134
+ end
135
+
136
+ def canonical_summary_lines(summary)
137
+ rows = summary.fetch("by_source").map { |entry| [entry.fetch("source"), entry.fetch("count").to_s] }
138
+ source_width = ["SOURCE", *rows.map { |row| row[0] }, "TOTAL"].map(&:length).max
139
+ count_width = ["COUNT", *rows.map { |row| row[1] }, summary.fetch("total").to_s].map(&:length).max
140
+
141
+ lines = [
142
+ "CANONICAL SKILLS",
143
+ format("%-#{source_width}s %#{count_width}s", "SOURCE", "COUNT")
144
+ ]
145
+ rows.each do |source, count|
146
+ lines << format("%-#{source_width}s %#{count_width}s", source, count)
147
+ end
148
+ lines << format("%-#{source_width}s %#{count_width}s", "TOTAL", summary.fetch("total"))
149
+ lines
150
+ end
151
+
152
+ def selected_providers(provider)
153
+ selected = provider ? [provider.to_s] : registry.providers
154
+ unknown = selected.reject { |provider_id| registry.known?(provider_id) }
155
+ raise ArgumentError, "Unknown provider: #{unknown.join(", ")}" if unknown.any?
156
+
157
+ selected
158
+ end
159
+
160
+ def provider_enabled?(provider)
161
+ sync_config = config.fetch("sync", {})
162
+ providers = sync_config.fetch("providers", {})
163
+ enabled = Array(providers["enabled"]).map(&:to_s)
164
+ disabled = Array(providers["disabled"]).map(&:to_s)
165
+
166
+ return enabled.include?(provider) unless enabled.empty?
167
+
168
+ !disabled.include?(provider)
169
+ end
170
+
171
+ def path_type(path)
172
+ return "symlink" if File.symlink?(path)
173
+ return "directory" if File.directory?(path)
174
+ return "file" if File.file?(path)
175
+
176
+ "missing"
177
+ end
178
+ end
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ace
4
+ module Handbook
5
+ VERSION = "0.19.0"
6
+ end
7
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ace/support/config"
4
+
5
+ require_relative "handbook/version"
6
+ require_relative "handbook/atoms/provider_registry"
7
+ require_relative "handbook/models/skill_document"
8
+ require_relative "handbook/molecules/skill_projection"
9
+ require_relative "handbook/organisms/skill_inventory"
10
+ require_relative "handbook/organisms/provider_syncer"
11
+ require_relative "handbook/organisms/status_collector"
12
+
13
+ module Ace
14
+ module Handbook
15
+ class << self
16
+ def config
17
+ @config ||= Ace::Support::Config.create(
18
+ gem_path: File.expand_path("../..", __dir__),
19
+ cache_namespaces: true
20
+ )
21
+ end
22
+
23
+ def project_root(start_path: Dir.pwd)
24
+ Ace::Support::Config.find_project_root(start_path: start_path) || Dir.pwd
25
+ end
26
+ end
27
+ end
28
+ end
metadata ADDED
@@ -0,0 +1,227 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ace-handbook
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.19.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-core
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.25'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.25'
40
+ - !ruby/object:Gem::Dependency
41
+ name: ace-support-nav
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.21'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.21'
54
+ - !ruby/object:Gem::Dependency
55
+ name: ace-support-cli
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.3'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.3'
68
+ - !ruby/object:Gem::Dependency
69
+ name: bundler
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '2.0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rake
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '13.0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '13.0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: minitest
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '5.0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '5.0'
110
+ description: Standardized workflows for creating, reviewing, and maintaining ACE handbook
111
+ guides, workflow instructions, and agent definitions.
112
+ email:
113
+ - mc@cs3b.com
114
+ executables:
115
+ - ace-handbook
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".ace-defaults/handbook/config.yml"
120
+ - ".ace-defaults/nav/protocols/guide-sources/ace-handbook.yml"
121
+ - ".ace-defaults/nav/protocols/tmpl-sources/ace-handbook.yml"
122
+ - ".ace-defaults/nav/protocols/wfi-sources/ace-handbook.yml"
123
+ - CHANGELOG.md
124
+ - LICENSE
125
+ - README.md
126
+ - Rakefile
127
+ - exe/ace-handbook
128
+ - handbook/guides/ai-agent-integration.g.md
129
+ - handbook/guides/atom-pattern.g.md
130
+ - handbook/guides/changelog.g.md
131
+ - handbook/guides/cli-dry-cli.g.md
132
+ - handbook/guides/cli-support-cli.g.md
133
+ - handbook/guides/coding-standards.g.md
134
+ - handbook/guides/coding-standards/ruby.md
135
+ - handbook/guides/coding-standards/rust.md
136
+ - handbook/guides/coding-standards/typescript.md
137
+ - handbook/guides/debug-troubleshooting.g.md
138
+ - handbook/guides/error-handling.g.md
139
+ - handbook/guides/error-handling/ruby.md
140
+ - handbook/guides/error-handling/rust.md
141
+ - handbook/guides/error-handling/typescript.md
142
+ - handbook/guides/meta/agents-definition.g.md
143
+ - handbook/guides/meta/guides-definition.g.md
144
+ - handbook/guides/meta/markdown-definition.g.md
145
+ - handbook/guides/meta/tools-definition.g.md
146
+ - handbook/guides/meta/workflow-instructions-definition.g.md
147
+ - handbook/guides/mono-repo-patterns.g.md
148
+ - handbook/guides/multi-agent-research.g.md
149
+ - handbook/guides/performance.g.md
150
+ - handbook/guides/performance/ruby.md
151
+ - handbook/guides/performance/rust.md
152
+ - handbook/guides/performance/typescript.md
153
+ - handbook/guides/prompt-caching.g.md
154
+ - handbook/guides/quality-assurance.g.md
155
+ - handbook/guides/quality-assurance/ruby.md
156
+ - handbook/guides/quality-assurance/rust.md
157
+ - handbook/guides/quality-assurance/typescript.md
158
+ - handbook/guides/strategic-planning.g.md
159
+ - handbook/guides/troubleshooting/ruby.md
160
+ - handbook/guides/troubleshooting/rust.md
161
+ - handbook/guides/troubleshooting/typescript.md
162
+ - handbook/guides/workflow-context-embedding.g.md
163
+ - handbook/skills/as-handbook-init-project/SKILL.md
164
+ - handbook/skills/as-handbook-manage-agents/SKILL.md
165
+ - handbook/skills/as-handbook-manage-guides/SKILL.md
166
+ - handbook/skills/as-handbook-manage-workflows/SKILL.md
167
+ - handbook/skills/as-handbook-parallel-research/SKILL.md
168
+ - handbook/skills/as-handbook-perform-delivery/SKILL.md
169
+ - handbook/skills/as-handbook-review-guides/SKILL.md
170
+ - handbook/skills/as-handbook-review-workflows/SKILL.md
171
+ - handbook/skills/as-handbook-synthesize-research/SKILL.md
172
+ - handbook/skills/as-handbook-update-docs/SKILL.md
173
+ - handbook/skills/as-release-bump-version/SKILL.md
174
+ - handbook/skills/as-release-rubygems-publish/SKILL.md
175
+ - handbook/skills/as-release-update-changelog/SKILL.md
176
+ - handbook/skills/as-release/SKILL.md
177
+ - handbook/templates/completed-work-documentation.md
178
+ - handbook/templates/cookbooks/cookbook.template.md
179
+ - handbook/templates/research-comparison.template.md
180
+ - handbook/workflow-instructions/handbook/init-project.wf.md
181
+ - handbook/workflow-instructions/handbook/manage-agents.wf.md
182
+ - handbook/workflow-instructions/handbook/manage-guides.wf.md
183
+ - handbook/workflow-instructions/handbook/manage-workflows.wf.md
184
+ - handbook/workflow-instructions/handbook/parallel-research.wf.md
185
+ - handbook/workflow-instructions/handbook/perform-delivery.wf.md
186
+ - handbook/workflow-instructions/handbook/research.wf.md
187
+ - handbook/workflow-instructions/handbook/review-guides.wf.md
188
+ - handbook/workflow-instructions/handbook/review-workflows.wf.md
189
+ - handbook/workflow-instructions/handbook/synthesize-research.wf.md
190
+ - handbook/workflow-instructions/handbook/update-docs.wf.md
191
+ - lib/ace/handbook.rb
192
+ - lib/ace/handbook/atoms/provider_registry.rb
193
+ - lib/ace/handbook/cli.rb
194
+ - lib/ace/handbook/cli/commands/status.rb
195
+ - lib/ace/handbook/cli/commands/sync.rb
196
+ - lib/ace/handbook/models/skill_document.rb
197
+ - lib/ace/handbook/molecules/skill_projection.rb
198
+ - lib/ace/handbook/organisms/provider_syncer.rb
199
+ - lib/ace/handbook/organisms/skill_inventory.rb
200
+ - lib/ace/handbook/organisms/status_collector.rb
201
+ - lib/ace/handbook/version.rb
202
+ homepage: https://github.com/cs3b/ace
203
+ licenses:
204
+ - MIT
205
+ metadata:
206
+ homepage_uri: https://github.com/cs3b/ace
207
+ source_code_uri: https://github.com/cs3b/ace/tree/main/ace-handbook/
208
+ changelog_uri: https://github.com/cs3b/ace/blob/main/ace-handbook/CHANGELOG.md
209
+ rdoc_options: []
210
+ require_paths:
211
+ - lib
212
+ required_ruby_version: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: 3.2.0
217
+ required_rubygems_version: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - ">="
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ requirements: []
223
+ rubygems_version: 3.6.9
224
+ specification_version: 4
225
+ summary: Standardized workflows for creating and managing guides, workflow instructions,
226
+ and agent definitions.
227
+ test_files: []