[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80193":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":11,"openIssues":13,"contributorsCount":13,"subscribersCount":13,"size":13,"stars1d":13,"stars7d":13,"stars30d":13,"stars90d":13,"forks30d":13,"starsTrendScore":13,"compositeScore":14,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":15,"fork":15,"defaultBranch":16,"hasWiki":17,"hasPages":15,"topics":18,"createdAt":9,"pushedAt":9,"updatedAt":19,"readmeContent":20,"aiSummary":21,"trendingCount":13,"starSnapshotCount":13,"syncStatus":22,"lastSyncTime":23,"discoverSource":24},80193,"TAAC2026-CLI","ZhongKuang\u002FTAAC2026-CLI","ZhongKuang","Agent-friendly CLI for scraping, comparing, archiving, and safely submitting TAAC2026 \u002F Taiji experiments.",null,"JavaScript",78,6,0,39.54,false,"main",true,[],"2026-06-12 04:01:27","# TAAC2026 CLI\n\n[English](README.en.md)\n\n把 Taiji \u002F TAAC 训练与评估平台变成任何人和任何 agent 都能读取、比较、归档、提交训练、发布模型和收集线上评估证据的实验命令行工具。\n\nTAAC2026 CLI 面向 `https:\u002F\u002Ftaiji.algo.qq.com\u002Ftraining`、`\u002Fmodel` 和 `\u002Fevaluation`：它可以抓取训练任务、指标、日志、checkpoint、代码文件，比较两个 `config.yaml` 的语义差异，发布 checkpoint 为模型，创建\u002F停止\u002F抓取评估任务，并通过已捕获的 Taiji API 流程准备、上传、创建和启动训练任务。所有本地产物默认收进 `outputs\u002Ftaiji-output\u002F`，不会把根目录弄得一团乱。\n\n`SKILL.md` 是通用 agent 操作手册：Codex、Claude Code、OpenAI Agents SDK、Cursor、Aider，或者任何能读仓库文件并运行 shell 的 agent，都可以按它来使用本 CLI。\n\n## 给 Agent 一键安装\n\n直接把这段话发给你的 agent：\n\n```text\n请安装并使用这个通用 agent CLI：\nhttps:\u002F\u002Fgithub.com\u002FZhongKuang\u002FTAAC2026-CLI.git\n\n安装后请运行 npm install。需要全局 CLI 时运行 npm link。\n需要浏览器模式时再安装 Chromium：\nnpx playwright install chromium\n```\n\n手动安装：\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FZhongKuang\u002FTAAC2026-CLI.git\ncd TAAC2026-CLI\nnpm install\nnpm link\nnpx playwright install chromium\n```\n\n之后可以直接运行：\n\n```bash\ntaac2026 --help\n```\n\n如果当前仓库已经内置了本工具，可以直接进入 `.codex\u002Fskills\u002Ftaac2026-cli\u002F` 后运行 `npm install`，或从仓库根目录用 `node .codex\u002Fskills\u002Ftaac2026-cli\u002Fbin\u002Ftaac2026.mjs ...`。\n\n## 痛点：训练平台不该占用你的工作记忆\n\n每天早上醒来，第一反应不该是打开官网、点进一个个实例、手动检查训练曲线。但现实常常是这样：metric 一多，就要拖着鼠标在页面里上下滑，逐个找 AUC、logloss、valid\u002Ftest-like 指标；刚记住一个实例的数值，切到下一个实例准备对比，前一个又忘了，只好再回去重复打开。\n\n训练报错也一样折磨人。你要点进实例、打开 logs、复制粘贴，再解释这次跑的是哪份代码、哪个 commit、哪个 config。agent 如果拿不到日志、代码和配置的稳定快照，就只能靠你转述，很难真正定位问题。\n\n更糟的是提交训练本身也容易出错。好不容易写了一版不错的代码，上传时却可能传错 zip、忘了换 config、只改了标题没改超参数，白白跑几个 epoch 才发现。于是每次提交都变成一场小心翼翼的人工仪式。\n\n最关键的是，训练产出的 metric 明明应该交给 agent 跨实例分析，却常常只能靠人脑短时记忆做比较。TAAC2026 CLI 的目的就是把这些“页面劳动”变成可归档、可比较、可自动化的实验数据流。\n\n## 我们能解决什么\n\n| 痛点 | TAAC2026 CLI 怎么解决 |\n| --- | --- |\n| 每天手动点开多个实例看曲线 | 批量抓取 Job、实例、checkpoint 和 metrics，输出 `jobs.json`、`all-metrics-long.csv`、`all-checkpoints.csv`。 |\n| metric 多了以后只能靠鼠标滑动和人脑记忆对比 | 把指标转成长表，保留 `jobId + instanceId + metric + step`，让 agent 可以一次性跨 Job \u002F Run 做排序、对比和总结。 |\n| 同一个 Job 多次 Run 容易混在一起 | 用 `jobId + instanceId` 区分每次运行，避免“这个 AUC 到底是哪次跑出来的”。 |\n| 报错后需要手动复制日志，再口头解释代码版本 | 自动归档 Pod log、Job detail、训练代码文件和 `config.yaml`，让 agent 拿着完整现场排查。 |\n| 对比两个实验配置时只能肉眼扫 YAML | `compare-config-yaml.mjs` 做语义 diff，按配置路径报告新增、删除和变化项。 |\n| 上传训练容易传错 zip \u002F config \u002F run.sh \u002F 标题和说明 | `prepare-taiji-submit.mjs` 先生成提交包和 manifest，记录 Job Name、Description、Git HEAD、dirty 状态和待上传文件。 |\n| 想自动提交但又怕误启动训练 | `submit-taiji.mjs` 默认 dry-run；真实创建必须显式 `--execute --yes`，启动必须额外 `--run`。 |\n| 线上评估分、infer 代码和失败日志只能在网页里看 | `eval scrape` 把 evaluation 任务、线上 AUC、event log 和 inference 代码一起归档。 |\n| 工具产物散落根目录，越用越乱 | 所有本地产物默认写入 `outputs\u002Ftaiji-output\u002F`，包括浏览器 profile、抓取结果、提交包、dry-run\u002Flive 结果和 config diff。 |\n\n## 它让 Agent 可以做什么\n\n- 一键抓取最近所有训练，把实验指标整理成可分析表格。\n- 帮你回答“这一版到底比上一版强在哪里，弱在哪里”。\n- 结合 Job 描述、config diff、日志和曲线，定位训练报错或指标异常。\n- 在提交前检查本次 zip\u002Fconfig\u002Frun.sh\u002Fname\u002Fdescription 是否和 manifest 一致。\n- 复用一个稳定模板 Job，自动替换 `code.zip`、`config.yaml`，并可显式覆写 `run.sh` 后按需启动训练。\n- 把训练 checkpoint 发布成模型，再创建评估任务，并把线上评估分、infer 代码和 event log 拉回本地。\n- 把平台页面里的短暂信息沉淀成长期可复盘的实验资产。\n\n## 工具地图：目前有哪些命令\n\n这些命令的定位是“收集证据、减少误操作、打通流程”。它们不会替你拍脑袋决定哪个实验最好，但会把做判断需要的上下文一次性整理出来。\n\n| 命令 | 能做什么 | 常见用途 |\n| --- | --- | --- |\n| `scrape` | 抓 Job 列表、实例、metrics、checkpoint、日志和训练代码；支持全量、增量、单 Job 定向抓取。 | 每天同步平台实验；失败后把日志和代码现场拉回本地。 |\n| `diff-config` | 语义比较两个 YAML，不受字段顺序和格式影响。 | 快速确认两版 `config.yaml` 到底改了哪些参数。 |\n| `prepare-submit` | 准备本地提交包，记录上传文件、Job Name、Description、Git HEAD 和 dirty 状态。 | 提交前把“打算上传什么”固化成 manifest。 |\n| `submit` | dry-run 或 live 执行复制模板 Job、上传 trainFiles、创建 Job、可选 Run。 | 自动提交训练；默认安全预演，live 需要 `--execute --yes`。 |\n| `submit doctor` | 检查提交包结构、文件 hash 和 manifest。 | 提交前防止 zip\u002Fconfig\u002Frun.sh 或说明信息错位。 |\n| `submit verify` | 回读平台 trainFiles，和本地提交包做 hash \u002F config 对齐。 | 提交后确认平台实际收到的就是本地这版。 |\n| `compare jobs` | 把多个 Job 的描述、状态、best\u002Ffinal 指标和人工分整理成证据表。 | 少读 CSV，快速看一组实验的横向差异。 |\n| `compare-runs` | 对比 base 与 exp，合并 config diff、指标差异和 checkpoint 候选。 | 判断“一次改动”带来的曲线变化，但不替你做最终决策。 |\n| `config diff-ref` | 用本地 config 对齐某个明确 Job 的平台配置。 | 检查当前配置是否和某个线上实验一致。 |\n| `ledger sync` | 从抓取结果同步结构化实验账本。 | 长期沉淀实验记录，方便复盘。 |\n| `logs` | 从已抓日志中抽取 Error \u002F Traceback 和尾部上下文。 | 快速定位失败原因，减少复制粘贴日志。 |\n| `diagnose job` | 汇总失败 Job 的状态、日志、配置和代码线索。 | 把“为什么挂了”变成 agent 可读的诊断包。 |\n| `ckpt-select` | 按显式规则列出 checkpoint 候选，例如 `valid_auc` 或 pareto。 | 找候选 checkpoint，避免手动翻曲线。 |\n| `ckpt-publish` | 把训练 checkpoint 发布成 Taiji 模型；默认 dry-run，live 需确认。 | 从训练流程串到模型管理页。 |\n| `model list` | 查询已发布模型，支持搜索。 | 找到要用于评估的模型 ID 和来源 Job。 |\n| `eval create` | 创建评估任务；支持 `--submit-name` 从本地 `outputs\u002Fsubmit\u002F*\u002F\u003Cname>\u002Finference_code` 上传推理包。 | 把“发布模型 -> 提交 infer -> 创建评估”串起来。 |\n| `eval list` | 查看评估任务状态和分数。 | 跟踪 infer 是否成功、AUC 是否出来。 |\n| `eval scrape` | 翻页抓评估任务、分数，并可下载 event log 与 inference 代码文件。 | 把线上 test AUC、infer 代码和失败\u002FEDA 日志拉成本地证据包。 |\n| `eval stop` | 停止评估任务；默认 dry-run，live 需确认。 | 停掉误提交或不想继续占资源的评估。 |\n\n`evaluation` 是 `eval` 的别名；文档统一使用 `eval`。\n\n## 产物地图\n\n| 产物 | 内容 |\n| --- | --- |\n| `outputs\u002Ftaiji-output\u002Ftraining\u002Fjobs.json` | 完整原始和归一化 Job \u002F instance \u002F metric \u002F code 元数据。 |\n| `outputs\u002Ftaiji-output\u002Ftraining\u002Fjobs-summary.csv` | 一行一个 Job，适合快速 grep、排序和人工浏览。 |\n| `outputs\u002Ftaiji-output\u002Ftraining\u002Fall-metrics-long.csv` | 长表 metrics，保留 `jobId + instanceId + metric + step`。 |\n| `outputs\u002Ftaiji-output\u002Ftraining\u002Fall-checkpoints.csv` | checkpoint 名称、指标、发布状态和来源实例。 |\n| `outputs\u002Ftaiji-output\u002Ftraining\u002Flogs\u002F\u003CjobId>\u002F\u003CinstanceId>.txt` | Pod 日志文本。 |\n| `outputs\u002Ftaiji-output\u002Ftraining\u002Fcode\u002F\u003CjobId>\u002Ffiles\u002F...` | 平台 trainFiles 下载副本。 |\n| `outputs\u002Ftaiji-output\u002Ftraining\u002Fcode\u002F\u003CjobId>\u002Fjob-detail.json` | Job detail 原始响应和 trainFiles 元数据。 |\n| `outputs\u002Ftaiji-output\u002Freports\u002Fconfig-diffs\u002F` | config 语义 diff 输出。 |\n| `outputs\u002Ftaiji-output\u002Fsubmit\u002Fbundle\u002F` | 本地准备好的提交包和 manifest。 |\n| `outputs\u002Ftaiji-output\u002Fsubmit\u002Flive\u002F\u003Ctimestamp>\u002F` | live submit \u002F run 的请求计划和响应。 |\n| `outputs\u002Ftaiji-output\u002Fevaluation\u002Fevaluations\u002F` | 评估任务汇总、线上分数、event log 和 inference 代码文件。 |\n| `outputs\u002Ftaiji-output\u002Freports\u002F` | compare、diagnose、model、eval 等命令的 JSON \u002F Markdown 报告。 |\n| `outputs\u002Ftaiji-output\u002Fsecrets\u002F` | Cookie 或 headers 的推荐存放位置，永远不要提交。 |\n\n## 快速开始\n\n把浏览器里已经登录成功的 Cookie 保存到：\n\n```text\noutputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt\n```\n\n抓取全部训练任务：\n\n```bash\ntaac2026 scrape --all --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt --headless\n```\n\n增量同步会完整扫描 Job list，但对本地已有、终态、且 `updateTime\u002Fstatus\u002FjzStatus` 没变的 Job 跳过 detail、代码、实例、metric 和 log 的深拉：\n\n```bash\ntaac2026 scrape --all --incremental --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt --direct\n```\n\n只核查某个 Job 的详情、代码文件和指标时，可以按平台内部 ID 定向抓取：\n\n```bash\ntaac2026 scrape --all --job-internal-id 56242 --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt --direct\n```\n\n服务器上 Chromium 不稳定时，用后端直连模式：\n\n```bash\ntaac2026 scrape --all --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt --direct\n```\n\n比较两个配置：\n\n```bash\ntaac2026 diff-config old-config.yaml new-config.yaml\ntaac2026 diff-config old-config.yaml new-config.yaml --json --out diff.json\n```\n\n`--out diff.json` 会写到 `outputs\u002Ftaiji-output\u002Freports\u002Fconfig-diffs\u002Fdiff.json`，不会掉到根目录。\n\n## 日常实验工具\n\n这些工具只整理证据和拦截低级错误，不替你决定哪个实验更值得提交。\n\n提交前检查 bundle：\n\n```bash\ntaac2026 submit doctor --bundle outputs\u002Ftaiji-output\u002Fsubmit\u002Fbundle\n```\n\n提交后回读平台文件，确认平台实际 `code.zip\u002Fconfig.yaml\u002Frun.sh` 和本地 bundle 一致：\n\n```bash\ntaac2026 scrape --all --job-internal-id 56242 --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt --direct\ntaac2026 submit verify --bundle outputs\u002Ftaiji-output\u002Fsubmit\u002Fbundle --job-internal-id 56242\n```\n\n跨实验整理指标、描述里的人工 test 分、valid\u002Ftest-like 曲线证据：\n\n```bash\ntaac2026 compare jobs 56242 58244 --json\n```\n\n对比一个 base 和一个实验 Job，合并 config diff、best\u002Ffinal 指标差异、同向性和候选 checkpoint 规则结果：\n\n```bash\ntaac2026 compare-runs --base 58244 --exp 56242 --config --metrics --json\n```\n\n比较当前配置和某个明确 Job 的平台配置，不做“最高分对齐”假设：\n\n```bash\ntaac2026 config diff-ref --config config.yaml --job-internal-id 56242 --json\n```\n\n同步结构化实验账本，或诊断失败 Job：\n\n```bash\ntaac2026 ledger sync\ntaac2026 diagnose job --job-internal-id 56242 --json\n```\n\n快速抽取错误日志，或按明确指标规则列出 checkpoint 候选：\n\n```bash\ntaac2026 logs --job 60414 --errors --tail 100 --json\ntaac2026 ckpt-select --job 56242 --by valid_auc --json\n```\n\n把指定训练 checkpoint 发布成模型。默认 dry-run，只生成计划；真正发布必须显式 `--execute --yes`。默认模型名为 `\u003CJob Name> epoch\u003CN> val auc \u003CAUC>`，描述复用 Job Description。若缓存里目标 checkpoint 已经是发布态，live 发布会被拦住，除非额外传 `--force`，避免重复创建模型。\n\n```bash\ntaac2026 ckpt-publish --job 56242 --ckpt \"global_step7236.epoch=4.AUC=0.865213.Logloss=0.273911.best_model\" --json\ntaac2026 ckpt-publish --job 56242 --by valid_auc --json\ntaac2026 ckpt-publish --job 56242 --ckpt \"global_step7236.epoch=4.AUC=0.865213.Logloss=0.273911.best_model\" --instance-id 95cdb4769de33483019df8ac5f843305 --json\ntaac2026 ckpt-publish --job 56242 --ckpt \"global_step7236.epoch=4.AUC=0.865213.Logloss=0.273911.best_model\" --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt --execute --yes --json\n```\n\n查看已发布模型，创建或停止评估任务。`eval create` 默认 dry-run。推荐用 `--submit-name` 从本地 `outputs\u002Fsubmit\u002F\u003C日期>\u002F\u003C提交包名>\u002Finference_code` 里找到打包机已经整理好的推理代码，并上传该目录第一层所有文件。`--file-dir` 是手动兜底路径，默认只打包 `dataset.py`、`dense_transform.py`、`eda.py`、`infer.py`、`model.py` 这几个直接文件，避免误把仓库根目录杂物传上去。真实创建必须显式 `--execute --yes`。\n\n```bash\ntaac2026 model list --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt --search \"V1.4.6\" --out model-list.json\ntaac2026 eval create --model-id 29132 --creator ams_2026_1029735554728157691 --submit-name V1.4.6_fusion_time_item_dense_main7683bde --out eval-create.json\ntaac2026 eval create --model-name \"1.4.6 epoch\" --submit-name V1.4.6_fusion_time_item_dense_main7683bde --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt --out eval-create.json\ntaac2026 eval create --model-search \"1.4.6\" --submits-root .\u002Foutputs\u002Fsubmit --submit-name V1.4.6_fusion_time_item_dense_main7683bde --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt --out eval-create.json\ntaac2026 eval list --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt --page-size 20 --out eval-list.json\ntaac2026 eval scrape --task-id 62726 --logs --code --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt --out eval-scrape.json\ntaac2026 eval create --model-id 29132 --creator ams_2026_1029735554728157691 --submit-name V1.4.6_fusion_time_item_dense_main7683bde --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt --execute --yes --out eval-create-live.json\ntaac2026 eval stop --task-id 62362 --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt --execute --yes --out eval-stop-live.json\n```\n\n`eval create` 还支持 `--image-name`、`--include-all-files` 等低频选项；`--include-all-files` 会上传目录第一层所有文件，使用前应明确确认。`model list`、`eval create\u002Flist\u002Fstop` 默认打印 JSON；传 `--out xxx.json` 时会按类型写入 `outputs\u002Ftaiji-output\u002Freports\u002Fmodel\u002F` 或 `outputs\u002Ftaiji-output\u002Freports\u002Fevaluation\u002F`。\n\n`eval scrape` 会写入 `outputs\u002Ftaiji-output\u002Fevaluation\u002Fevaluations\u002Feval-summary.csv`、`eval-tasks.json`、`logs\u002F\u003CevalTaskId>.txt` 和 `code\u002F\u003CevalTaskId>\u002Ffiles\u002F...`。它只抓证据，不创建或启动评估任务。`--out-dir` 是显式输出目录：默认是 `outputs\u002Ftaiji-output\u002Fevaluation\u002Fevaluations\u002F`；如果写 `--out-dir foo`，会写到当前目录下的 `foo`，不是自动变成 `outputs\u002Ftaiji-output\u002Ffoo`。推荐自定义时写成 `--out-dir outputs\u002Ftaiji-output\u002Fevaluation\u002Fevaluations-\u003Cname>`。\n\n## 自动提交训练\n\n提交链路分两层：先准备，再执行。默认只 dry-run，不会误上传、误创建、误启动。\n\n### 推荐提交包形态\n\n公开版推荐使用最简单、最稳定的 Taiji trainFiles 形态：\n\n```text\ncode.zip\nrun.sh\nconfig.yaml\n```\n\n- `code.zip` 放项目代码，由你的仓库脚本或 agent 打包生成。\n- `run.sh` 是平台入口，负责解压\u002F定位代码并读取 `config.yaml` 启动训练。\n- `config.yaml` 放本次实验参数。\n\n本仓库提供了一个不含真实代码的最小示例：\n\n```text\nexamples\u002Fminimal-taiji-submit\u002F\n  code\u002F\n  run.sh\n  config.yaml\n```\n\n你的 agent 可以参考这个形态打包：把项目代码放进 `code.zip`，把实验参数写入 `config.yaml`，用 `run.sh` 作为统一入口。自动提交脚本默认替换 `code.zip` 和 `config.yaml`；如果传入 `--run-sh .\u002Frun.sh`，也会显式覆写模板里的同名 `run.sh`。模板 Job 里必须已有这些同名 trainFiles；只有明确加 `--allow-add-file` 时才允许新增。\n\n如果别人的模板不是 zip 形态，而是散文件，例如 `main.py + dataset.py + run.sh`，也可以用通用文件适配：\n\n```bash\ntaac2026 prepare-submit \\\n  --template-job-url \"https:\u002F\u002Ftaiji.algo.qq.com\u002Ftraining\u002F...\" \\\n  --file-dir \".\u002Ftaiji-files\" \\\n  --name \"loose_files_exp\"\n```\n\n`--file-dir` 只扫描目录第一层文件；自动识别 `code.zip`、`config.yaml`、`run.sh`，其他第一层文件都会进入 generic trainFiles。比如目录里有：\n\n```text\ntaiji-files\u002F\n  dataset.py\n  model.py\n  ns_groups.json\n  run.sh\n  train.py\n  trainer.py\n  utils.py\n```\n\n就会准备覆写同名 `run.sh`，以及 `dataset.py\u002Fmodel.py\u002Fns_groups.json\u002Ftrain.py\u002Ftrainer.py\u002Futils.py` 这些散文件。子目录会被忽略，避免不小心把项目目录整体传上去。\n\n也可以单独列文件：\n\n```bash\ntaac2026 prepare-submit \\\n  --template-job-url \"https:\u002F\u002Ftaiji.algo.qq.com\u002Ftraining\u002F...\" \\\n  --zip \".\u002Foutputs\u002Fsubmit\u002F0505\u002FV1.4.0\u002Fcode.zip\" \\\n  --config \".\u002Foutputs\u002Fsubmit\u002F0505\u002FV1.4.0\u002Fconfig.yaml\" \\\n  --run-sh \".\u002Foutputs\u002Fsubmit\u002F0505\u002FV1.4.0\u002Frun.sh\" \\\n  --file \".\u002Fmain.py\" \\\n  --file \".\u002Flocal_dataset.py=dataset.py\" \\\n  --name \"v1.4.0_mixed_files\"\n```\n\n`--file .\u002Fmain.py` 会按 basename 替换模板里的 `main.py`；`--file .\u002Flocal_dataset.py=dataset.py` 会把本地文件上传后替换模板里的 `dataset.py`。`code.zip`、`config.yaml`、`run.sh` 是一等文件名，不能通过 `--file` 传，必须使用 `--zip`、`--config`、`--run-sh`，或让 `--file-dir` 自动识别。\n\n准备一个提交包：\n\n```bash\ntaac2026 prepare-submit \\\n  --template-job-url \"https:\u002F\u002Ftaiji.algo.qq.com\u002Ftraining\u002F...\" \\\n  --zip \".\u002Foutputs\u002Fsubmit\u002F0505\u002FV1.4.0\u002Fcode.zip\" \\\n  --config \".\u002Foutputs\u002Fsubmit\u002F0505\u002FV1.4.0\u002Fconfig.yaml\" \\\n  --run-sh \".\u002Foutputs\u002Fsubmit\u002F0505\u002FV1.4.0\u002Frun.sh\" \\\n  --name \"v1.4.0_item_reinit\" \\\n  --description \"item id reinit + dense transform\" \\\n  --run\n```\n\n不传 `--run-sh` 时会沿用模板 Job 里的旧 `run.sh`。\n\n它会写入：\n\n```text\noutputs\u002Ftaiji-output\u002Fsubmit\u002Fbundle\u002F\n  manifest.json\n  NEXT_STEPS.md\n  files\u002Fcode.zip\n  files\u002Fconfig.yaml\n  files\u002Frun.sh        # 仅在传入 --run-sh 时存在\n  files\u002Fgeneric\u002F...   # 仅在传入 --file 或 --file-dir 发现散文件时存在\n```\n\n生成 dry-run 提交计划：\n\n```bash\ntaac2026 submit \\\n  --bundle outputs\u002Ftaiji-output\u002Fsubmit\u002Fbundle \\\n  --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt \\\n  --template-job-internal-id \u003CTEMPLATE_JOB_INTERNAL_ID>\n```\n\n真实上传并创建 Job：\n\n```bash\ntaac2026 submit \\\n  --bundle outputs\u002Ftaiji-output\u002Fsubmit\u002Fbundle \\\n  --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt \\\n  --template-job-internal-id \u003CTEMPLATE_JOB_INTERNAL_ID> \\\n  --execute --yes\n```\n\n上传、创建并启动训练：\n\n```bash\ntaac2026 submit \\\n  --bundle outputs\u002Ftaiji-output\u002Fsubmit\u002Fbundle \\\n  --cookie-file outputs\u002Ftaiji-output\u002Fsecrets\u002Ftaiji-cookie.txt \\\n  --template-job-internal-id \u003CTEMPLATE_JOB_INTERNAL_ID> \\\n  --execute --yes --run\n```\n\n只有用户明确要启动训练时才加 `--run`；普通上传验证先用上一段 create-only 命令。\n\n如果模板 Job 里没有同名 `code.zip`、`config.yaml`，或在传入 `--run-sh` \u002F `--file` \u002F `--file-dir` 时没有对应同名 trainFile，脚本会默认报错，避免旧文件和新文件同时存在。只有明确要新增 trainFiles 时才加：\n\n```bash\ntaac2026 submit ... --execute --yes --allow-add-file\n```\n\n## 安全默认值\n\n- Cookie、headers 建议放在 `outputs\u002Ftaiji-output\u002Fsecrets\u002F`，HAR 和分析证据放在 `outputs\u002Ftaiji-output\u002Freports\u002F`，不要提交。\n- 所有脚本默认按类型把本地产物写到 `outputs\u002Ftaiji-output\u002Ftraining\u002F`、`evaluation\u002F`、`submit\u002F` 或 `reports\u002F`。\n- 相对输出路径不能包含 `..`；如果确实要写到外部位置，请使用绝对路径。\n- `eval scrape --out-dir` 是显式目录参数；默认是 `outputs\u002Ftaiji-output\u002Fevaluation\u002Fevaluations\u002F`，自定义时推荐仍写在 `outputs\u002Ftaiji-output\u002Fevaluation\u002F` 下。\n- `submit-taiji.mjs` 默认 dry-run。\n- 真实平台写操作必须显式加 `--execute --yes`。\n- 启动训练必须额外显式加 `--run`。\n- `ckpt-publish --force`、`submit --allow-add-file`、`eval create --include-all-files` 都需要额外确认。\n- 脚本会保留模板 Job 的环境、镜像和入口；默认严格替换模板中已有的 `code.zip` 和 `config.yaml`，传入 `--run-sh` 时才严格替换同名 `run.sh`，传入 `--file` 或 `--file-dir` 时才严格替换对应通用文件。\n\n## 输出目录\n\n```text\noutputs\u002Ftaiji-output\u002F\n  training\u002F\n    jobs.json\n    jobs-summary.csv\n    all-checkpoints.csv\n    all-metrics-long.csv\n    browser-profile\u002F\n    code\u002F\u003CjobId>\u002F\n    logs\u002F\u003CjobId>\u002F\n  evaluation\u002F\n    evaluations\u002F\n      eval-summary.csv\n      eval-tasks.json\n      code\u002F\u003CevalTaskId>\u002F\n      logs\u002F\u003CevalTaskId>.txt\n  submit\u002F\n    bundle\u002F\n    bundles\u002F\n    live\u002F\u003Ctimestamp>\u002F\n    local\u002F\n    notes\u002F\n    runs\u002F\n  reports\u002F\n    checkpoint\u002F\n    compare\u002F\n    config-diffs\u002F\n    diagnose\u002F\n    evaluation\u002F\n    ledger\u002Fexperiments.json\n    logs\u002F\n    model\u002F\n    smoke\u002F\n    submit\u002F\n  secrets\u002F\n```\n\n推荐在业务仓库里加入：\n\n```gitignore\noutputs\u002Ftaiji-output\u002F\n```\n\n## 什么时候使用\n\n适合这些场景：\n\n- 想让 agent 总结一批 Taiji Job 的训练指标。\n- 想比较两个实验版本的 `config.yaml`。\n- 想把每个 Job 的代码、日志、checkpoint 和指标归档起来。\n- 想用一个已成功的模板 Job 自动提交下一组代码和配置。\n- 想让 agent 先整理历史实验的证据，再由人和 agent 共同判断下一步策略。\n\n不适合这些场景：\n\n- Cookie 已经过期或被出口 IP \u002F 浏览器指纹绑定。\n- 平台接口发生变化且没有新的 DevTools 请求样本。\n- 需要完全无人工确认地消耗线上训练资源。\n\n## 脚本清单\n\n| 脚本 | 用途 |\n| --- | --- |\n| `bin\u002Ftaac2026.mjs` \u002F `taac2026` | 统一 CLI 入口，分发到下列子命令 |\n| `scripts\u002Fscrape-taiji.mjs` | 抓取 Job、实例、指标、日志、checkpoint、代码文件 |\n| `scripts\u002Fcompare-config-yaml.mjs` | 语义比较两个 YAML 配置 |\n| `scripts\u002Fprepare-taiji-submit.mjs` | 准备本地提交包，记录 Git 状态和上传文件 |\n| `scripts\u002Fsubmit-taiji.mjs` | dry-run 或显式执行 Taiji 上传、创建、Run 流程 |\n| `scripts\u002Fexperiment-tools.mjs` | 提交前检查、提交后回读校验、实验对比、账本同步、日志诊断、checkpoint 选择与发布 |\n| `scripts\u002Fevaluation-tools.mjs` | 模型列表、评估创建 dry-run \u002F live、评估列表、评估证据抓取和停止 |\n\n## 故障判断\n\n- `401` \u002F `403`：Cookie 过期、缺失，或登录态绑定了出口环境。\n- Playwright 失败但 `--direct` 成功：优先用 `--direct`。\n- 两种模式都 `401`：先在同一机器上测试完整 `Copy as cURL`。\n- Job 有实例但指标为空：可能是任务失败、实例未产出 metrics，或平台响应结构变化。\n- 代码文件下载失败：先看 `code\u002F\u003CjobId>\u002Fjob-detail.json` 和 `train-files.json`。脚本会优先把 `trainFiles[].path` 当 COS key，用 federation token 下载；如果拿到平台前端 HTML、zip 魔数不对、`config.yaml` 不是 mapping，或大小不匹配，会标为失败而不是悄悄保存假文件。\n\n## 开发验证\n\n```bash\nnpm run check\nnpm run test\n```\n\n`check` 会对所有 bundled scripts 执行 `node --check`；`test` 会跑提交安全和输出路径的小型行为测试。\n","TAAC2026 CLI 是一个专为 Taiji\u002FTAAC 训练与评估平台设计的命令行工具，旨在简化实验数据的抓取、比较、归档和提交过程。其核心功能包括批量抓取训练任务及其相关指标、日志等信息，自动归档代码文件及配置，支持实验配置文件的语义差异对比，并提供安全的训练任务提交机制。此外，该工具还允许用户通过已捕获的 Taiji API 流程轻松准备、上传并启动新的训练任务。它非常适合需要频繁访问和管理多个训练实例的研究人员或开发者使用，在提高工作效率的同时减少了手动操作可能带来的错误。所有本地生成的数据默认保存在 `outputs\u002Ftaiji-output\u002F` 文件夹中，确保了工作目录的整洁有序。此项目采用 JavaScript 编写，对能够读取仓库文件并执行 shell 命令的各种 AI 代理友好。",2,"2026-06-11 03:59:37","CREATED_QUERY"]