Class: RailsAiBridge::Registry::TileManifest

Inherits:
Data
  • Object
show all
Defined in:
lib/rails_ai_bridge/registry/tile_manifest.rb

Overview

Immutable value object describing a pack's full catalog of skills and agents.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Attribute Details

#agentsObject (readonly)

Returns the value of attribute agents

Returns:

  • (Object)

    the current value of agents



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/rails_ai_bridge/registry/tile_manifest.rb', line 55

TileManifest = Data.define(:name, :version, :summary, :depends_on, :skills, :agents, :deprecated_skills) do
  # Builds a {TileManifest} from a parsed JSON hash.
  #
  # @param hash [Hash] parsed JSON object
  # @return [TileManifest]
  def self.from_json(hash)
    new(
      name: hash.fetch('name'),
      version: hash.fetch('version'),
      summary: hash['summary'],
      depends_on: hash.fetch('depends_on', []),
      skills: parse_skills(hash['skills'] || {}),
      agents: parse_agents(hash['agents'] || {}),
      deprecated_skills: parse_deprecated(hash['deprecated_skills'] || {})
    )
  rescue KeyError => error
    raise ArgumentError, "Tile manifest missing required field: #{error.key}"
  end

  # Loads and parses a tile manifest from a JSON file on disk.
  #
  # @param path [String] path to the tile JSON file
  # @return [TileManifest]
  # @raise [ArgumentError] if the file does not exist, cannot be read, or contains malformed JSON
  def self.from_file(path)
    from_json(JSON.parse(File.read(path)))
  rescue JSON::ParserError => error
    raise ArgumentError, "Tile manifest at '#{path}' contains invalid JSON: #{error.message}"
  rescue SystemCallError => error
    raise ArgumentError, "Tile manifest at '#{path}' could not be read: #{error.message}"
  end

  # @api private
  def self.parse_skills(skills_hash)
    skills_hash.transform_values do |skill_data|
      SkillEntry.new(
        path: skill_data.fetch('path'),
        description: skill_data['description'],
        tags: skill_data.fetch('tags', [])
      )
    rescue KeyError => error
      raise ArgumentError, "Skill entry missing required field: #{error.key}"
    end
  end

  # @api private
  def self.parse_agents(agents_hash)
    agents_hash.transform_values do |agent_data|
      AgentEntry.new(
        path: agent_data.fetch('path'),
        description: agent_data['description'],
        depends_on: agent_data.fetch('depends_on', [])
      )
    rescue KeyError => error
      raise ArgumentError, "Agent entry missing required field: #{error.key}"
    end
  end

  # @api private
  def self.parse_deprecated(deprecated_hash)
    deprecated_hash.transform_values do |entry_data|
      DeprecatedEntry.new(
        moved_to: entry_data.fetch('moved_to'),
        message: entry_data.fetch('message'),
        removed_in: entry_data['removed_in']
      )
    rescue KeyError => error
      raise ArgumentError, "Deprecated skill entry missing required field: #{error.key}"
    end
  end

  private_class_method :parse_skills, :parse_agents, :parse_deprecated
end

#depends_onObject (readonly)

Returns the value of attribute depends_on

Returns:

  • (Object)

    the current value of depends_on



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/rails_ai_bridge/registry/tile_manifest.rb', line 55

TileManifest = Data.define(:name, :version, :summary, :depends_on, :skills, :agents, :deprecated_skills) do
  # Builds a {TileManifest} from a parsed JSON hash.
  #
  # @param hash [Hash] parsed JSON object
  # @return [TileManifest]
  def self.from_json(hash)
    new(
      name: hash.fetch('name'),
      version: hash.fetch('version'),
      summary: hash['summary'],
      depends_on: hash.fetch('depends_on', []),
      skills: parse_skills(hash['skills'] || {}),
      agents: parse_agents(hash['agents'] || {}),
      deprecated_skills: parse_deprecated(hash['deprecated_skills'] || {})
    )
  rescue KeyError => error
    raise ArgumentError, "Tile manifest missing required field: #{error.key}"
  end

  # Loads and parses a tile manifest from a JSON file on disk.
  #
  # @param path [String] path to the tile JSON file
  # @return [TileManifest]
  # @raise [ArgumentError] if the file does not exist, cannot be read, or contains malformed JSON
  def self.from_file(path)
    from_json(JSON.parse(File.read(path)))
  rescue JSON::ParserError => error
    raise ArgumentError, "Tile manifest at '#{path}' contains invalid JSON: #{error.message}"
  rescue SystemCallError => error
    raise ArgumentError, "Tile manifest at '#{path}' could not be read: #{error.message}"
  end

  # @api private
  def self.parse_skills(skills_hash)
    skills_hash.transform_values do |skill_data|
      SkillEntry.new(
        path: skill_data.fetch('path'),
        description: skill_data['description'],
        tags: skill_data.fetch('tags', [])
      )
    rescue KeyError => error
      raise ArgumentError, "Skill entry missing required field: #{error.key}"
    end
  end

  # @api private
  def self.parse_agents(agents_hash)
    agents_hash.transform_values do |agent_data|
      AgentEntry.new(
        path: agent_data.fetch('path'),
        description: agent_data['description'],
        depends_on: agent_data.fetch('depends_on', [])
      )
    rescue KeyError => error
      raise ArgumentError, "Agent entry missing required field: #{error.key}"
    end
  end

  # @api private
  def self.parse_deprecated(deprecated_hash)
    deprecated_hash.transform_values do |entry_data|
      DeprecatedEntry.new(
        moved_to: entry_data.fetch('moved_to'),
        message: entry_data.fetch('message'),
        removed_in: entry_data['removed_in']
      )
    rescue KeyError => error
      raise ArgumentError, "Deprecated skill entry missing required field: #{error.key}"
    end
  end

  private_class_method :parse_skills, :parse_agents, :parse_deprecated
end

#deprecated_skillsObject (readonly)

Returns the value of attribute deprecated_skills

Returns:

  • (Object)

    the current value of deprecated_skills



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/rails_ai_bridge/registry/tile_manifest.rb', line 55

TileManifest = Data.define(:name, :version, :summary, :depends_on, :skills, :agents, :deprecated_skills) do
  # Builds a {TileManifest} from a parsed JSON hash.
  #
  # @param hash [Hash] parsed JSON object
  # @return [TileManifest]
  def self.from_json(hash)
    new(
      name: hash.fetch('name'),
      version: hash.fetch('version'),
      summary: hash['summary'],
      depends_on: hash.fetch('depends_on', []),
      skills: parse_skills(hash['skills'] || {}),
      agents: parse_agents(hash['agents'] || {}),
      deprecated_skills: parse_deprecated(hash['deprecated_skills'] || {})
    )
  rescue KeyError => error
    raise ArgumentError, "Tile manifest missing required field: #{error.key}"
  end

  # Loads and parses a tile manifest from a JSON file on disk.
  #
  # @param path [String] path to the tile JSON file
  # @return [TileManifest]
  # @raise [ArgumentError] if the file does not exist, cannot be read, or contains malformed JSON
  def self.from_file(path)
    from_json(JSON.parse(File.read(path)))
  rescue JSON::ParserError => error
    raise ArgumentError, "Tile manifest at '#{path}' contains invalid JSON: #{error.message}"
  rescue SystemCallError => error
    raise ArgumentError, "Tile manifest at '#{path}' could not be read: #{error.message}"
  end

  # @api private
  def self.parse_skills(skills_hash)
    skills_hash.transform_values do |skill_data|
      SkillEntry.new(
        path: skill_data.fetch('path'),
        description: skill_data['description'],
        tags: skill_data.fetch('tags', [])
      )
    rescue KeyError => error
      raise ArgumentError, "Skill entry missing required field: #{error.key}"
    end
  end

  # @api private
  def self.parse_agents(agents_hash)
    agents_hash.transform_values do |agent_data|
      AgentEntry.new(
        path: agent_data.fetch('path'),
        description: agent_data['description'],
        depends_on: agent_data.fetch('depends_on', [])
      )
    rescue KeyError => error
      raise ArgumentError, "Agent entry missing required field: #{error.key}"
    end
  end

  # @api private
  def self.parse_deprecated(deprecated_hash)
    deprecated_hash.transform_values do |entry_data|
      DeprecatedEntry.new(
        moved_to: entry_data.fetch('moved_to'),
        message: entry_data.fetch('message'),
        removed_in: entry_data['removed_in']
      )
    rescue KeyError => error
      raise ArgumentError, "Deprecated skill entry missing required field: #{error.key}"
    end
  end

  private_class_method :parse_skills, :parse_agents, :parse_deprecated
end

#nameObject (readonly)

Returns the value of attribute name

Returns:

  • (Object)

    the current value of name



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/rails_ai_bridge/registry/tile_manifest.rb', line 55

TileManifest = Data.define(:name, :version, :summary, :depends_on, :skills, :agents, :deprecated_skills) do
  # Builds a {TileManifest} from a parsed JSON hash.
  #
  # @param hash [Hash] parsed JSON object
  # @return [TileManifest]
  def self.from_json(hash)
    new(
      name: hash.fetch('name'),
      version: hash.fetch('version'),
      summary: hash['summary'],
      depends_on: hash.fetch('depends_on', []),
      skills: parse_skills(hash['skills'] || {}),
      agents: parse_agents(hash['agents'] || {}),
      deprecated_skills: parse_deprecated(hash['deprecated_skills'] || {})
    )
  rescue KeyError => error
    raise ArgumentError, "Tile manifest missing required field: #{error.key}"
  end

  # Loads and parses a tile manifest from a JSON file on disk.
  #
  # @param path [String] path to the tile JSON file
  # @return [TileManifest]
  # @raise [ArgumentError] if the file does not exist, cannot be read, or contains malformed JSON
  def self.from_file(path)
    from_json(JSON.parse(File.read(path)))
  rescue JSON::ParserError => error
    raise ArgumentError, "Tile manifest at '#{path}' contains invalid JSON: #{error.message}"
  rescue SystemCallError => error
    raise ArgumentError, "Tile manifest at '#{path}' could not be read: #{error.message}"
  end

  # @api private
  def self.parse_skills(skills_hash)
    skills_hash.transform_values do |skill_data|
      SkillEntry.new(
        path: skill_data.fetch('path'),
        description: skill_data['description'],
        tags: skill_data.fetch('tags', [])
      )
    rescue KeyError => error
      raise ArgumentError, "Skill entry missing required field: #{error.key}"
    end
  end

  # @api private
  def self.parse_agents(agents_hash)
    agents_hash.transform_values do |agent_data|
      AgentEntry.new(
        path: agent_data.fetch('path'),
        description: agent_data['description'],
        depends_on: agent_data.fetch('depends_on', [])
      )
    rescue KeyError => error
      raise ArgumentError, "Agent entry missing required field: #{error.key}"
    end
  end

  # @api private
  def self.parse_deprecated(deprecated_hash)
    deprecated_hash.transform_values do |entry_data|
      DeprecatedEntry.new(
        moved_to: entry_data.fetch('moved_to'),
        message: entry_data.fetch('message'),
        removed_in: entry_data['removed_in']
      )
    rescue KeyError => error
      raise ArgumentError, "Deprecated skill entry missing required field: #{error.key}"
    end
  end

  private_class_method :parse_skills, :parse_agents, :parse_deprecated
end

#skillsObject (readonly)

Returns the value of attribute skills

Returns:

  • (Object)

    the current value of skills



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/rails_ai_bridge/registry/tile_manifest.rb', line 55

TileManifest = Data.define(:name, :version, :summary, :depends_on, :skills, :agents, :deprecated_skills) do
  # Builds a {TileManifest} from a parsed JSON hash.
  #
  # @param hash [Hash] parsed JSON object
  # @return [TileManifest]
  def self.from_json(hash)
    new(
      name: hash.fetch('name'),
      version: hash.fetch('version'),
      summary: hash['summary'],
      depends_on: hash.fetch('depends_on', []),
      skills: parse_skills(hash['skills'] || {}),
      agents: parse_agents(hash['agents'] || {}),
      deprecated_skills: parse_deprecated(hash['deprecated_skills'] || {})
    )
  rescue KeyError => error
    raise ArgumentError, "Tile manifest missing required field: #{error.key}"
  end

  # Loads and parses a tile manifest from a JSON file on disk.
  #
  # @param path [String] path to the tile JSON file
  # @return [TileManifest]
  # @raise [ArgumentError] if the file does not exist, cannot be read, or contains malformed JSON
  def self.from_file(path)
    from_json(JSON.parse(File.read(path)))
  rescue JSON::ParserError => error
    raise ArgumentError, "Tile manifest at '#{path}' contains invalid JSON: #{error.message}"
  rescue SystemCallError => error
    raise ArgumentError, "Tile manifest at '#{path}' could not be read: #{error.message}"
  end

  # @api private
  def self.parse_skills(skills_hash)
    skills_hash.transform_values do |skill_data|
      SkillEntry.new(
        path: skill_data.fetch('path'),
        description: skill_data['description'],
        tags: skill_data.fetch('tags', [])
      )
    rescue KeyError => error
      raise ArgumentError, "Skill entry missing required field: #{error.key}"
    end
  end

  # @api private
  def self.parse_agents(agents_hash)
    agents_hash.transform_values do |agent_data|
      AgentEntry.new(
        path: agent_data.fetch('path'),
        description: agent_data['description'],
        depends_on: agent_data.fetch('depends_on', [])
      )
    rescue KeyError => error
      raise ArgumentError, "Agent entry missing required field: #{error.key}"
    end
  end

  # @api private
  def self.parse_deprecated(deprecated_hash)
    deprecated_hash.transform_values do |entry_data|
      DeprecatedEntry.new(
        moved_to: entry_data.fetch('moved_to'),
        message: entry_data.fetch('message'),
        removed_in: entry_data['removed_in']
      )
    rescue KeyError => error
      raise ArgumentError, "Deprecated skill entry missing required field: #{error.key}"
    end
  end

  private_class_method :parse_skills, :parse_agents, :parse_deprecated
end

#summaryObject (readonly)

Returns the value of attribute summary

Returns:

  • (Object)

    the current value of summary



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/rails_ai_bridge/registry/tile_manifest.rb', line 55

TileManifest = Data.define(:name, :version, :summary, :depends_on, :skills, :agents, :deprecated_skills) do
  # Builds a {TileManifest} from a parsed JSON hash.
  #
  # @param hash [Hash] parsed JSON object
  # @return [TileManifest]
  def self.from_json(hash)
    new(
      name: hash.fetch('name'),
      version: hash.fetch('version'),
      summary: hash['summary'],
      depends_on: hash.fetch('depends_on', []),
      skills: parse_skills(hash['skills'] || {}),
      agents: parse_agents(hash['agents'] || {}),
      deprecated_skills: parse_deprecated(hash['deprecated_skills'] || {})
    )
  rescue KeyError => error
    raise ArgumentError, "Tile manifest missing required field: #{error.key}"
  end

  # Loads and parses a tile manifest from a JSON file on disk.
  #
  # @param path [String] path to the tile JSON file
  # @return [TileManifest]
  # @raise [ArgumentError] if the file does not exist, cannot be read, or contains malformed JSON
  def self.from_file(path)
    from_json(JSON.parse(File.read(path)))
  rescue JSON::ParserError => error
    raise ArgumentError, "Tile manifest at '#{path}' contains invalid JSON: #{error.message}"
  rescue SystemCallError => error
    raise ArgumentError, "Tile manifest at '#{path}' could not be read: #{error.message}"
  end

  # @api private
  def self.parse_skills(skills_hash)
    skills_hash.transform_values do |skill_data|
      SkillEntry.new(
        path: skill_data.fetch('path'),
        description: skill_data['description'],
        tags: skill_data.fetch('tags', [])
      )
    rescue KeyError => error
      raise ArgumentError, "Skill entry missing required field: #{error.key}"
    end
  end

  # @api private
  def self.parse_agents(agents_hash)
    agents_hash.transform_values do |agent_data|
      AgentEntry.new(
        path: agent_data.fetch('path'),
        description: agent_data['description'],
        depends_on: agent_data.fetch('depends_on', [])
      )
    rescue KeyError => error
      raise ArgumentError, "Agent entry missing required field: #{error.key}"
    end
  end

  # @api private
  def self.parse_deprecated(deprecated_hash)
    deprecated_hash.transform_values do |entry_data|
      DeprecatedEntry.new(
        moved_to: entry_data.fetch('moved_to'),
        message: entry_data.fetch('message'),
        removed_in: entry_data['removed_in']
      )
    rescue KeyError => error
      raise ArgumentError, "Deprecated skill entry missing required field: #{error.key}"
    end
  end

  private_class_method :parse_skills, :parse_agents, :parse_deprecated
end

#versionObject (readonly)

Returns the value of attribute version

Returns:

  • (Object)

    the current value of version



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/rails_ai_bridge/registry/tile_manifest.rb', line 55

TileManifest = Data.define(:name, :version, :summary, :depends_on, :skills, :agents, :deprecated_skills) do
  # Builds a {TileManifest} from a parsed JSON hash.
  #
  # @param hash [Hash] parsed JSON object
  # @return [TileManifest]
  def self.from_json(hash)
    new(
      name: hash.fetch('name'),
      version: hash.fetch('version'),
      summary: hash['summary'],
      depends_on: hash.fetch('depends_on', []),
      skills: parse_skills(hash['skills'] || {}),
      agents: parse_agents(hash['agents'] || {}),
      deprecated_skills: parse_deprecated(hash['deprecated_skills'] || {})
    )
  rescue KeyError => error
    raise ArgumentError, "Tile manifest missing required field: #{error.key}"
  end

  # Loads and parses a tile manifest from a JSON file on disk.
  #
  # @param path [String] path to the tile JSON file
  # @return [TileManifest]
  # @raise [ArgumentError] if the file does not exist, cannot be read, or contains malformed JSON
  def self.from_file(path)
    from_json(JSON.parse(File.read(path)))
  rescue JSON::ParserError => error
    raise ArgumentError, "Tile manifest at '#{path}' contains invalid JSON: #{error.message}"
  rescue SystemCallError => error
    raise ArgumentError, "Tile manifest at '#{path}' could not be read: #{error.message}"
  end

  # @api private
  def self.parse_skills(skills_hash)
    skills_hash.transform_values do |skill_data|
      SkillEntry.new(
        path: skill_data.fetch('path'),
        description: skill_data['description'],
        tags: skill_data.fetch('tags', [])
      )
    rescue KeyError => error
      raise ArgumentError, "Skill entry missing required field: #{error.key}"
    end
  end

  # @api private
  def self.parse_agents(agents_hash)
    agents_hash.transform_values do |agent_data|
      AgentEntry.new(
        path: agent_data.fetch('path'),
        description: agent_data['description'],
        depends_on: agent_data.fetch('depends_on', [])
      )
    rescue KeyError => error
      raise ArgumentError, "Agent entry missing required field: #{error.key}"
    end
  end

  # @api private
  def self.parse_deprecated(deprecated_hash)
    deprecated_hash.transform_values do |entry_data|
      DeprecatedEntry.new(
        moved_to: entry_data.fetch('moved_to'),
        message: entry_data.fetch('message'),
        removed_in: entry_data['removed_in']
      )
    rescue KeyError => error
      raise ArgumentError, "Deprecated skill entry missing required field: #{error.key}"
    end
  end

  private_class_method :parse_skills, :parse_agents, :parse_deprecated
end

Class Method Details

.from_file(path) ⇒ TileManifest

Loads and parses a tile manifest from a JSON file on disk.

Parameters:

  • path (String)

    path to the tile JSON file

Returns:

Raises:

  • (ArgumentError)

    if the file does not exist, cannot be read, or contains malformed JSON



79
80
81
82
83
84
85
# File 'lib/rails_ai_bridge/registry/tile_manifest.rb', line 79

def self.from_file(path)
  from_json(JSON.parse(File.read(path)))
rescue JSON::ParserError => error
  raise ArgumentError, "Tile manifest at '#{path}' contains invalid JSON: #{error.message}"
rescue SystemCallError => error
  raise ArgumentError, "Tile manifest at '#{path}' could not be read: #{error.message}"
end

.from_json(hash) ⇒ TileManifest

Builds a RailsAiBridge::Registry::TileManifest from a parsed JSON hash.

Parameters:

  • hash (Hash)

    parsed JSON object

Returns:



60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/rails_ai_bridge/registry/tile_manifest.rb', line 60

def self.from_json(hash)
  new(
    name: hash.fetch('name'),
    version: hash.fetch('version'),
    summary: hash['summary'],
    depends_on: hash.fetch('depends_on', []),
    skills: parse_skills(hash['skills'] || {}),
    agents: parse_agents(hash['agents'] || {}),
    deprecated_skills: parse_deprecated(hash['deprecated_skills'] || {})
  )
rescue KeyError => error
  raise ArgumentError, "Tile manifest missing required field: #{error.key}"
end