@heihei0299/matt-skills 1.1.0 → 1.1.2
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.
|
@@ -24,12 +24,15 @@ Prompt: verify idempotent init without --force
|
|
|
24
24
|
Command: `init` twice without `--force`, second with local edit to `AGENTS.md`
|
|
25
25
|
Expected: second stdout `模板已存在.*跳过`, `上游技能:已装 0、跳过 22`; local edit preserved; exit 0.
|
|
26
26
|
|
|
27
|
-
### 3. Init --force with
|
|
28
|
-
Prompt: verify forced init
|
|
27
|
+
### 3. Init --force with direct overwrite
|
|
28
|
+
Prompt: verify forced init directly overwrites
|
|
29
29
|
Command: `init --force --dest <tmp>` after local edit
|
|
30
|
-
Expected: stdout
|
|
30
|
+
Expected: stdout `已覆盖` + `已装 22`; `AGENTS.md.bak` exists with local edit; `AGENTS.md` restored from template; no `.agents/skills/*.bak`; no `.opencode.bak`/`.pi.bak`; exit 0.
|
|
31
31
|
|
|
32
32
|
### 4. Sync on existing
|
|
33
|
+
Prompt: verify sync directly updates existing project
|
|
34
|
+
Command: `sync --dest <tmp>` after local edit
|
|
35
|
+
Expected: stdout `同步` + `已同步`/`已更新`; `AGENTS.md.bak` exists; `.agents/skills/tdd` updated; exit 0.
|
|
33
36
|
Prompt: verify sync backs up existing project
|
|
34
37
|
Command: `sync --dest <tmp>` after local edit
|
|
35
38
|
Expected: stdout `同步` + `已备份`; `AGENTS.md.bak` exists; exit 0.
|
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ template/
|
|
|
9
9
|
├── AGENTS.md 项目级全局配置(行为路由 + 分文件指针)
|
|
10
10
|
├── .pi/ pi-agent 项目配置(pi 标准结构:`.pi/skills/` 直放独有技能,自动发现)
|
|
11
11
|
└── .opencode/ 分发内容(目标仓库的 opencode 项目配置)
|
|
12
|
-
├── skills/
|
|
12
|
+
├── skills/ 5 个独有技能(tdd-implement、grill-to-spec、diagnose-fix、commit-check、instance-test)
|
|
13
13
|
├── agents/ issue-audit 子代理定义
|
|
14
14
|
├── commands/ issue-audit + 9 个显式触发技能命令(grill-to-spec/wayfinder/to-spec/to-tickets/triage/improve-codebase-architecture/teach/handoff/writing-great-skills)
|
|
15
15
|
├── docs/agents/ 5 个分文件(运行时纪律 / 技能设计 / issue tracker / triage labels / domain)
|
|
@@ -31,16 +31,16 @@ npx @heihei0299/matt-skills init
|
|
|
31
31
|
1. 复制 `template/` 快照(`AGENTS.md`、`.opencode/`、`.pi/`)到当前目录;
|
|
32
32
|
2. 把上游技能(engineering 17 个 + productivity 5 个)复制到 `.agents/skills/`。
|
|
33
33
|
|
|
34
|
-
选项:`--dest <path>` 指定目标目录(默认当前目录);`--force`
|
|
34
|
+
选项:`--dest <path>` 指定目标目录(默认当前目录);`--force` 覆盖已存在的文件(直接覆盖,`AGENTS.md` 会备份到 `.bak`)(默认跳过)。
|
|
35
35
|
|
|
36
36
|
**增量同步(已有项目)**:已有项目更新到最新模板与技能:
|
|
37
37
|
|
|
38
38
|
```sh
|
|
39
|
-
npx @heihei0299/matt-skills sync #
|
|
40
|
-
npx @heihei0299/matt-skills sync --force #
|
|
39
|
+
npx @heihei0299/matt-skills sync # 增量同步,直接更新
|
|
40
|
+
npx @heihei0299/matt-skills sync --force # 同上(直接覆盖)
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
`sync` 专为已有项目设计:自动检测 `AGENTS.md`
|
|
43
|
+
`sync` 专为已有项目设计:自动检测 `AGENTS.md` 是否存在,存在则增量更新模板与上游技能(直接覆盖,`AGENTS.md` 会备份),不存在则等同全新 `init`。与 `init --force` 的区别:`sync` 语义更明确,建议已有项目优先用 `sync`。
|
|
44
44
|
|
|
45
45
|
上游没有 `tdd-implement`、`grill-to-spec`、`diagnose-fix`、`commit-check`,复制天然不冲突。目标仓库会话即自动加载全部技能(上游在 `.agents/skills/`、独有在 `.opencode/skills/`;pi 侧独有在 `.pi/skills/`)与项目级全局配置(行为路由表、分文件约定);`issue-audit` 以子代理 + 命令形式分发(`.opencode/agents/`、`.opencode/commands/`);9 个显式触发技能注册为 opencode 命令(`.opencode/commands/`,`/命令名` 触发)。
|
|
46
46
|
|
|
@@ -116,13 +116,13 @@ pi 下对应能力以内置工具或已装扩展为准(`AGENTS.md`「能力边
|
|
|
116
116
|
|
|
117
117
|
```sh
|
|
118
118
|
node bin/cli.js init [--dest <dir>] [--force] # 初始化项目:template + 上游技能
|
|
119
|
-
node bin/cli.js sync [--dest <dir>] [--force] #
|
|
119
|
+
node bin/cli.js sync [--dest <dir>] [--force] # 同步已有项目到最新(直接覆盖)
|
|
120
120
|
node bin/cli.js list [--json] # 列出 .agents/skills/ 下全部技能及描述
|
|
121
121
|
node bin/cli.js install [选项] # 把技能复制到目标工具目录(交互式选择)
|
|
122
122
|
```
|
|
123
123
|
|
|
124
|
-
`init` 选项:`--dest <dir>` 指定目标目录(默认当前目录);`--force`
|
|
125
|
-
`sync` 选项:`--dest <dir>` 指定目标目录;`--force`
|
|
124
|
+
`init` 选项:`--dest <dir>` 指定目标目录(默认当前目录);`--force` 覆盖已存在的文件(直接覆盖,`AGENTS.md` 会备份到 `.bak`)(默认跳过),见「初始化」。
|
|
125
|
+
`sync` 选项:`--dest <dir>` 指定目标目录;`--force` 直接覆盖(与默认一致),见「初始化」增量同步。
|
|
126
126
|
|
|
127
127
|
`install` 选项:
|
|
128
128
|
|
|
@@ -160,8 +160,11 @@ npm publish
|
|
|
160
160
|
## 开发
|
|
161
161
|
|
|
162
162
|
```sh
|
|
163
|
-
npm test
|
|
163
|
+
npm test # 全量测试 122 项
|
|
164
|
+
npm run build:template # 从单源生成 template/.opencode/.pi(config/proprietary.json 为单一事实源)
|
|
164
165
|
```
|
|
165
166
|
|
|
166
|
-
交互模式依赖 `prompts`(见 `package.json`);测试见 `test/cli.test.js`。
|
|
167
|
+
交互模式依赖 `prompts`(见 `package.json`);测试见 `test/cli.test.js`、`test/cli-init.test.js`、`test/template-sync.test.js`。
|
|
168
|
+
|
|
169
|
+
用户手动触发的功能测试:`/instance-test`(见 `.agents/skills/instance-test/SKILL.md`)——在隔离 `temp dir` 跑 prompt 实例验实际功能,`references/instances.md` 为通用模板。
|
|
167
170
|
|
package/bin/cli.js
CHANGED
|
@@ -17,17 +17,17 @@ const HELP = `matt-skills — install and manage this skill collection
|
|
|
17
17
|
|
|
18
18
|
Usage:
|
|
19
19
|
matt-skills init [options] Initialize a project: template + upstream skills
|
|
20
|
-
matt-skills sync [options] Sync existing project to latest template + skills
|
|
20
|
+
matt-skills sync [options] Sync existing project to latest template + skills
|
|
21
21
|
matt-skills list [--json] List available skills and their descriptions
|
|
22
22
|
matt-skills install [options] Install skills (interactive by default)
|
|
23
23
|
matt-skills --help Show this help
|
|
24
24
|
|
|
25
25
|
Init options:
|
|
26
26
|
--dest <path> Target directory (default: current directory)
|
|
27
|
-
--force Overwrite existing files
|
|
27
|
+
--force Overwrite existing files
|
|
28
28
|
Sync options:
|
|
29
29
|
--dest <path> Target directory (default: current directory)
|
|
30
|
-
--force Overwrite
|
|
30
|
+
--force Overwrite existing files
|
|
31
31
|
|
|
32
32
|
Install options:
|
|
33
33
|
--tools <a,b> Install for the given tools (codex, pi, opencode, claude); skips tool selection
|
|
@@ -173,15 +173,13 @@ async function initCommand({ dest, force }) {
|
|
|
173
173
|
const target = dest ? path.resolve(process.cwd(), dest) : process.cwd();
|
|
174
174
|
const marker = path.join(target, 'AGENTS.md');
|
|
175
175
|
if (!force && (await pathExists(marker))) {
|
|
176
|
-
process.stdout.write('模板已存在(AGENTS.md),跳过;用 --force
|
|
176
|
+
process.stdout.write('模板已存在(AGENTS.md),跳过;用 --force 覆盖\n');
|
|
177
177
|
} else {
|
|
178
178
|
if (force && (await pathExists(marker))) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
if (await pathExists(cur)) await backupIfExists(cur);
|
|
182
|
-
}
|
|
179
|
+
const cur = path.join(target, 'AGENTS.md');
|
|
180
|
+
if (await pathExists(cur)) await backupIfExists(cur);
|
|
183
181
|
await cp(TEMPLATE_DIR, target, { recursive: true, force: true });
|
|
184
|
-
process.stdout.write('
|
|
182
|
+
process.stdout.write('模板:已覆盖(AGENTS.md、.opencode/、.pi/)\n');
|
|
185
183
|
} else {
|
|
186
184
|
await cp(TEMPLATE_DIR, target, { recursive: true, force: true });
|
|
187
185
|
process.stdout.write('模板:已复制(AGENTS.md、.opencode/、.pi/)\n');
|
|
@@ -195,7 +193,6 @@ async function initCommand({ dest, force }) {
|
|
|
195
193
|
const skillsDir = path.join(target, '.agents', 'skills');
|
|
196
194
|
let installed = 0;
|
|
197
195
|
let skipped = 0;
|
|
198
|
-
let backedUp = 0;
|
|
199
196
|
for (const name of upstream) {
|
|
200
197
|
const src = path.join(SKILLS_DIR, name);
|
|
201
198
|
const dst = path.join(skillsDir, name);
|
|
@@ -207,18 +204,10 @@ async function initCommand({ dest, force }) {
|
|
|
207
204
|
skipped++;
|
|
208
205
|
continue;
|
|
209
206
|
}
|
|
210
|
-
if (force && (await pathExists(dst))) {
|
|
211
|
-
await backupIfExists(dst);
|
|
212
|
-
backedUp++;
|
|
213
|
-
}
|
|
214
207
|
await cp(src, dst, { recursive: true, force: true });
|
|
215
208
|
installed++;
|
|
216
209
|
}
|
|
217
|
-
|
|
218
|
-
process.stdout.write(`上游技能:已装 ${installed}、跳过 ${skipped}、备份 ${backedUp} 到 .bak\n`);
|
|
219
|
-
} else {
|
|
220
|
-
process.stdout.write(`上游技能:已装 ${installed}、跳过 ${skipped}\n`);
|
|
221
|
-
}
|
|
210
|
+
process.stdout.write(`上游技能:已装 ${installed}、跳过 ${skipped}\n`);
|
|
222
211
|
process.stdout.write(`目标路径:${target}\n`);
|
|
223
212
|
}
|
|
224
213
|
|
|
@@ -231,15 +220,13 @@ async function syncCommand({ dest, force }) {
|
|
|
231
220
|
await cp(TEMPLATE_DIR, target, { recursive: true, force: true });
|
|
232
221
|
process.stdout.write('模板:已复制(AGENTS.md、.opencode/、.pi/)\n');
|
|
233
222
|
} else {
|
|
234
|
-
process.stdout.write('
|
|
223
|
+
process.stdout.write('同步:检测到现有项目,将增量更新\n');
|
|
235
224
|
if (backup) {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
if (await pathExists(cur)) await backupIfExists(cur);
|
|
239
|
-
}
|
|
225
|
+
const cur = path.join(target, 'AGENTS.md');
|
|
226
|
+
if (await pathExists(cur)) await backupIfExists(cur);
|
|
240
227
|
}
|
|
241
228
|
await cp(TEMPLATE_DIR, target, { recursive: true, force: true });
|
|
242
|
-
process.stdout.write(backup ? '
|
|
229
|
+
process.stdout.write(backup ? '模板:已同步(AGENTS.md、.opencode/、.pi/)\n' : '模板:已覆盖(AGENTS.md、.opencode/、.pi/)\n');
|
|
243
230
|
}
|
|
244
231
|
const entries = await readdir(SKILLS_DIR, { withFileTypes: true });
|
|
245
232
|
const upstream = entries
|
|
@@ -249,7 +236,6 @@ async function syncCommand({ dest, force }) {
|
|
|
249
236
|
const skillsDir = path.join(target, '.agents', 'skills');
|
|
250
237
|
let installed = 0;
|
|
251
238
|
let updated = 0;
|
|
252
|
-
let backedUp = 0;
|
|
253
239
|
for (const name of upstream) {
|
|
254
240
|
const src = path.join(SKILLS_DIR, name);
|
|
255
241
|
const dst = path.join(skillsDir, name);
|
|
@@ -259,10 +245,6 @@ async function syncCommand({ dest, force }) {
|
|
|
259
245
|
}
|
|
260
246
|
const exists = await pathExists(dst);
|
|
261
247
|
if (exists) {
|
|
262
|
-
if (backup) {
|
|
263
|
-
await backupIfExists(dst);
|
|
264
|
-
backedUp++;
|
|
265
|
-
}
|
|
266
248
|
await cp(src, dst, { recursive: true, force: true });
|
|
267
249
|
updated++;
|
|
268
250
|
} else {
|
|
@@ -270,11 +252,7 @@ async function syncCommand({ dest, force }) {
|
|
|
270
252
|
installed++;
|
|
271
253
|
}
|
|
272
254
|
}
|
|
273
|
-
|
|
274
|
-
process.stdout.write(`上游技能:新增 ${installed}、更新 ${updated}(已备份 ${backedUp} 到 .bak)\n`);
|
|
275
|
-
} else {
|
|
276
|
-
process.stdout.write(`上游技能:新增 ${installed}、更新 ${updated}\n`);
|
|
277
|
-
}
|
|
255
|
+
process.stdout.write(`上游技能:新增 ${installed}、更新 ${updated}\n`);
|
|
278
256
|
process.stdout.write(`目标路径:${target}\n`);
|
|
279
257
|
}
|
|
280
258
|
|
package/package.json
CHANGED
|
@@ -24,12 +24,15 @@ Prompt: verify idempotent init without --force
|
|
|
24
24
|
Command: `init` twice without `--force`, second with local edit to `AGENTS.md`
|
|
25
25
|
Expected: second stdout `模板已存在.*跳过`, `上游技能:已装 0、跳过 22`; local edit preserved; exit 0.
|
|
26
26
|
|
|
27
|
-
### 3. Init --force with
|
|
28
|
-
Prompt: verify forced init
|
|
27
|
+
### 3. Init --force with direct overwrite
|
|
28
|
+
Prompt: verify forced init directly overwrites
|
|
29
29
|
Command: `init --force --dest <tmp>` after local edit
|
|
30
|
-
Expected: stdout
|
|
30
|
+
Expected: stdout `已覆盖` + `已装 22`; `AGENTS.md.bak` exists with local edit; `AGENTS.md` restored from template; no `.agents/skills/*.bak`; no `.opencode.bak`/`.pi.bak`; exit 0.
|
|
31
31
|
|
|
32
32
|
### 4. Sync on existing
|
|
33
|
+
Prompt: verify sync directly updates existing project
|
|
34
|
+
Command: `sync --dest <tmp>` after local edit
|
|
35
|
+
Expected: stdout `同步` + `已同步`/`已更新`; `AGENTS.md.bak` exists; `.agents/skills/tdd` updated; exit 0.
|
|
33
36
|
Prompt: verify sync backs up existing project
|
|
34
37
|
Command: `sync --dest <tmp>` after local edit
|
|
35
38
|
Expected: stdout `同步` + `已备份`; `AGENTS.md.bak` exists; exit 0.
|
|
@@ -24,12 +24,15 @@ Prompt: verify idempotent init without --force
|
|
|
24
24
|
Command: `init` twice without `--force`, second with local edit to `AGENTS.md`
|
|
25
25
|
Expected: second stdout `模板已存在.*跳过`, `上游技能:已装 0、跳过 22`; local edit preserved; exit 0.
|
|
26
26
|
|
|
27
|
-
### 3. Init --force with
|
|
28
|
-
Prompt: verify forced init
|
|
27
|
+
### 3. Init --force with direct overwrite
|
|
28
|
+
Prompt: verify forced init directly overwrites
|
|
29
29
|
Command: `init --force --dest <tmp>` after local edit
|
|
30
|
-
Expected: stdout
|
|
30
|
+
Expected: stdout `已覆盖` + `已装 22`; `AGENTS.md.bak` exists with local edit; `AGENTS.md` restored from template; no `.agents/skills/*.bak`; no `.opencode.bak`/`.pi.bak`; exit 0.
|
|
31
31
|
|
|
32
32
|
### 4. Sync on existing
|
|
33
|
+
Prompt: verify sync directly updates existing project
|
|
34
|
+
Command: `sync --dest <tmp>` after local edit
|
|
35
|
+
Expected: stdout `同步` + `已同步`/`已更新`; `AGENTS.md.bak` exists; `.agents/skills/tdd` updated; exit 0.
|
|
33
36
|
Prompt: verify sync backs up existing project
|
|
34
37
|
Command: `sync --dest <tmp>` after local edit
|
|
35
38
|
Expected: stdout `同步` + `已备份`; `AGENTS.md.bak` exists; exit 0.
|