codebee 0.1.15 → 0.1.16

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/app/ui/i18n.js CHANGED
@@ -489,6 +489,25 @@
489
489
  "任务分支隔离,改动可审可合": "Task branches stay isolated; review and merge the changes",
490
490
  "定时任务,无人值守": "Scheduled runs, unattended",
491
491
  "使用引导": "User guide",
492
+ // —— 帮助中心(欢迎引导升级版)——
493
+ "帮助中心": "Help center",
494
+ "快速上手": "Quick start",
495
+ "模型接入与绑定": "Models & bindings",
496
+ "功能一览": "What CodeBee can do",
497
+ "连载创作流程": "Serial writing flow",
498
+ "发布上架": "Publishing",
499
+ "一键发布到番茄、七猫,含封面与作品资料": "One-click publishing to Fanqie & Qimao, covers and book metadata included",
500
+ "自动化与技能市场": "Automation & skills market",
501
+ "常见问题": "FAQ",
502
+ "整理中": "Coming soon",
503
+ "正文暂只提供中文,英文版整理中。": "Body text is Chinese-only for now — English is on the way.",
504
+ "本章节正在整理,可先看「快速上手」与「模型接入与绑定」,或到 GitHub 提 Issue 提问。": "This chapter is still being written. Meanwhile, see Quick start and Models & bindings, or open a GitHub issue.",
505
+ "任务跑起来后,详情页能看到步骤、蜂巢、成果文件与 Git 版本;「直接执行」类任务还能像聊天一样边跑边追加消息。": "While a task runs, its detail page shows steps, the hive, output files and Git versions; \"Direct execute\" tasks also accept follow-up messages like a chat.",
506
+ "这是什么?点开看帮助": "What's this? Click for help",
507
+ "帮助": "Help",
508
+ "还没配过模型?看「模型接入与绑定」帮助": "First time configuring models? See the Models & bindings help",
509
+ "还没有装好的 CLI 智能体(codex / claude / kimi 等)。": "No installed CLI agents yet (codex / claude / kimi, …).",
510
+ "看看快速上手": "See Quick start",
492
511
 
493
512
  "取消": "Cancel",
494
513
  "确定": "OK",
@@ -541,6 +560,8 @@
541
560
  "留空靠 AI 评审": "empty — AI review only",
542
561
  "协议不匹配": "Protocol mismatch",
543
562
  "协议不匹配,解析时跳过": "protocol mismatch — skipped when resolving",
563
+ "openai 面仅 chat 形态(codex 只讲 responses)": "openai face is chat-only (codex speaks responses only)",
564
+ "openai 面仅 chat 形态(codex 只讲 responses),解析时跳过": "openai face is chat-only (codex speaks responses only) — skipped when resolving",
544
565
  "无可用 wire,解析时跳过": "no usable wire — skipped when resolving",
545
566
  "该 CLI 只接受特定 wire 协议的供应商,当前没有匹配项——先到「模型接入」页导入对应协议的网关。": "This CLI only accepts providers on a specific wire protocol and none match — import a compatible gateway on the Models page first.",
546
567
  "%1 个供应商 wire 协议不匹配已隐藏(降级只在同协议网关间进行)。": "%1 provider(s) hidden due to wire-protocol mismatch — fallback stays within the same protocol.",
@@ -551,10 +572,13 @@
551
572
  "适配测试中…": "Adapt test running…",
552
573
  "适配测试通过:同密钥实测支持该协议注入": "Adapt test passed: this gateway verifiably serves this protocol with the same key",
553
574
  "实测该网关同一密钥是否也支持另一条 wire 协议;通过后绑定链可跨协议注入": "Verifiably test whether this gateway also serves the other wire protocol with the same key; once passed, binding chains may inject across protocols",
575
+ "适配测试实测:同密钥也可走 {0} wire——这组模型同样可注入 {0} 系 CLI(codex/dsh 等),运行时自动走适配端点": "Adapt test verified: the same key also serves the {0} wire — these models are just as injectable into {0}-wire CLIs (codex/dsh etc.) via the adapted endpoint",
576
+ "适配测试实测:该面为 chat 形态——除 codex 外的 openai 系 CLI 可用;codex 只讲 responses,链上注入会被跳过": "Adapt test verified: this face is chat-shaped — usable by openai-wire CLIs other than codex; codex only speaks responses, so chain injection is skipped",
554
577
  "已适配:": "Adapted: ",
555
578
  "未发现可适配的 wire": "no adaptable wire found",
556
579
  "正在获取模型列表…": "Fetching model list…",
557
580
  "已获取模型列表 · wire 适配测试后台进行中": "Model list fetched · wire adapt test running in background",
581
+ "无模型列表接口": "no model-list endpoint",
558
582
  "密钥(按顺序调用,欠费自动切备用)": "Keys (tried in order; a drained one auto-fails over)",
559
583
  "点「添加密钥」配备用号": "Add a spare key below",
560
584
  "添加密钥": "Add key",
@@ -686,6 +710,7 @@
686
710
  "目标有点简短,先问几个问题…": "That's a bit brief — a few questions first…",
687
711
  "先对齐几个点,再做更准": "Quick alignment before we build",
688
712
  "跳过,直接做": "Skip, just do it",
713
+ "已确认,开跑": "Confirmed — go",
689
714
  "PR 已创建:": "PR created: ",
690
715
  "PR 已创建": "PR created",
691
716
  "背景信息、约束、相关文件(可空)": "Background, constraints, related files (optional)",
@@ -1579,7 +1604,9 @@
1579
1604
  "重试": "Retry",
1580
1605
  "生成中…": "Generating…",
1581
1606
  "封面生成中…": "Cover generation started…",
1582
- "封面已生成(cover.png),在「成果」页签查看": "Cover generated (cover.png) — view it in the Artifacts tab",
1607
+ "点击查看大图": "Click to view full size",
1608
+ "cover.png 已不在运行目录": "cover.png is no longer in the run directory",
1609
+ "封面已生成,但缺少运行记录归属": "Cover generated, but no run record to load it from",
1583
1610
  "生成竖版封面插画,产出 cover.png": "Generate a portrait cover illustration → cover.png",
1584
1611
  "封面生成失败:": "Cover generation failed: ",
1585
1612
  "已开始生成封面,完成后这里会自动更新": "Cover generation started — this panel updates automatically when done",
@@ -1782,7 +1809,6 @@
1782
1809
  "禅道连接": "ZenTao Connection",
1783
1810
  "修复任务": "Fix Tasks",
1784
1811
  "修复记录": "Fix History",
1785
- "测试连接": "Test Connection",
1786
1812
  "立即扫描": "Scan Now",
1787
1813
  "保存配置": "Save Settings",
1788
1814
  "用当前表单里的连接信息试连禅道": "Test ZenTao with the connection info in this form",
@@ -1795,9 +1821,7 @@
1795
1821
  "只认领指派给": "Only claim bugs assigned to",
1796
1822
  "严重度上限": "Severity cap",
1797
1823
  "不限": "Any",
1798
- "工作目录": "Working directory",
1799
1824
  "基线分支": "Base branch",
1800
- "验证命令": "Verify command",
1801
1825
  "自动 resolve Bug": "Auto-resolve bugs",
1802
1826
  "自动合并代码": "Auto-merge code",
1803
1827
  "定时扫描": "Scheduled scan",
@@ -1809,7 +1833,6 @@
1809
1833
  "定时扫描未开启(仍可手动「立即扫描」)": "Scheduled scan off (manual \"Scan Now\" still works)",
1810
1834
  "上次扫描 ": "Last scan ",
1811
1835
  "最近错误:": "Last error: ",
1812
- "加载失败:服务未连接": "Load failed: service not connected",
1813
1836
  "修复中": "Fixing",
1814
1837
  "已解决": "Resolved",
1815
1838
  "合并失败": "Merge failed",
@@ -1821,11 +1844,58 @@
1821
1844
  "认领于 ": "Claimed at ",
1822
1845
  "还没有认领过 Bug——配置好连接与产品 ID 后点「立即扫描」。": "No bugs claimed yet — set up the connection and product IDs, then click \"Scan Now\".",
1823
1846
  "禅道配置已保存": "ZenTao settings saved",
1824
- "保存失败:": "Save failed: ",
1825
1847
  "连接成功": "Connected",
1826
- "连接失败": "Connection failed",
1827
1848
  "扫描完成,新认领 ": "Scan finished, claimed ",
1828
1849
  " 个 Bug": " bug(s)",
1850
+
1851
+ // —— 禅道·产品档案与排查路由 ——
1852
+ "产品": "Product",
1853
+ "禅道账号名,空 = 不按指派过滤": "ZenTao account; blank = no assignee filter",
1854
+ "(最严重)": " (most severe)",
1855
+ "AI 排查兜底": "AI triage fallback",
1856
+ "产品档案": "Product Profiles",
1857
+ "+ 添加产品": "+ Add product",
1858
+ "删除产品": "Remove product",
1859
+ "每个产品一份档案:我方端(自动修)、两端仓库与负责人、模块路由(模块 → 端/人,排查优先级最高)。": "One profile per product: our sides (auto-fix), frontend/backend repos and owners, module routes (module → side/owner, highest triage priority).",
1860
+ "定时扫描禅道多个产品的激活 Bug:先按模块路由/AI 排查定责(前端/后端/双端/非我方),我方端自动创建代码修复任务(实现→验证→评审→修复),修完自动合并并 resolve 或转派对应负责人;测试指错人也按排查结论改派。": "Periodically scans active bugs across products: triages each (frontend/backend/both/not-ours) via module routes or AI, auto-fixes on our sides (implement → verify → review → fix), then merges & resolves or transfers to the right owner — including re-routing bugs the tester assigned to the wrong person.",
1861
+ "模块路由没命中时,用 AI 读 Bug 描述判端(前端/后端/双端/非我方);关掉则未命中模块的 Bug 留人工": "When no module route matches, use AI to classify the bug (frontend/backend/both/not-ours); off = unmatched bugs left to humans",
1862
+ "我方端(自动修):": "Our sides (auto-fix): ",
1863
+ "都不勾 = 该产品只排查转派,不自动修": "Check none = triage & transfer only, no auto-fix",
1864
+ "后端": "Backend",
1865
+ "前端": "Frontend",
1866
+ "仓库·工作目录": " repo · workdir",
1867
+ "仓库·基线分支": " repo · base branch",
1868
+ "仓库·验证命令": " repo · verify cmd",
1869
+ "仓库·一句话描述": " repo · one-line hint",
1870
+ "空 = 不用该端": "blank = unused side",
1871
+ "如 main;空 = 直接改工作目录": "e.g. main; blank = edit worktree directly",
1872
+ "如 npm test;空 = 靠评审把关": "e.g. npm test; blank = review-only gate",
1873
+ "给 AI 排查看,如:Vue3 管理台前端": "AI triage hint, e.g. Vue3 admin frontend",
1874
+ "后端负责人": "Backend owner",
1875
+ "前端负责人": "Frontend owner",
1876
+ "非我方转派给": "Not-ours transfer to",
1877
+ "禅道账号,转派/升级用": "ZenTao account for transfer/escalation",
1878
+ "空 = 指回报告人": "blank = back to reporter",
1879
+ "模块路由(模块 → 端/人,排查优先级最高)": "Module routes (module → side/owner, top triage priority)",
1880
+ "拉取模块清单": "Fetch modules",
1881
+ "+ 加路由": "+ Add route",
1882
+ "模块 ID": "Module ID",
1883
+ "转给谁(禅道账号,可空)": "Transfer to (ZenTao account, optional)",
1884
+ "未配路由——模块不在路由里的 Bug 走 AI 排查": "No routes yet — unmatched modules go to AI triage",
1885
+ "后端问题": "Backend issue",
1886
+ "前端问题": "Frontend issue",
1887
+ "双端问题": "Both sides",
1888
+ "排查:": "Triage: ",
1889
+ "模块路由": "module route",
1890
+ "已转派": "Transferred",
1891
+ "已升级转派": "Escalated",
1892
+ "需人工": "Needs human",
1893
+ "还没有认领过 Bug——配置好连接与产品档案后点「立即扫描」。": "No bugs claimed yet — set up connection and product profiles, then click \"Scan Now\".",
1894
+ "还没有产品档案——点「+ 添加产品」,填产品 ID 与两端仓库。": "No product profiles yet — click \"+ Add product\" and fill the product ID and repos.",
1895
+ "先填产品 ID 再拉模块清单": "Fill the product ID before fetching modules",
1896
+ "拉取失败": "Fetch failed",
1897
+ "模块清单已拉到 ": "Fetched ",
1898
+ " 条,输入框可下拉选择": " modules — pick from the dropdown",
1829
1899
  };
1830
1900
 
1831
1901
  // ---------- 工具 ----------
package/app/ui/index.html CHANGED
@@ -35,6 +35,7 @@
35
35
  <!-- ================= 图标精灵:统一线性图标(stroke=currentColor,随主题与 hover 自动变色) ================= -->
36
36
  <svg id="icon-sprite" aria-hidden="true" focusable="false">
37
37
  <symbol id="i-search" viewBox="0 0 24 24"><circle cx="11" cy="11" r="7"/><path d="m21 21-4.8-4.8"/></symbol>
38
+ <symbol id="i-help" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/><path d="M12 17h.01"/></symbol>
38
39
  <symbol id="i-chevrons-d" viewBox="0 0 24 24"><path d="m6 6 6 6 6-6"/><path d="m6 13 6 6 6-6"/></symbol>
39
40
  <symbol id="i-gear" viewBox="0 0 24 24"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"/><circle cx="12" cy="12" r="3"/></symbol>
40
41
  <symbol id="i-tasks" viewBox="0 0 24 24"><path d="M3 6h11"/><path d="M3 12h11"/><path d="M3 18h7"/><path d="m16.5 16.5 2 2 4-4"/></symbol>
@@ -504,6 +505,7 @@
504
505
  <div class="panel wide">
505
506
  <div class="panel-head">
506
507
  <h2 data-i18n="自动化">自动化</h2>
508
+ <button class="hhelp" data-help-topic="auto" title="这是什么?点开看帮助" data-i18n-title="这是什么?点开看帮助" aria-label="帮助" data-i18n-aria="帮助"><svg class="ico" aria-hidden="true"><use href="#i-help"></use></svg></button>
507
509
  <div class="actions">
508
510
  <button id="btn-auto-refresh" class="ghost small" title="重新拉取任务列表" data-i18n-title="重新拉取任务列表"><svg class="ico" aria-hidden="true"><use href="#i-refresh"></use></svg><span data-i18n="刷新">刷新</span></button>
509
511
  <button id="btn-auto-new" class="primary small" title="创建一个按计划自动运行的任务" data-i18n-title="创建一个按计划自动运行的任务"><span data-i18n="新建定时任务">新建定时任务</span></button>
@@ -531,38 +533,27 @@
531
533
  <button id="btn-zentao-scan" class="primary small" title="立刻扫一遍激活 Bug 并对账回写" data-i18n-title="立刻扫一遍激活 Bug 并对账回写"><span data-i18n="立即扫描">立即扫描</span></button>
532
534
  </div>
533
535
  </div>
534
- <p data-i18n="定时扫描禅道的激活 Bug,自动创建代码修复任务(实现→验证→评审→修复);跑完自动合并代码、resolve Bug 并把报告评论回禅道,群机器人同步通知。" class="hint">定时扫描禅道的激活 Bug,自动创建代码修复任务(实现→验证→评审→修复);跑完自动合并代码、resolve Bug 并把报告评论回禅道,群机器人同步通知。</p>
536
+ <p data-i18n="定时扫描禅道多个产品的激活 Bug:先按模块路由/AI 排查定责(前端/后端/双端/非我方),我方端自动创建代码修复任务(实现→验证→评审→修复),修完自动合并并 resolve 或转派对应负责人;测试指错人也按排查结论改派。" class="hint">定时扫描禅道多个产品的激活 Bug:先按模块路由/AI 排查定责(前端/后端/双端/非我方),我方端自动创建代码修复任务(实现→验证→评审→修复),修完自动合并并 resolve 或转派对应负责人;测试指错人也按排查结论改派。</p>
535
537
  <div id="zentao-status" class="hint zt-status"></div>
536
538
  <h3 data-i18n="禅道连接" class="sec-title">禅道连接</h3>
537
539
  <div class="zt-grid">
538
- <label data-i18n="禅道地址">禅道地址</label><input id="zt-base-url" type="text" placeholder="https://zentao.example.com(子目录部署带子目录)">
539
- <label data-i18n="账号">账号</label><input id="zt-account" type="text" placeholder="建议建专用账号(如 codebee)收 Bug">
540
+ <label data-i18n="禅道地址">禅道地址</label><input id="zt-base-url" type="text" placeholder="https://zentao.example.com(子目录部署带子目录)" data-i18n-ph="https://zentao.example.com(子目录部署带子目录)">
541
+ <label data-i18n="账号">账号</label><input id="zt-account" type="text" placeholder="建议建专用账号(如 codebee)收 Bug" data-i18n-ph="建议建专用账号(如 codebee)收 Bug">
540
542
  <label data-i18n="密码">密码</label><input id="zt-password" type="password" placeholder="" autocomplete="new-password">
541
- <label data-i18n="产品 ID">产品 ID</label><input id="zt-products" type="text" placeholder="逗号分隔,如 1,2(禅道产品页 URL 里的 product= 数字)">
542
- <label data-i18n="只认领指派给">只认领指派给</label><input id="zt-assigned" type="text" placeholder="禅道账号名,空 = 不按指派过滤">
543
- <label data-i18n="严重度上限">严重度上限</label>
544
- <select id="zt-sev">
545
- <option value="0" data-i18n="不限">不限</option>
546
- <option value="1">1(最严重)</option>
547
- <option value="2">2</option>
548
- <option value="3">3</option>
549
- <option value="4">4(最轻)</option>
550
- </select>
551
- </div>
552
- <h3 data-i18n="修复任务" class="sec-title">修复任务</h3>
553
- <div class="zt-grid">
554
- <label data-i18n="工作目录">工作目录</label><input id="zt-workdir" type="text" placeholder="空 = 跟随默认保存路径">
555
- <label data-i18n="基线分支">基线分支</label><input id="zt-gitrev" type="text" placeholder="如 main:每个修复检出任务分支,跑完可自动合并;空 = 直接改工作目录">
556
- <label data-i18n="验证命令">验证命令</label><input id="zt-verify" type="text" placeholder="如 npm test:实现完成后先跑它把关;空 = 靠评审把关">
557
543
  </div>
558
544
  <h3 data-i18n="自动化" class="sec-title">自动化</h3>
559
545
  <div class="zt-grid zt-grid-toggles">
560
- <label class="toggle" title="修复任务评审通过后,自动到禅道 resolve(fixed)并回评论"><input id="zt-autoresolve" type="checkbox"><span data-i18n="自动 resolve Bug">自动 resolve Bug</span></label>
561
- <label class="toggle" title="把任务分支自动合并回基线分支(需配置基线分支;合并失败不 resolve,留人工)"><input id="zt-automerge" type="checkbox"><span data-i18n="自动合并代码">自动合并代码</span></label>
546
+ <label class="toggle" title="模块路由没命中时,用 AI 读 Bug 描述判端(前端/后端/双端/非我方);关掉则未命中模块的 Bug 留人工" data-i18n-title="模块路由没命中时,用 AI 读 Bug 描述判端(前端/后端/双端/非我方);关掉则未命中模块的 Bug 留人工"><input id="zt-triageai" type="checkbox"><span data-i18n="AI 排查兜底">AI 排查兜底</span></label>
547
+ <label class="toggle" title="修复任务评审通过后,自动到禅道 resolve(fixed)并回评论" data-i18n-title="修复任务评审通过后,自动到禅道 resolve(fixed)并回评论"><input id="zt-autoresolve" type="checkbox"><span data-i18n="自动 resolve Bug">自动 resolve Bug</span></label>
548
+ <label class="toggle" title="把任务分支自动合并回基线分支(需配置基线分支;合并失败不 resolve 不转派,留人工)"><input id="zt-automerge" type="checkbox"><span data-i18n="自动合并代码">自动合并代码</span></label>
562
549
  <label class="toggle" title="按下面的间隔定时扫描;关掉后仍可手动「立即扫描」"><input id="zt-poll" type="checkbox"><span data-i18n="定时扫描">定时扫描</span></label>
563
550
  <label data-i18n="扫描间隔(小时)">扫描间隔(小时)</label><input id="zt-interval" type="number" min="1" max="168" step="1">
564
551
  </div>
565
552
  <div class="ops"><button id="btn-zentao-save" class="primary small"><span data-i18n="保存配置">保存配置</span></button></div>
553
+ <h3 data-i18n="产品档案" class="sec-title">产品档案</h3>
554
+ <p data-i18n="每个产品一份档案:我方端(自动修)、两端仓库与负责人、模块路由(模块 → 端/人,排查优先级最高)。" class="hint">每个产品一份档案:我方端(自动修)、两端仓库与负责人、模块路由(模块 → 端/人,排查优先级最高)。</p>
555
+ <div id="zt-profiles" class="cards"></div>
556
+ <div class="ops"><button id="btn-zentao-addprofile" class="ghost small"><span data-i18n="+ 添加产品">+ 添加产品</span></button></div>
566
557
  <h3 data-i18n="修复记录" class="sec-title">修复记录</h3>
567
558
  <div id="zentao-claims"></div>
568
559
  </div>
@@ -634,6 +625,7 @@
634
625
  <aside class="prov-side">
635
626
  <div class="prov-side-head">
636
627
  <span data-i18n="供应商">供应商</span>
628
+ <button class="hhelp" data-help-topic="models" title="这是什么?点开看帮助" data-i18n-title="这是什么?点开看帮助" aria-label="帮助" data-i18n-aria="帮助"><svg class="ico" aria-hidden="true"><use href="#i-help"></use></svg></button>
637
629
  <span class="prov-side-ops">
638
630
  <button id="btn-refresh-models" class="icon-btn" title="全部重新拉取模型列表" aria-label="全部重新拉取模型列表" data-i18n-aria="全部重新拉取模型列表" data-i18n-title="全部重新拉取模型列表"><svg class="ico" aria-hidden="true"><use href="#i-refresh"></use></svg></button>
639
631
  <button data-i18n="导入" id="btn-import" class="ghost small" title="从本机各 AI 工具导入供应商" data-i18n-title="从本机各 AI 工具导入供应商">导入</button>
@@ -652,6 +644,7 @@
652
644
  <div id="sub-bindings" class="subpage hidden">
653
645
  <div class="panel wide">
654
646
  <div class="panel-head"><h2 data-i18n="CLI 绑定">CLI 绑定</h2>
647
+ <button class="hhelp" data-help-topic="models" title="这是什么?点开看帮助" data-i18n-title="这是什么?点开看帮助" aria-label="帮助" data-i18n-aria="帮助"><svg class="ico" aria-hidden="true"><use href="#i-help"></use></svg></button>
655
648
  <button id="btn-autobind" class="ghost small" onclick="autoBindAll()" data-i18n="一键推荐绑定">一键推荐绑定</button>
656
649
  <button id="btn-saveall-bind" class="ghost small hidden" onclick="saveAllBindings()" data-i18n="全部保存">全部保存</button>
657
650
  </div>
@@ -679,6 +672,7 @@
679
672
  <div class="panel wide">
680
673
  <div class="panel-head">
681
674
  <h2 data-i18n="插件市场">插件市场</h2>
675
+ <button class="hhelp" data-help-topic="auto" title="这是什么?点开看帮助" data-i18n-title="这是什么?点开看帮助" aria-label="帮助" data-i18n-aria="帮助"><svg class="ico" aria-hidden="true"><use href="#i-help"></use></svg></button>
682
676
  <span id="mk-count" class="pm-count"></span>
683
677
  </div>
684
678
  <p data-i18n="用经验包为 CodeBee 扩展写作与工程守则,一键装进经验库。安装即生效,无需手动调用:运行任务时,经验库按插件标注的「适用」自动把内容注入该类任务的提示词;可随时到「经验库」页启用、停用或卸载。" class="hint">用经验包为 CodeBee 扩展写作与工程守则,一键装进经验库。安装即生效,无需手动调用:运行任务时,经验库按插件标注的「适用」自动把内容注入该类任务的提示词;可随时到「经验库」页启用、停用或卸载。</p>
@@ -972,42 +966,26 @@
972
966
  </div>
973
967
  </div>
974
968
 
975
- <!-- 首次启动欢迎引导:产品能做什么 + 装完三步开工;「设置 → 关于与更新」可重开。
976
- localStorage orch.welcomed 记账,只自动弹一次;令牌门在场时让位(见 maybeWelcome)。 -->
969
+ <!-- 帮助中心(首启欢迎引导升级版):左目录右内容;首启自动弹落在「快速上手」章。
970
+ localStorage orch.welcomed 记账,只自动弹一次;令牌门在场时让位(见 maybeWelcome)。
971
+ 章节清单在 app.js HELP_CHAPTERS——加新章只需追加一条 + helpChapterBody 加分支。 -->
977
972
  <div id="welcome" class="welcome-wrap hidden">
978
973
  <div class="welcome-mask" onclick="welcomeClose()"></div>
979
974
  <div class="welcome-card" role="dialog" aria-modal="true" aria-labelledby="welcome-title">
980
975
  <button class="welcome-x icon-btn" title="关闭" aria-label="关闭" data-i18n-title="关闭" data-i18n-aria="关闭" onclick="welcomeClose()">✕</button>
981
- <div class="welcome-left">
982
- <span class="welcome-badge" data-i18n="首次启动">首次启动</span>
976
+ <div class="help-rail">
977
+ <span class="welcome-badge" id="welcome-badge">首次启动</span>
983
978
  <div class="welcome-brand">
984
979
  <svg class="ico welcome-bee" aria-hidden="true"><use href="#i-bee"></use></svg>
985
980
  <span class="brand-name">CodeBee</span>
986
981
  </div>
987
- <h1 id="welcome-title" data-i18n="欢迎使用 CodeBee">欢迎使用 CodeBee</h1>
988
- <p class="welcome-sub" data-i18n="一群 AI 智能体自动分工:规划、实现、评审、打磨,直到交付成果。">一群 AI 智能体自动分工:规划、实现、评审、打磨,直到交付成果。</p>
989
- <div class="welcome-steps">
990
- <div class="wstep"><b>1</b><span data-i18n="添加模型供应商:设置 → 模型接入,填入 API Key">添加模型供应商:设置 → 模型接入,填入 API Key</span></div>
991
- <div class="wstep"><b>2</b><span data-i18n="绑定 CLI 智能体:点「一键推荐绑定」自动配好">绑定 CLI 智能体:点「一键推荐绑定」自动配好</span></div>
992
- <div class="wstep"><b>3</b><span data-i18n="新建任务:选工作目录、写目标,蜂群开工">新建任务:选工作目录、写目标,蜂群开工</span></div>
993
- </div>
994
- <div class="welcome-acts">
995
- <button class="wl-btn primary" onclick="welcomeGo('models')"><span data-i18n="开始配置模型">开始配置模型</span><svg class="ico" aria-hidden="true"><use href="#i-chevron-r"></use></svg></button>
996
- <button class="wl-btn" onclick="welcomeGo('bindings')"><span data-i18n="绑定 CLI 智能体">绑定 CLI 智能体</span><svg class="ico" aria-hidden="true"><use href="#i-chevron-r"></use></svg></button>
997
- <button class="wl-btn ghost" onclick="welcomeClose()"><span data-i18n="先跳过,直接体验">先跳过,直接体验</span></button>
998
- </div>
982
+ <nav class="help-toc" id="help-toc" aria-label="帮助目录"></nav>
999
983
  <p class="welcome-foot" data-i18n="可随时在「设置 → 关于与更新」重新打开本引导。">可随时在「设置 → 关于与更新」重新打开本引导。</p>
1000
984
  </div>
1001
- <div class="welcome-right">
1002
- <h2 data-i18n="把任务交给蜂群">把任务交给蜂群</h2>
1003
- <p class="wr-sub" data-i18n="多智能体分工协作,成果自动落盘。">多智能体分工协作,成果自动落盘。</p>
1004
- <ul class="wr-feats">
1005
- <li><svg class="ico" aria-hidden="true"><use href="#i-workflow"></use></svg><div><b data-i18n="多智能体编排">多智能体编排</b><span data-i18n="规划 · 实现 · 评审 · 打磨,接棒交付">规划 · 实现 · 评审 · 打磨,接棒交付</span></div></li>
1006
- <li><svg class="ico" aria-hidden="true"><use href="#i-book-open"></use></svg><div><b data-i18n="连载写作">连载写作</b><span data-i18n="断点续跑 · 经验沉淀 · 作品资料">断点续跑 · 经验沉淀 · 作品资料</span></div></li>
1007
- <li><svg class="ico" aria-hidden="true"><use href="#i-blocks"></use></svg><div><b data-i18n="插件市场">插件市场</b><span data-i18n="600+ 技能,一键安装">600+ 技能,一键安装</span></div></li>
1008
- <li><svg class="ico" aria-hidden="true"><use href="#i-git-branch"></use></svg><div><b data-i18n="版本工作台">版本工作台</b><span data-i18n="任务分支隔离,改动可审可合">任务分支隔离,改动可审可合</span></div></li>
1009
- <li><svg class="ico" aria-hidden="true"><use href="#i-calendar-days"></use></svg><div><b data-i18n="自动化">自动化</b><span data-i18n="定时任务,无人值守">定时任务,无人值守</span></div></li>
1010
- </ul>
985
+ <div class="help-main">
986
+ <h1 id="welcome-title" data-i18n="欢迎使用 CodeBee">欢迎使用 CodeBee</h1>
987
+ <p class="welcome-sub" data-i18n="一群 AI 智能体自动分工:规划、实现、评审、打磨,直到交付成果。">一群 AI 智能体自动分工:规划、实现、评审、打磨,直到交付成果。</p>
988
+ <div class="help-body" id="help-body"></div>
1011
989
  </div>
1012
990
  </div>
1013
991
  </div>
package/app/ui/style.css CHANGED
@@ -2739,6 +2739,17 @@ details.sf-dir > summary i, a.sf-file i { font-style: normal; color: var(--muted
2739
2739
  word-break: break-all; }
2740
2740
  .bm-src { margin: 0 18px; padding: 10px 0 2px; border-top: 1px solid var(--border);
2741
2741
  color: var(--muted); font-size: 11.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2742
+ /* 封面卡内嵌缩略图:竖版小图靠左,模型·供应商·尺寸说明随右侧;
2743
+ * 图片丢失(运行目录被清)时 noimg 类藏图显兜底文案 */
2744
+ .bm-cover-wrap { display: flex; align-items: flex-start; gap: 14px; padding: 14px 18px 16px; }
2745
+ .bm-cover-img { display: block; width: 136px; height: auto; border-radius: 10px;
2746
+ border: 1px solid var(--border); cursor: zoom-in; }
2747
+ .bm-cover-meta { flex: 1; color: var(--muted); font-size: 12px; line-height: 1.6;
2748
+ padding-top: 4px; min-width: 0; word-break: break-all; }
2749
+ .bm-cover-fallback { display: none; color: var(--muted); font-size: 12.5px; }
2750
+ .bm-cover-wrap.noimg .bm-cover-img { display: none; }
2751
+ .bm-cover-wrap.noimg .bm-cover-fallback { display: block; }
2752
+ .bm-cover-wrap.noimg .bm-cover-meta { display: none; }
2742
2753
  .rd-bookmeta .ico.spin { animation: ico-spin 1.2s linear infinite; }
2743
2754
 
2744
2755
  /* 文件内容弹窗·文本预览/编辑(目录文件弹窗专属):
@@ -4977,27 +4988,72 @@ html::-webkit-scrollbar-thumb { border-radius: 999px; background: color-mix(in s
4977
4988
  html::-webkit-scrollbar-thumb:hover { background: color-mix(in srgb, var(--accent) 48%, var(--border-strong)); }
4978
4989
  html::-webkit-scrollbar-track { background: transparent; }
4979
4990
 
4980
- /* ---- 首次启动欢迎引导:左列上手三步 + 右列能力一览(渐变随皮肤 accent ---- */
4991
+ /* ---- 帮助中心(首启欢迎引导升级版):左目录右内容,随皮肤 accent ---- */
4981
4992
  .welcome-wrap { position: fixed; inset: 0; z-index: 195; display: flex; align-items: center; justify-content: center; padding: 24px; }
4982
4993
  .welcome-mask { position: absolute; inset: 0; background: rgba(0, 0, 0, .5); }
4983
4994
  .welcome-card {
4984
- position: relative; display: flex; width: min(880px, 100%); max-height: calc(100vh - 48px);
4995
+ position: relative; display: flex; width: min(920px, 100%); height: min(620px, calc(100vh - 48px));
4985
4996
  background: var(--bg); border: 1px solid var(--border-strong);
4986
4997
  border-radius: var(--r-lg); box-shadow: var(--shadow); overflow: hidden;
4987
4998
  }
4988
4999
  .welcome-x { position: absolute; top: 12px; right: 12px; z-index: 2; }
4989
- .welcome-left {
4990
- flex: 1.15; min-width: 0; overflow: auto; padding: 30px 30px 20px;
4991
- display: flex; flex-direction: column; gap: 13px;
5000
+ .help-rail {
5001
+ flex: none; width: 214px; padding: 24px 14px 16px;
5002
+ display: flex; flex-direction: column; gap: 14px;
5003
+ border-right: 1px solid var(--border); background: var(--panel);
4992
5004
  }
4993
5005
  .welcome-badge {
4994
5006
  align-self: flex-start; font-size: 11.5px; color: var(--muted);
4995
5007
  border: 1px solid var(--border-strong); border-radius: 999px; padding: 3px 11px;
4996
5008
  }
4997
- .welcome-brand { display: flex; align-items: center; gap: 10px; font-size: 23px; font-weight: 800; letter-spacing: .3px; }
4998
- .welcome-brand .welcome-bee { width: 28px; height: 28px; color: var(--accent); stroke-width: 1.5; }
4999
- .welcome-left h1 { margin: 0; font-size: 25px; line-height: 1.25; }
5009
+ .welcome-brand { display: flex; align-items: center; gap: 9px; font-size: 20px; font-weight: 800; letter-spacing: .3px; }
5010
+ .welcome-brand .welcome-bee { width: 24px; height: 24px; color: var(--accent); stroke-width: 1.5; }
5011
+ .help-toc { display: flex; flex-direction: column; gap: 2px; overflow: auto; margin: 0 -4px; padding: 0 4px; }
5012
+ .hitem {
5013
+ display: flex; align-items: center; gap: 9px; width: 100%;
5014
+ padding: 8px 10px; font-family: inherit; font-size: 12.8px; text-align: left;
5015
+ color: var(--text); background: transparent;
5016
+ border: 1px solid transparent; border-radius: var(--r-md); cursor: pointer;
5017
+ transition: background .12s, border-color .12s;
5018
+ }
5019
+ .hitem:hover { background: var(--panel2); }
5020
+ .hitem.active { background: var(--panel2); border-color: var(--border-strong); }
5021
+ .hitem.active span { color: var(--accent); font-weight: 650; }
5022
+ .hitem .ico { flex: none; width: 15px; height: 15px; color: var(--muted); }
5023
+ .hitem.active .ico { color: var(--accent); }
5024
+ .hitem span { flex: 1; min-width: 0; }
5025
+ .h-todo {
5026
+ flex: none; font-style: normal; font-size: 10px; line-height: 15px; padding: 0 6px;
5027
+ color: var(--muted); border: 1px solid var(--border-strong); border-radius: 999px; opacity: .85;
5028
+ }
5029
+ .help-main { flex: 1; min-width: 0; overflow: auto; padding: 26px 30px 22px; }
5030
+ .help-main h1 { margin: 0; font-size: 24px; line-height: 1.25; }
5000
5031
  .welcome-sub { margin: 0; color: var(--muted); font-size: 13px; line-height: 1.7; }
5032
+ .help-body { margin-top: 13px; }
5033
+ .help-body > :first-child { margin-top: 0; }
5034
+ .help-h3 { margin: 16px 0 6px; font-size: 14.5px; }
5035
+ .help-p { margin: 0 0 6px; font-size: 12.8px; line-height: 1.75; }
5036
+ .help-note {
5037
+ margin: 12px 0 0; padding: 9px 12px; font-size: 12px; line-height: 1.7; color: var(--muted);
5038
+ background: var(--panel); border: 1px dashed var(--border-strong); border-radius: var(--r-md);
5039
+ }
5040
+ .help-list { list-style: none; margin: 4px 0 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
5041
+ .help-list li { display: flex; gap: 10px; font-size: 12.8px; line-height: 1.65; }
5042
+ .help-list li b { flex: none; min-width: 58px; color: var(--accent); font-size: 12px; }
5043
+ .help-feats { list-style: none; margin: 4px 0 0; padding: 0; display: flex; flex-direction: column; gap: 11px; }
5044
+ .help-feats li { display: flex; gap: 10px; align-items: flex-start; line-height: 1.5; }
5045
+ .help-feats li .ico { flex: none; width: 17px; height: 17px; margin-top: 2px; color: var(--accent); }
5046
+ .help-feats b { display: block; font-size: 12.8px; }
5047
+ .help-feats li div span { display: block; font-size: 12px; color: var(--muted); }
5048
+ .help-todo {
5049
+ margin-top: 6px; padding: 18px; color: var(--muted); font-size: 12.8px; line-height: 1.7;
5050
+ border: 1px dashed var(--border-strong); border-radius: var(--r-md);
5051
+ }
5052
+ .help-todo b { display: block; margin-bottom: 4px; color: var(--text); }
5053
+ .help-todo p { margin: 0; }
5054
+ .help-qa { margin: 0 0 13px; }
5055
+ .help-qa b { display: block; margin-bottom: 3px; font-size: 12.8px; }
5056
+ .help-qa p { margin: 0; font-size: 12.5px; line-height: 1.75; }
5001
5057
  .welcome-steps { display: flex; flex-direction: column; gap: 9px; margin-top: 2px; }
5002
5058
  .wstep { display: flex; gap: 10px; align-items: flex-start; font-size: 12.8px; line-height: 1.55; }
5003
5059
  .wstep b {
@@ -5006,7 +5062,7 @@ html::-webkit-scrollbar-track { background: transparent; }
5006
5062
  font-size: 11.5px; color: var(--accent);
5007
5063
  background: var(--panel2); border: 1px solid var(--border-strong);
5008
5064
  }
5009
- .welcome-acts { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; }
5065
+ .welcome-acts { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; }
5010
5066
  .wl-btn {
5011
5067
  display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%;
5012
5068
  padding: 11px 14px; font-family: inherit; font-size: 13.5px; font-weight: 600;
@@ -5020,23 +5076,16 @@ html::-webkit-scrollbar-track { background: transparent; }
5020
5076
  .wl-btn.ghost { justify-content: center; font-weight: 500; background: transparent; border-color: transparent; color: var(--muted); }
5021
5077
  .wl-btn.ghost:hover { color: var(--text); border-color: transparent; }
5022
5078
  .welcome-foot { margin: auto 0 0; padding-top: 12px; color: var(--muted); font-size: 11.5px; }
5023
- .welcome-right {
5024
- flex: .85; min-width: 0; padding: 30px 28px;
5025
- display: flex; flex-direction: column; justify-content: center; gap: 7px;
5026
- background: linear-gradient(160deg, color-mix(in srgb, var(--accent) 88%, #000), var(--accent2));
5027
- color: #fff;
5028
- }
5029
- .welcome-right h2 { margin: 0; font-size: 20px; letter-spacing: .3px; }
5030
- .wr-sub { margin: 0 0 12px; font-size: 12.5px; opacity: .85; }
5031
- .wr-feats { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 11px; }
5032
- .wr-feats li { display: flex; gap: 10px; align-items: flex-start; line-height: 1.5; }
5033
- .wr-feats li .ico { flex: none; width: 17px; height: 17px; margin-top: 2px; opacity: .95; }
5034
- .wr-feats b { display: block; font-size: 12.8px; }
5035
- .wr-feats li div span { display: block; font-size: 12px; opacity: .82; }
5036
5079
  body.welcome-open { overflow: hidden; }
5037
5080
  @media (max-width: 720px) {
5038
- .welcome-right { display: none; }
5039
- .welcome-card { width: 100%; }
5081
+ .welcome-card { flex-direction: column; height: calc(100vh - 32px); }
5082
+ .help-rail { width: auto; padding: 16px 16px 10px; border-right: 0; border-bottom: 1px solid var(--border); gap: 10px; }
5083
+ .welcome-brand { font-size: 19px; }
5084
+ .help-toc { flex-direction: row; overflow-x: auto; }
5085
+ .hitem { width: auto; white-space: nowrap; padding: 6px 10px; }
5086
+ .h-todo { display: none; }
5087
+ .welcome-foot { display: none; }
5088
+ .help-main { padding: 18px 18px 16px; }
5040
5089
  }
5041
5090
 
5042
5091
  /* 类型菜单项的成本/次数预估行(借鉴 omnigent pre-run estimate):小字弱化,
@@ -5140,3 +5189,46 @@ body.welcome-open { overflow: hidden; }
5140
5189
  .zt-tag-warn { color: var(--warn, #b45309); border-color: var(--warn, #b45309); }
5141
5190
  .zt-tag-err { color: var(--danger, #dc2626); border-color: var(--danger, #dc2626); }
5142
5191
  .zt-tag-fix { color: var(--accent); border-color: var(--accent); }
5192
+
5193
+ /* ---------------- 禅道·产品档案卡(追加于文件尾防并行重排) ---------------- */
5194
+ .zt-prof .head .zt-num { width: 90px; }
5195
+ .zt-num { max-width: 120px; }
5196
+ .zt-ours { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 8px 0 4px; font-size: 12.5px; color: var(--muted); }
5197
+ .zt-ours .toggle { margin: 0; }
5198
+ .zt-mrs { margin-top: 10px; border-top: 1px dashed var(--border); padding-top: 8px; }
5199
+ .zt-mr-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 12.5px; color: var(--muted); margin-bottom: 6px; }
5200
+ .zt-mr-head button { margin-left: auto; }
5201
+ .zt-mr-row { display: flex; align-items: center; gap: 6px; margin: 4px 0; }
5202
+ .zt-mr-row .zt-num { width: 110px; flex: none; }
5203
+ .zt-mr-row .zt-mr-side { width: 110px; flex: none; }
5204
+ .zt-mr-row .zt-mr-account { flex: 1; min-width: 140px; max-width: 300px; }
5205
+
5206
+ /* ---------------- 禅道·窄屏(追加于文件尾防并行重排) ---------------- */
5207
+ /* ≤900px:档案卡网格塌单列(标签在上、输入全宽),与 .grid-2 的断点口径一致 */
5208
+ @media (max-width: 900px) {
5209
+ .zt-grid { grid-template-columns: 1fr; gap: 4px; }
5210
+ .zt-grid input[type="text"], .zt-grid input[type="password"],
5211
+ .zt-grid input[type="number"], .zt-grid select { max-width: none; }
5212
+ }
5213
+ /* ≤640px:模块路由行换行——模块/端一行,转给谁独占一行,删除按钮随行 */
5214
+ @media (max-width: 640px) {
5215
+ .zt-mr-row { flex-wrap: wrap; }
5216
+ .zt-mr-row .zt-num { flex: 1 1 30%; min-width: 86px; }
5217
+ .zt-mr-row .zt-mr-side { flex: 1 1 30%; min-width: 96px; }
5218
+ .zt-mr-row .zt-mr-account { flex: 1 1 100%; max-width: none; order: 5; }
5219
+ }
5220
+
5221
+ /* 需求拷问「已确认,开跑」条(借鉴 superpowers 分段签核):全部问题选完出现 */
5222
+ .cl-confirm { margin-top: 10px; text-align: right; }
5223
+
5224
+ /* 就地帮助问号(.hhelp):复杂控件旁的小 ?,事件委托见 app.js——
5225
+ * 点击直达帮助中心 data-help-topic 对应章;悬停变主题色 */
5226
+ .hhelp {
5227
+ flex: none; display: inline-flex; align-items: center; justify-content: center;
5228
+ width: 20px; height: 20px; padding: 0; border-radius: 50%;
5229
+ background: transparent; border: 1px solid var(--border-strong); cursor: pointer;
5230
+ color: var(--muted); vertical-align: middle; transition: color .12s, border-color .12s;
5231
+ }
5232
+ .hhelp:hover { color: var(--accent); border-color: var(--accent); }
5233
+ .hhelp .ico { width: 12px; height: 12px; }
5234
+ .empty a { color: var(--accent); }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codebee",
3
- "version": "0.1.15",
3
+ "version": "0.1.16",
4
4
  "description": "CodeBee · 多智能体编排台 — 统一编排本机 AI 编码 CLI(Codex / Claude Code / QwenCode / OpenCode / Aider…):目标→拆解→路由→执行→验证→跨厂商评审→修复→报告。纯 Python 标准库实现,本地 Web UI。",
5
5
  "license": "MIT",
6
6
  "bin": {