@seandong/seno 0.1.7 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/agent/conversation.d.ts +19 -3
  2. package/dist/agent/conversation.js +40 -9
  3. package/dist/agent/conversation.js.map +1 -1
  4. package/dist/agent/loop.d.ts +3 -0
  5. package/dist/agent/loop.js +27 -15
  6. package/dist/agent/loop.js.map +1 -1
  7. package/dist/agent/session.js +1 -7
  8. package/dist/agent/session.js.map +1 -1
  9. package/dist/cli/commands.d.ts +2 -0
  10. package/dist/cli/commands.js +33 -353
  11. package/dist/cli/commands.js.map +1 -1
  12. package/dist/cli/logger.d.ts +55 -7
  13. package/dist/cli/logger.js +152 -16
  14. package/dist/cli/logger.js.map +1 -1
  15. package/dist/cli/output.d.ts +1 -5
  16. package/dist/cli/output.js +29 -59
  17. package/dist/cli/output.js.map +1 -1
  18. package/dist/cli/prompt.js +7 -5
  19. package/dist/cli/prompt.js.map +1 -1
  20. package/dist/cli/readline-wrapper.d.ts +44 -0
  21. package/dist/cli/readline-wrapper.js +80 -0
  22. package/dist/cli/readline-wrapper.js.map +1 -0
  23. package/dist/cli/repl.js +23 -47
  24. package/dist/cli/repl.js.map +1 -1
  25. package/dist/commands/init.js +8 -2
  26. package/dist/commands/init.js.map +1 -1
  27. package/dist/commands/model.js +8 -2
  28. package/dist/commands/model.js.map +1 -1
  29. package/dist/commands/plugin-init.d.ts +24 -0
  30. package/dist/commands/plugin-init.js +313 -0
  31. package/dist/commands/plugin-init.js.map +1 -0
  32. package/dist/commands/server.d.ts +39 -0
  33. package/dist/commands/server.js +102 -0
  34. package/dist/commands/server.js.map +1 -0
  35. package/dist/config/manager.d.ts +14 -0
  36. package/dist/config/manager.js +151 -13
  37. package/dist/config/manager.js.map +1 -1
  38. package/dist/config/types.d.ts +15 -0
  39. package/dist/errors.d.ts +20 -3
  40. package/dist/errors.js +20 -5
  41. package/dist/errors.js.map +1 -1
  42. package/dist/i18n/strings.d.ts +44 -0
  43. package/dist/i18n/strings.js +46 -0
  44. package/dist/i18n/strings.js.map +1 -0
  45. package/dist/index.js +52 -18
  46. package/dist/index.js.map +1 -1
  47. package/dist/llm/anthropic.d.ts +0 -9
  48. package/dist/llm/anthropic.js +9 -62
  49. package/dist/llm/anthropic.js.map +1 -1
  50. package/dist/llm/error-handler.d.ts +28 -0
  51. package/dist/llm/error-handler.js +93 -0
  52. package/dist/llm/error-handler.js.map +1 -0
  53. package/dist/llm/openai-codex.js +15 -61
  54. package/dist/llm/openai-codex.js.map +1 -1
  55. package/dist/llm/openai.js +10 -57
  56. package/dist/llm/openai.js.map +1 -1
  57. package/dist/mcp/bridge.js.map +1 -1
  58. package/dist/mcp/manager.d.ts +4 -2
  59. package/dist/mcp/manager.js +36 -12
  60. package/dist/mcp/manager.js.map +1 -1
  61. package/dist/prompts/system.js +2 -1
  62. package/dist/prompts/system.js.map +1 -1
  63. package/dist/skills/registry.js.map +1 -1
  64. package/dist/skills/sync.js +3 -1
  65. package/dist/skills/sync.js.map +1 -1
  66. package/dist/tools/plugin-init.d.ts +6 -0
  67. package/dist/tools/plugin-init.js +46 -0
  68. package/dist/tools/plugin-init.js.map +1 -0
  69. package/dist/tools/registry.js +11 -2
  70. package/dist/tools/registry.js.map +1 -1
  71. package/dist/tools/server.d.ts +13 -0
  72. package/dist/tools/server.js +151 -0
  73. package/dist/tools/server.js.map +1 -0
  74. package/dist/tools/shell.js +1 -3
  75. package/dist/tools/shell.js.map +1 -1
  76. package/dist/tools/skills-sync.d.ts +6 -0
  77. package/dist/tools/skills-sync.js +39 -0
  78. package/dist/tools/skills-sync.js.map +1 -0
  79. package/dist/tools/ssh.js.map +1 -1
  80. package/dist/utils/retry.js.map +1 -1
  81. package/dist/utils/text.d.ts +45 -0
  82. package/dist/utils/text.js +95 -0
  83. package/dist/utils/text.js.map +1 -0
  84. package/package.json +23 -5
@@ -0,0 +1,95 @@
1
+ /**
2
+ * 公共文本工具函数
3
+ *
4
+ * ANSI 转义序列处理、CJK 字符宽度计算、表格格式化等,
5
+ * 供 CLI 各模块共享使用,消除重复实现。
6
+ */
7
+ // eslint-disable-next-line no-control-regex
8
+ const ANSI_RE = /\x1b\[[0-9;]*m/g;
9
+ /**
10
+ * 去除 ANSI 颜色/样式转义序列,返回可见文本
11
+ */
12
+ export function stripAnsi(s) {
13
+ return s.replace(ANSI_RE, '');
14
+ }
15
+ /**
16
+ * 判断 Unicode 码位是否为全角(East Asian Width = Wide/Fullwidth)
17
+ * CJK 汉字、全角标点、韩文等占 2 个终端列宽
18
+ */
19
+ export function isFullWidth(code) {
20
+ return ((code >= 0x1100 && code <= 0x115f) || // Hangul Jamo
21
+ (code >= 0x2e80 && code <= 0x303f) || // CJK Radicals, Kangxi, Ideographic, CJK Symbols
22
+ (code >= 0x3040 && code <= 0x33ff) || // Hiragana, Katakana, Bopomofo, etc.
23
+ (code >= 0x3400 && code <= 0x4dbf) || // CJK Ext A
24
+ (code >= 0x4e00 && code <= 0x9fff) || // CJK Unified Ideographs
25
+ (code >= 0xa000 && code <= 0xa4cf) || // Yi Syllables / Radicals
26
+ (code >= 0xac00 && code <= 0xd7af) || // Hangul Syllables
27
+ (code >= 0xf900 && code <= 0xfaff) || // CJK Compatibility Ideographs
28
+ (code >= 0xfe30 && code <= 0xfe4f) || // CJK Compatibility Forms
29
+ (code >= 0xff01 && code <= 0xff60) || // Fullwidth Forms
30
+ (code >= 0xffe0 && code <= 0xffe6) || // Fullwidth Signs
31
+ (code >= 0x20000 && code <= 0x2ffff) || // CJK Ext B-F
32
+ (code >= 0x30000 && code <= 0x3ffff) // CJK Ext G
33
+ );
34
+ }
35
+ /**
36
+ * 计算字符串在终端中的显示宽度(列数)
37
+ * 全角字符(CJK 等)占 2 列,其余占 1 列
38
+ */
39
+ export function getDisplayWidth(str) {
40
+ let width = 0;
41
+ for (const char of str) {
42
+ const code = char.codePointAt(0);
43
+ width += isFullWidth(code) ? 2 : 1;
44
+ }
45
+ return width;
46
+ }
47
+ /**
48
+ * 感知 CJK 全角字符的 padEnd
49
+ * 在终端中对齐文本时,需考虑全角字符占 2 列宽
50
+ */
51
+ export function padEndDisplay(str, targetWidth) {
52
+ const currentWidth = getDisplayWidth(str);
53
+ const padding = targetWidth - currentWidth;
54
+ return padding > 0 ? str + ' '.repeat(padding) : str;
55
+ }
56
+ /**
57
+ * 格式化简单文本表格
58
+ * 自动计算列宽(考虑 CJK 字符),返回格式化后的行数组
59
+ *
60
+ * @param columns 列定义
61
+ * @param rows 数据行,每行是字符串数组
62
+ * @returns 格式化后的字符串数组(每行一个元素)
63
+ */
64
+ export function formatTable(columns, rows) {
65
+ // 计算每列的实际宽度
66
+ const colWidths = columns.map((col, i) => {
67
+ const headerWidth = getDisplayWidth(col.header);
68
+ const maxDataWidth = rows.reduce((max, row) => Math.max(max, getDisplayWidth(row[i] || '')), 0);
69
+ return Math.max(col.minWidth || 0, headerWidth, maxDataWidth);
70
+ });
71
+ const output = [];
72
+ // 表头
73
+ const headerLine = columns
74
+ .map((col, i) => {
75
+ const gap = col.gap ?? 2;
76
+ return padEndDisplay(col.header, colWidths[i] + gap);
77
+ })
78
+ .join('');
79
+ output.push(headerLine);
80
+ // 分隔线
81
+ const totalWidth = colWidths.reduce((sum, w, i) => sum + w + (columns[i].gap ?? 2), 0);
82
+ output.push('─'.repeat(totalWidth));
83
+ // 数据行
84
+ for (const row of rows) {
85
+ const line = columns
86
+ .map((col, i) => {
87
+ const gap = col.gap ?? 2;
88
+ return padEndDisplay(row[i] || '', colWidths[i] + gap);
89
+ })
90
+ .join('');
91
+ output.push(line);
92
+ }
93
+ return output;
94
+ }
95
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,4CAA4C;AAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC;AAElC;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,CACL,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,cAAc;QACpD,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,iDAAiD;QACvF,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,qCAAqC;QAC3E,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,YAAY;QAClD,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,yBAAyB;QAC/D,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,0BAA0B;QAChE,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,mBAAmB;QACzD,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,+BAA+B;QACrE,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,0BAA0B;QAChE,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,kBAAkB;QACxD,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,kBAAkB;QACxD,CAAC,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,IAAI,cAAc;QACtD,CAAC,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,YAAY;KAClD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;QAClC,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,WAAmB;IAC5D,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,WAAW,GAAG,YAAY,CAAC;IAC3C,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACvD,CAAC;AAcD;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,OAAsB,EAAE,IAAgB;IAClE,YAAY;IACZ,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACvC,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK;IACL,MAAM,UAAU,GAAG,OAAO;SACvB,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACd,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QACzB,OAAO,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACvD,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAExB,MAAM;IACN,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvF,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAEpC,MAAM;IACN,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO;aACjB,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACd,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YACzB,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACzD,CAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seandong/seno",
3
- "version": "0.1.7",
3
+ "version": "0.2.0",
4
4
  "description": "ONES AI Agent CLI",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -12,15 +12,28 @@
12
12
  "README.md"
13
13
  ],
14
14
  "engines": {
15
- "node": ">=18.0.0"
15
+ "node": ">=20.0.0"
16
16
  },
17
17
  "scripts": {
18
18
  "build": "tsc",
19
19
  "prebuild": "rm -rf dist",
20
- "prepublishOnly": "npm run build",
20
+ "preversion": "bun run typecheck && bun run lint && bun run test",
21
+ "prepublishOnly": "bun run build",
22
+ "postversion": "git push && git push --tags",
23
+ "release": "npm version patch",
24
+ "release:minor": "npm version minor",
25
+ "release:major": "npm version major",
21
26
  "start": "node dist/index.js",
22
27
  "dev": "bun --watch src/index.ts",
23
- "typecheck": "tsc --noEmit"
28
+ "typecheck": "tsc --noEmit",
29
+ "lint": "eslint src/",
30
+ "lint:fix": "eslint src/ --fix",
31
+ "format": "prettier --write src/",
32
+ "format:check": "prettier --check src/",
33
+ "test": "tsc && node --test tests/config.test.ts tests/conversation.test.ts tests/errors.test.ts",
34
+ "test:watch": "node --experimental-transform-types --test --watch tests/conversation.test.ts tests/errors.test.ts",
35
+ "check": "bun run typecheck && bun run lint && bun run format:check && bun run test && bun run build",
36
+ "fix": "bun run lint:fix && bun run format"
24
37
  },
25
38
  "repository": {
26
39
  "type": "git",
@@ -52,6 +65,11 @@
52
65
  "@types/marked-terminal": "^6.1.1",
53
66
  "@types/node": "^22.13.0",
54
67
  "@types/ssh2": "^1.15.5",
55
- "typescript": "^5.7.3"
68
+ "@evilmartians/lefthook": "^1.11.0",
69
+ "eslint": "^9.0.0",
70
+ "eslint-config-prettier": "^10.0.0",
71
+ "prettier": "^3.0.0",
72
+ "typescript": "^5.7.3",
73
+ "typescript-eslint": "^8.0.0"
56
74
  }
57
75
  }