sillyspec 3.8.7 → 3.9.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/steps/brainstorm/01-load-context.md +30 -0
- package/dist/steps/brainstorm/02-reuse-check.md +6 -0
- package/dist/steps/brainstorm/03-prototype-analysis.md +11 -0
- package/dist/steps/brainstorm/04-module-split.md +23 -0
- package/dist/steps/brainstorm/05-dialog-explore.md +8 -0
- package/dist/steps/brainstorm/06-propose-approaches.md +3 -0
- package/dist/steps/brainstorm/07-present-design.md +3 -0
- package/dist/steps/brainstorm/08-write-design.md +21 -0
- package/dist/steps/brainstorm/09-self-review.md +15 -0
- package/dist/steps/brainstorm/10-user-confirm.md +3 -0
- package/dist/steps/brainstorm/11-output-spec.md +7 -0
- package/dist/steps/brainstorm/manifest.yaml +26 -0
- package/dist/steps/execute/01-load-context.md +41 -0
- package/dist/steps/execute/02-scan-conventions.md +47 -0
- package/dist/steps/execute/03-skill-mcp.md +19 -0
- package/dist/steps/execute/04-assign-task.md +22 -0
- package/dist/steps/execute/04b-prompt-template.md +54 -0
- package/dist/steps/execute/05-write-test.md +7 -0
- package/dist/steps/execute/06-write-code.md +8 -0
- package/dist/steps/execute/07-run-test.md +26 -0
- package/dist/steps/execute/08-fix-issues.md +28 -0
- package/dist/steps/execute/09-next-task.md +33 -0
- package/dist/steps/execute/manifest.yaml +28 -0
- package/dist/steps/plan/01-load-context.md +22 -0
- package/dist/steps/plan/02-anchor-confirm.md +1 -0
- package/dist/steps/plan/03-expand-tasks.md +33 -0
- package/dist/steps/plan/04-mark-order.md +15 -0
- package/dist/steps/plan/05-e2e-planning.md +17 -0
- package/dist/steps/plan/06-self-check.md +16 -0
- package/dist/steps/plan/07-save.md +1 -0
- package/dist/steps/plan/manifest.yaml +18 -0
- package/dist/steps/scan/01-env-detect.md +51 -0
- package/dist/steps/scan/02-tech-stack.md +16 -0
- package/dist/steps/scan/03-conventions.md +16 -0
- package/dist/steps/scan/04-structure.md +19 -0
- package/dist/steps/scan/05-quality.md +18 -0
- package/dist/steps/scan/06-complete.md +49 -0
- package/dist/steps/scan/manifest.yaml +16 -0
- package/dist/steps/verify/01-load-specs.md +28 -0
- package/dist/steps/verify/02-check-tasks.md +1 -0
- package/dist/steps/verify/03-check-design.md +6 -0
- package/dist/steps/verify/04-run-tests.md +7 -0
- package/dist/steps/verify/05-e2e-tests.md +27 -0
- package/dist/steps/verify/05b-e2e-fix.md +33 -0
- package/dist/steps/verify/06-code-quality.md +25 -0
- package/dist/steps/verify/07-lint-check.md +27 -0
- package/dist/steps/verify/08-output-report.md +14 -0
- package/dist/steps/verify/manifest.yaml +22 -0
- package/package.json +3 -3
- package/src/index.js +10 -0
- package/src/step.js +543 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
**当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
|
|
2
|
+
|
|
3
|
+
你现在是 SillySpec 代码库扫描器(编排器)。**你不读源码,只编排子代理或串行执行。**
|
|
4
|
+
|
|
5
|
+
## 绝对规则
|
|
6
|
+
- ❌ 修改代码 / 编造路径 / 主代理读源码全文
|
|
7
|
+
- ✅ 交互模式每步等用户 / 文档只写 `.sillyspec/docs/<project>/scan/`
|
|
8
|
+
|
|
9
|
+
## 参数处理
|
|
10
|
+
- 空白 → 交互式引导(逐步询问)
|
|
11
|
+
- `--deep` → 直接深度扫描
|
|
12
|
+
- 其他 → 快速扫描该区域
|
|
13
|
+
|
|
14
|
+
## 交互式引导(参数为空时)
|
|
15
|
+
|
|
16
|
+
### 检查工作区 & 已有文档
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
ls .sillyspec/projects/*.yaml 2>/dev/null | grep -q . # 有子项目配置 → 工作区模式
|
|
20
|
+
ls .sillyspec/docs/<project>/scan/ 2>/dev/null # 检查已有文档
|
|
21
|
+
wc -l .sillyspec/docs/<project>/scan/*.md 2>/dev/null
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- 已有 3 份 → 建议升级深度扫描
|
|
25
|
+
- 已有 7 份 → 建议刷新或跳过
|
|
26
|
+
- 工作区 → 逐个扫描 / 选子项目 / 退出
|
|
27
|
+
|
|
28
|
+
### 选择扫描模式、范围、排除目录、确认
|
|
29
|
+
按原流程交互,确认后进入扫描。
|
|
30
|
+
|
|
31
|
+
## 构建环境探测(主代理执行)
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
cat package.json pom.xml build.gradle go.mod Cargo.toml requirements.txt pyproject.toml Gemfile composer.json 2>/dev/null
|
|
35
|
+
find . -maxdepth 2 -name "*.config.*" -not -path "*/node_modules/*" -not -path "*/.git/*" | head -20 | xargs cat 2>/dev/null
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
结果保存到 `.sillyspec/docs/<project>/scan/_env-detect.md`(临时文件,扫描完删除)。
|
|
39
|
+
|
|
40
|
+
## 断点续扫
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
for f in ARCHITECTURE STRUCTURE CONVENTIONS INTEGRATIONS TESTING CONCERNS PROJECT; do
|
|
44
|
+
[ -f ".sillyspec/docs/<project>/scan/${f}.md" ] && echo "✅ ${f}.md" || echo "⬜ ${f}.md"
|
|
45
|
+
done
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
只生成缺失的文档。
|
|
49
|
+
|
|
50
|
+
## 子代理可用性检测
|
|
51
|
+
检查是否有 Task/Spawn 工具。有 → 子代理模式,无 → 串行模式。
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
扫描技术栈 + 数据库 Schema + 架构模式,生成 `ARCHITECTURE.md`。
|
|
2
|
+
|
|
3
|
+
参考 `.sillyspec/docs/<project>/scan/_env-detect.md`。
|
|
4
|
+
|
|
5
|
+
用 grep/rg 搜索(`@Entity`、`schema.prisma`、`models.py` 等),**禁止读源码全文**。
|
|
6
|
+
|
|
7
|
+
Schema 只记表名+说明+字段数。
|
|
8
|
+
|
|
9
|
+
输出文件必须包含以下章节:
|
|
10
|
+
- `## 技术栈`
|
|
11
|
+
- `## 架构概览`
|
|
12
|
+
- `## 数据模型(摘要)`
|
|
13
|
+
|
|
14
|
+
路径用反引号,不编造。保存到 `.sillyspec/docs/<project>/scan/ARCHITECTURE.md`。
|
|
15
|
+
|
|
16
|
+
完成后立即写文件,下一个 area 开始前清除源码上下文。
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
扫描框架隐形规则 + 实体继承 + 代码风格,生成 `CONVENTIONS.md`。
|
|
2
|
+
|
|
3
|
+
参考 `.sillyspec/docs/<project>/scan/_env-detect.md`。
|
|
4
|
+
|
|
5
|
+
用 grep 搜索拦截器/插件/逻辑删除/基类/审计字段,**禁止读源码全文**。
|
|
6
|
+
|
|
7
|
+
根据检测到的语言/框架自行决定搜索什么模式,提取 3-5 个典型示例。
|
|
8
|
+
|
|
9
|
+
输出文件必须包含以下章节:
|
|
10
|
+
- `## 框架隐形规则`
|
|
11
|
+
- `## 实体继承规范`
|
|
12
|
+
- `## 代码风格`
|
|
13
|
+
|
|
14
|
+
路径用反引号,不编造。保存到 `.sillyspec/docs/<project>/scan/CONVENTIONS.md`。
|
|
15
|
+
|
|
16
|
+
完成后立即写文件,下一个 area 开始前清除源码上下文。
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
扫描目录结构 + 外部集成,生成 `STRUCTURE.md` 和 `INTEGRATIONS.md`。
|
|
2
|
+
|
|
3
|
+
参考 `.sillyspec/docs/<project>/scan/_env-detect.md`。
|
|
4
|
+
|
|
5
|
+
用 find/ls/tree 和 grep,**禁止读源码全文**。
|
|
6
|
+
|
|
7
|
+
搜索 API 调用、MQ 配置、缓存、第三方 SDK。
|
|
8
|
+
|
|
9
|
+
**STRUCTURE.md** 必须包含:
|
|
10
|
+
- 目录树(用 tree 或 find 生成)
|
|
11
|
+
- 模块说明
|
|
12
|
+
|
|
13
|
+
**INTEGRATIONS.md** 按类型分组(数据库、缓存、MQ、第三方 API 等)。
|
|
14
|
+
|
|
15
|
+
路径用反引号,不编造。分别保存到:
|
|
16
|
+
- `.sillyspec/docs/<project>/scan/STRUCTURE.md`
|
|
17
|
+
- `.sillyspec/docs/<project>/scan/INTEGRATIONS.md`
|
|
18
|
+
|
|
19
|
+
完成后立即写文件,下一个 area 开始前清除源码上下文。
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
扫描测试现状 + 技术债务 + 项目概览,生成 `TESTING.md`、`CONCERNS.md`、`PROJECT.md`。
|
|
2
|
+
|
|
3
|
+
参考 `.sillyspec/docs/<project>/scan/_env-detect.md`。
|
|
4
|
+
|
|
5
|
+
用 grep 搜索测试文件、TODO/FIXME、过时依赖,**禁止读源码全文**。
|
|
6
|
+
|
|
7
|
+
**TESTING.md** 必须包含测试结构(框架、目录、覆盖情况)。
|
|
8
|
+
|
|
9
|
+
**CONCERNS.md** 按严重程度分组(🔴 必须 / 🟡 建议 / 🔵 优化)。
|
|
10
|
+
|
|
11
|
+
**PROJECT.md** 包含项目基本信息。
|
|
12
|
+
|
|
13
|
+
路径用反引号,不编造。分别保存到:
|
|
14
|
+
- `.sillyspec/docs/<project>/scan/TESTING.md`
|
|
15
|
+
- `.sillyspec/docs/<project>/scan/CONCERNS.md`
|
|
16
|
+
- `.sillyspec/docs/<project>/scan/PROJECT.md`
|
|
17
|
+
|
|
18
|
+
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
## 扫描完成
|
|
2
|
+
|
|
3
|
+
```bash
|
|
4
|
+
# 路径校验
|
|
5
|
+
for f in ARCHITECTURE STRUCTURE CONVENTIONS INTEGRATIONS TESTING CONCERNS PROJECT; do
|
|
6
|
+
[ -f ".sillyspec/docs/<project>/scan/${f}.md" ] && echo "✅ ${f}.md"
|
|
7
|
+
done
|
|
8
|
+
|
|
9
|
+
# 生成知识库骨架
|
|
10
|
+
mkdir -p .sillyspec/knowledge
|
|
11
|
+
if [ ! -f ".sillyspec/knowledge/INDEX.md" ]; then
|
|
12
|
+
cat > .sillyspec/knowledge/INDEX.md << 'EOF'
|
|
13
|
+
# Knowledge Index
|
|
14
|
+
|
|
15
|
+
> 子代理任务开始前查询此文件,按关键词匹配,只读命中的知识文件。
|
|
16
|
+
> execute/quick 执行中发现的坑自动追加到 uncategorized.md,经用户确认后归类到对应文件。
|
|
17
|
+
|
|
18
|
+
<!-- 格式:关键词1|关键词2|关键词3 → 文件路径 -->
|
|
19
|
+
EOF
|
|
20
|
+
fi
|
|
21
|
+
if [ ! -f ".sillyspec/knowledge/uncategorized.md" ]; then
|
|
22
|
+
cat > .sillyspec/knowledge/uncategorized.md << 'EOF'
|
|
23
|
+
# 未分类知识
|
|
24
|
+
|
|
25
|
+
> execute/quick 执行中发现的坑暂存于此,用户审阅后归类到对应文件并更新 INDEX.md。
|
|
26
|
+
EOF
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
# 记录状态
|
|
30
|
+
cat > .sillyspec/STATE.md << 'EOF'
|
|
31
|
+
# 项目状态
|
|
32
|
+
|
|
33
|
+
## 最近活动
|
|
34
|
+
- $(date '+%Y-%m-%d %H:%M:%S') scan 完成
|
|
35
|
+
EOF
|
|
36
|
+
|
|
37
|
+
# 清理
|
|
38
|
+
rm -f .sillyspec/docs/<project>/scan/_env-detect.md
|
|
39
|
+
git add .sillyspec/
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 自检门控
|
|
43
|
+
- [ ] ARCHITECTURE.md:技术栈 + Schema 摘要?
|
|
44
|
+
- [ ] CONVENTIONS.md:隐形规则 + 代码风格?
|
|
45
|
+
- [ ] STRUCTURE.md:目录结构?
|
|
46
|
+
- [ ] INTEGRATIONS.md:外部依赖?
|
|
47
|
+
- [ ] TESTING.md:测试现状?
|
|
48
|
+
- [ ] CONCERNS.md:技术债务?
|
|
49
|
+
- [ ] PROJECT.md:项目概览?
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
phase: scan
|
|
2
|
+
description: 项目代码库扫描
|
|
3
|
+
requires: []
|
|
4
|
+
steps:
|
|
5
|
+
- file: 01-env-detect.md
|
|
6
|
+
name: 环境探测
|
|
7
|
+
- file: 02-tech-stack.md
|
|
8
|
+
name: 技术栈识别
|
|
9
|
+
- file: 03-conventions.md
|
|
10
|
+
name: 代码风格提取
|
|
11
|
+
- file: 04-structure.md
|
|
12
|
+
name: 项目结构分析
|
|
13
|
+
- file: 05-quality.md
|
|
14
|
+
name: 质量评估
|
|
15
|
+
- file: 06-complete.md
|
|
16
|
+
name: 扫描完成
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
**当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
|
|
2
|
+
|
|
3
|
+
## 核心约束(必须遵守)
|
|
4
|
+
- ❌ 修改任何代码(只做检查和报告)
|
|
5
|
+
- ❌ 自行推进到下一阶段
|
|
6
|
+
|
|
7
|
+
## 加载规范
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# 确定变更目录
|
|
11
|
+
if [ -n "$ARGUMENTS" ]; then
|
|
12
|
+
CHANGE_DIR=".sillyspec/changes/$ARGUMENTS"
|
|
13
|
+
else
|
|
14
|
+
CHANGE_DIR=$(ls -d .sillyspec/changes/*/ 2>/dev/null | grep -v archive | tail -1)
|
|
15
|
+
fi
|
|
16
|
+
cat "$CHANGE_DIR"/{design,tasks}.md 2>/dev/null
|
|
17
|
+
cat .sillyspec/local.yaml 2>/dev/null
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
锚定确认实际存在的文件。
|
|
21
|
+
|
|
22
|
+
## 工作区模式处理
|
|
23
|
+
|
|
24
|
+
如果 `.sillyspec/projects/` 目录下有 yaml 文件:
|
|
25
|
+
1. 检查工作区根目录 `.sillyspec/changes/` 下的未归档变更
|
|
26
|
+
2. 检查每个子项目 `<子项目路径>/.sillyspec/changes/` 下的未归档变更
|
|
27
|
+
3. 列出所有未归档变更,让用户选择要验证哪个
|
|
28
|
+
4. 根据 $ARGUMENTS 或用户选择,cd 到对应目录执行验证
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
逐项检查 tasks.md,对每个 checkbox 报告:✅ 已完成 / ❌ 未完成 / ⚠️ 部分完成
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
检测项目中是否有 E2E 测试或测试步骤文件:
|
|
2
|
+
```bash
|
|
3
|
+
ls tests/e2e/ e2e/ cypress/e2e/ 2>/dev/null | head -5
|
|
4
|
+
cat .sillyspec/changes/*/e2e-steps.md 2>/dev/null | head -5
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
**无任何测试** → 跳过此步骤。
|
|
8
|
+
|
|
9
|
+
**有测试** → 确认修复策略(AskUserQuestion):
|
|
10
|
+
1. 自动修复,同一用例最多 5 次(超过停止,提示人工介入)
|
|
11
|
+
2. 一直修复直到全绿
|
|
12
|
+
3. 只报告,不自动修复
|
|
13
|
+
|
|
14
|
+
**按优先级执行:**
|
|
15
|
+
|
|
16
|
+
**优先级 1:专业 E2E 框架(Playwright/Cypress)**
|
|
17
|
+
```bash
|
|
18
|
+
npx playwright test 2>/dev/null || npx cypress run 2>/dev/null
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**优先级 2:通用测试框架(jest/vitest)**
|
|
22
|
+
```bash
|
|
23
|
+
npx vitest run 2>/dev/null || npx jest 2>/dev/null
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**优先级 3:浏览器 MCP + e2e-steps.md(兜底)**
|
|
27
|
+
读取 `.sillyspec/changes/<变更名>/e2e-steps.md`,按步骤逐条执行。每条标注 ✅/❌。
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
**自动修复循环(选了策略 1 或 2 时):**
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
ROUND = 1
|
|
5
|
+
MAX_ROUNDS = 策略1时为5,策略2时为50
|
|
6
|
+
|
|
7
|
+
while ROUND <= MAX_ROUNDS:
|
|
8
|
+
1. 运行失败测试,捕获完整输出
|
|
9
|
+
2. 全部通过 → 跳出循环,标记 ✅
|
|
10
|
+
3. 对每个失败测试:
|
|
11
|
+
a. fixAttempts >= MAX_ROUNDS → 跳过,标记 ❌ MAX_REACHED
|
|
12
|
+
b. 否则 → 调用修复工具,prompt 必须包含失败测试路径、测试名、完整错误信息、相关源文件路径
|
|
13
|
+
c. 修复后重跑确认
|
|
14
|
+
d. 通过 → fixAttempts 不变;仍失败 → fixAttempts + 1
|
|
15
|
+
4. 写入 .sillyspec/local.yaml
|
|
16
|
+
5. ROUND++
|
|
17
|
+
6. 本轮无任何修复 → 跳出循环
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**禁止行为:**
|
|
21
|
+
- ❌ 只看错误摘要就修复(必须看完整输出)
|
|
22
|
+
- ❌ 跳过 fixAttempts 计数
|
|
23
|
+
- ❌ 一次修复多个不相关的失败(逐个修复,每次修复后重跑确认)
|
|
24
|
+
- ❌ 直接修改代码(verify 阶段禁止改代码)
|
|
25
|
+
|
|
26
|
+
**更新测试结果到 `.sillyspec/local.yaml`:**
|
|
27
|
+
```yaml
|
|
28
|
+
e2e:
|
|
29
|
+
{变更名}:
|
|
30
|
+
{测试文件名}:
|
|
31
|
+
status: passed/failed
|
|
32
|
+
fixAttempts: 0
|
|
33
|
+
```
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
代码质量扫描:
|
|
2
|
+
|
|
3
|
+
```bash
|
|
4
|
+
grep -r "TODO\|FIXME\|HACK\|XXX" src/ lib/ app/ --include="*.ts" --include="*.tsx" --include="*.py" --include="*.js" 2>/dev/null | head -20
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
审查 design.md「文件变更」中列出的文件:
|
|
8
|
+
- 安全问题(输入校验、SQL拼接、硬编码敏感信息)
|
|
9
|
+
- 潜在 bug(空值、边界条件)
|
|
10
|
+
- 与 `.sillyspec/docs/<project>/scan/CONVENTIONS.md` 一致性
|
|
11
|
+
|
|
12
|
+
每个问题标 🔴必须 / 🟡建议 / 🔵优化。
|
|
13
|
+
|
|
14
|
+
## MCP 基础设施验证
|
|
15
|
+
|
|
16
|
+
检查当前可用工具列表中是否存在以下 MCP 工具:
|
|
17
|
+
- 数据库相关工具(postgres/sqlite/mysql/redis)
|
|
18
|
+
- 浏览器相关工具(browser/chrome/puppeteer/playwright/devtools)
|
|
19
|
+
- 搜索相关工具(search/web_search)
|
|
20
|
+
|
|
21
|
+
**数据库 MCP:** 对照 design.md 验证表/集合、字段类型、约束。⚠️ 只执行 SELECT 查询。
|
|
22
|
+
|
|
23
|
+
**浏览器 MCP:** 验证页面加载、UI 元素、基础交互。
|
|
24
|
+
|
|
25
|
+
**无 MCP → 跳过此部分。**
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
Lint / Format 检查:
|
|
2
|
+
|
|
3
|
+
```bash
|
|
4
|
+
# ESLint
|
|
5
|
+
if [ -f .eslintrc -o -f .eslintrc.js -o -f .eslintrc.cjs -o -f .eslintrc.json -o -f .eslintrc.yml ] || grep -q '"eslint"' package.json 2>/dev/null; then
|
|
6
|
+
npx eslint . --max-warnings 0 2>&1 | tail -50
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
# Prettier(检查而非修复)
|
|
10
|
+
if [ -f .prettierrc -o -f .prettierrc.js -o -f .prettierrc.json -o -f .prettierrc.yml ] || grep -q '"prettier"' package.json 2>/dev/null; then
|
|
11
|
+
npx prettier --check . 2>&1 | tail -30
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
# TypeScript 类型检查
|
|
15
|
+
if [ -f tsconfig.json ]; then
|
|
16
|
+
npx tsc --noEmit 2>&1 | tail -30
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
# Stylelint
|
|
20
|
+
if [ -f .stylelintrc -o -f .stylelintrc.js -o -f .stylelintrc.json ] || grep -q '"stylelint"' package.json 2>/dev/null; then
|
|
21
|
+
npx stylelint "**/*.{css,scss,less}" 2>&1 | tail -30
|
|
22
|
+
fi
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**处理策略(AskUserQuestion):**
|
|
26
|
+
1. **自动修复** — 对支持 `--fix` 的工具自动修复后重跑,同一问题最多修复 3 次
|
|
27
|
+
2. **只报告** — 仅列出所有 lint 错误,不修改代码
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
输出验证报告:
|
|
2
|
+
|
|
3
|
+
```markdown
|
|
4
|
+
# SillySpec 验证报告
|
|
5
|
+
## 任务完成度:X/Y
|
|
6
|
+
## 设计一致性
|
|
7
|
+
## 测试结果:passed N, failed N
|
|
8
|
+
## 技术债务标记
|
|
9
|
+
## 代码审查:🔴 N / 🟡 N / 🔵 N
|
|
10
|
+
## Lint 检查:ESLint ✅/❌ | Prettier ✅/❌ | TypeScript ✅/❌ | Stylelint ✅/❌
|
|
11
|
+
## MCP 基础设施验证:数据库 ✅/❌/跳过 | 页面 ✅/❌/跳过 | API ✅/❌/跳过
|
|
12
|
+
## E2E 测试:passed N / failed N / fixAttempts 详情
|
|
13
|
+
## 结论:✅ PASS / ⚠️ PASS WITH NOTES / ❌ FAIL
|
|
14
|
+
```
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
phase: verify
|
|
2
|
+
description: 验证与检查
|
|
3
|
+
requires: [execute]
|
|
4
|
+
steps:
|
|
5
|
+
- file: 01-load-specs.md
|
|
6
|
+
name: 加载规范
|
|
7
|
+
- file: 02-check-tasks.md
|
|
8
|
+
name: 检查任务完成度
|
|
9
|
+
- file: 03-check-design.md
|
|
10
|
+
name: 对照设计文档
|
|
11
|
+
- file: 04-run-tests.md
|
|
12
|
+
name: 运行单元测试
|
|
13
|
+
- file: 05-e2e-tests.md
|
|
14
|
+
name: E2E 测试
|
|
15
|
+
- file: 05b-e2e-fix.md
|
|
16
|
+
name: E2E 自动修复
|
|
17
|
+
- file: 06-code-quality.md
|
|
18
|
+
name: 代码质量扫描
|
|
19
|
+
- file: 07-lint-check.md
|
|
20
|
+
name: Lint 检查
|
|
21
|
+
- file: 08-output-report.md
|
|
22
|
+
name: 输出验证报告
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sillyspec",
|
|
3
|
-
"version": "3.
|
|
4
|
-
"description": "SillySpec CLI
|
|
3
|
+
"version": "3.9.0",
|
|
4
|
+
"description": "SillySpec CLI — 流程状态机,让 AI 严格按步骤来",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"sillyspec": "./bin/sillyspec.js"
|
|
@@ -33,4 +33,4 @@
|
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"vitepress": "^1.6.4"
|
|
35
35
|
}
|
|
36
|
-
}
|
|
36
|
+
}
|
package/src/index.js
CHANGED
|
@@ -24,6 +24,10 @@ SillySpec CLI — 规范驱动开发工具包
|
|
|
24
24
|
[--dir <path>] 指定目录
|
|
25
25
|
sillyspec setup [--list] 安装推荐 MCP 工具
|
|
26
26
|
[--list] 查看已安装状态
|
|
27
|
+
sillyspec step <phase> 步骤调度器
|
|
28
|
+
[--next] [--status] [--list] [--jump <n>]
|
|
29
|
+
[--sessions] [--clean]
|
|
30
|
+
[--session <id>] [--json]
|
|
27
31
|
sillyspec dashboard 启动 Dashboard Web UI
|
|
28
32
|
[--port <number>] 指定端口(默认 3456)
|
|
29
33
|
[--no-open] 不自动打开浏览器
|
|
@@ -100,6 +104,12 @@ async function main() {
|
|
|
100
104
|
const setupList = filteredArgs.includes('--list') || filteredArgs.includes('-l');
|
|
101
105
|
await (await import('./setup.js')).cmdSetup(dir, { json, list: setupList });
|
|
102
106
|
break;
|
|
107
|
+
case 'step': {
|
|
108
|
+
const stepArgs = filteredArgs.slice(1);
|
|
109
|
+
if (json) stepArgs.push('--json');
|
|
110
|
+
await (await import('./step.js')).cmdStep(dir, stepArgs);
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
103
113
|
case 'progress':
|
|
104
114
|
console.log('⚠️ 阶段控制功能已移除,各阶段独立运行。');
|
|
105
115
|
break;
|