wjx-cli 0.1.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 (54) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +836 -0
  3. package/dist/commands/account.d.ts +2 -0
  4. package/dist/commands/account.js +100 -0
  5. package/dist/commands/account.js.map +1 -0
  6. package/dist/commands/admin.d.ts +2 -0
  7. package/dist/commands/admin.js +42 -0
  8. package/dist/commands/admin.js.map +1 -0
  9. package/dist/commands/analytics.d.ts +2 -0
  10. package/dist/commands/analytics.js +136 -0
  11. package/dist/commands/analytics.js.map +1 -0
  12. package/dist/commands/contacts.d.ts +2 -0
  13. package/dist/commands/contacts.js +49 -0
  14. package/dist/commands/contacts.js.map +1 -0
  15. package/dist/commands/department.d.ts +2 -0
  16. package/dist/commands/department.js +60 -0
  17. package/dist/commands/department.js.map +1 -0
  18. package/dist/commands/diagnostics.d.ts +2 -0
  19. package/dist/commands/diagnostics.js +110 -0
  20. package/dist/commands/diagnostics.js.map +1 -0
  21. package/dist/commands/response.d.ts +2 -0
  22. package/dist/commands/response.js +241 -0
  23. package/dist/commands/response.js.map +1 -0
  24. package/dist/commands/sso.d.ts +2 -0
  25. package/dist/commands/sso.js +79 -0
  26. package/dist/commands/sso.js.map +1 -0
  27. package/dist/commands/survey.d.ts +2 -0
  28. package/dist/commands/survey.js +247 -0
  29. package/dist/commands/survey.js.map +1 -0
  30. package/dist/commands/tag.d.ts +2 -0
  31. package/dist/commands/tag.js +66 -0
  32. package/dist/commands/tag.js.map +1 -0
  33. package/dist/commands/user-system.d.ts +2 -0
  34. package/dist/commands/user-system.js +137 -0
  35. package/dist/commands/user-system.js.map +1 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.js +67 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/lib/auth.d.ts +4 -0
  40. package/dist/lib/auth.js +9 -0
  41. package/dist/lib/auth.js.map +1 -0
  42. package/dist/lib/command-helpers.d.ts +25 -0
  43. package/dist/lib/command-helpers.js +64 -0
  44. package/dist/lib/command-helpers.js.map +1 -0
  45. package/dist/lib/errors.d.ts +14 -0
  46. package/dist/lib/errors.js +52 -0
  47. package/dist/lib/errors.js.map +1 -0
  48. package/dist/lib/output.d.ts +6 -0
  49. package/dist/lib/output.js +59 -0
  50. package/dist/lib/output.js.map +1 -0
  51. package/dist/lib/stdin.d.ts +10 -0
  52. package/dist/lib/stdin.js +51 -0
  53. package/dist/lib/stdin.js.map +1 -0
  54. package/package.json +43 -0
@@ -0,0 +1,66 @@
1
+ import { listTags, addTag, modifyTag, deleteTag, } from "wjx-api-sdk";
2
+ import { executeCommand, requireField } from "../lib/command-helpers.js";
3
+ export function registerTagCommands(program) {
4
+ const tag = program.command("tag").description("标签管理");
5
+ // --- list ---
6
+ tag
7
+ .command("list")
8
+ .description("列出标签")
9
+ .option("--corpid <s>", "企业ID")
10
+ .action(async (_opts, cmd) => {
11
+ await executeCommand(program, cmd, listTags, (m) => ({
12
+ corpid: m.corpid,
13
+ }));
14
+ });
15
+ // --- add ---
16
+ tag
17
+ .command("add")
18
+ .description("添加标签")
19
+ .option("--child_names <json>", "标签路径JSON数组")
20
+ .option("--corpid <s>", "企业ID")
21
+ .option("--is_radio", "单选标签")
22
+ .action(async (_opts, cmd) => {
23
+ await executeCommand(program, cmd, addTag, (m) => {
24
+ requireField(m, "child_names");
25
+ return {
26
+ child_names: m.child_names,
27
+ corpid: m.corpid,
28
+ is_radio: m.is_radio,
29
+ };
30
+ });
31
+ });
32
+ // --- modify ---
33
+ tag
34
+ .command("modify")
35
+ .description("修改标签")
36
+ .option("--tp_id <s>", "标签组ID")
37
+ .option("--tp_name <s>", "标签组名称")
38
+ .option("--child_names <json>", "标签对象JSON数组")
39
+ .option("--corpid <s>", "企业ID")
40
+ .action(async (_opts, cmd) => {
41
+ await executeCommand(program, cmd, modifyTag, (m) => {
42
+ requireField(m, "tp_id");
43
+ return {
44
+ tp_id: m.tp_id,
45
+ tp_name: m.tp_name,
46
+ child_names: m.child_names,
47
+ corpid: m.corpid,
48
+ };
49
+ });
50
+ });
51
+ // --- delete ---
52
+ tag
53
+ .command("delete")
54
+ .description("删除标签")
55
+ .option("--type <s>", "类型: 1=按ID, 2=按名称")
56
+ .option("--tags <json>", "标签标识JSON数组")
57
+ .option("--corpid <s>", "企业ID")
58
+ .action(async (_opts, cmd) => {
59
+ await executeCommand(program, cmd, deleteTag, (m) => {
60
+ requireField(m, "type");
61
+ requireField(m, "tags");
62
+ return { type: m.type, tags: m.tags, corpid: m.corpid };
63
+ });
64
+ });
65
+ }
66
+ //# sourceMappingURL=tag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerUserSystemCommands(program: Command): void;
@@ -0,0 +1,137 @@
1
+ import { addParticipants, modifyParticipants, deleteParticipants, bindActivity, querySurveyBinding, queryUserSurveys, } from "wjx-api-sdk";
2
+ import { executeCommand, strictInt, requireField } from "../lib/command-helpers.js";
3
+ export function registerUserSystemCommands(program) {
4
+ const userSystem = program.command("user-system").description("用户系统管理");
5
+ // --- add-participants ---
6
+ userSystem
7
+ .command("add-participants")
8
+ .description("添加参与者")
9
+ .option("--username <s>", "用户名")
10
+ .option("--users <json>", "参与者JSON")
11
+ .option("--sysid <n>", "系统ID", strictInt)
12
+ .action(async (_opts, cmd) => {
13
+ await executeCommand(program, cmd, addParticipants, (m) => {
14
+ requireField(m, "username");
15
+ requireField(m, "users");
16
+ requireField(m, "sysid");
17
+ return { username: m.username, users: m.users, sysid: m.sysid };
18
+ });
19
+ });
20
+ // --- modify-participants ---
21
+ userSystem
22
+ .command("modify-participants")
23
+ .description("修改参与者")
24
+ .option("--username <s>", "用户名")
25
+ .option("--users <json>", "参与者JSON")
26
+ .option("--sysid <n>", "系统ID", strictInt)
27
+ .action(async (_opts, cmd) => {
28
+ await executeCommand(program, cmd, modifyParticipants, (m) => {
29
+ requireField(m, "username");
30
+ requireField(m, "users");
31
+ requireField(m, "sysid");
32
+ return { username: m.username, users: m.users, sysid: m.sysid };
33
+ });
34
+ });
35
+ // --- delete-participants ---
36
+ userSystem
37
+ .command("delete-participants")
38
+ .description("删除参与者")
39
+ .option("--username <s>", "用户名")
40
+ .option("--uids <json>", "用户ID JSON数组")
41
+ .option("--sysid <n>", "系统ID", strictInt)
42
+ .action(async (_opts, cmd) => {
43
+ await executeCommand(program, cmd, deleteParticipants, (m) => {
44
+ requireField(m, "username");
45
+ requireField(m, "uids");
46
+ requireField(m, "sysid");
47
+ return { username: m.username, uids: m.uids, sysid: m.sysid };
48
+ });
49
+ });
50
+ // --- bind ---
51
+ userSystem
52
+ .command("bind")
53
+ .description("绑定问卷到用户系统")
54
+ .option("--username <s>", "用户名")
55
+ .option("--vid <n>", "问卷ID", strictInt)
56
+ .option("--sysid <n>", "系统ID", strictInt)
57
+ .option("--uids <s>", "参与者ID列表")
58
+ .option("--answer_times <n>", "可答次数", strictInt)
59
+ .option("--can_chg_answer", "允许修改答案")
60
+ .option("--can_view_result", "允许查看结果")
61
+ .option("--can_hide_qlist <n>", "隐藏问卷列表", strictInt)
62
+ .action(async (_opts, cmd) => {
63
+ await executeCommand(program, cmd, bindActivity, (m) => {
64
+ requireField(m, "username");
65
+ requireField(m, "vid");
66
+ requireField(m, "sysid");
67
+ requireField(m, "uids");
68
+ return {
69
+ username: m.username,
70
+ vid: m.vid,
71
+ sysid: m.sysid,
72
+ uids: m.uids,
73
+ answer_times: m.answer_times,
74
+ can_chg_answer: m.can_chg_answer,
75
+ can_view_result: m.can_view_result,
76
+ can_hide_qlist: m.can_hide_qlist,
77
+ };
78
+ });
79
+ });
80
+ // --- query-binding ---
81
+ userSystem
82
+ .command("query-binding")
83
+ .description("查询问卷绑定关系")
84
+ .option("--username <s>", "用户名")
85
+ .option("--vid <n>", "问卷ID", strictInt)
86
+ .option("--sysid <n>", "系统ID", strictInt)
87
+ .option("--page_index <n>", "页码", strictInt)
88
+ .option("--page_size <n>", "每页数量", strictInt)
89
+ .option("--join_status <n>", "参与状态", strictInt)
90
+ .option("--day <s>", "按天筛选")
91
+ .option("--week <s>", "按周筛选")
92
+ .option("--month <s>", "按月筛选")
93
+ .option("--force_join_times", "强制参与次数")
94
+ .action(async (_opts, cmd) => {
95
+ await executeCommand(program, cmd, querySurveyBinding, (m) => {
96
+ requireField(m, "username");
97
+ requireField(m, "vid");
98
+ requireField(m, "sysid");
99
+ return {
100
+ username: m.username,
101
+ vid: m.vid,
102
+ sysid: m.sysid,
103
+ page_index: m.page_index,
104
+ page_size: m.page_size,
105
+ join_status: m.join_status,
106
+ day: m.day,
107
+ week: m.week,
108
+ month: m.month,
109
+ force_join_times: m.force_join_times,
110
+ };
111
+ });
112
+ });
113
+ // --- query-surveys ---
114
+ userSystem
115
+ .command("query-surveys")
116
+ .description("查询用户关联问卷")
117
+ .option("--username <s>", "用户名")
118
+ .option("--uid <s>", "参与者ID")
119
+ .option("--sysid <n>", "系统ID", strictInt)
120
+ .option("--page_index <n>", "页码", strictInt)
121
+ .option("--page_size <n>", "每页数量", strictInt)
122
+ .action(async (_opts, cmd) => {
123
+ await executeCommand(program, cmd, queryUserSurveys, (m) => {
124
+ requireField(m, "username");
125
+ requireField(m, "uid");
126
+ requireField(m, "sysid");
127
+ return {
128
+ username: m.username,
129
+ uid: m.uid,
130
+ sysid: m.sysid,
131
+ page_index: m.page_index,
132
+ page_size: m.page_size,
133
+ };
134
+ });
135
+ });
136
+ }
137
+ //# sourceMappingURL=user-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-system.js","sourceRoot":"","sources":["../../src/commands/user-system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ import { Command, CommanderError } from "commander";
3
+ import { registerSurveyCommands } from "./commands/survey.js";
4
+ import { registerDiagnosticCommands } from "./commands/diagnostics.js";
5
+ import { registerResponseCommands } from "./commands/response.js";
6
+ import { registerContactsCommands } from "./commands/contacts.js";
7
+ import { registerDepartmentCommands } from "./commands/department.js";
8
+ import { registerAdminCommands } from "./commands/admin.js";
9
+ import { registerTagCommands } from "./commands/tag.js";
10
+ import { registerUserSystemCommands } from "./commands/user-system.js";
11
+ import { registerAccountCommands } from "./commands/account.js";
12
+ import { registerSsoCommands } from "./commands/sso.js";
13
+ import { registerAnalyticsCommands } from "./commands/analytics.js";
14
+ import { readStdin } from "./lib/stdin.js";
15
+ import { handleError } from "./lib/errors.js";
16
+ const program = new Command();
17
+ program
18
+ .name("wjx")
19
+ .description("问卷星 (Wenjuanxing) CLI — AI Agent 原生命令行工具")
20
+ .version("0.1.0")
21
+ .option("--token <token>", "WJX API Token(或设置 WJX_TOKEN 环境变量)")
22
+ .option("--json", "JSON 输出(默认)")
23
+ .option("--table", "表格输出")
24
+ .option("--verbose", "详细输出")
25
+ .option("--stdin", "从 stdin 读取 JSON 参数");
26
+ // Prevent Commander from calling process.exit on errors — we handle it ourselves
27
+ program.exitOverride();
28
+ // Global preAction hook: read stdin and merge with command opts
29
+ program.hook("preAction", async (thisCommand, actionCommand) => {
30
+ const globalOpts = thisCommand.opts();
31
+ if (globalOpts.stdin) {
32
+ const stdinData = await readStdin();
33
+ if (Object.keys(stdinData).length > 0) {
34
+ // Store stdin data on the action command for executeCommand to pick up
35
+ actionCommand.__stdinData = stdinData;
36
+ }
37
+ }
38
+ });
39
+ registerSurveyCommands(program);
40
+ registerDiagnosticCommands(program);
41
+ registerResponseCommands(program);
42
+ registerContactsCommands(program);
43
+ registerDepartmentCommands(program);
44
+ registerAdminCommands(program);
45
+ registerTagCommands(program);
46
+ registerUserSystemCommands(program);
47
+ registerAccountCommands(program);
48
+ registerSsoCommands(program);
49
+ registerAnalyticsCommands(program);
50
+ (async () => {
51
+ try {
52
+ await program.parseAsync();
53
+ }
54
+ catch (err) {
55
+ // Commander throws CommanderError for --help, --version, missing args, etc.
56
+ if (err instanceof CommanderError) {
57
+ // help and version are normal exits
58
+ if (err.code === "commander.helpDisplayed" || err.code === "commander.version") {
59
+ process.exit(0);
60
+ }
61
+ // Missing required option, unknown option, etc. — treat as INPUT_ERROR
62
+ handleError(err);
63
+ }
64
+ handleError(err);
65
+ }
66
+ })();
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WjxCredentials } from "wjx-api-sdk";
2
+ export declare function getCredentials(globalOpts: {
3
+ token?: string;
4
+ }): WjxCredentials;
@@ -0,0 +1,9 @@
1
+ import { CliError } from "./errors.js";
2
+ export function getCredentials(globalOpts) {
3
+ const token = globalOpts.token || process.env.WJX_TOKEN;
4
+ if (!token) {
5
+ throw new CliError("AUTH_ERROR", "WJX_TOKEN 未设置。请通过 --token 参数或 WJX_TOKEN 环境变量提供。");
6
+ }
7
+ return { token };
8
+ }
9
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,UAAU,cAAc,CAAC,UAA8B;IAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,QAAQ,CAChB,YAAY,EACZ,iDAAiD,CAClD,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { Command } from "commander";
2
+ import type { WjxApiResponse } from "wjx-api-sdk";
3
+ /**
4
+ * Strict integer parser. Rejects garbage like "123abc".
5
+ */
6
+ export declare function strictInt(v: string): number;
7
+ /**
8
+ * Require a field in the merged input. Throws INPUT_ERROR if missing.
9
+ */
10
+ export declare function requireField(merged: Record<string, unknown>, field: string, label?: string): void;
11
+ interface ExecuteOpts {
12
+ noAuth?: boolean;
13
+ }
14
+ type SdkFunction = (input: any, creds: any, ...rest: any[]) => Promise<WjxApiResponse<any>>;
15
+ /**
16
+ * Central command executor.
17
+ * - Merges stdin data with CLI opts (source-aware)
18
+ * - Gets credentials (unless noAuth)
19
+ * - Calls SDK function
20
+ * - Checks result===false (P0 fix)
21
+ * - Formats output to stdout
22
+ * - Routes errors to stderr JSON with correct exit codes
23
+ */
24
+ export declare function executeCommand(program: Command, actionCommand: Command, sdkFn: SdkFunction, buildInput: (merged: Record<string, unknown>) => Record<string, unknown>, opts?: ExecuteOpts): Promise<void>;
25
+ export {};
@@ -0,0 +1,64 @@
1
+ import { getCredentials } from "./auth.js";
2
+ import { formatOutput } from "./output.js";
3
+ import { CliError, handleError } from "./errors.js";
4
+ import { mergeStdinWithOpts } from "./stdin.js";
5
+ /**
6
+ * Strict integer parser. Rejects garbage like "123abc".
7
+ */
8
+ export function strictInt(v) {
9
+ const n = Number(v);
10
+ if (!Number.isInteger(n)) {
11
+ throw new CliError("INPUT_ERROR", `Invalid integer: "${v}"`);
12
+ }
13
+ return n;
14
+ }
15
+ /**
16
+ * Require a field in the merged input. Throws INPUT_ERROR if missing.
17
+ */
18
+ export function requireField(merged, field, label) {
19
+ if (merged[field] === undefined || merged[field] === null) {
20
+ throw new CliError("INPUT_ERROR", `Missing required option: --${label || field}`);
21
+ }
22
+ }
23
+ /**
24
+ * Central command executor.
25
+ * - Merges stdin data with CLI opts (source-aware)
26
+ * - Gets credentials (unless noAuth)
27
+ * - Calls SDK function
28
+ * - Checks result===false (P0 fix)
29
+ * - Formats output to stdout
30
+ * - Routes errors to stderr JSON with correct exit codes
31
+ */
32
+ export async function executeCommand(program, actionCommand, sdkFn, buildInput, opts = {}) {
33
+ try {
34
+ // Source-aware merge: stdin base + CLI-explicit overrides
35
+ const stdinData = actionCommand.__stdinData;
36
+ const commandOpts = actionCommand.opts();
37
+ let merged;
38
+ if (stdinData && Object.keys(stdinData).length > 0) {
39
+ merged = mergeStdinWithOpts(stdinData, actionCommand);
40
+ }
41
+ else {
42
+ merged = { ...commandOpts };
43
+ }
44
+ const input = buildInput(merged);
45
+ if (opts.noAuth) {
46
+ // Local commands (e.g. buildSurveyUrl) — call with input only
47
+ const localFn = sdkFn;
48
+ const result = localFn(input);
49
+ formatOutput(result, program.opts());
50
+ return;
51
+ }
52
+ const creds = getCredentials(program.opts());
53
+ const result = await sdkFn(input, creds);
54
+ // P0 fix: detect SDK API failure response
55
+ if (result.result === false) {
56
+ throw new CliError("API_ERROR", result.errormsg || "API request failed");
57
+ }
58
+ formatOutput(result, program.opts());
59
+ }
60
+ catch (e) {
61
+ handleError(e);
62
+ }
63
+ }
64
+ //# sourceMappingURL=command-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-helpers.js","sourceRoot":"","sources":["../../src/lib/command-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAA+B,EAAE,KAAa,EAAE,KAAc;IACzF,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1D,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,8BAA8B,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;IACpF,CAAC;AACH,CAAC;AASD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAgB,EAChB,aAAsB,EACtB,KAAkB,EAClB,UAAwE,EACxE,OAAoB,EAAE;IAEtB,IAAI,CAAC;QACH,0DAA0D;QAC1D,MAAM,SAAS,GAAI,aAAoD,CAAC,WAAkD,CAAC;QAC3H,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,MAA+B,CAAC;QAEpC,IAAI,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,MAAM,GAAG,kBAAkB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;QAC9B,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAEjC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,8DAA8D;YAC9D,MAAM,OAAO,GAAG,KAA+D,CAAC;YAChF,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAEzC,0CAA0C;QAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC5B,MAAM,IAAI,QAAQ,CAChB,WAAW,EACX,MAAM,CAAC,QAAQ,IAAI,oBAAoB,CACxC,CAAC;QACJ,CAAC;QAED,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,WAAW,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type ErrorCode = "API_ERROR" | "INPUT_ERROR" | "AUTH_ERROR";
2
+ export declare class CliError extends Error {
3
+ readonly code: ErrorCode;
4
+ readonly exitCode: number;
5
+ constructor(code: ErrorCode, message: string);
6
+ }
7
+ /**
8
+ * Write structured JSON error to stderr and exit.
9
+ */
10
+ export declare function stderrJson(code: ErrorCode, message: string): never;
11
+ /**
12
+ * Central error handler. Classifies the error, writes stderr JSON, exits.
13
+ */
14
+ export declare function handleError(err: unknown): never;
@@ -0,0 +1,52 @@
1
+ const EXIT_CODES = {
2
+ API_ERROR: 1,
3
+ AUTH_ERROR: 1,
4
+ INPUT_ERROR: 2,
5
+ };
6
+ export class CliError extends Error {
7
+ code;
8
+ exitCode;
9
+ constructor(code, message) {
10
+ super(message);
11
+ this.name = "CliError";
12
+ this.code = code;
13
+ this.exitCode = EXIT_CODES[code];
14
+ }
15
+ }
16
+ /**
17
+ * Write structured JSON error to stderr and exit.
18
+ */
19
+ export function stderrJson(code, message) {
20
+ const exitCode = EXIT_CODES[code];
21
+ process.stderr.write(JSON.stringify({ error: true, message, code, exitCode }) + "\n");
22
+ process.exit(exitCode);
23
+ }
24
+ /**
25
+ * Classify an unknown error into a CliError.
26
+ * SDK validation errors (e.g. validateQuestionsJson) are INPUT_ERROR.
27
+ */
28
+ function classifyError(err) {
29
+ if (err instanceof CliError)
30
+ return err;
31
+ if (err instanceof SyntaxError) {
32
+ return new CliError("INPUT_ERROR", err.message);
33
+ }
34
+ if (err instanceof Error) {
35
+ // SDK validation errors contain these patterns
36
+ if (err.message.includes("must be valid JSON") ||
37
+ err.message.includes("must be a JSON array") ||
38
+ err.message.includes("missing required field")) {
39
+ return new CliError("INPUT_ERROR", err.message);
40
+ }
41
+ return new CliError("API_ERROR", err.message);
42
+ }
43
+ return new CliError("API_ERROR", String(err));
44
+ }
45
+ /**
46
+ * Central error handler. Classifies the error, writes stderr JSON, exits.
47
+ */
48
+ export function handleError(err) {
49
+ const cliErr = classifyError(err);
50
+ stderrJson(cliErr.code, cliErr.message);
51
+ }
52
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAA8B;IAC5C,SAAS,EAAE,CAAC;IACZ,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,CAAC;CACf,CAAC;AAEF,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAY;IAChB,QAAQ,CAAS;IAE1B,YAAY,IAAe,EAAE,OAAe;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAe,EAAE,OAAe;IACzD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAChE,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,GAAG,YAAY,QAAQ;QAAE,OAAO,GAAG,CAAC;IAExC,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;QAC/B,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,+CAA+C;QAC/C,IACE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAC1C,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YAC5C,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAC9C,CAAC;YACD,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAClC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface OutputOpts {
2
+ json?: boolean;
3
+ table?: boolean;
4
+ verbose?: boolean;
5
+ }
6
+ export declare function formatOutput(data: unknown, opts: OutputOpts): void;
@@ -0,0 +1,59 @@
1
+ export function formatOutput(data, opts) {
2
+ if (opts.table) {
3
+ printTable(data);
4
+ }
5
+ else {
6
+ console.log(JSON.stringify(data, null, 2));
7
+ }
8
+ }
9
+ function printTable(data) {
10
+ if (data === null || data === undefined) {
11
+ console.log("(empty)");
12
+ return;
13
+ }
14
+ // If it's an API response with result/data, unwrap
15
+ const obj = data;
16
+ const payload = obj.result !== undefined && obj.data !== undefined ? obj.data : data;
17
+ if (Array.isArray(payload)) {
18
+ if (payload.length === 0) {
19
+ console.log("(empty)");
20
+ return;
21
+ }
22
+ console.table(payload);
23
+ return;
24
+ }
25
+ if (typeof payload === "object" && payload !== null) {
26
+ const record = payload;
27
+ // If it contains a list/array field, table that
28
+ for (const key of ["survey_list", "list", "items", "data", "rows"]) {
29
+ if (Array.isArray(record[key])) {
30
+ console.table(record[key]);
31
+ return;
32
+ }
33
+ }
34
+ // activitys is a vid→object map from listSurveys — convert to array
35
+ for (const key of ["activitys", "activities"]) {
36
+ const val = record[key];
37
+ if (val && typeof val === "object" && !Array.isArray(val)) {
38
+ const arr = Object.values(val);
39
+ if (arr.length > 0 && typeof arr[0] === "object") {
40
+ const simplified = arr.map((item) => {
41
+ const r = item;
42
+ return { vid: r.vid, title: r.title, status: r.status, answers: r.answer_valid, created: r.create_date, creator: r.creater };
43
+ });
44
+ console.table(simplified);
45
+ return;
46
+ }
47
+ }
48
+ }
49
+ // Single object — show key/value pairs
50
+ const rows = Object.entries(record).map(([k, v]) => ({
51
+ key: k,
52
+ value: typeof v === "object" ? JSON.stringify(v) : String(v ?? ""),
53
+ }));
54
+ console.table(rows);
55
+ return;
56
+ }
57
+ console.log(String(payload));
58
+ }
59
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Command } from "commander";
2
+ /**
3
+ * Read JSON from stdin. Returns parsed object or empty object if no data.
4
+ */
5
+ export declare function readStdin(): Promise<Record<string, unknown>>;
6
+ /**
7
+ * Source-aware merge: stdin as base, only CLI-explicit args override.
8
+ * Uses Commander's getOptionValueSource() to distinguish user input from defaults.
9
+ */
10
+ export declare function mergeStdinWithOpts(stdinData: Record<string, unknown>, command: Command): Record<string, unknown>;
@@ -0,0 +1,51 @@
1
+ import { CliError } from "./errors.js";
2
+ /**
3
+ * Read JSON from stdin. Returns parsed object or empty object if no data.
4
+ */
5
+ export async function readStdin() {
6
+ // If stdin is a TTY (no pipe), return empty
7
+ if (process.stdin.isTTY) {
8
+ return {};
9
+ }
10
+ const chunks = [];
11
+ for await (const chunk of process.stdin) {
12
+ chunks.push(chunk);
13
+ }
14
+ const raw = Buffer.concat(chunks).toString("utf8").trim();
15
+ if (!raw) {
16
+ return {};
17
+ }
18
+ try {
19
+ const parsed = JSON.parse(raw);
20
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
21
+ throw new CliError("INPUT_ERROR", "stdin JSON must be an object, got " + typeof parsed);
22
+ }
23
+ return parsed;
24
+ }
25
+ catch (e) {
26
+ if (e instanceof CliError)
27
+ throw e;
28
+ throw new CliError("INPUT_ERROR", `stdin JSON parse error: ${e instanceof Error ? e.message : String(e)}`);
29
+ }
30
+ }
31
+ /**
32
+ * Source-aware merge: stdin as base, only CLI-explicit args override.
33
+ * Uses Commander's getOptionValueSource() to distinguish user input from defaults.
34
+ */
35
+ export function mergeStdinWithOpts(stdinData, command) {
36
+ const opts = command.opts();
37
+ const merged = { ...stdinData };
38
+ for (const key of Object.keys(opts)) {
39
+ // Skip internal flags
40
+ if (key === "stdin" || key === "token" || key === "json" || key === "table" || key === "verbose") {
41
+ continue;
42
+ }
43
+ const source = command.getOptionValueSource(key);
44
+ // Only override stdin with explicitly provided CLI values, not defaults
45
+ if (source === "cli") {
46
+ merged[key] = opts[key];
47
+ }
48
+ }
49
+ return merged;
50
+ }
51
+ //# sourceMappingURL=stdin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.js","sourceRoot":"","sources":["../../src/lib/stdin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,4CAA4C;IAC5C,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAE1D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,oCAAoC,GAAG,OAAO,MAAM,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,MAAiC,CAAC;IAC3C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,QAAQ;YAAE,MAAM,CAAC,CAAC;QACnC,MAAM,IAAI,QAAQ,CAChB,aAAa,EACb,2BAA2B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACxE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAkC,EAClC,OAAgB;IAEhB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,MAAM,GAA4B,EAAE,GAAG,SAAS,EAAE,CAAC;IAEzD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,sBAAsB;QACtB,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACjG,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACjD,wEAAwE;QACxE,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}