sillyspec 3.26.10 → 3.26.13
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-archive/SKILL.md +85 -85
- package/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -114
- package/.claude/skills/sillyspec-commit/SKILL.md +109 -109
- package/.claude/skills/sillyspec-continue/SKILL.md +45 -45
- package/.claude/skills/sillyspec-doctor/SKILL.md +76 -76
- package/.claude/skills/sillyspec-execute/SKILL.md +200 -200
- package/.claude/skills/sillyspec-explore/SKILL.md +95 -95
- package/.claude/skills/sillyspec-knowledge/SKILL.md +269 -269
- package/.claude/skills/sillyspec-plan/SKILL.md +148 -148
- package/.claude/skills/sillyspec-quick/SKILL.md +115 -111
- package/.claude/skills/sillyspec-resume/SKILL.md +68 -68
- package/.claude/skills/sillyspec-scan/SKILL.md +79 -79
- package/.claude/skills/sillyspec-state/SKILL.md +64 -64
- package/.claude/skills/sillyspec-status/SKILL.md +54 -54
- package/.claude/skills/sillyspec-verify/SKILL.md +83 -83
- package/.claude/skills/sillyspec-workspace/SKILL.md +169 -169
- package/.gitattributes +2 -0
- package/.husky/pre-push +20 -20
- package/README.md +203 -201
- package/SKILL.md +91 -90
- package/package.json +39 -39
- package/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -7446
- package/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -1
- package/packages/dashboard/dist/index.html +16 -16
- package/packages/dashboard/package.json +25 -25
- package/packages/dashboard/server/executor.js +95 -86
- package/packages/dashboard/server/index.js +663 -601
- package/packages/dashboard/server/parser.js +526 -526
- package/src/change-risk-profile.js +254 -254
- package/src/classify-change.js +109 -109
- package/src/config-schema.js +313 -310
- package/src/contract-matrix.js +388 -379
- package/src/db.js +370 -350
- package/src/dispatch/backends/local-agent.js +155 -155
- package/src/dispatch/backends/sillyhub-mcp.js +245 -245
- package/src/dispatch/probe.js +246 -210
- package/src/dispatch/strategy.js +121 -121
- package/src/docs-check.js +188 -16
- package/src/docs-debt.js +6 -2
- package/src/docs-gate.js +1 -0
- package/src/doctor-diagnostics.js +898 -711
- package/src/endpoint-extractor.js +401 -401
- package/src/fs-atomic.js +71 -69
- package/src/git-helper.js +82 -79
- package/src/hooks/claude-pre-tool-use.cjs +125 -125
- package/src/hooks/worktree-guard.js +854 -848
- package/src/index.js +251 -20
- package/src/init.js +624 -623
- package/src/knowledge-match.js +130 -130
- package/src/local-detect.js +128 -120
- package/src/machine-interface.js +543 -543
- package/src/migrate.js +127 -127
- package/src/modules.js +7 -5
- package/src/progress/change-registry.js +297 -260
- package/src/progress/consistency-doctor.js +355 -355
- package/src/progress/shared.js +36 -36
- package/src/progress/stage-machine.js +589 -550
- package/src/progress/step-store.js +261 -261
- package/src/progress.js +1285 -1127
- package/src/quicklog.js +724 -693
- package/src/review-tier.js +77 -77
- package/src/run/command.js +1408 -1364
- package/src/run/complete-handlers.js +1450 -1399
- package/src/run/complete.js +1181 -920
- package/src/run/gates.js +878 -755
- package/src/run/prompt.js +765 -761
- package/src/run/quick-audit.js +155 -146
- package/src/run/shared.js +1348 -1215
- package/src/run/stage.js +527 -479
- package/src/scan-postcheck.js +371 -371
- package/src/setup.js +414 -416
- package/src/sillyhub-mcp/client.js +597 -529
- package/src/spec-dir-typo.js +3 -24
- package/src/spec-sync.js +358 -319
- package/src/stage-contract.js +871 -897
- package/src/stage-review.js +549 -549
- package/src/stages/archive.js +156 -155
- package/src/stages/brainstorm-auto.js +236 -236
- package/src/stages/brainstorm.js +597 -597
- package/src/stages/cmd-existence.js +145 -145
- package/src/stages/doctor.js +386 -371
- package/src/stages/execute.js +1014 -1003
- package/src/stages/explore.js +34 -34
- package/src/stages/index.js +29 -29
- package/src/stages/knowledge.js +498 -498
- package/src/stages/plan-postcheck.js +1323 -1302
- package/src/stages/plan.js +642 -623
- package/src/stages/quick.js +153 -151
- package/src/stages/scan.js +607 -607
- package/src/stages/status.js +64 -64
- package/src/stages/verify.js +264 -264
- package/src/sync.js +1325 -1135
- package/src/task-review.js +1204 -1019
- package/src/taskcard.js +178 -0
- package/src/verify-postcheck.js +1199 -1186
- package/src/workflow.js +600 -600
- package/src/worktree-apply.js +1237 -1136
- package/src/worktree-deps.js +453 -353
- package/src/worktree.js +1527 -1481
- package/templates/workflows/archive-impact.yaml +79 -79
- package/templates/workflows/scan-docs.yaml +132 -132
|
@@ -1,83 +1,83 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sillyspec:verify
|
|
3
|
-
description: 用于验证代码实现是否符合 design 和模块文档。适合用户说"验证下、检查下、跑 verify"。对照 design.md + 模块文档检查任务完成度、设计一致性、运行测试。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
## 何时使用
|
|
7
|
-
|
|
8
|
-
- 用户说"验证下、检查下、跑 verify"
|
|
9
|
-
- 对照 design.md + 模块文档检查任务完成度
|
|
10
|
-
- 设计一致性检查 + 运行测试套件
|
|
11
|
-
- 产出 `verify-result.md`(PASS / PASS WITH NOTES / FAIL)
|
|
12
|
-
|
|
13
|
-
## 多变更说明
|
|
14
|
-
|
|
15
|
-
项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录)时,所有 `sillyspec run` 命令需加 `--change <变更名>` 指定操作目标;只有一个变更时可省略(CLI 自动检测)。
|
|
16
|
-
|
|
17
|
-
## 步骤生命周期(所有阶段通用)
|
|
18
|
-
|
|
19
|
-
> `sillyspec verify` 是 `sillyspec run verify` 的顶层别名,两者等价。
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
sillyspec run verify # 输出当前步骤 prompt
|
|
23
|
-
sillyspec run verify --done --output "摘要" # 完成当前步骤(--input "用户原话" 记录输入)
|
|
24
|
-
sillyspec run verify --status # 查看阶段进度
|
|
25
|
-
sillyspec run verify --skip # 跳过可选步骤
|
|
26
|
-
sillyspec run verify --reset # 重置阶段(从头开始)
|
|
27
|
-
sillyspec run verify --reopen --from-step N # 重新打开已完成阶段修订(N=序号或名称)
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## 通用参数(所有阶段适用)
|
|
31
|
-
|
|
32
|
-
| 参数 | 说明 |
|
|
33
|
-
|---|---|
|
|
34
|
-
| `--change <名>` | 指定变更名(多活跃变更必填,单变更可省略自动检测) |
|
|
35
|
-
| `--spec-dir <path>` | 指定规范目录(默认 `<项目>/.sillyspec`) |
|
|
36
|
-
| `--non-interactive` | CI/脚本下禁用交互式 prompt |
|
|
37
|
-
| `--skip-approval` | 跳过阶段转换/审批检查(不能跳产物校验 gate——review.json/文档产物硬校验仍在) |
|
|
38
|
-
|
|
39
|
-
## verify 特有:完成门控(重要)
|
|
40
|
-
|
|
41
|
-
verify 是只读阶段(**禁止改代码/改 git 状态**,只检查 + 写报告)。
|
|
42
|
-
|
|
43
|
-
**diff 对账基点**:本变更走 worktree 时,「加载规范并锚定」步骤会注入 worktree 基线锚点(分支名 + `git merge-base` 真实基点)——对照设计做 diff 对账时以它为基点,**不要拿主仓当前 HEAD 当基点**(主仓在 execute 期间可能被并行推进,用错基点会把别人的演进误判为本变更越权改动)。task review 的 base/head 引用分支上的 commit,逐 task 核验用 `git diff <base>..<head>`。完成时有硬校验:
|
|
44
|
-
|
|
45
|
-
- **必须产出 `verify-result.md`**——不存在则阻断完成(不能跳过报告直接 `--done`)
|
|
46
|
-
- **结论为 `FAIL` 则阻断完成**——不能带着 FAIL 标记 verify 完成
|
|
47
|
-
- **`integration-critical` / `deployment-critical` 变更**(design/plan 含 daemon/session/lease/lifecycle 等关键词):结论 PASS WITH NOTES 降级为 FAIL,必须有真实集成证据(Runtime Evidence section)——该证据为 Agent 自报告,CLI 仅校验其字面存在、不独立运行时核验,须真实执行过
|
|
48
|
-
- `verify-required-evidence.json`(execute 写入,schema `{items:[{task,verdict,evidence:[]}]}`)中 cannot_verify 任务未在 verify-result.md 体现 → **advisory warn(不阻断归档)**;evidence 是否真满足(satisfied/missing/partial)由 agent 在 verify-result.md 自报告,CLI 只查任务被提及、不替你语义判定。结论能否 PASS 由你诚实判定(有 missing evidence 不应 PASS)。
|
|
49
|
-
|
|
50
|
-
被阻断时 CLI 打印 ❌ 校验失败,不会提示"验证通过"。修复 `verify-result.md` 后重新 `--done`。
|
|
51
|
-
|
|
52
|
-
## verify-result.md 格式
|
|
53
|
-
|
|
54
|
-
```markdown
|
|
55
|
-
# 验证报告
|
|
56
|
-
## 结论
|
|
57
|
-
PASS / PASS WITH NOTES / FAIL ← 必须有结论章节(标题含"结论/Conclusion/Result/结果"即可,不限于确切"## 结论"),FAIL 会阻断 verify 完成
|
|
58
|
-
## 任务完成度
|
|
59
|
-
## 设计一致性
|
|
60
|
-
## 探针结果
|
|
61
|
-
## 测试结果
|
|
62
|
-
## 变更风险等级
|
|
63
|
-
## Runtime Evidence(integration/deployment-critical 必填;自报告,CLI 仅字面校验、不独立核验)
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## 阶段流转
|
|
67
|
-
|
|
68
|
-
```
|
|
69
|
-
execute → verify → archive
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
verify 通过(PASS)后,运行 `sillyspec run archive --change <变更名>` 归档。FAIL 则修复后重跑 `sillyspec run verify`。
|
|
73
|
-
|
|
74
|
-
## 铁律
|
|
75
|
-
|
|
76
|
-
- **必须用 exec 工具(shell)执行 CLI,不要自己编造流程**
|
|
77
|
-
- verify 阶段**绝对禁止** git checkout/restore/reset、删除/覆盖源码文件——只检查 + 报告
|
|
78
|
-
- 发现问题只报告,不尝试修复(修复回 execute)
|
|
79
|
-
- `verify-result.md` 结论必须基于证据,不写"看起来没问题"
|
|
80
|
-
- 完成后立即 `--done`,不跳过
|
|
81
|
-
|
|
82
|
-
## 用户指令
|
|
83
|
-
$ARGUMENTS
|
|
1
|
+
---
|
|
2
|
+
name: sillyspec:verify
|
|
3
|
+
description: 用于验证代码实现是否符合 design 和模块文档。适合用户说"验证下、检查下、跑 verify"。对照 design.md + 模块文档检查任务完成度、设计一致性、运行测试。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## 何时使用
|
|
7
|
+
|
|
8
|
+
- 用户说"验证下、检查下、跑 verify"
|
|
9
|
+
- 对照 design.md + 模块文档检查任务完成度
|
|
10
|
+
- 设计一致性检查 + 运行测试套件
|
|
11
|
+
- 产出 `verify-result.md`(PASS / PASS WITH NOTES / FAIL)
|
|
12
|
+
|
|
13
|
+
## 多变更说明
|
|
14
|
+
|
|
15
|
+
项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录)时,所有 `sillyspec run` 命令需加 `--change <变更名>` 指定操作目标;只有一个变更时可省略(CLI 自动检测)。
|
|
16
|
+
|
|
17
|
+
## 步骤生命周期(所有阶段通用)
|
|
18
|
+
|
|
19
|
+
> `sillyspec verify` 是 `sillyspec run verify` 的顶层别名,两者等价。
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
sillyspec run verify # 输出当前步骤 prompt
|
|
23
|
+
sillyspec run verify --done --output "摘要" # 完成当前步骤(--input "用户原话" 记录输入)
|
|
24
|
+
sillyspec run verify --status # 查看阶段进度
|
|
25
|
+
sillyspec run verify --skip # 跳过可选步骤
|
|
26
|
+
sillyspec run verify --reset # 重置阶段(从头开始)
|
|
27
|
+
sillyspec run verify --reopen --from-step N # 重新打开已完成阶段修订(N=序号或名称)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 通用参数(所有阶段适用)
|
|
31
|
+
|
|
32
|
+
| 参数 | 说明 |
|
|
33
|
+
|---|---|
|
|
34
|
+
| `--change <名>` | 指定变更名(多活跃变更必填,单变更可省略自动检测) |
|
|
35
|
+
| `--spec-dir <path>` | 指定规范目录(默认 `<项目>/.sillyspec`) |
|
|
36
|
+
| `--non-interactive` | CI/脚本下禁用交互式 prompt |
|
|
37
|
+
| `--skip-approval` | 跳过阶段转换/审批检查(不能跳产物校验 gate——review.json/文档产物硬校验仍在) |
|
|
38
|
+
|
|
39
|
+
## verify 特有:完成门控(重要)
|
|
40
|
+
|
|
41
|
+
verify 是只读阶段(**禁止改代码/改 git 状态**,只检查 + 写报告)。
|
|
42
|
+
|
|
43
|
+
**diff 对账基点**:本变更走 worktree 时,「加载规范并锚定」步骤会注入 worktree 基线锚点(分支名 + `git merge-base` 真实基点)——对照设计做 diff 对账时以它为基点,**不要拿主仓当前 HEAD 当基点**(主仓在 execute 期间可能被并行推进,用错基点会把别人的演进误判为本变更越权改动)。task review 的 base/head 引用分支上的 commit,逐 task 核验用 `git diff <base>..<head>`。完成时有硬校验:
|
|
44
|
+
|
|
45
|
+
- **必须产出 `verify-result.md`**——不存在则阻断完成(不能跳过报告直接 `--done`)
|
|
46
|
+
- **结论为 `FAIL` 则阻断完成**——不能带着 FAIL 标记 verify 完成
|
|
47
|
+
- **`integration-critical` / `deployment-critical` 变更**(design/plan 含 daemon/session/lease/lifecycle 等关键词):结论 PASS WITH NOTES 降级为 FAIL,必须有真实集成证据(Runtime Evidence section)——该证据为 Agent 自报告,CLI 仅校验其字面存在、不独立运行时核验,须真实执行过
|
|
48
|
+
- `verify-required-evidence.json`(execute 写入,schema `{items:[{task,verdict,evidence:[]}]}`)中 cannot_verify 任务未在 verify-result.md 体现 → **advisory warn(不阻断归档)**;evidence 是否真满足(satisfied/missing/partial)由 agent 在 verify-result.md 自报告,CLI 只查任务被提及、不替你语义判定。结论能否 PASS 由你诚实判定(有 missing evidence 不应 PASS)。
|
|
49
|
+
|
|
50
|
+
被阻断时 CLI 打印 ❌ 校验失败,不会提示"验证通过"。修复 `verify-result.md` 后重新 `--done`。
|
|
51
|
+
|
|
52
|
+
## verify-result.md 格式
|
|
53
|
+
|
|
54
|
+
```markdown
|
|
55
|
+
# 验证报告
|
|
56
|
+
## 结论
|
|
57
|
+
PASS / PASS WITH NOTES / FAIL ← 必须有结论章节(标题含"结论/Conclusion/Result/结果"即可,不限于确切"## 结论"),FAIL 会阻断 verify 完成
|
|
58
|
+
## 任务完成度
|
|
59
|
+
## 设计一致性
|
|
60
|
+
## 探针结果
|
|
61
|
+
## 测试结果
|
|
62
|
+
## 变更风险等级
|
|
63
|
+
## Runtime Evidence(integration/deployment-critical 必填;自报告,CLI 仅字面校验、不独立核验)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## 阶段流转
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
execute → verify → archive
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
verify 通过(PASS)后,运行 `sillyspec run archive --change <变更名>` 归档。FAIL 则修复后重跑 `sillyspec run verify`。
|
|
73
|
+
|
|
74
|
+
## 铁律
|
|
75
|
+
|
|
76
|
+
- **必须用 exec 工具(shell)执行 CLI,不要自己编造流程**
|
|
77
|
+
- verify 阶段**绝对禁止** git checkout/restore/reset、删除/覆盖源码文件——只检查 + 报告
|
|
78
|
+
- 发现问题只报告,不尝试修复(修复回 execute)
|
|
79
|
+
- `verify-result.md` 结论必须基于证据,不写"看起来没问题"
|
|
80
|
+
- 完成后立即 `--done`,不跳过
|
|
81
|
+
|
|
82
|
+
## 用户指令
|
|
83
|
+
$ARGUMENTS
|
|
@@ -1,169 +1,169 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sillyspec:workspace
|
|
3
|
-
description: 工作区管理 — 初始化、管理多项目工作区,查看子项目状态
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
## 交互规范
|
|
7
|
-
|
|
8
|
-
**当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
|
|
9
|
-
|
|
10
|
-
不要用编号列表让用户手动输入数字。
|
|
11
|
-
如果需要自由输入,在 AskUserQuestion 的选项中加入"Other(自定义输入)"。
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## CLI 边界(重要)
|
|
16
|
-
|
|
17
|
-
sillyspec CLI **没有 `workspace` 顶层命令**。本 skill 通过直接读写 `.sillyspec/projects/*.yaml` 管理工作区,配套用 `sillyspec scan` 扫描子项目、`sillyspec init` 安装命令模板。**不要编造 `sillyspec workspace ...` 子命令。**
|
|
18
|
-
|
|
19
|
-
## 相关 CLI 命令
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
sillyspec scan # 扫描子项目生成文档
|
|
23
|
-
sillyspec init [--tool <名>] # 安装命令模板
|
|
24
|
-
sillyspec progress show # 查看进度
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
你现在是 SillySpec 的工作区管理器。
|
|
28
|
-
|
|
29
|
-
## 用户指令
|
|
30
|
-
$ARGUMENTS
|
|
31
|
-
|
|
32
|
-
## 核心流程
|
|
33
|
-
|
|
34
|
-
### Step 1: 检查工作区配置
|
|
35
|
-
|
|
36
|
-
```bash
|
|
37
|
-
ls .sillyspec/projects/*.yaml 2>/dev/null | grep -q .
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
如果不存在 → 这是一个尚未配置工作区的项目。询问用户:
|
|
41
|
-
1. 初始化工作区
|
|
42
|
-
2. 跳过
|
|
43
|
-
|
|
44
|
-
### Step 2: 解析指令
|
|
45
|
-
|
|
46
|
-
根据 `$ARGUMENTS` 或默认行为:
|
|
47
|
-
|
|
48
|
-
- **无参数 / `status`** → 显示工作区状态
|
|
49
|
-
- **`add`** → 添加子项目
|
|
50
|
-
- **`remove`** → 移除子项目
|
|
51
|
-
- **`info`** → 显示某个子项目详情
|
|
52
|
-
- 无参数且 projects/*.yaml 不存在 → 初始化工作区
|
|
53
|
-
|
|
54
|
-
### Step 3: 执行对应操作
|
|
55
|
-
|
|
56
|
-
#### 3a. 初始化工作区(projects/ 不存在时)
|
|
57
|
-
|
|
58
|
-
1. 询问工作区名称(默认用当前目录名)
|
|
59
|
-
2. 逐个添加子项目:
|
|
60
|
-
- 询问子项目名称(如 `frontend`、`backend`)
|
|
61
|
-
- 询问子项目路径(相对于工作区根目录,如 `./frontend`)
|
|
62
|
-
- 询问子项目角色描述(如 `前端 - Vue3 + TypeScript`)
|
|
63
|
-
- 询问仓库地址(可选)
|
|
64
|
-
- 验证路径存在
|
|
65
|
-
添加完后询问:
|
|
66
|
-
> 1. 继续添加子项目
|
|
67
|
-
> 2. 完成,配置共享规范
|
|
68
|
-
3. 询问共享规范文件
|
|
69
|
-
4. 为每个子项目创建 `.sillyspec/projects/<name>.yaml`:
|
|
70
|
-
```yaml
|
|
71
|
-
name: <name>
|
|
72
|
-
path: <relative-path>
|
|
73
|
-
status: active
|
|
74
|
-
```
|
|
75
|
-
> ⚠️ `sillyspec init` 只会写入 `name`、`path`、`status` 三个字段。
|
|
76
|
-
> `role` 和 `repo` 由 `/sillyspec:workspace add` 追加。
|
|
77
|
-
5. 创建 `.sillyspec/shared/` 目录
|
|
78
|
-
|
|
79
|
-
#### 3b. 添加子项目(`add`)
|
|
80
|
-
|
|
81
|
-
1. 询问名称、路径、角色
|
|
82
|
-
2. 验证路径存在
|
|
83
|
-
3. 创建/更新 `.sillyspec/projects/<name>.yaml`
|
|
84
|
-
4. Git 提交
|
|
85
|
-
|
|
86
|
-
#### 3c. 移除子项目(`remove`)
|
|
87
|
-
|
|
88
|
-
1. 显示当前所有子项目列表
|
|
89
|
-
2. 询问要移除哪个:
|
|
90
|
-
> 1. (列出子项目名称)
|
|
91
|
-
> 2. 取消
|
|
92
|
-
3. 删除 `.sillyspec/projects/<name>.yaml`
|
|
93
|
-
4. Git 提交
|
|
94
|
-
|
|
95
|
-
#### 3d. 工作区状态(`status`,默认)
|
|
96
|
-
|
|
97
|
-
读取所有 `projects/*.yaml`,对每个子项目检查:
|
|
98
|
-
|
|
99
|
-
```bash
|
|
100
|
-
# 读取子项目列表
|
|
101
|
-
for f in .sillyspec/projects/*.yaml; do
|
|
102
|
-
[ -f "$f" ] || continue
|
|
103
|
-
proj_name=$(basename "$f" .yaml)
|
|
104
|
-
proj_path=$(grep '^path:' "$f" | head -1 | sed 's/^path:[[:space:]]*//')
|
|
105
|
-
proj_role=$(grep '^role:' "$f" | head -1 | sed 's/^role:[[:space:]]*//')
|
|
106
|
-
# 检查子项目状态
|
|
107
|
-
cd "$proj_path"
|
|
108
|
-
ls .sillyspec/ 2>/dev/null
|
|
109
|
-
cat .sillyspec/PROJECT.md 2>/dev/null
|
|
110
|
-
ls .sillyspec/docs/${proj_name}/scan/ 2>/dev/null | wc -l
|
|
111
|
-
cd -
|
|
112
|
-
done
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
输出格式:
|
|
116
|
-
|
|
117
|
-
```
|
|
118
|
-
🏢 工作区:<workspace-name>
|
|
119
|
-
|
|
120
|
-
📦 子项目(N 个):
|
|
121
|
-
✅ frontend ./frontend 前端 - Vue3 + TypeScript 已扫描(7 份文档)
|
|
122
|
-
⚠️ backend ./backend 后端 - Node.js 已初始化(未扫描)
|
|
123
|
-
❌ miniprogram ./miniprogram 小程序 - Taro 未初始化
|
|
124
|
-
|
|
125
|
-
📄 共享规范:2 份
|
|
126
|
-
- api-contract.md
|
|
127
|
-
- data-models.md
|
|
128
|
-
|
|
129
|
-
💡 操作:
|
|
130
|
-
/sillyspec:workspace add — 添加子项目
|
|
131
|
-
/sillyspec:workspace remove — 移除子项目
|
|
132
|
-
/sillyspec:init — 初始化子项目
|
|
133
|
-
/sillyspec:scan — 扫描子项目
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
#### 3e. 子项目详情(`info <name>`)
|
|
137
|
-
|
|
138
|
-
显示指定子项目的详细信息,包括 PROJECT.md、REQUIREMENTS.md 内容摘要、扫描文档列表。
|
|
139
|
-
|
|
140
|
-
### Step 4: projects/*.yaml 格式
|
|
141
|
-
|
|
142
|
-
每个子项目对应 `.sillyspec/projects/<name>.yaml`:
|
|
143
|
-
|
|
144
|
-
**sillyspec init 创建的格式(3 字段):**
|
|
145
|
-
```yaml
|
|
146
|
-
name: frontend
|
|
147
|
-
path: ./frontend
|
|
148
|
-
status: active
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
**workspace add 扩展的格式(最多 5 字段):**
|
|
152
|
-
```yaml
|
|
153
|
-
name: frontend
|
|
154
|
-
path: ./frontend
|
|
155
|
-
status: active
|
|
156
|
-
role: 前端 - Vue3 + TypeScript
|
|
157
|
-
repo: https://github.com/xxx/frontend.git # 可选
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
### 最后说:
|
|
161
|
-
|
|
162
|
-
> 工作区已更新。
|
|
163
|
-
> 下一步:对子项目运行 `/sillyspec:init` 或 `/sillyspec:scan`。
|
|
164
|
-
|
|
165
|
-
## 绝对规则
|
|
166
|
-
- 不修改子项目目录下的任何文件
|
|
167
|
-
- projects/*.yaml 必须是合法 YAML
|
|
168
|
-
- 子项目路径必须是相对于工作区根目录的相对路径
|
|
169
|
-
- 路径必须验证存在性
|
|
1
|
+
---
|
|
2
|
+
name: sillyspec:workspace
|
|
3
|
+
description: 工作区管理 — 初始化、管理多项目工作区,查看子项目状态
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## 交互规范
|
|
7
|
+
|
|
8
|
+
**当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。**
|
|
9
|
+
|
|
10
|
+
不要用编号列表让用户手动输入数字。
|
|
11
|
+
如果需要自由输入,在 AskUserQuestion 的选项中加入"Other(自定义输入)"。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## CLI 边界(重要)
|
|
16
|
+
|
|
17
|
+
sillyspec CLI **没有 `workspace` 顶层命令**。本 skill 通过直接读写 `.sillyspec/projects/*.yaml` 管理工作区,配套用 `sillyspec scan` 扫描子项目、`sillyspec init` 安装命令模板。**不要编造 `sillyspec workspace ...` 子命令。**
|
|
18
|
+
|
|
19
|
+
## 相关 CLI 命令
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
sillyspec scan # 扫描子项目生成文档
|
|
23
|
+
sillyspec init [--tool <名>] # 安装命令模板
|
|
24
|
+
sillyspec progress show # 查看进度
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
你现在是 SillySpec 的工作区管理器。
|
|
28
|
+
|
|
29
|
+
## 用户指令
|
|
30
|
+
$ARGUMENTS
|
|
31
|
+
|
|
32
|
+
## 核心流程
|
|
33
|
+
|
|
34
|
+
### Step 1: 检查工作区配置
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
ls .sillyspec/projects/*.yaml 2>/dev/null | grep -q .
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
如果不存在 → 这是一个尚未配置工作区的项目。询问用户:
|
|
41
|
+
1. 初始化工作区
|
|
42
|
+
2. 跳过
|
|
43
|
+
|
|
44
|
+
### Step 2: 解析指令
|
|
45
|
+
|
|
46
|
+
根据 `$ARGUMENTS` 或默认行为:
|
|
47
|
+
|
|
48
|
+
- **无参数 / `status`** → 显示工作区状态
|
|
49
|
+
- **`add`** → 添加子项目
|
|
50
|
+
- **`remove`** → 移除子项目
|
|
51
|
+
- **`info`** → 显示某个子项目详情
|
|
52
|
+
- 无参数且 projects/*.yaml 不存在 → 初始化工作区
|
|
53
|
+
|
|
54
|
+
### Step 3: 执行对应操作
|
|
55
|
+
|
|
56
|
+
#### 3a. 初始化工作区(projects/ 不存在时)
|
|
57
|
+
|
|
58
|
+
1. 询问工作区名称(默认用当前目录名)
|
|
59
|
+
2. 逐个添加子项目:
|
|
60
|
+
- 询问子项目名称(如 `frontend`、`backend`)
|
|
61
|
+
- 询问子项目路径(相对于工作区根目录,如 `./frontend`)
|
|
62
|
+
- 询问子项目角色描述(如 `前端 - Vue3 + TypeScript`)
|
|
63
|
+
- 询问仓库地址(可选)
|
|
64
|
+
- 验证路径存在
|
|
65
|
+
添加完后询问:
|
|
66
|
+
> 1. 继续添加子项目
|
|
67
|
+
> 2. 完成,配置共享规范
|
|
68
|
+
3. 询问共享规范文件
|
|
69
|
+
4. 为每个子项目创建 `.sillyspec/projects/<name>.yaml`:
|
|
70
|
+
```yaml
|
|
71
|
+
name: <name>
|
|
72
|
+
path: <relative-path>
|
|
73
|
+
status: active
|
|
74
|
+
```
|
|
75
|
+
> ⚠️ `sillyspec init` 只会写入 `name`、`path`、`status` 三个字段。
|
|
76
|
+
> `role` 和 `repo` 由 `/sillyspec:workspace add` 追加。
|
|
77
|
+
5. 创建 `.sillyspec/shared/` 目录
|
|
78
|
+
|
|
79
|
+
#### 3b. 添加子项目(`add`)
|
|
80
|
+
|
|
81
|
+
1. 询问名称、路径、角色
|
|
82
|
+
2. 验证路径存在
|
|
83
|
+
3. 创建/更新 `.sillyspec/projects/<name>.yaml`
|
|
84
|
+
4. Git 提交
|
|
85
|
+
|
|
86
|
+
#### 3c. 移除子项目(`remove`)
|
|
87
|
+
|
|
88
|
+
1. 显示当前所有子项目列表
|
|
89
|
+
2. 询问要移除哪个:
|
|
90
|
+
> 1. (列出子项目名称)
|
|
91
|
+
> 2. 取消
|
|
92
|
+
3. 删除 `.sillyspec/projects/<name>.yaml`
|
|
93
|
+
4. Git 提交
|
|
94
|
+
|
|
95
|
+
#### 3d. 工作区状态(`status`,默认)
|
|
96
|
+
|
|
97
|
+
读取所有 `projects/*.yaml`,对每个子项目检查:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# 读取子项目列表
|
|
101
|
+
for f in .sillyspec/projects/*.yaml; do
|
|
102
|
+
[ -f "$f" ] || continue
|
|
103
|
+
proj_name=$(basename "$f" .yaml)
|
|
104
|
+
proj_path=$(grep '^path:' "$f" | head -1 | sed 's/^path:[[:space:]]*//')
|
|
105
|
+
proj_role=$(grep '^role:' "$f" | head -1 | sed 's/^role:[[:space:]]*//')
|
|
106
|
+
# 检查子项目状态
|
|
107
|
+
cd "$proj_path"
|
|
108
|
+
ls .sillyspec/ 2>/dev/null
|
|
109
|
+
cat .sillyspec/PROJECT.md 2>/dev/null
|
|
110
|
+
ls .sillyspec/docs/${proj_name}/scan/ 2>/dev/null | wc -l
|
|
111
|
+
cd -
|
|
112
|
+
done
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
输出格式:
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
🏢 工作区:<workspace-name>
|
|
119
|
+
|
|
120
|
+
📦 子项目(N 个):
|
|
121
|
+
✅ frontend ./frontend 前端 - Vue3 + TypeScript 已扫描(7 份文档)
|
|
122
|
+
⚠️ backend ./backend 后端 - Node.js 已初始化(未扫描)
|
|
123
|
+
❌ miniprogram ./miniprogram 小程序 - Taro 未初始化
|
|
124
|
+
|
|
125
|
+
📄 共享规范:2 份
|
|
126
|
+
- api-contract.md
|
|
127
|
+
- data-models.md
|
|
128
|
+
|
|
129
|
+
💡 操作:
|
|
130
|
+
/sillyspec:workspace add — 添加子项目
|
|
131
|
+
/sillyspec:workspace remove — 移除子项目
|
|
132
|
+
/sillyspec:init — 初始化子项目
|
|
133
|
+
/sillyspec:scan — 扫描子项目
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
#### 3e. 子项目详情(`info <name>`)
|
|
137
|
+
|
|
138
|
+
显示指定子项目的详细信息,包括 PROJECT.md、REQUIREMENTS.md 内容摘要、扫描文档列表。
|
|
139
|
+
|
|
140
|
+
### Step 4: projects/*.yaml 格式
|
|
141
|
+
|
|
142
|
+
每个子项目对应 `.sillyspec/projects/<name>.yaml`:
|
|
143
|
+
|
|
144
|
+
**sillyspec init 创建的格式(3 字段):**
|
|
145
|
+
```yaml
|
|
146
|
+
name: frontend
|
|
147
|
+
path: ./frontend
|
|
148
|
+
status: active
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**workspace add 扩展的格式(最多 5 字段):**
|
|
152
|
+
```yaml
|
|
153
|
+
name: frontend
|
|
154
|
+
path: ./frontend
|
|
155
|
+
status: active
|
|
156
|
+
role: 前端 - Vue3 + TypeScript
|
|
157
|
+
repo: https://github.com/xxx/frontend.git # 可选
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### 最后说:
|
|
161
|
+
|
|
162
|
+
> 工作区已更新。
|
|
163
|
+
> 下一步:对子项目运行 `/sillyspec:init` 或 `/sillyspec:scan`。
|
|
164
|
+
|
|
165
|
+
## 绝对规则
|
|
166
|
+
- 不修改子项目目录下的任何文件
|
|
167
|
+
- projects/*.yaml 必须是合法 YAML
|
|
168
|
+
- 子项目路径必须是相对于工作区根目录的相对路径
|
|
169
|
+
- 路径必须验证存在性
|
package/.gitattributes
ADDED
package/.husky/pre-push
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
#!/bin/sh
|
|
2
|
-
echo "🔧 pre-push: running lint + test + docs gate..."
|
|
3
|
-
npm run lint --silent 2>&1
|
|
4
|
-
if [ $? -ne 0 ]; then
|
|
5
|
-
echo "❌ pre-push: lint failed, aborting push"
|
|
6
|
-
exit 1
|
|
7
|
-
fi
|
|
8
|
-
npm test --silent 2>&1
|
|
9
|
-
if [ $? -ne 0 ]; then
|
|
10
|
-
echo "❌ pre-push: test failed, aborting push"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
# docs gate ratchet(doc-consistency-debt 第七节):docs check 失效数 ≤ 基线放行。
|
|
14
|
-
# 基线 .sillyspec/docs-check-baseline 缺失/损坏时 fail-closed exit 2 拦截。
|
|
15
|
-
node bin/sillyspec.js docs gate 2>&1
|
|
16
|
-
if [ $? -ne 0 ]; then
|
|
17
|
-
echo "❌ pre-push: docs gate failed, aborting push"
|
|
18
|
-
exit 1
|
|
19
|
-
fi
|
|
20
|
-
echo "✅ pre-push: lint + test + docs gate passed"
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
echo "🔧 pre-push: running lint + test + docs gate..."
|
|
3
|
+
npm run lint --silent 2>&1
|
|
4
|
+
if [ $? -ne 0 ]; then
|
|
5
|
+
echo "❌ pre-push: lint failed, aborting push"
|
|
6
|
+
exit 1
|
|
7
|
+
fi
|
|
8
|
+
npm test --silent 2>&1
|
|
9
|
+
if [ $? -ne 0 ]; then
|
|
10
|
+
echo "❌ pre-push: test failed, aborting push"
|
|
11
|
+
exit 1
|
|
12
|
+
fi
|
|
13
|
+
# docs gate ratchet(doc-consistency-debt 第七节):docs check 失效数 ≤ 基线放行。
|
|
14
|
+
# 基线 .sillyspec/docs-check-baseline 缺失/损坏时 fail-closed exit 2 拦截。
|
|
15
|
+
node bin/sillyspec.js docs gate 2>&1
|
|
16
|
+
if [ $? -ne 0 ]; then
|
|
17
|
+
echo "❌ pre-push: docs gate failed, aborting push"
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
echo "✅ pre-push: lint + test + docs gate passed"
|