@house365/comate 0.4.0 → 0.6.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 +12 -9
- package/bin/init-run.mjs +30 -7
- package/bin/init.mjs +2 -2
- package/bin/postinstall.mjs +36 -0
- package/docs/COMATE_MANUAL.md +685 -669
- package/package.json +2 -1
- package/skills/comate/SKILL.md +17 -20
- package/skills/comate/reference/decision-points.md +3 -3
- package/skills/comate/reference/prerequisites.md +1 -2
- package/skills/comate/scripts/comate-lib.sh +2 -2
- package/skills/comate/scripts/comate.sh +10 -10
- package/skills/comate/tests/comate.bats +7 -14
- package/skills/comate-build/SKILL.md +3 -3
- package/skills/comate-fix/SKILL.md +153 -0
- package/skills/{comate-intake → comate-gate}/SKILL.md +4 -4
- package/skills/{comate-intake → comate-gate}/scaffold/docs/README.md +2 -2
- package/skills/{comate-intake → comate-gate}/scaffold/docs/architecture/README.md +2 -2
- package/skills/{comate-intake → comate-gate}/scaffold/docs/knowledge-base/README.md +3 -3
- package/skills/comate-gate/scaffold/docs/knowledge-base/integrations/README.md +31 -0
- package/skills/{comate-intake → comate-gate}/scaffold/docs/knowledge-base/requirements/_templates/PRD.md +2 -2
- package/skills/comate-grill/SKILL.md +6 -6
- package/skills/comate-kb-integration/SKILL.md +128 -0
- package/skills/comate-kb-integration/scripts/fetch_rendered_doc.py +84 -0
- package/skills/comate-open/SKILL.md +5 -5
- package/skills/comate-hotfix/SKILL.md +0 -115
- package/skills/comate-tweak/SKILL.md +0 -109
- /package/skills/{comate-intake → comate-gate}/scaffold/docs/knowledge-base/integrations/_TEMPLATE/README.md +0 -0
- /package/skills/{comate-intake → comate-gate}/scaffold/docs/knowledge-base/integrations/_TEMPLATE/api-snapshot.md +0 -0
package/README.md
CHANGED
|
@@ -2,30 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
OpenSpec + Superpowers 规约驱动的 AI 开发编排器。
|
|
4
4
|
|
|
5
|
-
comate 把 **OpenSpec**(WHAT:提案、规约生命周期、归档)和 **Superpowers**(HOW:设计、规划、执行、收尾)整合成统一的五阶段工作流。核心原则:每个变更都要经过深度设计(
|
|
5
|
+
comate 把 **OpenSpec**(WHAT:提案、规约生命周期、归档)和 **Superpowers**(HOW:设计、规划、执行、收尾)整合成统一的五阶段工作流。核心原则:每个变更都要经过深度设计(fix 预设除外)。
|
|
6
6
|
|
|
7
7
|
## 五阶段
|
|
8
8
|
|
|
9
9
|
```
|
|
10
|
-
[原始 PRD] ─→ /comate-
|
|
10
|
+
[原始 PRD] ─→ /comate-gate ─┐ (阶段 0:门禁+拆分)
|
|
11
11
|
▼
|
|
12
12
|
/comate ──自动探测阶段──────→ open → design → build → verify → archive
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
| 阶段 | skill | 职责 |
|
|
16
16
|
|------|-------|------|
|
|
17
|
-
|
|
|
17
|
+
| gate | `/comate-gate` | (阶段 0,可选)对原始 PRD 做质量门禁 + 拆分成 N 个 change |
|
|
18
18
|
| open | `/comate-open` | 探索想法,创建 change 结构并初始化 `.comate.yaml` |
|
|
19
19
|
| design | `/comate-design` | 技术设计与方案 brainstorming |
|
|
20
20
|
| build | `/comate-build` | 按任务实现并提交 |
|
|
21
21
|
| verify | `/comate-verify` | 验证、出报告、处理分支 |
|
|
22
22
|
| archive | `/comate-archive` | 同步增量规约并归档 |
|
|
23
23
|
|
|
24
|
-
预设路径:`/comate-
|
|
24
|
+
预设路径:`/comate-fix`(快速小改动,覆盖 bug 修复与文案/配置小调整两种模式)。
|
|
25
25
|
|
|
26
|
-
工具 skill
|
|
26
|
+
工具 skill:
|
|
27
|
+
- `/comate-grill`(决策点穷追式澄清)——对计划/设计/PRD 的模糊点逐个深挖,每问附推荐答案、一次一问,直到歧义清零。comate-gate 在阻断问题多、有依赖链时会自动提供「深度澄清」选项调用它;也可单独 `/comate-grill <话题>` 挑战自己的计划草稿。
|
|
28
|
+
- `/comate-kb-integration`(第三方对接档案生成)——从官方文档 URL 抓取并按 `docs/knowledge-base/integrations/_TEMPLATE/` 规范产出对接档案(`<service-id>/README.md` + `api-snapshot.md`),自动追加根索引一行。是知识库 integrations scaffold 的配套建档工具;遇 JS 动态渲染文档站自动降级 Playwright 无头抓取。
|
|
27
29
|
|
|
28
|
-
**阶段 0(PRD 门禁与拆分)**:需求若来自一份**原始 PRD**,先过 `/comate-
|
|
30
|
+
**阶段 0(PRD 门禁与拆分)**:需求若来自一份**原始 PRD**,先过 `/comate-gate`——它审阅 PRD 质量、百分制评分、建阻断台账,门禁通过前禁止建任何 change;通过后按依赖/独立性判定把 PRD 拆成 1 或 N 个 change(粒度由用户定),逐个交给 `/comate-open`。门禁状态钉在 PRD 同级 `<PRD>.gate.yaml`,PRD 通过后被改会自动失效需重跑。需求来自对话时无需此阶段,直接从 open 起步。
|
|
29
31
|
|
|
30
32
|
## 安装
|
|
31
33
|
|
|
@@ -40,7 +42,7 @@ cd your-project
|
|
|
40
42
|
comate init
|
|
41
43
|
```
|
|
42
44
|
|
|
43
|
-
`init` 会装好 comate 及其依赖(OpenSpec CLI、Superpowers),创建 `openspec/` 项目结构,并铺出 `docs/` 知识库骨架(`docs/knowledge-base/requirements/` 放 PRD + PRD 模板、`docs/architecture/` 架构规范占位、integrations 对接模板)——`/comate-
|
|
45
|
+
`init` 会装好 comate 及其依赖(OpenSpec CLI、Superpowers),创建 `openspec/` 项目结构,并铺出 `docs/` 知识库骨架(`docs/knowledge-base/requirements/` 放 PRD + PRD 模板、`docs/architecture/` 架构规范占位、integrations 对接模板)——`/comate-gate` 从这里读 PRD。支持 Claude Code、Codex、Cursor 等 70+ agent。可重复执行,已装的自动跳过,已有的 docs 文件不覆盖。
|
|
44
46
|
|
|
45
47
|
skills 装到用户级(`~/.agents/skills`),装一次所有项目共用;`openspec/` 是项目自己的规约,建在当前目录,所以 `init` 需要在项目目录下运行。
|
|
46
48
|
|
|
@@ -68,9 +70,10 @@ skills/
|
|
|
68
70
|
reference/ 决策点、脏工作树协议、前置条件
|
|
69
71
|
tests/ bats 测试
|
|
70
72
|
comate-open/ design/ build/ verify/ archive/ 各阶段 skill
|
|
71
|
-
comate-
|
|
72
|
-
comate-
|
|
73
|
+
comate-gate/ 阶段 0:PRD 门禁与拆分
|
|
74
|
+
comate-fix/ 预设路径 skill(bug + 小调整)
|
|
73
75
|
comate-grill/ 决策点穷追式澄清工具
|
|
76
|
+
comate-kb-integration/ 第三方对接档案生成工具(知识库配套)
|
|
74
77
|
docs/
|
|
75
78
|
COMATE_MANUAL.md 完整操作手册
|
|
76
79
|
```
|
package/bin/init-run.mjs
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { spawn } from 'node:child_process';
|
|
3
3
|
import { existsSync, readFileSync } from 'node:fs';
|
|
4
4
|
import { join, resolve } from 'node:path';
|
|
5
|
+
import { createInterface } from 'node:readline';
|
|
5
6
|
|
|
6
7
|
import { findBash } from './doctor.mjs';
|
|
7
8
|
import {
|
|
@@ -50,12 +51,19 @@ export async function init(pkgRoot) {
|
|
|
50
51
|
|
|
51
52
|
const target = inspectTarget(cwd, home);
|
|
52
53
|
if (target.kind !== 'project') {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
// Home directory is always refused
|
|
55
|
+
if (target.kind === 'home') {
|
|
56
|
+
console.error('\n这是主目录,请在项目目录下运行 comate init。');
|
|
57
|
+
return 1;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Bare directory: ask user if they want to create a project here
|
|
61
|
+
console.log('\n当前目录不像项目(无 .git / package.json 等)。');
|
|
62
|
+
const confirmed = await askConfirm('要在这里初始化新项目吗?');
|
|
63
|
+
if (!confirmed) {
|
|
64
|
+
console.log('已取消。');
|
|
65
|
+
return 1;
|
|
66
|
+
}
|
|
59
67
|
}
|
|
60
68
|
|
|
61
69
|
// comate's skills are bash scripts needing associative arrays (bash 4+), and
|
|
@@ -148,7 +156,7 @@ export async function init(pkgRoot) {
|
|
|
148
156
|
results.push(['openspec/', r2.ok ? 'installed' : 'failed', r2.ok ? '' : r2.reason, r2.output]);
|
|
149
157
|
}
|
|
150
158
|
|
|
151
|
-
// 5. docs/ knowledge-base scaffold. /comate-
|
|
159
|
+
// 5. docs/ knowledge-base scaffold. /comate-gate reads PRDs from
|
|
152
160
|
// docs/knowledge-base/requirements/ (comate_kb_root is hardcoded there), so a
|
|
153
161
|
// fresh project has nowhere to put a PRD. Idempotent — existing files are left
|
|
154
162
|
// alone, only missing pieces are filled in, so re-running never clobbers a
|
|
@@ -167,6 +175,21 @@ export async function init(pkgRoot) {
|
|
|
167
175
|
return report(results);
|
|
168
176
|
}
|
|
169
177
|
|
|
178
|
+
// A yes/no prompt. Defaults to "no" so a piped/non-interactive run (CI, an
|
|
179
|
+
// unattended npx) never silently scaffolds a project into whatever directory it
|
|
180
|
+
// happened to land in — those callers should point at a real project instead.
|
|
181
|
+
// [y/N]: empty input, EOF (Ctrl-D / closed stdin), or anything but y/yes = no.
|
|
182
|
+
export function askConfirm(question, { input = process.stdin, output = process.stdout } = {}) {
|
|
183
|
+
if (!input.isTTY) return Promise.resolve(false);
|
|
184
|
+
const rl = createInterface({ input, output });
|
|
185
|
+
return new Promise((done) => {
|
|
186
|
+
rl.question(`${question} [y/N] `, (answer) => {
|
|
187
|
+
rl.close();
|
|
188
|
+
done(/^\s*y(es)?\s*$/i.test(answer));
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
170
193
|
// The spinner runs in its own process because every step above is a synchronous
|
|
171
194
|
// spawnSync — an interval on this thread would never fire. In a pipe \r does not
|
|
172
195
|
// overwrite, so animating there would leave every frame on screen; print one
|
package/bin/init.mjs
CHANGED
|
@@ -176,7 +176,7 @@ function superpowersInstalled(scope) {
|
|
|
176
176
|
// (repo checkout) and after `skills add` copies the skill to ~/.agents/skills.
|
|
177
177
|
// Locating it relative to pkgRoot means init reads the same tree it packed.
|
|
178
178
|
function scaffoldSourceDir(pkgRoot) {
|
|
179
|
-
return join(pkgRoot, 'skills', 'comate-
|
|
179
|
+
return join(pkgRoot, 'skills', 'comate-gate', 'scaffold', 'docs');
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
// copyTreeSkipExisting — recursively copy src→dst, never overwriting a file that
|
|
@@ -201,7 +201,7 @@ function copyTreeSkipExisting(src, dst, acc = { created: 0, skipped: 0 }) {
|
|
|
201
201
|
}
|
|
202
202
|
|
|
203
203
|
// scaffoldDocs — lay down docs/ (knowledge-base + architecture placeholder + PRD
|
|
204
|
-
// template) so /comate-
|
|
204
|
+
// template) so /comate-gate has somewhere to read PRDs from. comate_kb_root in
|
|
205
205
|
// comate-lib.sh is hardcoded to docs/knowledge-base, so this path is not
|
|
206
206
|
// configurable — it must match. Idempotent: existing files are never clobbered.
|
|
207
207
|
function scaffoldDocs(pkgRoot, cwd = process.cwd()) {
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Postinstall hook: show the wordmark and next steps after npm install finishes.
|
|
3
|
+
// Skipped in CI (where the logo wouldn't render anyway) and local dev installs
|
|
4
|
+
// (where the developer already knows what they installed).
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { dirname, resolve } from 'node:path';
|
|
7
|
+
|
|
8
|
+
const pkgRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
9
|
+
|
|
10
|
+
// Skip in CI, or when installing the package's own dependencies during dev.
|
|
11
|
+
if (isCI() || isDevInstall()) {
|
|
12
|
+
process.exit(0);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const { banner, pkgVersion } = await import('./init-run.mjs');
|
|
16
|
+
|
|
17
|
+
console.log(banner(pkgVersion(pkgRoot)));
|
|
18
|
+
console.log(` 🎉 Congratulations! comate 已成功安装。\n`);
|
|
19
|
+
console.log(' 下一步:');
|
|
20
|
+
console.log(' 在你的项目目录下运行 comate init 开始使用');
|
|
21
|
+
console.log(' 或运行 comate doctor 健康检查');
|
|
22
|
+
console.log(' 更多帮助 comate --help\n');
|
|
23
|
+
|
|
24
|
+
function isCI() {
|
|
25
|
+
return Boolean(process.env.CI || process.env.GITHUB_ACTIONS);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// When npm installs a package's own dependencies (npm i in the repo itself),
|
|
29
|
+
// INIT_CWD points to the package root. A user installing comate globally or as
|
|
30
|
+
// a dependency has INIT_CWD pointing elsewhere.
|
|
31
|
+
function isDevInstall() {
|
|
32
|
+
const initCwd = process.env.INIT_CWD;
|
|
33
|
+
if (!initCwd) return false;
|
|
34
|
+
const normalise = (p) => resolve(p).replace(/[\\/]+$/, '').toLowerCase();
|
|
35
|
+
return normalise(initCwd) === normalise(pkgRoot);
|
|
36
|
+
}
|