Class: Ace::Handbook::Molecules::SkillProjection

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/handbook/molecules/skill_projection.rb

Constant Summary collapse

LEGACY_PROVIDER_TARGETS =
%w[claude codex gemini opencode pi].freeze

Class Method Summary collapse

Class Method Details

.projected_frontmatter(frontmatter, provider:) ⇒ Object



25
26
27
28
29
30
31
32
# File 'lib/ace/handbook/molecules/skill_projection.rb', line 25

def projected_frontmatter(frontmatter, provider:)
  merged = deep_copy(frontmatter)
  integration = merged.delete("integration") || {}
  provider_meta = integration.fetch("providers", {}).fetch(provider.to_s, {})
  overrides = provider_meta["frontmatter"] || {}

  deep_merge(merged, overrides)
end

.projection_targets(frontmatter, registry:) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/ace/handbook/molecules/skill_projection.rb', line 12

def projection_targets(frontmatter, registry:)
  integration = frontmatter.fetch("integration", {})
  targets = integration["targets"]
  return registry.providers if targets.nil? || targets.empty?

  known_targets = Array(targets).map(&:to_s).select { |provider| registry.known?(provider) }
  if registry.known?("agents") && legacy_provider_target_set?(known_targets)
    known_targets = known_targets + ["agents"]
  end

  known_targets.uniq
end

.render(frontmatter, body) ⇒ Object



34
35
36
37
38
# File 'lib/ace/handbook/molecules/skill_projection.rb', line 34

def render(frontmatter, body)
  yaml = YAML.dump(frontmatter).sub(/\A---\n/, "")
  normalized_body = body.to_s.sub(/\A\n+/, "")
  ["---\n", yaml, "---\n\n", normalized_body].join.rstrip + "\n"
end