specforge-cli 0.1.1

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 (105) hide show
  1. package/dist/commands/access.d.ts +3 -0
  2. package/dist/commands/access.d.ts.map +1 -0
  3. package/dist/commands/access.js +98 -0
  4. package/dist/commands/access.js.map +1 -0
  5. package/dist/commands/amendments.d.ts +3 -0
  6. package/dist/commands/amendments.d.ts.map +1 -0
  7. package/dist/commands/amendments.js +61 -0
  8. package/dist/commands/amendments.js.map +1 -0
  9. package/dist/commands/audit.d.ts +3 -0
  10. package/dist/commands/audit.d.ts.map +1 -0
  11. package/dist/commands/audit.js +73 -0
  12. package/dist/commands/audit.js.map +1 -0
  13. package/dist/commands/auth.d.ts +3 -0
  14. package/dist/commands/auth.d.ts.map +1 -0
  15. package/dist/commands/auth.js +275 -0
  16. package/dist/commands/auth.js.map +1 -0
  17. package/dist/commands/config.d.ts +3 -0
  18. package/dist/commands/config.d.ts.map +1 -0
  19. package/dist/commands/config.js +66 -0
  20. package/dist/commands/config.js.map +1 -0
  21. package/dist/commands/diff.d.ts +3 -0
  22. package/dist/commands/diff.d.ts.map +1 -0
  23. package/dist/commands/diff.js +85 -0
  24. package/dist/commands/diff.js.map +1 -0
  25. package/dist/commands/export.d.ts +3 -0
  26. package/dist/commands/export.d.ts.map +1 -0
  27. package/dist/commands/export.js +162 -0
  28. package/dist/commands/export.js.map +1 -0
  29. package/dist/commands/features.d.ts +3 -0
  30. package/dist/commands/features.d.ts.map +1 -0
  31. package/dist/commands/features.js +134 -0
  32. package/dist/commands/features.js.map +1 -0
  33. package/dist/commands/media.d.ts +3 -0
  34. package/dist/commands/media.d.ts.map +1 -0
  35. package/dist/commands/media.js +142 -0
  36. package/dist/commands/media.js.map +1 -0
  37. package/dist/commands/notifications.d.ts +3 -0
  38. package/dist/commands/notifications.d.ts.map +1 -0
  39. package/dist/commands/notifications.js +75 -0
  40. package/dist/commands/notifications.js.map +1 -0
  41. package/dist/commands/org.d.ts +3 -0
  42. package/dist/commands/org.d.ts.map +1 -0
  43. package/dist/commands/org.js +145 -0
  44. package/dist/commands/org.js.map +1 -0
  45. package/dist/commands/project.d.ts +3 -0
  46. package/dist/commands/project.d.ts.map +1 -0
  47. package/dist/commands/project.js +205 -0
  48. package/dist/commands/project.js.map +1 -0
  49. package/dist/commands/review.d.ts +3 -0
  50. package/dist/commands/review.d.ts.map +1 -0
  51. package/dist/commands/review.js +102 -0
  52. package/dist/commands/review.js.map +1 -0
  53. package/dist/commands/sign.d.ts +3 -0
  54. package/dist/commands/sign.d.ts.map +1 -0
  55. package/dist/commands/sign.js +152 -0
  56. package/dist/commands/sign.js.map +1 -0
  57. package/dist/commands/spec.d.ts +3 -0
  58. package/dist/commands/spec.d.ts.map +1 -0
  59. package/dist/commands/spec.js +157 -0
  60. package/dist/commands/spec.js.map +1 -0
  61. package/dist/commands/user.d.ts +3 -0
  62. package/dist/commands/user.d.ts.map +1 -0
  63. package/dist/commands/user.js +117 -0
  64. package/dist/commands/user.js.map +1 -0
  65. package/dist/commands/verify.d.ts +3 -0
  66. package/dist/commands/verify.d.ts.map +1 -0
  67. package/dist/commands/verify.js +59 -0
  68. package/dist/commands/verify.js.map +1 -0
  69. package/dist/commands/version.d.ts +3 -0
  70. package/dist/commands/version.d.ts.map +1 -0
  71. package/dist/commands/version.js +167 -0
  72. package/dist/commands/version.js.map +1 -0
  73. package/dist/commands/webhook.d.ts +3 -0
  74. package/dist/commands/webhook.d.ts.map +1 -0
  75. package/dist/commands/webhook.js +201 -0
  76. package/dist/commands/webhook.js.map +1 -0
  77. package/dist/index.d.ts +24 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +82 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/lib/auth.d.ts +24 -0
  82. package/dist/lib/auth.d.ts.map +1 -0
  83. package/dist/lib/auth.js +92 -0
  84. package/dist/lib/auth.js.map +1 -0
  85. package/dist/lib/client.d.ts +6 -0
  86. package/dist/lib/client.d.ts.map +1 -0
  87. package/dist/lib/client.js +8 -0
  88. package/dist/lib/client.js.map +1 -0
  89. package/dist/lib/config.d.ts +15 -0
  90. package/dist/lib/config.d.ts.map +1 -0
  91. package/dist/lib/config.js +41 -0
  92. package/dist/lib/config.js.map +1 -0
  93. package/dist/lib/errors.d.ts +21 -0
  94. package/dist/lib/errors.d.ts.map +1 -0
  95. package/dist/lib/errors.js +41 -0
  96. package/dist/lib/errors.js.map +1 -0
  97. package/dist/lib/exit-codes.d.ts +30 -0
  98. package/dist/lib/exit-codes.d.ts.map +1 -0
  99. package/dist/lib/exit-codes.js +41 -0
  100. package/dist/lib/exit-codes.js.map +1 -0
  101. package/dist/lib/output.d.ts +7 -0
  102. package/dist/lib/output.d.ts.map +1 -0
  103. package/dist/lib/output.js +60 -0
  104. package/dist/lib/output.js.map +1 -0
  105. package/package.json +42 -0
@@ -0,0 +1,102 @@
1
+ import { defineCommand } from "citty";
2
+ import { createClient } from "specforge-sdk";
3
+ import { loadConfig, requireAuth } from "../lib/config";
4
+ import { handleApiResult, handleError } from "../lib/errors";
5
+ import { outputResult } from "../lib/output";
6
+ function getClient() {
7
+ const config = loadConfig();
8
+ const token = requireAuth(config);
9
+ return createClient({ baseUrl: config.baseUrl, auth: { accessToken: token } });
10
+ }
11
+ export default defineCommand({
12
+ meta: { name: "review", description: "Review management" },
13
+ subCommands: {
14
+ approve: defineCommand({
15
+ meta: { name: "approve", description: "Approve a specification" },
16
+ args: {
17
+ "spec-id": { type: "string", description: "Specification ID", required: true },
18
+ quiet: {
19
+ type: "boolean",
20
+ description: "Suppress output",
21
+ alias: "q",
22
+ default: false,
23
+ },
24
+ json: { type: "boolean", description: "Output as JSON", default: false },
25
+ },
26
+ async run({ args }) {
27
+ try {
28
+ const client = getClient();
29
+ const result = await client.reviews.submit(args["spec-id"], {
30
+ status: "APPROVED",
31
+ });
32
+ if (!args.quiet) {
33
+ outputResult(handleApiResult(result), args.json);
34
+ }
35
+ }
36
+ catch (error) {
37
+ handleError(error);
38
+ }
39
+ },
40
+ }),
41
+ "request-changes": defineCommand({
42
+ meta: {
43
+ name: "request-changes",
44
+ description: "Request changes on a specification",
45
+ },
46
+ args: {
47
+ "spec-id": { type: "string", description: "Specification ID", required: true },
48
+ comment: { type: "string", description: "Comment text" },
49
+ quiet: {
50
+ type: "boolean",
51
+ description: "Suppress output",
52
+ alias: "q",
53
+ default: false,
54
+ },
55
+ json: { type: "boolean", description: "Output as JSON", default: false },
56
+ },
57
+ async run({ args }) {
58
+ try {
59
+ const client = getClient();
60
+ const result = await client.reviews.submit(args["spec-id"], {
61
+ status: "CHANGES_REQUESTED",
62
+ });
63
+ if (!args.quiet) {
64
+ outputResult(handleApiResult(result), args.json);
65
+ }
66
+ }
67
+ catch (error) {
68
+ handleError(error);
69
+ }
70
+ },
71
+ }),
72
+ list: defineCommand({
73
+ meta: { name: "list", description: "List reviews for a specification" },
74
+ args: {
75
+ "spec-id": { type: "string", description: "Specification ID", required: true },
76
+ format: {
77
+ type: "string",
78
+ description: "Output format (json, table, yaml)",
79
+ default: "table",
80
+ },
81
+ json: { type: "boolean", description: "Output as JSON", default: false },
82
+ },
83
+ async run({ args }) {
84
+ try {
85
+ const client = getClient();
86
+ const result = await client.reviews.list(args["spec-id"]);
87
+ const isJson = args.json || args.format === "json";
88
+ outputResult(handleApiResult(result), isJson, [
89
+ "id",
90
+ "status",
91
+ "reviewerName",
92
+ "createdAt",
93
+ ]);
94
+ }
95
+ catch (error) {
96
+ handleError(error);
97
+ }
98
+ },
99
+ }),
100
+ },
101
+ });
102
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("citty").CommandDef<import("citty").ArgsDef>;
2
+ export default _default;
3
+ //# sourceMappingURL=sign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../src/commands/sign.ts"],"names":[],"mappings":";AAYA,wBAuJG"}
@@ -0,0 +1,152 @@
1
+ import { defineCommand } from "citty";
2
+ import { createClient } from "specforge-sdk";
3
+ import { loadConfig, requireAuth } from "../lib/config";
4
+ import { handleApiResult, handleError } from "../lib/errors";
5
+ import { outputResult } from "../lib/output";
6
+ function getClient() {
7
+ const config = loadConfig();
8
+ const token = requireAuth(config);
9
+ return createClient({ baseUrl: config.baseUrl, auth: { accessToken: token } });
10
+ }
11
+ export default defineCommand({
12
+ meta: { name: "sign", description: "Signature workflow management" },
13
+ subCommands: {
14
+ init: defineCommand({
15
+ meta: { name: "init", description: "Initialize a signature workflow" },
16
+ args: {
17
+ "spec-id": { type: "string", description: "Specification ID", required: true },
18
+ "version-id": { type: "string", description: "Version ID", required: true },
19
+ signatories: {
20
+ type: "string",
21
+ description: "Signatories as JSON array [{email, name}]",
22
+ required: true,
23
+ },
24
+ quiet: {
25
+ type: "boolean",
26
+ description: "Suppress output",
27
+ alias: "q",
28
+ default: false,
29
+ },
30
+ json: { type: "boolean", description: "Output as JSON", default: false },
31
+ },
32
+ async run({ args }) {
33
+ try {
34
+ const client = getClient();
35
+ const signatories = JSON.parse(args.signatories);
36
+ const result = await client.signatures.initWorkflow(args["spec-id"], {
37
+ versionId: args["version-id"],
38
+ signatories,
39
+ });
40
+ if (!args.quiet) {
41
+ outputResult(handleApiResult(result), args.json);
42
+ }
43
+ }
44
+ catch (error) {
45
+ handleError(error);
46
+ }
47
+ },
48
+ }),
49
+ status: defineCommand({
50
+ meta: { name: "status", description: "Show signature workflow status" },
51
+ args: {
52
+ "spec-id": { type: "string", description: "Specification ID", required: true },
53
+ "workflow-id": { type: "string", description: "Workflow ID" },
54
+ format: {
55
+ type: "string",
56
+ description: "Output format (json, table, yaml)",
57
+ default: "table",
58
+ },
59
+ json: { type: "boolean", description: "Output as JSON", default: false },
60
+ },
61
+ async run({ args }) {
62
+ try {
63
+ const client = getClient();
64
+ const specId = args["spec-id"];
65
+ const workflowId = args["workflow-id"];
66
+ const isJson = args.json || args.format === "json";
67
+ if (workflowId) {
68
+ const result = await client.signatures.getWorkflow(specId, workflowId);
69
+ outputResult(handleApiResult(result), isJson);
70
+ }
71
+ else {
72
+ const result = await client.signatures.listWorkflows(specId);
73
+ outputResult(handleApiResult(result), isJson, ["id", "status", "createdAt"]);
74
+ }
75
+ }
76
+ catch (error) {
77
+ handleError(error);
78
+ }
79
+ },
80
+ }),
81
+ cancel: defineCommand({
82
+ meta: { name: "cancel", description: "Cancel a signature workflow" },
83
+ args: {
84
+ "spec-id": { type: "string", description: "Specification ID", required: true },
85
+ "workflow-id": { type: "string", description: "Workflow ID", required: true },
86
+ yes: {
87
+ type: "boolean",
88
+ description: "Skip confirmation prompt",
89
+ alias: "y",
90
+ default: false,
91
+ },
92
+ quiet: {
93
+ type: "boolean",
94
+ description: "Suppress output",
95
+ alias: "q",
96
+ default: false,
97
+ },
98
+ json: { type: "boolean", description: "Output as JSON", default: false },
99
+ },
100
+ async run({ args }) {
101
+ try {
102
+ const client = getClient();
103
+ const result = await client.signatures.cancelWorkflow(args["spec-id"], args["workflow-id"]);
104
+ if (!args.quiet) {
105
+ outputResult(handleApiResult(result), args.json);
106
+ }
107
+ }
108
+ catch (error) {
109
+ handleError(error);
110
+ }
111
+ },
112
+ }),
113
+ sign: defineCommand({
114
+ meta: { name: "sign", description: "Sign a specification" },
115
+ args: {
116
+ "spec-id": { type: "string", description: "Specification ID", required: true },
117
+ "workflow-id": { type: "string", description: "Workflow ID", required: true },
118
+ json: { type: "boolean", description: "Output as JSON", default: false },
119
+ },
120
+ async run({ args }) {
121
+ try {
122
+ const client = getClient();
123
+ const result = await client.signatures.sign(args["spec-id"], args["workflow-id"]);
124
+ outputResult(handleApiResult(result), args.json);
125
+ }
126
+ catch (error) {
127
+ handleError(error);
128
+ }
129
+ },
130
+ }),
131
+ decline: defineCommand({
132
+ meta: { name: "decline", description: "Decline a signature request" },
133
+ args: {
134
+ "spec-id": { type: "string", description: "Specification ID", required: true },
135
+ "workflow-id": { type: "string", description: "Workflow ID", required: true },
136
+ reason: { type: "string", description: "Decline reason", required: true },
137
+ json: { type: "boolean", description: "Output as JSON", default: false },
138
+ },
139
+ async run({ args }) {
140
+ try {
141
+ const client = getClient();
142
+ const result = await client.signatures.decline(args["spec-id"], args["workflow-id"], args.reason);
143
+ outputResult(handleApiResult(result), args.json);
144
+ }
145
+ catch (error) {
146
+ handleError(error);
147
+ }
148
+ },
149
+ }),
150
+ },
151
+ });
152
+ //# sourceMappingURL=sign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign.js","sourceRoot":"","sources":["../../src/commands/sign.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("citty").CommandDef<import("citty").ArgsDef>;
2
+ export default _default;
3
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":";AAYA,wBAgJG"}
@@ -0,0 +1,157 @@
1
+ import { defineCommand } from "citty";
2
+ import { createClient } from "specforge-sdk";
3
+ import { loadConfig, requireAuth } from "../lib/config";
4
+ import { handleApiResult, handleError } from "../lib/errors";
5
+ import { outputResult } from "../lib/output";
6
+ function getClient() {
7
+ const config = loadConfig();
8
+ const token = requireAuth(config);
9
+ return createClient({ baseUrl: config.baseUrl, auth: { accessToken: token } });
10
+ }
11
+ export default defineCommand({
12
+ meta: { name: "spec", description: "Specification management" },
13
+ subCommands: {
14
+ create: defineCommand({
15
+ meta: { name: "create", description: "Create a new specification" },
16
+ args: {
17
+ title: { type: "string", description: "Specification title", required: true },
18
+ "project-id": { type: "string", description: "Project ID", required: true },
19
+ content: { type: "string", description: "Markdown content", required: true },
20
+ frontmatter: { type: "string", description: "YAML frontmatter" },
21
+ quiet: {
22
+ type: "boolean",
23
+ description: "Suppress output",
24
+ alias: "q",
25
+ default: false,
26
+ },
27
+ json: { type: "boolean", description: "Output as JSON", default: false },
28
+ },
29
+ async run({ args }) {
30
+ try {
31
+ const client = getClient();
32
+ const result = await client.specifications.create({
33
+ title: args.title,
34
+ projectId: args["project-id"],
35
+ content: args.content,
36
+ frontmatter: args.frontmatter,
37
+ });
38
+ if (!args.quiet) {
39
+ outputResult(handleApiResult(result), args.json);
40
+ }
41
+ }
42
+ catch (error) {
43
+ handleError(error);
44
+ }
45
+ },
46
+ }),
47
+ list: defineCommand({
48
+ meta: { name: "list", description: "List specifications" },
49
+ args: {
50
+ "project-id": { type: "string", description: "Filter by project ID" },
51
+ status: { type: "string", description: "Filter by status" },
52
+ page: { type: "string", description: "Page number" },
53
+ format: {
54
+ type: "string",
55
+ description: "Output format (json, table, yaml)",
56
+ default: "table",
57
+ },
58
+ json: { type: "boolean", description: "Output as JSON", default: false },
59
+ },
60
+ async run({ args }) {
61
+ try {
62
+ const client = getClient();
63
+ const pageStr = args.page;
64
+ const result = await client.specifications.list({
65
+ projectId: args["project-id"],
66
+ status: args.status,
67
+ page: pageStr ? Number(pageStr) : undefined,
68
+ });
69
+ const isJson = args.json || args.format === "json";
70
+ outputResult(handleApiResult(result), isJson, ["id", "title", "status", "createdAt"]);
71
+ }
72
+ catch (error) {
73
+ handleError(error);
74
+ }
75
+ },
76
+ }),
77
+ show: defineCommand({
78
+ meta: { name: "show", description: "Show specification details" },
79
+ args: {
80
+ id: { type: "string", description: "Specification ID", required: true },
81
+ json: { type: "boolean", description: "Output as JSON", default: false },
82
+ },
83
+ async run({ args }) {
84
+ try {
85
+ const client = getClient();
86
+ const result = await client.specifications.get(args.id);
87
+ outputResult(handleApiResult(result), args.json);
88
+ }
89
+ catch (error) {
90
+ handleError(error);
91
+ }
92
+ },
93
+ }),
94
+ edit: defineCommand({
95
+ meta: { name: "edit", description: "Edit a specification" },
96
+ args: {
97
+ id: { type: "string", description: "Specification ID", required: true },
98
+ title: { type: "string", description: "New title" },
99
+ quiet: {
100
+ type: "boolean",
101
+ description: "Suppress output",
102
+ alias: "q",
103
+ default: false,
104
+ },
105
+ json: { type: "boolean", description: "Output as JSON", default: false },
106
+ },
107
+ async run({ args }) {
108
+ try {
109
+ const client = getClient();
110
+ const result = await client.specifications.update(args.id, {
111
+ title: args.title,
112
+ });
113
+ if (!args.quiet) {
114
+ outputResult(handleApiResult(result), args.json);
115
+ }
116
+ }
117
+ catch (error) {
118
+ handleError(error);
119
+ }
120
+ },
121
+ }),
122
+ delete: defineCommand({
123
+ meta: { name: "delete", description: "Delete a specification" },
124
+ args: {
125
+ id: { type: "string", description: "Specification ID", required: true },
126
+ yes: {
127
+ type: "boolean",
128
+ description: "Skip confirmation prompt",
129
+ alias: "y",
130
+ default: false,
131
+ },
132
+ quiet: {
133
+ type: "boolean",
134
+ description: "Suppress output",
135
+ alias: "q",
136
+ default: false,
137
+ },
138
+ json: { type: "boolean", description: "Output as JSON", default: false },
139
+ },
140
+ async run({ args }) {
141
+ try {
142
+ const client = getClient();
143
+ const id = args.id;
144
+ const result = await client.specifications.delete(id);
145
+ handleApiResult(result);
146
+ if (!args.quiet) {
147
+ outputResult({ message: `Specification ${id} deleted.` }, args.json);
148
+ }
149
+ }
150
+ catch (error) {
151
+ handleError(error);
152
+ }
153
+ },
154
+ }),
155
+ },
156
+ });
157
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("citty").CommandDef<import("citty").ArgsDef>;
2
+ export default _default;
3
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/commands/user.ts"],"names":[],"mappings":";AAYA,wBAuGG"}
@@ -0,0 +1,117 @@
1
+ import { defineCommand } from "citty";
2
+ import { createClient } from "specforge-sdk";
3
+ import { loadConfig, requireAuth } from "../lib/config";
4
+ import { handleApiResult, handleError } from "../lib/errors";
5
+ import { outputResult } from "../lib/output";
6
+ function getClient() {
7
+ const config = loadConfig();
8
+ const token = requireAuth(config);
9
+ return createClient({ baseUrl: config.baseUrl, auth: { accessToken: token } });
10
+ }
11
+ export default defineCommand({
12
+ meta: { name: "user", description: "User account management" },
13
+ subCommands: {
14
+ show: defineCommand({
15
+ meta: { name: "show", description: "Show current user profile" },
16
+ args: {
17
+ json: { type: "boolean", description: "Output as JSON", default: false },
18
+ },
19
+ async run({ args }) {
20
+ try {
21
+ const client = getClient();
22
+ const result = await client.user.getMe();
23
+ outputResult(handleApiResult(result), args.json);
24
+ }
25
+ catch (error) {
26
+ handleError(error);
27
+ }
28
+ },
29
+ }),
30
+ update: defineCommand({
31
+ meta: { name: "update", description: "Update user profile" },
32
+ args: {
33
+ name: { type: "string", description: "Display name" },
34
+ language: { type: "string", description: "Preferred language" },
35
+ json: { type: "boolean", description: "Output as JSON", default: false },
36
+ },
37
+ async run({ args }) {
38
+ try {
39
+ const client = getClient();
40
+ const result = await client.user.updateMe({
41
+ name: args.name,
42
+ language: args.language,
43
+ });
44
+ outputResult(handleApiResult(result), args.json);
45
+ }
46
+ catch (error) {
47
+ handleError(error);
48
+ }
49
+ },
50
+ }),
51
+ export: defineCommand({
52
+ meta: { name: "export", description: "Request a data export" },
53
+ args: {
54
+ json: { type: "boolean", description: "Output as JSON", default: false },
55
+ },
56
+ async run({ args }) {
57
+ try {
58
+ const client = getClient();
59
+ const result = await client.user.requestExport();
60
+ outputResult(handleApiResult(result), args.json);
61
+ }
62
+ catch (error) {
63
+ handleError(error);
64
+ }
65
+ },
66
+ }),
67
+ delete: defineCommand({
68
+ meta: { name: "delete", description: "Delete user account" },
69
+ args: {
70
+ json: { type: "boolean", description: "Output as JSON", default: false },
71
+ },
72
+ async run({ args }) {
73
+ try {
74
+ const client = getClient();
75
+ const result = await client.user.deleteAccount();
76
+ outputResult(handleApiResult(result), args.json);
77
+ }
78
+ catch (error) {
79
+ handleError(error);
80
+ }
81
+ },
82
+ }),
83
+ onboarding: defineCommand({
84
+ meta: { name: "onboarding", description: "Get or update onboarding status" },
85
+ args: {
86
+ step: { type: "string", description: "Onboarding step name" },
87
+ completed: {
88
+ type: "string",
89
+ description: "Mark step as completed (true/false)",
90
+ },
91
+ json: { type: "boolean", description: "Output as JSON", default: false },
92
+ },
93
+ async run({ args }) {
94
+ try {
95
+ const client = getClient();
96
+ const step = args.step;
97
+ if (step) {
98
+ const completedStr = args.completed;
99
+ const result = await client.user.updateOnboarding({
100
+ step,
101
+ completed: completedStr === "true",
102
+ });
103
+ outputResult(handleApiResult(result), args.json);
104
+ }
105
+ else {
106
+ const result = await client.user.getOnboarding();
107
+ outputResult(handleApiResult(result), args.json);
108
+ }
109
+ }
110
+ catch (error) {
111
+ handleError(error);
112
+ }
113
+ },
114
+ }),
115
+ },
116
+ });
117
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/commands/user.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("citty").CommandDef<import("citty").ArgsDef>;
2
+ export default _default;
3
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":";AAYA,wBA8CG"}