codebee 0.1.16 → 0.1.17

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/CHANGELOG.md CHANGED
@@ -4,10 +4,19 @@ CodeBee 的用户可感知变更记录。发布新版时:最上面加一节,
4
4
  `<!-- relnotes:start -->…<!-- relnotes:end -->` 段(那段会被 `npm view` 的
5
5
  README 元数据带回,供老版本在「发现新版本」时展示新版更新内容)。
6
6
 
7
+ ## v0.1.17(2026-09-20)
8
+
9
+ - 任务宪章:工作目录 .codebee/constitution.md 一次定义质量原则(代码规范/文风/测试要求),每次运行自动注入所有智能体——注入体系五层就位(宪章>圣经>模块库>经验>记忆)
10
+ - 代码评审证据锚定:每个问题必须带「文件名:行号」+一行关键代码引用,无证据不报(借鉴 pr-af)
11
+ - 调研报告证据链:同结论双源交叉验证、来源行内标明、事实与观点分离、结论先行+风险局限结构(借鉴 gpt-researcher)
12
+ - 评审维度写前自查:起草提示词亮出评审打分维度,作者提前对齐重点
13
+ - 圣经连续性锁:跨章设定原样沿用不问义改写,每章用词一致读者不出戏(借鉴 drama-skills)
14
+
7
15
  ## v0.1.16(2026-09-19)
8
16
 
9
- - 帮助中心:首启欢迎引导升级为「左目录 + 右内容」多章帮助中心,七章全就绪——快速上手、模型接入与绑定(多 Key 轮换 / 协议徽章解读 / 报错速查 / 免费档起步)、功能一览、连载创作流程、发布上架、自动化与技能市场、常见问题(9 条踩坑 FAQ)。首启仍只自动弹一次落在「快速上手」,手动打开(设置导航/关于页/Ctrl+K)徽章显示「帮助中心」
10
- - 就地帮助问号:模型接入、CLI 绑定、自动化、插件市场四个页头新增小「?」,点击直达帮助中心对应章节;供应商空状态与「还没有装好的 CLI」空状态附「看帮助」链接
17
+ - 帮助中心:首启欢迎引导升级为「左目录 + 右内容」多章帮助中心,八章全就绪——快速上手、模型接入与绑定(多 Key 轮换 / 协议徽章解读 / 报错速查 / 免费档起步)、功能一览、连载创作流程、发布上架、代码任务与版本、自动化与技能市场、常见问题(9 条踩坑 FAQ)。首启仍只自动弹一次落在「快速上手」;手动打开(设置导航/关于页/Ctrl+K/**F1**)徽章与标题显示「帮助中心」,原三处「使用引导」入口统一更名
18
+ - 就地帮助问号:模型接入、CLI 绑定、智能体目录、自动化、插件市场、禅道、用量统计、经验库八个设置页头 + Git 工作台/代码版本隔离/蜂巢工作台/作品信息四处工作台头部共十二处新增小「?」,点击直达帮助中心对应章节;供应商空状态与「还没有装好的 CLI」空状态附「看帮助」链接
19
+ - 帮助中心新增「代码任务与版本」章(任务分支隔离 / 版本裁决合并与丢弃 / 蜂巢与步骤阅读指引),「自动化与技能市场」章补禅道 Bug 自动修复小节
11
20
 
12
21
  ## v0.1.15(2026-09-19)
13
22
 
package/README.md CHANGED
@@ -23,7 +23,7 @@ Kimi Code、MiMo Code、Grok Build、Pi、DeepSeek Harness……),提供
23
23
  <!-- relnotes:start -->
24
24
  ### 最新版更新内容(v0.1.16)
25
25
 
26
- - **帮助中心**:首启欢迎引导升级为多章帮助中心——快速上手 / 模型接入与绑定 / 连载创作流程 / 发布上架 / 自动化与技能市场 / 功能一览 / 常见问题七章全就绪;模型接入、CLI 绑定、自动化、插件市场页头有「?」就地问号直达对应章节;设置导航、关于页、Ctrl+K 随时可重开
26
+ - **帮助中心**:首启欢迎引导升级为多章帮助中心——快速上手 / 模型接入与绑定 / 连载创作流程 / 发布上架 / 代码任务与版本 / 自动化与技能市场 / 功能一览 / 常见问题八章全就绪;设置各子页与蜂巢、Git 工作台、作品信息等十二处「?」就地问号直达对应章节;**F1** 或设置导航、关于页、Ctrl+K 随时可重开
27
27
  - 禅道集成、扫榜选材(双源)、可分享报告页、引擎调参卡见 v0.1.15
28
28
  <!-- relnotes:end -->
29
29
 
package/app/core/jobs.py CHANGED
@@ -382,11 +382,15 @@ def _in_resume_backoff(run, now=None):
382
382
 
383
383
 
384
384
  def requeue_pending(limit=10, max_age_s=None):
385
- """把遗留的 queued 编排运行重新入队(启动补队与运行期巡检共用)。
385
+ """把遗留的 queued 运行重新入队(启动补队与运行期巡检共用)。
386
386
 
387
387
  队列在内存里,进程一死排队项就没人管了(2026-09-18 七猫 r-162724
388
388
  排队僵尸案:续跑副本 created 后服务重启,Timer 随进程蒸发,运行永远
389
389
  停在「排队中」)。同任务已有在跑/排队的不重复补。
390
+ mgmt 同样纳入:CLI 安装/升级 job 也只存在于内存队列,worker 线程
391
+ 起失败(杀软挂起 Thread.start)或入队丢失后永远「排队中」,还堵住
392
+ 同条目去重闸(2026-09-19 三连 CLI 升级排队无人接案)。selfupgrade
393
+ 不补——升级本体有进程替换语义,自动重排不可控。
390
394
 
391
395
  max_age_s:巡检模式只补「卡了超过该秒数」的,刚入队的正常排队不掺和;
392
396
  None(启动模式)全量补。resume_enqueue_at 未到点的续跑副本两种模式都
@@ -400,18 +404,27 @@ def requeue_pending(limit=10, max_age_s=None):
400
404
  for run in store.list_runs(200):
401
405
  if n >= limit:
402
406
  break
403
- if run.get("status") != "queued" or run.get("kind") != "orchestration":
407
+ kind = run.get("kind")
408
+ if run.get("status") != "queued" or kind not in ("orchestration", "mgmt"):
404
409
  continue
405
- if not run.get("task_id") or not _recent(run):
406
- continue
407
- if _in_resume_backoff(run):
408
- continue # 退避窗口内的续跑副本:到点 Timer 自会入队
409
410
  if max_age_s is not None and _age_s(run) < max_age_s:
410
411
  continue
411
- if _task_active_run(run["task_id"], exclude_run_id=run["id"]):
412
- continue # 同任务已有更活跃的运行,别再排一份
413
- _QUEUE.put({"kind": "orchestration", "run_id": run["id"],
414
- "task_id": run["task_id"]})
412
+ if kind == "orchestration":
413
+ if not run.get("task_id") or not _recent(run):
414
+ continue
415
+ if _in_resume_backoff(run):
416
+ continue # 退避窗口内的续跑副本:到点 Timer 自会入队
417
+ if _task_active_run(run["task_id"], exclude_run_id=run["id"]):
418
+ continue # 同任务已有更活跃的运行,别再排一份
419
+ else:
420
+ eid = run.get("entry_id")
421
+ if eid:
422
+ other = store.active_mgmt_run(eid)
423
+ if other and other.get("id") != run["id"]:
424
+ continue # 同条目已有更活跃的 run,去重闸语义收敛
425
+ _QUEUE.put({"kind": kind, "run_id": run["id"],
426
+ "task_id": run.get("task_id"),
427
+ "entry_id": run.get("entry_id"), "op": run.get("op")})
415
428
  n += 1
416
429
  except Exception:
417
430
  pass
@@ -82,6 +82,9 @@ def _agents():
82
82
  # 本轮运行的智能体池:execute_run 入口快照,_run_step 死链补位时扫描。
83
83
  # 直接调 _run_step 的场景(单测/内部工具)池为空 → 补位不触发,闸门语义不变。
84
84
  _CURRENT_AGENTS: list = []
85
+ # 本次 run 的任务宪章注入块(execute_run 起跑时从 .codebee/constitution.md 读入;
86
+ # 步骤函数在各提示词组装点引用,空串=未配置零噪音)
87
+ _RUN_CONSTITUTION = ""
85
88
 
86
89
 
87
90
  def _dead_binding_substitute(dead_id, resume=None):
@@ -660,6 +663,11 @@ CODE_REVIEW_PROMPT = """你是代码评审员(不要修改任何文件)。
660
663
  "summary": "一句话结论"
661
664
  }
662
665
 
666
+ ## 评审要求(findings 锚定证据)
667
+ 每个 issue 的 detail 必须给出「文件名:行号」(从 diff 的 hunk 头 @@ -a,b +c,d @@ 与上下文推算),
668
+ 并引用该处一行关键代码作为依据——没有证据定位的问题不要报,宁可少报不报猜测。
669
+ (借鉴 pr-af:findings grounded in code evidence 是评审可信度的根。)
670
+
663
671
  ## 任务目标
664
672
  __GOAL__
665
673
 
@@ -792,7 +800,7 @@ def _code_bestof(run, task, impl, difficulty, ev):
792
800
  agt_b = modelhub.bind_agent(impl, difficulty)
793
801
  res = None
794
802
  for i, sub in enumerate(subtasks):
795
- prompt = (CODE_IMPL_PROMPT
803
+ prompt = (_RUN_CONSTITUTION + CODE_IMPL_PROMPT
796
804
  .replace("__GOAL__", task["goal"])
797
805
  .replace("__SUBTASK__", sub["detail"] if sub["detail"] else sub["title"])
798
806
  .replace("__CONTEXT__", task.get("context") or "(无)")
@@ -941,7 +949,7 @@ def _run_code(run, task, agents, ev, stats, mode):
941
949
  (s.get("title") or "")[:40] for s in subtasks[:i]) or "(无)"
942
950
  prog = ("\n\n## 计划进度(第 %d/%d 项)\n已完成:%s。当前接着做下面这一项,"
943
951
  "不要重做已完成的。" % (i + 1, len(subtasks), done_titles))
944
- prompt = (CODE_IMPL_PROMPT
952
+ prompt = (_RUN_CONSTITUTION + CODE_IMPL_PROMPT
945
953
  .replace("__GOAL__", task["goal"])
946
954
  .replace("__SUBTASK__",
947
955
  sub["detail"] if sub["detail"] else sub["title"])
@@ -1396,10 +1404,25 @@ __GOAL__
1396
1404
  ## 背景与上下文
1397
1405
  __CONTEXT__
1398
1406
 
1407
+ ## 评审维度(写前自查)
1408
+ __RUBRIC__
1409
+ (按这些维度组织内容重点——评审会按它们打分)
1410
+
1399
1411
  ## 要求
1400
1412
  - 只修改 `__FILE__` 这一个文件;保持 Markdown 结构。
1401
1413
  - 完成后用 3 句话说明本轮写了什么。"""
1402
1414
 
1415
+ # 调研报告类稿件的追加要求(借鉴 gpt-researcher 迭代深研):有网络/读文件工具时
1416
+ # 多源交叉验证,单源结论降权——调研的可信度来自证据链而非文采
1417
+ RESEARCH_APPENDIX = """
1418
+
1419
+ ## 调研要求(证据链)
1420
+ - 有联网/检索工具就先搜集资料再写:同一关键结论至少两个独立来源交叉验证,
1421
+ 单源信息要标注「仅单一来源」。
1422
+ - 引用来源在文中用行内链接或脚注标明(域名即可,不编造 URL)。
1423
+ - 区分「事实」与「观点」:数据/时间/版本号给来源,预测/评价标明是分析。
1424
+ - 结构建议:结论先行 → 分层论证 → 风险与局限(说明哪些结论证据不足)。"""
1425
+
1403
1426
  NOVEL_REVISE_PROMPT = """你是一名专业作者。请根据下方汇总评审意见修订稿件文件:`__FILE__`(直接写入该文件)。文件必须以 UTF-8 编码保存(PowerShell 写文件显式加 -Encoding UTF8,禁止依赖默认编码)。
1404
1427
 
1405
1428
  ## 原始写作任务
@@ -1465,7 +1488,10 @@ def _story_bible(workdir):
1465
1488
  if not txt:
1466
1489
  return ""
1467
1490
  return ("## 故事圣经(story-bible.md:人物/世界观/伏笔台账,本书一切写作与评审以此为准,"
1468
- "与其冲突处以圣经为准)\n\n" + txt)
1491
+ "与其冲突处以圣经为准)\n\n"
1492
+ "**连续性锁**(借鉴 drama-skills):人物外貌/性格口头禅/物品/能力等需要跨章一致"
1493
+ "的设定,写作时原样沿用圣经中的表述(可整句贴入正文),不要同义改写——每章用词"
1494
+ "一致读者才不会出戏。\n\n" + txt)
1469
1495
 
1470
1496
 
1471
1497
  def _plot_modules(workdir):
@@ -1733,6 +1759,10 @@ def _run_serial_review(run, task, agents, ev, stats, mode, critics, impl, route,
1733
1759
  mods = _plot_modules(workdir)
1734
1760
  if mods:
1735
1761
  bible = (bible + "\n\n" + mods) if bible else mods
1762
+ # 任务宪章(spec-kit constitution):作者定的质量原则拼在注入块最前——
1763
+ # 优先级最高的约束放最前面,写作者先读原则再读设定
1764
+ if _RUN_CONSTITUTION:
1765
+ bible = _RUN_CONSTITUTION + (bible or "")
1736
1766
 
1737
1767
 
1738
1768
  def crit_prompt_for(text, note=""):
@@ -2397,10 +2427,25 @@ def _run_serial_review(run, task, agents, ev, stats, mode, critics, impl, route,
2397
2427
  fixed.append(i)
2398
2428
  store.update_run(run_id, chapter_scores=chapter_scores)
2399
2429
  _check_cancel(ev)
2430
+ if not fixed:
2431
+ # 最弱章重改全部失败(供应商拥堵/流断等)→ 章稿没有任何变化,
2432
+ # 继续跑全书重评只会白烧评审链,组长步骤一挂「工作中」就是几十
2433
+ # 分钟(2026-09-19 实案:polish-c18/c11 双败后仍进全书重评,
2434
+ # 单个评审 35 分钟,用户侧只见打磨 2/3 久卡不动)。直接收尾。
2435
+ store.finish_step(run_id, pstep["n"], "failed",
2436
+ summary="重改未成功(%s 全部失败),本轮打磨中止;"
2437
+ "已落盘章稿不受影响"
2438
+ % "、".join("第 %d 章" % c["chapter"] for c in weak))
2439
+ break
2400
2440
  # 重评全书一致性(同一评审闭包;本轮全挂则保留上一轮结论——评审链挂了
2401
2441
  # 不代表书变差,不能拿「无法评审」覆盖真实分数)
2402
- full_text = "\n\n".join(_read_chapter(workdir, i2) for i2 in range(1, end + 1))
2403
- gscored2, gmeans_acc2 = run_global_round(critics)
2442
+ try:
2443
+ full_text = "\n\n".join(_read_chapter(workdir, i2) for i2 in range(1, end + 1))
2444
+ gscored2, gmeans_acc2 = run_global_round(critics)
2445
+ except BaseException:
2446
+ store.finish_step(run_id, pstep["n"], "failed",
2447
+ summary="打磨后全书重评异常中止,已落盘章稿不受影响")
2448
+ raise
2404
2449
  if gscored2:
2405
2450
  global_means = {d: round(sum(xs) / len(xs), 1) for d, xs in gmeans_acc2.items()}
2406
2451
  global_pass = _all_ge(global_means, threshold)
@@ -2659,13 +2704,19 @@ def _run_content_review(run, task, agents, ev, stats, mode):
2659
2704
  except Exception:
2660
2705
  pass
2661
2706
  else:
2707
+ is_research = task.get("type") == "research"
2708
+
2662
2709
  def _draft_prompt_for(vfile):
2663
2710
  p = (_tpl(task, "draft_prompt", NOVEL_DRAFT_PROMPT).replace("__FILE__", vfile)
2664
2711
  .replace("__GOAL__", task["goal"])
2665
- .replace("__CONTEXT__", task.get("context") or "(无)"))
2712
+ .replace("__CONTEXT__", task.get("context") or "(无)")
2713
+ .replace("__RUBRIC__", "、".join(dims) if dims else "(按流程默认维度)"))
2666
2714
  if outline:
2667
2715
  p += "\n\n## 编排者大纲(按要点组织稿件)\n" + \
2668
2716
  "\n".join("- " + i for i in outline["items"])
2717
+ if is_research:
2718
+ # 调研报告追加证据链要求(gpt-researcher 借鉴)
2719
+ p += RESEARCH_APPENDIX
2669
2720
  return p
2670
2721
 
2671
2722
  best_of = max(1, min(3, int(task.get("best_of") or 1)))
@@ -2871,6 +2922,23 @@ def _run_serial_qa(run, task, agents, ev):
2871
2922
  error="答疑失败(执行/评审链不可用)——" + ";".join(errors[-3:]))
2872
2923
 
2873
2924
 
2925
+ def _read_constitution(workdir):
2926
+ """任务宪章(借鉴 spec-kit constitution):工作目录 .codebee/constitution.md
2927
+ (作者手工维护的质量原则——代码规范/文风/测试要求)。存在且非空时返回注入块,
2928
+ 每次 run 的所有智能体提示词都会带上;否则返回 ""(零配置零噪音)。"""
2929
+ p = os.path.abspath(os.path.join(str(workdir or ""), ".codebee", "constitution.md"))
2930
+ if not _inside(workdir, p) or not os.path.isfile(p):
2931
+ return ""
2932
+ try:
2933
+ txt = _read_text_any_enc(p)[:6000].strip()
2934
+ except OSError:
2935
+ return ""
2936
+ if not txt:
2937
+ return ""
2938
+ return ("## 项目宪章(constitution.md:本项目一切产出的质量原则,优先级最高,"
2939
+ "与其他要求冲突时以宪章为准)\n\n" + txt + "\n\n")
2940
+
2941
+
2874
2942
  def _write_task_spec(task, workdir):
2875
2943
  """任务规格落盘 .codebee/spec.md(借鉴 agent-orchestrator 的 .spec/PROMPT.md 与
2876
2944
  planning-with-files 的文件化计划):任务定义随工作目录留存、随任务分支版本化,
@@ -3028,6 +3096,11 @@ def execute_run(run_id):
3028
3096
  # 任务规格文件化(借鉴 planning-with-files/agent-orchestrator):任何任务都在
3029
3097
  # 工作目录留一份 .codebee/spec.md——原始意图可见、随任务分支版本化
3030
3098
  _write_task_spec(task, task["workdir"])
3099
+ # 任务宪章(借鉴 spec-kit constitution):工作目录 .codebee/constitution.md
3100
+ # 是作者定下的质量原则(代码规范/文风/测试要求),每次 run 注入所有智能体
3101
+ # 提示词——代码/文章/翻译全类型通用,一次定义持续生效。缺省零噪音。
3102
+ global _RUN_CONSTITUTION
3103
+ _RUN_CONSTITUTION = _read_constitution(task["workdir"])
3031
3104
  agents = _agents()
3032
3105
  global _CURRENT_AGENTS
3033
3106
  _CURRENT_AGENTS = agents
package/app/core/store.py CHANGED
@@ -621,11 +621,23 @@ def update_run(run_id, expected_status=None, **fields):
621
621
  if expected_status is not None and run.get("status") != expected_status:
622
622
  return None
623
623
  run.update(fields)
624
+ # 终态收尸:run 已结束却还挂 queued/running 的步骤统一落 cancelled,
625
+ # 语义与 recover_orphaned_runs 的启动清扫对齐(那套清跨进程遗留,
626
+ # 这套在落终态瞬间即时收口——打磨组长被取消/异常打断时 UI 不闪
627
+ # 假「工作中」)。run 终态后不可能还有步骤在真跑。
628
+ st = fields.get("status")
629
+ if st in ("done", "failed", "cancelled"):
630
+ end_s = time.strftime("%H:%M:%S")
631
+ for s in run["steps"]:
632
+ if s.get("status") in ("queued", "running"):
633
+ s["status"] = "cancelled"
634
+ s["ended_at"] = s.get("ended_at") or end_s
635
+ if not s.get("summary"):
636
+ s["summary"] = "步骤未正常收尾(终态自动恢复)"
624
637
  _save_json(paths.RUNS_DIR / run_id / "run.json", run)
625
638
  # 状态回填:起跑与结束都同步任务状态。只回填终态的话,run 在跑、
626
639
  # 任务永远显示「排队中」(2026-09-18 实案:「# 重写·续」run 已 running
627
640
  # 写了一小时,任务卡 queued,用户以为卡死连点重试)。
628
- st = fields.get("status")
629
641
  if st in ("running", "done", "failed", "cancelled"):
630
642
  tid = run.get("task_id")
631
643
  task = _TASKS.get(tid) if tid else None
package/app/ui/app.js CHANGED
@@ -1679,7 +1679,7 @@ async function openImportDialog() {
1679
1679
  '<input type="checkbox" value="' + esc(s.id) + '"' + (ok ? " checked" : " disabled") +
1680
1680
  (ok ? ' onchange="updateImportSelHint()"' : "") + ">" +
1681
1681
  '<div class="src-main">' +
1682
- '<div class="src-name">' + esc(s.name) + status + "</div>" +
1682
+ '<div class="src-name">' + esc(t(s.name)) + status + "</div>" +
1683
1683
  '<div class="src-desc">' + esc(t(s.desc)) + "</div>" +
1684
1684
  '<div class="src-path">' + esc((s.paths || []).join(" · ")) + "</div>" +
1685
1685
  (s.note ? '<div class="src-note">' + esc(t.apply(null, [s.note].concat(s.note_args || []))) + "</div>" : "") +
@@ -3846,6 +3846,7 @@ function renderBookMetaPanel(task) {
3846
3846
  let html = '<div class="bm-head"><svg class="ico" aria-hidden="true"><use href="#i-idcard"/></svg>' +
3847
3847
  '<span class="sec-title">' + t("作品信息") + "</span>" +
3848
3848
  '<span class="hint">' + esc(t("按发布平台生成建书表单资料,逐字段复制过去")) + "</span>" +
3849
+ '<button class="hhelp" data-help-topic="publish" title="' + esc(t("这是什么?点开看帮助")) + '" aria-label="' + esc(t("帮助")) + '"><svg class="ico" aria-hidden="true"><use href="#i-help"></use></svg></button>' +
3849
3850
  '<span class="flex1"></span>';
3850
3851
  if (taskBusy) html += '<span class="bm-warn">' + esc(t("任务运行中,生成将在本轮结束后可用")) + "</span>";
3851
3852
  html += "</div>";
@@ -4284,6 +4285,7 @@ function _renderGitSnapshot(run, task) {
4284
4285
  let html =
4285
4286
  '<div class="git-head"><svg class="ico" aria-hidden="true"><use href="#i-git-branch"></use></svg>' +
4286
4287
  '<span class="sec-title">' + t("代码版本隔离") + '</span>' +
4288
+ '<button class="hhelp" data-help-topic="code" title="' + esc(t("这是什么?点开看帮助")) + '" aria-label="' + esc(t("帮助")) + '"><svg class="ico" aria-hidden="true"><use href="#i-help"></use></svg></button>' +
4287
4289
  '<code class="git-branch" title="' + esc(t("任务分支:产物提交在此,原分支未受影响")) + '">' + esc(g.branch) + "</code>";
4288
4290
  const addT = ch.add_total, delT = ch.del_total;
4289
4291
  if (addT != null && delT != null) {
@@ -4379,7 +4381,8 @@ function renderGitWbMain(d, task) {
4379
4381
  sel += "</select>";
4380
4382
  let html =
4381
4383
  '<div class="git-head"><svg class="ico" aria-hidden="true"><use href="#i-git-branch"></use></svg>' +
4382
- '<span class="sec-title">' + t("Git 工作台") + "</span>" + sel +
4384
+ '<span class="sec-title">' + t("Git 工作台") + "</span>" +
4385
+ '<button class="hhelp" data-help-topic="code" title="' + esc(t("这是什么?点开看帮助")) + '" aria-label="' + esc(t("帮助")) + '"><svg class="ico" aria-hidden="true"><use href="#i-help"></use></svg></button>' + sel +
4383
4386
  '<code class="git-branch" title="HEAD">' + esc(d.head || "") + "</code>" +
4384
4387
  (d.upstream ? '<span class="gm" title="' + esc(d.upstream) + '">↑' + (d.ahead || 0) + " ↓" + (d.behind || 0) + "</span>" : "") +
4385
4388
  '<span class="flex1"></span>' +
@@ -8191,7 +8194,7 @@ function mkrCardHtml(p) {
8191
8194
  const meta = [p.author, p.version ? "v" + p.version : ""].filter(Boolean).join(" · ");
8192
8195
  return '<div class="card mk-card' + (p.compat === "blocked" ? " blocked" : "") + '"><div class="head">' +
8193
8196
  '<span class="name">' + esc(t(p.title || p.name)) + "</span>" +
8194
- '<span class="tag mk-src">' + esc(p.source_name || "") + "</span>" +
8197
+ '<span class="tag mk-src">' + esc(t(p.source_name || "")) + "</span>" +
8195
8198
  (p.category ? '<span class="tag">' + esc(p.category) + "</span>" : "") +
8196
8199
  "</div>" +
8197
8200
  '<div class="note">' + esc(t(p.desc || "")) + "</div>" +
@@ -8214,7 +8217,7 @@ function renderMarketRemote() {
8214
8217
  if (srcSel && !srcSel.options.length) {
8215
8218
  srcSel.innerHTML = '<option value="">' + t("全部来源") + "</option>" +
8216
8219
  (data.sources || []).map((s) =>
8217
- '<option value="' + esc(s.id) + '">' + esc(s.name) + t("(") + s.count + t(")") + "</option>").join("");
8220
+ '<option value="' + esc(s.id) + '">' + esc(t(s.name)) + t("(") + s.count + t(")") + "</option>").join("");
8218
8221
  }
8219
8222
  const times = (data.sources || []).map((s) => s.fetched_at).filter(Boolean);
8220
8223
  const meta = $("mkr-meta");
@@ -8269,7 +8272,7 @@ async function mkrRefresh() {
8269
8272
  const keep = srcSel.value;
8270
8273
  srcSel.innerHTML = '<option value="">' + t("全部来源") + "</option>" +
8271
8274
  (r.sources || []).map((s) =>
8272
- '<option value="' + esc(s.id) + '">' + esc(s.name) + t("(") + s.count + t(")") + "</option>").join("");
8275
+ '<option value="' + esc(s.id) + '">' + esc(t(s.name)) + t("(") + s.count + t(")") + "</option>").join("");
8273
8276
  srcSel.value = keep;
8274
8277
  }
8275
8278
  mkrLoadPage(true);
@@ -8389,7 +8392,7 @@ async function loadSettingsV2() {
8389
8392
  inp = '<input id="' + iid + '" type="text" value="' + esc(String(cur)) + '">';
8390
8393
  }
8391
8394
  html += '<div class="set-v2-row">' + inp +
8392
- '<span class="set-v2-lb" title="' + esc(f.description || f.path) + '">' + esc(f.description || f.path) + "</span></div>";
8395
+ '<span class="set-v2-lb" title="' + esc(t(f.description || f.path)) + '">' + esc(t(f.description || f.path)) + "</span></div>";
8393
8396
  }
8394
8397
  html += '<div class="input-row" style="margin-top:6px"><button class="ghost small" onclick="saveSettingsV2(\'' + esc(ns) + '\')">' + t("保存") + "</button>" +
8395
8398
  '<span class="set-v2-msg msg"></span></div></div>';
@@ -8577,6 +8580,7 @@ var HELP_CHAPTERS = [
8577
8580
  { id: "features", icon: "i-bee", label: "功能一览" },
8578
8581
  { id: "serial", icon: "i-book-open", label: "连载创作流程" },
8579
8582
  { id: "publish", icon: "i-clapper", label: "发布上架" },
8583
+ { id: "code", icon: "i-git-branch", label: "代码任务与版本" },
8580
8584
  { id: "auto", icon: "i-calendar-days", label: "自动化与技能市场" },
8581
8585
  { id: "faq", icon: "i-search", label: "常见问题" },
8582
8586
  ];
@@ -8620,6 +8624,7 @@ function helpChapterBody(id) {
8620
8624
  '<li><svg class="ico" aria-hidden="true"><use href="#i-clapper"></use></svg><div><b>' + t("发布上架") + '</b><span>' + t("一键发布到番茄、七猫,含封面与作品资料") + '</span></div></li>' +
8621
8625
  '<li><svg class="ico" aria-hidden="true"><use href="#i-git-branch"></use></svg><div><b>' + t("版本工作台") + '</b><span>' + t("任务分支隔离,改动可审可合") + '</span></div></li>' +
8622
8626
  '<li><svg class="ico" aria-hidden="true"><use href="#i-calendar-days"></use></svg><div><b>' + t("自动化") + '</b><span>' + t("定时任务,无人值守") + '</span></div></li>' +
8627
+ '<li><svg class="ico" aria-hidden="true"><use href="#i-library"></use></svg><div><b>' + t("经验库") + '</b><span>' + t("内置规范包 + 自动沉淀教训,越用越顺手") + '</span></div></li>' +
8623
8628
  '<li><svg class="ico" aria-hidden="true"><use href="#i-blocks"></use></svg><div><b>' + t("插件市场") + '</b><span>' + t("600+ 技能,一键安装") + '</span></div></li>' +
8624
8629
  '</ul>';
8625
8630
  }
@@ -8643,13 +8648,25 @@ function helpChapterBody(id) {
8643
8648
  '<h3 class="help-h3">' + t("发布失败") + '</h3>' +
8644
8649
  '<p class="help-p">' + t("平台改版或登录态过期会导致失败,失败信息会写明原因。重新登录后再点重试即可;反复失败可以到 GitHub 提 Issue 附上失败截图。") + '</p>';
8645
8650
  }
8651
+ if (id === "code") {
8652
+ return '<h3 class="help-h3">' + t("代码任务怎么跑") + '</h3>' +
8653
+ '<p class="help-p">' + t("新建任务选开发类类型,目标写清楚要做什么(可以附需求文档、截图,附件会进入上下文)。蜂群先出计划再实现:实现 → 客观验证 → 跨厂商评审 → 修复,单路实现失败还有多候选赛马——各候选在隔离的 worktree 里各写各的,择优采纳。跑的过程中可以在详情页递话(文字/截图),下一轮生效。") + '</p>' +
8654
+ '<h3 class="help-h3">' + t("任务分支隔离:你的工作区不受影响") + '</h3>' +
8655
+ '<p class="help-p">' + t("启用代码版本隔离的任务会检出独立的任务分支(codebee/任务ID),所有改动只落在那条分支上,你当前的分支和未提交的改动完全不动——开跑前工作区有脏改动会先帮你收起(stash),跑完自动还原。") + '</p>' +
8656
+ '<h3 class="help-h3">' + t("版本裁决:合并还是丢弃") + '</h3>' +
8657
+ '<p class="help-p">' + t("任务跑完后,「版本」页签会亮起「待裁决」等你拍板:先看变更清单,双击文件能看 diff;满意点「合并」,任务分支合回基线分支;不满意点「丢弃」,分支和工作现场自动清场。中途停下的任务也会留好提交,可以继续跑完再裁决。合并与丢弃绝不静默替你决定。") + '</p>' +
8658
+ '<h3 class="help-h3">' + t("哪里看细节") + '</h3>' +
8659
+ '<p class="help-p">' + t("「蜂巢」页签看每个智能体实时在干什么(点格子看实时日志);「步骤」页签看任务拆解、每步实际用的模型、耗时与失败原因,评审分数与打磨记录也在这里。") + '</p>';
8660
+ }
8646
8661
  if (id === "auto") {
8647
8662
  return '<h3 class="help-h3">' + t("定时任务") + '</h3>' +
8648
8663
  '<p class="help-p">' + t("设置 → 自动化:把任意任务类型挂上时间表(每天/每周固定时刻),到点自动按真实运行链开跑,结果照常落盘。配合群机器人(钉钉/飞书/企微自动适配)可以把完成状态推到群里。") + '</p>' +
8664
+ '<h3 class="help-h3">' + t("禅道 Bug 自动修复") + '</h3>' +
8665
+ '<p class="help-p">' + t("设置 → 禅道:配好地址与产品档案后,定时扫描激活 Bug,按模块路由 / AI 排查定责(前端/后端/双端/非我方);我方端的 Bug 自动创建代码修复任务,修完自动合并、resolve 并回写报告到群里;测试指错人的也会按排查结论改派。合并失败不 resolve 不转派,留人工兜底。") + '</p>' +
8649
8666
  '<h3 class="help-h3">' + t("技能市场") + '</h3>' +
8650
8667
  '<p class="help-p">' + t("设置 → 插件市场:600+ 技能一键安装,来源包括内置库和 ZCode、Anthropic 等多个外部目录。装上的技能会注入智能体能力,按任务类型生效。") + '</p>' +
8651
8668
  '<h3 class="help-h3">' + t("用量台账") + '</h3>' +
8652
- '<p class="help-p">' + t("设置 → 用量:每次调用的模型、token 与费用按多个维度聚合展示,历史运行会在启动时自动回填——每个任务花了多少,一目了然。") + '</p>';
8669
+ '<p class="help-p">' + t("设置 → 用量统计:每次调用的模型、token 与费用按多个维度聚合展示,历史运行会在启动时自动回填——每个任务花了多少,一目了然。") + '</p>';
8653
8670
  }
8654
8671
  if (id === "faq") {
8655
8672
  return '<div class="help-qa"><b>' + t("点「获取模型列表」报 404?") + '</b><p>' + t("部分网关不提供模型列表接口,属正常现象;只要能正常对话就不用管,模型名手工填即可。") + '</p></div>' +
@@ -8690,6 +8707,12 @@ function setHelpChapter(id) {
8690
8707
  renderHelp();
8691
8708
  }
8692
8709
  function helpGo(id) { setHelpChapter(id); }
8710
+ function paintHelpChrome() {
8711
+ const badge = $("welcome-badge");
8712
+ if (badge) badge.textContent = t(helpFirst ? "首次启动" : "帮助中心");
8713
+ const title = $("welcome-title");
8714
+ if (title) title.textContent = t(helpFirst ? "欢迎使用 CodeBee" : "帮助中心");
8715
+ }
8693
8716
  function welcomeOpen(opts) {
8694
8717
  const w = $("welcome");
8695
8718
  if (!w) return;
@@ -8697,8 +8720,7 @@ function welcomeOpen(opts) {
8697
8720
  helpFirst = !!(opts && opts.firstRun);
8698
8721
  if (helpFirst) helpCur = "quickstart";
8699
8722
  else if (opts && opts.topic && HELP_CHAPTERS.some((c) => c.id === opts.topic)) helpCur = opts.topic;
8700
- const badge = $("welcome-badge");
8701
- if (badge) badge.textContent = t(helpFirst ? "首次启动" : "帮助中心");
8723
+ paintHelpChrome();
8702
8724
  renderHelp();
8703
8725
  w.classList.remove("hidden");
8704
8726
  document.body.classList.add("welcome-open");
@@ -9070,10 +9092,9 @@ function setLangBtn(lang) {
9070
9092
  paintArchToggle();
9071
9093
  syncSideExpandBtn();
9072
9094
  renderCodePreviews(); // 预览徽章是动态文案:语言切换时若停在皮肤页要跟着换
9073
- // 帮助中心若开着:徽章/目录/正文跟着换语言重画
9095
+ // 帮助中心若开着:徽章/标题/目录/正文跟着换语言重画
9074
9096
  if (!$("welcome").classList.contains("hidden")) {
9075
- const wbadge = $("welcome-badge");
9076
- if (wbadge) wbadge.textContent = t(helpFirst ? "首次启动" : "帮助中心");
9097
+ paintHelpChrome();
9077
9098
  renderHelp();
9078
9099
  }
9079
9100
  // 重画还在缓存里的页面标题
@@ -9554,7 +9575,7 @@ function collapseDrawerIfMobile() {
9554
9575
 
9555
9576
  function switchTab(name) {
9556
9577
  if (name === "__phone") { openPhoneConnect(); return; } // 手机连接是弹框,不切页
9557
- if (name === "__guide") { welcomeOpen(); return; } // 使用引导是弹层,不切页(设置导航「软件」组)
9578
+ if (name === "__guide") { welcomeOpen(); return; } // 帮助中心是弹层,不切页(设置导航「软件」组)
9558
9579
  // 导航收进「设置」:进设置后左栏整体换成设置导航,内容铺满
9559
9580
  S.tab = name;
9560
9581
  if (SET_TABS.has(name)) localStorage.setItem("orch.setTab", name);
@@ -10041,6 +10062,7 @@ document.addEventListener("DOMContentLoaded", () => {
10041
10062
  && e.target.tagName !== "TEXTAREA") { _askClose(true); return; }
10042
10063
  // 文件内容弹窗(240) 夹在 ask(250) 与 modal(200) 之间,Esc 同样逐层关
10043
10064
  if (e.key === "Escape" && filePopIsOpen()) { window.filePopClose(); return; }
10065
+ if (e.key === "F1") { e.preventDefault(); welcomeOpen(); return; } // F1 = 帮助中心(浏览器帮助被拦下)
10044
10066
  if (e.key === "Escape" && !$("welcome").classList.contains("hidden")) { welcomeClose(); return; }
10045
10067
  if (e.key === "Escape" && !$("modal").classList.contains("hidden")) closeModal();
10046
10068
  // 日志抽屉:Esc 收起(最底层,放在弹窗之后)
@@ -10139,7 +10161,7 @@ function cmdkOps() {
10139
10161
  { icon: "i-cpu", label: t("智能体管理"), run: () => switchTab("agents") },
10140
10162
  { icon: "i-chart", label: t("用量统计"), run: () => switchTab("usage") },
10141
10163
  { icon: "i-gear", label: t("设置"), run: () => enterSettings() },
10142
- { icon: "i-bee", label: t("使用引导"), run: () => welcomeOpen() },
10164
+ { icon: "i-bee", label: t("帮助中心"), run: () => welcomeOpen() },
10143
10165
  { icon: "i-phone", label: t("手机连接"), run: () => switchTab("__phone") },
10144
10166
  ];
10145
10167
  }
package/app/ui/i18n.js CHANGED
@@ -478,6 +478,7 @@
478
478
  "绑定 CLI 智能体": "Bind CLI agents",
479
479
  "先跳过,直接体验": "Skip and explore",
480
480
  "可随时在「设置 → 关于与更新」重新打开本引导。": "You can reopen this guide anytime in Settings → About & updates.",
481
+ "可随时按 F1,或在「设置 → 关于与更新」重新打开本帮助中心。": "Press F1 anytime, or reopen this help center in Settings → About & updates.",
481
482
  "把任务交给蜂群": "Hand the job to the hive",
482
483
  "多智能体分工协作,成果自动落盘。": "Agents divide the work; finished results land in your folder automatically.",
483
484
  "多智能体编排": "Multi-agent orchestration",
@@ -497,8 +498,10 @@
497
498
  "连载创作流程": "Serial writing flow",
498
499
  "发布上架": "Publishing",
499
500
  "一键发布到番茄、七猫,含封面与作品资料": "One-click publishing to Fanqie & Qimao, covers and book metadata included",
501
+ "内置规范包 + 自动沉淀教训,越用越顺手": "Built-in rule packs plus lessons distilled from runs — it gets better the more you use it",
500
502
  "自动化与技能市场": "Automation & skills market",
501
503
  "常见问题": "FAQ",
504
+ "代码任务与版本": "Coding tasks & versions",
502
505
  "整理中": "Coming soon",
503
506
  "正文暂只提供中文,英文版整理中。": "Body text is Chinese-only for now — English is on the way.",
504
507
  "本章节正在整理,可先看「快速上手」与「模型接入与绑定」,或到 GitHub 提 Issue 提问。": "This chapter is still being written. Meanwhile, see Quick start and Models & bindings, or open a GitHub issue.",
@@ -1448,6 +1451,17 @@
1448
1451
  "商务邮件": "Business Email",
1449
1452
  "技术方案": "Tech Proposal",
1450
1453
  "简历": "Resume",
1454
+ "扫榜选材": "Rank Scan for Topics",
1455
+ "抓取七猫排行榜公开数据 → AI 提炼热门题材/人设/差异化切入点(快档直出报告)": "Grabs public Qimao ranking data → AI distills hot genres / character archetypes / differentiation angles (fast lane, report straight out)",
1456
+ "想写哪个方向(一句话,可留空默认分析总榜热门题材)": "Which direction to write (one sentence; leave empty to analyze the overall hot genres)",
1457
+
1458
+ // —— 插件市场远程来源名(market_remote.py)——
1459
+ "ZCode 官方": "ZCode Official",
1460
+ "Anthropic 生态": "Anthropic Ecosystem",
1461
+ "Anthropic 官方技能": "Anthropic Official Skills",
1462
+ "社区技能库(Codex/Gemini 兼容)": "Community skills (Codex/Gemini compatible)",
1463
+ "ClawHub(OpenClaw 生态)": "ClawHub (OpenClaw ecosystem)",
1464
+ "CocoLoop 技能商店": "CocoLoop Skills Store",
1451
1465
  "要实现/修复什么(一句话)": "What to build/fix (one sentence)",
1452
1466
  "写什么(题材 / 篇幅 / 风格)": "What to write (genre / length / style)",
1453
1467
  "题材/受众/卖点 + 总字数(例:2 万字都市女频,可签约平台)": "Genre/audience/selling points + total length (e.g. 20k-word urban romance for women, submission-ready)",
@@ -1551,6 +1565,7 @@
1551
1565
  "无头模式:opencode run(stdin 传入提示词)": "Headless mode: opencode run (prompt via stdin)",
1552
1566
  "通义千问编码 CLI(gemini-cli 系);无头走 stdin;绑定凭据经打开注入写 settings.json 的 env 段(OPENAI_*,qwen 存在即优先 openai 兼容通道)": "Qwen coding CLI (gemini-cli family); headless via stdin; bound credentials are injected at launch into the env section of settings.json (OPENAI_* — prefers the openai-compatible channel when present)",
1553
1567
  "Python 系结对编程 CLI;用 py -3.13 安装,模型经其配置/环境变量设置": "Python pairing CLI; install with py -3.13, model set via its config/env",
1568
+ "Python 系结对编程 CLI;用 uv tool 安装(自动备好 3.12 托管解释器),模型经其配置/环境变量设置": "Python pairing CLI; install via uv tool (managed Python 3.12 set up automatically), model set via its config/env",
1554
1569
  "xAI 终端编码智能体;可执行名是 grok(不是 grok-build);默认模型在 ~/.grok/config.toml 的 [models] default(JSON 版配置不存在)": "xAI terminal coding agent; the executable is grok (not grok-build); the default model goes to [models] default in ~/.grok/config.toml (no JSON config variant)",
1555
1570
  "网关型个人 AI 智能体(原 Clawdbot);编排模板装好后需验证;默认模型在 openclaw.json 的 agents.defaults.model.primary(顶层 model 键会被 schema 校验拒绝启动,绝不写顶层)": "Gateway-style personal AI agent (formerly Clawdbot); verify after setup; the default model goes to agents.defaults.model.primary in openclaw.json (a top-level model key fails the schema check and blocks startup — never write it)",
1556
1571
  "月之暗面 Kimi 编码 CLI(TypeScript 版,需 Node ≥22.19);旧 Python 版 kimi-cli 正在下线;默认模型在 ~/.kimi-code/config.toml 的顶层 default_model(值须是 [models] 表里定义的别名),首启自动建文件": "Moonshot AI Kimi coding CLI (TypeScript edition, requires Node ≥22.19); the legacy Python kimi-cli is being retired; the default model goes to top-level default_model in ~/.kimi-code/config.toml (an alias defined in the [models] table), auto-created on first launch",
@@ -1601,8 +1616,6 @@
1601
1616
  "生成自包含分享页(单文件 HTML),可直接发给他人查看任务成果": "Generate a self-contained share page (single-file HTML) to send to others",
1602
1617
  "封面图": "Cover image",
1603
1618
  "生成封面": "Generate cover",
1604
- "重试": "Retry",
1605
- "生成中…": "Generating…",
1606
1619
  "封面生成中…": "Cover generation started…",
1607
1620
  "点击查看大图": "Click to view full size",
1608
1621
  "cover.png 已不在运行目录": "cover.png is no longer in the run directory",
@@ -1896,6 +1909,157 @@
1896
1909
  "拉取失败": "Fetch failed",
1897
1910
  "模块清单已拉到 ": "Fetched ",
1898
1911
  " 条,输入框可下拉选择": " modules — pick from the dropdown",
1912
+
1913
+ // —— 发布上架链路(建书/发章/自动发布)——
1914
+ "连接平台": "Connect platform",
1915
+ "重连": "Reconnect",
1916
+ "断开": "Disconnect",
1917
+ "连接失败:": "Connect failed: ",
1918
+ "断开失败:": "Disconnect failed: ",
1919
+ "关掉该平台的浏览器窗口(登录态保留)": "Close the platform's browser window (login state is kept)",
1920
+ "已打开浏览器——请在窗口里登录平台,登录后这里自动变为「已连接」": "Browser opened — log in to the platform in that window; this panel switches to \"Connected\" automatically once you're in",
1921
+ "探测": "Probe",
1922
+ "探测失败:": "Probe failed: ",
1923
+ "已开始探测,结果记录在发布台账(data/publish)里": "Probe started — results are recorded in the publish ledger (data/publish)",
1924
+ "dump 平台表单结构(校准自动填表用)": "Dump the platform form structure (for calibrating auto-fill)",
1925
+ "创建作品": "Create book",
1926
+ "已在此平台创建的作品": "Books already created on this platform",
1927
+ "已建书:": "Book created: ",
1928
+ "建书失败:": "Book creation failed: ",
1929
+ "将用生成的作品信息在平台自动填建书表单。填好后会停在最后一步,由你在浏览器里人工点提交。继续?": "The generated book info will be auto-filled into the platform's book-creation form, stopping at the last step for you to click Submit in the browser yourself. Continue?",
1930
+ "正在自动填写建书表单…(完成后请在浏览器里确认提交)": "Auto-filling the book-creation form… (when done, review and submit in the browser)",
1931
+ "发一章": "Send one chapter",
1932
+ "选一章发送(表单填好后停,人工确认提交);已成功发过的章会被台账拦下:": "Pick a chapter to send (stops after filling the form — you confirm the submit). Chapters already published are blocked by the ledger: ",
1933
+ "将把《{0}》填进平台章节编辑器,填好后由你人工提交。继续?": "Chapter \"{0}\" will be filled into the platform's chapter editor — you submit it manually when done. Continue?",
1934
+ "正在填写章节…(完成后请在浏览器里确认提交)": "Filling in the chapter… (when done, review and submit in the browser)",
1935
+ "发章失败:": "Chapter send failed: ",
1936
+ "正在列出章节文件…": "Listing chapter files…",
1937
+ "找不到任务工作目录": "Task working directory not found",
1938
+ "列文件失败:": "Failed to list files: ",
1939
+ "工作目录里没有 .md 章稿": "No .md chapter drafts in the working directory",
1940
+ "发布全部待发": "Publish all pending",
1941
+ "按章号顺序逐章填稿(人工模式每点一次填一章,浏览器里提交后再点发下一章)": "Fills chapters one by one in order (manual mode: each click fills one; submit in the browser, then click again for the next)",
1942
+ "将从最靠前的待发章节开始填稿(共 {0} 章待发)。本轮只填一章并停在表单页,由你在浏览器里确认提交;提交后再点一次即发下一章。护栏(每日上限/连续失败暂停)生效。继续?": "Fills from the earliest pending chapter ({0} pending). Each round fills one chapter and stops at the form page for you to confirm submission in the browser; click again to send the next one. Guardrails (daily cap / consecutive-failure pause) apply. Continue?",
1943
+ "正在填第一章稿——填好后请在浏览器窗口里确认提交": "Filling the first chapter — review and submit in the browser window when it's done",
1944
+ "自动发布中 ": "Auto-publishing ",
1945
+ "自动发布完成:": "Auto-publish finished: ",
1946
+ "自动发布中断:": "Auto-publish paused: ",
1947
+ "自动发布失败:": "Auto-publish failed: ",
1948
+ "已填好一章,请在浏览器确认提交": "One chapter is filled — please review and submit in the browser",
1949
+ "护栏拦截": "Blocked by guardrail",
1950
+
1951
+ // —— 报告区 / 状态 / 杂项 ——
1952
+ "将于 {0} 自动续跑": "Auto-resumes at {0}",
1953
+ "报告读取失败({0}),稍后自动重试": "Report load failed ({0}) — will retry automatically",
1954
+ "网络异常": "Network error",
1955
+ "本次运行进行中:报告结束后在这里生成,实时进度看「步骤」页签": "This run is still in progress: the report appears here once it finishes — watch live progress in the Steps tab",
1956
+ "本次运行没有生成报告": "No report was generated for this run",
1957
+ "(状态:": " (status: ",
1958
+ ";各步骤日志在「步骤」页签": " — step logs are in the Steps tab",
1959
+ "请先填写目标": "Please write the goal first",
1960
+ "保存失败": "Save failed",
1961
+ "失败 ": "Failed ",
1962
+
1963
+ // —— 引擎调参(设置 v2,label 来自后端 schema description)——
1964
+ "编排引擎": "Orchestration engine",
1965
+ "预算": "Budget",
1966
+ "级联路由": "Cascade routing",
1967
+ "引擎调参(schema 化设置,立即生效)": "Engine tuning (schema-driven settings, effective immediately)",
1968
+ "上下文压缩总开关(灰度:与 TUTTI_COMPACTION 任一开启即生效)": "Master switch for context compaction (gray-scale: active when either this or TUTTI_COMPACTION is on)",
1969
+ "触发压缩的压力比阈值": "Pressure ratio threshold that triggers compaction",
1970
+ "压缩时保留尾部预算(token 估算)": "Tail budget kept when compacting (estimated in tokens)",
1971
+ "Goal 续行上限": "Max goal continuation rounds",
1972
+ "大纲/规划 CLI 兜底调用的超时秒数(env TUTTI_OUTLINE_TIMEOUT 优先)": "Timeout in seconds for outline/planning CLI fallback calls (env TUTTI_OUTLINE_TIMEOUT takes priority)",
1973
+ "单次运行 token 预算上限(0=不限;超额停止后续步骤,等自动续跑)": "Token budget cap per run (0 = unlimited; when exceeded, later steps stop and wait for auto-resume)",
1974
+ "FrugalGPT 式级联:easy 任务按 tier 升序重排模型链(需供应商声明 tier)": "FrugalGPT-style cascade: easy tasks reorder the model chain by tier ascending (providers must declare tiers)",
1975
+ "已保存 rev ": "Saved rev ",
1976
+ "配置已被别处修改,已刷新,请重试": "Config changed elsewhere — refreshed, please retry",
1977
+
1978
+ // —— 关于与更新(selfupdate note)——
1979
+ "查询新版本失败:": "Update check failed: ",
1980
+
1981
+ // —— 帮助中心 · 模型接入与绑定 ——
1982
+ "第一步:添加供应商": "Step 1: Add a provider",
1983
+ "「设置 → 模型接入 → 添加供应商」:填名称、API Key、接口地址(一般用默认)。保存后点「获取模型列表」自动拉取该厂商的模型;网关不提供列表接口时直接手工填模型名即可。同一厂商可配多把 Key,按顺序轮换,某把欠费自动切下一把。": "Settings → Models → Add provider: fill in the name, API key, and endpoint (the default usually works). After saving, click \"Fetch model list\" to pull that provider's models; if the gateway has no list endpoint, just type model names manually. One provider can hold multiple keys that rotate in order — when one runs out of credit, the next takes over.",
1984
+ "第二步:认识协议徽章": "Step 2: Read the protocol badges",
1985
+ "新供应商默认自动识别协议,保存后在后台实测支持哪些调用形态,结果以徽章标在卡片上。带「· chat」表示该模型只适合站内直连对话;codex 这类只讲 responses 协议的 CLI 用不了它,绑定页会自动剔除,不用自己排查。": "New providers auto-detect their protocol; after saving, supported wire forms are probed in the background and shown as badges on the card. \"· chat\" means the model only suits in-app direct chat; CLIs that only speak the responses protocol (codex, for one) can't use it — the bindings page filters those out for you.",
1986
+ "第三步:绑定 CLI 智能体": "Step 3: Bind CLI agents",
1987
+ "「设置 → CLI 绑定」给每个智能体配一条模型链,运行时按顺序故障转移。「一键推荐绑定」只填空缺,不覆盖手工配置;删除或停用厂商后链会自动补绑。": "Settings → CLI Bindings gives each agent a model chain that fails over in order at runtime. \"One-click recommended bindings\" only fills the gaps — it never overwrites manual config; the chain re-binds automatically after you delete or disable a provider.",
1988
+ "报错速查": "Error quick reference",
1989
+ "Key 无效或过期——检查或更换 Key。": "The key is invalid or expired — check or replace it.",
1990
+ "模型名不对;若发生在「获取模型列表」,是网关不提供列表接口,能正常对话就不用管。": "Wrong model name; if it happens in \"Fetch model list\", the gateway simply has no list endpoint — ignore it as long as chatting works.",
1991
+ "该模型当前无可用渠道——查余额或换一个模型。": "No channel available for this model right now — check your balance or switch models.",
1992
+ "这把 Key 连续失败被暂停 30 分钟,到期自动恢复,也可在密钥旁手动重置。": "This key failed repeatedly and is paused for 30 minutes; it recovers automatically, or you can reset it manually next to the key.",
1993
+ "想零成本先跑通:挑有免费档位的厂商配一个模型,跑通第一个任务后再按需加码。": "To try it at zero cost: pick a provider with a free tier and wire up one model; scale up after your first task runs through.",
1994
+
1995
+ // —— 帮助中心 · 连载创作流程 ——
1996
+ "开一本新书": "Start a new book",
1997
+ "新建任务选「连载写作」类型,目标里写清书名、题材和计划篇幅(如「都市异能,先写 20 章」)。目标写得太笼统时,蜂群会先反问几个澄清问题再开工。开书前会先准备作品资料:书简介与分类标签可一键生成,按平台官方选项实抓,不用自己去查规则。": "Create a \"Serial writing\" task and state the book title, genre, and planned length in the goal (e.g. \"urban superpowers, 20 chapters to start\"). If the goal is too vague, the swarm asks a few clarifying questions before starting. Before writing begins it prepares the book profile: blurb and category tags generate in one click from the platform's official option lists — no rule-digging on your end.",
1998
+ "每章怎么跑": "How each chapter runs",
1999
+ "大纲确认后分章推进:起草 → 跨厂商评审 → 打磨 → 定稿。评审不过会自动换将重写,不带着问题过关;需要你拍板的地方会亮起「待裁决」。写作时详情页可实时预览章节,蜂巢页每个智能体一格,点开能看谁在干什么。": "After the outline is confirmed, chapters move through: draft → cross-vendor review → polish → finalize. A failed review triggers an automatic rewrite by another model — problems never slip through; spots that need your call light up as \"Pending decision\". While writing, the detail page previews chapters live, and the Hive grid gives every agent a cell you can click to see who's doing what.",
2000
+ "中断了怎么办": "What if it gets interrupted",
2001
+ "任务随时可续跑:已写章节都落了盘,续跑接着往下写,不会从头再来。单章失败会自动退避重试,任务状态里会显示「将于 HH:MM 自动续跑」,不用盯着等。": "Tasks resume anytime: finished chapters are on disk, and a resume continues from there — never from scratch. A failed chapter retries automatically with backoff; the task status shows \"Auto-resumes at HH:MM\", so there's no need to watch it.",
2002
+ "递话与经验": "Steering & experience",
2003
+ "跑的过程中可以在详情页给蜂群递话(文字/截图/附件),下一轮生效。每轮结束复盘官会把踩过的坑沉淀进经验库,后续任务自动复用,越用越顺手。": "While it runs you can pass notes to the swarm from the detail page (text / screenshots / files), effective from the next round. After each round the debriefer distills pitfalls into the experience library, reused automatically by later tasks — the more you use it, the smoother it gets.",
2004
+
2005
+ // —— 帮助中心 · 发布上架 ——
2006
+ "第一次发布前:登录平台": "Before the first publish: log in",
2007
+ "目前支持番茄小说与七猫。第一次发布会引导你在浏览器里登录平台账号(扫码或账密),登录态保存在本机,之后发布免登录;过期了重新登一次即可。": "Fanqie and Qimao are supported. The first publish walks you through logging in to the platform in your browser (QR scan or password); the login state stays on this machine so later publishes skip login — just log in again if it expires.",
2008
+ "建书:资料与封面": "Book creation: info & cover",
2009
+ "连载任务的建书面板里,作品简介、分类标签可以按平台官方选项一键生成;封面点「生成封面」自动出竖版图(cover.png 落在任务运行目录)。": "In a serial task's book panel, the blurb and category tags generate in one click from the platform's official options; click \"Generate cover\" for an automatic portrait image (cover.png lands in the task's run directory).",
2010
+ "发章与确认": "Publishing chapters & confirmation",
2011
+ "章稿定稿后一键发布:自动填标题正文、处理平台的各类弹层,但提交前会停下来让你确认——绝不静默替你上架。发布完成后任务详情里能看到结果与章节链接。": "One-click publish once a chapter is finalized: title and body auto-fill, the platform's dialogs get handled, but it pauses before submitting for your confirmation — it never silently publishes on your behalf. Results and chapter links appear in the task detail afterwards.",
2012
+ "发布失败": "When publishing fails",
2013
+ "平台改版或登录态过期会导致失败,失败信息会写明原因。重新登录后再点重试即可;反复失败可以到 GitHub 提 Issue 附上失败截图。": "Platform redesigns or expired logins cause failures, and the error message says why. Log in again and hit retry; if it keeps failing, open a GitHub issue with a screenshot.",
2014
+
2015
+ // —— 帮助中心 · 代码任务与版本 ——
2016
+ "代码任务怎么跑": "How coding tasks run",
2017
+ "新建任务选开发类类型,目标写清楚要做什么(可以附需求文档、截图,附件会进入上下文)。蜂群先出计划再实现:实现 → 客观验证 → 跨厂商评审 → 修复,单路实现失败还有多候选赛马——各候选在隔离的 worktree 里各写各的,择优采纳。跑的过程中可以在详情页递话(文字/截图),下一轮生效。": "Create a dev-type task and spell out what to build in the goal (attach requirement docs or screenshots — attachments go into the context). The swarm plans first, then implements: implement → objective verification → cross-vendor review → fix; if a single implementation lane fails, multiple candidates race in parallel — each writes its own code in an isolated worktree, and the best one wins. While it runs you can pass notes from the detail page (text / screenshots), effective from the next round.",
2018
+ "任务分支隔离:你的工作区不受影响": "Task branch isolation: your workspace stays untouched",
2019
+ "启用代码版本隔离的任务会检出独立的任务分支(codebee/任务ID),所有改动只落在那条分支上,你当前的分支和未提交的改动完全不动——开跑前工作区有脏改动会先帮你收起(stash),跑完自动还原。": "Tasks with code version isolation check out a dedicated task branch (codebee/<task-id>); all changes land only on that branch — your current branch and uncommitted work are never touched. Dirty workspace changes are stashed before the run starts and restored automatically afterwards.",
2020
+ "版本裁决:合并还是丢弃": "Version verdict: merge or discard",
2021
+ "任务跑完后,「版本」页签会亮起「待裁决」等你拍板:先看变更清单,双击文件能看 diff;满意点「合并」,任务分支合回基线分支;不满意点「丢弃」,分支和工作现场自动清场。中途停下的任务也会留好提交,可以继续跑完再裁决。合并与丢弃绝不静默替你决定。": "When a task finishes, the Versions tab lights up \"Pending decision\" for your call: review the change list first — double-click a file to see its diff. Happy? Click \"Merge\" to merge the task branch back into the baseline. Not happy? Click \"Discard\" and the branch and work site are cleaned up automatically. Interrupted tasks keep their commits — resume and finish before deciding. Merge and discard are never decided silently on your behalf.",
2022
+ "哪里看细节": "Where to see the details",
2023
+ "「蜂巢」页签看每个智能体实时在干什么(点格子看实时日志);「步骤」页签看任务拆解、每步实际用的模型、耗时与失败原因,评审分数与打磨记录也在这里。": "The Hive tab shows what each agent is doing in real time (click a cell for its live log); the Steps tab shows the task breakdown, the actual model used per step, durations and failure causes — review scores and polish records live there too.",
2024
+
2025
+ // —— 帮助中心 · 自动化与技能市场 ——
2026
+ "定时任务": "Scheduled tasks",
2027
+ "设置 → 自动化:把任意任务类型挂上时间表(每天/每周固定时刻),到点自动按真实运行链开跑,结果照常落盘。配合群机器人(钉钉/飞书/企微自动适配)可以把完成状态推到群里。": "Settings → Automation: put any task type on a schedule (fixed daily/weekly times); at the appointed time it runs through the real execution chain and results land as usual. Pair it with a group robot (DingTalk/Feishu/WeCom auto-detected) to push completion status into your group chat.",
2028
+ "设置 → 禅道:配好地址与产品档案后,定时扫描激活 Bug,按模块路由 / AI 排查定责(前端/后端/双端/非我方);我方端的 Bug 自动创建代码修复任务,修完自动合并、resolve 并回写报告到群里;测试指错人的也会按排查结论改派。合并失败不 resolve 不转派,留人工兜底。": "Settings → ZenTao: once the address and product profiles are set, active bugs are scanned on a schedule and triaged by module route / AI (frontend / backend / both / not ours); bugs on our side spawn code-fix tasks automatically — when fixed, they merge, resolve, and post the report back to the group chat; bugs misassigned by testers get reassigned per the triage verdict. If the merge fails, it won't resolve or reassign — a human takes over as the fallback.",
2029
+ "技能市场": "Skills marketplace",
2030
+ "设置 → 插件市场:600+ 技能一键安装,来源包括内置库和 ZCode、Anthropic 等多个外部目录。装上的技能会注入智能体能力,按任务类型生效。": "Settings → Marketplace: 600+ skills install in one click, from the built-in library and external catalogs such as ZCode and Anthropic. Installed skills inject agent capabilities and take effect by task type.",
2031
+ "用量台账": "Usage ledger",
2032
+ "设置 → 用量:每次调用的模型、token 与费用按多个维度聚合展示,历史运行会在启动时自动回填——每个任务花了多少,一目了然。": "Settings → Usage: model, tokens, and cost of every call aggregated across dimensions; historical runs backfill automatically at startup — what each task cost, at a glance.",
2033
+
2034
+ // —— 帮助中心 · 常见问题 ——
2035
+ "点「获取模型列表」报 404?": "\"Fetch model list\" returns 404?",
2036
+ "部分网关不提供模型列表接口,属正常现象;只要能正常对话就不用管,模型名手工填即可。": "Some gateways have no model-list endpoint — that's normal. As long as chatting works, ignore it and type model names manually.",
2037
+ "报 503 / 无可用渠道?": "Getting 503 / no available channel?",
2038
+ "该模型当前没有可用渠道,最常见是余额耗尽。查一下余额或换个模型;同一厂商配了多把 Key 会自动轮换。": "No channel is available for this model — most often the balance is drained. Check your balance or switch models; multiple keys on one provider rotate automatically.",
2039
+ "「冷却中」是什么意思?": "What does \"Cooling down\" mean?",
2040
+ "一把 Key 连续失败会被暂停 30 分钟,防止反复撞墙烧钱,到期自动恢复;也可以在密钥旁手动重置。": "A key that keeps failing is paused for 30 minutes so it stops burning money against a wall; it recovers automatically when time is up, or reset it manually next to the key.",
2041
+ "任务一直显示「排队」?": "Task stuck on \"Queued\"?",
2042
+ "本地默认最多 6 个任务同时跑,排满就排队。排队时可以打开详情看前面还有几个;个别卡死的任务,看门狗会自动清理补队。": "Up to 6 tasks run concurrently by default; extras queue up. Open a queued task's detail to see how many are ahead; a watchdog automatically cleans up stuck tasks and re-queues them.",
2043
+ "状态里写着「将于 HH:MM 自动续跑」?": "Status says \"Auto-resumes at HH:MM\"?",
2044
+ "这一步失败了,正在退避等待自动重试,到点会接着跑,不需要手动干预;等不及也可以在详情页手动重试。": "That step failed and is backing off before an automatic retry — it continues on its own at the shown time, no manual action needed; if you can't wait, retry manually from the detail page.",
2045
+ "生成的文件在哪?": "Where are the generated files?",
2046
+ "写作类任务的章节、封面、报告都落在任务的运行目录,详情页「成果」页签可浏览和预览。代码类任务则在仓库的任务分支上改代码,详情页「版本」里审阅后再合并。": "Writing tasks put chapters, covers, and reports in the task's run directory — browse and preview them in the Artifacts tab. Coding tasks change code on the repo's task branch; review it in the Versions tab, then merge.",
2047
+ "忘了令牌 / 手机打不开页面?": "Forgot the token / page won't open on your phone?",
2048
+ "服务启动日志里有带令牌的完整访问地址;远程设备必须用带令牌的 URL 打开(或在令牌门里输入一次),否则会一直要求授权。": "The startup log contains the full token-embedded URL; remote devices must open that tokenized URL (or enter the token once at the gate), otherwise it keeps asking for authorization.",
2049
+ "升级后数据会丢吗?": "Will upgrading lose my data?",
2050
+ "不会。任务、配置、用量台账都在独立的数据目录里,升级只替换程序本体;老版本装新版会自动沿用原数据目录。": "No. Tasks, config, and the usage ledger all live in a separate data directory; upgrading only replaces the program itself, and installing the new version over an old one automatically keeps the original data directory.",
2051
+ "页面打不开 / 服务起不来?": "Page won't open / service won't start?",
2052
+ "多半是默认端口 8765 被旧进程占着:结束旧的 python 进程,或启动时用 --port 换个端口。还不行就到 GitHub 提 Issue。": "Most likely the default port 8765 is held by an old process: end the stale python process, or start with --port to use another port. If it still won't come up, open a GitHub issue.",
2053
+
2054
+ // —— index.html 占位符 / 提示 ——
2055
+ "添加附件:截图 / 文本 / Word·Excel·PPT / PDF 等(普通 8MB,Office 24MB),创建任务时落盘到工作目录 _attachments/;也可直接粘贴截图": "Attach: screenshots / text / Word·Excel·PPT / PDF etc. (8MB regular, 24MB Office) — saved into the task's _attachments/ folder on creation; you can also paste screenshots directly",
2056
+ "添加附件:截图 / 文本 / Word·Excel·PPT / PDF 等(普通 8MB,Office 24MB);也可直接粘贴截图": "Attach: screenshots / text / Word·Excel·PPT / PDF etc. (8MB regular, 24MB Office); you can also paste screenshots directly",
2057
+ "https://zentao.example.com(子目录部署带子目录)": "https://zentao.example.com (include the subdirectory if deployed under one)",
2058
+ "建议建专用账号(如 codebee)收 Bug": "Use a dedicated account (e.g. codebee) to receive bugs",
2059
+ "修复任务评审通过后,自动到禅道 resolve(fixed)并回评论": "After the fix task passes review, auto-resolve the bug in ZenTao (fixed) and post a comment",
2060
+ "把任务分支自动合并回基线分支(需配置基线分支;合并失败不 resolve 不转派,留人工)": "Auto-merge the task branch back into the baseline branch (baseline branch must be configured; if the merge fails it won't resolve or reassign — stays with a human)",
2061
+ "按下面的间隔定时扫描;关掉后仍可手动「立即扫描」": "Scan on the interval below; when off, \"Scan now\" still works manually",
2062
+ "帮助目录": "Help contents",
1899
2063
  };
1900
2064
 
1901
2065
  // ---------- 工具 ----------
package/app/ui/index.html CHANGED
@@ -190,7 +190,7 @@
190
190
  <div data-i18n="外观" class="set-group">外观</div>
191
191
  <button class="set-item" data-sub="appearance" data-i18n="皮肤"><svg class="ico" aria-hidden="true"><use href="#i-palette"></use></svg>皮肤</button>
192
192
  <div data-i18n="软件" class="set-group">软件</div>
193
- <button id="btn-guide" class="set-item" data-sub="__guide" data-i18n="使用引导"><svg class="ico" aria-hidden="true"><use href="#i-rocket"></use></svg>使用引导</button>
193
+ <button id="btn-guide" class="set-item" data-sub="__guide" data-i18n="帮助中心"><svg class="ico" aria-hidden="true"><use href="#i-rocket"></use></svg>帮助中心</button>
194
194
  <button id="btn-about" class="set-item" data-sub="about" data-i18n="关于与更新"><svg class="ico" aria-hidden="true"><use href="#i-gauge"></use></svg>关于与更新</button>
195
195
  <div data-i18n="远程" class="set-group">远程</div>
196
196
  <button id="btn-phone" class="set-item" data-sub="__phone" data-i18n="手机连接"><svg class="ico" aria-hidden="true"><use href="#i-phone"></use></svg>手机连接</button>
@@ -457,7 +457,7 @@
457
457
  </div>
458
458
  <div id="rd-pane-hive" class="rd-pane" role="tabpanel" aria-labelledby="rd-tab-hive" data-pane="hive">
459
459
  <div id="rd-hive" class="rd-hive hidden">
460
- <div class="sec-title"><svg class="ico" aria-hidden="true"><use href="#i-bee"></use></svg><span data-i18n="蜂巢工作台">蜂巢工作台</span><span id="rd-hive-sub" class="tag"></span></div>
460
+ <div class="sec-title"><svg class="ico" aria-hidden="true"><use href="#i-bee"></use></svg><span data-i18n="蜂巢工作台">蜂巢工作台</span><span id="rd-hive-sub" class="tag"></span><button class="hhelp" data-help-topic="serial" title="这是什么?点开看帮助" data-i18n-title="这是什么?点开看帮助" aria-label="帮助" data-i18n-aria="帮助"><svg class="ico" aria-hidden="true"><use href="#i-help"></use></svg></button></div>
461
461
  <div id="rd-hive-cells" class="hive-cells"></div>
462
462
  </div>
463
463
  <!-- 运行中指挥信箱:renderDirector 只认活跃 run,渲染时摘掉 hidden;
@@ -528,6 +528,7 @@
528
528
  <div class="panel wide">
529
529
  <div class="panel-head">
530
530
  <h2 data-i18n="禅道 Bug 自动修复">禅道 Bug 自动修复</h2>
531
+ <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>
531
532
  <div class="actions">
532
533
  <button id="btn-zentao-test" class="ghost small" title="用当前表单里的连接信息试连禅道" data-i18n-title="用当前表单里的连接信息试连禅道"><span data-i18n="测试连接">测试连接</span></button>
533
534
  <button id="btn-zentao-scan" class="primary small" title="立刻扫一遍激活 Bug 并对账回写" data-i18n-title="立刻扫一遍激活 Bug 并对账回写"><span data-i18n="立即扫描">立即扫描</span></button>
@@ -545,8 +546,8 @@
545
546
  <div class="zt-grid zt-grid-toggles">
546
547
  <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
548
  <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>
549
- <label class="toggle" title="按下面的间隔定时扫描;关掉后仍可手动「立即扫描」"><input id="zt-poll" type="checkbox"><span data-i18n="定时扫描">定时扫描</span></label>
549
+ <label class="toggle" title="把任务分支自动合并回基线分支(需配置基线分支;合并失败不 resolve 不转派,留人工)" data-i18n-title="把任务分支自动合并回基线分支(需配置基线分支;合并失败不 resolve 不转派,留人工)"><input id="zt-automerge" type="checkbox"><span data-i18n="自动合并代码">自动合并代码</span></label>
550
+ <label class="toggle" title="按下面的间隔定时扫描;关掉后仍可手动「立即扫描」" data-i18n-title="按下面的间隔定时扫描;关掉后仍可手动「立即扫描」"><input id="zt-poll" type="checkbox"><span data-i18n="定时扫描">定时扫描</span></label>
550
551
  <label data-i18n="扫描间隔(小时)">扫描间隔(小时)</label><input id="zt-interval" type="number" min="1" max="168" step="1">
551
552
  </div>
552
553
  <div class="ops"><button id="btn-zentao-save" class="primary small"><span data-i18n="保存配置">保存配置</span></button></div>
@@ -564,6 +565,7 @@
564
565
  <div class="panel wide">
565
566
  <div class="panel-head">
566
567
  <h2 data-i18n="使用统计">使用统计<span class="badge2" data-i18n="应用用量">应用用量</span></h2>
568
+ <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>
567
569
  <div class="actions" id="usage-ranges">
568
570
  <div class="seg" role="group" aria-label="时间范围" data-i18n-aria="时间范围">
569
571
  <button data-i18n="今天" class="seg-btn active" data-days="1">今天</button>
@@ -604,6 +606,7 @@
604
606
  <div class="panel wide">
605
607
  <div class="panel-head">
606
608
  <h2 data-i18n="智能体目录">智能体目录</h2>
609
+ <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>
607
610
  <div class="actions">
608
611
  <button data-i18n="一键绑定推荐模型" id="btn-catalog-autobind" class="ghost">一键绑定推荐模型</button>
609
612
  <button data-i18n="重新加载 catalog" id="btn-reload-catalog" class="ghost">重新加载 catalog</button>
@@ -656,7 +659,8 @@
656
659
  <!-- 经验库 -->
657
660
  <div id="sub-skills" class="subpage hidden">
658
661
  <div class="panel wide">
659
- <div class="panel-head"><h2 data-i18n="经验库">经验库</h2></div>
662
+ <div class="panel-head"><h2 data-i18n="经验库">经验库</h2>
663
+ <button class="hhelp" data-help-topic="features" title="这是什么?点开看帮助" data-i18n-title="这是什么?点开看帮助" aria-label="帮助" data-i18n-aria="帮助"><svg class="ico" aria-hidden="true"><use href="#i-help"></use></svg></button></div>
660
664
  <p class="hint"><span data-i18n="系统自己的经验沉淀:">系统自己的经验沉淀:</span><b data-i18n="内置规范包">内置规范包</b><span data-i18n="(如七猫签约标准,自动注入小说类任务的规划与评审提示词) 与">(如七猫签约标准,自动注入小说类任务的规划与评审提示词)
661
665
  与</span><b data-i18n="运行中自动学到的教训">运行中自动学到的教训</b><span data-i18n="(每次任务结束由编排者复盘本次评审暴露的问题,去重沉淀,下次同类任务自动带上)——越跑越好,无需人工维护。">(每次任务结束由编排者复盘本次评审暴露的问题,去重沉淀,下次同类任务自动带上)——越跑越好,无需人工维护。</span></p>
662
666
  <h3 data-i18n="内置规范包" class="sec-title">内置规范包</h3>
@@ -745,7 +749,7 @@
745
749
  <div class="panel-head"><h2 data-i18n="关于与更新">关于与更新</h2></div>
746
750
  <div id="su-info" class="empty" data-i18n="加载中…">加载中…</div>
747
751
  <div class="input-row" style="margin-top:10px">
748
- <button id="btn-welcome-replay" class="ghost small" onclick="welcomeOpen()"><svg class="ico" aria-hidden="true"><use href="#i-bee"></use></svg><span data-i18n="使用引导">使用引导</span></button>
752
+ <button id="btn-welcome-replay" class="ghost small" onclick="welcomeOpen()"><svg class="ico" aria-hidden="true"><use href="#i-bee"></use></svg><span data-i18n="帮助中心">帮助中心</span></button>
749
753
  <button id="su-check" class="ghost small" onclick="suCheck()"><svg class="ico" aria-hidden="true"><use href="#i-refresh"></use></svg><span data-i18n="检查更新">检查更新</span></button>
750
754
  <button id="su-apply" class="ghost small hidden" onclick="suApply()"><span data-i18n="升级到新版">升级到新版</span></button>
751
755
  <button id="su-restart" class="ghost small hidden" onclick="suRestart()"><span data-i18n="重启服务生效">重启服务生效</span></button>
@@ -979,8 +983,8 @@
979
983
  <svg class="ico welcome-bee" aria-hidden="true"><use href="#i-bee"></use></svg>
980
984
  <span class="brand-name">CodeBee</span>
981
985
  </div>
982
- <nav class="help-toc" id="help-toc" aria-label="帮助目录"></nav>
983
- <p class="welcome-foot" data-i18n="可随时在「设置关于与更新」重新打开本引导。">可随时在「设置关于与更新」重新打开本引导。</p>
986
+ <nav class="help-toc" id="help-toc" aria-label="帮助目录" data-i18n-aria="帮助目录"></nav>
987
+ <p class="welcome-foot" data-i18n="可随时按 F1,或在「设置 关于与更新」重新打开本帮助中心。">可随时按 F1,或在「设置 关于与更新」重新打开本帮助中心。</p>
984
988
  </div>
985
989
  <div class="help-main">
986
990
  <h1 id="welcome-title" data-i18n="欢迎使用 CodeBee">欢迎使用 CodeBee</h1>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codebee",
3
- "version": "0.1.16",
3
+ "version": "0.1.17",
4
4
  "description": "CodeBee · 多智能体编排台 — 统一编排本机 AI 编码 CLI(Codex / Claude Code / QwenCode / OpenCode / Aider…):目标→拆解→路由→执行→验证→跨厂商评审→修复→报告。纯 Python 标准库实现,本地 Web UI。",
5
5
  "license": "MIT",
6
6
  "bin": {