authflow-cli 0.1.1 → 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/LICENSE +201 -201
- package/README.md +374 -265
- package/dist/cli.js +4 -27
- package/dist/cli.js.map +1 -1
- package/dist/commands/connect.js +11 -1
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/get.d.ts +7 -0
- package/dist/commands/get.js +34 -0
- package/dist/commands/get.js.map +1 -0
- package/dist/commands/init.js +37 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.js +44 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/plan.d.ts +6 -0
- package/dist/commands/plan.js +26 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/probe.js +1 -0
- package/dist/commands/probe.js.map +1 -1
- package/dist/commands/register.js +24 -0
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/rotate-origin-key.d.ts +6 -0
- package/dist/commands/rotate-origin-key.js +56 -0
- package/dist/commands/rotate-origin-key.js.map +1 -0
- package/dist/commands/scaffold.js +31 -31
- package/dist/commands/set-connected-account.d.ts +7 -0
- package/dist/commands/set-connected-account.js +38 -0
- package/dist/commands/set-connected-account.js.map +1 -0
- package/dist/commands/set-origin.d.ts +5 -0
- package/dist/commands/set-origin.js +55 -19
- package/dist/commands/set-origin.js.map +1 -1
- package/dist/commands/status.d.ts +10 -0
- package/dist/commands/status.js +40 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/mcp/server.js +58 -7
- package/dist/mcp/server.js.map +1 -1
- package/dist/program.d.ts +6 -0
- package/dist/program.js +46 -0
- package/dist/program.js.map +1 -0
- package/dist/rail.d.ts +5 -0
- package/dist/rail.js +14 -1
- package/dist/rail.js.map +1 -1
- package/dist/status.d.ts +34 -0
- package/dist/status.js +124 -0
- package/dist/status.js.map +1 -0
- package/dist/surface.d.ts +22 -0
- package/dist/surface.js +22 -0
- package/dist/surface.js.map +1 -0
- package/package.json +56 -56
package/dist/cli.js
CHANGED
|
@@ -1,31 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { mcpCommand } from "./commands/mcp.js";
|
|
7
|
-
import { signupCommand } from "./commands/signup.js";
|
|
8
|
-
import { registerCommand } from "./commands/register.js";
|
|
9
|
-
import { setOriginCommand } from "./commands/set-origin.js";
|
|
10
|
-
import { mintHeaderCommand } from "./commands/mint-header.js";
|
|
11
|
-
import { probeCommand } from "./commands/probe.js";
|
|
12
|
-
import { scaffoldCommand } from "./commands/scaffold.js";
|
|
13
|
-
const program = new Command();
|
|
14
|
-
program
|
|
15
|
-
.name("authflow")
|
|
16
|
-
.description("Authflow Rail onboarding CLI")
|
|
17
|
-
.version("0.1.0");
|
|
18
|
-
signupCommand(program);
|
|
19
|
-
initCommand(program);
|
|
20
|
-
registerCommand(program);
|
|
21
|
-
connectCommand(program);
|
|
22
|
-
setOriginCommand(program);
|
|
23
|
-
mintHeaderCommand(program);
|
|
24
|
-
probeCommand(program);
|
|
25
|
-
doctorCommand(program);
|
|
26
|
-
scaffoldCommand(program);
|
|
27
|
-
mcpCommand(program);
|
|
28
|
-
program.parseAsync(process.argv).catch((err) => {
|
|
2
|
+
import { createProgram } from "./program.js";
|
|
3
|
+
createProgram()
|
|
4
|
+
.parseAsync(process.argv)
|
|
5
|
+
.catch((err) => {
|
|
29
6
|
const message = err instanceof Error ? err.message : String(err);
|
|
30
7
|
console.error(message);
|
|
31
8
|
process.exit(1);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,aAAa,EAAE;KACZ,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;KACxB,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/commands/connect.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { requireAdminKey, requireIssuer } from "../config.js";
|
|
2
|
-
import { describePending, startConnect } from "../rail.js";
|
|
2
|
+
import { describePending, setConnectedAccount, startConnect } from "../rail.js";
|
|
3
|
+
import { formatReadiness, resourceReadiness } from "../status.js";
|
|
3
4
|
/**
|
|
4
5
|
* Stripe onboarding, which is the one step of the flow that genuinely cannot be automated: KYC is
|
|
5
6
|
* a hosted form the creator has to fill in themselves. So the command's job is to hand over a link
|
|
@@ -11,6 +12,7 @@ export function connectCommand(program) {
|
|
|
11
12
|
.description("Start or resume Stripe Connect onboarding for a resource")
|
|
12
13
|
.requiredOption("--slug <slug>", "Resource slug")
|
|
13
14
|
.option("--email <email>", "Pre-fill the Stripe onboarding form")
|
|
15
|
+
.option("--connected-account <acct>", "Attach an existing Stripe Standard account (acct_...) instead of starting hosted onboarding")
|
|
14
16
|
.option("--issuer <url>", "Authflow issuer (default: AUTHFLOW_ISSUER)")
|
|
15
17
|
.option("--admin-key <key>", "Admin API key (default: AUTHFLOW_ADMIN_API_KEY)")
|
|
16
18
|
.option("--wait", "Poll until Stripe reports the account can take charges")
|
|
@@ -20,6 +22,14 @@ export function connectCommand(program) {
|
|
|
20
22
|
issuer: requireIssuer(opts.issuer),
|
|
21
23
|
adminKey: requireAdminKey(opts.adminKey),
|
|
22
24
|
};
|
|
25
|
+
if (opts.connectedAccount) {
|
|
26
|
+
const receipt = await setConnectedAccount(auth, opts.slug, opts.connectedAccount);
|
|
27
|
+
console.log(`Attached ${opts.connectedAccount} to ${receipt.slug ?? opts.slug}.`);
|
|
28
|
+
console.log(`status: ${receipt.status ?? "draft"}`);
|
|
29
|
+
console.log("");
|
|
30
|
+
console.log(formatReadiness(resourceReadiness(receipt)));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
23
33
|
let result = await startConnect(auth, opts.slug, opts.email);
|
|
24
34
|
if (result.charges_enabled) {
|
|
25
35
|
reportReady(result.slug, result.status, result.pending_requirements);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* Reading back a receipt without re-registering. Its absence pushed the first tenant into calling
|
|
4
|
+
* the admin API by hand to work out who owned a slug, and a plain `authflow get` is the command
|
|
5
|
+
* anyone reaches for first.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getCommand(program: Command): void;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { requireAdminKey, requireIssuer } from "../config.js";
|
|
2
|
+
import { getResource } from "../rail.js";
|
|
3
|
+
import { formatCursorMcpConfig } from "../status.js";
|
|
4
|
+
/**
|
|
5
|
+
* Reading back a receipt without re-registering. Its absence pushed the first tenant into calling
|
|
6
|
+
* the admin API by hand to work out who owned a slug, and a plain `authflow get` is the command
|
|
7
|
+
* anyone reaches for first.
|
|
8
|
+
*/
|
|
9
|
+
export function getCommand(program) {
|
|
10
|
+
program
|
|
11
|
+
.command("get")
|
|
12
|
+
.description("Fetch a resource's registration receipt")
|
|
13
|
+
.requiredOption("--slug <slug>", "Resource slug")
|
|
14
|
+
.option("--issuer <url>", "Authflow issuer (default: AUTHFLOW_ISSUER)")
|
|
15
|
+
.option("--admin-key <key>", "Admin API key (default: AUTHFLOW_ADMIN_API_KEY)")
|
|
16
|
+
.option("--json", "Emit the receipt as JSON and nothing else")
|
|
17
|
+
.action(async (opts) => {
|
|
18
|
+
const auth = { issuer: requireIssuer(opts.issuer), adminKey: requireAdminKey(opts.adminKey) };
|
|
19
|
+
const receipt = await getResource(auth, opts.slug);
|
|
20
|
+
if (opts.json) {
|
|
21
|
+
console.log(JSON.stringify(receipt, null, 2));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
console.log(JSON.stringify(receipt, null, 2));
|
|
25
|
+
const mcpConfig = formatCursorMcpConfig(receipt);
|
|
26
|
+
if (mcpConfig.length > 0) {
|
|
27
|
+
console.log("");
|
|
28
|
+
for (const line of mcpConfig) {
|
|
29
|
+
console.log(line);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/commands/get.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,yCAAyC,CAAC;SACtD,cAAc,CAAC,eAAe,EAAE,eAAe,CAAC;SAChD,MAAM,CAAC,gBAAgB,EAAE,4CAA4C,CAAC;SACtE,MAAM,CAAC,mBAAmB,EAAE,iDAAiD,CAAC;SAC9E,MAAM,CAAC,QAAQ,EAAE,2CAA2C,CAAC;SAC7D,MAAM,CAAC,KAAK,EAAE,IAA0E,EAAE,EAAE;QAC3F,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9F,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAEnD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE9C,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { writeFile } from "node:fs/promises";
|
|
2
2
|
import { apiJson, bearer, requireAdminKey, requireIssuer } from "../config.js";
|
|
3
|
-
import { describePending, startConnect } from "../rail.js";
|
|
3
|
+
import { describePending, getResource, setConnectedAccount, setOrigin, startConnect, } from "../rail.js";
|
|
4
4
|
import { originApiKeyConfigKey, secretTargets, writeOriginApiKey } from "../secrets.js";
|
|
5
|
+
import { formatCursorMcpConfig } from "../status.js";
|
|
5
6
|
/**
|
|
6
7
|
* One command from nothing to a registered, configured origin.
|
|
7
8
|
*
|
|
@@ -44,7 +45,7 @@ export function initCommand(program) {
|
|
|
44
45
|
price_amount_minor: Number(opts.price),
|
|
45
46
|
credits_per_period: Number(opts.credits),
|
|
46
47
|
};
|
|
47
|
-
const { body:
|
|
48
|
+
const { body: created, status: createStatus } = await apiJson(`${issuer}/admin/resources`, {
|
|
48
49
|
method: "POST",
|
|
49
50
|
headers: {
|
|
50
51
|
...bearer(adminKey),
|
|
@@ -52,9 +53,34 @@ export function initCommand(program) {
|
|
|
52
53
|
Accept: "application/json",
|
|
53
54
|
},
|
|
54
55
|
body: JSON.stringify(draft),
|
|
55
|
-
expectedStatuses: [201],
|
|
56
|
+
expectedStatuses: [201, 409],
|
|
56
57
|
});
|
|
57
|
-
|
|
58
|
+
let receipt;
|
|
59
|
+
let originApiKey;
|
|
60
|
+
let resumed = false;
|
|
61
|
+
if (createStatus === 409) {
|
|
62
|
+
if (created.error_code === "slug_taken") {
|
|
63
|
+
throw new Error(created.error_description ?? `Slug '${opts.slug}' is taken by another tenant.`);
|
|
64
|
+
}
|
|
65
|
+
if (created.error_code !== "slug_owned_by_caller") {
|
|
66
|
+
throw new Error(created.error_description ??
|
|
67
|
+
created.error ??
|
|
68
|
+
`Slug '${opts.slug}' is already registered.`);
|
|
69
|
+
}
|
|
70
|
+
resumed = true;
|
|
71
|
+
const auth = { issuer, adminKey };
|
|
72
|
+
receipt = (await getResource(auth, opts.slug));
|
|
73
|
+
if (opts.originUrl) {
|
|
74
|
+
receipt = (await setOrigin(auth, opts.slug, opts.originUrl));
|
|
75
|
+
}
|
|
76
|
+
if (opts.connectedAccount) {
|
|
77
|
+
receipt = (await setConnectedAccount(auth, opts.slug, opts.connectedAccount));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
receipt = created;
|
|
82
|
+
originApiKey = typeof created.origin_api_key === "string" ? created.origin_api_key : undefined;
|
|
83
|
+
}
|
|
58
84
|
let storedAt;
|
|
59
85
|
if (originApiKey) {
|
|
60
86
|
storedAt = await writeOriginApiKey({
|
|
@@ -70,7 +96,9 @@ export function initCommand(program) {
|
|
|
70
96
|
// charges_enabled, and only the receipt knows that.
|
|
71
97
|
const pending = receipt.pending_requirements ?? [];
|
|
72
98
|
const status = receipt.status ?? (pending.length === 0 ? "live" : "draft");
|
|
73
|
-
console.log(
|
|
99
|
+
console.log(resumed
|
|
100
|
+
? `Resumed ${receipt.slug} (${status}) — slug was already registered to this key.`
|
|
101
|
+
: `Registered ${receipt.slug} (${status}).`);
|
|
74
102
|
console.log(` gateway URL: ${receipt.gateway_url ?? "-"}`);
|
|
75
103
|
console.log(` receipt: ${opts.out}`);
|
|
76
104
|
if (storedAt) {
|
|
@@ -78,6 +106,10 @@ export function initCommand(program) {
|
|
|
78
106
|
}
|
|
79
107
|
console.log("");
|
|
80
108
|
printOriginConfig(opts.integration, receipt, storedAt !== undefined);
|
|
109
|
+
console.log("");
|
|
110
|
+
for (const line of formatCursorMcpConfig(receipt)) {
|
|
111
|
+
console.log(line);
|
|
112
|
+
}
|
|
81
113
|
if (opts.connect && !opts.connectedAccount) {
|
|
82
114
|
console.log("");
|
|
83
115
|
await printConnectLink(issuer, adminKey, opts.slug);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,OAAO,EAAE,MAAM,EAA4B,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACzG,OAAO,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { requireAdminKey, requireIssuer } from "../config.js";
|
|
2
|
+
import { listResources } from "../rail.js";
|
|
3
|
+
export function listCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command("list")
|
|
6
|
+
.description("List every resource this admin key owns")
|
|
7
|
+
.option("--issuer <url>", "Authflow issuer (default: AUTHFLOW_ISSUER)")
|
|
8
|
+
.option("--admin-key <key>", "Admin API key (default: AUTHFLOW_ADMIN_API_KEY)")
|
|
9
|
+
.option("--json", "Emit the list as JSON")
|
|
10
|
+
.action(async (opts) => {
|
|
11
|
+
const auth = { issuer: requireIssuer(opts.issuer), adminKey: requireAdminKey(opts.adminKey) };
|
|
12
|
+
const resources = await listResources(auth);
|
|
13
|
+
if (opts.json) {
|
|
14
|
+
console.log(JSON.stringify(resources, null, 2));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (resources.length === 0) {
|
|
18
|
+
console.log("No resources registered with this admin key.");
|
|
19
|
+
console.log("");
|
|
20
|
+
console.log("If you expected one here, you are probably using a different tenant's key or");
|
|
21
|
+
console.log("a different environment. Check AUTHFLOW_ISSUER and AUTHFLOW_ADMIN_API_KEY.");
|
|
22
|
+
console.log("");
|
|
23
|
+
console.log("Register one: authflow init --slug <slug>");
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const slugWidth = Math.max(4, ...resources.map((r) => (r.slug ?? "").length));
|
|
27
|
+
const statusWidth = Math.max(6, ...resources.map((r) => (r.status ?? "").length));
|
|
28
|
+
console.log(`${pad("SLUG", slugWidth)} ${pad("STATUS", statusWidth)} GATEWAY URL`);
|
|
29
|
+
for (const resource of resources) {
|
|
30
|
+
const gateway = resource.gateway_url ?? resource.resource ?? "-";
|
|
31
|
+
console.log(`${pad(resource.slug ?? "-", slugWidth)} ${pad(resource.status ?? "-", statusWidth)} ${gateway}`);
|
|
32
|
+
const pending = resource.pending_requirements ?? [];
|
|
33
|
+
if (pending.length > 0) {
|
|
34
|
+
console.log(`${"".padEnd(slugWidth)} ${"".padEnd(statusWidth)} pending: ${pending.join(", ")}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
console.log("");
|
|
38
|
+
console.log("Full state for one resource: authflow status --slug <slug>");
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function pad(value, width) {
|
|
42
|
+
return value.length >= width ? value : value + " ".repeat(width - value.length);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* CLI twin of `authflow_integration_plan`. The MCP tool is how an agent usually gets this; the
|
|
4
|
+
* command exists so the two surfaces stay the same size.
|
|
5
|
+
*/
|
|
6
|
+
export declare function planCommand(program: Command): void;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { requireAdminKey, requireIssuer } from "../config.js";
|
|
2
|
+
import { buildIntegrationPlan, integrationFrameworks, isIntegrationFramework, } from "../integration.js";
|
|
3
|
+
import { getResource } from "../rail.js";
|
|
4
|
+
/**
|
|
5
|
+
* CLI twin of `authflow_integration_plan`. The MCP tool is how an agent usually gets this; the
|
|
6
|
+
* command exists so the two surfaces stay the same size.
|
|
7
|
+
*/
|
|
8
|
+
export function planCommand(program) {
|
|
9
|
+
program
|
|
10
|
+
.command("plan")
|
|
11
|
+
.description("Print the framework-specific origin integration plan for a resource")
|
|
12
|
+
.requiredOption("--slug <slug>", "Resource slug")
|
|
13
|
+
.requiredOption("--framework <kind>", `Origin implementation (${integrationFrameworks.join(" | ")})`)
|
|
14
|
+
.option("--issuer <url>", "Authflow issuer (default: AUTHFLOW_ISSUER)")
|
|
15
|
+
.option("--admin-key <key>", "Admin API key (default: AUTHFLOW_ADMIN_API_KEY)")
|
|
16
|
+
.action(async (opts) => {
|
|
17
|
+
if (!isIntegrationFramework(opts.framework)) {
|
|
18
|
+
throw new Error(`--framework must be one of: ${integrationFrameworks.join(", ")}. Got '${opts.framework}'.`);
|
|
19
|
+
}
|
|
20
|
+
const auth = { issuer: requireIssuer(opts.issuer), adminKey: requireAdminKey(opts.adminKey) };
|
|
21
|
+
const receipt = await getResource(auth, opts.slug);
|
|
22
|
+
const plan = buildIntegrationPlan(opts.framework, receipt);
|
|
23
|
+
console.log(JSON.stringify(plan, null, 2));
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qEAAqE,CAAC;SAClF,cAAc,CAAC,eAAe,EAAE,eAAe,CAAC;SAChD,cAAc,CACb,oBAAoB,EACpB,0BAA0B,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAC/D;SACA,MAAM,CAAC,gBAAgB,EAAE,4CAA4C,CAAC;SACtE,MAAM,CAAC,mBAAmB,EAAE,iDAAiD,CAAC;SAC9E,MAAM,CAAC,KAAK,EAAE,IAA6E,EAAE,EAAE;QAC9F,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,+BAA+B,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,IAAI,CAC5F,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9F,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/commands/probe.js
CHANGED
|
@@ -3,6 +3,7 @@ export function probeCommand(program) {
|
|
|
3
3
|
program
|
|
4
4
|
.command("probe")
|
|
5
5
|
.description("POST /origin/v1/conformance and print a pass/fail table")
|
|
6
|
+
.option("--slug <slug>", "Ignored: the origin API key is already bound to one resource. Accepted so documented invocations do not fail.")
|
|
6
7
|
.option("--issuer <url>", "Authflow issuer (default: AUTHFLOW_ISSUER)")
|
|
7
8
|
.option("--origin-key <key>", "Origin API key (default: AUTHFLOW_ORIGIN_API_KEY)")
|
|
8
9
|
.action(async (opts) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/commands/probe.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAgBhF,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,gBAAgB,EAAE,4CAA4C,CAAC;SACtE,MAAM,CAAC,oBAAoB,EAAE,mDAAmD,CAAC;SACjF,MAAM,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/commands/probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { readFile, writeFile } from "node:fs/promises";
|
|
2
2
|
import { apiJson, bearer, requireAdminKey, requireIssuer } from "../config.js";
|
|
3
3
|
import { secretTargets, writeOriginApiKey } from "../secrets.js";
|
|
4
|
+
import { formatCursorMcpConfig, formatReadiness, resourceReadiness } from "../status.js";
|
|
4
5
|
export function registerCommand(program) {
|
|
5
6
|
program
|
|
6
7
|
.command("register")
|
|
@@ -11,6 +12,7 @@ export function registerCommand(program) {
|
|
|
11
12
|
.option("-o, --out <path>", "Receipt output path", "receipt.json")
|
|
12
13
|
.option("--write-secrets <target>", `Store the origin API key and redact it from the receipt (${secretTargets.join(" | ")})`)
|
|
13
14
|
.option("--secret-destination <value>", "user-secrets: project dir (default .) · env-file: path (default .env.local) · keyvault: vault name")
|
|
15
|
+
.option("--keep-secret-in-receipt", "Leave the origin API key in the receipt file as plaintext (not recommended)")
|
|
14
16
|
.action(async (opts) => {
|
|
15
17
|
const issuer = requireIssuer(opts.issuer);
|
|
16
18
|
const adminKey = requireAdminKey(opts.adminKey);
|
|
@@ -45,6 +47,12 @@ export function registerCommand(program) {
|
|
|
45
47
|
});
|
|
46
48
|
body.origin_api_key = `<stored in ${storedAt}>`;
|
|
47
49
|
}
|
|
50
|
+
else if (originApiKey && !opts.keepSecretInReceipt) {
|
|
51
|
+
// Redacted by default. The receipt is a file people commit, paste into issues, and hand to
|
|
52
|
+
// an agent, and the key it carried was a live bearer credential for the usage endpoint. It
|
|
53
|
+
// is printed below instead, so nothing is lost by keeping it out of the file.
|
|
54
|
+
body.origin_api_key = "<not written to the receipt — see terminal output>";
|
|
55
|
+
}
|
|
48
56
|
await writeFile(opts.out, `${JSON.stringify(body, null, 2)}\n`, "utf8");
|
|
49
57
|
console.log(`Registered (${status}). Receipt written to ${opts.out}`);
|
|
50
58
|
if (typeof body.slug === "string") {
|
|
@@ -59,10 +67,26 @@ export function registerCommand(program) {
|
|
|
59
67
|
if (storedAt) {
|
|
60
68
|
console.log(` origin_api_key: stored in ${storedAt} (redacted from the receipt)`);
|
|
61
69
|
}
|
|
70
|
+
else if (originApiKey && !opts.keepSecretInReceipt) {
|
|
71
|
+
console.log(` origin_api_key: ${originApiKey} (shown once — store it now)`);
|
|
72
|
+
console.log(" Kept out of the receipt file. Use --write-secrets to store it automatically.");
|
|
73
|
+
}
|
|
62
74
|
else if (originApiKey) {
|
|
63
75
|
console.log(` origin_api_key: ${originApiKey} (store now — shown once)`);
|
|
64
76
|
console.log(` Note: ${opts.out} now holds a plaintext credential. Re-run with --write-secrets to avoid that.`);
|
|
65
77
|
}
|
|
78
|
+
const receipt = body;
|
|
79
|
+
console.log("");
|
|
80
|
+
for (const line of formatCursorMcpConfig(receipt)) {
|
|
81
|
+
console.log(line);
|
|
82
|
+
}
|
|
83
|
+
// A registered resource is not a reachable one, and the difference is invisible from the
|
|
84
|
+
// gateway: both answer with an error. Say so here rather than let it be discovered later.
|
|
85
|
+
const readiness = resourceReadiness(receipt);
|
|
86
|
+
if (!readiness.ready) {
|
|
87
|
+
console.log("");
|
|
88
|
+
console.log(formatReadiness(readiness));
|
|
89
|
+
}
|
|
66
90
|
});
|
|
67
91
|
}
|
|
68
92
|
function parseTarget(raw) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* The recovery path for a lost origin API key. It existed as an MCP tool but not as a command, so a
|
|
4
|
+
* creator who lost the key — it is shown once — had no way back without an agent in the loop.
|
|
5
|
+
*/
|
|
6
|
+
export declare function rotateOriginKeyCommand(program: Command): void;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { requireAdminKey, requireIssuer } from "../config.js";
|
|
2
|
+
import { rotateOriginKey } from "../rail.js";
|
|
3
|
+
import { secretTargets, writeOriginApiKey } from "../secrets.js";
|
|
4
|
+
/**
|
|
5
|
+
* The recovery path for a lost origin API key. It existed as an MCP tool but not as a command, so a
|
|
6
|
+
* creator who lost the key — it is shown once — had no way back without an agent in the loop.
|
|
7
|
+
*/
|
|
8
|
+
export function rotateOriginKeyCommand(program) {
|
|
9
|
+
program
|
|
10
|
+
.command("rotate-origin-key")
|
|
11
|
+
.description("Issue a new origin API key and immediately invalidate the previous one")
|
|
12
|
+
.requiredOption("--slug <slug>", "Resource slug")
|
|
13
|
+
.option("--issuer <url>", "Authflow issuer (default: AUTHFLOW_ISSUER)")
|
|
14
|
+
.option("--admin-key <key>", "Admin API key (default: AUTHFLOW_ADMIN_API_KEY)")
|
|
15
|
+
.option("--write-secrets <target>", `Store the new key (${secretTargets.join(" | ")})`)
|
|
16
|
+
.option("--secret-destination <value>", "Project dir, env-file path, or Key Vault name")
|
|
17
|
+
.action(async (opts) => {
|
|
18
|
+
const auth = {
|
|
19
|
+
issuer: requireIssuer(opts.issuer),
|
|
20
|
+
adminKey: requireAdminKey(opts.adminKey),
|
|
21
|
+
};
|
|
22
|
+
const target = parseTarget(opts.writeSecrets);
|
|
23
|
+
const receipt = await rotateOriginKey(auth, opts.slug);
|
|
24
|
+
const key = receipt.origin_api_key;
|
|
25
|
+
if (!key) {
|
|
26
|
+
throw new Error("The rail did not return a new origin API key.");
|
|
27
|
+
}
|
|
28
|
+
if (target) {
|
|
29
|
+
const storedAt = await writeOriginApiKey({
|
|
30
|
+
target,
|
|
31
|
+
value: key,
|
|
32
|
+
destination: opts.secretDestination,
|
|
33
|
+
});
|
|
34
|
+
console.log(`Rotated ${opts.slug}. New key stored in ${storedAt}.`);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
console.log(`Rotated ${opts.slug}. New origin API key (shown once):`);
|
|
38
|
+
console.log("");
|
|
39
|
+
console.log(` ${key}`);
|
|
40
|
+
}
|
|
41
|
+
console.log("");
|
|
42
|
+
console.log("The previous key stopped working the moment this returned. Update the origin's");
|
|
43
|
+
console.log("secret store now, or its usage reports and probes will fail.");
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function parseTarget(raw) {
|
|
47
|
+
if (raw === undefined) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
const value = raw.trim();
|
|
51
|
+
if (!secretTargets.includes(value)) {
|
|
52
|
+
throw new Error(`--write-secrets must be one of: ${secretTargets.join(", ")}`);
|
|
53
|
+
}
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=rotate-origin-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rotate-origin-key.js","sourceRoot":"","sources":["../../src/commands/rotate-origin-key.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAqB,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEpF;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,wEAAwE,CAAC;SACrF,cAAc,CAAC,eAAe,EAAE,eAAe,CAAC;SAChD,MAAM,CAAC,gBAAgB,EAAE,4CAA4C,CAAC;SACtE,MAAM,CAAC,mBAAmB,EAAE,iDAAiD,CAAC;SAC9E,MAAM,CAAC,0BAA0B,EAAE,sBAAsB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;SACtF,MAAM,CAAC,8BAA8B,EAAE,+CAA+C,CAAC;SACvF,MAAM,CACL,KAAK,EAAE,IAMN,EAAE,EAAE;QACH,MAAM,IAAI,GAAG;YACX,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;YAClC,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;SACzC,CAAC;QAEF,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC;QAEnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC;gBACvC,MAAM;gBACN,KAAK,EAAE,GAAG;gBACV,WAAW,EAAE,IAAI,CAAC,iBAAiB;aACpC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,uBAAuB,QAAQ,GAAG,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,oCAAoC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC9E,CAAC,CACF,CAAC;AACN,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAkB,CAAC;IACzC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -26,37 +26,37 @@ export function scaffoldCommand(program) {
|
|
|
26
26
|
"",
|
|
27
27
|
];
|
|
28
28
|
await writeFile(opts.envOut, envLines.join("\n"), "utf8");
|
|
29
|
-
const compose = `# Generated by authflow scaffold from ${opts.receipt}
|
|
30
|
-
# Put authflow-origin-proxy in front of your MCP upstream.
|
|
31
|
-
# Build the image from the Authflow.Rail repo:
|
|
32
|
-
# docker build -f src/Rail.OriginProxy/Dockerfile -t authflow-origin-proxy .
|
|
33
|
-
#
|
|
34
|
-
# Replay protection is process-local until you set Authflow__NonceCacheRedis.
|
|
35
|
-
# Set it before raising replicas above 1.
|
|
36
|
-
# See docs/onboarding/origin-proxy.md
|
|
37
|
-
|
|
38
|
-
services:
|
|
39
|
-
authflow-origin-proxy:
|
|
40
|
-
image: authflow-origin-proxy
|
|
41
|
-
ports:
|
|
42
|
-
- "${opts.proxyPort}:8080"
|
|
43
|
-
environment:
|
|
44
|
-
Authflow__Issuer: \${AUTHFLOW_ISSUER}
|
|
45
|
-
Authflow__Resource: \${AUTHFLOW_RESOURCE}
|
|
46
|
-
Authflow__UpstreamBaseUri: \${AUTHFLOW_UPSTREAM_BASE_URI}
|
|
47
|
-
# Authflow__NonceCacheRedis: \${AUTHFLOW_NONCE_CACHE_REDIS}
|
|
48
|
-
env_file:
|
|
49
|
-
- ${opts.envOut}
|
|
50
|
-
# Safe to raise once Authflow__NonceCacheRedis is set.
|
|
51
|
-
deploy:
|
|
52
|
-
replicas: 1
|
|
53
|
-
|
|
54
|
-
# Replace with your MCP origin, or point Authflow__UpstreamBaseUri at an
|
|
55
|
-
# existing host and drop this service.
|
|
56
|
-
upstream:
|
|
57
|
-
image: your-mcp-origin:latest
|
|
58
|
-
expose:
|
|
59
|
-
- "3000"
|
|
29
|
+
const compose = `# Generated by authflow scaffold from ${opts.receipt}
|
|
30
|
+
# Put authflow-origin-proxy in front of your MCP upstream.
|
|
31
|
+
# Build the image from the Authflow.Rail repo:
|
|
32
|
+
# docker build -f src/Rail.OriginProxy/Dockerfile -t authflow-origin-proxy .
|
|
33
|
+
#
|
|
34
|
+
# Replay protection is process-local until you set Authflow__NonceCacheRedis.
|
|
35
|
+
# Set it before raising replicas above 1.
|
|
36
|
+
# See docs/onboarding/origin-proxy.md
|
|
37
|
+
|
|
38
|
+
services:
|
|
39
|
+
authflow-origin-proxy:
|
|
40
|
+
image: authflow-origin-proxy
|
|
41
|
+
ports:
|
|
42
|
+
- "${opts.proxyPort}:8080"
|
|
43
|
+
environment:
|
|
44
|
+
Authflow__Issuer: \${AUTHFLOW_ISSUER}
|
|
45
|
+
Authflow__Resource: \${AUTHFLOW_RESOURCE}
|
|
46
|
+
Authflow__UpstreamBaseUri: \${AUTHFLOW_UPSTREAM_BASE_URI}
|
|
47
|
+
# Authflow__NonceCacheRedis: \${AUTHFLOW_NONCE_CACHE_REDIS}
|
|
48
|
+
env_file:
|
|
49
|
+
- ${opts.envOut}
|
|
50
|
+
# Safe to raise once Authflow__NonceCacheRedis is set.
|
|
51
|
+
deploy:
|
|
52
|
+
replicas: 1
|
|
53
|
+
|
|
54
|
+
# Replace with your MCP origin, or point Authflow__UpstreamBaseUri at an
|
|
55
|
+
# existing host and drop this service.
|
|
56
|
+
upstream:
|
|
57
|
+
image: your-mcp-origin:latest
|
|
58
|
+
expose:
|
|
59
|
+
- "3000"
|
|
60
60
|
`;
|
|
61
61
|
await writeFile(opts.composeOut, compose, "utf8");
|
|
62
62
|
console.log(`Wrote ${opts.envOut}`);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* The path for a creator who already has a Stripe Standard account on the platform. Hosted
|
|
4
|
+
* `connect` cannot take an acct_ id; this is the CLI verb that matches the HTTP PUT and the
|
|
5
|
+
* `authflow_set_connected_account` MCP tool.
|
|
6
|
+
*/
|
|
7
|
+
export declare function setConnectedAccountCommand(program: Command): void;
|