codebee 0.1.82 → 0.1.83

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
@@ -6,6 +6,12 @@ README 元数据带回,供老版本在「发现新版本」时展示新版更
6
6
 
7
7
  ## 未发布
8
8
 
9
+ ## v0.1.83(2026-10-05)
10
+
11
+ - **用量统计模型名不再分裂**:同一模型不同大小写(如 GLM-5.3-Flash 与 glm-5.3-flash)在台账倒序读入时 2:2 平局会随机拆成两行——平局裁断补第三序(大写字母数),统计视图稳定归一。
12
+ - **测试面存量红清账六件**(-13F -2E):建书对账收紧与「done 只计确认发布」改版后断言已跟上;发布门禁测试与 e2e 口径对齐;两件旧布局/脚本式测试件改造成 discover 兼容。全量 2143 项对账零新增红。
13
+
14
+
9
15
  ## v0.1.82(2026-10-04)
10
16
 
11
17
  - **连载「多线剧情推演」开放到界面**:任务表单与流程编辑器都能设 1-3 路分支——起草前先让智能体推演几条剧情走向、择优再动笔(比同章多稿赛马省一个数量级 token)。此前该能力只能手拼 API,而且流程里配好的推演数会被任务创建/保存流程静默冲掉。
package/README.md CHANGED
@@ -33,11 +33,10 @@ Trae Agent、OpenClaw……),提供
33
33
  ---
34
34
 
35
35
  <!-- relnotes:start -->
36
- ### 最新版更新内容(v0.1.82)
36
+ ### 最新版更新内容(v0.1.83)
37
37
 
38
- - 连载「多线剧情推演」开放到界面:任务表单/流程编辑器可设 1-3 路分支,写前推演择优再动笔;流程里配好的推演数/赛马数不再被静默冲掉
39
- - 赛马复赛不再白烧:容量受限通道首轮全挂后,复赛按身份收缩提示词(大纲/前情永不动),首轮仍发全量
40
- - 降级发生可对账:重试/复赛触发降级时,步骤说明写明降了哪几层
38
+ - 用量统计模型名不再分裂:同一模型不同大小写写法稳定归一成一行,不再随台账读入顺序随机拆两行
39
+ - 测试面存量红清账六件:建书对账/发布门禁等改版后的滞后断言全部跟上,全量 2143 项零新增红
41
40
  <!-- relnotes:end -->
42
41
 
43
42
 
@@ -4194,6 +4194,24 @@ def _run_serial_review(run, task, agents, ev, stats, mode, critics, impl, route,
4194
4194
  results[idx] = gj
4195
4195
  return
4196
4196
  gtpl = SERIAL_GLOBAL_PROMPT
4197
+ if start > 1:
4198
+ # 批次评审口径:连载中段批次不能拿全书开篇与高潮段的标准审
4199
+ # (实案:黄金三章口径被用来扣批首章开篇分、承段被按高潮段
4200
+ # 密度打节奏 5.0、伏笔揭示位在后批章纲的被判悬置)。口径只
4201
+ # 纠正评审对象的范围与基准,重复/人设/文风类问题照常计。
4202
+ gtpl = gtpl.replace(
4203
+ "## 全书目标",
4204
+ "## 批次评审口径(系统注入)\n"
4205
+ "- 本次送审批次为全书第 %d—%d 章(连载中段批次),文本中的前文节选仅供衔接核对;\n"
4206
+ "- 「黄金一章/黄金三章」口径仅适用于全书第 1—3 章,不得据此扣减本批批首章的开篇分;\n"
4207
+ "- 本批各章的既定事件以工作目录「章纲/」下的锁定章纲为准(可自行查阅):承段、"
4208
+ "过渡章的节奏分应对照章纲既定事件是否落实与章末钩子是否成立,"
4209
+ "不以高潮段的事件密度为统一标准;\n"
4210
+ "- 「伏笔悬置」类 major 须先核对章纲的揭示位安排:揭示位写在后批章纲中的伏笔"
4211
+ "不算悬置,无任何安排的悬置才成立;\n"
4212
+ "- 重复叙述、人设崩坏、文风漂移、真实前后矛盾照常计 major——本口径只纠正评审"
4213
+ "对象的范围与基准,不是放水。\n\n"
4214
+ "## 全书目标" % (start, end), 1)
4197
4215
  if bible:
4198
4216
  gtpl = gtpl.replace("## 全书目标", bible + "\n\n## 全书目标", 1)
4199
4217
  res = _run_step(run_id, "global-critique", bound[idx],
@@ -5276,9 +5294,12 @@ def mark_task_plan(workdir, index, status):
5276
5294
 
5277
5295
 
5278
5296
  def _workdir_blocker(task, run_id):
5279
- """同工作目录互斥:返回占用该目录的运行中/排队任务(无则 None)。
5297
+ """同工作目录互斥:返回占用该目录的任务(无则 None)。
5280
5298
  任务计划/项目记忆/任务分支检出都是工作目录级共享状态,并行会互相覆盖
5281
- (2026-09-23 禅道双单实案),故同目录只允许一个任务在跑。"""
5299
+ (2026-09-23 禅道双单实案),故同目录只允许一个任务在跑。占用者只认
5300
+ **真正在跑**(running)的 run:2026-10-05 实案——三个同目录任务全部
5301
+ queued 时,排队中的兄弟互相被当成占用者,各自退避 60s 形成活锁,
5302
+ 谁也起不来;排队者是「同样在等」而不是「占着」。"""
5282
5303
  wd = (task.get("workdir") or "").rstrip("/\\")
5283
5304
  if not wd:
5284
5305
  return None
@@ -5287,7 +5308,8 @@ def _workdir_blocker(task, run_id):
5287
5308
  or t.get("status") not in ("running", "queued")
5288
5309
  or (t.get("workdir") or "").rstrip("/\\") != wd):
5289
5310
  continue
5290
- if jobs._task_active_run(t.get("id"), exclude_run_id=run_id):
5311
+ blk = jobs._task_active_run(t.get("id"), exclude_run_id=run_id)
5312
+ if blk is not None and blk.get("status") == "running":
5291
5313
  return t
5292
5314
  return None
5293
5315
 
package/app/core/usage.py CHANGED
@@ -679,7 +679,8 @@ def _group(records, key):
679
679
  def _model_display_map(records):
680
680
  """模型名归一映射 {casefold: 展示名}:同一模型不同大小写(GLM-5.3-Flash 与
681
681
  glm-5.3-flash)会被拆成两行统计,这里把 casefold 相同的归为一组,
682
- 展示名取组内出现次数最多的原始写法(平局取更长写法,信息更全)。"""
682
+ 展示名取组内出现次数最多的原始写法(平局取更长写法,再平局取大写字母
683
+ 更多的规范形——台账倒序读入时 2:2 平局的裁断不再随记录顺序漂移)。"""
683
684
  canon = {}
684
685
  for r in records:
685
686
  name = str(r.get("model") or "") or "unknown"
@@ -690,7 +691,8 @@ def _model_display_map(records):
690
691
  display = {}
691
692
  for k, c in canon.items():
692
693
  display[k] = max(c["names"].items(),
693
- key=lambda kv: (kv[1], len(kv[0])))[0]
694
+ key=lambda kv: (kv[1], len(kv[0]),
695
+ sum(ch.isupper() for ch in kv[0])))[0]
694
696
  return display
695
697
 
696
698
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codebee",
3
- "version": "0.1.82",
3
+ "version": "0.1.83",
4
4
  "description": "CodeBee · 多智能体编排台 — 统一编排本机 AI 编码 CLI(Codex / Claude Code / QwenCode / OpenCode / Aider…):目标→拆解→路由→执行→验证→跨厂商评审→修复→报告。纯 Python 标准库实现,本地 Web UI。",
5
5
  "license": "MIT",
6
6
  "bin": {