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,59 @@
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: "verify", description: "Verification and certificate commands" },
13
+ subCommands: {
14
+ verify: defineCommand({
15
+ meta: { name: "verify", description: "Verify a specification's integrity" },
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.verify(args["spec-id"]);
30
+ if (!args.quiet) {
31
+ outputResult(handleApiResult(result), args.json);
32
+ }
33
+ }
34
+ catch (error) {
35
+ handleError(error);
36
+ }
37
+ },
38
+ }),
39
+ certificate: defineCommand({
40
+ meta: { name: "certificate", description: "Get verification certificate" },
41
+ args: {
42
+ "spec-id": { type: "string", description: "Specification ID", required: true },
43
+ output: { type: "string", description: "Output file path", alias: "o" },
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.certificate(args["spec-id"]);
50
+ outputResult(handleApiResult(result), args.json);
51
+ }
52
+ catch (error) {
53
+ handleError(error);
54
+ }
55
+ },
56
+ }),
57
+ },
58
+ });
59
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.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=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":";AAaA,wBAgKG"}
@@ -0,0 +1,167 @@
1
+ import { writeFileSync } 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: "version", description: "Version management" },
14
+ subCommands: {
15
+ list: defineCommand({
16
+ meta: { name: "list", description: "List versions of a specification" },
17
+ args: {
18
+ "spec-id": { type: "string", description: "Specification ID", required: true },
19
+ format: {
20
+ type: "string",
21
+ description: "Output format (json, table, yaml)",
22
+ default: "table",
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.versions.list(args["spec-id"]);
30
+ const isJson = args.json || args.format === "json";
31
+ outputResult(handleApiResult(result), isJson, [
32
+ "id",
33
+ "versionNumber",
34
+ "changeSummary",
35
+ "createdAt",
36
+ ]);
37
+ }
38
+ catch (error) {
39
+ handleError(error);
40
+ }
41
+ },
42
+ }),
43
+ show: defineCommand({
44
+ meta: { name: "show", description: "Show version details" },
45
+ args: {
46
+ "spec-id": { type: "string", description: "Specification ID", required: true },
47
+ "version-id": { type: "string", description: "Version ID", required: true },
48
+ json: { type: "boolean", description: "Output as JSON", default: false },
49
+ },
50
+ async run({ args }) {
51
+ try {
52
+ const client = getClient();
53
+ const result = await client.versions.get(args["spec-id"], args["version-id"]);
54
+ outputResult(handleApiResult(result), args.json);
55
+ }
56
+ catch (error) {
57
+ handleError(error);
58
+ }
59
+ },
60
+ }),
61
+ delete: defineCommand({
62
+ meta: { name: "delete", description: "Delete a version" },
63
+ args: {
64
+ "spec-id": { type: "string", description: "Specification ID", required: true },
65
+ "version-id": { type: "string", description: "Version ID", required: true },
66
+ yes: {
67
+ type: "boolean",
68
+ description: "Skip confirmation prompt",
69
+ alias: "y",
70
+ default: false,
71
+ },
72
+ quiet: {
73
+ type: "boolean",
74
+ description: "Suppress output",
75
+ alias: "q",
76
+ default: false,
77
+ },
78
+ json: { type: "boolean", description: "Output as JSON", default: false },
79
+ },
80
+ async run({ args }) {
81
+ try {
82
+ const client = getClient();
83
+ const versionId = args["version-id"];
84
+ const result = await client.versions.delete(args["spec-id"], versionId);
85
+ handleApiResult(result);
86
+ if (!args.quiet) {
87
+ outputResult({ message: `Version ${versionId} deleted.` }, args.json);
88
+ }
89
+ }
90
+ catch (error) {
91
+ handleError(error);
92
+ }
93
+ },
94
+ }),
95
+ restore: defineCommand({
96
+ meta: { name: "restore", description: "Restore a previous version" },
97
+ args: {
98
+ "spec-id": { type: "string", description: "Specification ID", required: true },
99
+ "version-id": { type: "string", description: "Version ID", required: true },
100
+ quiet: {
101
+ type: "boolean",
102
+ description: "Suppress output",
103
+ alias: "q",
104
+ default: false,
105
+ },
106
+ json: { type: "boolean", description: "Output as JSON", default: false },
107
+ },
108
+ async run({ args }) {
109
+ try {
110
+ const client = getClient();
111
+ const result = await client.versions.restore(args["spec-id"], args["version-id"]);
112
+ if (!args.quiet) {
113
+ outputResult(handleApiResult(result), args.json);
114
+ }
115
+ }
116
+ catch (error) {
117
+ handleError(error);
118
+ }
119
+ },
120
+ }),
121
+ download: defineCommand({
122
+ meta: { name: "download", description: "Download version as Markdown" },
123
+ args: {
124
+ "spec-id": { type: "string", description: "Specification ID", required: true },
125
+ "version-id": { type: "string", description: "Version ID", required: true },
126
+ output: { type: "string", description: "Output file path", alias: "o" },
127
+ quiet: {
128
+ type: "boolean",
129
+ description: "Suppress output",
130
+ alias: "q",
131
+ default: false,
132
+ },
133
+ json: { type: "boolean", description: "Output as JSON", default: false },
134
+ },
135
+ async run({ args }) {
136
+ try {
137
+ const client = getClient();
138
+ const result = await client.versions.downloadMarkdown(args["spec-id"], args["version-id"]);
139
+ const data = handleApiResult(result);
140
+ const outputPath = args.output;
141
+ const content = typeof data === "string"
142
+ ? data
143
+ : (data.content ?? JSON.stringify(data));
144
+ if (outputPath) {
145
+ writeFileSync(outputPath, content, "utf-8");
146
+ if (!args.quiet) {
147
+ outputResult({ message: `Downloaded to ${outputPath}` }, args.json);
148
+ }
149
+ }
150
+ else if (args.quiet) {
151
+ return;
152
+ }
153
+ else if (args.json) {
154
+ outputResult(data, true);
155
+ }
156
+ else {
157
+ console.log(content);
158
+ }
159
+ }
160
+ catch (error) {
161
+ handleError(error);
162
+ }
163
+ },
164
+ }),
165
+ },
166
+ });
167
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/commands/version.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=webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":";AAYA,wBAgMG"}
@@ -0,0 +1,201 @@
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: "webhook", description: "Webhook management" },
13
+ subCommands: {
14
+ create: defineCommand({
15
+ meta: { name: "create", description: "Create a webhook" },
16
+ args: {
17
+ url: { type: "string", description: "Endpoint URL", required: true },
18
+ events: {
19
+ type: "string",
20
+ description: "Event types (comma-separated)",
21
+ required: true,
22
+ },
23
+ quiet: {
24
+ type: "boolean",
25
+ description: "Suppress output",
26
+ alias: "q",
27
+ default: false,
28
+ },
29
+ json: { type: "boolean", description: "Output as JSON", default: false },
30
+ },
31
+ async run({ args }) {
32
+ try {
33
+ const client = getClient();
34
+ const result = await client.webhooks.create({
35
+ endpointUrl: args.url,
36
+ eventTypes: args.events.split(",").map((e) => e.trim()),
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 webhooks" },
49
+ args: {
50
+ format: {
51
+ type: "string",
52
+ description: "Output format (json, table, yaml)",
53
+ default: "table",
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.webhooks.list();
61
+ const isJson = args.json || args.format === "json";
62
+ outputResult(handleApiResult(result), isJson, [
63
+ "id",
64
+ "endpointUrl",
65
+ "enabled",
66
+ "createdAt",
67
+ ]);
68
+ }
69
+ catch (error) {
70
+ handleError(error);
71
+ }
72
+ },
73
+ }),
74
+ update: defineCommand({
75
+ meta: { name: "update", description: "Update a webhook" },
76
+ args: {
77
+ id: { type: "string", description: "Webhook ID", required: true },
78
+ url: { type: "string", description: "New endpoint URL" },
79
+ events: { type: "string", description: "New event types (comma-separated)" },
80
+ enabled: { type: "string", description: "Enable/disable (true/false)" },
81
+ quiet: {
82
+ type: "boolean",
83
+ description: "Suppress output",
84
+ alias: "q",
85
+ default: false,
86
+ },
87
+ json: { type: "boolean", description: "Output as JSON", default: false },
88
+ },
89
+ async run({ args }) {
90
+ try {
91
+ const client = getClient();
92
+ const data = {};
93
+ const url = args.url;
94
+ const events = args.events;
95
+ const enabled = args.enabled;
96
+ if (url)
97
+ data.endpointUrl = url;
98
+ if (events)
99
+ data.eventTypes = events.split(",").map((e) => e.trim());
100
+ if (enabled)
101
+ data.enabled = enabled === "true";
102
+ const result = await client.webhooks.update(args.id, data);
103
+ if (!args.quiet) {
104
+ outputResult(handleApiResult(result), args.json);
105
+ }
106
+ }
107
+ catch (error) {
108
+ handleError(error);
109
+ }
110
+ },
111
+ }),
112
+ delete: defineCommand({
113
+ meta: { name: "delete", description: "Delete a webhook" },
114
+ args: {
115
+ id: { type: "string", description: "Webhook ID", required: true },
116
+ yes: {
117
+ type: "boolean",
118
+ description: "Skip confirmation prompt",
119
+ alias: "y",
120
+ default: false,
121
+ },
122
+ quiet: {
123
+ type: "boolean",
124
+ description: "Suppress output",
125
+ alias: "q",
126
+ default: false,
127
+ },
128
+ json: { type: "boolean", description: "Output as JSON", default: false },
129
+ },
130
+ async run({ args }) {
131
+ try {
132
+ const client = getClient();
133
+ const id = args.id;
134
+ const result = await client.webhooks.delete(id);
135
+ handleApiResult(result);
136
+ if (!args.quiet) {
137
+ outputResult({ message: `Webhook ${id} deleted.` }, args.json);
138
+ }
139
+ }
140
+ catch (error) {
141
+ handleError(error);
142
+ }
143
+ },
144
+ }),
145
+ deliveries: defineCommand({
146
+ meta: { name: "deliveries", description: "List webhook deliveries" },
147
+ args: {
148
+ id: { type: "string", description: "Webhook ID", required: true },
149
+ format: {
150
+ type: "string",
151
+ description: "Output format (json, table, yaml)",
152
+ default: "table",
153
+ },
154
+ json: { type: "boolean", description: "Output as JSON", default: false },
155
+ },
156
+ async run({ args }) {
157
+ try {
158
+ const client = getClient();
159
+ const result = await client.webhooks.listDeliveries(args.id);
160
+ const isJson = args.json || args.format === "json";
161
+ outputResult(handleApiResult(result), isJson, [
162
+ "id",
163
+ "status",
164
+ "httpStatus",
165
+ "createdAt",
166
+ ]);
167
+ }
168
+ catch (error) {
169
+ handleError(error);
170
+ }
171
+ },
172
+ }),
173
+ retry: defineCommand({
174
+ meta: { name: "retry", description: "Retry a webhook delivery" },
175
+ args: {
176
+ id: { type: "string", description: "Webhook ID", required: true },
177
+ "delivery-id": { type: "string", description: "Delivery ID", required: true },
178
+ quiet: {
179
+ type: "boolean",
180
+ description: "Suppress output",
181
+ alias: "q",
182
+ default: false,
183
+ },
184
+ json: { type: "boolean", description: "Output as JSON", default: false },
185
+ },
186
+ async run({ args }) {
187
+ try {
188
+ const client = getClient();
189
+ const result = await client.webhooks.retryDelivery(args.id, args["delivery-id"]);
190
+ if (!args.quiet) {
191
+ outputResult(handleApiResult(result), args.json);
192
+ }
193
+ }
194
+ catch (error) {
195
+ handleError(error);
196
+ }
197
+ },
198
+ }),
199
+ },
200
+ });
201
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ export declare const main: import("citty").CommandDef<{
3
+ json: {
4
+ type: "boolean";
5
+ description: string;
6
+ default: false;
7
+ };
8
+ verbose: {
9
+ type: "boolean";
10
+ description: string;
11
+ default: false;
12
+ };
13
+ quiet: {
14
+ type: "boolean";
15
+ description: string;
16
+ alias: string;
17
+ default: false;
18
+ };
19
+ format: {
20
+ type: "string";
21
+ description: string;
22
+ };
23
+ }>;
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAuBA,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;EAyDf,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env node
2
+ import { defineCommand, runMain } from "citty";
3
+ import access from "./commands/access";
4
+ import amendments from "./commands/amendments";
5
+ import audit from "./commands/audit";
6
+ import auth from "./commands/auth";
7
+ import config from "./commands/config";
8
+ import diff from "./commands/diff";
9
+ import exportCmd from "./commands/export";
10
+ import features from "./commands/features";
11
+ import media from "./commands/media";
12
+ import notifications from "./commands/notifications";
13
+ import org from "./commands/org";
14
+ import project from "./commands/project";
15
+ import review from "./commands/review";
16
+ import sign from "./commands/sign";
17
+ import spec from "./commands/spec";
18
+ import user from "./commands/user";
19
+ import verify from "./commands/verify";
20
+ import version from "./commands/version";
21
+ import webhook from "./commands/webhook";
22
+ export const main = defineCommand({
23
+ meta: {
24
+ name: "specforge",
25
+ version: "0.1.0",
26
+ description: "SpecForge — Specification versioning and signing CLI",
27
+ },
28
+ args: {
29
+ json: {
30
+ type: "boolean",
31
+ description: "Output as JSON",
32
+ default: false,
33
+ },
34
+ verbose: {
35
+ type: "boolean",
36
+ description: "Enable verbose output",
37
+ default: false,
38
+ },
39
+ quiet: {
40
+ type: "boolean",
41
+ description: "Suppress output",
42
+ alias: "q",
43
+ default: false,
44
+ },
45
+ format: {
46
+ type: "string",
47
+ description: "Output format (json, table, yaml)",
48
+ },
49
+ },
50
+ subCommands: {
51
+ access,
52
+ amendments,
53
+ audit,
54
+ auth,
55
+ config,
56
+ diff,
57
+ export: exportCmd,
58
+ features,
59
+ media,
60
+ notifications,
61
+ org,
62
+ project,
63
+ review,
64
+ sign,
65
+ spec,
66
+ user,
67
+ verify,
68
+ version,
69
+ webhook,
70
+ },
71
+ run({ args }) {
72
+ if (args.json) {
73
+ console.log(JSON.stringify({ name: "specforge", version: "0.1.0" }));
74
+ }
75
+ else {
76
+ console.log("specforge v0.1.0 — SpecForge: Specification versioning and signing CLI");
77
+ console.log("Run specforge --help for available commands.");
78
+ }
79
+ },
80
+ });
81
+ runMain(main);
82
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,MAAM,kBAAkB,CAAC;AACrC,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,QAAQ,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,MAAM,kBAAkB,CAAC;AACrC,OAAO,aAAa,MAAM,0BAA0B,CAAC;AACrD,OAAO,GAAG,MAAM,gBAAgB,CAAC;AACjC,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,OAAO,MAAM,oBAAoB,CAAC;AACzC,OAAO,OAAO,MAAM,oBAAoB,CAAC;AAEzC,MAAM,CAAC,MAAM,IAAI,GAAG,aAAa,CAAC;IACjC,IAAI,EAAE;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,sDAAsD;KACnE;IACD,IAAI,EAAE;QACL,IAAI,EAAE;YACL,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,gBAAgB;YAC7B,OAAO,EAAE,KAAK;SACd;QACD,OAAO,EAAE;YACR,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,uBAAuB;YACpC,OAAO,EAAE,KAAK;SACd;QACD,KAAK,EAAE;YACN,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,iBAAiB;YAC9B,KAAK,EAAE,GAAG;YACV,OAAO,EAAE,KAAK;SACd;QACD,MAAM,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,mCAAmC;SAChD;KACD;IACD,WAAW,EAAE;QACZ,MAAM;QACN,UAAU;QACV,KAAK;QACL,IAAI;QACJ,MAAM;QACN,IAAI;QACJ,MAAM,EAAE,SAAS;QACjB,QAAQ;QACR,KAAK;QACL,aAAa;QACb,GAAG;QACH,OAAO;QACP,MAAM;QACN,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,OAAO;QACP,OAAO;KACP;IACD,GAAG,CAAC,EAAE,IAAI,EAAE;QACX,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;YACtF,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC7D,CAAC;IACF,CAAC;CACD,CAAC,CAAC;AAEH,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ export type AuthSource = "env" | "api-key" | "oauth";
2
+ export type AuthCredential = {
3
+ readonly token: string;
4
+ readonly source: AuthSource;
5
+ readonly expiresAt: string | null;
6
+ };
7
+ /**
8
+ * Resolve auth credentials by priority:
9
+ * 1. SPECFORGE_API_KEY env var
10
+ * 2. --api-key CLI flag
11
+ * 3. Config file credential
12
+ * 4. Legacy config accessToken (auto-migrate)
13
+ * 5. None → error + exit
14
+ */
15
+ export declare function resolveAuth(args?: {
16
+ apiKey?: string;
17
+ }): AuthCredential;
18
+ export declare function saveCredential(credential: AuthCredential): void;
19
+ export declare function clearCredential(): void;
20
+ export declare function getAuthStatus(): {
21
+ authenticated: boolean;
22
+ credential?: AuthCredential;
23
+ };
24
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CAuCtE;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI,CAQ/D;AAED,wBAAgB,eAAe,IAAI,IAAI,CAMtC;AAED,wBAAgB,aAAa,IAAI;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,cAAc,CAAC;CAC5B,CAiCA"}