speccore 8.3.148 → 8.3.149

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "speccore",
3
- "version": "8.3.148",
3
+ "version": "8.3.149",
4
4
  "description": "SpecCore - Code by Spec, Not by Vibe.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -7,4 +7,4 @@
7
7
  .match-result{padding:10px 0}.match-summary{font-weight:600;font-size:14px;margin-bottom:12px}.match-detail{color:var(--muted);font-size:12px;line-height:1.6}
8
8
  /* Pipeline */
9
9
  .pipeline-title{font-weight:600;margin-bottom:16px}.pipeline-steps{display:flex;flex-direction:column;gap:10px}.pipe-step{display:flex;gap:14px;padding:12px 14px;background:rgba(99,102,241,.04);border-left:2px solid var(--purple);border-radius:0 8px 8px 0}.pipe-step .pipe-num{font-family:Orbitron;font-size:20px;font-weight:900;color:var(--purple);min-width:36px}.pipe-step .pipe-cmd{font-weight:600;color:var(--green)}.pipe-step .pipe-args{color:var(--muted);font-size:11px}.pipe-step .pipe-desc{color:var(--muted);font-size:10px;margin-top:4px}.pipe-step .pipe-dep{font-size:9px;color:var(--orange);margin-top:4px}.confirm-bar{text-align:center;padding:14px;margin-top:16px;background:rgba(99,102,241,.08);border:1px dashed rgba(99,102,241,.2);border-radius:8px;color:var(--purple);font-size:12px}
10
- .footer{text-align:center;color:var(--muted);font-size:10px;margin-top:24px;padding-top:16px;border-top:1px solid rgba(255,255,255,.04)}h1{text-shadow:0 0 20px rgba(14,165,233,.35),0 0 60px rgba(14,165,233,.12)!important}@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}.card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 25% 10%,rgba(14,165,233,.25) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}@keyframes titleGlow{0%,100%{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15)}50%{text-shadow:0 0 30px rgba(14,165,233,.7),0 0 80px rgba(14,165,233,.3)}}h1,h2{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15);animation:titleGlow 3s ease-in-out infinite}</style></head><body><div class="scanlines"></div><div class="card"><div class="card-bg"></div><div class="vline l"></div><div class="vline r"></div><h1>SPECCORE ASK</h1><div class="query">"我想做一个登录功能"</div><div class="badge">🗺️ 任务指引</div><div class="guide-title">已为你规划「新功能开发全流程」(8 步)</div><div class="guide-steps"><div class="guide-step"><div class="step-num">1</div><div class="step-body"><div class="step-cmd">speccore init</div><div class="step-desc">初始化项目(如果还没有)</div></div></div><div class="guide-step"><div class="step-num">2</div><div class="step-body"><div class="step-cmd">speccore doc2spec -f PRD.docx --iter {iteration}</div><div class="step-desc">导入 PRD 文档,AI 分析生成需求规格</div></div></div><div class="guide-step"><div class="step-num">3</div><div class="step-body"><div class="step-cmd">speccore analyze --iteration {iteration} --audit</div><div class="step-desc">AI 分析需求,生成审计报告</div></div></div><div class="guide-step"><div class="step-num">4</div><div class="step-body"><div class="step-cmd">speccore split -f REQUIREMENT.md</div><div class="step-desc">将需求拆分为独立开发任务</div></div></div><div class="guide-step"><div class="step-num">5</div><div class="step-body"><div class="step-cmd">speccore plan --all</div><div class="step-desc">生成任务执行计划,确定优先级和依赖</div></div></div><div class="guide-step"><div class="step-num">6</div><div class="step-body"><div class="step-cmd">speccore execute --auto</div><div class="step-desc">按计划依次执行开发任务</div></div></div><div class="guide-step"><div class="step-num">7</div><div class="step-body"><div class="step-cmd">speccore pr --auto</div><div class="step-desc">代码提交后创建 Pull Request</div></div></div><div class="guide-step"><div class="step-num">8</div><div class="step-body"><div class="step-cmd">speccore done --all</div><div class="step-desc">全部完成后归档收尾</div></div></div></div><div style="text-align:center;margin-top:16px"><a href="speccore-welcome.html" style="color:var(--cyan);font-size:11px;text-decoration:none">← 返回 ask 引导页</a></div><div class="footer">由 SpecCore 驱动 · v8.3.148 · 2026-08-31</div></div></body></html>
10
+ .footer{text-align:center;color:var(--muted);font-size:10px;margin-top:24px;padding-top:16px;border-top:1px solid rgba(255,255,255,.04)}h1{text-shadow:0 0 20px rgba(14,165,233,.35),0 0 60px rgba(14,165,233,.12)!important}@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}.card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 25% 10%,rgba(14,165,233,.25) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}@keyframes titleGlow{0%,100%{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15)}50%{text-shadow:0 0 30px rgba(14,165,233,.7),0 0 80px rgba(14,165,233,.3)}}h1,h2{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15);animation:titleGlow 3s ease-in-out infinite}</style></head><body><div class="scanlines"></div><div class="card"><div class="card-bg"></div><div class="vline l"></div><div class="vline r"></div><h1>SPECCORE ASK</h1><div class="query">"我想做一个登录功能"</div><div class="badge">🗺️ 任务指引</div><div class="guide-title">已为你规划「新功能开发全流程」(8 步)</div><div class="guide-steps"><div class="guide-step"><div class="step-num">1</div><div class="step-body"><div class="step-cmd">speccore init</div><div class="step-desc">初始化项目(如果还没有)</div></div></div><div class="guide-step"><div class="step-num">2</div><div class="step-body"><div class="step-cmd">speccore doc2spec -f PRD.docx --iter {iteration}</div><div class="step-desc">导入 PRD 文档,AI 分析生成需求规格</div></div></div><div class="guide-step"><div class="step-num">3</div><div class="step-body"><div class="step-cmd">speccore analyze --iteration {iteration} --audit</div><div class="step-desc">AI 分析需求,生成审计报告</div></div></div><div class="guide-step"><div class="step-num">4</div><div class="step-body"><div class="step-cmd">speccore split -f REQUIREMENT.md</div><div class="step-desc">将需求拆分为独立开发任务</div></div></div><div class="guide-step"><div class="step-num">5</div><div class="step-body"><div class="step-cmd">speccore plan --all</div><div class="step-desc">生成任务执行计划,确定优先级和依赖</div></div></div><div class="guide-step"><div class="step-num">6</div><div class="step-body"><div class="step-cmd">speccore execute --auto</div><div class="step-desc">按计划依次执行开发任务</div></div></div><div class="guide-step"><div class="step-num">7</div><div class="step-body"><div class="step-cmd">speccore pr --auto</div><div class="step-desc">代码提交后创建 Pull Request</div></div></div><div class="guide-step"><div class="step-num">8</div><div class="step-body"><div class="step-cmd">speccore done --all</div><div class="step-desc">全部完成后归档收尾</div></div></div></div><div style="text-align:center;margin-top:16px"><a href="speccore-welcome.html" style="color:var(--cyan);font-size:11px;text-decoration:none">← 返回 ask 引导页</a></div><div class="footer">由 SpecCore 驱动 · v8.3.149 · 2026-08-31</div></div></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="zh-CN" data-theme="ocean"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>SpecCore · ask --pipeline</title><style>@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=JetBrains+Mono:wght@400;600;700&display=swap');[data-theme="ocean"]{--cyan:#0ea5e9;--bg:#0b1929;--card:rgba(13,31,56,.95);--border:rgba(14,165,233,.15);--text:#bae6fd;--muted:#5b7fa5;--green:#14b8a6;--orange:#f97316;--purple:#6366f1}*{margin:0;padding:0;box-sizing:border-box}body{font-family:'JetBrains Mono',monospace;background:var(--bg);color:var(--text);min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px}.scanlines{position:fixed;inset:0;pointer-events:none;z-index:99;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,240,255,.01) 2px,rgba(0,240,255,.01) 4px)}.card{max-width:900px;width:100%;margin:0 auto;background:var(--card);border:1px solid var(--border);border-radius:16px;padding:32px;position:relative;overflow:hidden;z-index:1}.card::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX 3s linear infinite}.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX-rev 3s linear infinite}@keyframes scanX{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@keyframes scanX-rev{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}@keyframes scanY{0%{transform:translateY(-100%)}100%{transform:translateY(100%)}}@keyframes scanY-rev{0%{transform:translateY(100%)}100%{transform:translateY(-100%)}}.vline{position:absolute;top:0;width:1px;bottom:0;pointer-events:none}.vline.l{left:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY-rev 3s linear infinite}.vline.r{right:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY 3s linear infinite}.card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 25% 10%,rgba(14,165,233,.25) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}.page-title{font-family:'Orbitron',sans-serif;font-size:22px;font-weight:700;text-align:center;color:var(--cyan);margin-bottom:32px;letter-spacing:1px;text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15);animation:titleGlow 3s ease-in-out infinite}@keyframes titleGlow{0%,100%{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15)}50%{text-shadow:0 0 30px rgba(14,165,233,.7),0 0 80px rgba(14,165,233,.3)}}.page-title span{color:var(--text);font-weight:500}.flow-chart{display:flex;align-items:stretch;gap:0;margin-bottom:28px}.flow-node{flex:1;background:rgba(13,31,56,.7);border:1px solid;border-radius:10px;padding:14px 8px;text-align:center;position:relative}.flow-node .icon{font-size:18px;margin-bottom:6px}.flow-node .name{font-size:12px;font-weight:600;margin-bottom:4px}.flow-node .desc{font-size:10px;color:var(--muted)}.flow-node.n1{border-color:rgba(14,165,233,.4);color:var(--cyan)}.flow-node.n2{border-color:rgba(99,102,241,.4);color:var(--purple)}.flow-node.n3{border-color:rgba(14,165,233,.4);color:var(--cyan)}.flow-node.n4{border-color:rgba(20,184,166,.4);color:var(--green)}.flow-connector{width:24px;display:flex;align-items:center;justify-content:center}.flow-connector::after{content:'';width:100%;height:1px;background:linear-gradient(90deg,var(--border),var(--cyan),var(--border))}.example-box{border:1px dashed rgba(14,165,233,.3);border-radius:12px;padding:16px 20px;margin-bottom:24px;background:rgba(14,165,233,.03)}.example-label{font-size:13px;font-weight:600;color:var(--cyan);margin-bottom:8px}.example-query{font-family:'JetBrains Mono',monospace;font-size:14px;color:var(--text)}.example-query code{color:var(--green);font-weight:600}.steps{display:flex;flex-direction:column;gap:12px;margin-bottom:24px}.step{background:rgba(13,31,56,.8);border:1px solid rgba(14,165,233,.12);border-radius:10px;padding:14px 18px}.step-num{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:var(--green);margin-bottom:6px}.step-cmd{font-family:'JetBrains Mono',monospace;font-size:14px;color:var(--text);margin-bottom:6px}.step-cmd .cmd-name{color:var(--green)}.step-cmd .cmd-args{color:var(--muted)}.step-parse{font-size:12px;color:var(--muted);line-height:1.5}.step-parse::before{content:'→ 解析:';color:var(--cyan)}.confirm-btn{display:block;width:100%;max-width:420px;margin:0 auto 16px;text-align:center;padding:16px;background:linear-gradient(135deg,var(--cyan),#0284c7);border:none;border-radius:40px;color:#fff;font-size:15px;font-weight:600;cursor:pointer;box-shadow:0 0 30px rgba(14,165,233,.3)}.legend{display:flex;justify-content:center;gap:20px;font-size:11px;color:var(--muted);margin-bottom:16px;flex-wrap:wrap}.legend-item{display:flex;align-items:center;gap:4px}.legend-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.legend-dot.required{background:var(--cyan)}.legend-dot.generated{background:var(--green)}.legend-dot.pending{background:rgba(255,255,255,.3)}.back-link{text-align:center;margin-top:12px}.back-link a{color:var(--cyan);font-size:11px;text-decoration:none}.footer{text-align:center;color:var(--muted);font-size:10px;margin-top:20px}</style></head><body><div class="scanlines"></div><div class="card"><div class="card-bg"></div><div class="vline l"></div><div class="vline r"></div><div class="page-title">ask --pipeline <span>多步骤编排引擎</span></div><div class="flow-chart"><div class="flow-node n1"><div class="icon">🧠</div><div class="name">AI 意图分解</div><div class="desc">LLM 分解多步骤</div></div><div class="flow-connector"></div><div class="flow-node n2"><div class="icon">📐</div><div class="name">命令匹配</div><div class="desc">意图→命令图</div></div><div class="flow-connector"></div><div class="flow-node n3"><div class="icon">🔗</div><div class="name">依赖解析</div><div class="desc">顺序/并行/参数</div></div><div class="flow-connector"></div><div class="flow-node n4"><div class="icon">✅</div><div class="name">预览</div><div class="desc">展示给用户</div></div></div><div class="example-box"><div class="example-label">📋 示例:<span class="example-query"><code>/spec-ask "本期迭代:从 PRD 导入到代码提交,跑完整开发流程"</code></span></div></div><div class="steps"><div class="step"><div class="step-num">1.</div><div class="step-cmd"><span class="cmd-name">speccore doc2spec</span> <span class="cmd-args">-f PRD.docx --iter {iteration}</span></div><div class="step-parse">导入 PRD 文档,AI 分析生成需求规格说明书</div></div><div class="step"><div class="step-num">2.</div><div class="step-cmd"><span class="cmd-name">speccore analyze</span> <span class="cmd-args">--iteration {iteration} --audit</span></div><div class="step-parse">AI 深度分析需求,生成审计报告和可行性评估</div></div><div class="step"><div class="step-num">3.</div><div class="step-cmd"><span class="cmd-name">speccore split</span> <span class="cmd-args">-f REQUIREMENT.md</span></div><div class="step-parse">将需求拆分为独立开发任务,确定优先级和依赖关系</div></div><div class="step"><div class="step-num">4.</div><div class="step-cmd"><span class="cmd-name">speccore execute</span> <span class="cmd-args">--auto</span></div><div class="step-parse">按任务计划依次自动执行开发、测试和代码生成</div></div><div class="step"><div class="step-num">5.</div><div class="step-cmd"><span class="cmd-name">speccore pr</span> <span class="cmd-args">--auto</span></div><div class="step-parse">代码提交后自动创建 Pull Request,完成交付</div></div></div><div class="confirm-btn">确认执行? (y/N) 或修改参数</div><div class="legend"><div class="legend-item"><span class="legend-dot required"></span> = 必选步骤</div><div class="legend-item"><span class="legend-dot generated"></span> = 已生成</div><div class="legend-item"><span class="legend-dot pending"></span> = 待执行</div><div class="legend-item">→ = 依赖传递</div></div><div class="back-link"><a href="speccore-welcome.html">← 返回 ask 引导页</a></div><div class="footer">由 SpecCore 驱动 · v8.3.148 · 2026-08-31</div></div></body></html>
1
+ <!DOCTYPE html><html lang="zh-CN" data-theme="ocean"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>SpecCore · ask --pipeline</title><style>@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=JetBrains+Mono:wght@400;600;700&display=swap');[data-theme="ocean"]{--cyan:#0ea5e9;--bg:#0b1929;--card:rgba(13,31,56,.95);--border:rgba(14,165,233,.15);--text:#bae6fd;--muted:#5b7fa5;--green:#14b8a6;--orange:#f97316;--purple:#6366f1}*{margin:0;padding:0;box-sizing:border-box}body{font-family:'JetBrains Mono',monospace;background:var(--bg);color:var(--text);min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px}.scanlines{position:fixed;inset:0;pointer-events:none;z-index:99;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,240,255,.01) 2px,rgba(0,240,255,.01) 4px)}.card{max-width:900px;width:100%;margin:0 auto;background:var(--card);border:1px solid var(--border);border-radius:16px;padding:32px;position:relative;overflow:hidden;z-index:1}.card::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX 3s linear infinite}.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX-rev 3s linear infinite}@keyframes scanX{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@keyframes scanX-rev{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}@keyframes scanY{0%{transform:translateY(-100%)}100%{transform:translateY(100%)}}@keyframes scanY-rev{0%{transform:translateY(100%)}100%{transform:translateY(-100%)}}.vline{position:absolute;top:0;width:1px;bottom:0;pointer-events:none}.vline.l{left:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY-rev 3s linear infinite}.vline.r{right:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY 3s linear infinite}.card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 25% 10%,rgba(14,165,233,.25) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}.page-title{font-family:'Orbitron',sans-serif;font-size:22px;font-weight:700;text-align:center;color:var(--cyan);margin-bottom:32px;letter-spacing:1px;text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15);animation:titleGlow 3s ease-in-out infinite}@keyframes titleGlow{0%,100%{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15)}50%{text-shadow:0 0 30px rgba(14,165,233,.7),0 0 80px rgba(14,165,233,.3)}}.page-title span{color:var(--text);font-weight:500}.flow-chart{display:flex;align-items:stretch;gap:0;margin-bottom:28px}.flow-node{flex:1;background:rgba(13,31,56,.7);border:1px solid;border-radius:10px;padding:14px 8px;text-align:center;position:relative}.flow-node .icon{font-size:18px;margin-bottom:6px}.flow-node .name{font-size:12px;font-weight:600;margin-bottom:4px}.flow-node .desc{font-size:10px;color:var(--muted)}.flow-node.n1{border-color:rgba(14,165,233,.4);color:var(--cyan)}.flow-node.n2{border-color:rgba(99,102,241,.4);color:var(--purple)}.flow-node.n3{border-color:rgba(14,165,233,.4);color:var(--cyan)}.flow-node.n4{border-color:rgba(20,184,166,.4);color:var(--green)}.flow-connector{width:24px;display:flex;align-items:center;justify-content:center}.flow-connector::after{content:'';width:100%;height:1px;background:linear-gradient(90deg,var(--border),var(--cyan),var(--border))}.example-box{border:1px dashed rgba(14,165,233,.3);border-radius:12px;padding:16px 20px;margin-bottom:24px;background:rgba(14,165,233,.03)}.example-label{font-size:13px;font-weight:600;color:var(--cyan);margin-bottom:8px}.example-query{font-family:'JetBrains Mono',monospace;font-size:14px;color:var(--text)}.example-query code{color:var(--green);font-weight:600}.steps{display:flex;flex-direction:column;gap:12px;margin-bottom:24px}.step{background:rgba(13,31,56,.8);border:1px solid rgba(14,165,233,.12);border-radius:10px;padding:14px 18px}.step-num{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:var(--green);margin-bottom:6px}.step-cmd{font-family:'JetBrains Mono',monospace;font-size:14px;color:var(--text);margin-bottom:6px}.step-cmd .cmd-name{color:var(--green)}.step-cmd .cmd-args{color:var(--muted)}.step-parse{font-size:12px;color:var(--muted);line-height:1.5}.step-parse::before{content:'→ 解析:';color:var(--cyan)}.confirm-btn{display:block;width:100%;max-width:420px;margin:0 auto 16px;text-align:center;padding:16px;background:linear-gradient(135deg,var(--cyan),#0284c7);border:none;border-radius:40px;color:#fff;font-size:15px;font-weight:600;cursor:pointer;box-shadow:0 0 30px rgba(14,165,233,.3)}.legend{display:flex;justify-content:center;gap:20px;font-size:11px;color:var(--muted);margin-bottom:16px;flex-wrap:wrap}.legend-item{display:flex;align-items:center;gap:4px}.legend-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.legend-dot.required{background:var(--cyan)}.legend-dot.generated{background:var(--green)}.legend-dot.pending{background:rgba(255,255,255,.3)}.back-link{text-align:center;margin-top:12px}.back-link a{color:var(--cyan);font-size:11px;text-decoration:none}.footer{text-align:center;color:var(--muted);font-size:10px;margin-top:20px}</style></head><body><div class="scanlines"></div><div class="card"><div class="card-bg"></div><div class="vline l"></div><div class="vline r"></div><div class="page-title">ask --pipeline <span>多步骤编排引擎</span></div><div class="flow-chart"><div class="flow-node n1"><div class="icon">🧠</div><div class="name">AI 意图分解</div><div class="desc">LLM 分解多步骤</div></div><div class="flow-connector"></div><div class="flow-node n2"><div class="icon">📐</div><div class="name">命令匹配</div><div class="desc">意图→命令图</div></div><div class="flow-connector"></div><div class="flow-node n3"><div class="icon">🔗</div><div class="name">依赖解析</div><div class="desc">顺序/并行/参数</div></div><div class="flow-connector"></div><div class="flow-node n4"><div class="icon">✅</div><div class="name">预览</div><div class="desc">展示给用户</div></div></div><div class="example-box"><div class="example-label">📋 示例:<span class="example-query"><code>/spec-ask "本期迭代:从 PRD 导入到代码提交,跑完整开发流程"</code></span></div></div><div class="steps"><div class="step"><div class="step-num">1.</div><div class="step-cmd"><span class="cmd-name">speccore doc2spec</span> <span class="cmd-args">-f PRD.docx --iter {iteration}</span></div><div class="step-parse">导入 PRD 文档,AI 分析生成需求规格说明书</div></div><div class="step"><div class="step-num">2.</div><div class="step-cmd"><span class="cmd-name">speccore analyze</span> <span class="cmd-args">--iteration {iteration} --audit</span></div><div class="step-parse">AI 深度分析需求,生成审计报告和可行性评估</div></div><div class="step"><div class="step-num">3.</div><div class="step-cmd"><span class="cmd-name">speccore split</span> <span class="cmd-args">-f REQUIREMENT.md</span></div><div class="step-parse">将需求拆分为独立开发任务,确定优先级和依赖关系</div></div><div class="step"><div class="step-num">4.</div><div class="step-cmd"><span class="cmd-name">speccore execute</span> <span class="cmd-args">--auto</span></div><div class="step-parse">按任务计划依次自动执行开发、测试和代码生成</div></div><div class="step"><div class="step-num">5.</div><div class="step-cmd"><span class="cmd-name">speccore pr</span> <span class="cmd-args">--auto</span></div><div class="step-parse">代码提交后自动创建 Pull Request,完成交付</div></div></div><div class="confirm-btn">确认执行? (y/N) 或修改参数</div><div class="legend"><div class="legend-item"><span class="legend-dot required"></span> = 必选步骤</div><div class="legend-item"><span class="legend-dot generated"></span> = 已生成</div><div class="legend-item"><span class="legend-dot pending"></span> = 待执行</div><div class="legend-item">→ = 依赖传递</div></div><div class="back-link"><a href="speccore-welcome.html">← 返回 ask 引导页</a></div><div class="footer">由 SpecCore 驱动 · v8.3.149 · 2026-08-31</div></div></body></html>
@@ -7,4 +7,4 @@
7
7
  .match-result{padding:10px 0}.match-summary{font-weight:600;font-size:14px;margin-bottom:12px}.match-detail{color:var(--muted);font-size:12px;line-height:1.6}
8
8
  /* Pipeline */
9
9
  .pipeline-title{font-weight:600;margin-bottom:16px}.pipeline-steps{display:flex;flex-direction:column;gap:10px}.pipe-step{display:flex;gap:14px;padding:12px 14px;background:rgba(99,102,241,.04);border-left:2px solid var(--purple);border-radius:0 8px 8px 0}.pipe-step .pipe-num{font-family:Orbitron;font-size:20px;font-weight:900;color:var(--purple);min-width:36px}.pipe-step .pipe-cmd{font-weight:600;color:var(--green)}.pipe-step .pipe-args{color:var(--muted);font-size:11px}.pipe-step .pipe-desc{color:var(--muted);font-size:10px;margin-top:4px}.pipe-step .pipe-dep{font-size:9px;color:var(--orange);margin-top:4px}.confirm-bar{text-align:center;padding:14px;margin-top:16px;background:rgba(99,102,241,.08);border:1px dashed rgba(99,102,241,.2);border-radius:8px;color:var(--purple);font-size:12px}
10
- .footer{text-align:center;color:var(--muted);font-size:10px;margin-top:24px;padding-top:16px;border-top:1px solid rgba(255,255,255,.04)}@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}.card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 25% 10%,rgba(14,165,233,.25) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}@keyframes titleGlow{0%,100%{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15)}50%{text-shadow:0 0 30px rgba(14,165,233,.7),0 0 80px rgba(14,165,233,.3)}}h1,h2{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15);animation:titleGlow 3s ease-in-out infinite}</style></head><body><div class="scanlines"></div><div class="card"><div class="card-bg"></div><div class="vline l"></div><div class="vline r"></div><h1>SPECCORE ASK</h1><div class="query">"dashboard"</div><div class="badge">🎯 意图匹配</div><div class="match-result"><div class="match-summary">✅ 推荐: dashboard</div><div class="match-detail">🎯 推荐命令: <code>speccore dashboard<br>项目仪表盘:期次状态/进度/健康度,--scope</code> global 全量视图<br><br>用法: <code>speccore dashboard</code> [--scope global|iteration] [--export html] [--health] [--lifecycle]<br><br>示例:<br> $ <code>speccore dashboard<br></code> $ <code>speccore dashboard</code> --scope global --export html</div></div><div class="footer">由 SpecCore 驱动 v8.3.148 · 2026-08-31</div></div></body></html>
10
+ .footer{text-align:center;color:var(--muted);font-size:10px;margin-top:24px;padding-top:16px;border-top:1px solid rgba(255,255,255,.04)}@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}.card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 25% 10%,rgba(14,165,233,.25) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}@keyframes titleGlow{0%,100%{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15)}50%{text-shadow:0 0 30px rgba(14,165,233,.7),0 0 80px rgba(14,165,233,.3)}}h1,h2{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15);animation:titleGlow 3s ease-in-out infinite}</style></head><body><div class="scanlines"></div><div class="card"><div class="card-bg"></div><div class="vline l"></div><div class="vline r"></div><h1>SPECCORE ASK</h1><div class="query">"dashboard"</div><div class="badge">🎯 意图匹配</div><div class="match-result"><div class="match-summary">✅ 推荐: dashboard</div><div class="match-detail">🎯 推荐命令: <code>speccore dashboard<br>项目仪表盘:期次状态/进度/健康度,--scope</code> global 全量视图<br><br>用法: <code>speccore dashboard</code> [--scope global|iteration] [--export html] [--health] [--lifecycle]<br><br>示例:<br> $ <code>speccore dashboard<br></code> $ <code>speccore dashboard</code> --scope global --export html</div></div><div class="footer">由 SpecCore 驱动 v8.3.149 · 2026-08-31</div></div></body></html>
@@ -40,7 +40,7 @@
40
40
  </div>
41
41
  </div>
42
42
 
43
- <div class="footer">由 SpecCore 驱动 v8.3.148 | 2026-08-31</div>
43
+ <div class="footer">由 SpecCore 驱动 v8.3.149 | 2026-08-31</div>
44
44
 
45
45
  <script>
46
46
  const STATE = {&quot;iteration&quot;:&quot;期次-Q2&quot;,&quot;phases&quot;:[{&quot;name&quot;:&quot;初始化&quot;,&quot;key&quot;:&quot;init&quot;,&quot;done&quot;:true,&quot;icon&quot;:&quot;🏗️&quot;,&quot;cmd&quot;:&quot;init&quot;,&quot;description&quot;:&quot;初始化 SpecCore 项目结构&quot;,&quot;args&quot;:&quot;&quot;},{&quot;name&quot;:&quot;导入需求&quot;,&quot;key&quot;:&quot;doc&quot;,&quot;done&quot;:false,&quot;icon&quot;:&quot;📝&quot;,&quot;cmd&quot;:&quot;doc2spec&quot;,&quot;description&quot;:&quot;导入 PRD 文档,AI 转换需求规格&quot;,&quot;args&quot;:&quot;-f PRD.docx --iteration 期次-Q2&quot;},{&quot;name&quot;:&quot;分析需求&quot;,&quot;key&quot;:&quot;analyze&quot;,&quot;done&quot;:false,&quot;icon&quot;:&quot;🧠&quot;,&quot;cmd&quot;:&quot;analyze&quot;,&quot;description&quot;:&quot;AI 分析需求文档,生成审计报告&quot;,&quot;args&quot;:&quot;--iteration=期次-Q2&quot;},{&quot;name&quot;:&quot;拆分任务&quot;,&quot;key&quot;:&quot;split&quot;,&quot;done&quot;:false,&quot;icon&quot;:&quot;📦&quot;,&quot;cmd&quot;:&quot;split&quot;,&quot;description&quot;:&quot;将需求拆分为独立开发任务&quot;,&quot;args&quot;:&quot;-f REQUIREMENT.md&quot;},{&quot;name&quot;:&quot;执行开发&quot;,&quot;key&quot;:&quot;execute&quot;,&quot;done&quot;:false,&quot;icon&quot;:&quot;⚡&quot;,&quot;cmd&quot;:&quot;execute&quot;,&quot;description&quot;:&quot;按计划分批执行开发任务&quot;,&quot;args&quot;:&quot;--auto&quot;},{&quot;name&quot;:&quot;提交 PR&quot;,&quot;key&quot;:&quot;pr&quot;,&quot;done&quot;:false,&quot;icon&quot;:&quot;🔀&quot;,&quot;cmd&quot;:&quot;pr&quot;,&quot;description&quot;:&quot;代码提交后创建 Pull Request&quot;,&quot;args&quot;:&quot;--auto&quot;},{&quot;name&quot;:&quot;归档收尾&quot;,&quot;key&quot;:&quot;done&quot;,&quot;done&quot;:false,&quot;icon&quot;:&quot;✅&quot;,&quot;cmd&quot;:&quot;done&quot;,&quot;description&quot;:&quot;校验、同步、审计,归档记录&quot;,&quot;args&quot;:&quot;--all&quot;}],&quot;currentIdx&quot;:1,&quot;currentPhase&quot;:{&quot;name&quot;:&quot;导入需求&quot;,&quot;key&quot;:&quot;doc&quot;,&quot;done&quot;:false,&quot;icon&quot;:&quot;📝&quot;,&quot;cmd&quot;:&quot;doc2spec&quot;,&quot;description&quot;:&quot;导入 PRD 文档,AI 转换需求规格&quot;,&quot;args&quot;:&quot;-f PRD.docx --iteration 期次-Q2&quot;}};
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="zh-CN" data-theme="ocean"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>SpecCore Help</title><style>@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=JetBrains+Mono:wght@400;600;700&display=swap');[data-theme="ocean"]{--cyan:#0ea5e9;--bg:#0b1929;--card:rgba(13,31,56,.95);--border:rgba(14,165,233,.15);--text:#bae6fd;--muted:#5b7fa5;--green:#14b8a6;--orange:#f97316;--purple:#6366f1}*{margin:0;padding:0;box-sizing:border-box}body{font-family:'JetBrains Mono',monospace;background:var(--bg);color:var(--text);min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px}.scanlines{position:fixed;inset:0;pointer-events:none;z-index:99;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,240,255,.01) 2px,rgba(0,240,255,.01) 4px)}.card{max-width:800px;width:100%;margin:0 auto;background:var(--card);border:1px solid var(--border);border-radius:16px;padding:24px;position:relative;overflow:hidden}.card::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX 3s linear infinite}.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX-rev 3s linear infinite}@keyframes scanX{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@keyframes scanX-rev{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}@keyframes scanY{0%{transform:translateY(-100%)}100%{transform:translateY(100%)}}@keyframes scanY-rev{0%{transform:translateY(100%)}100%{transform:translateY(-100%)}}.vline{position:absolute;top:0;width:1px;bottom:0;pointer-events:none}.vline.l{left:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY-rev 3s linear infinite}.vline.r{right:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY 3s linear infinite}h1{font-family:'Orbitron',sans-serif;font-size:24px;font-weight:900;background:linear-gradient(135deg,var(--cyan),var(--purple));-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:2px;margin-bottom:4px}.sub{color:var(--muted);font-size:11px;margin-bottom:20px}.cat{margin:12px 0;padding:12px;background:rgba(255,255,255,.02);border:1px solid rgba(255,255,255,.04);border-radius:10px}.cat-title{font-size:10px;font-weight:700;color:var(--cyan);text-transform:uppercase;letter-spacing:1px;margin-bottom:8px}.cat-cmds{display:flex;flex-wrap:wrap;gap:6px}.cmd-pill{padding:3px 10px;border-radius:4px;font-size:10px;background:rgba(14,165,233,.1);color:var(--cyan);border:1px solid rgba(14,165,233,.15)}.cmd-detail{padding:8px 0}.cmd-desc{font-size:13px;margin-bottom:16px}.param-list{margin:12px 0}.param{display:flex;gap:12px;padding:6px 0;border-bottom:1px solid rgba(255,255,255,.03)}.param-flag{color:var(--green);font-size:11px;min-width:160px}.param-meaning{color:var(--muted);font-size:11px}.example-list{margin:12px 0}.section-label{font-size:9px;color:var(--muted);text-transform:uppercase;letter-spacing:1px;margin-bottom:6px}code{display:block;background:rgba(14,165,233,.1);padding:4px 10px;border-radius:4px;color:var(--cyan);font-size:11px;margin:4px 0}.footer{text-align:center;color:var(--muted);font-size:10px;margin-top:24px;padding-top:16px;border-top:1px solid rgba(255,255,255,.04)}.grid-pattern{position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(14,165,233,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(14,165,233,.03) 1px,transparent 1px);background-size:60px 60px}@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}.card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 25% 10%,rgba(14,165,233,.25) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}@keyframes titleGlow{0%,100%{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15)}50%{text-shadow:0 0 30px rgba(14,165,233,.7),0 0 80px rgba(14,165,233,.3)}}h1,h2{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15);animation:titleGlow 3s ease-in-out infinite}</style></head><body><div class="scanlines"></div><div class="grid-pattern"></div><div class="card"><div class="card-bg"></div><div class="vline l"></div><div class="vline r"></div><h1>SPECCORE HELP</h1><div class="sub">SpecCore 命令参考 · v8.3.148</div><div class="cat"><div class="cat-title">🧠 AI 入口</div><div class="cat-cmds"><span class="cmd-pill">speccore ask</span><span class="cmd-pill">speccore welcome</span></div></div><div class="cat"><div class="cat-title">🏗️ 初始化</div><div class="cat-cmds"><span class="cmd-pill">speccore init</span></div></div><div class="cat"><div class="cat-title">📋 期次与任务</div><div class="cat-cmds"><span class="cmd-pill">speccore iteration</span><span class="cmd-pill">speccore task</span><span class="cmd-pill">speccore rename</span></div></div><div class="cat"><div class="cat-title">📝 文档转换</div><div class="cat-cmds"><span class="cmd-pill">speccore doc2spec</span><span class="cmd-pill">speccore spec2doc</span></div></div><div class="cat"><div class="cat-title">🔍 分析与计划</div><div class="cat-cmds"><span class="cmd-pill">speccore analyze</span><span class="cmd-pill">speccore plan</span><span class="cmd-pill">speccore split</span></div></div><div class="cat"><div class="cat-title">⚡ 执行与交付</div><div class="cat-cmds"><span class="cmd-pill">speccore execute</span><span class="cmd-pill">speccore pr</span><span class="cmd-pill">speccore done</span></div></div><div class="cat"><div class="cat-title">🔄 同步与变更</div><div class="cat-cmds"><span class="cmd-pill">speccore change</span><span class="cmd-pill">speccore sync</span><span class="cmd-pill">speccore retro</span><span class="cmd-pill">speccore ops</span></div></div><div class="cat"><div class="cat-title">📊 查看与验证</div><div class="cat-cmds"><span class="cmd-pill">speccore dashboard</span><span class="cmd-pill">speccore validate</span><span class="cmd-pill">speccore track</span><span class="cmd-pill">speccore search</span><span class="cmd-pill">speccore graph</span><span class="cmd-pill">speccore knowledge</span></div></div><div class="cat"><div class="cat-title">🤖 智能操作</div><div class="cat-cmds"><span class="cmd-pill">speccore dev</span></div></div><div class="cat"><div class="cat-title">🔧 维护与升级</div><div class="cat-cmds"><span class="cmd-pill">speccore update</span><span class="cmd-pill">speccore doctor</span><span class="cmd-pill">speccore config</span></div></div><div class="cat" onclick="window.location.href='speccore-prompts.html'" style="cursor:pointer"><div class="cat-title">📋 提示词库</div><div class="cat-cmds"><span class="cmd-pill">speccore prompts</span><span class="cmd-pill">查看全部 31 个提示词</span></div></div><div class="footer">由 SpecCore 驱动 v8.3.148 · 2026-08-31</div></div></body></html>
1
+ <!DOCTYPE html><html lang="zh-CN" data-theme="ocean"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>SpecCore Help</title><style>@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=JetBrains+Mono:wght@400;600;700&display=swap');[data-theme="ocean"]{--cyan:#0ea5e9;--bg:#0b1929;--card:rgba(13,31,56,.95);--border:rgba(14,165,233,.15);--text:#bae6fd;--muted:#5b7fa5;--green:#14b8a6;--orange:#f97316;--purple:#6366f1}*{margin:0;padding:0;box-sizing:border-box}body{font-family:'JetBrains Mono',monospace;background:var(--bg);color:var(--text);min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px}.scanlines{position:fixed;inset:0;pointer-events:none;z-index:99;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,240,255,.01) 2px,rgba(0,240,255,.01) 4px)}.card{max-width:800px;width:100%;margin:0 auto;background:var(--card);border:1px solid var(--border);border-radius:16px;padding:24px;position:relative;overflow:hidden}.card::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX 3s linear infinite}.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX-rev 3s linear infinite}@keyframes scanX{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@keyframes scanX-rev{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}@keyframes scanY{0%{transform:translateY(-100%)}100%{transform:translateY(100%)}}@keyframes scanY-rev{0%{transform:translateY(100%)}100%{transform:translateY(-100%)}}.vline{position:absolute;top:0;width:1px;bottom:0;pointer-events:none}.vline.l{left:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY-rev 3s linear infinite}.vline.r{right:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY 3s linear infinite}h1{font-family:'Orbitron',sans-serif;font-size:24px;font-weight:900;background:linear-gradient(135deg,var(--cyan),var(--purple));-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:2px;margin-bottom:4px}.sub{color:var(--muted);font-size:11px;margin-bottom:20px}.cat{margin:12px 0;padding:12px;background:rgba(255,255,255,.02);border:1px solid rgba(255,255,255,.04);border-radius:10px}.cat-title{font-size:10px;font-weight:700;color:var(--cyan);text-transform:uppercase;letter-spacing:1px;margin-bottom:8px}.cat-cmds{display:flex;flex-wrap:wrap;gap:6px}.cmd-pill{padding:3px 10px;border-radius:4px;font-size:10px;background:rgba(14,165,233,.1);color:var(--cyan);border:1px solid rgba(14,165,233,.15)}.cmd-detail{padding:8px 0}.cmd-desc{font-size:13px;margin-bottom:16px}.param-list{margin:12px 0}.param{display:flex;gap:12px;padding:6px 0;border-bottom:1px solid rgba(255,255,255,.03)}.param-flag{color:var(--green);font-size:11px;min-width:160px}.param-meaning{color:var(--muted);font-size:11px}.example-list{margin:12px 0}.section-label{font-size:9px;color:var(--muted);text-transform:uppercase;letter-spacing:1px;margin-bottom:6px}code{display:block;background:rgba(14,165,233,.1);padding:4px 10px;border-radius:4px;color:var(--cyan);font-size:11px;margin:4px 0}.footer{text-align:center;color:var(--muted);font-size:10px;margin-top:24px;padding-top:16px;border-top:1px solid rgba(255,255,255,.04)}.grid-pattern{position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(14,165,233,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(14,165,233,.03) 1px,transparent 1px);background-size:60px 60px}@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}.card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 25% 10%,rgba(14,165,233,.25) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}@keyframes titleGlow{0%,100%{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15)}50%{text-shadow:0 0 30px rgba(14,165,233,.7),0 0 80px rgba(14,165,233,.3)}}h1,h2{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15);animation:titleGlow 3s ease-in-out infinite}</style></head><body><div class="scanlines"></div><div class="grid-pattern"></div><div class="card"><div class="card-bg"></div><div class="vline l"></div><div class="vline r"></div><h1>SPECCORE HELP</h1><div class="sub">SpecCore 命令参考 · v8.3.149</div><div class="cat"><div class="cat-title">🧠 AI 入口</div><div class="cat-cmds"><span class="cmd-pill">speccore ask</span><span class="cmd-pill">speccore welcome</span></div></div><div class="cat"><div class="cat-title">🏗️ 初始化</div><div class="cat-cmds"><span class="cmd-pill">speccore init</span></div></div><div class="cat"><div class="cat-title">📋 期次与任务</div><div class="cat-cmds"><span class="cmd-pill">speccore iteration</span><span class="cmd-pill">speccore task</span><span class="cmd-pill">speccore rename</span></div></div><div class="cat"><div class="cat-title">📝 文档转换</div><div class="cat-cmds"><span class="cmd-pill">speccore doc2spec</span><span class="cmd-pill">speccore spec2doc</span></div></div><div class="cat"><div class="cat-title">🔍 分析与计划</div><div class="cat-cmds"><span class="cmd-pill">speccore analyze</span><span class="cmd-pill">speccore plan</span><span class="cmd-pill">speccore split</span></div></div><div class="cat"><div class="cat-title">⚡ 执行与交付</div><div class="cat-cmds"><span class="cmd-pill">speccore execute</span><span class="cmd-pill">speccore pr</span><span class="cmd-pill">speccore done</span></div></div><div class="cat"><div class="cat-title">🔄 同步与变更</div><div class="cat-cmds"><span class="cmd-pill">speccore change</span><span class="cmd-pill">speccore sync</span><span class="cmd-pill">speccore retro</span><span class="cmd-pill">speccore ops</span></div></div><div class="cat"><div class="cat-title">📊 查看与验证</div><div class="cat-cmds"><span class="cmd-pill">speccore dashboard</span><span class="cmd-pill">speccore validate</span><span class="cmd-pill">speccore track</span><span class="cmd-pill">speccore search</span><span class="cmd-pill">speccore graph</span><span class="cmd-pill">speccore knowledge</span></div></div><div class="cat"><div class="cat-title">🤖 智能操作</div><div class="cat-cmds"><span class="cmd-pill">speccore dev</span></div></div><div class="cat"><div class="cat-title">🔧 维护与升级</div><div class="cat-cmds"><span class="cmd-pill">speccore update</span><span class="cmd-pill">speccore doctor</span><span class="cmd-pill">speccore config</span></div></div><div class="cat" onclick="window.location.href='speccore-prompts.html'" style="cursor:pointer"><div class="cat-title">📋 提示词库</div><div class="cat-cmds"><span class="cmd-pill">speccore prompts</span><span class="cmd-pill">查看全部 31 个提示词</span></div></div><div class="footer">由 SpecCore 驱动 v8.3.149 · 2026-08-31</div></div></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>SpecCore Retro · T-001</title><style>@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=JetBrains+Mono:wght@400;600;700');body{margin:0;padding:20px;background:#0b1929;display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh;font-family:'JetBrains Mono',monospace;box-sizing:border-box}.scanlines{position:fixed;inset:0;pointer-events:none;z-index:0;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,240,255,.015) 2px,rgba(0,240,255,.015) 4px)}.grid-pattern{position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(14,165,233,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(14,165,233,.03) 1px,transparent 1px);background-size:60px 60px}.card{max-width:800px;width:100%;background:rgba(13,31,56,.95);border:1px solid rgba(14,165,233,.15);border-radius:16px;padding:24px;position:relative;overflow:hidden;z-index:1}.card::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,#0ea5e9,transparent);animation:scanX 3s linear infinite}.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,#0ea5e9,transparent);animation:scanX-rev 3s linear infinite}.vline{position:absolute;top:0;width:1px;bottom:0;pointer-events:none}.vline.l{left:0;background:linear-gradient(0deg,transparent,#0ea5e9,transparent);animation:scanY-rev 3s linear infinite}.vline.r{right:0;background:linear-gradient(0deg,transparent,#0ea5e9,transparent);animation:scanY 3s linear infinite}@keyframes scanX{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@keyframes scanX-rev{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}@keyframes scanY{0%{transform:translateY(-100%)}100%{transform:translateY(100%)}}@keyframes scanY-rev{0%{transform:translateY(100%)}100%{transform:translateY(-100%)}}h1{font-family:'Orbitron',sans-serif;font-size:22px;font-weight:900;background:linear-gradient(135deg,#0ea5e9,#6366f1);-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:2px}.meta{color:#5b7fa5;font-size:11px;margin:8px 0 20px}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:16px 0}.stat{background:rgba(14,165,233,.06);border:1px solid rgba(14,165,233,.1);border-radius:8px;padding:12px;text-align:center}.stat .val{font-family:'Orbitron',sans-serif;font-size:20px;font-weight:900;color:#0ea5e9}.stat .lbl{font-size:10px;color:#5b7fa5;margin-top:4px}.score{text-align:center;margin:12px 0;display:flex;justify-content:center;gap:14px}.star-filled,.star-empty{display:inline-flex;width:42px;height:42px;align-items:center;justify-content:center}.summary{padding:12px;background:rgba(20,184,166,.06);border:1px solid rgba(20,184,166,.15);border-radius:8px;color:#bae6fd;font-size:12px;line-height:1.6;margin:12px 0}.improve{padding:12px;background:rgba(249,115,22,.06);border:1px solid rgba(249,115,22,.15);border-radius:8px;color:#f97316;font-size:11px}.pass{color:#14b8a6}.fail{color:#f97316}.ft{text-align:center;color:#5b7fa5;font-size:10px;margin-top:24px}@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}.card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 25% 10%,rgba(14,165,233,.25) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}@keyframes titleGlow{0%,100%{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15)}50%{text-shadow:0 0 30px rgba(14,165,233,.7),0 0 80px rgba(14,165,233,.3)}}h1,h2{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15);animation:titleGlow 3s ease-in-out infinite}</style></head><body><div class="scanlines"></div><div class="grid-pattern"></div><div class="card"><div class="card-bg"></div><div class="vline l"></div><div class="vline r"></div><h1>RETRO · T-001</h1><div class="meta">期次: :--- · 2026-08-31</div><div class="score"><i class="star-filled"><svg width="42" height="42" viewBox="0 0 24 24" style="filter:drop-shadow(0 0 8px rgba(251,191,36,.7)) drop-shadow(0 0 16px rgba(251,191,36,.4))"><defs><linearGradient id="sg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#fcd34d"/><stop offset="1" stop-color="#f59e0b"/></linearGradient></defs><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" fill="url(#sg)" stroke="#fbbf24" stroke-width="0.5" stroke-linejoin="round"/></svg></i><i class="star-filled"><svg width="42" height="42" viewBox="0 0 24 24" style="filter:drop-shadow(0 0 8px rgba(251,191,36,.7)) drop-shadow(0 0 16px rgba(251,191,36,.4))"><defs><linearGradient id="sg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#fcd34d"/><stop offset="1" stop-color="#f59e0b"/></linearGradient></defs><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" fill="url(#sg)" stroke="#fbbf24" stroke-width="0.5" stroke-linejoin="round"/></svg></i><i class="star-filled"><svg width="42" height="42" viewBox="0 0 24 24" style="filter:drop-shadow(0 0 8px rgba(251,191,36,.7)) drop-shadow(0 0 16px rgba(251,191,36,.4))"><defs><linearGradient id="sg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#fcd34d"/><stop offset="1" stop-color="#f59e0b"/></linearGradient></defs><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" fill="url(#sg)" stroke="#fbbf24" stroke-width="0.5" stroke-linejoin="round"/></svg></i><i class="star-filled"><svg width="42" height="42" viewBox="0 0 24 24" style="filter:drop-shadow(0 0 8px rgba(251,191,36,.7)) drop-shadow(0 0 16px rgba(251,191,36,.4))"><defs><linearGradient id="sg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#fcd34d"/><stop offset="1" stop-color="#f59e0b"/></linearGradient></defs><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" fill="url(#sg)" stroke="#fbbf24" stroke-width="0.5" stroke-linejoin="round"/></svg></i><i class="star-empty"><svg width="42" height="42" viewBox="0 0 24 24" style="filter:drop-shadow(0 0 4px rgba(51,65,85,.3))"><defs><linearGradient id="sg2" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#475569"/><stop offset="1" stop-color="#0f172a"/></linearGradient></defs><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" fill="url(#sg2)" stroke="#334155" stroke-width="0.5" stroke-linejoin="round"/></svg></i></div><div class="grid2"><div class="stat"><div class="val">0</div><div class="lbl">文件变更</div></div><div class="stat"><div class="val fail">❌</div><div class="lbl">验证</div></div></div><div class="summary">任务 T-001 已完成,共涉及 0 个文件变更</div><div class="improve">💡 任务粒度合适</div><div class="ft">SpecCore Retro v8.3.148 · 2026-08-31</div></div></body></html>
1
+ <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>SpecCore Retro · T-001</title><style>@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=JetBrains+Mono:wght@400;600;700');body{margin:0;padding:20px;background:#0b1929;display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh;font-family:'JetBrains Mono',monospace;box-sizing:border-box}.scanlines{position:fixed;inset:0;pointer-events:none;z-index:0;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,240,255,.015) 2px,rgba(0,240,255,.015) 4px)}.grid-pattern{position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(14,165,233,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(14,165,233,.03) 1px,transparent 1px);background-size:60px 60px}.card{max-width:800px;width:100%;background:rgba(13,31,56,.95);border:1px solid rgba(14,165,233,.15);border-radius:16px;padding:24px;position:relative;overflow:hidden;z-index:1}.card::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,#0ea5e9,transparent);animation:scanX 3s linear infinite}.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,#0ea5e9,transparent);animation:scanX-rev 3s linear infinite}.vline{position:absolute;top:0;width:1px;bottom:0;pointer-events:none}.vline.l{left:0;background:linear-gradient(0deg,transparent,#0ea5e9,transparent);animation:scanY-rev 3s linear infinite}.vline.r{right:0;background:linear-gradient(0deg,transparent,#0ea5e9,transparent);animation:scanY 3s linear infinite}@keyframes scanX{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@keyframes scanX-rev{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}@keyframes scanY{0%{transform:translateY(-100%)}100%{transform:translateY(100%)}}@keyframes scanY-rev{0%{transform:translateY(100%)}100%{transform:translateY(-100%)}}h1{font-family:'Orbitron',sans-serif;font-size:22px;font-weight:900;background:linear-gradient(135deg,#0ea5e9,#6366f1);-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:2px}.meta{color:#5b7fa5;font-size:11px;margin:8px 0 20px}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:16px 0}.stat{background:rgba(14,165,233,.06);border:1px solid rgba(14,165,233,.1);border-radius:8px;padding:12px;text-align:center}.stat .val{font-family:'Orbitron',sans-serif;font-size:20px;font-weight:900;color:#0ea5e9}.stat .lbl{font-size:10px;color:#5b7fa5;margin-top:4px}.score{text-align:center;margin:12px 0;display:flex;justify-content:center;gap:14px}.star-filled,.star-empty{display:inline-flex;width:42px;height:42px;align-items:center;justify-content:center}.summary{padding:12px;background:rgba(20,184,166,.06);border:1px solid rgba(20,184,166,.15);border-radius:8px;color:#bae6fd;font-size:12px;line-height:1.6;margin:12px 0}.improve{padding:12px;background:rgba(249,115,22,.06);border:1px solid rgba(249,115,22,.15);border-radius:8px;color:#f97316;font-size:11px}.pass{color:#14b8a6}.fail{color:#f97316}.ft{text-align:center;color:#5b7fa5;font-size:10px;margin-top:24px}@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}.card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 25% 10%,rgba(14,165,233,.25) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}@keyframes titleGlow{0%,100%{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15)}50%{text-shadow:0 0 30px rgba(14,165,233,.7),0 0 80px rgba(14,165,233,.3)}}h1,h2{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15);animation:titleGlow 3s ease-in-out infinite}</style></head><body><div class="scanlines"></div><div class="grid-pattern"></div><div class="card"><div class="card-bg"></div><div class="vline l"></div><div class="vline r"></div><h1>RETRO · T-001</h1><div class="meta">期次: :--- · 2026-08-31</div><div class="score"><i class="star-filled"><svg width="42" height="42" viewBox="0 0 24 24" style="filter:drop-shadow(0 0 8px rgba(251,191,36,.7)) drop-shadow(0 0 16px rgba(251,191,36,.4))"><defs><linearGradient id="sg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#fcd34d"/><stop offset="1" stop-color="#f59e0b"/></linearGradient></defs><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" fill="url(#sg)" stroke="#fbbf24" stroke-width="0.5" stroke-linejoin="round"/></svg></i><i class="star-filled"><svg width="42" height="42" viewBox="0 0 24 24" style="filter:drop-shadow(0 0 8px rgba(251,191,36,.7)) drop-shadow(0 0 16px rgba(251,191,36,.4))"><defs><linearGradient id="sg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#fcd34d"/><stop offset="1" stop-color="#f59e0b"/></linearGradient></defs><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" fill="url(#sg)" stroke="#fbbf24" stroke-width="0.5" stroke-linejoin="round"/></svg></i><i class="star-filled"><svg width="42" height="42" viewBox="0 0 24 24" style="filter:drop-shadow(0 0 8px rgba(251,191,36,.7)) drop-shadow(0 0 16px rgba(251,191,36,.4))"><defs><linearGradient id="sg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#fcd34d"/><stop offset="1" stop-color="#f59e0b"/></linearGradient></defs><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" fill="url(#sg)" stroke="#fbbf24" stroke-width="0.5" stroke-linejoin="round"/></svg></i><i class="star-filled"><svg width="42" height="42" viewBox="0 0 24 24" style="filter:drop-shadow(0 0 8px rgba(251,191,36,.7)) drop-shadow(0 0 16px rgba(251,191,36,.4))"><defs><linearGradient id="sg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#fcd34d"/><stop offset="1" stop-color="#f59e0b"/></linearGradient></defs><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" fill="url(#sg)" stroke="#fbbf24" stroke-width="0.5" stroke-linejoin="round"/></svg></i><i class="star-empty"><svg width="42" height="42" viewBox="0 0 24 24" style="filter:drop-shadow(0 0 4px rgba(51,65,85,.3))"><defs><linearGradient id="sg2" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#475569"/><stop offset="1" stop-color="#0f172a"/></linearGradient></defs><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" fill="url(#sg2)" stroke="#334155" stroke-width="0.5" stroke-linejoin="round"/></svg></i></div><div class="grid2"><div class="stat"><div class="val">0</div><div class="lbl">文件变更</div></div><div class="stat"><div class="val fail">❌</div><div class="lbl">验证</div></div></div><div class="summary">任务 T-001 已完成,共涉及 0 个文件变更</div><div class="improve">💡 任务粒度合适</div><div class="ft">SpecCore Retro v8.3.149 · 2026-08-31</div></div></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="zh-CN" data-theme="ocean"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>SpecCore — 项目名片</title><style>@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=JetBrains+Mono:wght@400;600;700&display=swap');[data-theme="ocean"]{--cyan:#0ea5e9;--bg:#0b1929;--card:rgba(13,31,56,.95);--border:rgba(14,165,233,.15);--text:#bae6fd;--muted:#5b7fa5;--green:#14b8a6;--orange:#f97316;--purple:#6366f1}*{margin:0;padding:0;box-sizing:border-box}body{font-family:'JetBrains Mono',monospace;background:var(--bg);color:var(--text);min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px 20px}.scanlines{position:fixed;inset:0;pointer-events:none;z-index:99;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,240,255,.015) 2px,rgba(0,240,255,.015) 4px)}.stars{position:fixed;inset:0;pointer-events:none;background:radial-gradient(1px 1px at 20% 30%,rgba(255,255,255,.3),transparent),radial-gradient(1.5px 1.5px at 60% 70%,rgba(14,165,233,.4),transparent)}.card{max-width:800px;width:100%;margin:0 auto;background:var(--card);border:1px solid var(--border);border-radius:16px;padding:24px;position:relative;overflow:hidden;z-index:1}.card::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX 3s linear infinite}.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX-rev 3s linear infinite}@keyframes scanX{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@keyframes scanX-rev{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}@keyframes scanY{0%{transform:translateY(-100%)}100%{transform:translateY(100%)}}@keyframes scanY-rev{0%{transform:translateY(100%)}100%{transform:translateY(-100%)}}.vline{position:absolute;top:0;width:1px;bottom:0;pointer-events:none}.vline.l{left:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY-rev 3s linear infinite}.vline.r{right:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY 3s linear infinite}.center-node{width:90px;height:90px;border-radius:50%;border:2px solid var(--cyan);display:flex;align-items:center;justify-content:center;background:rgba(14,165,233,.08);margin:24px auto;font-family:Orbitron,sans-serif;font-size:20px;font-weight:900;background:linear-gradient(135deg,var(--cyan),var(--purple));-webkit-background-clip:text;-webkit-text-fill-color:transparent;position:relative;z-index:2}.modes-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:20px 0}.mode-card{border-radius:10px;padding:14px;position:relative;overflow:hidden;background:rgba(255,255,255,.02)}.mode-card.m1{border:1.5px solid var(--green)}.mode-card.m2{border:1.5px solid var(--orange)}.mode-card.m3{border:1.5px solid var(--cyan)}.mode-card.m4{border:1.5px solid var(--purple)}.mode-card .mode-title{font-weight:600;margin:6px 0;font-size:13px}.mode-card.m1 .mode-title{color:var(--green)}.mode-card.m2 .mode-title{color:var(--orange)}.mode-card.m3 .mode-title{color:var(--cyan)}.mode-card.m4 .mode-title{color:var(--purple)}.mode-card .mode-icon{font-size:18px;margin-right:4px}.mode-card .mode-desc{font-size:10px;color:var(--muted);margin:4px 0}.mode-card .mode-tag{display:inline-block;padding:2px 8px;font-size:9px;border-radius:4px;background:rgba(20,184,166,.1);color:var(--green);margin-top:6px}.mode-card.m1 .mode-tag{background:rgba(20,184,166,.08);color:var(--green)}.mode-card.m2 .mode-tag{background:rgba(249,115,22,.08);color:var(--orange)}.mode-card.m3 .mode-tag{background:rgba(14,165,233,.08);color:var(--cyan)}.mode-card.m4 .mode-tag{background:rgba(99,102,241,.08);color:var(--purple)}.status-row{display:flex;align-items:center;gap:8px;margin:8px 0;padding:10px 14px;background:rgba(14,165,233,.04);border:1px solid rgba(14,165,233,.1);border-radius:8px}.flow{display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:flex-start}.flow-step{display:flex;flex-direction:row;align-items:center;gap:6px;padding:10px 8px;border-radius:10px;border:none}.flow-step.done{background:rgba(20,184,166,.1)}.flow-step.pending{background:rgba(255,255,255,.04)}.flow-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0;border:none}.flow-dot.done{background:var(--green);box-shadow:0 0 8px var(--green)}.flow-dot.pending{background:rgba(255,255,255,.15)}.flow-label{font-size:11px;color:var(--muted);white-space:nowrap}.flow-label.done{color:var(--green)}.flow-arrow{color:var(--muted);font-size:12px;text-align:center;line-height:1}.cmd-row{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}.cmd-pill{padding:3px 10px;border-radius:4px;font-size:10px;background:rgba(14,165,233,.1);color:var(--cyan);border:1px solid rgba(14,165,233,.15)}.footer{text-align:center;color:var(--muted);font-size:10px;margin-top:24px;padding-top:16px;border-top:1px solid rgba(255,255,255,.04)}h1{font-family:'Orbitron',sans-serif;font-size:32px;font-weight:900;background:linear-gradient(135deg,var(--cyan),var(--purple));-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:2px;text-align:center}.sub{color:var(--muted);font-size:11px;letter-spacing:1px;text-align:center;margin-top:4px}.section-title{font-size:10px;font-weight:700;color:var(--cyan);text-transform:uppercase;letter-spacing:2px;margin:20px 0 10px}.confirm-bar{text-align:center;padding:18px;margin:24px 0 8px;background:linear-gradient(135deg,var(--cyan) 0%,#0284c7 100%);border-radius:40px;color:#fff;font-weight:600;font-size:14px;box-shadow:0 0 30px rgba(14,165,233,.3);cursor:pointer;letter-spacing:1px}.section{margin:14px 0;padding:14px;background:rgba(255,255,255,.02);border:1px solid rgba(255,255,255,.04);border-radius:10px}.grid-pattern{position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(14,165,233,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(14,165,233,.03) 1px,transparent 1px);background-size:60px 60px}@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}.card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 50% 10%,rgba(14,165,233,.25) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}@keyframes titleGlow{0%,100%{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15)}50%{text-shadow:0 0 30px rgba(14,165,233,.7),0 0 80px rgba(14,165,233,.3)}}h1,h2{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15);animation:titleGlow 3s ease-in-out infinite}</style></head><body><div class="scanlines"></div><div class="grid-pattern"></div><div class="stars"></div><div class="card"><div class="card-bg"></div><div class="vline l"></div><div class="vline r"></div><h1>SPECCORE</h1><div class="sub">Code by Spec, Not by Vibe · v8.3.148 · Q2</div><div class="status-row"><span>📍</span><div><div style="font-size:11px;font-weight:600">⚡ 执行中 (6 任务)</div><div style="font-size:9px;color:var(--muted)">当前迭代: Q2 · 6 任务</div></div></div><div class="section-title">🔄 核心流水线</div><div class="section"><div class="flow"><div class="flow-step done"><span class="flow-dot done"></span><span class="flow-label done">导入</span></div><div class="flow-arrow">→</div><div class="flow-step done"><span class="flow-dot done"></span><span class="flow-label done">分析</span></div><div class="flow-arrow">→</div><div class="flow-step done"><span class="flow-dot done"></span><span class="flow-label done">拆分</span></div><div class="flow-arrow">→</div><div class="flow-step done"><span class="flow-dot done"></span><span class="flow-label done">计划</span></div><div class="flow-arrow">→</div><div class="flow-step pending"><span class="flow-dot pending"></span><span class="flow-label ">执行</span></div><div class="flow-arrow">→</div><div class="flow-step pending"><span class="flow-dot pending"></span><span class="flow-label ">交付</span></div></div></div><div class="section-title">🧠 ask — SpecCore 万能 AI 入口</div><div class="modes-grid"><div class="mode-card m1" onclick="window.location.href='speccore-ask-explain.html'" style="cursor:pointer"><div class="mode-title"><span class="mode-icon">📖</span>命令解释</div><div class="mode-desc">"dashboard 怎么用"<br>"init 有哪些参数"</div><div class="mode-tag">知识库匹配 →</div></div><div class="mode-card m2" onclick="window.location.href='speccore-ask-guide.html'" style="cursor:pointer"><div class="mode-title"><span class="mode-icon">🗺️</span>任务指引</div><div class="mode-desc">"我想做一个登录功能"<br>"怎么开始新项目"</div><div class="mode-tag">工作流生成 →</div></div><div class="mode-card m3" onclick="window.location.href='speccore-ask-match.html'" style="cursor:pointer"><div class="mode-title"><span class="mode-icon">🎯</span>意图匹配</div><div class="mode-desc">"查看进度" → dashboard<br>"审查代码" → validate</div><div class="mode-tag">38意图 + AI →</div></div><div class="mode-card m4" onclick="window.location.href='speccore-ask-pipeline.html'" style="cursor:pointer"><div class="mode-title"><span class="mode-icon">⚡</span>复杂编排</div><div class="mode-desc">"计划所有任务晚8点分批"<br>"做完分析→拆分→PR"</div><div class="mode-tag">Pipeline 引擎 →</div></div></div><div class="confirm-bar" onclick="window.location.href='speccore-ask-onboarding.html'">确认进入 · 输入 <code style="background:rgba(255,255,255,.2);padding:2px 8px;border-radius:4px">speccore ask "你的需求"</code> 开始</div><div class="section-title">📋 提示词库</div><div class="section" onclick="window.location.href='speccore-prompts.html'" style="cursor:pointer"><div style="display:flex;align-items:center;gap:10px"><span style="font-size:24px">🎯</span><div><div style="font-size:13px;font-weight:600;color:var(--cyan)">SpecCore 提示词库</div><div style="font-size:11px;color:var(--muted);margin-top:2px">31 个预置提示词,按场景分类,一键复制 AI 说法 / 触发命令</div></div><span style="margin-left:auto;color:var(--cyan);font-size:12px">→</span></div></div><div class="section-title">━━ 常用命令 ━━</div><div class="cmd-row"><span class="cmd-pill">speccore dashboard</span><span class="cmd-pill">speccore dev --auto</span><span class="cmd-pill">speccore ask "描述"</span><span class="cmd-pill">speccore graph query "订单"</span><span class="cmd-pill">speccore help</span></div><div class="footer">由 SpecCore 驱动 v8.3.148 · 2026-08-31</div></div></body></html>
1
+ <!DOCTYPE html><html lang="zh-CN" data-theme="ocean"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>SpecCore — 项目名片</title><style>@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=JetBrains+Mono:wght@400;600;700&display=swap');[data-theme="ocean"]{--cyan:#0ea5e9;--bg:#0b1929;--card:rgba(13,31,56,.95);--border:rgba(14,165,233,.15);--text:#bae6fd;--muted:#5b7fa5;--green:#14b8a6;--orange:#f97316;--purple:#6366f1}*{margin:0;padding:0;box-sizing:border-box}body{font-family:'JetBrains Mono',monospace;background:var(--bg);color:var(--text);min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px 20px}.scanlines{position:fixed;inset:0;pointer-events:none;z-index:99;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,240,255,.015) 2px,rgba(0,240,255,.015) 4px)}.stars{position:fixed;inset:0;pointer-events:none;background:radial-gradient(1px 1px at 20% 30%,rgba(255,255,255,.3),transparent),radial-gradient(1.5px 1.5px at 60% 70%,rgba(14,165,233,.4),transparent)}.card{max-width:800px;width:100%;margin:0 auto;background:var(--card);border:1px solid var(--border);border-radius:16px;padding:24px;position:relative;overflow:hidden;z-index:1}.card::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX 3s linear infinite}.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX-rev 3s linear infinite}@keyframes scanX{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@keyframes scanX-rev{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}@keyframes scanY{0%{transform:translateY(-100%)}100%{transform:translateY(100%)}}@keyframes scanY-rev{0%{transform:translateY(100%)}100%{transform:translateY(-100%)}}.vline{position:absolute;top:0;width:1px;bottom:0;pointer-events:none}.vline.l{left:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY-rev 3s linear infinite}.vline.r{right:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY 3s linear infinite}.center-node{width:90px;height:90px;border-radius:50%;border:2px solid var(--cyan);display:flex;align-items:center;justify-content:center;background:rgba(14,165,233,.08);margin:24px auto;font-family:Orbitron,sans-serif;font-size:20px;font-weight:900;background:linear-gradient(135deg,var(--cyan),var(--purple));-webkit-background-clip:text;-webkit-text-fill-color:transparent;position:relative;z-index:2}.modes-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:20px 0}.mode-card{border-radius:10px;padding:14px;position:relative;overflow:hidden;background:rgba(255,255,255,.02)}.mode-card.m1{border:1.5px solid var(--green)}.mode-card.m2{border:1.5px solid var(--orange)}.mode-card.m3{border:1.5px solid var(--cyan)}.mode-card.m4{border:1.5px solid var(--purple)}.mode-card .mode-title{font-weight:600;margin:6px 0;font-size:13px}.mode-card.m1 .mode-title{color:var(--green)}.mode-card.m2 .mode-title{color:var(--orange)}.mode-card.m3 .mode-title{color:var(--cyan)}.mode-card.m4 .mode-title{color:var(--purple)}.mode-card .mode-icon{font-size:18px;margin-right:4px}.mode-card .mode-desc{font-size:10px;color:var(--muted);margin:4px 0}.mode-card .mode-tag{display:inline-block;padding:2px 8px;font-size:9px;border-radius:4px;background:rgba(20,184,166,.1);color:var(--green);margin-top:6px}.mode-card.m1 .mode-tag{background:rgba(20,184,166,.08);color:var(--green)}.mode-card.m2 .mode-tag{background:rgba(249,115,22,.08);color:var(--orange)}.mode-card.m3 .mode-tag{background:rgba(14,165,233,.08);color:var(--cyan)}.mode-card.m4 .mode-tag{background:rgba(99,102,241,.08);color:var(--purple)}.status-row{display:flex;align-items:center;gap:8px;margin:8px 0;padding:10px 14px;background:rgba(14,165,233,.04);border:1px solid rgba(14,165,233,.1);border-radius:8px}.flow{display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:flex-start}.flow-step{display:flex;flex-direction:row;align-items:center;gap:6px;padding:10px 8px;border-radius:10px;border:none}.flow-step.done{background:rgba(20,184,166,.1)}.flow-step.pending{background:rgba(255,255,255,.04)}.flow-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0;border:none}.flow-dot.done{background:var(--green);box-shadow:0 0 8px var(--green)}.flow-dot.pending{background:rgba(255,255,255,.15)}.flow-label{font-size:11px;color:var(--muted);white-space:nowrap}.flow-label.done{color:var(--green)}.flow-arrow{color:var(--muted);font-size:12px;text-align:center;line-height:1}.cmd-row{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}.cmd-pill{padding:3px 10px;border-radius:4px;font-size:10px;background:rgba(14,165,233,.1);color:var(--cyan);border:1px solid rgba(14,165,233,.15)}.footer{text-align:center;color:var(--muted);font-size:10px;margin-top:24px;padding-top:16px;border-top:1px solid rgba(255,255,255,.04)}h1{font-family:'Orbitron',sans-serif;font-size:32px;font-weight:900;background:linear-gradient(135deg,var(--cyan),var(--purple));-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:2px;text-align:center}.sub{color:var(--muted);font-size:11px;letter-spacing:1px;text-align:center;margin-top:4px}.section-title{font-size:10px;font-weight:700;color:var(--cyan);text-transform:uppercase;letter-spacing:2px;margin:20px 0 10px}.confirm-bar{text-align:center;padding:18px;margin:24px 0 8px;background:linear-gradient(135deg,var(--cyan) 0%,#0284c7 100%);border-radius:40px;color:#fff;font-weight:600;font-size:14px;box-shadow:0 0 30px rgba(14,165,233,.3);cursor:pointer;letter-spacing:1px}.section{margin:14px 0;padding:14px;background:rgba(255,255,255,.02);border:1px solid rgba(255,255,255,.04);border-radius:10px}.grid-pattern{position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(14,165,233,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(14,165,233,.03) 1px,transparent 1px);background-size:60px 60px}@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}.card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 50% 10%,rgba(14,165,233,.25) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}@keyframes titleGlow{0%,100%{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15)}50%{text-shadow:0 0 30px rgba(14,165,233,.7),0 0 80px rgba(14,165,233,.3)}}h1,h2{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15);animation:titleGlow 3s ease-in-out infinite}</style></head><body><div class="scanlines"></div><div class="grid-pattern"></div><div class="stars"></div><div class="card"><div class="card-bg"></div><div class="vline l"></div><div class="vline r"></div><h1>SPECCORE</h1><div class="sub">Code by Spec, Not by Vibe · v8.3.149 · Q2</div><div class="status-row"><span>📍</span><div><div style="font-size:11px;font-weight:600">⚡ 执行中 (6 任务)</div><div style="font-size:9px;color:var(--muted)">当前迭代: Q2 · 6 任务</div></div></div><div class="section-title">🔄 核心流水线</div><div class="section"><div class="flow"><div class="flow-step done"><span class="flow-dot done"></span><span class="flow-label done">导入</span></div><div class="flow-arrow">→</div><div class="flow-step done"><span class="flow-dot done"></span><span class="flow-label done">分析</span></div><div class="flow-arrow">→</div><div class="flow-step done"><span class="flow-dot done"></span><span class="flow-label done">拆分</span></div><div class="flow-arrow">→</div><div class="flow-step done"><span class="flow-dot done"></span><span class="flow-label done">计划</span></div><div class="flow-arrow">→</div><div class="flow-step pending"><span class="flow-dot pending"></span><span class="flow-label ">执行</span></div><div class="flow-arrow">→</div><div class="flow-step pending"><span class="flow-dot pending"></span><span class="flow-label ">交付</span></div></div></div><div class="section-title">🧠 ask — SpecCore 万能 AI 入口</div><div class="modes-grid"><div class="mode-card m1" onclick="window.location.href='speccore-ask-explain.html'" style="cursor:pointer"><div class="mode-title"><span class="mode-icon">📖</span>命令解释</div><div class="mode-desc">"dashboard 怎么用"<br>"init 有哪些参数"</div><div class="mode-tag">知识库匹配 →</div></div><div class="mode-card m2" onclick="window.location.href='speccore-ask-guide.html'" style="cursor:pointer"><div class="mode-title"><span class="mode-icon">🗺️</span>任务指引</div><div class="mode-desc">"我想做一个登录功能"<br>"怎么开始新项目"</div><div class="mode-tag">工作流生成 →</div></div><div class="mode-card m3" onclick="window.location.href='speccore-ask-match.html'" style="cursor:pointer"><div class="mode-title"><span class="mode-icon">🎯</span>意图匹配</div><div class="mode-desc">"查看进度" → dashboard<br>"审查代码" → validate</div><div class="mode-tag">38意图 + AI →</div></div><div class="mode-card m4" onclick="window.location.href='speccore-ask-pipeline.html'" style="cursor:pointer"><div class="mode-title"><span class="mode-icon">⚡</span>复杂编排</div><div class="mode-desc">"计划所有任务晚8点分批"<br>"做完分析→拆分→PR"</div><div class="mode-tag">Pipeline 引擎 →</div></div></div><div class="confirm-bar" onclick="window.location.href='speccore-ask-onboarding.html'">确认进入 · 输入 <code style="background:rgba(255,255,255,.2);padding:2px 8px;border-radius:4px">speccore ask "你的需求"</code> 开始</div><div class="section-title">📋 提示词库</div><div class="section" onclick="window.location.href='speccore-prompts.html'" style="cursor:pointer"><div style="display:flex;align-items:center;gap:10px"><span style="font-size:24px">🎯</span><div><div style="font-size:13px;font-weight:600;color:var(--cyan)">SpecCore 提示词库</div><div style="font-size:11px;color:var(--muted);margin-top:2px">31 个预置提示词,按场景分类,一键复制 AI 说法 / 触发命令</div></div><span style="margin-left:auto;color:var(--cyan);font-size:12px">→</span></div></div><div class="section-title">━━ 常用命令 ━━</div><div class="cmd-row"><span class="cmd-pill">speccore dashboard</span><span class="cmd-pill">speccore dev --auto</span><span class="cmd-pill">speccore ask "描述"</span><span class="cmd-pill">speccore graph query "订单"</span><span class="cmd-pill">speccore help</span></div><div class="footer">由 SpecCore 驱动 v8.3.149 · 2026-08-31</div></div></body></html>
@@ -1,25 +1,35 @@
1
- # VERIFY_SPEC.yaml — UI 冒烟测试规格
1
+ # VERIFY_SPEC.yaml — 企业级 UI 冒烟测试规格(完整示例)
2
2
  # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
3
3
  # 格式类型: VERIFY_SPEC 格式(scenarios + actions + assertions 结构)
4
4
  # 适用场景: 精细 UI 交互测试(填写表单、点击按钮、断言元素状态)
5
5
  # 对应命令:
6
6
  # • speccore verify --ui --spec ./tests/smoke.yaml ← 推荐,原生支持完整交互逻辑
7
7
  # • speccore verify --ui --config ./tests/smoke.yaml ← 兼容,自动转换为批量页面测试
8
- # 按模块过滤: speccore verify --ui --spec ./tests/smoke.yaml --module=login
8
+ # 按模块过滤: speccore verify --ui --spec ./tests/smoke.yaml --module=auth
9
9
  #
10
10
  # ⚠️ 格式说明:
11
11
  # VERIFY_SPEC 格式 = scenarios + actions + assertions(本文件,支持完整交互)
12
12
  # TestConfig 格式 = tests + routes + type(用于批量页面/API测试,见 pr.yaml/release.yaml)
13
13
  # 两种格式 speccore verify --config 均可自动识别。
14
14
  #
15
- # v8.3.95+ 支持: cookie / localStorage / script / scroll / upload / iframe / waitForRequest / waitForResponse
15
+ # 本示例覆盖:
16
+ # • 全部 ActionType: fill, click, select, check, uncheck, hover, focus, blur, press,
17
+ # wait, navigate, screenshot, cookie, localStorage, script, scroll, upload, iframe,
18
+ # waitForRequest, waitForResponse, drag
19
+ # • 全部 AssertionType: visible, hidden, text, value, url, count, attribute, style, visual
20
+ # • 业务模块: 登录认证 / 用户中心 / 商品 / 购物车 / 订单 / 消息通知 / 后台管理
21
+ #
22
+ # v8.3.95+ 支持: cookie / localStorage / script / scroll / upload / iframe / waitForRequest / waitForResponse / drag
16
23
 
17
- name: 示例项目冒烟测试
24
+ name: 示例项目冒烟测试(完整版)
18
25
  platform: h5-mobile
19
26
  url: /
20
27
 
28
+ # ─────────────────────────────────────────────────────────────────────────────
29
+ # 一、登录认证模块 (auth)
30
+ # ─────────────────────────────────────────────────────────────────────────────
21
31
  scenarios:
22
- # ── 场景1: 登录流程 ──
32
+ # ── 场景1: 账号密码登录 ──
23
33
  - name: 登录-账号密码登录
24
34
  description: 模块:auth 页面:/login
25
35
  actions:
@@ -39,43 +49,265 @@ scenarios:
39
49
  contains: /dashboard
40
50
  - type: visible
41
51
  selector: '.dashboard-container'
52
+ - type: text
53
+ selector: '.user-name'
54
+ contains: test_user
42
55
 
43
- # ── 场景2: Cookie 注入免登录 ──
44
- # 适用于: 已有登录态 Cookie,跳过登录页直接测试业务模块
45
- - name: 预订列表-免登录(cookie注入)
46
- description: 模块:booking 页面:/booking/list
56
+ # ── 场景2: 手机号+验证码登录 ──
57
+ - name: 登录-手机号验证码
58
+ description: 模块:auth 页面:/login/phone
47
59
  actions:
48
- # 注入登录 Cookie(跳过登录页)
60
+ - type: navigate
61
+ value: /login/phone
62
+ - type: fill
63
+ selector: 'input[name="phone"]'
64
+ value: '13800138000'
65
+ - type: click
66
+ selector: '.send-code-btn'
67
+ - type: wait
68
+ delay: 2000
69
+ - type: fill
70
+ selector: 'input[name="verifyCode"]'
71
+ value: '123456'
72
+ - type: click
73
+ selector: 'button[type="submit"]'
74
+ waitFor: '.dashboard-container'
75
+ assertions:
76
+ - type: url
77
+ contains: /dashboard
78
+ - type: visible
79
+ selector: '.dashboard-container'
80
+
81
+ # ── 场景3: 微信 OAuth 登录 ──
82
+ - name: 登录-微信OAuth
83
+ description: 模块:auth 页面:/login 第三方登录
84
+ actions:
85
+ - type: navigate
86
+ value: /login
87
+ - type: click
88
+ selector: '.wechat-login-btn'
89
+ - type: waitForRequest
90
+ selector: 'https://open.weixin.qq.com/connect/oauth2/authorize'
91
+ timeout: 5000
92
+ - type: wait
93
+ delay: 3000
94
+ assertions:
95
+ - type: url
96
+ contains: wechat
97
+
98
+ # ── 场景4: 企业微信 SSO 登录 ──
99
+ - name: 登录-企业微信SSO
100
+ description: 模块:auth 页面:/login/sso
101
+ actions:
102
+ - type: navigate
103
+ value: /login/sso
104
+ - type: iframe
105
+ selector: '#sso-frame'
106
+ - type: fill
107
+ selector: 'input[name="corpId"]'
108
+ value: 'ww1234567890abcdef'
109
+ - type: click
110
+ selector: '.sso-submit-btn'
111
+ waitFor: '.dashboard-container'
112
+ assertions:
113
+ - type: url
114
+ contains: /dashboard
115
+ - type: visible
116
+ selector: '.dashboard-container'
117
+
118
+ # ── 场景5: 扫码登录 ──
119
+ - name: 登录-扫码登录
120
+ description: 模块:auth 页面:/login/qrcode
121
+ actions:
122
+ - type: navigate
123
+ value: /login/qrcode
124
+ - type: visible
125
+ selector: '.qrcode-img'
126
+ - type: wait
127
+ delay: 5000
128
+ assertions:
129
+ - type: visible
130
+ selector: '.qrcode-img'
131
+ - type: attribute
132
+ selector: '.qrcode-img'
133
+ attribute: src
134
+ contains: data:image
135
+
136
+ # ── 场景6: 登录失败-密码错误 ──
137
+ - name: 登录-密码错误提示
138
+ description: 模块:auth 页面:/login 异常场景
139
+ actions:
140
+ - type: navigate
141
+ value: /login
142
+ - type: fill
143
+ selector: 'input[name="username"]'
144
+ value: test_user
145
+ - type: fill
146
+ selector: 'input[name="password"]'
147
+ value: wrong_password
148
+ - type: click
149
+ selector: 'button[type="submit"]'
150
+ - type: wait
151
+ delay: 1000
152
+ assertions:
153
+ - type: visible
154
+ selector: '.error-message'
155
+ - type: text
156
+ selector: '.error-message'
157
+ contains: 密码错误
158
+
159
+ # ── 场景7: 登录失败-账号锁定 ──
160
+ - name: 登录-账号锁定提示
161
+ description: 模块:auth 页面:/login 异常场景
162
+ actions:
163
+ - type: navigate
164
+ value: /login
165
+ - type: fill
166
+ selector: 'input[name="username"]'
167
+ value: locked_user
168
+ - type: fill
169
+ selector: 'input[name="password"]'
170
+ value: any_password
171
+ - type: click
172
+ selector: 'button[type="submit"]'
173
+ - type: wait
174
+ delay: 1000
175
+ assertions:
176
+ - type: visible
177
+ selector: '.error-message'
178
+ - type: text
179
+ selector: '.error-message'
180
+ contains: 账号已被锁定
181
+
182
+ # ── 场景8: 记住密码功能 ──
183
+ - name: 登录-记住密码
184
+ description: 模块:auth 页面:/login 记住密码勾选
185
+ actions:
186
+ - type: navigate
187
+ value: /login
188
+ - type: check
189
+ selector: 'input[name="rememberMe"]'
190
+ - type: fill
191
+ selector: 'input[name="username"]'
192
+ value: test_user
193
+ - type: fill
194
+ selector: 'input[name="password"]'
195
+ value: test_password
196
+ - type: click
197
+ selector: 'button[type="submit"]'
198
+ waitFor: '.dashboard-container'
199
+ assertions:
49
200
  - type: cookie
50
- selector: session_token
51
- value: eyJhbGciOiJIUzI1NiIs...
52
- domain: example.com
53
- path: /
54
- secure: true
55
- httpOnly: true
201
+ selector: remember_me
202
+ contains: 'true'
203
+
204
+ # ── 场景9: 退出登录 ──
205
+ - name: 登录-退出登录
206
+ description: 模块:auth 页面:/dashboard
207
+ actions:
56
208
  - type: navigate
57
- value: /booking/list
209
+ value: /dashboard
210
+ - type: click
211
+ selector: '.user-avatar'
212
+ - type: click
213
+ selector: '.logout-btn'
58
214
  - type: wait
59
215
  delay: 1000
60
216
  assertions:
217
+ - type: url
218
+ contains: /login
61
219
  - type: visible
62
- selector: '.booking-list'
63
- - type: count
64
- selector: '.booking-item'
65
- count: 5
220
+ selector: '.login-form'
221
+
222
+ # ─────────────────────────────────────────────────────────────────────────────
223
+ # 二、用户中心模块 (user)
224
+ # ─────────────────────────────────────────────────────────────────────────────
66
225
 
67
- # ── 场景3: localStorage 注入 Token ──
68
- # 适用于: JWT Token 存储在 localStorage 的前端项目
69
- - name: 个人中心-Token注入
70
- description: 模块:user 页面:/profile
226
+ # ── 场景10: 个人资料修改 ──
227
+ - name: 用户-修改个人资料
228
+ description: 模块:user 页面:/profile/edit
229
+ actions:
230
+ - type: navigate
231
+ value: /profile/edit
232
+ - type: fill
233
+ selector: 'input[name="nickname"]'
234
+ value: 新昵称测试
235
+ - type: select
236
+ selector: 'select[name="gender"]'
237
+ value: female
238
+ - type: fill
239
+ selector: 'input[name="email"]'
240
+ value: 'newemail@example.com'
241
+ - type: click
242
+ selector: '.save-profile-btn'
243
+ - type: wait
244
+ delay: 1500
245
+ assertions:
246
+ - type: visible
247
+ selector: '.toast-success'
248
+ - type: text
249
+ selector: '.toast-success'
250
+ contains: 保存成功
251
+
252
+ # ── 场景11: 头像上传 ──
253
+ - name: 用户-上传头像
254
+ description: 模块:user 页面:/profile/edit 头像上传
255
+ actions:
256
+ - type: navigate
257
+ value: /profile/edit
258
+ - type: upload
259
+ selector: 'input[type="file"].avatar-upload'
260
+ value: ./fixtures/test-avatar.png
261
+ - type: wait
262
+ delay: 2000
263
+ assertions:
264
+ - type: visible
265
+ selector: '.avatar-preview img'
266
+ - type: attribute
267
+ selector: '.avatar-preview img'
268
+ attribute: src
269
+ contains: avatar
270
+
271
+ # ── 场景12: 修改密码 ──
272
+ - name: 用户-修改密码
273
+ description: 模块:user 页面:/profile/security
274
+ actions:
275
+ - type: navigate
276
+ value: /profile/security
277
+ - type: fill
278
+ selector: 'input[name="oldPassword"]'
279
+ value: old_pass_123
280
+ - type: fill
281
+ selector: 'input[name="newPassword"]'
282
+ value: new_pass_456
283
+ - type: fill
284
+ selector: 'input[name="confirmPassword"]'
285
+ value: new_pass_456
286
+ - type: click
287
+ selector: '.change-password-btn'
288
+ - type: wait
289
+ delay: 1500
290
+ assertions:
291
+ - type: visible
292
+ selector: '.toast-success'
293
+ - type: text
294
+ selector: '.toast-success'
295
+ contains: 密码修改成功
296
+
297
+ # ── 场景13: Token 注入免登录(localStorage) ──
298
+ - name: 用户-Token注入免登录
299
+ description: 模块:user 页面:/profile Token注入方式
71
300
  actions:
72
301
  - type: localStorage
73
302
  selector: accessToken
74
- value: Bearer eyJhbGciOiJIUzI1NiIs...
303
+ value: 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
304
+ - type: localStorage
305
+ selector: refreshToken
306
+ value: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
75
307
  - type: navigate
76
308
  value: /profile
77
309
  - type: wait
78
- delay: 500
310
+ delay: 800
79
311
  assertions:
80
312
  - type: visible
81
313
  selector: '.profile-header'
@@ -83,36 +315,400 @@ scenarios:
83
315
  selector: '.username'
84
316
  contains: test_user
85
317
 
86
- # ── 场景4: 按模块测试示例 (booking 模块) ──
87
- # 运行: speccore verify --ui --config ./tests/smoke.yaml --module=booking
88
- - name: 预订表单-提交预订
89
- description: 模块:booking 页面:/booking/create
318
+ # ─────────────────────────────────────────────────────────────────────────────
319
+ # 三、商品模块 (product)
320
+ # ─────────────────────────────────────────────────────────────────────────────
321
+
322
+ # ── 场景14: 商品列表浏览 ──
323
+ - name: 商品-列表浏览
324
+ description: 模块:product 页面:/products
90
325
  actions:
91
326
  - type: navigate
92
- value: /booking/create
327
+ value: /products
328
+ - type: scroll
329
+ selector: bottom
330
+ - type: wait
331
+ delay: 1000
332
+ assertions:
333
+ - type: visible
334
+ selector: '.product-list'
335
+ - type: count
336
+ selector: '.product-item'
337
+ count: 10
338
+
339
+ # ── 场景15: 商品搜索 ──
340
+ - name: 商品-搜索
341
+ description: 模块:product 页面:/products 搜索功能
342
+ actions:
343
+ - type: navigate
344
+ value: /products
93
345
  - type: fill
94
- selector: 'input[name="checkIn"]'
95
- value: '2026-10-01'
346
+ selector: 'input[name="keyword"]'
347
+ value: iPhone
348
+ - type: press
349
+ key: Enter
350
+ - type: wait
351
+ delay: 1500
352
+ assertions:
353
+ - type: visible
354
+ selector: '.search-result-list'
355
+ - type: count
356
+ selector: '.product-item'
357
+ count: 3
358
+
359
+ # ── 场景16: 商品详情 ──
360
+ - name: 商品-详情页
361
+ description: 模块:product 页面:/products/:id
362
+ actions:
363
+ - type: navigate
364
+ value: /products
365
+ - type: click
366
+ selector: '.product-item:first-child .product-title'
367
+ - type: wait
368
+ delay: 1000
369
+ assertions:
370
+ - type: visible
371
+ selector: '.product-detail'
372
+ - type: text
373
+ selector: '.product-name'
374
+ contains: iPhone
375
+ - type: visible
376
+ selector: '.product-price'
377
+
378
+ # ── 场景17: 商品筛选 ──
379
+ - name: 商品-多条件筛选
380
+ description: 模块:product 页面:/products 筛选功能
381
+ actions:
382
+ - type: navigate
383
+ value: /products
384
+ - type: select
385
+ selector: 'select[name="category"]'
386
+ value: electronics
387
+ - type: check
388
+ selector: 'input[value="inStock"]'
389
+ - type: click
390
+ selector: '.filter-submit-btn'
391
+ - type: wait
392
+ delay: 1200
393
+ assertions:
394
+ - type: visible
395
+ selector: '.product-list'
396
+ - type: count
397
+ selector: '.product-item'
398
+ count: 5
399
+
400
+ # ── 场景18: 商品收藏 ──
401
+ - name: 商品-收藏/取消收藏
402
+ description: 模块:product 页面:/products/:id 收藏功能
403
+ actions:
404
+ - type: navigate
405
+ value: /products/123
406
+ - type: click
407
+ selector: '.favorite-btn'
408
+ - type: wait
409
+ delay: 500
410
+ assertions:
411
+ - type: style
412
+ selector: '.favorite-btn'
413
+ style: color
414
+ value: rgb(255, 77, 79)
415
+
416
+ # ─────────────────────────────────────────────────────────────────────────────
417
+ # 四、购物车模块 (cart)
418
+ # ─────────────────────────────────────────────────────────────────────────────
419
+
420
+ # ── 场景19: 添加商品到购物车 ──
421
+ - name: 购物车-添加商品
422
+ description: 模块:cart 页面:/products/:id
423
+ actions:
424
+ - type: navigate
425
+ value: /products/123
426
+ - type: click
427
+ selector: '.add-to-cart-btn'
428
+ - type: wait
429
+ delay: 800
430
+ assertions:
431
+ - type: visible
432
+ selector: '.cart-badge'
433
+ - type: text
434
+ selector: '.cart-badge'
435
+ contains: '1'
436
+
437
+ # ── 场景20: 购物车数量修改 ──
438
+ - name: 购物车-修改数量
439
+ description: 模块:cart 页面:/cart
440
+ actions:
441
+ - type: navigate
442
+ value: /cart
96
443
  - type: fill
97
- selector: 'input[name="checkOut"]'
98
- value: '2026-10-05'
444
+ selector: '.cart-item:first-child .quantity-input'
445
+ value: '3'
446
+ - type: blur
447
+ selector: '.cart-item:first-child .quantity-input'
448
+ - type: wait
449
+ delay: 800
450
+ assertions:
451
+ - type: text
452
+ selector: '.cart-item:first-child .subtotal'
453
+ contains: '¥'
454
+
455
+ # ── 场景21: 购物车结算 ──
456
+ - name: 购物车-去结算
457
+ description: 模块:cart 页面:/cart
458
+ actions:
459
+ - type: navigate
460
+ value: /cart
461
+ - type: check
462
+ selector: '.cart-item:first-child .item-checkbox'
99
463
  - type: click
100
- selector: '.search-btn'
101
- waitFor: '.room-list'
464
+ selector: '.checkout-btn'
465
+ - type: wait
466
+ delay: 1500
467
+ assertions:
468
+ - type: url
469
+ contains: /checkout
470
+ - type: visible
471
+ selector: '.checkout-form'
472
+
473
+ # ── 场景22: 购物车删除商品 ──
474
+ - name: 购物车-删除商品
475
+ description: 模块:cart 页面:/cart
476
+ actions:
477
+ - type: navigate
478
+ value: /cart
102
479
  - type: click
103
- selector: '.room-item:first-child .select-btn'
480
+ selector: '.cart-item:first-child .delete-btn'
481
+ - type: wait
482
+ delay: 800
483
+ assertions:
484
+ - type: count
485
+ selector: '.cart-item'
486
+ count: 0
487
+
488
+ # ─────────────────────────────────────────────────────────────────────────────
489
+ # 五、订单模块 (order)
490
+ # ─────────────────────────────────────────────────────────────────────────────
491
+
492
+ # ── 场景23: 订单创建 ──
493
+ - name: 订单-创建订单
494
+ description: 模块:order 页面:/checkout
495
+ actions:
496
+ - type: navigate
497
+ value: /checkout
498
+ - type: fill
499
+ selector: 'input[name="receiverName"]'
500
+ value: 张三
501
+ - type: fill
502
+ selector: 'input[name="phone"]'
503
+ value: '13800138000'
504
+ - type: fill
505
+ selector: 'input[name="address"]'
506
+ value: 北京市朝阳区测试街道123号
104
507
  - type: click
105
- selector: '.submit-booking-btn'
106
- waitFor: '.booking-success'
508
+ selector: '.submit-order-btn'
509
+ - type: wait
510
+ delay: 2000
107
511
  assertions:
512
+ - type: url
513
+ contains: /order/success
108
514
  - type: visible
109
- selector: '.booking-success'
515
+ selector: '.order-success'
110
516
  - type: text
111
- selector: '.booking-success'
112
- contains: 预订成功
517
+ selector: '.order-success'
518
+ contains: 订单提交成功
519
+
520
+ # ── 场景24: 订单支付 ──
521
+ - name: 订单-支付订单
522
+ description: 模块:order 页面:/pay/:orderId
523
+ actions:
524
+ - type: navigate
525
+ value: /pay/ORD202409110001
526
+ - type: click
527
+ selector: '.pay-method-wechat'
528
+ - type: click
529
+ selector: '.confirm-pay-btn'
530
+ - type: waitForResponse
531
+ selector: '/api/pay/create'
532
+ timeout: 10000
533
+ - type: wait
534
+ delay: 2000
535
+ assertions:
536
+ - type: url
537
+ contains: /pay/success
538
+ - type: visible
539
+ selector: '.pay-success'
113
540
 
114
- # ── 场景5: 滚动 + 元素存在性检查 ──
115
- - name: 首页-滚动加载
541
+ # ── 场景25: 订单列表 ──
542
+ - name: 订单-列表查询
543
+ description: 模块:order 页面:/orders
544
+ actions:
545
+ - type: navigate
546
+ value: /orders
547
+ - type: wait
548
+ delay: 1000
549
+ assertions:
550
+ - type: visible
551
+ selector: '.order-list'
552
+ - type: count
553
+ selector: '.order-item'
554
+ count: 5
555
+
556
+ # ── 场景26: 订单详情 ──
557
+ - name: 订单-详情查看
558
+ description: 模块:order 页面:/orders/:id
559
+ actions:
560
+ - type: navigate
561
+ value: /orders
562
+ - type: click
563
+ selector: '.order-item:first-child .view-detail-btn'
564
+ - type: wait
565
+ delay: 800
566
+ assertions:
567
+ - type: visible
568
+ selector: '.order-detail'
569
+ - type: text
570
+ selector: '.order-status'
571
+ contains: 待付款
572
+
573
+ # ── 场景27: 订单取消 ──
574
+ - name: 订单-取消订单
575
+ description: 模块:order 页面:/orders/:id
576
+ actions:
577
+ - type: navigate
578
+ value: /orders/ORD202409110001
579
+ - type: click
580
+ selector: '.cancel-order-btn'
581
+ - type: wait
582
+ delay: 500
583
+ - type: click
584
+ selector: '.confirm-cancel-btn'
585
+ - type: wait
586
+ delay: 1500
587
+ assertions:
588
+ - type: text
589
+ selector: '.order-status'
590
+ contains: 已取消
591
+
592
+ # ─────────────────────────────────────────────────────────────────────────────
593
+ # 六、消息通知模块 (notification)
594
+ # ─────────────────────────────────────────────────────────────────────────────
595
+
596
+ # ── 场景28: 消息列表 ──
597
+ - name: 消息-列表查看
598
+ description: 模块:notification 页面:/notifications
599
+ actions:
600
+ - type: navigate
601
+ value: /notifications
602
+ - type: wait
603
+ delay: 1000
604
+ assertions:
605
+ - type: visible
606
+ selector: '.notification-list'
607
+ - type: count
608
+ selector: '.notification-item'
609
+ count: 3
610
+
611
+ # ── 场景29: 消息标记已读 ──
612
+ - name: 消息-标记已读
613
+ description: 模块:notification 页面:/notifications
614
+ actions:
615
+ - type: navigate
616
+ value: /notifications
617
+ - type: click
618
+ selector: '.notification-item:first-child'
619
+ - type: wait
620
+ delay: 500
621
+ assertions:
622
+ - type: style
623
+ selector: '.notification-item:first-child'
624
+ style: font-weight
625
+ value: '400'
626
+
627
+ # ─────────────────────────────────────────────────────────────────────────────
628
+ # 七、后台管理模块 (admin)
629
+ # ─────────────────────────────────────────────────────────────────────────────
630
+
631
+ # ── 场景30: 用户管理列表 ──
632
+ - name: 后台-用户管理
633
+ description: 模块:admin 页面:/admin/users
634
+ actions:
635
+ - type: navigate
636
+ value: /admin/users
637
+ - type: wait
638
+ delay: 1500
639
+ assertions:
640
+ - type: visible
641
+ selector: '.user-table'
642
+ - type: count
643
+ selector: '.user-table tbody tr'
644
+ count: 10
645
+
646
+ # ── 场景31: 数据报表(iframe 嵌入) ──
647
+ - name: 后台-数据报表iframe
648
+ description: 模块:admin 页面:/admin/reports iframe嵌入
649
+ actions:
650
+ - type: navigate
651
+ value: /admin/reports
652
+ - type: iframe
653
+ selector: '#report-frame'
654
+ - type: wait
655
+ delay: 2000
656
+ assertions:
657
+ - type: visible
658
+ selector: '.chart-container'
659
+ - type: count
660
+ selector: '.chart-item'
661
+ count: 4
662
+
663
+ # ── 场景32: 拖拽排序 ──
664
+ - name: 后台-拖拽排序
665
+ description: 模块:admin 页面:/admin/categories 拖拽排序
666
+ actions:
667
+ - type: navigate
668
+ value: /admin/categories
669
+ - type: drag
670
+ selector: '.category-item:first-child'
671
+ toSelector: '.category-item:last-child'
672
+ - type: wait
673
+ delay: 1000
674
+ assertions:
675
+ - type: text
676
+ selector: '.category-item:last-child .category-name'
677
+ contains: 原第一个分类
678
+
679
+ # ─────────────────────────────────────────────────────────────────────────────
680
+ # 八、通用能力与高级特性
681
+ # ─────────────────────────────────────────────────────────────────────────────
682
+
683
+ # ── 场景33: Cookie 注入免登录 ──
684
+ - name: 通用-Cookie注入免登录
685
+ description: 模块:common Cookie注入跳过登录
686
+ actions:
687
+ - type: cookie
688
+ selector: session_token
689
+ value: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
690
+ domain: example.com
691
+ path: /
692
+ secure: true
693
+ httpOnly: true
694
+ - type: cookie
695
+ selector: user_id
696
+ value: '10086'
697
+ domain: example.com
698
+ path: /
699
+ - type: navigate
700
+ value: /dashboard
701
+ - type: wait
702
+ delay: 1000
703
+ assertions:
704
+ - type: visible
705
+ selector: '.dashboard-container'
706
+ - type: text
707
+ selector: '.user-name'
708
+ contains: test_user
709
+
710
+ # ── 场景34: 首页滚动加载 ──
711
+ - name: 通用-首页滚动加载
116
712
  description: 模块:home 页面:/
117
713
  actions:
118
714
  - type: navigate
@@ -120,13 +716,20 @@ scenarios:
120
716
  - type: scroll
121
717
  selector: bottom
122
718
  - type: wait
123
- delay: 1000
719
+ delay: 1500
720
+ - type: scroll
721
+ selector: bottom
722
+ - type: wait
723
+ delay: 1500
124
724
  assertions:
125
725
  - type: visible
126
- selector: '.footer'
726
+ selector: '.load-more-btn'
727
+ - type: count
728
+ selector: '.product-card'
729
+ count: 20
127
730
 
128
- # ── 场景6: 样式断言 ──
129
- - name: 按钮-样式检查
731
+ # ── 场景35: 样式断言 ──
732
+ - name: 通用-按钮样式检查
130
733
  description: 模块:ui 页面:/
131
734
  actions:
132
735
  - type: navigate
@@ -136,3 +739,114 @@ scenarios:
136
739
  selector: '.primary-btn'
137
740
  style: background-color
138
741
  value: rgb(24, 144, 255)
742
+ - type: style
743
+ selector: '.primary-btn'
744
+ style: border-radius
745
+ value: 4px
746
+
747
+ # ── 场景36: 视觉对比测试 ──
748
+ - name: 通用-视觉对比测试
749
+ description: 模块:ui 页面:/ 视觉回归
750
+ actions:
751
+ - type: navigate
752
+ value: /
753
+ - type: screenshot
754
+ assertions:
755
+ - type: visual
756
+ selector: 'body'
757
+ threshold: normal
758
+
759
+ # ── 场景37: 键盘操作 ──
760
+ - name: 通用-键盘操作
761
+ description: 模块:common 页面:/products 键盘导航
762
+ actions:
763
+ - type: navigate
764
+ value: /products
765
+ - type: focus
766
+ selector: 'input[name="keyword"]'
767
+ - type: fill
768
+ selector: 'input[name="keyword"]'
769
+ value: MacBook
770
+ - type: press
771
+ key: Enter
772
+ - type: wait
773
+ delay: 1500
774
+ assertions:
775
+ - type: visible
776
+ selector: '.search-result-list'
777
+ - type: count
778
+ selector: '.product-item'
779
+ count: 2
780
+
781
+ # ── 场景38: hover 效果 ──
782
+ - name: 通用-hover效果
783
+ description: 模块:ui 页面:/products hover交互
784
+ actions:
785
+ - type: navigate
786
+ value: /products
787
+ - type: hover
788
+ selector: '.product-item:first-child'
789
+ - type: wait
790
+ delay: 500
791
+ assertions:
792
+ - type: style
793
+ selector: '.product-item:first-child'
794
+ style: box-shadow
795
+ contains: rgba
796
+
797
+ # ── 场景39: 元素隐藏检查 ──
798
+ - name: 通用-元素隐藏
799
+ description: 模块:ui 页面:/login 未登录状态
800
+ actions:
801
+ - type: navigate
802
+ value: /login
803
+ assertions:
804
+ - type: hidden
805
+ selector: '.user-menu'
806
+ - type: hidden
807
+ selector: '.logout-btn'
808
+
809
+ # ── 场景40: 表单值断言 ──
810
+ - name: 通用-表单值检查
811
+ description: 模块:user 页面:/profile/edit 表单默认值
812
+ actions:
813
+ - type: navigate
814
+ value: /profile/edit
815
+ assertions:
816
+ - type: value
817
+ selector: 'input[name="username"]'
818
+ equals: test_user
819
+ - type: value
820
+ selector: 'input[name="email"]'
821
+ contains: '@'
822
+
823
+ # ── 场景41: JavaScript 注入执行 ──
824
+ - name: 通用-JS脚本注入
825
+ description: 模块:common 页面:/ JS注入测试
826
+ actions:
827
+ - type: navigate
828
+ value: /
829
+ - type: script
830
+ value: 'window.testFlag = "injected";'
831
+ - type: wait
832
+ delay: 500
833
+ - type: script
834
+ value: 'return window.testFlag;'
835
+ assertions:
836
+ - type: text
837
+ selector: 'body'
838
+ contains: injected
839
+
840
+ # ── 场景42: 响应式断点测试 ──
841
+ - name: 通用-响应式布局
842
+ description: 模块:ui 页面:/ 移动端适配
843
+ actions:
844
+ - type: navigate
845
+ value: /
846
+ - type: wait
847
+ delay: 800
848
+ assertions:
849
+ - type: visible
850
+ selector: '.mobile-nav'
851
+ - type: hidden
852
+ selector: '.desktop-sidebar'