sandstream-kit 1.4.3 → 1.6.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.
@@ -0,0 +1,248 @@
1
+ export const SERVICE_REGISTRY = [
2
+ // ── existing 16 (ported verbatim from SERVICE_DETECTORS + SERVICE_TEMPLATES;
3
+ // strings preserved exactly for byte-identical output) ──
4
+ {
5
+ id: "stripe",
6
+ deps: ["stripe"],
7
+ pyDeps: ["stripe"],
8
+ goMods: ["github.com/stripe/stripe-go"],
9
+ login: "stripe login",
10
+ check: "stripe config --list",
11
+ secrets: ["STRIPE_SECRET_KEY", "STRIPE_PUBLISHABLE_KEY", "STRIPE_WEBHOOK_SECRET"],
12
+ tool: "stripe",
13
+ },
14
+ {
15
+ id: "supabase",
16
+ deps: ["@supabase/supabase-js"],
17
+ pyDeps: ["supabase"],
18
+ files: ["supabase"],
19
+ login: "supabase login",
20
+ check: "supabase projects list",
21
+ secrets: ["NEXT_PUBLIC_SUPABASE_URL", "NEXT_PUBLIC_SUPABASE_ANON_KEY", "SUPABASE_SERVICE_ROLE_KEY"],
22
+ tool: "supabase",
23
+ migrate: "supabase db push",
24
+ },
25
+ {
26
+ id: "prisma",
27
+ deps: ["prisma", "@prisma/client"],
28
+ migrate: "npx prisma migrate deploy",
29
+ },
30
+ {
31
+ id: "resend",
32
+ deps: ["resend"],
33
+ pyDeps: ["resend"],
34
+ login: "# resend — no CLI login; set RESEND_API_KEY in env",
35
+ check: "# resend — check RESEND_API_KEY is set",
36
+ secrets: ["RESEND_API_KEY", "RESEND_FROM_EMAIL"],
37
+ },
38
+ {
39
+ id: "clerk",
40
+ deps: ["@clerk/nextjs", "@clerk/clerk-react"],
41
+ login: "# clerk — no CLI login; get keys from https://dashboard.clerk.com",
42
+ check: "# clerk — check CLERK_SECRET_KEY is set",
43
+ secrets: ["CLERK_SECRET_KEY", "NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY"],
44
+ },
45
+ {
46
+ id: "drizzle",
47
+ deps: ["drizzle-orm"],
48
+ migrate: "npx drizzle-kit migrate",
49
+ },
50
+ {
51
+ id: "liveblocks",
52
+ deps: ["liveblocks", "@liveblocks/client"],
53
+ login: "# liveblocks — no CLI login; get keys from https://liveblocks.io/dashboard",
54
+ check: "# liveblocks — check LIVEBLOCKS_SECRET_KEY is set",
55
+ secrets: ["LIVEBLOCKS_SECRET_KEY", "NEXT_PUBLIC_LIVEBLOCKS_PUBLIC_KEY"],
56
+ },
57
+ {
58
+ id: "trigger",
59
+ deps: ["@trigger.dev/sdk", "trigger.dev"],
60
+ login: "# trigger — no CLI login; get key from https://cloud.trigger.dev",
61
+ check: "# trigger — check TRIGGER_SECRET_KEY is set",
62
+ secrets: ["TRIGGER_SECRET_KEY"],
63
+ },
64
+ {
65
+ id: "inngest",
66
+ deps: ["inngest"],
67
+ login: "# inngest — no CLI login; get keys from https://app.inngest.com",
68
+ check: "# inngest — check INNGEST_EVENT_KEY is set",
69
+ secrets: ["INNGEST_EVENT_KEY", "INNGEST_SIGNING_KEY"],
70
+ },
71
+ {
72
+ id: "vercel",
73
+ deps: ["@vercel/analytics", "vercel"],
74
+ files: ["vercel.json"],
75
+ login: "vercel login",
76
+ check: "vercel whoami",
77
+ secrets: [],
78
+ tool: "vercel",
79
+ },
80
+ {
81
+ id: "expo",
82
+ files: [".expo"],
83
+ login: "eas login",
84
+ check: "eas whoami",
85
+ secrets: ["EXPO_TOKEN"],
86
+ tool: "eas-cli",
87
+ },
88
+ {
89
+ id: "sentry",
90
+ deps: ["@sentry/nextjs", "@sentry/node", "@sentry/react", "@sentry/svelte", "@sentry/astro", "@sentry/remix"],
91
+ pyDeps: ["sentry-sdk"],
92
+ goMods: ["github.com/getsentry/sentry-go"],
93
+ login: "# sentry — no CLI login; get DSN from https://sentry.io",
94
+ check: "# sentry — check SENTRY_DSN is set",
95
+ secrets: ["SENTRY_DSN", "SENTRY_ORG", "SENTRY_PROJECT", "SENTRY_AUTH_TOKEN"],
96
+ },
97
+ {
98
+ id: "typeorm",
99
+ deps: ["typeorm", "@nestjs/typeorm"],
100
+ login: "# typeorm — no CLI login; configure DATABASE_URL",
101
+ check: "# typeorm — check DATABASE_URL is set",
102
+ secrets: ["DATABASE_URL"],
103
+ },
104
+ {
105
+ id: "mongoose",
106
+ deps: ["mongoose", "@nestjs/mongoose"],
107
+ login: "# mongoose — no CLI login; configure MONGODB_URI",
108
+ check: "# mongoose — check MONGODB_URI is set",
109
+ secrets: ["MONGODB_URI"],
110
+ },
111
+ {
112
+ id: "netlify",
113
+ files: ["netlify.toml"],
114
+ login: "netlify login",
115
+ check: "netlify status",
116
+ secrets: ["NETLIFY_AUTH_TOKEN", "NETLIFY_SITE_ID"],
117
+ tool: "netlify",
118
+ },
119
+ {
120
+ id: "cloudflare-pages",
121
+ files: ["wrangler.toml"],
122
+ login: "wrangler login",
123
+ check: "wrangler whoami",
124
+ secrets: ["CLOUDFLARE_API_TOKEN", "CLOUDFLARE_ACCOUNT_ID"],
125
+ tool: "wrangler",
126
+ },
127
+ // ── new entries (init-v2): databases / BaaS / warehouses. The whole point of
128
+ // the registry is that these are just data. New strings use plain hyphens
129
+ // (no em-dashes), per the project's written-content rule. ──
130
+ {
131
+ id: "convex",
132
+ deps: ["convex"],
133
+ login: "# convex - run `npx convex dev` to log in + create a deployment",
134
+ check: "# convex - check CONVEX_DEPLOYMENT is set",
135
+ secrets: ["CONVEX_DEPLOYMENT", "NEXT_PUBLIC_CONVEX_URL"],
136
+ },
137
+ {
138
+ id: "firebase",
139
+ deps: ["firebase", "firebase-admin"],
140
+ files: ["firebase.json", ".firebaserc"],
141
+ login: "firebase login",
142
+ check: "firebase projects:list",
143
+ secrets: ["FIREBASE_API_KEY", "FIREBASE_PROJECT_ID", "GOOGLE_APPLICATION_CREDENTIALS"],
144
+ tool: "firebase",
145
+ },
146
+ {
147
+ id: "mysql",
148
+ deps: ["mysql", "mysql2"],
149
+ pyDeps: ["mysqlclient", "pymysql"],
150
+ login: "# mysql - no CLI login; configure DATABASE_URL",
151
+ check: "# mysql - check DATABASE_URL is set",
152
+ secrets: ["DATABASE_URL"],
153
+ },
154
+ {
155
+ id: "planetscale",
156
+ deps: ["@planetscale/database"],
157
+ login: "# planetscale - configure DATABASE_URL (or run `pscale auth login`)",
158
+ check: "# planetscale - check DATABASE_URL is set",
159
+ secrets: ["DATABASE_URL"],
160
+ },
161
+ {
162
+ id: "neon",
163
+ deps: ["@neondatabase/serverless"],
164
+ login: "# neon - configure DATABASE_URL from the Neon console",
165
+ check: "# neon - check DATABASE_URL is set",
166
+ secrets: ["DATABASE_URL"],
167
+ },
168
+ {
169
+ id: "turso",
170
+ deps: ["@libsql/client"],
171
+ login: "turso auth login",
172
+ check: "turso auth whoami",
173
+ secrets: ["TURSO_DATABASE_URL", "TURSO_AUTH_TOKEN"],
174
+ tool: "turso",
175
+ },
176
+ {
177
+ id: "bigquery",
178
+ deps: ["@google-cloud/bigquery"],
179
+ pyDeps: ["google-cloud-bigquery"],
180
+ login: "gcloud auth application-default login",
181
+ check: "# bigquery - check GOOGLE_APPLICATION_CREDENTIALS + GCP_PROJECT_ID are set",
182
+ secrets: ["GOOGLE_APPLICATION_CREDENTIALS", "GCP_PROJECT_ID"],
183
+ },
184
+ {
185
+ id: "snowflake",
186
+ deps: ["snowflake-sdk"],
187
+ pyDeps: ["snowflake-connector-python"],
188
+ login: "# snowflake - no CLI login; set SNOWFLAKE_* connection vars",
189
+ check: "# snowflake - check SNOWFLAKE_ACCOUNT is set",
190
+ secrets: ["SNOWFLAKE_ACCOUNT", "SNOWFLAKE_USER", "SNOWFLAKE_PASSWORD"],
191
+ },
192
+ {
193
+ id: "redshift",
194
+ deps: ["@aws-sdk/client-redshift", "@aws-sdk/client-redshift-data"],
195
+ login: "# redshift - no CLI login; set DATABASE_URL (or assume an IAM role)",
196
+ check: "# redshift - check DATABASE_URL is set",
197
+ secrets: ["DATABASE_URL"],
198
+ },
199
+ {
200
+ id: "redis",
201
+ deps: ["@upstash/redis", "ioredis", "redis"],
202
+ pyDeps: ["redis"],
203
+ login: "# redis - no CLI login; set REDIS_URL (or UPSTASH_REDIS_REST_*)",
204
+ check: "# redis - check REDIS_URL is set",
205
+ secrets: ["REDIS_URL", "UPSTASH_REDIS_REST_URL", "UPSTASH_REDIS_REST_TOKEN"],
206
+ },
207
+ {
208
+ id: "auth0",
209
+ deps: ["@auth0/nextjs-auth0", "@auth0/auth0-react", "auth0"],
210
+ login: "# auth0 - no CLI login; get keys from https://manage.auth0.com",
211
+ check: "# auth0 - check AUTH0_CLIENT_ID is set",
212
+ secrets: ["AUTH0_SECRET", "AUTH0_BASE_URL", "AUTH0_ISSUER_BASE_URL", "AUTH0_CLIENT_ID", "AUTH0_CLIENT_SECRET"],
213
+ },
214
+ ];
215
+ /** Lookup by service id, for the generator. */
216
+ export const SERVICE_BY_ID = Object.fromEntries(SERVICE_REGISTRY.map((s) => [s.id, s]));
217
+ /**
218
+ * Detect which services a repo uses, language-agnostically. Returns ids in
219
+ * registry order. `fileExists` is repo-root-relative so each language detector
220
+ * can pass its own cwd-bound checker.
221
+ */
222
+ export async function detectServices(signals) {
223
+ const deps = signals.deps ?? [];
224
+ const py = signals.pyText?.toLowerCase() ?? "";
225
+ const go = signals.goMod ?? "";
226
+ const out = [];
227
+ for (const def of SERVICE_REGISTRY) {
228
+ let hit = false;
229
+ if (def.deps?.some((d) => deps.includes(d)))
230
+ hit = true;
231
+ if (!hit && py && def.pyDeps?.some((p) => py.includes(p.toLowerCase())))
232
+ hit = true;
233
+ if (!hit && go && def.goMods?.some((m) => go.includes(m)))
234
+ hit = true;
235
+ if (!hit && def.files) {
236
+ for (const f of def.files) {
237
+ if (await signals.fileExists(f)) {
238
+ hit = true;
239
+ break;
240
+ }
241
+ }
242
+ }
243
+ if (hit)
244
+ out.push(def.id);
245
+ }
246
+ return out;
247
+ }
248
+ //# sourceMappingURL=service-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-registry.js","sourceRoot":"","sources":["../src/service-registry.ts"],"names":[],"mappings":"AA2CA,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,8EAA8E;IAC9E,6DAA6D;IAC7D;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,MAAM,EAAE,CAAC,QAAQ,CAAC;QAClB,MAAM,EAAE,CAAC,6BAA6B,CAAC;QACvC,KAAK,EAAE,cAAc;QACrB,KAAK,EAAE,sBAAsB;QAC7B,OAAO,EAAE,CAAC,mBAAmB,EAAE,wBAAwB,EAAE,uBAAuB,CAAC;QACjF,IAAI,EAAE,QAAQ;KACf;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,CAAC,uBAAuB,CAAC;QAC/B,MAAM,EAAE,CAAC,UAAU,CAAC;QACpB,KAAK,EAAE,CAAC,UAAU,CAAC;QACnB,KAAK,EAAE,gBAAgB;QACvB,KAAK,EAAE,wBAAwB;QAC/B,OAAO,EAAE,CAAC,0BAA0B,EAAE,+BAA+B,EAAE,2BAA2B,CAAC;QACnG,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,kBAAkB;KAC5B;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC;QAClC,OAAO,EAAE,2BAA2B;KACrC;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,MAAM,EAAE,CAAC,QAAQ,CAAC;QAClB,KAAK,EAAE,oDAAoD;QAC3D,KAAK,EAAE,wCAAwC;QAC/C,OAAO,EAAE,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;KACjD;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,CAAC,eAAe,EAAE,oBAAoB,CAAC;QAC7C,KAAK,EAAE,mEAAmE;QAC1E,KAAK,EAAE,yCAAyC;QAChD,OAAO,EAAE,CAAC,kBAAkB,EAAE,mCAAmC,CAAC;KACnE;IACD;QACE,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,CAAC,aAAa,CAAC;QACrB,OAAO,EAAE,yBAAyB;KACnC;IACD;QACE,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,CAAC,YAAY,EAAE,oBAAoB,CAAC;QAC1C,KAAK,EAAE,4EAA4E;QACnF,KAAK,EAAE,mDAAmD;QAC1D,OAAO,EAAE,CAAC,uBAAuB,EAAE,mCAAmC,CAAC;KACxE;IACD;QACE,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,CAAC,kBAAkB,EAAE,aAAa,CAAC;QACzC,KAAK,EAAE,kEAAkE;QACzE,KAAK,EAAE,6CAA6C;QACpD,OAAO,EAAE,CAAC,oBAAoB,CAAC;KAChC;IACD;QACE,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,CAAC,SAAS,CAAC;QACjB,KAAK,EAAE,iEAAiE;QACxE,KAAK,EAAE,4CAA4C;QACnD,OAAO,EAAE,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;KACtD;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,CAAC,mBAAmB,EAAE,QAAQ,CAAC;QACrC,KAAK,EAAE,CAAC,aAAa,CAAC;QACtB,KAAK,EAAE,cAAc;QACrB,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,QAAQ;KACf;IACD;QACE,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,CAAC,OAAO,CAAC;QAChB,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,CAAC,YAAY,CAAC;QACvB,IAAI,EAAE,SAAS;KAChB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,CAAC,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,CAAC;QAC7G,MAAM,EAAE,CAAC,YAAY,CAAC;QACtB,MAAM,EAAE,CAAC,gCAAgC,CAAC;QAC1C,KAAK,EAAE,yDAAyD;QAChE,KAAK,EAAE,oCAAoC;QAC3C,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,CAAC;KAC7E;IACD;QACE,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,CAAC,SAAS,EAAE,iBAAiB,CAAC;QACpC,KAAK,EAAE,kDAAkD;QACzD,KAAK,EAAE,uCAAuC;QAC9C,OAAO,EAAE,CAAC,cAAc,CAAC;KAC1B;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,CAAC,UAAU,EAAE,kBAAkB,CAAC;QACtC,KAAK,EAAE,kDAAkD;QACzD,KAAK,EAAE,uCAAuC;QAC9C,OAAO,EAAE,CAAC,aAAa,CAAC;KACzB;IACD;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,CAAC,cAAc,CAAC;QACvB,KAAK,EAAE,eAAe;QACtB,KAAK,EAAE,gBAAgB;QACvB,OAAO,EAAE,CAAC,oBAAoB,EAAE,iBAAiB,CAAC;QAClD,IAAI,EAAE,SAAS;KAChB;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,KAAK,EAAE,CAAC,eAAe,CAAC;QACxB,KAAK,EAAE,gBAAgB;QACvB,KAAK,EAAE,iBAAiB;QACxB,OAAO,EAAE,CAAC,sBAAsB,EAAE,uBAAuB,CAAC;QAC1D,IAAI,EAAE,UAAU;KACjB;IAED,8EAA8E;IAC9E,6EAA6E;IAC7E,gEAAgE;IAChE;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,KAAK,EAAE,iEAAiE;QACxE,KAAK,EAAE,2CAA2C;QAClD,OAAO,EAAE,CAAC,mBAAmB,EAAE,wBAAwB,CAAC;KACzD;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,CAAC,UAAU,EAAE,gBAAgB,CAAC;QACpC,KAAK,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC;QACvC,KAAK,EAAE,gBAAgB;QACvB,KAAK,EAAE,wBAAwB;QAC/B,OAAO,EAAE,CAAC,kBAAkB,EAAE,qBAAqB,EAAE,gCAAgC,CAAC;QACtF,IAAI,EAAE,UAAU;KACjB;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;QACzB,MAAM,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC;QAClC,KAAK,EAAE,gDAAgD;QACvD,KAAK,EAAE,qCAAqC;QAC5C,OAAO,EAAE,CAAC,cAAc,CAAC;KAC1B;IACD;QACE,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,CAAC,uBAAuB,CAAC;QAC/B,KAAK,EAAE,qEAAqE;QAC5E,KAAK,EAAE,2CAA2C;QAClD,OAAO,EAAE,CAAC,cAAc,CAAC;KAC1B;IACD;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,CAAC,0BAA0B,CAAC;QAClC,KAAK,EAAE,uDAAuD;QAC9D,KAAK,EAAE,oCAAoC;QAC3C,OAAO,EAAE,CAAC,cAAc,CAAC;KAC1B;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,CAAC,gBAAgB,CAAC;QACxB,KAAK,EAAE,kBAAkB;QACzB,KAAK,EAAE,mBAAmB;QAC1B,OAAO,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;QACnD,IAAI,EAAE,OAAO;KACd;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,CAAC,wBAAwB,CAAC;QAChC,MAAM,EAAE,CAAC,uBAAuB,CAAC;QACjC,KAAK,EAAE,uCAAuC;QAC9C,KAAK,EAAE,4EAA4E;QACnF,OAAO,EAAE,CAAC,gCAAgC,EAAE,gBAAgB,CAAC;KAC9D;IACD;QACE,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,CAAC,eAAe,CAAC;QACvB,MAAM,EAAE,CAAC,4BAA4B,CAAC;QACtC,KAAK,EAAE,6DAA6D;QACpE,KAAK,EAAE,8CAA8C;QACrD,OAAO,EAAE,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,oBAAoB,CAAC;KACvE;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,CAAC,0BAA0B,EAAE,+BAA+B,CAAC;QACnE,KAAK,EAAE,qEAAqE;QAC5E,KAAK,EAAE,wCAAwC;QAC/C,OAAO,EAAE,CAAC,cAAc,CAAC;KAC1B;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,OAAO,CAAC;QAC5C,MAAM,EAAE,CAAC,OAAO,CAAC;QACjB,KAAK,EAAE,iEAAiE;QACxE,KAAK,EAAE,kCAAkC;QACzC,OAAO,EAAE,CAAC,WAAW,EAAE,wBAAwB,EAAE,0BAA0B,CAAC;KAC7E;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,CAAC,qBAAqB,EAAE,oBAAoB,EAAE,OAAO,CAAC;QAC5D,KAAK,EAAE,gEAAgE;QACvE,KAAK,EAAE,wCAAwC;QAC/C,OAAO,EAAE,CAAC,cAAc,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,qBAAqB,CAAC;KAC/G;CACF,CAAC;AAEF,+CAA+C;AAC/C,MAAM,CAAC,MAAM,aAAa,GAA+B,MAAM,CAAC,WAAW,CACzE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CACvC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAKpC;IACC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;IAChC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC/C,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE,GAAG,GAAG,IAAI,CAAC;QACxD,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAAE,GAAG,GAAG,IAAI,CAAC;QACpF,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE,GAAG,GAAG,IAAI,CAAC;QACtE,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC1B,IAAI,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChC,GAAG,GAAG,IAAI,CAAC;oBACX,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,5 +1,6 @@
1
- import { readFile, access } from "node:fs/promises";
1
+ import { readFile, access, readdir } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
+ import { detectServices } from "./service-registry.js";
3
4
  async function fileExists(path) {
4
5
  try {
5
6
  await access(path);
@@ -18,18 +19,96 @@ async function readJson(path) {
18
19
  return null;
19
20
  }
20
21
  }
21
- function hasDep(pkg, name) {
22
- return !!(pkg.dependencies?.[name] || pkg.devDependencies?.[name]);
22
+ /** Expand a workspace glob. Supports exact paths and a single trailing `/*`
23
+ * (one directory level) — covers the common `apps/*` / `packages/*` layouts;
24
+ * deeper globs are rare for stack detection and fall back to no match. */
25
+ async function expandWorkspaceGlob(cwd, pattern) {
26
+ if (!pattern.includes("*"))
27
+ return [pattern];
28
+ const base = pattern.replace(/\/?\*+$/, "");
29
+ try {
30
+ const entries = await readdir(join(cwd, base), { withFileTypes: true });
31
+ return entries.filter((e) => e.isDirectory()).map((e) => (base ? `${base}/${e.name}` : e.name));
32
+ }
33
+ catch {
34
+ return [];
35
+ }
23
36
  }
24
- function nodeVersion(pkg) {
25
- const engines = pkg.engines?.node;
26
- if (engines) {
27
- const match = engines.match(/(\d+)/);
28
- if (match)
29
- return match[1];
37
+ /** Monorepo support: union the dependencies of every workspace member so a
38
+ * turborepo whose `next`/`stripe`/etc. live in `apps/*` is detected from the
39
+ * root, instead of coming up empty. Reads `package.json#workspaces` and
40
+ * `pnpm-workspace.yaml`. Returns [] for a non-workspace repo. */
41
+ async function collectWorkspaceDeps(cwd, pkg) {
42
+ const globs = [];
43
+ if (Array.isArray(pkg.workspaces))
44
+ globs.push(...pkg.workspaces);
45
+ else if (pkg.workspaces?.packages)
46
+ globs.push(...pkg.workspaces.packages);
47
+ const pnpmWs = await readFile(join(cwd, "pnpm-workspace.yaml"), "utf-8").catch(() => null);
48
+ if (pnpmWs) {
49
+ for (const m of pnpmWs.matchAll(/^\s*-\s*['"]?([^'"\n]+?)['"]?\s*$/gm))
50
+ globs.push(m[1].trim());
51
+ }
52
+ if (globs.length === 0)
53
+ return [];
54
+ const deps = new Set();
55
+ for (const g of globs) {
56
+ for (const dir of await expandWorkspaceGlob(cwd, g)) {
57
+ const member = await readJson(join(cwd, dir, "package.json"));
58
+ if (member) {
59
+ for (const k of Object.keys({ ...member.dependencies, ...member.devDependencies }))
60
+ deps.add(k);
61
+ }
62
+ }
63
+ }
64
+ return [...deps];
65
+ }
66
+ /** Resolve the Node major to pin, respecting the repo's existing truth.
67
+ * Precedence: .tool-versions > Volta > .node-version / .nvmrc > engines.node > 22.
68
+ * (Respecting these avoids installing the wrong runtime, the #1 brownfield trap.) */
69
+ async function resolveNodeVersion(cwd, pkg) {
70
+ const toolVersions = await readFile(join(cwd, ".tool-versions"), "utf-8").catch(() => null);
71
+ if (toolVersions) {
72
+ const m = toolVersions.match(/^\s*nodejs?\s+v?(\d+)/m);
73
+ if (m)
74
+ return m[1];
75
+ }
76
+ if (pkg.volta?.node) {
77
+ const m = pkg.volta.node.match(/(\d+)/);
78
+ if (m)
79
+ return m[1];
80
+ }
81
+ for (const f of [".node-version", ".nvmrc"]) {
82
+ const c = await readFile(join(cwd, f), "utf-8").catch(() => null);
83
+ if (c) {
84
+ const m = c.match(/v?(\d+)/);
85
+ if (m)
86
+ return m[1];
87
+ }
88
+ }
89
+ if (pkg.engines?.node) {
90
+ const m = pkg.engines.node.match(/(\d+)/);
91
+ if (m)
92
+ return m[1];
30
93
  }
31
94
  return "22";
32
95
  }
96
+ /** Resolve the Python minor to pin: .python-version > .tool-versions > 3.12. */
97
+ async function resolvePythonVersion(cwd) {
98
+ const pv = await readFile(join(cwd, ".python-version"), "utf-8").catch(() => null);
99
+ if (pv) {
100
+ const m = pv.match(/(\d+\.\d+)/);
101
+ if (m)
102
+ return m[1];
103
+ }
104
+ const tv = await readFile(join(cwd, ".tool-versions"), "utf-8").catch(() => null);
105
+ if (tv) {
106
+ const m = tv.match(/^\s*python\s+v?(\d+\.\d+)/m);
107
+ if (m)
108
+ return m[1];
109
+ }
110
+ return "3.12";
111
+ }
33
112
  function detectPackageManager(pkg, cwd) {
34
113
  if (pkg.packageManager?.startsWith("pnpm"))
35
114
  return Promise.resolve("pnpm");
@@ -48,29 +127,8 @@ function detectPackageManager(pkg, cwd) {
48
127
  return "npm";
49
128
  })();
50
129
  }
51
- // Service = matched if any dep is present OR any marker file exists. Order here
52
- // is the order services are reported. Adding a service is one row, not a new if.
53
- const SERVICE_DETECTORS = [
54
- { service: "stripe", deps: ["stripe"] },
55
- { service: "supabase", deps: ["@supabase/supabase-js"], files: ["supabase"] },
56
- { service: "prisma", deps: ["prisma", "@prisma/client"] },
57
- { service: "resend", deps: ["resend"] },
58
- { service: "clerk", deps: ["@clerk/nextjs", "@clerk/clerk-react"] },
59
- { service: "drizzle", deps: ["drizzle-orm"] },
60
- { service: "liveblocks", deps: ["liveblocks", "@liveblocks/client"] },
61
- { service: "trigger", deps: ["@trigger.dev/sdk", "trigger.dev"] },
62
- { service: "inngest", deps: ["inngest"] },
63
- { service: "vercel", deps: ["@vercel/analytics", "vercel"], files: ["vercel.json"] },
64
- { service: "expo", files: [".expo"] },
65
- {
66
- service: "sentry",
67
- deps: ["@sentry/nextjs", "@sentry/node", "@sentry/react", "@sentry/svelte", "@sentry/astro", "@sentry/remix"],
68
- },
69
- { service: "typeorm", deps: ["typeorm", "@nestjs/typeorm"] },
70
- { service: "mongoose", deps: ["mongoose", "@nestjs/mongoose"] },
71
- { service: "netlify", files: ["netlify.toml"] },
72
- { service: "cloudflare-pages", files: ["wrangler.toml"] },
73
- ];
130
+ // Service detection now lives in the data-driven SERVICE_REGISTRY (service-registry.ts),
131
+ // shared with the generator and matched across languages via detectServices().
74
132
  // Framework = first match wins (priority order: meta-frameworks before their base).
75
133
  const FRAMEWORK_DETECTORS = [
76
134
  { framework: "nextjs", deps: ["next"] },
@@ -79,6 +137,8 @@ const FRAMEWORK_DETECTORS = [
79
137
  { framework: "sveltekit", deps: ["@sveltejs/kit"] },
80
138
  { framework: "nestjs", deps: ["@nestjs/core"] },
81
139
  { framework: "express", deps: ["express"] },
140
+ // react-native before react: an RN app depends on both, RN is the real story.
141
+ { framework: "react-native", deps: ["react-native"] },
82
142
  { framework: "react", deps: ["react"] },
83
143
  { framework: "vue", deps: ["vue"] },
84
144
  ];
@@ -86,29 +146,24 @@ async function detectFromPackageJson(cwd) {
86
146
  const pkg = await readJson(join(cwd, "package.json"));
87
147
  if (!pkg)
88
148
  return null;
89
- const node = nodeVersion(pkg);
149
+ const node = await resolveNodeVersion(cwd, pkg);
90
150
  const pm = await detectPackageManager(pkg, cwd);
91
151
  const tools = { node };
92
152
  if (pm !== "npm")
93
153
  tools[pm] = "latest";
94
- const services = [];
95
- // Detect services by dependency or marker file (table-driven; preserves order).
96
- for (const d of SERVICE_DETECTORS) {
97
- const byDep = d.deps?.some((dep) => hasDep(pkg, dep)) ?? false;
98
- let byFile = false;
99
- for (const file of d.files ?? []) {
100
- if (await fileExists(join(cwd, file))) {
101
- byFile = true;
102
- break;
103
- }
104
- }
105
- if (byDep || byFile)
106
- services.push(d.service);
107
- }
154
+ // Union root deps with workspace-member deps so monorepos (turborepo, pnpm
155
+ // workspaces) whose framework/services live in apps/* or packages/* are not
156
+ // detected as an empty root.
157
+ const rootDeps = Object.keys({ ...pkg.dependencies, ...pkg.devDependencies });
158
+ const deps = [...new Set([...rootDeps, ...(await collectWorkspaceDeps(cwd, pkg))])];
159
+ const services = await detectServices({
160
+ deps,
161
+ fileExists: (p) => fileExists(join(cwd, p)),
162
+ });
108
163
  // Framework — first match wins (priority order in FRAMEWORK_DETECTORS).
109
164
  let framework;
110
165
  for (const fw of FRAMEWORK_DETECTORS) {
111
- if (fw.deps.some((dep) => hasDep(pkg, dep))) {
166
+ if (fw.deps.some((dep) => deps.includes(dep))) {
112
167
  framework = fw.framework;
113
168
  break;
114
169
  }
@@ -141,11 +196,15 @@ async function detectFromPython(cwd) {
141
196
  framework = "django";
142
197
  else if (/flask/i.test(contents))
143
198
  framework = "flask";
199
+ const services = await detectServices({
200
+ pyText: contents,
201
+ fileExists: (p) => fileExists(join(cwd, p)),
202
+ });
144
203
  return {
145
204
  language: "python",
146
205
  framework,
147
- services: [],
148
- tools: { python: "3.12", uv: "latest" },
206
+ services,
207
+ tools: { python: await resolvePythonVersion(cwd), uv: "latest" },
149
208
  confidence: framework ? 0.85 : 0.5,
150
209
  };
151
210
  }
@@ -160,10 +219,14 @@ async function detectFromGo(cwd) {
160
219
  framework = "echo";
161
220
  else if (/github\.com\/gofiber\/fiber/.test(goMod))
162
221
  framework = "fiber";
222
+ const services = await detectServices({
223
+ goMod,
224
+ fileExists: (p) => fileExists(join(cwd, p)),
225
+ });
163
226
  return {
164
227
  language: "go",
165
228
  framework,
166
- services: [],
229
+ services,
167
230
  tools: { go: "1.22" },
168
231
  confidence: framework ? 0.85 : 0.7,
169
232
  };
@@ -179,10 +242,11 @@ async function detectFromRust(cwd) {
179
242
  framework = "actix";
180
243
  else if (/rocket/.test(cargoToml))
181
244
  framework = "rocket";
245
+ const services = await detectServices({ fileExists: (p) => fileExists(join(cwd, p)) });
182
246
  return {
183
247
  language: "rust",
184
248
  framework,
185
- services: [],
249
+ services,
186
250
  tools: { rust: "latest" },
187
251
  confidence: framework ? 0.85 : 0.7,
188
252
  };
@@ -196,25 +260,82 @@ async function detectFromPhp(cwd) {
196
260
  framework = "laravel";
197
261
  else if (composer.require?.["symfony/framework-bundle"])
198
262
  framework = "symfony";
263
+ const services = await detectServices({ fileExists: (p) => fileExists(join(cwd, p)) });
199
264
  return {
200
265
  language: "php",
201
266
  framework,
202
- services: [],
267
+ services,
203
268
  tools: { php: "8.3", composer: "latest" },
204
269
  confidence: framework ? 0.85 : 0.6,
205
270
  };
206
271
  }
272
+ async function detectFromFlutter(cwd) {
273
+ const pubspec = await readFile(join(cwd, "pubspec.yaml"), "utf-8").catch(() => null);
274
+ if (pubspec === null)
275
+ return null;
276
+ // pubspec.yaml is also used by pure-Dart packages; "flutter:" / sdk: flutter
277
+ // marks an actual Flutter app.
278
+ const framework = /flutter/i.test(pubspec) ? "flutter" : undefined;
279
+ const services = await detectServices({ fileExists: (p) => fileExists(join(cwd, p)) });
280
+ return {
281
+ language: "dart",
282
+ framework,
283
+ services,
284
+ tools: {},
285
+ confidence: framework ? 0.9 : 0.7,
286
+ };
287
+ }
288
+ async function detectFromSwift(cwd) {
289
+ const hasPackage = await fileExists(join(cwd, "Package.swift"));
290
+ const hasPodfile = await fileExists(join(cwd, "Podfile"));
291
+ if (!hasPackage && !hasPodfile)
292
+ return null;
293
+ // Podfile (CocoaPods) is an iOS-app signal; bare Package.swift can also be
294
+ // server-side Swift (Vapor), so it stays framework-less.
295
+ const framework = hasPodfile ? "ios" : undefined;
296
+ const services = await detectServices({ fileExists: (p) => fileExists(join(cwd, p)) });
297
+ return {
298
+ language: "swift",
299
+ framework,
300
+ services,
301
+ tools: {},
302
+ confidence: hasPodfile ? 0.85 : 0.7,
303
+ };
304
+ }
305
+ async function detectFromAndroid(cwd) {
306
+ const gradle = (await readFile(join(cwd, "build.gradle.kts"), "utf-8").catch(() => null)) ??
307
+ (await readFile(join(cwd, "build.gradle"), "utf-8").catch(() => null));
308
+ const hasSettings = (await fileExists(join(cwd, "settings.gradle.kts"))) || (await fileExists(join(cwd, "settings.gradle")));
309
+ if (gradle === null && !hasSettings)
310
+ return null;
311
+ // Only call it Android when the Android Gradle plugin is applied; otherwise
312
+ // it's a generic JVM/Gradle project (label the language, not a mobile framework).
313
+ const framework = gradle && /com\.android\.(application|library)/.test(gradle) ? "android" : undefined;
314
+ const services = await detectServices({ fileExists: (p) => fileExists(join(cwd, p)) });
315
+ return {
316
+ language: "kotlin",
317
+ framework,
318
+ services,
319
+ tools: {},
320
+ confidence: framework ? 0.85 : 0.6,
321
+ };
322
+ }
207
323
  /**
208
324
  * Detect the project stack from files in the given directory.
209
325
  * Returns null only if no recognizable project files are found.
210
326
  */
211
327
  export async function detectStack(cwd) {
212
- // Try detection in priority order — first match wins
328
+ // Try detection in priority order — first match wins. Node first (RN/Expo apps
329
+ // carry package.json); native-mobile detectors are reached only when none of
330
+ // the language manifests above them matched.
213
331
  const result = (await detectFromPackageJson(cwd)) ??
214
332
  (await detectFromPython(cwd)) ??
215
333
  (await detectFromGo(cwd)) ??
216
334
  (await detectFromRust(cwd)) ??
217
- (await detectFromPhp(cwd));
335
+ (await detectFromPhp(cwd)) ??
336
+ (await detectFromFlutter(cwd)) ??
337
+ (await detectFromSwift(cwd)) ??
338
+ (await detectFromAndroid(cwd));
218
339
  if (result)
219
340
  return result;
220
341
  // Unknown project — return minimal fallback
@@ -1 +1 @@
1
- {"version":3,"file":"stack-detector.js","sourceRoot":"","sources":["../src/stack-detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stack-detector.js","sourceRoot":"","sources":["../src/stack-detector.ts"],"names":[],"mappings":"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"}
@@ -8,9 +8,14 @@ import type { DetectedStack } from "./stack-detector.js";
8
8
  */
9
9
  export declare const DEFAULT_SECURITY_SCANNERS: Record<string, string>;
10
10
  export type SecretsStore = "1password" | "infisical" | "bitwarden" | "doppler" | "vault" | "aws-sm" | "gcp-sm" | "azure-kv" | "env";
11
+ /** Extract env keys from a `.env.example`/`.env.template` file body —
12
+ * `^KEY=` lines (KEY = upper/underscore/digit). Comments + blanks ignored. */
13
+ export declare function parseEnvTemplateKeys(content: string): string[];
11
14
  /**
12
15
  * Generate a .kit.toml string from a detected stack profile.
13
16
  */
14
17
  export declare function generateToml(stack: DetectedStack, options?: {
15
18
  secretsStore?: SecretsStore;
19
+ hasDockerfile?: boolean;
20
+ extraSecretKeys?: string[];
16
21
  }): string;