speccore 8.3.332 → 8.3.340
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/.agents/skills/spec-ask/SKILL.md +4 -0
- package/.agents/skills/spec-unitize/SKILL.md +9 -1
- package/.agents/skills/speccore-router/SKILL.md +12 -9
- package/dist/cli.js +63 -19
- package/dist/cli.js.map +1 -1
- package/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +6 -0
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +10 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doc2spec.d.ts +44 -1
- package/dist/commands/doc2spec.d.ts.map +1 -1
- package/dist/commands/doc2spec.js +257 -5
- package/dist/commands/doc2spec.js.map +1 -1
- package/dist/commands/execute.js +116 -64
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/help.js +1 -0
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +71 -40
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/iteration/create.d.ts.map +1 -1
- package/dist/commands/iteration/create.js +72 -10
- package/dist/commands/iteration/create.js.map +1 -1
- package/dist/commands/iteration/taskify.d.ts.map +1 -1
- package/dist/commands/iteration/taskify.js +133 -35
- package/dist/commands/iteration/taskify.js.map +1 -1
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +26 -2
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/prompts.d.ts +6 -0
- package/dist/commands/prompts.d.ts.map +1 -1
- package/dist/commands/prompts.js +19 -10
- package/dist/commands/prompts.js.map +1 -1
- package/dist/commands/status-panel.d.ts.map +1 -1
- package/dist/commands/status-panel.js +23 -34
- package/dist/commands/status-panel.js.map +1 -1
- package/dist/commands/unitize.d.ts +3 -0
- package/dist/commands/unitize.d.ts.map +1 -1
- package/dist/commands/unitize.js +32 -9
- package/dist/commands/unitize.js.map +1 -1
- package/dist/commands/welcome.d.ts.map +1 -1
- package/dist/commands/welcome.js +41 -0
- package/dist/commands/welcome.js.map +1 -1
- package/dist/core/ask-context.d.ts.map +1 -1
- package/dist/core/ask-context.js +14 -3
- package/dist/core/ask-context.js.map +1 -1
- package/dist/core/ask-engine.d.ts.map +1 -1
- package/dist/core/ask-engine.js +39 -7
- package/dist/core/ask-engine.js.map +1 -1
- package/dist/core/environment-config.d.ts +11 -0
- package/dist/core/environment-config.d.ts.map +1 -1
- package/dist/core/environment-config.js +22 -0
- package/dist/core/environment-config.js.map +1 -1
- package/dist/core/git-integration.d.ts +1 -9
- package/dist/core/git-integration.d.ts.map +1 -1
- package/dist/core/git-integration.js +126 -12
- package/dist/core/git-integration.js.map +1 -1
- package/dist/core/global-knowledge.d.ts.map +1 -1
- package/dist/core/global-knowledge.js +24 -10
- package/dist/core/global-knowledge.js.map +1 -1
- package/dist/core/handoff-generator.d.ts.map +1 -1
- package/dist/core/handoff-generator.js +3 -1
- package/dist/core/handoff-generator.js.map +1 -1
- package/dist/core/intent-recognition.d.ts.map +1 -1
- package/dist/core/intent-recognition.js +63 -5
- package/dist/core/intent-recognition.js.map +1 -1
- package/dist/core/knowledge-graph.d.ts.map +1 -1
- package/dist/core/knowledge-graph.js +6 -4
- package/dist/core/knowledge-graph.js.map +1 -1
- package/dist/core/name-validator.d.ts.map +1 -1
- package/dist/core/name-validator.js +41 -20
- package/dist/core/name-validator.js.map +1 -1
- package/dist/core/pinyin-initials.d.ts +10 -0
- package/dist/core/pinyin-initials.d.ts.map +1 -0
- package/dist/core/pinyin-initials.js +44 -0
- package/dist/core/pinyin-initials.js.map +1 -0
- package/dist/core/reindex-engine.js +4 -4
- package/dist/core/reindex-engine.js.map +1 -1
- package/dist/core/skeleton-residue.d.ts +13 -0
- package/dist/core/skeleton-residue.d.ts.map +1 -1
- package/dist/core/skeleton-residue.js +83 -14
- package/dist/core/skeleton-residue.js.map +1 -1
- package/dist/core/spec-merger.d.ts.map +1 -1
- package/dist/core/spec-merger.js +3 -2
- package/dist/core/spec-merger.js.map +1 -1
- package/dist/core/state.d.ts +10 -0
- package/dist/core/state.d.ts.map +1 -1
- package/dist/core/state.js +20 -1
- package/dist/core/state.js.map +1 -1
- package/dist/core/task-paths.d.ts +12 -0
- package/dist/core/task-paths.d.ts.map +1 -1
- package/dist/core/task-paths.js +33 -1
- package/dist/core/task-paths.js.map +1 -1
- package/dist/core/unified-config.d.ts +7 -1
- package/dist/core/unified-config.d.ts.map +1 -1
- package/dist/core/unified-config.js +41 -2
- package/dist/core/unified-config.js.map +1 -1
- package/dist/core/unit-staffing.d.ts +21 -4
- package/dist/core/unit-staffing.d.ts.map +1 -1
- package/dist/core/unit-staffing.js +59 -12
- package/dist/core/unit-staffing.js.map +1 -1
- package/dist/core/validator.d.ts.map +1 -1
- package/dist/core/validator.js +45 -5
- package/dist/core/validator.js.map +1 -1
- package/dist/core/verify-report-aggregator.d.ts.map +1 -1
- package/dist/core/verify-report-aggregator.js +19 -2
- package/dist/core/verify-report-aggregator.js.map +1 -1
- package/dist/utils/task-utils.d.ts +4 -1
- package/dist/utils/task-utils.d.ts.map +1 -1
- package/dist/utils/task-utils.js +30 -4
- package/dist/utils/task-utils.js.map +1 -1
- package/package.json +4 -3
- package/templates/ci/github-actions.yml +1 -1
- package/templates/deploy-examples.yaml +33 -5
- package/templates/html/speccore-ask-explain.html +1 -1
- package/templates/html/speccore-ask-guide.html +1 -1
- package/templates/html/speccore-ask-match.html +1 -1
- package/templates/html/speccore-ask-pipeline.html +1 -1
- package/templates/html/speccore-ask-result.html +1 -1
- package/templates/html/speccore-help.html +2 -2
- package/templates/speccore-yml-example.yml +170 -50
- package/templates/verify-spec-example.yaml +66 -1
|
@@ -15,32 +15,76 @@
|
|
|
15
15
|
# v8.3.95+ 支持: cookie / localStorage / script / scroll / upload / iframe / waitForRequest / waitForResponse
|
|
16
16
|
# v8.3.294+ 推荐: 选择器优先用 data-testid(UI_SPEC 元素标识约定 {模块}-{页面}-{元素}),
|
|
17
17
|
# 冒烟装配四阶段会自动从 UI_SPEC 提取元素清单生成场景,失败时输出自愈提示。
|
|
18
|
+
#
|
|
19
|
+
# ═══════════════════════════════════════════════════════════
|
|
20
|
+
# 顶层字段字典
|
|
21
|
+
# ═══════════════════════════════════════════════════════════
|
|
22
|
+
# name → 测试套件名(报告展示用)
|
|
23
|
+
# platform → 端名(须与 CONSTITUTION.md 端列表一致)
|
|
24
|
+
# url → 站点根路径(相对路由前缀,navigate 时与 value 拼接)
|
|
25
|
+
# scenarios → 场景列表(每个场景 = 若干 action + 若干 assertion)
|
|
26
|
+
#
|
|
27
|
+
# ═══════════════════════════════════════════════════════════
|
|
28
|
+
# actions 类型字典(场景内按顺序执行的操作)
|
|
29
|
+
# ═══════════════════════════════════════════════════════════
|
|
30
|
+
# navigate → 页面跳转,value=路由(如 /login),selector=完整 URL
|
|
31
|
+
# fill → 输入文本,selector=选择器,value=输入值
|
|
32
|
+
# click → 点击元素,selector=选择器,waitFor=点击后等待出现的元素
|
|
33
|
+
# cookie → 注入登录态 Cookie(selector=键名,value=值,domain/path/secure/httpOnly 可选)
|
|
34
|
+
# localStorage → 注入 Token(selector=键名,value=值,免登录走受保护页面)
|
|
35
|
+
# wait → 等待,delay=毫秒数
|
|
36
|
+
# scroll → 滚动页面,selector=bottom(滚到底)或元素选择器
|
|
37
|
+
# upload → 上传文件,selector=文件输入框,value=文件路径
|
|
38
|
+
# script → 执行 JS 脚本,value=脚本内容(返回 Promise 可等待)
|
|
39
|
+
# iframe → 切换到 iframe 内操作(配合 selector 定位 iframe)
|
|
40
|
+
# waitForRequest → 等待网络请求,value=URL 片段
|
|
41
|
+
# waitForResponse → 等待网络响应,value=URL 片段
|
|
42
|
+
#
|
|
43
|
+
# ═══════════════════════════════════════════════════════════
|
|
44
|
+
# assertions 类型字典(场景结束后逐条校验的结果断言)
|
|
45
|
+
# ═══════════════════════════════════════════════════════════
|
|
46
|
+
# url → 当前 URL 校验,contains=期望包含的片段
|
|
47
|
+
# visible → 元素可见性,selector=选择器(存在且可见才通过)
|
|
48
|
+
# text → 文本内容,selector=选择器,contains=期望包含的文字
|
|
49
|
+
# count → 元素数量,selector=选择器,count=期望个数
|
|
50
|
+
# style → 样式校验,selector=选择器,style=属性名(如 background-color),value=期望值
|
|
51
|
+
# ═══════════════════════════════════════════════════════════
|
|
18
52
|
|
|
53
|
+
# name: 测试套件名(报告展示用)
|
|
19
54
|
name: 示例项目冒烟测试
|
|
55
|
+
# platform: 端名(须与 CONSTITUTION.md 端列表一致)
|
|
20
56
|
platform: h5-mobile
|
|
57
|
+
# url: 站点根路径(navigate 相对路由的前缀)
|
|
21
58
|
url: /
|
|
22
59
|
|
|
23
60
|
scenarios:
|
|
61
|
+
# ══ 场景字段:name=场景名 | description=模块归属(模块:xxx 页面:/yyy,供 --module 过滤)══
|
|
24
62
|
# ── 场景1: 登录流程(data-testid 选择器,推荐)──
|
|
25
63
|
# 登录态也可由 environments 配置的 tests.auth 自动装配(v8.3.215+),
|
|
26
64
|
# 本场景演示手工登录写法;受保护页面免登录可用 cookie/localStorage 注入(见场景2/3)。
|
|
27
65
|
- name: 登录-账号密码登录
|
|
28
66
|
description: 模块:auth 页面:/login
|
|
29
67
|
actions:
|
|
68
|
+
# 跳转到登录页
|
|
30
69
|
- type: navigate
|
|
31
70
|
value: /login
|
|
71
|
+
# 填充用户名
|
|
32
72
|
- type: fill
|
|
33
73
|
selector: "[data-testid='login-username-input']"
|
|
34
74
|
value: test_user
|
|
75
|
+
# 填充密码
|
|
35
76
|
- type: fill
|
|
36
77
|
selector: "[data-testid='login-password-input']"
|
|
37
78
|
value: test_password
|
|
79
|
+
# 点击登录按钮,waitFor=点击后等待仪表盘出现(元素未出现则超时失败)
|
|
38
80
|
- type: click
|
|
39
81
|
selector: "[data-testid='login-submit-btn']"
|
|
40
82
|
waitFor: "[data-testid='dashboard-page']"
|
|
41
83
|
assertions:
|
|
84
|
+
# URL 断言:登录成功后跳转到 /dashboard
|
|
42
85
|
- type: url
|
|
43
86
|
contains: /dashboard
|
|
87
|
+
# 可见性断言:仪表盘元素存在且可见
|
|
44
88
|
- type: visible
|
|
45
89
|
selector: "[data-testid='dashboard-page']"
|
|
46
90
|
|
|
@@ -49,7 +93,7 @@ scenarios:
|
|
|
49
93
|
- name: 预订列表-免登录(cookie注入)
|
|
50
94
|
description: 模块:booking 页面:/booking/list
|
|
51
95
|
actions:
|
|
52
|
-
# 注入登录 Cookie
|
|
96
|
+
# 注入登录 Cookie(跳过登录页;secure/httpOnly 按真实 Cookie 属性填)
|
|
53
97
|
- type: cookie
|
|
54
98
|
selector: session_token
|
|
55
99
|
value: eyJhbGciOiJIUzI1NiIs...
|
|
@@ -57,13 +101,17 @@ scenarios:
|
|
|
57
101
|
path: /
|
|
58
102
|
secure: true
|
|
59
103
|
httpOnly: true
|
|
104
|
+
# 进入受保护页面(免登录)
|
|
60
105
|
- type: navigate
|
|
61
106
|
value: /booking/list
|
|
107
|
+
# 等待页面渲染(delay=毫秒)
|
|
62
108
|
- type: wait
|
|
63
109
|
delay: 1000
|
|
64
110
|
assertions:
|
|
111
|
+
# 列表容器可见
|
|
65
112
|
- type: visible
|
|
66
113
|
selector: '.booking-list'
|
|
114
|
+
# 数量断言:列表项恰好 5 个
|
|
67
115
|
- type: count
|
|
68
116
|
selector: '.booking-item'
|
|
69
117
|
count: 5
|
|
@@ -73,16 +121,20 @@ scenarios:
|
|
|
73
121
|
- name: 个人中心-Token注入
|
|
74
122
|
description: 模块:user 页面:/profile
|
|
75
123
|
actions:
|
|
124
|
+
# localStorage 注入 JWT Token(适用于 Token 存 localStorage 的前端)
|
|
76
125
|
- type: localStorage
|
|
77
126
|
selector: accessToken
|
|
78
127
|
value: Bearer eyJhbGciOiJIUzI1NiIs...
|
|
128
|
+
# 进入个人中心页(免登录)
|
|
79
129
|
- type: navigate
|
|
80
130
|
value: /profile
|
|
81
131
|
- type: wait
|
|
82
132
|
delay: 500
|
|
83
133
|
assertions:
|
|
134
|
+
# 页面容器可见
|
|
84
135
|
- type: visible
|
|
85
136
|
selector: '.profile-header'
|
|
137
|
+
# 文本断言:用户名渲染为 test_user
|
|
86
138
|
- type: text
|
|
87
139
|
selector: '.username'
|
|
88
140
|
contains: test_user
|
|
@@ -92,25 +144,33 @@ scenarios:
|
|
|
92
144
|
- name: 预订表单-提交预订
|
|
93
145
|
description: 模块:booking 页面:/booking/create
|
|
94
146
|
actions:
|
|
147
|
+
# 打开预订创建页
|
|
95
148
|
- type: navigate
|
|
96
149
|
value: /booking/create
|
|
150
|
+
# 填写入住日期
|
|
97
151
|
- type: fill
|
|
98
152
|
selector: 'input[name="checkIn"]'
|
|
99
153
|
value: '2026-10-01'
|
|
154
|
+
# 填写退房日期
|
|
100
155
|
- type: fill
|
|
101
156
|
selector: 'input[name="checkOut"]'
|
|
102
157
|
value: '2026-10-05'
|
|
158
|
+
# 点击搜索,等待房型列表出现
|
|
103
159
|
- type: click
|
|
104
160
|
selector: '.search-btn'
|
|
105
161
|
waitFor: '.room-list'
|
|
162
|
+
# 选择第一个房型
|
|
106
163
|
- type: click
|
|
107
164
|
selector: '.room-item:first-child .select-btn'
|
|
165
|
+
# 提交预订,等待成功提示出现
|
|
108
166
|
- type: click
|
|
109
167
|
selector: '.submit-booking-btn'
|
|
110
168
|
waitFor: '.booking-success'
|
|
111
169
|
assertions:
|
|
170
|
+
# 成功提示可见
|
|
112
171
|
- type: visible
|
|
113
172
|
selector: '.booking-success'
|
|
173
|
+
# 文本断言:提示文案包含「预订成功」
|
|
114
174
|
- type: text
|
|
115
175
|
selector: '.booking-success'
|
|
116
176
|
contains: 预订成功
|
|
@@ -119,13 +179,16 @@ scenarios:
|
|
|
119
179
|
- name: 首页-滚动加载
|
|
120
180
|
description: 模块:home 页面:/
|
|
121
181
|
actions:
|
|
182
|
+
# 打开首页
|
|
122
183
|
- type: navigate
|
|
123
184
|
value: /
|
|
185
|
+
# 滚动到底部(触发无限加载)
|
|
124
186
|
- type: scroll
|
|
125
187
|
selector: bottom
|
|
126
188
|
- type: wait
|
|
127
189
|
delay: 1000
|
|
128
190
|
assertions:
|
|
191
|
+
# 页脚可见(滚动加载完成)
|
|
129
192
|
- type: visible
|
|
130
193
|
selector: '.footer'
|
|
131
194
|
|
|
@@ -133,9 +196,11 @@ scenarios:
|
|
|
133
196
|
- name: 按钮-样式检查
|
|
134
197
|
description: 模块:ui 页面:/
|
|
135
198
|
actions:
|
|
199
|
+
# 打开首页
|
|
136
200
|
- type: navigate
|
|
137
201
|
value: /
|
|
138
202
|
assertions:
|
|
203
|
+
# 样式断言:主按钮背景色为指定蓝色
|
|
139
204
|
- type: style
|
|
140
205
|
selector: '.primary-btn'
|
|
141
206
|
style: background-color
|