sealmetrics 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/agent/ndjson.d.ts +83 -0
  2. package/dist/agent/ndjson.d.ts.map +1 -0
  3. package/dist/agent/ndjson.js +106 -0
  4. package/dist/agent/ndjson.js.map +1 -0
  5. package/dist/api/client.d.ts +28 -0
  6. package/dist/api/client.d.ts.map +1 -0
  7. package/dist/api/client.js +147 -0
  8. package/dist/api/client.js.map +1 -0
  9. package/dist/cli.d.ts +36 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +157 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/commands/init.d.ts +5 -0
  14. package/dist/commands/init.d.ts.map +1 -0
  15. package/dist/commands/init.js +428 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/config/env.d.ts +7 -0
  18. package/dist/config/env.d.ts.map +1 -0
  19. package/dist/config/env.js +74 -0
  20. package/dist/config/env.js.map +1 -0
  21. package/dist/config/gitignore.d.ts +5 -0
  22. package/dist/config/gitignore.d.ts.map +1 -0
  23. package/dist/config/gitignore.js +17 -0
  24. package/dist/config/gitignore.js.map +1 -0
  25. package/dist/config/seal-config.d.ts +10 -0
  26. package/dist/config/seal-config.d.ts.map +1 -0
  27. package/dist/config/seal-config.js +75 -0
  28. package/dist/config/seal-config.js.map +1 -0
  29. package/dist/detect/cms.d.ts +5 -0
  30. package/dist/detect/cms.d.ts.map +1 -0
  31. package/dist/detect/cms.js +52 -0
  32. package/dist/detect/cms.js.map +1 -0
  33. package/dist/detect/index.d.ts +5 -0
  34. package/dist/detect/index.d.ts.map +1 -0
  35. package/dist/detect/index.js +155 -0
  36. package/dist/detect/index.js.map +1 -0
  37. package/dist/embedded.d.ts +20 -0
  38. package/dist/embedded.d.ts.map +1 -0
  39. package/dist/embedded.js +20 -0
  40. package/dist/embedded.js.map +1 -0
  41. package/dist/exit-codes.d.ts +34 -0
  42. package/dist/exit-codes.d.ts.map +1 -0
  43. package/dist/exit-codes.js +39 -0
  44. package/dist/exit-codes.js.map +1 -0
  45. package/dist/fs/safe-write.d.ts +63 -0
  46. package/dist/fs/safe-write.d.ts.map +1 -0
  47. package/dist/fs/safe-write.js +229 -0
  48. package/dist/fs/safe-write.js.map +1 -0
  49. package/dist/generated/guide.d.ts +2 -0
  50. package/dist/generated/guide.d.ts.map +1 -0
  51. package/dist/generated/guide.js +5 -0
  52. package/dist/generated/guide.js.map +1 -0
  53. package/dist/handoff/install.d.ts +20 -0
  54. package/dist/handoff/install.d.ts.map +1 -0
  55. package/dist/handoff/install.js +164 -0
  56. package/dist/handoff/install.js.map +1 -0
  57. package/dist/index.d.ts +3 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +76 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/instrument/guide.d.ts +6 -0
  62. package/dist/instrument/guide.d.ts.map +1 -0
  63. package/dist/instrument/guide.js +38 -0
  64. package/dist/instrument/guide.js.map +1 -0
  65. package/dist/mcp/configure.d.ts +31 -0
  66. package/dist/mcp/configure.d.ts.map +1 -0
  67. package/dist/mcp/configure.js +121 -0
  68. package/dist/mcp/configure.js.map +1 -0
  69. package/dist/prompts.d.ts +13 -0
  70. package/dist/prompts.d.ts.map +1 -0
  71. package/dist/prompts.js +29 -0
  72. package/dist/prompts.js.map +1 -0
  73. package/dist/types.d.ts +70 -0
  74. package/dist/types.d.ts.map +1 -0
  75. package/dist/types.js +3 -0
  76. package/dist/types.js.map +1 -0
  77. package/dist/verify/pixel.d.ts +27 -0
  78. package/dist/verify/pixel.d.ts.map +1 -0
  79. package/dist/verify/pixel.js +53 -0
  80. package/dist/verify/pixel.js.map +1 -0
  81. package/dist/version.d.ts +2 -0
  82. package/dist/version.d.ts.map +1 -0
  83. package/dist/version.js +16 -0
  84. package/dist/version.js.map +1 -0
  85. package/package.json +3 -2
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Output layer (Bloque 2). In `--agent` mode every stdout line is a versioned
3
+ * NDJSON envelope `{ v, type, level, data }` (RF-201/202/205); in human mode
4
+ * stdout is plain text (VAL-202). Debug logs always go to stderr (RF-201).
5
+ *
6
+ * Each envelope is a single line terminated by `\n` — never multiline
7
+ * (VAL-201), so an orchestrator can parse the stream line by line.
8
+ */
9
+ export declare const PROTOCOL_VERSION = 1;
10
+ export type EventType = "lifecycle" | "file_change" | "needs_input" | "result" | "error";
11
+ export type Level = "info" | "warn" | "error";
12
+ export interface Envelope {
13
+ v: number;
14
+ type: EventType;
15
+ level: Level;
16
+ data: Record<string, unknown>;
17
+ }
18
+ export interface FileChange {
19
+ path: string;
20
+ action: "plan" | "applied";
21
+ diff?: string;
22
+ bytes?: number;
23
+ }
24
+ export interface NeedsInput {
25
+ id: string;
26
+ prompt: string;
27
+ default?: string;
28
+ options?: string[];
29
+ /** In --agent the prompt is auto-resolved; the resolution is reported (RF-203). */
30
+ resolved?: string;
31
+ }
32
+ export interface ErrorData {
33
+ code: string;
34
+ message: string;
35
+ hint?: string;
36
+ [key: string]: unknown;
37
+ }
38
+ /**
39
+ * Reporter contract shared by the agent (NDJSON) and human renderers so the
40
+ * orchestrator logic in `init.ts` never branches on output mode.
41
+ */
42
+ export interface Reporter {
43
+ readonly agent: boolean;
44
+ lifecycle(stage: string, data?: Record<string, unknown>, level?: Level): void;
45
+ fileChange(change: FileChange): void;
46
+ needsInput(input: NeedsInput): void;
47
+ result(data: Record<string, unknown>): void;
48
+ error(data: ErrorData): void;
49
+ /** Human-facing info text. Suppressed in agent mode (kept off the NDJSON stream). */
50
+ info(message: string): void;
51
+ warn(message: string): void;
52
+ /** Debug — always stderr, never stdout. */
53
+ debug(message: string): void;
54
+ }
55
+ /** NDJSON reporter used in `--agent` mode. */
56
+ export declare class AgentReporter implements Reporter {
57
+ readonly agent = true;
58
+ private emit;
59
+ lifecycle(stage: string, data?: Record<string, unknown>, level?: Level): void;
60
+ fileChange(change: FileChange): void;
61
+ needsInput(input: NeedsInput): void;
62
+ result(data: Record<string, unknown>): void;
63
+ error(data: ErrorData): void;
64
+ info(_message: string): void;
65
+ warn(message: string): void;
66
+ debug(message: string): void;
67
+ }
68
+ /** Human reporter used in interactive / `-y` mode (VAL-202). */
69
+ export declare class HumanReporter implements Reporter {
70
+ readonly agent = false;
71
+ private readonly color;
72
+ constructor();
73
+ private c;
74
+ lifecycle(stage: string, data?: Record<string, unknown>): void;
75
+ fileChange(change: FileChange): void;
76
+ needsInput(input: NeedsInput): void;
77
+ result(data: Record<string, unknown>): void;
78
+ error(data: ErrorData): void;
79
+ info(message: string): void;
80
+ warn(message: string): void;
81
+ debug(message: string): void;
82
+ }
83
+ //# sourceMappingURL=ndjson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndjson.d.ts","sourceRoot":"","sources":["../../src/agent/ndjson.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Output layer (Bloque 2). In `--agent` mode every stdout line is a versioned
3
+ * NDJSON envelope `{ v, type, level, data }` (RF-201/202/205); in human mode
4
+ * stdout is plain text (VAL-202). Debug logs always go to stderr (RF-201).
5
+ *
6
+ * Each envelope is a single line terminated by `\n` — never multiline
7
+ * (VAL-201), so an orchestrator can parse the stream line by line.
8
+ */
9
+ export const PROTOCOL_VERSION = 1;
10
+ function write(line) {
11
+ process.stdout.write(line + "\n");
12
+ }
13
+ /** Result fields that must never be printed, even if a caller includes them (VAL-404). */
14
+ const BLOCKED_RESULT_KEYS = new Set(["api_key", "apiKey", "provision_key", "provisionKey"]);
15
+ /** NDJSON reporter used in `--agent` mode. */
16
+ export class AgentReporter {
17
+ agent = true;
18
+ emit(type, level, data) {
19
+ const env = { v: PROTOCOL_VERSION, type, level, data };
20
+ write(JSON.stringify(env));
21
+ }
22
+ lifecycle(stage, data = {}, level = "info") {
23
+ this.emit("lifecycle", level, { stage, ...data });
24
+ }
25
+ fileChange(change) {
26
+ this.emit("file_change", "info", { ...change });
27
+ }
28
+ needsInput(input) {
29
+ this.emit("needs_input", "info", { ...input });
30
+ }
31
+ result(data) {
32
+ this.emit("result", "info", data);
33
+ }
34
+ error(data) {
35
+ this.emit("error", "error", data);
36
+ }
37
+ info(_message) {
38
+ // No human prose on the NDJSON stream (RF-201). Route to stderr for debugging.
39
+ process.stderr.write(_message + "\n");
40
+ }
41
+ warn(message) {
42
+ process.stderr.write(message + "\n");
43
+ }
44
+ debug(message) {
45
+ if (process.env.SEALMETRICS_DEBUG)
46
+ process.stderr.write(message + "\n");
47
+ }
48
+ }
49
+ const bold = (s) => `\x1b[1m${s}\x1b[0m`;
50
+ const dim = (s) => `\x1b[2m${s}\x1b[0m`;
51
+ const green = (s) => `\x1b[32m${s}\x1b[0m`;
52
+ const yellow = (s) => `\x1b[33m${s}\x1b[0m`;
53
+ const red = (s) => `\x1b[31m${s}\x1b[0m`;
54
+ /** Human reporter used in interactive / `-y` mode (VAL-202). */
55
+ export class HumanReporter {
56
+ agent = false;
57
+ color;
58
+ constructor() {
59
+ this.color = process.stdout.isTTY === true && !process.env.NO_COLOR;
60
+ }
61
+ c(fn, s) {
62
+ return this.color ? fn(s) : s;
63
+ }
64
+ lifecycle(stage, data = {}) {
65
+ const detail = data["detail"] ?? data["framework"] ?? data["account_id"] ?? "";
66
+ const suffix = detail ? this.c(dim, ` ${detail}`) : "";
67
+ write(`${this.c(green, "→")} ${stage}${suffix}`);
68
+ }
69
+ fileChange(change) {
70
+ const verb = change.action === "applied" ? "wrote" : "plan";
71
+ write(` ${this.c(dim, verb)} ${change.path}`);
72
+ }
73
+ needsInput(input) {
74
+ if (input.resolved !== undefined) {
75
+ write(` ${this.c(dim, input.prompt)} ${input.resolved}`);
76
+ }
77
+ }
78
+ result(data) {
79
+ write("");
80
+ write(this.c(bold, "Done."));
81
+ for (const [k, v] of Object.entries(data)) {
82
+ if (v === undefined || v === null)
83
+ continue;
84
+ // Defensive denylist: never print a secret even if a caller mis-includes one.
85
+ if (BLOCKED_RESULT_KEYS.has(k))
86
+ continue;
87
+ write(` ${this.c(dim, k + ":")} ${String(v)}`);
88
+ }
89
+ }
90
+ error(data) {
91
+ write(`${this.c(red, "✗")} ${data.message}`);
92
+ if (data.hint)
93
+ write(` ${this.c(dim, data.hint)}`);
94
+ }
95
+ info(message) {
96
+ write(message);
97
+ }
98
+ warn(message) {
99
+ write(this.c(yellow, message));
100
+ }
101
+ debug(message) {
102
+ if (process.env.SEALMETRICS_DEBUG)
103
+ process.stderr.write(message + "\n");
104
+ }
105
+ }
106
+ //# sourceMappingURL=ndjson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndjson.js","sourceRoot":"","sources":["../../src/agent/ndjson.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { ProvisionResult, PixelStatus } from "../types.js";
2
+ /** Raised on 409 (email already exists) — init handles it as informative, exit 0 (RF-402). */
3
+ export declare class EmailExistsError extends Error {
4
+ constructor();
5
+ }
6
+ export interface ProvisionInput {
7
+ siteName: string;
8
+ domain?: string;
9
+ email: string;
10
+ name?: string;
11
+ installSource: string;
12
+ timezone?: string;
13
+ /** Args to surface in the AUTH_REQUIRED re-invocation command (RF-204). */
14
+ reinvokeCommand?: string;
15
+ }
16
+ export declare class ApiClient {
17
+ private readonly baseUrl;
18
+ private readonly provisionKey;
19
+ constructor(baseUrl: string, provisionKey: string);
20
+ /** POST /provision. Throws CliError (3/4) or EmailExistsError on the mapped statuses. */
21
+ provision(input: ProvisionInput): Promise<ProvisionResult>;
22
+ /** GET /sites/{id}/pixel/status. Throws CliError(4) on network/backend errors. */
23
+ pixelStatus(accountId: string, apiKey: string): Promise<PixelStatus>;
24
+ private fetchWithTimeout;
25
+ private json;
26
+ private safeText;
27
+ }
28
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAIhE,8FAA8F;AAC9F,qBAAa,gBAAiB,SAAQ,KAAK;;CAK1C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AASD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAKjD,yFAAyF;IACnF,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IA+EhE,kFAAkF;IAC5E,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;YA2B5D,gBAAgB;YAUhB,IAAI;YASJ,QAAQ;CAOvB"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * HTTP client for the Fase 1 backend (Bloque 4). Consumes, never changes, the
3
+ * existing contract: POST /provision (X-Provision-Key) and
4
+ * GET /sites/{id}/pixel/status (X-API-Key). Response maps to events/exit codes
5
+ * per RF-402.
6
+ */
7
+ import { CliError, ExitCode } from "../exit-codes.js";
8
+ const DEFAULT_TIMEOUT_MS = 30_000;
9
+ /** Raised on 409 (email already exists) — init handles it as informative, exit 0 (RF-402). */
10
+ export class EmailExistsError extends Error {
11
+ constructor() {
12
+ super("provision_unavailable");
13
+ this.name = "EmailExistsError";
14
+ }
15
+ }
16
+ export class ApiClient {
17
+ baseUrl;
18
+ provisionKey;
19
+ constructor(baseUrl, provisionKey) {
20
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
21
+ this.provisionKey = provisionKey;
22
+ }
23
+ /** POST /provision. Throws CliError (3/4) or EmailExistsError on the mapped statuses. */
24
+ async provision(input) {
25
+ const body = {
26
+ site_name: input.siteName,
27
+ domain: input.domain,
28
+ email: input.email,
29
+ name: input.name,
30
+ accept_terms: true,
31
+ install_source: input.installSource,
32
+ timezone: input.timezone,
33
+ };
34
+ let res;
35
+ try {
36
+ res = await this.fetchWithTimeout(`${this.baseUrl}/provision`, {
37
+ method: "POST",
38
+ headers: {
39
+ "Content-Type": "application/json",
40
+ Accept: "application/json",
41
+ "X-Provision-Key": this.provisionKey,
42
+ },
43
+ body: JSON.stringify(body),
44
+ });
45
+ }
46
+ catch (e) {
47
+ throw new CliError(ExitCode.NETWORK, "network_error", `Could not reach the SealMetrics API at ${this.baseUrl}.`, {
48
+ hint: e instanceof Error ? e.message : undefined,
49
+ });
50
+ }
51
+ if (res.status === 200) {
52
+ const json = (await this.json(res));
53
+ const data = json.data;
54
+ if (!data || !data.account_id || !data.api_key) {
55
+ throw new CliError(ExitCode.NETWORK, "bad_response", "Provisioning returned an unexpected response.");
56
+ }
57
+ return data;
58
+ }
59
+ if (res.status === 401) {
60
+ throw new CliError(ExitCode.AUTH_REQUIRED, "AUTH_REQUIRED", "The provision key was rejected (invalid or revoked).", {
61
+ hint: "Re-run with a valid publishable provision key.",
62
+ extra: {
63
+ command: input.reinvokeCommand ??
64
+ "npx sealmetrics init --provision-key <YOUR_KEY> --email <email> --accept-tos",
65
+ },
66
+ });
67
+ }
68
+ if (res.status === 409) {
69
+ throw new EmailExistsError();
70
+ }
71
+ if (res.status === 429) {
72
+ const retryAfter = parseRetryAfter(res.headers.get("Retry-After"));
73
+ throw new CliError(ExitCode.NETWORK, "rate_limited", "Provisioning is rate-limited. Please wait and retry.", {
74
+ extra: retryAfter ? { retry_after: retryAfter } : undefined,
75
+ });
76
+ }
77
+ if (res.status === 503) {
78
+ throw new CliError(ExitCode.NETWORK, "provisioning_disabled", "Provisioning is currently disabled on the server.", { hint: "The free-tier channel is not enabled yet. Try again later." });
79
+ }
80
+ const detail = await this.safeText(res);
81
+ throw new CliError(ExitCode.NETWORK, "backend_error", `Provisioning failed (HTTP ${res.status}).`, {
82
+ hint: detail.slice(0, 200) || undefined,
83
+ });
84
+ }
85
+ /** GET /sites/{id}/pixel/status. Throws CliError(4) on network/backend errors. */
86
+ async pixelStatus(accountId, apiKey) {
87
+ const url = `${this.baseUrl}/sites/${encodeURIComponent(accountId)}/pixel/status`;
88
+ let res;
89
+ try {
90
+ res = await this.fetchWithTimeout(url, {
91
+ method: "GET",
92
+ headers: { "X-API-Key": apiKey, Accept: "application/json" },
93
+ });
94
+ }
95
+ catch (e) {
96
+ throw new CliError(ExitCode.NETWORK, "network_error", "Could not reach the SealMetrics API.", {
97
+ hint: e instanceof Error ? e.message : undefined,
98
+ });
99
+ }
100
+ if (res.status !== 200) {
101
+ const detail = await this.safeText(res);
102
+ throw new CliError(ExitCode.NETWORK, "pixel_status_error", `Pixel status check failed (HTTP ${res.status}).`, {
103
+ hint: detail.slice(0, 200) || undefined,
104
+ });
105
+ }
106
+ const json = (await this.json(res));
107
+ const data = json.data;
108
+ if (!data || typeof data.installed !== "boolean") {
109
+ throw new CliError(ExitCode.NETWORK, "bad_response", "Pixel status returned an unexpected response.");
110
+ }
111
+ return data;
112
+ }
113
+ async fetchWithTimeout(url, init) {
114
+ const controller = new AbortController();
115
+ const timeout = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT_MS);
116
+ try {
117
+ return await fetch(url, { ...init, signal: controller.signal });
118
+ }
119
+ finally {
120
+ clearTimeout(timeout);
121
+ }
122
+ }
123
+ async json(res) {
124
+ const text = await res.text();
125
+ try {
126
+ return JSON.parse(text);
127
+ }
128
+ catch {
129
+ throw new CliError(ExitCode.NETWORK, "bad_response", "The API returned invalid JSON.");
130
+ }
131
+ }
132
+ async safeText(res) {
133
+ try {
134
+ return await res.text();
135
+ }
136
+ catch {
137
+ return "";
138
+ }
139
+ }
140
+ }
141
+ function parseRetryAfter(header) {
142
+ if (!header)
143
+ return undefined;
144
+ const n = parseInt(header, 10);
145
+ return Number.isFinite(n) && n > 0 ? n : undefined;
146
+ }
147
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ export interface InitOptions {
2
+ email?: string;
3
+ name?: string;
4
+ siteName?: string;
5
+ domain?: string;
6
+ acceptTos: boolean;
7
+ installSource: string;
8
+ baseUrl: string;
9
+ region?: string;
10
+ agent: boolean;
11
+ yes: boolean;
12
+ resume: boolean;
13
+ dryRun: boolean;
14
+ apiKey?: string;
15
+ provisionKey?: string;
16
+ noInject: boolean;
17
+ url?: string;
18
+ verifyTimeout: number;
19
+ editor?: string;
20
+ noMcp: boolean;
21
+ cwd: string;
22
+ }
23
+ /** Default backend per region; the published binary defaults to PROD (PRE-3). */
24
+ export declare const REGION_BASE_URLS: Record<string, string>;
25
+ export interface ParseResult {
26
+ options?: InitOptions;
27
+ help?: boolean;
28
+ version?: boolean;
29
+ }
30
+ /**
31
+ * Parse argv (already sliced past `node script init`). The leading subcommand
32
+ * (`init`) is tolerated if present.
33
+ */
34
+ export declare function parseArgs(argv: string[]): ParseResult;
35
+ export declare function helpText(): string;
36
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAInD,CAAC;AAsCF,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAiBD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CA6FrD;AAMD,wBAAgB,QAAQ,IAAI,MAAM,CAEjC"}
package/dist/cli.js ADDED
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Argument parsing for `sealmetrics init` (RF-102). Zero-dependency: only Node
3
+ * built-ins. Invalid args throw a CliError with exit code 2 (RF-103, TEST-101).
4
+ */
5
+ import { CliError, ExitCode } from "./exit-codes.js";
6
+ /** Default backend per region; the published binary defaults to PROD (PRE-3). */
7
+ export const REGION_BASE_URLS = {
8
+ prod: "https://my.sealmetrics.com/api/v1",
9
+ pre: "https://pre.sealmetrics.com/api/v1",
10
+ local: "http://localhost:8000/api/v1",
11
+ };
12
+ const DEFAULT_BASE_URL = REGION_BASE_URLS.prod;
13
+ const HELP = `sealmetrics init — provision a free analytics account and wire up tracking
14
+
15
+ Usage:
16
+ npx sealmetrics init [options]
17
+
18
+ Provisioning:
19
+ --email <email> Account owner email (required to provision)
20
+ --name <name> Owner name
21
+ --site-name <name> Site display name
22
+ --domain <domain> Site domain (e.g. myshop.com)
23
+ --accept-tos Accept the Terms of Service (required to provision)
24
+ --install-source <src> Attribution channel (default: npx)
25
+ --api-key <key> Reuse an existing read-only key; skips provisioning
26
+ --provision-key <key> Override the embedded publishable provision key
27
+
28
+ Targeting:
29
+ --region <prod|pre|local> Backend region (default: prod)
30
+ --base-url <url> Override the API base URL (wins over --region)
31
+ --url <url> Site URL used for verify auto-ping
32
+
33
+ Behaviour:
34
+ --agent Machine mode: NDJSON on stdout, auto-approve, no prompts
35
+ -y, --yes Non-interactive (use flags/defaults, no prompts)
36
+ --resume Resume from the last checkpoint (no re-provision)
37
+ --dry-run Detect only — no provisioning, no writes
38
+ --no-inject Provision only — don't even emit placement guidance
39
+ --no-mcp Skip MCP auto-config
40
+ --editor <id> Force an MCP client (claude-code|cursor|windsurf|vscode)
41
+ --verify-timeout <secs> Pixel verify timeout in seconds (default: 75, 0 = skip)
42
+
43
+ -h, --help Show this help
44
+ -v, --version Show version
45
+ `;
46
+ const BOOLEAN_FLAGS = new Set([
47
+ "--accept-tos",
48
+ "--agent",
49
+ "--yes",
50
+ "-y",
51
+ "--resume",
52
+ "--dry-run",
53
+ "--no-inject",
54
+ "--no-mcp",
55
+ "-h",
56
+ "--help",
57
+ "-v",
58
+ "--version",
59
+ ]);
60
+ /**
61
+ * Parse argv (already sliced past `node script init`). The leading subcommand
62
+ * (`init`) is tolerated if present.
63
+ */
64
+ export function parseArgs(argv) {
65
+ const args = [...argv];
66
+ if (args[0] === "init")
67
+ args.shift();
68
+ // Fast path for help/version so they never require other flags.
69
+ if (args.includes("-h") || args.includes("--help"))
70
+ return { help: true };
71
+ if (args.includes("-v") || args.includes("--version"))
72
+ return { version: true };
73
+ const raw = {};
74
+ for (let i = 0; i < args.length; i++) {
75
+ const arg = args[i];
76
+ if (!arg.startsWith("-")) {
77
+ throw new CliError(ExitCode.ARGS, "invalid_args", `Unexpected argument: ${arg}`, {
78
+ hint: "Run `sealmetrics init --help` for usage.",
79
+ });
80
+ }
81
+ // Support --flag=value
82
+ const eq = arg.indexOf("=");
83
+ if (eq !== -1) {
84
+ const key = arg.slice(0, eq);
85
+ raw[key] = arg.slice(eq + 1);
86
+ continue;
87
+ }
88
+ if (BOOLEAN_FLAGS.has(arg)) {
89
+ raw[arg] = true;
90
+ continue;
91
+ }
92
+ // Value flag: consume the next token.
93
+ const next = args[i + 1];
94
+ if (next === undefined || (next.startsWith("-") && !/^-?\d/.test(next))) {
95
+ throw new CliError(ExitCode.ARGS, "invalid_args", `Missing value for ${arg}`, {
96
+ hint: "Run `sealmetrics init --help` for usage.",
97
+ });
98
+ }
99
+ raw[arg] = next;
100
+ i++;
101
+ }
102
+ const region = strOf(raw["--region"]);
103
+ if (region && !(region in REGION_BASE_URLS)) {
104
+ throw new CliError(ExitCode.ARGS, "invalid_args", `Unknown region: ${region}`, {
105
+ hint: `Valid regions: ${Object.keys(REGION_BASE_URLS).join(", ")}`,
106
+ });
107
+ }
108
+ const baseUrl = strOf(raw["--base-url"]) ??
109
+ (region ? REGION_BASE_URLS[region] : undefined) ??
110
+ DEFAULT_BASE_URL;
111
+ let verifyTimeout = 75;
112
+ const vt = strOf(raw["--verify-timeout"]);
113
+ if (vt !== undefined) {
114
+ const parsed = Number(vt);
115
+ if (!Number.isFinite(parsed) || parsed < 0) {
116
+ throw new CliError(ExitCode.ARGS, "invalid_args", `Invalid --verify-timeout: ${vt}`);
117
+ }
118
+ verifyTimeout = parsed;
119
+ }
120
+ const editor = strOf(raw["--editor"]);
121
+ const VALID_EDITORS = ["claude-code", "cursor", "windsurf", "vscode"];
122
+ if (editor && !VALID_EDITORS.includes(editor)) {
123
+ throw new CliError(ExitCode.ARGS, "invalid_args", `Unknown --editor: ${editor}`, {
124
+ hint: `Valid editors: ${VALID_EDITORS.join(", ")}`,
125
+ });
126
+ }
127
+ const options = {
128
+ email: strOf(raw["--email"]),
129
+ name: strOf(raw["--name"]),
130
+ siteName: strOf(raw["--site-name"]),
131
+ domain: strOf(raw["--domain"]),
132
+ acceptTos: raw["--accept-tos"] === true,
133
+ installSource: strOf(raw["--install-source"]) ?? "npx",
134
+ baseUrl,
135
+ region,
136
+ agent: raw["--agent"] === true,
137
+ yes: raw["--yes"] === true || raw["-y"] === true,
138
+ resume: raw["--resume"] === true,
139
+ dryRun: raw["--dry-run"] === true,
140
+ apiKey: strOf(raw["--api-key"]),
141
+ provisionKey: strOf(raw["--provision-key"]),
142
+ noInject: raw["--no-inject"] === true,
143
+ url: strOf(raw["--url"]),
144
+ verifyTimeout,
145
+ editor,
146
+ noMcp: raw["--no-mcp"] === true,
147
+ cwd: process.cwd(),
148
+ };
149
+ return { options };
150
+ }
151
+ function strOf(v) {
152
+ return typeof v === "string" ? v : undefined;
153
+ }
154
+ export function helpText() {
155
+ return HELP;
156
+ }
157
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type ExitCodeValue } from "../exit-codes.js";
2
+ import type { InitOptions } from "../cli.js";
3
+ import type { Reporter } from "../agent/ndjson.js";
4
+ export declare function runInit(options: InitOptions, reporter: Reporter): Promise<ExitCodeValue>;
5
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAUA,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAyBnD,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAqS9F"}