visual-spec 0.1.8 → 0.1.9

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 (84) hide show
  1. package/README.md +12 -0
  2. package/docs/en-US/ai-platform-installation.md +39 -0
  3. package/docs/en-US/commands.md +4 -2
  4. package/docs/en-US/getting-started.md +7 -29
  5. package/docs/en-US/installation.md +4 -39
  6. package/docs/en-US/scheme.example.yaml +2 -1
  7. package/docs/en-US/structure.md +2 -3
  8. package/docs/en-US/workflows.md +4 -4
  9. package/docs/ja-JP/ai-platform-installation.md +39 -0
  10. package/docs/ja-JP/commands.md +38 -0
  11. package/docs/ja-JP/concepts.md +35 -0
  12. package/docs/ja-JP/getting-started.md +39 -0
  13. package/docs/ja-JP/installation.md +18 -0
  14. package/docs/ja-JP/scheme.example.yaml +72 -0
  15. package/docs/ja-JP/structure.md +49 -0
  16. package/docs/ja-JP/ui-spec-modification-notes.md +35 -0
  17. package/docs/ja-JP/workflows.md +40 -0
  18. package/docs/zh-CN/ai-platform-installation.md +39 -0
  19. package/docs/zh-CN/commands.md +14 -2
  20. package/docs/zh-CN/getting-started.md +7 -29
  21. package/docs/zh-CN/installation.md +4 -39
  22. package/docs/zh-CN/quality_check.md +33 -0
  23. package/docs/zh-CN/scheme.example.yaml +2 -1
  24. package/docs/zh-CN/structure.md +2 -3
  25. package/docs/zh-CN/workflows.md +28 -4
  26. package/package.json +6 -2
  27. package/scripts/build_skill.cjs +57 -0
  28. package/scripts/transform_quality_standard.py +306 -0
  29. package/skills/visual-spec-skill/SKILL-ja-JP.md +384 -0
  30. package/skills/visual-spec-skill/SKILL-zh-CN.md +56 -2
  31. package/skills/visual-spec-skill/SKILL.md +65 -3
  32. package/skills/visual-spec-skill/prompts/vspec_accept/accept.md +23 -6
  33. package/skills/visual-spec-skill/prompts/vspec_detail/auth.md +6 -2
  34. package/skills/visual-spec-skill/prompts/vspec_detail/code_rules.md +14 -2
  35. package/skills/visual-spec-skill/prompts/vspec_detail/cron_job.md +29 -8
  36. package/skills/visual-spec-skill/prompts/vspec_detail/data_permission.md +4 -0
  37. package/skills/visual-spec-skill/prompts/vspec_detail/decision_matrix.md +20 -4
  38. package/skills/visual-spec-skill/prompts/vspec_detail/expression_tree.md +34 -6
  39. package/skills/visual-spec-skill/prompts/vspec_detail/file_export.md +14 -2
  40. package/skills/visual-spec-skill/prompts/vspec_detail/file_import.md +14 -2
  41. package/skills/visual-spec-skill/prompts/vspec_detail/formula.md +14 -2
  42. package/skills/visual-spec-skill/prompts/vspec_detail/interaction.md +21 -4
  43. package/skills/visual-spec-skill/prompts/vspec_detail/judgemental_matrix.md +22 -4
  44. package/skills/visual-spec-skill/prompts/vspec_detail/logging_matrix.md +14 -3
  45. package/skills/visual-spec-skill/prompts/vspec_detail/mq.md +14 -3
  46. package/skills/visual-spec-skill/prompts/vspec_detail/nfp.md +26 -7
  47. package/skills/visual-spec-skill/prompts/vspec_detail/notification_matrix.md +14 -3
  48. package/skills/visual-spec-skill/prompts/vspec_detail/page_load.md +35 -8
  49. package/skills/visual-spec-skill/prompts/vspec_detail/payment.md +6 -2
  50. package/skills/visual-spec-skill/prompts/vspec_detail/post_submit_check.md +14 -2
  51. package/skills/visual-spec-skill/prompts/vspec_detail/post_submit_navigation.md +15 -3
  52. package/skills/visual-spec-skill/prompts/vspec_detail/post_submit_processing.md +14 -2
  53. package/skills/visual-spec-skill/prompts/vspec_detail/rbac.md +24 -4
  54. package/skills/visual-spec-skill/prompts/vspec_detail/state_machine.md +30 -4
  55. package/skills/visual-spec-skill/prompts/vspec_detail/timeline.md +34 -6
  56. package/skills/visual-spec-skill/prompts/vspec_detail/validation_matrix.md +14 -3
  57. package/skills/visual-spec-skill/prompts/vspec_more_q/more_q.md +82 -0
  58. package/skills/visual-spec-skill/prompts/vspec_mrd/mrd.md +73 -0
  59. package/skills/visual-spec-skill/prompts/vspec_new/background.md +236 -30
  60. package/skills/visual-spec-skill/prompts/vspec_new/dependencies.md +28 -6
  61. package/skills/visual-spec-skill/prompts/vspec_new/details_boundaries.md +17 -7
  62. package/skills/visual-spec-skill/prompts/vspec_new/details_constraints.md +17 -7
  63. package/skills/visual-spec-skill/prompts/vspec_new/details_pre_post.md +32 -17
  64. package/skills/visual-spec-skill/prompts/vspec_new/details_symmetry.md +17 -7
  65. package/skills/visual-spec-skill/prompts/vspec_new/details_variations.md +17 -7
  66. package/skills/visual-spec-skill/prompts/vspec_new/flows.md +4 -0
  67. package/skills/visual-spec-skill/prompts/vspec_new/functions.md +18 -3
  68. package/skills/visual-spec-skill/prompts/vspec_new/questions.md +30 -2
  69. package/skills/visual-spec-skill/prompts/vspec_new/roles.md +20 -4
  70. package/skills/visual-spec-skill/prompts/vspec_new/scenarios.md +9 -2
  71. package/skills/visual-spec-skill/prompts/vspec_new/stakeholders.md +21 -5
  72. package/skills/visual-spec-skill/prompts/vspec_new/terms.md +21 -6
  73. package/skills/visual-spec-skill/prompts/vspec_plan/estimate.md +95 -9
  74. package/skills/visual-spec-skill/prompts/vspec_plan/schedule.md +36 -3
  75. package/skills/visual-spec-skill/prompts/vspec_qc/qc.md +17 -3
  76. package/skills/visual-spec-skill/prompts/vspec_qc/quality_standard.md +769 -26
  77. package/skills/visual-spec-skill/prompts/vspec_refine/refine.md +48 -23
  78. package/skills/visual-spec-skill/prompts/vspec_refine/refine_q.md +47 -20
  79. package/skills/visual-spec-skill/prompts/vspec_test/test.md +4 -0
  80. package/skills/visual-spec-skill/prompts/vspec_upgrade/upgrade.md +13 -2
  81. package/skills/visual-spec-skill/prompts/vspec_verify/model.md +49 -24
  82. package/skills/visual-spec-skill/prompts/vspec_verify/prototype.md +9 -1
  83. package/skills/visual-spec-skill/prompts/vspec_verify/prototype_calendar.md +16 -4
  84. /package/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
@@ -0,0 +1,306 @@
1
+ import re
2
+ from pathlib import Path
3
+
4
+
5
+ def parse_md(text: str):
6
+ heading_re = re.compile(r"^####\s+(\d+)\.\s+(.*)\s*$")
7
+ lines = text.splitlines()
8
+ preamble = []
9
+ sections = []
10
+ cur = None
11
+
12
+ for ln in lines:
13
+ m = heading_re.match(ln)
14
+ if m:
15
+ if cur is not None:
16
+ sections.append(cur)
17
+ cur = {"num": int(m.group(1)), "title": m.group(2).strip(), "raw": []}
18
+ continue
19
+ if cur is None:
20
+ preamble.append(ln)
21
+ else:
22
+ cur["raw"].append(ln)
23
+
24
+ if cur is not None:
25
+ sections.append(cur)
26
+
27
+ return preamble, sections
28
+
29
+
30
+ def extract_fields(raw_lines):
31
+ fields = {}
32
+ passthrough = []
33
+ for ln in raw_lines:
34
+ s = ln.strip()
35
+ if s.startswith("- "):
36
+ body = s[2:]
37
+ if ":" in body:
38
+ k, v = body.split(":", 1)
39
+ k = k.strip()
40
+ v = v.strip()
41
+ if not k or not v:
42
+ continue
43
+ if k in fields and v not in fields[k]:
44
+ fields[k] = fields[k] + ";" + v
45
+ else:
46
+ fields.setdefault(k, v)
47
+ else:
48
+ if body.strip():
49
+ passthrough.append(body.strip())
50
+ else:
51
+ if s:
52
+ passthrough.append(ln)
53
+ return fields, passthrough
54
+
55
+
56
+ def join_nonempty(parts):
57
+ out = []
58
+ for p in parts:
59
+ if p is None:
60
+ continue
61
+ s = str(p).strip()
62
+ if s:
63
+ out.append(s)
64
+ return ";".join(out)
65
+
66
+
67
+ def ensure(fields, key, value):
68
+ if not (fields.get(key) or "").strip():
69
+ fields[key] = value
70
+
71
+
72
+ def infer_title(fields):
73
+ for k in ("问题描述", "错误问题示例", "解决方案", "解决方案示例", "关键词", "问题分类"):
74
+ v = (fields.get(k) or "").strip()
75
+ if v:
76
+ return v[:40]
77
+ return "规则"
78
+
79
+
80
+ def merge_section_into(target_fields, sources, into_key, prefix=None):
81
+ additions = []
82
+ for src in sources:
83
+ if src is None:
84
+ continue
85
+ sf, sp = extract_fields(src["raw"])
86
+ for k in ("解决方案示例", "解决方案", "问题描述", "错误问题示例"):
87
+ if (sf.get(k) or "").strip():
88
+ additions.append(sf[k])
89
+ for x in sp:
90
+ if str(x).strip():
91
+ additions.append(str(x).strip())
92
+ if not additions:
93
+ return
94
+ base = (target_fields.get(into_key) or "").strip()
95
+ addon = join_nonempty(additions)
96
+ if prefix:
97
+ addon = prefix + addon
98
+ target_fields[into_key] = join_nonempty([base, addon]) if base else addon
99
+
100
+
101
+ def set_fields(section, fields):
102
+ ordered = [
103
+ "问题分类",
104
+ "英文1",
105
+ "英文2",
106
+ "英文标识",
107
+ "关键词",
108
+ "补充说明",
109
+ "问题描述",
110
+ "错误问题示例",
111
+ "解决方案",
112
+ "解决方案示例",
113
+ "方案收益",
114
+ "应用场景",
115
+ "关联质量标准",
116
+ ]
117
+ raw = []
118
+ for k in ordered:
119
+ v = (fields.get(k) or "").strip()
120
+ if v:
121
+ raw.append(f"- {k}:{v}")
122
+ for k in sorted(fields.keys()):
123
+ if k in ordered:
124
+ continue
125
+ v = (fields.get(k) or "").strip()
126
+ if v:
127
+ raw.append(f"- {k}:{v}")
128
+ section["raw"] = raw
129
+
130
+
131
+ def transform(md_path: Path):
132
+ preamble, sections = parse_md(md_path.read_text(encoding="utf-8"))
133
+ by_num = {s["num"]: s for s in sections}
134
+
135
+ remove_nums = {58, 104, 35, 36, 37, 64, 65, 67, 68, 69, 87}
136
+
137
+ kept = []
138
+ for s in sections:
139
+ if s["num"] in remove_nums:
140
+ continue
141
+ f, _ = extract_fields(s["raw"])
142
+ if s["title"].strip() == "Rule" and not f:
143
+ continue
144
+ kept.append(s)
145
+
146
+ def idx_after(num):
147
+ for i, s in enumerate(kept):
148
+ if s["num"] == num:
149
+ return i + 1
150
+ return None
151
+
152
+ insert_idx = idx_after(47)
153
+ if insert_idx is not None:
154
+ extra = [
155
+ {
156
+ "num": -1,
157
+ "title": "数量上下限(含0/负数/超大值)",
158
+ "raw": [
159
+ "- 问题分类:上下限遗漏",
160
+ "- 关键词:数量上限/下限/0值/负数",
161
+ "- 问题描述:数量字段若未定义最小值、最大值与边界口径(是否允许0、是否允许负数、是否允许小数),会导致业务漏洞或系统异常。",
162
+ "- 错误问题示例:购买数量未限制导致一次下单999999;数量允许0导致生成空订单;负数导致库存回补异常。",
163
+ "- 解决方案:为每个数量类字段定义:最小值/最大值/步进(整数或小数)、单位、边界是否包含、超限时提示与后端兜底;对导入/批量接口同样生效。",
164
+ "- 解决方案示例:示例:qty 为整数,1<=qty<=999;超限返回错误码并提示“数量范围为1-999”;导入逐行校验并输出失败明细。",
165
+ "- 方案收益:避免刷单/超限/数据污染,提升稳定性与可控性。",
166
+ "- 应用场景:数量、份数、次数、库存变更、票数、积分变动等所有计数量字段。",
167
+ "- 关联质量标准:精确性",
168
+ ],
169
+ },
170
+ {
171
+ "num": -1,
172
+ "title": "距离/范围上下限(配送/定位/围栏等)",
173
+ "raw": [
174
+ "- 问题分类:上下限遗漏",
175
+ "- 关键词:距离上限/下限/范围口径",
176
+ "- 问题描述:距离/范围字段若未定义上限、下限、单位与计算口径,会导致错误计费、不可达订单或性能问题。",
177
+ "- 错误问题示例:配送半径未限制导致生成不可配送订单;距离单位混用(米/公里)导致计费错误。",
178
+ "- 解决方案:明确单位(m/km)、计算口径(直线/路径)、上限下限与舍入规则,并定义超限处理(提示/禁止下单/降级到人工确认)。",
179
+ "- 解决方案示例:示例:delivery_radius_km 0<r<=30;distance_km 取1位小数四舍五入;超出30km不允许下单并提示。",
180
+ "- 方案收益:避免业务不可达与计费纠纷,提升体验与可运营性。",
181
+ "- 应用场景:配送、网点服务范围、定位打卡、围栏、里程计费等。",
182
+ "- 关联质量标准:精确性",
183
+ ],
184
+ },
185
+ {
186
+ "num": -1,
187
+ "title": "年龄上下限(未成年人/合规)",
188
+ "raw": [
189
+ "- 问题分类:上下限遗漏",
190
+ "- 关键词:年龄下限/上限/生日口径",
191
+ "- 问题描述:年龄规则若未明确计算口径与边界(按生日/自然日/时区),会导致合规风险与错误放行/拦截。",
192
+ "- 错误问题示例:未限制未成年人注册;生日当天是否满18岁口径不一致导致审核争议。",
193
+ "- 解决方案:明确年龄计算:以哪个字段为生日、以哪个时区判断、边界是否包含;规定允许范围与异常处理(缺失生日/不可解析)。",
194
+ "- 解决方案示例:示例:合规判定用“是否已到18周岁生日当天(含)”;缺失生日不允许通过并提示补全。",
195
+ "- 方案收益:降低合规风险,保证判定一致与可验收。",
196
+ "- 应用场景:注册、内容分级、支付、考试、未成年人保护等。",
197
+ "- 关联质量标准:精确性",
198
+ ],
199
+ },
200
+ ]
201
+ kept[insert_idx:insert_idx] = extra
202
+
203
+ by_num2 = {s["num"]: s for s in kept}
204
+
205
+ if 34 in by_num2:
206
+ tgt = by_num2[34]
207
+ f, _ = extract_fields(tgt["raw"])
208
+ merge_section_into(
209
+ f,
210
+ [by_num.get(35), by_num.get(36), by_num.get(37)],
211
+ "解决方案示例",
212
+ prefix="补充:",
213
+ )
214
+ ensure(f, "问题分类", "权限遗漏")
215
+ ensure(f, "关键词", "RBAC/组织权限/数据权限/状态权限")
216
+ ensure(
217
+ f,
218
+ "解决方案",
219
+ "采用权限矩阵体系化覆盖:控件级 RBAC + 组织结构权限 + 数据权限 + 状态权限(可操作性矩阵),并明确入口权限与条件。",
220
+ )
221
+ ensure(
222
+ f,
223
+ "解决方案示例",
224
+ "示例:RBAC(页面区域/控件权限矩阵 + 路由/菜单入口权限);组织结构权限(按组织层级/岗位/部门的可见与可操作范围);数据权限(行/列/范围矩阵 + 过滤口径);状态权限(决策矩阵:操作×状态)。",
225
+ )
226
+ ensure(f, "方案收益", "避免越权与权限遗漏导致的线上风险,减少返工与联调问题。")
227
+ ensure(f, "应用场景", "任何需要权限控制(菜单/路由/控件/数据范围/状态机操作)的功能。")
228
+ ensure(f, "关联质量标准", "完整性")
229
+ set_fields(tgt, f)
230
+
231
+ if 63 in by_num2:
232
+ tgt = by_num2[63]
233
+ f, _ = extract_fields(tgt["raw"])
234
+ merge_section_into(f, [by_num.get(64), by_num.get(65)], "解决方案示例", prefix="补充:")
235
+ ensure(
236
+ f,
237
+ "解决方案示例",
238
+ "示例:将独占条件单独拆出;按处理阶段/属性拆分为多个小矩阵;把公共前置条件提升为“先决条件”避免在矩阵中重复。",
239
+ )
240
+ set_fields(tgt, f)
241
+
242
+ if 66 in by_num2:
243
+ tgt = by_num2[66]
244
+ f, _ = extract_fields(tgt["raw"])
245
+ merge_section_into(
246
+ f,
247
+ [by_num.get(67), by_num.get(68), by_num.get(69)],
248
+ "解决方案示例",
249
+ prefix="补充:",
250
+ )
251
+ ensure(
252
+ f,
253
+ "解决方案示例",
254
+ "示例:表达式树/判定矩阵/流程图替代深层缩进;或按判定条件拆分成多个矩阵以提升可读性。",
255
+ )
256
+ set_fields(tgt, f)
257
+
258
+ if 86 in by_num2:
259
+ tgt = by_num2[86]
260
+ f, _ = extract_fields(tgt["raw"])
261
+ merge_section_into(f, [by_num.get(87)], "错误问题示例", prefix="补充:")
262
+ ensure(
263
+ f,
264
+ "解决方案",
265
+ "优先遵循业界/国际/国家规范(RFC/ISO/国家标准等),在需求中给出规范链接、适用范围、边界与示例;若需自定义,必须说明偏离原因与兼容策略。",
266
+ )
267
+ ensure(
268
+ f,
269
+ "解决方案示例",
270
+ "示例:手机号/国际电话采用 E.164;邮箱采用 RFC 5322 子集;日期时间采用 ISO 8601;金额精度与舍入规则统一。",
271
+ )
272
+ ensure(f, "方案收益", "避免“自创规则”导致的兼容性问题、数据污染与线上故障。")
273
+ ensure(f, "应用场景", "格式校验、编号/编码、时间口径、对接协议、加密/签名等存在成熟标准的场景。")
274
+ set_fields(tgt, f)
275
+
276
+ for s in kept:
277
+ f, _ = extract_fields(s["raw"])
278
+ if s["title"].strip() == "Rule":
279
+ s["title"] = infer_title(f)
280
+ ensure(f, "问题描述", s["title"][:80])
281
+ ensure(f, "解决方案", "补充明确规则与边界条件,并给出可验收的示例与异常处理口径,避免实现与验收产生歧义。")
282
+ ensure(f, "方案收益", "减少歧义与遗漏,提升实现正确性与验收一致性。")
283
+ ensure(f, "应用场景", "需求分析与方案设计阶段,存在同类问题风险时。")
284
+ set_fields(s, f)
285
+
286
+ n = 1
287
+ for s in kept:
288
+ s["num"] = n
289
+ n += 1
290
+
291
+ out = []
292
+ out.extend(preamble)
293
+ while out and out[-1].strip() == "":
294
+ out.pop()
295
+ out.append("")
296
+ for s in kept:
297
+ out.append(f"#### {s['num']}. {s['title']}")
298
+ out.extend(s["raw"])
299
+ out.append("")
300
+
301
+ md_path.write_text("\n".join(out).rstrip("\n") + "\n", encoding="utf-8")
302
+
303
+
304
+ if __name__ == "__main__":
305
+ transform(Path("skills/visual-spec-skill/prompts/vspec_qc/quality_standard.md"))
306
+