neon 3.0.0 → 3.1.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/README.md +54 -0
- package/dist/_shared/auth_selection.js +76 -79
- package/dist/_shared/credentials.js +166 -187
- package/dist/_shared/env-core/env.js +354 -517
- package/dist/_shared/env-core/reuse-secrets.js +159 -203
- package/dist/_shared/paths.js +129 -126
- package/dist/_shared/profiles.js +192 -242
- package/dist/_shared/secure_file.js +36 -38
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/analytics.js +163 -207
- package/dist/api.js +815 -758
- package/dist/auth.js +121 -141
- package/dist/auth_context.js +39 -53
- package/dist/cli.js +4 -7
- package/dist/commands/api.js +220 -250
- package/dist/commands/api_keys.js +251 -314
- package/dist/commands/auth.js +283 -328
- package/dist/commands/bootstrap.js +372 -437
- package/dist/commands/branches.js +304 -455
- package/dist/commands/bucket.js +374 -514
- package/dist/commands/checkout.js +213 -298
- package/dist/commands/config.js +573 -690
- package/dist/commands/connection_string.js +137 -165
- package/dist/commands/data_api.js +238 -260
- package/dist/commands/databases.js +67 -76
- package/dist/commands/deploy.js +31 -25
- package/dist/commands/dev.js +639 -719
- package/dist/commands/diff.js +156 -200
- package/dist/commands/env.js +243 -303
- package/dist/commands/functions.js +275 -355
- package/dist/commands/index.js +70 -65
- package/dist/commands/init.js +84 -119
- package/dist/commands/inspect.js +55 -55
- package/dist/commands/ip_allow.js +88 -120
- package/dist/commands/link.js +874 -1019
- package/dist/commands/logs.js +291 -0
- package/dist/commands/neon_auth.js +725 -933
- package/dist/commands/operations.js +34 -25
- package/dist/commands/orgs.js +28 -18
- package/dist/commands/profile.js +614 -845
- package/dist/commands/projects.js +313 -373
- package/dist/commands/psql.js +60 -58
- package/dist/commands/roles.js +55 -58
- package/dist/commands/schema_diff.js +87 -131
- package/dist/commands/set_context.js +34 -26
- package/dist/commands/snapshots.js +288 -413
- package/dist/commands/status.js +41 -37
- package/dist/commands/user.js +21 -10
- package/dist/commands/vpc_endpoints.js +85 -113
- package/dist/config.js +7 -6
- package/dist/config_format.js +50 -66
- package/dist/config_template.js +128 -157
- package/dist/context.js +183 -235
- package/dist/current_branch_fast_path.js +40 -49
- package/dist/dev/env.js +313 -394
- package/dist/dev/functions.js +54 -68
- package/dist/dev/inputs.js +46 -58
- package/dist/dev/runtime.js +135 -164
- package/dist/dev/websocket.js +766 -959
- package/dist/env.js +27 -33
- package/dist/env_file.js +118 -132
- package/dist/env_services.js +36 -38
- package/dist/errors.js +57 -68
- package/dist/functions_api.js +45 -43
- package/dist/help.js +189 -140
- package/dist/index.js +182 -257
- package/dist/init/agents.js +137 -118
- package/dist/init/auth.js +58 -68
- package/dist/init/bootstrap.js +325 -396
- package/dist/init/build_config.js +4 -2
- package/dist/init/detect_agent.js +56 -101
- package/dist/init/editors.js +35 -52
- package/dist/init/enrich_output.js +51 -66
- package/dist/init/extension.js +134 -171
- package/dist/init/inspect.js +179 -266
- package/dist/init/interactive.js +510 -622
- package/dist/init/neonctl.js +117 -168
- package/dist/init/orchestrate.js +157 -173
- package/dist/init/phases/auth.js +188 -202
- package/dist/init/phases/cleanup.js +23 -23
- package/dist/init/phases/db.js +251 -277
- package/dist/init/phases/getting_started.js +213 -223
- package/dist/init/phases/mcp.js +174 -224
- package/dist/init/phases/migrations.js +247 -248
- package/dist/init/phases/neon_auth.js +114 -133
- package/dist/init/phases/setup.js +546 -703
- package/dist/init/phases/skills.js +75 -86
- package/dist/init/phases/status.js +72 -67
- package/dist/init/resolve_context.js +102 -99
- package/dist/init/route_command.js +91 -98
- package/dist/init/skills.js +174 -218
- package/dist/init/vsix.js +77 -99
- package/dist/log.js +17 -16
- package/dist/neon_services.js +104 -129
- package/dist/parameters.gen.js +481 -471
- package/dist/pkg.js +17 -19
- package/dist/profile_keys.js +44 -47
- package/dist/psql/cli.js +44 -47
- package/dist/psql/command/cmd_cond.js +231 -406
- package/dist/psql/command/cmd_connect.js +557 -764
- package/dist/psql/command/cmd_copy.js +727 -983
- package/dist/psql/command/cmd_describe.js +1499 -1688
- package/dist/psql/command/cmd_format.js +733 -905
- package/dist/psql/command/cmd_io.js +1293 -2082
- package/dist/psql/command/cmd_lo.js +297 -359
- package/dist/psql/command/cmd_meta.js +727 -878
- package/dist/psql/command/cmd_misc.js +138 -172
- package/dist/psql/command/cmd_pipeline.js +547 -1099
- package/dist/psql/command/cmd_restrict.js +119 -155
- package/dist/psql/command/cmd_show.js +529 -688
- package/dist/psql/command/dispatch.js +261 -325
- package/dist/psql/command/inputQueue.js +35 -33
- package/dist/psql/command/shared.js +49 -63
- package/dist/psql/complete/filenames.js +90 -133
- package/dist/psql/complete/index.js +59 -97
- package/dist/psql/complete/matcher.js +236 -300
- package/dist/psql/complete/psqlVars.js +218 -223
- package/dist/psql/complete/queries.js +159 -177
- package/dist/psql/complete/rules.js +1493 -2299
- package/dist/psql/core/common.js +762 -1180
- package/dist/psql/core/help.js +456 -546
- package/dist/psql/core/mainloop.js +692 -1302
- package/dist/psql/core/prompt.js +391 -408
- package/dist/psql/core/settings.js +429 -644
- package/dist/psql/core/sqlHelp.js +480 -554
- package/dist/psql/core/startup.js +626 -815
- package/dist/psql/core/syncVars.js +67 -110
- package/dist/psql/core/variables.js +156 -278
- package/dist/psql/describe/formatters.js +884 -1285
- package/dist/psql/describe/processNamePattern.js +173 -260
- package/dist/psql/describe/queries.js +1368 -2403
- package/dist/psql/describe/versionGate.js +32 -41
- package/dist/psql/index.js +1414 -1927
- package/dist/psql/io/history.js +232 -271
- package/dist/psql/io/input.js +103 -108
- package/dist/psql/io/lineEditor/buffer.js +238 -319
- package/dist/psql/io/lineEditor/complete.js +135 -213
- package/dist/psql/io/lineEditor/filename.js +139 -148
- package/dist/psql/io/lineEditor/index.js +653 -870
- package/dist/psql/io/lineEditor/keymap.js +544 -702
- package/dist/psql/io/lineEditor/vt100.js +294 -341
- package/dist/psql/io/pgpass.js +158 -187
- package/dist/psql/io/pgservice.js +146 -183
- package/dist/psql/io/psqlrc.js +328 -403
- package/dist/psql/print/aligned.js +1020 -1683
- package/dist/psql/print/asciidoc.js +180 -214
- package/dist/psql/print/crosstab.js +281 -442
- package/dist/psql/print/csv.js +48 -70
- package/dist/psql/print/html.js +195 -226
- package/dist/psql/print/json.js +75 -88
- package/dist/psql/print/latex.js +291 -364
- package/dist/psql/print/pager.js +171 -242
- package/dist/psql/print/troff.js +194 -226
- package/dist/psql/print/unaligned.js +69 -95
- package/dist/psql/print/units.js +167 -169
- package/dist/psql/scanner/slash.js +428 -483
- package/dist/psql/scanner/sql.js +445 -889
- package/dist/psql/scanner/stringutils.js +309 -379
- package/dist/psql/types/index.js +2 -7
- package/dist/psql/types/scanner.js +25 -22
- package/dist/psql/wire/connection.js +2042 -2803
- package/dist/psql/wire/copy.js +84 -100
- package/dist/psql/wire/notify.js +39 -59
- package/dist/psql/wire/pipeline.js +305 -518
- package/dist/psql/wire/protocol.js +349 -417
- package/dist/psql/wire/sasl.js +180 -265
- package/dist/psql/wire/tls.js +400 -561
- package/dist/storage_api.js +115 -129
- package/dist/test_utils/fixtures.js +94 -113
- package/dist/test_utils/oauth_server.js +10 -7
- package/dist/test_utils/project_dir.js +33 -0
- package/dist/utils/ai_gateway_notice.js +131 -162
- package/dist/utils/api_enums.js +21 -28
- package/dist/utils/auth.js +10 -4
- package/dist/utils/branch_notice.js +20 -19
- package/dist/utils/branch_picker.js +83 -89
- package/dist/utils/cli_name.js +15 -12
- package/dist/utils/compute_units.js +20 -27
- package/dist/utils/config_diff.js +127 -158
- package/dist/utils/enrichers.js +95 -148
- package/dist/utils/esbuild.js +130 -189
- package/dist/utils/flags.js +35 -47
- package/dist/utils/formats.js +8 -15
- package/dist/utils/git_diff.js +69 -80
- package/dist/utils/inspect_db.js +101 -143
- package/dist/utils/inspect_queries.js +179 -142
- package/dist/utils/middlewares.js +37 -44
- package/dist/utils/openapi.js +87 -99
- package/dist/utils/package_manager.js +312 -110
- package/dist/utils/point_in_time.js +49 -53
- package/dist/utils/psql.js +89 -106
- package/dist/utils/service_picker.js +55 -58
- package/dist/utils/string.js +5 -5
- package/dist/utils/ui.js +38 -55
- package/dist/utils/write_sync.js +26 -35
- package/dist/utils/zip.js +4 -3
- package/dist/writer.js +67 -87
- package/package.json +7 -5
package/dist/init/inspect.js
CHANGED
|
@@ -1,287 +1,200 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Filesystem-based project inspection for interactive (agentless) mode.
|
|
3
|
-
* Replaces the "agent_check" pattern — instead of asking an agent to look,
|
|
4
|
-
* we examine the filesystem directly.
|
|
5
|
-
*/
|
|
6
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
7
2
|
import { resolve } from "node:path";
|
|
3
|
+
//#region src/init/inspect.ts
|
|
4
|
+
/**
|
|
5
|
+
* Filesystem-based project inspection for interactive (agentless) mode.
|
|
6
|
+
* Replaces the "agent_check" pattern — instead of asking an agent to look,
|
|
7
|
+
* we examine the filesystem directly.
|
|
8
|
+
*/
|
|
8
9
|
/**
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
break;
|
|
53
|
-
case "agent_type":
|
|
54
|
-
// Handled by the interactive runner (prompt or env detection)
|
|
55
|
-
break;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return results;
|
|
10
|
+
* Runs filesystem checks based on the agent_check descriptors.
|
|
11
|
+
* Maps check IDs to concrete inspection functions.
|
|
12
|
+
*/
|
|
13
|
+
async function inspectProject(checks) {
|
|
14
|
+
const results = {};
|
|
15
|
+
const cwd = process.cwd();
|
|
16
|
+
for (const check of checks) switch (check.id) {
|
|
17
|
+
case "mcp_server": {
|
|
18
|
+
const mcpScope = checkMcpServer(cwd);
|
|
19
|
+
results.mcpConfigured = mcpScope !== false;
|
|
20
|
+
results.mcpScope = mcpScope;
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
case "connection_string":
|
|
24
|
+
results.connectionString = checkConnectionString(cwd);
|
|
25
|
+
break;
|
|
26
|
+
case "database_url":
|
|
27
|
+
results.databaseUrl = checkDatabaseUrl(cwd);
|
|
28
|
+
break;
|
|
29
|
+
case "project_stack": {
|
|
30
|
+
const stack = detectProjectStack(cwd);
|
|
31
|
+
results.framework = stack.framework;
|
|
32
|
+
results.orm = stack.orm;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
case "migrations": {
|
|
36
|
+
const migrations = detectMigrations(cwd);
|
|
37
|
+
results.migrationTool = migrations.tool;
|
|
38
|
+
results.migrationDir = migrations.dir;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
case "skills": {
|
|
42
|
+
const skillsScope = checkSkillsInstalled(cwd);
|
|
43
|
+
results.skillsInstalled = skillsScope !== false;
|
|
44
|
+
results.skillsScope = skillsScope;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
case "ide_type":
|
|
48
|
+
results.isVscodeIde = checkVscodeIde();
|
|
49
|
+
break;
|
|
50
|
+
case "has_app": results.hasApp = checkHasApp(cwd);
|
|
51
|
+
}
|
|
52
|
+
return results;
|
|
59
53
|
}
|
|
60
|
-
// ---------------------------------------------------------------------------
|
|
61
|
-
// Individual check implementations
|
|
62
|
-
// ---------------------------------------------------------------------------
|
|
63
54
|
function checkMcpServer(cwd) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
// Check global configs
|
|
83
|
-
const globalConfigs = [
|
|
84
|
-
resolve(home, ".cursor", "mcp.json"),
|
|
85
|
-
// Claude Code config (add-mcp writes to settings.local.json)
|
|
86
|
-
resolve(home, ".claude", "settings.local.json"),
|
|
87
|
-
resolve(home, ".claude", "settings.json"),
|
|
88
|
-
];
|
|
89
|
-
for (const configPath of globalConfigs) {
|
|
90
|
-
if (existsSync(configPath)) {
|
|
91
|
-
try {
|
|
92
|
-
const content = readFileSync(configPath, "utf-8");
|
|
93
|
-
if (content.includes("neon") ||
|
|
94
|
-
content.includes("mcp.neon.tech")) {
|
|
95
|
-
return "global";
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
catch { }
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return false;
|
|
55
|
+
const home = process.env.HOME || process.env.USERPROFILE || "";
|
|
56
|
+
const projectConfigs = [resolve(cwd, ".cursor", "mcp.json"), resolve(cwd, ".vscode", "settings.json")];
|
|
57
|
+
for (const configPath of projectConfigs) if (existsSync(configPath)) try {
|
|
58
|
+
const content = readFileSync(configPath, "utf-8");
|
|
59
|
+
if (content.includes("neon") || content.includes("mcp.neon.tech")) return "project";
|
|
60
|
+
} catch {}
|
|
61
|
+
const globalConfigs = [
|
|
62
|
+
resolve(home, ".cursor", "mcp.json"),
|
|
63
|
+
resolve(home, ".claude", "settings.local.json"),
|
|
64
|
+
resolve(home, ".claude", "settings.json")
|
|
65
|
+
];
|
|
66
|
+
for (const configPath of globalConfigs) if (existsSync(configPath)) try {
|
|
67
|
+
const content = readFileSync(configPath, "utf-8");
|
|
68
|
+
if (content.includes("neon") || content.includes("mcp.neon.tech")) return "global";
|
|
69
|
+
} catch {}
|
|
70
|
+
return false;
|
|
102
71
|
}
|
|
103
72
|
function checkConnectionString(cwd) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
catch { }
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return false;
|
|
73
|
+
for (const envFile of [".env", ".env.local"]) {
|
|
74
|
+
const envPath = resolve(cwd, envFile);
|
|
75
|
+
if (existsSync(envPath)) try {
|
|
76
|
+
const content = readFileSync(envPath, "utf-8");
|
|
77
|
+
if (/^DATABASE_URL=.*neon/m.test(content) || /^PGHOST=.*neon/m.test(content)) return true;
|
|
78
|
+
} catch {}
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
118
81
|
}
|
|
119
82
|
function detectProjectStack(cwd) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
if (allDeps.prisma || allDeps["@prisma/client"])
|
|
149
|
-
result.orm = "prisma";
|
|
150
|
-
else if (allDeps["drizzle-orm"])
|
|
151
|
-
result.orm = "drizzle";
|
|
152
|
-
else if (allDeps.knex)
|
|
153
|
-
result.orm = "knex";
|
|
154
|
-
else if (allDeps.typeorm)
|
|
155
|
-
result.orm = "typeorm";
|
|
156
|
-
else if (allDeps.sequelize)
|
|
157
|
-
result.orm = "sequelize";
|
|
158
|
-
else if (allDeps["@neondatabase/serverless"])
|
|
159
|
-
result.orm = "neon-serverless";
|
|
160
|
-
}
|
|
161
|
-
catch { }
|
|
162
|
-
return result;
|
|
83
|
+
const result = {
|
|
84
|
+
framework: "none",
|
|
85
|
+
orm: "none"
|
|
86
|
+
};
|
|
87
|
+
const pkgPath = resolve(cwd, "package.json");
|
|
88
|
+
if (!existsSync(pkgPath)) return result;
|
|
89
|
+
try {
|
|
90
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
91
|
+
const allDeps = {
|
|
92
|
+
...pkg.dependencies,
|
|
93
|
+
...pkg.devDependencies
|
|
94
|
+
};
|
|
95
|
+
if (allDeps.next) result.framework = "next";
|
|
96
|
+
else if (allDeps.remix || allDeps["@remix-run/node"]) result.framework = "remix";
|
|
97
|
+
else if (allDeps.express) result.framework = "express";
|
|
98
|
+
else if (allDeps.hono) result.framework = "hono";
|
|
99
|
+
else if (allDeps.fastify) result.framework = "fastify";
|
|
100
|
+
else if (allDeps["@sveltejs/kit"]) result.framework = "sveltekit";
|
|
101
|
+
else if (allDeps.nuxt) result.framework = "nuxt";
|
|
102
|
+
else if (allDeps.astro) result.framework = "astro";
|
|
103
|
+
if (allDeps.prisma || allDeps["@prisma/client"]) result.orm = "prisma";
|
|
104
|
+
else if (allDeps["drizzle-orm"]) result.orm = "drizzle";
|
|
105
|
+
else if (allDeps.knex) result.orm = "knex";
|
|
106
|
+
else if (allDeps.typeorm) result.orm = "typeorm";
|
|
107
|
+
else if (allDeps.sequelize) result.orm = "sequelize";
|
|
108
|
+
else if (allDeps["@neondatabase/serverless"]) result.orm = "neon-serverless";
|
|
109
|
+
} catch {}
|
|
110
|
+
return result;
|
|
163
111
|
}
|
|
164
112
|
function detectMigrations(cwd) {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
}
|
|
191
|
-
return { tool: "none", dir: "none" };
|
|
113
|
+
if (existsSync(resolve(cwd, "prisma", "schema.prisma"))) {
|
|
114
|
+
const migrationsDir = resolve(cwd, "prisma", "migrations");
|
|
115
|
+
return {
|
|
116
|
+
tool: "prisma",
|
|
117
|
+
dir: existsSync(migrationsDir) ? "prisma/migrations" : "none"
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
if (existsSync(resolve(cwd, "drizzle.config.ts")) || existsSync(resolve(cwd, "drizzle.config.js"))) {
|
|
121
|
+
const drizzleDir = resolve(cwd, "drizzle");
|
|
122
|
+
return {
|
|
123
|
+
tool: "drizzle",
|
|
124
|
+
dir: existsSync(drizzleDir) ? "drizzle" : "none"
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (existsSync(resolve(cwd, "knexfile.js")) || existsSync(resolve(cwd, "knexfile.ts"))) {
|
|
128
|
+
const migrationsDir = resolve(cwd, "migrations");
|
|
129
|
+
return {
|
|
130
|
+
tool: "knex",
|
|
131
|
+
dir: existsSync(migrationsDir) ? "migrations" : "none"
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
tool: "none",
|
|
136
|
+
dir: "none"
|
|
137
|
+
};
|
|
192
138
|
}
|
|
193
139
|
function checkDatabaseUrl(cwd) {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}
|
|
201
|
-
catch { }
|
|
202
|
-
}
|
|
203
|
-
return false;
|
|
140
|
+
const envPath = resolve(cwd, ".env");
|
|
141
|
+
if (existsSync(envPath)) try {
|
|
142
|
+
const content = readFileSync(envPath, "utf-8");
|
|
143
|
+
if (/^DATABASE_URL=/m.test(content)) return true;
|
|
144
|
+
} catch {}
|
|
145
|
+
return false;
|
|
204
146
|
}
|
|
205
147
|
function checkSkillsInstalled(cwd) {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
}
|
|
229
|
-
// Check global skill directories — ALL base skills must exist
|
|
230
|
-
const globalDirs = [
|
|
231
|
-
resolve(home, ".cursor", "skills"),
|
|
232
|
-
resolve(home, ".claude", "skills"),
|
|
233
|
-
resolve(home, ".agents", "skills"),
|
|
234
|
-
];
|
|
235
|
-
const allGlobalSkills = skillNames.every((skill) => globalDirs.some((dir) => existsSync(resolve(dir, skill, "SKILL.md"))));
|
|
236
|
-
if (allGlobalSkills)
|
|
237
|
-
return "global";
|
|
238
|
-
// Check for partial installations — ANY skill exists
|
|
239
|
-
const anyProjectSkill = skillNames.some((skill) => projectDirs.some((dir) => existsSync(resolve(dir, skill, "SKILL.md"))));
|
|
240
|
-
if (anyProjectSkill)
|
|
241
|
-
return "project-partial";
|
|
242
|
-
const anyGlobalSkill = skillNames.some((skill) => globalDirs.some((dir) => existsSync(resolve(dir, skill, "SKILL.md"))));
|
|
243
|
-
if (anyGlobalSkill)
|
|
244
|
-
return "global-partial";
|
|
245
|
-
return false;
|
|
148
|
+
const home = process.env.HOME || process.env.USERPROFILE || "";
|
|
149
|
+
const skillNames = ["neon", "neon-postgres"];
|
|
150
|
+
const projectDirs = [
|
|
151
|
+
resolve(cwd, ".cursor", "skills"),
|
|
152
|
+
resolve(cwd, ".claude", "skills"),
|
|
153
|
+
resolve(cwd, ".agents", "skills")
|
|
154
|
+
];
|
|
155
|
+
if (skillNames.every((skill) => projectDirs.some((dir) => existsSync(resolve(dir, skill, "SKILL.md"))))) return "project";
|
|
156
|
+
const claudeMd = resolve(cwd, "CLAUDE.md");
|
|
157
|
+
if (existsSync(claudeMd)) try {
|
|
158
|
+
const content = readFileSync(claudeMd, "utf-8");
|
|
159
|
+
if (content.includes("neon-postgres") && content.includes("neon/SKILL.md")) return "project";
|
|
160
|
+
} catch {}
|
|
161
|
+
const globalDirs = [
|
|
162
|
+
resolve(home, ".cursor", "skills"),
|
|
163
|
+
resolve(home, ".claude", "skills"),
|
|
164
|
+
resolve(home, ".agents", "skills")
|
|
165
|
+
];
|
|
166
|
+
if (skillNames.every((skill) => globalDirs.some((dir) => existsSync(resolve(dir, skill, "SKILL.md"))))) return "global";
|
|
167
|
+
if (skillNames.some((skill) => projectDirs.some((dir) => existsSync(resolve(dir, skill, "SKILL.md"))))) return "project-partial";
|
|
168
|
+
if (skillNames.some((skill) => globalDirs.some((dir) => existsSync(resolve(dir, skill, "SKILL.md"))))) return "global-partial";
|
|
169
|
+
return false;
|
|
246
170
|
}
|
|
247
171
|
function checkVscodeIde() {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
env.TERM_PROGRAM === "cursor" ||
|
|
251
|
-
env.TERM_PROGRAM === "windsurf" ||
|
|
252
|
-
env.VSCODE_PID ||
|
|
253
|
-
env.VSCODE_CWD);
|
|
172
|
+
const env = process.env;
|
|
173
|
+
return !!(env.TERM_PROGRAM === "vscode" || env.TERM_PROGRAM === "cursor" || env.TERM_PROGRAM === "windsurf" || env.VSCODE_PID || env.VSCODE_CWD);
|
|
254
174
|
}
|
|
255
175
|
/**
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
176
|
+
* Detects whether the current directory contains an application.
|
|
177
|
+
* Returns true if package.json has dependencies or common source directories exist.
|
|
178
|
+
*/
|
|
259
179
|
function checkHasApp(cwd) {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
"index.js",
|
|
279
|
-
"main.ts",
|
|
280
|
-
"main.js",
|
|
281
|
-
];
|
|
282
|
-
for (const indicator of indicators) {
|
|
283
|
-
if (existsSync(resolve(cwd, indicator)))
|
|
284
|
-
return true;
|
|
285
|
-
}
|
|
286
|
-
return false;
|
|
180
|
+
const pkgPath = resolve(cwd, "package.json");
|
|
181
|
+
if (existsSync(pkgPath)) try {
|
|
182
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
183
|
+
const deps = Object.keys(pkg.dependencies ?? {});
|
|
184
|
+
const devDeps = Object.keys(pkg.devDependencies ?? {});
|
|
185
|
+
if (deps.length > 0 || devDeps.length > 0) return true;
|
|
186
|
+
} catch {}
|
|
187
|
+
for (const indicator of [
|
|
188
|
+
"src",
|
|
189
|
+
"app",
|
|
190
|
+
"pages",
|
|
191
|
+
"lib",
|
|
192
|
+
"index.ts",
|
|
193
|
+
"index.js",
|
|
194
|
+
"main.ts",
|
|
195
|
+
"main.js"
|
|
196
|
+
]) if (existsSync(resolve(cwd, indicator))) return true;
|
|
197
|
+
return false;
|
|
287
198
|
}
|
|
199
|
+
//#endregion
|
|
200
|
+
export { inspectProject };
|