| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #!/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 <agentId> --task <taskId> --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 <agentId> --task <taskId> --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,
- }));
|