joyskills-cli 0.2.6 → 0.2.7

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/src/index.js CHANGED
@@ -1,6 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { Command } from 'commander';
4
+ import { createRequire } from 'module';
5
+ const require = createRequire(import.meta.url);
6
+ const { version } = require('../package.json');
4
7
  import { listCommand } from './commands/list.js';
5
8
  import { installCommand } from './commands/install.js';
6
9
  import { removeCommand } from './commands/remove.js';
@@ -8,14 +11,16 @@ import { teamCommand } from './commands/team.js';
8
11
  import { auditCommand } from './commands/audit.js';
9
12
  import { statusCommand } from './commands/status.js';
10
13
  import { syncCommand } from './commands/sync.js';
14
+ import { upgradeCommand } from './commands/upgrade.js';
11
15
  import { readCommand } from './commands/read.js';
16
+ import { manageCommand } from './commands/manage.js';
12
17
 
13
18
  const program = new Command();
14
19
 
15
20
  program
16
21
  .name('joySkills')
17
22
  .description('Team-level skill governance compatible with open skill / Claude Skills')
18
- .version('0.1.0');
23
+ .version(version);
19
24
 
20
25
  // Add commands
21
26
  listCommand(program);
@@ -24,17 +29,10 @@ removeCommand(program);
24
29
  teamCommand(program);
25
30
  auditCommand(program);
26
31
  statusCommand(program);
27
-
28
- // OpenSkills compatible commands
29
- program
30
- .command('sync')
31
- .description('Sync skills to AGENTS.md (OpenSkills compatible)')
32
- .action(syncCommand);
33
-
34
- program
35
- .command('read <skill-name>')
36
- .description('Read skill content (OpenSkills compatible)')
37
- .action(readCommand);
32
+ syncCommand(program);
33
+ upgradeCommand(program);
34
+ readCommand(program);
35
+ manageCommand(program);
38
36
 
39
37
  // Parse arguments
40
38
  program.parse();
package/src/local.js CHANGED
@@ -3,22 +3,15 @@ import * as path from 'path';
3
3
  import { LocalSkill } from './types.js';
4
4
 
5
5
  export class LocalManager {
6
- constructor(projectRoot, options = {}) {
6
+ constructor(projectRoot) {
7
7
  this.projectRoot = projectRoot;
8
- this.global = options.global || false;
9
8
  }
10
9
 
11
10
  /**
12
11
  * Get local skills directory path
13
- * 默认项目级:.agent/skills
14
- * 全局:~/.agent/skills
15
12
  */
16
13
  getSkillsDir() {
17
- if (this.global) {
18
- const homeDir = process.env.HOME || process.env.USERPROFILE;
19
- return path.join(homeDir, '.agent', 'skills');
20
- }
21
- return path.join(this.projectRoot, '.agent', 'skills');
14
+ return path.join(this.projectRoot, 'skills');
22
15
  }
23
16
 
24
17
  /**
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 joySkills Team
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
package/spec/cli-spec.md DELETED
@@ -1,167 +0,0 @@
1
- ## joySkills CLI 规范草案
2
-
3
- 本规范定义 joySkills 命令行接口(CLI)的主要命令及其语义,重点说明:
4
-
5
- - 与 openskill 兼容的命令及行为。
6
- - joySkills 新增的团队治理相关命令。
7
-
8
- 实现可以使用任意技术栈,但应遵守本规范中定义的输入/输出语义与副作用约束。
9
-
10
- ### 1. 命令分类概览
11
-
12
- 1. **基础管理命令(兼容 openskill)**:
13
- - `joySkills list`
14
- - `joySkills install`
15
- - `joySkills remove`
16
- - `joySkills update` / `joySkills upgrade`
17
- - `joySkills read`
18
-
19
- 2. **团队 / Registry 管理命令(joySkills 扩展)**:
20
- - `joySkills team add`
21
- - `joySkills team sync`
22
- - `joySkills team use`
23
-
24
- 3. **版本与锁定相关命令(joySkills 扩展)**:
25
- - `joySkills status`
26
- - `joySkills audit`
27
-
28
- 4. **发布与审批命令(joySkills 扩展)**:
29
- - `joySkills publish`
30
- - `joySkills approve`
31
- - `joySkills deprecate`
32
-
33
- ### 2. 基础管理命令(兼容 openskill)
34
-
35
- #### 2.1 `joySkills list`
36
-
37
- - **用途**:列出当前 workspace 可用的 Skills。
38
- - **行为**:
39
- - 聚合本地 `skills/` 目录和绑定 Registry 中的可用 Skill 信息。
40
- - 默认仅展示每个 Skill 的名称、描述、当前推荐版本等。
41
- - 典型选项:
42
- - `--all-versions`:展示每个 Skill 的全部版本及状态。
43
- - `--registry <name>`:仅查看指定 Registry 的 Skill 列表。
44
-
45
- #### 2.2 `joySkills install <skill>[@version]`
46
-
47
- - **用途**:安装某个 Skill 到当前项目的 `skills/` 目录。
48
- - **行为**:
49
- - 未指定版本:
50
- - 从当前绑定的 Registry 中选择该 Skill 的“推荐版本”(`recommended == true` 且 `state == approved`)。
51
- - 指定版本:
52
- - 尝试从 Registry 中查找该版本,默认要求 `state == approved`。
53
- - 安装成功后:
54
- - 在 `skills/<name>/` 下写入具体文件;
55
- - 更新 `joySkills.lock` 中对应条目。
56
-
57
- #### 2.3 `joySkills remove <skill>`
58
-
59
- - **用途**:从当前项目移除一个 Skill。
60
- - **行为**:
61
- - 删除 `skills/<name>/` 目录(或标记为已移除,具体细节由实现决定)。
62
- - 更新 `joySkills.lock`,移除或标记该 Skill。
63
-
64
- #### 2.4 `joySkills update` / `joySkills upgrade`
65
-
66
- - **用途**:升级一个或多个 Skill 的版本。
67
- - **行为**:
68
- - 不带参数时:
69
- - 根据团队策略检查所有已安装 Skills 是否有可用升级版本。
70
- - 可以提示用户按交互方式选择要升级的 Targets。
71
- - 指定 Skill 时:
72
- - 根据策略(如仅 minor/patch)选择目标版本并执行安装,更新 lock。
73
-
74
- #### 2.5 `joySkills read <skill>`
75
-
76
- - **用途**:查看某个 Skill 的元信息与文档(例如 SKILL.md 内容)。
77
- - **行为**:
78
- - 从本地 `skills/` 目录或 Registry 中读取相关信息。
79
- - 输出可读格式,便于在终端中快速了解 Skill 能力。
80
-
81
- ### 3. 团队 / Registry 管理命令(joySkills 扩展)
82
-
83
- #### 3.1 `joySkills team add <name> <git-url>`
84
-
85
- - **用途**:在本地注册一个团队 Registry。
86
- - **行为**:
87
- - 将 `<name> -> <git-url>` 记录到 joySkills 的本地配置中。
88
- - 首次执行时尝试 clone 对应仓库,并解析其中的 `registry.yaml`。
89
-
90
- #### 3.2 `joySkills team sync [<name>]`
91
-
92
- - **用途**:同步指定或全部已注册 Registry。
93
- - **行为**:
94
- - 执行 `git fetch/pull` 更新本地缓存。
95
- - 重新解析 `registry.yaml`,更新本地索引。
96
-
97
- #### 3.3 `joySkills team use <name>`
98
-
99
- - **用途**:为当前 workspace 选择默认使用的团队 Registry。
100
- - **行为**:
101
- - 将所选 Registry ID 写入当前 workspace 配置或 `joySkills.lock` 的 `registryBindings` 中。
102
- - 后续 `list/install/upgrade` 等命令将默认使用该 Registry。
103
-
104
- ### 4. 版本与锁定相关命令
105
-
106
- #### 4.1 `joySkills status`
107
-
108
- - **用途**:查看当前项目所有 Skills 的版本状态。
109
- - **行为**:
110
- - 读取 `joySkills.lock` 与 Registry 索引,输出:
111
- - Skill 名称。
112
- - 当前版本号。
113
- - 版本状态(approved/deprecated 等)。
114
- - 是否存在可升级版本。
115
-
116
- #### 4.2 `joySkills audit`
117
-
118
- - **用途**:审计当前项目是否使用了已废弃或存在风险的 Skill 版本。
119
- - **行为**:
120
- - 对比 `joySkills.lock` 中版本与 Registry 索引中的状态。
121
- - 输出:
122
- - 所有使用 `deprecated` / 标记安全风险版本的 Skill。
123
- - 推荐的升级目标版本(如有)。
124
-
125
- ### 5. 发布与审批命令
126
-
127
- #### 5.1 `joySkills publish <skill>@<version> --registry <name>`
128
-
129
- - **用途**:将某个 Skill 版本发布到指定 Registry。
130
- - **行为**(典型集成方式):
131
- - 通常由 CI 在合并代码后调用:
132
- - 校验代码仓库中存在对应的 `skills/<name>/` 与 SKILL.md。
133
- - 更新 Registry 仓库中的 `registry.yaml`,新增该版本条目(初始 `state` 可以是 `pending_review` 或 `approved`)。
134
-
135
- #### 5.2 `joySkills approve <skill>@<version> --registry <name>`
136
-
137
- - **用途**:将某个版本标记为 `approved`,允许团队使用。
138
- - **行为**:
139
- - 校验调用者是否具备 `maintainer` 或以上权限。
140
- - 更新 Registry 索引中对应版本的 `state` 与 `approvedBy/approvedAt`。
141
-
142
- #### 5.3 `joySkills deprecate <skill>@<version> --registry <name>`
143
-
144
- - **用途**:将某个版本标记为 `deprecated`。
145
- - **行为**:
146
- - 更新 Registry 索引中 `state = deprecated`。
147
- - 可选:增加推荐替代版本信息,供 `audit` 与升级逻辑使用。
148
-
149
- ### 6. 与 openskill 的兼容策略
150
-
151
- - **命令级兼容**:
152
- - joySkills 的基础管理命令(list/install/remove/update/read)应与 openskill 在语义上保持对齐,确保现有使用习惯不被破坏。
153
-
154
- - **行为级兼容**:
155
- - 对于仅使用本地 `skills/` 目录的场景:
156
- - joySkills 可以退化为一个简单的本地管理工具,不依赖 Registry / lockfile。
157
- - 对于已有 openskill 的项目:
158
- - 只要 joySkills 保证生成的 `skills/` 目录与 openskill 一致,编辑器侧(Claude Code 等)就不需要做任何改动。
159
-
160
- ### 7. 未来扩展
161
-
162
- - 本规范聚焦 v1 所需的最小命令集合。
163
- - 后续如需扩展(例如:
164
- - 更多团队级配置命令;
165
- - 与企业 IAM/审计系统对接;
166
- - 交互式 TUI / Web UI;
167
- ),应在保持现有命令语义稳定的前提下新增子命令或选项。
@@ -1,108 +0,0 @@
1
- ## joySkills 锁文件(joySkills.lock)规范草案
2
-
3
- 本规范定义 joySkills 在项目根目录使用的锁文件 `joySkills.lock`,用于记录当前项目实际使用的 Skills 版本与来源,以支持版本锁定、升级策略和审计能力。
4
-
5
- ### 1. 概念与目标
6
-
7
- - **joySkills.lock 是什么?**
8
- - 一个声明式文件,描述“当前项目在实际使用哪些 `skill@version`、这些版本来自哪个 Registry、何时安装的”。
9
- - 类似于包管理器中的 lockfile(如 `package-lock.json` / `yarn.lock`),但对象是 AI Skills。
10
-
11
- - **设计目标**:
12
- - 确保团队内不同成员 / 不同环境在同一项目中使用一致的 Skill 版本。
13
- - 为审计工具提供稳定的数据源,用于构建 who-uses-what 视图。
14
- - 在不破坏 open skill / openskill 行为的前提下引入版本锁定能力。
15
-
16
- ### 2. 文件结构(示例)
17
-
18
- 下面示例采用 YAML 表达,实际可根据技术栈选择 YAML/JSON 等格式,但字段语义应保持一致。
19
-
20
- ```yaml
21
- lockVersion: 1
22
- projectId: "git@company:repo/path.git" # 可选,用于跨项目聚合
23
- registryBindings:
24
- - registryId: team://growth
25
- alias: growth
26
- - registryId: org://platform
27
- alias: platform
28
-
29
- skills:
30
- pdf:
31
- version: 1.2.0
32
- registry: team://growth
33
- installedAt: 2025-01-03T09:00:00Z
34
- web-testing:
35
- version: 0.9.1
36
- registry: org://platform
37
- installedAt: 2025-01-05T14:30:00Z
38
- ```
39
-
40
- ### 3. 字段语义
41
-
42
- - **顶层字段**:
43
- - `lockVersion`:
44
- - 锁文件格式版本号,用于未来演进与迁移。
45
- - `projectId`(可选):
46
- - 项目标识,用于跨仓库聚合审计数据,推荐使用仓库地址或唯一 ID。
47
- - `registryBindings[]`(可选):
48
- - 当前项目绑定的 Registry 列表:
49
- - `registryId`:Registry 的唯一标识,例如 `team://growth`。
50
- - `alias`:本地别名,可用于 CLI 参数的简写。
51
-
52
- - **`skills` 映射**:
53
- - key:
54
- - Skill 名称,通常与 `skills/<name>/` 目录名一致。
55
- - value:
56
- - `version`:该项目实际使用的版本号。
57
- - `registry`:该版本来源的 Registry ID。
58
- - `installedAt`:该版本安装或升级到当前状态的时间戳。
59
-
60
- ### 4. CLI 行为约定
61
-
62
- joySkills CLI 在读写 `joySkills.lock` 时应遵循以下约定:
63
-
64
- - `joySkills install <skill>`:
65
- - 未指定版本时:
66
- - 根据当前绑定 Registry 的推荐版本策略选择一个 `approved` 版本。
67
- - 安装成功后,在 `skills` 映射中写入或更新对应条目。
68
- - 指定版本时:
69
- - 安装指定版本(通常要求版本状态为 `approved` 或显式允许 `deprecated`),并写入 lock。
70
-
71
- - `joySkills upgrade <skill>`:
72
- - 根据团队策略(例如只允许 minor/patch 升级)与 Registry 索引选择目标版本。
73
- - 完成安装后更新 `version` 和 `installedAt` 字段。
74
-
75
- - `joySkills status`:
76
- - 读取 `joySkills.lock` 中的 `skills` 映射,结合 Registry 索引输出:
77
- - 当前 Skill 版本。
78
- - 版本状态(approved/deprecated 等)。
79
- - 是否有可用升级。
80
-
81
- - `joySkills audit`:
82
- - 读取 lockfile 与 Registry:
83
- - 标记使用 `deprecated` 或被标记为安全风险的版本。
84
- - 给出建议的升级目标(如果存在)。
85
-
86
- ### 5. 生成与更新策略
87
-
88
- - 锁文件应当由 joySkills CLI 自动生成与更新,避免手动编辑导致不一致。
89
- - 当 `skills/` 目录发生变动(通过 joySkills 命令)时,必须同步更新 `joySkills.lock`:
90
- - 新增 Skill:添加条目。
91
- - 升级 Skill:更新版本号与时间戳。
92
- - 移除 Skill:可以选择删除条目或标记为已移除(具体策略由实现决定)。
93
-
94
- ### 6. 与 openskill / 现有行为的兼容
95
-
96
- - 在没有 `joySkills.lock` 的项目中:
97
- - joySkills 可以在首次安装时自动生成锁文件;
98
- - 若仅使用 openskill,则该文件不存在,不影响其正常工作。
99
-
100
- - 共存策略:
101
- - 如果一个项目同时使用 openskill 和 joySkills:
102
- - 由 joySkills 管理的安装/升级操作应保证与 openskill 期望的目录结构兼容;
103
- - openskill 不需要理解 `joySkills.lock`,只要看到正确的 `skills/` 目录即可。
104
-
105
- ### 7. 演进与迁移
106
-
107
- - 锁文件格式演进时,通过提升 `lockVersion` 并提供迁移工具完成升级。
108
- - 建议新增字段保持向后兼容,旧版本工具在遇到未知字段时应忽略之,而不是报错中止。
@@ -1,117 +0,0 @@
1
- ## joySkills Registry 规范草案
2
-
3
- 本规范描述 joySkills 在 open skill / Claude Skills 协议之上的 **团队 / 组织级 Skill Registry 模型**。Registry 负责统一管理可用 Skills 的来源、版本及治理元数据。
4
-
5
- ### 1. 概念与目标
6
-
7
- - **Registry 是什么?**
8
- - 一个逻辑上的 Skill 源(Source),对应一组可安装的 Skills 及其元信息。
9
- - 物理上通常由一个 Git 仓库 + 一个索引文件(本规范默认使用 `registry.yaml`)实现。
10
-
11
- - **设计目标**:
12
- - 不改变 `skills/<name>/SKILL.md` 的结构与语义。
13
- - 在此之上增加:版本状态、可见性、维护者、推荐版本等治理信息。
14
- - 允许多个 Registry 共存(personal / team / org),由 joySkills CLI 统一访问。
15
-
16
- ### 2. 索引文件结构(示例)
17
-
18
- 下面示例采用 YAML 表达,仅说明字段含义,实际实现可以选择 YAML/JSON 等等。
19
-
20
- ```yaml
21
- registryVersion: 1
22
- registryId: team://example
23
- skills:
24
- - id: pdf
25
- name: "PDF 文档处理"
26
- visibility: public # public | restricted | internal
27
- maintainers:
28
- - alice
29
- - bob
30
- versions:
31
- - version: 1.2.0
32
- state: approved # draft | pending_review | approved | deprecated | archived
33
- createdBy: alice
34
- createdAt: 2025-01-01T10:00:00Z
35
- approvedBy: bob
36
- approvedAt: 2025-01-02T12:00:00Z
37
- recommended: true # 是否为默认推荐版本
38
- notes: "修复若干兼容性问题"
39
- - version: 1.1.0
40
- state: deprecated
41
- recommended: false
42
- notes: "存在安全风险,建议升级至 >=1.2.0"
43
- ```
44
-
45
- ### 3. 字段语义
46
-
47
- - **顶层字段**:
48
- - `registryVersion`:
49
- - 索引格式的版本号,用于未来演进(向后兼容 / 迁移策略)。
50
- - `registryId`:
51
- - 唯一标识一个 Registry,例如:`team://growth`、`org://platform`。
52
-
53
- - **`skills[]` 列表**:
54
- - `id`:
55
- - Skill 标识,一般与 `skills/<id>/` 目录名一致。
56
- - `name`:
57
- - 人类可读名称,用于 CLI / UI 展示。
58
- - `visibility`:
59
- - 控制该 Skill 在团队内的可见范围:
60
- - `public`:团队/组织内所有用户可见。
61
- - `restricted`:仅部分用户/用户组可见(具体规则可由实现扩展)。
62
- - `internal`:仅维护者/管理员可见,用于实验性 Skill。
63
- - `maintainers[]`:
64
- - 维护者用户名列表,用于权限校验与责任归属。
65
-
66
- - **`versions[]` 列表**:
67
- - `version`:
68
- - Skill 的版本号,建议使用 semver(如 `1.2.0`)。
69
- - `state`:
70
- - 当前版本的治理状态:
71
- - `draft`:草稿,通常仅存在于开发分支,不对普通用户开放安装。
72
- - `pending_review`:待审核,已提交合并请求或发布请求。
73
- - `approved`:已通过审核与自动化校验,允许团队范围使用。
74
- - `deprecated`:不再推荐使用,但仍允许安装,用于兼容旧项目。
75
- - `archived`:归档,通常不再对外展示,仅保留历史记录。
76
- - `recommended`:
77
- - 该版本是否为团队默认推荐版本(`true/false`)。
78
- - `createdBy` / `createdAt` / `approvedBy` / `approvedAt` / `notes`:
79
- - 元数据字段,用于审计与可观测性,不参与核心协议判断。
80
-
81
- ### 4. 状态机与行为约束
82
-
83
- Registry 只记录状态,不强制具体工作流实现;下面是推荐的状态迁移:
84
-
85
- - `draft` → `pending_review`:
86
- - 开发者完成 Skill 修改,发起代码评审或发布请求。
87
- - `pending_review` → `approved`:
88
- - 审核人与 CI 校验通过,将该版本标记为可用。
89
- - `approved` → `deprecated`:
90
- - 当存在更优版本、或发现风险时,由维护者将旧版本标记为不推荐使用。
91
- - `deprecated` → `archived`:
92
- - 当版本长期不再需要时,出于列表简化与合规因素,将其归档。
93
-
94
- joySkills CLI 在读取 Registry 时应遵守以下约束:
95
-
96
- - 默认 `list` / `install` 仅展示 / 使用 `approved` 状态中的版本。
97
- - 安装 `deprecated` 版本时应明确告警,并提示推荐替代版本(如果有)。
98
- - `draft` 和 `pending_review` 版本仅对维护者 / 管理员可见,普通用户不可见。
99
-
100
- ### 5. 与 SKILL.md 的边界
101
-
102
- - SKILL.md 负责:
103
- - 描述 Skill 本身的能力、参数、运行方式等(open skill 协议层)。
104
- - Registry 索引负责:
105
- - 记录该 Skill 在某个团队 / 组织环境下的治理信息:可见性、状态、维护者、推荐版本等。
106
-
107
- 两者必须通过 `id` 与 `version` 对应,但语义分工清晰,避免相互污染。
108
-
109
- ### 6. 兼容性与演进
110
-
111
- - **向后兼容**:
112
- - 在没有 Registry 的场景下,joySkills 可以退化为仅基于本地 `skills/` 目录工作的模式。
113
- - 当 Registry 存在但不包含某个 Skill 时,可按 openskill 的行为处理(例如直接从 Git 安装)。
114
-
115
- - **向前演进**:
116
- - 未来如需扩展字段,可通过提升 `registryVersion` 并提供迁移脚本实现。
117
- - 建议所有新增字段保持可选,避免破坏现有实现。