@gonovus-ai/spec-flow-cli 0.0.0-stage → 0.3.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 (62) hide show
  1. package/README.md +805 -2
  2. package/dist/authentication-command-topology.d.ts +7 -0
  3. package/dist/authentication-command-topology.js +9 -0
  4. package/dist/authentication-command-topology.js.map +1 -0
  5. package/dist/bin.d.ts +2 -0
  6. package/dist/bin.js +52 -0
  7. package/dist/bin.js.map +1 -0
  8. package/dist/cli.d.ts +16 -0
  9. package/dist/cli.js +3355 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/client-identity.d.ts +12 -0
  12. package/dist/client-identity.js +29 -0
  13. package/dist/client-identity.js.map +1 -0
  14. package/dist/credential-store.d.ts +20 -0
  15. package/dist/credential-store.js +146 -0
  16. package/dist/credential-store.js.map +1 -0
  17. package/dist/default-api-origin.d.ts +1 -0
  18. package/dist/default-api-origin.js +1 -0
  19. package/dist/default-api-origin.js.map +1 -0
  20. package/dist/github-account-commands.d.ts +25 -0
  21. package/dist/github-account-commands.js +117 -0
  22. package/dist/github-account-commands.js.map +1 -0
  23. package/dist/github-connection-commands.d.ts +4 -0
  24. package/dist/github-connection-commands.js +99 -0
  25. package/dist/github-connection-commands.js.map +1 -0
  26. package/dist/github-import-commands.d.ts +3 -0
  27. package/dist/github-import-commands.js +64 -0
  28. package/dist/github-import-commands.js.map +1 -0
  29. package/dist/http-origin.d.ts +13 -0
  30. package/dist/http-origin.js +39 -0
  31. package/dist/http-origin.js.map +1 -0
  32. package/dist/index.d.ts +22 -0
  33. package/dist/index.js +240 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/node-version.d.ts +1 -0
  36. package/dist/node-version.js +8 -0
  37. package/dist/node-version.js.map +1 -0
  38. package/dist/product-map-commands.d.ts +17 -0
  39. package/dist/product-map-commands.js +48 -0
  40. package/dist/product-map-commands.js.map +1 -0
  41. package/dist/safe-cli-error.d.ts +2 -0
  42. package/dist/safe-cli-error.js +3 -0
  43. package/dist/safe-cli-error.js.map +1 -0
  44. package/dist/user-agent.d.ts +3 -0
  45. package/dist/user-agent.js +10 -0
  46. package/dist/user-agent.js.map +1 -0
  47. package/dist/user-api-key-commands.d.ts +28 -0
  48. package/dist/user-api-key-commands.js +129 -0
  49. package/dist/user-api-key-commands.js.map +1 -0
  50. package/dist/work-item-asset-commands.d.ts +24 -0
  51. package/dist/work-item-asset-commands.js +217 -0
  52. package/dist/work-item-asset-commands.js.map +1 -0
  53. package/dist/work-item-exchange-file.d.ts +4 -0
  54. package/dist/work-item-exchange-file.js +66 -0
  55. package/dist/work-item-exchange-file.js.map +1 -0
  56. package/dist/work-item-resource-link-commands.d.ts +23 -0
  57. package/dist/work-item-resource-link-commands.js +96 -0
  58. package/dist/work-item-resource-link-commands.js.map +1 -0
  59. package/dist/work-item-time-entry-input.d.ts +4 -0
  60. package/dist/work-item-time-entry-input.js +27 -0
  61. package/dist/work-item-time-entry-input.js.map +1 -0
  62. package/package.json +54 -4
package/dist/index.js ADDED
@@ -0,0 +1,240 @@
1
+ import { Command, CommanderError } from "commander";
2
+ import openBrowser from "open";
3
+ import createClient from "openapi-fetch";
4
+ import { z } from "zod";
5
+ import { addAuthenticationCommandTopology } from "./authentication-command-topology.js";
6
+ import { cliClientIdentityHeaders, detectCliClientIdentity, } from "./client-identity.js";
7
+ import { createCredentialStore, } from "./credential-store.js";
8
+ import { parseHttpOrigin, unresolvedSpecFlowApiOrigin, } from "./http-origin.js";
9
+ import { assertSupportedNodeVersion } from "./node-version.js";
10
+ import { SafeCliError } from "./safe-cli-error.js";
11
+ import { specFlowCliVersion, specFlowCliUserAgent, withSpecFlowCliUserAgent, } from "./user-agent.js";
12
+ export { assertSupportedNodeVersion } from "./node-version.js";
13
+ const deviceAuthorizationSchema = z
14
+ .object({
15
+ device_code: z.string().min(1),
16
+ expires_in: z.number().int().positive(),
17
+ interval: z.number().int().positive(),
18
+ user_code: z.string().min(1),
19
+ verification_uri: z.url(),
20
+ verification_uri_complete: z.url(),
21
+ })
22
+ .strict();
23
+ const deviceTokenSchema = z
24
+ .object({
25
+ access_token: z.string().min(1),
26
+ expires_in: z.number().int().positive(),
27
+ scope: z.string(),
28
+ token_type: z.literal("Bearer"),
29
+ })
30
+ .strict();
31
+ const deviceErrorSchema = z.looseObject({
32
+ error: z.enum([
33
+ "access_denied",
34
+ "authorization_pending",
35
+ "expired_token",
36
+ "slow_down",
37
+ ]),
38
+ });
39
+ const cliSessionSchema = z
40
+ .object({
41
+ session: z.object({
42
+ expiresAt: z.iso.datetime(),
43
+ id: z.string().min(1),
44
+ grants: z.array(z.object({ scope: z.enum(["WorkspaceKnowledge", "ProjectTasks"]), resourceId: z.string(), statements: z.record(z.string(), z.array(z.enum(["read", "create", "update", "delete", "search", "archive", "restore", "trash", "share", "publish", "rollback", "discuss", "request", "assign", "issue", "revoke", "manageSettings"]))) })).default([]),
45
+ projectIds: z.array(z.string().min(1)).nullable(),
46
+ sessionKind: z.literal("CLI"),
47
+ }),
48
+ user: z.object({
49
+ email: z.email().nullable(),
50
+ name: z.string().min(1),
51
+ }),
52
+ })
53
+ .strict();
54
+ const defaultDependencies = {
55
+ environment: process.env,
56
+ createCredentialStore: (options) => createCredentialStore({ ...options, warning: options.warning }),
57
+ fetch: globalThis.fetch,
58
+ clientIdentity: () => detectCliClientIdentity(),
59
+ nodeVersion: process.versions.node,
60
+ open: openBrowser,
61
+ sleep: async (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)),
62
+ stderr: (message) => process.stderr.write(`${message}\n`),
63
+ stdout: (message) => process.stdout.write(`${message}\n`),
64
+ };
65
+ export async function runSpecFlowCli(argv, dependencies = defaultDependencies) {
66
+ try {
67
+ assertSupportedNodeVersion(dependencies.nodeVersion);
68
+ const program = createProgram(dependencies);
69
+ await program.parseAsync([...argv]);
70
+ return 0;
71
+ }
72
+ catch (error) {
73
+ if (error instanceof CommanderError) {
74
+ return error.exitCode;
75
+ }
76
+ dependencies.stderr(safeFailureMessage(error));
77
+ return 1;
78
+ }
79
+ }
80
+ function createProgram(dependencies) {
81
+ const program = new Command()
82
+ .name("specflow")
83
+ .description("Access SpecFlow without exposing CLI credentials")
84
+ .version(specFlowCliVersion)
85
+ .option("--server <url>", "SpecFlow server origin", unresolvedSpecFlowApiOrigin(undefined, dependencies.environment?.SPEC_FLOW_API_URL))
86
+ .exitOverride()
87
+ .configureOutput({
88
+ writeErr: (value) => {
89
+ dependencies.stderr(value.trimEnd());
90
+ },
91
+ writeOut: (value) => {
92
+ dependencies.stdout(value.trimEnd());
93
+ },
94
+ });
95
+ const authentication = addAuthenticationCommandTopology(program);
96
+ addCredentialOption(authentication.login)
97
+ .requiredOption("--grants <json>", "Explicit WorkspaceKnowledge and ProjectTasks grant array")
98
+ .action(async (options) => login(program, options, dependencies));
99
+ addCredentialOption(authentication.status)
100
+ .action(async (options) => status(program, options, dependencies));
101
+ addCredentialOption(authentication.logout)
102
+ .action(async (options) => logout(program, options, dependencies));
103
+ return program;
104
+ }
105
+ function addCredentialOption(command) {
106
+ return command.option("--allow-file-fallback", "use a warned owner-only local credential file if the system store is unavailable");
107
+ }
108
+ async function login(program, options, dependencies) {
109
+ const serverOrigin = resolveServerOrigin(program.opts().server);
110
+ const authorization = deviceAuthorizationSchema.parse(await requestJson(dependencies.fetch, `${serverOrigin}/v1/auth/device/code`, {
111
+ body: JSON.stringify({ client_id: "specflow-cli", scope: `grants:${encodeURIComponent(JSON.stringify(JSON.parse(options.grants ?? "[]")))}` }),
112
+ headers: { "content-type": "application/json" },
113
+ method: "POST",
114
+ }));
115
+ dependencies.stdout(`Open ${authorization.verification_uri} and enter code ${authorization.user_code}.`);
116
+ try {
117
+ await dependencies.open(authorization.verification_uri_complete);
118
+ }
119
+ catch {
120
+ dependencies.stderr("Could not open the verification page automatically; use the URL and code shown above.");
121
+ }
122
+ const clientHeaders = cliClientIdentityHeaders(dependencies.clientIdentity?.() ?? { agent: null, device: null });
123
+ let intervalMilliseconds = authorization.interval * 1_000;
124
+ const expiresAt = Date.now() + authorization.expires_in * 1_000;
125
+ for (;;) {
126
+ await dependencies.sleep(intervalMilliseconds);
127
+ if (Date.now() >= expiresAt) {
128
+ throw new SafeCliError("Device Authorization expired. Run login again.");
129
+ }
130
+ const response = await dependencies.fetch(`${serverOrigin}/v1/auth/device/token`, {
131
+ body: JSON.stringify({
132
+ client_id: "specflow-cli",
133
+ device_code: authorization.device_code,
134
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
135
+ }),
136
+ headers: withSpecFlowCliUserAgent({
137
+ ...clientHeaders,
138
+ "content-type": "application/json",
139
+ }),
140
+ method: "POST",
141
+ });
142
+ const body = await response.json();
143
+ if (response.ok) {
144
+ const token = deviceTokenSchema.parse(body);
145
+ const store = await resolveCredentialStore(serverOrigin, options, dependencies);
146
+ await store.set(token.access_token);
147
+ dependencies.stdout("CLI Session authorized.");
148
+ return;
149
+ }
150
+ const failure = deviceErrorSchema.safeParse(body);
151
+ if (!failure.success) {
152
+ throw new SafeCliError("Device Authorization was rejected by SpecFlow.");
153
+ }
154
+ if (failure.data.error === "access_denied") {
155
+ throw new SafeCliError("Device Authorization was denied. Run login again.");
156
+ }
157
+ if (failure.data.error === "expired_token") {
158
+ throw new SafeCliError("Device Authorization expired. Run login again.");
159
+ }
160
+ if (failure.data.error === "slow_down") {
161
+ intervalMilliseconds += 5_000;
162
+ }
163
+ }
164
+ }
165
+ async function status(program, options, dependencies) {
166
+ const { credential, serverOrigin, store } = await currentCredential(program, options, dependencies);
167
+ const response = await createCliApiClient(serverOrigin, dependencies.fetch).GET("/v1/cli/session", { headers: { authorization: `Bearer ${credential}` } });
168
+ if (response.response.status === 401) {
169
+ await store.delete();
170
+ throw new SafeCliError("No active CLI Session.");
171
+ }
172
+ if (response.response.status !== 200 || response.data === undefined) {
173
+ throw new SafeCliError("SpecFlow could not inspect the CLI Session.");
174
+ }
175
+ const current = cliSessionSchema.parse(response.data);
176
+ dependencies.stdout([
177
+ `User: ${current.user.name}${current.user.email === null ? "" : ` <${current.user.email}>`}`,
178
+ `Expires: ${current.session.expiresAt}`,
179
+ `Grants: ${JSON.stringify(current.session.grants)}`,
180
+ ].join("\n"));
181
+ }
182
+ async function logout(program, options, dependencies) {
183
+ const { credential, serverOrigin, store } = await currentCredential(program, options, dependencies);
184
+ const response = await createCliApiClient(serverOrigin, dependencies.fetch).DELETE("/v1/cli/session", {
185
+ headers: { authorization: `Bearer ${credential}` },
186
+ });
187
+ if (response.response.status !== 204 && response.response.status !== 401) {
188
+ throw new SafeCliError("SpecFlow could not revoke the CLI Session.");
189
+ }
190
+ await store.delete();
191
+ dependencies.stdout("CLI Session revoked.");
192
+ }
193
+ function createCliApiClient(serverOrigin, fetch) {
194
+ return createClient({
195
+ baseUrl: serverOrigin,
196
+ fetch,
197
+ headers: { "user-agent": specFlowCliUserAgent },
198
+ });
199
+ }
200
+ async function currentCredential(program, options, dependencies) {
201
+ const serverOrigin = resolveServerOrigin(program.opts().server);
202
+ const store = await resolveCredentialStore(serverOrigin, options, dependencies);
203
+ const credential = await store.get();
204
+ if (credential === null) {
205
+ throw new SafeCliError("No stored CLI Session. Run specflow auth login.");
206
+ }
207
+ return { credential, serverOrigin, store };
208
+ }
209
+ async function resolveCredentialStore(serverOrigin, options, dependencies) {
210
+ return dependencies.createCredentialStore({
211
+ allowFileFallback: options.allowFileFallback ?? false,
212
+ serverOrigin,
213
+ warning: dependencies.stderr,
214
+ });
215
+ }
216
+ function resolveServerOrigin(value) {
217
+ const result = parseHttpOrigin(value);
218
+ if (!result.valid && result.reason === "unsupported-protocol") {
219
+ throw new SafeCliError("--server must use HTTPS or HTTP.");
220
+ }
221
+ if (!result.valid) {
222
+ throw new SafeCliError("--server must be an origin without a path.");
223
+ }
224
+ return result.origin;
225
+ }
226
+ async function requestJson(fetch, url, init) {
227
+ const response = await fetch(url, {
228
+ ...init,
229
+ headers: withSpecFlowCliUserAgent(init.headers),
230
+ });
231
+ if (!response.ok) {
232
+ throw new SafeCliError("SpecFlow rejected the Device Authorization request.");
233
+ }
234
+ return response.json();
235
+ }
236
+ function safeFailureMessage(error) {
237
+ return error instanceof SafeCliError ? error.message : "SpecFlow CLI failed.";
238
+ }
239
+ export { runCli, } from "./cli.js";
240
+ //# 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 @@
1
+ export declare function assertSupportedNodeVersion(version: string): void;
@@ -0,0 +1,8 @@
1
+ import { SafeCliError } from "./safe-cli-error.js";
2
+ export function assertSupportedNodeVersion(version) {
3
+ const major = Number.parseInt(version.split(".")[0] ?? "", 10);
4
+ if (major !== 24) {
5
+ throw new SafeCliError("Node.js 24 is required; Node.js 22 is unsupported.");
6
+ }
7
+ }
8
+ //# sourceMappingURL=node-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-version.js","sourceRoot":"","sources":["../src/node-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,UAAU,0BAA0B,CAAC,OAAe;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,YAAY,CACpB,oDAAoD,CACrD,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type Command } from "commander";
2
+ import type createClient from "openapi-fetch";
3
+ import type { paths } from "@spec-flow/api-client";
4
+ type Client = ReturnType<typeof createClient<paths>>;
5
+ interface Runtime {
6
+ readonly run: (request: (client: Client) => Promise<{
7
+ readonly data?: unknown;
8
+ readonly error?: unknown;
9
+ readonly response: Response;
10
+ }>) => Promise<number>;
11
+ readonly setExitCode: (value: number) => void;
12
+ readonly canWrite: () => boolean;
13
+ readonly rejectWrite: () => number;
14
+ readonly parseOpaqueVersion: (value: string) => string;
15
+ }
16
+ export declare function registerProductMapCommands(program: Command, runtime: Runtime): void;
17
+ export {};
@@ -0,0 +1,48 @@
1
+ import { InvalidArgumentError } from "commander";
2
+ import { z } from "zod";
3
+ const json = (value) => { try {
4
+ return JSON.parse(value);
5
+ }
6
+ catch {
7
+ throw new InvalidArgumentError("Expected a JSON object");
8
+ } };
9
+ export function registerProductMapCommands(program, runtime) {
10
+ const run = async (request, write = false) => { runtime.setExitCode(write && !runtime.canWrite() ? runtime.rejectWrite() : await runtime.run(request)); };
11
+ const map = program.command("map").description("Read and organize the shared Workspace product map");
12
+ map.command("read").requiredOption("--workspace-id <id>").action(async (o) => run(c => c.GET("/v1/workspaces/{workspaceId}/product-map", { params: { path: o } })));
13
+ const screen = map.command("screen");
14
+ screen.command("list").requiredOption("--workspace-id <id>").action(async (o) => run(c => c.GET("/v1/workspaces/{workspaceId}/screens", { params: { path: o } })));
15
+ screen.command("read").requiredOption("--workspace-id <id>").requiredOption("--screen-id <id>").action(async (o) => run(c => c.GET("/v1/workspaces/{workspaceId}/screens/{screenId}", { params: { path: o } })));
16
+ screen.command("create").requiredOption("--workspace-id <id>").requiredOption("--name <name>").requiredOption("--idempotency-key <key>").action(async (o) => run(c => c.POST("/v1/workspaces/{workspaceId}/screens", { params: { path: o, header: { "idempotency-key": o.idempotencyKey } }, body: { name: o.name } }), true));
17
+ const versioned = (command) => command.requiredOption("--workspace-id <id>").requiredOption("--idempotency-key <key>").requiredOption("--expected-version <version>", "Last observed resource version", runtime.parseOpaqueVersion);
18
+ versioned(screen.command("rename").requiredOption("--screen-id <id>").requiredOption("--name <name>")).action(async (o) => run(c => c.PATCH("/v1/workspaces/{workspaceId}/screens/{screenId}", { params: { path: o, header: { "idempotency-key": o.idempotencyKey, "if-match": o.expectedVersion } }, body: { name: o.name } }), true));
19
+ versioned(screen.command("delete").requiredOption("--screen-id <id>")).action(async (o) => run(c => c.DELETE("/v1/workspaces/{workspaceId}/screens/{screenId}", { params: { path: o, header: { "idempotency-key": o.idempotencyKey, "if-match": o.expectedVersion } } }), true));
20
+ versioned(screen.command("update").requiredOption("--screen-id <id>").requiredOption("--fields <json>", "Screen name, description or HTTPS image", json)).action(async (o) => {
21
+ const fields = z.object({ name: z.string().optional(), description: z.string().nullable().optional(), image: z.object({ kind: z.literal("url"), url: z.url() }).nullable().optional() }).strict().refine(value => Object.keys(value).length > 0).parse(o.fields);
22
+ await run(c => c.PATCH("/v1/workspaces/{workspaceId}/screens/{screenId}", { params: { path: o, header: { "idempotency-key": o.idempotencyKey, "if-match": o.expectedVersion } }, body: { ...(fields.name === undefined ? {} : { name: fields.name }), ...(fields.description === undefined ? {} : { description: fields.description }), ...(fields.image === undefined ? {} : { image: fields.image }) } }), true);
23
+ });
24
+ versioned(screen.command("image-remove").requiredOption("--screen-id <id>")).action(async (o) => run(c => c.DELETE("/v1/workspaces/{workspaceId}/screens/{screenId}/image", { params: { path: o, header: { "idempotency-key": o.idempotencyKey, "if-match": o.expectedVersion } } }), true));
25
+ versioned(screen.command("image-reserve").requiredOption("--screen-id <id>").requiredOption("--metadata <json>", "Image filename, MIME type and byte size", json)).action(async (o) => {
26
+ const metadata = z.object({ filename: z.string(), contentType: z.string(), size: z.number().int().positive() }).strict().parse(o.metadata);
27
+ await run(c => c.POST("/v1/workspaces/{workspaceId}/screens/{screenId}/image/uploads", { params: { path: o, header: { "idempotency-key": o.idempotencyKey, "if-match": o.expectedVersion } }, body: metadata }), true);
28
+ });
29
+ versioned(screen.command("image-finalize").requiredOption("--screen-id <id>").requiredOption("--upload-id <id>")).action(async (o) => run(c => c.POST("/v1/workspaces/{workspaceId}/screens/{screenId}/image/finalize", { params: { path: o, header: { "idempotency-key": o.idempotencyKey, "if-match": o.expectedVersion } }, body: { uploadId: o.uploadId } }), true));
30
+ const journey = map.command("journey");
31
+ journey.command("read").requiredOption("--workspace-id <id>").requiredOption("--journey-id <id>").action(async (o) => run(c => c.GET("/v1/workspaces/{workspaceId}/journeys/{journeyId}", { params: { path: o } })));
32
+ journey.command("list").requiredOption("--workspace-id <id>").action(async (o) => run(c => c.GET("/v1/workspaces/{workspaceId}/journeys", { params: { path: o } })));
33
+ journey.command("create").requiredOption("--workspace-id <id>").requiredOption("--name <name>").requiredOption("--idempotency-key <key>").action(async (o) => run(c => c.POST("/v1/workspaces/{workspaceId}/journeys", { params: { path: o, header: { "idempotency-key": o.idempotencyKey } }, body: { name: o.name } }), true));
34
+ versioned(journey.command("rename").requiredOption("--journey-id <id>").requiredOption("--name <name>")).action(async (o) => run(c => c.PATCH("/v1/workspaces/{workspaceId}/journeys/{journeyId}", { params: { path: o, header: { "idempotency-key": o.idempotencyKey, "if-match": o.expectedVersion } }, body: { name: o.name } }), true));
35
+ versioned(journey.command("update").requiredOption("--journey-id <id>").requiredOption("--fields <json>", "Journey name, description or position", json)).action(async (o) => {
36
+ const fields = z.object({ name: z.string().optional(), description: z.string().nullable().optional(), position: z.number().int().nonnegative().optional() }).strict().refine(value => Object.keys(value).length > 0).parse(o.fields);
37
+ await run(c => c.PATCH("/v1/workspaces/{workspaceId}/journeys/{journeyId}", { params: { path: o, header: { "idempotency-key": o.idempotencyKey, "if-match": o.expectedVersion } }, body: { ...(fields.name === undefined ? {} : { name: fields.name }), ...(fields.description === undefined ? {} : { description: fields.description }), ...(fields.position === undefined ? {} : { position: fields.position }) } }), true);
38
+ });
39
+ versioned(journey.command("steps").requiredOption("--journey-id <id>").requiredOption("--steps <json>", "Ordered screen/backstage steps", json)).action(async (o) => {
40
+ const steps = z.array(z.discriminatedUnion("kind", [z.object({ kind: z.literal("screen"), screenId: z.string() }), z.object({ kind: z.literal("backstage"), title: z.string(), description: z.string().optional() })])).max(50).parse(o.steps);
41
+ await run(c => c.PUT("/v1/workspaces/{workspaceId}/journeys/{journeyId}/steps", { params: { path: o, header: { "idempotency-key": o.idempotencyKey, "if-match": o.expectedVersion } }, body: { steps: steps.map(step => step.kind === "screen" ? step : { kind: step.kind, title: step.title, ...(step.description === undefined ? {} : { description: step.description }) }) } }), true);
42
+ });
43
+ versioned(journey.command("delete").requiredOption("--journey-id <id>")).action(async (o) => run(c => c.DELETE("/v1/workspaces/{workspaceId}/journeys/{journeyId}", { params: { path: o, header: { "idempotency-key": o.idempotencyKey, "if-match": o.expectedVersion } } }), true));
44
+ versioned(map.command("place").requiredOption("--screen-id <id>").requiredOption("--spec-id <id>").option("--scenario-id <id...>")).action(async (o) => run(c => c.PUT("/v1/workspaces/{workspaceId}/screens/{screenId}/placements/{specId}", { params: { path: o, header: { "idempotency-key": o.idempotencyKey, "if-match": o.expectedVersion } }, body: { scenarioIds: o.scenarioId ?? [] } }), true));
45
+ versioned(map.command("unplace").requiredOption("--screen-id <id>").requiredOption("--spec-id <id>")).action(async (o) => run(c => c.DELETE("/v1/workspaces/{workspaceId}/screens/{screenId}/placements/{specId}", { params: { path: o, header: { "idempotency-key": o.idempotencyKey, "if-match": o.expectedVersion } } }), true));
46
+ versioned(map.command("backstage").requiredOption("--spec-id <id>").option("--clear")).action(async (o) => run(c => c.PUT("/v1/workspaces/{workspaceId}/specs/{specId}/backstage", { params: { path: o, header: { "idempotency-key": o.idempotencyKey, "if-match": o.expectedVersion } }, body: { backstage: !o.clear } }), true));
47
+ }
48
+ //# sourceMappingURL=product-map-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-map-commands.js","sourceRoot":"","sources":["../src/product-map-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare class SafeCliError extends Error {
2
+ }
@@ -0,0 +1,3 @@
1
+ export class SafeCliError extends Error {
2
+ }
3
+ //# sourceMappingURL=safe-cli-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-cli-error.js","sourceRoot":"","sources":["../src/safe-cli-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAa,SAAQ,KAAK;CAAG"}
@@ -0,0 +1,3 @@
1
+ export declare const specFlowCliVersion: string;
2
+ export declare const specFlowCliUserAgent: string;
3
+ export declare function withSpecFlowCliUserAgent(headers?: ConstructorParameters<typeof Headers>[0]): Headers;
@@ -0,0 +1,10 @@
1
+ import packageMetadata from "../package.json" with { type: "json" };
2
+ export const specFlowCliVersion = packageMetadata.version;
3
+ // Keep the wire identity compatible with deployed API recognition.
4
+ export const specFlowCliUserAgent = `@ztalkai/spec-flow-cli/${specFlowCliVersion}`;
5
+ export function withSpecFlowCliUserAgent(headers) {
6
+ const requestHeaders = new Headers(headers);
7
+ requestHeaders.set("user-agent", specFlowCliUserAgent);
8
+ return requestHeaders;
9
+ }
10
+ //# sourceMappingURL=user-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-agent.js","sourceRoot":"","sources":["../src/user-agent.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEpE,MAAM,CAAC,MAAM,kBAAkB,GAAG,eAAe,CAAC,OAAO,CAAC;AAC1D,mEAAmE;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,kBAAkB,EAAE,CAAC;AAEnF,MAAM,UAAU,wBAAwB,CACtC,OAAkD;IAElD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC;IACvD,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type Command } from "commander";
2
+ import type createClient from "openapi-fetch";
3
+ import type { paths } from "@spec-flow/api-client";
4
+ import type { CliDependencies } from "./cli.js";
5
+ type Client = ReturnType<typeof createClient<paths>>;
6
+ interface Result {
7
+ readonly data?: unknown;
8
+ readonly error?: unknown;
9
+ readonly response: Response;
10
+ }
11
+ interface Failure {
12
+ readonly message: string;
13
+ readonly reason: "Temporary Failure";
14
+ readonly retryable: false;
15
+ }
16
+ interface Runtime {
17
+ readonly dependencies: CliDependencies;
18
+ readonly run: (request: (client: Client) => Promise<Result>, options: {
19
+ readonly requireUserSession: true;
20
+ readonly validateSuccess?: (data: unknown) => Failure | null;
21
+ }) => Promise<number>;
22
+ readonly setExitCode: (value: number) => void;
23
+ readonly parseScopes: (value: string) => Readonly<Record<string, readonly string[]>>;
24
+ readonly parseLimit: (value: string) => number;
25
+ }
26
+ /** Consume one-time secrets before the shared command runner can print data. */
27
+ export declare function registerUserApiKeyCommands(program: Command, runtime: Runtime): void;
28
+ export {};
@@ -0,0 +1,129 @@
1
+ import { InvalidArgumentError } from "commander";
2
+ import { randomUUID } from "node:crypto";
3
+ import { z } from "zod";
4
+ const uuid = (value) => {
5
+ if (!z.uuid().safeParse(value).success)
6
+ throw new InvalidArgumentError("Key and command IDs must be UUIDs");
7
+ return value.toLowerCase();
8
+ };
9
+ const expiresAt = (value) => {
10
+ if (value === "never")
11
+ return value;
12
+ if (!z.iso.datetime().safeParse(value).success)
13
+ throw new InvalidArgumentError("Expiry must be a UTC ISO timestamp or never");
14
+ return value;
15
+ };
16
+ const version = (value) => {
17
+ if (!/^"[1-9]\d{0,9}"$/u.test(value) || Number(value.slice(1, -1)) > 2_147_483_647)
18
+ throw new InvalidArgumentError("Expected version must be the quoted version returned by list");
19
+ return value;
20
+ };
21
+ const grants = (value) => {
22
+ try {
23
+ return z.array(z.object({ scope: z.enum(["WorkspaceKnowledge", "ProjectTasks"]), resourceId: z.string().min(1).max(200), statements: z.record(z.string(), z.array(z.string()).min(1)) }).strict()).min(1).max(100).parse(JSON.parse(value));
24
+ }
25
+ catch {
26
+ throw new InvalidArgumentError("Grants must be an explicit WorkspaceKnowledge/ProjectTasks JSON array");
27
+ }
28
+ };
29
+ const keyMetadata = z.object({
30
+ id: z.uuid(), name: z.string(), prefix: z.string().max(12), grants: z.array(z.object({ scope: z.enum(["WorkspaceKnowledge", "ProjectTasks"]), resourceId: z.string(), statements: z.record(z.string(), z.array(z.string())) })),
31
+ version: z.string().regex(/^"[1-9]\d*"$/u), createdAt: z.iso.datetime(), expiresAt: z.iso.datetime().nullable(), revokedAt: z.iso.datetime().nullable(),
32
+ });
33
+ const issued = z.object({ key: keyMetadata, credential: z.string().regex(/^sfk_[A-Za-z0-9_-]{43}$/u).nullable(), replayed: z.boolean() });
34
+ const revoked = z.object({ key: keyMetadata, replayed: z.boolean() });
35
+ const listed = z.object({ keys: z.array(keyMetadata), nextCursor: z.string().nullable() });
36
+ const failure = (message) => ({ message, reason: "Temporary Failure", retryable: false });
37
+ /** Consume one-time secrets before the shared command runner can print data. */
38
+ export function registerUserApiKeyCommands(program, runtime) {
39
+ const manager = program.command("api-key").description("Manage User API Keys using an authenticated User Session");
40
+ manager.command("list")
41
+ .option("--limit <limit>", "Maximum results, 1 through 100", runtime.parseLimit, 50)
42
+ .option("--cursor <cursor>", "Cursor from the previous page")
43
+ .action(async (options) => {
44
+ runtime.setExitCode(await runtime.run(async (client) => {
45
+ const result = await client.GET("/v1/user-api-keys", { params: { query: options } });
46
+ return result.response.ok ? { ...result, data: listed.parse(result.data) } : result;
47
+ }, { requireUserSession: true }));
48
+ });
49
+ manager.command("create")
50
+ .requiredOption("--name <name>", "Key display name")
51
+ .requiredOption("--grants <json>", "Explicit Workspace knowledge and Project task grants", grants)
52
+ .requiredOption("--expires-at <timestamp>", "UTC ISO expiry or never", expiresAt)
53
+ .requiredOption("--idempotency-key <id>", "Reuse the same command ID and intent to recover its receipt", uuid)
54
+ .action(async (options) => {
55
+ let storageFailure = null;
56
+ runtime.setExitCode(await runtime.run(async (client) => {
57
+ if (runtime.dependencies.credentialStore.writeApiKey === undefined) {
58
+ storageFailure = failure("API Key storage is unavailable; no key was issued");
59
+ return { response: new Response(null, { status: 200 }), data: { credentialStored: false } };
60
+ }
61
+ const result = await client.POST("/v1/user-api-keys", {
62
+ params: { header: { "idempotency-key": options.idempotencyKey } },
63
+ body: { name: options.name, grants: options.grants, expiresAt: options.expiresAt === "never" ? null : options.expiresAt },
64
+ });
65
+ if (!result.response.ok)
66
+ return result;
67
+ const receipt = issued.parse(result.data);
68
+ const id = receipt.key.id;
69
+ const metadata = { key: receipt.key, replayed: receipt.replayed, credentialStored: false };
70
+ if (receipt.credential === null) {
71
+ let existing = null;
72
+ try {
73
+ existing = await runtime.dependencies.credentialStore.readApiKey?.(id) ?? null;
74
+ }
75
+ catch { /* Never echo a credential-store exception. */ }
76
+ if (existing !== null && /^sfk_[A-Za-z0-9_-]{43}$/u.test(existing))
77
+ return { ...result, data: { ...metadata, credentialStored: true } };
78
+ storageFailure = failure(`Key ${id} was issued, but its secret cannot be recovered; revoke it before deliberately creating another`);
79
+ return { ...result, data: metadata };
80
+ }
81
+ try {
82
+ await runtime.dependencies.credentialStore.writeApiKey(id, receipt.credential);
83
+ return { ...result, data: { ...metadata, credentialStored: true } };
84
+ }
85
+ catch {
86
+ // Revoke only the credential minted by this exact successful command.
87
+ // A changed version or uncertain response never triggers a fresh issue.
88
+ let compensated = false;
89
+ try {
90
+ const compensation = await client.DELETE("/v1/user-api-keys/{keyId}", { params: { path: { keyId: id }, header: { "if-match": receipt.key.version, "idempotency-key": randomUUID() } } });
91
+ const parsed = revoked.safeParse(compensation.data);
92
+ compensated = compensation.response.ok && parsed.success && parsed.data.key.id === id && parsed.data.key.revokedAt !== null;
93
+ }
94
+ catch { /* An unknown revoke outcome must be reported conservatively. */ }
95
+ if (compensated) {
96
+ try {
97
+ await runtime.dependencies.credentialStore.deleteApiKey?.(id);
98
+ }
99
+ catch { /* Server revocation already makes this credential unusable. */ }
100
+ }
101
+ storageFailure = failure(compensated ? `Key ${id} could not be saved and was revoked; fix credential storage before creating another` : `Key ${id} could not be saved; revocation is unconfirmed. List and revoke this key before creating another`);
102
+ return { ...result, data: metadata };
103
+ }
104
+ }, { requireUserSession: true, validateSuccess: () => storageFailure }));
105
+ });
106
+ manager.command("revoke")
107
+ .requiredOption("--key-id <id>", "Key identity returned by list", uuid)
108
+ .requiredOption("--expected-version <version>", "Quoted version returned by list", version)
109
+ .requiredOption("--idempotency-key <id>", "Reuse the same command ID and expected version when retrying", uuid)
110
+ .action(async (options) => {
111
+ let deletionFailure = null;
112
+ runtime.setExitCode(await runtime.run(async (client) => {
113
+ const result = await client.DELETE("/v1/user-api-keys/{keyId}", { params: { path: { keyId: options.keyId }, header: { "if-match": options.expectedVersion, "idempotency-key": options.idempotencyKey } } });
114
+ if (!result.response.ok)
115
+ return result;
116
+ const receipt = revoked.parse(result.data);
117
+ if (receipt.key.id !== options.keyId || receipt.key.revokedAt === null)
118
+ throw new Error("Invalid revocation receipt");
119
+ try {
120
+ await runtime.dependencies.credentialStore.deleteApiKey?.(options.keyId);
121
+ }
122
+ catch {
123
+ deletionFailure = failure(`Key ${options.keyId} was revoked, but its local credential could not be removed`);
124
+ }
125
+ return { ...result, data: receipt };
126
+ }, { requireUserSession: true, validateSuccess: () => deletionFailure }));
127
+ });
128
+ }
129
+ //# sourceMappingURL=user-api-key-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-api-key-commands.js","sourceRoot":"","sources":["../src/user-api-key-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Command } from "commander";
2
+ import type createClient from "openapi-fetch";
3
+ import type { paths } from "@spec-flow/api-client";
4
+ import type { CliDependencies } from "./cli.js";
5
+ type Client = ReturnType<typeof createClient<paths>>;
6
+ interface Result {
7
+ readonly data?: unknown;
8
+ readonly error?: unknown;
9
+ readonly response: Response;
10
+ }
11
+ interface Runtime {
12
+ readonly dependencies: CliDependencies;
13
+ readonly run: (request: (client: Client) => Promise<Result>, options?: {
14
+ readonly retryTransportOnce?: boolean;
15
+ readonly ambiguousOutcomeMessage?: string;
16
+ }) => Promise<number>;
17
+ readonly setExitCode: (value: number) => void;
18
+ readonly rejectWrite: () => number;
19
+ }
20
+ /** One published CLI entry with explicit replayable upload phases. The signed
21
+ * reservation is read from a file rather than repeated in shell arguments.
22
+ */
23
+ export declare function registerWorkItemAssetCommands(workItem: Command, runtime: Runtime): void;
24
+ export {};