@kunlv/atdc 1.0.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/AGENTS.md +58 -0
- package/GO.md +245 -0
- package/bin/add-command.py +144 -0
- package/bin/atdc.js +460 -0
- package/bin/cls.js +98 -0
- package/central/link.sh +60 -0
- package/central/ticket_center_server/.handoffs/TASK-238389_QYinVipLimit.md +128 -0
- package/central/ticket_center_server/.test_plans/TASK-227254-SupportMembership-self-test-plan.md +566 -0
- package/central/ticket_center_server/.test_plans/task-238389-qyin-vip-limit-self-test-plan.md +210 -0
- package/commands/claude/atd.md +3 -0
- package/commands/claude/atdc/1-spec.md +5 -0
- package/commands/claude/atdc/1-update.md +5 -0
- package/commands/claude/atdc/2-qa.md +3 -0
- package/commands/claude/atdc/3-impl-skip-spec.md +5 -0
- package/commands/claude/atdc/3-impl.md +3 -0
- package/commands/claude/atdc/4-verify.md +3 -0
- package/commands/claude/atdc/5-done.md +3 -0
- package/commands/claude/atdc/add-command.md +4 -0
- package/commands/claude/atdc/add-to-hc.md +3 -0
- package/commands/claude/atdc/analysis-cls-log.md +4 -0
- package/commands/claude/atdc/article.md +6 -0
- package/commands/claude/atdc/bugfix.md +4 -0
- package/commands/claude/atdc/code-simplifier.md +8 -0
- package/commands/claude/atdc/commit.md +4 -0
- package/commands/claude/atdc/compound.md +5 -0
- package/commands/claude/atdc/context.md +3 -0
- package/commands/claude/atdc/diagnose.md +8 -0
- package/commands/claude/atdc/git-guardrails.md +18 -0
- package/commands/claude/atdc/grill-with-docs.md +8 -0
- package/commands/claude/atdc/handoff.md +8 -0
- package/commands/claude/atdc/health.md +3 -0
- package/commands/claude/atdc/learn.md +4 -0
- package/commands/claude/atdc/review.md +10 -0
- package/commands/claude/atdc/search.md +4 -0
- package/commands/claude/atdc/strategy.md +3 -0
- package/commands/claude/atdc/table2xlsx.md +4 -0
- package/commands/claude/atdc/test-plan.md +5 -0
- package/commands/claude/atdc/travel-planner.md +4 -0
- package/commands/claude/atdc/xlsx2sql-insert.md +4 -0
- package/commands/claude/atdc/xlsx2sql-update.md +4 -0
- package/commands/claude/atdc/zoom-out.md +8 -0
- package/commands/codex/atdc/SKILL.md +8 -0
- package/commands/codex/atdc-1-spec/SKILL.md +8 -0
- package/commands/codex/atdc-1-update/SKILL.md +8 -0
- package/commands/codex/atdc-2-qa/SKILL.md +8 -0
- package/commands/codex/atdc-3-impl/SKILL.md +8 -0
- package/commands/codex/atdc-3-impl-skip-spec/SKILL.md +8 -0
- package/commands/codex/atdc-4-verify/SKILL.md +8 -0
- package/commands/codex/atdc-5-done/SKILL.md +8 -0
- package/commands/codex/atdc-add-command/SKILL.md +7 -0
- package/commands/codex/atdc-add-to-hc/SKILL.md +8 -0
- package/commands/codex/atdc-analysis-cls-log/SKILL.md +5 -0
- package/commands/codex/atdc-article/SKILL.md +8 -0
- package/commands/codex/atdc-bugfix/SKILL.md +5 -0
- package/commands/codex/atdc-code-simplifier/SKILL.md +7 -0
- package/commands/codex/atdc-commit/SKILL.md +7 -0
- package/commands/codex/atdc-compound/SKILL.md +8 -0
- package/commands/codex/atdc-context/SKILL.md +8 -0
- package/commands/codex/atdc-diagnose/SKILL.md +9 -0
- package/commands/codex/atdc-git-guardrails/SKILL.md +19 -0
- package/commands/codex/atdc-grill-with-docs/SKILL.md +9 -0
- package/commands/codex/atdc-handoff/SKILL.md +9 -0
- package/commands/codex/atdc-health/SKILL.md +8 -0
- package/commands/codex/atdc-learn/SKILL.md +7 -0
- package/commands/codex/atdc-review/SKILL.md +49 -0
- package/commands/codex/atdc-search/SKILL.md +5 -0
- package/commands/codex/atdc-strategy/SKILL.md +8 -0
- package/commands/codex/atdc-table2xlsx/SKILL.md +8 -0
- package/commands/codex/atdc-test-plan/SKILL.md +13 -0
- package/commands/codex/atdc-travel-planner/SKILL.md +7 -0
- package/commands/codex/atdc-xlsx2sql-insert/SKILL.md +8 -0
- package/commands/codex/atdc-xlsx2sql-update/SKILL.md +8 -0
- package/commands/codex/atdc-zoom-out/SKILL.md +9 -0
- package/commands/cursor/atdc/SKILL.md +8 -0
- package/commands/cursor/atdc-1-spec/SKILL.md +8 -0
- package/commands/cursor/atdc-1-update/SKILL.md +8 -0
- package/commands/cursor/atdc-2-qa/SKILL.md +8 -0
- package/commands/cursor/atdc-3-impl/SKILL.md +8 -0
- package/commands/cursor/atdc-3-impl-skip-spec/SKILL.md +8 -0
- package/commands/cursor/atdc-4-verify/SKILL.md +8 -0
- package/commands/cursor/atdc-5-done/SKILL.md +8 -0
- package/commands/cursor/atdc-add-command/SKILL.md +7 -0
- package/commands/cursor/atdc-add-to-hc/SKILL.md +8 -0
- package/commands/cursor/atdc-analysis-cls-log/SKILL.md +5 -0
- package/commands/cursor/atdc-article/SKILL.md +8 -0
- package/commands/cursor/atdc-bugfix/SKILL.md +5 -0
- package/commands/cursor/atdc-code-simplifier/SKILL.md +7 -0
- package/commands/cursor/atdc-commit/SKILL.md +7 -0
- package/commands/cursor/atdc-compound/SKILL.md +8 -0
- package/commands/cursor/atdc-context/SKILL.md +8 -0
- package/commands/cursor/atdc-diagnose/SKILL.md +8 -0
- package/commands/cursor/atdc-git-guardrails/SKILL.md +18 -0
- package/commands/cursor/atdc-grill-with-docs/SKILL.md +8 -0
- package/commands/cursor/atdc-handoff/SKILL.md +8 -0
- package/commands/cursor/atdc-health/SKILL.md +8 -0
- package/commands/cursor/atdc-learn/SKILL.md +7 -0
- package/commands/cursor/atdc-review/SKILL.md +49 -0
- package/commands/cursor/atdc-search/SKILL.md +5 -0
- package/commands/cursor/atdc-strategy/SKILL.md +8 -0
- package/commands/cursor/atdc-table2xlsx/SKILL.md +8 -0
- package/commands/cursor/atdc-test-plan/SKILL.md +7 -0
- package/commands/cursor/atdc-travel-planner/SKILL.md +7 -0
- package/commands/cursor/atdc-xlsx2sql-insert/SKILL.md +8 -0
- package/commands/cursor/atdc-xlsx2sql-update/SKILL.md +8 -0
- package/commands/cursor/atdc-zoom-out/SKILL.md +8 -0
- package/commands/opencode/atd.md +6 -0
- package/commands/opencode/atdc/1-spec.md +8 -0
- package/commands/opencode/atdc/1-update.md +8 -0
- package/commands/opencode/atdc/2-qa.md +6 -0
- package/commands/opencode/atdc/3-impl-skip-spec.md +8 -0
- package/commands/opencode/atdc/3-impl.md +6 -0
- package/commands/opencode/atdc/4-verify.md +6 -0
- package/commands/opencode/atdc/5-done.md +6 -0
- package/commands/opencode/atdc/add-command.md +6 -0
- package/commands/opencode/atdc/add-to-hc.md +6 -0
- package/commands/opencode/atdc/analysis-cls-log.md +6 -0
- package/commands/opencode/atdc/article.md +6 -0
- package/commands/opencode/atdc/bugfix.md +6 -0
- package/commands/opencode/atdc/code-simplifier.md +8 -0
- package/commands/opencode/atdc/commit.md +6 -0
- package/commands/opencode/atdc/compound.md +8 -0
- package/commands/opencode/atdc/context.md +6 -0
- package/commands/opencode/atdc/diagnose.md +8 -0
- package/commands/opencode/atdc/git-guardrails.md +18 -0
- package/commands/opencode/atdc/grill-with-docs.md +8 -0
- package/commands/opencode/atdc/handoff.md +8 -0
- package/commands/opencode/atdc/health.md +6 -0
- package/commands/opencode/atdc/learn.md +6 -0
- package/commands/opencode/atdc/review.md +7 -0
- package/commands/opencode/atdc/search.md +6 -0
- package/commands/opencode/atdc/strategy.md +6 -0
- package/commands/opencode/atdc/table2xlsx.md +6 -0
- package/commands/opencode/atdc/test-plan.md +6 -0
- package/commands/opencode/atdc/travel-planner.md +6 -0
- package/commands/opencode/atdc/xlsx2sql-insert.md +6 -0
- package/commands/opencode/atdc/xlsx2sql-update.md +6 -0
- package/commands/opencode/atdc/zoom-out.md +8 -0
- package/config/cls-defaults.json +19 -0
- package/hooks/atd-archive.sh +86 -0
- package/hooks/atd-state.sh +165 -0
- package/hooks/evidence-hook.sh +88 -0
- package/hooks/evidence-log.sh +54 -0
- package/hooks/guardrails.sh +65 -0
- package/hooks/handoff-compress.sh +104 -0
- package/hooks/phase-guard.sh +134 -0
- package/hooks/phase-write-guard.sh +96 -0
- package/hooks/ponytail-fix.sh +179 -0
- package/hooks/ponytail-guard.sh +66 -0
- package/hooks/ponytail-scan.sh +62 -0
- package/install.sh +276 -0
- package/package.json +20 -0
- package/packages/cls/bin/cls.js +146 -0
- package/packages/cls/config/defaults.json +17 -0
- package/packages/cls/mcp/server.js +142 -0
- package/packages/cls/package.json +29 -0
- package/packages/cls/scripts/postinstall.js +19 -0
- package/packages/cls/src/client.js +262 -0
- package/prompts/1-spec.md +271 -0
- package/prompts/1-update.md +198 -0
- package/prompts/2-qa.md +164 -0
- package/prompts/3-impl-bugfix.md +271 -0
- package/prompts/3-impl.md +419 -0
- package/prompts/4-verify.md +160 -0
- package/prompts/5-done.md +227 -0
- package/prompts/6-article.md +571 -0
- package/prompts/X-add-command.md +60 -0
- package/prompts/X-add-to-hc.md +178 -0
- package/prompts/X-analysis-cls-log.md +68 -0
- package/prompts/X-bugfix.md +10 -0
- package/prompts/X-code-simplifier.md +38 -0
- package/prompts/X-commit.md +116 -0
- package/prompts/X-compound.md +188 -0
- package/prompts/X-context-scan.md +101 -0
- package/prompts/X-diagnose.md +116 -0
- package/prompts/X-grill-with-docs.md +120 -0
- package/prompts/X-handoff.md +80 -0
- package/prompts/X-health.md +78 -0
- package/prompts/X-learn.md +151 -0
- package/prompts/X-review.md +417 -0
- package/prompts/X-search.md +74 -0
- package/prompts/X-strategy.md +95 -0
- package/prompts/X-table2xlsx.md +46 -0
- package/prompts/X-test-plan.md +436 -0
- package/prompts/X-travel-planner.md +22 -0
- package/prompts/X-xlsx2sql-insert.md +34 -0
- package/prompts/X-xlsx2sql-update.md +40 -0
- package/prompts/X-zoom-out.md +119 -0
- package/reference/diagnose-loop.md +66 -0
- package/reference/gates.md +90 -0
- package/reference/git-guardrails.md +71 -0
- package/reference/guards.md +275 -0
- package/reference/learn.md +100 -0
- package/reference/memory.md +190 -0
- package/reference/risk.md +74 -0
- package/reference/tdd.md +40 -0
- package/scripts/svg2png.js +46 -0
- package/src/cls/client.js +244 -0
- package/src/constants.js +49 -0
- package/src/evidence/ai-draft-metrics.js +157 -0
- package/src/evidence/canvas.js +184 -0
- package/src/evidence/index.js +98 -0
- package/src/evidence/sink-events.js +165 -0
- package/src/evidence/stage-timing.js +112 -0
- package/src/installers/claude.js +79 -0
- package/src/installers/codex.js +62 -0
- package/src/installers/opencode.js +72 -0
- package/src/manifest/ponytail-patterns.json +185 -0
- package/src/mcp/cls-mcp-server.js +142 -0
- package/src/utils.js +79 -0
- package/src/validators/state-validate.js +123 -0
- package/templates/.phase-state.json +13 -0
- package/templates/adr.md +62 -0
- package/templates/changelog.md +21 -0
- package/templates/concepts.md +35 -0
- package/templates/design.md +47 -0
- package/templates/handoff.md +64 -0
- package/templates/learn-skill.md +43 -0
- package/templates/progress.json +17 -0
- package/templates/proposal.md +29 -0
- package/templates/solution.md +36 -0
- package/templates/strategy.md +39 -0
- package/templates/tasks.md +41 -0
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
# prompts/6-article · 技术分享文章生成
|
|
2
|
+
|
|
3
|
+
从此文件读取后,直接开始执行,无需用户再次确认。
|
|
4
|
+
|
|
5
|
+
> **触发方式**:`/atdc:article`、`/atd article`、`生成文章`、`写文章`
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Step 0:定位目标 change
|
|
10
|
+
|
|
11
|
+
检测当前可用的 change:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# 优先活跃 change,其次最近归档
|
|
15
|
+
ACTIVE=$(ls -t openspec/changes/ 2>/dev/null | grep -v archive | head -1)
|
|
16
|
+
ARCHIVED=$(ls -t openspec/changes/archive/ 2>/dev/null | head -1)
|
|
17
|
+
|
|
18
|
+
if [ -n "$ACTIVE" ]; then
|
|
19
|
+
CHANGE_NAME="$ACTIVE"
|
|
20
|
+
CHANGE_DIR="openspec/changes/$CHANGE_NAME"
|
|
21
|
+
elif [ -n "$ARCHIVED" ]; then
|
|
22
|
+
CHANGE_NAME="$ARCHIVED"
|
|
23
|
+
CHANGE_DIR="openspec/changes/archive/$CHANGE_NAME"
|
|
24
|
+
else
|
|
25
|
+
echo "ℹ️ 未找到 openspec change,将从当前会话上下文提取素材。"
|
|
26
|
+
CHANGE_NAME="session-$(date +%Y%m%d-%H%M)"
|
|
27
|
+
CHANGE_DIR=""
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
echo "TARGET_CHANGE=$CHANGE_NAME"
|
|
31
|
+
echo "TARGET_DIR=$CHANGE_DIR"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
- 多个 change → 列出让用户选择,默认取最近归档
|
|
35
|
+
- 无 change → 不退出,直接从当前会话上下文提取素材继续(见 Step 0.5)
|
|
36
|
+
- 被手动调用且带参数 → 以参数为主题,结合会话上下文生成
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Step 0.3:用户提供素材的优先处理(OCR 增强)
|
|
41
|
+
|
|
42
|
+
> **触发条件**:用户调用 `/atdc:article` 时附带素材路径(如「素材在 /path/to/dir/」或「使用 /path/ 下面的图片」)。
|
|
43
|
+
|
|
44
|
+
### 检测素材路径
|
|
45
|
+
|
|
46
|
+
从用户输入中提取素材目录路径(如 `/Users/.../assets/xxx/`),执行:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
ls -1 <素材目录>/ 2>/dev/null | head -30
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
若目录存在且包含文件 → 进入 OCR 处理;不存在 → 跳过,提示用户。
|
|
53
|
+
|
|
54
|
+
### OCR 识别图片内容(强制)
|
|
55
|
+
|
|
56
|
+
对素材目录中每个图片文件(`.png`、`.jpg`、`.jpeg`、`.gif`),运行 tesseract OCR 提取文字:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# 检查 tesseract 可用性
|
|
60
|
+
which tesseract || brew install tesseract tesseract-lang
|
|
61
|
+
|
|
62
|
+
# 批量 OCR(中文优先,英文回退)
|
|
63
|
+
for f in $(ls <素材目录>/*.png <素材目录>/*.jpg 2>/dev/null | sort -V); do
|
|
64
|
+
echo "=== $(basename $f) ==="
|
|
65
|
+
tesseract "$f" stdout -l chi_sim 2>/dev/null | head -15
|
|
66
|
+
echo ""
|
|
67
|
+
done
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
> 若 tesseract 中文识别率低,追加 `-l chi_sim+eng` 或仅用 `-l eng` 回退。
|
|
71
|
+
|
|
72
|
+
### OCR 结果用途
|
|
73
|
+
|
|
74
|
+
将 OCR 提取的文字内容用于:
|
|
75
|
+
|
|
76
|
+
1. **识别截图主题**:判断每张截图属于 atdc 的哪个阶段(1-spec / 2-qa / 3-impl / 4-verify / 5-done)
|
|
77
|
+
2. **补充文章上下文**:OCR 文字作为会话历史的补充证据,丰富 Phase A 素材
|
|
78
|
+
3. **确定插图位置**:按阶段归类后,在文章对应章节插入 `![[素材目录/xxx.png]]`
|
|
79
|
+
|
|
80
|
+
### 素材优先级
|
|
81
|
+
|
|
82
|
+
| 优先级 | 来源 | 用途 |
|
|
83
|
+
|--------|------|------|
|
|
84
|
+
| 1(最高) | 用户提供的截图 OCR 内容 | 还原实际操作过程,截图直接插入文章 |
|
|
85
|
+
| 2 | proposal.md + design.md + spec.md | 技术方案与决策 |
|
|
86
|
+
| 3 | git diff | 代码示例 |
|
|
87
|
+
| 4(最低) | auto-generated diagrams | 架构图、流程图辅助说明 |
|
|
88
|
+
|
|
89
|
+
> **规则**:用户提供的素材截图 MUST 插入到文章对应阶段。若有阶段无对应截图,才使用 auto-generated diagram 补位。不得因图片无法直接查看而跳过用户素材。
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Step 0.5:无 change 时从会话提取素材
|
|
94
|
+
|
|
95
|
+
当 Step 0 未找到任何 change 时,从当前会话上下文提取文章素材:
|
|
96
|
+
|
|
97
|
+
### 提取内容
|
|
98
|
+
|
|
99
|
+
回顾当前会话的历史消息,提取以下信息:
|
|
100
|
+
|
|
101
|
+
1. **主题**:本次会话讨论的核心技术主题是什么?(功能实现、架构设计、bug 修复、工具优化)
|
|
102
|
+
2. **背景**:为什么要做这件事?解决了什么问题?
|
|
103
|
+
3. **关键决策**:过程中做了哪些技术选择?排除了什么方案?
|
|
104
|
+
4. **实现要点**:最核心的实现逻辑或架构设计是什么?
|
|
105
|
+
5. **代码/配置**:会话中创建或修改了哪些关键文件?提供了哪些代码片段?
|
|
106
|
+
|
|
107
|
+
### 替代 Phase A 数据
|
|
108
|
+
|
|
109
|
+
提取结果替代 Phase A 的 proposal.md / design.md / git diff:
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
Phase A 数据来源:当前会话上下文(无 openspec change)
|
|
113
|
+
- 主题:<一句话>
|
|
114
|
+
- 背景:<2-3 句>
|
|
115
|
+
- 关键决策:<列表>
|
|
116
|
+
- 实现要点:<文件清单 + 核心逻辑>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
> 从会话提取的代码片段也必须遵守「代码来源不得编造」约束:只能使用会话中实际出现过的代码。
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Phase A:上下文采集
|
|
124
|
+
|
|
125
|
+
### A1. 读取需求与技术文档
|
|
126
|
+
|
|
127
|
+
从 change 目录采集背景和技术方案:
|
|
128
|
+
|
|
129
|
+
- `$TARGET_DIR/proposal.md`:需求背景、目标、技术方案、排除方案
|
|
130
|
+
- `$TARGET_DIR/design.md`:模块划分、接口定义、数据流、ADR
|
|
131
|
+
|
|
132
|
+
若 `design.md` 不存在 → 仅用 `proposal.md` + git diff,提示用户。
|
|
133
|
+
若两者均不存在 → 仅用 git diff,提示用户。
|
|
134
|
+
两者均无且 git diff 也为空 → 退出。
|
|
135
|
+
|
|
136
|
+
### A2. 提取代码变更
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
git diff origin/main..HEAD 2>/dev/null || git diff HEAD~1..HEAD 2>/dev/null || git diff --cached 2>/dev/null
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
- diff 为空 → 退出
|
|
143
|
+
- diff 超过 3000 行 → 裁剪策略:① proposal.md 声明的涉及文件 ② 行数最多的非测试文件 ③ 排除测试文件和注释变更
|
|
144
|
+
|
|
145
|
+
### A3. 识别文章元数据
|
|
146
|
+
|
|
147
|
+
从 proposal.md 提取:
|
|
148
|
+
|
|
149
|
+
- **标题**:从 `# change:` 或 `## 背景与目标` 提取主题
|
|
150
|
+
- **标签(tags)**:从 change 名、涉及模块、技术栈关键词提取,3-6 个
|
|
151
|
+
- **难度(difficulty)**:默认 `"easy"`。若涉及跨层改动、并发、分布式等 → `"medium"` 或 `"hard"`
|
|
152
|
+
- **模块(module)**:从 proposal.md "实施范围 → 涉及模块" 提取第一个模块名
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Phase A.5:标题确认(暂停等用户选择)
|
|
157
|
+
|
|
158
|
+
> **强制要求**:进入 Phase B 之前,必须先生成 3-5 个标题候选,等用户选定后再继续。
|
|
159
|
+
|
|
160
|
+
### 生成标题候选
|
|
161
|
+
|
|
162
|
+
基于 Phase A 采集的 proposal + design + git diff 内容,生成 3-5 个标题候选。
|
|
163
|
+
每个标题从不同角度切入:
|
|
164
|
+
|
|
165
|
+
| 角度 | 格式示例 | 适用场景 |
|
|
166
|
+
|------|---------|---------|
|
|
167
|
+
| 问题驱动 | 《解决 <问题>:<方案> 实现笔记》 | bug fix、性能优化 |
|
|
168
|
+
| 技术叙事 | 《<技术主题> — 实现笔记》 | 新功能、架构变更 |
|
|
169
|
+
| 结果导向 | 《从 <旧状态> 到 <新状态>:<做了什么>》 | 重构、迁移 |
|
|
170
|
+
| 设计决策 | 《<N> 个关键决策:<主题> 的设计思路》 | 架构设计、技术选型 |
|
|
171
|
+
| 对比分析 | 《<方案A> vs <方案B>:<主题> 落地实录》 | 多方案对比 |
|
|
172
|
+
|
|
173
|
+
要求:
|
|
174
|
+
- 每个标题 ≤ 30 字
|
|
175
|
+
- 不重复同一角度
|
|
176
|
+
- 不出现"颠覆性"、"革命性"、"极致"等炒作词
|
|
177
|
+
- 必须体现本次 change 的具体内容,不能用泛化标题
|
|
178
|
+
|
|
179
|
+
### 标题推荐
|
|
180
|
+
|
|
181
|
+
从候选中标记一个推荐标题(标记 `★`),基于以下优先级:
|
|
182
|
+
1. 最准确概括 change 核心内容
|
|
183
|
+
2. 对目标读者(同行工程师)最有吸引力
|
|
184
|
+
3. 信息密度最高(标题本身透露了 what + why)
|
|
185
|
+
|
|
186
|
+
### 输出格式
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
📝 请选择文章标题(输入序号):
|
|
190
|
+
|
|
191
|
+
1. [★ 推荐] <标题1>
|
|
192
|
+
角度:<问题驱动/技术叙事/...>
|
|
193
|
+
|
|
194
|
+
2. <标题2>
|
|
195
|
+
角度:<...>
|
|
196
|
+
|
|
197
|
+
3. <标题3>
|
|
198
|
+
角度:<...>
|
|
199
|
+
|
|
200
|
+
4. <标题4>
|
|
201
|
+
角度:<...>
|
|
202
|
+
|
|
203
|
+
5. <标题5>
|
|
204
|
+
角度:<...>
|
|
205
|
+
|
|
206
|
+
💡 选 1 直接回车,或输入序号/自定义标题。
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### 等待用户选择
|
|
210
|
+
|
|
211
|
+
- 用户输入序号 → 使用对应标题
|
|
212
|
+
- 用户输入自定义文本 → 使用用户提供的标题
|
|
213
|
+
- 用户直接回车(空输入)→ 使用推荐标题(★)
|
|
214
|
+
- **收到选择后才继续 Phase B,不得跳过等待**
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Phase B:图表规划与生成
|
|
219
|
+
|
|
220
|
+
> **强制要求**:每篇文章必须包含至少 1 张技术图表。图表不得有乱码。
|
|
221
|
+
|
|
222
|
+
### B1. 识别图表需求
|
|
223
|
+
|
|
224
|
+
> **用户素材优先**:如果 Step 0.3 检测到用户提供了截图素材,用户截图 MUST 优先作为配图使用。auto-generated diagram 仅在以下情况使用:(a) 用户未提供素材;(b) 用户素材无法覆盖的阶段需要补位图表。
|
|
225
|
+
|
|
226
|
+
从 Phase A 采集的内容中识别适合做图的额外需求(补充用户已有素材的不足):
|
|
227
|
+
|
|
228
|
+
| 内容特征 | 图表类型 | 示例 |
|
|
229
|
+
|---------|---------|------|
|
|
230
|
+
| 模块划分 + 依赖关系 | 架构图(architecture) | `fireworks-tech-graph` 模板 `architecture` |
|
|
231
|
+
| 数据流转步骤 | 数据流图(data-flow) | 箭头标注数据类型 |
|
|
232
|
+
| 调用链 / 请求链路 | 时序图(sequence) | 参与者 lifeline + 消息箭头 |
|
|
233
|
+
| 工作流 / 状态变更 | 流程图(flowchart) | 菱形决策 + 矩形处理 |
|
|
234
|
+
| 多方案对比 | 对比表(comparison) | 行=方案、列=维度 |
|
|
235
|
+
| Agent 决策链路 | Agent 架构图 | 输入→推理→工具→输出 |
|
|
236
|
+
|
|
237
|
+
**最少 1 张,推荐 2-3 张。**
|
|
238
|
+
|
|
239
|
+
### B2. 生成 SVG 图表
|
|
240
|
+
|
|
241
|
+
使用 `fireworks-tech-graph` skill 生成 SVG 图表。
|
|
242
|
+
|
|
243
|
+
**布局规则(必须遵守,否则图表会重叠模糊):**
|
|
244
|
+
|
|
245
|
+
| 规则 | 约束 |
|
|
246
|
+
|------|------|
|
|
247
|
+
| 节点数上限 | 单张图 ≤ **15 个节点**(超过则拆分为多张图) |
|
|
248
|
+
| 节点间距 | 水平 ≥ 40px,垂直行间距 ≥ 50px(边缘到边缘) |
|
|
249
|
+
| 标签长度 | 每行 ≤ 12 个中文字(或 20 个英文字符),超出则换行 |
|
|
250
|
+
| 多行文本 | **禁止**在 SVG `<text>` 中嵌入 `\n`。每行必须是独立的 `<text>` 元素,y 坐标递增 `font-size + 4px` |
|
|
251
|
+
| viewBox 高度 | **必须根据节点实际位置计算**,不可硬编码 700。公式:`max(最底节点 bottom) + 40px`,向上取整到 8 的倍数 |
|
|
252
|
+
| 标题位置 | y=40–48,居中,26px 字号。y=0–70 为标题保留区,不得有任何节点 |
|
|
253
|
+
| 箭头数量 | ≤ 节点数 × 1.5(太多箭头必然交叉) |
|
|
254
|
+
| 图层数 | ≤ 4 层(垂直方向),超过则换架构图 |
|
|
255
|
+
| 字体 | 中文必须声明 `'PingFang SC', 'Microsoft YaHei'` |
|
|
256
|
+
| Legend | 放在左下角或右下角,不与任何节点重叠 |
|
|
257
|
+
|
|
258
|
+
**生成方法**:必须使用 Python list 逐行拼接(`generate-from-template.py` 生成的 `\n` 内嵌文字不换行),然后逐个 `<text>` 写多行标签。
|
|
259
|
+
|
|
260
|
+
```python
|
|
261
|
+
python3 << 'PYEOF'
|
|
262
|
+
lines = []
|
|
263
|
+
lines.append('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 500" ...>')
|
|
264
|
+
# title at y=40
|
|
265
|
+
lines.append('<text x="480" y="40" text-anchor="middle" class="title">图表标题</text>')
|
|
266
|
+
# node with multiline text — separate <text> per line
|
|
267
|
+
lines.append('<rect x="40" y="120" width="160" height="80" rx="10" .../>')
|
|
268
|
+
lines.append('<text x="120" y="145" text-anchor="middle" class="node-label">主标题</text>')
|
|
269
|
+
lines.append('<text x="120" y="162" text-anchor="middle" class="node-sub">副标题行1</text>')
|
|
270
|
+
lines.append('<text x="120" y="179" text-anchor="middle" class="node-sub">副标题行2</text>')
|
|
271
|
+
lines.append('</svg>')
|
|
272
|
+
with open('output.svg', 'w') as f: f.write('\n'.join(lines))
|
|
273
|
+
PYEOF
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
每张图生成后验证 XML 语法:
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
python3 -c "import xml.etree.ElementTree as ET; ET.parse('<output-path.svg>')" && echo "✓ valid"
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**布局计算——先算高度再写 viewBox**:
|
|
283
|
+
1. 横向:节点均匀排列,间距 40px
|
|
284
|
+
2. 纵向:row0(y=80-140), row1(y=190-270), row2(y=340-420) → height = 420+40 = 460
|
|
285
|
+
3. 填入 viewBox 时用计算值,不是 700
|
|
286
|
+
|
|
287
|
+
### B3. 导出 PNG(禁止乱码)
|
|
288
|
+
|
|
289
|
+
> **关键约束**:必须使用 Puppeteer(headless Chrome)导出 PNG,禁止使用 `cairosvg` 和 `rsvg-convert`。
|
|
290
|
+
> 原因:cairosvg 基于 Cairo,不渲染 CJK 字符;rsvg-convert 在 macOS 下 fontconfig 不稳定,中文会变成方框。
|
|
291
|
+
> 唯一可靠方案是 Puppeteer(Chrome 引擎),字体回退机制与浏览器一致。
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
# 一键导出目录下所有 SVG → PNG(2x 分辨率)
|
|
295
|
+
node ~/atdc/scripts/svg2png.js <assets-dir>
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
> 依赖:`~/atdc/node_modules/puppeteer`(已在 install.sh 中安装)。
|
|
299
|
+
> 若报错 `Cannot find module 'puppeteer'`,执行:`cd ~/atdc && npm install puppeteer`
|
|
300
|
+
|
|
301
|
+
### B4. 布局验证
|
|
302
|
+
|
|
303
|
+
导出后运行重叠检测,确保无文字被遮挡:
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
python3 << 'EOF'
|
|
307
|
+
import xml.etree.ElementTree as ET
|
|
308
|
+
|
|
309
|
+
tree = ET.parse('<output-path.svg>')
|
|
310
|
+
root = tree.getroot()
|
|
311
|
+
vb = root.get('viewBox', '0 0 960 700')
|
|
312
|
+
parts = vb.split()
|
|
313
|
+
vw, vh = float(parts[2]), float(parts[3])
|
|
314
|
+
|
|
315
|
+
rects = []
|
|
316
|
+
for elem in root.iter():
|
|
317
|
+
tag = elem.tag.split('}')[-1] if '}' in elem.tag else elem.tag
|
|
318
|
+
if tag not in ('rect', 'ellipse'):
|
|
319
|
+
continue
|
|
320
|
+
try:
|
|
321
|
+
if tag == 'rect':
|
|
322
|
+
x = float(elem.get('x', 0))
|
|
323
|
+
y = float(elem.get('y', 0))
|
|
324
|
+
w = float(elem.get('width', 0))
|
|
325
|
+
h = float(elem.get('height', 0))
|
|
326
|
+
else:
|
|
327
|
+
cx = float(elem.get('cx', 0))
|
|
328
|
+
cy = float(elem.get('cy', 0))
|
|
329
|
+
rx = float(elem.get('rx', 0))
|
|
330
|
+
ry = float(elem.get('ry', 0))
|
|
331
|
+
x, y, w, h = cx - rx, cy - ry, rx * 2, ry * 2
|
|
332
|
+
except (ValueError, TypeError):
|
|
333
|
+
continue
|
|
334
|
+
if w <= 0 or h <= 0 or w > vw * 0.8:
|
|
335
|
+
continue
|
|
336
|
+
fill = elem.get('fill', 'none')
|
|
337
|
+
if fill == 'none':
|
|
338
|
+
continue
|
|
339
|
+
rects.append({'x': x, 'y': y, 'w': w, 'h': h, 'r': x + w, 'b': y + h})
|
|
340
|
+
|
|
341
|
+
issues = []
|
|
342
|
+
for i in range(len(rects)):
|
|
343
|
+
for j in range(i+1, len(rects)):
|
|
344
|
+
r1, r2 = rects[i], rects[j]
|
|
345
|
+
ox = max(0, min(r1['r'], r2['r']) - max(r1['x'], r2['x']))
|
|
346
|
+
oy = max(0, min(r1['b'], r2['b']) - max(r1['y'], r2['y']))
|
|
347
|
+
if ox > 15 and oy > 15:
|
|
348
|
+
issues.append(f"重叠 {ox:.0f}x{oy:.0f}px")
|
|
349
|
+
|
|
350
|
+
for r in rects:
|
|
351
|
+
if r['x'] < 3:
|
|
352
|
+
issues.append("节点贴左边缘")
|
|
353
|
+
if r['r'] > vw - 3:
|
|
354
|
+
issues.append(f"节点超出右边缘")
|
|
355
|
+
if r['b'] > vh - 20:
|
|
356
|
+
issues.append("节点超出底边缘")
|
|
357
|
+
|
|
358
|
+
if issues:
|
|
359
|
+
print(f"❌ 布局问题 ({len(issues)}):")
|
|
360
|
+
for iss in issues[:5]:
|
|
361
|
+
print(f" - {iss}")
|
|
362
|
+
print("请调整节点位置或减少节点数后重新生成")
|
|
363
|
+
else:
|
|
364
|
+
print("✅ 布局正常")
|
|
365
|
+
EOF
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
> PNG 内容验证由 Puppeteer Chrome 引擎保证(CJK 字体回退与浏览器一致)。
|
|
369
|
+
|
|
370
|
+
### B5. 确定图片路径
|
|
371
|
+
|
|
372
|
+
**用户素材**(Step 0.3 检测到的):
|
|
373
|
+
- 直接使用用户提供的路径,如 `![[素材目录/1.png]]`
|
|
374
|
+
- Obsidian wikilink 中的路径相对于 `assets/`,即 `/Users/lvkun/Documents/Obsidian/Docs/assets/`
|
|
375
|
+
|
|
376
|
+
**Auto-generated diagrams**(fireworks-tech-graph 生成的):
|
|
377
|
+
- 输出到 Obsidian assets 根目录:
|
|
378
|
+
```
|
|
379
|
+
/Users/lvkun/Documents/Obsidian/Docs/assets/<change-name>-<diagram-label>.png
|
|
380
|
+
```
|
|
381
|
+
- 文章中引用使用 Obsidian wikilink 格式:`![[<change-name>-<diagram-label>.png]]`
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## Phase C:初稿生成
|
|
386
|
+
|
|
387
|
+
> **强制要求**:必须加载以下三个 skill,不得跳过、不得降级。
|
|
388
|
+
> 任一 skill 加载失败 → 停止,提示用户安装后重试。
|
|
389
|
+
|
|
390
|
+
### C1. 加载写作 skill(强制执行)
|
|
391
|
+
|
|
392
|
+
按顺序加载三个 skill,每个加载后确认成功:
|
|
393
|
+
|
|
394
|
+
```
|
|
395
|
+
1. Skill("article-writing") → 确认已加载
|
|
396
|
+
2. Skill("chinese-content-writing-guideline") → 确认已加载
|
|
397
|
+
3. Skill("humanizer-zh") → 确认已加载
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
**任一加载失败 → 输出以下提示并停止:**
|
|
401
|
+
|
|
402
|
+
```
|
|
403
|
+
❌ 文章生成中止:skill 加载失败
|
|
404
|
+
|
|
405
|
+
缺失的 skill:<skill-name>
|
|
406
|
+
安装方式:npx skills add <skill-package>
|
|
407
|
+
|
|
408
|
+
所有 skill 就绪后重新运行 /atdc:article。
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
### C2. 写作规范(内嵌硬约束,与 skill 并行生效)
|
|
412
|
+
|
|
413
|
+
```
|
|
414
|
+
你是一位资深技术写作者。基于以下上下文,写一篇图文结合的技术分享文章。
|
|
415
|
+
|
|
416
|
+
## 硬性约束(违反任何一条 = 不合格)
|
|
417
|
+
|
|
418
|
+
1. **图文结合**:每个主要章节必须配图。图片来自 Phase B 生成的 PNG,
|
|
419
|
+
文章中用 Obsidian wikilink 引用:`![[<图片名>.png]]`
|
|
420
|
+
2. **代码先行**:每个技术点先给完整代码示例,再解释原理。代码块必须有语言标注。
|
|
421
|
+
3. **代码来源**:所有代码示例 MUST 来自 Phase A 提供的 git diff,不得编造、不得简化、不得省略。
|
|
422
|
+
如果 diff 中没有某段代码,就不要展示该段代码,改用文字描述思路。
|
|
423
|
+
4. **去炒作化**:禁止使用"颠覆性"、"革命性"、"重新定义"、"极致"、"完美"等空洞修饰词。
|
|
424
|
+
5. **中文输出**:标题、正文、代码注释说明 MUST 为简体中文。代码变量名/函数名保持原样。
|
|
425
|
+
|
|
426
|
+
## 文章结构
|
|
427
|
+
|
|
428
|
+
### 1. 标题
|
|
429
|
+
格式:`<技术主题> — 实现笔记`
|
|
430
|
+
|
|
431
|
+
### 2. 背景(3-5 句)
|
|
432
|
+
- 要解决什么问题
|
|
433
|
+
- 为什么值得分享
|
|
434
|
+
|
|
435
|
+
### 3. 核心实现(占全文 60%+)
|
|
436
|
+
- 每个关键模块一个小节
|
|
437
|
+
- 小节格式:配图 → `### <模块名>` → 代码块 → 解释
|
|
438
|
+
- 代码块后紧跟 2-4 句解释:这段代码做什么、为什么这样写
|
|
439
|
+
- 配图放在小节标题之前或紧随其后
|
|
440
|
+
|
|
441
|
+
### 4. 关键决策(3-5 个要点)
|
|
442
|
+
- 选择了什么方案、为什么
|
|
443
|
+
- 排除了什么方案、为什么不选
|
|
444
|
+
|
|
445
|
+
### 5. 总结(2-3 句)
|
|
446
|
+
- 一句话回顾做了什么
|
|
447
|
+
- 一句话可改进方向(如有)
|
|
448
|
+
|
|
449
|
+
## 上下文
|
|
450
|
+
|
|
451
|
+
### 需求背景
|
|
452
|
+
<proposal.md 内容>
|
|
453
|
+
|
|
454
|
+
### 技术设计
|
|
455
|
+
<design.md 内容或 [无 design.md]>
|
|
456
|
+
|
|
457
|
+
### 代码变更
|
|
458
|
+
<git diff 输出>
|
|
459
|
+
|
|
460
|
+
### 配图清单
|
|
461
|
+
<Phase B 生成的图片路径列表,含 wikilink>
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### C3. 生成初稿
|
|
465
|
+
|
|
466
|
+
将上下文填充到 C2 模板中,生成初稿。约束:
|
|
467
|
+
- **图文结合**:每个主要章节配一张图,图片放在章节开头
|
|
468
|
+
- 不提前透露"这是一个模板"
|
|
469
|
+
- 初稿即最终结构,后续只做格式规范化和润色
|
|
470
|
+
- 若 git diff 中无可展示的代码(如纯配置变更)→ 代码块替换为配置示例或关键参数说明
|
|
471
|
+
|
|
472
|
+
---
|
|
473
|
+
|
|
474
|
+
## Phase D:规范与润色
|
|
475
|
+
|
|
476
|
+
> **强制要求**:Phase C 已加载的 chinese-content-writing-guideline 和 humanizer-zh skill 在此阶段生效。
|
|
477
|
+
|
|
478
|
+
### D1. 中文排版规范
|
|
479
|
+
|
|
480
|
+
对初稿执行以下排版检查(chinese-content-writing-guideline skill 规则):
|
|
481
|
+
|
|
482
|
+
- 全角标点(,。!?;:"")
|
|
483
|
+
- 中英文之间插入空格(`使用 Node.js 构建`)
|
|
484
|
+
- 数字与中文之间插入空格
|
|
485
|
+
- 统一术语格式
|
|
486
|
+
- 破折号检查:全文最多 2 个 `——`
|
|
487
|
+
|
|
488
|
+
### D2. 去 AI 味润色
|
|
489
|
+
|
|
490
|
+
对 D1 输出执行 humanizer-zh skill 规则(模式 `学术`):
|
|
491
|
+
|
|
492
|
+
- 删除"首先...其次...最后..."等机械过渡词
|
|
493
|
+
- 删除"综上所述"、"值得注意的是"等模板句式
|
|
494
|
+
- 删除否定式排比("不仅是...更是...")
|
|
495
|
+
- 删除三段式列举(强行凑三个点)
|
|
496
|
+
- 确保句式长短交替,避免连续 3 句以上相同结构
|
|
497
|
+
- 质量检查:对照 humanizer-zh 的 24 条检查清单逐项扫描
|
|
498
|
+
|
|
499
|
+
### D3. 图片引用验证
|
|
500
|
+
|
|
501
|
+
确认文章中每个 `![[...]]` 引用的图片文件确实存在:
|
|
502
|
+
|
|
503
|
+
```bash
|
|
504
|
+
# 提取文章中所有图片引用,逐个验证
|
|
505
|
+
# 支持子目录路径,如 ![[预约详情/1.png]]
|
|
506
|
+
ASSETS="/Users/lvkun/Documents/Obsidian/Docs/assets"
|
|
507
|
+
grep -oP '!\[\[.*?\]\]' <article-path> | sed 's/!\[\[//;s/\]\]//' | while read img; do
|
|
508
|
+
ls "$ASSETS/$img" 2>/dev/null && echo "✓ $img" || echo "❌ MISSING: $img"
|
|
509
|
+
done
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
> **用户素材优先检查**:若 Step 0.3 检测到用户素材目录,验证该目录下被引用的图片是否存在。缺失的截图需提示用户确认路径。
|
|
513
|
+
|
|
514
|
+
有缺失 → 回到 Phase B 补生成。用户素材缺失 → 不可跳过,必须等用户确认路径后再继续。
|
|
515
|
+
|
|
516
|
+
---
|
|
517
|
+
|
|
518
|
+
## Phase E:发布到 Obsidian
|
|
519
|
+
|
|
520
|
+
### E1. 组装 frontmatter
|
|
521
|
+
|
|
522
|
+
```yaml
|
|
523
|
+
---
|
|
524
|
+
title: "<从 Phase A3 提取>"
|
|
525
|
+
date: "<当前日期 YYYY-MM-DD>"
|
|
526
|
+
tags: [<从 Phase A3 提取的标签列表>]
|
|
527
|
+
difficulty: "<从 Phase A3 提取>"
|
|
528
|
+
module: "<从 Phase A3 提取>"
|
|
529
|
+
---
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
### E2. 写入文件
|
|
533
|
+
|
|
534
|
+
目标路径:`/Users/lvkun/Documents/Obsidian/Docs/ai-tools/<change-name>-技术分享.md`
|
|
535
|
+
|
|
536
|
+
- 路径不存在 → 创建目录后写入
|
|
537
|
+
- 同名文件已存在 → 询问:覆盖 / 追加时间戳 / 跳过
|
|
538
|
+
|
|
539
|
+
### E3. 最终质量检查
|
|
540
|
+
|
|
541
|
+
逐项确认后输出报告:
|
|
542
|
+
|
|
543
|
+
```
|
|
544
|
+
✅ 技术分享文章已生成
|
|
545
|
+
|
|
546
|
+
📄 /Users/lvkun/Documents/Obsidian/Docs/ai-tools/<change-name>-技术分享.md
|
|
547
|
+
|
|
548
|
+
📋 元数据:
|
|
549
|
+
- 标题: <title>
|
|
550
|
+
- 标签: <tags>
|
|
551
|
+
- 难度: <difficulty>
|
|
552
|
+
- 字数: ~<N> 汉字
|
|
553
|
+
|
|
554
|
+
🖼️ 配图(<N> 张):
|
|
555
|
+
- 用户素材:<N> 张(OCR 识别 <N> 张有效)
|
|
556
|
+
- auto-generated:<N> 张
|
|
557
|
+
- assets/<image1>.png ✓
|
|
558
|
+
- assets/<image2>.png ✓
|
|
559
|
+
|
|
560
|
+
✅ 强制 skill 检查:
|
|
561
|
+
- article-writing ✓ 已加载
|
|
562
|
+
- chinese-content-writing-guideline ✓ 已加载
|
|
563
|
+
- humanizer-zh ✓ 已加载
|
|
564
|
+
|
|
565
|
+
✅ 质量检查:
|
|
566
|
+
- 破折号: <N>/2
|
|
567
|
+
- 图片引用完整: ✓
|
|
568
|
+
- 中文排版: ✓
|
|
569
|
+
|
|
570
|
+
💡 建议在 Obsidian 中打开确认排版和图片渲染后再发布。
|
|
571
|
+
```
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# prompts/X-add-command · 新增 atdc 命令
|
|
2
|
+
|
|
3
|
+
横向命令,任意时刻可触发:`/atdc:add-command <name> <描述> <触发词>`
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 执行步骤
|
|
8
|
+
|
|
9
|
+
### 1. 确定参数
|
|
10
|
+
|
|
11
|
+
从用户输入中提取 3 个必填参数:
|
|
12
|
+
- **name**:命令名(kebab-case,如 `my-cmd`)
|
|
13
|
+
- **desc**:命令描述(如 `"我的工具"`)
|
|
14
|
+
- **triggers**:触发词(逗号分隔,如 `"my-cmd、我的工具、/atdc:my-cmd"`)
|
|
15
|
+
|
|
16
|
+
可选:
|
|
17
|
+
- `--short`:简短描述(默认取 desc 前 30 字)
|
|
18
|
+
|
|
19
|
+
### 2. 执行生成脚本
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
python3 ~/atdc/bin/add-command.py <name> "<desc>" "<triggers>" --short "<short_desc>"
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
脚本自动完成:
|
|
26
|
+
- ✅ 4 端命令文件(OpenCode / Claude / Codex / Cursor)
|
|
27
|
+
- ✅ prompts/X-<name>.md 模板
|
|
28
|
+
- ✅ install.sh 注册
|
|
29
|
+
- ✅ ~/.agents/skills/ 符号链接
|
|
30
|
+
|
|
31
|
+
### 3. 运行 install.sh
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
bash ~/atdc/install.sh
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 4. 验证
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# 确认 Cursor 版本无 $ARGUMENTS
|
|
41
|
+
grep '$ARGUMENTS' ~/atdc/commands/cursor/atd-<name>/SKILL.md && echo "❌" || echo "✅"
|
|
42
|
+
|
|
43
|
+
# 确认符号链接
|
|
44
|
+
ls ~/.agents/skills/atd-<name>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 5. 补充 prompt 内容
|
|
48
|
+
|
|
49
|
+
根据命令功能,填写 `prompts/X-<name>.md` 的完整执行指令。
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 示例
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# 用户说:新增一个 /atdc:export-csv 命令,用于导出 CSV
|
|
57
|
+
# AI 执行:
|
|
58
|
+
python3 ~/atdc/bin/add-command.py export-csv "导出数据为CSV" "export-csv、导出CSV、/atdc:export-csv" --short "导出CSV"
|
|
59
|
+
bash ~/atdc/install.sh
|
|
60
|
+
```
|