sino-bc-cli 1.8.38 → 1.8.39

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.
@@ -2,7 +2,7 @@
2
2
  "formatVersion": 1,
3
3
  "skillFormat": 3,
4
4
  "packageName": "sino-bc-cli",
5
- "version": "1.8.38",
5
+ "version": "1.8.39",
6
6
  "skills": [
7
7
  {
8
8
  "name": "sino-bc-cli",
@@ -317,30 +317,33 @@
317
317
  "sourcePath": "skills/custom/biz-line-strategy-generate",
318
318
  "entryPath": "skills/biz-line-strategy-generate/SKILL.md",
319
319
  "files": {
320
- "SKILL.md": "d7e961b2e2df03b40099a9f7467d1016f2a31fb0c3bbb5bfba1c1bc9cd301072",
320
+ "SKILL.md": "06070663049ed9610d0310fb1de2c953d9e2444c394cc98af5ba1697e05819cb",
321
321
  "references/ai-strategy-prompt.md": "f7529bbed0638de4d69fe440803bb2421cd681b528dd83665973b0557c66cde0",
322
322
  "references/api-flow.md": "c98ffddc9f5a9022cfd2f4f9046670e1c7ff2f4292ebe47c5ca8d5d17a71e243",
323
323
  "references/four-strategies.md": "3bf1cf21a378dd292068abe3fc5d041df17b11f01714eece441a41f8315c07d3",
324
324
  "references/metrics.md": "6580dd77493599b33f31b5769f0933274636b382b5d156e0b2caca1201e29f89",
325
- "references/output-excel.md": "df362020644ffe3b553c22358c434b7a8f61efc4079bf7c162ee136f16afa24a",
326
- "references/runtime.md": "74245409a2a429ff9efe177fcfa5b3660bf88a6a3863e1f630e96c4eca613079",
325
+ "references/output-excel.md": "0f19dc994440847b85049e72584be312af9ae2441638e873cf173ba1dc3ae4eb",
326
+ "references/runtime.md": "4181b50599e7c78cfa2bc3de1abee5632c44b976311a65a6dd9aa2f7add23143",
327
327
  "references/spec.md": "bc10054168404e079bb874df31ffebcd8a86372c63b925997d57e72a2699f273",
328
328
  "scripts/ai_strategy.py": "6f6e9c570e68de47ede283083cb7a66b59751aaa19e88fa1dd206fe793b31eb6",
329
- "scripts/build_report.py": "3eae8c91a980cd9bdc2edd02ad304aada07b9047c90e1162114afdec0534acdc",
329
+ "scripts/build_report.py": "5dc3eda5d086e57a89967ea3ee51021ff7948f17a7405411da6a6203dda1aa54",
330
330
  "scripts/cleanup.py": "eb1e1c338d543070623c39fa82c6908e53f30787cdb26cfdd238dca9a794b965",
331
331
  "scripts/cli_json.py": "98163f916427254f7a6826000a047271f02729172b1b9783cbfa09105c37fae3",
332
+ "scripts/detail_store.py": "0ec42fd15357df1b191786b98fa713eaa1fec5b5191c33a59debf56289e9ca14",
332
333
  "scripts/fetch_data.py": "6167313eed1fa4efa57fbdffc4cfd22e4898f049e9563b5dcb655da2ecacc5ec",
333
334
  "scripts/run_workflow.py": "cbebfa51ab59903b0307d3df5fe6217546eb7eab6bb6b036a4b4b369422eb02f",
334
335
  "scripts/strategy_output.py": "0c2bff83bf638b0a30fb22f99efc4e94774dc70fb3bbdea442dfa97964f1a215",
335
336
  "scripts/submit_tags.py": "f2ccb631a9b55d8f41420d10d978811e90792eff8815e2ba58bfcb40cc3cf53f",
336
- "scripts/summarize.py": "879ad9c9f6b5f78e6b05f4c8137d8e7207eb9926b024173d792b844e06eef942",
337
+ "scripts/summarize.py": "1bb05e3b165aedd6eba9a6c189e7a8016c5b9edcdeb19d6abe61486012e68d9c",
337
338
  "scripts/test_ai_strategy.py": "a1849975a07540dda84f23af0f784ff0041239b7fc0fc98658d7765190958b33",
338
339
  "scripts/test_cli_json.py": "06282041b783280bb4e877f37fdf09b93e2f075ed103ac409374fcd2f5837d8e",
339
340
  "scripts/test_database_output.py": "a61aefe8685b9e24e3a25e72b7d7150c34953b04486cad58b79f7b2c04977cd3",
340
- "scripts/test_pipeline.py": "aa20204f76d89c847c0e7f6a0670eb09cda02b6e4b18a1901623fe436ab17bbc",
341
+ "scripts/test_detail_store.py": "071236c8b4496ce8bb133100e6893fa05a8ac15d0c7ced675b281c3d2d411346",
342
+ "scripts/test_excel_streaming.py": "c9dfb921ba33c0bc1aa21aa5de508dd516492bbfc1cd8935663aac8cd5f093f6",
343
+ "scripts/test_pipeline.py": "0b941123c201eed04bfcf828876a45557b8928fa66eb9732e57271abdbff328e",
341
344
  "scripts/test_strategy_rules.py": "775cddbc6aa5190d23d780aceeec595eb8c35b6850484c7ab9d6dec9a862f0fe",
342
345
  "scripts/test_tag_submission.py": "18535ace32138c3c90b98ca429c5b4dd7d8320bd9c61b864b1ba96991a377252",
343
- "scripts/test_workflow.py": "05e39b53830bd49a382f9534dc3f68faa3e93d8e29acab9bf3f354b86b8cb3f4"
346
+ "scripts/test_workflow.py": "c5c62147f91df7b0c3ee97541a69a112b99e10eba6ea18211db08080856ce211"
344
347
  }
345
348
  },
346
349
  {
@@ -12,6 +12,8 @@ metadata:
12
12
 
13
13
  本技能随 CLI 安装,需要 Python 3。复用现有业务线、广告成效与 AI 策略接口,按固定分析规则和 Excel 模板生成四大策略与 learning,默认拉数和AI各最多3条、全流程合计最多6条滑动在途。每条独立导出一份 Excel(依次为 `策略`、`明细`、`AI策略` 三张表),校验成功后清理本次其他临时文件。AI 策略由执行本技能的 Agent 只读取独立提示词及本条明细-only 工作簿后撰写,脚本不代写投放分析。执行入口与参数见下方「Agent 流程」。
14
14
 
15
+ 明细准备完成后逐行落盘,Excel 导出和完整回读使用流式处理,等待标签或 AI 时只保留明细引用。此优化不消除分析阶段单维度聚合的内存占用,也不约束宿主 Agent 自行解析 Excel 的方式;临时数据和索引规则见 [`references/runtime.md`](references/runtime.md)。
16
+
15
17
  输出默认 `excel`(桌面,可指定目录)。用户明确说“写入数据库/入库/保存到平台”时用 `database`:在临时目录生成 Excel,通用上传成功后删除本次 Excel,将 `storageKey` 与策略一起保存。不可生成时只保存具体状态和原因,不制造空 Excel。
16
18
 
17
19
  **开始前 MUST 先读 [`../sino-bc-shared/SKILL.md`](../sino-bc-shared/SKILL.md)**。业务线查询先读 [biz-line](../sino-bc-cli/domains/sino-bc-biz-line/SKILL.md),维度与成效查询前读 [biz-line-metrics](../sino-bc-cli/domains/sino-bc-biz-line-metrics/SKILL.md),数据库保存前读 [biz-line-ai-strategy](../sino-bc-cli/domains/sino-bc-biz-line-ai-strategy/SKILL.md)。
@@ -61,3 +61,9 @@ AI策略 sheet 与前两张表统一使用共享字符串(单元格 `t="s"`
61
61
  四类策略顶部总结分别采用 four-strategies.md 中各自结构。维度标题与行首渠道名称采用 sharedStrings 富文本run的b属性加粗,正文保持纯文字;枚举及数据逐行显示。策略超出Excel单行可见高度时仍保存完整文本在原单元格,保留自动换行、调整列宽和行高;达到行高上限后可通过编辑栏查看全文,禁止拆业务线行或截断正文。超过单元格32767字符硬限制时明确报错,不拆行或丢字。入库使用未分页的完整正文。
62
62
 
63
63
  策略展示统一规则:占比差值仍按本期占比减上期占比计算,显示为带符号的百分数(例如 -1.7%),不写“个百分点”。四类策略及总结仅展示本次实际广告账号所属渠道(用户指定账号时以覆盖后的账号为准);无账号渠道不展示,有账号但零消耗的渠道不得因此隐藏。learning 的说明中,动作/原因与后续 KPI 数据之间换行;第一张表保留结论与说明;数据库仅保存 AI sheet 末段 Learning 冒号后的正文并保留内部换行。
64
+
65
+ ## 流式处理与诊断输入
66
+
67
+ 正常工作流从落盘明细逐行生成 worksheet,并将共享字符串索引放在本条任务目录;仍使用原生 sharedStrings、富文本和原有布局。完整回读从成品重新建立私有字符串索引,逐行逐格对比全部内容,检查行列数量、XML 和 ZIP,不以抽样替代。AI 八列回读仅保留它实际引用的字符串,仍扫描共享字符串至文件结束。
68
+
69
+ 诊断入口 `build_report.py` 兼容旧 JSON 的 `details` 数组,也支持 `detailSource` 引用;文件输入的引用相对输入文件目录,stdin 输入相对当前目录。两种明细表示不能同时出现,新引用损坏时不回退。旧内嵌数组需要整份 JSON 解析,因此不承诺正常工作流的内存上界。Agent 继续使用 `run_workflow.py`,不要手工改写临时输入。
@@ -11,6 +11,14 @@
11
11
  - 列表行为 `data.result`,项目为 `data` 数组,维度/成效为 `data.data` 和 `data.total`。分页 `size=1000`、`PAGE_CAP=200`;总数未取全、提前空页、失败或总数变化均中止该条,不导出部分成功文件。
12
12
  - 维度/成效每一页 MUST 直写 `bl-<id>/<stem>.pN.out.json`。拉数在内存中只保留当前页和行数累计,成功后才写 `<stem>.pages.json`(`total` / `pages` / `counts`)。开始前若已有本 stem 的 `pages.json` 必须先删掉。MUST NOT 把各页 `extend` 成全表再写 `merged.json`。汇总按 `pages.json` 逐页 yield,占比/比率/覆盖日期一次扫描,不得为分析再拼全表 list。无索引却有 `p2` 及之后页时失败。清单校验只对索引上的 `total`/`counts`,不得为校验再整表加载。失败页 MUST NOT 写下完整 `pages.json`。
13
13
 
14
+ ## 明细落盘与内存边界
15
+
16
+ 固定分析将明细逐行写入本条目录的 `details-<随机标识>.jsonl`,完整关闭后才发布文件。`payload.json` 保存策略摘要及 `detailSource`:`version=1`、相对本文件目录的 `path`、准确的 `count`。各导出和校验阶段重新打开明细,逐行读取并检查总数;等待阶段不保留完整明细或打开的生成器。引用损坏、越出目录、计数不符或行内容损坏均失败,不静默使用旧数据。
17
+
18
+ Excel 共享字符串使用本条目录内私有 `.excel-index-*` SQLite 索引和有界缓存;连接、文件和生成器关闭后再清理,不跨业务线共享索引,也不新增全局锁。磁盘或索引失败沿用既有阶段失败规则,不回退全量内存处理。所有副产物仍归本条目录管理,清理失败报告残留。
19
+
20
+ 该机制降低明细导出、完整回读和等待阶段的内存占用;固定分析的单维度聚合仍随该维度规模增长,宿主 Agent 自行加载工作簿的内存另计。并发、标签/AI 超时重试、发布与保存结果未知的规则保持不变。
21
+
14
22
  ## 阶段交接与有限预取
15
23
 
16
24
  拉数阶段包括业务线/项目预检、渠道分页取数和固定统计;进入 `wait_ai_slot` 时立即归还拉数名额,并等待本条AI阶段名额。等待者占总在途名额及自己的目录,不能让调度器无限继续拉数。默认三个AI名额占满后,最多另外三条拉数或持有已准备数据等待;总在途达到六条即暂停新增。