@ohos-cpf/3rdloop 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +119 -128
  2. package/lib/cli.js +25 -0
  3. package/lib/serve.js +268 -0
  4. package/lib/update.js +46 -6
  5. package/lib/web-ext.js +454 -0
  6. package/lib/web.js +664 -0
  7. package/package.json +2 -1
  8. package/vendor/Server/Skills/arkts-code-use/SKILL.md +270 -0
  9. package/vendor/Server/Skills/arkts-code-use/assets/TEMPLATES.md +367 -0
  10. package/vendor/Server/Skills/arkts-code-use/references/API_VERIFICATION.md +144 -0
  11. package/vendor/Server/Skills/arkts-code-use/references/ARKTS_RULES.md +240 -0
  12. package/vendor/Server/Skills/arkts-code-use/references/CODE_PATTERNS.md +431 -0
  13. package/vendor/Server/Skills/arkts-code-use/references/SYNTAX_CHECK_GUIDE.md +164 -0
  14. package/vendor/Server/Skills/arkts-code-use/scripts/verify-arkts.cjs +428 -0
  15. package/vendor/Server/Skills/gitcode-repo-fork/SKILL.md +310 -0
  16. package/vendor/Server/Skills/gitcode-repo-fork/assets/FORK_REPORT_TEMPLATE.md +113 -0
  17. package/vendor/Server/Skills/gitcode-repo-fork/references/FORK_DECISION_GUIDE.md +124 -0
  18. package/vendor/Server/Skills/gitcode-repo-fork/references/GITCODE_FORK_API.md +95 -0
  19. package/vendor/Server/Skills/gitcode-repo-fork/scripts/gitcode-fork.cjs +285 -0
  20. package/vendor/VERSION +3 -3
  21. package/web/css/arktslibrarycheck.css +322 -0
  22. package/web/css/codecheck.css +464 -0
  23. package/web/css/flutterlibrarycheck.css +322 -0
  24. package/web/css/knowledge.css +332 -0
  25. package/web/css/loop.css +578 -0
  26. package/web/css/md-reader.css +240 -0
  27. package/web/css/rnlibrarycheck.css +322 -0
  28. package/web/css/theme.css +702 -0
  29. package/web/index.html +713 -0
  30. package/web/js/arktslibrarycheck.js +1413 -0
  31. package/web/js/codecheck.js +1039 -0
  32. package/web/js/flutterlibrarycheck.js +1364 -0
  33. package/web/js/health.js +69 -0
  34. package/web/js/knowledge.js +358 -0
  35. package/web/js/loop.js +1102 -0
  36. package/web/js/md-reader.js +435 -0
  37. package/web/js/navigation.js +238 -0
  38. package/web/js/rnlibrarycheck.js +1378 -0
  39. package/web/js/stats.js +110 -0
  40. package/web/js/theme.js +46 -0
  41. package/web/js/utils.js +228 -0
  42. package/web/knowledge.html +146 -0
  43. package/web/loop.html +219 -0
package/web/index.html ADDED
@@ -0,0 +1,713 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN" data-theme="light">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>OHOS CPF-ApplicationTPC 工作台</title>
7
+ <link rel="stylesheet" href="css/theme.css">
8
+ <link rel="stylesheet" href="css/loop.css">
9
+ <link rel="stylesheet" href="css/knowledge.css">
10
+ <link rel="stylesheet" href="css/md-reader.css">
11
+ <link rel="stylesheet" href="css/codecheck.css">
12
+ <link rel="stylesheet" href="css/flutterlibrarycheck.css">
13
+ <link rel="stylesheet" href="css/arktslibrarycheck.css">
14
+ <link rel="stylesheet" href="css/rnlibrarycheck.css">
15
+ </head>
16
+ <body>
17
+ <div class="layout" data-view="features">
18
+
19
+ <!-- ═══ 顶栏 ═══════════════════════════════════════════════════════ -->
20
+ <header>
21
+ <div class="logo">OHOS <span>CPF-ApplicationTPC</span></div>
22
+ <div class="view-switcher" id="viewSwitcher">
23
+ <button class="view-btn active" data-view="features">🛠 功能工作台</button>
24
+ <button class="view-btn" data-view="loop">🔁 循环控制台</button>
25
+ <button class="view-btn" data-view="knowledge">📚 知识管理</button>
26
+ </div>
27
+ <div class="header-right">
28
+ <div class="stats-pill" title="页面访问次数">
29
+ <span class="sp-icon">👁</span>
30
+ <span id="visit-count">--</span>
31
+ <span class="sp-label">访问</span>
32
+ </div>
33
+ <div class="stats-pill" title="Session 调用次数">
34
+ <span class="sp-icon">⚡</span>
35
+ <span id="session-count">--</span>
36
+ <span class="sp-label">调用</span>
37
+ </div>
38
+ <div class="stats-pill" id="concurrency-pill" title="AI Session 并发占用 / 上限(排队中步骤数见悬停提示)">
39
+ <span class="sp-icon">🔀</span>
40
+ <span id="session-concurrency">--</span>
41
+ <span class="sp-label">并发</span>
42
+ </div>
43
+ <button class="theme-toggle" id="themeToggle" title="切换日间/夜间模式">
44
+ <span class="theme-icon-light">☀️</span>
45
+ <span class="theme-icon-dark">🌙</span>
46
+ </button>
47
+ <div class="server-tag" id="serverTag" title="点击重新检测">
48
+ <span id="health-dot"></span>
49
+ 后端 <b id="health-label">检测中…</b>
50
+ </div>
51
+ </div>
52
+ </header>
53
+
54
+ <!-- ═══ 左侧导航栏(仅功能工作台模式显示) ═════════════════════════ -->
55
+ <nav>
56
+ <div class="nav-links">
57
+ <div class="nav-section">代码检视</div>
58
+ <div class="nav-item active" data-panel="p-codecheck">
59
+ <span class="method m-post">PR</span> PR 代码检视
60
+ </div>
61
+ <div class="nav-item" data-panel="p-flutterlibrarycheck">
62
+ <span class="method m-post">FLT</span> Flutter 仓库检视
63
+ </div>
64
+ <div class="nav-item" data-panel="p-arktslibrarycheck">
65
+ <span class="method m-post">AKT</span> ArkTS 仓库检视
66
+ </div>
67
+ <div class="nav-item" data-panel="p-rnlibrarycheck">
68
+ <span class="method m-post">RN</span> RN 仓库检视
69
+ </div>
70
+ <div class="nav-item nav-item-disabled" data-panel="p-kmplibrarycheck">
71
+ <span class="method m-post">KMP</span> KMP 仓库检视 <span class="nav-soon">即将支持</span>
72
+ </div>
73
+
74
+ <!-- 扩展功能(由 3rdloop web 的 /api/ext-registry 动态渲染,见 navigation.js ExtNav) -->
75
+ <div id="nav-ext-section" style="display:none">
76
+ <div class="nav-section">扩展功能</div>
77
+ </div>
78
+ </div>
79
+ </nav>
80
+
81
+ <!-- ═══ 主内容区 ═══════════════════════════════════════════════════ -->
82
+ <main id="main">
83
+
84
+ <!-- ─── PR 代码检视面板 ───────────────────────────────────────── -->
85
+ <div class="panel" id="p-codecheck">
86
+ <div class="panel-head">
87
+ <span class="method m-post">POST</span>
88
+ <h2>PR 代码检视</h2>
89
+ <span class="path">/api/orchestrator/load + start</span>
90
+ </div>
91
+ <div class="panel-pad" style="flex:1; overflow-y:auto;">
92
+ <!-- SKILL 介绍 -->
93
+ <div id="cc-skill-intro"></div>
94
+
95
+ <!-- PR 提交表单 -->
96
+ <div class="cc-form-card">
97
+ <div class="form-row">
98
+ <label>PR 地址 <span style="color:var(--red)">*</span></label>
99
+ <input id="cc-pr-url" placeholder="https://gitee.com/openharmony-tpc/community/pulls/123" />
100
+ </div>
101
+ <div class="form-inline">
102
+ <div class="form-row">
103
+ <label>三方库类型 <span style="color:var(--red)">*</span></label>
104
+ <select id="cc-lib-type">
105
+ <option value="arkts">ArkTS</option>
106
+ <option value="flutter">Flutter</option>
107
+ <option value="rn">React Native</option>
108
+ <option value="tpccplus">TPC C/C++</option>
109
+ </select>
110
+ </div>
111
+ <button class="btn btn-primary" id="cc-submit-btn">▶ 开始检视</button>
112
+ </div>
113
+ <div class="cc-advanced-toggle" id="cc-advanced-toggle">高级选项</div>
114
+ <div class="cc-advanced-section" id="cc-advanced-section">
115
+ <div class="form-row">
116
+ <label>SKILL 根目录(可选,留空使用服务端默认)</label>
117
+ <input id="cc-skill-dir" placeholder="如 /path/to/Server/Skills" />
118
+ <div class="hint" style="font-size:11px;color:var(--text3);margin-top:4px">
119
+ 检视将按三方库类型固定使用对应 SKILL(ArkTS → arkts-code-check,Flutter → flutter-code-check,React Native → rn-code-check,TPC C/C++ → tpc-cpp-check)。此处可自定义 SKILL 根目录,留空时使用服务端默认目录。
120
+ </div>
121
+ </div>
122
+ </div>
123
+ </div>
124
+
125
+ <div id="cc-error" class="cc-error-msg"></div>
126
+
127
+ <!-- 检视历史 -->
128
+ <div>
129
+ <div class="cc-history-label-row">
130
+ <span class="cc-history-label">检视历史</span>
131
+ <span id="cc-task-count" class="cc-task-count">0 个任务</span>
132
+ </div>
133
+ <div id="cc-tasks-list" class="cc-tasks-list">
134
+ <div id="cc-tasks-empty" class="cc-empty-hint">
135
+ 暂无检视任务,提交 PR 后将在此显示
136
+ </div>
137
+ </div>
138
+ <div id="cc-tasks-pager"></div>
139
+ </div>
140
+ </div>
141
+ </div>
142
+
143
+ <!-- ─── Flutter 仓库检视面板 ───────────────────────────────────── -->
144
+ <div class="panel" id="p-flutterlibrarycheck">
145
+ <div class="panel-head">
146
+ <span class="method m-post">POST</span>
147
+ <h2>Flutter 仓库检视</h2>
148
+ <span class="path">/api/orchestrator/load + start</span>
149
+ </div>
150
+ <div class="panel-pad" style="flex:1; overflow-y:auto;">
151
+ <!-- 入参说明 -->
152
+ <div class="flc-param-intro">
153
+ <div class="flc-param-title">📥 仓库地址支持的入参格式</div>
154
+ <div class="flc-param-grid">
155
+ <div class="flc-param-item">
156
+ <div class="flc-param-name">完整 URL</div>
157
+ <code class="flc-param-code">https://gitcode.com/CPF-Flutter/fluttertpc_flutter_blue_plus</code>
158
+ </div>
159
+ <div class="flc-param-item">
160
+ <div class="flc-param-name">指定分支</div>
161
+ <code class="flc-param-code">https://gitcode.com/CPF-Flutter/fluttertpc_flutter_blue_plus/tree/br_2.1.0_ohos</code>
162
+ </div>
163
+ <div class="flc-param-item">
164
+ <div class="flc-param-name">分支 + 子路径</div>
165
+ <code class="flc-param-code">https://gitcode.com/openharmony-sig/kmptpc_compose_sample/tree/cmp192_for_ohos/harmonyApp</code>
166
+ <div class="flc-param-note">稀疏检出,只分析指定文件夹</div>
167
+ </div>
168
+ <div class="flc-param-item">
169
+ <div class="flc-param-name">扩展参数</div>
170
+ <code class="flc-param-code">https://github.com/nickmeinhold/flutter_blue_plus.git#branch=develop&amp;subpath=packages/core</code>
171
+ <div class="flc-param-note">默认分支可省略 branch 参数</div>
172
+ </div>
173
+ </div>
174
+ <div class="flc-param-tip">支持 Gitee / GitCode / GitHub;gitee openharmony-tpc 仓库已迁移时将自动探测 GitCode(CPF-Flutter)上的新地址</div>
175
+ </div>
176
+
177
+ <!-- 提交表单 -->
178
+ <div class="cc-form-card">
179
+ <div class="form-row">
180
+ <label>仓库地址 <span style="color:var(--red)">*</span></label>
181
+ <input id="flc-repo-url" placeholder="https://gitee.com/openharmony-tpc/flutter_blue_plus" />
182
+ </div>
183
+ <div class="form-inline">
184
+ <div class="form-row">
185
+ <label>仓库类型</label>
186
+ <input value="Flutter 三方库(ohos 鸿蒙化适配检视)" disabled />
187
+ </div>
188
+ <button class="btn btn-primary" id="flc-submit-btn">▶ 开始检视</button>
189
+ </div>
190
+ <div class="cc-advanced-toggle" id="flc-advanced-toggle">高级选项</div>
191
+ <div class="cc-advanced-section" id="flc-advanced-section">
192
+ <div class="form-row">
193
+ <label>SKILL 根目录(可选,留空使用服务端默认)</label>
194
+ <input id="flc-skill-dir" placeholder="如 /path/to/Server/Skills" />
195
+ <div class="hint" style="font-size:11px;color:var(--text3);margin-top:4px">
196
+ 检视将固定编排 6 个 SKILL:flutter-interface(接口分析,先行)→ 稳定性 / 一致性 / 内存泄露 / 文档质量 / 用例覆盖度 5 个检视维度并发执行。此处可自定义 SKILL 根目录,留空时使用服务端默认目录。
197
+ </div>
198
+ </div>
199
+ </div>
200
+ </div>
201
+
202
+ <div id="flc-error" class="cc-error-msg"></div>
203
+
204
+ <!-- 检视历史 -->
205
+ <div>
206
+ <div class="cc-history-label-row">
207
+ <span class="cc-history-label">检视历史</span>
208
+ <span id="flc-task-count" class="cc-task-count">0 个任务</span>
209
+ </div>
210
+ <div id="flc-tasks-list" class="cc-tasks-list">
211
+ <div id="flc-tasks-empty" class="cc-empty-hint">
212
+ 暂无检视任务,提交仓库地址后将在此显示
213
+ </div>
214
+ </div>
215
+ <div id="flc-tasks-pager"></div>
216
+ </div>
217
+ </div>
218
+ </div>
219
+
220
+ <!-- ─── ArkTS 仓库检视面板 ─────────────────────────────────────── -->
221
+ <div class="panel" id="p-arktslibrarycheck">
222
+ <div class="panel-head">
223
+ <span class="method m-post">POST</span>
224
+ <h2>ArkTS 仓库检视</h2>
225
+ <span class="path">/api/orchestrator/load + start</span>
226
+ </div>
227
+ <div class="panel-pad" style="flex:1; overflow-y:auto;">
228
+ <!-- 入参说明 -->
229
+ <div class="akt-param-intro">
230
+ <div class="akt-param-title">📥 仓库地址支持的入参格式</div>
231
+ <div class="akt-param-grid">
232
+ <div class="akt-param-item">
233
+ <div class="akt-param-name">完整 URL(Gitee)</div>
234
+ <code class="akt-param-code">https://gitee.com/openharmony-sig/lottie</code>
235
+ </div>
236
+ <div class="akt-param-item">
237
+ <div class="akt-param-name">完整 URL(GitCode)</div>
238
+ <code class="akt-param-code">https://gitcode.com/openharmony-sig/lottieNative</code>
239
+ </div>
240
+ <div class="akt-param-item">
241
+ <div class="akt-param-name">指定分支</div>
242
+ <code class="akt-param-code">https://gitee.com/openharmony-sig/lottie/tree/master</code>
243
+ <div class="akt-param-note">/tree/{branch} 指定分支</div>
244
+ </div>
245
+ <div class="akt-param-item">
246
+ <div class="akt-param-name">扩展参数</div>
247
+ <code class="akt-param-code">https://gitcode.com/xxx/repo.git#branch=dev_ohos</code>
248
+ <div class="akt-param-note">#branch=xxx 指定分支,默认分支可省略</div>
249
+ </div>
250
+ </div>
251
+ <div class="akt-param-tip">支持 Gitee / GitCode / GitHub;源码将克隆到工作目录 source/ 固定路径,接口分析复用该源码,4 个检视维度(稳定性 / 内存泄露 / 文档质量 / 用例覆盖度)并发执行</div>
252
+ </div>
253
+
254
+ <!-- 提交表单 -->
255
+ <div class="cc-form-card">
256
+ <div class="form-row">
257
+ <label>仓库地址 <span style="color:var(--red)">*</span></label>
258
+ <input id="akt-repo-url" placeholder="https://gitee.com/openharmony-sig/lottie" />
259
+ </div>
260
+ <div class="form-inline">
261
+ <div class="form-row">
262
+ <label>仓库类型</label>
263
+ <input value="ArkTS 三方库(鸿蒙原生库检视)" disabled />
264
+ </div>
265
+ <button class="btn btn-primary" id="akt-submit-btn">▶ 开始检视</button>
266
+ </div>
267
+ <div class="cc-advanced-toggle" id="akt-advanced-toggle">高级选项</div>
268
+ <div class="cc-advanced-section" id="akt-advanced-section">
269
+ <div class="form-row">
270
+ <label>SKILL 根目录(可选,留空使用服务端默认)</label>
271
+ <input id="akt-skill-dir" placeholder="如 /path/to/Server/Skills" />
272
+ <div class="hint" style="font-size:11px;color:var(--text3);margin-top:4px">
273
+ 检视将固定编排 6 个 SKILL:arkts-library-source-clone(源码下载,克隆到 source/ 固定路径)→ arkts-library-interface-spec(接口分析)→ 稳定性 / 内存泄露 / 文档质量 / 用例覆盖度 4 个检视维度并发执行。此处可自定义 SKILL 根目录,留空时使用服务端默认目录。
274
+ </div>
275
+ </div>
276
+ </div>
277
+ </div>
278
+
279
+ <div id="akt-error" class="cc-error-msg"></div>
280
+
281
+ <!-- 检视历史 -->
282
+ <div>
283
+ <div class="cc-history-label-row">
284
+ <span class="cc-history-label">检视历史</span>
285
+ <span id="akt-task-count" class="cc-task-count">0 个任务</span>
286
+ </div>
287
+ <div id="akt-tasks-list" class="cc-tasks-list">
288
+ <div id="akt-tasks-empty" class="cc-empty-hint">
289
+ 暂无检视任务,提交仓库地址后将在此显示
290
+ </div>
291
+ </div>
292
+ <div id="akt-tasks-pager"></div>
293
+ </div>
294
+ </div>
295
+ </div>
296
+
297
+ <!-- ─── RN 仓库检视面板 ─────────────────────────────────────────── -->
298
+ <div class="panel" id="p-rnlibrarycheck">
299
+ <div class="panel-head">
300
+ <span class="method m-post">POST</span>
301
+ <h2>RN 仓库检视</h2>
302
+ <span class="path">/api/orchestrator/load + start</span>
303
+ </div>
304
+ <div class="panel-pad" style="flex:1; overflow-y:auto;">
305
+ <!-- 入参说明 -->
306
+ <div class="rn-param-intro">
307
+ <div class="rn-param-title">📥 双仓库地址支持的入参格式</div>
308
+ <div class="rn-param-grid">
309
+ <div class="rn-param-item">
310
+ <div class="rn-param-name">鸿蒙化仓库(GitCode)</div>
311
+ <code class="rn-param-code">https://gitcode.com/openharmony-sig/react-native-svg</code>
312
+ </div>
313
+ <div class="rn-param-item">
314
+ <div class="rn-param-name">上游原库(GitHub)</div>
315
+ <code class="rn-param-code">https://github.com/software-mansion/react-native-svg</code>
316
+ </div>
317
+ <div class="rn-param-item">
318
+ <div class="rn-param-name">指定分支</div>
319
+ <code class="rn-param-code">https://gitcode.com/openharmony-sig/react-native-svg/tree/master</code>
320
+ <div class="rn-param-note">/tree/{branch} 指定分支</div>
321
+ </div>
322
+ <div class="rn-param-item">
323
+ <div class="rn-param-name">扩展参数(monorepo)</div>
324
+ <code class="rn-param-code">https://github.com/software-mansion/react-native-svg.git#branch=develop&amp;subpath=packages/core</code>
325
+ <div class="rn-param-note">subpath 定位 monorepo 主包目录,默认分支可省略 branch</div>
326
+ </div>
327
+ </div>
328
+ <div class="rn-param-tip">支持 GitCode / GitHub / Gitee / 本地路径 / npm 包名(仅上游原库);两仓库的分支与子路径均从 URL 自动解析,无需单独指定</div>
329
+ </div>
330
+
331
+ <!-- 提交表单 -->
332
+ <div class="cc-form-card">
333
+ <div class="form-row">
334
+ <label>库名 <span style="color:var(--red)">*</span></label>
335
+ <input id="rn-library-name" placeholder="react-native-svg" />
336
+ </div>
337
+ <div class="form-row">
338
+ <label>鸿蒙化仓库地址 <span style="color:var(--red)">*</span></label>
339
+ <input id="rn-ohos-repo-url" placeholder="https://gitcode.com/openharmony-sig/react-native-svg" />
340
+ </div>
341
+ <div class="form-row">
342
+ <label>上游原库地址 <span style="color:var(--red)">*</span></label>
343
+ <input id="rn-upstream-repo-url" placeholder="https://github.com/software-mansion/react-native-svg" />
344
+ </div>
345
+ <div class="form-row">
346
+ <label>RN 使用文档地址(可选,传给文档质量检视)</label>
347
+ <input id="rn-rndoc-url" placeholder="https://gitcode.com/openharmony-sig/react-native-svg/blob/master/usage-docs/README.md" />
348
+ </div>
349
+ <div class="form-row">
350
+ <label>RNT 测试 Demo 地址(可选,传给用例覆盖度检视)</label>
351
+ <input id="rn-rnt-url" placeholder="https://gitcode.com/react-native-oh-library/rnt-svg" />
352
+ <div class="hint" style="font-size:11px;color:var(--text3);margin-top:4px">
353
+ 格式 {rnRntGitUrl}/tree/{branch}/{projectPath}/{demoPath};留空时脚本自动从仓库 example/ tester/ demo/ 目录查找
354
+ </div>
355
+ </div>
356
+ <div class="form-inline">
357
+ <button class="btn btn-primary" id="rn-submit-btn">▶ 开始检视</button>
358
+ </div>
359
+ </div>
360
+
361
+ <div id="rn-error" class="cc-error-msg"></div>
362
+
363
+ <!-- 检视历史 -->
364
+ <div>
365
+ <div class="cc-history-label-row">
366
+ <span class="cc-history-label">检视历史</span>
367
+ <span id="rn-task-count" class="cc-task-count">0 个任务</span>
368
+ </div>
369
+ <div id="rn-tasks-list" class="cc-tasks-list">
370
+ <div id="rn-tasks-empty" class="cc-empty-hint">
371
+ 暂无检视任务,提交检视参数后将在此显示
372
+ </div>
373
+ </div>
374
+ <div id="rn-tasks-pager"></div>
375
+ </div>
376
+ </div>
377
+ </div>
378
+
379
+ <!-- ─── 循环控制台面板(由顶栏视图切换器控制,不属于功能面板 nav 系统) ── -->
380
+ <div class="panel loop-panel" id="p-loop">
381
+ <div class="app-body">
382
+ <!-- 侧边栏:任务列表 -->
383
+ <div class="sidebar">
384
+ <div class="sidebar-header">
385
+ <h2>📋 大循环任务 <span class="count-badge" id="loopCount">0</span></h2>
386
+ <button class="new-task-btn" id="btnNewLoop">🚀 启动大循环</button>
387
+ <button class="new-task-btn single" id="btnNewSingle">⚡ 启动单次执行</button>
388
+ <input class="search-box" id="loopSearch" placeholder="搜索任务 ID..." />
389
+ </div>
390
+ <div class="task-list" id="loopList">
391
+ <div class="detail-empty">加载中...</div>
392
+ </div>
393
+ </div>
394
+
395
+ <!-- 主内容区 -->
396
+ <div class="main-content">
397
+ <div class="loop-overview" id="loopOverview" style="display:none;">
398
+ <div class="title-row">
399
+ <h2 id="ovTaskId">—</h2>
400
+ <span class="status-badge idle" id="ovStatus">—</span>
401
+ <div class="task-controls">
402
+ <button class="danger sm" id="btnLoopAbort" disabled>⏹ 终止循环</button>
403
+ <button class="secondary sm" id="btnLoopRefresh">🔄 刷新</button>
404
+ </div>
405
+ </div>
406
+ <div class="desc" id="ovDesc">—</div>
407
+ <div class="stats-row" id="ovStats"></div>
408
+ </div>
409
+
410
+ <div class="main-tabs" id="mainTabs">
411
+ <div class="main-tab active" data-tab="rounds">🔄 循环轮次</div>
412
+ <div class="main-tab" data-tab="orchestrator">🔀 编排详情</div>
413
+ <div class="main-tab" data-tab="brain">🧠 Brain 拆解</div>
414
+ </div>
415
+
416
+ <div class="tab-content active" id="tabRounds">
417
+ <div class="rounds-section" id="roundsSection">
418
+ <div class="rounds-empty">请从左侧选择一个大循环任务,或点击「启动大循环」</div>
419
+ </div>
420
+ </div>
421
+
422
+ <div class="tab-content" id="tabOrchestrator">
423
+ <div class="graph-detail-split">
424
+ <div class="graph-section">
425
+ <div class="graph-toolbar">
426
+ <h3>🔀 步骤编排图</h3>
427
+ <span class="muted" style="font-size:11px;" id="graphHint"></span>
428
+ <div class="toolbar-actions">
429
+ <button class="secondary sm" id="btnGraphZoomOut" title="缩小">🔍−</button>
430
+ <span class="zoom-display" id="zoomDisplay">100%</span>
431
+ <button class="secondary sm" id="btnGraphZoomIn" title="放大">🔍+</button>
432
+ <button class="secondary sm" id="btnGraphFit" title="自适应">📐 自适应</button>
433
+ <button class="secondary sm" id="btnGraphRefresh" title="刷新">🔄 刷新</button>
434
+ </div>
435
+ </div>
436
+ <div class="graph-canvas-wrap" id="graphCanvas">
437
+ <div class="graph-empty" id="graphEmpty">请先选择一个大循环任务</div>
438
+ <svg class="graph-svg" id="graphSvg" style="display:none;">
439
+ <defs>
440
+ <marker id="arrow-success" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
441
+ <path d="M 0 0 L 10 5 L 0 10 z" fill="var(--green)" />
442
+ </marker>
443
+ <marker id="arrow-fail" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
444
+ <path d="M 0 0 L 10 5 L 0 10 z" fill="var(--red)" />
445
+ </marker>
446
+ <marker id="arrow-depend" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
447
+ <path d="M 0 0 L 10 5 L 0 10 z" fill="var(--text3)" />
448
+ </marker>
449
+ </defs>
450
+ <g class="graph-viewport" id="graphViewport"></g>
451
+ </svg>
452
+ </div>
453
+ </div>
454
+ <div class="detail-panel">
455
+ <div class="detail-tabs">
456
+ <div class="detail-tab active" data-tab="detail">📋 详情</div>
457
+ <div class="detail-tab" data-tab="conversation">💬 对话</div>
458
+ <div class="detail-tab" data-tab="control">⚡ 控制</div>
459
+ <div class="detail-tab" data-tab="files">📁 文件</div>
460
+ </div>
461
+ <div class="detail-content" id="detailContent">
462
+ <div class="detail-empty">请选择一个步骤节点</div>
463
+ </div>
464
+ </div>
465
+ </div>
466
+ </div>
467
+
468
+ <div class="tab-content" id="tabBrain">
469
+ <div class="brain-section" id="brainSection">
470
+ <div class="rounds-empty">请先选择一个大循环任务</div>
471
+ </div>
472
+ </div>
473
+ </div>
474
+ </div>
475
+ </div>
476
+
477
+ <!-- ─── 知识管理面板(由顶栏视图切换器控制,不属于功能面板 nav 系统) ── -->
478
+ <div class="panel knowledge-panel" id="p-knowledge">
479
+ <div class="kn-body">
480
+ <!-- 左侧:知识列表 -->
481
+ <div class="kn-sidebar">
482
+ <div class="kn-sidebar-header">
483
+ <h2>📋 知识库 <span class="count-badge" id="knCount">0</span></h2>
484
+ <input class="search-box" id="knSearch" placeholder="搜索任务描述或 ID..." />
485
+ <button class="secondary sm kn-refresh-btn" id="btnKnRefresh">🔄 刷新列表</button>
486
+ </div>
487
+ <div class="kn-list" id="knList">
488
+ <div class="detail-empty">加载中...</div>
489
+ </div>
490
+ </div>
491
+
492
+ <!-- 右侧:知识详情 + 导入操作 -->
493
+ <div class="kn-main">
494
+ <!-- 知识详情卡 -->
495
+ <div class="kn-detail-card" id="knDetailCard" style="display:none;">
496
+ <div class="kn-detail-header">
497
+ <div class="kn-detail-title">
498
+ <h2 id="knTitle">—</h2>
499
+ <span class="kn-id" id="knDetailId">—</span>
500
+ </div>
501
+ <div class="kn-detail-actions">
502
+ <button class="primary sm" id="btnStartImport">📥 开始导入</button>
503
+ <button class="secondary sm" id="btnViewDoc">📄 查看原文</button>
504
+ <button class="danger sm" id="btnDeleteKn">🗑️ 删除知识</button>
505
+ </div>
506
+ </div>
507
+ <div class="kn-detail-meta" id="knDetailMeta"></div>
508
+ <div class="kn-detail-desc" id="knDetailDesc">—</div>
509
+ </div>
510
+
511
+ <!-- 导入面板 -->
512
+ <div class="kn-import-panel" id="knImportPanel" style="display:none;">
513
+ <div class="kn-import-header">
514
+ <h3>📥 知识导入</h3>
515
+ <span class="muted" id="knImportTarget"></span>
516
+ </div>
517
+ <div class="kn-import-body">
518
+ <div class="form-group">
519
+ <label>导入模式</label>
520
+ <div class="hint" style="margin-top:4px;">🔄 异步导入 — 立即返回 importId,通过轮询查询导入进度(适合长任务)</div>
521
+ </div>
522
+ <div class="form-group">
523
+ <label>自定义提示词(可选)</label>
524
+ <textarea class="large" id="knUserPrompt" placeholder="输入额外的提示文字,将追加到导入执行 prompt 中...&#10;&#10;例如:请重点关注鸿蒙端 API 适配部分,生成可复用的 SKILL 文档"></textarea>
525
+ <div class="hint">提示词会追加到知识导入的执行 prompt 末尾,用于引导 AI 更精准地处理知识</div>
526
+ </div>
527
+ <div class="advanced-toggle" id="knAdvancedToggle">高级选项</div>
528
+ <div class="advanced-section" id="knAdvancedSection">
529
+ <div class="form-group">
530
+ <label>工作目录(可选)</label>
531
+ <input id="knWorkDir" placeholder="留空则自动推导(基于来源任务 ID)">
532
+ </div>
533
+ <div class="form-group">
534
+ <label>SKILL 目录(可选)</label>
535
+ <input id="knSkillDir" placeholder="留空则使用默认 SKILL 目录">
536
+ </div>
537
+ </div>
538
+ <div class="kn-import-actions">
539
+ <button class="secondary" id="btnImportCancel">取消</button>
540
+ <button class="primary" id="btnImportSubmit" disabled>📥 执行导入</button>
541
+ </div>
542
+ </div>
543
+ </div>
544
+
545
+ <!-- 异步导入状态轮询 -->
546
+ <div class="kn-import-status" id="knImportStatus" style="display:none;">
547
+ <div class="kn-status-header">
548
+ <h3>📊 导入进度</h3>
549
+ <button class="secondary sm" id="btnStopPoll">停止轮询</button>
550
+ </div>
551
+ <div class="kn-status-body" id="knStatusBody"></div>
552
+ </div>
553
+
554
+ <!-- 空状态 -->
555
+ <div class="kn-empty" id="knEmpty">
556
+ <div class="kn-empty-icon">📚</div>
557
+ <div class="kn-empty-text">请从左侧选择一条知识,或点击「刷新列表」加载知识库</div>
558
+ </div>
559
+ </div>
560
+ </div>
561
+ </div>
562
+
563
+ </main>
564
+ </div>
565
+
566
+ <!-- ═══ 弹窗(共享) ═════════════════════════════════════════════════ -->
567
+
568
+ <!-- 启动大循环 -->
569
+ <div class="modal-overlay" id="newLoopOverlay">
570
+ <div class="modal">
571
+ <div class="modal-header">
572
+ <h3>🚀 启动大循环</h3>
573
+ <button class="modal-close" id="newLoopClose">✕</button>
574
+ </div>
575
+ <div class="modal-body">
576
+ <div class="form-group">
577
+ <label>任务描述 *</label>
578
+ <textarea class="large" id="newLoopDesc" placeholder="输入自然语言任务描述..."></textarea>
579
+ <div class="hint">Brain 将自动拆解为步骤,Orchestrator 执行后 TestCheck 审核准出,未通过则自动重规划</div>
580
+ </div>
581
+ <div class="form-group">
582
+ <label>验收标准(可选)</label>
583
+ <textarea id="newLoopCriteria" placeholder="输入自定义验收标准..."></textarea>
584
+ </div>
585
+ <div class="form-group">
586
+ <label>最大循环次数</label>
587
+ <input id="newLoopMaxLoops" type="number" min="1" max="10" value="3">
588
+ <div class="hint">达到最大次数仍未通过准出审核则标记为失败</div>
589
+ </div>
590
+ <div class="advanced-toggle" id="advancedToggle">高级选项</div>
591
+ <div class="advanced-section" id="advancedSection">
592
+ <div class="form-group">
593
+ <label>任务 ID(可选)</label>
594
+ <input id="newLoopTaskId" placeholder="留空则自动生成 task_xxx">
595
+ </div>
596
+ <div class="form-group">
597
+ <label>SKILL 目录(可选)</label>
598
+ <input id="newLoopSkillDir" placeholder="留空则使用默认 SKILL 目录">
599
+ </div>
600
+ <div class="form-group">
601
+ <label>工作目录(可选)</label>
602
+ <input id="newLoopTaskDir" placeholder="留空则自动生成 task/{taskId}">
603
+ </div>
604
+ </div>
605
+ </div>
606
+ <div class="modal-footer">
607
+ <button class="secondary" id="btnNewLoopCancel">取消</button>
608
+ <button class="primary" id="btnNewLoopSubmit">🚀 启动大循环</button>
609
+ </div>
610
+ </div>
611
+ </div>
612
+
613
+ <!-- 启动单次执行 -->
614
+ <div class="modal-overlay" id="newSingleOverlay">
615
+ <div class="modal">
616
+ <div class="modal-header">
617
+ <h3>⚡ 启动单次执行</h3>
618
+ <button class="modal-close" id="newSingleClose">✕</button>
619
+ </div>
620
+ <div class="modal-body">
621
+ <div class="form-group">
622
+ <label>任务描述 *</label>
623
+ <textarea class="large" id="newSingleDesc" placeholder="输入自然语言任务描述,将直接执行不经过 Brain 拆解..."></textarea>
624
+ <div class="hint">单步骤直接执行,不循环、不拆解,结果可在编排详情中查看</div>
625
+ </div>
626
+ <div class="advanced-toggle" id="singleAdvancedToggle">高级选项</div>
627
+ <div class="advanced-section" id="singleAdvancedSection">
628
+ <div class="form-group">
629
+ <label>任务 ID(可选)</label>
630
+ <input id="newSingleTaskId" placeholder="留空则自动生成 single_xxx">
631
+ </div>
632
+ <div class="form-group">
633
+ <label>SKILL 目录(可选)</label>
634
+ <input id="newSingleSkillDir" placeholder="留空则使用默认 SKILL 目录">
635
+ </div>
636
+ <div class="form-group">
637
+ <label>工作目录(可选)</label>
638
+ <input id="newSingleTaskDir" placeholder="留空则自动生成 task/{taskId}">
639
+ </div>
640
+ <div class="form-group">
641
+ <label>输入报告(可选)</label>
642
+ <textarea id="newSingleInputReport" placeholder="前置报告/上下文内容,传递给执行步骤..."></textarea>
643
+ </div>
644
+ <div class="form-group">
645
+ <label>最大重试次数</label>
646
+ <input id="newSingleMaxRetries" type="number" min="1" max="10" value="3">
647
+ </div>
648
+ </div>
649
+ </div>
650
+ <div class="modal-footer">
651
+ <button class="secondary" id="btnNewSingleCancel">取消</button>
652
+ <button class="primary" id="btnNewSingleSubmit">⚡ 启动单次执行</button>
653
+ </div>
654
+ </div>
655
+ </div>
656
+
657
+ <!-- 通用弹窗 -->
658
+ <div class="modal-overlay" id="modalOverlay">
659
+ <div class="modal">
660
+ <div class="modal-header">
661
+ <h3 id="modalTitle">—</h3>
662
+ <button class="modal-close" id="modalClose">✕</button>
663
+ </div>
664
+ <div class="modal-body"><pre id="modalContent"></pre></div>
665
+ </div>
666
+ </div>
667
+
668
+ <!-- 知识查看原文弹窗 -->
669
+ <div class="modal-overlay" id="docOverlay">
670
+ <div class="modal" style="width:820px;">
671
+ <div class="modal-header">
672
+ <h3 id="docTitle">经验文档</h3>
673
+ <button class="modal-close" id="docClose">✕</button>
674
+ </div>
675
+ <div class="modal-body"><pre id="docContent">加载中...</pre></div>
676
+ </div>
677
+ </div>
678
+
679
+ <!-- 知识删除确认弹窗 -->
680
+ <div class="modal-overlay kn-delete-overlay" id="knDeleteOverlay">
681
+ <div class="modal kn-delete-modal">
682
+ <div class="kn-delete-icon">🗑️</div>
683
+ <h3 class="kn-delete-title">删除知识</h3>
684
+ <div class="kn-delete-desc" id="knDelTitle">—</div>
685
+ <div class="kn-delete-id">ID: <span id="knDelId">—</span></div>
686
+ <div class="kn-delete-warning">
687
+ ⚠️ 删除后将<strong>永久移除</strong>该知识条目(含索引记录),不可恢复。
688
+ 原始经验文档(.md)文件不会被删除,仅从知识库中取消引用。
689
+ </div>
690
+ <div class="kn-delete-actions">
691
+ <button class="secondary" id="btnDeleteCancel">取消</button>
692
+ <button class="danger" id="btnDeleteConfirm">🗑️ 确认删除</button>
693
+ </div>
694
+ </div>
695
+ </div>
696
+
697
+ <div class="toast-container" id="toastContainer"></div>
698
+
699
+ <!-- ═══ 脚本加载 ═══ -->
700
+ <script src="js/utils.js"></script>
701
+ <script src="js/theme.js"></script>
702
+ <script src="js/md-reader.js"></script>
703
+ <script src="js/health.js"></script>
704
+ <script src="js/stats.js"></script>
705
+ <script src="js/navigation.js"></script>
706
+ <script src="js/loop.js"></script>
707
+ <script src="js/knowledge.js"></script>
708
+ <script src="js/codecheck.js"></script>
709
+ <script src="js/flutterlibrarycheck.js"></script>
710
+ <script src="js/arktslibrarycheck.js"></script>
711
+ <script src="js/rnlibrarycheck.js"></script>
712
+ </body>
713
+ </html>