@eyeauras/cli-factory 0.1.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 (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -0
  3. package/dist/src/app-arguments.d.ts +59 -0
  4. package/dist/src/app-arguments.d.ts.map +1 -0
  5. package/dist/src/app-arguments.js +102 -0
  6. package/dist/src/app-arguments.js.map +1 -0
  7. package/dist/src/auth.d.ts +14 -0
  8. package/dist/src/auth.d.ts.map +1 -0
  9. package/dist/src/auth.js +184 -0
  10. package/dist/src/auth.js.map +1 -0
  11. package/dist/src/bounded-lines.d.ts +4 -0
  12. package/dist/src/bounded-lines.d.ts.map +1 -0
  13. package/dist/src/bounded-lines.js +68 -0
  14. package/dist/src/bounded-lines.js.map +1 -0
  15. package/dist/src/cli.d.ts +3 -0
  16. package/dist/src/cli.d.ts.map +1 -0
  17. package/dist/src/cli.js +364 -0
  18. package/dist/src/cli.js.map +1 -0
  19. package/dist/src/command-gate.d.ts +9 -0
  20. package/dist/src/command-gate.d.ts.map +1 -0
  21. package/dist/src/command-gate.js +64 -0
  22. package/dist/src/command-gate.js.map +1 -0
  23. package/dist/src/command-input.d.ts +14 -0
  24. package/dist/src/command-input.d.ts.map +1 -0
  25. package/dist/src/command-input.js +2 -0
  26. package/dist/src/command-input.js.map +1 -0
  27. package/dist/src/command.d.ts +5 -0
  28. package/dist/src/command.d.ts.map +1 -0
  29. package/dist/src/command.js +14 -0
  30. package/dist/src/command.js.map +1 -0
  31. package/dist/src/index.d.ts +21 -0
  32. package/dist/src/index.d.ts.map +1 -0
  33. package/dist/src/index.js +16 -0
  34. package/dist/src/index.js.map +1 -0
  35. package/dist/src/input-limits.d.ts +9 -0
  36. package/dist/src/input-limits.d.ts.map +1 -0
  37. package/dist/src/input-limits.js +21 -0
  38. package/dist/src/input-limits.js.map +1 -0
  39. package/dist/src/json-rpc.d.ts +8 -0
  40. package/dist/src/json-rpc.d.ts.map +1 -0
  41. package/dist/src/json-rpc.js +99 -0
  42. package/dist/src/json-rpc.js.map +1 -0
  43. package/dist/src/option-parsers.d.ts +10 -0
  44. package/dist/src/option-parsers.d.ts.map +1 -0
  45. package/dist/src/option-parsers.js +26 -0
  46. package/dist/src/option-parsers.js.map +1 -0
  47. package/dist/src/output.d.ts +4 -0
  48. package/dist/src/output.d.ts.map +1 -0
  49. package/dist/src/output.js +54 -0
  50. package/dist/src/output.js.map +1 -0
  51. package/dist/src/permissions.d.ts +11 -0
  52. package/dist/src/permissions.d.ts.map +1 -0
  53. package/dist/src/permissions.js +95 -0
  54. package/dist/src/permissions.js.map +1 -0
  55. package/dist/src/private-storage.d.ts +5 -0
  56. package/dist/src/private-storage.d.ts.map +1 -0
  57. package/dist/src/private-storage.js +68 -0
  58. package/dist/src/private-storage.js.map +1 -0
  59. package/dist/src/profile-commands.d.ts +29 -0
  60. package/dist/src/profile-commands.d.ts.map +1 -0
  61. package/dist/src/profile-commands.js +265 -0
  62. package/dist/src/profile-commands.js.map +1 -0
  63. package/dist/src/profile-file.d.ts +26 -0
  64. package/dist/src/profile-file.d.ts.map +1 -0
  65. package/dist/src/profile-file.js +325 -0
  66. package/dist/src/profile-file.js.map +1 -0
  67. package/dist/src/profile-store.d.ts +32 -0
  68. package/dist/src/profile-store.d.ts.map +1 -0
  69. package/dist/src/profile-store.js +223 -0
  70. package/dist/src/profile-store.js.map +1 -0
  71. package/dist/src/proof.d.ts +18 -0
  72. package/dist/src/proof.d.ts.map +1 -0
  73. package/dist/src/proof.js +98 -0
  74. package/dist/src/proof.js.map +1 -0
  75. package/dist/src/resources.d.ts +4 -0
  76. package/dist/src/resources.d.ts.map +1 -0
  77. package/dist/src/resources.js +17 -0
  78. package/dist/src/resources.js.map +1 -0
  79. package/dist/src/response-body.d.ts +12 -0
  80. package/dist/src/response-body.d.ts.map +1 -0
  81. package/dist/src/response-body.js +70 -0
  82. package/dist/src/response-body.js.map +1 -0
  83. package/dist/src/secret-store.d.ts +21 -0
  84. package/dist/src/secret-store.d.ts.map +1 -0
  85. package/dist/src/secret-store.js +73 -0
  86. package/dist/src/secret-store.js.map +1 -0
  87. package/dist/src/target-commands.d.ts +19 -0
  88. package/dist/src/target-commands.d.ts.map +1 -0
  89. package/dist/src/target-commands.js +17 -0
  90. package/dist/src/target-commands.js.map +1 -0
  91. package/dist/src/testing-contracts.d.ts +31 -0
  92. package/dist/src/testing-contracts.d.ts.map +1 -0
  93. package/dist/src/testing-contracts.js +72 -0
  94. package/dist/src/testing-contracts.js.map +1 -0
  95. package/dist/src/testing.d.ts +51 -0
  96. package/dist/src/testing.d.ts.map +1 -0
  97. package/dist/src/testing.js +126 -0
  98. package/dist/src/testing.js.map +1 -0
  99. package/dist/src/types.d.ts +174 -0
  100. package/dist/src/types.d.ts.map +1 -0
  101. package/dist/src/types.js +2 -0
  102. package/dist/src/types.js.map +1 -0
  103. package/package.json +51 -0
@@ -0,0 +1,19 @@
1
+ import type { InferredCommandHandler } from "./command-input.js";
2
+ import type { CommandContext, CommandDefinition, OptionDefinition } from "./types.js";
3
+ type CommandInputFor<Syntax extends string> = Parameters<InferredCommandHandler<Syntax>>[0];
4
+ export type TargetCommandHandler<Target, Syntax extends string> = (target: Target, input: CommandInputFor<Syntax>, context: CommandContext) => unknown;
5
+ export type TargetCommand<Target> = <const Syntax extends string>(syntax: Syntax, description: string, permission: string, run: TargetCommandHandler<Target, Syntax>, options?: readonly OptionDefinition[]) => CommandDefinition;
6
+ export type GatedTargetCommand<Target> = <const Syntax extends string>(syntax: Syntax, description: string, run: TargetCommandHandler<Target, Syntax>, options?: readonly OptionDefinition[]) => CommandDefinition;
7
+ export interface TargetCommands<Target> {
8
+ command: TargetCommand<Target>;
9
+ read: GatedTargetCommand<Target>;
10
+ update: GatedTargetCommand<Target>;
11
+ gated(permission: string): GatedTargetCommand<Target>;
12
+ }
13
+ /**
14
+ * Bind service leaves to one invocation-scoped target such as an authenticated HTTP client.
15
+ * Resolution still happens after Core selects the profile and admits the permission gate.
16
+ */
17
+ export declare function targetCommands<Target>(resolve: (context: CommandContext) => Target | Promise<Target>): TargetCommands<Target>;
18
+ export {};
19
+ //# sourceMappingURL=target-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-commands.d.ts","sourceRoot":"","sources":["../../src/target-commands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,KAAK,eAAe,CAAC,MAAM,SAAS,MAAM,IAAI,UAAU,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5F,MAAM,MAAM,oBAAoB,CAAC,MAAM,EAAE,MAAM,SAAS,MAAM,IAAI,CAChE,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,EAC9B,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC;AAEb,MAAM,MAAM,aAAa,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,SAAS,MAAM,EAC9D,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,EACzC,OAAO,CAAC,EAAE,SAAS,gBAAgB,EAAE,KAClC,iBAAiB,CAAC;AAEvB,MAAM,MAAM,kBAAkB,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,SAAS,MAAM,EACnE,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,EACzC,OAAO,CAAC,EAAE,SAAS,gBAAgB,EAAE,KAClC,iBAAiB,CAAC;AAEvB,MAAM,WAAW,cAAc,CAAC,MAAM;IACpC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACnC,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;CACvD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EACnC,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAC7D,cAAc,CAAC,MAAM,CAAC,CAwBxB"}
@@ -0,0 +1,17 @@
1
+ import { command } from "./command.js";
2
+ import { Permission } from "./permissions.js";
3
+ /**
4
+ * Bind service leaves to one invocation-scoped target such as an authenticated HTTP client.
5
+ * Resolution still happens after Core selects the profile and admits the permission gate.
6
+ */
7
+ export function targetCommands(resolve) {
8
+ const targetCommand = (syntax, description, permission, run, options = []) => command(syntax, description, async (input, context) => run(await resolve(context), input, context), { permission, options });
9
+ const gated = (permission) => (syntax, description, run, options) => targetCommand(syntax, description, permission, run, options);
10
+ return {
11
+ command: targetCommand,
12
+ read: gated(Permission.ReadOnly),
13
+ update: gated(Permission.Update),
14
+ gated,
15
+ };
16
+ }
17
+ //# sourceMappingURL=target-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-commands.js","sourceRoot":"","sources":["../../src/target-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAqC9C;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,OAA8D;IAE9D,MAAM,aAAa,GAA0B,CAC3C,MAAM,EACN,WAAW,EACX,UAAU,EACV,GAAG,EACH,OAAO,GAAG,EAAE,EACZ,EAAE,CACF,OAAO,CACL,MAAM,EACN,WAAW,EACX,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EACrE,EAAE,UAAU,EAAE,OAAO,EAAE,CACxB,CAAC;IACJ,MAAM,KAAK,GAAG,CAAC,UAAkB,EAA8B,EAAE,CAC/D,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CACpC,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAEjE,OAAO;QACL,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;QAChC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QAChC,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { TestContext } from "node:test";
2
+ import type { CliApplication } from "./types.js";
3
+ import type { CliFixture } from "./testing.js";
4
+ export interface HttpRequestExpectation {
5
+ method: string;
6
+ /** Origin and pathname, without query; authored independently of production routes. */
7
+ url: string;
8
+ query?: Readonly<Record<string, string | readonly string[]>>;
9
+ headers?: Readonly<Record<string, string | null>>;
10
+ body?: {
11
+ json: unknown;
12
+ } | {
13
+ text: string;
14
+ };
15
+ }
16
+ export declare function assertHttpRequest(request: Request, expected: HttpRequestExpectation): Promise<void>;
17
+ /** Register on a catch-all MSW handler so unexpected routes are counted too. */
18
+ export declare function trackRequests(t: Pick<TestContext, "after">, expectedCount: number, respond: (request: Request, index: number) => Response | Promise<Response>): {
19
+ readonly count: number;
20
+ verify: () => void;
21
+ handle(request: Request): Promise<Response>;
22
+ };
23
+ export declare function assertPermissionDenied(app: CliApplication, argv: readonly string[], permission: string, requests: {
24
+ readonly count: number;
25
+ }): Promise<void>;
26
+ /** For repeatable mocked commands making exactly one HTTP request in each human/JSON invocation. */
27
+ export declare function assertCliOutput(fixture: CliFixture, app: CliApplication, argv: readonly string[], expected: unknown, human: RegExp, requests: {
28
+ readonly count: number;
29
+ }): Promise<void>;
30
+ export declare function assertSafeCliFailure(fixture: CliFixture, app: CliApplication, argv: readonly string[], message: RegExp, forbidden: RegExp): Promise<void>;
31
+ //# sourceMappingURL=testing-contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing-contracts.d.ts","sourceRoot":"","sources":["../../src/testing-contracts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,uFAAuF;IACvF,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYzG;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAC3B,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,EAC7B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;;;oBAelD,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;EAWpD;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrG,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,oGAAoG;AACpG,wBAAsB,eAAe,CACnC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EACnG,QAAQ,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnC,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GACpG,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -0,0 +1,72 @@
1
+ import assert from "node:assert/strict";
2
+ export async function assertHttpRequest(request, expected) {
3
+ const url = new URL(request.url);
4
+ assert.equal(request.method, expected.method, "HTTP method");
5
+ assert.equal(url.origin + url.pathname, expected.url, "HTTP origin/path");
6
+ const actualQuery = Object.fromEntries([...new Set(url.searchParams.keys())].map(key => [key, url.searchParams.getAll(key)]));
7
+ const expectedQuery = Object.fromEntries(Object.entries(expected.query ?? {}).map(([key, value]) => [key, typeof value === "string" ? [value] : [...value]]));
8
+ assert.deepEqual(actualQuery, expectedQuery, "HTTP query (including repeated values)");
9
+ for (const [name, value] of Object.entries(expected.headers ?? {}))
10
+ assert.equal(request.headers.get(name), value, "HTTP header: " + name);
11
+ if (expected.body && "json" in expected.body)
12
+ assert.deepEqual(await request.json(), expected.body.json, "HTTP JSON body");
13
+ else
14
+ assert.equal(await request.text(), expected.body?.text ?? "", "HTTP text body");
15
+ }
16
+ /** Register on a catch-all MSW handler so unexpected routes are counted too. */
17
+ export function trackRequests(t, expectedCount, respond) {
18
+ assert.ok(Number.isSafeInteger(expectedCount) && expectedCount >= 0, "Expected request count must be nonnegative.");
19
+ let count = 0;
20
+ const failures = [];
21
+ const verify = () => {
22
+ if (failures.length)
23
+ throw failures[0];
24
+ assert.equal(count, expectedCount, "HTTP request count (no retries or hidden requests)");
25
+ };
26
+ // MSW turns resolver exceptions into HTTP errors. Re-raise the original assertion outside it,
27
+ // even when the CLI assertion or the test itself fails first.
28
+ t.after(verify);
29
+ return {
30
+ get count() { return count; },
31
+ verify,
32
+ async handle(request) {
33
+ const index = count++;
34
+ try {
35
+ assert.ok(count <= expectedCount, "Unexpected extra HTTP request.");
36
+ return await respond(request, index);
37
+ }
38
+ catch (error) {
39
+ failures.push(error);
40
+ return new Response(null, { status: 500 });
41
+ }
42
+ },
43
+ };
44
+ }
45
+ export async function assertPermissionDenied(app, argv, permission, requests) {
46
+ assert.equal(requests.count, 0, "Permission check must start before service I/O.");
47
+ await assert.rejects(app.execute(argv), error => error instanceof Error &&
48
+ error.message.includes("Permission '" + permission + "' is disabled"));
49
+ assert.equal(requests.count, 0, "Permission denial must precede service I/O.");
50
+ }
51
+ /** For repeatable mocked commands making exactly one HTTP request in each human/JSON invocation. */
52
+ export async function assertCliOutput(fixture, app, argv, expected, human, requests) {
53
+ const before = requests.count;
54
+ const result = await fixture.run(app, argv);
55
+ assert.equal(requests.count, before + 1, "Human invocation must make exactly one HTTP request.");
56
+ assert.equal(result.exitCode, 0, result.stderr);
57
+ assert.match(result.stdout, human);
58
+ assert.equal(result.stderr, "");
59
+ const json = await fixture.run(app, ["--json", ...argv]);
60
+ assert.equal(requests.count, before + 2, "JSON invocation must make exactly one HTTP request.");
61
+ assert.equal(json.exitCode, 0, json.stderr);
62
+ assert.deepEqual(JSON.parse(json.stdout), expected);
63
+ assert.equal(json.stderr, "");
64
+ }
65
+ export async function assertSafeCliFailure(fixture, app, argv, message, forbidden) {
66
+ const result = await fixture.run(app, argv);
67
+ assert.equal(result.exitCode, 1);
68
+ assert.equal(result.stdout, "");
69
+ assert.match(result.stderr, message);
70
+ assert.doesNotMatch(result.stderr, forbidden);
71
+ }
72
+ //# sourceMappingURL=testing-contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing-contracts.js","sourceRoot":"","sources":["../../src/testing-contracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { Readable, Writable } from "node:stream";
2
+ import type { TestContext } from "node:test";
3
+ import { AppArguments } from "./app-arguments.js";
4
+ import { ProfileStore } from "./profile-store.js";
5
+ import { MemorySecretStore } from "./secret-store.js";
6
+ import type { CliApplication, CliInvocation, CliRuntime, ProfileValues } from "./types.js";
7
+ export interface FixtureProfile {
8
+ name: string;
9
+ values?: ProfileValues;
10
+ permissions?: readonly string[];
11
+ /** Explicit synthetic credentials; no token protocol is assumed. */
12
+ secrets?: Readonly<Record<string, string>>;
13
+ }
14
+ export interface CliFixtureOptions {
15
+ applicationId: string;
16
+ /** A non-default name requires explicit profiles so its identity is persisted. */
17
+ defaultProfile?: string;
18
+ /** Omission leaves the virtual default unconfigured. No authentication runs. */
19
+ profiles?: readonly FixtureProfile[];
20
+ input?: string;
21
+ }
22
+ /** Offline fixture mechanics only. The caller owns the definition, auth and network mocks. */
23
+ export declare function createCliFixture(t: Pick<TestContext, "after">, options: CliFixtureOptions): Promise<{
24
+ root: string;
25
+ runtime: CliRuntime & Pick<{
26
+ input: Readable;
27
+ output: Writable;
28
+ error: Writable;
29
+ stdout: () => string;
30
+ stderr: () => string;
31
+ resetOutput(): void;
32
+ }, "error" | "input" | "output">;
33
+ appArguments: AppArguments;
34
+ profileStore: ProfileStore;
35
+ secretStore: MemorySecretStore;
36
+ dispose: () => Promise<void>;
37
+ stdout: () => string;
38
+ stderr: () => string;
39
+ resetOutput: () => void;
40
+ createApplication(factory: (runtime: CliRuntime) => CliApplication): CliApplication;
41
+ run: (app: CliApplication, argv: readonly string[], invocation?: CliInvocation) => Promise<{
42
+ exitCode: number;
43
+ stdout: string;
44
+ stderr: string;
45
+ }>;
46
+ json(app: CliApplication, argv: readonly string[], invocation?: CliInvocation): Promise<unknown>;
47
+ rpc(app: CliApplication, commands: readonly (readonly string[])[], invocation?: CliInvocation): Promise<unknown[]>;
48
+ }>;
49
+ export type CliFixture = Awaited<ReturnType<typeof createCliFixture>>;
50
+ export { assertHttpRequest, trackRequests, assertPermissionDenied, assertCliOutput, assertSafeCliFailure, type HttpRequestExpectation } from "./testing-contracts.js";
51
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/testing.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAkB,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3F,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,oEAAoE;IACpE,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAcD,8FAA8F;AAC9F,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,iBAAiB;;;;;;;;;;;;;mBAU1E,OAAO,CAAC,IAAI,CAAC;;;;+BA0DJ,CAAC,OAAO,EAAE,UAAU,KAAK,cAAc,GAAG,cAAc;eAR7D,cAAc,QAAQ,SAAS,MAAM,EAAE,eAAc,aAAa;;;;;cAexE,cAAc,QAAQ,SAAS,MAAM,EAAE,eAAe,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;aAKvF,cAAc,YAAY,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,eAAe,aAAa,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;GAU3H;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,sBAAsB,EAAE,eAAe,EAAE,oBAAoB,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,126 @@
1
+ import assert from "node:assert/strict";
2
+ import { lstat, mkdtemp, realpath, rm } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ import { Readable, Writable } from "node:stream";
6
+ import { AppArguments } from "./app-arguments.js";
7
+ import { ProfileStore } from "./profile-store.js";
8
+ import { MemorySecretStore, ProfileSecrets } from "./secret-store.js";
9
+ function capture(input = "") {
10
+ let stdout = "", stderr = "";
11
+ return {
12
+ input: Readable.from([input]),
13
+ output: new Writable({ write(chunk, _encoding, done) { stdout += chunk.toString(); done(); } }),
14
+ error: new Writable({ write(chunk, _encoding, done) { stderr += chunk.toString(); done(); } }),
15
+ stdout: () => stdout,
16
+ stderr: () => stderr,
17
+ resetOutput() { stdout = ""; stderr = ""; },
18
+ };
19
+ }
20
+ /** Offline fixture mechanics only. The caller owns the definition, auth and network mocks. */
21
+ export async function createCliFixture(t, options) {
22
+ const defaultProfile = options.defaultProfile ?? "default";
23
+ if (defaultProfile !== "default" && !options.profiles?.length) {
24
+ throw new Error("A non-default fixture profile requires explicit profile preparation.");
25
+ }
26
+ const parent = await realpath(tmpdir());
27
+ const root = await mkdtemp(join(parent, "cli-factory-fixture-"));
28
+ const applications = new Set();
29
+ let identity;
30
+ let disposal;
31
+ const dispose = () => disposal ??= (async () => {
32
+ const failures = [];
33
+ for (const app of [...applications].reverse()) {
34
+ try {
35
+ await app.dispose();
36
+ }
37
+ catch (error) {
38
+ failures.push(error);
39
+ }
40
+ }
41
+ // A failed shutdown may leave resources using the directory. Retain it for inspection.
42
+ if (failures.length)
43
+ throw new AggregateError(failures, "Fixture application disposal failed; temporary data retained.");
44
+ let current;
45
+ try {
46
+ current = await lstat(root);
47
+ }
48
+ catch (error) {
49
+ if (error.code === "ENOENT")
50
+ return;
51
+ throw error;
52
+ }
53
+ assert.ok(identity && current.isDirectory() && !current.isSymbolicLink(), "Fixture root is no longer an owned directory.");
54
+ assert.equal(current.dev, identity.dev, "Fixture root device changed.");
55
+ assert.equal(current.ino, identity.ino, "Fixture root identity changed.");
56
+ assert.equal(await realpath(root), root, "Fixture root target changed.");
57
+ assert.equal(dirname(root), parent, "Fixture root escaped its temporary parent.");
58
+ await rm(root, { recursive: true, force: true });
59
+ })();
60
+ // Register before profile preparation or any caller-controlled application factory can fail.
61
+ t.after(dispose);
62
+ identity = await lstat(root);
63
+ const appArguments = new AppArguments({
64
+ AppName: options.applicationId, Profile: defaultProfile,
65
+ Environment: {
66
+ AppDomainDirectory: join(root, "executable"),
67
+ ApplicationExecutablePath: join(root, "executable", "fixture.js"),
68
+ EnvironmentAppData: join(root, "roaming"),
69
+ EnvironmentLocalAppData: join(root, "local"),
70
+ ProcessId: 1,
71
+ },
72
+ });
73
+ // A view of the real backing document. Do not inject this into the application by default:
74
+ // Core must still construct its store with the integration's own defaults and validation.
75
+ const profileStore = new ProfileStore({
76
+ applicationId: options.applicationId, appArguments, defaultName: defaultProfile,
77
+ });
78
+ const secretStore = new MemorySecretStore();
79
+ for (const profile of options.profiles ?? []) {
80
+ if (profile.name === defaultProfile)
81
+ await profileStore.set(profile.name, profile.values ?? {});
82
+ else
83
+ await profileStore.create(profile.name, profile.values ?? {});
84
+ if (profile.permissions !== undefined)
85
+ await profileStore.setPermissions(profile.name, profile.permissions);
86
+ const scoped = new ProfileSecrets(secretStore, options.applicationId, profile.name);
87
+ for (const [name, value] of Object.entries(profile.secrets ?? {}))
88
+ await scoped.set(name, value);
89
+ }
90
+ const output = capture(options.input);
91
+ const runtime = {
92
+ appArguments, secretStore, input: output.input, output: output.output, error: output.error,
93
+ };
94
+ const run = async (app, argv, invocation = {}) => {
95
+ const io = capture();
96
+ const exitCode = await app.run(argv, { ...io, cwd: root, environment: {}, ...invocation });
97
+ return { exitCode, stdout: io.stdout(), stderr: io.stderr() };
98
+ };
99
+ return {
100
+ root, runtime, appArguments, profileStore, secretStore, dispose,
101
+ stdout: output.stdout, stderr: output.stderr, resetOutput: output.resetOutput,
102
+ createApplication(factory) {
103
+ if (disposal)
104
+ throw new Error("Fixture is disposed.");
105
+ const app = factory(runtime);
106
+ applications.add(app);
107
+ return app;
108
+ },
109
+ run,
110
+ async json(app, argv, invocation) {
111
+ const result = await run(app, ["--json", ...argv], invocation);
112
+ assert.equal(result.exitCode, 0, result.stderr);
113
+ return JSON.parse(result.stdout);
114
+ },
115
+ async rpc(app, commands, invocation) {
116
+ const input = commands.map((argv, id) => JSON.stringify({ jsonrpc: "2.0", id, method: "cli.execute", params: { argv } })).join("\n") + "\n";
117
+ const result = await run(app, ["--json-rpc"], { ...invocation, input: Readable.from([input]) });
118
+ assert.equal(result.exitCode, 0, result.stderr);
119
+ const replies = result.stdout.trim().split("\n").filter(Boolean).map(line => JSON.parse(line));
120
+ assert.equal(replies.length, commands.length, "RPC response count does not match its request count.");
121
+ return replies;
122
+ },
123
+ };
124
+ }
125
+ export { assertHttpRequest, trackRequests, assertPermissionDenied, assertCliOutput, assertSafeCliFailure } from "./testing-contracts.js";
126
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/testing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,174 @@
1
+ import type { Readable, Writable } from "node:stream";
2
+ import type { IAppArguments } from "./app-arguments.js";
3
+ export type ProfileValues = Record<string, unknown>;
4
+ export interface Profile {
5
+ name: string;
6
+ values: ProfileValues;
7
+ }
8
+ export interface ProfileField {
9
+ name: string;
10
+ flags: string;
11
+ description: string;
12
+ /** A service command cannot run until this field has a non-empty value. */
13
+ required?: boolean;
14
+ }
15
+ export interface ProfileDefinition {
16
+ defaultName?: string;
17
+ defaults?: ProfileValues;
18
+ fields?: readonly ProfileField[];
19
+ validate?: (values: ProfileValues) => void | Promise<void>;
20
+ }
21
+ export interface SecretStore {
22
+ get(service: string, account: string): Promise<string | undefined>;
23
+ set(service: string, account: string, value: string): Promise<void>;
24
+ delete(service: string, account: string): Promise<void>;
25
+ }
26
+ export interface ScopedSecrets {
27
+ get(name: string): Promise<string | undefined>;
28
+ require(name: string): Promise<string>;
29
+ set(name: string, value: string): Promise<void>;
30
+ delete(name: string): Promise<void>;
31
+ }
32
+ export interface CommandContext {
33
+ appArguments: IAppArguments;
34
+ profile: Profile;
35
+ secrets: ScopedSecrets;
36
+ fetch: typeof globalThis.fetch;
37
+ signal: AbortSignal;
38
+ io: CliIo;
39
+ cwd: string;
40
+ environment: Readonly<NodeJS.ProcessEnv>;
41
+ }
42
+ export interface CommandInput {
43
+ args: Record<string, unknown>;
44
+ options: Record<string, unknown>;
45
+ }
46
+ export type CommandHandler = (input: CommandInput, context: CommandContext) => unknown | Promise<unknown>;
47
+ export interface OptionDefinition {
48
+ flags: string;
49
+ description: string;
50
+ /** Require a value (or declared default) before profile onboarding or handler execution. */
51
+ required?: boolean;
52
+ defaultValue?: unknown;
53
+ parse?: (value: string, previous: unknown) => unknown;
54
+ }
55
+ export interface CommandSettings {
56
+ options?: readonly OptionDefinition[];
57
+ permission?: string;
58
+ }
59
+ export interface CommandDefinition {
60
+ /** Command name followed by optional Commander-style arguments, for example `show <id>`. */
61
+ name: string;
62
+ description: string;
63
+ options?: readonly OptionDefinition[];
64
+ permission?: string;
65
+ children?: readonly CommandDefinition[];
66
+ run?: CommandHandler;
67
+ }
68
+ export interface PermissionCategory {
69
+ name: string;
70
+ description: string;
71
+ enabledByDefault?: boolean;
72
+ }
73
+ export interface PermissionGateDefinition {
74
+ categories?: readonly PermissionCategory[];
75
+ }
76
+ export interface TokenValidationContext {
77
+ appArguments: IAppArguments;
78
+ profile: Profile;
79
+ token: string;
80
+ fetch: typeof globalThis.fetch;
81
+ signal: AbortSignal;
82
+ }
83
+ export interface AuthStatus {
84
+ authenticated: boolean;
85
+ identity?: unknown;
86
+ }
87
+ export interface AuthContext extends CommandContext {
88
+ interactive: boolean;
89
+ stdinAvailable: boolean;
90
+ }
91
+ /** Applications own the protocol. Core owns the common command surface. */
92
+ export interface AuthDefinition {
93
+ required?: (profile: Profile) => boolean;
94
+ /** Optional local-only preflight. Must not launch/change browser resources or contact services.
95
+ * Omit when readiness cannot be determined passively; the service handler then enforces auth. */
96
+ isReady?: (context: AuthReadinessContext) => boolean | Promise<boolean>;
97
+ /** Environment inputs consumed by this auth implementation; hosts forward only declared keys. */
98
+ environmentKeys?: readonly string[];
99
+ loginOptions?: readonly OptionDefinition[];
100
+ login: (context: AuthContext, options: Record<string, unknown>) => Promise<AuthStatus>;
101
+ /** Explicit auth status command only; may actively validate with the service. */
102
+ status: (context: AuthContext) => Promise<AuthStatus>;
103
+ logout: (context: AuthContext) => Promise<void>;
104
+ }
105
+ export type AuthReadinessContext = Pick<CommandContext, "appArguments" | "profile" | "secrets" | "signal" | "environment">;
106
+ export interface CliIo {
107
+ input: Readable;
108
+ output: Writable;
109
+ error: Writable;
110
+ }
111
+ export interface CliInvocation {
112
+ input?: Readable;
113
+ output?: Writable;
114
+ error?: Writable;
115
+ signal?: AbortSignal;
116
+ cwd?: string;
117
+ environment?: Readonly<NodeJS.ProcessEnv>;
118
+ }
119
+ export interface CliRuntime {
120
+ appArguments?: IAppArguments;
121
+ input?: Readable;
122
+ output?: Writable;
123
+ error?: Writable;
124
+ fetch?: typeof globalThis.fetch;
125
+ profileStore?: ProfileStoreContract;
126
+ secretStore?: SecretStore;
127
+ }
128
+ export interface CliDefinition {
129
+ name: string;
130
+ description: string;
131
+ version?: string;
132
+ applicationId?: string;
133
+ profile?: ProfileDefinition;
134
+ auth?: AuthDefinition;
135
+ /** Extra per-invocation environment inputs; combined with auth.environmentKeys by the host. */
136
+ environmentKeys?: readonly string[];
137
+ /** Maximum executing logical commands; omitted means no extra limit. */
138
+ concurrency?: number;
139
+ /** Owned instances, closed in reverse registration order. Never register caller-owned I/O. */
140
+ resources?: readonly CliResource[];
141
+ permissions?: PermissionGateDefinition;
142
+ commands: readonly CommandDefinition[];
143
+ /** Module-owned local management commands, not service leaves. */
144
+ builtins?: readonly CommandDefinition[];
145
+ runtime?: CliRuntime;
146
+ }
147
+ /** Flat ownership only: no service lookup, scopes or dependency graph. */
148
+ export interface CliResource {
149
+ dispose(): void | Promise<void>;
150
+ /** Called before configure login, after non-auth updates, and before deletion; commands are excluded. */
151
+ invalidateProfile?(appArguments: IAppArguments): void | Promise<void>;
152
+ }
153
+ export interface ProfileStoreContract {
154
+ get(name?: string): Promise<Profile>;
155
+ list(): Promise<{
156
+ active: string;
157
+ profiles: Profile[];
158
+ }>;
159
+ create(name: string, values?: ProfileValues): Promise<Profile>;
160
+ set(name: string, values: ProfileValues): Promise<Profile>;
161
+ setDefault(name: string): Promise<Profile>;
162
+ delete(name: string): Promise<{
163
+ deleted: string;
164
+ default: string;
165
+ }>;
166
+ getPermissions(name?: string): Promise<readonly string[] | undefined>;
167
+ setPermissions(name: string, permissions: readonly string[]): Promise<readonly string[]>;
168
+ }
169
+ export interface CliApplication {
170
+ run(argv?: readonly string[], invocation?: CliInvocation): Promise<number>;
171
+ dispose(): Promise<void>;
172
+ execute(argv: readonly string[], signal?: AbortSignal): Promise<unknown>;
173
+ }
174
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@eyeauras/cli-factory",
3
+ "version": "0.1.0",
4
+ "description": "Reusable primitives for consistent, AI-friendly TypeScript CLIs.",
5
+ "type": "module",
6
+ "main": "./dist/src/index.js",
7
+ "types": "./dist/src/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/src/index.d.ts",
11
+ "import": "./dist/src/index.js"
12
+ },
13
+ "./testing": {
14
+ "types": "./dist/src/testing.d.ts",
15
+ "import": "./dist/src/testing.js"
16
+ },
17
+ "./proof": {
18
+ "types": "./dist/src/proof.d.ts",
19
+ "import": "./dist/src/proof.js"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist/src"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsc --project tsconfig.json",
27
+ "test:compiled": "node --test dist/tests/*.test.js",
28
+ "prepack": "npm run build"
29
+ },
30
+ "engines": {
31
+ "node": ">=22"
32
+ },
33
+ "dependencies": {
34
+ "@napi-rs/keyring": "^1.3.0",
35
+ "commander": "^14.0.2"
36
+ },
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/iXab3r/EyeAuras.CliFactory.git",
41
+ "directory": "packages/core"
42
+ },
43
+ "homepage": "https://github.com/iXab3r/EyeAuras.CliFactory/tree/main/packages/core",
44
+ "bugs": {
45
+ "url": "https://github.com/iXab3r/EyeAuras.CliFactory/issues"
46
+ },
47
+ "publishConfig": {
48
+ "access": "public",
49
+ "registry": "https://registry.npmjs.org/"
50
+ }
51
+ }