neon-init 0.16.2 → 0.17.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.
@@ -4,7 +4,7 @@ import { StatusResponse } from "../types.js";
4
4
  interface StatusOptions {
5
5
  agent?: string;
6
6
  }
7
- declare function handleStatusPhase(options: StatusOptions): Promise<StatusResponse>;
7
+ declare function handleStatusPhase(_options: StatusOptions): Promise<StatusResponse>;
8
8
  //#endregion
9
9
  export { StatusOptions, handleStatusPhase };
10
10
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","names":[],"sources":["../../../src/lib/phases/status.ts"],"mappings":";;;UAIiB,aAAA;;AAAjB;AAIsB,iBAAA,iBAAA,CAAiB,OAAA,EAC7B,aAD6B,CAAA,EAEpC,OAFoC,CAE5B,cAF4B,CAAA"}
1
+ {"version":3,"file":"status.d.ts","names":[],"sources":["../../../src/lib/phases/status.ts"],"mappings":";;;UAIiB,aAAA;;AAAjB;AAIsB,iBAAA,iBAAA,CAAiB,QAAA,EAC5B,aAD4B,CAAA,EAEpC,OAFoC,CAE5B,cAF4B,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { isAuthenticated } from "../auth.js";
2
2
  import { inspectProject } from "../inspect.js";
3
3
  //#region src/lib/phases/status.ts
4
- async function handleStatusPhase(options) {
4
+ async function handleStatusPhase(_options) {
5
5
  const authed = await isAuthenticated();
6
6
  const inspection = await inspectProject([
7
7
  {
@@ -28,22 +28,22 @@ async function handleStatusPhase(options) {
28
28
  if (!authed) recommendations.push({
29
29
  priority: "high",
30
30
  message: "Not authenticated with Neon",
31
- command: "neon-init auth --agent --json"
31
+ command: `neonctl init --agent --json --data '{"step":"auth"}'`
32
32
  });
33
33
  if (!hasDatabaseUrl) recommendations.push({
34
34
  priority: "high",
35
35
  message: "No DATABASE_URL found in .env",
36
- command: "neon-init db --agent --json"
36
+ command: `neonctl init --agent --json --data '{"step":"db"}'`
37
37
  });
38
38
  if (!skillsInstalled) recommendations.push({
39
39
  priority: "medium",
40
40
  message: "Neon agent skills not detected in this project",
41
- command: options.agent ? `neon-init skills --json --agent ${options.agent} --install` : "neon-init skills --json --install"
41
+ command: `neonctl init --agent --json --data '{"step":"skills","install":true}'`
42
42
  });
43
43
  if (migrationTool && !hasMigrations) recommendations.push({
44
44
  priority: "medium",
45
45
  message: `${migrationTool} detected but no migrations found`,
46
- command: "neon-init migrations --agent --json"
46
+ command: `neonctl init --agent --json --data '{"step":"migrations"}'`
47
47
  });
48
48
  return {
49
49
  auth: { authenticated: authed },
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","names":[],"sources":["../../../src/lib/phases/status.ts"],"sourcesContent":["import { isAuthenticated } from \"../auth.js\";\nimport { inspectProject } from \"../inspect.js\";\nimport type { StatusResponse } from \"../types.js\";\n\nexport interface StatusOptions {\n\tagent?: string;\n}\n\nexport async function handleStatusPhase(\n\toptions: StatusOptions,\n): Promise<StatusResponse> {\n\tconst authed = await isAuthenticated();\n\n\tconst inspection = await inspectProject([\n\t\t{ id: \"database_url\", description: \"\", lookFor: [] },\n\t\t{ id: \"skills\", description: \"\", lookFor: [] },\n\t\t{ id: \"migrations\", description: \"\", lookFor: [] },\n\t]);\n\n\tconst hasDatabaseUrl = inspection.databaseUrl === true;\n\tconst skillsInstalled = inspection.skillsInstalled === true;\n\tconst migrationTool = (inspection.migrationTool as string | null) ?? null;\n\tconst hasMigrations =\n\t\tmigrationTool !== null &&\n\t\tmigrationTool !== \"none\" &&\n\t\tinspection.migrationDir !== \"none\";\n\n\tconst recommendations: StatusResponse[\"recommendations\"] = [];\n\n\tif (!authed) {\n\t\trecommendations.push({\n\t\t\tpriority: \"high\",\n\t\t\tmessage: \"Not authenticated with Neon\",\n\t\t\tcommand: \"neon-init auth --agent --json\",\n\t\t});\n\t}\n\n\tif (!hasDatabaseUrl) {\n\t\trecommendations.push({\n\t\t\tpriority: \"high\",\n\t\t\tmessage: \"No DATABASE_URL found in .env\",\n\t\t\tcommand: \"neon-init db --agent --json\",\n\t\t});\n\t}\n\n\tif (!skillsInstalled) {\n\t\trecommendations.push({\n\t\t\tpriority: \"medium\",\n\t\t\tmessage: \"Neon agent skills not detected in this project\",\n\t\t\tcommand: options.agent\n\t\t\t\t? `neon-init skills --json --agent ${options.agent} --install`\n\t\t\t\t: \"neon-init skills --json --install\",\n\t\t});\n\t}\n\n\tif (migrationTool && !hasMigrations) {\n\t\trecommendations.push({\n\t\t\tpriority: \"medium\",\n\t\t\tmessage: `${migrationTool} detected but no migrations found`,\n\t\t\tcommand: \"neon-init migrations --agent --json\",\n\t\t});\n\t}\n\n\treturn {\n\t\tauth: {\n\t\t\tauthenticated: authed,\n\t\t},\n\t\ttooling: {\n\t\t\tmcpServer: { configured: null },\n\t\t\tskills: { installed: skillsInstalled },\n\t\t},\n\t\tproject: {\n\t\t\tdatabaseUrl: hasDatabaseUrl,\n\t\t},\n\t\tmigrations: {\n\t\t\ttool: migrationTool,\n\t\t\thasMigrations,\n\t\t},\n\t\trecommendations,\n\t};\n}\n"],"mappings":";;;AAQA,eAAsB,kBACrB,SAC0B;CAC1B,MAAM,SAAS,MAAM,gBAAgB;CAErC,MAAM,aAAa,MAAM,eAAe;EACvC;GAAE,IAAI;GAAgB,aAAa;GAAI,SAAS,CAAC;EAAE;EACnD;GAAE,IAAI;GAAU,aAAa;GAAI,SAAS,CAAC;EAAE;EAC7C;GAAE,IAAI;GAAc,aAAa;GAAI,SAAS,CAAC;EAAE;CAClD,CAAC;CAED,MAAM,iBAAiB,WAAW,gBAAgB;CAClD,MAAM,kBAAkB,WAAW,oBAAoB;CACvD,MAAM,gBAAiB,WAAW,iBAAmC;CACrE,MAAM,gBACL,kBAAkB,QAClB,kBAAkB,UAClB,WAAW,iBAAiB;CAE7B,MAAM,kBAAqD,CAAC;CAE5D,IAAI,CAAC,QACJ,gBAAgB,KAAK;EACpB,UAAU;EACV,SAAS;EACT,SAAS;CACV,CAAC;CAGF,IAAI,CAAC,gBACJ,gBAAgB,KAAK;EACpB,UAAU;EACV,SAAS;EACT,SAAS;CACV,CAAC;CAGF,IAAI,CAAC,iBACJ,gBAAgB,KAAK;EACpB,UAAU;EACV,SAAS;EACT,SAAS,QAAQ,QACd,mCAAmC,QAAQ,MAAM,cACjD;CACJ,CAAC;CAGF,IAAI,iBAAiB,CAAC,eACrB,gBAAgB,KAAK;EACpB,UAAU;EACV,SAAS,GAAG,cAAc;EAC1B,SAAS;CACV,CAAC;CAGF,OAAO;EACN,MAAM,EACL,eAAe,OAChB;EACA,SAAS;GACR,WAAW,EAAE,YAAY,KAAK;GAC9B,QAAQ,EAAE,WAAW,gBAAgB;EACtC;EACA,SAAS,EACR,aAAa,eACd;EACA,YAAY;GACX,MAAM;GACN;EACD;EACA;CACD;AACD"}
1
+ {"version":3,"file":"status.js","names":[],"sources":["../../../src/lib/phases/status.ts"],"sourcesContent":["import { isAuthenticated } from \"../auth.js\";\nimport { inspectProject } from \"../inspect.js\";\nimport type { StatusResponse } from \"../types.js\";\n\nexport interface StatusOptions {\n\tagent?: string;\n}\n\nexport async function handleStatusPhase(\n\t_options: StatusOptions,\n): Promise<StatusResponse> {\n\tconst authed = await isAuthenticated();\n\n\tconst inspection = await inspectProject([\n\t\t{ id: \"database_url\", description: \"\", lookFor: [] },\n\t\t{ id: \"skills\", description: \"\", lookFor: [] },\n\t\t{ id: \"migrations\", description: \"\", lookFor: [] },\n\t]);\n\n\tconst hasDatabaseUrl = inspection.databaseUrl === true;\n\tconst skillsInstalled = inspection.skillsInstalled === true;\n\tconst migrationTool = (inspection.migrationTool as string | null) ?? null;\n\tconst hasMigrations =\n\t\tmigrationTool !== null &&\n\t\tmigrationTool !== \"none\" &&\n\t\tinspection.migrationDir !== \"none\";\n\n\tconst recommendations: StatusResponse[\"recommendations\"] = [];\n\n\tif (!authed) {\n\t\trecommendations.push({\n\t\t\tpriority: \"high\",\n\t\t\tmessage: \"Not authenticated with Neon\",\n\t\t\tcommand: `neonctl init --agent --json --data '{\"step\":\"auth\"}'`,\n\t\t});\n\t}\n\n\tif (!hasDatabaseUrl) {\n\t\trecommendations.push({\n\t\t\tpriority: \"high\",\n\t\t\tmessage: \"No DATABASE_URL found in .env\",\n\t\t\tcommand: `neonctl init --agent --json --data '{\"step\":\"db\"}'`,\n\t\t});\n\t}\n\n\tif (!skillsInstalled) {\n\t\trecommendations.push({\n\t\t\tpriority: \"medium\",\n\t\t\tmessage: \"Neon agent skills not detected in this project\",\n\t\t\tcommand: `neonctl init --agent --json --data '{\"step\":\"skills\",\"install\":true}'`,\n\t\t});\n\t}\n\n\tif (migrationTool && !hasMigrations) {\n\t\trecommendations.push({\n\t\t\tpriority: \"medium\",\n\t\t\tmessage: `${migrationTool} detected but no migrations found`,\n\t\t\tcommand: `neonctl init --agent --json --data '{\"step\":\"migrations\"}'`,\n\t\t});\n\t}\n\n\treturn {\n\t\tauth: {\n\t\t\tauthenticated: authed,\n\t\t},\n\t\ttooling: {\n\t\t\tmcpServer: { configured: null },\n\t\t\tskills: { installed: skillsInstalled },\n\t\t},\n\t\tproject: {\n\t\t\tdatabaseUrl: hasDatabaseUrl,\n\t\t},\n\t\tmigrations: {\n\t\t\ttool: migrationTool,\n\t\t\thasMigrations,\n\t\t},\n\t\trecommendations,\n\t};\n}\n"],"mappings":";;;AAQA,eAAsB,kBACrB,UAC0B;CAC1B,MAAM,SAAS,MAAM,gBAAgB;CAErC,MAAM,aAAa,MAAM,eAAe;EACvC;GAAE,IAAI;GAAgB,aAAa;GAAI,SAAS,CAAC;EAAE;EACnD;GAAE,IAAI;GAAU,aAAa;GAAI,SAAS,CAAC;EAAE;EAC7C;GAAE,IAAI;GAAc,aAAa;GAAI,SAAS,CAAC;EAAE;CAClD,CAAC;CAED,MAAM,iBAAiB,WAAW,gBAAgB;CAClD,MAAM,kBAAkB,WAAW,oBAAoB;CACvD,MAAM,gBAAiB,WAAW,iBAAmC;CACrE,MAAM,gBACL,kBAAkB,QAClB,kBAAkB,UAClB,WAAW,iBAAiB;CAE7B,MAAM,kBAAqD,CAAC;CAE5D,IAAI,CAAC,QACJ,gBAAgB,KAAK;EACpB,UAAU;EACV,SAAS;EACT,SAAS;CACV,CAAC;CAGF,IAAI,CAAC,gBACJ,gBAAgB,KAAK;EACpB,UAAU;EACV,SAAS;EACT,SAAS;CACV,CAAC;CAGF,IAAI,CAAC,iBACJ,gBAAgB,KAAK;EACpB,UAAU;EACV,SAAS;EACT,SAAS;CACV,CAAC;CAGF,IAAI,iBAAiB,CAAC,eACrB,gBAAgB,KAAK;EACpB,UAAU;EACV,SAAS,GAAG,cAAc;EAC1B,SAAS;CACV,CAAC;CAGF,OAAO;EACN,MAAM,EACL,eAAe,OAChB;EACA,SAAS;GACR,WAAW,EAAE,YAAY,KAAK;GAC9B,QAAQ,EAAE,WAAW,gBAAgB;EACtC;EACA,SAAS,EACR,aAAa,eACd;EACA,YAAY;GACX,MAAM;GACN;EACD;EACA;CACD;AACD"}
@@ -3,6 +3,13 @@ import { PhaseResponse } from "./types.js";
3
3
  //#region src/lib/route-command.d.ts
4
4
 
5
5
  declare function routeCommand(args: string[]): Promise<PhaseResponse>;
6
+ /**
7
+ * Routes a --data JSON payload with a "step" field to the appropriate phase
8
+ * handler. This lets agents use a single command surface:
9
+ * neon-init --agent --json --data '{"step":"auth"}'
10
+ * neon-init --agent --json --data '{"step":"db","projectId":"xyz"}'
11
+ */
12
+ declare function routeDataStep(data: Record<string, unknown>, agent: string | undefined): Promise<unknown>;
6
13
  //#endregion
7
- export { routeCommand };
14
+ export { routeCommand, routeDataStep };
8
15
  //# sourceMappingURL=route-command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-command.d.ts","names":[],"sources":["../../src/lib/route-command.ts"],"mappings":";;;;AAuEoD,iBAA9B,YAAA,CAA8B,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,OAAA,CAAQ,aAAR,CAAA"}
1
+ {"version":3,"file":"route-command.d.ts","names":[],"sources":["../../src/lib/route-command.ts"],"mappings":";;;;AAuEoD,iBAA9B,YAAA,CAA8B,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,OAAA,CAAQ,aAAR,CAAA;AAAO;AAiL3D;;;;AAGU;iBAHY,aAAA,OACf,qDAEJ"}
@@ -189,7 +189,93 @@ async function routeCommand(args) {
189
189
  }
190
190
  }
191
191
  }
192
+ /**
193
+ * Routes a --data JSON payload with a "step" field to the appropriate phase
194
+ * handler. This lets agents use a single command surface:
195
+ * neon-init --agent --json --data '{"step":"auth"}'
196
+ * neon-init --agent --json --data '{"step":"db","projectId":"xyz"}'
197
+ */
198
+ async function routeDataStep(data, agent) {
199
+ const { step, ...rest } = data;
200
+ if (rest.data !== void 0 && Object.keys(rest).length === 1) {
201
+ let nested = rest.data;
202
+ if (typeof nested === "string") try {
203
+ nested = JSON.parse(nested);
204
+ } catch {}
205
+ if (typeof nested === "object" && nested !== null) {
206
+ Object.assign(rest, nested);
207
+ delete rest.data;
208
+ }
209
+ }
210
+ switch (step) {
211
+ case "auth": {
212
+ const { handleAuthPhase } = await import("./phases/auth.js");
213
+ return handleAuthPhase({
214
+ agent,
215
+ ...rest
216
+ });
217
+ }
218
+ case "db": {
219
+ const { handleDbPhase } = await import("./phases/db.js");
220
+ return handleDbPhase({
221
+ agent,
222
+ ...rest
223
+ });
224
+ }
225
+ case "setup": {
226
+ const { handleSetupPhase } = await import("./phases/setup.js");
227
+ return handleSetupPhase({
228
+ agent,
229
+ ...rest
230
+ });
231
+ }
232
+ case "getting-started": {
233
+ const { handleGettingStartedPhase } = await import("./phases/getting-started.js");
234
+ return handleGettingStartedPhase({
235
+ agent,
236
+ ...rest
237
+ });
238
+ }
239
+ case "mcp": {
240
+ const { handleMcpPhase } = await import("./phases/mcp.js");
241
+ return handleMcpPhase({
242
+ agent,
243
+ ...rest
244
+ });
245
+ }
246
+ case "skills": {
247
+ const { handleSkillsPhase } = await import("./phases/skills.js");
248
+ return handleSkillsPhase({
249
+ agent,
250
+ ...rest
251
+ });
252
+ }
253
+ case "migrations": {
254
+ const { handleMigrationsPhase } = await import("./phases/migrations.js");
255
+ return handleMigrationsPhase({
256
+ agent,
257
+ ...rest
258
+ });
259
+ }
260
+ case "neon-auth": {
261
+ const { handleNeonAuthPhase } = await import("./phases/neon-auth.js");
262
+ return handleNeonAuthPhase({
263
+ agent,
264
+ ...rest
265
+ });
266
+ }
267
+ case "status": {
268
+ const { handleStatusPhase } = await import("./phases/status.js");
269
+ return handleStatusPhase({ agent });
270
+ }
271
+ case "finalize": {
272
+ const { handleCleanup } = await import("./phases/cleanup.js");
273
+ return handleCleanup();
274
+ }
275
+ default: throw new Error(`Unknown step: "${step}". Valid steps: auth, db, setup, getting-started, mcp, skills, migrations, neon-auth, status, finalize`);
276
+ }
277
+ }
192
278
  //#endregion
193
- export { routeCommand };
279
+ export { routeCommand, routeDataStep };
194
280
 
195
281
  //# sourceMappingURL=route-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-command.js","names":[],"sources":["../../src/lib/route-command.ts"],"sourcesContent":["/**\n * Routes neon-init CLI args to the appropriate phase handler directly,\n * without shelling out. This is the in-process equivalent of calling\n * `neon-init <subcommand> <flags>`.\n */\n\nimport { detectAgent } from \"./detect-agent.js\";\nimport type { PhaseResponse } from \"./types.js\";\n\nfunction resolveAgent(explicit: string | undefined): string | undefined {\n\treturn explicit ?? detectAgent() ?? undefined;\n}\n\n/** Known short flag aliases (mirrors yargs config in cli.ts) */\nconst SHORT_FLAG_MAP: Record<string, string> = {\n\ta: \"agent\",\n};\n\nfunction parseArgs(args: string[]): Record<string, string | boolean> {\n\tconst result: Record<string, string | boolean> = {};\n\tlet i = 0;\n\n\t// First arg may be the subcommand\n\tif (args.length > 0 && !args[0].startsWith(\"-\")) {\n\t\tresult._command = args[0];\n\t\ti = 1;\n\t}\n\n\twhile (i < args.length) {\n\t\tconst arg = args[i];\n\t\tif (arg.startsWith(\"--\")) {\n\t\t\tconst key = arg\n\t\t\t\t.slice(2)\n\t\t\t\t.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n\t\t\tconst nextArg = args[i + 1];\n\t\t\tif (nextArg !== undefined && !nextArg.startsWith(\"-\")) {\n\t\t\t\tresult[key] = nextArg;\n\t\t\t\ti += 2;\n\t\t\t} else {\n\t\t\t\tresult[key] = true;\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t} else if (\n\t\t\targ.startsWith(\"-\") &&\n\t\t\t!arg.startsWith(\"--\") &&\n\t\t\targ.length === 2\n\t\t) {\n\t\t\tconst shortKey = arg[1];\n\t\t\tconst longKey = SHORT_FLAG_MAP[shortKey] ?? shortKey;\n\t\t\tconst nextArg = args[i + 1];\n\t\t\tif (nextArg !== undefined && !nextArg.startsWith(\"-\")) {\n\t\t\t\tresult[longKey] = nextArg;\n\t\t\t\ti += 2;\n\t\t\t} else {\n\t\t\t\tresult[longKey] = true;\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t} else {\n\t\t\ti += 1;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction toBool(val: string | boolean | undefined): boolean | null {\n\tif (val === true || val === \"true\") return true;\n\tif (val === false || val === \"false\") return false;\n\treturn null;\n}\n\nexport async function routeCommand(args: string[]): Promise<PhaseResponse> {\n\tconst parsed = parseArgs(args);\n\tconst command = parsed._command as string | undefined;\n\tconst agent = resolveAgent(parsed.agent as string | undefined);\n\n\tswitch (command) {\n\t\tcase \"finalize\": {\n\t\t\tconst { handleCleanup } = await import(\"./phases/cleanup.js\");\n\t\t\treturn handleCleanup();\n\t\t}\n\n\t\tcase \"auth\": {\n\t\t\tconst { handleAuthPhase } = await import(\"./phases/auth.js\");\n\t\t\treturn handleAuthPhase({\n\t\t\t\tagent,\n\t\t\t\tmethod: parsed.method as \"existing\" | \"new\" | undefined,\n\t\t\t\tverify: parsed.verify === true,\n\t\t\t});\n\t\t}\n\n\t\tcase \"mcp\": {\n\t\t\tconst { handleMcpPhase } = await import(\"./phases/mcp.js\");\n\t\t\treturn handleMcpPhase({\n\t\t\t\tagent,\n\t\t\t\tstatus: parsed.status === true,\n\t\t\t\tinstall: parsed.install === true || parsed.update === true,\n\t\t\t\tscope: (parsed.scope as \"global\" | \"project\") ?? \"global\",\n\t\t\t\tmcpConfigured: toBool(parsed.mcpConfigured),\n\t\t\t});\n\t\t}\n\n\t\tcase \"skills\": {\n\t\t\tconst { handleSkillsPhase } = await import(\"./phases/skills.js\");\n\t\t\treturn handleSkillsPhase({\n\t\t\t\tagent,\n\t\t\t\tstatus: parsed.status === true,\n\t\t\t\tinstall: parsed.install === true,\n\t\t\t\tupdate: parsed.update === true,\n\t\t\t});\n\t\t}\n\n\t\tcase \"setup\": {\n\t\t\tconst { handleSetupPhase } = await import(\"./phases/setup.js\");\n\n\t\t\t// --data JSON path\n\t\t\tif (typeof parsed.data === \"string\") {\n\t\t\t\tlet data: Record<string, unknown>;\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(parsed.data);\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new Error(\"Invalid JSON in --data flag\");\n\t\t\t\t}\n\n\t\t\t\t// Normalize string booleans\n\t\t\t\tfor (const key of [\n\t\t\t\t\t\"mcpConfigured\",\n\t\t\t\t\t\"connectionString\",\n\t\t\t\t\t\"isVscodeIde\",\n\t\t\t\t\t\"installExtension\",\n\t\t\t\t\t\"execute\",\n\t\t\t\t]) {\n\t\t\t\t\tif (data[key] === \"true\") data[key] = true;\n\t\t\t\t\telse if (data[key] === \"false\") data[key] = false;\n\t\t\t\t}\n\n\t\t\t\treturn handleSetupPhase({\n\t\t\t\t\tagent,\n\t\t\t\t\t...data,\n\t\t\t\t} as Parameters<typeof handleSetupPhase>[0]);\n\t\t\t}\n\n\t\t\treturn handleSetupPhase({\n\t\t\t\tagent,\n\t\t\t\tmcpConfigured: toBool(parsed.mcpConfigured),\n\t\t\t\tconnectionString: toBool(parsed.connectionString),\n\t\t\t\tframework: parsed.framework as string | undefined,\n\t\t\t\torm: parsed.orm as string | undefined,\n\t\t\t\tmigrationTool: parsed.migrationTool as string | undefined,\n\t\t\t\tmigrationDir: parsed.migrationDir as string | undefined,\n\t\t\t\tisVscodeIde: toBool(parsed.isVscodeIde),\n\t\t\t\tmode: parsed.mode as \"defaults\" | \"customize\" | undefined,\n\t\t\t\tmcpScope: parsed.mcpScope as \"global\" | \"project\" | undefined,\n\t\t\t\tskillsScope: parsed.skillsScope as\n\t\t\t\t\t| \"global\"\n\t\t\t\t\t| \"project\"\n\t\t\t\t\t| undefined,\n\t\t\t\tinstallExtension: toBool(parsed.installExtension) === true,\n\t\t\t\texecute: parsed.execute === true,\n\t\t\t});\n\t\t}\n\n\t\tcase \"getting-started\": {\n\t\t\tconst { handleGettingStartedPhase } = await import(\n\t\t\t\t\"./phases/getting-started.js\"\n\t\t\t);\n\n\t\t\tif (typeof parsed.data === \"string\") {\n\t\t\t\tlet data: Record<string, unknown>;\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(parsed.data);\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new Error(\"Invalid JSON in --data flag\");\n\t\t\t\t}\n\t\t\t\treturn handleGettingStartedPhase({\n\t\t\t\t\tagent,\n\t\t\t\t\t...data,\n\t\t\t\t} as Parameters<typeof handleGettingStartedPhase>[0]);\n\t\t\t}\n\n\t\t\treturn handleGettingStartedPhase({\n\t\t\t\tagent,\n\t\t\t\thasConnectionString: parsed.hasConnectionString === true,\n\t\t\t\tframework: parsed.framework as string | undefined,\n\t\t\t\torm: parsed.orm as string | undefined,\n\t\t\t\tmigrationTool: parsed.migrationTool as string | undefined,\n\t\t\t\tmigrationDir: parsed.migrationDir as string | undefined,\n\t\t\t});\n\t\t}\n\n\t\tcase \"db\": {\n\t\t\tconst { handleDbPhase } = await import(\"./phases/db.js\");\n\t\t\treturn handleDbPhase({\n\t\t\t\tagent,\n\t\t\t\torgId: parsed.orgId as string | undefined,\n\t\t\t\tprojectId: parsed.projectId as string | undefined,\n\t\t\t\torgsResult: parsed.orgsResult as string | undefined,\n\t\t\t\tprojectsResult: parsed.projectsResult as string | undefined,\n\t\t\t\tframework: parsed.framework as string | undefined,\n\t\t\t\torm: parsed.orm as string | undefined,\n\t\t\t\terror: parsed.error as string | undefined,\n\t\t\t});\n\t\t}\n\n\t\tcase \"neon-auth\": {\n\t\t\tconst { handleNeonAuthPhase } = await import(\n\t\t\t\t\"./phases/neon-auth.js\"\n\t\t\t);\n\t\t\treturn handleNeonAuthPhase({\n\t\t\t\tagent,\n\t\t\t\tsetup: parsed.setup === true,\n\t\t\t\tinfo: parsed.info === true,\n\t\t\t\tprojectId: parsed.projectId as string | undefined,\n\t\t\t});\n\t\t}\n\n\t\tcase \"migrations\": {\n\t\t\tconst { handleMigrationsPhase } = await import(\n\t\t\t\t\"./phases/migrations.js\"\n\t\t\t);\n\t\t\treturn handleMigrationsPhase({\n\t\t\t\tagent,\n\t\t\t\ttool: parsed.tool as string | undefined,\n\t\t\t\tmigrationDir: parsed.migrationDir as string | undefined,\n\t\t\t\tscaffold: parsed.scaffold as \"prisma\" | \"drizzle\" | undefined,\n\t\t\t\tapply: parsed.apply === true,\n\t\t\t});\n\t\t}\n\n\t\tdefault: {\n\t\t\t// No subcommand — run the orchestrator\n\t\t\tconst { orchestrate } = await import(\"../v2.js\");\n\t\t\treturn orchestrate({\n\t\t\t\tagent,\n\t\t\t\tskipNeonAuth: parsed.skipNeonAuth === true,\n\t\t\t\tskipMigrations: parsed.skipMigrations === true,\n\t\t\t\tpreview: parsed.preview === true,\n\t\t\t});\n\t\t}\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"route-command.js","names":[],"sources":["../../src/lib/route-command.ts"],"sourcesContent":["/**\n * Routes neon-init CLI args to the appropriate phase handler directly,\n * without shelling out. This is the in-process equivalent of calling\n * `neon-init <subcommand> <flags>`.\n */\n\nimport { detectAgent } from \"./detect-agent.js\";\nimport type { PhaseResponse } from \"./types.js\";\n\nfunction resolveAgent(explicit: string | undefined): string | undefined {\n\treturn explicit ?? detectAgent() ?? undefined;\n}\n\n/** Known short flag aliases (mirrors yargs config in cli.ts) */\nconst SHORT_FLAG_MAP: Record<string, string> = {\n\ta: \"agent\",\n};\n\nfunction parseArgs(args: string[]): Record<string, string | boolean> {\n\tconst result: Record<string, string | boolean> = {};\n\tlet i = 0;\n\n\t// First arg may be the subcommand\n\tif (args.length > 0 && !args[0].startsWith(\"-\")) {\n\t\tresult._command = args[0];\n\t\ti = 1;\n\t}\n\n\twhile (i < args.length) {\n\t\tconst arg = args[i];\n\t\tif (arg.startsWith(\"--\")) {\n\t\t\tconst key = arg\n\t\t\t\t.slice(2)\n\t\t\t\t.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n\t\t\tconst nextArg = args[i + 1];\n\t\t\tif (nextArg !== undefined && !nextArg.startsWith(\"-\")) {\n\t\t\t\tresult[key] = nextArg;\n\t\t\t\ti += 2;\n\t\t\t} else {\n\t\t\t\tresult[key] = true;\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t} else if (\n\t\t\targ.startsWith(\"-\") &&\n\t\t\t!arg.startsWith(\"--\") &&\n\t\t\targ.length === 2\n\t\t) {\n\t\t\tconst shortKey = arg[1];\n\t\t\tconst longKey = SHORT_FLAG_MAP[shortKey] ?? shortKey;\n\t\t\tconst nextArg = args[i + 1];\n\t\t\tif (nextArg !== undefined && !nextArg.startsWith(\"-\")) {\n\t\t\t\tresult[longKey] = nextArg;\n\t\t\t\ti += 2;\n\t\t\t} else {\n\t\t\t\tresult[longKey] = true;\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t} else {\n\t\t\ti += 1;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction toBool(val: string | boolean | undefined): boolean | null {\n\tif (val === true || val === \"true\") return true;\n\tif (val === false || val === \"false\") return false;\n\treturn null;\n}\n\nexport async function routeCommand(args: string[]): Promise<PhaseResponse> {\n\tconst parsed = parseArgs(args);\n\tconst command = parsed._command as string | undefined;\n\tconst agent = resolveAgent(parsed.agent as string | undefined);\n\n\tswitch (command) {\n\t\tcase \"finalize\": {\n\t\t\tconst { handleCleanup } = await import(\"./phases/cleanup.js\");\n\t\t\treturn handleCleanup();\n\t\t}\n\n\t\tcase \"auth\": {\n\t\t\tconst { handleAuthPhase } = await import(\"./phases/auth.js\");\n\t\t\treturn handleAuthPhase({\n\t\t\t\tagent,\n\t\t\t\tmethod: parsed.method as \"existing\" | \"new\" | undefined,\n\t\t\t\tverify: parsed.verify === true,\n\t\t\t});\n\t\t}\n\n\t\tcase \"mcp\": {\n\t\t\tconst { handleMcpPhase } = await import(\"./phases/mcp.js\");\n\t\t\treturn handleMcpPhase({\n\t\t\t\tagent,\n\t\t\t\tstatus: parsed.status === true,\n\t\t\t\tinstall: parsed.install === true || parsed.update === true,\n\t\t\t\tscope: (parsed.scope as \"global\" | \"project\") ?? \"global\",\n\t\t\t\tmcpConfigured: toBool(parsed.mcpConfigured),\n\t\t\t});\n\t\t}\n\n\t\tcase \"skills\": {\n\t\t\tconst { handleSkillsPhase } = await import(\"./phases/skills.js\");\n\t\t\treturn handleSkillsPhase({\n\t\t\t\tagent,\n\t\t\t\tstatus: parsed.status === true,\n\t\t\t\tinstall: parsed.install === true,\n\t\t\t\tupdate: parsed.update === true,\n\t\t\t});\n\t\t}\n\n\t\tcase \"setup\": {\n\t\t\tconst { handleSetupPhase } = await import(\"./phases/setup.js\");\n\n\t\t\t// --data JSON path\n\t\t\tif (typeof parsed.data === \"string\") {\n\t\t\t\tlet data: Record<string, unknown>;\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(parsed.data);\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new Error(\"Invalid JSON in --data flag\");\n\t\t\t\t}\n\n\t\t\t\t// Normalize string booleans\n\t\t\t\tfor (const key of [\n\t\t\t\t\t\"mcpConfigured\",\n\t\t\t\t\t\"connectionString\",\n\t\t\t\t\t\"isVscodeIde\",\n\t\t\t\t\t\"installExtension\",\n\t\t\t\t\t\"execute\",\n\t\t\t\t]) {\n\t\t\t\t\tif (data[key] === \"true\") data[key] = true;\n\t\t\t\t\telse if (data[key] === \"false\") data[key] = false;\n\t\t\t\t}\n\n\t\t\t\treturn handleSetupPhase({\n\t\t\t\t\tagent,\n\t\t\t\t\t...data,\n\t\t\t\t} as Parameters<typeof handleSetupPhase>[0]);\n\t\t\t}\n\n\t\t\treturn handleSetupPhase({\n\t\t\t\tagent,\n\t\t\t\tmcpConfigured: toBool(parsed.mcpConfigured),\n\t\t\t\tconnectionString: toBool(parsed.connectionString),\n\t\t\t\tframework: parsed.framework as string | undefined,\n\t\t\t\torm: parsed.orm as string | undefined,\n\t\t\t\tmigrationTool: parsed.migrationTool as string | undefined,\n\t\t\t\tmigrationDir: parsed.migrationDir as string | undefined,\n\t\t\t\tisVscodeIde: toBool(parsed.isVscodeIde),\n\t\t\t\tmode: parsed.mode as \"defaults\" | \"customize\" | undefined,\n\t\t\t\tmcpScope: parsed.mcpScope as \"global\" | \"project\" | undefined,\n\t\t\t\tskillsScope: parsed.skillsScope as\n\t\t\t\t\t| \"global\"\n\t\t\t\t\t| \"project\"\n\t\t\t\t\t| undefined,\n\t\t\t\tinstallExtension: toBool(parsed.installExtension) === true,\n\t\t\t\texecute: parsed.execute === true,\n\t\t\t});\n\t\t}\n\n\t\tcase \"getting-started\": {\n\t\t\tconst { handleGettingStartedPhase } = await import(\n\t\t\t\t\"./phases/getting-started.js\"\n\t\t\t);\n\n\t\t\tif (typeof parsed.data === \"string\") {\n\t\t\t\tlet data: Record<string, unknown>;\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(parsed.data);\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new Error(\"Invalid JSON in --data flag\");\n\t\t\t\t}\n\t\t\t\treturn handleGettingStartedPhase({\n\t\t\t\t\tagent,\n\t\t\t\t\t...data,\n\t\t\t\t} as Parameters<typeof handleGettingStartedPhase>[0]);\n\t\t\t}\n\n\t\t\treturn handleGettingStartedPhase({\n\t\t\t\tagent,\n\t\t\t\thasConnectionString: parsed.hasConnectionString === true,\n\t\t\t\tframework: parsed.framework as string | undefined,\n\t\t\t\torm: parsed.orm as string | undefined,\n\t\t\t\tmigrationTool: parsed.migrationTool as string | undefined,\n\t\t\t\tmigrationDir: parsed.migrationDir as string | undefined,\n\t\t\t});\n\t\t}\n\n\t\tcase \"db\": {\n\t\t\tconst { handleDbPhase } = await import(\"./phases/db.js\");\n\t\t\treturn handleDbPhase({\n\t\t\t\tagent,\n\t\t\t\torgId: parsed.orgId as string | undefined,\n\t\t\t\tprojectId: parsed.projectId as string | undefined,\n\t\t\t\torgsResult: parsed.orgsResult as string | undefined,\n\t\t\t\tprojectsResult: parsed.projectsResult as string | undefined,\n\t\t\t\tframework: parsed.framework as string | undefined,\n\t\t\t\torm: parsed.orm as string | undefined,\n\t\t\t\terror: parsed.error as string | undefined,\n\t\t\t});\n\t\t}\n\n\t\tcase \"neon-auth\": {\n\t\t\tconst { handleNeonAuthPhase } = await import(\n\t\t\t\t\"./phases/neon-auth.js\"\n\t\t\t);\n\t\t\treturn handleNeonAuthPhase({\n\t\t\t\tagent,\n\t\t\t\tsetup: parsed.setup === true,\n\t\t\t\tinfo: parsed.info === true,\n\t\t\t\tprojectId: parsed.projectId as string | undefined,\n\t\t\t});\n\t\t}\n\n\t\tcase \"migrations\": {\n\t\t\tconst { handleMigrationsPhase } = await import(\n\t\t\t\t\"./phases/migrations.js\"\n\t\t\t);\n\t\t\treturn handleMigrationsPhase({\n\t\t\t\tagent,\n\t\t\t\ttool: parsed.tool as string | undefined,\n\t\t\t\tmigrationDir: parsed.migrationDir as string | undefined,\n\t\t\t\tscaffold: parsed.scaffold as \"prisma\" | \"drizzle\" | undefined,\n\t\t\t\tapply: parsed.apply === true,\n\t\t\t});\n\t\t}\n\n\t\tdefault: {\n\t\t\t// No subcommand — run the orchestrator\n\t\t\tconst { orchestrate } = await import(\"../v2.js\");\n\t\t\treturn orchestrate({\n\t\t\t\tagent,\n\t\t\t\tskipNeonAuth: parsed.skipNeonAuth === true,\n\t\t\t\tskipMigrations: parsed.skipMigrations === true,\n\t\t\t\tpreview: parsed.preview === true,\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Routes a --data JSON payload with a \"step\" field to the appropriate phase\n * handler. This lets agents use a single command surface:\n * neon-init --agent --json --data '{\"step\":\"auth\"}'\n * neon-init --agent --json --data '{\"step\":\"db\",\"projectId\":\"xyz\"}'\n */\nexport async function routeDataStep(\n\tdata: Record<string, unknown>,\n\tagent: string | undefined,\n): Promise<unknown> {\n\tconst { step, ...rest } = data;\n\n\t// Agents sometimes nest the actual payload inside a \"data\" key:\n\t// {\"step\":\"setup\",\"data\":{\"mode\":\"defaults\",...}}\n\t// or as a JSON string:\n\t// {\"step\":\"setup\",\"data\":\"{\\\"mode\\\":\\\"defaults\\\",...}\"}\n\t// Unwrap it so the phase handler gets the right options.\n\tif (rest.data !== undefined && Object.keys(rest).length === 1) {\n\t\tlet nested = rest.data;\n\t\tif (typeof nested === \"string\") {\n\t\t\ttry {\n\t\t\t\tnested = JSON.parse(nested);\n\t\t\t} catch {\n\t\t\t\t// leave as-is\n\t\t\t}\n\t\t}\n\t\tif (typeof nested === \"object\" && nested !== null) {\n\t\t\tObject.assign(rest, nested);\n\t\t\tdelete rest.data;\n\t\t}\n\t}\n\n\tswitch (step) {\n\t\tcase \"auth\": {\n\t\t\tconst { handleAuthPhase } = await import(\"./phases/auth.js\");\n\t\t\treturn handleAuthPhase({ agent, ...rest } as Parameters<\n\t\t\t\ttypeof handleAuthPhase\n\t\t\t>[0]);\n\t\t}\n\n\t\tcase \"db\": {\n\t\t\tconst { handleDbPhase } = await import(\"./phases/db.js\");\n\t\t\treturn handleDbPhase({ agent, ...rest } as Parameters<\n\t\t\t\ttypeof handleDbPhase\n\t\t\t>[0]);\n\t\t}\n\n\t\tcase \"setup\": {\n\t\t\tconst { handleSetupPhase } = await import(\"./phases/setup.js\");\n\t\t\treturn handleSetupPhase({ agent, ...rest } as Parameters<\n\t\t\t\ttypeof handleSetupPhase\n\t\t\t>[0]);\n\t\t}\n\n\t\tcase \"getting-started\": {\n\t\t\tconst { handleGettingStartedPhase } = await import(\n\t\t\t\t\"./phases/getting-started.js\"\n\t\t\t);\n\t\t\treturn handleGettingStartedPhase({ agent, ...rest } as Parameters<\n\t\t\t\ttypeof handleGettingStartedPhase\n\t\t\t>[0]);\n\t\t}\n\n\t\tcase \"mcp\": {\n\t\t\tconst { handleMcpPhase } = await import(\"./phases/mcp.js\");\n\t\t\treturn handleMcpPhase({ agent, ...rest } as Parameters<\n\t\t\t\ttypeof handleMcpPhase\n\t\t\t>[0]);\n\t\t}\n\n\t\tcase \"skills\": {\n\t\t\tconst { handleSkillsPhase } = await import(\"./phases/skills.js\");\n\t\t\treturn handleSkillsPhase({ agent, ...rest } as Parameters<\n\t\t\t\ttypeof handleSkillsPhase\n\t\t\t>[0]);\n\t\t}\n\n\t\tcase \"migrations\": {\n\t\t\tconst { handleMigrationsPhase } = await import(\n\t\t\t\t\"./phases/migrations.js\"\n\t\t\t);\n\t\t\treturn handleMigrationsPhase({ agent, ...rest } as Parameters<\n\t\t\t\ttypeof handleMigrationsPhase\n\t\t\t>[0]);\n\t\t}\n\n\t\tcase \"neon-auth\": {\n\t\t\tconst { handleNeonAuthPhase } = await import(\n\t\t\t\t\"./phases/neon-auth.js\"\n\t\t\t);\n\t\t\treturn handleNeonAuthPhase({ agent, ...rest } as Parameters<\n\t\t\t\ttypeof handleNeonAuthPhase\n\t\t\t>[0]);\n\t\t}\n\n\t\tcase \"status\": {\n\t\t\tconst { handleStatusPhase } = await import(\"./phases/status.js\");\n\t\t\treturn handleStatusPhase({ agent });\n\t\t}\n\n\t\tcase \"finalize\": {\n\t\t\tconst { handleCleanup } = await import(\"./phases/cleanup.js\");\n\t\t\treturn handleCleanup();\n\t\t}\n\n\t\tdefault:\n\t\t\tthrow new Error(\n\t\t\t\t`Unknown step: \"${step}\". Valid steps: auth, db, setup, getting-started, mcp, skills, migrations, neon-auth, status, finalize`,\n\t\t\t);\n\t}\n}\n"],"mappings":"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"}
@@ -35,6 +35,7 @@ type Phase = "auth" | "tooling" | "setup" | "db" | "neon_auth" | "migrations";
35
35
  type NextAction = AskUserAction | RunCommandAction | RunNeonInitAction | AgentCheckAction | AgentActionAction | RestartRequiredAction | CompleteAction;
36
36
  interface AskUserAction {
37
37
  type: "ask_user";
38
+ instructions?: string;
38
39
  question: string;
39
40
  options: (string | {
40
41
  value: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/lib/types.ts"],"mappings":";KAAY,MAAA;AAAA,KAgBA,aAAA,GAhBM,SAAA,GAAA,QAAA;AAgBN,UAMK,UAAA,CANQ;EAMR,OAAA,EAAA,OAAU;EAAA,IAAA,EAAA,OAAA;cAOjB,CAAA,EAAA,OAAA;kBACA,CAAA,EAAA,MAAA;mBAMI,CAAA,EAAA,MAAA;EAAM,OAAA,EAAA;IAqBR,MAAK,EA5BP,MA4BO;IAUL,MAAA,EArCF,aAqCY;IAAA,IAAA,EAAA,KAAA,GAAA,WAAA;KACnB;QACA,EAAA;IACA,SAAA,EAAA,OAAA;IACA,cAAA,EAAA,MAAA,GAAA,IAAA;IACA,UAAA,EApCW,MAoCX,CAAA,MAAA,EAAA,MAAA,CAAA;;SAEA,EAAA;IAAc,aAAA,EAAA,OAAA;IAEA,QAAA,EAAA;MAAa,QAAA,EAAA,MAAA;MAQG,YAAA,EAAA,MAAA;MAFf,aAAA,EAAA,MAAA;MAAM,mBAAA,EAAA,MAAA;IAMP,CAAA;EAAgB,CAAA;WAKrB,EAAA;IACgB,UAAA,EAAA,OAAA;IAAf,eAAA,EAAA,OAAA;EAAM,CAAA;AAGnB;AAKiB,KA7CL,KAAA,GA6Ce,MAAA,GAAA,SAAA,GAAA,OAAA,GAAA,IAAA,GAAA,WAAA,GAAA,YAAA;AAMV,KAzCL,UAAA,GACT,aAwC8B,GAvC9B,gBAuC8B,GAtC9B,iBAsC8B,GArC9B,gBAqC8B,GApC9B,iBAoC8B,GAnC9B,qBAmC8B,GAlC9B,cAkC8B;AAAA,UAhChB,aAAA,CAgCgB;MAIxB,EAAA,UAAA;UAEU,EAAA,MAAA;SACN,EAAA,CAAA,MAAA,GAAA;IAAiB,KAAA,EAAA,MAAA;IAGb,KAAA,EAAA,MAAc;EAiBd,CAAA,CAAA,EAAA;EAMA,OAAA,CAAA,EAAA,MAAA;EAAiB;iBAG1B,EA9DU,MA8DV,CAAA,MAAA,EAAA;IACK,IAAA,EAAA,MAAA,EAAA;MAAoB;IAAc,MAAA,EA7Dd,UA6Dc;EAG9B,CAAA,CAAA;AAMjB;AAOiB,UAzEA,gBAAA,CAyEa;EAAA,IAAA,EAAA,aAAA;SACtB,EAAA,MAAA;aAEK,CAAA,EAAA,MAAA;EAAU,OAAA,CAAA,EAAA,MAAA;EAMN,SAAA,EA7EL,iBA6EmB;cA5ElB,eAAe;;UAGX,iBAAA;;;;UAKA,UAAA;;;;;UAMA,gBAAA;;;;UAIR;;oBAEU;cACN;;UAGI,cAAA;;;;;;;;;;;;;;;;;;;UAiBA,SAAA;;;;;UAMA,iBAAA;;;SAGT;cACK,oBAAoB;;UAGhB,qBAAA;;;;;UAMA,cAAA;;;;UAOA,aAAA;SACT;;cAEK;;;UAMI,cAAA"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/lib/types.ts"],"mappings":";KAAY,MAAA;AAAA,KAgBA,aAAA,GAhBM,SAAA,GAAA,QAAA;AAgBN,UAMK,UAAA,CANQ;EAMR,OAAA,EAAA,OAAU;EAAA,IAAA,EAAA,OAAA;cAOjB,CAAA,EAAA,OAAA;kBACA,CAAA,EAAA,MAAA;mBAMI,CAAA,EAAA,MAAA;EAAM,OAAA,EAAA;IAqBR,MAAK,EA5BP,MA4BO;IAUL,MAAA,EArCF,aAqCY;IAAA,IAAA,EAAA,KAAA,GAAA,WAAA;KACnB;QACA,EAAA;IACA,SAAA,EAAA,OAAA;IACA,cAAA,EAAA,MAAA,GAAA,IAAA;IACA,UAAA,EApCW,MAoCX,CAAA,MAAA,EAAA,MAAA,CAAA;;SAEA,EAAA;IAAc,aAAA,EAAA,OAAA;IAEA,QAAA,EAAA;MAAa,QAAA,EAAA,MAAA;MASG,YAAA,EAAA,MAAA;MAFf,aAAA,EAAA,MAAA;MAAM,mBAAA,EAAA,MAAA;IAMP,CAAA;EAAgB,CAAA;WAKrB,EAAA;IACgB,UAAA,EAAA,OAAA;IAAf,eAAA,EAAA,OAAA;EAAM,CAAA;AAGnB;AAKiB,KA9CL,KAAA,GA8Ce,MAAA,GAAA,SAAA,GAAA,OAAA,GAAA,IAAA,GAAA,WAAA,GAAA,YAAA;AAMV,KA1CL,UAAA,GACT,aAyC8B,GAxC9B,gBAwC8B,GAvC9B,iBAuC8B,GAtC9B,gBAsC8B,GArC9B,iBAqC8B,GApC9B,qBAoC8B,GAnC9B,cAmC8B;AAAA,UAjChB,aAAA,CAiCgB;MAIxB,EAAA,UAAA;cAEU,CAAA,EAAA,MAAA;UACN,EAAA,MAAA;EAAiB,OAAA,EAAA,CAAA,MAAA,GAAA;IAGb,KAAA,EAAA,MAAc;IAiBd,KAAA,EAAA,MAAS;EAMT,CAAA,CAAA,EAAA;EAAiB,OAAA,CAAA,EAAA,MAAA;;iBAIrB,EA/DK,MA+DL,CAAA,MAAA,EAAA;IAAoB,IAAA,EAAA,MAAA,EAAA;EAAc,CAAA,GAAA;IAG9B,MAAA,EAhEgB,UAgEhB;EAMA,CAAA,CAAA;AAOjB;AAA8B,UAzEb,gBAAA,CAyEa;MACtB,EAAA,aAAA;SAEK,EAAA,MAAA;EAAU,WAAA,CAAA,EAAA,MAAA;EAMN,OAAA,CAAA,EAAA,MAAA;aA7EL;cACC,eAAe;;UAGX,iBAAA;;;;UAKA,UAAA;;;;;UAMA,gBAAA;;;;UAIR;;oBAEU;cACN;;UAGI,cAAA;;;;;;;;;;;;;;;;;;;UAiBA,SAAA;;;;;UAMA,iBAAA;;;SAGT;cACK,oBAAoB;;UAGhB,qBAAA;;;;;UAMA,cAAA;;;;UAOA,aAAA;SACT;;cAEK;;;UAMI,cAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neon-init",
3
- "version": "0.16.2",
3
+ "version": "0.17.0",
4
4
  "description": "Initialize Neon projects",
5
5
  "keywords": [
6
6
  "neon",