@vonpay/checkout-cli 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/checkout.d.ts.map +1 -1
- package/dist/commands/checkout.js +2 -0
- package/dist/commands/checkout.js.map +1 -1
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +337 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +54 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +24 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +35 -4
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/trigger.d.ts.map +1 -1
- package/dist/commands/trigger.js +10 -5
- package/dist/commands/trigger.js.map +1 -1
- package/package.json +2 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../../src/commands/checkout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../../src/commands/checkout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAWvD"}
|
|
@@ -3,6 +3,7 @@ import { initCommand } from "./init.js";
|
|
|
3
3
|
import { sessionsCommand } from "./sessions.js";
|
|
4
4
|
import { triggerCommand } from "./trigger.js";
|
|
5
5
|
import { healthCommand } from "./health.js";
|
|
6
|
+
import { doctorCommand } from "./doctor.js";
|
|
6
7
|
export function registerCheckout(program) {
|
|
7
8
|
const checkout = program
|
|
8
9
|
.command("checkout")
|
|
@@ -12,5 +13,6 @@ export function registerCheckout(program) {
|
|
|
12
13
|
checkout.addCommand(sessionsCommand());
|
|
13
14
|
checkout.addCommand(triggerCommand());
|
|
14
15
|
checkout.addCommand(healthCommand());
|
|
16
|
+
checkout.addCommand(doctorCommand());
|
|
15
17
|
}
|
|
16
18
|
//# sourceMappingURL=checkout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout.js","sourceRoot":"","sources":["../../src/commands/checkout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,4BAA4B,CAAC,CAAC;IAE7C,QAAQ,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACvC,CAAC"}
|
|
1
|
+
{"version":3,"file":"checkout.js","sourceRoot":"","sources":["../../src/commands/checkout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,4BAA4B,CAAC,CAAC;IAE7C,QAAQ,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6VpC,wBAAgB,aAAa,IAAI,OAAO,CA4BvC"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
// `vonpay checkout doctor` — diagnostic bundle for support tickets and LLM agents.
|
|
2
|
+
//
|
|
3
|
+
// Captures the integrator's environment + a live health probe + (if a key is
|
|
4
|
+
// available) a sessions.validate round-trip, formats it as either:
|
|
5
|
+
// - human-readable (default) — coloured table for paste into chat
|
|
6
|
+
// - JSON (--json) — machine-parseable for tooling
|
|
7
|
+
// - LLM-friendly markdown (--for-llm) — structured so an agent can read it
|
|
8
|
+
// and decide next steps without further prompting
|
|
9
|
+
//
|
|
10
|
+
// PII posture: API keys are NEVER printed (only the prefix); env-var values
|
|
11
|
+
// are NEVER printed (only the names that are present). The bundle is safe to
|
|
12
|
+
// paste into a public support thread or hand to an LLM agent.
|
|
13
|
+
import { Command } from "commander";
|
|
14
|
+
import chalk from "chalk";
|
|
15
|
+
import ora from "ora";
|
|
16
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
17
|
+
import { dirname, join } from "node:path";
|
|
18
|
+
import { fileURLToPath } from "node:url";
|
|
19
|
+
import { VonPayCheckout, VonPayError, helpFor, } from "@vonpay/checkout-node";
|
|
20
|
+
import { loadConfig } from "../config.js";
|
|
21
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
22
|
+
const pkgPath = join(__dirname, "..", "..", "package.json");
|
|
23
|
+
const cliPkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
24
|
+
const RELEVANT_ENV_VARS = [
|
|
25
|
+
"VON_PAY_SECRET_KEY",
|
|
26
|
+
"VON_PAY_PUBLISHABLE_KEY",
|
|
27
|
+
"VON_PAY_SESSION_SECRET",
|
|
28
|
+
"VONPAY_API_KEY",
|
|
29
|
+
"VONPAY_BASE_URL",
|
|
30
|
+
"VONPAY_QUIET",
|
|
31
|
+
"NEXT_PUBLIC_BASE_URL",
|
|
32
|
+
];
|
|
33
|
+
function maskPrefix(key) {
|
|
34
|
+
if (!key)
|
|
35
|
+
return undefined;
|
|
36
|
+
// Show prefix + first 4 chars of payload so support can correlate, never
|
|
37
|
+
// the full secret. Example: "vp_sk_test_abcd…"
|
|
38
|
+
const m = key.match(/^(vp_[ps]k_(test|live)_)([A-Za-z0-9_-]{0,4})/);
|
|
39
|
+
if (!m)
|
|
40
|
+
return undefined;
|
|
41
|
+
return `${m[1]}${m[3]}…`;
|
|
42
|
+
}
|
|
43
|
+
function keyMode(key) {
|
|
44
|
+
if (!key)
|
|
45
|
+
return undefined;
|
|
46
|
+
if (key.includes("_test_"))
|
|
47
|
+
return "test";
|
|
48
|
+
if (key.includes("_live_"))
|
|
49
|
+
return "live";
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
async function gather() {
|
|
53
|
+
const config = loadConfig();
|
|
54
|
+
const apiKey = process.env.VON_PAY_SECRET_KEY ??
|
|
55
|
+
process.env.VONPAY_API_KEY ??
|
|
56
|
+
config.checkout?.apiKey;
|
|
57
|
+
const baseUrl = process.env.VONPAY_BASE_URL ?? "https://checkout.vonpay.com";
|
|
58
|
+
const envVarsPresent = RELEVANT_ENV_VARS.filter((n) => process.env[n] && process.env[n] !== "");
|
|
59
|
+
const report = {
|
|
60
|
+
generatedAt: new Date().toISOString(),
|
|
61
|
+
cli: { version: cliPkg.version },
|
|
62
|
+
runtime: {
|
|
63
|
+
node: process.version,
|
|
64
|
+
platform: process.platform,
|
|
65
|
+
arch: process.arch,
|
|
66
|
+
cwd: process.cwd(),
|
|
67
|
+
},
|
|
68
|
+
envVarsPresent,
|
|
69
|
+
configFile: {
|
|
70
|
+
path: `${process.env.HOME ?? process.env.USERPROFILE ?? "~"}/.vonpay/config.json`,
|
|
71
|
+
present: existsSync(`${process.env.HOME ?? process.env.USERPROFILE ?? ""}/.vonpay/config.json`),
|
|
72
|
+
keyType: config.checkout?.apiKey ? keyMode(config.checkout?.apiKey) : undefined,
|
|
73
|
+
},
|
|
74
|
+
apiKeyPrefix: maskPrefix(apiKey),
|
|
75
|
+
apiKeyMode: keyMode(apiKey),
|
|
76
|
+
health: { baseUrl, reachable: false },
|
|
77
|
+
hints: [],
|
|
78
|
+
};
|
|
79
|
+
if (!apiKey) {
|
|
80
|
+
report.hints.push("No API key found. Set VON_PAY_SECRET_KEY in env, or run `vonpay checkout login` to save one. Without a key the health probe still runs but sessions.validate is skipped.");
|
|
81
|
+
}
|
|
82
|
+
// Health probe — works without auth
|
|
83
|
+
const start = Date.now();
|
|
84
|
+
try {
|
|
85
|
+
const probeClient = new VonPayCheckout({
|
|
86
|
+
apiKey: apiKey ?? "vp_sk_test_diagnostic_probe_only",
|
|
87
|
+
baseUrl,
|
|
88
|
+
timeout: 10_000,
|
|
89
|
+
maxRetries: 0,
|
|
90
|
+
errorReporter: () => { }, // suppress default warn during the probe
|
|
91
|
+
});
|
|
92
|
+
const health = await probeClient.health();
|
|
93
|
+
report.health.reachable = true;
|
|
94
|
+
report.health.latencyMs = Date.now() - start;
|
|
95
|
+
report.health.status = health.status;
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
report.health.error =
|
|
99
|
+
err instanceof Error ? err.message : String(err);
|
|
100
|
+
report.health.latencyMs = Date.now() - start;
|
|
101
|
+
if (err instanceof VonPayError) {
|
|
102
|
+
report.health.status = `error_${err.code}`;
|
|
103
|
+
report.hints.push(`Health probe returned ${err.code}: ${helpFor(err.code).llmHint}`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
report.hints.push("Health probe could not reach the API. Check network / DNS / firewall — vonpay-checkout requires outbound HTTPS to checkout.vonpay.com.");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// sessions.validate probe — only if we have a key
|
|
110
|
+
if (apiKey && report.health.reachable) {
|
|
111
|
+
try {
|
|
112
|
+
const probeClient = new VonPayCheckout({
|
|
113
|
+
apiKey,
|
|
114
|
+
baseUrl,
|
|
115
|
+
timeout: 10_000,
|
|
116
|
+
maxRetries: 0,
|
|
117
|
+
errorReporter: () => { }, // suppress default warn during the probe
|
|
118
|
+
});
|
|
119
|
+
const result = await probeClient.sessions.validate({
|
|
120
|
+
amount: 1499,
|
|
121
|
+
currency: "USD",
|
|
122
|
+
});
|
|
123
|
+
report.validateProbe = {
|
|
124
|
+
ok: result.valid,
|
|
125
|
+
warnings: result.warnings,
|
|
126
|
+
};
|
|
127
|
+
if (!result.valid) {
|
|
128
|
+
report.hints.push(`sessions.validate returned valid=false with warnings: ${(result.warnings ?? []).join("; ")}.`);
|
|
129
|
+
}
|
|
130
|
+
else if (result.warnings && result.warnings.length > 0) {
|
|
131
|
+
report.hints.push(`sessions.validate succeeded but with warnings: ${result.warnings.join("; ")}.`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
if (err instanceof VonPayError) {
|
|
136
|
+
const help = helpFor(err.code);
|
|
137
|
+
report.validateProbe = {
|
|
138
|
+
ok: false,
|
|
139
|
+
error: {
|
|
140
|
+
code: err.code,
|
|
141
|
+
status: err.status,
|
|
142
|
+
nextAction: help.nextAction,
|
|
143
|
+
llmHint: help.llmHint,
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
report.hints.push(`sessions.validate failed: ${err.code}. ${help.llmHint}`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
report.validateProbe = {
|
|
150
|
+
ok: false,
|
|
151
|
+
error: {
|
|
152
|
+
code: "internal_error",
|
|
153
|
+
status: 0,
|
|
154
|
+
nextAction: "contact_support",
|
|
155
|
+
llmHint: err instanceof Error ? err.message : String(err),
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return report;
|
|
162
|
+
}
|
|
163
|
+
function renderHuman(r) {
|
|
164
|
+
const lines = [];
|
|
165
|
+
lines.push(chalk.bold.blue("vonpay doctor — diagnostic report"));
|
|
166
|
+
lines.push(chalk.dim(`generated ${r.generatedAt}`));
|
|
167
|
+
lines.push("");
|
|
168
|
+
lines.push(chalk.bold("Runtime"));
|
|
169
|
+
lines.push(` CLI: ${r.cli.version}`);
|
|
170
|
+
lines.push(` Node: ${r.runtime.node}`);
|
|
171
|
+
lines.push(` Platform: ${r.runtime.platform} (${r.runtime.arch})`);
|
|
172
|
+
lines.push(` CWD: ${r.runtime.cwd}`);
|
|
173
|
+
lines.push("");
|
|
174
|
+
lines.push(chalk.bold("API key"));
|
|
175
|
+
if (r.apiKeyPrefix) {
|
|
176
|
+
lines.push(` Prefix: ${r.apiKeyPrefix}`);
|
|
177
|
+
lines.push(` Mode: ${r.apiKeyMode}`);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
lines.push(chalk.dim(" (no key found in env or ~/.vonpay/config.json)"));
|
|
181
|
+
}
|
|
182
|
+
lines.push("");
|
|
183
|
+
lines.push(chalk.bold("Env vars present (names only)"));
|
|
184
|
+
if (r.envVarsPresent.length === 0) {
|
|
185
|
+
lines.push(chalk.dim(" (none of the expected vonpay env vars are set)"));
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
for (const n of r.envVarsPresent)
|
|
189
|
+
lines.push(` ✓ ${n}`);
|
|
190
|
+
}
|
|
191
|
+
lines.push("");
|
|
192
|
+
lines.push(chalk.bold("Health probe"));
|
|
193
|
+
if (r.health.reachable) {
|
|
194
|
+
const statusColor = r.health.status === "ok"
|
|
195
|
+
? chalk.green
|
|
196
|
+
: r.health.status === "degraded"
|
|
197
|
+
? chalk.yellow
|
|
198
|
+
: chalk.red;
|
|
199
|
+
lines.push(` Reachable: ${chalk.green("yes")}`);
|
|
200
|
+
lines.push(` Status: ${statusColor(r.health.status ?? "?")}`);
|
|
201
|
+
lines.push(` Latency: ${r.health.latencyMs}ms`);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
lines.push(` Reachable: ${chalk.red("no")}`);
|
|
205
|
+
lines.push(` Error: ${r.health.error}`);
|
|
206
|
+
}
|
|
207
|
+
lines.push("");
|
|
208
|
+
if (r.validateProbe) {
|
|
209
|
+
lines.push(chalk.bold("sessions.validate probe ($14.99 USD dry-run)"));
|
|
210
|
+
if (r.validateProbe.ok) {
|
|
211
|
+
lines.push(` Result: ${chalk.green("valid")}`);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
lines.push(` Result: ${chalk.red("invalid")}`);
|
|
215
|
+
if (r.validateProbe.error) {
|
|
216
|
+
lines.push(` Code: ${r.validateProbe.error.code}`);
|
|
217
|
+
lines.push(` Action: ${r.validateProbe.error.nextAction}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (r.validateProbe.warnings && r.validateProbe.warnings.length > 0) {
|
|
221
|
+
lines.push(` Warnings:`);
|
|
222
|
+
for (const w of r.validateProbe.warnings)
|
|
223
|
+
lines.push(` - ${w}`);
|
|
224
|
+
}
|
|
225
|
+
lines.push("");
|
|
226
|
+
}
|
|
227
|
+
if (r.hints.length > 0) {
|
|
228
|
+
lines.push(chalk.bold("Hints"));
|
|
229
|
+
for (const h of r.hints)
|
|
230
|
+
lines.push(` • ${h}`);
|
|
231
|
+
lines.push("");
|
|
232
|
+
}
|
|
233
|
+
return lines.join("\n");
|
|
234
|
+
}
|
|
235
|
+
function renderForLlm(r) {
|
|
236
|
+
const out = [];
|
|
237
|
+
out.push("# vonpay doctor — diagnostic report (LLM-readable)");
|
|
238
|
+
out.push("");
|
|
239
|
+
out.push("This is a structured environment + live-API diagnostic from the");
|
|
240
|
+
out.push("Von Payments CLI. An LLM agent reading this should determine the");
|
|
241
|
+
out.push("most-likely root cause of the integrator's problem and produce");
|
|
242
|
+
out.push("specific next-step instructions.");
|
|
243
|
+
out.push("");
|
|
244
|
+
out.push(`generated_at: ${r.generatedAt}`);
|
|
245
|
+
out.push("");
|
|
246
|
+
out.push("## Runtime");
|
|
247
|
+
out.push(`- vonpay-cli: ${r.cli.version}`);
|
|
248
|
+
out.push(`- node: ${r.runtime.node}`);
|
|
249
|
+
out.push(`- platform: ${r.runtime.platform} (${r.runtime.arch})`);
|
|
250
|
+
out.push("");
|
|
251
|
+
out.push("## API key");
|
|
252
|
+
if (r.apiKeyPrefix) {
|
|
253
|
+
out.push(`- prefix: \`${r.apiKeyPrefix}\` (first 4 chars of payload only — full key never printed)`);
|
|
254
|
+
out.push(`- mode: ${r.apiKeyMode}`);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
out.push("- no key found in env or `~/.vonpay/config.json`");
|
|
258
|
+
out.push("- LLM-action: ask the human to set `VON_PAY_SECRET_KEY` or run `vonpay checkout login`");
|
|
259
|
+
}
|
|
260
|
+
out.push("");
|
|
261
|
+
out.push("## Env vars present (names only — values never printed)");
|
|
262
|
+
if (r.envVarsPresent.length === 0) {
|
|
263
|
+
out.push("- (none of the expected vonpay env vars are set)");
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
for (const n of r.envVarsPresent)
|
|
267
|
+
out.push(`- \`${n}\``);
|
|
268
|
+
}
|
|
269
|
+
out.push("");
|
|
270
|
+
out.push("## Health probe");
|
|
271
|
+
out.push(`- base_url: ${r.health.baseUrl}`);
|
|
272
|
+
out.push(`- reachable: ${r.health.reachable}`);
|
|
273
|
+
if (r.health.latencyMs !== undefined) {
|
|
274
|
+
out.push(`- latency_ms: ${r.health.latencyMs}`);
|
|
275
|
+
}
|
|
276
|
+
if (r.health.status)
|
|
277
|
+
out.push(`- status: ${r.health.status}`);
|
|
278
|
+
if (r.health.error)
|
|
279
|
+
out.push(`- error: ${r.health.error}`);
|
|
280
|
+
out.push("");
|
|
281
|
+
if (r.validateProbe) {
|
|
282
|
+
out.push("## sessions.validate probe ($14.99 USD dry-run)");
|
|
283
|
+
out.push(`- ok: ${r.validateProbe.ok}`);
|
|
284
|
+
if (r.validateProbe.warnings && r.validateProbe.warnings.length > 0) {
|
|
285
|
+
out.push("- warnings:");
|
|
286
|
+
for (const w of r.validateProbe.warnings)
|
|
287
|
+
out.push(` - ${w}`);
|
|
288
|
+
}
|
|
289
|
+
if (r.validateProbe.error) {
|
|
290
|
+
out.push("- error:");
|
|
291
|
+
out.push(` - code: \`${r.validateProbe.error.code}\``);
|
|
292
|
+
out.push(` - status: ${r.validateProbe.error.status}`);
|
|
293
|
+
out.push(` - next_action: \`${r.validateProbe.error.nextAction}\``);
|
|
294
|
+
out.push(` - llm_hint: ${r.validateProbe.error.llmHint}`);
|
|
295
|
+
}
|
|
296
|
+
out.push("");
|
|
297
|
+
}
|
|
298
|
+
if (r.hints.length > 0) {
|
|
299
|
+
out.push("## Hints (in priority order)");
|
|
300
|
+
for (const h of r.hints)
|
|
301
|
+
out.push(`- ${h}`);
|
|
302
|
+
out.push("");
|
|
303
|
+
}
|
|
304
|
+
out.push("## Suggested LLM next steps");
|
|
305
|
+
out.push("1. Determine which of the three categories applies: missing-config / unreachable-api / failing-validation.");
|
|
306
|
+
out.push("2. For each hint above, propose ONE specific code or env change to the human.");
|
|
307
|
+
out.push("3. Suggest the human re-run `vonpay checkout doctor --for-llm` after applying changes and paste the new output.");
|
|
308
|
+
out.push("4. If the report shows everything healthy but the integrator still has a problem, the issue is likely in their own code (not vonpay) — ask them to share the failing call site.");
|
|
309
|
+
out.push("");
|
|
310
|
+
return out.join("\n");
|
|
311
|
+
}
|
|
312
|
+
export function doctorCommand() {
|
|
313
|
+
return new Command("doctor")
|
|
314
|
+
.description("Diagnose your Von Payments environment — runtime, env vars, live API probe; outputs human / JSON / LLM-readable formats")
|
|
315
|
+
.option("--json", "Output JSON (machine-parseable)")
|
|
316
|
+
.option("--for-llm", "Output LLM-friendly markdown (paste into Claude, ChatGPT, Cursor)")
|
|
317
|
+
.action(async (opts) => {
|
|
318
|
+
const spinner = ora({
|
|
319
|
+
text: "Running diagnostics...",
|
|
320
|
+
// suppress spinner output when emitting JSON / LLM markdown so the
|
|
321
|
+
// output remains pipeable
|
|
322
|
+
isSilent: opts.json || opts.forLlm,
|
|
323
|
+
}).start();
|
|
324
|
+
const report = await gather();
|
|
325
|
+
spinner.stop();
|
|
326
|
+
if (opts.json) {
|
|
327
|
+
console.log(JSON.stringify(report, null, 2));
|
|
328
|
+
}
|
|
329
|
+
else if (opts.forLlm) {
|
|
330
|
+
console.log(renderForLlm(report));
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
console.log(renderHuman(report));
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* Git applies patterns in order; later patterns override earlier ones. So
|
|
4
|
+
* `*.env` followed by `!.env` leaves .env un-ignored. We walk the file and
|
|
5
|
+
* track the current state, returning the final effective ignore status for
|
|
6
|
+
* a repo-root .env file.
|
|
7
|
+
*/
|
|
8
|
+
export declare function envAlreadyIgnoredFromText(gitignoreText: string): boolean;
|
|
2
9
|
export declare function initCommand(): Command;
|
|
3
10
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8CpC;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAYxE;AAMD,wBAAgB,WAAW,IAAI,OAAO,CAmErC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -6,13 +6,65 @@ import { getApiKey } from "../config.js";
|
|
|
6
6
|
function ensureGitignoreBlocksEnv() {
|
|
7
7
|
if (!existsSync(".gitignore"))
|
|
8
8
|
return "no-repo";
|
|
9
|
-
|
|
10
|
-
if (lines.some((l) => l.trim() === ".env" || l.trim() === "/.env")) {
|
|
9
|
+
if (envAlreadyIgnored(".gitignore")) {
|
|
11
10
|
return "already";
|
|
12
11
|
}
|
|
13
12
|
appendFileSync(".gitignore", "\n# Added by vonpay checkout init\n.env\n");
|
|
14
13
|
return "added";
|
|
15
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Returns true if .env (at repo root) is covered by any .gitignore rule:
|
|
17
|
+
* - literal ".env" or "/.env" — anchored match
|
|
18
|
+
* - "**\/.env" — doublestar match
|
|
19
|
+
* - ".env*" / "**\/.env*" — glob prefixes
|
|
20
|
+
* - "*.env" — suffix glob
|
|
21
|
+
*
|
|
22
|
+
* Intentionally NOT matched:
|
|
23
|
+
* - ".env/" — directory-only pattern does not protect the file, so let
|
|
24
|
+
* init append the anchored rule (safe).
|
|
25
|
+
* - Any pattern that starts with "!" — a negation explicitly un-ignores
|
|
26
|
+
* .env, which means the file is NOT protected. We return false for
|
|
27
|
+
* those lines so init adds the safety net.
|
|
28
|
+
*/
|
|
29
|
+
const POSITIVE_ENV_PATTERNS = new Set([
|
|
30
|
+
".env",
|
|
31
|
+
"/.env",
|
|
32
|
+
"**/.env",
|
|
33
|
+
"*.env",
|
|
34
|
+
"**/.env*",
|
|
35
|
+
".env*",
|
|
36
|
+
]);
|
|
37
|
+
const NEGATION_ENV_PATTERNS = new Set([
|
|
38
|
+
"!.env",
|
|
39
|
+
"!/.env",
|
|
40
|
+
"!**/.env",
|
|
41
|
+
"!*.env",
|
|
42
|
+
"!**/.env*",
|
|
43
|
+
"!.env*",
|
|
44
|
+
]);
|
|
45
|
+
/**
|
|
46
|
+
* Git applies patterns in order; later patterns override earlier ones. So
|
|
47
|
+
* `*.env` followed by `!.env` leaves .env un-ignored. We walk the file and
|
|
48
|
+
* track the current state, returning the final effective ignore status for
|
|
49
|
+
* a repo-root .env file.
|
|
50
|
+
*/
|
|
51
|
+
export function envAlreadyIgnoredFromText(gitignoreText) {
|
|
52
|
+
const lines = gitignoreText
|
|
53
|
+
.split(/\r?\n/)
|
|
54
|
+
.map((l) => l.trim())
|
|
55
|
+
.filter((l) => l && !l.startsWith("#"));
|
|
56
|
+
let ignored = false;
|
|
57
|
+
for (const p of lines) {
|
|
58
|
+
if (POSITIVE_ENV_PATTERNS.has(p))
|
|
59
|
+
ignored = true;
|
|
60
|
+
else if (NEGATION_ENV_PATTERNS.has(p))
|
|
61
|
+
ignored = false;
|
|
62
|
+
}
|
|
63
|
+
return ignored;
|
|
64
|
+
}
|
|
65
|
+
function envAlreadyIgnored(rootIgnorePath) {
|
|
66
|
+
return envAlreadyIgnoredFromText(readFileSync(rootIgnorePath, "utf-8"));
|
|
67
|
+
}
|
|
16
68
|
export function initCommand() {
|
|
17
69
|
return new Command("init")
|
|
18
70
|
.description("Initialize a project with Von Payments checkout")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,SAAS,wBAAwB;IAC/B,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.d.ts
CHANGED
|
@@ -1,3 +1,27 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
+
export type CliKeyGateVerdict = {
|
|
3
|
+
action: "prompt";
|
|
4
|
+
} | {
|
|
5
|
+
action: "refuse";
|
|
6
|
+
reason: string;
|
|
7
|
+
} | {
|
|
8
|
+
action: "save";
|
|
9
|
+
warning?: string;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Pure decision for `vonpay checkout login [key] [--confirm-cli-exposure]`.
|
|
13
|
+
*
|
|
14
|
+
* - No key on CLI → prompt interactively.
|
|
15
|
+
* - Test key on CLI → warn, save.
|
|
16
|
+
* - Live key on CLI without --confirm-cli-exposure → refuse (exit 1).
|
|
17
|
+
* - Live key on CLI with --confirm-cli-exposure → warn, save.
|
|
18
|
+
*
|
|
19
|
+
* TTY detection is intentionally NOT part of this gate — pseudo-TTYs in CI
|
|
20
|
+
* runners (CircleCI, GitHub Actions, docker --tty) make stdin/stderr.isTTY
|
|
21
|
+
* unreliable. Requiring the explicit flag is the reliable signal.
|
|
22
|
+
*/
|
|
23
|
+
export declare function evaluateCliKeyGate(key: string | undefined, opts: {
|
|
24
|
+
confirmCliExposure?: boolean;
|
|
25
|
+
}): CliKeyGateVerdict;
|
|
2
26
|
export declare function loginCommand(): Command;
|
|
3
27
|
//# sourceMappingURL=login.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GACpB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,IAAI,EAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAE,GACrC,iBAAiB,CAYnB;AAYD,wBAAgB,YAAY,IAAI,OAAO,CA0DtC"}
|
package/dist/commands/login.js
CHANGED
|
@@ -3,6 +3,30 @@ import { createInterface } from "node:readline";
|
|
|
3
3
|
import chalk from "chalk";
|
|
4
4
|
import { loadConfig, saveConfig } from "../config.js";
|
|
5
5
|
const VALID_PREFIXES = ["vp_sk_test_", "vp_sk_live_"];
|
|
6
|
+
/**
|
|
7
|
+
* Pure decision for `vonpay checkout login [key] [--confirm-cli-exposure]`.
|
|
8
|
+
*
|
|
9
|
+
* - No key on CLI → prompt interactively.
|
|
10
|
+
* - Test key on CLI → warn, save.
|
|
11
|
+
* - Live key on CLI without --confirm-cli-exposure → refuse (exit 1).
|
|
12
|
+
* - Live key on CLI with --confirm-cli-exposure → warn, save.
|
|
13
|
+
*
|
|
14
|
+
* TTY detection is intentionally NOT part of this gate — pseudo-TTYs in CI
|
|
15
|
+
* runners (CircleCI, GitHub Actions, docker --tty) make stdin/stderr.isTTY
|
|
16
|
+
* unreliable. Requiring the explicit flag is the reliable signal.
|
|
17
|
+
*/
|
|
18
|
+
export function evaluateCliKeyGate(key, opts) {
|
|
19
|
+
if (!key)
|
|
20
|
+
return { action: "prompt" };
|
|
21
|
+
const warning = "Warning: passing keys as a command argument exposes them in shell history and process-list (`ps`). Use interactive mode (`vonpay checkout login`) instead.";
|
|
22
|
+
if (key.startsWith("vp_sk_live_") && !opts.confirmCliExposure) {
|
|
23
|
+
return {
|
|
24
|
+
action: "refuse",
|
|
25
|
+
reason: "Refusing to save a live key supplied on the CLI. Re-run with --confirm-cli-exposure if this is intentional, or omit the key argument to be prompted interactively.",
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return { action: "save", warning };
|
|
29
|
+
}
|
|
6
30
|
function readLine(prompt) {
|
|
7
31
|
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
8
32
|
return new Promise((resolve) => {
|
|
@@ -16,8 +40,18 @@ export function loginCommand() {
|
|
|
16
40
|
return new Command("login")
|
|
17
41
|
.description("Store your API key for CLI access")
|
|
18
42
|
.argument("[key]", "API secret key (vp_sk_*)")
|
|
19
|
-
.
|
|
43
|
+
.option("--confirm-cli-exposure", "Acknowledge that passing a live key as a command argument exposes it to shell history and ps(1).")
|
|
44
|
+
.action(async (key, opts) => {
|
|
20
45
|
let apiKey = key;
|
|
46
|
+
const verdict = evaluateCliKeyGate(key, opts);
|
|
47
|
+
if (verdict.action === "refuse") {
|
|
48
|
+
console.warn(chalk.yellow("Warning: passing keys as a command argument exposes them in shell history and process-list (`ps`). Use interactive mode (`vonpay checkout login`) instead."));
|
|
49
|
+
console.error(chalk.red(verdict.reason));
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
if (verdict.action === "save" && verdict.warning) {
|
|
53
|
+
console.warn(chalk.yellow(verdict.warning));
|
|
54
|
+
}
|
|
21
55
|
if (!apiKey) {
|
|
22
56
|
console.log(chalk.dim("Get your API key from the Von Payments dashboard → Developers"));
|
|
23
57
|
apiKey = await readLine("API key (vp_sk_*): ");
|
|
@@ -34,9 +68,6 @@ export function loginCommand() {
|
|
|
34
68
|
config.checkout = { ...config.checkout, apiKey };
|
|
35
69
|
saveConfig(config);
|
|
36
70
|
const mode = apiKey.includes("_test_") ? "test" : "live";
|
|
37
|
-
if (key) {
|
|
38
|
-
console.warn(chalk.yellow("Warning: passing keys as a command argument exposes them in shell history and process-list (`ps`). Use interactive mode (`vonpay checkout login`) instead."));
|
|
39
|
-
}
|
|
40
71
|
console.log(chalk.green(`✓ API key saved (${mode} mode) → ~/.vonpay/config.json`));
|
|
41
72
|
});
|
|
42
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,cAAc,GAAG,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger.d.ts","sourceRoot":"","sources":["../../src/commands/trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"trigger.d.ts","sourceRoot":"","sources":["../../src/commands/trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0DpC,wBAAgB,cAAc,IAAI,OAAO,CA0ExC"}
|
package/dist/commands/trigger.js
CHANGED
|
@@ -13,22 +13,27 @@ const STATUS_BY_EVENT = {
|
|
|
13
13
|
"session.succeeded": "succeeded",
|
|
14
14
|
"session.failed": "failed",
|
|
15
15
|
"session.expired": "expired",
|
|
16
|
-
"refund.created":
|
|
16
|
+
"refund.created": "created",
|
|
17
17
|
};
|
|
18
18
|
function buildPayload(event, opts) {
|
|
19
19
|
const hasTransaction = event === "session.succeeded" || event === "refund.created";
|
|
20
|
-
|
|
20
|
+
const isRefund = event === "refund.created";
|
|
21
|
+
const payload = {
|
|
21
22
|
event,
|
|
22
23
|
sessionId: opts.sessionId ?? `session_test_${randomUUID().slice(0, 8)}`,
|
|
23
24
|
merchantId: `merchant_test_${randomUUID().slice(0, 8)}`,
|
|
24
25
|
amount: opts.amount ?? 1499,
|
|
25
26
|
currency: opts.currency ?? "USD",
|
|
26
27
|
status: STATUS_BY_EVENT[event],
|
|
27
|
-
transactionId: hasTransaction
|
|
28
|
-
? `txn_test_${randomUUID().slice(0, 8)}`
|
|
29
|
-
: undefined,
|
|
30
28
|
timestamp: new Date().toISOString(),
|
|
31
29
|
};
|
|
30
|
+
if (hasTransaction) {
|
|
31
|
+
payload.transactionId = `txn_test_${randomUUID().slice(0, 8)}`;
|
|
32
|
+
}
|
|
33
|
+
if (isRefund) {
|
|
34
|
+
payload.refundId = `re_test_${randomUUID().slice(0, 8)}`;
|
|
35
|
+
}
|
|
36
|
+
return payload;
|
|
32
37
|
}
|
|
33
38
|
export function triggerCommand() {
|
|
34
39
|
return new Command("trigger")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger.js","sourceRoot":"","sources":["../../src/commands/trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,gBAAgB,GAAG;IACvB,mBAAmB;IACnB,gBAAgB;IAChB,iBAAiB;IACjB,gBAAgB;CACR,CAAC;AAGX,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"trigger.js","sourceRoot":"","sources":["../../src/commands/trigger.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vonpay/checkout-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Von Payments CLI — developer tools for checkout integration",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
8
|
"vonpay": "dist/index.js"
|
|
9
9
|
},
|
|
10
|
-
"exports": {
|
|
11
|
-
".": "./dist/index.js"
|
|
12
|
-
},
|
|
13
10
|
"files": [
|
|
14
11
|
"dist",
|
|
15
12
|
"README.md"
|
|
@@ -21,7 +18,7 @@
|
|
|
21
18
|
"commander": "^13.0.0",
|
|
22
19
|
"chalk": "^5.4.0",
|
|
23
20
|
"ora": "^8.2.0",
|
|
24
|
-
"@vonpay/checkout-node": "0.
|
|
21
|
+
"@vonpay/checkout-node": "0.3.0"
|
|
25
22
|
},
|
|
26
23
|
"devDependencies": {
|
|
27
24
|
"typescript": "^5.7.0",
|