skill-market-cli 1.1.2 → 1.1.3
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
package/src/api/client.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const axios = require('axios');
|
|
2
2
|
const chalk = require('chalk');
|
|
3
|
-
const { getToken, isLoggedIn, getServerConfig, getPersonalAccessToken } = require('../auth/token-store');
|
|
3
|
+
const { getToken, isLoggedIn, getServerConfig, getPersonalAccessToken, printLoginHelp } = require('../auth/token-store');
|
|
4
4
|
const { refreshAccessToken } = require('../auth/oauth');
|
|
5
5
|
|
|
6
6
|
class ApiClient {
|
|
@@ -62,8 +62,8 @@ class ApiClient {
|
|
|
62
62
|
if (error.response) {
|
|
63
63
|
// 401 未授权 - Token 可能已过期
|
|
64
64
|
if (error.response.status === 401) {
|
|
65
|
-
console.error(chalk.red('\n❌
|
|
66
|
-
|
|
65
|
+
console.error(chalk.red('\n❌ 认证已过期或无效,请重新登录。'));
|
|
66
|
+
printLoginHelp();
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
// 403 禁止访问
|
package/src/auth/token-store.js
CHANGED
|
@@ -105,6 +105,14 @@ function setServerConfig(serverConfig) {
|
|
|
105
105
|
saveConfig(config);
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
+
// 统一的登录帮助提示
|
|
109
|
+
function printLoginHelp() {
|
|
110
|
+
const chalk = require('chalk');
|
|
111
|
+
console.error(chalk.red('请先登录或设置 Access Token:'));
|
|
112
|
+
console.error(chalk.gray(' 方法 1:在命令行运行 skill-market-cli login'));
|
|
113
|
+
console.error(chalk.gray(' 方法 2:打开 https://kirigaya.cn/profile/tokens 创建 token,然后运行 skill-market-cli token set <your-token>\n'));
|
|
114
|
+
}
|
|
115
|
+
|
|
108
116
|
module.exports = {
|
|
109
117
|
getConfig,
|
|
110
118
|
saveConfig,
|
|
@@ -117,6 +125,7 @@ module.exports = {
|
|
|
117
125
|
savePersonalAccessToken,
|
|
118
126
|
getPersonalAccessToken,
|
|
119
127
|
clearPersonalAccessToken,
|
|
128
|
+
printLoginHelp,
|
|
120
129
|
CONFIG_DIR,
|
|
121
130
|
CONFIG_FILE
|
|
122
131
|
};
|
package/src/commands/delete.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
const chalk = require('chalk');
|
|
2
2
|
const inquirer = require('inquirer');
|
|
3
|
-
const { isLoggedIn, getPersonalAccessToken } = require('../auth/token-store');
|
|
3
|
+
const { isLoggedIn, getPersonalAccessToken, printLoginHelp } = require('../auth/token-store');
|
|
4
4
|
const apiClient = require('../api/client');
|
|
5
5
|
|
|
6
6
|
async function remove(skillId, options) {
|
|
7
7
|
if (!isLoggedIn() && !getPersonalAccessToken()) {
|
|
8
|
-
|
|
9
|
-
console.error(chalk.gray(' skill-market-cli login'));
|
|
10
|
-
console.error(chalk.gray(' skill-market-cli token set <your-access-token>\n'));
|
|
8
|
+
printLoginHelp();
|
|
11
9
|
process.exit(1);
|
|
12
10
|
}
|
|
13
11
|
|
package/src/commands/list.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const chalk = require('chalk');
|
|
2
|
-
const { isLoggedIn, getToken } = require('../auth/token-store');
|
|
2
|
+
const { isLoggedIn, getPersonalAccessToken, getToken, printLoginHelp } = require('../auth/token-store');
|
|
3
3
|
const apiClient = require('../api/client');
|
|
4
4
|
|
|
5
5
|
async function list(options) {
|
|
6
|
-
if (!isLoggedIn()) {
|
|
7
|
-
|
|
6
|
+
if (!isLoggedIn() && !getPersonalAccessToken()) {
|
|
7
|
+
printLoginHelp();
|
|
8
8
|
process.exit(1);
|
|
9
9
|
}
|
|
10
10
|
|
package/src/commands/update.js
CHANGED
|
@@ -3,14 +3,12 @@ const path = require('path');
|
|
|
3
3
|
const chalk = require('chalk');
|
|
4
4
|
const inquirer = require('inquirer');
|
|
5
5
|
const YAML = require('yaml');
|
|
6
|
-
const { isLoggedIn, getPersonalAccessToken } = require('../auth/token-store');
|
|
6
|
+
const { isLoggedIn, getPersonalAccessToken, printLoginHelp } = require('../auth/token-store');
|
|
7
7
|
const apiClient = require('../api/client');
|
|
8
8
|
|
|
9
9
|
async function update(skillId, options) {
|
|
10
10
|
if (!isLoggedIn() && !getPersonalAccessToken()) {
|
|
11
|
-
|
|
12
|
-
console.error(chalk.gray(' skill-market-cli login'));
|
|
13
|
-
console.error(chalk.gray(' skill-market-cli token set <your-access-token>\n'));
|
|
11
|
+
printLoginHelp();
|
|
14
12
|
process.exit(1);
|
|
15
13
|
}
|
|
16
14
|
|
package/src/commands/upload.js
CHANGED
|
@@ -2,7 +2,7 @@ const fs = require('fs-extra');
|
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const chalk = require('chalk');
|
|
4
4
|
const inquirer = require('inquirer');
|
|
5
|
-
const { isLoggedIn, getPersonalAccessToken } = require('../auth/token-store');
|
|
5
|
+
const { isLoggedIn, getPersonalAccessToken, printLoginHelp } = require('../auth/token-store');
|
|
6
6
|
const apiClient = require('../api/client');
|
|
7
7
|
const { runExampleAndCollect } = require('../lib/run-example-collect');
|
|
8
8
|
const {
|
|
@@ -16,9 +16,7 @@ const {
|
|
|
16
16
|
*/
|
|
17
17
|
async function upload(skillPath, options = {}) {
|
|
18
18
|
if (!isLoggedIn() && !getPersonalAccessToken()) {
|
|
19
|
-
|
|
20
|
-
console.error(chalk.gray(' skill-market-cli login'));
|
|
21
|
-
console.error(chalk.gray(' skill-market-cli token set <your-access-token>\n'));
|
|
19
|
+
printLoginHelp();
|
|
22
20
|
process.exit(1);
|
|
23
21
|
}
|
|
24
22
|
|
|
@@ -15,7 +15,10 @@ rootUrl: https://raw.githubusercontent.com/LSTM-Kirigaya/skill-market-cli/refs/h
|
|
|
15
15
|
|
|
16
16
|
## 你必须知道的约束
|
|
17
17
|
|
|
18
|
-
1.
|
|
18
|
+
1. **检查登录状态**:在上传之前,必须先确认用户已登录 `skill-market-cli`。凭证保存在 `~/.skill-market-cli/config.json`。
|
|
19
|
+
- 如果用户尚未登录,必须告知用户以下两种登录方式,并等待用户完成登录后再继续上传:
|
|
20
|
+
- **方法 1**:在命令行运行 `skill-market-cli login`
|
|
21
|
+
- **方法 2**:打开 https://kirigaya.cn/profile/tokens ,自己创建 Personal Access Token,然后运行 `skill-market-cli token set <your-token>`
|
|
19
22
|
2. **上传走 AI 渠道**:CLI 使用 `POST /api/skill/ai/upload`,要求 **全部字段非空**,且 **`tags`、`usageExamples` 不得为空数组**。
|
|
20
23
|
3. **用户案例(必填)**:`usageExamples` 中每一项必须包含:
|
|
21
24
|
- **`prompt`**:终端用户会如何向该 Skill 提问(由用户或你根据上下文代写,但必须经用户确认)。
|
|
@@ -25,15 +28,18 @@ rootUrl: https://raw.githubusercontent.com/LSTM-Kirigaya/skill-market-cli/refs/h
|
|
|
25
28
|
|
|
26
29
|
## 推荐工作流(Agent)
|
|
27
30
|
|
|
28
|
-
1.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
1. **确认登录状态**:
|
|
32
|
+
- 读取 `~/.skill-market-cli/config.json` 或通过 `skill-market-cli token get` 检查是否存在有效凭证。
|
|
33
|
+
- 若未登录,向用户说明两种登录方式(`skill-market-cli login` 或前往 https://kirigaya.cn/profile/tokens 创建 token),并在用户完成登录后继续。
|
|
34
|
+
2. 确认仓库中存在 **`SKILL.md`**(目录则路径指向该目录)。
|
|
35
|
+
3. 读取 frontmatter,整理候选:`name`、`purpose`/`description`、`tags`、`model`、`rootUrl`。
|
|
36
|
+
4. 与用户确认 **至少一条「用户会如何提问」的测试案例**(可多轮补充)。案例文本即 `prompt`。
|
|
37
|
+
5. 在终端执行上传(勿省略路径):
|
|
32
38
|
```bash
|
|
33
39
|
skill-market-cli upload <path-to-skill-dir-or-SKILL.md>
|
|
34
40
|
```
|
|
35
|
-
|
|
36
|
-
|
|
41
|
+
6. 按 CLI 提示补全缺失字段;当提示采集轨迹时,**允许命令自动运行**(会调用内置采集器写入 `aiResponses`)。
|
|
42
|
+
7. 上传成功后,CLI 会在技能目录写入 **`.skill-examples.json`**,便于复查与再次上传。
|
|
37
43
|
|
|
38
44
|
## 与 `run-example` 的关系
|
|
39
45
|
|
|
@@ -44,6 +50,7 @@ rootUrl: https://raw.githubusercontent.com/LSTM-Kirigaya/skill-market-cli/refs/h
|
|
|
44
50
|
|
|
45
51
|
- 不要编造不存在的 Git 仓库 URL;`rootUrl` 可用 `file:///...` 指向本地 `SKILL.md` 的绝对路径(CLI 默认值),或用户提供的 raw URL。
|
|
46
52
|
- 不要跳过「用户案例」;没有案例与轨迹,AI 渠道上传会失败。
|
|
53
|
+
- 不要在用户未登录时强行执行上传命令;必须先检查权限并引导登录。
|
|
47
54
|
|
|
48
55
|
## Usage Examples
|
|
49
56
|
|
|
@@ -51,4 +58,4 @@ rootUrl: https://raw.githubusercontent.com/LSTM-Kirigaya/skill-market-cli/refs/h
|
|
|
51
58
|
|
|
52
59
|
**User:** 请根据我仓库里的 SKILL.md 帮我执行上传,并告诉我你要确认哪些字段。
|
|
53
60
|
|
|
54
|
-
**AI:**
|
|
61
|
+
**AI:** 我会先检查你的 `skill-market-cli` 登录状态。如果已登录,则读取 `SKILL.md` 的 frontmatter,列出缺失的 name、描述、标签、模型与 rootUrl;请你至少提供一条「最终用户会对该 Skill 说的话」作为测试案例。然后我在终端运行 `skill-market-cli upload .`,在交互中替你填入并确认,自动完成轨迹采集后提交。
|