@heihei0299/matt-skills 3.0.26 → 3.0.28
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/.agents/skills/initialize-project/SKILL.md +92 -0
- package/README.md +6 -5
- package/bin/cli.js +19 -27
- package/bin/skill-selection.js +3 -12
- package/config/default.json +16 -0
- package/config/engineering.json +2 -1
- package/config/proprietary.json +5 -4
- package/config/required.json +0 -1
- package/package.json +2 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: initialize-project
|
|
3
|
+
description: "Initialize a target repository's agent context by deriving stable project facts, updating AGENTS.md with a compact six-part context block, and writing detailed PROJECT.md context."
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Initialize Project
|
|
8
|
+
|
|
9
|
+
显式调用本 skill,在目标项目根目录初始化或刷新项目上下文。先读取事实,再写文件;不凭目录名、包名或猜测补全项目目标。
|
|
10
|
+
|
|
11
|
+
## 1. 收集事实
|
|
12
|
+
|
|
13
|
+
读取能说明项目真实行为的版本化材料:
|
|
14
|
+
|
|
15
|
+
- `README.md`、现有 `AGENTS.md`、`PROJECT.md`、`CONTEXT.md` 和相关文档
|
|
16
|
+
- `package.json`、其他 manifest、构建/运行配置
|
|
17
|
+
- 根目录和主要源码目录,定位架构边界、入口、关键职责
|
|
18
|
+
- 测试目录、测试配置和 CI 配置,确认测试规则与稳定命令
|
|
19
|
+
|
|
20
|
+
优先记录稳定且代理需要知道、但不能从一次查找直接得出的事实。不要把完整命令清单、依赖清单、动态路线图或重复的通用规则写进 `PROJECT.md`。若项目用途、范围、入口或六项内容无法从仓库确认,一次性向用户询问缺失事实后再写入。
|
|
21
|
+
|
|
22
|
+
文档语言跟随目标仓库的主要语言;没有明确语言信号时跟随用户语言。保留现有文档的其他内容。
|
|
23
|
+
|
|
24
|
+
## 2. 更新 `AGENTS.md`
|
|
25
|
+
|
|
26
|
+
维护唯一的受管区块,使用以下标记:
|
|
27
|
+
|
|
28
|
+
```md
|
|
29
|
+
<!-- matt-skills:managed:start -->
|
|
30
|
+
## 项目上下文
|
|
31
|
+
### 架构边界
|
|
32
|
+
见 `PROJECT.md` 的“架构边界”。
|
|
33
|
+
### 仓库地图
|
|
34
|
+
见 `PROJECT.md` 的“仓库地图”。
|
|
35
|
+
### 标准命令
|
|
36
|
+
见 `PROJECT.md` 的“标准命令”。
|
|
37
|
+
### 测试规则
|
|
38
|
+
见 `PROJECT.md` 的“测试规则”。
|
|
39
|
+
### 项目约束
|
|
40
|
+
见 `PROJECT.md` 的“项目约束”。
|
|
41
|
+
### 完成标准
|
|
42
|
+
见 `PROJECT.md` 的“完成标准”。
|
|
43
|
+
<!-- matt-skills:managed:end -->
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
- 六个 `###` 标题必须按 `架构边界`、`仓库地图`、`标准命令`、`测试规则`、`项目约束`、`完成标准` 顺序出现。
|
|
47
|
+
- 受管区块总行数必须不超过 30 行;只写简要规则或 `PROJECT.md` 指针,详细事实只放 `PROJECT.md`。
|
|
48
|
+
- 已有完整标记区块时原位替换;没有时追加到文件末尾;不得重排、覆盖或改写其他内容。
|
|
49
|
+
- `AGENTS.md` 不存在时,优先复制目标项目的 `template/AGENTS.md`,再追加区块;模板不可用时创建最小 `AGENTS.md`,只包含该区块。
|
|
50
|
+
- 无论项目是否存在 `CLAUDE.md`,初始化状态和项目上下文都固定维护在 `AGENTS.md`。
|
|
51
|
+
|
|
52
|
+
## 3. 更新 `PROJECT.md`
|
|
53
|
+
|
|
54
|
+
维护 `PROJECT.md` 专用受管标记(不要与 `AGENTS.md` 的 CLI 受管标记混用):
|
|
55
|
+
|
|
56
|
+
```md
|
|
57
|
+
<!-- initialize-project:start -->
|
|
58
|
+
## 项目概览
|
|
59
|
+
### 项目用途
|
|
60
|
+
### 项目范围
|
|
61
|
+
### 主要入口
|
|
62
|
+
### 架构边界
|
|
63
|
+
### 仓库地图
|
|
64
|
+
### 标准命令
|
|
65
|
+
### 测试规则
|
|
66
|
+
### 项目约束
|
|
67
|
+
### 完成标准
|
|
68
|
+
<!-- initialize-project:end -->
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
将每个标题填成基于仓库事实的详细说明:
|
|
72
|
+
|
|
73
|
+
- **项目用途**:解决的问题、服务对象和预期结果。
|
|
74
|
+
- **项目范围**:负责的能力,以及仓库明确排除的范围;没有证据就不臆造非目标。
|
|
75
|
+
- **主要入口**:用户入口、应用/包入口和代理应先看的文档或目录。
|
|
76
|
+
- **架构边界**:模块职责、依赖方向、外部系统边界和不可跨越的层次边界。
|
|
77
|
+
- **仓库地图**:关键目录及其职责;只列影响代理决策的稳定目录。
|
|
78
|
+
- **标准命令**:少量最常用且稳定的开发、验证或发布入口;命令的完整来源仍以 manifest 和配置为准。
|
|
79
|
+
- **测试规则**:测试位置、测试层级、命名/运行约定,以及失败时必须保留的证据。
|
|
80
|
+
- **项目约束**:运行时、兼容性、安全、生成文件、依赖或发布方面的明确约束。
|
|
81
|
+
- **完成标准**:实现、验证、文档、工作区或提交范围方面的交付要求。
|
|
82
|
+
|
|
83
|
+
`PROJECT.md` 不存在时创建标题 `# Project Context` 后写入区块。已存在且含完整标记时只替换标记内内容;已存在但没有标记时在末尾追加区块,不覆盖自由格式内容。若标记不成对,停止写入并报告,避免破坏文档。不得生成空章节、`TBD` 或未经确认的事实。
|
|
84
|
+
|
|
85
|
+
## 4. 完成检查
|
|
86
|
+
|
|
87
|
+
写入后确认:
|
|
88
|
+
|
|
89
|
+
- `AGENTS.md` 区块只有一份,六个标题顺序正确且总行数不超过 30 行。
|
|
90
|
+
- `PROJECT.md` 区块只有一份,九个章节均有事实内容,且其他内容未改变。
|
|
91
|
+
- 第二次运行会原位替换而不是追加重复内容。
|
|
92
|
+
- 只修改目标 `AGENTS.md`/`PROJECT.md` 和本 skill 需要的文件;不创建备份或额外模板资源。
|
package/README.md
CHANGED
|
@@ -28,15 +28,16 @@ template/
|
|
|
28
28
|
|
|
29
29
|
## 独有 skill 分发边界
|
|
30
30
|
|
|
31
|
-
本仓库有
|
|
31
|
+
本仓库有 8 个独有(proprietary)skills:
|
|
32
32
|
|
|
33
|
-
### 可分发的
|
|
33
|
+
### 可分发的 6 个
|
|
34
34
|
|
|
35
35
|
- `tdd-implement`
|
|
36
36
|
- `diagnose-fix`
|
|
37
37
|
- `grill-to-spec`
|
|
38
38
|
- `scaffold-functional-test`
|
|
39
39
|
- `show-me`
|
|
40
|
+
- `initialize-project`
|
|
40
41
|
|
|
41
42
|
### 仓库内部的 2 个
|
|
42
43
|
|
|
@@ -50,7 +51,7 @@ repo-local skills 不会通过 `init`、`install`、`sync` 分发到用户项目
|
|
|
50
51
|
在目标仓库根目录执行:
|
|
51
52
|
|
|
52
53
|
```sh
|
|
53
|
-
npx @heihei0299/matt-skills init # 安装默认
|
|
54
|
+
npx @heihei0299/matt-skills init # 安装默认 workflow skills
|
|
54
55
|
npx @heihei0299/matt-skills init --all # 安装全部可分发 skills
|
|
55
56
|
```
|
|
56
57
|
|
|
@@ -64,7 +65,7 @@ npx @heihei0299/matt-skills sync --dry-run --json
|
|
|
64
65
|
|
|
65
66
|
`init` 对已有 `AGENTS.md` 始终跳过;已有项目使用 `sync`。默认 `sync` 保留已有 `AGENTS.md` 和项目规则,`--all` 只扩大技能范围。需要显式刷新 `AGENTS.md` 时使用 `sync --refresh-agents`;无受管区块时会先备份为 `AGENTS.md.bak`。`sync` 不删除目标项目的额外文件或自定义 skills。
|
|
66
67
|
|
|
67
|
-
默认
|
|
68
|
+
默认 workflow 范围固定为 14 个入口及依赖 skills,包含 `initialize-project`、`setup-matt-pocock-skills`、`wayfinder`、`grill-to-spec`、`grill-with-docs`、`to-spec`、`to-tickets`、`tdd-implement`、`implement`、`handoff`、`grilling`、`domain-modeling`、`tdd` 和 `code-review`;其中默认独有 skills 是 `tdd-implement`、`grill-to-spec`、`initialize-project`。完整可分发集合仍通过 `--all` 获取。
|
|
68
69
|
|
|
69
70
|
## CLI
|
|
70
71
|
|
|
@@ -78,7 +79,7 @@ npx @heihei0299/matt-skills check [--all] [--json] [--upstream <url>] [--ref <re
|
|
|
78
79
|
|
|
79
80
|
常用选项:
|
|
80
81
|
|
|
81
|
-
- `--all`:包含全部可分发 skills,默认范围只包含
|
|
82
|
+
- `--all`:包含全部可分发 skills,默认范围只包含 workflow skills;不会隐式刷新 `AGENTS.md`。
|
|
82
83
|
- `--refresh-agents`:显式刷新目标 `AGENTS.md`;与 `--all`、`--dry-run` 可组合。
|
|
83
84
|
- `--dest <dir>`:指定目标目录。
|
|
84
85
|
- `--tools <list>`:选择 `codex`、`pi`、`opencode` 或 `claude`;项目级 skills 统一写入 `.agents/skills/`,全局安装仍使用各工具目录。
|
package/bin/cli.js
CHANGED
|
@@ -15,18 +15,11 @@ import { loadSkillSet } from './skill-config.js';
|
|
|
15
15
|
|
|
16
16
|
const SKILLS_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '.agents', 'skills');
|
|
17
17
|
const TEMPLATE_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'template');
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return ENGINEERING_SKILLS;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
let REQUIRED_SKILLS = null;
|
|
27
|
-
async function loadRequiredSkills() {
|
|
28
|
-
if (!REQUIRED_SKILLS) REQUIRED_SKILLS = await loadSkillSet(REQUIRED_PATH, 'required');
|
|
29
|
-
return REQUIRED_SKILLS;
|
|
18
|
+
const DEFAULT_PATH = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'config', 'default.json');
|
|
19
|
+
let DEFAULT_SKILLS = null;
|
|
20
|
+
async function loadDefaultSkills() {
|
|
21
|
+
if (!DEFAULT_SKILLS) DEFAULT_SKILLS = await loadSkillSet(DEFAULT_PATH, 'default');
|
|
22
|
+
return DEFAULT_SKILLS;
|
|
30
23
|
}
|
|
31
24
|
process.stdout.on('error', (err) => {
|
|
32
25
|
if (err.code === 'EPIPE') process.exit(0);
|
|
@@ -55,7 +48,7 @@ Usage:
|
|
|
55
48
|
|
|
56
49
|
Init options:
|
|
57
50
|
--dest <path> Target directory (default: current directory)
|
|
58
|
-
--all Include all distributable skills; default only default
|
|
51
|
+
--all Include all distributable skills; default only default workflow skills
|
|
59
52
|
--help, -h Show this help
|
|
60
53
|
提示:已有 AGENTS.md 时 init 始终跳过;需要更新已有项目请使用 sync。
|
|
61
54
|
|
|
@@ -76,7 +69,7 @@ Sync options:
|
|
|
76
69
|
--help, -h Show this help
|
|
77
70
|
项目 skills:${PROJECT_SKILL_DIRS}
|
|
78
71
|
|
|
79
|
-
|
|
72
|
+
说明:默认同步默认 workflow skill 并保留现有 AGENTS.md;--all 只扩大技能范围。
|
|
80
73
|
--refresh-agents 与 --all、--dry-run 可组合;上游检查请使用 check。
|
|
81
74
|
|
|
82
75
|
提示:matt-skills --help 查看全量
|
|
@@ -88,7 +81,7 @@ Usage:
|
|
|
88
81
|
matt-skills list [--all] [--json]
|
|
89
82
|
|
|
90
83
|
List options:
|
|
91
|
-
--all List all distributable skills (default only default
|
|
84
|
+
--all List all distributable skills (default only default workflow skills)
|
|
92
85
|
--json Output as JSON
|
|
93
86
|
--help, -h Show this help
|
|
94
87
|
|
|
@@ -117,7 +110,7 @@ Usage:
|
|
|
117
110
|
|
|
118
111
|
Install options:
|
|
119
112
|
--tools <a,b> Install for the given tools (codex, pi, opencode, claude); skips tool selection
|
|
120
|
-
--all Install all distributable skills (default only default
|
|
113
|
+
--all Install all distributable skills (default only default workflow); skips skill selection
|
|
121
114
|
--force Overwrite existing skills
|
|
122
115
|
--global Install to the user's global skill directories
|
|
123
116
|
--project Install to project skill directories (default)
|
|
@@ -160,8 +153,7 @@ async function listSkillNames({ onlyProgramming = false } = {}) {
|
|
|
160
153
|
return resolveSkillNames({
|
|
161
154
|
availableNames: await listAvailableSkillNames(),
|
|
162
155
|
mode: onlyProgramming ? 'default' : 'all',
|
|
163
|
-
|
|
164
|
-
required: onlyProgramming ? await loadRequiredSkills() : [],
|
|
156
|
+
defaults: onlyProgramming ? await loadDefaultSkills() : [],
|
|
165
157
|
});
|
|
166
158
|
}
|
|
167
159
|
|
|
@@ -410,17 +402,17 @@ async function initCommand({ dest, all }) {
|
|
|
410
402
|
installed = entries.filter((e) => e.isDirectory() && !e.name.endsWith('.bak') && e.name !== '.git' && e.name !== 'skill-creator' && !isRepoLocalSkill(e.name)).length;
|
|
411
403
|
} catch {}
|
|
412
404
|
const allSkillsFull = await listSkills({ onlyProgramming: false });
|
|
413
|
-
const
|
|
414
|
-
const
|
|
405
|
+
const defaultSkills = await listSkills({ onlyProgramming: true });
|
|
406
|
+
const defaultCount = defaultSkills.length;
|
|
415
407
|
const upstreamFull = allSkillsFull.filter((s) => !PROPRIETARY_SKILLS.has(s.name)).length;
|
|
416
|
-
const
|
|
417
|
-
const displayTotal = onlyProgramming ?
|
|
418
|
-
const displayUpstream = onlyProgramming ?
|
|
408
|
+
const upstreamDefault = defaultSkills.filter((s) => !PROPRIETARY_SKILLS.has(s.name)).length;
|
|
409
|
+
const displayTotal = onlyProgramming ? defaultCount : allSkillsFull.length;
|
|
410
|
+
const displayUpstream = onlyProgramming ? upstreamDefault : upstreamFull;
|
|
419
411
|
if (path.resolve(skillsDir) === path.resolve(SKILLS_DIR)) {
|
|
420
|
-
process.stdout.write(`技能:已装 ${installed}、跳过 0(可分发 ${allSkillsFull.length},含上游 ${upstreamFull}
|
|
412
|
+
process.stdout.write(`技能:已装 ${installed}、跳过 0(可分发 ${allSkillsFull.length},含上游 ${upstreamFull};默认 workflow ${defaultCount},含上游 ${upstreamDefault})\n`);
|
|
421
413
|
} else {
|
|
422
414
|
if (onlyProgramming) {
|
|
423
|
-
process.stdout.write(`技能:已装 ${installed}
|
|
415
|
+
process.stdout.write(`技能:已装 ${installed}(默认 workflow ${displayTotal},含上游 ${displayUpstream};可分发 ${allSkillsFull.length},含上游 ${upstreamFull})\n`);
|
|
424
416
|
} else {
|
|
425
417
|
process.stdout.write(`技能:已装 ${installed}(可分发 ${displayTotal},含上游 ${displayUpstream})\n`);
|
|
426
418
|
}
|
|
@@ -454,7 +446,7 @@ async function compareDryRunTrees(target, stage) {
|
|
|
454
446
|
function formatTargetComparison({ target, result, onlyProgramming, refreshAgents }) {
|
|
455
447
|
const lines = [
|
|
456
448
|
`目标: ${target}`,
|
|
457
|
-
`范围: ${onlyProgramming ? '
|
|
449
|
+
`范围: ${onlyProgramming ? '默认 workflow' : '全部可分发'}${refreshAgents ? ';刷新 AGENTS.md' : ''}`,
|
|
458
450
|
'',
|
|
459
451
|
];
|
|
460
452
|
const totalDiff = result.added.length + result.updated.length + result.removed.length;
|
|
@@ -635,7 +627,7 @@ async function syncCommand({ dest, all, dryRun, json, refreshAgents, quiet = fal
|
|
|
635
627
|
if (preservedRepoLocal.length) {
|
|
636
628
|
output(`迁移提示:${preservedRepoLocal.join(', ')} 已不再分发,现有副本已保留\n`);
|
|
637
629
|
}
|
|
638
|
-
const modeLabel = onlyProgramming ? '
|
|
630
|
+
const modeLabel = onlyProgramming ? '默认 workflow' : '全部可分发';
|
|
639
631
|
output(`技能:新增 ${installed}、更新 ${updated}(${modeLabel} ${allSkills.length})\n`);
|
|
640
632
|
output(`目标路径:${target}\n`);
|
|
641
633
|
}
|
package/bin/skill-selection.js
CHANGED
|
@@ -1,25 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DEFAULT_PROPRIETARY_SKILLS,
|
|
3
|
-
isDistributableSkill,
|
|
4
|
-
} from './skill-boundaries.js';
|
|
1
|
+
import { isDistributableSkill } from './skill-boundaries.js';
|
|
5
2
|
|
|
6
3
|
function asSet(value) {
|
|
7
4
|
return value instanceof Set ? new Set(value) : new Set(value ?? []);
|
|
8
5
|
}
|
|
9
6
|
|
|
10
|
-
export function resolveSkillNames({ availableNames, mode = 'default',
|
|
7
|
+
export function resolveSkillNames({ availableNames, mode = 'default', defaults }) {
|
|
11
8
|
if (mode !== 'default' && mode !== 'all') {
|
|
12
9
|
throw new Error(`unknown skill selection mode: ${mode}`);
|
|
13
10
|
}
|
|
14
11
|
|
|
15
12
|
const available = asSet(availableNames);
|
|
16
|
-
const candidates = mode === 'all'
|
|
17
|
-
? available
|
|
18
|
-
: new Set([
|
|
19
|
-
...asSet(engineering),
|
|
20
|
-
...asSet(required),
|
|
21
|
-
...DEFAULT_PROPRIETARY_SKILLS,
|
|
22
|
-
]);
|
|
13
|
+
const candidates = mode === 'all' ? available : asSet(defaults);
|
|
23
14
|
|
|
24
15
|
return [...candidates]
|
|
25
16
|
.filter((name) => available.has(name) && isDistributableSkill(name, available))
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
[
|
|
2
|
+
"code-review",
|
|
3
|
+
"domain-modeling",
|
|
4
|
+
"grill-to-spec",
|
|
5
|
+
"grill-with-docs",
|
|
6
|
+
"grilling",
|
|
7
|
+
"handoff",
|
|
8
|
+
"implement",
|
|
9
|
+
"initialize-project",
|
|
10
|
+
"setup-matt-pocock-skills",
|
|
11
|
+
"tdd",
|
|
12
|
+
"tdd-implement",
|
|
13
|
+
"to-spec",
|
|
14
|
+
"to-tickets",
|
|
15
|
+
"wayfinder"
|
|
16
|
+
]
|
package/config/engineering.json
CHANGED
package/config/proprietary.json
CHANGED
|
@@ -6,14 +6,16 @@
|
|
|
6
6
|
"diagnose-fix",
|
|
7
7
|
"commit-check",
|
|
8
8
|
"scaffold-functional-test",
|
|
9
|
-
"show-me"
|
|
9
|
+
"show-me",
|
|
10
|
+
"initialize-project"
|
|
10
11
|
],
|
|
11
12
|
"distributable": [
|
|
12
13
|
"tdd-implement",
|
|
13
14
|
"diagnose-fix",
|
|
14
15
|
"grill-to-spec",
|
|
15
16
|
"scaffold-functional-test",
|
|
16
|
-
"show-me"
|
|
17
|
+
"show-me",
|
|
18
|
+
"initialize-project"
|
|
17
19
|
],
|
|
18
20
|
"repoLocal": [
|
|
19
21
|
"ci-guard",
|
|
@@ -21,8 +23,7 @@
|
|
|
21
23
|
],
|
|
22
24
|
"default": [
|
|
23
25
|
"tdd-implement",
|
|
24
|
-
"diagnose-fix",
|
|
25
26
|
"grill-to-spec",
|
|
26
|
-
"
|
|
27
|
+
"initialize-project"
|
|
27
28
|
]
|
|
28
29
|
}
|
package/config/required.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heihei0299/matt-skills",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.28",
|
|
4
4
|
"description": "Agent skills + 项目配置模板:一条命令初始化 opencode / pi-agent 项目(含 mattpocock/skills 上游技能)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"scripts/sync-upstream.js",
|
|
14
14
|
"scripts/codex-smoke.js",
|
|
15
15
|
"config/proprietary.json",
|
|
16
|
+
"config/default.json",
|
|
16
17
|
"config/engineering.json",
|
|
17
18
|
"config/required.json",
|
|
18
19
|
"README.md"
|