visual-spec 0.1.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.
Files changed (73) hide show
  1. package/.trae/skills/starter-skill/SKILL.md +326 -0
  2. package/.trae/skills/starter-skill/prompts/vspec_accept/accept.md +52 -0
  3. package/.trae/skills/starter-skill/prompts/vspec_change/change.md +40 -0
  4. package/.trae/skills/starter-skill/prompts/vspec_detail/code_rules.md +32 -0
  5. package/.trae/skills/starter-skill/prompts/vspec_detail/cron_job.md +24 -0
  6. package/.trae/skills/starter-skill/prompts/vspec_detail/data_permission.md +30 -0
  7. package/.trae/skills/starter-skill/prompts/vspec_detail/decision_matrix.md +38 -0
  8. package/.trae/skills/starter-skill/prompts/vspec_detail/expression_tree.md +44 -0
  9. package/.trae/skills/starter-skill/prompts/vspec_detail/file_export.md +25 -0
  10. package/.trae/skills/starter-skill/prompts/vspec_detail/file_import.md +27 -0
  11. package/.trae/skills/starter-skill/prompts/vspec_detail/formula.md +27 -0
  12. package/.trae/skills/starter-skill/prompts/vspec_detail/interaction.md +30 -0
  13. package/.trae/skills/starter-skill/prompts/vspec_detail/judgemental_matrix.md +47 -0
  14. package/.trae/skills/starter-skill/prompts/vspec_detail/logging_matrix.md +25 -0
  15. package/.trae/skills/starter-skill/prompts/vspec_detail/mq.md +43 -0
  16. package/.trae/skills/starter-skill/prompts/vspec_detail/nfp.md +31 -0
  17. package/.trae/skills/starter-skill/prompts/vspec_detail/notification_matrix.md +25 -0
  18. package/.trae/skills/starter-skill/prompts/vspec_detail/page_load.md +54 -0
  19. package/.trae/skills/starter-skill/prompts/vspec_detail/post_submit_check.md +30 -0
  20. package/.trae/skills/starter-skill/prompts/vspec_detail/post_submit_navigation.md +21 -0
  21. package/.trae/skills/starter-skill/prompts/vspec_detail/post_submit_processing.md +39 -0
  22. package/.trae/skills/starter-skill/prompts/vspec_detail/rbac.md +30 -0
  23. package/.trae/skills/starter-skill/prompts/vspec_detail/state_machine.md +25 -0
  24. package/.trae/skills/starter-skill/prompts/vspec_detail/timeline.md +123 -0
  25. package/.trae/skills/starter-skill/prompts/vspec_detail/validation_matrix.md +31 -0
  26. package/.trae/skills/starter-skill/prompts/vspec_impl/implement.md +87 -0
  27. package/.trae/skills/starter-skill/prompts/vspec_new/background.md +76 -0
  28. package/.trae/skills/starter-skill/prompts/vspec_new/dependencies.md +41 -0
  29. package/.trae/skills/starter-skill/prompts/vspec_new/details.md +14 -0
  30. package/.trae/skills/starter-skill/prompts/vspec_new/details_boundaries.md +42 -0
  31. package/.trae/skills/starter-skill/prompts/vspec_new/details_constraints.md +70 -0
  32. package/.trae/skills/starter-skill/prompts/vspec_new/details_pre_post.md +45 -0
  33. package/.trae/skills/starter-skill/prompts/vspec_new/details_symmetry.md +47 -0
  34. package/.trae/skills/starter-skill/prompts/vspec_new/details_variations.md +52 -0
  35. package/.trae/skills/starter-skill/prompts/vspec_new/flows.md +38 -0
  36. package/.trae/skills/starter-skill/prompts/vspec_new/functions.md +82 -0
  37. package/.trae/skills/starter-skill/prompts/vspec_new/questions.md +38 -0
  38. package/.trae/skills/starter-skill/prompts/vspec_new/roles.md +35 -0
  39. package/.trae/skills/starter-skill/prompts/vspec_new/scenarios.md +100 -0
  40. package/.trae/skills/starter-skill/prompts/vspec_new/stakeholders.md +62 -0
  41. package/.trae/skills/starter-skill/prompts/vspec_new/terms.md +38 -0
  42. package/.trae/skills/starter-skill/prompts/vspec_plan/estimate.md +32 -0
  43. package/.trae/skills/starter-skill/prompts/vspec_plan/schedule.md +43 -0
  44. package/.trae/skills/starter-skill/prompts/vspec_qc/22./351/234/200/346/261/202/345/210/206/346/236/220/351/224/231/351/242/230/346/234/254.xlsx +0 -0
  45. package/.trae/skills/starter-skill/prompts/vspec_qc/qc.md +38 -0
  46. package/.trae/skills/starter-skill/prompts/vspec_qc/quality_standard.md +35 -0
  47. package/.trae/skills/starter-skill/prompts/vspec_refine/refine.md +78 -0
  48. package/.trae/skills/starter-skill/prompts/vspec_refine/refine_q.md +39 -0
  49. package/.trae/skills/starter-skill/prompts/vspec_test/test.md +33 -0
  50. package/.trae/skills/starter-skill/prompts/vspec_upgrade/upgrade.md +50 -0
  51. package/.trae/skills/starter-skill/prompts/vspec_verify/model.md +67 -0
  52. package/.trae/skills/starter-skill/prompts/vspec_verify/prototype.md +744 -0
  53. package/.trae/skills/starter-skill/prompts/vspec_verify/prototype_apply.md +72 -0
  54. package/.trae/skills/starter-skill/prompts/vspec_verify/prototype_approve.md +61 -0
  55. package/.trae/skills/starter-skill/prompts/vspec_verify/prototype_calendar.md +29 -0
  56. package/.trae/skills/starter-skill/prompts/vspec_verify/prototype_crud.md +59 -0
  57. package/.trae/skills/starter-skill/prompts/vspec_verify/prototype_dashboard.md +37 -0
  58. package/.trae/skills/starter-skill/prompts/vspec_verify/prototype_execute.md +62 -0
  59. package/.trae/skills/starter-skill/prompts/vspec_verify/prototype_landing.md +36 -0
  60. package/.trae/skills/starter-skill/prompts/vspec_verify/prototype_mobile_list.md +34 -0
  61. package/.trae/skills/starter-skill/prompts/vspec_verify/prototype_tool_pages.md +74 -0
  62. package/.trae/skills/starter-skill/prompts/vspec_verify/prototype_toolbox.md +26 -0
  63. package/.trae/skills/starter-skill/prompts/vspec_verify/validation.md +48 -0
  64. package/LICENSE +21 -0
  65. package/README.md +31 -0
  66. package/bin/vreq-skill.cjs +18 -0
  67. package/docs/commands.md +84 -0
  68. package/docs/concepts.md +36 -0
  69. package/docs/installation.md +32 -0
  70. package/docs/structure.md +69 -0
  71. package/docs/workflows.md +69 -0
  72. package/package.json +25 -0
  73. package/scripts/postinstall.cjs +116 -0
@@ -0,0 +1,84 @@
1
+ ## 命令总览
2
+
3
+ | 命令 | 目的 | 主要输入 | 主要输出 |
4
+ | --- | --- | --- | --- |
5
+ | `/vspec:new` | 从原始需求生成基础规格产物 | 原始需求文本 + 交互问答 | `/specs/`(original、stakeholder、roles、terms、flows、scenarios、scenario_details、dependencies、functions、questions)+ 初始化 `/docs/*` 归档目录 |
6
+ | `/vspec:refine` | 基于修订材料修订需求,并同步更新细节与原型 | `/docs/refine/*`(或命令参数)+ `/specs/background/original.md`(基线)+ `/specs/details/`(前置条件) | 追加写入 `/specs/background/original.md`(变更清单 + Canonical)+ 更新受影响 `/specs/details/` 与 `/specs/prototypes/` |
7
+ | `/vspec:refine-q` | 基于 questions 的已回答内容修订需求 | `/specs/background/original.md` + `/specs/background/questions.md` | 追加写入 `/specs/background/original.md`(采纳条目 + 变更清单 + Canonical) |
8
+ | `/vspec:verify` | 生成模型与原型,用于快速验证 | `/specs/` 产物 | `/specs/models/*.md`、`/specs/prototypes/`(Vue + Ant Design Vue 原型、场景确认页 `scenario.html`) |
9
+ | `/vspec:detail` | 按功能点细化需求细节 | `/specs/functions/*` + 细节/模型/角色 | `/specs/details/<function_slug>/*`(权限/交互/校验/日志/通知/MQ/导入导出/定时任务等) |
10
+ | `/vspec:accept` | 生成验收测试用例 | 功能/场景/细节/角色/模型 | `/specs/acceptance/<function_slug>/acceptance_cases.md`、`/specs/acceptance/index.md` |
11
+ | `/vspec:test` | 生成自动化测试代码 | 验收用例 + 仓库既有测试框架 | 写入既有测试目录或 `/tests/` |
12
+ | `/vspec:impl` | 生成前后端集成代码 | 规格/细节/模型/依赖 | 写入仓库源码(API、后端实现、前端页面与集成) |
13
+ | `/vspec:upgrade` | 基于旧系统材料做升级改造分析并生成新规格 | `/docs/current/file_list.md` + `/docs/legacy/*`(可选 templates/texts/assets)+ 既有 `/specs/background/original.md`(如存在) | 按 `/vspec:new` 结构生成/更新 `/specs/` + 同步技术规格到 `/scheme.yaml` |
14
+ | `/vspec:change` | 基于变更材料做影响分析并更新产物 | `/docs/change/*`(可选 file_list.md)+ 现有产物 `/specs/` | 更新相关文件(优先 `/specs/details/<module_slug>/`)+ `/specs/change_log.md`(更新前需 git 快照提交) |
15
+ | `/vspec:qc` | 对 `/specs/` 产物做质量检查并输出不合格清单 | 内嵌标准 + 项目 `quality_standard.md`(可选) + `/specs/` | `/specs/qc_report.md` |
16
+ | `/vspec:plan` | 估算与排期 | 功能/角色/流程/依赖/细节 | `/specs/plan_estimate.md`、`/specs/plan_schedule.html` |
17
+
18
+ ## `/vspec:new`
19
+
20
+ - 使用场景:需求刚拿到、信息不完整,需要快速形成统一语言与初版规格
21
+ - 输出重点:干系人/角色/术语/流程/场景/功能清单/待确认问题
22
+ - 目录初始化:会在项目根目录初始化 `/docs/` 及其子目录(legacy/current/change/refine/templates/texts/assets),用于材料归档与后续命令读取
23
+
24
+ ## `/vspec:refine`
25
+
26
+ - 使用场景:需求在开发/细化过程中出现补充与修订,需要在保留可追溯的前提下,更新“当前生效需求”并同步更新细节与原型
27
+ - 输入来源:
28
+ - 默认读取:`/docs/refine/`(优先 `/docs/refine/file_list.md`;否则按文件名顺序)
29
+ - 可选:命令参数指定文件/目录(优先级更高)
30
+ - 前置条件:必须已存在且非空的 `/specs/details/`,否则 refine 不执行(避免只有上游需求变了、下游细节不跟导致产物失配)
31
+ - 输出重点:
32
+ - 在 `original.md` 末尾追加“变更清单 + 当前生效需求(Canonical)+ 影响分析与产物更新”
33
+ - 更新受影响的 `/specs/details/`(优先更新既有文件)与 `/specs/prototypes/`(最小可评审 diff)
34
+
35
+ ## `/vspec:refine-q`
36
+
37
+ - 使用场景:业务已回答 `/specs/background/questions.md`,希望将已回答内容合并回需求并形成新的生效版本
38
+ - 输出重点:采纳的问答条目 + 变更清单 + 当前生效需求(Canonical)
39
+
40
+ ## `/vspec:verify`
41
+
42
+ - 使用场景:希望尽快验证数据结构与页面形态,降低理解偏差
43
+ - 输出重点:数据模型文件(实体拆分)、可运行原型、场景确认页
44
+
45
+ ## `/vspec:detail`
46
+
47
+ - 使用场景:进入方案设计/开发前,需要把“每个功能点”拆到可实现的细节级别
48
+ - 输出重点:RBAC 到控件级、数据权限、加载/交互/校验矩阵、提交后处理、日志/通知矩阵、MQ、导入/导出、定时任务
49
+
50
+ ## `/vspec:accept`
51
+
52
+ - 使用场景:准备验收与交付对齐,形成可执行的用例集合
53
+ - 输出重点:按功能点组织的验收用例表,覆盖主流程/异常/边界/权限/数据权限
54
+
55
+ ## `/vspec:test`
56
+
57
+ - 使用场景:需要把验收用例落地为可运行的自动化测试(E2E/API/单测)
58
+ - 输出重点:复用仓库既有测试框架与脚本,不引入新依赖
59
+
60
+ ## `/vspec:impl`
61
+
62
+ - 使用场景:需要把规格产物转为真实可运行的前后端联调代码
63
+ - 输出重点:接口契约、后端实现、前端页面与 API 集成、权限与状态机落地
64
+
65
+ ## `/vspec:change`
66
+
67
+ - 使用场景:需求发生明确变更,需要可追溯地更新产物并评估影响
68
+ - 输入来源:读取 `/docs/change/` 下材料(可选 `/docs/change/file_list.md` 作为入口按顺序读取;兼容旧路径 `/docs/changes/`)
69
+ - 更新策略:优先更新受影响模块的明细规格目录 `/specs/details/<module_slug>/`,并按需联动 models/functions/prototypes/acceptance
70
+ - 更新前快照:若目标仓库是 git 仓库,写入任何更新前必须先提交一次快照,便于查看本次变更 diff
71
+ - 输出重点:结构化变更清单、影响分析表、变更日志与对应产物更新
72
+
73
+ ## `/vspec:upgrade`
74
+
75
+ - 使用场景:基于遗留系统材料做“升级改造/重构迁移”分析,从旧内容继承并生成新的规格产物
76
+ - 入口清单:`/docs/current/file_list.md`(不存在则先生成模板),用于列出输入文件及用途、提取要点、是否必须
77
+ - 输入范围:通常来自 `/docs/legacy/*` 与 `/docs/current/*`,可选结合 `/docs/templates/*`、`/docs/texts/*`、`/docs/assets/*`
78
+ - 输出重点:复用 `/vspec:new` 的产物结构生成/更新 `/specs/`,并在功能清单中标注“继承/新增/调整/废弃”
79
+ - 技术规格同步:从“系统技术规格”输入中抽取选型并写入 `/scheme.yaml`,用于后续 `/vspec:verify` 与 `/vspec:impl`
80
+
81
+ ## `/vspec:plan`
82
+
83
+ - 使用场景:需要对齐交付节奏,按用户故事地图拆解并排期
84
+ - 输出重点:故事拆分与估算(人天)、迭代计划、HTML 用户故事地图
@@ -0,0 +1,36 @@
1
+ ## 设计理念
2
+
3
+ ### 1. 以产物驱动协作
4
+
5
+ - 把“讨论”转化为“可评审产物”,减少口头对齐成本
6
+ - 产物按层次递进:原始需求 → 规格(/specs)→ 模型(/specs/models)→ 原型(/specs/prototypes)→ 细节(/specs/details)→ 验收/测试/代码
7
+
8
+ ### 2. 场景化拆解,而不是功能堆砌
9
+
10
+ - 场景使用节点组合(apply/approve/cancel/change/execute-start/execute-end 等)覆盖主流程与回退路径
11
+ - 通过场景驱动细节:每个功能点最终都能落到“可执行的用户动作 + 可验证的期望结果”
12
+
13
+ ### 3. 权限与数据权限前置
14
+
15
+ - RBAC 精确到页面区域与控件,避免“页面能看但按钮不该点”的灰区
16
+ - 数据权限独立建模(行/列/范围/状态/组织),并与 RBAC 形成组合关系(先鉴权再过滤)
17
+
18
+ ### 4. 可实现的细节表达
19
+
20
+ - 页面加载逻辑、交互逻辑、提交后处理都用步骤清单/表格输出,便于工程实现与评审
21
+ - 校验、日志、通知等采用“矩阵形式”,保证覆盖完整、方便回溯与对齐
22
+
23
+ ### 5. 最终一致性与可观测性是默认能力
24
+
25
+ - 对外部依赖、MQ、重试、DLQ、补偿等给出明确规格
26
+ - 默认要求关键事件可追踪(trace_id/request_id)、可审计(操作日志)、可告警(失败与堆积)
27
+
28
+ ### 6. 从验收到自动化再到集成实现
29
+
30
+ - 验收用例作为开发与测试共同语言
31
+ - 自动化测试优先复用仓库既有框架与目录约定,减少维护成本
32
+ - 生成代码强调最小可评审差异与可运行闭环
33
+
34
+ ### 7. 便于变更的需求文档
35
+
36
+ - 生成的需求文档强调可编辑、可阅读、易发现问题、易修正,并能快速适配需求变更。
@@ -0,0 +1,32 @@
1
+ ## 安装到 Trae
2
+
3
+ 本仓库通过脚本把内置的 Skill 目录复制到你的 Trae 配置目录下。
4
+
5
+ ### 前置条件
6
+
7
+ - Node.js >= 14
8
+
9
+ ### 安装/更新(推荐)
10
+
11
+ 在本仓库根目录执行:
12
+
13
+ ```bash
14
+ node scripts/postinstall.cjs --force --target "$HOME"
15
+ ```
16
+
17
+ 说明:
18
+
19
+ - `--target` 指定 Trae 配置目录的根路径;脚本会安装到:`<target>/.trae/skills/starter-skill`
20
+ - `--force` 会先删除旧目录再覆盖安装
21
+
22
+ ### 验证
23
+
24
+ 确认目录存在:
25
+
26
+ - `$HOME/.trae/skills/starter-skill`
27
+
28
+ ### 卸载
29
+
30
+ 删除目录即可:
31
+
32
+ - `$HOME/.trae/skills/starter-skill`
@@ -0,0 +1,69 @@
1
+ # 目录结构说明
2
+
3
+ 本文说明两类目录结构:
4
+ - 项目内 `/specs/` 产物目录结构:skill 在目标项目中生成的需求与设计产物
5
+
6
+
7
+ ## 目标项目目录结构
8
+
9
+ skill 会在目标项目根目录生成 `/specs/` 产物(按命令阶段逐步补齐),并维护少量项目级配置与材料归档目录。典型结构如下:
10
+
11
+ ```text
12
+ <your-project>/
13
+ ├─ docs/ # 需求材料归档目录(/vspec:new 自动创建)
14
+ │ ├─ legacy/ # 遗留系统材料(旧系统功能、旧权限、旧交互、旧接口说明等)
15
+ │ ├─ current/ # 本次新增/补充材料(新目标、差异说明、新流程、新 UI 约束等)
16
+ │ │ └─ file_list.md # 升级分析入口清单(/vspec:upgrade 读取/生成)
17
+ │ ├─ change/ # 变更材料(/vspec:change 读取)
18
+ │ │ └─ file_list.md # 变更输入入口清单(可选,存在则按顺序读取)
19
+ │ ├─ refine/ # 需求修订材料(/vspec:refine 读取)
20
+ │ │ └─ file_list.md # 修订输入入口清单(可选,存在则按顺序读取)
21
+ │ ├─ templates/ # 各类模板(PRD/文案/页面/表格模板等,可选)
22
+ │ ├─ texts/ # 文案材料(提示语、错误文案、协议文案、消息模板等,可选)
23
+ │ └─ assets/ # 静态资源(设计稿/截图/原型/图片等,可选)
24
+ ├─ scheme.yaml # 原型工程技术栈选择(/vspec:verify 使用;不存在会自动创建默认值)
25
+ └─ specs/
26
+ ├─ background/ # 背景分析与通用资料
27
+ │ ├─ original.md # 原始需求(或等价输入)
28
+ │ ├─ stakeholders.md # 干系人
29
+ │ ├─ roles.md # 角色与任务
30
+ │ ├─ terms.md # 术语表
31
+ │ ├─ scenarios.md # 场景清单
32
+ │ ├─ scenario_details/ # 场景细节(按节点拆分:每节点 pre_post.md/constraints.md/variations.md/boundaries.md/symmetry.md)
33
+ │ ├─ dependencies.md # 外部依赖
34
+ │ └─ questions.md # 待确认问题清单(进入 verify 前需清零未回答/允许跳过)
35
+ ├─ flows/ # 流程图(PlantUML)
36
+ │ └─ *.puml
37
+ ├─ functions/ # 功能清单(按模块拆分)
38
+ │ └─ *.md
39
+ ├─ details/ # 逐功能点的细节设计(/vspec:detail 输出)
40
+ │ └─ <module_slug>/
41
+ │ ├─ rbac/ # 权限细化
42
+ │ ├─ data_permission/ # 数据权限
43
+ │ ├─ page_load/
44
+ │ ├─ interaction/
45
+ │ ├─ validation_matrix/
46
+ │ ├─ logging_matrix/
47
+ │ ├─ notification_matrix/
48
+ │ ├─ mq/
49
+ │ ├─ nfp/ # 非功能性需求(性能/压测/安全/兼容/容错/稳定)
50
+ │ ├─ file_import/
51
+ │ ├─ file_export/
52
+ │ └─ cron_job/
53
+ ├─ models/ # 数据模型(/vspec:verify 输出)
54
+ │ ├─ *.md
55
+ │ └─ README.md
56
+ ├─ prototypes/ # 原型工程与验证页(/vspec:verify 输出)
57
+ │ └─ ...
58
+ ├─ acceptance/ # 验收用例(/vspec:accept 输出)
59
+ │ ├─ index.md
60
+ │ └─ ...
61
+ ├─ qc_report.md # 质量检查报告(/vspec:qc 输出)
62
+ ├─ plan_estimate.md # 估算(/vspec:plan 输出)
63
+ ├─ plan_schedule.html # 排期页面(/vspec:plan 输出)
64
+ └─ change_log.md # 变更日志(/vspec:change 输出)
65
+ ```
66
+
67
+ 补充说明:
68
+ - `docs/`:用于存放与本需求相关的业务材料与交付对齐资料;建议统一放入 `legacy/current/change/refine/templates/texts/assets` 等子目录,并在文件名中体现来源与版本。
69
+ - `scheme.yaml`:用于指定 `/vspec:verify` 生成“可运行原型工程”时采用的技术栈与选项;优先读取项目根目录 `scheme.yaml`,若不存在才读取 `/specs/scheme.yaml`,两者都不存在则会创建默认的 `scheme.yaml`。
@@ -0,0 +1,69 @@
1
+ ## 工作流程
2
+
3
+ ### 0. 准备
4
+
5
+ - 在你的项目根目录(包含 `.trae/`)安装该 skill
6
+ - 确保 `.trae/skills/starter-skill/` 已出现在项目内(安装方式见下方“安装”)
7
+
8
+ ### 1. 需求分析(/vspec:new)
9
+
10
+ - 输入原始需求
11
+ - 回答待确认问题(关键假设、范围、规则、依赖)
12
+ - 得到 `/specs/` 下基础规格产物:角色/术语/流程/场景/功能清单/依赖/问题清单
13
+
14
+ ### 2. 方案验证(/vspec:verify)
15
+
16
+ - 基于 `/specs/` 产物生成:
17
+ - `/specs/models/*.md`:实体与字段、关系、状态机、索引、外部字段来源
18
+ - `/specs/prototypes/`:Vue + Ant Design Vue 原型与 `scenario.html` 场景确认页
19
+ - 目标:尽早暴露理解偏差,收敛到可评审方案
20
+
21
+ 补充:原型分段生成(可选)
22
+
23
+ - 当原型规模较大或希望更可控地按链路落地时,可改用拆分命令增量生成:
24
+ - `/vspec:proto-apply`:聚焦申请链路页面与工作台差异
25
+ - `/vspec:proto-approve`:聚焦审批链路页面与工作台差异
26
+ - `/vspec:proto-execute`:聚焦执行链路页面(含移动端 `/m/*`)
27
+ - `/vspec:proto-crud`:聚焦配置/主数据类 CRUD 管理页
28
+
29
+ ### 3. 细节梳理(/vspec:detail)
30
+
31
+ - 以 `/specs/functions/*` 为输入,逐功能点输出 `/specs/details/<function_slug>/`
32
+ - 目标:把“需求”变成可实现的设计输入:
33
+ - 权限(RBAC 到控件级)与数据权限
34
+ - 加载/交互/校验矩阵
35
+ - 提交后检查/处理/跳转
36
+ - 日志矩阵/通知矩阵/MQ 规格/导入导出/定时任务
37
+
38
+ ### 4. 验收用例(/vspec:accept)
39
+
40
+ - 生成验收用例到 `/specs/acceptance/`
41
+ - 目标:明确验收口径与覆盖范围(主流程/异常/边界/权限/数据权限)
42
+
43
+ ### 5. 自动化测试(/vspec:test)
44
+
45
+ - 读取验收用例与仓库现有测试框架
46
+ - 生成最小可运行的 E2E/API/单元测试集合
47
+
48
+ ### 6. 集成开发(/vspec:impl)
49
+
50
+ - 读取规格、细节、模型与依赖
51
+ - 按仓库现有技术栈与约定生成前后端集成代码(接口契约 → 后端实现 → 前端集成)
52
+
53
+ ### 7. 排期规划(/vspec:plan)
54
+
55
+ - 从功能与场景拆成用户故事,估算人天并按迭代排期
56
+ - 输出:
57
+ - `/specs/plan.md`
58
+ - `/specs/story_map.html`(用户故事地图)
59
+
60
+ ### 8. 变更响应(/vspec:change)
61
+
62
+ - 输入变更描述
63
+ - 输出影响分析与变更日志,并同步更新受影响产物与用例
64
+
65
+ ## 安装(npm)
66
+
67
+ - 推荐在你的项目根目录执行:`npm install <git-url>`
68
+ - 安装完成后会将 skill 复制到:`<你的项目>/.trae/skills/starter-skill/`
69
+ - 如需手动执行安装:`npx vreq-skill --force`
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "visual-spec",
3
+ "version": "0.1.0",
4
+ "description": "Trae skill: visual-spec-skill (/vspec:* commands) for requirement analysis, prototyping, detailing, testing, and planning.",
5
+ "license": "MIT",
6
+ "type": "commonjs",
7
+ "bin": {
8
+ "vreq-skill": "bin/vreq-skill.cjs"
9
+ },
10
+ "scripts": {
11
+ "postinstall": "node scripts/postinstall.cjs",
12
+ "install-skill": "node scripts/postinstall.cjs --force",
13
+ "dry-run": "node scripts/postinstall.cjs --dry-run"
14
+ },
15
+ "files": [
16
+ ".trae/skills/starter-skill/",
17
+ "bin/",
18
+ "docs/",
19
+ "scripts/",
20
+ "README.md"
21
+ ],
22
+ "engines": {
23
+ "node": ">=14"
24
+ }
25
+ }
@@ -0,0 +1,116 @@
1
+ const fs = require("node:fs/promises");
2
+ const path = require("node:path");
3
+
4
+ function parseArgs(argv) {
5
+ const args = new Set(argv);
6
+ const getValue = (name) => {
7
+ const index = argv.indexOf(name);
8
+ if (index === -1) return undefined;
9
+ return argv[index + 1];
10
+ };
11
+ return {
12
+ dryRun: args.has("--dry-run"),
13
+ force: args.has("--force"),
14
+ target: getValue("--target"),
15
+ };
16
+ }
17
+
18
+ async function pathExists(filePath) {
19
+ try {
20
+ await fs.stat(filePath);
21
+ return true;
22
+ } catch {
23
+ return false;
24
+ }
25
+ }
26
+
27
+ async function removeDirRecursive(dirPath) {
28
+ const stat = await fs.lstat(dirPath);
29
+ if (!stat.isDirectory()) {
30
+ await fs.unlink(dirPath);
31
+ return;
32
+ }
33
+
34
+ const entries = await fs.readdir(dirPath);
35
+ await Promise.all(
36
+ entries.map(async (entry) => {
37
+ const entryPath = path.join(dirPath, entry);
38
+ await removeDirRecursive(entryPath);
39
+ }),
40
+ );
41
+
42
+ await fs.rmdir(dirPath);
43
+ }
44
+
45
+ async function copyDirRecursive(fromDir, toDir) {
46
+ await fs.mkdir(toDir, { recursive: true });
47
+ const entries = await fs.readdir(fromDir, { withFileTypes: true });
48
+
49
+ await Promise.all(
50
+ entries.map(async (entry) => {
51
+ const fromPath = path.join(fromDir, entry.name);
52
+ const toPath = path.join(toDir, entry.name);
53
+
54
+ if (entry.isDirectory()) {
55
+ await copyDirRecursive(fromPath, toPath);
56
+ return;
57
+ }
58
+
59
+ if (entry.isSymbolicLink()) {
60
+ const linkTarget = await fs.readlink(fromPath);
61
+ try {
62
+ await fs.unlink(toPath);
63
+ } catch {}
64
+ await fs.symlink(linkTarget, toPath);
65
+ return;
66
+ }
67
+
68
+ await fs.copyFile(fromPath, toPath);
69
+ }),
70
+ );
71
+ }
72
+
73
+ async function main() {
74
+ const { dryRun, force, target } = parseArgs(process.argv.slice(2));
75
+
76
+ const packageRoot = path.resolve(__dirname, "..");
77
+ const sourceSkillDir = path.join(packageRoot, ".trae", "skills", "starter-skill");
78
+ const initCwd = target || process.env.INIT_CWD || process.cwd();
79
+ const targetSkillDir = path.join(initCwd, ".trae", "skills", "starter-skill");
80
+
81
+ if (!(await pathExists(sourceSkillDir))) {
82
+ throw new Error(`Skill source directory not found: ${sourceSkillDir}`);
83
+ }
84
+
85
+ if (!force && path.resolve(initCwd) === packageRoot) {
86
+ if (!dryRun) return;
87
+ }
88
+
89
+ const targetSkillsDir = path.dirname(targetSkillDir);
90
+
91
+ if (dryRun) {
92
+ process.stdout.write(
93
+ [
94
+ "[vreq-skill] dry-run",
95
+ `- source: ${sourceSkillDir}`,
96
+ `- target: ${targetSkillDir}`,
97
+ ].join("\n") + "\n",
98
+ );
99
+ return;
100
+ }
101
+
102
+ await fs.mkdir(targetSkillsDir, { recursive: true });
103
+
104
+ const targetExists = await pathExists(targetSkillDir);
105
+ if (targetExists && force) {
106
+ await removeDirRecursive(targetSkillDir);
107
+ }
108
+
109
+ await copyDirRecursive(sourceSkillDir, targetSkillDir);
110
+ process.stdout.write(`[vreq-skill] installed to ${targetSkillDir}\n`);
111
+ }
112
+
113
+ main().catch((error) => {
114
+ process.stderr.write(`[vreq-skill] install failed: ${error?.message || error}\n`);
115
+ process.exitCode = 1;
116
+ });