1. 目录 mcn-work-shop -> mcn-workshop(空间分组名取会话 cwd 的目录名,只改字符串无效,必须真改名) 2. 全仓替换 mcn-work-shop -> mcn-workshop:37 文件 121 处;历史日志按沿革句规矩保留当时目录名 3. 任务进度可见:/api/run/status 产出 已运行时长/工具调用/最近动作/停滞判定(读会话日志尾部),前端新增右下角常驻面板,四处任务入口接入 4. 会话归属目录配置化:新增 config.sessionCwd(留空=工作台自身目录),现指向 D://AI技能//mcn-workshop,使任务显示为命名分组而非「未分组任务」 5. 修前端轮询静默缺陷:连续 3 次查询失败即提示服务断开(原逻辑静默空转到 15 分钟超时,用户零感知)
66 lines
3.5 KiB
JavaScript
66 lines
3.5 KiB
JavaScript
/* submit-review-tasks.cjs — 对俊希最新的 AI 脚本逐条提交复盘任务(与诊断页「复盘」按钮一致 + 落库 script_review 指令)
|
||
用法: node submit-review-tasks.cjs [rewriteId1,rewriteId2,...] (不传则自动取 account_id=3 的最新 done 记录) */
|
||
const { DatabaseSync } = require('node:sqlite');
|
||
const path = require('path');
|
||
const { loadConfig } = require('./load-config');
|
||
|
||
const CFG = loadConfig();
|
||
const DB = path.join(__dirname, CFG.dbName);
|
||
const API = `http://localhost:${CFG.port}/api/run`;
|
||
const ACCOUNT_ID = 3;
|
||
|
||
const db = new DatabaseSync(DB, { readOnly: true });
|
||
let ids = process.argv.slice(2).map(Number).filter(Boolean);
|
||
if (!ids.length) {
|
||
ids = db.prepare("SELECT id FROM rewrite_log WHERE account_id=? AND status='done' AND script_text IS NOT NULL AND script_text <> '' ORDER BY id DESC LIMIT 20").all(ACCOUNT_ID).map((r) => r.id);
|
||
}
|
||
const rows = [];
|
||
for (const id of ids) {
|
||
const r = db.prepare('SELECT rl.id, rl.video_id, rl.title, v.video_title FROM rewrite_log rl LEFT JOIN account_videos v ON v.id=rl.video_id WHERE rl.id=?').get(id);
|
||
if (r) rows.push(r);
|
||
}
|
||
db.close();
|
||
if (!rows.length) { console.log('NO REWRITES TO REVIEW'); process.exit(1); }
|
||
|
||
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
||
(async () => {
|
||
for (const r of rows) {
|
||
const prompt = `请对这条 AI 脚本做复盘评分(AI脚本 / 原视频脚本 / 对比分析三种模式),按 mcn-script-review(脚本复盘)技能执行。
|
||
脚本标题:《${r.title || r.video_title || ''}》(rewrite_log.id=${r.id},video_id=${r.video_id})
|
||
|
||
【任务完成后必须执行】
|
||
将复盘结果保存到工作台数据库 ${CFG.dbName} 的 script_review 表(数据库路径:${DB},即本会话 cwd 下的 ${CFG.dbName}),字段:
|
||
- type='ai'
|
||
- rewrite_id=${r.id}
|
||
- video_id=${r.video_id}
|
||
- dims_json=各维度评分 JSON(设定承接/框架节奏/钩子设置/叙事逻辑/极致事件/共鸣和共情/格式规范性/台词口语化/内容合规/教程完整链/其他)
|
||
- total=总分(数字)
|
||
- verdict=结论
|
||
- issues_json=问题清单 JSON 数组,**每条字段固定如下(字段名与取值不可自创)**:
|
||
[{"severity":"高","dim":"叙事逻辑","loc":"场8 妈妈台词(510-520s)","issue":"问题描述","suggestion":"修改建议","step":"S7"},
|
||
{"severity":"中","dim":"台词口语化","loc":"场3","issue":"…","suggestion":"…","step":"S9"}]
|
||
· severity:**只能取「高」「中」「低」三个中文值**(禁止 high/medium/low、禁止 sev/level 等其它字段名)
|
||
· dim=所属维度名;loc=定位(场次/时间码);issue=问题描述;suggestion=修改建议;step=所属环节(S5-S11)
|
||
· ⚠️ 若 severity 缺失或写成英文,工作台无法按严重度着色,会全部显示成绿色
|
||
- content=复盘完整内容
|
||
- summary=摘要
|
||
- status='done'
|
||
(用 node:sqlite 或 sqlite3 写入;若该表不存在则创建后再写)
|
||
完成后回复:评分 + 是否已保存。`;
|
||
|
||
try {
|
||
const resp = await fetch(API, {
|
||
method: 'POST',
|
||
headers: { 'Content-Type': 'application/json' },
|
||
body: JSON.stringify({ prompt, name: '复盘指令', skills: ['脚本复盘'] }),
|
||
});
|
||
const d = await resp.json();
|
||
console.log(`SUBMIT review rw${r.id} →`, d.ok ? ('id=' + d.id) : ('ERR ' + d.error));
|
||
} catch (e) {
|
||
console.log(`SUBMIT review rw${r.id} → EXCEPTION ${e.message}`);
|
||
}
|
||
await sleep(3000);
|
||
}
|
||
console.log('ALL REVIEW TASKS SUBMITTED');
|
||
})();
|