sillyspec 3.7.15 → 3.7.17
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/.claude/skills/sillyspec-brainstorm/SKILL.md +5 -583
- package/.claude/skills/sillyspec-execute/SKILL.md +5 -225
- package/.claude/skills/sillyspec-plan/SKILL.md +6 -256
- package/.claude/skills/sillyspec-propose/SKILL.md +5 -240
- package/.claude/skills/sillyspec-verify/SKILL.md +6 -139
- package/package.json +1 -1
- package/src/init.js +6 -3
|
@@ -3,246 +3,11 @@ name: sillyspec:propose
|
|
|
3
3
|
description: 生成结构化规范 — proposal + design + tasks
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
> 仅当需求已经明确、跳过 brainstorm 时才需要手动执行 propose。
|
|
6
|
+
## 执行
|
|
8
7
|
|
|
9
|
-
|
|
8
|
+
运行 `sillyspec run propose`,按提示逐步执行。
|
|
9
|
+
每步完成后运行 `sillyspec run propose --done --output "摘要"`。
|
|
10
|
+
阶段完成后自动提示下一步。
|
|
10
11
|
|
|
11
|
-
##
|
|
12
|
+
## 用户指令
|
|
12
13
|
$ARGUMENTS
|
|
13
|
-
|
|
14
|
-
## 流程
|
|
15
|
-
|
|
16
|
-
### 0. 检查状态(必须先执行)
|
|
17
|
-
|
|
18
|
-
**在开始任何工作之前,先调用 SillySpec CLI 检查当前状态:**
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
sillyspec status --json
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
**根据 CLI 返回的 phase 决定是否允许执行 propose:**
|
|
25
|
-
- `phase: "propose"` → ✅ 可以继续
|
|
26
|
-
- 其他 phase → ❌ 不允许跳步,提示用户运行 `sillyspec next` 获取正确步骤
|
|
27
|
-
|
|
28
|
-
**不要跳过状态检查。不要自己推断阶段。以 CLI 为准。**
|
|
29
|
-
|
|
30
|
-
### 1. 加载上下文
|
|
31
|
-
|
|
32
|
-
读取相关文档:
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
# 检测是否是子阶段变更
|
|
36
|
-
if [[ "$ARGUMENTS" == */stage-* ]]; then
|
|
37
|
-
MASTER_NAME="${ARGUMENTS%%/*}"
|
|
38
|
-
STAGE_NAME="${ARGUMENTS#*/}"
|
|
39
|
-
MASTER_DIR=".sillyspec/changes/$MASTER_NAME"
|
|
40
|
-
CHANGE_DIR="$MASTER_DIR/stages/$STAGE_NAME"
|
|
41
|
-
else
|
|
42
|
-
CHANGE_DIR=".sillyspec/changes/$ARGUMENTS"
|
|
43
|
-
fi
|
|
44
|
-
|
|
45
|
-
# 如果存在 MASTER.md,读取主变更上下文
|
|
46
|
-
cat .sillyspec/changes/*/MASTER.md 2>/dev/null
|
|
47
|
-
|
|
48
|
-
# 最新设计文档
|
|
49
|
-
ls -t .sillyspec/specs/*.md | head -1
|
|
50
|
-
# 需求
|
|
51
|
-
cat .sillyspec/REQUIREMENTS.md 2>/dev/null
|
|
52
|
-
# 代码库约定(棕地)
|
|
53
|
-
cat .sillyspec/codebase/CONVENTIONS.md 2>/dev/null
|
|
54
|
-
cat .sillyspec/codebase/ARCHITECTURE.md 2>/dev/null
|
|
55
|
-
# 已有变更(排除子阶段)
|
|
56
|
-
ls .sillyspec/changes/ | grep -v archive
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
如果是子阶段变更(如 `reward-punishment/stage-1`):
|
|
60
|
-
- 读取 MASTER.md 获取整体方向和技术决策
|
|
61
|
-
- 读取 MASTER.md 中"经验记录"章节(前面阶段的踩坑经验)
|
|
62
|
-
- 读取前面已完成阶段的设计文件(保持一致性)
|
|
63
|
-
- 读取该阶段对应的原型分析结果
|
|
64
|
-
- 规范文件保存到 `changes/<变更名>/stages/<stage-N>/`
|
|
65
|
-
|
|
66
|
-
如果是普通变更,照原流程执行。
|
|
67
|
-
|
|
68
|
-
如果没有设计文档 → 提示先运行 `/sillyspec:brainstorm`
|
|
69
|
-
|
|
70
|
-
### 1.5 锚定确认(必须完成)
|
|
71
|
-
|
|
72
|
-
读取相关规范文件。对于存在的文件,确认理解;对于不存在的文件,标注跳过:
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
已读取并理解:
|
|
76
|
-
- [x] proposal.md — 变更动机和范围(如果存在)
|
|
77
|
-
- [ ] design.md — 不存在(正常,将在本阶段生成)
|
|
78
|
-
- [ ] specs/requirements.md — 不存在(正常,将在本阶段生成)
|
|
79
|
-
|
|
80
|
-
所有可用上下文已加载,开始执行。
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
**文件不存在不是错误**。只确认实际存在的文件。不准跳过此步骤。
|
|
84
|
-
|
|
85
|
-
### 2. 探索现有代码
|
|
86
|
-
|
|
87
|
-
理解相关模块的当前实现,识别影响范围。
|
|
88
|
-
|
|
89
|
-
### 3. 生成规范文件
|
|
90
|
-
|
|
91
|
-
创建 `.sillyspec/changes/$ARGUMENTS/`,生成以下文件:
|
|
92
|
-
|
|
93
|
-
**`proposal.md`** — 变更提案:
|
|
94
|
-
```markdown
|
|
95
|
-
# [change-name]
|
|
96
|
-
|
|
97
|
-
## 动机
|
|
98
|
-
为什么做这件事
|
|
99
|
-
|
|
100
|
-
## 变更范围
|
|
101
|
-
受影响的核心区域
|
|
102
|
-
|
|
103
|
-
## 不在范围内
|
|
104
|
-
明确排除的内容
|
|
105
|
-
|
|
106
|
-
## 成功标准
|
|
107
|
-
- [ ] 可量化的标准 1
|
|
108
|
-
- [ ] 可量化的标准 2
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
**`specs/requirements.md`** — 需求清单:
|
|
112
|
-
```markdown
|
|
113
|
-
# 需求
|
|
114
|
-
|
|
115
|
-
## 功能需求
|
|
116
|
-
- [ ] REQ-001: 用户可以用邮箱注册
|
|
117
|
-
- [ ] REQ-002: 注册后自动发送验证邮件
|
|
118
|
-
|
|
119
|
-
## 用户场景
|
|
120
|
-
### 场景 1: 新用户注册
|
|
121
|
-
Given: 用户在注册页面
|
|
122
|
-
When: 填写邮箱和密码并提交
|
|
123
|
-
Then: 收到验证邮件,账户处于待验证状态
|
|
124
|
-
|
|
125
|
-
### 场景 2: 邮箱验证
|
|
126
|
-
Given: 用户收到验证邮件
|
|
127
|
-
When: 点击验证链接
|
|
128
|
-
Then: 账户激活,跳转到登录页
|
|
129
|
-
|
|
130
|
-
## 非功能需求
|
|
131
|
-
- 注册接口响应 < 500ms
|
|
132
|
-
- 密码使用 bcrypt 哈希
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
**`design.md`** — 技术方案:
|
|
136
|
-
```markdown
|
|
137
|
-
# 技术设计
|
|
138
|
-
|
|
139
|
-
## 架构决策
|
|
140
|
-
- 使用 JWT 存储 session(而非 server-side session)
|
|
141
|
-
- 理由:支持未来微服务拆分
|
|
142
|
-
|
|
143
|
-
## 文件变更清单
|
|
144
|
-
| 操作 | 文件 | 说明 |
|
|
145
|
-
|---|---|---|
|
|
146
|
-
| 新建 | `src/lib/auth.ts` | 认证核心逻辑 |
|
|
147
|
-
| 新建 | `src/app/api/auth/register/route.ts` | 注册接口 |
|
|
148
|
-
| 修改 | `prisma/schema.prisma` | 添加 User 模型 |
|
|
149
|
-
|
|
150
|
-
## 数据模型
|
|
151
|
-
[Prisma schema 或数据库表设计]
|
|
152
|
-
|
|
153
|
-
## API 设计
|
|
154
|
-
POST /api/auth/register
|
|
155
|
-
Request: { email: string, password: string }
|
|
156
|
-
Response: { userId: string, message: "verification email sent" }
|
|
157
|
-
|
|
158
|
-
## 代码风格参照
|
|
159
|
-
- Controller 风格:参考 `XxxController.java`(从 CONVENTIONS.md 获取)
|
|
160
|
-
- Service 风格:参考 `XxxServiceImpl.java`(从 CONVENTIONS.md 获取)
|
|
161
|
-
- 实体风格:参考 `Xxx.java`(基类:`BaseEntity`,字段参见 CONVENTIONS.md)
|
|
162
|
-
- 返回值类型:`Result<T>` / `ResponseEntity<T>`
|
|
163
|
-
- 异常类型:`BusinessException` / 其他
|
|
164
|
-
- 注解风格:从 CONVENTIONS.md「代码风格」章节获取
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
**`tasks.md`** — 实现清单:
|
|
168
|
-
```markdown
|
|
169
|
-
# 实现清单
|
|
170
|
-
|
|
171
|
-
## 准备
|
|
172
|
-
- [ ] Task 0: 配置开发环境(依赖、环境变量)
|
|
173
|
-
|
|
174
|
-
## 实现
|
|
175
|
-
- [ ] Task 1: 数据库模型(User 表)
|
|
176
|
-
- [ ] Task 2: 注册 API
|
|
177
|
-
- [ ] Task 3: 邮件发送服务
|
|
178
|
-
- [ ] Task 4: 邮箱验证流程
|
|
179
|
-
|
|
180
|
-
## 收尾
|
|
181
|
-
- [ ] Task 5: 错误处理和边界情况
|
|
182
|
-
- [ ] Task 6: 集成测试
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
### 4. 展示关键文件
|
|
186
|
-
|
|
187
|
-
展示 proposal.md 和 design.md 给用户审阅。tasks.md 只展示任务列表(细节在 plan 阶段展开)。
|
|
188
|
-
|
|
189
|
-
### 5. 自检门控(Hard Gate)
|
|
190
|
-
|
|
191
|
-
在展示文件给用户之前,**必须自检**:
|
|
192
|
-
|
|
193
|
-
- [ ] proposal.md 是否包含"动机"、"变更范围"、"不在范围内"、"成功标准"四个章节?
|
|
194
|
-
- [ ] design.md 是否包含"文件变更清单"表格?
|
|
195
|
-
- [ ] specs/requirements.md 是否包含 Given/When/Then 格式的用户场景?
|
|
196
|
-
- [ ] tasks.md 是否每个 task 都有文件路径?
|
|
197
|
-
|
|
198
|
-
**任何一项不通过 → 修正后重新检查,不准跳过。**
|
|
199
|
-
|
|
200
|
-
### 脚本校验(硬验证)
|
|
201
|
-
|
|
202
|
-
Hard Gate 自检通过后,运行校验脚本:
|
|
203
|
-
|
|
204
|
-
```bash
|
|
205
|
-
bash scripts/validate-proposal.sh .sillyspec/changes/$ARGUMENTS
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
- 脚本返回 0 → 自检通过,继续展示文件
|
|
209
|
-
- 脚本返回非 0 → 根据错误提示修正文件,重新运行脚本
|
|
210
|
-
|
|
211
|
-
### 7. 最后说:
|
|
212
|
-
|
|
213
|
-
**用 CLI 验证并获取下一步:**
|
|
214
|
-
|
|
215
|
-
```bash
|
|
216
|
-
sillyspec status --json
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
展示给用户:
|
|
220
|
-
> 规范已生成到 `.sillyspec/changes/$ARGUMENTS/`。
|
|
221
|
-
>
|
|
222
|
-
> 审阅 `proposal.md`(为什么做)和 `design.md`(怎么做)。
|
|
223
|
-
> 下一步:
|
|
224
|
-
|
|
225
|
-
```bash
|
|
226
|
-
sillyspec next
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
将 CLI 返回的命令推荐给用户。**不要自己编建议。**
|
|
230
|
-
|
|
231
|
-
### 8. 更新 progress.json
|
|
232
|
-
|
|
233
|
-
propose 完成后,**必须自动更新进度**:
|
|
234
|
-
```bash
|
|
235
|
-
sillyspec progress complete-stage propose
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
- 当前阶段改为 `propose ✅`
|
|
239
|
-
- 下一步改为 `/sillyspec:plan`
|
|
240
|
-
- 历史记录追加时间 + propose 完成
|
|
241
|
-
- 如果是子阶段(stages/ 下),更新阶段进度
|
|
242
|
-
|
|
243
|
-
## 绝对规则
|
|
244
|
-
- 不写实现代码
|
|
245
|
-
- tasks.md 只列任务名,不写具体步骤
|
|
246
|
-
- 必须包含可量化的成功标准
|
|
247
|
-
- 用户场景用 Given/When/Then 格式
|
|
248
|
-
- **禁止编造不存在的表名、字段名、API 端点。** design.md 中引用的数据库对象必须来自 ARCHITECTURE.md 的数据模型章节,或明确标注为"新增"
|
|
@@ -3,144 +3,11 @@ name: sillyspec:verify
|
|
|
3
3
|
description: 验证实现 — 对照规范检查 + 测试套件
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
## 执行
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
运行 `sillyspec run verify`,按提示逐步执行。
|
|
9
|
+
每步完成后运行 `sillyspec run verify --done --output "摘要"`。
|
|
10
|
+
阶段完成后自动提示下一步。
|
|
9
11
|
|
|
10
|
-
##
|
|
11
|
-
|
|
12
|
-
**在开始任何工作之前,先调用 SillySpec CLI 检查当前状态:**
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
sillyspec status --json
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
**根据 CLI 返回的 phase 决定是否允许执行 verify:**
|
|
19
|
-
- `phase: "verify"` → ✅ 可以继续
|
|
20
|
-
- 其他 phase → ❌ 不允许跳步,提示用户运行 `sillyspec next` 获取正确步骤
|
|
21
|
-
|
|
22
|
-
**不要跳过状态检查。不要自己推断阶段。以 CLI 为准。**
|
|
23
|
-
|
|
24
|
-
## 流程
|
|
25
|
-
|
|
26
|
-
### 1. 加载规范
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
LATEST=$(ls -d .sillyspec/changes/*/ | grep -v archive | tail -1)
|
|
30
|
-
cat "$LATEST/proposal.md"
|
|
31
|
-
cat "$LATEST/design.md"
|
|
32
|
-
cat "$LATEST/tasks.md"
|
|
33
|
-
cat "$LATEST/specs/requirements.md" 2>/dev/null
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### 1.5 锚定确认(必须完成)
|
|
37
|
-
|
|
38
|
-
读取相关规范文件。对于存在的文件,确认理解;对于不存在的文件,标注跳过:
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
已读取并理解:
|
|
42
|
-
- [x] proposal.md — 变更动机和范围(如果存在)
|
|
43
|
-
- [x] design.md — 技术方案和文件变更(如果存在)
|
|
44
|
-
- [x] tasks.md — 实现清单(如果存在)
|
|
45
|
-
- [x] specs/requirements.md — 需求和场景(如果存在)
|
|
46
|
-
|
|
47
|
-
所有可用上下文已加载,开始验证。
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
**文件不存在不是错误**。只确认实际存在的文件。不准跳过此步骤。
|
|
51
|
-
|
|
52
|
-
### 2. 逐项检查 tasks.md
|
|
53
|
-
|
|
54
|
-
对每个 checkbox 报告状态:
|
|
55
|
-
- ✅ 已完成 / ❌ 未完成 / ⚠️ 部分完成
|
|
56
|
-
|
|
57
|
-
### 3. 对照 design.md
|
|
58
|
-
|
|
59
|
-
- 架构决策是否遵循?
|
|
60
|
-
- 文件变更清单是否一致?
|
|
61
|
-
- 数据模型是否符合?
|
|
62
|
-
- API 设计是否符合?
|
|
63
|
-
|
|
64
|
-
### 4. 运行完整测试套件(fresh run)
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
# 根据项目技术栈运行
|
|
68
|
-
pnpm test 2>/dev/null || npm test 2>/dev/null || pytest 2>/dev/null || go test ./... 2>/dev/null
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
记录通过/失败数量。如有失败,分析原因。
|
|
72
|
-
|
|
73
|
-
### 5. 代码质量扫描
|
|
74
|
-
|
|
75
|
-
```bash
|
|
76
|
-
# 搜索技术债务标记
|
|
77
|
-
grep -r "TODO\|FIXME\|HACK\|XXX" src/ lib/ app/ --include="*.ts" --include="*.tsx" --include="*.py" --include="*.js" 2>/dev/null | head -20
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### 6. 输出验证报告
|
|
81
|
-
|
|
82
|
-
```markdown
|
|
83
|
-
# SillySpec 验证报告
|
|
84
|
-
|
|
85
|
-
## 任务完成度
|
|
86
|
-
- [x] Task 1: xxx ✅
|
|
87
|
-
- [x] Task 2: xxx ✅
|
|
88
|
-
- [ ] Task 3: xxx ❌ 未实现
|
|
89
|
-
完成度:2/3
|
|
90
|
-
|
|
91
|
-
## 设计一致性
|
|
92
|
-
- ✅ 架构决策遵循
|
|
93
|
-
- ⚠️ API 返回格式与 design.md 略有差异(缺少 error 字段)
|
|
94
|
-
|
|
95
|
-
## 测试结果
|
|
96
|
-
- passed: 42, failed: 3
|
|
97
|
-
|
|
98
|
-
## 技术债务标记
|
|
99
|
-
- src/auth/login.ts:15 // TODO: add rate limiting
|
|
100
|
-
- src/auth/login.ts:45 // FIXME: token expiry
|
|
101
|
-
|
|
102
|
-
## 结论
|
|
103
|
-
⚠️ PASS WITH NOTES
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
## 脚本校验(硬验证)
|
|
107
|
-
|
|
108
|
-
在输出验证报告之前,运行综合校验脚本:
|
|
109
|
-
|
|
110
|
-
```bash
|
|
111
|
-
bash scripts/validate-all.sh
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
将脚本输出纳入验证报告中的"设计一致性"部分。
|
|
115
|
-
|
|
116
|
-
### 7. 最后说:
|
|
117
|
-
|
|
118
|
-
**用 CLI 验证并获取下一步:**
|
|
119
|
-
|
|
120
|
-
```bash
|
|
121
|
-
sillyspec status --json
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
展示结果给用户,然后:
|
|
125
|
-
|
|
126
|
-
```bash
|
|
127
|
-
sillyspec next
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
将 CLI 返回的命令推荐给用户。**不要自己编建议。**
|
|
131
|
-
|
|
132
|
-
### 8. 更新 progress.json
|
|
133
|
-
|
|
134
|
-
verify 完成后,**必须自动更新进度**:
|
|
135
|
-
```bash
|
|
136
|
-
sillyspec progress complete-stage verify
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
- 当前阶段改为 `verify ✅` 或 `verify ⚠️`
|
|
140
|
-
- 下一步改为 `/sillyspec:archive`(PASS 时)或 `修复后重新 /sillyspec:verify`
|
|
141
|
-
- 如果是子阶段,更新阶段进度;如果全部阶段完成,下一步改为 `/sillyspec:archive`
|
|
142
|
-
- 历史记录追加时间 + 验证结果
|
|
143
|
-
|
|
144
|
-
## 绝对规则
|
|
145
|
-
- 不修改任何代码
|
|
146
|
-
- 只做检查和报告
|
|
12
|
+
## 用户指令
|
|
13
|
+
$ARGUMENTS
|
package/package.json
CHANGED
package/src/init.js
CHANGED
|
@@ -199,9 +199,12 @@ async function doInstall(projectDir, tools, isWorkspace, subprojects = []) {
|
|
|
199
199
|
}
|
|
200
200
|
|
|
201
201
|
// 复制 skills 到 .claude/skills/(给 Claude Code 使用)
|
|
202
|
-
const skillsSource = join(homedir(), '.agents', 'skills');
|
|
203
202
|
const claudeSkillsDir = join(projectDir, '.claude', 'skills');
|
|
204
|
-
|
|
203
|
+
// 优先从 npm 包自带位置复制,其次从 ~/.agents/skills/
|
|
204
|
+
const npmSkillsDir = join(__dirname, '..', '.claude', 'skills');
|
|
205
|
+
const localSkillsDir = join(homedir(), '.agents', 'skills');
|
|
206
|
+
const skillsSource = existsSync(npmSkillsDir) ? npmSkillsDir : existsSync(localSkillsDir) ? localSkillsDir : null;
|
|
207
|
+
if (skillsSource) {
|
|
205
208
|
const sillyspecSkills = readdirSync(skillsSource).filter(f => f.startsWith('sillyspec-') && statSync(join(skillsSource, f)).isDirectory());
|
|
206
209
|
if (sillyspecSkills.length > 0) {
|
|
207
210
|
mkdirSync(claudeSkillsDir, { recursive: true });
|
|
@@ -211,7 +214,7 @@ async function doInstall(projectDir, tools, isWorkspace, subprojects = []) {
|
|
|
211
214
|
console.log(chalk.green(' ✓ Claude Code skills 已同步 (' + sillyspecSkills.length + ' 个)'));
|
|
212
215
|
}
|
|
213
216
|
} else {
|
|
214
|
-
console.log(chalk.yellow(' ⚠ 未找到
|
|
217
|
+
console.log(chalk.yellow(' ⚠ 未找到 skills 目录,跳过 Claude Code skills 同步'));
|
|
215
218
|
}
|
|
216
219
|
|
|
217
220
|
|