skillme 0.1.0 → 0.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 114461d15862bc97dd38791b09feb6920983fe95c0a5cdd87a3338f48fb5fbb8
4
- data.tar.gz: 6d1fb4e10336c2f7ed9522041411901014fd96a0557627a47f7ae2164b26c932
3
+ metadata.gz: 56b29a9df63a256900713335803df0035a290d77bb7c19c2a26c48b4365708ba
4
+ data.tar.gz: abee98c8703a0a633c36ad0e752c5f6d288f6c0588e13ebe582d6ac133648849
5
5
  SHA512:
6
- metadata.gz: 053ec30034ed3b461a927ceac34c997d002d6443c7cc702e95e967d8d4c015b9b90c9aeea9b4439e784a067166fc7b90295c297836e1a4db83acdc545b8fe43d
7
- data.tar.gz: a9a8ee3f27643c6628fd621c4fa7af789597dbb6b06d87cc0d741eaff02fa1089d9c131e07194d7d5e6443e4b4136165a8fe7f8f8dd871da1bf562049916a755
6
+ metadata.gz: 0c0bae8b473c873ccac48f3c41a84acf64c90e9caa4d6390252176787cbb8d3a639ee086d509341e4a5cb7b3a56c7f7cef0a8742e46cfce75f3c1ae6f952ea6e
7
+ data.tar.gz: 763765e7c24758b1f767a332512ecdb28d0af5d9a504f1c601a81dabcd560f2771f587af7fc0e95e2ec6c8ed4be46d9d80c0770acc300c0434c7f179f54cbd71
data/README.md CHANGED
@@ -15,22 +15,22 @@ gem install skillme
15
15
  skillme list
16
16
 
17
17
  # Install a skill (global — works in all projects)
18
- skillme install spreadsheet
18
+ skillme install google-sheets
19
19
 
20
20
  # Install for current project only
21
- skillme install spreadsheet --local
21
+ skillme install google-sheets --local
22
22
 
23
23
  # Remove a skill
24
- skillme remove spreadsheet
24
+ skillme remove google-sheets
25
25
  ```
26
26
 
27
- After installing, use `/spreadsheet` (or any skill name) directly in Claude Code.
27
+ After installing, use `/google-sheets` (or any skill name) directly in Claude Code.
28
28
 
29
29
  ## Available Skills
30
30
 
31
31
  | Skill | Description |
32
32
  |-------|-------------|
33
- | spreadsheet | Read and write Google Sheets via REST API |
33
+ | google-sheets | Read and write Google Sheets via gws CLI |
34
34
 
35
35
  ## Why Ruby
36
36
 
data/lib/skillme/cli.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  require 'json'
2
+ require 'yaml'
2
3
  require 'net/http'
3
4
  require 'uri'
4
5
  require 'fileutils'
5
6
  require_relative 'version'
7
+ require_relative 'deps'
6
8
 
7
9
  module Skillme
8
10
  class CLI
@@ -58,6 +60,16 @@ module Skillme
58
60
  File.write(file_path, content)
59
61
  end
60
62
 
63
+ # Resolve dependencies from SKILL.md frontmatter
64
+ skill_md_path = File.join(skill_dir, "SKILL.md")
65
+ if File.exist?(skill_md_path)
66
+ frontmatter = parse_frontmatter(File.read(skill_md_path))
67
+ if frontmatter['dependencies']
68
+ puts "Resolving dependencies..."
69
+ Deps.resolve!(frontmatter['dependencies'])
70
+ end
71
+ end
72
+
61
73
  puts "Installed '#{name}' to #{skill_dir}"
62
74
  puts "Use /#{name} in Claude Code to get started."
63
75
  end
@@ -139,14 +151,19 @@ module Skillme
139
151
  end
140
152
  end
141
153
 
142
- def extract_description(skill_md_content)
143
- if skill_md_content =~ /^description:\s*(.+)$/
144
- $1.strip
154
+ def parse_frontmatter(content)
155
+ if content =~ /\A---\s*\n(.+?)\n---/m
156
+ YAML.safe_load($1) || {}
145
157
  else
146
- "(no description)"
158
+ {}
147
159
  end
148
160
  end
149
161
 
162
+ def extract_description(skill_md_content)
163
+ fm = parse_frontmatter(skill_md_content)
164
+ fm['description'] || "(no description)"
165
+ end
166
+
150
167
  def fetch_github_tree
151
168
  uri = URI("https://api.github.com/repos/#{REPO}/git/trees/#{BRANCH}?recursive=1")
152
169
  response = github_get(uri)
@@ -0,0 +1,118 @@
1
+ require 'json'
2
+
3
+ module Skillme
4
+ module Deps
5
+ extend self
6
+
7
+ def detect_os
8
+ case RUBY_PLATFORM
9
+ when /darwin/
10
+ :macos
11
+ when /linux/
12
+ return :debian if File.exist?('/etc/debian_version')
13
+ return :fedora if File.exist?('/etc/fedora-release') || File.exist?('/etc/redhat-release')
14
+ return :arch if File.exist?('/etc/arch-release')
15
+ :unknown
16
+ else
17
+ :unknown
18
+ end
19
+ end
20
+
21
+ def command_exists?(cmd)
22
+ system("command -v #{cmd} > /dev/null 2>&1")
23
+ end
24
+
25
+ def ensure_node!
26
+ return if command_exists?('node') && command_exists?('npm')
27
+
28
+ os = detect_os
29
+ puts "Node.js not found. Installing for #{os}..."
30
+
31
+ case os
32
+ when :macos then install_node_macos
33
+ when :debian then install_node_debian
34
+ when :fedora then install_node_fedora
35
+ when :arch then install_node_arch
36
+ else
37
+ abort <<~MSG
38
+ Could not detect your OS. Please install Node.js manually:
39
+ https://nodejs.org/en/download
40
+ Then run `skillme install` again.
41
+ MSG
42
+ end
43
+
44
+ unless command_exists?('node')
45
+ abort "Failed to install Node.js. Please install it manually and try again."
46
+ end
47
+
48
+ puts "Node.js installed successfully."
49
+ end
50
+
51
+ def ensure_npm_package!(package)
52
+ # Check if the package binary exists (e.g. gws for @googleworkspace/cli)
53
+ bin_name = package.split('/').last.sub(/^cli$/, 'gws')
54
+ return if command_exists?(bin_name)
55
+
56
+ ensure_node!
57
+
58
+ puts "Installing #{package}..."
59
+ unless system("npm install -g #{package} > /dev/null 2>&1")
60
+ abort "Failed to install #{package}. Try manually: npm install -g #{package}"
61
+ end
62
+
63
+ puts "#{package} installed successfully."
64
+ end
65
+
66
+ def resolve!(dependencies)
67
+ return unless dependencies
68
+
69
+ if dependencies['npm']
70
+ dependencies['npm'].each do |package|
71
+ ensure_npm_package!(package)
72
+ end
73
+ end
74
+
75
+ ensure_gws_auth! if dependencies.dig('npm')&.include?('@googleworkspace/cli')
76
+ end
77
+
78
+ def ensure_gws_auth!
79
+ # Check if gws is already authenticated
80
+ return if system("gws auth export > /dev/null 2>&1")
81
+
82
+ puts "Setting up Google authentication (opens browser)..."
83
+ system("gws auth setup")
84
+ end
85
+
86
+ private
87
+
88
+ def install_node_macos
89
+ unless command_exists?('brew')
90
+ puts "Homebrew not found. Installing Homebrew..."
91
+ system('/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"')
92
+ unless command_exists?('brew')
93
+ abort "Failed to install Homebrew. Please install Node.js manually."
94
+ end
95
+ end
96
+
97
+ system("brew install node")
98
+ end
99
+
100
+ def install_node_debian
101
+ system(<<~SH)
102
+ curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - > /dev/null 2>&1 && \
103
+ sudo apt-get install -y nodejs > /dev/null 2>&1
104
+ SH
105
+ end
106
+
107
+ def install_node_fedora
108
+ system(<<~SH)
109
+ curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash - > /dev/null 2>&1 && \
110
+ sudo yum install -y nodejs > /dev/null 2>&1
111
+ SH
112
+ end
113
+
114
+ def install_node_arch
115
+ system("sudo pacman -S --noconfirm nodejs npm > /dev/null 2>&1")
116
+ end
117
+ end
118
+ end
@@ -1,3 +1,3 @@
1
1
  module Skillme
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skillme
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alan Alves
@@ -22,6 +22,7 @@ files:
22
22
  - README.md
23
23
  - bin/skillme
24
24
  - lib/skillme/cli.rb
25
+ - lib/skillme/deps.rb
25
26
  - lib/skillme/version.rb
26
27
  homepage: https://github.com/alanalvestech/skillme
27
28
  licenses: