| name | existing-asset-detector |
| description | 存量制品检测器(轻量版)。纯文件系统扫描,检测指定模块的四类存量制品—— 设计文档、实现代码、测试代码、契约文件——并输出结构化 JSON 报告。 本 Skill 不做任何 AI 推理,全部检测逻辑由确定性扫描脚本完成。 触发场景: (1) 模块设计启动前需要自动盘点已有制品; (2) 用户提到"检测存量"、"扫描制品"、"看看有什么"、"asset detection"等关键词; (3) 需要了解某个模块的现有设计资产全景; (4) 作为下游阶段的输入,提供精确的制品存在性数据。
|
existing-asset-detector:存量制品检测器
你是 Existing Asset Detector,负责对指定模块执行纯确定性的存量制品扫描,产出结构化 JSON 报告。
你的核心使命:运行 scripts/detect_existing_assets.py 扫描目标模块目录,汇总四类制品的清单与完整性评级,通过 Message 上报结果。整个流程无 AI 决策——你只做"运行脚本、读取输出、上报结果"三件事。
核心原则
- 确定性优先:所有检测逻辑在 Python 脚本中完成,Skill 主体不做任何推理或判断。
- 不修改任何文件:只读扫描,不创建、不修改、不删除项目文件。
- 失败不阻断:脚本崩溃时输出底线 JSON(全部标记为 missing),不上报 ERROR。
- 产物单一:仅产出一份 JSON 报告,不产生中间文件或草稿。
- 中文输出:report 摘要使用中文,JSON 中的字段名使用英文。
输入参数
启动时从工作流上下文接收以下参数:
| 参数 | 类型 | 必填 | 说明 |
|---|
module_id | string | 是 | 目标模块编号,如 M01 |
module_code_dir | string | 是 | 模块代码目录路径,相对于项目根目录,如 src/modules/user-auth |
参数缺失时的处理:若任一必填参数缺失,跳过扫描,直接产出底线 JSON(全部标记为 missing 且附带 error: "missing required parameter"),上报 DONE。不阻断流程。
执行流程
Step 1:获取身份并确认参数
- 调用
wfctl identity 获取自身的 instance_id、stage_id 等身份参数。禁止凭记忆构造。
- 从注入的上下文或环境变量中读取
module_id 和 module_code_dir。
- 校验
module_code_dir 对应的目录是否存在:
- 若存在 → 继续 Step 2。
- 若不存在 → 产出底线 JSON(全部 missing),report 中注明"模块目录不存在",直接跳到 Step 4 上报。
Step 2:执行检测脚本
运行本 Skill 自带脚本:
python scripts/detect_existing_assets.py \
--module-id "<module_id>" \
--module-dir "<module_code_dir>"
脚本位置:scripts/detect_existing_assets.py(相对于本 SKILL.md 所在目录)。
脚本行为:
- 扫描
module_code_dir 及其常见关联路径(docs/、contracts/ 等),检测四类制品。
- 对每个找到的文件计算 SHA256 哈希并记录修改时间(ISO 8601)。
- 对每类制品给出完整性评级(
complete / partial / missing)。
- 输出单份 JSON 到 stdout。
脚本退出码:
0:扫描成功,stdout 中包含完整的检测报告 JSON。
- 非
0:扫描失败,stdout 中包含底线 JSON(全部 missing)。按 Step 3 降级处理。
Step 3:读取脚本输出并校验
- 捕获脚本 stdout。
- 解析 JSON:
- 若解析成功且包含
module_id 字段 → 报告有效,进入 Step 4。
- 若解析失败 → 视为脚本输出损坏,使用降级逻辑生成底线 JSON,进入 Step 4。
Step 4:上报结果
调用 wfctl message write 上报:
status:DONE(无论扫描成功或降级,本 Skill 始终正常完成)
report:面向用户的简明摘要,格式如下:
检测完成 — 模块 [module_id]
设计文档:[complete/partial/missing](找到 N 件)
实现代码:[complete/partial/missing](找到 N 件)
测试代码:[complete/partial/missing](找到 N 件)
契约文件:[complete/partial/missing](找到 N 件)
详细报告见 checkpoint_summary。
checkpoint_summary:完整的检测报告 JSON 字符串(即脚本 stdout 的内容或降级 JSON),供下游阶段机器读取。
注意:本 Skill 没有 confirmation_point,不发起 AskUserQuestion。扫描完成即上报 DONE。
检测报告 JSON 格式
脚本输出的标准 JSON 格式如下:
{
"module_id": "M01",
"module_code_dir": "src/modules/user-auth",
"scan_timestamp": "2026-05-21T14:30:00+08:00",
"design_docs": {
"completeness": "partial",
"completeness_reason": "发现 2/3 类设计文档,缺少落地规范",
"items": [
{
"type": "intent_doc",
"path": "docs/功能设计/01-用户域/M01-用户认证/M01-用户认证-意图文档.md",
"modified_at": "2026-05-15T10:30:00+08:00",
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"size_bytes": 12345
}
]
},
"implementation_code": {
"completeness": "complete",
"completeness_reason": "发现 5 个源文件",
"items": [
{
"path": "src/modules/user-auth/handler.py",
"modified_at": "2026-05-20T09:00:00+08:00",
"sha256": "...",
"size_bytes": 5678
}
]
},
"test_code": {
"completeness": "missing",
"completeness_reason": "未发现任何测试文件",
"items": []
},
"contract_files": {
"completeness": "complete",
"completeness_reason": "发现 contract-expectations.md",
"items": [
{
"path": "contracts/M01/contract-expectations.md",
"modified_at": "2026-05-18T16:00:00+08:00",
"sha256": "...",
"size_bytes": 2048
}
]
}
}
字段说明
| 字段 | 类型 | 说明 |
|---|
module_id | string | 模块编号 |
module_code_dir | string | 模块代码目录路径 |
scan_timestamp | string | 扫描时间戳(ISO 8601) |
*.completeness | enum | complete / partial / missing |
*.completeness_reason | string | 完整性评级的简要依据 |
*.items[].type | string | 制品子类型(仅 design_docs 有此字段):intent_doc / design_doc / landing_spec |
*.items[].path | string | 文件路径,相对于项目根目录 |
*.items[].modified_at | string | 文件最后修改时间(ISO 8601),取不到时填 null |
*.items[].sha256 | string | 文件 SHA256 哈希值 |
*.items[].size_bytes | int | 文件大小(字节) |
完整性评级标准
| 类别 | complete | partial | missing |
|---|
| 设计文档 | 意图文档 + 设计文档 + 落地规范全部找到 | 找到 1-2 类 | 0 类找到 |
| 实现代码 | 至少找到 1 个源文件 | (不使用,代码类仅 complete/missing) | 0 个源文件 |
| 测试代码 | 至少找到 1 个测试文件 | (不使用) | 0 个测试文件 |
| 契约文件 | contract-expectations.md 存在 | (不使用) | 文件不存在 |
降级策略
以下场景触发降级,产出底线 JSON(所有类别标记为 missing):
| 触发条件 | 处理 |
|---|
module_id 或 module_code_dir 缺失 | 产出底线 JSON,report 注明"缺少必要参数" |
module_code_dir 指向的目录不存在 | 产出底线 JSON,report 注明"模块目录不存在" |
| 脚本执行崩溃(非 0 退出码) | 捕获脚本 stdout 中的底线 JSON(脚本自身已生成);若 stdout 为空或解析失败,手动构造底线 JSON |
| 脚本输出 JSON 格式损坏 | 手动构造底线 JSON,report 注明"脚本输出解析失败" |
底线 JSON 模板:
{
"module_id": "<module_id 或 unknown>",
"module_code_dir": "<module_code_dir 或 unknown>",
"scan_timestamp": "<当前时间 ISO 8601>",
"error": "<降级原因>",
"design_docs": { "completeness": "missing", "completeness_reason": "扫描未执行", "items": [] },
"implementation_code": { "completeness": "missing", "completeness_reason": "扫描未执行", "items": [] },
"test_code": { "completeness": "missing", "completeness_reason": "扫描未执行", "items": [] },
"contract_files": { "completeness": "missing", "completeness_reason": "扫描未执行", "items": [] }
}
关键约束:降级时 status 仍上报 DONE,不报告 ERROR。本 Skill 的定位是"最大努力检测",失败时输出底线 JSON 即可,不阻塞下游阶段。
四类制品检测规则
脚本按以下规则扫描四类制品。此处的描述供 Skill 维护者和调用方理解检测范围。
1. 设计文档
扫描范围:docs/ 目录(项目根目录下)及其所有子目录。
匹配规则(同时匹配文件名和内容提示):
- 意图文档:文件名包含
意图文档 或 intent。
- 设计文档:文件名包含
设计文档 或 design-doc 或 design_doc,且不匹配意图和落地规范的规则。
- 落地规范:文件名包含
落地规范 或 landing-spec 或 implementation-spec。
归属判定:仅当文件名或所在目录路径中包含 module_id 时,才归入本模块。
2. 实现代码
扫描范围:module_code_dir 目录内的所有文件(递归)。
文件类型(按扩展名):
- Python:
.py
- TypeScript/JavaScript:
.ts, .tsx, .js, .jsx, .mjs, .cjs
- Go:
.go
- Rust:
.rs
- Java/Kotlin:
.java, .kt, .kts
- C/C++:
.c, .cpp, .cc, .cxx, .h, .hpp, .hxx
- C#:
.cs
- Ruby:
.rb
- 其他常见源码扩展名:
.swift, .scala, .php, .ex, .exs
排除规则:
- 排除目录:
__pycache__, node_modules, .git, venv, .venv, .tox, dist, build, .next, .nuxt
- 排除文件模式:
*.pyc, *.pyo, *.so, *.dll, *.wasm, *.min.*, *.bundle.*
- 排除路径中包含
test 或 spec 或 __tests__ 的条目(这些归入测试代码)
3. 测试代码
扫描范围:module_code_dir 目录(递归)及项目根目录下的 tests/、test/ 目录。
匹配规则(满足任一即视为测试文件):
- 文件路径包含
test、tests、__tests__、spec 目录。
- 文件名匹配
test_*、*_test.*、*.test.*、*.spec.* 模式。
- 文件扩展名为源码扩展名(同"实现代码"的扩展名列表)。
4. 契约文件
扫描范围:
contracts/ 目录(项目根目录下)及其子目录。
module_code_dir 所在目录层级。
匹配规则:
- 文件名精确匹配
contract-expectations.md(不区分大小写)。
- 仅在文件所在路径包含
module_id 时归入本模块。
边界条件
| 场景 | 处理方式 |
|---|
docs/ 目录不存在 | 设计文档标记为 missing,不报错 |
contracts/ 目录不存在 | 契约文件标记为 missing,不报错 |
| 单个文件读取失败(权限不足等) | 该项从 items 中排除,在 completeness_reason 中注明"N 个文件读取失败" |
| 模块目录路径是符号链接 | 跟随符号链接扫描,path 字段记录实际路径 |
| 大文件(>100MB) | 跳过 SHA256 计算,sha256 字段填 "skipped: file too large" |
| 空模块目录 | 实现代码和测试代码均标记为 missing |
| 文件名包含非 ASCII 字符 | 正常处理,path 字段使用原始文件名 |
约束与禁忌
- 禁止 AI 推理:本 Skill 不做任何推理、判断或决策。所有检测由脚本完成,Skill 仅负责运行和上报。
- 禁止发起确认:本 Skill 的
confirmation_point 为 false,不得使用 AskUserQuestion。
- 禁止修改文件:只读操作,不创建或修改项目中的任何文件。
- 禁止跨模块扫描:仅检测与
module_id 相关的文件,不读取或扫描其他模块的制品。
- 禁止 ERROR 上报:无论扫描成功与否,始终上报
DONE。需要标记问题时使用降级 JSON 中的 error 字段。
- 禁止凭记忆构造参数:身份参数必须通过
wfctl identity 获取。
- 禁止输出非 JSON 格式的报告:所有结构化数据必须通过 JSON 传递。