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.
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AgentsSkillVault
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zeitwerk"
4
+ loader = Zeitwerk::Loader.for_gem
5
+ loader.setup
6
+
7
+ module AgentsSkillVault
8
+ end
@@ -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"
@@ -0,0 +1,4 @@
1
+ module AgentsSkillVault
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
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: []