@lark-apaas/miaoda-cli 0.1.1 → 0.1.2-alpha.b2b5ae5

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 (64) hide show
  1. package/dist/api/app/api.js +25 -0
  2. package/dist/api/app/index.js +15 -0
  3. package/dist/api/app/schemas.js +79 -0
  4. package/dist/api/app/types.js +58 -0
  5. package/dist/api/db/api.js +83 -6
  6. package/dist/api/db/client.js +40 -29
  7. package/dist/api/db/parsers.js +33 -20
  8. package/dist/api/db/sql-keywords.js +123 -0
  9. package/dist/api/deploy/api.js +60 -0
  10. package/dist/api/deploy/index.js +16 -0
  11. package/dist/api/deploy/schemas.js +103 -0
  12. package/dist/api/deploy/types.js +22 -0
  13. package/dist/api/file/api.js +78 -24
  14. package/dist/api/file/client.js +1 -5
  15. package/dist/api/file/parsers.js +1 -5
  16. package/dist/api/index.js +7 -1
  17. package/dist/api/observability/api.js +52 -0
  18. package/dist/api/observability/index.js +16 -0
  19. package/dist/api/observability/schemas.js +39 -0
  20. package/dist/api/observability/types.js +27 -0
  21. package/dist/api/plugin/api.js +8 -3
  22. package/dist/cli/commands/app/index.js +62 -0
  23. package/dist/cli/commands/db/index.js +1 -0
  24. package/dist/cli/commands/deploy/index.js +139 -0
  25. package/dist/cli/commands/index.js +6 -0
  26. package/dist/cli/commands/observability/index.js +227 -0
  27. package/dist/cli/commands/plugin/index.js +18 -6
  28. package/dist/cli/commands/shared.js +38 -6
  29. package/dist/cli/handlers/app/get.js +48 -0
  30. package/dist/cli/handlers/app/index.js +7 -0
  31. package/dist/cli/handlers/app/update.js +59 -0
  32. package/dist/cli/handlers/db/data.js +22 -2
  33. package/dist/cli/handlers/db/schema.js +22 -8
  34. package/dist/cli/handlers/db/sql.js +304 -16
  35. package/dist/cli/handlers/deploy/deploy.js +83 -0
  36. package/dist/cli/handlers/deploy/error-log.js +61 -0
  37. package/dist/cli/handlers/deploy/get.js +70 -0
  38. package/dist/cli/handlers/deploy/helpers.js +41 -0
  39. package/dist/cli/handlers/deploy/history.js +70 -0
  40. package/dist/cli/handlers/deploy/index.js +14 -0
  41. package/dist/cli/handlers/deploy/polling.js +139 -0
  42. package/dist/cli/handlers/file/cp.js +39 -17
  43. package/dist/cli/handlers/file/ls.js +1 -3
  44. package/dist/cli/handlers/file/rm.js +4 -3
  45. package/dist/cli/handlers/observability/analytics.js +189 -0
  46. package/dist/cli/handlers/observability/helpers.js +66 -0
  47. package/dist/cli/handlers/observability/index.js +12 -0
  48. package/dist/cli/handlers/observability/log.js +94 -0
  49. package/dist/cli/handlers/observability/metric.js +208 -0
  50. package/dist/cli/handlers/observability/trace.js +102 -0
  51. package/dist/cli/handlers/plugin/plugin-local.js +23 -9
  52. package/dist/cli/handlers/plugin/plugin.js +21 -7
  53. package/dist/cli/help.js +5 -2
  54. package/dist/utils/colors.js +98 -0
  55. package/dist/utils/devops-error.js +28 -0
  56. package/dist/utils/error.js +11 -0
  57. package/dist/utils/fuzzy-match.js +91 -0
  58. package/dist/utils/git.js +29 -0
  59. package/dist/utils/http.js +32 -0
  60. package/dist/utils/index.js +13 -1
  61. package/dist/utils/output.js +397 -12
  62. package/dist/utils/render.js +61 -41
  63. package/dist/utils/time.js +132 -0
  64. package/package.json +16 -6
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseTimeToMs = parseTimeToMs;
4
+ exports.msToNs = msToNs;
5
+ exports.msToSec = msToSec;
6
+ exports.parseToMs = parseToMs;
7
+ exports.parseToNs = parseToNs;
8
+ exports.parseToSec = parseToSec;
9
+ exports.floorMsToBucket = floorMsToBucket;
10
+ exports.ceilMsToBucket = ceilMsToBucket;
11
+ const error_1 = require("./error");
12
+ const TIMESTAMP_HELP = "支持格式:相对时间 1h/2d/1w;日期 2026-04-01;ISO 2026-04-01T10:00:00Z";
13
+ /**
14
+ * 解析 PRD 时间格式。返回毫秒时间戳。
15
+ * - 相对时间:`1h`、`2d`、`1w`、`30m`(h=小时, d=天, w=周, m=分钟)
16
+ * - 日期:`2026-04-01`(按当日 00:00:00 UTC)
17
+ * - ISO 8601:`2026-04-01T10:00:00Z`
18
+ *
19
+ * 失败抛 AppError("ARGS_INVALID", ...);CLI 层用 withHelp 自动转 exit 2 + help。
20
+ */
21
+ function parseTimeToMs(input, now = new Date()) {
22
+ const relative = /^(\d+)([mhdw])$/.exec(input);
23
+ if (relative) {
24
+ const n = Number(relative[1]);
25
+ const unit = relative[2];
26
+ const factor = unit === "m"
27
+ ? 60_000
28
+ : unit === "h"
29
+ ? 3_600_000
30
+ : unit === "d"
31
+ ? 86_400_000
32
+ : /* w */ 604_800_000;
33
+ return now.getTime() - n * factor;
34
+ }
35
+ if (/^\d{4}-\d{2}-\d{2}$/.test(input)) {
36
+ const ms = Date.parse(input + "T00:00:00Z");
37
+ if (Number.isNaN(ms))
38
+ failInvalidTimestamp(input);
39
+ return ms;
40
+ }
41
+ const ms = Date.parse(input);
42
+ if (Number.isNaN(ms))
43
+ failInvalidTimestamp(input);
44
+ return ms;
45
+ }
46
+ function failInvalidTimestamp(input) {
47
+ throw new error_1.AppError("ARGS_INVALID", `无法解析时间 '${input}'。${TIMESTAMP_HELP}`);
48
+ }
49
+ /** 毫秒 → 纳秒(字符串,避免 JS Number 精度丢失) */
50
+ function msToNs(ms) {
51
+ return `${String(ms)}000000`;
52
+ }
53
+ /** 毫秒 → 秒(字符串,向下取整) */
54
+ function msToSec(ms) {
55
+ return String(Math.floor(ms / 1000));
56
+ }
57
+ /** 解析到毫秒数;input 为空返回 undefined */
58
+ function parseToMs(input, now) {
59
+ if (!input)
60
+ return undefined;
61
+ return parseTimeToMs(input, now);
62
+ }
63
+ /** 解析到纳秒字符串;input 为空返回 undefined */
64
+ function parseToNs(input, now) {
65
+ if (!input)
66
+ return undefined;
67
+ return msToNs(parseTimeToMs(input, now));
68
+ }
69
+ /** 解析到秒字符串;input 为空返回 undefined */
70
+ function parseToSec(input, now) {
71
+ if (!input)
72
+ return undefined;
73
+ return msToSec(parseTimeToMs(input, now));
74
+ }
75
+ // ── 桶边界对齐 ──
76
+ //
77
+ // metric 的 down-sample 与 analytics 的 timeAggregationUnit 都按 UTC 桶切片。
78
+ // 当用户传的 since/until 落在桶中间,服务端可能返回不到该桶(边界数据丢失)。
79
+ // 约定:since 向下取整、until 向上取整,把 since/until 各自所在桶完整纳入。
80
+ //
81
+ // 周界以 ISO 周(周一为周首,UTC);月按 UTC 月初对齐。
82
+ const MS_MIN = 60_000;
83
+ const MS_HOUR = 3_600_000;
84
+ const MS_DAY = 86_400_000;
85
+ /** 把 ms 向下对齐到桶起点(UTC)。未识别的 bucket 原样返回。 */
86
+ function floorMsToBucket(ms, bucket) {
87
+ switch (bucket) {
88
+ case "1m":
89
+ return Math.floor(ms / MS_MIN) * MS_MIN;
90
+ case "1h":
91
+ return Math.floor(ms / MS_HOUR) * MS_HOUR;
92
+ case "1d":
93
+ case "DAY": {
94
+ const d = new Date(ms);
95
+ return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate());
96
+ }
97
+ case "WEEK": {
98
+ const d = new Date(ms);
99
+ const offsetDays = (d.getUTCDay() + 6) % 7; // 距上一个周一的天数
100
+ return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() - offsetDays);
101
+ }
102
+ case "MONTH": {
103
+ const d = new Date(ms);
104
+ return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), 1);
105
+ }
106
+ default:
107
+ return ms;
108
+ }
109
+ }
110
+ /** 把 ms 向上对齐到下一个桶起点(UTC);恰在边界则不变。 */
111
+ function ceilMsToBucket(ms, bucket) {
112
+ const floor = floorMsToBucket(ms, bucket);
113
+ if (floor === ms)
114
+ return ms;
115
+ switch (bucket) {
116
+ case "1m":
117
+ return floor + MS_MIN;
118
+ case "1h":
119
+ return floor + MS_HOUR;
120
+ case "1d":
121
+ case "DAY":
122
+ return floor + MS_DAY;
123
+ case "WEEK":
124
+ return floor + 7 * MS_DAY;
125
+ case "MONTH": {
126
+ const d = new Date(floor);
127
+ return Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + 1, 1);
128
+ }
129
+ default:
130
+ return ms;
131
+ }
132
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/miaoda-cli",
3
- "version": "0.1.1",
3
+ "version": "0.1.2-alpha.b2b5ae5",
4
4
  "description": "Miaoda 平台命令行工具,面向 Agent 调用",
5
5
  "type": "commonjs",
6
6
  "bin": {
@@ -26,7 +26,9 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "@lark-apaas/http-client": "^0.1.5",
29
- "commander": "^13.1.0"
29
+ "commander": "^13.1.0",
30
+ "ora": "^5.4.1",
31
+ "picocolors": "^1.1.1"
30
32
  },
31
33
  "devDependencies": {
32
34
  "@types/node": "^22.15.3",
@@ -34,7 +36,12 @@
34
36
  "@typescript-eslint/parser": "^8.58.2",
35
37
  "@vitest/coverage-v8": "^4.1.4",
36
38
  "eslint": "^9.25.1",
39
+ "eslint-config-prettier": "^10.1.8",
40
+ "eslint-import-resolver-typescript": "^4.4.4",
41
+ "eslint-plugin-boundaries": "^6.0.2",
42
+ "eslint-plugin-import": "^2.32.0",
37
43
  "husky": "^9.1.7",
44
+ "prettier": "^3.8.3",
38
45
  "tsc-alias": "^1.8.11",
39
46
  "tsx": "^4.19.4",
40
47
  "typescript": "^5.8.3",
@@ -45,9 +52,12 @@
45
52
  "build": "bash scripts/build.sh",
46
53
  "typecheck": "tsc --noEmit -p tsconfig.json",
47
54
  "lint": "eslint src/ --max-warnings 0",
48
- "test": "vitest run",
49
- "test:watch": "vitest",
50
- "test:integration": "vitest run --config vitest.integration.config.ts",
51
- "dev": "node --import tsx src/main.ts"
55
+ "format": "prettier --write src/",
56
+ "format:check": "prettier --check src/",
57
+ "test": "vitest run --project=unit",
58
+ "test:watch": "vitest --project=unit",
59
+ "test:integration": "vitest run --project=integration",
60
+ "dev": "node --import tsx src/main.ts",
61
+ "cli": "node --env-file-if-exists=integration/.env --import tsx src/main.ts"
52
62
  }
53
63
  }