speccore 8.3.147 → 8.3.148
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/init.d.ts.map +1 -1
- package/dist/commands/init.js +9 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +4 -1
- package/dist/commands/update.js.map +1 -1
- package/package.json +3 -2
- package/templates/api-design-example.md +338 -0
- package/templates/ci/github-actions.yml +44 -0
- package/templates/dashboard.html +425 -0
- package/templates/database-example.md +223 -0
- package/templates/deploy-docker/README.md +284 -0
- package/templates/deploy-docker/deploy-remote.sh +79 -0
- package/templates/deploy-docker/docker-compose.yml +113 -0
- package/templates/deploy-docker/frontend.Dockerfile +43 -0
- package/templates/deploy-docker/nginx.conf +30 -0
- package/templates/deploy-examples.yaml +436 -0
- package/templates/deploy-java/Dockerfile +50 -0
- package/templates/deploy-java/README.md +212 -0
- package/templates/deploy-java/deploy.sh +120 -0
- package/templates/deploy-java/spring-boot.service +35 -0
- package/templates/html/speccore-ask-explain.html +10 -0
- package/templates/html/speccore-ask-guide.html +10 -0
- package/templates/html/speccore-ask-match.html +10 -0
- package/templates/html/speccore-ask-pipeline.html +1 -0
- package/templates/html/speccore-ask-result.html +10 -0
- package/templates/html/speccore-demo.html +449 -0
- package/templates/html/speccore-dev.html +202 -0
- package/templates/html/speccore-help.html +1 -0
- package/templates/html/speccore-knowledge-graph.html +656 -0
- package/templates/html/speccore-retro-T-001.html +1 -0
- package/templates/html/speccore-setup-guide.html +289 -0
- package/templates/html/speccore-welcome.html +1 -0
- package/templates/security-example.md +226 -0
- package/templates/verify-spec-example.yaml +138 -0
|
@@ -0,0 +1,656 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>SpecCore 知识图谱 — speccore</title>
|
|
7
|
+
<script src="https://unpkg.com/vis-network@9.1.6/standalone/umd/vis-network.min.js"></script>
|
|
8
|
+
<style>
|
|
9
|
+
@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=JetBrains+Mono:wght@400;600;700&display=swap');
|
|
10
|
+
[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)}
|
|
11
|
+
[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)}
|
|
12
|
+
[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)}
|
|
13
|
+
[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)}
|
|
14
|
+
[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)}
|
|
15
|
+
[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)}
|
|
16
|
+
[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)}
|
|
17
|
+
[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)}
|
|
18
|
+
[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)}
|
|
19
|
+
*,*::after,*::before{box-sizing:border-box;margin:0;padding:0}
|
|
20
|
+
body{font-family:'JetBrains Mono',monospace;background:var(--bg);color:var(--text);min-height:100vh;overflow-x:hidden}
|
|
21
|
+
.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}
|
|
22
|
+
.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}
|
|
23
|
+
.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}
|
|
24
|
+
/* ── Ctrl Panel ── */
|
|
25
|
+
.ctrl-panel{position:fixed;top:120px;right:16px;z-index:100;display:flex;flex-direction:column;align-items:flex-end;gap:6px}
|
|
26
|
+
.ctrl-toggle{width:48px;height:48px;border-radius:50%;border:1px solid var(--border);cursor:pointer;font-size:32px;display:flex;align-items:center;justify-content:center;line-height:0;padding:0;user-select:none;background:var(--surface);color:var(--muted);backdrop-filter:blur(10px);transition:all .3s}
|
|
27
|
+
.ctrl-toggle:hover{color:var(--cyan);border-color:var(--cyan);transform:rotate(90deg);transform-origin:center}
|
|
28
|
+
.ctrl-toggle.open{color:var(--cyan);border-color:var(--cyan);transform:rotate(90deg);transform-origin:center}
|
|
29
|
+
.ctrl-body{max-height:0;overflow:hidden;display:flex;flex-direction:column;gap:6px;align-items:flex-end;transition:max-height .4s ease,opacity .3s ease;opacity:0}
|
|
30
|
+
.ctrl-panel.open .ctrl-body{max-height:320px;opacity:1}
|
|
31
|
+
.theme-sw{display:flex;gap:6px;background:var(--surface);border:1px solid var(--border);border-radius:20px;padding:4px;backdrop-filter:blur(10px)}
|
|
32
|
+
.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}
|
|
33
|
+
.theme-sw button:hover{transform:scale(1.1)}
|
|
34
|
+
.theme-sw button.active{box-shadow:0 0 0 2px var(--cyan);background:rgba(0,240,255,.15)}
|
|
35
|
+
.font-sw{display:flex;gap:4px;background:var(--surface);border:1px solid var(--border);border-radius:20px;padding:4px;backdrop-filter:blur(10px)}
|
|
36
|
+
.font-sw button{padding:4px 10px;border-radius:12px;border:1px solid var(--border);cursor:pointer;font-size:11px;font-family:'JetBrains Mono',monospace;background:transparent;color:var(--muted)}
|
|
37
|
+
.font-sw button:hover{color:var(--text)}
|
|
38
|
+
.font-sw button.active{color:var(--cyan);border-color:var(--cyan);background:rgba(0,240,255,.1)}
|
|
39
|
+
.fs-sw{display:flex;gap:4px;background:var(--surface);border:1px solid var(--border);border-radius:20px;padding:4px;backdrop-filter:blur(10px)}
|
|
40
|
+
.fs-sw button{padding:4px 10px;border-radius:12px;border:1px solid var(--border);cursor:pointer;font-size:11px;font-family:'JetBrains Mono',monospace;background:transparent;color:var(--muted)}
|
|
41
|
+
.fs-sw button:hover{color:var(--text)}
|
|
42
|
+
.fs-sw button.active{color:var(--cyan);border-color:var(--cyan);background:rgba(0,240,255,.1)}
|
|
43
|
+
/* ── Font classes ── */
|
|
44
|
+
html{font-size:16px}html.fs-sm{font-size:13px}html.fs-md{font-size:16px}html.fs-lg{font-size:19px}html.fs-xl{font-size:22px}
|
|
45
|
+
body{font-family:'JetBrains Mono',monospace!important}
|
|
46
|
+
.font-orbitron body,.font-orbitron h1,.font-orbitron .header-left h1,.font-orbitron .stat-card .value,.font-orbitron .header-stat .num{font-family:'Orbitron',sans-serif!important}
|
|
47
|
+
.font-hybrid body,.font-hybrid html{font-family:'JetBrains Mono',monospace!important}
|
|
48
|
+
.font-hybrid h1,.font-hybrid .header-left h1,.font-hybrid .stat-card .value,.font-hybrid .header-stat .num,.font-hybrid .panel-tab{font-family:'Orbitron',sans-serif!important}
|
|
49
|
+
main{position:relative;z-index:1;max-width:calc(100vw - 90px);margin:0 45px;padding:40px 32px}
|
|
50
|
+
/* ── Header ── */
|
|
51
|
+
.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:28px;padding:24px 32px;background:var(--card);border:1px solid var(--border);border-radius:12px;backdrop-filter:blur(20px);position:relative;overflow:hidden}
|
|
52
|
+
.header::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}
|
|
53
|
+
.header::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}
|
|
54
|
+
.header .vline{position:absolute;top:0;width:1px;bottom:0;pointer-events:none;z-index:2}
|
|
55
|
+
.header .vline.l{left:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY-rev 3s linear infinite}
|
|
56
|
+
.header .vline.r{right:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY 3s linear infinite}
|
|
57
|
+
.header .card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 30% 10%,rgba(14,165,233,.2) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}
|
|
58
|
+
@keyframes scanX{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}
|
|
59
|
+
@keyframes scanX-rev{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}
|
|
60
|
+
@keyframes scanY{0%{transform:translateY(-100%)}100%{transform:translateY(100%)}}
|
|
61
|
+
@keyframes scanY-rev{0%{transform:translateY(100%)}100%{transform:translateY(-100%)}}
|
|
62
|
+
@keyframes titleGlow{0%,100%{filter:drop-shadow(0 0 20px rgba(0,240,255,.4))}50%{filter:drop-shadow(0 0 30px rgba(0,240,255,.7))}}
|
|
63
|
+
.header-left 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;background-clip:text;letter-spacing:2px;animation:titleGlow 3s ease-in-out infinite;position:relative;z-index:1}
|
|
64
|
+
.header-left .subtitle{color:var(--muted);font-size:12px;margin-top:4px;letter-spacing:1px;position:relative;z-index:1}
|
|
65
|
+
.header-right{display:flex;gap:16px;align-items:center;position:relative;z-index:1}
|
|
66
|
+
.header-stat{text-align:center;padding:0 16px;border-left:1px solid rgba(0,240,255,.1)}
|
|
67
|
+
.header-stat .num{font-family:'Orbitron',sans-serif;font-size:20px;font-weight:700;color:var(--cyan);text-shadow:0 0 20px rgba(0,240,255,.4)}
|
|
68
|
+
.header-stat .label{font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:1px}
|
|
69
|
+
/* ── Stats Cards ── */
|
|
70
|
+
.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:16px;margin-bottom:28px}
|
|
71
|
+
.stat-card{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:20px;backdrop-filter:blur(20px);position:relative;overflow:hidden;transition:all .3s}
|
|
72
|
+
.stat-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)}
|
|
73
|
+
.stat-card .card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 25% 10%,rgba(14,165,233,.15) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}
|
|
74
|
+
@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}
|
|
75
|
+
.stat-card .label{font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:1.5px;position:relative;z-index:1}
|
|
76
|
+
.stat-card .value{font-family:'Orbitron',sans-serif;font-size:32px;font-weight:900;margin-top:4px;position:relative;z-index:1}
|
|
77
|
+
.stat-card .value.cyan{color:var(--cyan);text-shadow:0 0 30px rgba(0,240,255,.3)}
|
|
78
|
+
.stat-card .value.green{color:var(--green);text-shadow:0 0 30px rgba(0,255,136,.3)}
|
|
79
|
+
.stat-card .value.yellow{color:var(--orange);text-shadow:0 0 30px rgba(245,158,11,.3)}
|
|
80
|
+
.stat-card .value.red{color:#ef4444;text-shadow:0 0 30px rgba(239,68,68,.3)}
|
|
81
|
+
.stat-card .value.purple{color:var(--purple);text-shadow:0 0 30px rgba(168,85,247,.3)}
|
|
82
|
+
.stat-card .value.pink{color:#ec4899;text-shadow:0 0 30px rgba(236,72,153,.3)}
|
|
83
|
+
/* ── Main Layout ── */
|
|
84
|
+
.main-panel{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:0;backdrop-filter:blur(20px);position:relative;overflow:hidden;margin-bottom:28px;display:flex;height:calc(100vh - 320px);min-height:600px}
|
|
85
|
+
.main-panel.fullscreen{position:fixed;inset:0;z-index:1000;border-radius:0;margin:0;height:100vh;min-height:100vh}
|
|
86
|
+
.graph-panel{flex:1;position:relative;border-right:1px solid var(--border);overflow:hidden;min-width:0}
|
|
87
|
+
#graph{width:100%;height:100%}
|
|
88
|
+
.graph-toolbar{position:absolute;top:12px;left:12px;display:flex;gap:6px;z-index:10;flex-wrap:wrap}
|
|
89
|
+
.fullscreen-btn{position:absolute;top:12px;right:12px;z-index:10;width:36px;height:36px;border-radius:8px;border:1px solid var(--border);background:var(--surface);color:var(--muted);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:16px;transition:all .2s}
|
|
90
|
+
.fullscreen-btn:hover{border-color:var(--cyan);color:var(--cyan);box-shadow:0 0 12px rgba(0,240,255,.15)}
|
|
91
|
+
.filter-btn{padding:5px 14px;font-size:11px;font-family:'JetBrains Mono',monospace;border:1px solid var(--border);border-radius:6px;background:var(--surface);color:var(--muted);cursor:pointer;transition:all .2s;letter-spacing:.5px}
|
|
92
|
+
.filter-btn:hover{border-color:rgba(0,240,255,.3);color:var(--text)}
|
|
93
|
+
.filter-btn.active{border-color:var(--cyan);color:var(--cyan);background:rgba(0,240,255,.05);box-shadow:0 0 12px rgba(0,240,255,.15)}
|
|
94
|
+
/* ── Side Panel ── */
|
|
95
|
+
.side-panel{width:380px;flex-shrink:0;display:flex;flex-direction:column;overflow:hidden}
|
|
96
|
+
.panel-tabs{display:flex;border-bottom:1px solid var(--border)}
|
|
97
|
+
.panel-tab{flex:1;padding:14px 8px;font-size:11px;font-family:'JetBrains Mono',monospace;text-align:center;color:var(--muted);cursor:pointer;border-bottom:2px solid transparent;transition:all .2s;letter-spacing:.5px;text-transform:uppercase}
|
|
98
|
+
.panel-tab:hover{color:var(--text)}
|
|
99
|
+
.panel-tab.active{color:var(--cyan);border-bottom-color:var(--cyan)}
|
|
100
|
+
.panel-content{flex:1;overflow-y:auto;padding:16px}
|
|
101
|
+
.panel-content::-webkit-scrollbar{width:4px}
|
|
102
|
+
.panel-content::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}
|
|
103
|
+
/* ── Search ── */
|
|
104
|
+
.search-box{width:100%;padding:10px 14px;font-size:12px;font-family:'JetBrains Mono',monospace;background:var(--surface);border:1px solid var(--border);border-radius:8px;color:var(--text);outline:none;margin-bottom:14px;transition:border-color .2s}
|
|
105
|
+
.search-box:focus{border-color:var(--cyan);box-shadow:0 0 12px rgba(0,240,255,.1)}
|
|
106
|
+
.search-box::placeholder{color:var(--muted)}
|
|
107
|
+
/* ── Entity List ── */
|
|
108
|
+
.entity-list{display:flex;flex-direction:column;gap:6px}
|
|
109
|
+
.entity-item{padding:12px 14px;background:var(--surface);border:1px solid var(--border);border-radius:8px;cursor:pointer;transition:all .15s}
|
|
110
|
+
.entity-item:hover{border-color:rgba(0,240,255,.25);background:var(--hover);box-shadow:0 0 15px rgba(0,240,255,.05)}
|
|
111
|
+
.entity-item .name{font-size:13px;font-weight:500;color:var(--text)}
|
|
112
|
+
.entity-item .meta{font-size:11px;color:var(--muted);margin-top:4px;display:flex;gap:8px;align-items:center}
|
|
113
|
+
.entity-item .type-badge{display:inline-block;padding:2px 8px;font-size:10px;border-radius:4px;font-weight:600;letter-spacing:.5px}
|
|
114
|
+
.type-requirement{background:rgba(0,240,255,.1);color:var(--cyan)}
|
|
115
|
+
.type-spec{background:rgba(168,85,247,.1);color:var(--purple)}
|
|
116
|
+
.type-task{background:rgba(0,255,136,.1);color:var(--green)}
|
|
117
|
+
.type-subtask{background:rgba(236,72,153,.1);color:#ec4899}
|
|
118
|
+
.type-business_module{background:rgba(251,191,36,.1);color:#fbbf24}
|
|
119
|
+
.type-user-file{background:rgba(245,158,11,.1);color:var(--orange)}
|
|
120
|
+
.type-source-file{background:rgba(59,130,246,.1);color:#60a5fa}
|
|
121
|
+
.type-global-doc{background:rgba(249,115,22,.1);color:#f97316}
|
|
122
|
+
.type-task-spec{background:rgba(20,184,166,.1);color:#14b8a6}
|
|
123
|
+
/* ── Decay List ── */
|
|
124
|
+
.decay-item{padding:12px 14px;background:var(--surface);border:1px solid var(--border);border-radius:8px;margin-bottom:6px}
|
|
125
|
+
.decay-item .title{font-size:13px;font-weight:500}
|
|
126
|
+
.decay-item .detail{font-size:11px;color:var(--muted);margin-top:4px}
|
|
127
|
+
.decay-item .severity{display:inline-block;padding:2px 8px;font-size:10px;border-radius:4px;margin-left:6px;font-weight:600}
|
|
128
|
+
.severity-critical{background:rgba(239,68,68,.15);color:#ef4444;border:1px solid rgba(239,68,68,.2)}
|
|
129
|
+
.severity-warning{background:rgba(245,158,11,.15);color:var(--orange);border:1px solid rgba(245,158,11,.2)}
|
|
130
|
+
.severity-info{background:rgba(0,255,136,.15);color:var(--green);border:1px solid rgba(0,255,136,.2)}
|
|
131
|
+
/* ── Context Preview ── */
|
|
132
|
+
.context-preview{font-size:13px;line-height:1.7;color:var(--text)}
|
|
133
|
+
.context-preview h1,.context-preview h2,.context-preview h3{color:var(--text);margin:16px 0 8px;font-family:'Orbitron',sans-serif;letter-spacing:1px}
|
|
134
|
+
.context-preview h1{font-size:18px;color:var(--cyan)}
|
|
135
|
+
.context-preview h2{font-size:15px}
|
|
136
|
+
.context-preview h3{font-size:13px}
|
|
137
|
+
.context-preview table{width:100%;border-collapse:collapse;margin:8px 0;font-size:12px}
|
|
138
|
+
.context-preview th,.context-preview td{padding:8px 10px;border:1px solid var(--border);text-align:left}
|
|
139
|
+
.context-preview th{background:var(--surface);color:var(--muted);font-weight:600;letter-spacing:.5px}
|
|
140
|
+
.context-preview code{background:var(--surface);padding:2px 6px;border-radius:4px;font-size:12px}
|
|
141
|
+
/* ── Footer ── */
|
|
142
|
+
.footer{display:flex;justify-content:space-between;align-items:center;padding:16px 0;border-top:1px solid rgba(0,240,255,.06);color:var(--muted);font-size:11px;letter-spacing:1px}
|
|
143
|
+
/* ── Responsive ── */
|
|
144
|
+
@media(max-width:900px){.main-panel{flex-direction:column;height:auto}.graph-panel{border-right:none;border-bottom:1px solid var(--border);height:400px}.side-panel{width:100%}.stats-grid{grid-template-columns:repeat(auto-fit,minmax(120px,1fr))}}
|
|
145
|
+
</style>
|
|
146
|
+
</head>
|
|
147
|
+
<body>
|
|
148
|
+
|
|
149
|
+
<div class="ctrl-panel" id="ctrl-panel">
|
|
150
|
+
<button class="ctrl-toggle" id="ctrl-toggle" onclick="toggleCtrl()" title="设置">⚙</button>
|
|
151
|
+
<div class="ctrl-body">
|
|
152
|
+
<div class="theme-sw">
|
|
153
|
+
<button onclick="setTheme('ocean')" title="Ocean Blue">🌊</button>
|
|
154
|
+
<button onclick="setTheme('cyber')" title="Cyber Dark">🌙</button>
|
|
155
|
+
<button onclick="setTheme('light')" title="Light Studio">☀️</button>
|
|
156
|
+
<button onclick="setTheme('mono')" title="Mono Tech">⬛</button>
|
|
157
|
+
<button onclick="setTheme('github')" title="GitHub Dark">🐙</button>
|
|
158
|
+
<button onclick="setTheme('synth')" title="SynthWave">💜</button>
|
|
159
|
+
<button onclick="setTheme('amber')" title="Amber Terminal">🟡</button>
|
|
160
|
+
<button onclick="setTheme('sakura')" title="Cherry Sakura">🌸</button>
|
|
161
|
+
<button onclick="setTheme('forest')" title="Midnight Forest">🌲</button>
|
|
162
|
+
</div>
|
|
163
|
+
<div class="font-sw">
|
|
164
|
+
<button onclick="setFont('jetbrains')" data-font="jetbrains">JetBrains</button>
|
|
165
|
+
<button onclick="setFont('orbitron')" data-font="orbitron">Orbitron</button>
|
|
166
|
+
<button onclick="setFont('hybrid')" data-font="hybrid">Hybrid</button>
|
|
167
|
+
</div>
|
|
168
|
+
<div class="fs-sw">
|
|
169
|
+
<button onclick="setFontSize('sm')" data-fs="sm">A⁻</button>
|
|
170
|
+
<button onclick="setFontSize('md')" data-fs="md">A</button>
|
|
171
|
+
<button onclick="setFontSize('lg')" data-fs="lg">A⁺</button>
|
|
172
|
+
<button onclick="setFontSize('xl')" data-fs="xl">A⁺⁺</button>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
<div class="grid-pattern"></div>
|
|
177
|
+
<div class="stars"></div>
|
|
178
|
+
<div class="scanlines"></div>
|
|
179
|
+
|
|
180
|
+
<main>
|
|
181
|
+
<!-- Header -->
|
|
182
|
+
<div class="header">
|
|
183
|
+
<div class="card-bg"></div>
|
|
184
|
+
<div class="vline l"></div>
|
|
185
|
+
<div class="vline r"></div>
|
|
186
|
+
<div class="header-left">
|
|
187
|
+
<h1>SPECCORE — KNOWLEDGE GRAPH</h1>
|
|
188
|
+
<div class="subtitle">speccore · 迭代 Q2</div>
|
|
189
|
+
</div>
|
|
190
|
+
<div class="header-right">
|
|
191
|
+
<div class="header-stat"><div class="num">34</div><div class="label">实体</div></div>
|
|
192
|
+
<div class="header-stat"><div class="num">36</div><div class="label">关系</div></div>
|
|
193
|
+
<div class="header-stat"><div class="num" style="color:#ef4444;text-shadow:0 0 20px rgba(239,68,68,.4)">12</div><div class="label">衰减</div></div>
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
|
|
197
|
+
<!-- Stats -->
|
|
198
|
+
<div class="stats-grid">
|
|
199
|
+
<div class="stat-card"><div class="card-bg"></div><div class="label">需求</div><div class="value cyan">0</div></div>
|
|
200
|
+
<div class="stat-card"><div class="card-bg"></div><div class="label">规格</div><div class="value purple">2</div></div>
|
|
201
|
+
<div class="stat-card"><div class="card-bg"></div><div class="label">功能模块</div><div class="value green">6</div></div>
|
|
202
|
+
<div class="stat-card"><div class="card-bg"></div><div class="label">任务</div><div class="value pink">0</div></div>
|
|
203
|
+
<div class="stat-card"><div class="card-bg"></div><div class="label">源码文件</div><div class="value yellow">12</div></div>
|
|
204
|
+
<div class="stat-card"><div class="card-bg"></div><div class="label">全局文档</div><div class="value" style="color:#f97316;text-shadow:0 0 30px rgba(249,115,22,.3)">8</div></div>
|
|
205
|
+
<div class="stat-card"><div class="card-bg"></div><div class="label">任务规格</div><div class="value" style="color:#14b8a6;text-shadow:0 0 30px rgba(20,184,166,.3)">6</div></div>
|
|
206
|
+
<div class="stat-card"><div class="card-bg"></div><div class="label">关系</div><div class="value cyan">36</div></div>
|
|
207
|
+
<div class="stat-card"><div class="card-bg"></div><div class="label">衰减告警</div><div class="value red">12</div></div>
|
|
208
|
+
</div>
|
|
209
|
+
|
|
210
|
+
<!-- Main Graph + Side Panel -->
|
|
211
|
+
<div class="main-panel">
|
|
212
|
+
<div class="graph-panel">
|
|
213
|
+
<div class="graph-toolbar">
|
|
214
|
+
<button class="filter-btn active" data-filter="all">全部</button>
|
|
215
|
+
<button class="filter-btn" data-filter="requirement">需求</button>
|
|
216
|
+
<button class="filter-btn" data-filter="spec">规格</button>
|
|
217
|
+
<button class="filter-btn" data-filter="task">功能模块</button>
|
|
218
|
+
<button class="filter-btn" data-filter="subtask">任务</button>
|
|
219
|
+
<button class="filter-btn" data-filter="business_module">业务模块</button>
|
|
220
|
+
<button class="filter-btn" data-filter="user-file">用户文件</button>
|
|
221
|
+
<button class="filter-btn" data-filter="source-file">源码</button>
|
|
222
|
+
<button class="filter-btn" data-filter="global-doc">全局</button>
|
|
223
|
+
<button class="filter-btn" data-filter="task-spec">任务规格</button>
|
|
224
|
+
</div>
|
|
225
|
+
<button class="fullscreen-btn" id="fullscreen-btn" title="全屏">⛶</button>
|
|
226
|
+
<div id="graph"></div>
|
|
227
|
+
</div>
|
|
228
|
+
<div class="side-panel">
|
|
229
|
+
<div class="panel-tabs">
|
|
230
|
+
<div class="panel-tab active" data-panel="entities">实体列表</div>
|
|
231
|
+
<div class="panel-tab" data-panel="decay">衰减检测</div>
|
|
232
|
+
<div class="panel-tab" data-panel="context">RAG 上下文</div>
|
|
233
|
+
</div>
|
|
234
|
+
<div class="panel-content" id="panel-entities">
|
|
235
|
+
<input class="search-box" id="entity-search" placeholder="搜索实体名称..." />
|
|
236
|
+
<div class="entity-list" id="entity-list">
|
|
237
|
+
<div class="entity-item" onclick="focusNode('SPEC:ANALYSIS')">
|
|
238
|
+
<div class="name">需求分析报告</div>
|
|
239
|
+
<div class="meta">
|
|
240
|
+
<span class="type-badge type-spec">规格</span>
|
|
241
|
+
|
|
242
|
+
<span title="020-specs/overview/ANALYSIS.md">ANALYSIS.md</span>
|
|
243
|
+
</div>
|
|
244
|
+
</div><div class="entity-item" onclick="focusNode('SPEC:REQUIREMENT')">
|
|
245
|
+
<div class="name">REQUIREMENT</div>
|
|
246
|
+
<div class="meta">
|
|
247
|
+
<span class="type-badge type-spec">规格</span>
|
|
248
|
+
|
|
249
|
+
<span title="020-specs/overview/REQUIREMENT.md">REQUIREMENT.md</span>
|
|
250
|
+
</div>
|
|
251
|
+
</div><div class="entity-item" onclick="focusNode('Task-001')">
|
|
252
|
+
<div class="name">Task-001: 会议室预订功能</div>
|
|
253
|
+
<div class="meta">
|
|
254
|
+
<span class="type-badge type-task">功能模块</span>
|
|
255
|
+
<span>pending</span>
|
|
256
|
+
<span title="030-tasks/Task-001">Task-001</span>
|
|
257
|
+
</div>
|
|
258
|
+
</div><div class="entity-item" onclick="focusNode('Task-002')">
|
|
259
|
+
<div class="name">Task-002: 会议通知推送</div>
|
|
260
|
+
<div class="meta">
|
|
261
|
+
<span class="type-badge type-task">功能模块</span>
|
|
262
|
+
<span>pending</span>
|
|
263
|
+
<span title="030-tasks/Task-002">Task-002</span>
|
|
264
|
+
</div>
|
|
265
|
+
</div><div class="entity-item" onclick="focusNode('Task-003')">
|
|
266
|
+
<div class="name">Task-003: 会议纪要大模型总结</div>
|
|
267
|
+
<div class="meta">
|
|
268
|
+
<span class="type-badge type-task">功能模块</span>
|
|
269
|
+
<span>pending</span>
|
|
270
|
+
<span title="030-tasks/Task-003">Task-003</span>
|
|
271
|
+
</div>
|
|
272
|
+
</div><div class="entity-item" onclick="focusNode('Task-004')">
|
|
273
|
+
<div class="name">Task-004: 用户注册登录</div>
|
|
274
|
+
<div class="meta">
|
|
275
|
+
<span class="type-badge type-task">功能模块</span>
|
|
276
|
+
<span>pending</span>
|
|
277
|
+
<span title="030-tasks/Task-004">Task-004</span>
|
|
278
|
+
</div>
|
|
279
|
+
</div><div class="entity-item" onclick="focusNode('Task-005')">
|
|
280
|
+
<div class="name">Task-005: SSO单点登录</div>
|
|
281
|
+
<div class="meta">
|
|
282
|
+
<span class="type-badge type-task">功能模块</span>
|
|
283
|
+
<span>pending</span>
|
|
284
|
+
<span title="030-tasks/Task-005">Task-005</span>
|
|
285
|
+
</div>
|
|
286
|
+
</div><div class="entity-item" onclick="focusNode('Task-006')">
|
|
287
|
+
<div class="name">Task-006: 权限管理系统</div>
|
|
288
|
+
<div class="meta">
|
|
289
|
+
<span class="type-badge type-task">功能模块</span>
|
|
290
|
+
<span>pending</span>
|
|
291
|
+
<span title="030-tasks/bugfix/Task-006">Task-006</span>
|
|
292
|
+
</div>
|
|
293
|
+
</div><div class="entity-item" onclick="focusNode('SRC:src-cli')">
|
|
294
|
+
<div class="name">cli.ts</div>
|
|
295
|
+
<div class="meta">
|
|
296
|
+
<span class="type-badge type-source-file">源码</span>
|
|
297
|
+
|
|
298
|
+
<span title="src/cli.ts">cli.ts</span>
|
|
299
|
+
</div>
|
|
300
|
+
</div><div class="entity-item" onclick="focusNode('SRC:src-commands-plan')">
|
|
301
|
+
<div class="name">plan.ts</div>
|
|
302
|
+
<div class="meta">
|
|
303
|
+
<span class="type-badge type-source-file">源码</span>
|
|
304
|
+
|
|
305
|
+
<span title="src/commands/plan.ts">plan.ts</span>
|
|
306
|
+
</div>
|
|
307
|
+
</div><div class="entity-item" onclick="focusNode('SRC:src-commands-code-index')">
|
|
308
|
+
<div class="name">code-index.ts</div>
|
|
309
|
+
<div class="meta">
|
|
310
|
+
<span class="type-badge type-source-file">源码</span>
|
|
311
|
+
|
|
312
|
+
<span title="src/commands/code-index.ts">code-index.ts</span>
|
|
313
|
+
</div>
|
|
314
|
+
</div><div class="entity-item" onclick="focusNode('SRC:src-commands-config')">
|
|
315
|
+
<div class="name">config.ts</div>
|
|
316
|
+
<div class="meta">
|
|
317
|
+
<span class="type-badge type-source-file">源码</span>
|
|
318
|
+
|
|
319
|
+
<span title="src/commands/config.ts">config.ts</span>
|
|
320
|
+
</div>
|
|
321
|
+
</div><div class="entity-item" onclick="focusNode('SRC:src-core-inbox')">
|
|
322
|
+
<div class="name">inbox.ts</div>
|
|
323
|
+
<div class="meta">
|
|
324
|
+
<span class="type-badge type-source-file">源码</span>
|
|
325
|
+
|
|
326
|
+
<span title="src/core/inbox.ts">inbox.ts</span>
|
|
327
|
+
</div>
|
|
328
|
+
</div><div class="entity-item" onclick="focusNode('SRC:src-core-execution-state')">
|
|
329
|
+
<div class="name">execution-state.ts</div>
|
|
330
|
+
<div class="meta">
|
|
331
|
+
<span class="type-badge type-source-file">源码</span>
|
|
332
|
+
|
|
333
|
+
<span title="src/core/execution-state.ts">execution-state.ts</span>
|
|
334
|
+
</div>
|
|
335
|
+
</div><div class="entity-item" onclick="focusNode('SRC:src-core-prompt-builder')">
|
|
336
|
+
<div class="name">prompt-builder.ts</div>
|
|
337
|
+
<div class="meta">
|
|
338
|
+
<span class="type-badge type-source-file">源码</span>
|
|
339
|
+
|
|
340
|
+
<span title="src/core/prompt-builder.ts">prompt-builder.ts</span>
|
|
341
|
+
</div>
|
|
342
|
+
</div><div class="entity-item" onclick="focusNode('SRC:src-i18n-index')">
|
|
343
|
+
<div class="name">index.ts</div>
|
|
344
|
+
<div class="meta">
|
|
345
|
+
<span class="type-badge type-source-file">源码</span>
|
|
346
|
+
|
|
347
|
+
<span title="src/i18n/index.ts">index.ts</span>
|
|
348
|
+
</div>
|
|
349
|
+
</div><div class="entity-item" onclick="focusNode('SRC:src-i18n-t')">
|
|
350
|
+
<div class="name">t.ts</div>
|
|
351
|
+
<div class="meta">
|
|
352
|
+
<span class="type-badge type-source-file">源码</span>
|
|
353
|
+
|
|
354
|
+
<span title="src/i18n/t.ts">t.ts</span>
|
|
355
|
+
</div>
|
|
356
|
+
</div><div class="entity-item" onclick="focusNode('SRC:src-index')">
|
|
357
|
+
<div class="name">index.ts</div>
|
|
358
|
+
<div class="meta">
|
|
359
|
+
<span class="type-badge type-source-file">源码</span>
|
|
360
|
+
|
|
361
|
+
<span title="src/index.ts">index.ts</span>
|
|
362
|
+
</div>
|
|
363
|
+
</div><div class="entity-item" onclick="focusNode('SRC:src-utils-task-utils')">
|
|
364
|
+
<div class="name">task-utils.ts</div>
|
|
365
|
+
<div class="meta">
|
|
366
|
+
<span class="type-badge type-source-file">源码</span>
|
|
367
|
+
|
|
368
|
+
<span title="src/utils/task-utils.ts">task-utils.ts</span>
|
|
369
|
+
</div>
|
|
370
|
+
</div><div class="entity-item" onclick="focusNode('SRC:src-utils-logger')">
|
|
371
|
+
<div class="name">logger.ts</div>
|
|
372
|
+
<div class="meta">
|
|
373
|
+
<span class="type-badge type-source-file">源码</span>
|
|
374
|
+
|
|
375
|
+
<span title="src/utils/logger.ts">logger.ts</span>
|
|
376
|
+
</div>
|
|
377
|
+
</div><div class="entity-item" onclick="focusNode('GLOBAL:ARCHITECTURE')">
|
|
378
|
+
<div class="name">全量技术架构</div>
|
|
379
|
+
<div class="meta">
|
|
380
|
+
<span class="type-badge type-global-doc">全局</span>
|
|
381
|
+
|
|
382
|
+
<span title=".speccore/GLOBAL/ARCHITECTURE.md">ARCHITECTURE.md</span>
|
|
383
|
+
</div>
|
|
384
|
+
</div><div class="entity-item" onclick="focusNode('GLOBAL:BASELINES-README')">
|
|
385
|
+
<div class="name">基线索引</div>
|
|
386
|
+
<div class="meta">
|
|
387
|
+
<span class="type-badge type-global-doc">全局</span>
|
|
388
|
+
|
|
389
|
+
<span title=".speccore/GLOBAL/BASELINES/README.md">README.md</span>
|
|
390
|
+
</div>
|
|
391
|
+
</div><div class="entity-item" onclick="focusNode('GLOBAL:CHANGELOG')">
|
|
392
|
+
<div class="name">全量变更日志</div>
|
|
393
|
+
<div class="meta">
|
|
394
|
+
<span class="type-badge type-global-doc">全局</span>
|
|
395
|
+
|
|
396
|
+
<span title=".speccore/GLOBAL/CHANGELOG.md">CHANGELOG.md</span>
|
|
397
|
+
</div>
|
|
398
|
+
</div><div class="entity-item" onclick="focusNode('GLOBAL:CODE_INDEX')">
|
|
399
|
+
<div class="name">全量代码索引</div>
|
|
400
|
+
<div class="meta">
|
|
401
|
+
<span class="type-badge type-global-doc">全局</span>
|
|
402
|
+
|
|
403
|
+
<span title=".speccore/GLOBAL/CODE_INDEX.md">CODE_INDEX.md</span>
|
|
404
|
+
</div>
|
|
405
|
+
</div><div class="entity-item" onclick="focusNode('GLOBAL:GLOSSARY')">
|
|
406
|
+
<div class="name">全量术语表</div>
|
|
407
|
+
<div class="meta">
|
|
408
|
+
<span class="type-badge type-global-doc">全局</span>
|
|
409
|
+
|
|
410
|
+
<span title=".speccore/GLOBAL/GLOSSARY.md">GLOSSARY.md</span>
|
|
411
|
+
</div>
|
|
412
|
+
</div><div class="entity-item" onclick="focusNode('GLOBAL:OVERVIEW')">
|
|
413
|
+
<div class="name">全量项目全景</div>
|
|
414
|
+
<div class="meta">
|
|
415
|
+
<span class="type-badge type-global-doc">全局</span>
|
|
416
|
+
|
|
417
|
+
<span title=".speccore/GLOBAL/OVERVIEW.md">OVERVIEW.md</span>
|
|
418
|
+
</div>
|
|
419
|
+
</div><div class="entity-item" onclick="focusNode('GLOBAL:PROTOTYPE_INDEX')">
|
|
420
|
+
<div class="name">全量原型索引</div>
|
|
421
|
+
<div class="meta">
|
|
422
|
+
<span class="type-badge type-global-doc">全局</span>
|
|
423
|
+
|
|
424
|
+
<span title=".speccore/GLOBAL/PROTOTYPE_INDEX.md">PROTOTYPE_INDEX.md</span>
|
|
425
|
+
</div>
|
|
426
|
+
</div><div class="entity-item" onclick="focusNode('GLOBAL:TECH_STACK')">
|
|
427
|
+
<div class="name">全量技术栈</div>
|
|
428
|
+
<div class="meta">
|
|
429
|
+
<span class="type-badge type-global-doc">全局</span>
|
|
430
|
+
|
|
431
|
+
<span title=".speccore/GLOBAL/TECH_STACK.md">TECH_STACK.md</span>
|
|
432
|
+
</div>
|
|
433
|
+
</div><div class="entity-item" onclick="focusNode('TSPEC:Task-006-00-specs-task')">
|
|
434
|
+
<div class="name">Task-006: 权限管理系统</div>
|
|
435
|
+
<div class="meta">
|
|
436
|
+
<span class="type-badge type-task-spec">任务规格</span>
|
|
437
|
+
|
|
438
|
+
<span title="030-tasks/**/Task-006/00-specs/TASK.md">TASK.md</span>
|
|
439
|
+
</div>
|
|
440
|
+
</div><div class="entity-item" onclick="focusNode('TSPEC:Task-001-00-specs-task')">
|
|
441
|
+
<div class="name">Task-001: 会议室预订功能</div>
|
|
442
|
+
<div class="meta">
|
|
443
|
+
<span class="type-badge type-task-spec">任务规格</span>
|
|
444
|
+
|
|
445
|
+
<span title="030-tasks/**/Task-001/00-specs/TASK.md">TASK.md</span>
|
|
446
|
+
</div>
|
|
447
|
+
</div><div class="entity-item" onclick="focusNode('TSPEC:Task-002-00-specs-task')">
|
|
448
|
+
<div class="name">Task-002: 会议通知推送</div>
|
|
449
|
+
<div class="meta">
|
|
450
|
+
<span class="type-badge type-task-spec">任务规格</span>
|
|
451
|
+
|
|
452
|
+
<span title="030-tasks/**/Task-002/00-specs/TASK.md">TASK.md</span>
|
|
453
|
+
</div>
|
|
454
|
+
</div><div class="entity-item" onclick="focusNode('TSPEC:Task-003-00-specs-task')">
|
|
455
|
+
<div class="name">Task-003: 会议纪要大模型总结</div>
|
|
456
|
+
<div class="meta">
|
|
457
|
+
<span class="type-badge type-task-spec">任务规格</span>
|
|
458
|
+
|
|
459
|
+
<span title="030-tasks/**/Task-003/00-specs/TASK.md">TASK.md</span>
|
|
460
|
+
</div>
|
|
461
|
+
</div><div class="entity-item" onclick="focusNode('TSPEC:Task-004-00-specs-task')">
|
|
462
|
+
<div class="name">Task-004: 用户注册登录</div>
|
|
463
|
+
<div class="meta">
|
|
464
|
+
<span class="type-badge type-task-spec">任务规格</span>
|
|
465
|
+
|
|
466
|
+
<span title="030-tasks/**/Task-004/00-specs/TASK.md">TASK.md</span>
|
|
467
|
+
</div>
|
|
468
|
+
</div><div class="entity-item" onclick="focusNode('TSPEC:Task-005-00-specs-task')">
|
|
469
|
+
<div class="name">Task-005: SSO单点登录</div>
|
|
470
|
+
<div class="meta">
|
|
471
|
+
<span class="type-badge type-task-spec">任务规格</span>
|
|
472
|
+
|
|
473
|
+
<span title="030-tasks/**/Task-005/00-specs/TASK.md">TASK.md</span>
|
|
474
|
+
</div>
|
|
475
|
+
</div>
|
|
476
|
+
</div>
|
|
477
|
+
</div>
|
|
478
|
+
<div class="panel-content" id="panel-decay" style="display:none">
|
|
479
|
+
<div class="decay-item">
|
|
480
|
+
<div class="title">cli.ts<span class="severity severity-warning">warning</span></div>
|
|
481
|
+
<div class="detail">文件丢失 · src/cli.ts</div>
|
|
482
|
+
</div><div class="decay-item">
|
|
483
|
+
<div class="title">plan.ts<span class="severity severity-warning">warning</span></div>
|
|
484
|
+
<div class="detail">文件丢失 · src/commands/plan.ts</div>
|
|
485
|
+
</div><div class="decay-item">
|
|
486
|
+
<div class="title">code-index.ts<span class="severity severity-warning">warning</span></div>
|
|
487
|
+
<div class="detail">文件丢失 · src/commands/code-index.ts</div>
|
|
488
|
+
</div><div class="decay-item">
|
|
489
|
+
<div class="title">config.ts<span class="severity severity-warning">warning</span></div>
|
|
490
|
+
<div class="detail">文件丢失 · src/commands/config.ts</div>
|
|
491
|
+
</div><div class="decay-item">
|
|
492
|
+
<div class="title">inbox.ts<span class="severity severity-warning">warning</span></div>
|
|
493
|
+
<div class="detail">文件丢失 · src/core/inbox.ts</div>
|
|
494
|
+
</div><div class="decay-item">
|
|
495
|
+
<div class="title">execution-state.ts<span class="severity severity-warning">warning</span></div>
|
|
496
|
+
<div class="detail">文件丢失 · src/core/execution-state.ts</div>
|
|
497
|
+
</div><div class="decay-item">
|
|
498
|
+
<div class="title">prompt-builder.ts<span class="severity severity-warning">warning</span></div>
|
|
499
|
+
<div class="detail">文件丢失 · src/core/prompt-builder.ts</div>
|
|
500
|
+
</div><div class="decay-item">
|
|
501
|
+
<div class="title">index.ts<span class="severity severity-warning">warning</span></div>
|
|
502
|
+
<div class="detail">文件丢失 · src/i18n/index.ts</div>
|
|
503
|
+
</div><div class="decay-item">
|
|
504
|
+
<div class="title">t.ts<span class="severity severity-warning">warning</span></div>
|
|
505
|
+
<div class="detail">文件丢失 · src/i18n/t.ts</div>
|
|
506
|
+
</div><div class="decay-item">
|
|
507
|
+
<div class="title">index.ts<span class="severity severity-warning">warning</span></div>
|
|
508
|
+
<div class="detail">文件丢失 · src/index.ts</div>
|
|
509
|
+
</div><div class="decay-item">
|
|
510
|
+
<div class="title">task-utils.ts<span class="severity severity-warning">warning</span></div>
|
|
511
|
+
<div class="detail">文件丢失 · src/utils/task-utils.ts</div>
|
|
512
|
+
</div><div class="decay-item">
|
|
513
|
+
<div class="title">logger.ts<span class="severity severity-warning">warning</span></div>
|
|
514
|
+
<div class="detail">文件丢失 · src/utils/logger.ts</div>
|
|
515
|
+
</div>
|
|
516
|
+
</div>
|
|
517
|
+
<div class="panel-content" id="panel-context" style="display:none">
|
|
518
|
+
<div class="context-preview"><h1>项目上下文快照</h1>
|
|
519
|
+
> 自动生成于 2026-08-31 · speccore reindex · 迭代 Q2<br/><br/><h2>需求→功能模块追踪</h2><br/><br/><tr><td>需求</td}<td>功能模块</td}<td>状态</td}<td>任务</td}</tr>
|
|
520
|
+
|
|
521
|
+
<tr><td>—</td}<td>Task-001: 会议室预订功能</td}<td>🔲 未开始</td}<td>—</td}</tr>
|
|
522
|
+
<tr><td>—</td}<td>Task-002: 会议通知推送</td}<td>🔲 未开始</td}<td>—</td}</tr>
|
|
523
|
+
<tr><td>—</td}<td>Task-003: 会议纪要大模型总结</td}<td>🔲 未开始</td}<td>—</td}</tr>
|
|
524
|
+
<tr><td>—</td}<td>Task-004: 用户注册登录</td}<td>🔲 未开始</td}<td>—</td}</tr>
|
|
525
|
+
<tr><td>—</td}<td>Task-005: SSO单点登录</td}<td>🔲 未开始</td}<td>—</td}</tr>
|
|
526
|
+
<tr><td>—</td}<td>Task-006: 权限管理系统</td}<td>🔲 未开始</td}<td>—</td}</tr><br/><br/><h2>知识衰减检测</h2><br/><br/><h3>⚠️ 内容已变更</h3><br/><br/>• <code>SRC:src-cli</code> cli.ts — 文件不存在或无法读取<br/>
|
|
527
|
+
• <code>SRC:src-commands-plan</code> plan.ts — 文件不存在或无法读取<br/>
|
|
528
|
+
• <code>SRC:src-commands-code-index</code> code-index.ts — 文件不存在或无法读取<br/>
|
|
529
|
+
• <code>SRC:src-commands-config</code> config.ts — 文件不存在或无法读取<br/>
|
|
530
|
+
• <code>SRC:src-core-inbox</code> inbox.ts — 文件不存在或无法读取<br/><br/><br/>---
|
|
531
|
+
> 0 需求 · 2 规格 · 6 功能模块 · 0 任务</div>
|
|
532
|
+
</div>
|
|
533
|
+
</div>
|
|
534
|
+
</div>
|
|
535
|
+
|
|
536
|
+
<!-- Footer -->
|
|
537
|
+
<div class="footer">
|
|
538
|
+
<span>SPECCORE · KNOWLEDGE VISUALIZER · 2026</span>
|
|
539
|
+
<span>GENERATED: 2026-08-31 08:40:09</span>
|
|
540
|
+
</div>
|
|
541
|
+
</main>
|
|
542
|
+
|
|
543
|
+
<script>
|
|
544
|
+
// ── Theme ──
|
|
545
|
+
var THEMES=['ocean','cyber','light','mono','github','synth','amber','sakura','forest'];
|
|
546
|
+
(function(){var t=localStorage.getItem('speccore-theme')||'ocean';document.documentElement.setAttribute('data-theme',t)})();
|
|
547
|
+
function setTheme(t){document.documentElement.setAttribute('data-theme',t);localStorage.setItem('speccore-theme',t);updateThemeActive();}
|
|
548
|
+
function updateThemeActive(){var cur=localStorage.getItem('speccore-theme')||'ocean';document.querySelectorAll('.theme-sw button').forEach(function(b,i){b.classList.toggle('active',THEMES[i]===cur)});}
|
|
549
|
+
updateThemeActive();
|
|
550
|
+
|
|
551
|
+
// ── Font Family ──
|
|
552
|
+
function setFont(f){document.body.classList.remove('font-jetbrains','font-orbitron','font-hybrid');document.body.classList.add('font-'+f);localStorage.setItem('speccore-font',f);updateFontActive();}
|
|
553
|
+
function updateFontActive(){var cur=localStorage.getItem('speccore-font')||'jetbrains';document.querySelectorAll('.font-sw button').forEach(function(b){b.classList.toggle('active',b.dataset.font===cur)});}
|
|
554
|
+
(function(){var f=localStorage.getItem('speccore-font')||'jetbrains';setFont(f)})();
|
|
555
|
+
|
|
556
|
+
// ── Font Size ──
|
|
557
|
+
function setFontSize(s){document.documentElement.classList.remove('fs-sm','fs-md','fs-lg','fs-xl');if(s!=='md')document.documentElement.classList.add('fs-'+s);localStorage.setItem('speccore-fs',s);updateFsActive();}
|
|
558
|
+
function updateFsActive(){var cur=localStorage.getItem('speccore-fs')||'md';document.querySelectorAll('.fs-sw button').forEach(function(b){b.classList.toggle('active',b.dataset.fs===cur)});}
|
|
559
|
+
(function(){var s=localStorage.getItem('speccore-fs')||'md';setFontSize(s)})();
|
|
560
|
+
|
|
561
|
+
// ── Ctrl Panel Toggle ──
|
|
562
|
+
function toggleCtrl(){var p=document.getElementById('ctrl-panel');p.classList.toggle('open');document.getElementById('ctrl-toggle').classList.toggle('open',p.classList.contains('open'));}
|
|
563
|
+
|
|
564
|
+
// ── Data ──
|
|
565
|
+
var nodes = new vis.DataSet([{"id":"SPEC:ANALYSIS","label":"需求分析报告","title":"需求分析报告\n020-specs/ANALYSIS.md\n类型: spec","color":{"background":"#a78bfa20","border":"#a78bfa","highlight":{"background":"#a78bfa40","border":"#a78bfa"}},"shape":"database","size":24,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"spec"},{"id":"SPEC:REQUIREMENT","label":"REQUIREMENT","title":"REQUIREMENT\n020-specs/REQUIREMENT.md\n类型: spec","color":{"background":"#a78bfa20","border":"#a78bfa","highlight":{"background":"#a78bfa40","border":"#a78bfa"}},"shape":"database","size":24,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"spec"},{"id":"Task-001","label":"Task-001: 会议室预订功能","title":"Task-001: 会议室预订功能\n030-tasks/Task-001\n类型: task\n状态: pending","color":{"background":"#00ff8820","border":"#00ff88","highlight":{"background":"#00ff8840","border":"#00ff88"}},"shape":"square","size":26,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"task"},{"id":"Task-002","label":"Task-002: 会议通知推送","title":"Task-002: 会议通知推送\n030-tasks/Task-002\n类型: task\n状态: pending","color":{"background":"#00ff8820","border":"#00ff88","highlight":{"background":"#00ff8840","border":"#00ff88"}},"shape":"square","size":26,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"task"},{"id":"Task-003","label":"Task-003: 会议纪要大模型总结","title":"Task-003: 会议纪要大模型总结\n030-tasks/Task-003\n类型: task\n状态: pending","color":{"background":"#00ff8820","border":"#00ff88","highlight":{"background":"#00ff8840","border":"#00ff88"}},"shape":"square","size":26,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"task"},{"id":"Task-004","label":"Task-004: 用户注册登录","title":"Task-004: 用户注册登录\n030-tasks/Task-004\n类型: task\n状态: pending","color":{"background":"#00ff8820","border":"#00ff88","highlight":{"background":"#00ff8840","border":"#00ff88"}},"shape":"square","size":26,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"task"},{"id":"Task-005","label":"Task-005: SSO单点登录","title":"Task-005: SSO单点登录\n030-tasks/Task-005\n类型: task\n状态: pending","color":{"background":"#00ff8820","border":"#00ff88","highlight":{"background":"#00ff8840","border":"#00ff88"}},"shape":"square","size":26,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"task"},{"id":"Task-006","label":"Task-006: 权限管理系统","title":"Task-006: 权限管理系统\n030-tasks/bugfix/Task-006\n类型: task\n状态: pending","color":{"background":"#00ff8820","border":"#00ff88","highlight":{"background":"#00ff8840","border":"#00ff88"}},"shape":"square","size":26,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"task"},{"id":"SRC:src-cli","label":"cli.ts","title":"cli.ts\nsrc/cli.ts\n类型: source-file","color":{"background":"#60a5fa20","border":"#f59e0b","highlight":{"background":"#60a5fa40","border":"#f59e0b"}},"shape":"hexagon","size":18,"borderWidth":3,"font":{"color":"#c4d5e7","size":13},"entityType":"source-file"},{"id":"SRC:src-commands-plan","label":"plan.ts","title":"plan.ts\nsrc/commands/plan.ts\n类型: source-file","color":{"background":"#60a5fa20","border":"#f59e0b","highlight":{"background":"#60a5fa40","border":"#f59e0b"}},"shape":"hexagon","size":18,"borderWidth":3,"font":{"color":"#c4d5e7","size":13},"entityType":"source-file"},{"id":"SRC:src-commands-code-index","label":"code-index.ts","title":"code-index.ts\nsrc/commands/code-index.ts\n类型: source-file","color":{"background":"#60a5fa20","border":"#f59e0b","highlight":{"background":"#60a5fa40","border":"#f59e0b"}},"shape":"hexagon","size":18,"borderWidth":3,"font":{"color":"#c4d5e7","size":13},"entityType":"source-file"},{"id":"SRC:src-commands-config","label":"config.ts","title":"config.ts\nsrc/commands/config.ts\n类型: source-file","color":{"background":"#60a5fa20","border":"#f59e0b","highlight":{"background":"#60a5fa40","border":"#f59e0b"}},"shape":"hexagon","size":18,"borderWidth":3,"font":{"color":"#c4d5e7","size":13},"entityType":"source-file"},{"id":"SRC:src-core-inbox","label":"inbox.ts","title":"inbox.ts\nsrc/core/inbox.ts\n类型: source-file","color":{"background":"#60a5fa20","border":"#f59e0b","highlight":{"background":"#60a5fa40","border":"#f59e0b"}},"shape":"hexagon","size":18,"borderWidth":3,"font":{"color":"#c4d5e7","size":13},"entityType":"source-file"},{"id":"SRC:src-core-execution-state","label":"execution-state.ts","title":"execution-state.ts\nsrc/core/execution-state.ts\n类型: source-file","color":{"background":"#60a5fa20","border":"#f59e0b","highlight":{"background":"#60a5fa40","border":"#f59e0b"}},"shape":"hexagon","size":18,"borderWidth":3,"font":{"color":"#c4d5e7","size":13},"entityType":"source-file"},{"id":"SRC:src-core-prompt-builder","label":"prompt-builder.ts","title":"prompt-builder.ts\nsrc/core/prompt-builder.ts\n类型: source-file","color":{"background":"#60a5fa20","border":"#f59e0b","highlight":{"background":"#60a5fa40","border":"#f59e0b"}},"shape":"hexagon","size":18,"borderWidth":3,"font":{"color":"#c4d5e7","size":13},"entityType":"source-file"},{"id":"SRC:src-i18n-index","label":"index.ts","title":"index.ts\nsrc/i18n/index.ts\n类型: source-file","color":{"background":"#60a5fa20","border":"#f59e0b","highlight":{"background":"#60a5fa40","border":"#f59e0b"}},"shape":"hexagon","size":18,"borderWidth":3,"font":{"color":"#c4d5e7","size":13},"entityType":"source-file"},{"id":"SRC:src-i18n-t","label":"t.ts","title":"t.ts\nsrc/i18n/t.ts\n类型: source-file","color":{"background":"#60a5fa20","border":"#f59e0b","highlight":{"background":"#60a5fa40","border":"#f59e0b"}},"shape":"hexagon","size":18,"borderWidth":3,"font":{"color":"#c4d5e7","size":13},"entityType":"source-file"},{"id":"SRC:src-index","label":"index.ts","title":"index.ts\nsrc/index.ts\n类型: source-file","color":{"background":"#60a5fa20","border":"#f59e0b","highlight":{"background":"#60a5fa40","border":"#f59e0b"}},"shape":"hexagon","size":18,"borderWidth":3,"font":{"color":"#c4d5e7","size":13},"entityType":"source-file"},{"id":"SRC:src-utils-task-utils","label":"task-utils.ts","title":"task-utils.ts\nsrc/utils/task-utils.ts\n类型: source-file","color":{"background":"#60a5fa20","border":"#f59e0b","highlight":{"background":"#60a5fa40","border":"#f59e0b"}},"shape":"hexagon","size":18,"borderWidth":3,"font":{"color":"#c4d5e7","size":13},"entityType":"source-file"},{"id":"SRC:src-utils-logger","label":"logger.ts","title":"logger.ts\nsrc/utils/logger.ts\n类型: source-file","color":{"background":"#60a5fa20","border":"#f59e0b","highlight":{"background":"#60a5fa40","border":"#f59e0b"}},"shape":"hexagon","size":18,"borderWidth":3,"font":{"color":"#c4d5e7","size":13},"entityType":"source-file"},{"id":"GLOBAL:ARCHITECTURE","label":"全量技术架构","title":"全量技术架构\n.speccore/GLOBAL/ARCHITECTURE.md\n类型: global-doc","color":{"background":"#f9731620","border":"#f97316","highlight":{"background":"#f9731640","border":"#f97316"}},"shape":"star","size":28,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"global-doc"},{"id":"GLOBAL:BASELINES-README","label":"基线索引","title":"基线索引\n.speccore/GLOBAL/BASELINES/README.md\n类型: global-doc","color":{"background":"#f9731620","border":"#f97316","highlight":{"background":"#f9731640","border":"#f97316"}},"shape":"star","size":28,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"global-doc"},{"id":"GLOBAL:CHANGELOG","label":"全量变更日志","title":"全量变更日志\n.speccore/GLOBAL/CHANGELOG.md\n类型: global-doc","color":{"background":"#f9731620","border":"#f97316","highlight":{"background":"#f9731640","border":"#f97316"}},"shape":"star","size":28,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"global-doc"},{"id":"GLOBAL:CODE_INDEX","label":"全量代码索引","title":"全量代码索引\n.speccore/GLOBAL/CODE_INDEX.md\n类型: global-doc","color":{"background":"#f9731620","border":"#f97316","highlight":{"background":"#f9731640","border":"#f97316"}},"shape":"star","size":28,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"global-doc"},{"id":"GLOBAL:GLOSSARY","label":"全量术语表","title":"全量术语表\n.speccore/GLOBAL/GLOSSARY.md\n类型: global-doc","color":{"background":"#f9731620","border":"#f97316","highlight":{"background":"#f9731640","border":"#f97316"}},"shape":"star","size":28,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"global-doc"},{"id":"GLOBAL:OVERVIEW","label":"全量项目全景","title":"全量项目全景\n.speccore/GLOBAL/OVERVIEW.md\n类型: global-doc","color":{"background":"#f9731620","border":"#f97316","highlight":{"background":"#f9731640","border":"#f97316"}},"shape":"star","size":28,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"global-doc"},{"id":"GLOBAL:PROTOTYPE_INDEX","label":"全量原型索引","title":"全量原型索引\n.speccore/GLOBAL/PROTOTYPE_INDEX.md\n类型: global-doc","color":{"background":"#f9731620","border":"#f97316","highlight":{"background":"#f9731640","border":"#f97316"}},"shape":"star","size":28,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"global-doc"},{"id":"GLOBAL:TECH_STACK","label":"全量技术栈","title":"全量技术栈\n.speccore/GLOBAL/TECH_STACK.md\n类型: global-doc","color":{"background":"#f9731620","border":"#f97316","highlight":{"background":"#f9731640","border":"#f97316"}},"shape":"star","size":28,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"global-doc"},{"id":"TSPEC:Task-006-00-specs-task","label":"Task-006: 权限管理系统","title":"Task-006: 权限管理系统\n030-tasks/**/Task-006/00-specs/TASK.md\n类型: task-spec","color":{"background":"#14b8a620","border":"#14b8a6","highlight":{"background":"#14b8a640","border":"#14b8a6"}},"shape":"box","size":20,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"task-spec"},{"id":"TSPEC:Task-001-00-specs-task","label":"Task-001: 会议室预订功能","title":"Task-001: 会议室预订功能\n030-tasks/**/Task-001/00-specs/TASK.md\n类型: task-spec","color":{"background":"#14b8a620","border":"#14b8a6","highlight":{"background":"#14b8a640","border":"#14b8a6"}},"shape":"box","size":20,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"task-spec"},{"id":"TSPEC:Task-002-00-specs-task","label":"Task-002: 会议通知推送","title":"Task-002: 会议通知推送\n030-tasks/**/Task-002/00-specs/TASK.md\n类型: task-spec","color":{"background":"#14b8a620","border":"#14b8a6","highlight":{"background":"#14b8a640","border":"#14b8a6"}},"shape":"box","size":20,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"task-spec"},{"id":"TSPEC:Task-003-00-specs-task","label":"Task-003: 会议纪要大模型总结","title":"Task-003: 会议纪要大模型总结\n030-tasks/**/Task-003/00-specs/TASK.md\n类型: task-spec","color":{"background":"#14b8a620","border":"#14b8a6","highlight":{"background":"#14b8a640","border":"#14b8a6"}},"shape":"box","size":20,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"task-spec"},{"id":"TSPEC:Task-004-00-specs-task","label":"Task-004: 用户注册登录","title":"Task-004: 用户注册登录\n030-tasks/**/Task-004/00-specs/TASK.md\n类型: task-spec","color":{"background":"#14b8a620","border":"#14b8a6","highlight":{"background":"#14b8a640","border":"#14b8a6"}},"shape":"box","size":20,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"task-spec"},{"id":"TSPEC:Task-005-00-specs-task","label":"Task-005: SSO单点登录","title":"Task-005: SSO单点登录\n030-tasks/**/Task-005/00-specs/TASK.md\n类型: task-spec","color":{"background":"#14b8a620","border":"#14b8a6","highlight":{"background":"#14b8a640","border":"#14b8a6"}},"shape":"box","size":20,"borderWidth":2,"font":{"color":"#c4d5e7","size":13},"entityType":"task-spec"}]);
|
|
566
|
+
var edges = new vis.DataSet([{"from":"SRC:src-cli","to":"SRC:src-i18n-t","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-cli","to":"SRC:src-commands-config","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-cli","to":"SRC:src-commands-plan","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-commands-plan","to":"SRC:src-i18n-t","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-commands-plan","to":"SRC:src-utils-logger","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-commands-plan","to":"SRC:src-core-prompt-builder","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-commands-code-index","to":"SRC:src-i18n-t","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-commands-code-index","to":"SRC:src-i18n-index","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-commands-code-index","to":"SRC:src-index","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-commands-code-index","to":"SRC:src-utils-logger","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-commands-config","to":"SRC:src-i18n-t","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-commands-config","to":"SRC:src-utils-logger","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-core-inbox","to":"SRC:src-i18n-t","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-core-inbox","to":"SRC:src-utils-logger","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-core-execution-state","to":"SRC:src-i18n-t","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-core-prompt-builder","to":"SRC:src-i18n-t","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-i18n-index","to":"SRC:src-i18n-t","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-i18n-t","to":"SRC:src-i18n-index","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-i18n-t","to":"SRC:src-index","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"SRC:src-utils-task-utils","to":"SRC:src-i18n-t","title":"imports","color":{"color":"#60a5fa"},"label":"imports","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"cli:cli.ts","to":"common:i18n","title":"module_depends","color":{"color":"#0ea5e9"},"label":"module_depends","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"cli:cli.ts","to":"cli:commands","title":"module_depends","color":{"color":"#0ea5e9"},"label":"module_depends","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"cli:commands","to":"common:i18n","title":"module_depends","color":{"color":"#0ea5e9"},"label":"module_depends","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"cli:commands","to":"shared:utils","title":"module_depends","color":{"color":"#0ea5e9"},"label":"module_depends","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"cli:commands","to":"common:core","title":"module_depends","color":{"color":"#0ea5e9"},"label":"module_depends","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"cli:commands","to":"common:index.ts","title":"module_depends","color":{"color":"#0ea5e9"},"label":"module_depends","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"common:core","to":"common:i18n","title":"module_depends","color":{"color":"#0ea5e9"},"label":"module_depends","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"common:core","to":"shared:utils","title":"module_depends","color":{"color":"#0ea5e9"},"label":"module_depends","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"common:i18n","to":"common:index.ts","title":"module_depends","color":{"color":"#0ea5e9"},"label":"module_depends","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"shared:utils","to":"common:i18n","title":"module_depends","color":{"color":"#0ea5e9"},"label":"module_depends","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"TSPEC:Task-006-00-specs-task","to":"Task-006","title":"elaborates","color":{"color":"#14b8a6"},"label":"elaborates","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"TSPEC:Task-001-00-specs-task","to":"Task-001","title":"elaborates","color":{"color":"#14b8a6"},"label":"elaborates","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"TSPEC:Task-002-00-specs-task","to":"Task-002","title":"elaborates","color":{"color":"#14b8a6"},"label":"elaborates","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"TSPEC:Task-003-00-specs-task","to":"Task-003","title":"elaborates","color":{"color":"#14b8a6"},"label":"elaborates","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"TSPEC:Task-004-00-specs-task","to":"Task-004","title":"elaborates","color":{"color":"#14b8a6"},"label":"elaborates","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}},{"from":"TSPEC:Task-005-00-specs-task","to":"Task-005","title":"elaborates","color":{"color":"#14b8a6"},"label":"elaborates","font":{"size":11,"color":"#4a5568","align":"middle","strokeWidth":0}}]);
|
|
567
|
+
var allEntities = [{"id":"SPEC:ANALYSIS","type":"spec","title":"需求分析报告","file":"020-specs/ANALYSIS.md","status":""},{"id":"SPEC:REQUIREMENT","type":"spec","title":"REQUIREMENT","file":"020-specs/REQUIREMENT.md","status":""},{"id":"Task-001","type":"task","title":"Task-001: 会议室预订功能","file":"030-tasks/Task-001","status":"pending"},{"id":"Task-002","type":"task","title":"Task-002: 会议通知推送","file":"030-tasks/Task-002","status":"pending"},{"id":"Task-003","type":"task","title":"Task-003: 会议纪要大模型总结","file":"030-tasks/Task-003","status":"pending"},{"id":"Task-004","type":"task","title":"Task-004: 用户注册登录","file":"030-tasks/Task-004","status":"pending"},{"id":"Task-005","type":"task","title":"Task-005: SSO单点登录","file":"030-tasks/Task-005","status":"pending"},{"id":"Task-006","type":"task","title":"Task-006: 权限管理系统","file":"030-tasks/bugfix/Task-006","status":"pending"},{"id":"SRC:src-cli","type":"source-file","title":"cli.ts","file":"src/cli.ts","status":""},{"id":"SRC:src-commands-plan","type":"source-file","title":"plan.ts","file":"src/commands/plan.ts","status":""},{"id":"SRC:src-commands-code-index","type":"source-file","title":"code-index.ts","file":"src/commands/code-index.ts","status":""},{"id":"SRC:src-commands-config","type":"source-file","title":"config.ts","file":"src/commands/config.ts","status":""},{"id":"SRC:src-core-inbox","type":"source-file","title":"inbox.ts","file":"src/core/inbox.ts","status":""},{"id":"SRC:src-core-execution-state","type":"source-file","title":"execution-state.ts","file":"src/core/execution-state.ts","status":""},{"id":"SRC:src-core-prompt-builder","type":"source-file","title":"prompt-builder.ts","file":"src/core/prompt-builder.ts","status":""},{"id":"SRC:src-i18n-index","type":"source-file","title":"index.ts","file":"src/i18n/index.ts","status":""},{"id":"SRC:src-i18n-t","type":"source-file","title":"t.ts","file":"src/i18n/t.ts","status":""},{"id":"SRC:src-index","type":"source-file","title":"index.ts","file":"src/index.ts","status":""},{"id":"SRC:src-utils-task-utils","type":"source-file","title":"task-utils.ts","file":"src/utils/task-utils.ts","status":""},{"id":"SRC:src-utils-logger","type":"source-file","title":"logger.ts","file":"src/utils/logger.ts","status":""},{"id":"GLOBAL:ARCHITECTURE","type":"global-doc","title":"全量技术架构","file":".speccore/GLOBAL/ARCHITECTURE.md","status":""},{"id":"GLOBAL:BASELINES-README","type":"global-doc","title":"基线索引","file":".speccore/GLOBAL/BASELINES/README.md","status":""},{"id":"GLOBAL:CHANGELOG","type":"global-doc","title":"全量变更日志","file":".speccore/GLOBAL/CHANGELOG.md","status":""},{"id":"GLOBAL:CODE_INDEX","type":"global-doc","title":"全量代码索引","file":".speccore/GLOBAL/CODE_INDEX.md","status":""},{"id":"GLOBAL:GLOSSARY","type":"global-doc","title":"全量术语表","file":".speccore/GLOBAL/GLOSSARY.md","status":""},{"id":"GLOBAL:OVERVIEW","type":"global-doc","title":"全量项目全景","file":".speccore/GLOBAL/OVERVIEW.md","status":""},{"id":"GLOBAL:PROTOTYPE_INDEX","type":"global-doc","title":"全量原型索引","file":".speccore/GLOBAL/PROTOTYPE_INDEX.md","status":""},{"id":"GLOBAL:TECH_STACK","type":"global-doc","title":"全量技术栈","file":".speccore/GLOBAL/TECH_STACK.md","status":""},{"id":"TSPEC:Task-006-00-specs-task","type":"task-spec","title":"Task-006: 权限管理系统","file":"030-tasks/**/Task-006/00-specs/TASK.md","status":""},{"id":"TSPEC:Task-001-00-specs-task","type":"task-spec","title":"Task-001: 会议室预订功能","file":"030-tasks/**/Task-001/00-specs/TASK.md","status":""},{"id":"TSPEC:Task-002-00-specs-task","type":"task-spec","title":"Task-002: 会议通知推送","file":"030-tasks/**/Task-002/00-specs/TASK.md","status":""},{"id":"TSPEC:Task-003-00-specs-task","type":"task-spec","title":"Task-003: 会议纪要大模型总结","file":"030-tasks/**/Task-003/00-specs/TASK.md","status":""},{"id":"TSPEC:Task-004-00-specs-task","type":"task-spec","title":"Task-004: 用户注册登录","file":"030-tasks/**/Task-004/00-specs/TASK.md","status":""},{"id":"TSPEC:Task-005-00-specs-task","type":"task-spec","title":"Task-005: SSO单点登录","file":"030-tasks/**/Task-005/00-specs/TASK.md","status":""}];
|
|
568
|
+
|
|
569
|
+
// ── Graph ──
|
|
570
|
+
var container = document.getElementById('graph');
|
|
571
|
+
var network = new vis.Network(container, { nodes: nodes, edges: edges }, {
|
|
572
|
+
nodes: { shape: 'dot', size: 24, font: { size: 13, color: '#c4d5e7', face: 'JetBrains Mono' }, borderWidth: 2, chosen: true },
|
|
573
|
+
edges: { width: 1.5, color: { color: 'rgba(0,240,255,0.3)', highlight: '#00f0ff' }, arrows: { to: { enabled: true, scaleFactor: 0.5 } }, smooth: { type: 'continuous', roundness: 0.2 } },
|
|
574
|
+
physics: { solver: 'forceAtlas2Based', forceAtlas2Based: { gravitationalConstant: -70, centralGravity: 0.005, springLength: 180, springConstant: 0.012 }, stabilization: { iterations: 250 } },
|
|
575
|
+
interaction: { hover: true, tooltipDelay: 200, zoomView: true, dragView: true },
|
|
576
|
+
layout: { randomSeed: 42, improvedLayout: true },
|
|
577
|
+
});
|
|
578
|
+
|
|
579
|
+
// ── Filter ──
|
|
580
|
+
document.querySelectorAll('.filter-btn').forEach(function(btn) {
|
|
581
|
+
btn.addEventListener('click', function() {
|
|
582
|
+
document.querySelectorAll('.filter-btn').forEach(function(b) { b.classList.remove('active'); });
|
|
583
|
+
btn.classList.add('active');
|
|
584
|
+
var filter = btn.dataset.filter;
|
|
585
|
+
if (filter === 'all') {
|
|
586
|
+
nodes.forEach(function(n) { nodes.update({ id: n.id, hidden: false }); });
|
|
587
|
+
} else {
|
|
588
|
+
nodes.forEach(function(n) { nodes.update({ id: n.id, hidden: n.entityType !== filter }); });
|
|
589
|
+
}
|
|
590
|
+
});
|
|
591
|
+
});
|
|
592
|
+
|
|
593
|
+
// ── Panel Tabs ──
|
|
594
|
+
document.querySelectorAll('.panel-tab').forEach(function(tab) {
|
|
595
|
+
tab.addEventListener('click', function() {
|
|
596
|
+
document.querySelectorAll('.panel-tab').forEach(function(t) { t.classList.remove('active'); });
|
|
597
|
+
tab.classList.add('active');
|
|
598
|
+
document.querySelectorAll('.panel-content').forEach(function(p) { p.style.display = 'none'; });
|
|
599
|
+
document.getElementById('panel-' + tab.dataset.panel).style.display = 'block';
|
|
600
|
+
});
|
|
601
|
+
});
|
|
602
|
+
|
|
603
|
+
// ── Search ──
|
|
604
|
+
document.getElementById('entity-search').addEventListener('input', function(e) {
|
|
605
|
+
var q = e.target.value.toLowerCase();
|
|
606
|
+
var list = document.getElementById('entity-list');
|
|
607
|
+
list.innerHTML = allEntities
|
|
608
|
+
.filter(function(ent) { return !q || ent.title.toLowerCase().includes(q) || ent.id.toLowerCase().includes(q); })
|
|
609
|
+
.map(function(ent) { return entityItemHtml(ent); })
|
|
610
|
+
.join('');
|
|
611
|
+
});
|
|
612
|
+
|
|
613
|
+
// ── Node Click ──
|
|
614
|
+
network.on('click', function(params) {
|
|
615
|
+
if (params.nodes.length > 0) {
|
|
616
|
+
var nodeId = params.nodes[0];
|
|
617
|
+
var connected = network.getConnectedNodes(nodeId);
|
|
618
|
+
var connectedSet = new Set([nodeId].concat(connected));
|
|
619
|
+
nodes.forEach(function(n) { nodes.update({ id: n.id, opacity: connectedSet.has(n.id) ? 1 : 0.15 }); });
|
|
620
|
+
setTimeout(function() { nodes.forEach(function(n) { nodes.update({ id: n.id, opacity: 1 }); }); }, 3000);
|
|
621
|
+
}
|
|
622
|
+
});
|
|
623
|
+
|
|
624
|
+
function entityItemHtml(ent) {
|
|
625
|
+
var typeClass = 'type-' + ent.type.replace('_', '-');
|
|
626
|
+
var typeLabel = { requirement: '需求', spec: '规格', task: '功能模块', subtask: '任务', business_module: '业务模块', 'user-file': '用户文件', 'source-file': '源码', 'global-doc': '全局', 'task-spec': '任务规格' }[ent.type] || ent.type;
|
|
627
|
+
return '<div class="entity-item" onclick="focusNode(\'' + ent.id + '\')">' +
|
|
628
|
+
'<div class="name">' + ent.title + '</div>' +
|
|
629
|
+
'<div class="meta"><span class="type-badge ' + typeClass + '">' + typeLabel + '</span>' +
|
|
630
|
+
(ent.status ? '<span>' + ent.status + '</span>' : '') +
|
|
631
|
+
'<span style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:150px">' + ent.file + '</span></div></div>';
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
function focusNode(id) {
|
|
635
|
+
network.focusNode(id, { scale: 1.2, animation: { duration: 300 } });
|
|
636
|
+
network.selectNodes([id]);
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
// ── Fullscreen ──
|
|
640
|
+
var fsBtn = document.getElementById('fullscreen-btn');
|
|
641
|
+
var mainPanel = document.querySelector('.main-panel');
|
|
642
|
+
fsBtn.addEventListener('click', function() {
|
|
643
|
+
mainPanel.classList.toggle('fullscreen');
|
|
644
|
+
fsBtn.textContent = mainPanel.classList.contains('fullscreen') ? '⛶' : '⛶';
|
|
645
|
+
fsBtn.title = mainPanel.classList.contains('fullscreen') ? '退出全屏' : '全屏查看';
|
|
646
|
+
setTimeout(function() { network.fit({ animation: { duration: 300 } }); }, 100);
|
|
647
|
+
});
|
|
648
|
+
document.addEventListener('keydown', function(e) {
|
|
649
|
+
if (e.key === 'Escape' && mainPanel.classList.contains('fullscreen')) {
|
|
650
|
+
mainPanel.classList.remove('fullscreen');
|
|
651
|
+
setTimeout(function() { network.fit({ animation: { duration: 300 } }); }, 100);
|
|
652
|
+
}
|
|
653
|
+
});
|
|
654
|
+
</script>
|
|
655
|
+
</body>
|
|
656
|
+
</html>
|