reskill 0.14.0 → 0.15.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.
- package/README.md +36 -31
- package/README.zh-CN.md +36 -31
- package/dist/cli/index.js +191 -134
- package/dist/core/lock-manager.d.ts +1 -0
- package/dist/core/lock-manager.d.ts.map +1 -1
- package/dist/core/skill-manager.d.ts.map +1 -1
- package/dist/index.js +58 -39
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/update-notifier.d.ts +49 -0
- package/dist/utils/update-notifier.d.ts.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,13 +19,13 @@ English | [简体中文](./README.zh-CN.md)
|
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
21
|
# 1. Initialize project
|
|
22
|
-
npx reskill init
|
|
22
|
+
npx reskill@latest init
|
|
23
23
|
|
|
24
24
|
# 2. Install a skill
|
|
25
|
-
npx reskill install github:anthropics/skills/frontend-design@latest
|
|
25
|
+
npx reskill@latest install github:anthropics/skills/frontend-design@latest
|
|
26
26
|
|
|
27
27
|
# 3. List installed skills
|
|
28
|
-
npx reskill list
|
|
28
|
+
npx reskill@latest list
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
## What is reskill?
|
|
@@ -76,35 +76,40 @@ When running `reskill update`:
|
|
|
76
76
|
## Installation
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
|
-
# Global install
|
|
79
|
+
# Global install (recommended for regular use)
|
|
80
80
|
npm install -g reskill
|
|
81
81
|
|
|
82
|
-
# Or use npx
|
|
82
|
+
# Or use npx with @latest (recommended for ongoing skill management)
|
|
83
|
+
npx reskill@latest <command>
|
|
84
|
+
|
|
85
|
+
# For one-time use, npx reskill also works
|
|
83
86
|
npx reskill <command>
|
|
84
87
|
```
|
|
85
88
|
|
|
89
|
+
> **Note:** When using `npx`, we recommend `npx reskill@latest` to ensure you always get the latest version. Without `@latest`, npx may use a cached older version.
|
|
90
|
+
|
|
86
91
|
## Usage
|
|
87
92
|
|
|
88
93
|
### Source Formats
|
|
89
94
|
|
|
90
95
|
```bash
|
|
91
96
|
# GitHub shorthand
|
|
92
|
-
npx reskill install github:user/skill@v1.0.0
|
|
97
|
+
npx reskill@latest install github:user/skill@v1.0.0
|
|
93
98
|
|
|
94
99
|
# Full Git URL
|
|
95
|
-
npx reskill install https://github.com/user/skill.git
|
|
100
|
+
npx reskill@latest install https://github.com/user/skill.git
|
|
96
101
|
|
|
97
102
|
# GitHub web URL (with branch and subpath)
|
|
98
|
-
npx reskill install https://github.com/vercel-labs/agent-skills/tree/main/skills/web-design-guidelines
|
|
103
|
+
npx reskill@latest install https://github.com/vercel-labs/agent-skills/tree/main/skills/web-design-guidelines
|
|
99
104
|
|
|
100
105
|
# GitLab
|
|
101
|
-
npx reskill install gitlab:group/skill@latest
|
|
106
|
+
npx reskill@latest install gitlab:group/skill@latest
|
|
102
107
|
|
|
103
108
|
# Private registry
|
|
104
|
-
npx reskill install gitlab.company.com:team/skill@v1.0.0
|
|
109
|
+
npx reskill@latest install gitlab.company.com:team/skill@v1.0.0
|
|
105
110
|
|
|
106
111
|
# Default registry (from skills.json)
|
|
107
|
-
npx reskill install user/skill@v1.0.0
|
|
112
|
+
npx reskill@latest install user/skill@v1.0.0
|
|
108
113
|
```
|
|
109
114
|
|
|
110
115
|
### Version Specification
|
|
@@ -119,37 +124,37 @@ npx reskill install user/skill@v1.0.0
|
|
|
119
124
|
|
|
120
125
|
## Commands
|
|
121
126
|
|
|
122
|
-
You can use `npx reskill` directly without global installation:
|
|
127
|
+
You can use `npx reskill@latest` directly without global installation:
|
|
123
128
|
|
|
124
129
|
```bash
|
|
125
130
|
# Initialize project
|
|
126
|
-
npx reskill init
|
|
131
|
+
npx reskill@latest init
|
|
127
132
|
|
|
128
133
|
# Install a skill from GitHub
|
|
129
|
-
npx reskill install github:anthropics/skills/frontend-design@latest
|
|
134
|
+
npx reskill@latest install github:anthropics/skills/frontend-design@latest
|
|
130
135
|
|
|
131
136
|
# Install from private GitLab
|
|
132
|
-
npx reskill install gitlab.company.com:team/internal-skill@v1.0.0
|
|
137
|
+
npx reskill@latest install gitlab.company.com:team/internal-skill@v1.0.0
|
|
133
138
|
|
|
134
139
|
# List installed skills
|
|
135
|
-
npx reskill list
|
|
140
|
+
npx reskill@latest list
|
|
136
141
|
```
|
|
137
142
|
|
|
138
143
|
### Command Reference
|
|
139
144
|
|
|
140
145
|
| Command | Description |
|
|
141
146
|
|---------|-------------|
|
|
142
|
-
| `npx reskill init` | Initialize `skills.json` in current directory |
|
|
143
|
-
| `npx reskill install [skill]` | Install skills from `skills.json` or a specific skill |
|
|
144
|
-
| `npx reskill list` | List installed skills |
|
|
145
|
-
| `npx reskill info <skill>` | Show skill details |
|
|
146
|
-
| `npx reskill update [skill]` | Update all or specific skill |
|
|
147
|
-
| `npx reskill outdated` | Check for outdated skills |
|
|
148
|
-
| `npx reskill uninstall <skill>` | Remove a skill |
|
|
149
|
-
| `npx reskill link <path>` | Link local skill for development |
|
|
150
|
-
| `npx reskill unlink <skill>` | Unlink a local skill |
|
|
151
|
-
|
|
152
|
-
Run `npx reskill <command> --help` for detailed options.
|
|
147
|
+
| `npx reskill@latest init` | Initialize `skills.json` in current directory |
|
|
148
|
+
| `npx reskill@latest install [skill]` | Install skills from `skills.json` or a specific skill |
|
|
149
|
+
| `npx reskill@latest list` | List installed skills |
|
|
150
|
+
| `npx reskill@latest info <skill>` | Show skill details |
|
|
151
|
+
| `npx reskill@latest update [skill]` | Update all or specific skill |
|
|
152
|
+
| `npx reskill@latest outdated` | Check for outdated skills |
|
|
153
|
+
| `npx reskill@latest uninstall <skill>` | Remove a skill |
|
|
154
|
+
| `npx reskill@latest link <path>` | Link local skill for development |
|
|
155
|
+
| `npx reskill@latest unlink <skill>` | Unlink a local skill |
|
|
156
|
+
|
|
157
|
+
Run `npx reskill@latest <command> --help` for detailed options.
|
|
153
158
|
|
|
154
159
|
## Private GitLab Support
|
|
155
160
|
|
|
@@ -163,10 +168,10 @@ reskill uses your existing SSH configuration automatically:
|
|
|
163
168
|
|
|
164
169
|
```bash
|
|
165
170
|
# Uses your ~/.ssh/id_rsa or ~/.ssh/id_ed25519 automatically
|
|
166
|
-
npx reskill install gitlab.company.com:team/private-skill@v1.0.0
|
|
171
|
+
npx reskill@latest install gitlab.company.com:team/private-skill@v1.0.0
|
|
167
172
|
|
|
168
173
|
# Or with explicit SSH URL
|
|
169
|
-
npx reskill install git@gitlab.company.com:team/private-skill.git@v1.0.0
|
|
174
|
+
npx reskill@latest install git@gitlab.company.com:team/private-skill.git@v1.0.0
|
|
170
175
|
```
|
|
171
176
|
|
|
172
177
|
Ensure your SSH key is added to GitLab and ssh-agent is running.
|
|
@@ -213,10 +218,10 @@ For self-hosted GitLab instances with custom domains:
|
|
|
213
218
|
|
|
214
219
|
```bash
|
|
215
220
|
# Direct installation
|
|
216
|
-
npx reskill install git.mycompany.io:team/skill@v1.0.0
|
|
221
|
+
npx reskill@latest install git.mycompany.io:team/skill@v1.0.0
|
|
217
222
|
|
|
218
223
|
# With explicit SSH URL
|
|
219
|
-
npx reskill install git@git.mycompany.io:team/skill.git@v1.0.0
|
|
224
|
+
npx reskill@latest install git@git.mycompany.io:team/skill.git@v1.0.0
|
|
220
225
|
```
|
|
221
226
|
|
|
222
227
|
## Configuration
|
package/README.zh-CN.md
CHANGED
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
21
|
# 1. 初始化项目
|
|
22
|
-
npx reskill init
|
|
22
|
+
npx reskill@latest init
|
|
23
23
|
|
|
24
24
|
# 2. 安装 skill
|
|
25
|
-
npx reskill install github:anthropics/skills/frontend-design@latest
|
|
25
|
+
npx reskill@latest install github:anthropics/skills/frontend-design@latest
|
|
26
26
|
|
|
27
27
|
# 3. 列出已安装的 skills
|
|
28
|
-
npx reskill list
|
|
28
|
+
npx reskill@latest list
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
## 什么是 reskill?
|
|
@@ -77,35 +77,40 @@ reskill 提供**精细化的 skill 管理和同步方案**:
|
|
|
77
77
|
## 安装
|
|
78
78
|
|
|
79
79
|
```bash
|
|
80
|
-
#
|
|
80
|
+
# 全局安装(推荐常态化使用)
|
|
81
81
|
npm install -g reskill
|
|
82
82
|
|
|
83
|
-
# 或使用 npx
|
|
83
|
+
# 或使用 npx(推荐加 @latest 确保最新版本)
|
|
84
|
+
npx reskill@latest <command>
|
|
85
|
+
|
|
86
|
+
# 单次使用也可以直接 npx reskill
|
|
84
87
|
npx reskill <command>
|
|
85
88
|
```
|
|
86
89
|
|
|
90
|
+
> **注意:** 使用 `npx` 时,建议使用 `npx reskill@latest` 以确保使用最新版本。不加 `@latest` 时,npx 可能会使用缓存的旧版本。
|
|
91
|
+
|
|
87
92
|
## 使用方式
|
|
88
93
|
|
|
89
94
|
### 源格式
|
|
90
95
|
|
|
91
96
|
```bash
|
|
92
97
|
# GitHub 简写
|
|
93
|
-
npx reskill install github:user/skill@v1.0.0
|
|
98
|
+
npx reskill@latest install github:user/skill@v1.0.0
|
|
94
99
|
|
|
95
100
|
# 完整 Git URL
|
|
96
|
-
npx reskill install https://github.com/user/skill.git
|
|
101
|
+
npx reskill@latest install https://github.com/user/skill.git
|
|
97
102
|
|
|
98
103
|
# GitHub 网页 URL(支持分支和子路径)
|
|
99
|
-
npx reskill install https://github.com/vercel-labs/agent-skills/tree/main/skills/web-design-guidelines
|
|
104
|
+
npx reskill@latest install https://github.com/vercel-labs/agent-skills/tree/main/skills/web-design-guidelines
|
|
100
105
|
|
|
101
106
|
# GitLab
|
|
102
|
-
npx reskill install gitlab:group/skill@latest
|
|
107
|
+
npx reskill@latest install gitlab:group/skill@latest
|
|
103
108
|
|
|
104
109
|
# 私有 Registry
|
|
105
|
-
npx reskill install gitlab.company.com:team/skill@v1.0.0
|
|
110
|
+
npx reskill@latest install gitlab.company.com:team/skill@v1.0.0
|
|
106
111
|
|
|
107
112
|
# 默认 Registry(来自 skills.json)
|
|
108
|
-
npx reskill install user/skill@v1.0.0
|
|
113
|
+
npx reskill@latest install user/skill@v1.0.0
|
|
109
114
|
```
|
|
110
115
|
|
|
111
116
|
### 版本规范
|
|
@@ -120,37 +125,37 @@ npx reskill install user/skill@v1.0.0
|
|
|
120
125
|
|
|
121
126
|
## 命令
|
|
122
127
|
|
|
123
|
-
无需全局安装,直接使用 `npx reskill`:
|
|
128
|
+
无需全局安装,直接使用 `npx reskill@latest`:
|
|
124
129
|
|
|
125
130
|
```bash
|
|
126
131
|
# 初始化项目
|
|
127
|
-
npx reskill init
|
|
132
|
+
npx reskill@latest init
|
|
128
133
|
|
|
129
134
|
# 从 GitHub 安装 skill
|
|
130
|
-
npx reskill install github:anthropics/skills/frontend-design@latest
|
|
135
|
+
npx reskill@latest install github:anthropics/skills/frontend-design@latest
|
|
131
136
|
|
|
132
137
|
# 从私有 GitLab 安装
|
|
133
|
-
npx reskill install gitlab.company.com:team/internal-skill@v1.0.0
|
|
138
|
+
npx reskill@latest install gitlab.company.com:team/internal-skill@v1.0.0
|
|
134
139
|
|
|
135
140
|
# 列出已安装的 skills
|
|
136
|
-
npx reskill list
|
|
141
|
+
npx reskill@latest list
|
|
137
142
|
```
|
|
138
143
|
|
|
139
144
|
### 命令参考
|
|
140
145
|
|
|
141
146
|
| 命令 | 说明 |
|
|
142
147
|
|------|------|
|
|
143
|
-
| `npx reskill init` | 在当前目录初始化 `skills.json` |
|
|
144
|
-
| `npx reskill install [skill]` | 安装 `skills.json` 中的所有 skills 或指定 skill |
|
|
145
|
-
| `npx reskill list` | 列出已安装的 skills |
|
|
146
|
-
| `npx reskill info <skill>` | 查看 skill 详情 |
|
|
147
|
-
| `npx reskill update [skill]` | 更新所有或指定 skill |
|
|
148
|
-
| `npx reskill outdated` | 检查过期的 skills |
|
|
149
|
-
| `npx reskill uninstall <skill>` | 卸载 skill |
|
|
150
|
-
| `npx reskill link <path>` | 链接本地 skill(开发用) |
|
|
151
|
-
| `npx reskill unlink <skill>` | 取消链接本地 skill |
|
|
152
|
-
|
|
153
|
-
运行 `npx reskill <command> --help` 查看详细选项。
|
|
148
|
+
| `npx reskill@latest init` | 在当前目录初始化 `skills.json` |
|
|
149
|
+
| `npx reskill@latest install [skill]` | 安装 `skills.json` 中的所有 skills 或指定 skill |
|
|
150
|
+
| `npx reskill@latest list` | 列出已安装的 skills |
|
|
151
|
+
| `npx reskill@latest info <skill>` | 查看 skill 详情 |
|
|
152
|
+
| `npx reskill@latest update [skill]` | 更新所有或指定 skill |
|
|
153
|
+
| `npx reskill@latest outdated` | 检查过期的 skills |
|
|
154
|
+
| `npx reskill@latest uninstall <skill>` | 卸载 skill |
|
|
155
|
+
| `npx reskill@latest link <path>` | 链接本地 skill(开发用) |
|
|
156
|
+
| `npx reskill@latest unlink <skill>` | 取消链接本地 skill |
|
|
157
|
+
|
|
158
|
+
运行 `npx reskill@latest <command> --help` 查看详细选项。
|
|
154
159
|
|
|
155
160
|
## 私有 GitLab 支持
|
|
156
161
|
|
|
@@ -164,10 +169,10 @@ reskill 自动使用你已有的 SSH 配置:
|
|
|
164
169
|
|
|
165
170
|
```bash
|
|
166
171
|
# 自动使用 ~/.ssh/id_rsa 或 ~/.ssh/id_ed25519
|
|
167
|
-
npx reskill install gitlab.company.com:team/private-skill@v1.0.0
|
|
172
|
+
npx reskill@latest install gitlab.company.com:team/private-skill@v1.0.0
|
|
168
173
|
|
|
169
174
|
# 或使用显式的 SSH URL
|
|
170
|
-
npx reskill install git@gitlab.company.com:team/private-skill.git@v1.0.0
|
|
175
|
+
npx reskill@latest install git@gitlab.company.com:team/private-skill.git@v1.0.0
|
|
171
176
|
```
|
|
172
177
|
|
|
173
178
|
确保你的 SSH key 已添加到 GitLab,并且 ssh-agent 正在运行。
|
|
@@ -214,10 +219,10 @@ before_script:
|
|
|
214
219
|
|
|
215
220
|
```bash
|
|
216
221
|
# 直接安装
|
|
217
|
-
npx reskill install git.mycompany.io:team/skill@v1.0.0
|
|
222
|
+
npx reskill@latest install git.mycompany.io:team/skill@v1.0.0
|
|
218
223
|
|
|
219
224
|
# 使用显式的 SSH URL
|
|
220
|
-
npx reskill install git@git.mycompany.io:team/skill.git@v1.0.0
|
|
225
|
+
npx reskill@latest install git@git.mycompany.io:team/skill.git@v1.0.0
|
|
221
226
|
```
|
|
222
227
|
|
|
223
228
|
## 配置
|
package/dist/cli/index.js
CHANGED
|
@@ -4,10 +4,10 @@ import * as __WEBPACK_EXTERNAL_MODULE_node_path__ from "node:path";
|
|
|
4
4
|
import * as __WEBPACK_EXTERNAL_MODULE_node_url__ from "node:url";
|
|
5
5
|
import * as __WEBPACK_EXTERNAL_MODULE_commander__ from "commander";
|
|
6
6
|
import * as __WEBPACK_EXTERNAL_MODULE_chalk__ from "chalk";
|
|
7
|
+
import * as __WEBPACK_EXTERNAL_MODULE_semver__ from "semver";
|
|
7
8
|
import * as __WEBPACK_EXTERNAL_MODULE_node_os__ from "node:os";
|
|
8
9
|
import * as __WEBPACK_EXTERNAL_MODULE_node_child_process__ from "node:child_process";
|
|
9
10
|
import * as __WEBPACK_EXTERNAL_MODULE_node_util__ from "node:util";
|
|
10
|
-
import * as __WEBPACK_EXTERNAL_MODULE_semver__ from "semver";
|
|
11
11
|
import * as __WEBPACK_EXTERNAL_MODULE__clack_prompts__ from "@clack/prompts";
|
|
12
12
|
import * as __WEBPACK_EXTERNAL_MODULE_ora__ from "ora";
|
|
13
13
|
var __webpack_modules__ = {
|
|
@@ -26,6 +26,81 @@ function __webpack_require__(moduleId) {
|
|
|
26
26
|
return module.exports;
|
|
27
27
|
}
|
|
28
28
|
var external_node_fs_ = __webpack_require__("node:fs");
|
|
29
|
+
const logger_logger = {
|
|
30
|
+
info (message) {
|
|
31
|
+
console.log(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].blue('ℹ'), message);
|
|
32
|
+
},
|
|
33
|
+
success (message) {
|
|
34
|
+
console.log(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].green('✅'), message);
|
|
35
|
+
},
|
|
36
|
+
warn (message) {
|
|
37
|
+
console.log(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].yellow('⚠️'), message);
|
|
38
|
+
},
|
|
39
|
+
error (message) {
|
|
40
|
+
console.error(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].red('❌'), message);
|
|
41
|
+
},
|
|
42
|
+
debug (message) {
|
|
43
|
+
if (process.env.DEBUG || process.env.VERBOSE) console.log(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].gray('🔍'), __WEBPACK_EXTERNAL_MODULE_chalk__["default"].gray(message));
|
|
44
|
+
},
|
|
45
|
+
package (message) {
|
|
46
|
+
console.log(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].cyan('📦'), message);
|
|
47
|
+
},
|
|
48
|
+
log (message) {
|
|
49
|
+
console.log(message);
|
|
50
|
+
},
|
|
51
|
+
newline () {
|
|
52
|
+
console.log();
|
|
53
|
+
},
|
|
54
|
+
table (headers, rows) {
|
|
55
|
+
const widths = headers.map((h, i)=>{
|
|
56
|
+
const colValues = [
|
|
57
|
+
h,
|
|
58
|
+
...rows.map((r)=>r[i] || '')
|
|
59
|
+
];
|
|
60
|
+
return Math.max(...colValues.map((v)=>v.length));
|
|
61
|
+
});
|
|
62
|
+
const headerRow = headers.map((h, i)=>h.padEnd(widths[i])).join(' ');
|
|
63
|
+
console.log(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].bold(headerRow));
|
|
64
|
+
for (const row of rows){
|
|
65
|
+
const rowStr = row.map((cell, i)=>(cell || '').padEnd(widths[i])).join(' ');
|
|
66
|
+
console.log(rowStr);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
async function checkForUpdate(packageName, currentVersion, options = {}) {
|
|
71
|
+
const timeout = options.timeout ?? 3000;
|
|
72
|
+
try {
|
|
73
|
+
const controller = new AbortController();
|
|
74
|
+
const timeoutId = setTimeout(()=>controller.abort(), timeout);
|
|
75
|
+
const response = await fetch(`https://registry.npmjs.org/${packageName}`, {
|
|
76
|
+
signal: controller.signal
|
|
77
|
+
});
|
|
78
|
+
clearTimeout(timeoutId);
|
|
79
|
+
if (!response.ok) return null;
|
|
80
|
+
const data = await response.json();
|
|
81
|
+
const latest = data['dist-tags']?.latest;
|
|
82
|
+
if (!latest) return null;
|
|
83
|
+
const hasUpdate = __WEBPACK_EXTERNAL_MODULE_semver__["default"].gt(latest, currentVersion);
|
|
84
|
+
return {
|
|
85
|
+
current: currentVersion,
|
|
86
|
+
latest,
|
|
87
|
+
hasUpdate
|
|
88
|
+
};
|
|
89
|
+
} catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function formatUpdateMessage(result) {
|
|
94
|
+
if (!result.hasUpdate) return '';
|
|
95
|
+
return `
|
|
96
|
+
┌────────────────────────────────────────────────────┐
|
|
97
|
+
│ │
|
|
98
|
+
│ Update available: ${result.current} → ${result.latest.padEnd(10)} │
|
|
99
|
+
│ Run: npm install -g reskill@latest │
|
|
100
|
+
│ │
|
|
101
|
+
└────────────────────────────────────────────────────┘
|
|
102
|
+
`;
|
|
103
|
+
}
|
|
29
104
|
function exists(filePath) {
|
|
30
105
|
return external_node_fs_.existsSync(filePath);
|
|
31
106
|
}
|
|
@@ -112,47 +187,6 @@ function shortenPath(fullPath, cwd) {
|
|
|
112
187
|
if (fullPath.startsWith(currentDir)) return `.${fullPath.slice(currentDir.length)}`;
|
|
113
188
|
return fullPath;
|
|
114
189
|
}
|
|
115
|
-
const logger = {
|
|
116
|
-
info (message) {
|
|
117
|
-
console.log(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].blue('ℹ'), message);
|
|
118
|
-
},
|
|
119
|
-
success (message) {
|
|
120
|
-
console.log(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].green('✅'), message);
|
|
121
|
-
},
|
|
122
|
-
warn (message) {
|
|
123
|
-
console.log(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].yellow('⚠️'), message);
|
|
124
|
-
},
|
|
125
|
-
error (message) {
|
|
126
|
-
console.error(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].red('❌'), message);
|
|
127
|
-
},
|
|
128
|
-
debug (message) {
|
|
129
|
-
if (process.env.DEBUG || process.env.VERBOSE) console.log(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].gray('🔍'), __WEBPACK_EXTERNAL_MODULE_chalk__["default"].gray(message));
|
|
130
|
-
},
|
|
131
|
-
package (message) {
|
|
132
|
-
console.log(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].cyan('📦'), message);
|
|
133
|
-
},
|
|
134
|
-
log (message) {
|
|
135
|
-
console.log(message);
|
|
136
|
-
},
|
|
137
|
-
newline () {
|
|
138
|
-
console.log();
|
|
139
|
-
},
|
|
140
|
-
table (headers, rows) {
|
|
141
|
-
const widths = headers.map((h, i)=>{
|
|
142
|
-
const colValues = [
|
|
143
|
-
h,
|
|
144
|
-
...rows.map((r)=>r[i] || '')
|
|
145
|
-
];
|
|
146
|
-
return Math.max(...colValues.map((v)=>v.length));
|
|
147
|
-
});
|
|
148
|
-
const headerRow = headers.map((h, i)=>h.padEnd(widths[i])).join(' ');
|
|
149
|
-
console.log(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].bold(headerRow));
|
|
150
|
-
for (const row of rows){
|
|
151
|
-
const rowStr = row.map((cell, i)=>(cell || '').padEnd(widths[i])).join(' ');
|
|
152
|
-
console.log(rowStr);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
};
|
|
156
190
|
const agent_registry_home = (0, __WEBPACK_EXTERNAL_MODULE_node_os__.homedir)();
|
|
157
191
|
const agents = {
|
|
158
192
|
amp: {
|
|
@@ -1141,6 +1175,7 @@ class LockManager {
|
|
|
1141
1175
|
const lockedSkill = {
|
|
1142
1176
|
source: options.source,
|
|
1143
1177
|
version: options.version,
|
|
1178
|
+
ref: options.ref,
|
|
1144
1179
|
resolved: options.resolved,
|
|
1145
1180
|
commit: options.commit,
|
|
1146
1181
|
installedAt: new Date().toISOString()
|
|
@@ -1220,35 +1255,43 @@ class SkillManager {
|
|
|
1220
1255
|
const { force = false, save = true } = options;
|
|
1221
1256
|
const resolved = await this.resolver.resolve(ref);
|
|
1222
1257
|
const { parsed, repoUrl } = resolved;
|
|
1223
|
-
const
|
|
1258
|
+
const gitRef = resolved.ref;
|
|
1224
1259
|
const skillName = parsed.subPath ? __WEBPACK_EXTERNAL_MODULE_node_path__.basename(parsed.subPath) : parsed.repo;
|
|
1225
1260
|
const skillPath = this.getSkillPath(skillName);
|
|
1226
1261
|
if (exists(skillPath) && !force) {
|
|
1227
1262
|
const locked = this.lockManager.get(skillName);
|
|
1228
|
-
|
|
1229
|
-
|
|
1263
|
+
const lockedRef = locked?.ref || locked?.version;
|
|
1264
|
+
if (locked && lockedRef === gitRef) {
|
|
1265
|
+
logger_logger.info(`${skillName}@${gitRef} is already installed`);
|
|
1230
1266
|
const installed = this.getInstalledSkill(skillName);
|
|
1231
1267
|
if (installed) return installed;
|
|
1232
1268
|
}
|
|
1233
1269
|
if (!force) {
|
|
1234
|
-
|
|
1270
|
+
logger_logger.warn(`${skillName} is already installed. Use --force to reinstall.`);
|
|
1235
1271
|
const installed = this.getInstalledSkill(skillName);
|
|
1236
1272
|
if (installed) return installed;
|
|
1237
1273
|
}
|
|
1238
1274
|
}
|
|
1239
|
-
|
|
1240
|
-
let cacheResult = await this.cache.get(parsed,
|
|
1241
|
-
if (cacheResult)
|
|
1275
|
+
logger_logger["package"](`Installing ${skillName}@${gitRef}...`);
|
|
1276
|
+
let cacheResult = await this.cache.get(parsed, gitRef);
|
|
1277
|
+
if (cacheResult) logger_logger.debug(`Using cached ${skillName}@${gitRef}`);
|
|
1242
1278
|
else {
|
|
1243
|
-
|
|
1244
|
-
cacheResult = await this.cache.cache(repoUrl, parsed,
|
|
1279
|
+
logger_logger.debug(`Caching ${skillName}@${gitRef} from ${repoUrl}`);
|
|
1280
|
+
cacheResult = await this.cache.cache(repoUrl, parsed, gitRef, gitRef);
|
|
1245
1281
|
}
|
|
1246
1282
|
ensureDir(this.getInstallDir());
|
|
1247
1283
|
if (exists(skillPath)) remove(skillPath);
|
|
1248
|
-
await this.cache.copyTo(parsed,
|
|
1284
|
+
await this.cache.copyTo(parsed, gitRef, skillPath);
|
|
1285
|
+
let semanticVersion = gitRef;
|
|
1286
|
+
const skillJsonPath = __WEBPACK_EXTERNAL_MODULE_node_path__.join(skillPath, 'skill.json');
|
|
1287
|
+
if (exists(skillJsonPath)) try {
|
|
1288
|
+
const skillJson = readJson(skillJsonPath);
|
|
1289
|
+
if (skillJson.version) semanticVersion = skillJson.version;
|
|
1290
|
+
} catch {}
|
|
1249
1291
|
if (!this.isGlobal) this.lockManager.lockSkill(skillName, {
|
|
1250
1292
|
source: `${parsed.registry}:${parsed.owner}/${parsed.repo}${parsed.subPath ? `/${parsed.subPath}` : ''}`,
|
|
1251
|
-
version,
|
|
1293
|
+
version: semanticVersion,
|
|
1294
|
+
ref: gitRef,
|
|
1252
1295
|
resolved: repoUrl,
|
|
1253
1296
|
commit: cacheResult.commit
|
|
1254
1297
|
});
|
|
@@ -1256,8 +1299,9 @@ class SkillManager {
|
|
|
1256
1299
|
this.config.ensureExists();
|
|
1257
1300
|
this.config.addSkill(skillName, ref);
|
|
1258
1301
|
}
|
|
1302
|
+
const displayVersion = semanticVersion !== gitRef ? `${semanticVersion} (${gitRef})` : gitRef;
|
|
1259
1303
|
const locationHint = this.isGlobal ? '(global)' : '';
|
|
1260
|
-
|
|
1304
|
+
logger_logger.success(`Installed ${skillName}@${displayVersion} to ${skillPath} ${locationHint}`.trim());
|
|
1261
1305
|
const installed = this.getInstalledSkill(skillName);
|
|
1262
1306
|
if (!installed) throw new Error(`Failed to get installed skill info for ${skillName}`);
|
|
1263
1307
|
return installed;
|
|
@@ -1272,7 +1316,7 @@ class SkillManager {
|
|
|
1272
1316
|
});
|
|
1273
1317
|
installed.push(skill);
|
|
1274
1318
|
} catch (error) {
|
|
1275
|
-
|
|
1319
|
+
logger_logger.error(`Failed to install ${name}: ${error.message}`);
|
|
1276
1320
|
}
|
|
1277
1321
|
return installed;
|
|
1278
1322
|
}
|
|
@@ -1280,14 +1324,14 @@ class SkillManager {
|
|
|
1280
1324
|
const skillPath = this.getSkillPath(name);
|
|
1281
1325
|
if (!exists(skillPath)) {
|
|
1282
1326
|
const location = this.isGlobal ? '(global)' : '';
|
|
1283
|
-
|
|
1327
|
+
logger_logger.warn(`Skill ${name} is not installed ${location}`.trim());
|
|
1284
1328
|
return false;
|
|
1285
1329
|
}
|
|
1286
1330
|
remove(skillPath);
|
|
1287
1331
|
if (!this.isGlobal) this.lockManager.remove(name);
|
|
1288
1332
|
if (!this.isGlobal && this.config.exists()) this.config.removeSkill(name);
|
|
1289
1333
|
const locationHint = this.isGlobal ? '(global)' : '';
|
|
1290
|
-
|
|
1334
|
+
logger_logger.success(`Uninstalled ${name} ${locationHint}`.trim());
|
|
1291
1335
|
return true;
|
|
1292
1336
|
}
|
|
1293
1337
|
async update(name) {
|
|
@@ -1295,7 +1339,7 @@ class SkillManager {
|
|
|
1295
1339
|
if (name) {
|
|
1296
1340
|
const ref = this.config.getSkillRef(name);
|
|
1297
1341
|
if (!ref) {
|
|
1298
|
-
|
|
1342
|
+
logger_logger.error(`Skill ${name} not found in skills.json`);
|
|
1299
1343
|
return [];
|
|
1300
1344
|
}
|
|
1301
1345
|
const skill = await this.install(ref, {
|
|
@@ -1312,7 +1356,7 @@ class SkillManager {
|
|
|
1312
1356
|
});
|
|
1313
1357
|
updated.push(skill);
|
|
1314
1358
|
} catch (error) {
|
|
1315
|
-
|
|
1359
|
+
logger_logger.error(`Failed to update ${skillName}: ${error.message}`);
|
|
1316
1360
|
}
|
|
1317
1361
|
}
|
|
1318
1362
|
return updated;
|
|
@@ -1329,7 +1373,7 @@ class SkillManager {
|
|
|
1329
1373
|
const linkPath = this.getSkillPath(skillName);
|
|
1330
1374
|
ensureDir(__WEBPACK_EXTERNAL_MODULE_node_path__.dirname(linkPath));
|
|
1331
1375
|
createSymlink(absolutePath, linkPath);
|
|
1332
|
-
|
|
1376
|
+
logger_logger.success(`Linked ${skillName} → ${absolutePath}`);
|
|
1333
1377
|
return {
|
|
1334
1378
|
name: skillName,
|
|
1335
1379
|
path: linkPath,
|
|
@@ -1341,15 +1385,15 @@ class SkillManager {
|
|
|
1341
1385
|
unlink(name) {
|
|
1342
1386
|
const skillPath = this.getSkillPath(name);
|
|
1343
1387
|
if (!exists(skillPath)) {
|
|
1344
|
-
|
|
1388
|
+
logger_logger.warn(`Skill ${name} is not installed`);
|
|
1345
1389
|
return false;
|
|
1346
1390
|
}
|
|
1347
1391
|
if (!isSymlink(skillPath)) {
|
|
1348
|
-
|
|
1392
|
+
logger_logger.warn(`Skill ${name} is not a linked skill`);
|
|
1349
1393
|
return false;
|
|
1350
1394
|
}
|
|
1351
1395
|
remove(skillPath);
|
|
1352
|
-
|
|
1396
|
+
logger_logger.success(`Unlinked ${name}`);
|
|
1353
1397
|
return true;
|
|
1354
1398
|
}
|
|
1355
1399
|
list() {
|
|
@@ -1419,7 +1463,8 @@ class SkillManager {
|
|
|
1419
1463
|
const skills = this.config.getSkills();
|
|
1420
1464
|
for (const [name, ref] of Object.entries(skills))try {
|
|
1421
1465
|
const locked = this.lockManager.get(name);
|
|
1422
|
-
const
|
|
1466
|
+
const currentRef = locked?.ref || locked?.version || 'unknown';
|
|
1467
|
+
const currentVersion = locked?.version || 'unknown';
|
|
1423
1468
|
const parsed = this.resolver.parseRef(ref);
|
|
1424
1469
|
const repoUrl = this.resolver.buildRepoUrl(parsed);
|
|
1425
1470
|
const latestResolved = await this.resolver.resolveVersion(repoUrl, {
|
|
@@ -1428,15 +1473,15 @@ class SkillManager {
|
|
|
1428
1473
|
raw: 'latest'
|
|
1429
1474
|
});
|
|
1430
1475
|
const latest = latestResolved.ref;
|
|
1431
|
-
const updateAvailable =
|
|
1476
|
+
const updateAvailable = currentRef !== latest && 'unknown' !== currentRef;
|
|
1432
1477
|
results.push({
|
|
1433
1478
|
name,
|
|
1434
|
-
current,
|
|
1479
|
+
current: currentVersion !== currentRef ? `${currentVersion} (${currentRef})` : currentRef,
|
|
1435
1480
|
latest,
|
|
1436
1481
|
updateAvailable
|
|
1437
1482
|
});
|
|
1438
1483
|
} catch (error) {
|
|
1439
|
-
|
|
1484
|
+
logger_logger.debug(`Failed to check ${name}: ${error.message}`);
|
|
1440
1485
|
results.push({
|
|
1441
1486
|
name,
|
|
1442
1487
|
current: 'unknown',
|
|
@@ -1450,16 +1495,22 @@ class SkillManager {
|
|
|
1450
1495
|
const { save = true, mode = 'symlink' } = options;
|
|
1451
1496
|
const resolved = await this.resolver.resolve(ref);
|
|
1452
1497
|
const { parsed, repoUrl } = resolved;
|
|
1453
|
-
const
|
|
1498
|
+
const gitRef = resolved.ref;
|
|
1454
1499
|
const skillName = parsed.subPath ? __WEBPACK_EXTERNAL_MODULE_node_path__.basename(parsed.subPath) : parsed.repo;
|
|
1455
|
-
|
|
1456
|
-
let cacheResult = await this.cache.get(parsed,
|
|
1457
|
-
if (cacheResult)
|
|
1500
|
+
logger_logger["package"](`Installing ${skillName}@${gitRef} to ${targetAgents.length} agent(s)...`);
|
|
1501
|
+
let cacheResult = await this.cache.get(parsed, gitRef);
|
|
1502
|
+
if (cacheResult) logger_logger.debug(`Using cached ${skillName}@${gitRef}`);
|
|
1458
1503
|
else {
|
|
1459
|
-
|
|
1460
|
-
cacheResult = await this.cache.cache(repoUrl, parsed,
|
|
1504
|
+
logger_logger.debug(`Caching ${skillName}@${gitRef} from ${repoUrl}`);
|
|
1505
|
+
cacheResult = await this.cache.cache(repoUrl, parsed, gitRef, gitRef);
|
|
1461
1506
|
}
|
|
1462
|
-
const sourcePath = this.cache.getCachePath(parsed,
|
|
1507
|
+
const sourcePath = this.cache.getCachePath(parsed, gitRef);
|
|
1508
|
+
let semanticVersion = gitRef;
|
|
1509
|
+
const skillJsonPath = __WEBPACK_EXTERNAL_MODULE_node_path__.join(sourcePath, 'skill.json');
|
|
1510
|
+
if (exists(skillJsonPath)) try {
|
|
1511
|
+
const skillJson = readJson(skillJsonPath);
|
|
1512
|
+
if (skillJson.version) semanticVersion = skillJson.version;
|
|
1513
|
+
} catch {}
|
|
1463
1514
|
const installer = new Installer({
|
|
1464
1515
|
cwd: this.projectRoot,
|
|
1465
1516
|
global: this.isGlobal
|
|
@@ -1469,7 +1520,8 @@ class SkillManager {
|
|
|
1469
1520
|
});
|
|
1470
1521
|
if (!this.isGlobal) this.lockManager.lockSkill(skillName, {
|
|
1471
1522
|
source: `${parsed.registry}:${parsed.owner}/${parsed.repo}${parsed.subPath ? `/${parsed.subPath}` : ''}`,
|
|
1472
|
-
version,
|
|
1523
|
+
version: semanticVersion,
|
|
1524
|
+
ref: gitRef,
|
|
1473
1525
|
resolved: repoUrl,
|
|
1474
1526
|
commit: cacheResult.commit
|
|
1475
1527
|
});
|
|
@@ -1479,12 +1531,13 @@ class SkillManager {
|
|
|
1479
1531
|
}
|
|
1480
1532
|
const successCount = Array.from(results.values()).filter((r)=>r.success).length;
|
|
1481
1533
|
const failCount = results.size - successCount;
|
|
1482
|
-
|
|
1483
|
-
|
|
1534
|
+
const displayVersion = semanticVersion !== gitRef ? `${semanticVersion} (${gitRef})` : gitRef;
|
|
1535
|
+
if (0 === failCount) logger_logger.success(`Installed ${skillName}@${displayVersion} to ${successCount} agent(s)`);
|
|
1536
|
+
else logger_logger.warn(`Installed ${skillName}@${displayVersion} to ${successCount} agent(s), ${failCount} failed`);
|
|
1484
1537
|
const skill = {
|
|
1485
1538
|
name: skillName,
|
|
1486
1539
|
path: sourcePath,
|
|
1487
|
-
version,
|
|
1540
|
+
version: semanticVersion,
|
|
1488
1541
|
source: `${parsed.registry}:${parsed.owner}/${parsed.repo}${parsed.subPath ? `/${parsed.subPath}` : ''}`
|
|
1489
1542
|
};
|
|
1490
1543
|
return {
|
|
@@ -1524,7 +1577,7 @@ class SkillManager {
|
|
|
1524
1577
|
if (!this.isGlobal) this.lockManager.remove(name);
|
|
1525
1578
|
if (!this.isGlobal && this.config.exists()) this.config.removeSkill(name);
|
|
1526
1579
|
const successCount = Array.from(results.values()).filter((r)=>r).length;
|
|
1527
|
-
|
|
1580
|
+
logger_logger.success(`Uninstalled ${name} from ${successCount} agent(s)`);
|
|
1528
1581
|
return results;
|
|
1529
1582
|
}
|
|
1530
1583
|
}
|
|
@@ -1536,41 +1589,41 @@ const infoCommand = new __WEBPACK_EXTERNAL_MODULE_commander__.Command('info').de
|
|
|
1536
1589
|
return;
|
|
1537
1590
|
}
|
|
1538
1591
|
if (!info.installed && !info.config) {
|
|
1539
|
-
|
|
1592
|
+
logger_logger.error(`Skill ${skillName} not found`);
|
|
1540
1593
|
process.exit(1);
|
|
1541
1594
|
}
|
|
1542
|
-
|
|
1543
|
-
|
|
1595
|
+
logger_logger.log(`Skill: ${skillName}`);
|
|
1596
|
+
logger_logger.newline();
|
|
1544
1597
|
if (info.config) {
|
|
1545
|
-
|
|
1546
|
-
|
|
1598
|
+
logger_logger.log("Configuration (skills.json):");
|
|
1599
|
+
logger_logger.log(` Reference: ${info.config}`);
|
|
1547
1600
|
}
|
|
1548
1601
|
if (info.locked) {
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1602
|
+
logger_logger.log("Locked Version (skills.lock):");
|
|
1603
|
+
logger_logger.log(` Version: ${info.locked.version}`);
|
|
1604
|
+
logger_logger.log(` Source: ${info.locked.source}`);
|
|
1605
|
+
logger_logger.log(` Commit: ${info.locked.commit}`);
|
|
1606
|
+
logger_logger.log(` Installed: ${info.locked.installedAt}`);
|
|
1554
1607
|
}
|
|
1555
1608
|
if (info.installed) {
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1609
|
+
logger_logger.log("Installed:");
|
|
1610
|
+
logger_logger.log(` Path: ${info.installed.path}`);
|
|
1611
|
+
logger_logger.log(` Version: ${info.installed.version}`);
|
|
1612
|
+
logger_logger.log(` Linked: ${info.installed.isLinked ? 'Yes' : 'No'}`);
|
|
1560
1613
|
if (info.installed.metadata) {
|
|
1561
1614
|
const meta = info.installed.metadata;
|
|
1562
|
-
|
|
1563
|
-
if (meta.description)
|
|
1564
|
-
if (meta.author)
|
|
1565
|
-
if (meta.license)
|
|
1566
|
-
if (meta.keywords?.length)
|
|
1615
|
+
logger_logger.log("Metadata (skill.json):");
|
|
1616
|
+
if (meta.description) logger_logger.log(` Description: ${meta.description}`);
|
|
1617
|
+
if (meta.author) logger_logger.log(` Author: ${meta.author}`);
|
|
1618
|
+
if (meta.license) logger_logger.log(` License: ${meta.license}`);
|
|
1619
|
+
if (meta.keywords?.length) logger_logger.log(` Keywords: ${meta.keywords.join(', ')}`);
|
|
1567
1620
|
}
|
|
1568
|
-
} else
|
|
1621
|
+
} else logger_logger.warn(`Skill ${skillName} is not installed`);
|
|
1569
1622
|
});
|
|
1570
1623
|
const initCommand = new __WEBPACK_EXTERNAL_MODULE_commander__.Command('init').description('Initialize a new skills.json configuration').option('-n, --name <name>', 'Project name').option('-r, --registry <registry>', 'Default registry', 'github').option('-d, --install-dir <dir>', 'Skills installation directory', '.skills').option('-y, --yes', 'Skip prompts and use defaults').action(async (options)=>{
|
|
1571
1624
|
const configLoader = new ConfigLoader();
|
|
1572
1625
|
if (configLoader.exists()) {
|
|
1573
|
-
|
|
1626
|
+
logger_logger.warn('skills.json already exists');
|
|
1574
1627
|
return;
|
|
1575
1628
|
}
|
|
1576
1629
|
const config = configLoader.create({
|
|
@@ -1580,16 +1633,16 @@ const initCommand = new __WEBPACK_EXTERNAL_MODULE_commander__.Command('init').de
|
|
|
1580
1633
|
installDir: options.installDir
|
|
1581
1634
|
}
|
|
1582
1635
|
});
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1636
|
+
logger_logger.success('Created skills.json');
|
|
1637
|
+
logger_logger.newline();
|
|
1638
|
+
logger_logger.log('Configuration:');
|
|
1639
|
+
logger_logger.log(` Name: ${config.name || '(not set)'}`);
|
|
1640
|
+
logger_logger.log(` Default registry: ${config.defaults?.registry}`);
|
|
1641
|
+
logger_logger.log(` Install directory: ${config.defaults?.installDir}`);
|
|
1642
|
+
logger_logger.newline();
|
|
1643
|
+
logger_logger.log('Next steps:');
|
|
1644
|
+
logger_logger.log(' reskill install <skill> Install a skill');
|
|
1645
|
+
logger_logger.log(' reskill list List installed skills');
|
|
1593
1646
|
});
|
|
1594
1647
|
function formatAgentNames(agentTypes, maxShow = 5) {
|
|
1595
1648
|
const names = agentTypes.map((a)=>agents[a].displayName);
|
|
@@ -1842,9 +1895,9 @@ const linkCmd = new __WEBPACK_EXTERNAL_MODULE_commander__.Command('link').descri
|
|
|
1842
1895
|
const skillManager = new SkillManager();
|
|
1843
1896
|
try {
|
|
1844
1897
|
const linked = skillManager.link(localPath, options.name);
|
|
1845
|
-
|
|
1898
|
+
logger_logger.log(`Linked skill available at: ${linked.path}`);
|
|
1846
1899
|
} catch (error) {
|
|
1847
|
-
|
|
1900
|
+
logger_logger.error(error.message);
|
|
1848
1901
|
process.exit(1);
|
|
1849
1902
|
}
|
|
1850
1903
|
});
|
|
@@ -1863,7 +1916,7 @@ const listCommand = new __WEBPACK_EXTERNAL_MODULE_commander__.Command('list').al
|
|
|
1863
1916
|
const skills = skillManager.list();
|
|
1864
1917
|
if (0 === skills.length) {
|
|
1865
1918
|
const location = isGlobal ? 'globally' : 'in this project';
|
|
1866
|
-
|
|
1919
|
+
logger_logger.info(`No skills installed ${location}`);
|
|
1867
1920
|
return;
|
|
1868
1921
|
}
|
|
1869
1922
|
if (options.json) {
|
|
@@ -1871,8 +1924,8 @@ const listCommand = new __WEBPACK_EXTERNAL_MODULE_commander__.Command('list').al
|
|
|
1871
1924
|
return;
|
|
1872
1925
|
}
|
|
1873
1926
|
const locationLabel = isGlobal ? __WEBPACK_EXTERNAL_MODULE_chalk__["default"].dim(' (global)') : '';
|
|
1874
|
-
|
|
1875
|
-
|
|
1927
|
+
logger_logger.log(`Installed Skills (${skillManager.getInstallDir()})${locationLabel}:`);
|
|
1928
|
+
logger_logger.newline();
|
|
1876
1929
|
const headers = [
|
|
1877
1930
|
'Name',
|
|
1878
1931
|
'Version',
|
|
@@ -1883,19 +1936,19 @@ const listCommand = new __WEBPACK_EXTERNAL_MODULE_commander__.Command('list').al
|
|
|
1883
1936
|
skill.isLinked ? `${skill.version} (linked)` : skill.version,
|
|
1884
1937
|
skill.source || '-'
|
|
1885
1938
|
]);
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1939
|
+
logger_logger.table(headers, rows);
|
|
1940
|
+
logger_logger.newline();
|
|
1941
|
+
logger_logger.log(`Total: ${skills.length} skill(s)`);
|
|
1889
1942
|
});
|
|
1890
1943
|
const outdatedCommand = new __WEBPACK_EXTERNAL_MODULE_commander__.Command('outdated').description('Check for outdated skills').option('-j, --json', 'Output as JSON').action(async (options)=>{
|
|
1891
1944
|
const configLoader = new ConfigLoader();
|
|
1892
1945
|
if (!configLoader.exists()) {
|
|
1893
|
-
|
|
1946
|
+
logger_logger.error("skills.json not found. Run 'reskill init' first.");
|
|
1894
1947
|
process.exit(1);
|
|
1895
1948
|
}
|
|
1896
1949
|
const skills = configLoader.getSkills();
|
|
1897
1950
|
if (0 === Object.keys(skills).length) {
|
|
1898
|
-
|
|
1951
|
+
logger_logger.info('No skills defined in skills.json');
|
|
1899
1952
|
return;
|
|
1900
1953
|
}
|
|
1901
1954
|
const skillManager = new SkillManager();
|
|
@@ -1909,11 +1962,11 @@ const outdatedCommand = new __WEBPACK_EXTERNAL_MODULE_commander__.Command('outda
|
|
|
1909
1962
|
}
|
|
1910
1963
|
const outdated = results.filter((r)=>r.updateAvailable);
|
|
1911
1964
|
if (0 === outdated.length) {
|
|
1912
|
-
|
|
1965
|
+
logger_logger.success('All skills are up to date!');
|
|
1913
1966
|
return;
|
|
1914
1967
|
}
|
|
1915
|
-
|
|
1916
|
-
|
|
1968
|
+
logger_logger["package"]('Checking for updates...');
|
|
1969
|
+
logger_logger.newline();
|
|
1917
1970
|
const headers = [
|
|
1918
1971
|
'Skill',
|
|
1919
1972
|
'Current',
|
|
@@ -1926,15 +1979,15 @@ const outdatedCommand = new __WEBPACK_EXTERNAL_MODULE_commander__.Command('outda
|
|
|
1926
1979
|
r.latest,
|
|
1927
1980
|
r.updateAvailable ? __WEBPACK_EXTERNAL_MODULE_chalk__["default"].yellow('⬆️ Update available') : __WEBPACK_EXTERNAL_MODULE_chalk__["default"].green('✅ Up to date')
|
|
1928
1981
|
]);
|
|
1929
|
-
|
|
1930
|
-
|
|
1982
|
+
logger_logger.table(headers, rows);
|
|
1983
|
+
logger_logger.newline();
|
|
1931
1984
|
if (outdated.length > 0) {
|
|
1932
|
-
|
|
1933
|
-
|
|
1985
|
+
logger_logger.log(`Run ${__WEBPACK_EXTERNAL_MODULE_chalk__["default"].cyan('reskill update')} to update all skills`);
|
|
1986
|
+
logger_logger.log(`Or ${__WEBPACK_EXTERNAL_MODULE_chalk__["default"].cyan('reskill update <skill>')} to update a specific skill`);
|
|
1934
1987
|
}
|
|
1935
1988
|
} catch (error) {
|
|
1936
1989
|
spinner.fail('Check failed');
|
|
1937
|
-
|
|
1990
|
+
logger_logger.error(error.message);
|
|
1938
1991
|
process.exit(1);
|
|
1939
1992
|
}
|
|
1940
1993
|
});
|
|
@@ -1949,7 +2002,7 @@ const uninstallCommand = new __WEBPACK_EXTERNAL_MODULE_commander__.Command('unin
|
|
|
1949
2002
|
const updateCommand = new __WEBPACK_EXTERNAL_MODULE_commander__.Command('update').alias('up').description('Update installed skills').argument('[skill]', 'Skill name to update (updates all if not specified)').action(async (skill)=>{
|
|
1950
2003
|
const configLoader = new ConfigLoader();
|
|
1951
2004
|
if (!configLoader.exists()) {
|
|
1952
|
-
|
|
2005
|
+
logger_logger.error("skills.json not found. Run 'reskill init' first.");
|
|
1953
2006
|
process.exit(1);
|
|
1954
2007
|
}
|
|
1955
2008
|
const skillManager = new SkillManager();
|
|
@@ -1958,14 +2011,14 @@ const updateCommand = new __WEBPACK_EXTERNAL_MODULE_commander__.Command('update'
|
|
|
1958
2011
|
const updated = await skillManager.update(skill);
|
|
1959
2012
|
spinner.stop();
|
|
1960
2013
|
if (0 === updated.length) {
|
|
1961
|
-
|
|
2014
|
+
logger_logger.info('No skills to update');
|
|
1962
2015
|
return;
|
|
1963
2016
|
}
|
|
1964
|
-
|
|
1965
|
-
for (const s of updated)
|
|
2017
|
+
logger_logger.success(`Updated ${updated.length} skill(s):`);
|
|
2018
|
+
for (const s of updated)logger_logger.log(` - ${s.name}@${s.version}`);
|
|
1966
2019
|
} catch (error) {
|
|
1967
2020
|
spinner.fail('Update failed');
|
|
1968
|
-
|
|
2021
|
+
logger_logger.error(error.message);
|
|
1969
2022
|
process.exit(1);
|
|
1970
2023
|
}
|
|
1971
2024
|
});
|
|
@@ -1982,4 +2035,8 @@ program.addCommand(outdatedCommand);
|
|
|
1982
2035
|
program.addCommand(uninstallCommand);
|
|
1983
2036
|
program.addCommand(linkCommand);
|
|
1984
2037
|
program.addCommand(unlinkCommand);
|
|
1985
|
-
|
|
2038
|
+
const updateCheckPromise = checkForUpdate(packageJson.name, packageJson.version);
|
|
2039
|
+
program.parseAsync().then(async ()=>{
|
|
2040
|
+
const result = await updateCheckPromise;
|
|
2041
|
+
if (result?.hasUpdate) logger_logger.log(formatUpdateMessage(result));
|
|
2042
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock-manager.d.ts","sourceRoot":"","sources":["../../src/core/lock-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQjE;;;;GAIG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAA2B;gBAE/B,WAAW,CAAC,EAAE,MAAM;IAKhC;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACH,IAAI,IAAI,UAAU;IAsBlB;;OAEG;IACH,MAAM,IAAI,UAAU;IAKpB;;OAEG;IACH,IAAI,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI;IASnC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAK1C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI;IAM3C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAU7B;;OAEG;IACH,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,GACA,WAAW;
|
|
1
|
+
{"version":3,"file":"lock-manager.d.ts","sourceRoot":"","sources":["../../src/core/lock-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQjE;;;;GAIG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAA2B;gBAE/B,WAAW,CAAC,EAAE,MAAM;IAKhC;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACH,IAAI,IAAI,UAAU;IAsBlB;;OAEG;IACH,MAAM,IAAI,UAAU;IAKpB;;OAEG;IACH,IAAI,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI;IASnC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAK1C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI;IAM3C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAU7B;;OAEG;IACH,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,GACA,WAAW;IAcd;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;IAKrC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAK1B;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAQtD;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb;;OAEG;IACH,MAAM,IAAI,IAAI;CAOf;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-manager.d.ts","sourceRoot":"","sources":["../../src/core/skill-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAa,MAAM,mBAAmB,CAAC;AAcnF,OAAO,EACL,KAAK,SAAS,EAIf,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EAAa,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAU;gBAEd,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB;IAY/D;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;;;;OAKG;IACH,aAAa,IAAI,MAAM;IAOvB;;;;;;OAMG;IACH,qBAAqB,IAAI,MAAM;IAM/B;;;;OAIG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAiBlC;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-manager.d.ts","sourceRoot":"","sources":["../../src/core/skill-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1127,6 +1127,7 @@ class LockManager {
|
|
|
1127
1127
|
const lockedSkill = {
|
|
1128
1128
|
source: options.source,
|
|
1129
1129
|
version: options.version,
|
|
1130
|
+
ref: options.ref,
|
|
1130
1131
|
resolved: options.resolved,
|
|
1131
1132
|
commit: options.commit,
|
|
1132
1133
|
installedAt: new Date().toISOString()
|
|
@@ -1164,7 +1165,7 @@ class LockManager {
|
|
|
1164
1165
|
this.lockData = null;
|
|
1165
1166
|
}
|
|
1166
1167
|
}
|
|
1167
|
-
const
|
|
1168
|
+
const logger_logger = {
|
|
1168
1169
|
info (message) {
|
|
1169
1170
|
console.log(__WEBPACK_EXTERNAL_MODULE_chalk__["default"].blue('ℹ'), message);
|
|
1170
1171
|
},
|
|
@@ -1247,35 +1248,43 @@ class SkillManager {
|
|
|
1247
1248
|
const { force = false, save = true } = options;
|
|
1248
1249
|
const resolved = await this.resolver.resolve(ref);
|
|
1249
1250
|
const { parsed, repoUrl } = resolved;
|
|
1250
|
-
const
|
|
1251
|
+
const gitRef = resolved.ref;
|
|
1251
1252
|
const skillName = parsed.subPath ? __WEBPACK_EXTERNAL_MODULE_node_path__.basename(parsed.subPath) : parsed.repo;
|
|
1252
1253
|
const skillPath = this.getSkillPath(skillName);
|
|
1253
1254
|
if (exists(skillPath) && !force) {
|
|
1254
1255
|
const locked = this.lockManager.get(skillName);
|
|
1255
|
-
|
|
1256
|
-
|
|
1256
|
+
const lockedRef = locked?.ref || locked?.version;
|
|
1257
|
+
if (locked && lockedRef === gitRef) {
|
|
1258
|
+
logger_logger.info(`${skillName}@${gitRef} is already installed`);
|
|
1257
1259
|
const installed = this.getInstalledSkill(skillName);
|
|
1258
1260
|
if (installed) return installed;
|
|
1259
1261
|
}
|
|
1260
1262
|
if (!force) {
|
|
1261
|
-
|
|
1263
|
+
logger_logger.warn(`${skillName} is already installed. Use --force to reinstall.`);
|
|
1262
1264
|
const installed = this.getInstalledSkill(skillName);
|
|
1263
1265
|
if (installed) return installed;
|
|
1264
1266
|
}
|
|
1265
1267
|
}
|
|
1266
|
-
|
|
1267
|
-
let cacheResult = await this.cache.get(parsed,
|
|
1268
|
-
if (cacheResult)
|
|
1268
|
+
logger_logger["package"](`Installing ${skillName}@${gitRef}...`);
|
|
1269
|
+
let cacheResult = await this.cache.get(parsed, gitRef);
|
|
1270
|
+
if (cacheResult) logger_logger.debug(`Using cached ${skillName}@${gitRef}`);
|
|
1269
1271
|
else {
|
|
1270
|
-
|
|
1271
|
-
cacheResult = await this.cache.cache(repoUrl, parsed,
|
|
1272
|
+
logger_logger.debug(`Caching ${skillName}@${gitRef} from ${repoUrl}`);
|
|
1273
|
+
cacheResult = await this.cache.cache(repoUrl, parsed, gitRef, gitRef);
|
|
1272
1274
|
}
|
|
1273
1275
|
ensureDir(this.getInstallDir());
|
|
1274
1276
|
if (exists(skillPath)) remove(skillPath);
|
|
1275
|
-
await this.cache.copyTo(parsed,
|
|
1277
|
+
await this.cache.copyTo(parsed, gitRef, skillPath);
|
|
1278
|
+
let semanticVersion = gitRef;
|
|
1279
|
+
const skillJsonPath = __WEBPACK_EXTERNAL_MODULE_node_path__.join(skillPath, 'skill.json');
|
|
1280
|
+
if (exists(skillJsonPath)) try {
|
|
1281
|
+
const skillJson = readJson(skillJsonPath);
|
|
1282
|
+
if (skillJson.version) semanticVersion = skillJson.version;
|
|
1283
|
+
} catch {}
|
|
1276
1284
|
if (!this.isGlobal) this.lockManager.lockSkill(skillName, {
|
|
1277
1285
|
source: `${parsed.registry}:${parsed.owner}/${parsed.repo}${parsed.subPath ? `/${parsed.subPath}` : ''}`,
|
|
1278
|
-
version,
|
|
1286
|
+
version: semanticVersion,
|
|
1287
|
+
ref: gitRef,
|
|
1279
1288
|
resolved: repoUrl,
|
|
1280
1289
|
commit: cacheResult.commit
|
|
1281
1290
|
});
|
|
@@ -1283,8 +1292,9 @@ class SkillManager {
|
|
|
1283
1292
|
this.config.ensureExists();
|
|
1284
1293
|
this.config.addSkill(skillName, ref);
|
|
1285
1294
|
}
|
|
1295
|
+
const displayVersion = semanticVersion !== gitRef ? `${semanticVersion} (${gitRef})` : gitRef;
|
|
1286
1296
|
const locationHint = this.isGlobal ? '(global)' : '';
|
|
1287
|
-
|
|
1297
|
+
logger_logger.success(`Installed ${skillName}@${displayVersion} to ${skillPath} ${locationHint}`.trim());
|
|
1288
1298
|
const installed = this.getInstalledSkill(skillName);
|
|
1289
1299
|
if (!installed) throw new Error(`Failed to get installed skill info for ${skillName}`);
|
|
1290
1300
|
return installed;
|
|
@@ -1299,7 +1309,7 @@ class SkillManager {
|
|
|
1299
1309
|
});
|
|
1300
1310
|
installed.push(skill);
|
|
1301
1311
|
} catch (error) {
|
|
1302
|
-
|
|
1312
|
+
logger_logger.error(`Failed to install ${name}: ${error.message}`);
|
|
1303
1313
|
}
|
|
1304
1314
|
return installed;
|
|
1305
1315
|
}
|
|
@@ -1307,14 +1317,14 @@ class SkillManager {
|
|
|
1307
1317
|
const skillPath = this.getSkillPath(name);
|
|
1308
1318
|
if (!exists(skillPath)) {
|
|
1309
1319
|
const location = this.isGlobal ? '(global)' : '';
|
|
1310
|
-
|
|
1320
|
+
logger_logger.warn(`Skill ${name} is not installed ${location}`.trim());
|
|
1311
1321
|
return false;
|
|
1312
1322
|
}
|
|
1313
1323
|
remove(skillPath);
|
|
1314
1324
|
if (!this.isGlobal) this.lockManager.remove(name);
|
|
1315
1325
|
if (!this.isGlobal && this.config.exists()) this.config.removeSkill(name);
|
|
1316
1326
|
const locationHint = this.isGlobal ? '(global)' : '';
|
|
1317
|
-
|
|
1327
|
+
logger_logger.success(`Uninstalled ${name} ${locationHint}`.trim());
|
|
1318
1328
|
return true;
|
|
1319
1329
|
}
|
|
1320
1330
|
async update(name) {
|
|
@@ -1322,7 +1332,7 @@ class SkillManager {
|
|
|
1322
1332
|
if (name) {
|
|
1323
1333
|
const ref = this.config.getSkillRef(name);
|
|
1324
1334
|
if (!ref) {
|
|
1325
|
-
|
|
1335
|
+
logger_logger.error(`Skill ${name} not found in skills.json`);
|
|
1326
1336
|
return [];
|
|
1327
1337
|
}
|
|
1328
1338
|
const skill = await this.install(ref, {
|
|
@@ -1339,7 +1349,7 @@ class SkillManager {
|
|
|
1339
1349
|
});
|
|
1340
1350
|
updated.push(skill);
|
|
1341
1351
|
} catch (error) {
|
|
1342
|
-
|
|
1352
|
+
logger_logger.error(`Failed to update ${skillName}: ${error.message}`);
|
|
1343
1353
|
}
|
|
1344
1354
|
}
|
|
1345
1355
|
return updated;
|
|
@@ -1356,7 +1366,7 @@ class SkillManager {
|
|
|
1356
1366
|
const linkPath = this.getSkillPath(skillName);
|
|
1357
1367
|
ensureDir(__WEBPACK_EXTERNAL_MODULE_node_path__.dirname(linkPath));
|
|
1358
1368
|
createSymlink(absolutePath, linkPath);
|
|
1359
|
-
|
|
1369
|
+
logger_logger.success(`Linked ${skillName} → ${absolutePath}`);
|
|
1360
1370
|
return {
|
|
1361
1371
|
name: skillName,
|
|
1362
1372
|
path: linkPath,
|
|
@@ -1368,15 +1378,15 @@ class SkillManager {
|
|
|
1368
1378
|
unlink(name) {
|
|
1369
1379
|
const skillPath = this.getSkillPath(name);
|
|
1370
1380
|
if (!exists(skillPath)) {
|
|
1371
|
-
|
|
1381
|
+
logger_logger.warn(`Skill ${name} is not installed`);
|
|
1372
1382
|
return false;
|
|
1373
1383
|
}
|
|
1374
1384
|
if (!isSymlink(skillPath)) {
|
|
1375
|
-
|
|
1385
|
+
logger_logger.warn(`Skill ${name} is not a linked skill`);
|
|
1376
1386
|
return false;
|
|
1377
1387
|
}
|
|
1378
1388
|
remove(skillPath);
|
|
1379
|
-
|
|
1389
|
+
logger_logger.success(`Unlinked ${name}`);
|
|
1380
1390
|
return true;
|
|
1381
1391
|
}
|
|
1382
1392
|
list() {
|
|
@@ -1446,7 +1456,8 @@ class SkillManager {
|
|
|
1446
1456
|
const skills = this.config.getSkills();
|
|
1447
1457
|
for (const [name, ref] of Object.entries(skills))try {
|
|
1448
1458
|
const locked = this.lockManager.get(name);
|
|
1449
|
-
const
|
|
1459
|
+
const currentRef = locked?.ref || locked?.version || 'unknown';
|
|
1460
|
+
const currentVersion = locked?.version || 'unknown';
|
|
1450
1461
|
const parsed = this.resolver.parseRef(ref);
|
|
1451
1462
|
const repoUrl = this.resolver.buildRepoUrl(parsed);
|
|
1452
1463
|
const latestResolved = await this.resolver.resolveVersion(repoUrl, {
|
|
@@ -1455,15 +1466,15 @@ class SkillManager {
|
|
|
1455
1466
|
raw: 'latest'
|
|
1456
1467
|
});
|
|
1457
1468
|
const latest = latestResolved.ref;
|
|
1458
|
-
const updateAvailable =
|
|
1469
|
+
const updateAvailable = currentRef !== latest && 'unknown' !== currentRef;
|
|
1459
1470
|
results.push({
|
|
1460
1471
|
name,
|
|
1461
|
-
current,
|
|
1472
|
+
current: currentVersion !== currentRef ? `${currentVersion} (${currentRef})` : currentRef,
|
|
1462
1473
|
latest,
|
|
1463
1474
|
updateAvailable
|
|
1464
1475
|
});
|
|
1465
1476
|
} catch (error) {
|
|
1466
|
-
|
|
1477
|
+
logger_logger.debug(`Failed to check ${name}: ${error.message}`);
|
|
1467
1478
|
results.push({
|
|
1468
1479
|
name,
|
|
1469
1480
|
current: 'unknown',
|
|
@@ -1477,16 +1488,22 @@ class SkillManager {
|
|
|
1477
1488
|
const { save = true, mode = 'symlink' } = options;
|
|
1478
1489
|
const resolved = await this.resolver.resolve(ref);
|
|
1479
1490
|
const { parsed, repoUrl } = resolved;
|
|
1480
|
-
const
|
|
1491
|
+
const gitRef = resolved.ref;
|
|
1481
1492
|
const skillName = parsed.subPath ? __WEBPACK_EXTERNAL_MODULE_node_path__.basename(parsed.subPath) : parsed.repo;
|
|
1482
|
-
|
|
1483
|
-
let cacheResult = await this.cache.get(parsed,
|
|
1484
|
-
if (cacheResult)
|
|
1493
|
+
logger_logger["package"](`Installing ${skillName}@${gitRef} to ${targetAgents.length} agent(s)...`);
|
|
1494
|
+
let cacheResult = await this.cache.get(parsed, gitRef);
|
|
1495
|
+
if (cacheResult) logger_logger.debug(`Using cached ${skillName}@${gitRef}`);
|
|
1485
1496
|
else {
|
|
1486
|
-
|
|
1487
|
-
cacheResult = await this.cache.cache(repoUrl, parsed,
|
|
1497
|
+
logger_logger.debug(`Caching ${skillName}@${gitRef} from ${repoUrl}`);
|
|
1498
|
+
cacheResult = await this.cache.cache(repoUrl, parsed, gitRef, gitRef);
|
|
1488
1499
|
}
|
|
1489
|
-
const sourcePath = this.cache.getCachePath(parsed,
|
|
1500
|
+
const sourcePath = this.cache.getCachePath(parsed, gitRef);
|
|
1501
|
+
let semanticVersion = gitRef;
|
|
1502
|
+
const skillJsonPath = __WEBPACK_EXTERNAL_MODULE_node_path__.join(sourcePath, 'skill.json');
|
|
1503
|
+
if (exists(skillJsonPath)) try {
|
|
1504
|
+
const skillJson = readJson(skillJsonPath);
|
|
1505
|
+
if (skillJson.version) semanticVersion = skillJson.version;
|
|
1506
|
+
} catch {}
|
|
1490
1507
|
const installer = new Installer({
|
|
1491
1508
|
cwd: this.projectRoot,
|
|
1492
1509
|
global: this.isGlobal
|
|
@@ -1496,7 +1513,8 @@ class SkillManager {
|
|
|
1496
1513
|
});
|
|
1497
1514
|
if (!this.isGlobal) this.lockManager.lockSkill(skillName, {
|
|
1498
1515
|
source: `${parsed.registry}:${parsed.owner}/${parsed.repo}${parsed.subPath ? `/${parsed.subPath}` : ''}`,
|
|
1499
|
-
version,
|
|
1516
|
+
version: semanticVersion,
|
|
1517
|
+
ref: gitRef,
|
|
1500
1518
|
resolved: repoUrl,
|
|
1501
1519
|
commit: cacheResult.commit
|
|
1502
1520
|
});
|
|
@@ -1506,12 +1524,13 @@ class SkillManager {
|
|
|
1506
1524
|
}
|
|
1507
1525
|
const successCount = Array.from(results.values()).filter((r)=>r.success).length;
|
|
1508
1526
|
const failCount = results.size - successCount;
|
|
1509
|
-
|
|
1510
|
-
|
|
1527
|
+
const displayVersion = semanticVersion !== gitRef ? `${semanticVersion} (${gitRef})` : gitRef;
|
|
1528
|
+
if (0 === failCount) logger_logger.success(`Installed ${skillName}@${displayVersion} to ${successCount} agent(s)`);
|
|
1529
|
+
else logger_logger.warn(`Installed ${skillName}@${displayVersion} to ${successCount} agent(s), ${failCount} failed`);
|
|
1511
1530
|
const skill = {
|
|
1512
1531
|
name: skillName,
|
|
1513
1532
|
path: sourcePath,
|
|
1514
|
-
version,
|
|
1533
|
+
version: semanticVersion,
|
|
1515
1534
|
source: `${parsed.registry}:${parsed.owner}/${parsed.repo}${parsed.subPath ? `/${parsed.subPath}` : ''}`
|
|
1516
1535
|
};
|
|
1517
1536
|
return {
|
|
@@ -1551,7 +1570,7 @@ class SkillManager {
|
|
|
1551
1570
|
if (!this.isGlobal) this.lockManager.remove(name);
|
|
1552
1571
|
if (!this.isGlobal && this.config.exists()) this.config.removeSkill(name);
|
|
1553
1572
|
const successCount = Array.from(results.values()).filter((r)=>r).length;
|
|
1554
|
-
|
|
1573
|
+
logger_logger.success(`Uninstalled ${name} from ${successCount} agent(s)`);
|
|
1555
1574
|
return results;
|
|
1556
1575
|
}
|
|
1557
1576
|
}
|
|
@@ -1698,4 +1717,4 @@ function generateSkillMd(skill) {
|
|
|
1698
1717
|
frontmatter.push('');
|
|
1699
1718
|
return frontmatter.join('\n') + skill.content;
|
|
1700
1719
|
}
|
|
1701
|
-
export { CacheManager, ConfigLoader, DEFAULT_REGISTRIES, GitResolver, Installer, LockManager, SkillManager, SkillValidationError, agents, detectInstalledAgents, generateSkillMd, getAgentConfig, getAgentSkillsDir, getAllAgentTypes, getCanonicalSkillPath, getCanonicalSkillsDir, hasValidSkillMd, isPathSafe, isValidAgentType, logger, parseSkillFromDir, parseSkillMd, parseSkillMdFile, sanitizeName, shortenPath, validateSkillDescription, validateSkillName };
|
|
1720
|
+
export { CacheManager, ConfigLoader, DEFAULT_REGISTRIES, GitResolver, Installer, LockManager, SkillManager, SkillValidationError, agents, detectInstalledAgents, generateSkillMd, getAgentConfig, getAgentSkillsDir, getAllAgentTypes, getCanonicalSkillPath, getCanonicalSkillsDir, hasValidSkillMd, isPathSafe, isValidAgentType, logger_logger as logger, parseSkillFromDir, parseSkillMd, parseSkillMdFile, sanitizeName, shortenPath, validateSkillDescription, validateSkillName };
|
package/dist/types/index.d.ts
CHANGED
|
@@ -85,8 +85,10 @@ export interface SkillsJson {
|
|
|
85
85
|
export interface LockedSkill {
|
|
86
86
|
/** Source, e.g., github:user/repo */
|
|
87
87
|
source: string;
|
|
88
|
-
/**
|
|
88
|
+
/** Semantic version from skill.json */
|
|
89
89
|
version: string;
|
|
90
|
+
/** Git reference (tag, branch, commit) used for installation */
|
|
91
|
+
ref: string;
|
|
90
92
|
/** Resolved full URL */
|
|
91
93
|
resolved: string;
|
|
92
94
|
/** Exact commit hash */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,YAAY,EACV,WAAW,EACX,SAAS,GACV,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEvE;;GAEG;AACH,YAAY,EACV,WAAW,EACX,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAMjC;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,wCAAwC;IACxC,WAAW,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjC,6BAA6B;IAC7B,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC3C;AAMD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Update Notifier - Check for CLI updates from npm registry
|
|
3
|
+
*
|
|
4
|
+
* Provides non-blocking update notifications to users when a newer version is available.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Update check result
|
|
8
|
+
*/
|
|
9
|
+
export interface UpdateCheckResult {
|
|
10
|
+
/** Current installed version */
|
|
11
|
+
current: string;
|
|
12
|
+
/** Latest version on npm */
|
|
13
|
+
latest: string;
|
|
14
|
+
/** Whether an update is available */
|
|
15
|
+
hasUpdate: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Options for update check
|
|
19
|
+
*/
|
|
20
|
+
export interface CheckOptions {
|
|
21
|
+
/** Timeout in milliseconds (default: 3000) */
|
|
22
|
+
timeout?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check for updates from npm registry
|
|
26
|
+
*
|
|
27
|
+
* @param packageName - Name of the package to check
|
|
28
|
+
* @param currentVersion - Current installed version
|
|
29
|
+
* @param options - Check options
|
|
30
|
+
* @returns Update check result, or null if check failed
|
|
31
|
+
*/
|
|
32
|
+
export declare function checkForUpdate(packageName: string, currentVersion: string, options?: CheckOptions): Promise<UpdateCheckResult | null>;
|
|
33
|
+
/**
|
|
34
|
+
* Format update message for display
|
|
35
|
+
*
|
|
36
|
+
* @param result - Update check result
|
|
37
|
+
* @returns Formatted message string, or empty string if no update
|
|
38
|
+
*/
|
|
39
|
+
export declare function formatUpdateMessage(result: UpdateCheckResult): string;
|
|
40
|
+
/**
|
|
41
|
+
* Check for updates and notify user if available
|
|
42
|
+
*
|
|
43
|
+
* This function is designed to be non-blocking and silent on errors.
|
|
44
|
+
*
|
|
45
|
+
* @param packageName - Name of the package to check
|
|
46
|
+
* @param currentVersion - Current installed version
|
|
47
|
+
*/
|
|
48
|
+
export declare function notifyUpdate(packageName: string, currentVersion: string): Promise<void>;
|
|
49
|
+
//# sourceMappingURL=update-notifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-notifier.d.ts","sourceRoot":"","sources":["../../src/utils/update-notifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAmCnC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAarE;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW7F"}
|