kairos-chain 3.3.0 → 3.3.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 +4 -4
- data/CHANGELOG.md +11 -0
- data/bin/kairos-chain +20 -8
- data/lib/kairos_mcp/skillset_manager.rb +32 -7
- data/lib/kairos_mcp/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3bbb98fc197f37790e8cf89fa3b33320fcc344f893da8550b22c26a72d60db7b
|
|
4
|
+
data.tar.gz: f0f7851aabb13ba39be6a0e9408c31dec843386427326bdb4f301a2adb2685ac
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c5e75b31dc9f1f511e998d58671d6d13bc7252c3b69323f5c28f5265856a80e4fcaed6f64a5ac031ef480471eb69f7a232a76569e68fdcf2899ce1338a9f2bfc
|
|
7
|
+
data.tar.gz: f298c8d3897a4b4fc336cd79c9f9586e44200b4fb9a75ebb6ed35a320b8112b9ab56eac5ec6a53936dd549113f596b8ee3f230e2950d76d42236eede05a7d611
|
data/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,17 @@ All notable changes to the `kairos-chain` gem will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
This project follows [Semantic Versioning](https://semver.org/).
|
|
6
6
|
|
|
7
|
+
## [3.3.1] - 2026-03-24
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **`kairos-chain skillset install` short name resolution**: `kairos-chain skillset install mmp`
|
|
12
|
+
now resolves to gem's `templates/skillsets/mmp/` automatically. Previously required full path.
|
|
13
|
+
- **`kairos-chain skillset install --force`**: New flag for reinstalling/updating existing SkillSets.
|
|
14
|
+
Preserves user config files (`config/*.yml`) during reinstall.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
7
18
|
## [3.3.0] - 2026-03-24
|
|
8
19
|
|
|
9
20
|
### Added
|
data/bin/kairos-chain
CHANGED
|
@@ -68,16 +68,28 @@ when 'skillset'
|
|
|
68
68
|
when 'install'
|
|
69
69
|
source = ARGV.shift
|
|
70
70
|
unless source
|
|
71
|
-
$stderr.puts "Usage: kairos-chain skillset install <
|
|
71
|
+
$stderr.puts "Usage: kairos-chain skillset install <name_or_path> [--layer L0|L1|L2] [--force]"
|
|
72
72
|
exit 1
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
-
#
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
75
|
+
# Parse --force flag (allows reinstall/update of existing SkillSet)
|
|
76
|
+
force = false
|
|
77
|
+
if (idx = ARGV.index('--force'))
|
|
78
|
+
force = true
|
|
79
|
+
ARGV.delete_at(idx)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Resolve source path:
|
|
83
|
+
# 1. Exact path (user provides full path)
|
|
84
|
+
# 2. templates/ prefix (e.g., "templates/skillsets/mmp")
|
|
85
|
+
# 3. Short name (e.g., "mmp" → gem's templates/skillsets/mmp)
|
|
86
|
+
unless File.exist?(source)
|
|
87
|
+
candidates = [
|
|
88
|
+
File.join(KairosMcp.gem_root, source),
|
|
89
|
+
File.join(KairosMcp.gem_root, 'templates', 'skillsets', source)
|
|
90
|
+
]
|
|
91
|
+
resolved = candidates.find { |c| File.directory?(c) }
|
|
92
|
+
source = resolved if resolved
|
|
81
93
|
end
|
|
82
94
|
|
|
83
95
|
layer_override = nil
|
|
@@ -87,7 +99,7 @@ when 'skillset'
|
|
|
87
99
|
ARGV.delete_at(idx)
|
|
88
100
|
end
|
|
89
101
|
|
|
90
|
-
result = manager.install(source, layer_override: layer_override)
|
|
102
|
+
result = manager.install(source, layer_override: layer_override, force: force)
|
|
91
103
|
puts "Installed SkillSet '#{result[:name]}' v#{result[:version]} [#{result[:layer]}]"
|
|
92
104
|
puts "Path: #{result[:path]}"
|
|
93
105
|
|
|
@@ -76,8 +76,9 @@ module KairosMcp
|
|
|
76
76
|
{ success: true, name: name }
|
|
77
77
|
end
|
|
78
78
|
|
|
79
|
-
# Install a SkillSet from a local path
|
|
80
|
-
|
|
79
|
+
# Install a SkillSet from a local path.
|
|
80
|
+
# With force: true, replaces an existing SkillSet (preserves config/ files).
|
|
81
|
+
def install(source_path, layer_override: nil, force: false)
|
|
81
82
|
source_path = File.expand_path(source_path)
|
|
82
83
|
raise ArgumentError, "Source path not found: #{source_path}" unless File.directory?(source_path)
|
|
83
84
|
|
|
@@ -87,11 +88,35 @@ module KairosMcp
|
|
|
87
88
|
|
|
88
89
|
dest = File.join(@skillsets_dir, temp_skillset.name)
|
|
89
90
|
if File.directory?(dest)
|
|
90
|
-
|
|
91
|
-
|
|
91
|
+
if force
|
|
92
|
+
# Preserve user config files before replacing
|
|
93
|
+
config_dir = File.join(dest, 'config')
|
|
94
|
+
saved_configs = {}
|
|
95
|
+
if File.directory?(config_dir)
|
|
96
|
+
Dir.glob(File.join(config_dir, '*')).each do |f|
|
|
97
|
+
saved_configs[File.basename(f)] = File.read(f)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
FileUtils.rm_rf(dest)
|
|
102
|
+
|
|
103
|
+
# Copy new version
|
|
104
|
+
FileUtils.cp_r(source_path, dest)
|
|
92
105
|
|
|
93
|
-
|
|
94
|
-
|
|
106
|
+
# Restore user configs
|
|
107
|
+
unless saved_configs.empty?
|
|
108
|
+
FileUtils.mkdir_p(File.join(dest, 'config'))
|
|
109
|
+
saved_configs.each do |name, content|
|
|
110
|
+
File.write(File.join(dest, 'config', name), content)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
else
|
|
114
|
+
raise ArgumentError, "SkillSet '#{temp_skillset.name}' already installed at #{dest}. Use --force to reinstall."
|
|
115
|
+
end
|
|
116
|
+
else
|
|
117
|
+
FileUtils.mkdir_p(@skillsets_dir)
|
|
118
|
+
FileUtils.cp_r(source_path, dest)
|
|
119
|
+
end
|
|
95
120
|
|
|
96
121
|
installed = Skillset.new(dest)
|
|
97
122
|
installed.layer = layer_override if layer_override
|
|
@@ -101,7 +126,7 @@ module KairosMcp
|
|
|
101
126
|
end
|
|
102
127
|
|
|
103
128
|
set_config(installed.name, 'enabled', true)
|
|
104
|
-
record_skillset_event(installed, 'install')
|
|
129
|
+
record_skillset_event(installed, force ? 'reinstall' : 'install')
|
|
105
130
|
|
|
106
131
|
{ success: true, name: installed.name, version: installed.version, layer: installed.layer, path: dest }
|
|
107
132
|
end
|
data/lib/kairos_mcp/version.rb
CHANGED