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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0c973594a9a0355c073fbfb8e9fee7f1fba0bba2308e2a6a2dfd266a85fdfee4
4
- data.tar.gz: 86c8843f8347969bc91303924b0481480b49e74b0460ebc05d99de6e6f46dab6
3
+ metadata.gz: 3bbb98fc197f37790e8cf89fa3b33320fcc344f893da8550b22c26a72d60db7b
4
+ data.tar.gz: f0f7851aabb13ba39be6a0e9408c31dec843386427326bdb4f301a2adb2685ac
5
5
  SHA512:
6
- metadata.gz: 42e15721d51a70b21f96873f3cf9aa7de5562e3e157b489141eda0f4a1782f23d312e57a23efd408b0e29714d926c479c8f2b8aca03b63f02e77969193d787e5
7
- data.tar.gz: b5a4f1ab06b5ec3b3f721d8b52f6a3220544ef826f15004265bfe40ce315708a019b6f599a013913b1251bce1d7eeb7896debf65928f69ac8d844afbb7e9e185
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 <path> [--layer L0|L1|L2]"
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
- # Resolve gem-internal template paths (e.g. "templates/skillsets/mmp")
76
- # When installed as a gem, relative paths like "templates/skillsets/mmp"
77
- # won't exist in the user's cwd — resolve against gem root instead.
78
- if !File.exist?(source) && source.start_with?('templates/')
79
- gem_source = File.join(KairosMcp.gem_root, source)
80
- source = gem_source if File.directory?(gem_source)
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
- def install(source_path, layer_override: nil)
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
- raise ArgumentError, "SkillSet '#{temp_skillset.name}' already installed at #{dest}"
91
- end
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
- FileUtils.mkdir_p(@skillsets_dir)
94
- FileUtils.cp_r(source_path, dest)
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
@@ -1,4 +1,4 @@
1
1
  module KairosMcp
2
- VERSION = "3.3.0"
2
+ VERSION = "3.3.1"
3
3
  CHANGELOG_URL = "https://github.com/masaomi/KairosChain_2026/blob/main/CHANGELOG.md"
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kairos-chain
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masaomi Hatakeyama