skill-deliverable.mjs 2.9 KB

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