codebee 0.1.68 → 0.1.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/CHANGELOG.md +543 -543
  2. package/LICENSE +21 -21
  3. package/README.md +10 -0
  4. package/app/core/acceptance.py +100 -100
  5. package/app/core/aiflavor.py +197 -197
  6. package/app/core/artifacts.py +148 -148
  7. package/app/core/assets.py +110 -110
  8. package/app/core/attachments.py +623 -623
  9. package/app/core/automation.py +758 -758
  10. package/app/core/backup.py +470 -470
  11. package/app/core/beekeeper.py +183 -183
  12. package/app/core/board.py +209 -209
  13. package/app/core/bookmeta.py +930 -930
  14. package/app/core/bookmeta_catalog.py +180 -180
  15. package/app/core/branching.py +137 -137
  16. package/app/core/builtin_agent.py +1234 -1234
  17. package/app/core/capability.py +144 -144
  18. package/app/core/chaptersafe.py +32 -32
  19. package/app/core/cleanup.py +303 -303
  20. package/app/core/compaction.py +201 -201
  21. package/app/core/covergen.py +356 -356
  22. package/app/core/defectretro.py +43 -43
  23. package/app/core/diagnostics.py +114 -114
  24. package/app/core/dispatch.py +173 -173
  25. package/app/core/dispatch_log.py +128 -128
  26. package/app/core/env_scrub.py +85 -85
  27. package/app/core/error_codes.py +23 -23
  28. package/app/core/errorlog.py +137 -137
  29. package/app/core/evaluation.py +174 -174
  30. package/app/core/failure_notify.py +290 -290
  31. package/app/core/goal_service.py +167 -167
  32. package/app/core/health.py +374 -374
  33. package/app/core/history.py +38 -38
  34. package/app/core/hooks.py +162 -162
  35. package/app/core/jobs.py +29 -29
  36. package/app/core/manager.py +2122 -2122
  37. package/app/core/market.py +362 -362
  38. package/app/core/mocks.py +64 -64
  39. package/app/core/modelhub.py +8 -8
  40. package/app/core/notify.py +106 -106
  41. package/app/core/operations.py +228 -228
  42. package/app/core/paihang.py +138 -138
  43. package/app/core/paths.py +2 -2
  44. package/app/core/portguard.py +111 -111
  45. package/app/core/preview.py +293 -293
  46. package/app/core/publish/__init__.py +7 -7
  47. package/app/core/publish/auto.py +367 -367
  48. package/app/core/publish/browser.py +539 -539
  49. package/app/core/publish/fanqie.py +159 -159
  50. package/app/core/publish/flow.py +440 -440
  51. package/app/core/publish/flows-fanqie-calibrated.json +332 -332
  52. package/app/core/publish/ledger.py +203 -203
  53. package/app/core/publish/manager.py +692 -692
  54. package/app/core/publish/qimao.py +141 -141
  55. package/app/core/publish/ws.py +139 -139
  56. package/app/core/redact.py +38 -38
  57. package/app/core/repeat_guard.py +129 -129
  58. package/app/core/router.py +398 -398
  59. package/app/core/runner.py +2067 -2067
  60. package/app/core/selfupdate.py +384 -384
  61. package/app/core/session_log.py +161 -161
  62. package/app/core/sessions.py +312 -312
  63. package/app/core/settings.py +149 -149
  64. package/app/core/settings_schema.py +262 -262
  65. package/app/core/share_page.py +114 -114
  66. package/app/core/skill_scan.py +122 -122
  67. package/app/core/skillpacks/fanqie-novel.md +80 -80
  68. package/app/core/skillpacks/market/character-bible.md +66 -66
  69. package/app/core/skillpacks/market/code-risk-checklist.md +58 -58
  70. package/app/core/skillpacks/market/git-workflow.md +57 -57
  71. package/app/core/skillpacks/market/release-notes.md +72 -72
  72. package/app/core/skillpacks/market/weekly-report.md +71 -71
  73. package/app/core/skillpacks/market/worldview-consistency.md +70 -70
  74. package/app/core/step_runner.py +132 -132
  75. package/app/core/store.py +75 -75
  76. package/app/core/task_compile.py +199 -199
  77. package/app/core/telemetry.py +292 -292
  78. package/app/core/tlsctx.py +64 -64
  79. package/app/core/token_meter.py +147 -147
  80. package/app/core/tracing.py +144 -144
  81. package/app/core/upstream.py +41 -41
  82. package/app/core/usage.py +862 -862
  83. package/app/core/volumes.py +389 -389
  84. package/app/core/wxdigest.py +858 -858
  85. package/app/core/zentao.py +2465 -2465
  86. package/app/main.py +2981 -2981
  87. package/app/pick_dialog.py +110 -110
  88. package/app/ui/app.js +14399 -14399
  89. package/app/ui/artdiff.js +74 -74
  90. package/app/ui/board.html +162 -162
  91. package/app/ui/board.js +305 -305
  92. package/app/ui/i18n.js +2770 -2770
  93. package/app/ui/icons/bee.svg +79 -79
  94. package/app/ui/manifest.json +16 -16
  95. package/app/ui/qrcode.js +2297 -2297
  96. package/app/ui/style.css +16 -16
  97. package/bin/tutti.js +147 -147
  98. package/package.json +46 -46
  99. package/tools/wx_reader.py +261 -261
  100. package/app/.playwright-cli/console-2026-09-23T08-26-03-635Z.log +0 -88
  101. package/app/.playwright-cli/page-2026-09-23T08-26-03-845Z.yml +0 -126
  102. package/app/.playwright-cli/page-2026-09-23T08-29-44-203Z.png +0 -0
  103. package/app/.playwright-cli/page-2026-09-23T08-35-42-046Z.yml +0 -210
  104. package/app/.playwright-cli/page-2026-09-23T08-36-52-858Z.png +0 -0
  105. package/app/.playwright-cli/page-2026-09-23T08-37-33-938Z.png +0 -0
  106. package/app/.playwright-cli/run-detail-after.png +0 -0
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 scwuxinping
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 scwuxinping
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -30,6 +30,16 @@ Trae Agent……),提供
30
30
 
31
31
 
32
32
 
33
+ ---
34
+
35
+ <!-- relnotes:start -->
36
+ ### 最新版更新内容(v0.1.69)
37
+
38
+ - 智能体目录新增三款 CLI:Google **Gemini CLI**、腾讯云 **CodeBuddy CLI**(`cbc`)、字节开源 **Trae Agent**(`trae-cli`)——目录页一键安装/升级与无头编排,凭据走各 CLI 自带登录态
39
+ - 防假绑定:这三款暂不支持「CLI 绑定」链(走本机凭据),配置了供应商链会被明确拦截提示,不再出现「链显示活着、实际走 CLI 默认模型」
40
+ <!-- relnotes:end -->
41
+
42
+
33
43
  ---
34
44
 
35
45
  ## 功能速览
@@ -1,100 +1,100 @@
1
- # -*- coding: utf-8 -*-
2
- """Run acceptance matrix and evidence normalization.
3
-
4
- The matrix keeps correctness, performance, boundary behavior, exception
5
- handling, readability and security as separate conclusions. Missing evidence
6
- is reported as ``not_evaluated``/``unknown`` rather than being inferred from a
7
- successful process exit.
8
- """
9
- from __future__ import annotations
10
-
11
- import time
12
-
13
- CASES = ("correctness", "performance", "boundary", "exception",
14
- "readability", "security")
15
-
16
-
17
- def _case(name, status, evidence=None, reason=""):
18
- return {"case": name, "status": status,
19
- "evidence": [evidence] if isinstance(evidence, dict) else [],
20
- "reason": str(reason or "")[:300]}
21
-
22
-
23
- def _quality_verdict(run):
24
- verdict = run.get("verdict") or {}
25
- for key in ("pass", "publishable", "verify_pass"):
26
- if isinstance(verdict.get(key), bool):
27
- return verdict.get(key), key
28
- return None, ""
29
-
30
-
31
- def evaluate_run(run, task=None):
32
- """Build a deterministic acceptance result from persisted run evidence."""
33
- run = run or {}
34
- task = task or {}
35
- status = str(run.get("status") or "")
36
- verdict = run.get("verdict") or {}
37
- out = []
38
-
39
- correct, source = _quality_verdict(run)
40
- if status in ("failed", "timeout", "cancelled"):
41
- out.append(_case("correctness", "unknown",
42
- {"source": "run.status", "value": status},
43
- "任务终态未形成可判定的质量结论"))
44
- elif correct is not None:
45
- out.append(_case("correctness", "passed" if correct else "failed",
46
- {"source": "run.verdict", "field": source,
47
- "value": bool(correct)}))
48
- else:
49
- out.append(_case("correctness", "not_evaluated", reason="缺少验证或质量门证据"))
50
-
51
- duration = run.get("duration_s")
52
- if duration is None and run.get("started_at") and run.get("ended_at"):
53
- duration = "recorded"
54
- has_duration = isinstance(duration, (int, float)) and duration >= 0
55
- has_usage = any(isinstance(run.get(key), (int, float)) and run.get(key) > 0
56
- for key in ("tokens", "cost_usd"))
57
- if has_duration or has_usage:
58
- out.append(_case("performance", "passed", {
59
- "source": "run.metrics", "duration_s": duration,
60
- "tokens": run.get("tokens", 0), "cost_usd": run.get("cost_usd", 0),
61
- }, "仅表示性能数据已记录,不代表达到业务阈值"))
62
- else:
63
- out.append(_case("performance", "not_evaluated", reason="缺少耗时或用量证据"))
64
-
65
- boundary = verdict.get("boundary_checks")
66
- if isinstance(boundary, list) and boundary and all(
67
- isinstance(x, dict) and isinstance(x.get("passed"), bool) for x in boundary):
68
- failed = [x for x in boundary if x.get("passed") is False]
69
- out.append(_case("boundary", "failed" if failed else "passed",
70
- {"source": "run.verdict.boundary_checks", "count": len(boundary),
71
- "failed": len(failed)}))
72
- else:
73
- out.append(_case("boundary", "not_evaluated", reason="当前任务未声明边界检查证据"))
74
-
75
- exception = verdict.get("exception")
76
- if isinstance(exception, bool):
77
- out.append(_case("exception", "passed" if exception else "failed",
78
- {"source": "run.verdict.exception", "value": exception}))
79
- elif status in ("failed", "timeout"):
80
- out.append(_case("exception", "failed" if status in ("failed", "timeout") else "unknown",
81
- {"source": "run.error", "status": status,
82
- "error": str(run.get("error") or "")[:300]}))
83
- elif status == "cancelled":
84
- out.append(_case("exception", "unknown",
85
- {"source": "run.status", "value": status}))
86
- else:
87
- out.append(_case("exception", "not_evaluated", reason="缺少独立异常处理证据"))
88
-
89
- for name, key in (("readability", "readability"), ("security", "security")):
90
- value = verdict.get(key)
91
- if isinstance(value, bool):
92
- out.append(_case(name, "passed" if value else "failed",
93
- {"source": "run.verdict.%s" % key, "value": value}))
94
- else:
95
- out.append(_case(name, "not_evaluated", reason="未提供独立 %s 证据" % name))
96
-
97
- # 总体通过要求六个维度都有明确通过证据;缺证据不能被两个局部绿灯掩盖。
98
- return {"version": 1, "evaluated_at": time.time(),
99
- "passed": bool(out and all(x["status"] == "passed" for x in out)),
100
- "cases": out}
1
+ # -*- coding: utf-8 -*-
2
+ """Run acceptance matrix and evidence normalization.
3
+
4
+ The matrix keeps correctness, performance, boundary behavior, exception
5
+ handling, readability and security as separate conclusions. Missing evidence
6
+ is reported as ``not_evaluated``/``unknown`` rather than being inferred from a
7
+ successful process exit.
8
+ """
9
+ from __future__ import annotations
10
+
11
+ import time
12
+
13
+ CASES = ("correctness", "performance", "boundary", "exception",
14
+ "readability", "security")
15
+
16
+
17
+ def _case(name, status, evidence=None, reason=""):
18
+ return {"case": name, "status": status,
19
+ "evidence": [evidence] if isinstance(evidence, dict) else [],
20
+ "reason": str(reason or "")[:300]}
21
+
22
+
23
+ def _quality_verdict(run):
24
+ verdict = run.get("verdict") or {}
25
+ for key in ("pass", "publishable", "verify_pass"):
26
+ if isinstance(verdict.get(key), bool):
27
+ return verdict.get(key), key
28
+ return None, ""
29
+
30
+
31
+ def evaluate_run(run, task=None):
32
+ """Build a deterministic acceptance result from persisted run evidence."""
33
+ run = run or {}
34
+ task = task or {}
35
+ status = str(run.get("status") or "")
36
+ verdict = run.get("verdict") or {}
37
+ out = []
38
+
39
+ correct, source = _quality_verdict(run)
40
+ if status in ("failed", "timeout", "cancelled"):
41
+ out.append(_case("correctness", "unknown",
42
+ {"source": "run.status", "value": status},
43
+ "任务终态未形成可判定的质量结论"))
44
+ elif correct is not None:
45
+ out.append(_case("correctness", "passed" if correct else "failed",
46
+ {"source": "run.verdict", "field": source,
47
+ "value": bool(correct)}))
48
+ else:
49
+ out.append(_case("correctness", "not_evaluated", reason="缺少验证或质量门证据"))
50
+
51
+ duration = run.get("duration_s")
52
+ if duration is None and run.get("started_at") and run.get("ended_at"):
53
+ duration = "recorded"
54
+ has_duration = isinstance(duration, (int, float)) and duration >= 0
55
+ has_usage = any(isinstance(run.get(key), (int, float)) and run.get(key) > 0
56
+ for key in ("tokens", "cost_usd"))
57
+ if has_duration or has_usage:
58
+ out.append(_case("performance", "passed", {
59
+ "source": "run.metrics", "duration_s": duration,
60
+ "tokens": run.get("tokens", 0), "cost_usd": run.get("cost_usd", 0),
61
+ }, "仅表示性能数据已记录,不代表达到业务阈值"))
62
+ else:
63
+ out.append(_case("performance", "not_evaluated", reason="缺少耗时或用量证据"))
64
+
65
+ boundary = verdict.get("boundary_checks")
66
+ if isinstance(boundary, list) and boundary and all(
67
+ isinstance(x, dict) and isinstance(x.get("passed"), bool) for x in boundary):
68
+ failed = [x for x in boundary if x.get("passed") is False]
69
+ out.append(_case("boundary", "failed" if failed else "passed",
70
+ {"source": "run.verdict.boundary_checks", "count": len(boundary),
71
+ "failed": len(failed)}))
72
+ else:
73
+ out.append(_case("boundary", "not_evaluated", reason="当前任务未声明边界检查证据"))
74
+
75
+ exception = verdict.get("exception")
76
+ if isinstance(exception, bool):
77
+ out.append(_case("exception", "passed" if exception else "failed",
78
+ {"source": "run.verdict.exception", "value": exception}))
79
+ elif status in ("failed", "timeout"):
80
+ out.append(_case("exception", "failed" if status in ("failed", "timeout") else "unknown",
81
+ {"source": "run.error", "status": status,
82
+ "error": str(run.get("error") or "")[:300]}))
83
+ elif status == "cancelled":
84
+ out.append(_case("exception", "unknown",
85
+ {"source": "run.status", "value": status}))
86
+ else:
87
+ out.append(_case("exception", "not_evaluated", reason="缺少独立异常处理证据"))
88
+
89
+ for name, key in (("readability", "readability"), ("security", "security")):
90
+ value = verdict.get(key)
91
+ if isinstance(value, bool):
92
+ out.append(_case(name, "passed" if value else "failed",
93
+ {"source": "run.verdict.%s" % key, "value": value}))
94
+ else:
95
+ out.append(_case(name, "not_evaluated", reason="未提供独立 %s 证据" % name))
96
+
97
+ # 总体通过要求六个维度都有明确通过证据;缺证据不能被两个局部绿灯掩盖。
98
+ return {"version": 1, "evaluated_at": time.time(),
99
+ "passed": bool(out and all(x["status"] == "passed" for x in out)),
100
+ "cases": out}