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,142 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { defineCommand } from "citty";
3
+ import { createClient } from "specforge-sdk";
4
+ import { loadConfig, requireAuth } from "../lib/config";
5
+ import { handleApiResult, handleError } from "../lib/errors";
6
+ import { outputResult } from "../lib/output";
7
+ function getClient() {
8
+ const config = loadConfig();
9
+ const token = requireAuth(config);
10
+ return createClient({ baseUrl: config.baseUrl, auth: { accessToken: token } });
11
+ }
12
+ export default defineCommand({
13
+ meta: { name: "media", description: "Media file management" },
14
+ subCommands: {
15
+ upload: defineCommand({
16
+ meta: { name: "upload", description: "Upload a media file" },
17
+ args: {
18
+ file: { type: "string", description: "Path to file", required: true },
19
+ quiet: {
20
+ type: "boolean",
21
+ description: "Suppress output",
22
+ alias: "q",
23
+ default: false,
24
+ },
25
+ json: { type: "boolean", description: "Output as JSON", default: false },
26
+ },
27
+ async run({ args }) {
28
+ try {
29
+ const client = getClient();
30
+ const buffer = readFileSync(args.file);
31
+ const blob = new Blob([buffer]);
32
+ const result = await client.media.upload(blob);
33
+ if (!args.quiet) {
34
+ outputResult(handleApiResult(result), args.json);
35
+ }
36
+ }
37
+ catch (error) {
38
+ handleError(error);
39
+ }
40
+ },
41
+ }),
42
+ list: defineCommand({
43
+ meta: { name: "list", description: "List media files" },
44
+ args: {
45
+ page: { type: "string", description: "Page number" },
46
+ format: {
47
+ type: "string",
48
+ description: "Output format (json, table, yaml)",
49
+ default: "table",
50
+ },
51
+ json: { type: "boolean", description: "Output as JSON", default: false },
52
+ },
53
+ async run({ args }) {
54
+ try {
55
+ const client = getClient();
56
+ const pageStr = args.page;
57
+ const result = await client.media.list({
58
+ page: pageStr ? Number(pageStr) : undefined,
59
+ });
60
+ const isJson = args.json || args.format === "json";
61
+ outputResult(handleApiResult(result), isJson, [
62
+ "id",
63
+ "filename",
64
+ "mimeType",
65
+ "createdAt",
66
+ ]);
67
+ }
68
+ catch (error) {
69
+ handleError(error);
70
+ }
71
+ },
72
+ }),
73
+ delete: defineCommand({
74
+ meta: { name: "delete", description: "Delete a media file" },
75
+ args: {
76
+ id: { type: "string", description: "Media ID", required: true },
77
+ yes: {
78
+ type: "boolean",
79
+ description: "Skip confirmation prompt",
80
+ alias: "y",
81
+ default: false,
82
+ },
83
+ quiet: {
84
+ type: "boolean",
85
+ description: "Suppress output",
86
+ alias: "q",
87
+ default: false,
88
+ },
89
+ json: { type: "boolean", description: "Output as JSON", default: false },
90
+ },
91
+ async run({ args }) {
92
+ try {
93
+ const client = getClient();
94
+ const id = args.id;
95
+ const result = await client.media.delete(id);
96
+ handleApiResult(result);
97
+ if (!args.quiet) {
98
+ outputResult({ message: `Media ${id} deleted.` }, args.json);
99
+ }
100
+ }
101
+ catch (error) {
102
+ handleError(error);
103
+ }
104
+ },
105
+ }),
106
+ show: defineCommand({
107
+ meta: { name: "show", description: "Show media file details" },
108
+ args: {
109
+ id: { type: "string", description: "Media ID", required: true },
110
+ json: { type: "boolean", description: "Output as JSON", default: false },
111
+ },
112
+ async run({ args }) {
113
+ try {
114
+ const client = getClient();
115
+ const result = await client.media.get(args.id);
116
+ outputResult(handleApiResult(result), args.json);
117
+ }
118
+ catch (error) {
119
+ handleError(error);
120
+ }
121
+ },
122
+ }),
123
+ download: defineCommand({
124
+ meta: { name: "download", description: "Download a media file" },
125
+ args: {
126
+ id: { type: "string", description: "Media ID", required: true },
127
+ json: { type: "boolean", description: "Output as JSON", default: false },
128
+ },
129
+ async run({ args }) {
130
+ try {
131
+ const client = getClient();
132
+ const result = await client.media.download(args.id);
133
+ outputResult(handleApiResult(result), args.json);
134
+ }
135
+ catch (error) {
136
+ handleError(error);
137
+ }
138
+ },
139
+ }),
140
+ },
141
+ });
142
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/commands/media.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=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":";AAYA,wBA8DG"}
@@ -0,0 +1,75 @@
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: "notifications", description: "Notification management" },
13
+ subCommands: {
14
+ list: defineCommand({
15
+ meta: { name: "list", description: "List notifications" },
16
+ args: {
17
+ page: { type: "string", description: "Page number" },
18
+ format: {
19
+ type: "string",
20
+ description: "Output format (json, table, yaml)",
21
+ default: "table",
22
+ },
23
+ json: { type: "boolean", description: "Output as JSON", default: false },
24
+ },
25
+ async run({ args }) {
26
+ try {
27
+ const client = getClient();
28
+ const pageStr = args.page;
29
+ const result = await client.notifications.list({
30
+ page: pageStr ? Number(pageStr) : undefined,
31
+ });
32
+ const isJson = args.json || args.format === "json";
33
+ outputResult(handleApiResult(result), isJson, ["id", "type", "read", "createdAt"]);
34
+ }
35
+ catch (error) {
36
+ handleError(error);
37
+ }
38
+ },
39
+ }),
40
+ read: defineCommand({
41
+ meta: { name: "read", description: "Mark a notification as read" },
42
+ args: {
43
+ id: { type: "string", description: "Notification ID", required: true },
44
+ json: { type: "boolean", description: "Output as JSON", default: false },
45
+ },
46
+ async run({ args }) {
47
+ try {
48
+ const client = getClient();
49
+ const result = await client.notifications.markRead(args.id);
50
+ outputResult(handleApiResult(result), args.json);
51
+ }
52
+ catch (error) {
53
+ handleError(error);
54
+ }
55
+ },
56
+ }),
57
+ "read-all": defineCommand({
58
+ meta: { name: "read-all", description: "Mark all notifications as read" },
59
+ args: {
60
+ json: { type: "boolean", description: "Output as JSON", default: false },
61
+ },
62
+ async run({ args }) {
63
+ try {
64
+ const client = getClient();
65
+ const result = await client.notifications.markAllRead();
66
+ outputResult(handleApiResult(result), args.json);
67
+ }
68
+ catch (error) {
69
+ handleError(error);
70
+ }
71
+ },
72
+ }),
73
+ },
74
+ });
75
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/commands/notifications.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=org.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org.d.ts","sourceRoot":"","sources":["../../src/commands/org.ts"],"names":[],"mappings":";AAYA,wBAoIG"}
@@ -0,0 +1,145 @@
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: "org", description: "Organization management" },
13
+ subCommands: {
14
+ show: defineCommand({
15
+ meta: { name: "show", description: "Show current organization details" },
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.organizations.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 organization settings" },
32
+ args: {
33
+ name: { type: "string", description: "Organization name" },
34
+ "mandatory-review": {
35
+ type: "string",
36
+ description: "Enable mandatory review (true/false)",
37
+ },
38
+ "min-approvals": {
39
+ type: "string",
40
+ description: "Minimum review approvals",
41
+ },
42
+ json: { type: "boolean", description: "Output as JSON", default: false },
43
+ },
44
+ async run({ args }) {
45
+ try {
46
+ const client = getClient();
47
+ const mandatoryReviewStr = args["mandatory-review"];
48
+ const minApprovalsStr = args["min-approvals"];
49
+ const result = await client.organizations.updateMe({
50
+ name: args.name,
51
+ mandatoryReviewEnabled: mandatoryReviewStr ? mandatoryReviewStr === "true" : undefined,
52
+ minReviewApprovals: minApprovalsStr ? Number(minApprovalsStr) : undefined,
53
+ });
54
+ outputResult(handleApiResult(result), args.json);
55
+ }
56
+ catch (error) {
57
+ handleError(error);
58
+ }
59
+ },
60
+ }),
61
+ members: defineCommand({
62
+ meta: { name: "members", description: "List organization members" },
63
+ args: {
64
+ format: {
65
+ type: "string",
66
+ description: "Output format (json, table, yaml)",
67
+ default: "table",
68
+ },
69
+ json: { type: "boolean", description: "Output as JSON", default: false },
70
+ },
71
+ async run({ args }) {
72
+ try {
73
+ const client = getClient();
74
+ const result = await client.organizations.listMembers();
75
+ const isJson = args.json || args.format === "json";
76
+ outputResult(handleApiResult(result), isJson, ["id", "name", "email", "orgRole"]);
77
+ }
78
+ catch (error) {
79
+ handleError(error);
80
+ }
81
+ },
82
+ }),
83
+ invite: defineCommand({
84
+ meta: { name: "invite", description: "Invite a member to the organization" },
85
+ args: {
86
+ email: { type: "string", description: "Member email", required: true },
87
+ name: { type: "string", description: "Member name", required: true },
88
+ role: { type: "string", description: "Organization role", default: "MEMBER" },
89
+ json: { type: "boolean", description: "Output as JSON", default: false },
90
+ },
91
+ async run({ args }) {
92
+ try {
93
+ const client = getClient();
94
+ const result = await client.organizations.inviteMember({
95
+ email: args.email,
96
+ name: args.name,
97
+ orgRole: args.role,
98
+ });
99
+ outputResult(handleApiResult(result), args.json);
100
+ }
101
+ catch (error) {
102
+ handleError(error);
103
+ }
104
+ },
105
+ }),
106
+ "update-member": defineCommand({
107
+ meta: { name: "update-member", description: "Update a member's role" },
108
+ args: {
109
+ id: { type: "string", description: "Member ID", required: true },
110
+ role: { type: "string", description: "New organization role", required: true },
111
+ json: { type: "boolean", description: "Output as JSON", default: false },
112
+ },
113
+ async run({ args }) {
114
+ try {
115
+ const client = getClient();
116
+ const result = await client.organizations.updateMember(args.id, {
117
+ orgRole: args.role,
118
+ });
119
+ outputResult(handleApiResult(result), args.json);
120
+ }
121
+ catch (error) {
122
+ handleError(error);
123
+ }
124
+ },
125
+ }),
126
+ "remove-member": defineCommand({
127
+ meta: { name: "remove-member", description: "Remove a member from the organization" },
128
+ args: {
129
+ id: { type: "string", description: "Member ID", required: true },
130
+ json: { type: "boolean", description: "Output as JSON", default: false },
131
+ },
132
+ async run({ args }) {
133
+ try {
134
+ const client = getClient();
135
+ const result = await client.organizations.removeMember(args.id);
136
+ outputResult(handleApiResult(result), args.json);
137
+ }
138
+ catch (error) {
139
+ handleError(error);
140
+ }
141
+ },
142
+ }),
143
+ },
144
+ });
145
+ //# sourceMappingURL=org.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org.js","sourceRoot":"","sources":["../../src/commands/org.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=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":";AAaA,wBA+LG"}
@@ -0,0 +1,205 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { defineCommand } from "citty";
3
+ import { createClient } from "specforge-sdk";
4
+ import { loadConfig, requireAuth } from "../lib/config";
5
+ import { handleApiResult, handleError } from "../lib/errors";
6
+ import { outputResult } from "../lib/output";
7
+ function getClient() {
8
+ const config = loadConfig();
9
+ const token = requireAuth(config);
10
+ return createClient({ baseUrl: config.baseUrl, auth: { accessToken: token } });
11
+ }
12
+ export default defineCommand({
13
+ meta: { name: "project", description: "Project management" },
14
+ subCommands: {
15
+ create: defineCommand({
16
+ meta: { name: "create", description: "Create a new project" },
17
+ args: {
18
+ name: { type: "string", description: "Project name", required: true },
19
+ json: { type: "boolean", description: "Output as JSON", default: false },
20
+ },
21
+ async run({ args }) {
22
+ try {
23
+ const client = getClient();
24
+ const result = await client.projects.create({ name: args.name });
25
+ outputResult(handleApiResult(result), args.json);
26
+ }
27
+ catch (error) {
28
+ handleError(error);
29
+ }
30
+ },
31
+ }),
32
+ list: defineCommand({
33
+ meta: { name: "list", description: "List projects" },
34
+ args: {
35
+ page: { type: "string", description: "Page number" },
36
+ sort: { type: "string", description: "Sort field" },
37
+ order: { type: "string", description: "Sort order (asc/desc)" },
38
+ format: {
39
+ type: "string",
40
+ description: "Output format (json, table, yaml)",
41
+ default: "table",
42
+ },
43
+ json: { type: "boolean", description: "Output as JSON", default: false },
44
+ },
45
+ async run({ args }) {
46
+ try {
47
+ const client = getClient();
48
+ const pageStr = args.page;
49
+ const result = await client.projects.list({
50
+ page: pageStr ? Number(pageStr) : undefined,
51
+ sort: args.sort,
52
+ order: args.order,
53
+ });
54
+ const isJson = args.json || args.format === "json";
55
+ outputResult(handleApiResult(result), isJson, ["id", "name", "createdAt"]);
56
+ }
57
+ catch (error) {
58
+ handleError(error);
59
+ }
60
+ },
61
+ }),
62
+ show: defineCommand({
63
+ meta: { name: "show", description: "Show project details" },
64
+ args: {
65
+ id: { type: "string", description: "Project ID", required: true },
66
+ json: { type: "boolean", description: "Output as JSON", default: false },
67
+ },
68
+ async run({ args }) {
69
+ try {
70
+ const client = getClient();
71
+ const result = await client.projects.get(args.id);
72
+ outputResult(handleApiResult(result), args.json);
73
+ }
74
+ catch (error) {
75
+ handleError(error);
76
+ }
77
+ },
78
+ }),
79
+ update: defineCommand({
80
+ meta: { name: "update", description: "Update a project" },
81
+ args: {
82
+ id: { type: "string", description: "Project ID", required: true },
83
+ name: { type: "string", description: "New project name" },
84
+ json: { type: "boolean", description: "Output as JSON", default: false },
85
+ },
86
+ async run({ args }) {
87
+ try {
88
+ const client = getClient();
89
+ const result = await client.projects.update(args.id, {
90
+ name: args.name,
91
+ });
92
+ outputResult(handleApiResult(result), args.json);
93
+ }
94
+ catch (error) {
95
+ handleError(error);
96
+ }
97
+ },
98
+ }),
99
+ delete: defineCommand({
100
+ meta: { name: "delete", description: "Delete a project" },
101
+ args: {
102
+ id: { type: "string", description: "Project ID", required: true },
103
+ json: { type: "boolean", description: "Output as JSON", default: false },
104
+ },
105
+ async run({ args }) {
106
+ try {
107
+ const client = getClient();
108
+ const result = await client.projects.delete(args.id);
109
+ outputResult(handleApiResult(result), args.json);
110
+ }
111
+ catch (error) {
112
+ handleError(error);
113
+ }
114
+ },
115
+ }),
116
+ schema: defineCommand({
117
+ meta: { name: "schema", description: "Project validation schema management" },
118
+ subCommands: {
119
+ get: defineCommand({
120
+ meta: { name: "get", description: "Get project validation schema" },
121
+ args: {
122
+ id: { type: "string", description: "Project ID", required: true },
123
+ json: { type: "boolean", description: "Output as JSON", default: false },
124
+ },
125
+ async run({ args }) {
126
+ try {
127
+ const client = getClient();
128
+ const result = await client.projects.getSchema(args.id);
129
+ outputResult(handleApiResult(result), args.json);
130
+ }
131
+ catch (error) {
132
+ handleError(error);
133
+ }
134
+ },
135
+ }),
136
+ set: defineCommand({
137
+ meta: { name: "set", description: "Set project validation schema" },
138
+ args: {
139
+ id: { type: "string", description: "Project ID", required: true },
140
+ file: {
141
+ type: "string",
142
+ description: "Path to schema YAML file",
143
+ required: true,
144
+ },
145
+ json: { type: "boolean", description: "Output as JSON", default: false },
146
+ },
147
+ async run({ args }) {
148
+ try {
149
+ const client = getClient();
150
+ const schemaYaml = readFileSync(args.file, "utf-8");
151
+ const result = await client.projects.setSchema(args.id, {
152
+ schemaYaml,
153
+ });
154
+ outputResult(handleApiResult(result), args.json);
155
+ }
156
+ catch (error) {
157
+ handleError(error);
158
+ }
159
+ },
160
+ }),
161
+ delete: defineCommand({
162
+ meta: { name: "delete", description: "Delete project validation schema" },
163
+ args: {
164
+ id: { type: "string", description: "Project ID", required: true },
165
+ json: { type: "boolean", description: "Output as JSON", default: false },
166
+ },
167
+ async run({ args }) {
168
+ try {
169
+ const client = getClient();
170
+ const result = await client.projects.deleteSchema(args.id);
171
+ outputResult(handleApiResult(result), args.json);
172
+ }
173
+ catch (error) {
174
+ handleError(error);
175
+ }
176
+ },
177
+ }),
178
+ validate: defineCommand({
179
+ meta: { name: "validate", description: "Validate content against project schema" },
180
+ args: {
181
+ id: { type: "string", description: "Project ID", required: true },
182
+ file: {
183
+ type: "string",
184
+ description: "Path to content file",
185
+ required: true,
186
+ },
187
+ json: { type: "boolean", description: "Output as JSON", default: false },
188
+ },
189
+ async run({ args }) {
190
+ try {
191
+ const client = getClient();
192
+ const content = readFileSync(args.file, "utf-8");
193
+ const result = await client.projects.validateSchema(args.id, { content });
194
+ outputResult(handleApiResult(result), args.json);
195
+ }
196
+ catch (error) {
197
+ handleError(error);
198
+ }
199
+ },
200
+ }),
201
+ },
202
+ }),
203
+ },
204
+ });
205
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.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=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":";AAYA,wBAyFG"}