skill-deliverable.mjs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/env node
  2. /**
  3. * skill-deliverable CLI — 交付物自动上报
  4. * Usage:
  5. * skill-deliverable check # 检查容器身份+凭据
  6. * skill-deliverable report ... # 上报交付物
  7. * skill-deliverable list # 列出上报记录
  8. * skill-deliverable init # 初始化凭据
  9. */
  10. import { resolveAgentId, resolveSessionToken, report, list } from '../lib/index.mjs';
  11. import { hostname } from 'node:os';
  12. const [cmd, ...args] = process.argv.slice(2);
  13. switch (cmd) {
  14. case 'check': {
  15. const agentId = resolveAgentId();
  16. const token = resolveSessionToken();
  17. console.log(JSON.stringify({
  18. agentId: agentId || '(缺失)',
  19. sessionToken: token ? token.slice(0, 12) + '...' : '(缺失)',
  20. status: (agentId && token) ? 'ready' : 'incomplete',
  21. hostname: hostname(),
  22. }, null, 2));
  23. break;
  24. }
  25. case 'report': {
  26. const title = getArg('--title');
  27. const summary = getArg('--summary') || '';
  28. const project = getArg('--project') || '';
  29. const artifacts = parseArg('--artifacts') || [];
  30. const tags = parseArg('--tags') || [];
  31. if (!title) { console.error('--title 必填'); process.exit(1); }
  32. const r = await report({ agentId: resolveAgentId(), title, summary, project, artifacts, tags });
  33. console.log(JSON.stringify(r, null, 2));
  34. break;
  35. }
  36. case 'list': {
  37. const limit = parseInt(getArg('--limit') || '5', 10);
  38. const items = await list({ limit });
  39. console.log(JSON.stringify(items, null, 2));
  40. break;
  41. }
  42. case 'init': {
  43. console.log('→ 凭据自举:尝试从 ~/.fmode/ 或 env 读取...');
  44. const token = resolveSessionToken();
  45. if (token) {
  46. console.log('✅ 已有 sessionToken,无需初始化');
  47. } else {
  48. console.error('❌ 无 sessionToken。请设置 FMODE_SESSION_TOKEN 或登录 FMODE Studio');
  49. process.exit(1);
  50. }
  51. break;
  52. }
  53. default:
  54. console.log(`用法: skill-deliverable <check|report|list|init>
  55. check 检查容器身份+凭据状态
  56. report 上报交付物 (--title <必填> --summary --project --artifacts --tags)
  57. list 最近上报记录 (--limit)
  58. init 初始化凭据`);
  59. }
  60. function getArg(name) {
  61. const i = args.indexOf(name);
  62. return i >= 0 ? args[i + 1] : undefined;
  63. }
  64. function parseArg(name) {
  65. const v = getArg(name);
  66. if (!v) return undefined;
  67. try { return JSON.parse(v); } catch { return v.split(','); }
  68. }