@beignet/cli 0.0.13 → 0.0.14

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/mcp.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA2BpE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AA6MF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CA2G1E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3E"}
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4BpE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AA0NF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CA2G1E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3E"}
package/dist/mcp.js CHANGED
@@ -4,7 +4,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
4
4
  import { z } from "zod";
5
5
  import { applyDoctorFixes, inspectApp } from "./inspect.js";
6
6
  import { lintApp } from "./lint.js";
7
- import { makeAdapter, makeContract, makeEvent, makeFactory, makeFeature, makeFeatureAddonChoices, makeJob, makeListener, makeNotification, makePolicy, makePort, makeResource, makeSchedule, makeSeed, makeTask, makeTest, makeUpload, makeUseCase, } from "./make.js";
7
+ import { makeAdapter, makeContract, makeEvent, makeFactory, makeFeature, makeFeatureAddonChoices, makeJob, makeListener, makeNotification, makePayments, makePolicy, makePort, makeResource, makeSchedule, makeSeed, makeTask, makeTest, makeUpload, makeUseCase, } from "./make.js";
8
8
  const makeArtifactChoices = [
9
9
  "adapter",
10
10
  "contract",
@@ -14,6 +14,7 @@ const makeArtifactChoices = [
14
14
  "job",
15
15
  "listener",
16
16
  "notification",
17
+ "payments",
17
18
  "policy",
18
19
  "port",
19
20
  "resource",
@@ -30,7 +31,8 @@ const makeInputSchema = {
30
31
  .describe("Kind of artifact to generate."),
31
32
  name: z
32
33
  .string()
33
- .describe("Artifact name. Feature-owned artifacts use feature-scoped paths such as posts/backfill."),
34
+ .optional()
35
+ .describe("Artifact name. Required except for payments. Feature-owned artifacts use feature-scoped paths such as posts/backfill."),
34
36
  with: z
35
37
  .array(z.enum(makeFeatureAddonChoices))
36
38
  .optional()
@@ -101,6 +103,16 @@ async function safeToolResult(run) {
101
103
  }
102
104
  }
103
105
  async function runMakeTool(cwd, input) {
106
+ if (input.artifact === "payments") {
107
+ return makePayments({
108
+ cwd,
109
+ force: input.force,
110
+ dryRun: input.dryRun,
111
+ });
112
+ }
113
+ if (!input.name) {
114
+ throw new Error(`make ${input.artifact} requires a name.`);
115
+ }
104
116
  const base = {
105
117
  name: input.name,
106
118
  cwd,
package/dist/mcp.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beignet/cli",
3
- "version": "0.0.13",
3
+ "version": "0.0.14",
4
4
  "type": "module",
5
5
  "description": "CLI for creating and maintaining Beignet apps.",
6
6
  "main": "./dist/lib.js",
@@ -66,7 +66,7 @@
66
66
  "typescript": "^5.3.0"
67
67
  },
68
68
  "dependencies": {
69
- "@beignet/core": "^0.0.13",
69
+ "@beignet/core": "^0.0.14",
70
70
  "@clack/prompts": "^1.5.1",
71
71
  "@modelcontextprotocol/sdk": "^1.29.0",
72
72
  "@stricli/core": "^1.2.7",
package/src/index.ts CHANGED
@@ -1058,6 +1058,31 @@ const makeScheduleCommand = buildCommand<
1058
1058
  },
1059
1059
  });
1060
1060
 
1061
+ const makePaymentsCommand = buildCommand<MakeFlags, [], CliContext>({
1062
+ docs: {
1063
+ brief: "Generate a payments-backed billing slice.",
1064
+ },
1065
+ parameters: {
1066
+ flags: makeFlagParameters,
1067
+ },
1068
+ loader: async () => {
1069
+ const { makePayments } = await import("./make.js");
1070
+
1071
+ return async function runMakePayments(this: CliContext, flags: MakeFlags) {
1072
+ const result = await makePayments({
1073
+ force: Boolean(flags.force),
1074
+ dryRun: Boolean(flags.dryRun),
1075
+ });
1076
+ writeOutput(
1077
+ this,
1078
+ flags.json
1079
+ ? JSON.stringify(result, null, 2)
1080
+ : makePaymentsNextSteps(result),
1081
+ );
1082
+ };
1083
+ },
1084
+ });
1085
+
1061
1086
  const makeRoutes = buildRouteMap({
1062
1087
  docs: {
1063
1088
  brief: "Generate Beignet app files.",
@@ -1094,6 +1119,7 @@ const makeRoutes = buildRouteMap({
1094
1119
  "Generate a feature notification.",
1095
1120
  makeNotificationNextSteps,
1096
1121
  ),
1122
+ payments: makePaymentsCommand,
1097
1123
  listener: makeListenerCommand,
1098
1124
  policy: simpleMakeCommand(
1099
1125
  "makePolicy",
@@ -1512,6 +1538,15 @@ function makeNotificationNextSteps(result: MakeNextStepsResult): string {
1512
1538
  ]);
1513
1539
  }
1514
1540
 
1541
+ function makePaymentsNextSteps(result: MakeNextStepsResult): string {
1542
+ return makeNextSteps(result, "billing slice", [
1543
+ "Set BILLING_TEAM_PRICE_ID in .env.local to the provider price ID for your team plan.",
1544
+ "Run beignet db generate and beignet db migrate so billing_accounts exists before handling webhooks.",
1545
+ "Use createMemoryPaymentsProvider() for local development, then swap server/providers.ts to stripePaymentsProvider when STRIPE_SECRET_KEY and STRIPE_WEBHOOK_SECRET are configured.",
1546
+ "Run your app's test, lint, and typecheck commands, then beignet lint and beignet doctor.",
1547
+ ]);
1548
+ }
1549
+
1515
1550
  function makeListenerNextSteps(result: MakeNextStepsResult): string {
1516
1551
  return makeNextSteps(result, "listener", [
1517
1552
  "Replace the starter handler with the event reaction.",
package/src/inspect.ts CHANGED
@@ -1975,6 +1975,30 @@ async function inspectProductionReadiness(
1975
1975
  config,
1976
1976
  sourceCache,
1977
1977
  );
1978
+ const stripeMemoryProviderMismatch = await hasStripeMemoryProviderMismatch(
1979
+ targetDir,
1980
+ sourceCache,
1981
+ configFiles,
1982
+ installedPackages,
1983
+ providerEntries,
1984
+ );
1985
+
1986
+ diagnostics.push(
1987
+ ...(await inspectEntitlementsProductionReadiness(
1988
+ targetDir,
1989
+ files,
1990
+ config,
1991
+ sourceCache,
1992
+ )),
1993
+ ...(await inspectPaymentsProductionReadiness(
1994
+ targetDir,
1995
+ files,
1996
+ config,
1997
+ sourceCache,
1998
+ installedPackages,
1999
+ stripeMemoryProviderMismatch,
2000
+ )),
2001
+ );
1978
2002
 
1979
2003
  for (const provider of providerDoctorRules) {
1980
2004
  if (!installedPackages.has(provider.packageName)) continue;
@@ -2048,6 +2072,184 @@ async function inspectProductionReadiness(
2048
2072
  return diagnostics;
2049
2073
  }
2050
2074
 
2075
+ async function inspectEntitlementsProductionReadiness(
2076
+ targetDir: string,
2077
+ files: string[],
2078
+ config: ResolvedBeignetConfig,
2079
+ sourceCache: Map<string, string>,
2080
+ ): Promise<InspectDiagnostic[]> {
2081
+ if (
2082
+ !(await usesEntitlementChecks(targetDir, files, sourceCache)) ||
2083
+ (await appPortsIncludesPort(
2084
+ targetDir,
2085
+ files,
2086
+ config,
2087
+ sourceCache,
2088
+ "entitlements",
2089
+ ))
2090
+ ) {
2091
+ return [];
2092
+ }
2093
+
2094
+ return [
2095
+ {
2096
+ severity: "warning",
2097
+ code: "BEIGNET_ENTITLEMENTS_PORT_MISSING",
2098
+ file: config.paths.ports,
2099
+ message:
2100
+ "This app checks entitlements, but AppPorts does not declare an entitlements port. Add entitlements: EntitlementsPort; and wire a provider-backed entitlement resolver before deploying paid feature gates.",
2101
+ },
2102
+ ];
2103
+ }
2104
+
2105
+ async function inspectPaymentsProductionReadiness(
2106
+ targetDir: string,
2107
+ files: string[],
2108
+ config: ResolvedBeignetConfig,
2109
+ sourceCache: Map<string, string>,
2110
+ installedPackages: Set<string>,
2111
+ stripeMemoryProviderMismatch: boolean,
2112
+ ): Promise<InspectDiagnostic[]> {
2113
+ if (
2114
+ !(
2115
+ hasBillingOrPaymentsFeature(files, config) ||
2116
+ installedPackages.has("@beignet/provider-payments-stripe")
2117
+ )
2118
+ ) {
2119
+ return [];
2120
+ }
2121
+
2122
+ const diagnostics: InspectDiagnostic[] = [];
2123
+
2124
+ if (stripeMemoryProviderMismatch) {
2125
+ diagnostics.push({
2126
+ severity: "warning",
2127
+ code: "BEIGNET_PAYMENTS_STRIPE_MEMORY_PROVIDER",
2128
+ file: serverProviderFiles(files, config)[0] ?? config.paths.server,
2129
+ message:
2130
+ "@beignet/provider-payments-stripe is installed and Stripe env/config is present, but server/providers.ts still registers memory payments. Register stripePaymentsProvider before deploying Stripe-backed billing, or remove the Stripe provider/config until the app is ready to switch.",
2131
+ });
2132
+ }
2133
+
2134
+ if (!(await hasPaymentWebhookRoute(targetDir, files, config, sourceCache))) {
2135
+ diagnostics.push({
2136
+ severity: "warning",
2137
+ code: "BEIGNET_PAYMENTS_WEBHOOK_ROUTE_MISSING",
2138
+ file: directoryPath(config.paths.routes),
2139
+ message:
2140
+ "This app appears to use payments, but no route calls createPaymentWebhookRoute(...). Expose payment webhooks under app/api/webhooks/payments/route.ts or an equivalent configured route so provider events can update billing state.",
2141
+ });
2142
+ }
2143
+
2144
+ const billingContractsFile = `${directoryPath(config.paths.features)}/billing/contracts.ts`;
2145
+ if (files.includes(billingContractsFile)) {
2146
+ const source = await readCachedSource(
2147
+ targetDir,
2148
+ billingContractsFile,
2149
+ sourceCache,
2150
+ );
2151
+ const checkoutContract = exportedConstInitializer(
2152
+ source,
2153
+ "createCheckoutSession",
2154
+ );
2155
+ if (
2156
+ checkoutContract &&
2157
+ !(
2158
+ /\bidempotency\s*:/.test(checkoutContract) &&
2159
+ /["']idempotency-key["']/.test(checkoutContract)
2160
+ )
2161
+ ) {
2162
+ diagnostics.push({
2163
+ severity: "warning",
2164
+ code: "BEIGNET_BILLING_CHECKOUT_IDEMPOTENCY_MISSING",
2165
+ file: billingContractsFile,
2166
+ contract: "createCheckoutSession",
2167
+ message:
2168
+ "The billing checkout contract appears to create payment sessions without idempotency metadata and an idempotency-key header. Mark checkout as idempotent so retries do not create duplicate payment sessions.",
2169
+ });
2170
+ }
2171
+ }
2172
+
2173
+ const billingUseCasesFile = `${directoryPath(config.paths.features)}/billing/use-cases/index.ts`;
2174
+ if (files.includes(billingUseCasesFile)) {
2175
+ const source = await readCachedSource(
2176
+ targetDir,
2177
+ billingUseCasesFile,
2178
+ sourceCache,
2179
+ );
2180
+ if (
2181
+ /\bctx\.ports\.idempotency\b/.test(source) &&
2182
+ !(await appPortsIncludesIdempotency(
2183
+ targetDir,
2184
+ files,
2185
+ config,
2186
+ sourceCache,
2187
+ ))
2188
+ ) {
2189
+ diagnostics.push({
2190
+ severity: "warning",
2191
+ code: "BEIGNET_BILLING_IDEMPOTENCY_PORT_MISSING",
2192
+ file: config.paths.ports,
2193
+ message:
2194
+ "Billing use cases reference ctx.ports.idempotency, but AppPorts does not declare an idempotency port. Add idempotency to AppPorts and provider wiring, or remove the stale billing workflow dependency.",
2195
+ });
2196
+ }
2197
+ }
2198
+
2199
+ const billingEntitlementsFile = `${directoryPath(config.paths.features)}/billing/entitlements.ts`;
2200
+ if (
2201
+ files.includes(billingEntitlementsFile) &&
2202
+ !(await hasBillingEntitlementsProviderWiring(
2203
+ targetDir,
2204
+ files,
2205
+ config,
2206
+ sourceCache,
2207
+ ))
2208
+ ) {
2209
+ diagnostics.push({
2210
+ severity: "warning",
2211
+ code: "BEIGNET_BILLING_ENTITLEMENTS_PROVIDER_MISSING",
2212
+ file: path.dirname(config.paths.infrastructurePorts),
2213
+ message:
2214
+ "features/billing/entitlements.ts exists, but no infra or server provider appears to call createBillingEntitlements(...). Wire the billing-backed entitlements port into AppPorts so paid feature gates use app billing state.",
2215
+ });
2216
+ }
2217
+
2218
+ return diagnostics;
2219
+ }
2220
+
2221
+ async function hasStripeMemoryProviderMismatch(
2222
+ targetDir: string,
2223
+ sourceCache: Map<string, string>,
2224
+ configFiles: string[],
2225
+ installedPackages: Set<string>,
2226
+ providerEntries: string[],
2227
+ ): Promise<boolean> {
2228
+ if (!installedPackages.has("@beignet/provider-payments-stripe")) {
2229
+ return false;
2230
+ }
2231
+ if (
2232
+ findProviderEntryIndex(providerEntries, ["stripePaymentsProvider"]) >= 0
2233
+ ) {
2234
+ return false;
2235
+ }
2236
+ if (
2237
+ findProviderEntryIndex(providerEntries, [
2238
+ "createMemoryPaymentsProvider",
2239
+ "createMemoryPayments",
2240
+ ]) < 0
2241
+ ) {
2242
+ return false;
2243
+ }
2244
+
2245
+ return anyFileMatches(
2246
+ targetDir,
2247
+ configFiles,
2248
+ /\bSTRIPE_(?:SECRET_KEY|WEBHOOK_SECRET)\b/,
2249
+ sourceCache,
2250
+ );
2251
+ }
2252
+
2051
2253
  // Local-dev ranges such as the generated-app conformance vendoring point each
2052
2254
  // @beignet/* package at a different path on purpose, so they are exempt from
2053
2255
  // the declared-range comparison. Their installed versions still participate in
@@ -2200,9 +2402,22 @@ async function inspectProviderRegistrationDrift(
2200
2402
  config,
2201
2403
  sourceCache,
2202
2404
  );
2405
+ const stripeMemoryProviderMismatch = await hasStripeMemoryProviderMismatch(
2406
+ targetDir,
2407
+ sourceCache,
2408
+ operationalConfigFiles(files, config),
2409
+ installedPackages,
2410
+ providerEntries,
2411
+ );
2203
2412
 
2204
2413
  for (const provider of providerDoctorRules) {
2205
2414
  if (!installedPackages.has(provider.packageName)) continue;
2415
+ if (
2416
+ provider.packageName === "@beignet/provider-payments-stripe" &&
2417
+ stripeMemoryProviderMismatch
2418
+ ) {
2419
+ continue;
2420
+ }
2206
2421
 
2207
2422
  if (provider.variants !== undefined) {
2208
2423
  if (
@@ -2641,6 +2856,152 @@ function hasBetterAuthRoute(
2641
2856
  );
2642
2857
  }
2643
2858
 
2859
+ function hasBillingOrPaymentsFeature(
2860
+ files: string[],
2861
+ config: ResolvedBeignetConfig,
2862
+ ): boolean {
2863
+ const featuresPath = directoryPath(config.paths.features);
2864
+ return files.some(
2865
+ (file) =>
2866
+ file.startsWith(`${featuresPath}/billing/`) ||
2867
+ file.startsWith(`${featuresPath}/payments/`),
2868
+ );
2869
+ }
2870
+
2871
+ async function hasPaymentWebhookRoute(
2872
+ targetDir: string,
2873
+ files: string[],
2874
+ config: ResolvedBeignetConfig,
2875
+ sourceCache: Map<string, string>,
2876
+ ): Promise<boolean> {
2877
+ const routesPath = directoryPath(config.paths.routes);
2878
+ const routeFiles = files.filter(
2879
+ (file) => file.startsWith(`${routesPath}/`) && file.endsWith("/route.ts"),
2880
+ );
2881
+
2882
+ for (const file of routeFiles) {
2883
+ const source = await readCachedSource(targetDir, file, sourceCache);
2884
+ if (containsCallExpression(source, "createPaymentWebhookRoute")) {
2885
+ return true;
2886
+ }
2887
+ }
2888
+
2889
+ return false;
2890
+ }
2891
+
2892
+ async function appPortsIncludesIdempotency(
2893
+ targetDir: string,
2894
+ files: string[],
2895
+ config: ResolvedBeignetConfig,
2896
+ sourceCache: Map<string, string>,
2897
+ ): Promise<boolean> {
2898
+ return appPortsIncludesPort(
2899
+ targetDir,
2900
+ files,
2901
+ config,
2902
+ sourceCache,
2903
+ "idempotency",
2904
+ );
2905
+ }
2906
+
2907
+ async function appPortsIncludesPort(
2908
+ targetDir: string,
2909
+ files: string[],
2910
+ config: ResolvedBeignetConfig,
2911
+ sourceCache: Map<string, string>,
2912
+ portName: string,
2913
+ ): Promise<boolean> {
2914
+ if (!files.includes(config.paths.ports)) return false;
2915
+
2916
+ const source = await readCachedSource(
2917
+ targetDir,
2918
+ config.paths.ports,
2919
+ sourceCache,
2920
+ );
2921
+ const declarationStart = source.search(/\bexport\s+type\s+AppPorts\b/);
2922
+ if (declarationStart < 0) return false;
2923
+
2924
+ const bodyStart = source.indexOf("{", declarationStart);
2925
+ if (bodyStart < 0) return false;
2926
+
2927
+ const body = balancedObjectSource(source, bodyStart);
2928
+ return (
2929
+ body !== undefined &&
2930
+ new RegExp(`\\b${escapeRegExp(portName)}\\s*:`).test(body)
2931
+ );
2932
+ }
2933
+
2934
+ async function usesEntitlementChecks(
2935
+ targetDir: string,
2936
+ files: string[],
2937
+ sourceCache: Map<string, string>,
2938
+ ): Promise<boolean> {
2939
+ for (const file of files) {
2940
+ if (!/\.(?:ts|tsx|mts|cts)$/.test(file)) continue;
2941
+ if (isTestSourceFile(file)) continue;
2942
+
2943
+ const source = await readCachedSource(targetDir, file, sourceCache);
2944
+ if (
2945
+ /\brequireEntitlement\s*\(/.test(source) ||
2946
+ /\bctx\.ports\.entitlements\b/.test(source)
2947
+ ) {
2948
+ return true;
2949
+ }
2950
+ }
2951
+
2952
+ return false;
2953
+ }
2954
+
2955
+ async function hasBillingEntitlementsProviderWiring(
2956
+ targetDir: string,
2957
+ files: string[],
2958
+ config: ResolvedBeignetConfig,
2959
+ sourceCache: Map<string, string>,
2960
+ ): Promise<boolean> {
2961
+ const infraPath = path.dirname(config.paths.infrastructurePorts);
2962
+ const serverPath = path.dirname(config.paths.server);
2963
+ const candidateFiles = files.filter(
2964
+ (file) =>
2965
+ /\.(?:ts|tsx|mts|cts)$/.test(file) &&
2966
+ !isTestSourceFile(file) &&
2967
+ (file.startsWith(`${infraPath}/`) || file.startsWith(`${serverPath}/`)),
2968
+ );
2969
+
2970
+ for (const file of candidateFiles) {
2971
+ const source = await readCachedSource(targetDir, file, sourceCache);
2972
+ if (containsCallExpression(source, "createBillingEntitlements")) {
2973
+ return true;
2974
+ }
2975
+ }
2976
+
2977
+ return false;
2978
+ }
2979
+
2980
+ function isTestSourceFile(file: string): boolean {
2981
+ return (
2982
+ /(?:^|\/)tests\//.test(file) ||
2983
+ /\.(?:test|spec)\.(?:ts|tsx|mts|cts)$/.test(file)
2984
+ );
2985
+ }
2986
+
2987
+ function exportedConstInitializer(
2988
+ source: string,
2989
+ exportName: string,
2990
+ ): string | undefined {
2991
+ const declaration = new RegExp(
2992
+ `\\bexport\\s+const\\s+${escapeRegExp(exportName)}\\s*=`,
2993
+ ).exec(source);
2994
+ if (declaration?.index === undefined) return undefined;
2995
+
2996
+ const start = declaration.index;
2997
+ const nextExport =
2998
+ /\n\s*export\s+(?:const|function|type|interface|class)\s+/g;
2999
+ nextExport.lastIndex = start + declaration[0].length;
3000
+ const next = nextExport.exec(source);
3001
+
3002
+ return source.slice(start, next?.index ?? source.length);
3003
+ }
3004
+
2644
3005
  function featureNameFromContractFile(
2645
3006
  file: string,
2646
3007
  config: ResolvedBeignetConfig,