@namewta/speculo 0.2.15 → 0.3.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/dist/src/index.js +8 -1
- package/dist/src/index.js.map +1 -1
- package/package.json +1 -1
- package/template/canonical/README.md +1 -0
- package/template/canonical/canonical-specdev-grill-with-docs.md +36 -45
- package/template/canonical/canonical-specdev-spec.md +9 -7
- package/template/canonical/canonical-specdev-tickets.md +91 -45
- package/template/canonical/canonical-specdev-wayfinder.md +28 -30
- package/template/commands/archive-and-consolidate.md +3 -3
- package/template/commands/docs-sync.md +3 -5
- package/template/commands/handoff.md +16 -2
- package/template/commands/retro.md +6 -9
- package/template/commands/status.md +1 -1
- package/template/skills/agents-md-builder/references/claude-redirect.md +10 -14
- package/template/skills/agents-md-builder/references/manifest-discovery.md +1 -6
- package/template/skills/agents-md-builder/references/role-classification.md +0 -12
- package/template/skills/archive-and-consolidate/SKILL.md +1 -1
- package/template/skills/docs-sync/references/agents-contract.md +4 -4
- package/template/skills/github-npm-ops/references/failure-recovery.md +4 -16
- package/template/skills/github-npm-ops/references/preflight-checklist.md +7 -7
- package/template/skills/github-npm-ops/references/release-notes-injection.md +8 -8
- package/template/skills/github-npm-ops/references/troubleshooting-playbook.md +5 -19
- package/template/skills/github-npm-ops/references/version-bump-flow.md +8 -28
- package/template/skills/github-npm-ops/references/workflow-yaml-reference.md +8 -8
- package/template/skills/writing-great-skills/SKILL.md +2 -0
- package/template/workflows/person/M-mao-zedong-cognitive-os/_templates/mao-consultation-output-template.md +32 -0
- package/template/workflows/specdev/A-archive-and-consolidate/consolidation-rules.md +4 -2
- package/template/workflows/specdev/A-archive-and-consolidate/knowledge-graduation.md +1 -1
- package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +2 -2
- package/template/workflows/specdev/D-diagnose-bugs/cleanup-postmortem.md +2 -2
- package/template/workflows/specdev/D-diagnose-bugs/feedback-loop-techniques.md +1 -1
- package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +1 -5
- package/template/workflows/specdev/G-grill-with-docs/adr-format.md +2 -0
- package/template/workflows/specdev/G-grill-with-docs/domain-modeling-rules.md +3 -13
- package/template/workflows/specdev/I-implement/I-implement.md +3 -3
- package/template/workflows/specdev/I-implement/codebase-design-glossary.md +9 -9
- package/template/workflows/specdev/I-implement/tdd-examples.md +1 -1
- package/template/workflows/specdev/I-init-setup/I-init-setup.md +1 -1
- package/template/workflows/specdev/I-init-setup/domain-layout.md +18 -53
- package/template/workflows/specdev/I-init-setup/status-labels.md +4 -5
- package/template/workflows/specdev/I-init-setup/tracking-convention.md +22 -35
- package/template/workflows/specdev/INDEX.md +7 -1
- package/template/workflows/specdev/P-goal-plan/execution-sections.md +2 -2
- package/template/workflows/specdev/P-goal-plan/governance-sections.md +3 -3
- package/template/workflows/specdev/P-goal-plan/lead-orchestration-protocol.md +5 -8
- package/template/workflows/specdev/P-goal-plan/vision-sections.md +1 -1
- package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +77 -0
- package/template/workflows/specdev/R-review-architecture/exploration-guide.md +103 -0
- package/template/workflows/specdev/R-review-architecture/html-report-template.md +124 -0
- package/template/workflows/specdev/T-tickets/T-tickets.md +4 -4
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +14 -18
- package/template/workflows/specdev/common/dev-worktree/SKILL.md +16 -106
- package/template/workflows/specdev/common/handoff/SKILL.md +42 -0
- package/template/workflows/specdev/common/triage/OUT-OF-SCOPE.md +2 -2
- package/template/workflows/specdev/common/triage/SKILL.md +3 -3
- package/template/workflows/specdev/common/improve-codebase-architecture/HTML-REPORT.md +0 -125
- package/template/workflows/specdev/common/improve-codebase-architecture/SKILL.md +0 -66
|
@@ -18,121 +18,31 @@ description: 在 Speculo workflow change 内创建隔离 git worktree 进行开
|
|
|
18
18
|
| 已在 worktree 中,未完成 | 继续开发,不重复创建 |
|
|
19
19
|
| 用户要求 PR / 暂存 / 丢弃 | 阶段 B 按对应选项执行 |
|
|
20
20
|
|
|
21
|
-
---
|
|
22
|
-
|
|
23
21
|
## 阶段 A:创建 Worktree
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
### A0. 检测现有隔离
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
|
|
31
|
-
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
|
|
32
|
-
SUPER=$(git rev-parse --show-superproject-working-tree 2>/dev/null)
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
- `SUPER` 有值 → submodule 内,按普通仓库处理,不误判
|
|
36
|
-
- `GIT_DIR != GIT_COMMON` 且非 submodule → 已在 worktree,跳到 A3 设置
|
|
37
|
-
- `GIT_DIR == GIT_COMMON` → 主工作区,继续
|
|
38
|
-
|
|
39
|
-
### A1. 命名与路径
|
|
40
|
-
|
|
41
|
-
| 要素 | 值 |
|
|
42
|
-
|------|-----|
|
|
43
|
-
| 基础分支 | 当前分支(`git rev-parse --abbrev-ref HEAD`) |
|
|
44
|
-
| change 分支 | `speculo/<workflow>/<change>` |
|
|
45
|
-
| worktree 路径 | `{state-root}/<workflow>/changes/<change>/.worktree/` |
|
|
46
|
-
|
|
47
|
-
分支或路径已存在 → 停止,不覆盖不复用。
|
|
48
|
-
|
|
49
|
-
**前置检查:** `speculo/.speculo/` 必须被 git 跟踪——产物需随分支合并。若被忽略则降级为非 worktree 模式。
|
|
50
|
-
|
|
51
|
-
### A2. 创建
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
git worktree add -b speculo/<workflow>/<change> {state-root}/<workflow>/changes/<change>/.worktree
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
确保 `.gitignore` 含 `.worktree/`;缺失则追加并提交。
|
|
58
|
-
|
|
59
|
-
### A3. 项目设置与基线
|
|
60
|
-
|
|
61
|
-
自动检测并安装依赖、运行基线测试:
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
[ -f package.json ] && (npm install 2>/dev/null || true)
|
|
65
|
-
[ -f Cargo.toml ] && cargo build
|
|
66
|
-
[ -f requirements.txt ] && pip install -r requirements.txt
|
|
67
|
-
[ -f go.mod ] && go mod download
|
|
68
|
-
# 跑基线测试
|
|
69
|
-
```
|
|
23
|
+
完整步骤见 [references/create.md](references/create.md)。概览:
|
|
70
24
|
|
|
71
|
-
|
|
25
|
+
1. **检测现有隔离** — 已在 worktree 则跳过创建;submodule 内按普通仓库处理
|
|
26
|
+
2. **命名** — 分支 `speculo/<workflow>/<change>`;路径 `{state-root}/<workflow>/changes/<change>/.worktree/`;已存在则停止
|
|
27
|
+
3. **创建** — `git worktree add -b …`;确保 `.gitignore` 含 `.worktree/`
|
|
28
|
+
4. **基线** — 安装依赖并跑基线测试;失败则报告并询问
|
|
29
|
+
5. **写回** — 将 `base_branch` / `change_branch` / `worktree_path` / `worktree_status: active` 写入 change 的 `.status.json`
|
|
72
30
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
将 `base_branch`、`change_branch`、`worktree_path`、`worktree_status: active` 写入 change 的 `.status.json`。
|
|
76
|
-
|
|
77
|
-
---
|
|
31
|
+
**前置:** `speculo/.speculo/` 必须被 git 跟踪;若被忽略则降级为非 worktree 模式。
|
|
78
32
|
|
|
79
33
|
## 阶段 B:收尾合并
|
|
80
34
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
### B1. 验证测试
|
|
84
|
-
|
|
85
|
-
跑项目测试套件。失败 → 停止,禁止合并/PR。
|
|
86
|
-
|
|
87
|
-
### B2. 展示选项
|
|
88
|
-
|
|
89
|
-
```
|
|
90
|
-
实现已完成。你想怎么做?
|
|
91
|
-
|
|
92
|
-
1. 本地合并回 <base-branch>(推荐,默认)
|
|
93
|
-
2. 推送并创建 Pull Request
|
|
94
|
-
3. 保持现状(稍后处理)
|
|
95
|
-
4. 丢弃
|
|
35
|
+
完整步骤见 [references/finalize.md](references/finalize.md)。概览:
|
|
96
36
|
|
|
97
|
-
|
|
98
|
-
|
|
37
|
+
1. **验证测试** — 失败则停止,禁止合并/PR
|
|
38
|
+
2. **展示选项** — 本地合并(默认)/ 创建 PR / 保持 / 丢弃
|
|
39
|
+
3. **执行** — 本地合并顺序:checkout base → pull → `merge --no-ff` → 重跑测试 → `worktree remove` → `branch -d` → `prune` → 更新 `.status.json`
|
|
99
40
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
### B3. 执行 —— 顺序不可变
|
|
103
|
-
|
|
104
|
-
**选项 1(本地合并):**
|
|
105
|
-
1. 合并到 base:`git checkout <base> && git pull && git merge --no-ff <change_branch>`
|
|
106
|
-
2. 在合并结果上再跑测试
|
|
107
|
-
3. 测试通过 → 从主仓库根删除 worktree:`git worktree remove <path>`
|
|
108
|
-
4. 删除分支:`git branch -d <change_branch>`
|
|
109
|
-
5. `git worktree prune`
|
|
110
|
-
6. 更新 `.status.json`:`worktree_status: removed`
|
|
111
|
-
|
|
112
|
-
**选项 2(PR):** 推送分支、创建 PR,保留 worktree。
|
|
113
|
-
**选项 3(保持):** 不动,报告状态。
|
|
114
|
-
**选项 4(丢弃):** 确认后删除 worktree 和分支。
|
|
115
|
-
|
|
116
|
-
合并冲突或测试失败 → 停止,保留现场,报告原因,不强推。
|
|
117
|
-
|
|
118
|
-
---
|
|
41
|
+
合并冲突或测试失败 → 停止,保留现场。冲突解决见 `<Path>{roots.workflows}/specdev/common/resolving-merge-conflicts/SKILL.md</Path>`。
|
|
119
42
|
|
|
120
43
|
## 红线
|
|
121
44
|
|
|
122
|
-
|
|
123
|
-
-
|
|
124
|
-
-
|
|
125
|
-
-
|
|
126
|
-
- 合并结果未验证就删 worktree
|
|
127
|
-
- 先删分支再 worktree remove(顺序:merge → remove worktree → delete branch)
|
|
128
|
-
- 在 worktree 内部执行 `git worktree remove`
|
|
129
|
-
- 未经确认执行破坏性操作
|
|
130
|
-
- 强制推送
|
|
131
|
-
|
|
132
|
-
**始终:**
|
|
133
|
-
- 分支名:`speculo/<workflow>/<change>`
|
|
134
|
-
- worktree 路径:change 目录下的 `.worktree/`
|
|
135
|
-
- 创建后装依赖 + 基线测试
|
|
136
|
-
- 收尾前验证测试
|
|
137
|
-
- 合并成功后再清理
|
|
138
|
-
- 清理后 `git worktree prune`
|
|
45
|
+
- 已在 worktree 时不嵌套创建;不覆盖已有分支或路径
|
|
46
|
+
- 测试失败时不合并/不发 PR;合并结果未验证不删 worktree
|
|
47
|
+
- 清理顺序固定:merge → remove worktree → delete branch;在 worktree 内部不执行 `git worktree remove`
|
|
48
|
+
- 破坏性操作须先确认;不强制推送
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: handoff
|
|
3
|
+
description: "将一段对话或子代理会话压缩为一份交接文档,供另一个 agent 接手继续工作。适用于 Lead 压缩子代理实现上下文、会话移交、或任何需要把上下文浓缩为可持久化摘要的场景。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Handoff — 交接文档
|
|
7
|
+
|
|
8
|
+
将当前对话(或指定的子代理会话)压缩为一份交接文档,使新的 agent 无需读取完整转录即可继续工作。
|
|
9
|
+
|
|
10
|
+
## 内容要求
|
|
11
|
+
|
|
12
|
+
交接文档包含以下部分:
|
|
13
|
+
|
|
14
|
+
- **做了什么** —— 实现或完成的工作摘要
|
|
15
|
+
- **关键决策** —— 做出的决策及理由;与 spec/plan 的任何偏差及原因
|
|
16
|
+
- **验证状态** —— 测试结果摘要、已运行的检查
|
|
17
|
+
- **产物引用** —— 相关 spec、ADR、commit、diff 的路径或 URL
|
|
18
|
+
- **建议 skills** —— 建议接手 agent 调用的 skills 列表
|
|
19
|
+
|
|
20
|
+
不重复已被其他产物(spec、方案、ADR、issue、commit、diff)覆盖的内容,改用路径或 URL 引用它们。
|
|
21
|
+
|
|
22
|
+
清除任何敏感信息,如 API 密钥、密码或个人身份信息。
|
|
23
|
+
|
|
24
|
+
如果调用方传入了对下一个会话重点的描述,据此定制文档内容。
|
|
25
|
+
|
|
26
|
+
## 产物位置
|
|
27
|
+
|
|
28
|
+
产物位置由调用方指定:
|
|
29
|
+
|
|
30
|
+
- Lead 编排场景(子代理交接):写入操作系统临时目录,关键信息由调用方回写到对应 ticket 文件(参见 `<Path>{roots.workflows}/specdev/P-goal-plan/lead-orchestration-protocol.md</Path>` §2.2)
|
|
31
|
+
- 调用方未指定时:写入 `<Path>{roots.state}/specdev/changes/{change}/handoff/<YYYY-MM-DD>-<topic>.md</Path>`
|
|
32
|
+
|
|
33
|
+
## 路径引用规范
|
|
34
|
+
|
|
35
|
+
文档中所有文件/文件夹引用使用**项目根目录**的相对路径。
|
|
36
|
+
|
|
37
|
+
- ✅ `src/modules/auth/`
|
|
38
|
+
- ✅ `speculo/.speculo/specdev/changes/<YYYY-MM-DD>-<topic>/spec.md`
|
|
39
|
+
- ❌ `../../specdev/changes/...` — 相对于交接文档自身,脱离目录后不可定位
|
|
40
|
+
- ❌ `auth` — 裸名,无法判断是目录/文件/子模块
|
|
41
|
+
|
|
42
|
+
例外:skills 名称属于逻辑标识而非文件路径,不适用此规则。
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
文件应以轻松、可读的风格编写 — 更像一份简短的设计文档,而非数据库条目。使用段落、代码示例和实例让理由清晰并对初次遇到它的人有用。
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
````markdown
|
|
24
24
|
# Dark Mode
|
|
25
25
|
|
|
26
26
|
此项目不支持深色模式或面向用户的主题化。
|
|
@@ -50,7 +50,7 @@ interface ThemeConfig {
|
|
|
50
50
|
- #42 — "添加深色模式支持"
|
|
51
51
|
- #87 — "用于无障碍的夜间主题"
|
|
52
52
|
- #134 — "深色主题选项"
|
|
53
|
-
|
|
53
|
+
````
|
|
54
54
|
|
|
55
55
|
### 文件命名
|
|
56
56
|
|
|
@@ -40,13 +40,13 @@ Triage 期间发布到 issue tracker 的每条评论或 issue **必须**以此
|
|
|
40
40
|
|
|
41
41
|
每个经 triage 的 issue 应携带恰好一个类别角色和一个状态角色。如果状态角色冲突,标记它并在做任何其他操作之前询问维护者。
|
|
42
42
|
|
|
43
|
-
这些是标准角色名称 —— issue tracker
|
|
43
|
+
这些是标准角色名称 —— issue tracker 中使用的实际标签字符串可能不同。映射关系读取 `<Path>{roots.state}/specdev/.config/status-labels.md</Path>`(若存在),否则直接使用角色名。
|
|
44
44
|
|
|
45
45
|
状态转换:未标记的 issue 通常先进入 `needs-triage`;然后移动到 `needs-info`、`ready-for-agent`、`ready-for-human` 或 `wontfix`。当报告者回复后,`needs-info` 返回 `needs-triage`。维护者可随时覆盖 —— 标记看起来不寻常的转换并在继续之前询问。
|
|
46
46
|
|
|
47
47
|
## 调用方式
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
维护者调用本 skill 并用自然语言描述他们想要什么。解读请求并行动。示例:
|
|
50
50
|
|
|
51
51
|
- "展示需要我关注的内容"
|
|
52
52
|
- "我们看看 #42"(issue 或 PR)
|
|
@@ -73,7 +73,7 @@ Triage 期间发布到 issue tracker 的每条评论或 issue **必须**以此
|
|
|
73
73
|
|
|
74
74
|
3. **验证声明。** 在任何质询之前,检查声明是否成立。对于 bug,按报告者的步骤复现。对于 PR,确认 diff 做了它声称做的事情 —— checkout 它,运行相关测试或命令。报告结果:已确认(含代码路径)、未通过、或细节不足(强烈的 `needs-info` 信号)。已确认的验证会产生更强的 agent 摘要。
|
|
75
75
|
|
|
76
|
-
4. **质询(如需要)。**
|
|
76
|
+
4. **质询(如需要)。** 如果请求需要充实,按 `<Path>{roots.workflows}/specdev/G-grill-with-docs/grilling-protocol.md</Path>` 逐个问题地进行质询,并按 `<Path>{roots.workflows}/specdev/G-grill-with-docs/domain-modeling-rules.md</Path>` 随着决策落地内联更新 `CONTEXT.md`/ADR。
|
|
77
77
|
|
|
78
78
|
5. **应用结果:**
|
|
79
79
|
- `ready-for-agent` —— 发布 agent 摘要评论([AGENT-BRIEF.md](AGENT-BRIEF.md))。
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
# HTML 报告格式
|
|
2
|
-
|
|
3
|
-
架构审查渲染为一个独立的 HTML 文件,存放在操作系统临时目录中。Tailwind 和 Mermaid 均来自 CDN。Mermaid 处理图形状的图表;手工构建的 div 和内联 SVG 处理更具编辑性的可视化(质量图、横截面图)。混合使用两者 — 不要所有事情都依赖 Mermaid,否则会变得千篇一律。
|
|
4
|
-
|
|
5
|
-
`{{config.defaults.report_language}}` 占位符由 runtime-context 输出的 `config` 对象填充,值来自 `speculo/config.json` 的 `defaults.report_language` 字段;若 config 文件不存在,默认值为 `"en"`。Tailwind 和 Mermaid 均来自 CDN。Mermaid 处理图形状的图表;手工构建的 div 和内联 SVG 处理更具编辑性的可视化(质量图、横截面图)。混合使用两者 — 不要所有事情都依赖 Mermaid,否则会变得千篇一律。
|
|
6
|
-
|
|
7
|
-
## 脚手架
|
|
8
|
-
|
|
9
|
-
```html
|
|
10
|
-
<!doctype html>
|
|
11
|
-
<html lang="{{config.defaults.report_language}}">
|
|
12
|
-
<head>
|
|
13
|
-
<meta charset="utf-8" />
|
|
14
|
-
<title>Architecture review — {{repo name}}</title>
|
|
15
|
-
<script src="https://cdn.tailwindcss.com"></script>
|
|
16
|
-
<script type="module">
|
|
17
|
-
import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs";
|
|
18
|
-
mermaid.initialize({ startOnLoad: true, theme: "neutral", securityLevel: "loose" });
|
|
19
|
-
</script>
|
|
20
|
-
<style>
|
|
21
|
-
/* Tailwind 无法很好覆盖的小型自定义层:
|
|
22
|
-
虚线接缝线、手绘感箭头等。 */
|
|
23
|
-
.seam { stroke-dasharray: 4 4; }
|
|
24
|
-
.leak { stroke: #dc2626; }
|
|
25
|
-
.deep { background: linear-gradient(135deg, #0f172a, #1e293b); }
|
|
26
|
-
</style>
|
|
27
|
-
</head>
|
|
28
|
-
<body class="bg-stone-50 text-slate-900 font-sans">
|
|
29
|
-
<main class="max-w-5xl mx-auto px-6 py-12 space-y-12">
|
|
30
|
-
<header>...</header>
|
|
31
|
-
<section id="candidates" class="space-y-10">...</section>
|
|
32
|
-
<section id="top-recommendation">...</section>
|
|
33
|
-
</main>
|
|
34
|
-
</body>
|
|
35
|
-
</html>
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## 页头
|
|
39
|
-
|
|
40
|
-
仓库名称、日期和一个紧凑的图例:实线框 = 模块,虚线 = 接缝,红色箭头 = 泄漏,粗黑框 = 深模块。无介绍段落 — 直接进入候选。
|
|
41
|
-
|
|
42
|
-
## 候选卡片
|
|
43
|
-
|
|
44
|
-
图表承担主要分量。文字稀疏、平实,并使用来自 `/codebase-design` skill 的术语,不刻意修饰。
|
|
45
|
-
|
|
46
|
-
每个候选是一个 `<article>`:
|
|
47
|
-
|
|
48
|
-
- **标题** — 简短,命名深化方案(例如"Collapse the Order intake pipeline")。
|
|
49
|
-
- **徽章行** — 推荐强度(`Strong` = 翡翠绿,`Worth exploring` = 琥珀色,`Speculative` = 石板灰),外加一个依赖类别标签(`in-process`、`local-substitutable`、`ports & adapters`、`mock`)。
|
|
50
|
-
- **文件** — 等宽字体列表,`font-mono text-sm`。
|
|
51
|
-
- **Before / After 图表** — 核心。两列,并排。参见下方模式。
|
|
52
|
-
- **Problem** — 一句话。痛点是什么。
|
|
53
|
-
- **Solution** — 一句话。改变了什么。
|
|
54
|
-
- **Wins** — 要点,每个不超过 6 个词。例如 "Tests hit one interface"、"Pricing logic stops leaking"、"Delete 4 shallow wrappers"。
|
|
55
|
-
- **ADR 标注**(如适用)— 一行,放在琥珀色调的框中。
|
|
56
|
-
|
|
57
|
-
无需解释段落。如果图表需要一段文字才能理解,重新画图。
|
|
58
|
-
|
|
59
|
-
## 图表模式
|
|
60
|
-
|
|
61
|
-
选择适合候选的模式。混合使用它们。不要让每个图表看起来都一样 — 多样性本身就是目的的一部分。
|
|
62
|
-
|
|
63
|
-
### Mermaid 图表(依赖/调用流的常用工具)
|
|
64
|
-
|
|
65
|
-
当重点是"X 调用 Y 调用 Z,看看这有多混乱"时,使用 Mermaid `flowchart` 或 `graph`。用 Tailwind 风格卡片包裹它,这样不会显得突兀。使用 classDef 将泄漏边缘着红色,深模块着深色。序列图适合展示"before:6 个往返;after:1 个"。
|
|
66
|
-
|
|
67
|
-
```html
|
|
68
|
-
<div class="rounded-lg border border-slate-200 bg-white p-4">
|
|
69
|
-
<pre class="mermaid">
|
|
70
|
-
flowchart LR
|
|
71
|
-
A[OrderHandler] --> B[OrderValidator]
|
|
72
|
-
B --> C[OrderRepo]
|
|
73
|
-
C -.leak.-> D[PricingClient]
|
|
74
|
-
classDef leak stroke:#dc2626,stroke-width:2px;
|
|
75
|
-
class C,D leak
|
|
76
|
-
</pre>
|
|
77
|
-
</div>
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### 手工绘制的框线图(当 Mermaid 的布局难以驾驭时)
|
|
81
|
-
|
|
82
|
-
模块用带边框和标签的 `<div>` 表示。箭头用绝对定位在相对容器上的内联 SVG `<line>` 或 `<path>` 元素表示。当你希望"after"图表看起来像一个粗边的深模块,内部元素灰显时使用 — Mermaid 不会以合适的权重渲染这种效果。
|
|
83
|
-
|
|
84
|
-
### 横截面图(适合分层浅度)
|
|
85
|
-
|
|
86
|
-
堆叠水平条(`h-12 border-l-4`)来展示调用经过的各层。Before:6 个薄层,每个都不做什么。After:一个厚条,标注合并后的职责。
|
|
87
|
-
|
|
88
|
-
### 质量图(适合"接口与实现一样宽"的场景)
|
|
89
|
-
|
|
90
|
-
每个模块两个矩形 — 一个表示接口表面积,一个表示实现。Before:接口矩形几乎和实现矩形一样高(浅)。After:接口矩形短,实现矩形高(深)。
|
|
91
|
-
|
|
92
|
-
### 调用图坍缩
|
|
93
|
-
|
|
94
|
-
Before:嵌套框呈现的函数调用树。After:同一棵树坍缩成一个框,内部调用在其内部以淡化形式显示。
|
|
95
|
-
|
|
96
|
-
## 样式指导
|
|
97
|
-
|
|
98
|
-
- 偏向编辑风格,而非企业仪表盘风格。宽松的留白。标题可选择衬线字体(`font-serif` 与 stone/slate 搭配效果很好)。
|
|
99
|
-
- 色彩使用克制:一种强调色(翠绿或靛蓝),加上红色用于泄漏,琥珀色用于警告。
|
|
100
|
-
- 保持图表约 320px 高,使 before/after 能够舒适地并排放置而无需滚动。
|
|
101
|
-
- 使用 `text-xs uppercase tracking-wider` 用于图表内的模块标签 — 它们应读起来像示意图,而非 UI。
|
|
102
|
-
- 唯一的脚本是 Tailwind CDN 和 Mermaid ESM 导入。除此之外报告是静态的 — 没有应用代码,除了 Mermaid 自身的渲染之外没有交互。
|
|
103
|
-
|
|
104
|
-
## 顶部推荐部分
|
|
105
|
-
|
|
106
|
-
一张更大的卡片。候选名称,一句话说明为什么,指向其卡片的锚链接。这就够了。
|
|
107
|
-
|
|
108
|
-
## 语气
|
|
109
|
-
|
|
110
|
-
平实的英语,简洁 — 但架构名词和动词直接来自 `/codebase-design` skill。简洁不是偏离的借口。
|
|
111
|
-
|
|
112
|
-
**完全使用:** module、interface、implementation、depth、deep、shallow、seam、adapter、leverage、locality。
|
|
113
|
-
|
|
114
|
-
**绝不替代:** component、service、unit(代替 module)· API、signature(代替 interface)· boundary(代替 seam)· layer、wrapper(代替 module,当你的意思是 module 时)。
|
|
115
|
-
|
|
116
|
-
**符合风格的表达方式:**
|
|
117
|
-
|
|
118
|
-
- "Order intake module is shallow — interface nearly matches the implementation."
|
|
119
|
-
- "Pricing leaks across the seam."
|
|
120
|
-
- "Deepen: one interface, one place to test."
|
|
121
|
-
- "Two adapters justify the seam: HTTP in prod, in-memory in tests."
|
|
122
|
-
|
|
123
|
-
**Wins 要点**用术语表命名收益:*"locality: bugs concentrate in one module"*、*"leverage: one interface, N call sites"*、*"interface shrinks; implementation absorbs the wrappers"*。不要写 *"easier to maintain"* 或 *"cleaner code"* — 这些术语不在术语表中,不值得留下。
|
|
124
|
-
|
|
125
|
-
不模糊其词,不清喉咙,不说"值得注意的是……"。如果一句话可以变成一个要点,就变成要点。如果一个要点可以删除,就删除它。如果一个术语不在 `/codebase-design` 术语表中,在发明新术语之前先用术语表中已有的。
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: improve-codebase-architecture
|
|
3
|
-
description: 扫描代码仓寻找深化机会,以可视化 HTML 报告呈现,然后针对你选择的任一方案进行访谈打磨。
|
|
4
|
-
disable-model-invocation: true
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# 改善代码仓架构
|
|
8
|
-
|
|
9
|
-
揭示架构摩擦,提出**深化机会** — 将浅层模块转变为深层模块的重构。目标是可测试性和 AI 可导航性。
|
|
10
|
-
|
|
11
|
-
此命令_基于_项目的领域模型,并建立在共享设计词汇之上:
|
|
12
|
-
|
|
13
|
-
- 运行 `/codebase-design` 技能获取架构词汇(**module**、**interface**、**depth**、**seam**、**adapter**、**leverage**、**locality**)及其原则(删除测试、"接口就是测试表面"、"一个适配器 = 假设缝合点,两个 = 真实缝合点")。在每个建议中严格使用这些术语 — 不要滑向 "component"、"service"、"API" 或 "boundary"。
|
|
14
|
-
- `CONTEXT.md` 中的领域语言为好的缝合点提供名称;`docs/adr/` 中的 ADR 记录此命令不应重新争论的决策。
|
|
15
|
-
|
|
16
|
-
## 流程
|
|
17
|
-
|
|
18
|
-
### 1. 探索
|
|
19
|
-
|
|
20
|
-
首先阅读项目的领域词汇表(`CONTEXT.md`)和你接触区域的任何 ADR。
|
|
21
|
-
|
|
22
|
-
然后使用 Agent 工具,以 `subagent_type=Explore` 遍历代码仓。不要遵循僵化的启发式 — 有机地探索,注意你在何处遇到摩擦:
|
|
23
|
-
|
|
24
|
-
- 理解一个概念需要在多个小模块之间反复跳跃?
|
|
25
|
-
- 哪些模块是**浅层的** — 接口几乎和实现一样复杂?
|
|
26
|
-
- 哪些纯函数仅为了可测试性而被提取,但真正的 bug 却隐藏在它们的调用方式中(没有**局部性**)?
|
|
27
|
-
- 哪些紧密耦合的模块在其缝合点处泄漏?
|
|
28
|
-
- 代码仓的哪些部分未经测试,或难以通过其当前接口进行测试?
|
|
29
|
-
|
|
30
|
-
对你怀疑是浅层的任何东西应用**删除测试**:删除它会集中复杂性,还是仅仅移动它?"是的,会集中"就是你想要的信号。
|
|
31
|
-
|
|
32
|
-
### 2. 以 HTML 报告呈现候选方案
|
|
33
|
-
|
|
34
|
-
将自包含的 HTML 文件写入操作系统临时目录,以免任何内容落入仓库。从 `$TMPDIR` 解析临时目录,回退到 `/tmp`(Windows 上用 `%TEMP%`),写入 `<临时目录>/architecture-review-<时间戳>.html`,使每次运行获得全新文件。为用户打开它 — Linux 上用 `xdg-open <路径>`,macOS 上用 `open <路径>`,Windows 上用 `start <路径>` — 并告知绝对路径。
|
|
35
|
-
|
|
36
|
-
报告使用 **Tailwind via CDN** 进行布局和样式设置,使用 **Mermaid via CDN** 绘制图/流程/序列可靠传达结构的图表。混合使用 Mermaid 和手写 CSS/SVG 视觉效果 — 当关系是图形态时(调用图、依赖关系、序列)使用 Mermaid,当想要更偏编辑性时(质量图、横截面、折叠动画)使用手写 div/SVG。每个候选方案包含一个**前后对比可视化**。要注重视觉效果。
|
|
37
|
-
|
|
38
|
-
为每个候选方案渲染一张卡片,包含:
|
|
39
|
-
|
|
40
|
-
- **文件** — 涉及哪些文件/模块
|
|
41
|
-
- **问题** — 为什么当前架构正在造成摩擦
|
|
42
|
-
- **解决方案** — 用简明英语描述将发生什么变化
|
|
43
|
-
- **收益** — 用局部性和杠杆效应解释,以及测试将如何改善
|
|
44
|
-
- **前后对比图** — 并排,自定义绘制,展示浅层性和深化过程
|
|
45
|
-
- **建议强度** — `Strong`、`Worth exploring`、`Speculative` 之一,渲染为徽章
|
|
46
|
-
|
|
47
|
-
以**最佳推荐**部分结束报告:你会首先处理哪个候选方案以及原因。
|
|
48
|
-
|
|
49
|
-
**使用 CONTEXT.md 的词汇处理领域,使用 `/codebase-design` 的词汇处理架构。** 如果 `CONTEXT.md` 定义了 "Order",谈论 "Order 接收模块" — 而非 "FooBarHandler",也非 "Order 服务"。
|
|
50
|
-
|
|
51
|
-
**ADR 冲突**:如果某个候选方案与现有 ADR 矛盾,仅在摩擦足够真实、值得重新审视 ADR 时才提出。在卡片中清晰标记(例如警告标注:_"与 ADR-0007 矛盾 — 但值得重新讨论因为……"_)。不要列出 ADR 禁止的所有理论重构。
|
|
52
|
-
|
|
53
|
-
参见 [HTML-REPORT.md](HTML-REPORT.md) 获取完整的 HTML 脚手架、图表模式和样式指南。
|
|
54
|
-
|
|
55
|
-
此时**不要**提出接口。文件写入后,询问用户:"你想探索其中哪一个?"
|
|
56
|
-
|
|
57
|
-
### 3. 访谈循环
|
|
58
|
-
|
|
59
|
-
一旦用户选择了候选方案,运行 `/grilling` 技能与他们一起遍历设计树 — 约束、依赖、深化模块的形状、缝合点后面的内容、哪些测试存留下来。
|
|
60
|
-
|
|
61
|
-
当决策结晶时,副作用即时发生 — 运行 `/domain-modeling` 技能保持领域模型同步更新:
|
|
62
|
-
|
|
63
|
-
- **为 `CONTEXT.md` 中没有的概念命名深化模块?** 将术语添加到 `CONTEXT.md`。如果文件不存在则延迟创建。
|
|
64
|
-
- **在对话中精炼模糊术语?** 当场更新 `CONTEXT.md`。
|
|
65
|
-
- **用户以具有负载作用的理由拒绝候选方案?** 提供 ADR,框架为:_"要我将其记录为 ADR 吗?这样未来的架构审查不会重新建议它。"_ 仅在未来的探索者确实需要此理由来避免重新建议相同内容时才提供 — 跳过暂时性理由("现在不值得做")和自明性理由。
|
|
66
|
-
- **想要探索深化模块的替代接口?** 运行 `/codebase-design` 技能并使用其"设计两次"并行子 agent 模式。
|