@gonovus-ai/spec-flow-cli 0.5.0 → 0.6.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 (38) hide show
  1. package/README.md +57 -28
  2. package/dist/bin.js +6 -50
  3. package/dist/bin.js.map +1 -1
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.js +103 -397
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/work-item-output.d.ts +390 -0
  8. package/dist/commands/work-item-output.js +36 -0
  9. package/dist/commands/work-item-output.js.map +1 -0
  10. package/dist/http-origin.js +3 -0
  11. package/dist/http-origin.js.map +1 -1
  12. package/dist/index.js +50 -28
  13. package/dist/index.js.map +1 -1
  14. package/dist/input/text-source.d.ts +9 -0
  15. package/dist/input/text-source.js +74 -0
  16. package/dist/input/text-source.js.map +1 -0
  17. package/dist/program.d.ts +3 -0
  18. package/dist/program.js +19 -0
  19. package/dist/program.js.map +1 -0
  20. package/dist/runtime/errors.d.ts +28 -0
  21. package/dist/runtime/errors.js +133 -0
  22. package/dist/runtime/errors.js.map +1 -0
  23. package/dist/runtime/execute.d.ts +23 -0
  24. package/dist/runtime/execute.js +25 -0
  25. package/dist/runtime/execute.js.map +1 -0
  26. package/dist/runtime/identity.d.ts +183 -0
  27. package/dist/runtime/identity.js +17 -0
  28. package/dist/runtime/identity.js.map +1 -0
  29. package/dist/runtime/output.d.ts +3 -0
  30. package/dist/runtime/output.js +13 -0
  31. package/dist/runtime/output.js.map +1 -0
  32. package/dist/runtime/session.d.ts +16 -0
  33. package/dist/runtime/session.js +123 -0
  34. package/dist/runtime/session.js.map +1 -0
  35. package/package.json +1 -1
  36. package/dist/work-item-time-entry-input.d.ts +0 -4
  37. package/dist/work-item-time-entry-input.js +0 -27
  38. package/dist/work-item-time-entry-input.js.map +0 -1
@@ -0,0 +1,74 @@
1
+ import { CommanderError, InvalidArgumentError } from "commander";
2
+ import { constants } from "node:fs";
3
+ import { open, stat } from "node:fs/promises";
4
+ const maximumBytes = 80_000;
5
+ /** Commander must not silently overwrite an earlier source selection. */
6
+ export function singleDescriptionSource(value, previous) {
7
+ if (previous !== undefined)
8
+ throw new CommanderError(2, "specflow.duplicateDescriptionSource", "Choose one description source; repeated description options are not allowed");
9
+ return value;
10
+ }
11
+ /** Read only an explicitly selected source, preserving its bytes as UTF-8 text. */
12
+ export async function readDescription(source) {
13
+ if (Number(source.description !== undefined) + Number(source.descriptionFile !== undefined) + Number(source.clearDescription === true) > 1) {
14
+ throw new InvalidArgumentError("Choose one description source: inline, file/stdin, or clear");
15
+ }
16
+ if (source.clearDescription === true)
17
+ return null;
18
+ let text = source.description;
19
+ if (source.descriptionFile !== undefined) {
20
+ try {
21
+ let bytes;
22
+ if (source.descriptionFile === "-") {
23
+ if (process.stdin.isTTY)
24
+ throw new Error("tty");
25
+ const chunks = [];
26
+ let length = 0;
27
+ for await (const chunk of process.stdin) {
28
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));
29
+ length += buffer.length;
30
+ if (length > maximumBytes)
31
+ throw new Error("size");
32
+ chunks.push(buffer);
33
+ }
34
+ bytes = Buffer.concat(chunks);
35
+ }
36
+ else {
37
+ const before = await stat(source.descriptionFile);
38
+ if (!before.isFile() || before.size > maximumBytes)
39
+ throw new Error("file");
40
+ // NONBLOCK prevents a replacement FIFO from blocking open; fstat and inode
41
+ // comparison reject replacements between the path check and opening.
42
+ const file = await open(source.descriptionFile, constants.O_RDONLY | constants.O_NONBLOCK);
43
+ try {
44
+ const after = await file.stat();
45
+ if (!after.isFile() || after.dev !== before.dev || after.ino !== before.ino || after.size > maximumBytes)
46
+ throw new Error("file");
47
+ const buffer = Buffer.alloc(maximumBytes + 1);
48
+ let length = 0;
49
+ while (length < buffer.length) {
50
+ const result = await file.read(buffer, length, buffer.length - length, length);
51
+ if (result.bytesRead === 0)
52
+ break;
53
+ length += result.bytesRead;
54
+ }
55
+ if (length > maximumBytes)
56
+ throw new Error("size");
57
+ bytes = buffer.subarray(0, length);
58
+ }
59
+ finally {
60
+ await file.close();
61
+ }
62
+ }
63
+ text = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes);
64
+ }
65
+ catch {
66
+ throw new InvalidArgumentError("Description source must be a regular UTF-8 file of at most 80000 bytes; for stdin use a pipe with --description-file - (no TTY)");
67
+ }
68
+ }
69
+ if (text !== undefined && (text.trim().length === 0 || text.trim().length > 20_000)) {
70
+ throw new InvalidArgumentError("Description must contain 1 to 20000 UTF-16 code units after trimming");
71
+ }
72
+ return text;
73
+ }
74
+ //# sourceMappingURL=text-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-source.js","sourceRoot":"","sources":["../../src/input/text-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,YAAY,GAAG,MAAM,CAAC;AAE5B,yEAAyE;AACzE,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,QAAiB;IACtE,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,IAAI,cAAc,CAAC,CAAC,EAAE,qCAAqC,EAAE,6EAA6E,CAAC,CAAC;IAC9K,OAAO,KAAK,CAAC;AACf,CAAC;AAQD,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAkB;IACtD,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,KAAK,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3I,MAAM,IAAI,oBAAoB,CAAC,6DAA6D,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,MAAM,CAAC,gBAAgB,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;IAC9B,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,IAAI,KAAiB,CAAC;YACtB,IAAI,MAAM,CAAC,eAAe,KAAK,GAAG,EAAE,CAAC;gBACnC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChD,MAAM,MAAM,GAAa,EAAE,CAAC;gBAC5B,IAAI,MAAM,GAAG,CAAC,CAAC;gBACf,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBACxC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC3E,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;oBACxB,IAAI,MAAM,GAAG,YAAY;wBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;oBACnD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;gBACD,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBAClD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY;oBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC5E,2EAA2E;gBAC3E,qEAAqE;gBACrE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC3F,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;oBAChC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,GAAG,YAAY;wBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;oBAClI,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;oBAC9C,IAAI,MAAM,GAAG,CAAC,CAAC;oBACf,OAAO,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;wBAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;wBAC/E,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC;4BAAE,MAAM;wBAClC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC;oBAC7B,CAAC;oBACD,IAAI,MAAM,GAAG,YAAY;wBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;oBACnD,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACrC,CAAC;wBAAS,CAAC;oBAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,CAAC;YACnC,CAAC;YACD,IAAI,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,oBAAoB,CAAC,iIAAiI,CAAC,CAAC;QACpK,CAAC;IACH,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,oBAAoB,CAAC,sEAAsE,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { CliDependencies } from "./cli.js";
3
+ export declare function createProgram(dependencies: Pick<CliDependencies, "stdout">): Command;
@@ -0,0 +1,19 @@
1
+ import { Command, InvalidArgumentError } from "commander";
2
+ import { specFlowCliVersion } from "./user-agent.js";
3
+ export function createProgram(dependencies) {
4
+ return new Command()
5
+ .name("specflow")
6
+ .version(specFlowCliVersion)
7
+ .description("Read and govern SpecFlow through supported commands")
8
+ .option("--allow-file-fallback", "use a warned owner-only local credential file if the system store is unavailable")
9
+ .option("--server <url>", "SpecFlow server origin")
10
+ .option("--output <mode>", "JSON output: full or summary (supported Work Item commands only)", (value) => { if (value !== "full" && value !== "summary")
11
+ throw new InvalidArgumentError("Output must be full or summary"); return value; })
12
+ .option("--api-key-id <id>", "Use an origin-scoped User API Key from the credential store")
13
+ .exitOverride()
14
+ .configureOutput({
15
+ writeErr: () => undefined,
16
+ writeOut: dependencies.stdout,
17
+ });
18
+ }
19
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAG1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,UAAU,aAAa,CAAC,YAA6C;IACzE,OAAO,IAAI,OAAO,EAAE;SACjB,IAAI,CAAC,UAAU,CAAC;SAChB,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CACL,uBAAuB,EACvB,kFAAkF,CACnF;SACA,MAAM,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;SAClD,MAAM,CAAC,iBAAiB,EAAE,kEAAkE,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,oBAAoB,CAAC,gCAAgC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;SAClP,MAAM,CAAC,mBAAmB,EAAE,6DAA6D,CAAC;SAC1F,YAAY,EAAE;SACd,eAAe,CAAC;QACf,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS;QACzB,QAAQ,EAAE,YAAY,CAAC,MAAM;KAC9B,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { CliDependencies } from "../cli.js";
2
+ export declare function mapHttpFailure(response: Response, payload: unknown): SkillError;
3
+ type SkillErrorReason = "Authentication Failed" | "Invalid Operation" | "Permission Denied" | "Project Not Accessible" | "Resource Changed" | "Resource Not Found" | "Temporary Failure";
4
+ interface SkillErrorDiagnostic {
5
+ readonly column?: number;
6
+ readonly line?: number;
7
+ readonly message: string;
8
+ readonly reason: string;
9
+ }
10
+ export interface SkillError {
11
+ readonly requestId?: string;
12
+ readonly code?: string;
13
+ readonly status?: number;
14
+ readonly issues?: readonly {
15
+ readonly location: string;
16
+ readonly path: readonly (string | number)[];
17
+ readonly rule: string;
18
+ readonly message: string;
19
+ }[];
20
+ readonly diagnostics?: readonly SkillErrorDiagnostic[];
21
+ readonly message: string;
22
+ readonly reason: SkillErrorReason;
23
+ readonly retryAfter?: string;
24
+ readonly retryable: boolean;
25
+ }
26
+ export declare function skillErrorExitCode(error: SkillError): number;
27
+ export declare function writeSkillError(dependencies: CliDependencies, error: SkillError): void;
28
+ export {};
@@ -0,0 +1,133 @@
1
+ import { z } from "zod";
2
+ export function mapHttpFailure(response, payload) {
3
+ const failure = classifyHttpFailure(response, payload);
4
+ const issues = z.array(z.object({ location: z.enum(["body", "query", "path", "headers", "tool"]), path: z.array(z.union([z.string().max(100), z.number()])), rule: z.string().max(100), message: z.string().max(500) })).max(20).safeParse(z.object({ issues: z.unknown() }).safeParse(payload).data?.issues);
5
+ const code = readServerCode(payload);
6
+ const requestId = response.headers.get("x-request-id");
7
+ return { ...failure, ...(requestId !== null && /^[A-Za-z0-9._:-]{1,100}$/u.test(requestId) ? { requestId } : {}), status: response.status, ...(code !== null && /^[A-Z][A-Z0-9_]{0,79}$/u.test(code) ? { code } : {}), ...(issues.success ? { issues: issues.data } : {}) };
8
+ }
9
+ function classifyHttpFailure(response, payload) {
10
+ const { status } = response;
11
+ const serverMessage = readServerMessage(payload);
12
+ const serverCode = readServerCode(payload);
13
+ if (status === 404 && serverCode === "IDENTITY_NOT_SUPPORTED") {
14
+ return { message: serverMessage ?? "This server does not support current identity", reason: "Invalid Operation", retryable: false };
15
+ }
16
+ if (status === 401) {
17
+ return {
18
+ message: serverMessage ?? "Workspace read-only Token is invalid, expired, or revoked",
19
+ reason: "Authentication Failed",
20
+ retryable: false,
21
+ };
22
+ }
23
+ if (status === 403) {
24
+ return {
25
+ message: serverMessage ?? "Workspace read-only Token does not permit this operation",
26
+ reason: "Permission Denied",
27
+ retryable: false,
28
+ };
29
+ }
30
+ if (status === 404) {
31
+ if (serverCode === "PROJECT_NOT_ACCESSIBLE") {
32
+ return {
33
+ message: serverMessage ?? "The Project is not accessible",
34
+ reason: "Project Not Accessible",
35
+ retryable: false,
36
+ };
37
+ }
38
+ return {
39
+ message: serverMessage ?? "The requested Project resource was not found",
40
+ reason: "Resource Not Found",
41
+ retryable: false,
42
+ };
43
+ }
44
+ if (status === 409 && serverCode === "RESOURCE_CHANGED") {
45
+ return {
46
+ message: serverMessage ?? "The Working Draft changed after the Proposal baseline",
47
+ reason: "Resource Changed",
48
+ retryable: false,
49
+ };
50
+ }
51
+ if (status === 400 || status === 409 || status === 413 || status === 422 || status === 428) {
52
+ const diagnostics = readServerDiagnostics(payload);
53
+ return {
54
+ ...(diagnostics === undefined ? {} : { diagnostics }),
55
+ message: serverMessage ?? "The requested operation is invalid",
56
+ reason: "Invalid Operation",
57
+ retryable: false,
58
+ };
59
+ }
60
+ if (status === 412) {
61
+ return {
62
+ message: serverMessage ?? "The resource changed after it was read",
63
+ reason: "Resource Changed",
64
+ retryable: false,
65
+ };
66
+ }
67
+ if (status === 429) {
68
+ const retryAfter = response.headers.get("retry-after");
69
+ return {
70
+ message: serverMessage ?? "SpecFlow is temporarily throttling this client",
71
+ reason: "Temporary Failure",
72
+ ...(retryAfter === null ? {} : { retryAfter }),
73
+ retryable: true,
74
+ };
75
+ }
76
+ return {
77
+ message: serverMessage ?? "SpecFlow is temporarily unavailable",
78
+ reason: "Temporary Failure",
79
+ retryable: status >= 500,
80
+ };
81
+ }
82
+ function readServerMessage(payload) {
83
+ return typeof payload === "object" &&
84
+ payload !== null &&
85
+ "message" in payload &&
86
+ typeof payload.message === "string"
87
+ ? payload.message
88
+ : null;
89
+ }
90
+ function readServerCode(payload) {
91
+ return typeof payload === "object" &&
92
+ payload !== null &&
93
+ "code" in payload &&
94
+ typeof payload.code === "string"
95
+ ? payload.code
96
+ : null;
97
+ }
98
+ function readServerDiagnostics(payload) {
99
+ if (typeof payload !== "object" ||
100
+ payload === null ||
101
+ !("diagnostics" in payload) ||
102
+ !Array.isArray(payload.diagnostics)) {
103
+ return undefined;
104
+ }
105
+ const diagnostics = payload.diagnostics.flatMap((entry) => {
106
+ if (typeof entry !== "object" || entry === null) {
107
+ return [];
108
+ }
109
+ const { column, line, message, reason } = entry;
110
+ if (typeof reason !== "string" || typeof message !== "string") {
111
+ return [];
112
+ }
113
+ return [
114
+ {
115
+ ...(typeof column === "number" ? { column } : {}),
116
+ ...(typeof line === "number" ? { line } : {}),
117
+ message,
118
+ reason,
119
+ },
120
+ ];
121
+ });
122
+ return diagnostics.length === 0 ? undefined : diagnostics;
123
+ }
124
+ export function skillErrorExitCode(error) {
125
+ if (error.reason === "Permission Denied") {
126
+ return 3;
127
+ }
128
+ return error.reason === "Temporary Failure" ? 4 : 2;
129
+ }
130
+ export function writeSkillError(dependencies, error) {
131
+ dependencies.stderr(`${JSON.stringify({ error })}\n`);
132
+ }
133
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/runtime/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type createClient from "openapi-fetch";
2
+ import type { paths } from "@spec-flow/api-client";
3
+ import { type SkillError } from "./errors.js";
4
+ export interface ApiResult<T> {
5
+ readonly data?: T;
6
+ readonly error?: unknown;
7
+ readonly response: Response;
8
+ }
9
+ export interface ExecuteOptions {
10
+ readonly ambiguousOutcomeMessage?: string;
11
+ readonly rejectWorkspaceReadToken?: boolean;
12
+ readonly requireUserSession?: boolean;
13
+ readonly retryTransportOnce?: boolean;
14
+ readonly validateSuccess?: (data: unknown) => SkillError | null;
15
+ }
16
+ export type ExecutionResult<T> = {
17
+ readonly ok: true;
18
+ readonly data: T;
19
+ } | {
20
+ readonly ok: false;
21
+ readonly error: SkillError;
22
+ };
23
+ export declare function execute<T>(request: (client: ReturnType<typeof createClient<paths>>) => Promise<ApiResult<T>>, client: ReturnType<typeof createClient<paths>>, options?: ExecuteOptions): Promise<ExecutionResult<T>>;
@@ -0,0 +1,25 @@
1
+ import { mapHttpFailure } from "./errors.js";
2
+ export async function execute(request, client, options = {}) {
3
+ let result;
4
+ try {
5
+ result = await request(client);
6
+ }
7
+ catch {
8
+ return { ok: false, error: options.retryTransportOnce === true ? ambiguousMutationError(options.ambiguousOutcomeMessage) : { message: "SpecFlow is temporarily unavailable", reason: "Temporary Failure", retryable: true } };
9
+ }
10
+ if (result.response.ok && result.data !== undefined) {
11
+ const error = options.validateSuccess?.(result.data) ?? null;
12
+ return error === null ? { ok: true, data: result.data } : { ok: false, error };
13
+ }
14
+ return { ok: false, error: result.response.ok && options.retryTransportOnce === true ? ambiguousMutationError(options.ambiguousOutcomeMessage) : mapHttpFailure(result.response, result.error) };
15
+ }
16
+ function ambiguousMutationError(message) {
17
+ return {
18
+ message: message ??
19
+ "Write outcome is unknown; read the target resource before trying a new command identity",
20
+ code: "EXECUTION_OUTCOME_UNKNOWN",
21
+ reason: "Temporary Failure",
22
+ retryable: false,
23
+ };
24
+ }
25
+ //# sourceMappingURL=execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/runtime/execute.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAmB,MAAM,aAAa,CAAC;AAW9D,MAAM,CAAC,KAAK,UAAU,OAAO,CAAI,OAAkF,EAAE,MAA8C,EAAE,UAA0B,EAAE;IAC/L,IAAI,MAAoB,CAAC;IACzB,IAAI,CAAC;QAAC,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IACvC,MAAM,CAAC;QAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,qCAAqC,EAAE,MAAM,EAAE,mBAAmB,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;IAAC,CAAC;IACxO,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;QAC7D,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACjF,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACnM,CAAC;AACD,SAAS,sBAAsB,CAAC,OAAgB;IAC9C,OAAO;QACL,OAAO,EACL,OAAO;YACP,yFAAyF;QAC3F,IAAI,EAAE,2BAA2B;QACjC,MAAM,EAAE,mBAAmB;QAC3B,SAAS,EAAE,KAAK;KACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,183 @@
1
+ import type createClient from "openapi-fetch";
2
+ import type { paths } from "@spec-flow/api-client";
3
+ export declare function readIdentity(client: ReturnType<typeof createClient<paths>>): Promise<import("openapi-fetch").FetchResponse<{
4
+ parameters: {
5
+ query?: never;
6
+ header?: never;
7
+ path?: never;
8
+ cookie?: never;
9
+ };
10
+ requestBody?: never;
11
+ responses: {
12
+ 200: {
13
+ headers: {
14
+ [name: string]: unknown;
15
+ };
16
+ content: {
17
+ "application/json": {
18
+ user: {
19
+ id: string;
20
+ };
21
+ };
22
+ };
23
+ };
24
+ 400: {
25
+ headers: {
26
+ [name: string]: unknown;
27
+ };
28
+ content: {
29
+ "application/json": {
30
+ code: string;
31
+ message: string;
32
+ issues?: {
33
+ location: "body" | "query" | "path" | "headers" | "tool";
34
+ path: (string | number)[];
35
+ rule: string;
36
+ message: string;
37
+ }[];
38
+ };
39
+ };
40
+ };
41
+ 401: {
42
+ headers: {
43
+ [name: string]: unknown;
44
+ };
45
+ content: {
46
+ "application/json": {
47
+ code: string;
48
+ message: string;
49
+ issues?: {
50
+ location: "body" | "query" | "path" | "headers" | "tool";
51
+ path: (string | number)[];
52
+ rule: string;
53
+ message: string;
54
+ }[];
55
+ };
56
+ };
57
+ };
58
+ 403: {
59
+ headers: {
60
+ [name: string]: unknown;
61
+ };
62
+ content: {
63
+ "application/json": {
64
+ code: string;
65
+ message: string;
66
+ issues?: {
67
+ location: "body" | "query" | "path" | "headers" | "tool";
68
+ path: (string | number)[];
69
+ rule: string;
70
+ message: string;
71
+ }[];
72
+ };
73
+ };
74
+ };
75
+ 503: {
76
+ headers: {
77
+ [name: string]: unknown;
78
+ };
79
+ content: {
80
+ "application/json": {
81
+ code: string;
82
+ message: string;
83
+ issues?: {
84
+ location: "body" | "query" | "path" | "headers" | "tool";
85
+ path: (string | number)[];
86
+ rule: string;
87
+ message: string;
88
+ }[];
89
+ };
90
+ };
91
+ };
92
+ };
93
+ }, import("openapi-fetch").FetchOptions<{
94
+ parameters: {
95
+ query?: never;
96
+ header?: never;
97
+ path?: never;
98
+ cookie?: never;
99
+ };
100
+ requestBody?: never;
101
+ responses: {
102
+ 200: {
103
+ headers: {
104
+ [name: string]: unknown;
105
+ };
106
+ content: {
107
+ "application/json": {
108
+ user: {
109
+ id: string;
110
+ };
111
+ };
112
+ };
113
+ };
114
+ 400: {
115
+ headers: {
116
+ [name: string]: unknown;
117
+ };
118
+ content: {
119
+ "application/json": {
120
+ code: string;
121
+ message: string;
122
+ issues?: {
123
+ location: "body" | "query" | "path" | "headers" | "tool";
124
+ path: (string | number)[];
125
+ rule: string;
126
+ message: string;
127
+ }[];
128
+ };
129
+ };
130
+ };
131
+ 401: {
132
+ headers: {
133
+ [name: string]: unknown;
134
+ };
135
+ content: {
136
+ "application/json": {
137
+ code: string;
138
+ message: string;
139
+ issues?: {
140
+ location: "body" | "query" | "path" | "headers" | "tool";
141
+ path: (string | number)[];
142
+ rule: string;
143
+ message: string;
144
+ }[];
145
+ };
146
+ };
147
+ };
148
+ 403: {
149
+ headers: {
150
+ [name: string]: unknown;
151
+ };
152
+ content: {
153
+ "application/json": {
154
+ code: string;
155
+ message: string;
156
+ issues?: {
157
+ location: "body" | "query" | "path" | "headers" | "tool";
158
+ path: (string | number)[];
159
+ rule: string;
160
+ message: string;
161
+ }[];
162
+ };
163
+ };
164
+ };
165
+ 503: {
166
+ headers: {
167
+ [name: string]: unknown;
168
+ };
169
+ content: {
170
+ "application/json": {
171
+ code: string;
172
+ message: string;
173
+ issues?: {
174
+ location: "body" | "query" | "path" | "headers" | "tool";
175
+ path: (string | number)[];
176
+ rule: string;
177
+ message: string;
178
+ }[];
179
+ };
180
+ };
181
+ };
182
+ };
183
+ }> | undefined, `${string}/${string}`>>;
@@ -0,0 +1,17 @@
1
+ import { z } from "zod";
2
+ const identitySchema = z.object({ user: z.object({ id: z.string().min(1) }) });
3
+ export async function readIdentity(client) {
4
+ const result = await client.GET("/v1/identity");
5
+ // Only Fastify's recognizable missing-route response means an older API.
6
+ // Authorization failures and resource 404s retain their ordinary categories.
7
+ const payload = result.error;
8
+ const missingRoute = z.object({ message: z.literal("Route GET:/v1/identity not found"), error: z.literal("Not Found"), statusCode: z.literal(404) }).safeParse(payload).success;
9
+ const missingCode = typeof payload === "object" && payload !== null && "code" in payload && payload.code === "FST_ERR_NOT_FOUND";
10
+ if (result.response.status === 404 && (missingRoute || missingCode)) {
11
+ return { response: result.response, error: { code: "IDENTITY_NOT_SUPPORTED", message: "This server version does not support current identity; upgrade the server or provide a User ID" } };
12
+ }
13
+ if (result.response.ok && !identitySchema.safeParse(result.data).success)
14
+ throw new Error("Invalid current identity response");
15
+ return result;
16
+ }
17
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/runtime/identity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAA+B,CAAC;AAE7G,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAA8C;IAC/E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChD,yEAAyE;IACzE,6EAA6E;IAC7E,MAAM,OAAO,GAAY,MAAM,CAAC,KAAK,CAAC;IACtC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,kCAAkC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;IAChL,MAAM,WAAW,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,mBAAmB,CAAC;IACjI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,gGAAgG,EAAE,EAAE,CAAC;IAC7L,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC/H,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliDependencies } from "../cli.js";
2
+ /** Local failures never enter transport retry or claim that a write failed. */
3
+ export declare function writeResult(dependencies: CliDependencies, project: () => unknown): number;
@@ -0,0 +1,13 @@
1
+ import { writeSkillError } from "./errors.js";
2
+ /** Local failures never enter transport retry or claim that a write failed. */
3
+ export function writeResult(dependencies, project) {
4
+ try {
5
+ dependencies.stdout(`${JSON.stringify(project())}\n`);
6
+ return 0;
7
+ }
8
+ catch {
9
+ writeSkillError(dependencies, { code: "LOCAL_OUTPUT_FAILED", message: "The result could not be written locally; the server operation may have completed. Read the resource before retrying", reason: "Temporary Failure", retryable: false });
10
+ return 4;
11
+ }
12
+ }
13
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/runtime/output.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,YAA6B,EAAE,OAAsB;IAC/E,IAAI,CAAC;QACH,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,eAAe,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,qHAAqH,EAAE,MAAM,EAAE,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9O,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { paths } from "@spec-flow/api-client";
2
+ import type { CliDependencies } from "../cli.js";
3
+ import type { ExecuteOptions } from "./execute.js";
4
+ export declare function selectSession(dependencies: CliDependencies, options: ExecuteOptions, serverFlag?: unknown, apiKeyIdFlag?: unknown): Promise<{
5
+ exitCode: number;
6
+ client?: never;
7
+ identityClient?: never;
8
+ credentialKind?: never;
9
+ } | {
10
+ client: import("openapi-fetch").Client<paths, `${string}/${string}`>;
11
+ identityClient: import("openapi-fetch").Client<paths, `${string}/${string}`>;
12
+ credentialKind: "api-key" | "workspace-read-token" | "session";
13
+ exitCode?: never;
14
+ }>;
15
+ export declare function rejectWorkspaceReadTokenOperation(dependencies: CliDependencies): number;
16
+ export declare function hasWorkspaceReadToken(environment: Readonly<Record<string, string | undefined>>): boolean;