speccore 8.3.157 → 8.3.159
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/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +0 -13
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +66 -215
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.js +2 -2
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +1 -4
- package/dist/commands/update.js.map +1 -1
- package/dist/core/agents/defaults/_INDEX.md +15 -15
- package/dist/core/agents/defaults/code-reviewer.md +9 -0
- package/dist/core/agents/defaults/compiler.md +12 -3
- package/dist/core/agents/defaults/dependency-analyst.md +7 -0
- package/dist/core/agents/defaults/doc-sync-agent.md +7 -0
- package/dist/core/agents/defaults/impact-analyst.md +7 -0
- package/dist/core/agents/defaults/interaction-designer.md +17 -0
- package/dist/core/agents/defaults/performance-expert.md +9 -0
- package/dist/core/agents/defaults/regression-tester.md +7 -0
- package/dist/core/agents/defaults/security-reviewer.md +9 -0
- package/dist/core/agents/defaults/test-engineer.md +10 -0
- package/dist/core/agents/defaults/test-reviewer.md +10 -0
- package/dist/core/lock-manager.d.ts.map +1 -1
- package/dist/core/lock-manager.js +2 -0
- package/dist/core/lock-manager.js.map +1 -1
- package/dist/core/rules/defaults/ANALYSIS_QUALITY.md +73 -0
- package/dist/core/rules/defaults/EXECUTION.md +20 -0
- package/dist/core/rules/defaults/ITERATION_QUALITY.md +49 -0
- package/dist/core/rules/defaults/TASK_SPLIT.md +16 -0
- package/dist/core/schemas/context.schema.d.ts +87 -2
- package/dist/core/schemas/context.schema.d.ts.map +1 -1
- package/dist/core/schemas/iteration.schema.d.ts +132 -4
- package/dist/core/schemas/iteration.schema.d.ts.map +1 -1
- package/dist/core/schemas/platform.schema.d.ts +56 -2
- package/dist/core/schemas/platform.schema.d.ts.map +1 -1
- package/dist/core/schemas/task.schema.d.ts +157 -8
- package/dist/core/schemas/task.schema.d.ts.map +1 -1
- package/dist/core/spec-paths.d.ts.map +1 -1
- package/dist/core/spec-paths.js +4 -1
- package/dist/core/spec-paths.js.map +1 -1
- package/package.json +2 -3
- package/templates/api-design-example.md +0 -338
- package/templates/ci/github-actions.yml +0 -44
- package/templates/dashboard.html +0 -425
- package/templates/database-example.md +0 -223
- package/templates/deploy-docker/README.md +0 -284
- package/templates/deploy-docker/deploy-remote.sh +0 -79
- package/templates/deploy-docker/docker-compose.yml +0 -113
- package/templates/deploy-docker/frontend.Dockerfile +0 -43
- package/templates/deploy-docker/nginx.conf +0 -30
- package/templates/deploy-examples.yaml +0 -436
- package/templates/deploy-java/Dockerfile +0 -50
- package/templates/deploy-java/README.md +0 -212
- package/templates/deploy-java/deploy.sh +0 -120
- package/templates/deploy-java/spring-boot.service +0 -35
- package/templates/html/speccore-ask-explain.html +0 -10
- package/templates/html/speccore-ask-guide.html +0 -10
- package/templates/html/speccore-ask-match.html +0 -10
- package/templates/html/speccore-ask-pipeline.html +0 -1
- package/templates/html/speccore-ask-result.html +0 -10
- package/templates/html/speccore-demo.html +0 -449
- package/templates/html/speccore-dev.html +0 -202
- package/templates/html/speccore-help.html +0 -1
- package/templates/html/speccore-knowledge-graph.html +0 -656
- package/templates/html/speccore-retro-T-001.html +0 -1
- package/templates/html/speccore-setup-guide.html +0 -289
- package/templates/html/speccore-welcome.html +0 -1
- package/templates/security-example.md +0 -226
- package/templates/verify-spec-example.yaml +0 -982
package/templates/dashboard.html
DELETED
|
@@ -1,425 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="zh-CN">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
5
|
-
<title>SpecCore — my-project</title>
|
|
6
|
-
<style>
|
|
7
|
-
@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=JetBrains+Mono:wght@400;600;700&display=swap');
|
|
8
|
-
[data-theme="cyber"]{--cyan:#00f0ff;--blue:#3b82f6;--green:#00ff88;--purple:#a78bfa;--orange:#f59e0b;--bg:#060b14;--card:rgba(8,16,32,.85);--border:rgba(0,240,255,.12);--text:#c4d5e7;--muted:#4a5568;--surface:rgba(17,25,40,.7);--hover:rgba(0,240,255,.02)}
|
|
9
|
-
[data-theme="light"]{--cyan:#2563eb;--blue:#3b82f6;--green:#059669;--purple:#7c3aed;--orange:#d97706;--bg:#f8fafc;--card:rgba(255,255,255,.95);--border:rgba(0,0,0,.08);--text:#1e293b;--muted:#94a3b8;--surface:rgba(255,255,255,.95);--hover:rgba(37,99,235,.02)}
|
|
10
|
-
[data-theme="github"]{--cyan:#2da44e;--blue:#0969da;--green:#1a7f37;--purple:#8250df;--orange:#cf222e;--bg:#0d1117;--card:#161b22;--border:#30363d;--text:#c9d1d9;--muted:#8b949e;--surface:#161b22;--hover:rgba(45,164,78,.05)}
|
|
11
|
-
[data-theme="synth"]{--cyan:#f92aad;--blue:#ff7edb;--green:#36f9f6;--purple:#b381f9;--orange:#ffb86c;--bg:#1a0024;--card:rgba(30,0,50,.9);--border:rgba(249,42,173,.2);--text:#f8f8f2;--muted:#6b3e7a;--surface:rgba(30,0,50,.9);--hover:rgba(249,42,173,.05)}
|
|
12
|
-
[data-theme="ocean"]{--cyan:#0ea5e9;--blue:#0284c7;--green:#14b8a6;--purple:#6366f1;--orange:#f97316;--bg:#0b1929;--card:rgba(13,31,56,.9);--border:rgba(14,165,233,.15);--text:#bae6fd;--muted:#5b7fa5;--surface:rgba(13,31,56,.9);--hover:rgba(14,165,233,.05)}
|
|
13
|
-
[data-theme="sakura"]{--cyan:#f472b6;--blue:#c084fc;--green:#a3e635;--purple:#e879f9;--orange:#fb923c;--bg:#1a0a14;--card:rgba(30,10,20,.9);--border:rgba(244,114,182,.2);--text:#fce7f3;--muted:#9d4a6d;--surface:rgba(30,10,20,.9);--hover:rgba(244,114,182,.05)}
|
|
14
|
-
[data-theme="forest"]{--cyan:#059669;--blue:#0284c7;--green:#22c55e;--purple:#6366f1;--orange:#ca8a04;--bg:#0a140a;--card:rgba(12,24,12,.9);--border:rgba(5,150,105,.15);--text:#d1fae5;--muted:#3b6b4e;--surface:rgba(12,24,12,.9);--hover:rgba(5,150,105,.05)}
|
|
15
|
-
[data-theme="amber"]{--cyan:#ffb000;--blue:#ff8c00;--green:#32cd32;--purple:#da70d6;--orange:#ff6347;--bg:#0c0c0c;--card:#1a1a1a;--border:#333;--text:#ffb000;--muted:#666;--surface:#1a1a1a;--hover:rgba(255,176,0,.05)}
|
|
16
|
-
[data-theme="mono"]{--cyan:#64748b;--blue:#475569;--green:#334155;--purple:#1e293b;--orange:#94a3b8;--bg:#0f172a;--card:#1e293b;--border:#334155;--text:#e2e8f0;--muted:#64748b;--surface:#1e293b;--hover:rgba(100,116,139,.05)}
|
|
17
|
-
*,*::after,*::before{box-sizing:border-box;margin:0;padding:0}
|
|
18
|
-
.theme-sw{position:fixed;top:16px;right:16px;z-index:100;display:flex;gap:6px;background:var(--surface);border:1px solid var(--border);border-radius:20px;padding:4px;backdrop-filter:blur(10px)}.theme-sw button{width:32px;height:32px;border-radius:16px;border:none;cursor:pointer;transition:all .2s;font-size:14px;display:flex;align-items:center;justify-content:center;background:transparent}.theme-sw button:hover{transform:scale(1.1)}.theme-sw button.active{box-shadow:0 0 0 2px var(--cyan)}body{font-family:'JetBrains Mono',monospace;background:var(--bg);color:var(--text);min-height:100vh;overflow-x:hidden}
|
|
19
|
-
.scanlines{position:fixed;inset:0;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,240,255,.015) 2px,rgba(0,240,255,.015) 4px);pointer-events:none;z-index:999}
|
|
20
|
-
.stars{position:fixed;inset:0;background:radial-gradient(1px 1px at 10% 20%,rgba(255,255,255,.4),transparent),radial-gradient(1px 1px at 25% 65%,rgba(255,255,255,.3),transparent),radial-gradient(1.5px 1.5px at 50% 30%,rgba(0,240,255,.5),transparent),radial-gradient(1px 1px at 70% 55%,rgba(255,255,255,.35),transparent),radial-gradient(1px 1px at 85% 15%,rgba(168,85,247,.4),transparent),radial-gradient(1.5px 1.5px at 15% 80%,rgba(0,240,255,.45),transparent),radial-gradient(1px 1px at 60% 85%,rgba(255,255,255,.3),transparent),radial-gradient(1px 1px at 90% 75%,rgba(0,255,136,.4),transparent);pointer-events:none;z-index:0}
|
|
21
|
-
.grid-pattern{position:fixed;inset:0;background-image:linear-gradient(rgba(0,240,255,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(0,240,255,.03) 1px,transparent 1px);background-size:60px 60px;pointer-events:none;z-index:0}
|
|
22
|
-
main{position:relative;z-index:1;max-width:1400px;margin:0 auto;padding:40px 32px}
|
|
23
|
-
.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:36px;padding:24px 32px;background:var(--card);border:1px solid var(--border);border-radius:12px;backdrop-filter:blur(20px);position:relative;overflow:hidden}
|
|
24
|
-
.header::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scan 3s linear infinite}
|
|
25
|
-
@keyframes scan{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}
|
|
26
|
-
.header-left h1{font-family:'Orbitron',sans-serif;font-size:26px;font-weight:900;background:linear-gradient(135deg,var(--cyan),#818cf8);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;letter-spacing:2px;text-shadow:0 0 40px rgba(0,240,255,.3)}
|
|
27
|
-
.header-left .subtitle{color:var(--muted);font-size:12px;margin-top:4px;letter-spacing:1px}
|
|
28
|
-
.header-right{display:flex;gap:16px;align-items:center}
|
|
29
|
-
.header-stat{text-align:center;padding:0 20px;border-left:1px solid rgba(0,240,255,.1)}
|
|
30
|
-
.header-stat .num{font-family:'Orbitron',sans-serif;font-size:22px;font-weight:700;color:var(--cyan);text-shadow:0 0 20px rgba(0,240,255,.4)}
|
|
31
|
-
.header-stat .label{font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:1px}
|
|
32
|
-
.phase-indicator{display:flex;align-items:center;gap:8px;padding:8px 20px;border:1px solid rgba(0,240,255,.2);border-radius:20px;background:rgba(0,240,255,.05)}
|
|
33
|
-
.phase-indicator .dot{width:8px;height:8px;border-radius:50%;background:var(--cyan);box-shadow:0 0 12px var(--cyan);animation:pulse 2s ease-in-out infinite}
|
|
34
|
-
@keyframes pulse{0%,100%{box-shadow:0 0 12px var(--cyan)}50%{box-shadow:0 0 24px var(--cyan),0 0 48px rgba(0,240,255,.3)}}
|
|
35
|
-
.phase-indicator span{font-size:12px;color:var(--cyan);letter-spacing:1px}
|
|
36
|
-
.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-bottom:28px}
|
|
37
|
-
@media(max-width:1000px){.grid{grid-template-columns:1fr}}
|
|
38
|
-
.card{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:28px;backdrop-filter:blur(20px);position:relative;overflow:hidden;transition:all .3s}
|
|
39
|
-
.card:hover{border-color:rgba(0,240,255,.25);box-shadow:0 0 30px rgba(0,240,255,.08),inset 0 0 30px rgba(0,240,255,.02)}
|
|
40
|
-
.card-icon{font-size:28px;margin-bottom:16px;display:block}
|
|
41
|
-
.card h3{font-size:11px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:2px;margin-bottom:8px}
|
|
42
|
-
.card .big-num{font-family:'Orbitron',sans-serif;font-size:42px;font-weight:900;line-height:1}
|
|
43
|
-
.card .big-num.cyan{color:var(--cyan);text-shadow:0 0 30px rgba(0,240,255,.3)}
|
|
44
|
-
.card .big-num.green{color:var(--green);text-shadow:0 0 30px rgba(0,255,136,.3)}
|
|
45
|
-
.card .big-num.purple{color:var(--purple);text-shadow:0 0 30px rgba(168,85,247,.3)}
|
|
46
|
-
.tech-bar{height:4px;background:rgba(255,255,255,.04);border-radius:2px;margin-top:16px;overflow:hidden;position:relative}
|
|
47
|
-
.tech-bar-fill{height:100%;border-radius:2px;position:relative;transition:width 1.5s cubic-bezier(.4,0,.2,1)}
|
|
48
|
-
.tech-bar-fill::after{content:'';position:absolute;top:0;right:0;width:20px;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.4))}
|
|
49
|
-
.tech-bar-fill.cyan{background:linear-gradient(90deg,#0369a1,var(--cyan));box-shadow:0 0 12px rgba(0,240,255,.3)}
|
|
50
|
-
.tech-bar-fill.green{background:linear-gradient(90deg,#065f46,var(--green));box-shadow:0 0 12px rgba(0,255,136,.3)}
|
|
51
|
-
.tech-bar-fill.purple{background:linear-gradient(90deg,#5b21b6,var(--purple));box-shadow:0 0 12px rgba(168,85,247,.3)}
|
|
52
|
-
.stacked{display:flex;height:36px;border-radius:6px;overflow:hidden;gap:2px;margin-top:16px}
|
|
53
|
-
.stacked-seg{display:flex;align-items:center;justify-content:center;font-family:'JetBrains Mono',monospace;font-size:13px;font-weight:700;letter-spacing:.5px}
|
|
54
|
-
.panel{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:28px;backdrop-filter:blur(20px);margin-bottom:20px}
|
|
55
|
-
.panel-title{font-family:'Orbitron',sans-serif;font-size:14px;font-weight:700;color:var(--cyan);letter-spacing:2px;margin-bottom:20px;display:flex;align-items:center;gap:10px}
|
|
56
|
-
.panel-title::before{content:'◆';font-size:10px;color:var(--cyan);text-shadow:0 0 8px var(--cyan)}
|
|
57
|
-
table{width:100%;border-collapse:collapse}
|
|
58
|
-
th{padding:14px 16px;font-size:10px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:1.5px;border-bottom:1px solid rgba(0,240,255,.08);text-align:left}
|
|
59
|
-
td{padding:14px 16px;border-bottom:1px solid rgba(0,240,255,.03);font-size:13px;transition:all .2s}
|
|
60
|
-
tr:hover td{background:rgba(0,240,255,.02)}
|
|
61
|
-
td.code{font-family:'JetBrains Mono',monospace;color:var(--text);font-weight:600}
|
|
62
|
-
.tx-badge{display:inline-flex;align-items:center;gap:6px;padding:5px 14px;border-radius:4px;font-size:11px;font-weight:600;letter-spacing:.5px}
|
|
63
|
-
.tx-badge::before{content:'';width:6px;height:6px;border-radius:50%}
|
|
64
|
-
.tx-done{background:rgba(0,255,136,.08);color:var(--green);border:1px solid rgba(0,255,136,.2)}
|
|
65
|
-
.tx-done::before{background:var(--green);box-shadow:0 0 8px var(--green)}
|
|
66
|
-
.tx-active{background:rgba(0,240,255,.08);color:var(--cyan);border:1px solid rgba(0,240,255,.2)}
|
|
67
|
-
.tx-active::before{background:var(--cyan);box-shadow:0 0 8px var(--cyan);animation:pulse 2s infinite}
|
|
68
|
-
.tx-wait{background:rgba(100,116,139,.08);color:var(--muted);border:1px solid rgba(100,116,139,.2)}
|
|
69
|
-
.tx-wait::before{background:#64748b}
|
|
70
|
-
.type-t{display:inline-block;padding:3px 10px;border-radius:4px;font-size:10px;font-weight:700;letter-spacing:.5px;text-transform:uppercase}
|
|
71
|
-
.type-feat{background:rgba(59,130,246,.12);color:#60a5fa}
|
|
72
|
-
.type-bug{background:rgba(245,158,11,.12);color:#fbbf24}
|
|
73
|
-
.type-res{background:rgba(168,85,247,.12);color:#c084fc}
|
|
74
|
-
.footer{display:flex;justify-content:space-between;align-items:center;margin-top:28px;padding:16px 0;border-top:1px solid rgba(0,240,255,.06);color:var(--muted);font-size:11px;letter-spacing:1px}
|
|
75
|
-
.data-stream{position:absolute;bottom:0;left:0;right:0;height:30px;background:linear-gradient(transparent,rgba(0,240,255,.02));overflow:hidden}
|
|
76
|
-
.num-font{font-family:'Orbitron',sans-serif;font-size:18px;color:var(--cyan)}.data-stream span{position:absolute;color:rgba(0,240,255,.15);font-family:'JetBrains Mono',monospace;font-size:10px;white-space:nowrap;animation:stream 20s linear infinite}
|
|
77
|
-
@keyframes stream{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}
|
|
78
|
-
|
|
79
|
-
.fs-btn{position:absolute;top:10px;right:10px;width:28px;height:28px;border-radius:6px;background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.06);color:var(--muted);cursor:pointer;font-size:14px;display:flex;align-items:center;justify-content:center;transition:all .2s;z-index:10;opacity:0}
|
|
80
|
-
.card:hover .fs-btn,.panel:hover .fs-btn{opacity:1}
|
|
81
|
-
.fs-btn:hover{background:rgba(0,240,255,.1);border-color:rgba(0,240,255,.3);color:var(--cyan)}
|
|
82
|
-
.fs-fullscreen{position:fixed!important;inset:0!important;z-index:1000!important;border-radius:0!important;overflow-y:auto!important;overscroll-behavior:contain!important}.fs-fullscreen::-webkit-scrollbar{width:6px}.fs-fullscreen::-webkit-scrollbar-thumb{background:rgba(0,240,255,.2);border-radius:3px}.fs-fullscreen{background:var(--bg)!important;backdrop-filter:none!important;opacity:1!important;padding:40px!important;width:100vw!important;height:100vh!important;max-width:none!important}.fs-fullscreen svg{width:100%!important;height:auto!important;max-height:65vh!important}.fs-fullscreen table{font-size:16px}.fs-fullscreen .stat-value{font-size:52px}.fs-fullscreen .big-num{font-size:64px}.fs-fullscreen .card{padding:36px}
|
|
83
|
-
.fs-tip{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);background:rgba(0,240,255,.1);border:1px solid rgba(0,240,255,.2);padding:8px 20px;border-radius:20px;font-size:11px;color:var(--cyan);z-index:1001;letter-spacing:1px;animation:fadeIn .3s ease;pointer-events:none}
|
|
84
|
-
@keyframes fadeIn{from{opacity:0;transform:translateX(-50%) translateY(10px)}to{opacity:1;transform:translateX(-50%) translateY(0)}}
|
|
85
|
-
@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}
|
|
86
|
-
.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}
|
|
87
|
-
|
|
88
|
-
@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>
|
|
89
|
-
</head>
|
|
90
|
-
<body>
|
|
91
|
-
<div class="theme-sw"><button onclick="setTheme('ocean')" title="Ocean Blue">🌊</button><button onclick="setTheme('cyber')" title="Cyber Dark">🌙</button><button onclick="setTheme('light')" title="Light Studio">☀️</button><button onclick="setTheme('mono')" title="Mono Tech">⬛</button><button onclick="setTheme('github')" title="GitHub Dark">🐙</button><button onclick="setTheme('synth')" title="SynthWave">💜</button><button onclick="setTheme('amber')" title="Amber Terminal">🟡</button><button onclick="setTheme('sakura')" title="Cherry Sakura">🌸</button><button onclick="setTheme('forest')" title="Midnight Forest">🌲</button></div>
|
|
92
|
-
<div class="grid-pattern"></div><div class="stars"></div><div class="scanlines"></div>
|
|
93
|
-
<main>
|
|
94
|
-
<div class="header">
|
|
95
|
-
<div class="card-bg"></div>
|
|
96
|
-
<div class="header-left">
|
|
97
|
-
<h1>MY-PROJECT</h1>
|
|
98
|
-
<div class="subtitle">SPECCORE · SPEC-DRIVEN DEVELOPMENT · OWNER: 赵六</div>
|
|
99
|
-
</div>
|
|
100
|
-
<div class="header-right">
|
|
101
|
-
<div class="header-stat"><div class="num">Q2</div><div class="label">期次</div></div>
|
|
102
|
-
<div class="header-stat"><div class="num">5</div><div class="label">任务</div></div>
|
|
103
|
-
<div class="header-stat"><div class="num">0%</div><div class="label">完成</div></div>
|
|
104
|
-
<div class="phase-indicator"><div class="dot"></div><span>开发中</span></div>
|
|
105
|
-
</div>
|
|
106
|
-
</div>
|
|
107
|
-
|
|
108
|
-
<div class="panel" style="margin-bottom:24px">
|
|
109
|
-
<div class="panel-title">ITERATION TIMELINE</div>
|
|
110
|
-
<div style="display:flex;align-items:center;gap:20px;flex-wrap:wrap">
|
|
111
|
-
<div style="flex:1;min-width:300px">
|
|
112
|
-
<div style="display:flex;justify-content:space-between;margin-bottom:8px;font-size:11px;color:var(--muted)">
|
|
113
|
-
<span>2026-04-01</span>
|
|
114
|
-
<span style="color:var(--cyan)">TODAY</span>
|
|
115
|
-
<span>2026-06-30</span>
|
|
116
|
-
</div>
|
|
117
|
-
<div style="height:8px;background:rgba(255,255,255,.04);border-radius:4px;overflow:hidden;position:relative">
|
|
118
|
-
<div style="position:absolute;top:0;left:100%;width:2px;height:100%;background:var(--cyan);box-shadow:0 0 8px var(--cyan);z-index:2"></div>
|
|
119
|
-
<div style="width:100%;height:100%;background:linear-gradient(90deg,rgba(0,240,255,.3),rgba(0,240,255,.6));border-radius:4px;transition:width 1s"></div>
|
|
120
|
-
</div>
|
|
121
|
-
<div style="display:flex;justify-content:space-between;margin-top:6px;font-size:10px;color:var(--muted)">
|
|
122
|
-
<span>TIME ELAPSED: 100%</span>
|
|
123
|
-
<span style="color:var(--orange)">OVERDUE: -33</span>
|
|
124
|
-
</div>
|
|
125
|
-
</div>
|
|
126
|
-
<div style="display:flex;gap:16px">
|
|
127
|
-
<div style="text-align:center;padding:12px 20px;background:rgba(0,240,255,.05);border:1px solid rgba(0,240,255,.15);border-radius:8px">
|
|
128
|
-
<div style="font-family:Orbitron;font-size:20px;color:var(--cyan);text-shadow:0 0 12px rgba(0,240,255,.3)">-33</div>
|
|
129
|
-
<div style="font-size:10px;color:var(--muted);margin-top:4px">DAYS</div>
|
|
130
|
-
</div>
|
|
131
|
-
<div style="text-align:center;padding:12px 20px;background:rgba(0,255,136,.05);border:1px solid rgba(0,255,136,.15);border-radius:8px">
|
|
132
|
-
<div style="font-family:Orbitron;font-size:20px;color:var(--green);text-shadow:0 0 12px rgba(0,255,136,.3)">0%</div>
|
|
133
|
-
<div style="font-size:10px;color:var(--muted);margin-top:4px">DONE</div>
|
|
134
|
-
</div>
|
|
135
|
-
</div>
|
|
136
|
-
</div>
|
|
137
|
-
<div style="margin-top:20px;display:flex;gap:12px;flex-wrap:wrap"><div style="flex:1;min-width:120px;padding:12px 16px;background:rgba(0,255,136,.05);border:1px solid rgba(0,255,136,.15);border-radius:8px;text-align:center"><div style="font-size:20px;margin-bottom:4px">🧪</div><div style="font-family:Orbitron;font-size:16px;color:var(--green)">2026-05-15</div><div style="font-size:10px;color:var(--muted);margin-top:4px;letter-spacing:1px">提测</div></div><div style="flex:1;min-width:120px;padding:12px 16px;background:rgba(0,255,136,.05);border:1px solid rgba(0,255,136,.15);border-radius:8px;text-align:center"><div style="font-size:20px;margin-bottom:4px">🔬</div><div style="font-family:Orbitron;font-size:16px;color:var(--green)">2026-05-30</div><div style="font-size:10px;color:var(--muted);margin-top:4px;letter-spacing:1px">SIT</div></div><div style="flex:1;min-width:120px;padding:12px 16px;background:rgba(0,255,136,.05);border:1px solid rgba(0,255,136,.15);border-radius:8px;text-align:center"><div style="font-size:20px;margin-bottom:4px">✅</div><div style="font-family:Orbitron;font-size:16px;color:var(--green)">2026-06-10</div><div style="font-size:10px;color:var(--muted);margin-top:4px;letter-spacing:1px">UAT</div></div><div style="flex:1;min-width:120px;padding:12px 16px;background:rgba(0,255,136,.05);border:1px solid rgba(0,255,136,.15);border-radius:8px;text-align:center"><div style="font-size:20px;margin-bottom:4px">🚀</div><div style="font-family:Orbitron;font-size:16px;color:var(--green)">2026-06-25</div><div style="font-size:10px;color:var(--muted);margin-top:4px;letter-spacing:1px">上线</div></div></div>
|
|
138
|
-
<div style="margin-top:16px;padding:12px 16px;background:rgba(245,158,11,.05);border:1px solid rgba(245,158,11,.15);border-radius:8px"><div style="font-size:10px;color:var(--orange);letter-spacing:1px;margin-bottom:8px">⚠ DELAY HISTORY (3)</div><div style="font-size:11px;color:var(--text);margin-bottom:4px;display:flex;gap:12px"><span style="color:var(--orange);font-family:Orbitron;font-size:10px">2026-05-20</span><span>后端接口联调延期3天</span></div><div style="font-size:11px;color:var(--text);margin-bottom:4px;display:flex;gap:12px"><span style="color:var(--orange);font-family:Orbitron;font-size:10px">2026-06-05</span><span>SIT阶段发现严重bug延期5天</span></div><div style="font-size:11px;color:var(--text);margin-bottom:4px;display:flex;gap:12px"><span style="color:var(--orange);font-family:Orbitron;font-size:10px">2026-06-28</span><span>上线审批未通过延期至7月初</span></div></div>
|
|
139
|
-
</div>
|
|
140
|
-
|
|
141
|
-
<div class="grid">
|
|
142
|
-
<div class="card">
|
|
143
|
-
<button class="fs-btn" title="Fullscreen (F)" onclick="toggleFS(this.parentElement)">⛶</button>
|
|
144
|
-
<div class="data-stream"><span>ANALYZING PHASE PROGRESS...</span></div>
|
|
145
|
-
<span class="card-icon">⏳</span>
|
|
146
|
-
<h3>Phase Progress</h3>
|
|
147
|
-
<div class="big-num cyan">开发中</div>
|
|
148
|
-
<div class="tech-bar"><div class="tech-bar-fill cyan" style="width:60%"></div></div>
|
|
149
|
-
<div style="color:var(--muted);font-size:11px;margin-top:8px;letter-spacing:1px">60% COMPLETE</div>
|
|
150
|
-
</div>
|
|
151
|
-
|
|
152
|
-
<div class="card">
|
|
153
|
-
<button class="fs-btn" title="Fullscreen (F)" onclick="toggleFS(this.parentElement)">⛶</button>
|
|
154
|
-
<div class="data-stream"><span>PARSING TASK DISTRIBUTION...</span></div>
|
|
155
|
-
<span class="card-icon">📊</span>
|
|
156
|
-
<h3>Task Distribution</h3>
|
|
157
|
-
<div class="big-num purple">5</div>
|
|
158
|
-
<div class="stacked">
|
|
159
|
-
<div class="stacked-seg" style="width:0%;background:linear-gradient(180deg,#065f46,var(--green))"></div>
|
|
160
|
-
<div class="stacked-seg" style="width:40%;background:linear-gradient(180deg,#0c4a6e,var(--cyan))">2</div>
|
|
161
|
-
<div class="stacked-seg" style="width:60%;background:rgba(255,255,255,.03)">3</div>
|
|
162
|
-
</div>
|
|
163
|
-
<div style="display:flex;gap:20px;margin-top:12px;font-size:11px;color:var(--muted)">
|
|
164
|
-
<span>■ 0 DONE</span><span>■ 2 ACTIVE</span><span>■ 3 QUEUED</span>
|
|
165
|
-
</div>
|
|
166
|
-
</div>
|
|
167
|
-
|
|
168
|
-
<div class="card">
|
|
169
|
-
<button class="fs-btn" title="Fullscreen (F)" onclick="toggleFS(this.parentElement)">⛶</button>
|
|
170
|
-
<div class="data-stream"><span>CALCULATING COMPLETION RATE...</span></div>
|
|
171
|
-
<span class="card-icon">🎯</span>
|
|
172
|
-
<h3>Completion Rate</h3>
|
|
173
|
-
<div class="big-num green">0%</div>
|
|
174
|
-
<div class="tech-bar"><div class="tech-bar-fill green" style="width:0%"></div></div>
|
|
175
|
-
<div style="color:var(--muted);font-size:11px;margin-top:8px;letter-spacing:1px">0/5 TASKS RESOLVED</div>
|
|
176
|
-
</div>
|
|
177
|
-
</div>
|
|
178
|
-
|
|
179
|
-
<div class="grid" style="grid-template-columns:1fr 1fr;margin-top:0">
|
|
180
|
-
<div class="card">
|
|
181
|
-
<button class="fs-btn" title="Fullscreen (F)" onclick="toggleFS(this.parentElement)">⛶</button>
|
|
182
|
-
<div class="data-stream"><span>GENERATING DONUT METRICS...</span></div>
|
|
183
|
-
<h3 style="margin-bottom:20px">COMPLETION BREAKDOWN</h3>
|
|
184
|
-
<div style="display:flex;align-items:center;gap:32px;justify-content:center">
|
|
185
|
-
<svg viewBox="0 0 160 160" style="width:160px;height:160px">
|
|
186
|
-
<defs>
|
|
187
|
-
<linearGradient id="d1" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#00ff88"/><stop offset="100%" stop-color="#10b981"/></linearGradient>
|
|
188
|
-
<linearGradient id="d2" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#00f0ff"/><stop offset="100%" stop-color="#3b82f6"/></linearGradient>
|
|
189
|
-
<linearGradient id="d3" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#a78bfa"/><stop offset="100%" stop-color="#6366f1"/></linearGradient>
|
|
190
|
-
</defs>
|
|
191
|
-
<circle cx="80" cy="80" r="60" fill="none" stroke="rgba(255,255,255,.03)" stroke-width="22"/>
|
|
192
|
-
<circle cx="80" cy="80" r="60" fill="none" stroke="url(#d1)" stroke-width="22"
|
|
193
|
-
stroke-dasharray="0 377" stroke-dashoffset="0" transform="rotate(-90,80,80)" stroke-linecap="round"/>
|
|
194
|
-
<text x="80" y="72" text-anchor="middle" font-family="Orbitron" font-size="28" font-weight="900" fill="var(--cyan)" text-shadow="0 0 20px rgba(0,240,255,.4)">0%</text>
|
|
195
|
-
<text x="80" y="95" text-anchor="middle" font-size="10" fill="#4a5568" letter-spacing="1">COMPLETE</text>
|
|
196
|
-
</svg>
|
|
197
|
-
<div style="display:flex;flex-direction:column;gap:12px">
|
|
198
|
-
<div style="display:flex;align-items:center;gap:8px"><div style="width:10px;height:10px;border-radius:2px;background:var(--green);box-shadow:0 0 8px var(--green)"></div><span style="font-size:12px;color:var(--text)">RESOLVED</span><span style="font-family:Orbitron;font-size:14px;color:var(--green);margin-left:auto">0</span></div>
|
|
199
|
-
<div style="display:flex;align-items:center;gap:8px"><div style="width:10px;height:10px;border-radius:2px;background:var(--cyan);box-shadow:0 0 8px var(--cyan)"></div><span style="font-size:12px;color:var(--text)">ACTIVE</span><span style="font-family:Orbitron;font-size:14px;color:var(--cyan);margin-left:auto">2</span></div>
|
|
200
|
-
<div style="display:flex;align-items:center;gap:8px"><div style="width:10px;height:10px;border-radius:2px;background:#4a5568"></div><span style="font-size:12px;color:var(--muted)">QUEUED</span><span style="font-family:Orbitron;font-size:14px;color:var(--muted);margin-left:auto">3</span></div>
|
|
201
|
-
</div>
|
|
202
|
-
</div>
|
|
203
|
-
</div>
|
|
204
|
-
|
|
205
|
-
<div class="card">
|
|
206
|
-
<button class="fs-btn" title="Fullscreen (F)" onclick="toggleFS(this.parentElement)">⛶</button>
|
|
207
|
-
<div class="data-stream"><span>RENDERING TASK TIMELINE...</span></div>
|
|
208
|
-
<h3 style="margin-bottom:20px">TASK PROGRESS</h3>
|
|
209
|
-
<div style="display:flex;flex-direction:column;gap:14px">
|
|
210
|
-
<div style="display:flex;align-items:center;gap:10px"><span style="font-size:10px;color:var(--muted);width:60px;text-align:right">Task-001</span><div style="flex:1;height:6px;background:rgba(255,255,255,.03);border-radius:3px;overflow:hidden"><div style="width:100%;height:100%;background:var(--green);border-radius:3px;box-shadow:0 0 8px var(--green);transition:width 1.5s"></div></div><span style="font-family:Orbitron;font-size:11px;color:var(--green);width:32px">100%</span></div><div style="display:flex;align-items:center;gap:10px"><span style="font-size:10px;color:var(--muted);width:60px;text-align:right">Task-002</span><div style="flex:1;height:6px;background:rgba(255,255,255,.03);border-radius:3px;overflow:hidden"><div style="width:85%;height:100%;background:var(--cyan);border-radius:3px;box-shadow:0 0 8px var(--cyan);transition:width 1.5s"></div></div><span style="font-family:Orbitron;font-size:11px;color:var(--cyan);width:32px">85%</span></div><div style="display:flex;align-items:center;gap:10px"><span style="font-size:10px;color:var(--muted);width:60px;text-align:right">Task-003</span><div style="flex:1;height:6px;background:rgba(255,255,255,.03);border-radius:3px;overflow:hidden"><div style="width:45%;height:100%;background:#4a5568;border-radius:3px;box-shadow:0 0 8px transparent;transition:width 1.5s"></div></div><span style="font-family:Orbitron;font-size:11px;color:#4a5568;width:32px">45%</span></div><div style="display:flex;align-items:center;gap:10px"><span style="font-size:10px;color:var(--muted);width:60px;text-align:right">Task-004</span><div style="flex:1;height:6px;background:rgba(255,255,255,.03);border-radius:3px;overflow:hidden"><div style="width:20%;height:100%;background:#4a5568;border-radius:3px;box-shadow:0 0 8px transparent;transition:width 1.5s"></div></div><span style="font-family:Orbitron;font-size:11px;color:#4a5568;width:32px">20%</span></div><div style="display:flex;align-items:center;gap:10px"><span style="font-size:10px;color:var(--muted);width:60px;text-align:right">Task-005</span><div style="flex:1;height:6px;background:rgba(255,255,255,.03);border-radius:3px;overflow:hidden"><div style="width:5%;height:100%;background:#4a5568;border-radius:3px;box-shadow:0 0 8px transparent;transition:width 1.5s"></div></div><span style="font-family:Orbitron;font-size:11px;color:#4a5568;width:32px">5%</span></div>
|
|
211
|
-
</div>
|
|
212
|
-
</div>
|
|
213
|
-
</div>
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
<div class="grid" style="grid-template-columns:1fr 1fr;margin-bottom:20px">
|
|
217
|
-
<div class="card" style="min-height:280px">
|
|
218
|
-
<button class="fs-btn" title="Fullscreen (F)" onclick="toggleFS(this.parentElement)">⛶</button>
|
|
219
|
-
<div class="data-stream"><span>RENDERING GANTT CHART...</span></div>
|
|
220
|
-
<h3 style="margin-bottom:16px">GANTT TIMELINE</h3>
|
|
221
|
-
<div style="overflow-x:auto">
|
|
222
|
-
<svg viewBox="0 0 500 180" style="width:100%;height:180px;min-width:400px">
|
|
223
|
-
<defs>
|
|
224
|
-
<linearGradient id="gGrad" x1="0" y1="0" x2="1" y2="0"><stop offset="0%" stop-color="var(--cyan)"/><stop offset="100%" stop-color="var(--green)"/></linearGradient>
|
|
225
|
-
</defs>
|
|
226
|
-
<!-- Date axis marks -->
|
|
227
|
-
<line x1="60" y1="30" x2="480" y2="30" stroke="rgba(0,240,255,.1)" stroke-width="1"/>
|
|
228
|
-
<text x="60" y="25" fill="#4a5568" font-size="10">APR</text>
|
|
229
|
-
<text x="170" y="25" fill="#4a5568" font-size="10">MAY</text>
|
|
230
|
-
<text x="280" y="25" fill="#4a5568" font-size="10">JUN</text>
|
|
231
|
-
<text x="390" y="25" fill="#4a5568" font-size="10">JUL</text>
|
|
232
|
-
<!-- Today line -->
|
|
233
|
-
<line x1="310" y1="35" x2="310" y2="160" stroke="var(--cyan)" stroke-width="1" stroke-dasharray="4,4" opacity=".5"/>
|
|
234
|
-
<text x="310" y="172" fill="var(--cyan)" font-size="9" text-anchor="middle" opacity=".8">TODAY</text>
|
|
235
|
-
<!-- Task bars -->
|
|
236
|
-
<rect x="60" y="55" width="100" height="16" rx="4" fill="#334155" opacity=".85"/><text x="64" y="67" fill="#060b14" font-size="9" font-weight="600">Task-001</text><rect x="80" y="79" width="85" height="16" rx="4" fill="#334155" opacity=".85"/><text x="84" y="91" fill="#060b14" font-size="9" font-weight="600">Task-002</text><rect x="100" y="103" width="70" height="16" rx="4" fill="#334155" opacity=".85"/><text x="104" y="115" fill="#060b14" font-size="9" font-weight="600">Task-003</text><rect x="120" y="127" width="55" height="16" rx="4" fill="var(--cyan)" opacity=".85"/><text x="124" y="139" fill="#060b14" font-size="9" font-weight="600">Task-004</text><rect x="140" y="151" width="40" height="16" rx="4" fill="var(--cyan)" opacity=".85"/><text x="144" y="163" fill="#060b14" font-size="9" font-weight="600">Task-005</text>
|
|
237
|
-
</svg>
|
|
238
|
-
</div>
|
|
239
|
-
</div>
|
|
240
|
-
|
|
241
|
-
<div class="card" style="min-height:280px">
|
|
242
|
-
<button class="fs-btn" title="Fullscreen (F)" onclick="toggleFS(this.parentElement)">⛶</button>
|
|
243
|
-
<div class="data-stream"><span>CALCULATING BURNDOWN...</span></div>
|
|
244
|
-
<h3 style="margin-bottom:16px">BURNDOWN CHART</h3>
|
|
245
|
-
<svg viewBox="0 0 500 180" style="width:100%;height:180px;min-width:400px">
|
|
246
|
-
<defs>
|
|
247
|
-
<linearGradient id="idealGrad" x1="0" y1="0" x2="1" y2="0"><stop offset="0%" stop-color="var(--cyan)"/><stop offset="100%" stop-color="#818cf8"/></linearGradient>
|
|
248
|
-
<linearGradient id="actualGrad" x1="0" y1="0" x2="1" y2="0"><stop offset="0%" stop-color="var(--green)"/><stop offset="100%" stop-color="#34d399"/></linearGradient>
|
|
249
|
-
</defs>
|
|
250
|
-
<!-- Grid -->
|
|
251
|
-
<line x1="60" y1="30" x2="480" y2="30" stroke="rgba(255,255,255,.03)" stroke-width="1"/><line x1="60" y1="56" x2="480" y2="56" stroke="rgba(255,255,255,.03)" stroke-width="1"/><line x1="60" y1="82" x2="480" y2="82" stroke="rgba(255,255,255,.03)" stroke-width="1"/><line x1="60" y1="108" x2="480" y2="108" stroke="rgba(255,255,255,.03)" stroke-width="1"/><line x1="60" y1="134" x2="480" y2="134" stroke="rgba(255,255,255,.03)" stroke-width="1"/><line x1="60" y1="160" x2="480" y2="160" stroke="rgba(255,255,255,.03)" stroke-width="1"/>
|
|
252
|
-
<text x="55" y="35" fill="#4a5568" font-size="10" text-anchor="end">5</text>
|
|
253
|
-
<text x="55" y="61" fill="#4a5568" font-size="10" text-anchor="end">4</text>
|
|
254
|
-
<text x="55" y="87" fill="#4a5568" font-size="10" text-anchor="end">3</text>
|
|
255
|
-
<text x="55" y="113" fill="#4a5568" font-size="10" text-anchor="end">2</text>
|
|
256
|
-
<text x="55" y="139" fill="#4a5568" font-size="10" text-anchor="end">1</text>
|
|
257
|
-
<text x="55" y="165" fill="#4a5568" font-size="10" text-anchor="end">0</text>
|
|
258
|
-
<!-- Ideal line (diagonal: 5 -> 0) -->
|
|
259
|
-
<polyline points="70,35 460,160" fill="none" stroke="url(#idealGrad)" stroke-width="2" stroke-dasharray="6,4" opacity=".6"/>
|
|
260
|
-
<!-- Actual line (step: 5,5,4,2,2,...) -->
|
|
261
|
-
<polyline points="70,35 150,35 230,61 310,113 420,113 460,139" fill="none" stroke="url(#actualGrad)" stroke-width="2.5" stroke-linecap="round"/>
|
|
262
|
-
<!-- Dots -->
|
|
263
|
-
<circle cx="70" cy="35" r="3" fill="var(--green)"/>
|
|
264
|
-
<circle cx="150" cy="35" r="3" fill="var(--green)"/>
|
|
265
|
-
<circle cx="230" cy="61" r="3" fill="var(--green)"/>
|
|
266
|
-
<circle cx="310" cy="113" r="4" fill="var(--cyan)" stroke="var(--cyan)" stroke-width="2"/>
|
|
267
|
-
<circle cx="420" cy="113" r="3" fill="#4a5568"/>
|
|
268
|
-
<circle cx="460" cy="139" r="3" fill="#4a5568"/>
|
|
269
|
-
<!-- Labels -->
|
|
270
|
-
<text x="70" y="25" fill="#4a5568" font-size="9" text-anchor="middle">W1</text>
|
|
271
|
-
<text x="150" y="25" fill="#4a5568" font-size="9" text-anchor="middle">W2</text>
|
|
272
|
-
<text x="230" y="25" fill="#4a5568" font-size="9" text-anchor="middle">W3</text>
|
|
273
|
-
<text x="310" y="25" fill="#4a5568" font-size="9" text-anchor="middle">W4</text>
|
|
274
|
-
<text x="420" y="25" fill="#4a5568" font-size="9" text-anchor="middle">W5</text>
|
|
275
|
-
<text x="460" y="25" fill="#4a5568" font-size="9" text-anchor="middle">W6</text>
|
|
276
|
-
<!-- Legend -->
|
|
277
|
-
<line x1="60" y1="155" x2="90" y2="155" stroke="url(#idealGrad)" stroke-width="2" stroke-dasharray="4,3" opacity=".6"/>
|
|
278
|
-
<text x="95" y="158" fill="#4a5568" font-size="9">IDEAL</text>
|
|
279
|
-
<line x1="130" y1="155" x2="160" y2="155" stroke="url(#actualGrad)" stroke-width="2.5"/>
|
|
280
|
-
<text x="165" y="158" fill="#4a5568" font-size="9">ACTUAL</text>
|
|
281
|
-
</svg>
|
|
282
|
-
</div>
|
|
283
|
-
</div>
|
|
284
|
-
|
|
285
|
-
<div class="grid" style="grid-template-columns:1fr 1fr 1fr;margin-bottom:20px">
|
|
286
|
-
<div class="card">
|
|
287
|
-
<h3 style="margin-bottom:14px">TYPE PIE</h3>
|
|
288
|
-
<div style="display:flex;align-items:center;gap:16px;justify-content:center">
|
|
289
|
-
<svg viewBox="0 0 140 140" style="width:140px;height:140px">
|
|
290
|
-
<circle cx="70" cy="70" r="60" fill="none" stroke="rgba(255,255,255,.04)" stroke-width="20"/>
|
|
291
|
-
<path d="M70,70 L70,10 A60,60 0 1,1 69.99999999999999,10 Z" fill="var(--cyan)" opacity=".85"/><circle cx="70" cy="70" r="35" fill="var(--bg)"/><text x="70" y="72" text-anchor="middle" font-family="Orbitron" font-size="18" font-weight="900" fill="var(--text)">5</text><text x="70" y="86" text-anchor="middle" font-size="9" fill="var(--muted)">TASKS</text>
|
|
292
|
-
</svg>
|
|
293
|
-
<div style="display:flex;flex-direction:column;gap:8px">
|
|
294
|
-
<div style="display:flex;align-items:center;gap:6px"><div style="width:8px;height:8px;border-radius:2px;background:var(--cyan)"></div><span style="font-size:11px">FEAT 5</span></div>
|
|
295
|
-
<div style="display:flex;align-items:center;gap:6px"><div style="width:8px;height:8px;border-radius:2px;background:var(--orange)"></div><span style="font-size:11px">BUG 0</span></div>
|
|
296
|
-
<div style="display:flex;align-items:center;gap:6px"><div style="width:8px;height:8px;border-radius:2px;background:var(--purple)"></div><span style="font-size:11px">RES 0</span></div>
|
|
297
|
-
</div>
|
|
298
|
-
</div>
|
|
299
|
-
</div>
|
|
300
|
-
|
|
301
|
-
<div class="card">
|
|
302
|
-
<h3 style="margin-bottom:14px">PACE ANALYSIS</h3>
|
|
303
|
-
<div style="text-align:center;padding:12px 0">
|
|
304
|
-
<div style="font-family:Orbitron;font-size:36px;font-weight:900;color:var(--green);text-shadow:0 0 20px rgba(0,255,136,.3)">5</div>
|
|
305
|
-
<div style="font-size:11px;color:var(--muted);margin-top:4px">FEATURES</div>
|
|
306
|
-
<div style="margin-top:12px;font-size:28px;font-weight:900;color:var(--orange);text-shadow:0 0 16px rgba(245,158,11,.3)">0</div>
|
|
307
|
-
<div style="font-size:11px;color:var(--muted);margin-top:4px">BUGS</div>
|
|
308
|
-
</div>
|
|
309
|
-
<div style="margin-top:12px;padding:12px;background:rgba(0,240,255,.04);border-radius:8px;text-align:center">
|
|
310
|
-
<div style="font-size:11px;color:var(--muted)">BUG RATIO</div>
|
|
311
|
-
<div style="font-family:Orbitron;font-size:18px;color:var(--orange);margin-top:2px">0%</div>
|
|
312
|
-
</div>
|
|
313
|
-
</div>
|
|
314
|
-
|
|
315
|
-
<div class="card">
|
|
316
|
-
<h3 style="margin-bottom:14px">SPRINT ACTIVITY</h3>
|
|
317
|
-
<div style="text-align:center;padding:8px 0">
|
|
318
|
-
<div style="font-size:40px;font-weight:900;background:linear-gradient(135deg,var(--green),var(--cyan));-webkit-background-clip:text;-webkit-text-fill-color:transparent">+1</div>
|
|
319
|
-
<div style="font-size:10px;color:var(--muted);margin-top:4px;letter-spacing:1px">TASKS THIS WEEK</div>
|
|
320
|
-
</div>
|
|
321
|
-
<div style="margin-top:16px;display:flex;gap:8px">
|
|
322
|
-
<div style="flex:1;text-align:center;padding:8px;background:rgba(0,255,136,.05);border-radius:6px">
|
|
323
|
-
<div style="font-family:Orbitron;font-size:14px;color:var(--green)">0</div>
|
|
324
|
-
<div style="font-size:9px;color:var(--muted)">DONE</div>
|
|
325
|
-
</div>
|
|
326
|
-
<div style="flex:1;text-align:center;padding:8px;background:rgba(0,240,255,.05);border-radius:6px">
|
|
327
|
-
<div style="font-family:Orbitron;font-size:14px;color:var(--cyan)">2</div>
|
|
328
|
-
<div style="font-size:9px;color:var(--muted)">ACTIVE</div>
|
|
329
|
-
</div>
|
|
330
|
-
<div style="flex:1;text-align:center;padding:8px;background:rgba(100,116,139,.05);border-radius:6px">
|
|
331
|
-
<div style="font-family:Orbitron;font-size:14px;color:var(--muted)">3</div>
|
|
332
|
-
<div style="font-size:9px;color:var(--muted)">QUEUE</div>
|
|
333
|
-
</div>
|
|
334
|
-
</div>
|
|
335
|
-
</div>
|
|
336
|
-
</div>
|
|
337
|
-
|
|
338
|
-
<div class="panel" style="margin-bottom:20px"><div class="panel-title">TEAM DETAILS</div><div style="margin-bottom:16px"><div style="font-size:11px;color:var(--cyan);letter-spacing:1px;margin-bottom:8px;font-family:Orbitron">🔧 BACKEND</div><table style="margin-bottom:0"><thead><tr><th>人员</th><th>总任务</th><th>完成</th><th>完成率</th><th>功能</th><th>Bug</th><th>研究</th><th>工时</th></tr></thead><tbody><tr><td style="font-weight:600">李四</td><td>2</td><td>0</td><td><span style="color:var(--cyan)">0%</span></td><td><span style="color:var(--cyan)">2</span></td><td><span style="color:var(--orange)">0</span></td><td><span style="color:var(--purple)">0</span></td><td>0h</td></tr><tr><td style="font-weight:600">王五</td><td>1</td><td>0</td><td><span style="color:var(--cyan)">0%</span></td><td><span style="color:var(--cyan)">1</span></td><td><span style="color:var(--orange)">0</span></td><td><span style="color:var(--purple)">0</span></td><td>0h</td></tr><tr><td style="font-weight:600">张三</td><td>2</td><td>2</td><td><span style="color:var(--green)">100%</span></td><td><span style="color:var(--cyan)">2</span></td><td><span style="color:var(--orange)">0</span></td><td><span style="color:var(--purple)">0</span></td><td>0h</td></tr></tbody></table></div><div class="panel-title collapsible-header" style="font-size:13px;cursor:pointer;margin-bottom:16px" id="person-detail-header">◆ 详细任务 <span style="font-size:10px;color:var(--muted);margin-left:8px">展开更多 ▼</span></div><div class="collapsible-body" id="person-detail-body" style="max-height:400px;overflow:hidden;transition:max-height .5s ease"><div style="margin:16px 0 8px;font-family:Orbitron;font-size:12px;color:var(--cyan);letter-spacing:1px;border-bottom:1px solid rgba(0,240,255,.1);padding-bottom:4px">🔧 BACKEND</div><div style="background:rgba(0,240,255,.03);border:1px solid rgba(0,240,255,.08);border-radius:10px;padding:18px;margin-bottom:12px"><div style="display:flex;align-items:center;gap:12px;margin-bottom:8px"><span style="font-size:14px;font-weight:700">李四</span><span style="font-family:Orbitron;font-size:12px;color:var(--cyan)">0%</span><span style="font-size:10px;color:var(--muted)">0/2 任务</span><span style="font-size:10px;margin-left:auto;color:var(--muted)">2功能 0Bug 0h</span></div><div style="height:3px;background:rgba(255,255,255,.04);border-radius:2px;overflow:hidden"><div style="width:0%;height:100%;background:linear-gradient(90deg,var(--cyan),var(--green));border-radius:2px"></div></div></div><table style="margin-bottom:16px;margin-left:8px;width:calc(100% - 8px)"><thead><tr><th>ID</th><th>STATUS</th><th>TYPE</th></tr></thead><tbody><tr><td class="code">Task-003-任务</td><td><span class="tx-badge tx-active">ACTIVE</span></td><td><span class="type-t type-feat">feature</span></td></tr><tr><td class="code">Task-004-任务</td><td><span class="tx-badge tx-active">ACTIVE</span></td><td><span class="type-t type-feat">feature</span></td></tr></tbody></table><div style="background:rgba(0,240,255,.03);border:1px solid rgba(0,240,255,.08);border-radius:10px;padding:18px;margin-bottom:12px"><div style="display:flex;align-items:center;gap:12px;margin-bottom:8px"><span style="font-size:14px;font-weight:700">王五</span><span style="font-family:Orbitron;font-size:12px;color:var(--cyan)">0%</span><span style="font-size:10px;color:var(--muted)">0/1 任务</span><span style="font-size:10px;margin-left:auto;color:var(--muted)">1功能 0Bug 0h</span></div><div style="height:3px;background:rgba(255,255,255,.04);border-radius:2px;overflow:hidden"><div style="width:0%;height:100%;background:linear-gradient(90deg,var(--cyan),var(--green));border-radius:2px"></div></div></div><table style="margin-bottom:16px;margin-left:8px;width:calc(100% - 8px)"><thead><tr><th>ID</th><th>STATUS</th><th>TYPE</th></tr></thead><tbody><tr><td class="code">Task-005-任务</td><td><span class="tx-badge tx-active">ACTIVE</span></td><td><span class="type-t type-feat">feature</span></td></tr></tbody></table><div style="background:rgba(0,240,255,.03);border:1px solid rgba(0,240,255,.08);border-radius:10px;padding:18px;margin-bottom:12px"><div style="display:flex;align-items:center;gap:12px;margin-bottom:8px"><span style="font-size:14px;font-weight:700">张三</span><span style="font-family:Orbitron;font-size:12px;color:var(--cyan)">100%</span><span style="font-size:10px;color:var(--muted)">2/2 任务</span><span style="font-size:10px;margin-left:auto;color:var(--muted)">2功能 0Bug 0h</span></div><div style="height:3px;background:rgba(255,255,255,.04);border-radius:2px;overflow:hidden"><div style="width:100%;height:100%;background:linear-gradient(90deg,var(--cyan),var(--green));border-radius:2px"></div></div></div><table style="margin-bottom:16px;margin-left:8px;width:calc(100% - 8px)"><thead><tr><th>ID</th><th>STATUS</th><th>TYPE</th></tr></thead><tbody><tr><td class="code">Task-001-任务</td><td><span class="tx-badge tx-done">RESOLVED</span></td><td><span class="type-t type-feat">feature</span></td></tr><tr><td class="code">Task-002-任务</td><td><span class="tx-badge tx-done">RESOLVED</span></td><td><span class="type-t type-feat">feature</span></td></tr></tbody></table></div></div>
|
|
339
|
-
|
|
340
|
-
<div class="panel">
|
|
341
|
-
<div class="panel-title">TASK REGISTRY</div>
|
|
342
|
-
<table>
|
|
343
|
-
<thead><tr><th>ID</th><th>STATUS</th><th>TYPE</th><th>DURATION</th></tr></thead>
|
|
344
|
-
<tbody>
|
|
345
|
-
<tr><td class="code">Task-001-任务</td><td><span class="tx-badge tx-wait">QUEUED</span></td><td><span class="type-t type-feat">feature</span></td><td style="font-family:JetBrains Mono,monospace;color:var(--muted)">2.5h</td></tr><tr><td class="code">Task-002-任务</td><td><span class="tx-badge tx-wait">QUEUED</span></td><td><span class="type-t type-feat">feature</span></td><td style="font-family:JetBrains Mono,monospace;color:var(--muted)">3.2h</td></tr><tr><td class="code">Task-003-任务</td><td><span class="tx-badge tx-wait">QUEUED</span></td><td><span class="type-t type-feat">feature</span></td><td style="font-family:JetBrains Mono,monospace;color:var(--muted)">—</td></tr><tr><td class="code">Task-004-任务</td><td><span class="tx-badge tx-active">ACTIVE</span></td><td><span class="type-t type-feat">feature</span></td><td style="font-family:JetBrains Mono,monospace;color:var(--muted)">1.8h</td></tr><tr><td class="code">Task-005-任务</td><td><span class="tx-badge tx-active">ACTIVE</span></td><td><span class="type-t type-feat">feature</span></td><td style="font-family:JetBrains Mono,monospace;color:var(--muted)">—</td></tr>
|
|
346
|
-
|
|
347
|
-
</tbody>
|
|
348
|
-
</table>
|
|
349
|
-
</div>
|
|
350
|
-
|
|
351
|
-
<div class="footer">
|
|
352
|
-
<span>SPECCORE v5.67.73 · SPEC-DRIVEN DEVELOPMENT</span>
|
|
353
|
-
<span>EXPORTED: 2026-08-02T14:27:42.456Z</span>
|
|
354
|
-
</div>
|
|
355
|
-
</main>
|
|
356
|
-
|
|
357
|
-
<script>
|
|
358
|
-
let fsEl=null;
|
|
359
|
-
function toggleFS(el){
|
|
360
|
-
if(fsEl){closeFS();return}
|
|
361
|
-
fsEl=el;el.classList.add('fs-fullscreen');
|
|
362
|
-
document.documentElement.style.overflow='hidden';document.body.style.overflow='hidden';
|
|
363
|
-
var ts=document.querySelector('.theme-sw');if(ts){ts.style.opacity='0';ts.style.pointerEvents='none';}
|
|
364
|
-
}
|
|
365
|
-
function closeFS(){
|
|
366
|
-
if(!fsEl)return;
|
|
367
|
-
fsEl.classList.remove('fs-fullscreen');
|
|
368
|
-
document.documentElement.style.overflow='';document.body.style.overflow='';
|
|
369
|
-
var ts=document.querySelector('.theme-sw');if(ts){ts.style.opacity='';ts.style.pointerEvents='';}
|
|
370
|
-
fsEl=null;
|
|
371
|
-
}
|
|
372
|
-
document.addEventListener('keydown',e=>{
|
|
373
|
-
if(e.key==='Escape')closeFS();
|
|
374
|
-
if(e.key==='f'||e.key==='F'){
|
|
375
|
-
if(document.activeElement&&document.activeElement.tagName==='INPUT')return;
|
|
376
|
-
const hovered=document.querySelector('.card:hover,.panel:hover');
|
|
377
|
-
if(hovered) toggleFS(hovered);
|
|
378
|
-
}
|
|
379
|
-
});
|
|
380
|
-
// Collapsible TEAM DETAILS — wrap ALL person content
|
|
381
|
-
setTimeout(function(){
|
|
382
|
-
// ── 人员列表折叠(通过 ID 定位)──
|
|
383
|
-
var header = document.getElementById('person-detail-header');
|
|
384
|
-
var body = document.getElementById('person-detail-body');
|
|
385
|
-
if(header && body){
|
|
386
|
-
// 动态计算预览高度:取内容的40%,最少200px,最多650px
|
|
387
|
-
body.style.maxHeight = 'none';
|
|
388
|
-
var fullH = body.scrollHeight;
|
|
389
|
-
var previewH = Math.max(200, Math.min(Math.round(fullH * 0.4), 650));
|
|
390
|
-
body.style.maxHeight = previewH + 'px';
|
|
391
|
-
header.onclick = function(){
|
|
392
|
-
var arrow = header.querySelector('span');
|
|
393
|
-
var curH = parseInt(body.style.maxHeight) || 0;
|
|
394
|
-
if(curH <= previewH + 1){
|
|
395
|
-
// Expand to full
|
|
396
|
-
body.style.maxHeight = 'none';
|
|
397
|
-
var fullH = body.scrollHeight;
|
|
398
|
-
body.style.maxHeight = fullH + 'px';
|
|
399
|
-
if(arrow) arrow.innerHTML = '收起 ▲';
|
|
400
|
-
header.classList.remove('collapsed');
|
|
401
|
-
} else {
|
|
402
|
-
// Collapse to preview
|
|
403
|
-
body.style.maxHeight = previewH + 'px';
|
|
404
|
-
if(arrow) arrow.innerHTML = '展开更多 ▼';
|
|
405
|
-
header.classList.add('collapsed');
|
|
406
|
-
}
|
|
407
|
-
};
|
|
408
|
-
}
|
|
409
|
-
}, 200);
|
|
410
|
-
document.querySelectorAll('.card,.panel').forEach(el=>{
|
|
411
|
-
const btn=document.createElement('button');
|
|
412
|
-
btn.className='fs-btn';btn.title='Fullscreen (F)';btn.innerHTML='⛶';btn.onclick=e=>{e.stopPropagation();toggleFS(el)};
|
|
413
|
-
el.style.position=el.style.position||'relative';
|
|
414
|
-
el.appendChild(btn);
|
|
415
|
-
});
|
|
416
|
-
</script>
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
<script>
|
|
420
|
-
(function(){var t=localStorage.getItem('speccore-theme')||'ocean';document.documentElement.setAttribute('data-theme',t)})();
|
|
421
|
-
function setTheme(t){document.documentElement.setAttribute('data-theme',t);localStorage.setItem('speccore-theme',t);document.querySelectorAll('.theme-sw button').forEach((b,i)=>{b.classList.toggle('active',['ocean','cyber','light','mono','github','synth','amber','sakura','forest'][i]===t)});}
|
|
422
|
-
document.querySelectorAll('.theme-sw button').forEach((b,i)=>{b.classList.toggle('active',['ocean','cyber','light','mono','github','synth','amber','sakura','forest'][i]===(localStorage.getItem('speccore-theme')||'ocean'))});
|
|
423
|
-
</script>
|
|
424
|
-
|
|
425
|
-
</body></html>
|