visual-spec 0.1.0 → 0.1.2
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/README.md +25 -25
- package/bin/{vreq-skill.cjs → vspec.cjs} +0 -0
- package/docs/en-US/commands.md +87 -0
- package/docs/en-US/concepts.md +36 -0
- package/docs/en-US/getting-started.md +85 -0
- package/docs/en-US/installation.md +37 -0
- package/docs/en-US/scheme.example.yaml +71 -0
- package/docs/en-US/structure.md +74 -0
- package/docs/en-US/ui-spec-modification-notes.md +35 -0
- package/docs/en-US/workflows.md +65 -0
- package/docs/zh-CN/commands.md +87 -0
- package/docs/zh-CN/concepts.md +36 -0
- package/docs/zh-CN/getting-started.md +84 -0
- package/docs/zh-CN/installation.md +37 -0
- package/docs/zh-CN/scheme.example.yaml +71 -0
- package/docs/zh-CN/structure.md +73 -0
- package/docs/zh-CN/ui-spec-modification-notes.md +35 -0
- package/docs/zh-CN/workflows.md +65 -0
- package/package.json +4 -4
- package/scripts/postinstall.cjs +16 -6
- package/skills/visual-spec-skill/SKILL-zh-CN.md +264 -0
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/SKILL.md +40 -69
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/cron_job.md +1 -1
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/file_export.md +7 -4
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/file_import.md +7 -4
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/nfp.md +1 -1
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/state_machine.md +1 -1
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/timeline.md +1 -1
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_impl/implement.md +29 -13
- package/skills/visual-spec-skill/prompts/vspec_new/background.md +383 -0
- package/skills/visual-spec-skill/prompts/vspec_new/functions.md +168 -0
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_new/questions.md +19 -6
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_new/scenarios.md +9 -1
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_plan/estimate.md +2 -2
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_plan/schedule.md +4 -4
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_refine/refine.md +1 -1
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_refine/refine_q.md +15 -2
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_verify/model.md +11 -2
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_verify/prototype.md +254 -32
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_article.md +34 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_big_screen.md +37 -0
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_verify/prototype_calendar.md +1 -1
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_verify/prototype_dashboard.md +17 -0
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_verify/prototype_landing.md +1 -1
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_mobile_agreement.md +30 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_mobile_calendar.md +34 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_mobile_cart.md +51 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_mobile_comprehensive_search.md +65 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_mobile_dashboard.md +34 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_mobile_feed.md +31 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_mobile_payment.md +56 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_mobile_product.md +38 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_mobile_qr.md +33 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_mobile_signature.md +31 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_mobile_video_course.md +40 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_mobile_waterfall.md +30 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_music.md +30 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_order.md +45 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_product_reviews.md +32 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_promotion.md +58 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_quiz.md +58 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_richtext_publish.md +54 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_super_form_builder.md +50 -0
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_verify/prototype_toolbox.md +1 -0
- package/skills/visual-spec-skill/prompts/vspec_verify/prototype_video.md +27 -0
- package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_verify/validation.md +5 -1
- package/.trae/skills/starter-skill/prompts/vspec_new/background.md +0 -76
- package/.trae/skills/starter-skill/prompts/vspec_new/functions.md +0 -82
- package/docs/commands.md +0 -84
- package/docs/concepts.md +0 -36
- package/docs/installation.md +0 -32
- package/docs/structure.md +0 -69
- package/docs/workflows.md +0 -69
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_accept/accept.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_change/change.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/code_rules.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/data_permission.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/decision_matrix.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/expression_tree.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/formula.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/interaction.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/judgemental_matrix.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/logging_matrix.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/mq.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/notification_matrix.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/page_load.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/post_submit_check.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/post_submit_navigation.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/post_submit_processing.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/rbac.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_detail/validation_matrix.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_new/dependencies.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_new/details.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_new/details_boundaries.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_new/details_constraints.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_new/details_pre_post.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_new/details_symmetry.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_new/details_variations.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_new/flows.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_new/roles.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_new/stakeholders.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_new/terms.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-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
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_qc/qc.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_qc/quality_standard.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_test/test.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_upgrade/upgrade.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_verify/prototype_apply.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_verify/prototype_approve.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_verify/prototype_crud.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_verify/prototype_execute.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_verify/prototype_mobile_list.md +0 -0
- /package/{.trae/skills/starter-skill → skills/visual-spec-skill}/prompts/vspec_verify/prototype_tool_pages.md +0 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
## 命令总览
|
|
2
|
+
|
|
3
|
+
| 命令 | 作用 | 主要输入 | 主要输出 |
|
|
4
|
+
| --- | --- | --- | --- |
|
|
5
|
+
| `/vspec:new` | 从原始需求生成第一版规格产物 | 原始需求文本 + 交互式问答 | `/specs/`(original、stakeholders、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`(变更清单 + 最新口径)+ 更新受影响的 `/specs/details/` 与 `/specs/prototypes/` |
|
|
7
|
+
| `/vspec:refine-q` | 将已回答的问题合并回需求并形成新口径 | `/specs/background/original.md` + `/specs/background/questions.md` | 追加到 `/specs/background/original.md`(采纳项 + 变更清单 + 最新口径) |
|
|
8
|
+
| `/vspec:detail` | 展开到“可实现”的单功能详细规格 | `/specs/functions/*` + 支撑产物(background/flows/roles;models 若已存在) | `/specs/details/<function_slug>/*`(RBAC、交互、校验、日志、通知、MQ、导入导出、定时任务等) |
|
|
9
|
+
| `/vspec:verify` | 快速验证:生成模型与可运行原型用于评审 | 现有 `/specs/` 产物(functions + details + roles) | `/specs/models/*.md`、`/specs/prototypes/`(按 `scheme.yaml` 选栈生成可运行原型 + `scenario.html` 评审页) |
|
|
10
|
+
| `/vspec:accept` | 生成验收用例 | functions/scenarios/details/roles/models | `/specs/acceptance/<function_slug>/acceptance_cases.md`、`/specs/acceptance/index.md` |
|
|
11
|
+
| `/vspec:test` | 生成自动化测试代码 | 验收用例 + 仓库测试技术栈 | 写入既有测试目录或 `/tests/` |
|
|
12
|
+
| `/vspec:impl` | 生成后端 + 前端联调实现代码 | specs/details/models/dependencies | 写入集成实现代码(API 合同、后端、前端对接) |
|
|
13
|
+
| `/vspec:upgrade` | 基于遗留材料做升级/重构分析并生成新规格 | `/docs/current/file_list.md` + `/docs/legacy/*`(可选 templates/texts/assets)+ 既有 `/specs/background/original.md`(可选) | 生成/更新 `/specs/`(沿用 `/vspec:new` 结构)+ 同步技术选型到 `/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` | 估算与排期 | functions/roles/flows/dependencies/details | `/specs/plan/plan_estimate.md`、`/specs/plan/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/` 必须存在且非空;否则不执行(避免上游变化但下游未同步)
|
|
31
|
+
- 关键输出:
|
|
32
|
+
- 追加“变更清单 + 最新口径 + 影响分析与产物同步”到 `original.md` 末尾
|
|
33
|
+
- 更新受影响的 `/specs/details/`(优先修改已有文件)与 `/specs/prototypes/`(尽量保持差异最小、可审查)
|
|
34
|
+
|
|
35
|
+
## `/vspec:refine-q`
|
|
36
|
+
|
|
37
|
+
- 适用场景:业务已在 `/specs/background/questions.md` 填写答案,需要合并回需求并形成新口径
|
|
38
|
+
- 关键输出:采纳的 Q&A 项 + 变更清单 + 最新口径
|
|
39
|
+
|
|
40
|
+
## `/vspec:detail`
|
|
41
|
+
|
|
42
|
+
- 适用场景:在设计/实现前,需要把每个功能点展开到“可实现”的规格粒度
|
|
43
|
+
- 关键输出:RBAC 到控件级、数据权限、加载/交互/校验矩阵、提交后处理、日志/通知矩阵、MQ、导入导出、定时任务等
|
|
44
|
+
|
|
45
|
+
## `/vspec:verify`
|
|
46
|
+
|
|
47
|
+
- 适用场景:在 details 已就绪后,尽快验证数据结构与页面形态,降低沟通误差
|
|
48
|
+
- 前置条件:`/specs/details/` 必须存在且非空
|
|
49
|
+
- 关键输出:模型文件(实体拆分/关系/状态机等)、可运行原型、场景评审页
|
|
50
|
+
- UI 规范:生成或复用 `/prototype_ui_convention.md`(与 `/scheme.yaml` 同级),并以其作为唯一口径约束原型 UI 风格与交互
|
|
51
|
+
- Note:执行 `/vspec:verify` 之前务必先审核 `/specs/functions/*` 与 `/specs/details/`,确保覆盖完整;否则原型与模型可能出现功能缺失。
|
|
52
|
+
|
|
53
|
+
## `/vspec:accept`
|
|
54
|
+
|
|
55
|
+
- 适用场景:用“可执行用例”对齐交付与验收
|
|
56
|
+
- 关键输出:每功能点验收用例表,覆盖主流程、异常、边界、RBAC、数据权限
|
|
57
|
+
|
|
58
|
+
## `/vspec:test`
|
|
59
|
+
|
|
60
|
+
- 适用场景:将验收用例转化为可运行的自动化测试(E2E/API/单测)
|
|
61
|
+
- 关键输出:优先复用仓库现有测试框架与脚本,避免引入新依赖
|
|
62
|
+
|
|
63
|
+
## `/vspec:impl`
|
|
64
|
+
|
|
65
|
+
- 适用场景:把规格产物转成可运行的后端 + 前端联调实现
|
|
66
|
+
- 关键输出:API 合同、后端实现、前端页面与 API 对接、RBAC/状态机约束落地
|
|
67
|
+
|
|
68
|
+
## `/vspec:change`
|
|
69
|
+
|
|
70
|
+
- 适用场景:收到明确变更请求,需要可追溯的影响评估与更新
|
|
71
|
+
- 输入:从 `/docs/change/` 读取(可选 `/docs/change/file_list.md` 作为有序输入清单;兼容旧路径 `/docs/changes/`)
|
|
72
|
+
- 更新策略:优先更新受影响模块目录 `/specs/details/<module_slug>/`,并同步 models/functions/prototypes/acceptance 等
|
|
73
|
+
- 更新前快照:若目标仓库是 git 仓库,更新前先做一次快照提交,保证差异可审查
|
|
74
|
+
- 关键输出:结构化变更清单、影响分析表、变更日志以及对应产物更新
|
|
75
|
+
|
|
76
|
+
## `/vspec:upgrade`
|
|
77
|
+
|
|
78
|
+
- 适用场景:基于遗留系统材料做“升级/重构/迁移”分析,继承必要部分并生成新规格
|
|
79
|
+
- 入口清单:`/docs/current/file_list.md`(缺失时生成模板)用于列出输入文件、用途、提取要点、是否必须
|
|
80
|
+
- 输入范围:通常来自 `/docs/legacy/*` 与 `/docs/current/*`,也可组合 `/docs/templates/*`、`/docs/texts/*`、`/docs/assets/*`
|
|
81
|
+
- 关键输出:按 `/vspec:new` 的产物结构生成/更新 `/specs/`,并在功能清单中标注 继承/新增/调整/废弃
|
|
82
|
+
- 技术选型同步:从“系统技术规格”等输入中提取选型并写入 `/scheme.yaml`,供 `/vspec:verify` 与 `/vspec:impl` 使用
|
|
83
|
+
|
|
84
|
+
## `/vspec:plan`
|
|
85
|
+
|
|
86
|
+
- 适用场景:对齐交付节奏,通过故事地图拆解并产出排期
|
|
87
|
+
- 关键输出:故事拆解与估算(人日)、迭代计划、排期页面(HTML)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
## 设计原则
|
|
2
|
+
|
|
3
|
+
### 1. 通过产物协作
|
|
4
|
+
|
|
5
|
+
- 把“讨论”转成“可评审的产物”,降低对齐成本
|
|
6
|
+
- 产物分层演进:原始需求 → 规格(`/specs`)→ 模型(`/specs/models`)→ 原型(`/specs/prototypes`)→ 详情(`/specs/details`)→ 验收/测试/代码
|
|
7
|
+
|
|
8
|
+
### 2. 场景驱动拆解(不是功能堆砌)
|
|
9
|
+
|
|
10
|
+
- 通过节点链(申请/审批/取消/变更/执行开始/执行结束等)覆盖主流程与回滚路径
|
|
11
|
+
- 从场景驱动细节:每个功能点都应映射到“可执行的用户动作 + 可验证的预期结果”
|
|
12
|
+
|
|
13
|
+
### 3. RBAC 与数据权限优先
|
|
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
|
+
- 用验收用例作为研发与 QA 的共同语言
|
|
31
|
+
- 优先复用仓库既有测试框架与目录约定,降低维护成本
|
|
32
|
+
- 生成代码以“最小可审查差异 + 可运行端到端闭环”为目标
|
|
33
|
+
|
|
34
|
+
### 7. 易于变更的需求
|
|
35
|
+
|
|
36
|
+
- 生成的需求文档应可编辑、可阅读、问题易发现、修改成本低,并能快速适配变更
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
## 快速开始
|
|
2
|
+
|
|
3
|
+
本包提供一套由 `/vspec:*` 命令驱动的 Skill 工作流,用于把原始需求转成可评审的交付产物:规格、数据模型、可运行原型、详细设计、验收用例、测试与集成实现输入。
|
|
4
|
+
|
|
5
|
+
### 1. 安装
|
|
6
|
+
|
|
7
|
+
先全局安装 npm 包,再把 Skill 安装到 AI 编辑器的配置目录:
|
|
8
|
+
|
|
9
|
+
- 安装与校验:`installation.md`
|
|
10
|
+
|
|
11
|
+
安装/更新(npm):
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install -g visual-spec
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
安装/更新(pnpm):
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pnpm add -g visual-spec
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
安装/更新(yarn):
|
|
24
|
+
|
|
25
|
+
Yarn Classic:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
yarn global add visual-spec
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Yarn Berry(v2+):
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
yarn dlx -p visual-spec vspec
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 2. 推荐流程
|
|
38
|
+
|
|
39
|
+
- 初始规格:`/vspec:new`
|
|
40
|
+
- 执行过程中会生成开放问题清单(`/specs/background/questions.md`)
|
|
41
|
+
- 在继续流程前,把业务答案填写到该文件
|
|
42
|
+
- 合并 Q&A 到需求口径:`/vspec:refine-q`
|
|
43
|
+
- 详细规格:`/vspec:detail`
|
|
44
|
+
- 快速验证(模型 + 原型):`/vspec:verify`(要求 `/specs/details/` 非空)
|
|
45
|
+
- 验收用例:`/vspec:accept`
|
|
46
|
+
- 集成实现:`/vspec:impl`
|
|
47
|
+
- 自动化测试:`/vspec:test`
|
|
48
|
+
- 变更处理:`/vspec:change`
|
|
49
|
+
- 升级/重构(继承遗留材料):`/vspec:upgrade`
|
|
50
|
+
|
|
51
|
+
### 3. 关键目录
|
|
52
|
+
|
|
53
|
+
- `/docs/`:输入归档(legacy/current/change/refine/templates/texts/assets)
|
|
54
|
+
- `/specs/`:生成产物(background/details/models/prototypes/acceptance 等)
|
|
55
|
+
- `/scheme.yaml`:技术栈与包管理器选择(原型与实现必须遵循)
|
|
56
|
+
|
|
57
|
+
目录结构参考:
|
|
58
|
+
|
|
59
|
+
- `structure.md`
|
|
60
|
+
|
|
61
|
+
下一步:
|
|
62
|
+
|
|
63
|
+
- 阅读 `structure.md`,确认输入放在哪里、输出会生成到哪里
|
|
64
|
+
|
|
65
|
+
### 4. 常见场景
|
|
66
|
+
|
|
67
|
+
#### 补充/澄清(`refine`)
|
|
68
|
+
|
|
69
|
+
- 把补充材料放到 `/docs/refine/`
|
|
70
|
+
- 前置条件:`/specs/details/` 必须存在且非空,否则 `refine` 不执行
|
|
71
|
+
- 运行:`/vspec:refine`
|
|
72
|
+
- 结果:向 `/specs/background/original.md` 追加更新,并同步更新受影响的 `/specs/details/` 与 `/specs/prototypes/`
|
|
73
|
+
|
|
74
|
+
#### 变更(`change`)
|
|
75
|
+
|
|
76
|
+
- 把变更材料放到 `/docs/change/`(可选 `file_list.md`)
|
|
77
|
+
- 运行:`/vspec:change`
|
|
78
|
+
- 结果:做影响分析并更新产物(优先 `/specs/details/<module_slug>/`),同时更新变更日志
|
|
79
|
+
|
|
80
|
+
#### 升级/重构(`upgrade`)
|
|
81
|
+
|
|
82
|
+
- 在 `/docs/current/file_list.md` 中列出输入材料(遗留系统在 `/docs/legacy/`,新增输入在 `/docs/current/`)
|
|
83
|
+
- 运行:`/vspec:upgrade`
|
|
84
|
+
- 结果:生成/更新 `/specs/`,并把技术选型同步到 `/scheme.yaml`
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
## 安装到支持 Skill 的 AI 编辑器
|
|
2
|
+
|
|
3
|
+
本包使用脚本把内置的 Skill 目录复制到你的 AI 编辑器配置目录(Trae / Qwen / Kiro 等)。不同编辑器的配置路径可能不同,但安装逻辑一致:把 `visual-spec-skill` 安装到目标目录的 `skills/` 下。
|
|
4
|
+
|
|
5
|
+
### 前置条件
|
|
6
|
+
|
|
7
|
+
- Node.js >= 14
|
|
8
|
+
|
|
9
|
+
### 安装/更新(npm)
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install -g visual-spec
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### 安装/更新(pnpm)
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pnpm add -g visual-spec
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### 安装/更新(yarn)
|
|
22
|
+
|
|
23
|
+
Yarn Classic:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
yarn global add visual-spec
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Yarn Berry(v2+):
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
yarn dlx -p visual-spec vspec
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 下一步
|
|
36
|
+
|
|
37
|
+
- 快速开始:`getting-started.md`
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
|
|
3
|
+
selected:
|
|
4
|
+
prototype_frontend_stack: vue3_vite_ts_antdv
|
|
5
|
+
prototype_frontend_framework: vue
|
|
6
|
+
prototype_frontend_ui_library: ant-design-vue
|
|
7
|
+
prototype_backend_stack: java17_springboot3
|
|
8
|
+
prototype_database: mysql8
|
|
9
|
+
package_manager: npm
|
|
10
|
+
language: zh-CN
|
|
11
|
+
|
|
12
|
+
prototype_options:
|
|
13
|
+
calendar_view:
|
|
14
|
+
enabled: auto
|
|
15
|
+
view_default: month
|
|
16
|
+
resource_dimension: auto
|
|
17
|
+
|
|
18
|
+
catalog:
|
|
19
|
+
prototype_frontend_stacks:
|
|
20
|
+
- id: vue3_vite_ts_antdv
|
|
21
|
+
name: Vue 3 + Vite + TypeScript + Ant Design Vue
|
|
22
|
+
framework: vue
|
|
23
|
+
framework_version: "3"
|
|
24
|
+
build_tool: vite
|
|
25
|
+
language: typescript
|
|
26
|
+
ui_library: ant-design-vue
|
|
27
|
+
router: vue-router@4
|
|
28
|
+
state: pinia
|
|
29
|
+
http_client: axios
|
|
30
|
+
charting: echarts
|
|
31
|
+
date_library: dayjs
|
|
32
|
+
styling: less
|
|
33
|
+
lint: eslint
|
|
34
|
+
formatter: prettier
|
|
35
|
+
unit_test: vitest
|
|
36
|
+
e2e_test: playwright
|
|
37
|
+
|
|
38
|
+
- id: react18_vite_ts_antd
|
|
39
|
+
name: React 18 + Vite + TypeScript + Ant Design
|
|
40
|
+
framework: react
|
|
41
|
+
framework_version: "18"
|
|
42
|
+
build_tool: vite
|
|
43
|
+
language: typescript
|
|
44
|
+
ui_library: antd
|
|
45
|
+
router: react-router@6
|
|
46
|
+
state: redux-toolkit
|
|
47
|
+
http_client: axios
|
|
48
|
+
charting: echarts-for-react
|
|
49
|
+
date_library: dayjs
|
|
50
|
+
styling: less
|
|
51
|
+
lint: eslint
|
|
52
|
+
formatter: prettier
|
|
53
|
+
unit_test: vitest
|
|
54
|
+
e2e_test: playwright
|
|
55
|
+
|
|
56
|
+
prototype_backend_stacks:
|
|
57
|
+
- id: java17_springboot3
|
|
58
|
+
name: Java 17 + Spring Boot 3
|
|
59
|
+
language: java
|
|
60
|
+
framework: spring-boot
|
|
61
|
+
api_style: rest
|
|
62
|
+
auth: spring-security-jwt
|
|
63
|
+
orm: jpa_or_mybatis
|
|
64
|
+
|
|
65
|
+
- id: node18_nestjs10_ts
|
|
66
|
+
name: Node.js 18 + NestJS 10 + TypeScript
|
|
67
|
+
language: typescript
|
|
68
|
+
framework: nestjs
|
|
69
|
+
api_style: rest
|
|
70
|
+
auth: jwt
|
|
71
|
+
orm: prisma
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# 目录结构
|
|
2
|
+
|
|
3
|
+
本文描述目标项目中使用的目录结构:
|
|
4
|
+
- Skill 生成的 `/specs/` 产物树(需求/设计交付物)
|
|
5
|
+
|
|
6
|
+
## 目标项目布局
|
|
7
|
+
|
|
8
|
+
Skill 会按命令阶段逐步在 `/specs/` 下生成产物,并维护少量项目级配置与输入归档目录。典型目录结构如下:
|
|
9
|
+
|
|
10
|
+
```text
|
|
11
|
+
<your-project>/
|
|
12
|
+
├─ docs/ # 输入归档(/vspec:new 会创建)
|
|
13
|
+
│ ├─ legacy/ # 遗留系统材料(功能、权限、交互、API 等)
|
|
14
|
+
│ ├─ current/ # 本次迭代新增/补充材料(目标、差异、流程、UI 约束等)
|
|
15
|
+
│ │ └─ file_list.md # upgrade 入口清单(/vspec:upgrade 读取/生成)
|
|
16
|
+
│ ├─ change/ # 变更输入(/vspec:change 读取)
|
|
17
|
+
│ │ └─ file_list.md # 可选:有序输入清单
|
|
18
|
+
│ ├─ refine/ # 补充/澄清输入(/vspec:refine 读取)
|
|
19
|
+
│ │ └─ file_list.md # 可选:有序输入清单
|
|
20
|
+
│ ├─ templates/ # 模板(PRD/文案/UI/表格模板,可选)
|
|
21
|
+
│ ├─ texts/ # 文案(提示语、错误信息、协议、消息模板,可选)
|
|
22
|
+
│ └─ assets/ # 静态资源(设计稿、截图、原型图、图片等,可选)
|
|
23
|
+
├─ scheme.yaml # 原型选栈(/vspec:verify 使用;缺失时会生成默认值)
|
|
24
|
+
└─ specs/
|
|
25
|
+
├─ background/ # 背景分析与共享材料
|
|
26
|
+
│ ├─ original.md # 原始需求(或等价输入)
|
|
27
|
+
│ ├─ stakeholders.md # 干系人
|
|
28
|
+
│ ├─ roles.md # 角色与职责
|
|
29
|
+
│ ├─ terms.md # 术语表
|
|
30
|
+
│ ├─ scenarios.md # 场景清单
|
|
31
|
+
│ ├─ scenario_details/ # 场景节点细化:pre_post.md/constraints.md/variations.md/boundaries.md/symmetry.md
|
|
32
|
+
│ ├─ dependencies.md # 外部依赖
|
|
33
|
+
│ └─ questions.md # 开放问题(verify 前必须解决或显式跳过)
|
|
34
|
+
├─ flows/ # 流程图(PlantUML)
|
|
35
|
+
│ └─ *.puml
|
|
36
|
+
├─ functions/ # 功能清单(按模块拆分)
|
|
37
|
+
│ └─ *.md
|
|
38
|
+
├─ details/ # 单功能详细设计(/vspec:detail 输出)
|
|
39
|
+
│ └─ <module_slug>/
|
|
40
|
+
│ ├─ rbac/ # RBAC
|
|
41
|
+
│ ├─ data_permission/ # 数据权限
|
|
42
|
+
│ ├─ page_load/
|
|
43
|
+
│ ├─ interaction/
|
|
44
|
+
│ ├─ validation_matrix/
|
|
45
|
+
│ ├─ logging_matrix/
|
|
46
|
+
│ ├─ notification_matrix/
|
|
47
|
+
│ ├─ mq/
|
|
48
|
+
│ ├─ nfp/ # 非功能:性能/安全/兼容性/韧性/稳定性
|
|
49
|
+
│ ├─ file_import/
|
|
50
|
+
│ ├─ file_export/
|
|
51
|
+
│ └─ cron_job/
|
|
52
|
+
├─ models/ # 数据模型(/vspec:verify 输出)
|
|
53
|
+
│ ├─ *.md
|
|
54
|
+
│ └─ README.md
|
|
55
|
+
├─ prototypes/ # 可运行原型 + 评审页(/vspec:verify 输出)
|
|
56
|
+
│ └─ ...
|
|
57
|
+
├─ acceptance/ # 验收用例(/vspec:accept 输出)
|
|
58
|
+
│ ├─ index.md
|
|
59
|
+
│ └─ ...
|
|
60
|
+
├─ qc_report.md # 质量报告(/vspec:qc 输出)
|
|
61
|
+
├─ plan/ # 规划输出(/vspec:plan 输出)
|
|
62
|
+
│ ├─ plan_estimate.md # 估算
|
|
63
|
+
│ └─ plan_schedule.html # 排期页面
|
|
64
|
+
└─ change_log.md # 变更日志(/vspec:change 输出)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
说明:
|
|
68
|
+
- `docs/`:归档业务输入与交付对齐材料。建议使用 `legacy/current/change/refine/templates/texts/assets` 等子目录,并在文件名中包含来源/版本信息。
|
|
69
|
+
- `scheme.yaml`:选择 `/vspec:verify` 与 `/vspec:impl` 使用的技术栈与选项。读取顺序为项目根目录的 `scheme.yaml` 优先,其次 `/specs/scheme.yaml`。若都不存在则生成默认 `scheme.yaml`。
|
|
70
|
+
|
|
71
|
+
下一步:
|
|
72
|
+
|
|
73
|
+
- 阅读 `commands.md`,了解各 `/vspec:*` 命令的输入、输出与使用场景
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
## 背景
|
|
2
|
+
|
|
3
|
+
原型生成过程中,页面数量与类型会持续增长(Web + Mobile),如果没有统一的 UI 规范,很容易出现:
|
|
4
|
+
|
|
5
|
+
- 同类页面布局不一致(表格/表单/详情)
|
|
6
|
+
- 状态色与状态文案口径不一致
|
|
7
|
+
- Mobile 与 Web 视觉语言割裂
|
|
8
|
+
- 交互方式随意(新建页、页内表单、抽屉/弹窗使用不统一)
|
|
9
|
+
|
|
10
|
+
因此引入统一且可编辑的 UI 规范文件:`/prototype_ui_convention.md`。
|
|
11
|
+
|
|
12
|
+
## 变更点
|
|
13
|
+
|
|
14
|
+
- 新增约束文件:`/prototype_ui_convention.md`(与 `/scheme.yaml` 同级)
|
|
15
|
+
- `/vspec:verify` 生成/更新原型时:
|
|
16
|
+
- 若 `/prototype_ui_convention.md` 不存在:先生成默认模板(不覆盖已存在文件)
|
|
17
|
+
- 原型 UI 生成必须严格遵守 `/prototype_ui_convention.md`
|
|
18
|
+
- 若存在更严格的现有规范(例如 `/docs/current/ui_spec.md` 或 `/docs/current/ui_style.md`):需把更严格的规则合并进 `/prototype_ui_convention.md`,并以合并后的结果作为最终口径
|
|
19
|
+
|
|
20
|
+
## 如何修改 UI 规范
|
|
21
|
+
|
|
22
|
+
- 直接编辑目标项目根目录的 `/prototype_ui_convention.md`
|
|
23
|
+
- 建议只改“口径”,不要写具体实现细节:
|
|
24
|
+
- 色彩与状态映射
|
|
25
|
+
- 表格/表单/详情的通用结构
|
|
26
|
+
- Drawer/Modal 的使用规则
|
|
27
|
+
- 字体与间距(Web/Mobile)
|
|
28
|
+
- 文案与反馈(成功/失败/权限/空态/错误态)
|
|
29
|
+
- 修改完成后重跑 `/vspec:verify`,使生成/更新的页面整体对齐新规范
|
|
30
|
+
|
|
31
|
+
## 不建议的修改
|
|
32
|
+
|
|
33
|
+
- 不建议把规范写成某个页面的特例规则(会破坏整体一致性)
|
|
34
|
+
- 不建议引入新的 UI 组件库(除非项目技术栈明确要求)
|
|
35
|
+
- 不建议在规范中硬编码大量页面级颜色/尺寸(优先抽象为少量全局变量与结构规则)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
## 工作流
|
|
2
|
+
|
|
3
|
+
### 1. 需求分析(`/vspec:new`)
|
|
4
|
+
|
|
5
|
+
- 输入原始需求
|
|
6
|
+
- 回答开放问题(关键假设、范围、规则、依赖)
|
|
7
|
+
- 在 `/specs/` 下得到第一版产物:角色、术语、流程、场景、功能清单、依赖、问题清单
|
|
8
|
+
|
|
9
|
+
### 2. 详细规格(`/vspec:detail`)
|
|
10
|
+
|
|
11
|
+
- 以 `/specs/functions/*` 为输入,在 `/specs/details/<function_slug>/` 下生成单功能规格
|
|
12
|
+
- 目标:把“需求”转成可实现的设计输入:
|
|
13
|
+
- RBAC 到控件级 + 数据权限
|
|
14
|
+
- 加载/交互/校验矩阵
|
|
15
|
+
- 提交后检查/处理/跳转
|
|
16
|
+
- 日志/通知矩阵、MQ、导入导出、定时任务
|
|
17
|
+
|
|
18
|
+
### 3. 方案验证(`/vspec:verify`)
|
|
19
|
+
|
|
20
|
+
- 前置条件:`/specs/details/` 存在且非空
|
|
21
|
+
- 基于 `/specs/`(functions + details + roles)生成:
|
|
22
|
+
- `/specs/models/*.md`:实体与字段、关系、状态机、索引、外部字段来源
|
|
23
|
+
- `/specs/prototypes/`:按 `scheme.yaml` 选栈生成可运行原型,以及 `scenario.html` 场景评审页
|
|
24
|
+
- 目标:尽早暴露理解偏差,尽快收敛到可评审方案
|
|
25
|
+
|
|
26
|
+
可选:分段生成原型
|
|
27
|
+
|
|
28
|
+
- 原型很大或希望按流程更细粒度控制时,可按阶段增量生成:
|
|
29
|
+
- `/vspec:proto-apply`:申请流页面 + 工作台差异
|
|
30
|
+
- `/vspec:proto-approve`:审批流页面 + 工作台差异
|
|
31
|
+
- `/vspec:proto-execute`:执行流页面(包含移动端 `/m/*`)
|
|
32
|
+
- `/vspec:proto-crud`:配置/主数据 CRUD 管理页
|
|
33
|
+
|
|
34
|
+
### 4. 验收用例(`/vspec:accept`)
|
|
35
|
+
|
|
36
|
+
- 在 `/specs/acceptance/` 下生成验收用例
|
|
37
|
+
- 目标:定义验收口径与覆盖范围(主流程、异常、边界、RBAC、数据权限)
|
|
38
|
+
|
|
39
|
+
### 5. 自动化测试(`/vspec:test`)
|
|
40
|
+
|
|
41
|
+
- 读取验收用例与仓库现有测试技术栈
|
|
42
|
+
- 生成最小可运行的一组 E2E/API/单测
|
|
43
|
+
|
|
44
|
+
### 6. 集成实现(`/vspec:impl`)
|
|
45
|
+
|
|
46
|
+
- 读取 specs、details、models、dependencies
|
|
47
|
+
- 按仓库约定生成后端 + 前端联调代码(API 合同 → 后端实现 → 前端对接)
|
|
48
|
+
|
|
49
|
+
### 7. 估算与排期(`/vspec:plan`)
|
|
50
|
+
|
|
51
|
+
- 把功能与场景拆成用户故事,估算工作量,并生成迭代排期
|
|
52
|
+
- 输出:
|
|
53
|
+
- `/specs/plan/plan_estimate.md`
|
|
54
|
+
- `/specs/plan/plan_schedule.html`
|
|
55
|
+
|
|
56
|
+
### 8. 变更处理(`/vspec:change`)
|
|
57
|
+
|
|
58
|
+
- 提供变更输入
|
|
59
|
+
- 输出影响分析与变更日志,并更新受影响的产物与用例
|
|
60
|
+
|
|
61
|
+
## 安装(npm)
|
|
62
|
+
|
|
63
|
+
- 推荐在目标项目根目录安装:`npm install <git-url>`
|
|
64
|
+
- 安装后 Skill 会被复制到:`<your-project>/.trae/skills/visual-spec-skill/`
|
|
65
|
+
- 需要时可手动安装:`npx vspec --force`
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "visual-spec",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "AI skill: visual-spec-skill (/vspec:* commands) for requirement analysis, prototyping, detailing, testing, and planning.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "commonjs",
|
|
7
7
|
"bin": {
|
|
8
|
-
"
|
|
8
|
+
"vspec": "bin/vspec.cjs"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
11
|
"postinstall": "node scripts/postinstall.cjs",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"dry-run": "node scripts/postinstall.cjs --dry-run"
|
|
14
14
|
},
|
|
15
15
|
"files": [
|
|
16
|
-
"
|
|
16
|
+
"skills/visual-spec-skill/",
|
|
17
17
|
"bin/",
|
|
18
18
|
"docs/",
|
|
19
19
|
"scripts/",
|
package/scripts/postinstall.cjs
CHANGED
|
@@ -12,6 +12,8 @@ function parseArgs(argv) {
|
|
|
12
12
|
dryRun: args.has("--dry-run"),
|
|
13
13
|
force: args.has("--force"),
|
|
14
14
|
target: getValue("--target"),
|
|
15
|
+
skillDir: getValue("--skill-dir") || getValue("--target-skill-dir"),
|
|
16
|
+
skillsDir: getValue("--skills-dir") || getValue("--target-skills-dir"),
|
|
15
17
|
};
|
|
16
18
|
}
|
|
17
19
|
|
|
@@ -71,12 +73,20 @@ async function copyDirRecursive(fromDir, toDir) {
|
|
|
71
73
|
}
|
|
72
74
|
|
|
73
75
|
async function main() {
|
|
74
|
-
const { dryRun, force, target } = parseArgs(process.argv.slice(2));
|
|
76
|
+
const { dryRun, force, target, skillDir, skillsDir } = parseArgs(process.argv.slice(2));
|
|
75
77
|
|
|
76
78
|
const packageRoot = path.resolve(__dirname, "..");
|
|
77
|
-
const sourceSkillDir = path.join(packageRoot, "
|
|
79
|
+
const sourceSkillDir = path.join(packageRoot, "skills", "visual-spec-skill");
|
|
78
80
|
const initCwd = target || process.env.INIT_CWD || process.cwd();
|
|
79
|
-
const
|
|
81
|
+
const resolvedSkillsDir =
|
|
82
|
+
skillsDir && path.resolve(initCwd, skillsDir);
|
|
83
|
+
const resolvedSkillDir =
|
|
84
|
+
skillDir && path.resolve(initCwd, skillDir);
|
|
85
|
+
const targetSkillDir =
|
|
86
|
+
resolvedSkillDir ||
|
|
87
|
+
(resolvedSkillsDir
|
|
88
|
+
? path.join(resolvedSkillsDir, "visual-spec-skill")
|
|
89
|
+
: path.join(initCwd, ".trae", "skills", "visual-spec-skill"));
|
|
80
90
|
|
|
81
91
|
if (!(await pathExists(sourceSkillDir))) {
|
|
82
92
|
throw new Error(`Skill source directory not found: ${sourceSkillDir}`);
|
|
@@ -91,7 +101,7 @@ async function main() {
|
|
|
91
101
|
if (dryRun) {
|
|
92
102
|
process.stdout.write(
|
|
93
103
|
[
|
|
94
|
-
"[
|
|
104
|
+
"[vspec] dry-run",
|
|
95
105
|
`- source: ${sourceSkillDir}`,
|
|
96
106
|
`- target: ${targetSkillDir}`,
|
|
97
107
|
].join("\n") + "\n",
|
|
@@ -107,10 +117,10 @@ async function main() {
|
|
|
107
117
|
}
|
|
108
118
|
|
|
109
119
|
await copyDirRecursive(sourceSkillDir, targetSkillDir);
|
|
110
|
-
process.stdout.write(`[
|
|
120
|
+
process.stdout.write(`[vspec] installed to ${targetSkillDir}\n`);
|
|
111
121
|
}
|
|
112
122
|
|
|
113
123
|
main().catch((error) => {
|
|
114
|
-
process.stderr.write(`[
|
|
124
|
+
process.stderr.write(`[vspec] install failed: ${error?.message || error}\n`);
|
|
115
125
|
process.exitCode = 1;
|
|
116
126
|
});
|