@agnox/mcp-server 1.0.1 → 1.0.2

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.
package/README.md CHANGED
@@ -37,6 +37,16 @@ AGNOX_API_KEY=<your key> npx -p @agnox/mcp-server agnox runs list
37
37
 
38
38
  The key is sent only in the `x-api-key` header. It is never printed, logged or included in an error message.
39
39
 
40
+ `AGNOX_API_URL` is the **API** host, not the dashboard: `https://agnox.dev` serves the web app and is answered with a clear error. A trailing `/api`, `/api/v1` or `/api/executions/ingest` is removed.
41
+
42
+ Settings are read from the environment first, then from a `.env` file in the current directory (only the three names above), then from `agnox login`:
43
+
44
+ ```bash
45
+ agnox login --api-key <your key> # checks the key, then saves ~/.agnox/config.json
46
+ ```
47
+
48
+ A `.env` `AGNOX_API_URL` is used only with the `AGNOX_API_KEY` from the same file, so a cloned repository's `.env` can never send your exported or saved key to another host. See the [CLI docs](https://docs.agnox.dev/docs/developer-tools/cli#configuration).
49
+
40
50
  ---
41
51
 
42
52
  ## MCP server
@@ -151,6 +161,7 @@ npx -p @agnox/mcp-server agnox --help
151
161
  | `agnox runs failures <taskId> [--json]` | One block per failed test: name, file, signature and the first error lines |
152
162
  | `agnox trigger --image <img> --command <cmd> --env <development\|staging\|production> [--project <id>] [--base-url <url>] [--folder <path>] [--wait] [--timeout <sec>]` | Starts a run. With `--wait`, polls every 5 s until it finishes (default timeout 1 800 s). |
153
163
  | `agnox export-specs --out <dir> [--project <id>] [--folder <path>] [--force]` | Writes a Playwright skeleton per top-level folder of manual test cases. Only flat lower-case `*.spec.ts` names are written (at most 500 files, 5 MB each); symbolic links are never written through. Existing files are kept unless you pass `--force`. |
164
+ | `agnox login --api-key <key> [--api-url <url>]` | Checks the key against the API, then saves it in `~/.agnox/config.json` (owner-only). Nothing is saved when the key is rejected. |
154
165
  | `agnox mcp` | Runs the MCP server on stdio |
155
166
  | `agnox --help`, `agnox --version` | |
156
167
 
package/dist/bin/agnox.js CHANGED
@@ -1,9 +1,17 @@
1
1
  #!/usr/bin/env node
2
+ import { readFile } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
2
4
  import { runCli } from '../cli.js';
5
+ import { resolveSettings } from '../settings.js';
6
+ const stderr = (line) => process.stderr.write(`${line}\n`);
7
+ // AGNOX_* from the environment, then ./.env, then `agnox login` (see settings.ts)
8
+ const settings = await resolveSettings({ env: process.env, cwd: process.cwd(), homeDir: homedir(), fs: { readFile } });
9
+ for (const notice of settings.notices)
10
+ stderr(notice);
3
11
  const code = await runCli(process.argv.slice(2), {
4
12
  stdout: (line) => process.stdout.write(`${line}\n`),
5
- stderr: (line) => process.stderr.write(`${line}\n`),
6
- env: process.env,
13
+ stderr,
14
+ env: settings.env,
7
15
  cwd: process.cwd(),
8
16
  streams: { input: process.stdin, output: process.stdout },
9
17
  });
@@ -1 +1 @@
1
- {"version":3,"file":"agnox.js","sourceRoot":"","sources":["../../src/bin/agnox.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IAC7C,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;IACnD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;IACnD,GAAG,EAAE,OAAO,CAAC,GAAG;IAChB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;IAClB,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;CAC5D,CAAC,CAAC;AACH,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC"}
1
+ {"version":3,"file":"agnox.js","sourceRoot":"","sources":["../../src/bin/agnox.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;AACnE,kFAAkF;AAClF,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;AACvH,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO;IAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AAEtD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IAC7C,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;IACnD,MAAM;IACN,GAAG,EAAE,QAAQ,CAAC,GAAG;IACjB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;IAClB,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;CAC5D,CAAC,CAAC;AACH,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC"}
@@ -1,4 +1,12 @@
1
1
  #!/usr/bin/env node
2
+ import { readFile } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
2
4
  import { startMcpServer } from '../commands/mcp.js';
3
- await startMcpServer(process.env, process.stdin, process.stdout, (line) => process.stderr.write(`${line}\n`));
5
+ import { resolveSettings } from '../settings.js';
6
+ // stdout carries protocol messages only; notices go to stderr.
7
+ const stderr = (line) => process.stderr.write(`${line}\n`);
8
+ const settings = await resolveSettings({ env: process.env, cwd: process.cwd(), homeDir: homedir(), fs: { readFile } });
9
+ for (const notice of settings.notices)
10
+ stderr(`[agnox mcp] ${notice}`);
11
+ await startMcpServer(settings.env, process.stdin, process.stdout, stderr);
4
12
  //# sourceMappingURL=mcp-server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/bin/mcp-server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/bin/mcp-server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,+DAA+D;AAC/D,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;AACnE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;AACvH,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO;IAAE,MAAM,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC;AAEvE,MAAM,cAAc,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC"}
package/dist/cli.d.ts CHANGED
@@ -5,6 +5,7 @@
5
5
  import type { Readable, Writable } from 'node:stream';
6
6
  import { AgnoxClient } from './client.js';
7
7
  import { type CliFs } from './commands/context.js';
8
+ import { type CredentialsFs } from './settings.js';
8
9
  export interface ICliIo {
9
10
  stdout(line: string): void;
10
11
  stderr(line: string): void;
@@ -12,7 +13,9 @@ export interface ICliIo {
12
13
  cwd: string;
13
14
  /** Injected in tests; otherwise built from the environment. */
14
15
  client?: AgnoxClient;
15
- fs?: CliFs;
16
+ fs?: CliFs & Partial<CredentialsFs>;
17
+ /** Home directory for `agnox login`; defaults to os.homedir(). */
18
+ homeDir?: string;
16
19
  sleep?: (ms: number) => Promise<void>;
17
20
  /** stdin/stdout for `agnox mcp`. */
18
21
  streams?: {
@@ -20,5 +23,5 @@ export interface ICliIo {
20
23
  output: Writable;
21
24
  };
22
25
  }
23
- export declare const HELP = "agnox 1.0.1 \u2014 Agnox from the terminal\n\nUsage:\n agnox runs list [--project <id>] [--status <s>] [--limit <n>] [--json]\n agnox runs failures <taskId> [--json]\n agnox trigger --image <img> --command <cmd> --env <development|staging|production>\n [--project <id>] [--base-url <url>] [--folder <path>] [--wait] [--timeout <sec>] [--json]\n agnox export-specs --out <dir> [--project <id>] [--folder <path>] [--force]\n agnox mcp Run the MCP server on stdio (for Claude Code, Cursor, Windsurf)\n agnox --help | --version\n\nEnvironment:\n AGNOX_API_KEY API key from Settings \u2192 My Profile (required)\n AGNOX_API_URL default https://api.agnox.dev\n AGNOX_PROJECT_ID default project for --project\n\nExit codes: 0 success \u00B7 1 error \u00B7 2 run finished but did not pass (trigger --wait)";
26
+ export declare const HELP = "agnox 1.0.2 \u2014 Agnox from the terminal\n\nUsage:\n agnox runs list [--project <id>] [--status <s>] [--limit <n>] [--json]\n agnox runs failures <taskId> [--json]\n agnox trigger --image <img> --command <cmd> --env <development|staging|production>\n [--project <id>] [--base-url <url>] [--folder <path>] [--wait] [--timeout <sec>] [--json]\n agnox export-specs --out <dir> [--project <id>] [--folder <path>] [--force]\n agnox login --api-key <key> [--api-url <url>]\n Check the key and save it in ~/.agnox/config.json\n agnox mcp Run the MCP server on stdio (for Claude Code, Cursor, Windsurf)\n agnox --help | --version\n\nEnvironment:\n AGNOX_API_KEY API key from Settings \u2192 My Profile (required)\n AGNOX_API_URL the Agnox API, default https://api.agnox.dev (not the dashboard URL)\n AGNOX_PROJECT_ID default project for --project\n\n Read from the environment first, then from a .env file in the current\n directory, then from agnox login. A .env AGNOX_API_URL is used only with the\n AGNOX_API_KEY from the same file.\n\nExit codes: 0 success \u00B7 1 error \u00B7 2 run finished but did not pass (trigger --wait)";
24
27
  export declare function runCli(argv: string[], io: ICliIo): Promise<number>;
package/dist/cli.js CHANGED
@@ -3,6 +3,8 @@
3
3
  * Exit codes: 0 success, 1 API or usage error, 2 a run finished but did not pass (trigger --wait).
4
4
  */
5
5
  import * as fsPromises from 'node:fs/promises';
6
+ import { homedir } from 'node:os';
7
+ import { parseArgs } from 'node:util';
6
8
  import { AgnoxApiError, AgnoxClient } from './client.js';
7
9
  import { ConfigError, loadConfig } from './config.js';
8
10
  import { VERSION } from './version.js';
@@ -12,22 +14,29 @@ import { runsFailures, runsList } from './commands/runs.js';
12
14
  import { trigger } from './commands/trigger.js';
13
15
  import { exportSpecs } from './commands/export-specs.js';
14
16
  import { startMcpServer } from './commands/mcp.js';
15
- export const HELP = `agnox ${VERSION} — Agnox from the terminal
16
-
17
- Usage:
18
- agnox runs list [--project <id>] [--status <s>] [--limit <n>] [--json]
19
- agnox runs failures <taskId> [--json]
20
- agnox trigger --image <img> --command <cmd> --env <development|staging|production>
21
- [--project <id>] [--base-url <url>] [--folder <path>] [--wait] [--timeout <sec>] [--json]
22
- agnox export-specs --out <dir> [--project <id>] [--folder <path>] [--force]
23
- agnox mcp Run the MCP server on stdio (for Claude Code, Cursor, Windsurf)
24
- agnox --help | --version
25
-
26
- Environment:
27
- AGNOX_API_KEY API key from Settings → My Profile (required)
28
- AGNOX_API_URL default https://api.agnox.dev
29
- AGNOX_PROJECT_ID default project for --project
30
-
17
+ import { CredentialsError, saveCredentials } from './settings.js';
18
+ export const HELP = `agnox ${VERSION} — Agnox from the terminal
19
+
20
+ Usage:
21
+ agnox runs list [--project <id>] [--status <s>] [--limit <n>] [--json]
22
+ agnox runs failures <taskId> [--json]
23
+ agnox trigger --image <img> --command <cmd> --env <development|staging|production>
24
+ [--project <id>] [--base-url <url>] [--folder <path>] [--wait] [--timeout <sec>] [--json]
25
+ agnox export-specs --out <dir> [--project <id>] [--folder <path>] [--force]
26
+ agnox login --api-key <key> [--api-url <url>]
27
+ Check the key and save it in ~/.agnox/config.json
28
+ agnox mcp Run the MCP server on stdio (for Claude Code, Cursor, Windsurf)
29
+ agnox --help | --version
30
+
31
+ Environment:
32
+ AGNOX_API_KEY API key from Settings → My Profile (required)
33
+ AGNOX_API_URL the Agnox API, default https://api.agnox.dev (not the dashboard URL)
34
+ AGNOX_PROJECT_ID default project for --project
35
+
36
+ Read from the environment first, then from a .env file in the current
37
+ directory, then from agnox login. A .env AGNOX_API_URL is used only with the
38
+ AGNOX_API_KEY from the same file.
39
+
31
40
  Exit codes: 0 success · 1 error · 2 run finished but did not pass (trigger --wait)`;
32
41
  const COMMANDS = {
33
42
  'runs list': runsList,
@@ -66,6 +75,8 @@ export async function runCli(argv, io) {
66
75
  await startMcpServer(io.env, io.streams.input, io.streams.output, io.stderr);
67
76
  return 0;
68
77
  }
78
+ if (argv[0] === 'login')
79
+ return login(argv.slice(1), io);
69
80
  const resolved = resolveCommand(argv);
70
81
  if (!resolved) {
71
82
  io.stderr(`Unknown command "${argv.join(' ')}". Run agnox --help.`);
@@ -99,4 +110,44 @@ export async function runCli(argv, io) {
99
110
  return 1;
100
111
  }
101
112
  }
113
+ /** agnox login: check the key against the API, then save it for later runs. */
114
+ async function login(args, io) {
115
+ try {
116
+ const { values } = parseArgs({
117
+ args,
118
+ options: { 'api-key': { type: 'string' }, 'api-url': { type: 'string' } },
119
+ strict: true,
120
+ });
121
+ const apiKey = values['api-key']?.trim();
122
+ if (!apiKey)
123
+ throw new UsageError('Usage: agnox login --api-key <key> [--api-url <url>]');
124
+ const config = loadConfig({ AGNOX_API_KEY: apiKey, AGNOX_API_URL: values['api-url'] });
125
+ const client = io.client ?? new AgnoxClient(config);
126
+ const projects = await client.listProjects();
127
+ const fs = io.fs ?? fsPromises;
128
+ if (!fs.chmod || !fs.mkdir || !fs.writeFile || !fs.lstat)
129
+ throw new UsageError('agnox login needs a writable file system');
130
+ const file = await saveCredentials(fs, io.homeDir ?? homedir(), { apiKey, apiUrl: config.apiUrl });
131
+ const host = new URL(config.apiUrl).host;
132
+ io.stdout(`Logged in to ${host} (${projects.total} project${projects.total === 1 ? '' : 's'}). Saved to ${file}`);
133
+ return 0;
134
+ }
135
+ catch (error) {
136
+ if (error instanceof ConfigError || error instanceof UsageError || error instanceof CredentialsError) {
137
+ io.stderr(error.message);
138
+ return 1;
139
+ }
140
+ if (error instanceof AgnoxApiError) {
141
+ io.stderr(`Error: ${sanitizeForTerminal(error.message)}. Nothing was saved.`);
142
+ return 1;
143
+ }
144
+ const code = error?.code;
145
+ if (typeof code === 'string' && code.startsWith('ERR_PARSE_ARGS')) {
146
+ io.stderr(`${error.message}. Run agnox --help.`);
147
+ return 1;
148
+ }
149
+ io.stderr(`Error: ${error instanceof Error ? error.message : String(error)}`);
150
+ return 1;
151
+ }
152
+ }
102
153
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * The API key is sent as x-api-key and is never part of an error message.
6
6
  */
7
- import type { IAgnoxConfig } from './config.js';
7
+ import { type IAgnoxConfig } from './config.js';
8
8
  export declare const REQUEST_TIMEOUT_MS = 30000;
9
9
  export interface IPage<T> {
10
10
  items: T[];
package/dist/client.js CHANGED
@@ -4,6 +4,7 @@
4
4
  *
5
5
  * The API key is sent as x-api-key and is never part of an error message.
6
6
  */
7
+ import { DEFAULT_API_URL } from './config.js';
7
8
  import { VERSION } from './version.js';
8
9
  export const REQUEST_TIMEOUT_MS = 30_000;
9
10
  // ── Errors ────────────────────────────────────────────────────────────────────
@@ -65,6 +66,11 @@ export class AgnoxClient {
65
66
  if (response.status >= 300 && response.status <= 399) {
66
67
  throw new AgnoxApiError(`Agnox at ${this.host} answered with a redirect; check AGNOX_API_URL`, response.status, 'REDIRECT_REFUSED');
67
68
  }
69
+ // A web server or SPA fallback (e.g. the dashboard at agnox.dev) answers every path with index.html.
70
+ if (/\btext\/html\b/i.test(response.headers.get('content-type') ?? '')) {
71
+ throw new AgnoxApiError(`${this.host} answered with a web page (HTML, HTTP ${response.status}), not the Agnox API. `
72
+ + `AGNOX_API_URL must point at the API host, such as ${DEFAULT_API_URL}, not the dashboard.`, response.status, 'NOT_AN_API');
73
+ }
68
74
  let payload;
69
75
  try {
70
76
  payload = (await response.json());
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -3,6 +3,8 @@
3
3
  * AGNOX_API_KEY required — an API key from Settings → My Profile
4
4
  * AGNOX_API_URL optional — default https://api.agnox.dev
5
5
  * AGNOX_PROJECT_ID optional — default project for commands and tools
6
+ *
7
+ * The bins fill these from a .env file and `agnox login` first (see settings.ts).
6
8
  */
7
9
  export declare const DEFAULT_API_URL = "https://api.agnox.dev";
8
10
  export interface IAgnoxConfig {
@@ -13,4 +15,6 @@ export interface IAgnoxConfig {
13
15
  export declare class ConfigError extends Error {
14
16
  constructor(message: string);
15
17
  }
18
+ /** origin + path without trailing slashes or a known API suffix. */
19
+ export declare function normalizeApiUrl(url: URL): string;
16
20
  export declare function loadConfig(env: Record<string, string | undefined>): IAgnoxConfig;
package/dist/config.js CHANGED
@@ -3,6 +3,8 @@
3
3
  * AGNOX_API_KEY required — an API key from Settings → My Profile
4
4
  * AGNOX_API_URL optional — default https://api.agnox.dev
5
5
  * AGNOX_PROJECT_ID optional — default project for commands and tools
6
+ *
7
+ * The bins fill these from a .env file and `agnox login` first (see settings.ts).
6
8
  */
7
9
  export const DEFAULT_API_URL = 'https://api.agnox.dev';
8
10
  /** Hosts where plain http is acceptable: the key never leaves the machine. WHATWG URL keeps the brackets on IPv6. */
@@ -13,10 +15,30 @@ export class ConfigError extends Error {
13
15
  this.name = 'ConfigError';
14
16
  }
15
17
  }
18
+ /**
19
+ * Paths people paste from elsewhere: the API root ("/api"), the v1 root
20
+ * ("/api/v1") or the Playwright reporter's ingest endpoint. The client adds
21
+ * "/api/v1" itself, so these are removed from the end of the path.
22
+ */
23
+ const API_PATH_SUFFIXES = [/\/api\/executions\/ingest$/i, /\/api\/v1$/i, /\/api$/i];
24
+ /** origin + path without trailing slashes or a known API suffix. */
25
+ export function normalizeApiUrl(url) {
26
+ let path = url.pathname.replace(/\/+$/, '');
27
+ for (let changed = true; changed;) {
28
+ changed = false;
29
+ for (const suffix of API_PATH_SUFFIXES) {
30
+ if (suffix.test(path)) {
31
+ path = path.replace(suffix, '').replace(/\/+$/, '');
32
+ changed = true;
33
+ }
34
+ }
35
+ }
36
+ return `${url.origin}${path}`;
37
+ }
16
38
  export function loadConfig(env) {
17
39
  const apiKey = env.AGNOX_API_KEY?.trim();
18
40
  if (!apiKey) {
19
- throw new ConfigError('AGNOX_API_KEY is not set. Create an API key in Agnox (Settings → My Profile → API keys) and export it as AGNOX_API_KEY.');
41
+ throw new ConfigError('AGNOX_API_KEY is not set. Create an API key in Agnox (Settings → My Profile → API keys), then run agnox login --api-key <key>, or set AGNOX_API_KEY in the environment or a .env file.');
20
42
  }
21
43
  const rawUrl = env.AGNOX_API_URL?.trim() || DEFAULT_API_URL;
22
44
  let url;
@@ -35,7 +57,7 @@ export function loadConfig(env) {
35
57
  if (url.protocol === 'http:' && !LOOPBACK_HOSTS.has(url.hostname)) {
36
58
  throw new ConfigError(`AGNOX_API_URL must use https for ${url.host}; plain http is allowed only for localhost, 127.0.0.1 and [::1]`);
37
59
  }
38
- const config = { apiUrl: rawUrl.replace(/\/+$/, ''), apiKey };
60
+ const config = { apiUrl: normalizeApiUrl(url), apiKey };
39
61
  const projectId = env.AGNOX_PROJECT_ID?.trim();
40
62
  if (projectId)
41
63
  config.projectId = projectId;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEvD,qHAAqH;AACrH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAQpE,MAAM,OAAO,WAAY,SAAQ,KAAK;IAClC,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC9B,CAAC;CACJ;AAED,MAAM,UAAU,UAAU,CAAC,GAAuC;IAC9D,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,WAAW,CAAC,yHAAyH,CAAC,CAAC;IACrJ,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,eAAe,CAAC;IAC5D,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACD,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,IAAI,WAAW,CAAC,qCAAqC,MAAM,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxD,MAAM,IAAI,WAAW,CAAC,4CAA4C,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,IAAI,WAAW,CAAC,0EAA0E,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,WAAW,CAAC,oCAAoC,GAAG,CAAC,IAAI,iEAAiE,CAAC,CAAC;IACzI,CAAC;IAED,MAAM,MAAM,GAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5E,MAAM,SAAS,GAAG,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAI,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5C,OAAO,MAAM,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEvD,qHAAqH;AACrH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAQpE,MAAM,OAAO,WAAY,SAAQ,KAAK;IAClC,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC9B,CAAC;CACJ;AAED;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,CAAC,6BAA6B,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;AAEpF,oEAAoE;AACpE,MAAM,UAAU,eAAe,CAAC,GAAQ;IACpC,IAAI,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,KAAK,IAAI,OAAO,GAAG,IAAI,EAAE,OAAO,GAAG,CAAC;QAChC,OAAO,GAAG,KAAK,CAAC;QAChB,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;YACrC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACpD,OAAO,GAAG,IAAI,CAAC;YACnB,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAuC;IAC9D,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,WAAW,CAAC,wLAAwL,CAAC,CAAC;IACpN,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,eAAe,CAAC;IAC5D,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACD,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,IAAI,WAAW,CAAC,qCAAqC,MAAM,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxD,MAAM,IAAI,WAAW,CAAC,4CAA4C,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,IAAI,WAAW,CAAC,0EAA0E,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,WAAW,CAAC,oCAAoC,GAAG,CAAC,IAAI,iEAAiE,CAAC,CAAC;IACzI,CAAC;IAED,MAAM,MAAM,GAAiB,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACtE,MAAM,SAAS,GAAG,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAI,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5C,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Where the bins find AGNOX_API_KEY, AGNOX_API_URL and AGNOX_PROJECT_ID, in order:
3
+ * 1. the real environment (always wins)
4
+ * 2. a .env file in the current directory (only the AGNOX_* names above)
5
+ * 3. credentials saved by `agnox login` in ~/.agnox/config.json
6
+ *
7
+ * A key is only ever sent to a URL from the same source, or to one set in the
8
+ * real environment. A .env file in a cloned repository must not be able to point
9
+ * an exported or saved key at another host, so its AGNOX_API_URL is used only
10
+ * together with the AGNOX_API_KEY from that same file.
11
+ */
12
+ import type * as fsPromises from 'node:fs/promises';
13
+ export declare const SETTING_NAMES: readonly ["AGNOX_API_KEY", "AGNOX_API_URL", "AGNOX_PROJECT_ID"];
14
+ type SettingName = (typeof SETTING_NAMES)[number];
15
+ export type Settings = Partial<Record<SettingName, string>>;
16
+ export interface IStoredCredentials {
17
+ apiKey: string;
18
+ apiUrl?: string;
19
+ }
20
+ export declare const CREDENTIALS_DIR = ".agnox";
21
+ export declare const CREDENTIALS_FILE = "config.json";
22
+ export declare const credentialsDir: (homeDir: string) => string;
23
+ export declare const credentialsPath: (homeDir: string) => string;
24
+ /**
25
+ * Read the AGNOX_* entries of a .env file. Handles CRLF line endings, `export `
26
+ * prefixes, single or double quotes and trailing ` # comments` on unquoted values.
27
+ * Every other name is ignored.
28
+ */
29
+ export declare function parseDotEnv(text: string): Settings;
30
+ export interface IMergeInput {
31
+ env: Record<string, string | undefined>;
32
+ dotEnv?: Settings;
33
+ stored?: IStoredCredentials;
34
+ }
35
+ export interface IResolvedSettings {
36
+ /** The environment to run with: the real one plus the resolved AGNOX_* values. */
37
+ env: Record<string, string | undefined>;
38
+ /** Where the key came from, for messages. */
39
+ keySource: 'environment' | '.env' | 'agnox login' | 'none';
40
+ /** Lines for stderr: settings that were ignored, or files that could not be read. */
41
+ notices: string[];
42
+ }
43
+ /** Combine the three sources; see the rules at the top of this file. */
44
+ export declare function mergeSettings({ env, dotEnv, stored }: IMergeInput): IResolvedSettings;
45
+ export interface SettingsFs {
46
+ readFile(path: string, encoding: 'utf8'): Promise<string>;
47
+ }
48
+ export declare function parseStoredCredentials(text: string): IStoredCredentials | undefined;
49
+ /** Read .env from cwd (no upward search) and the saved credentials, then merge. Never throws. */
50
+ export declare function resolveSettings(options: {
51
+ env: Record<string, string | undefined>;
52
+ cwd: string;
53
+ homeDir: string;
54
+ fs: SettingsFs;
55
+ }): Promise<IResolvedSettings>;
56
+ export type CredentialsFs = Pick<typeof fsPromises, 'mkdir' | 'writeFile' | 'lstat' | 'chmod'>;
57
+ /** Thrown when the credentials file cannot be written safely. */
58
+ export declare class CredentialsError extends Error {
59
+ constructor(message: string);
60
+ }
61
+ /**
62
+ * Write ~/.agnox/config.json, readable by the owner only (0600 in a 0700
63
+ * directory; Windows ignores the mode and relies on the profile's ACLs).
64
+ * Never writes through a symbolic link.
65
+ */
66
+ export declare function saveCredentials(fs: CredentialsFs, homeDir: string, credentials: IStoredCredentials): Promise<string>;
67
+ export {};
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Where the bins find AGNOX_API_KEY, AGNOX_API_URL and AGNOX_PROJECT_ID, in order:
3
+ * 1. the real environment (always wins)
4
+ * 2. a .env file in the current directory (only the AGNOX_* names above)
5
+ * 3. credentials saved by `agnox login` in ~/.agnox/config.json
6
+ *
7
+ * A key is only ever sent to a URL from the same source, or to one set in the
8
+ * real environment. A .env file in a cloned repository must not be able to point
9
+ * an exported or saved key at another host, so its AGNOX_API_URL is used only
10
+ * together with the AGNOX_API_KEY from that same file.
11
+ */
12
+ import { join } from 'node:path';
13
+ export const SETTING_NAMES = ['AGNOX_API_KEY', 'AGNOX_API_URL', 'AGNOX_PROJECT_ID'];
14
+ export const CREDENTIALS_DIR = '.agnox';
15
+ export const CREDENTIALS_FILE = 'config.json';
16
+ export const credentialsDir = (homeDir) => join(homeDir, CREDENTIALS_DIR);
17
+ export const credentialsPath = (homeDir) => join(homeDir, CREDENTIALS_DIR, CREDENTIALS_FILE);
18
+ const isSettingName = (name) => SETTING_NAMES.includes(name);
19
+ /**
20
+ * Read the AGNOX_* entries of a .env file. Handles CRLF line endings, `export `
21
+ * prefixes, single or double quotes and trailing ` # comments` on unquoted values.
22
+ * Every other name is ignored.
23
+ */
24
+ export function parseDotEnv(text) {
25
+ const settings = {};
26
+ for (const rawLine of text.replace(/^/, '').split('\n')) {
27
+ const line = rawLine.replace(/\r$/, '').trim();
28
+ if (!line || line.startsWith('#'))
29
+ continue;
30
+ const match = /^(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/.exec(line);
31
+ if (!match || !isSettingName(match[1]))
32
+ continue;
33
+ let value = match[2].trim();
34
+ const quote = value[0];
35
+ if ((quote === '"' || quote === "'") && value.length >= 2 && value.endsWith(quote)) {
36
+ value = value.slice(1, -1);
37
+ }
38
+ else {
39
+ value = value.replace(/\s+#.*$/, '').trim();
40
+ }
41
+ if (value)
42
+ settings[match[1]] = value;
43
+ }
44
+ return settings;
45
+ }
46
+ const clean = (value) => value?.trim() || undefined;
47
+ /** Combine the three sources; see the rules at the top of this file. */
48
+ export function mergeSettings({ env, dotEnv = {}, stored }) {
49
+ const notices = [];
50
+ const envKey = clean(env.AGNOX_API_KEY);
51
+ const envUrl = clean(env.AGNOX_API_URL);
52
+ const dotKey = clean(dotEnv.AGNOX_API_KEY);
53
+ const dotUrl = clean(dotEnv.AGNOX_API_URL);
54
+ const storedKey = clean(stored?.apiKey);
55
+ let apiKey;
56
+ let apiUrl = envUrl;
57
+ let keySource = 'none';
58
+ if (envKey) {
59
+ apiKey = envKey;
60
+ keySource = 'environment';
61
+ }
62
+ else if (dotKey) {
63
+ apiKey = dotKey;
64
+ keySource = '.env';
65
+ apiUrl ??= dotUrl;
66
+ }
67
+ else if (storedKey) {
68
+ apiKey = storedKey;
69
+ keySource = 'agnox login';
70
+ apiUrl ??= clean(stored?.apiUrl);
71
+ }
72
+ if (dotUrl && !envUrl && keySource !== '.env') {
73
+ notices.push('Ignoring AGNOX_API_URL from .env: it is used only with the AGNOX_API_KEY from the same file. Set AGNOX_API_URL in the environment, or put the key in .env too.');
74
+ }
75
+ const resolved = { ...env };
76
+ for (const name of SETTING_NAMES)
77
+ delete resolved[name];
78
+ if (apiKey)
79
+ resolved.AGNOX_API_KEY = apiKey;
80
+ if (apiUrl)
81
+ resolved.AGNOX_API_URL = apiUrl;
82
+ const projectId = clean(env.AGNOX_PROJECT_ID) ?? clean(dotEnv.AGNOX_PROJECT_ID);
83
+ if (projectId)
84
+ resolved.AGNOX_PROJECT_ID = projectId;
85
+ return { env: resolved, keySource, notices };
86
+ }
87
+ const isMissing = (error) => {
88
+ const code = error?.code;
89
+ return code === 'ENOENT' || code === 'ENOTDIR';
90
+ };
91
+ async function readOptional(fs, path, notices) {
92
+ try {
93
+ return await fs.readFile(path, 'utf8');
94
+ }
95
+ catch (error) {
96
+ if (!isMissing(error))
97
+ notices.push(`Could not read ${path}: ${error instanceof Error ? error.message : String(error)}`);
98
+ return undefined;
99
+ }
100
+ }
101
+ export function parseStoredCredentials(text) {
102
+ try {
103
+ const value = JSON.parse(text);
104
+ if (typeof value?.apiKey !== 'string' || !value.apiKey.trim())
105
+ return undefined;
106
+ return { apiKey: value.apiKey, ...(typeof value.apiUrl === 'string' ? { apiUrl: value.apiUrl } : {}) };
107
+ }
108
+ catch {
109
+ return undefined;
110
+ }
111
+ }
112
+ /** Read .env from cwd (no upward search) and the saved credentials, then merge. Never throws. */
113
+ export async function resolveSettings(options) {
114
+ const notices = [];
115
+ const dotEnvText = await readOptional(options.fs, join(options.cwd, '.env'), notices);
116
+ const storedPath = credentialsPath(options.homeDir);
117
+ const storedText = await readOptional(options.fs, storedPath, notices);
118
+ const stored = storedText === undefined ? undefined : parseStoredCredentials(storedText);
119
+ if (storedText !== undefined && !stored)
120
+ notices.push(`Ignoring ${storedPath}: it has no apiKey. Run agnox login again.`);
121
+ const merged = mergeSettings({ env: options.env, dotEnv: dotEnvText === undefined ? undefined : parseDotEnv(dotEnvText), stored });
122
+ return { ...merged, notices: [...notices, ...merged.notices] };
123
+ }
124
+ /** Thrown when the credentials file cannot be written safely. */
125
+ export class CredentialsError extends Error {
126
+ constructor(message) {
127
+ super(message);
128
+ this.name = 'CredentialsError';
129
+ }
130
+ }
131
+ async function isSymlink(fs, path) {
132
+ try {
133
+ return (await fs.lstat(path)).isSymbolicLink();
134
+ }
135
+ catch (error) {
136
+ if (isMissing(error))
137
+ return false;
138
+ throw error;
139
+ }
140
+ }
141
+ /**
142
+ * Write ~/.agnox/config.json, readable by the owner only (0600 in a 0700
143
+ * directory; Windows ignores the mode and relies on the profile's ACLs).
144
+ * Never writes through a symbolic link.
145
+ */
146
+ export async function saveCredentials(fs, homeDir, credentials) {
147
+ const dir = credentialsDir(homeDir);
148
+ const file = credentialsPath(homeDir);
149
+ if (await isSymlink(fs, dir))
150
+ throw new CredentialsError(`Refusing to write ${dir}: it is a symbolic link`);
151
+ await fs.mkdir(dir, { recursive: true, mode: 0o700 });
152
+ if (await isSymlink(fs, file))
153
+ throw new CredentialsError(`Refusing to write ${file}: it is a symbolic link`);
154
+ await fs.writeFile(file, `${JSON.stringify(credentials, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
155
+ // writeFile applies the mode only when it creates the file
156
+ await fs.chmod(file, 0o600).catch(() => undefined);
157
+ return file;
158
+ }
159
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** Package version; a test keeps it equal to package.json. */
2
- export declare const VERSION = "1.0.1";
2
+ export declare const VERSION = "1.0.2";
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /** Package version; a test keeps it equal to package.json. */
2
- export const VERSION = '1.0.1';
2
+ export const VERSION = '1.0.2';
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agnox/mcp-server",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Agnox MCP server and CLI — read runs and failures, quarantine flaky tests, sync test cases and export specs from AI coding tools and the terminal",
5
5
  "type": "module",
6
6
  "bin": {