skill-deliverable.mjs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #!/usr/bin/env node
  2. // Copyright (c) 未来飞马
  3. //
  4. // Licensed under the MIT License. See LICENSE in the project root
  5. // for the full license text.
  6. //
  7. // Trademark Notice:
  8. // The MIT license grants copyright permissions for source code only.
  9. // It does NOT grant any rights to use trademarks including "未来飞马",
  10. // "Harness Loop", "RSI", and associated slogan "让AI进化提前发生,让AI落地快人一步".
  11. // Any use of these trademarks requires separate written permission.
  12. /**
  13. * skill-deliverable CLI — 交付物自动上报
  14. * Usage:
  15. * skill-deliverable check # 检查容器身份+凭据
  16. * skill-deliverable report ... # 上报交付物
  17. * skill-deliverable list # 列出上报记录
  18. * skill-deliverable init # 初始化凭据
  19. */
  20. import { resolveAgentId, resolveSessionToken, report, list } from '../lib/index.mjs';
  21. import { hostname } from 'node:os';
  22. const [cmd, ...args] = process.argv.slice(2);
  23. switch (cmd) {
  24. case 'check': {
  25. const agentId = resolveAgentId();
  26. const token = resolveSessionToken();
  27. console.log(JSON.stringify({
  28. agentId: agentId || '(缺失)',
  29. sessionToken: token ? token.slice(0, 12) + '...' : '(缺失)',
  30. status: (agentId && token) ? 'ready' : 'incomplete',
  31. hostname: hostname(),
  32. }, null, 2));
  33. break;
  34. }
  35. case 'report': {
  36. const title = getArg('--title');
  37. const summary = getArg('--summary') || '';
  38. const project = getArg('--project') || '';
  39. const artifacts = parseArg('--artifacts') || [];
  40. const tags = parseArg('--tags') || [];
  41. if (!title) { console.error('--title 必填'); process.exit(1); }
  42. const r = await report({ agentId: resolveAgentId(), title, summary, project, artifacts, tags });
  43. console.log(JSON.stringify(r, null, 2));
  44. break;
  45. }
  46. case 'list': {
  47. const limit = parseInt(getArg('--limit') || '5', 10);
  48. const items = await list({ limit });
  49. console.log(JSON.stringify(items, null, 2));
  50. break;
  51. }
  52. case 'init': {
  53. console.log('→ 凭据自举:尝试从 ~/.fmode/ 或 env 读取...');
  54. const token = resolveSessionToken();
  55. if (token) {
  56. console.log('✅ 已有 sessionToken,无需初始化');
  57. } else {
  58. console.error('❌ 无 sessionToken。请设置 FMODE_SESSION_TOKEN 或登录 FMODE Studio');
  59. process.exit(1);
  60. }
  61. break;
  62. }
  63. default:
  64. console.log(`用法: skill-deliverable <check|report|list|init>
  65. check 检查容器身份+凭据状态
  66. report 上报交付物 (--title <必填> --summary --project --artifacts --tags)
  67. list 最近上报记录 (--limit)
  68. init 初始化凭据`);
  69. }
  70. function getArg(name) {
  71. const i = args.indexOf(name);
  72. return i >= 0 ? args[i + 1] : undefined;
  73. }
  74. function parseArg(name) {
  75. const v = getArg(name);
  76. if (!v) return undefined;
  77. try { return JSON.parse(v); } catch { return v.split(','); }
  78. }