agents_skill_vault 0.1.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 +7 -0
- data/AGENTS.md +93 -0
- data/CHANGELOG.md +21 -0
- data/CLAUDE.md +1 -0
- data/CODE_OF_CONDUCT.md +10 -0
- data/CONTRIBUTING.md +64 -0
- data/LICENSE +201 -0
- data/README.md +268 -0
- data/Rakefile +12 -0
- data/lib/agents_skill_vault/errors/base.rb +7 -0
- data/lib/agents_skill_vault/errors/duplicate_label.rb +9 -0
- data/lib/agents_skill_vault/errors/git_not_installed.rb +9 -0
- data/lib/agents_skill_vault/errors/git_version.rb +9 -0
- data/lib/agents_skill_vault/errors/invalid_url.rb +9 -0
- data/lib/agents_skill_vault/errors/not_found.rb +9 -0
- data/lib/agents_skill_vault/errors.rb +6 -0
- data/lib/agents_skill_vault/git_operations.rb +148 -0
- data/lib/agents_skill_vault/manifest.rb +138 -0
- data/lib/agents_skill_vault/resource.rb +235 -0
- data/lib/agents_skill_vault/skill_scanner.rb +74 -0
- data/lib/agents_skill_vault/skill_validator.rb +201 -0
- data/lib/agents_skill_vault/sync_result.rb +44 -0
- data/lib/agents_skill_vault/url_parser.rb +207 -0
- data/lib/agents_skill_vault/vault.rb +789 -0
- data/lib/agents_skill_vault/version.rb +5 -0
- data/lib/agents_skill_vault.rb +8 -0
- data/scripts/manual_test.rb +174 -0
- data/sig/agents_skill_vault.rbs +4 -0
- metadata +115 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "bundler/setup"
|
|
5
|
+
require "agents_skill_vault"
|
|
6
|
+
require "fileutils"
|
|
7
|
+
|
|
8
|
+
# Config
|
|
9
|
+
VAULT_PATH = File.expand_path("~/.demo_skill_vault")
|
|
10
|
+
AUTO_DELETE = ENV["AUTO_DELETE"] == "true"
|
|
11
|
+
URLS = [
|
|
12
|
+
"https://github.com/nateberkopec/dotfiles/tree/main/files/home/.claude/skills",
|
|
13
|
+
"https://github.com/lucianghinda/agentic-skills/skills",
|
|
14
|
+
"https://github.com/thoughtbot/rails-audit-thoughtbot"
|
|
15
|
+
].freeze
|
|
16
|
+
|
|
17
|
+
# Helper methods for output
|
|
18
|
+
def section(title)
|
|
19
|
+
puts "\n#{"=" * 70}"
|
|
20
|
+
puts " #{title}"
|
|
21
|
+
puts "=" * 70
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def print_resource(r)
|
|
25
|
+
status_sym = r.validation_status.to_s.upcase
|
|
26
|
+
status_color = case r.validation_status
|
|
27
|
+
when :valid_skill then "✓"
|
|
28
|
+
when :invalid_skill then "✗"
|
|
29
|
+
when :not_a_skill then "○"
|
|
30
|
+
else "?"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
puts " #{status_color} #{r.label}"
|
|
34
|
+
puts " Type: #{r.type}, URL: #{r.url}"
|
|
35
|
+
puts " Local: #{r.local_path}"
|
|
36
|
+
puts " Skill: #{r.skill_name || "N/A"}"
|
|
37
|
+
puts " Status: #{status_sym}"
|
|
38
|
+
return unless r.validation_errors.any?
|
|
39
|
+
|
|
40
|
+
puts " Errors: #{r.validation_errors.empty? ? "None" : r.validation_errors.join(", ")}"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def print_sync_result(label, result)
|
|
44
|
+
if result.success?
|
|
45
|
+
puts " ✓ #{label}: Synced successfully"
|
|
46
|
+
else
|
|
47
|
+
puts " ✗ #{label}: #{result.error}"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# # 1. Setup
|
|
52
|
+
# section("1. Setup: Create Vault")
|
|
53
|
+
|
|
54
|
+
# if Dir.exist?(VAULT_PATH)
|
|
55
|
+
# puts "Existing vault found at #{VAULT_PATH}"
|
|
56
|
+
# if AUTO_DELETE
|
|
57
|
+
# puts "Auto mode: Deleting existing vault"
|
|
58
|
+
# FileUtils.rm_rf(VAULT_PATH)
|
|
59
|
+
# else
|
|
60
|
+
# print "Delete and recreate? (y/N): "
|
|
61
|
+
# response = $stdin.gets&.chomp
|
|
62
|
+
# if response && response.downcase == "y"
|
|
63
|
+
# FileUtils.rm_rf(VAULT_PATH)
|
|
64
|
+
# puts "Deleted existing vault"
|
|
65
|
+
# else
|
|
66
|
+
# puts "Using existing vault"
|
|
67
|
+
# end
|
|
68
|
+
# end
|
|
69
|
+
# end
|
|
70
|
+
|
|
71
|
+
vault = AgentsSkillVault::Vault.new(storage_path: VAULT_PATH)
|
|
72
|
+
puts "Created vault at: #{vault.storage_path}"
|
|
73
|
+
|
|
74
|
+
# 2. Add Resources
|
|
75
|
+
section("2. Add Resources")
|
|
76
|
+
|
|
77
|
+
added_resources = {}
|
|
78
|
+
URLS.each do |url|
|
|
79
|
+
puts "\nAdding: #{url}"
|
|
80
|
+
result = vault.add(url)
|
|
81
|
+
if result.is_a?(Array)
|
|
82
|
+
puts " → Added #{result.size} resource(s):"
|
|
83
|
+
result.each do |r|
|
|
84
|
+
print_resource(r)
|
|
85
|
+
added_resources[r.label] = r
|
|
86
|
+
end
|
|
87
|
+
else
|
|
88
|
+
print_resource(result)
|
|
89
|
+
added_resources[result.label] = result
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# 3. List Resources
|
|
94
|
+
section("3. List All Resources")
|
|
95
|
+
|
|
96
|
+
resources = vault.list
|
|
97
|
+
puts "\nTotal resources: #{resources.size}"
|
|
98
|
+
resources.each { |r| print_resource(r) }
|
|
99
|
+
|
|
100
|
+
# 4. Query & Filter
|
|
101
|
+
section("4. Query & Filter Resources")
|
|
102
|
+
|
|
103
|
+
puts "\nFilter by username 'nateberkopec':"
|
|
104
|
+
vault.filter_by_username("nateberkopec").each { |r| print_resource(r) }
|
|
105
|
+
|
|
106
|
+
puts "\nFilter by repo 'dotfiles':"
|
|
107
|
+
vault.filter_by_repo("dotfiles").each { |r| print_resource(r) }
|
|
108
|
+
|
|
109
|
+
puts "\nFilter by skill name (first 5):"
|
|
110
|
+
skill_names = resources.map(&:skill_name).compact.uniq.first(5)
|
|
111
|
+
skill_names.each do |name|
|
|
112
|
+
results = vault.filter_by_skill_name(name)
|
|
113
|
+
results.each { |r| print_resource(r) }
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# 5. Validation
|
|
117
|
+
section("5. Validation Status")
|
|
118
|
+
|
|
119
|
+
valid = vault.list_valid_skills
|
|
120
|
+
invalid = vault.list_invalid_skills
|
|
121
|
+
non_skills = vault.list_non_skills
|
|
122
|
+
unvalidated = vault.list_unvalidated
|
|
123
|
+
|
|
124
|
+
puts "\nValid skills (#{valid.size}):"
|
|
125
|
+
valid.each { |r| puts " ✓ #{r.label}" }
|
|
126
|
+
|
|
127
|
+
puts "\nInvalid skills (#{invalid.size}):"
|
|
128
|
+
invalid.each { |r| puts " ✗ #{r.label} - #{r.validation_errors.join(", ")}" }
|
|
129
|
+
|
|
130
|
+
puts "\nNon-skill resources (#{non_skills.size}):"
|
|
131
|
+
non_skills.each { |r| puts " ○ #{r.label}" }
|
|
132
|
+
|
|
133
|
+
puts "\nUnvalidated resources (#{unvalidated.size}):"
|
|
134
|
+
unvalidated.each { |r| puts " ? #{r.label}" }
|
|
135
|
+
|
|
136
|
+
# 6. Sync
|
|
137
|
+
section("6. Sync Resources")
|
|
138
|
+
|
|
139
|
+
puts "\nSyncing all resources..."
|
|
140
|
+
results = vault.sync_all
|
|
141
|
+
results.each { |label, result| print_sync_result(label, result) }
|
|
142
|
+
|
|
143
|
+
# 7. Remove
|
|
144
|
+
section("7. Remove Resource")
|
|
145
|
+
|
|
146
|
+
if added_resources.any?
|
|
147
|
+
first_label = added_resources.keys.first
|
|
148
|
+
puts "\nRemoving resource: #{first_label}"
|
|
149
|
+
vault.remove(first_label, delete_files: false)
|
|
150
|
+
puts " Removed from manifest (files kept)"
|
|
151
|
+
puts "\nRemaining resources: #{vault.list.size}"
|
|
152
|
+
else
|
|
153
|
+
puts "\nNo resources to remove"
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# 8. Export
|
|
157
|
+
section("8. Export Manifest")
|
|
158
|
+
|
|
159
|
+
export_path = File.join(Dir.pwd, "demo_manifest.json")
|
|
160
|
+
vault.export_manifest(export_path)
|
|
161
|
+
puts "Exported manifest to: #{export_path}"
|
|
162
|
+
|
|
163
|
+
if File.exist?(export_path)
|
|
164
|
+
data = JSON.parse(File.read(export_path))
|
|
165
|
+
puts "\nManifest contents:"
|
|
166
|
+
puts " Version: #{data["version"]}"
|
|
167
|
+
puts " Resources: #{data["resources"].size}"
|
|
168
|
+
puts " Labels: #{data["resources"].map { |r| r["label"] }.join(", ")}"
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# 9. Cleanup
|
|
172
|
+
section("Demo Complete!")
|
|
173
|
+
puts "\nYou can paste this script into bin/console or run standalone with:"
|
|
174
|
+
puts " ruby scripts/demo.rb"
|
metadata
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: agents_skill_vault
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Lucian Ghinda
|
|
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: addressable
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '2.8'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '2.8'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: zeitwerk
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '2.6'
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '2.6'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: mocha
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '2.0'
|
|
47
|
+
type: :development
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - "~>"
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '2.0'
|
|
54
|
+
description: AgentsSkillVault provides a simple interface to clone, sync, and manage
|
|
55
|
+
AI agent skills stored in GitHub repositories, supporting full repos, folders, and
|
|
56
|
+
individual files.
|
|
57
|
+
email:
|
|
58
|
+
- lucian@shortruby.com
|
|
59
|
+
executables: []
|
|
60
|
+
extensions: []
|
|
61
|
+
extra_rdoc_files: []
|
|
62
|
+
files:
|
|
63
|
+
- AGENTS.md
|
|
64
|
+
- CHANGELOG.md
|
|
65
|
+
- CLAUDE.md
|
|
66
|
+
- CODE_OF_CONDUCT.md
|
|
67
|
+
- CONTRIBUTING.md
|
|
68
|
+
- LICENSE
|
|
69
|
+
- README.md
|
|
70
|
+
- Rakefile
|
|
71
|
+
- lib/agents_skill_vault.rb
|
|
72
|
+
- lib/agents_skill_vault/errors.rb
|
|
73
|
+
- lib/agents_skill_vault/errors/base.rb
|
|
74
|
+
- lib/agents_skill_vault/errors/duplicate_label.rb
|
|
75
|
+
- lib/agents_skill_vault/errors/git_not_installed.rb
|
|
76
|
+
- lib/agents_skill_vault/errors/git_version.rb
|
|
77
|
+
- lib/agents_skill_vault/errors/invalid_url.rb
|
|
78
|
+
- lib/agents_skill_vault/errors/not_found.rb
|
|
79
|
+
- lib/agents_skill_vault/git_operations.rb
|
|
80
|
+
- lib/agents_skill_vault/manifest.rb
|
|
81
|
+
- lib/agents_skill_vault/resource.rb
|
|
82
|
+
- lib/agents_skill_vault/skill_scanner.rb
|
|
83
|
+
- lib/agents_skill_vault/skill_validator.rb
|
|
84
|
+
- lib/agents_skill_vault/sync_result.rb
|
|
85
|
+
- lib/agents_skill_vault/url_parser.rb
|
|
86
|
+
- lib/agents_skill_vault/vault.rb
|
|
87
|
+
- lib/agents_skill_vault/version.rb
|
|
88
|
+
- scripts/manual_test.rb
|
|
89
|
+
- sig/agents_skill_vault.rbs
|
|
90
|
+
homepage: https://github.com/lucianghinda/agents_skill_vault
|
|
91
|
+
licenses:
|
|
92
|
+
- Apache-2.0
|
|
93
|
+
metadata:
|
|
94
|
+
rubygems_mfa_required: 'true'
|
|
95
|
+
homepage_uri: https://github.com/lucianghinda/agents_skill_vault
|
|
96
|
+
source_code_uri: https://github.com/lucianghinda/agents_skill_vault
|
|
97
|
+
changelog_uri: https://github.com/lucianghinda/agents_skill_vault/blob/main/CHANGELOG.md
|
|
98
|
+
rdoc_options: []
|
|
99
|
+
require_paths:
|
|
100
|
+
- lib
|
|
101
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
102
|
+
requirements:
|
|
103
|
+
- - ">="
|
|
104
|
+
- !ruby/object:Gem::Version
|
|
105
|
+
version: 3.4.0
|
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - ">="
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0'
|
|
111
|
+
requirements: []
|
|
112
|
+
rubygems_version: 4.0.3
|
|
113
|
+
specification_version: 4
|
|
114
|
+
summary: A Ruby gem for managing AI agent skills from GitHub repositories.
|
|
115
|
+
test_files: []
|