@shakudo/kaji-setup-external 1.1.2 → 1.1.4

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shakudo/kaji-setup-external",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "Single-command installer for Kaji AI development environment (OpenCode + MCP servers + skills + vibe-git) - External version with ENV-based configuration",
5
5
  "type": "module",
6
6
  "bin": {
package/src/skills.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as path from 'path';
2
- import { createSpinner, ensureDir, copyDir, readFile, writeFile, log } from './utils.js';
2
+ import * as fs from 'fs/promises';
3
+ import { createSpinner, ensureDir, copyDir, readFile, writeFile, runCommand, commandExists, log } from './utils.js';
3
4
  import { VibeSetupError } from './errors.js';
4
5
 
5
6
  const SKILLS_TARGET_DIR = '/root/gitrepos/.claude/skills';
@@ -16,7 +17,10 @@ export async function installSkills(assetsDir: string): Promise<void> {
16
17
 
17
18
  await copyDir(skillsSourceDir, SKILLS_TARGET_DIR);
18
19
 
19
- spinner.succeed('Installed AI coding skills');
20
+ spinner.succeed('Installed AI coding skills to .claude/skills/');
21
+
22
+ // Register skills with openskills if available
23
+ await registerWithOpenskills(skillsSourceDir);
20
24
  } catch (error) {
21
25
  spinner.fail('Failed to install skills');
22
26
  throw new VibeSetupError(
@@ -29,6 +33,44 @@ export async function installSkills(assetsDir: string): Promise<void> {
29
33
  }
30
34
  }
31
35
 
36
+ async function registerWithOpenskills(skillsSourceDir: string): Promise<void> {
37
+ const hasOpenskills = await commandExists('openskills');
38
+ if (!hasOpenskills) {
39
+ log.dim(' openskills not installed — skipping skill registration');
40
+ return;
41
+ }
42
+
43
+ const spinner = createSpinner('Registering skills with openskills...');
44
+ spinner.start();
45
+
46
+ try {
47
+ const entries = await fs.readdir(skillsSourceDir, { withFileTypes: true });
48
+ const skillDirs = entries.filter(e => e.isDirectory()).map(e => e.name);
49
+
50
+ let registered = 0;
51
+ let failed = 0;
52
+
53
+ for (const skill of skillDirs) {
54
+ const skillPath = path.join(skillsSourceDir, skill);
55
+ try {
56
+ await runCommand('openskills', ['install', skillPath, '--universal', '--yes'], { timeout: 30_000 });
57
+ registered++;
58
+ } catch {
59
+ failed++;
60
+ }
61
+ }
62
+
63
+ if (failed > 0) {
64
+ spinner.warn(`Registered ${registered}/${skillDirs.length} skills with openskills (${failed} failed)`);
65
+ } else {
66
+ spinner.succeed(`Registered ${registered} skills with openskills`);
67
+ }
68
+ } catch (error) {
69
+ spinner.fail('Failed to register skills with openskills');
70
+ log.warn('openskills registration failed — skills are still copied to .claude/skills/');
71
+ }
72
+ }
73
+
32
74
  export async function installAgentsMd(templateDir: string): Promise<void> {
33
75
  const spinner = createSpinner('Installing AGENTS.md...');
34
76
  spinner.start();
@@ -196,7 +196,7 @@
196
196
  },
197
197
  "plugin": [
198
198
  "oh-my-opencode",
199
- "opencode-mattermost-control"
199
+ "@shakudo/opencode-mattermost-control"
200
200
  ],
201
201
  "provider": {
202
202
  "anthropic": {
@@ -5,6 +5,6 @@
5
5
  "private": true,
6
6
  "dependencies": {
7
7
  "@opencode-ai/plugin": "1.1.35",
8
- "opencode-mattermost-control": "0.3.29"
8
+ "@shakudo/opencode-mattermost-control": "0.3.95"
9
9
  }
10
10
  }