#!/usr/bin/env node /** * deliver.mjs — 成果交付上报(AgentDeliverable 表) * * 交付即报纪律:任务节点有明确交付物+链接 → 立即上报 * (每章/每版/每次部署/每轮大修各一条;漏报即补)。 * 幂等:同 agentId+taskId+deliverableType 覆盖更新而非新增。 * Date 坑:deliveredAt 一律经 wrapDate() 包装为 {"__type":"Date","iso":...} * —— 裸字符串写 Parse 报 schema 111(见 SKILL.md 坑章节)。 * * 用法: * node deliver.mjs --agent --task --title <标题> --url <交付链接> \ * [--type report|code|courseware|data] [--project <项目>] [--summary <一句话>] \ * [--delivered-at "2026-09-12T08:00:00.000Z"] */ import { resolveCredentials, failNoCredentials, wrapDate, upsertObject, } from './parse-client.mjs'; const TABLE = 'AgentDeliverable'; const VALID_TYPES = ['report', 'code', 'courseware', 'data']; function parseArgs(argv) { const args = {}; for (let i = 0; i < argv.length; i += 2) { const key = (argv[i] || '').replace(/^--/, ''); args[key] = argv[i + 1]; } return args; } const args = parseArgs(process.argv.slice(2)); const missing = ['agent', 'task', 'title', 'url'].filter((k) => !args[k]); if (missing.length > 0) { console.error(`[task-progress] 缺必填参数: --${missing.join(' --')}`); console.error('用法: node deliver.mjs --agent --task --title <标题> --url <交付链接> [--type report|code|courseware|data] [--project <项目>] [--summary <一句话>] [--delivered-at ISO日期]'); process.exit(1); } if (args.type && !VALID_TYPES.includes(args.type)) { console.error(`[task-progress] --type 必须是 ${VALID_TYPES.join('|')} 之一`); process.exit(1); } const cred = resolveCredentials(); if (!cred) failNoCredentials(); // Date __type 包装(schema 111 坑的防线) let deliveredAt; try { deliveredAt = wrapDate(args.deliveredAt || new Date().toISOString()); } catch (e) { console.error(`[task-progress] --delivered-at ${e.message}`); process.exit(1); } const where = { agentId: args.agent, taskId: args.task, deliverableType: args.type || 'report', }; const data = { agentId: args.agent, taskId: args.task, title: args.title, url: args.url, deliveredAt, }; if (args.type) data.deliverableType = args.type; if (args.project) data.project = args.project; if (args.summary) data.summary = args.summary; const r = await upsertObject(TABLE, cred, where, data); console.log(JSON.stringify({ ok: true, op: 'deliver', agentId: args.agent, taskId: args.task, title: args.title, url: args.url, objectId: r.objectId, created: r.created, deliveredAt, }));