neon 8.2.0 → 8.3.1
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 +1 -1
- package/dist/analytics.js +26 -0
- package/dist/auth.js +1 -1
- package/dist/commands/branches.js +13 -4
- package/dist/commands/env.js +4 -5
- package/dist/commands/env_output.js +6 -3
- package/dist/commands/snapshots.js +38 -34
- package/dist/error_reporting.js +4158 -0
- package/dist/errors.js +7 -1
- package/dist/index.js +1 -1
- package/dist/init/copy.js +2 -1
- package/dist/init/mode.js +2 -3
- package/dist/utils/formats.js +8 -1
- package/package.json +5 -4
package/dist/errors.js
CHANGED
|
@@ -11,6 +11,12 @@ const matchErrorCode = (message) => {
|
|
|
11
11
|
return "UNKNOWN_ERROR";
|
|
12
12
|
};
|
|
13
13
|
/**
|
|
14
|
+
* The CLI reports failures it handles by throwing a plain `Error` with the message to print.
|
|
15
|
+
* One of JavaScript's own error types is a case it did not handle: a bug, or input it never
|
|
16
|
+
* validated.
|
|
17
|
+
*/
|
|
18
|
+
const isUnexpectedError = (err) => err instanceof TypeError || err instanceof ReferenceError || err instanceof RangeError || err instanceof SyntaxError;
|
|
19
|
+
/**
|
|
14
20
|
* The single, human-readable line shown when the CLI couldn't reach the Neon API because
|
|
15
21
|
* of a connection-level failure (DNS, refused/reset connection, offline). It replaces the
|
|
16
22
|
* cryptic `fetch failed` / empty axios message a network blip otherwise surfaces (see
|
|
@@ -67,4 +73,4 @@ const isNetworkError = (err) => {
|
|
|
67
73
|
return false;
|
|
68
74
|
};
|
|
69
75
|
//#endregion
|
|
70
|
-
export { NETWORK_ERROR_MESSAGE, isNetworkError, matchErrorCode };
|
|
76
|
+
export { NETWORK_ERROR_MESSAGE, isNetworkError, isUnexpectedError, matchErrorCode };
|
package/dist/index.js
CHANGED
|
@@ -5,8 +5,8 @@ import { getAuthContext } from "./auth_context.js";
|
|
|
5
5
|
import { r as defaultDir } from "./_chunks/paths-DMq0Lt7a.js";
|
|
6
6
|
import { ensureConfigDir } from "./config.js";
|
|
7
7
|
import { currentContextFile, enrichFromContext } from "./context.js";
|
|
8
|
-
import { analyticsMiddleware, closeAnalytics, initAnalyticsClientMiddleware, sendError, takeCommandSuccessExtras, trackCommandSuccess } from "./analytics.js";
|
|
9
8
|
import { NETWORK_ERROR_MESSAGE, isNetworkError, matchErrorCode } from "./errors.js";
|
|
9
|
+
import { analyticsMiddleware, closeAnalytics, initAnalyticsClientMiddleware, sendError, takeCommandSuccessExtras, trackCommandSuccess } from "./analytics.js";
|
|
10
10
|
import { AuthRefreshError, defaultClientID } from "./auth.js";
|
|
11
11
|
import { getCliName } from "./utils/cli_name.js";
|
|
12
12
|
import { ensureAuth } from "./commands/auth.js";
|
package/dist/init/copy.js
CHANGED
|
@@ -49,6 +49,7 @@ const SERVICES_MESSAGE = "Which services should neon.ts declare? (space to toggl
|
|
|
49
49
|
const PACKAGE_MANAGER_MESSAGE = "Which package manager should install the Neon dependencies?";
|
|
50
50
|
const NO_AGENTS_FALLBACK_STATUS = "No coding agents detected. Installing the default Neon skills for Cursor and Codex in this directory.";
|
|
51
51
|
const NO_AGENT_SETUP_CONFLICT = "--no-agent-setup cannot be combined with --agent, --skill, or MCP flags.";
|
|
52
|
+
const INIT_NEEDS_YES = "No interactive terminal. Re-run with -y to set up this directory with Recommended defaults: `neon init -y`. To pick each step instead, run `neon init` in a terminal, or see `neon init --help` for the flag that sets each step.";
|
|
52
53
|
const NON_TTY_LINK_NEEDS_AUTH = "No interactive terminal. Sign in with `neon login`, then re-run, or pass --claimable.";
|
|
53
54
|
const YES_LINK_NEEDS_AUTH = "-y cannot sign in. Sign in with `neon login`, then re-run, or pass --claimable.";
|
|
54
55
|
const MCP_SCOPED_NEEDS_PROJECT = "--mcp-project-scoped requires a linked project. Link a project first, or omit --mcp-project-scoped.";
|
|
@@ -136,4 +137,4 @@ const headingForOutcome = (outcome) => {
|
|
|
136
137
|
}
|
|
137
138
|
};
|
|
138
139
|
//#endregion
|
|
139
|
-
export { AGENT_DETECTED_DESCRIPTION, AGENT_MCP_PICKER_MESSAGE, AGENT_MCP_SKIP_MESSAGE, AGENT_OTHER_DESCRIPTION, AGENT_PICKER_MESSAGE, AGENT_PLUGIN_SKIP_MESSAGE, AGENT_SETUP_MESSAGE, AGENT_SETUP_PLUGIN_DESCRIPTION, AGENT_SETUP_PLUGIN_TITLE, AGENT_SETUP_SKILLS_DESCRIPTION, AGENT_SETUP_SKILLS_TITLE, AGENT_SETUP_SKIP_DESCRIPTION, AGENT_SETUP_SKIP_TITLE, AGENT_SKILLS_PICKER_MESSAGE, AGENT_SKILLS_SKIP_MESSAGE, CANCELLED_BODY, CLAIMABLE_ACCOUNT_FLAGS, CLAIMABLE_ALREADY_LINKED, CLAIMABLE_MCP_API_KEY, CLAIMABLE_NO_LINK, CONFIG_CONFIRM_HINT, CONFIG_CONFIRM_MESSAGE, HEADING_CANCELLED, HEADING_COMPLETE, HEADING_FAILED, HEADING_PENDING, INIT_SUBTITLE, MCP_AUTH_API_KEY_DESCRIPTION, MCP_AUTH_API_KEY_TITLE, MCP_AUTH_MESSAGE, MCP_AUTH_OAUTH_DESCRIPTION, MCP_AUTH_OAUTH_TITLE, MCP_SCOPED_NEEDS_PROJECT, MCP_SCOPE_GLOBAL_DESCRIPTION, MCP_SCOPE_GLOBAL_TITLE, MCP_SCOPE_MESSAGE, MCP_SCOPE_PROJECT_DESCRIPTION, MCP_SCOPE_PROJECT_TITLE, MODE_CUSTOM_DESCRIPTION, MODE_CUSTOM_TITLE, MODE_MESSAGE, MODE_RECOMMENDED_DESCRIPTION, MODE_RECOMMENDED_TITLE, NON_TTY_AGENT_SETUP, NON_TTY_LINK_NEEDS_AUTH, NO_AGENTS_FALLBACK_STATUS, NO_AGENT_SETUP_CONFLICT, PACKAGE_MANAGER_MESSAGE, PROGRESS, PROJECT_SETUP_CLAIMABLE_DESCRIPTION, PROJECT_SETUP_CLAIMABLE_TITLE, PROJECT_SETUP_LINK_DESCRIPTION, PROJECT_SETUP_LINK_TITLE, PROJECT_SETUP_MESSAGE, SERVICES_HINT, SERVICES_MESSAGE, SKILLS_PICKER_MESSAGE, YES_LINK_NEEDS_AUTH, agentMissingCommandDescription, claimableNext, claimableThenServicesNext, envPullFailedNext, existingConfigNext, extraServicesNext, headingForOutcome, installFailedNext, mcpConfigLocationSkipped, mcpConfigLocationUnavailable, namedAgentsUnavailable, skippedLinkNext, unattendedUnauthedNext };
|
|
140
|
+
export { AGENT_DETECTED_DESCRIPTION, AGENT_MCP_PICKER_MESSAGE, AGENT_MCP_SKIP_MESSAGE, AGENT_OTHER_DESCRIPTION, AGENT_PICKER_MESSAGE, AGENT_PLUGIN_SKIP_MESSAGE, AGENT_SETUP_MESSAGE, AGENT_SETUP_PLUGIN_DESCRIPTION, AGENT_SETUP_PLUGIN_TITLE, AGENT_SETUP_SKILLS_DESCRIPTION, AGENT_SETUP_SKILLS_TITLE, AGENT_SETUP_SKIP_DESCRIPTION, AGENT_SETUP_SKIP_TITLE, AGENT_SKILLS_PICKER_MESSAGE, AGENT_SKILLS_SKIP_MESSAGE, CANCELLED_BODY, CLAIMABLE_ACCOUNT_FLAGS, CLAIMABLE_ALREADY_LINKED, CLAIMABLE_MCP_API_KEY, CLAIMABLE_NO_LINK, CONFIG_CONFIRM_HINT, CONFIG_CONFIRM_MESSAGE, HEADING_CANCELLED, HEADING_COMPLETE, HEADING_FAILED, HEADING_PENDING, INIT_NEEDS_YES, INIT_SUBTITLE, MCP_AUTH_API_KEY_DESCRIPTION, MCP_AUTH_API_KEY_TITLE, MCP_AUTH_MESSAGE, MCP_AUTH_OAUTH_DESCRIPTION, MCP_AUTH_OAUTH_TITLE, MCP_SCOPED_NEEDS_PROJECT, MCP_SCOPE_GLOBAL_DESCRIPTION, MCP_SCOPE_GLOBAL_TITLE, MCP_SCOPE_MESSAGE, MCP_SCOPE_PROJECT_DESCRIPTION, MCP_SCOPE_PROJECT_TITLE, MODE_CUSTOM_DESCRIPTION, MODE_CUSTOM_TITLE, MODE_MESSAGE, MODE_RECOMMENDED_DESCRIPTION, MODE_RECOMMENDED_TITLE, NON_TTY_AGENT_SETUP, NON_TTY_LINK_NEEDS_AUTH, NO_AGENTS_FALLBACK_STATUS, NO_AGENT_SETUP_CONFLICT, PACKAGE_MANAGER_MESSAGE, PROGRESS, PROJECT_SETUP_CLAIMABLE_DESCRIPTION, PROJECT_SETUP_CLAIMABLE_TITLE, PROJECT_SETUP_LINK_DESCRIPTION, PROJECT_SETUP_LINK_TITLE, PROJECT_SETUP_MESSAGE, SERVICES_HINT, SERVICES_MESSAGE, SKILLS_PICKER_MESSAGE, YES_LINK_NEEDS_AUTH, agentMissingCommandDescription, claimableNext, claimableThenServicesNext, envPullFailedNext, existingConfigNext, extraServicesNext, headingForOutcome, installFailedNext, mcpConfigLocationSkipped, mcpConfigLocationUnavailable, namedAgentsUnavailable, skippedLinkNext, unattendedUnauthedNext };
|
package/dist/init/mode.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { NON_TTY_AGENT_SETUP, NO_AGENT_SETUP_CONFLICT } from "./copy.js";
|
|
1
|
+
import { INIT_NEEDS_YES, NON_TTY_AGENT_SETUP, NO_AGENT_SETUP_CONFLICT } from "./copy.js";
|
|
3
2
|
//#region src/init/mode.ts
|
|
4
3
|
const hasInitMcpFlags = (input) => input.mcpConfigLocation !== void 0 || input.mcpAuth !== void 0 || input.mcpProjectScoped === true;
|
|
5
4
|
const hasSkillsFlag = (skills) => skills !== void 0 && skills.length > 0;
|
|
@@ -10,7 +9,7 @@ const resolveInitMode = (input) => {
|
|
|
10
9
|
if (input.yes) return { kind: "recommended" };
|
|
11
10
|
if (hasExistingSetupFlags(input)) return { kind: "custom" };
|
|
12
11
|
if (input.interactive) return { kind: "ask" };
|
|
13
|
-
throw new Error(
|
|
12
|
+
throw new Error(INIT_NEEDS_YES);
|
|
14
13
|
};
|
|
15
14
|
const assertAgentSetupFlags = (input) => {
|
|
16
15
|
if (!input.skipAgents) return;
|
package/dist/utils/formats.js
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
//#region src/utils/formats.ts
|
|
2
2
|
const HAIKU_REGEX = /^[a-z0-9]+-[a-z0-9]+-[a-z0-9]+$/;
|
|
3
3
|
const looksLikeBranchId = (branch) => branch.startsWith("br-") && HAIKU_REGEX.test(branch.substring(3));
|
|
4
|
+
const looksLikeSnapshotId = (snapshot) => snapshot.startsWith("snap-") && HAIKU_REGEX.test(snapshot.substring(5));
|
|
4
5
|
const LSN_REGEX = /^[a-fA-F0-9]{1,8}\/[a-fA-F0-9]{1,8}$/;
|
|
5
6
|
const looksLikeLSN = (lsn) => LSN_REGEX.test(lsn);
|
|
7
|
+
/** Normalize a user-supplied date to an ISO 8601 string, or throw a friendly error. */
|
|
8
|
+
const toIso = (value, flag) => {
|
|
9
|
+
const ms = Date.parse(value);
|
|
10
|
+
if (Number.isNaN(ms)) throw new Error(`Invalid ${flag} value: "${value}". Use an RFC 3339 timestamp, e.g. 2025-12-31T23:59:59Z.`);
|
|
11
|
+
return new Date(ms).toISOString();
|
|
12
|
+
};
|
|
6
13
|
const looksLikeTimestamp = (timestamp) => {
|
|
7
14
|
if (isNaN(Date.parse(timestamp))) return false;
|
|
8
15
|
return /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?([+-]\d{2}:\d{2}|Z)$/.test(timestamp);
|
|
9
16
|
};
|
|
10
17
|
//#endregion
|
|
11
|
-
export { looksLikeBranchId, looksLikeLSN, looksLikeTimestamp };
|
|
18
|
+
export { looksLikeBranchId, looksLikeLSN, looksLikeSnapshotId, looksLikeTimestamp, toIso };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "neon",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.3.1",
|
|
4
4
|
"description": "CLI tool for Neon, the cloud backend primitives built around Lakebase Postgres",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"neon",
|
|
@@ -65,8 +65,8 @@
|
|
|
65
65
|
"yargs": "17.7.2",
|
|
66
66
|
"yoctocolors": "^2.1.2",
|
|
67
67
|
"@neon/config-runtime": "1.8.0",
|
|
68
|
-
"@neon/
|
|
69
|
-
"@neon/
|
|
68
|
+
"@neon/config": "1.8.6",
|
|
69
|
+
"@neon/sdk": "7.0.1"
|
|
70
70
|
},
|
|
71
71
|
"optionalDependencies": {
|
|
72
72
|
"@napi-rs/keyring": "1.3.0",
|
|
@@ -78,6 +78,7 @@
|
|
|
78
78
|
"@rollup/plugin-commonjs": "25.0.8",
|
|
79
79
|
"@rollup/plugin-json": "6.1.0",
|
|
80
80
|
"@rollup/plugin-node-resolve": "15.2.3",
|
|
81
|
+
"@sentry/core": "11.2.0",
|
|
81
82
|
"@testcontainers/postgresql": "^11.14.0",
|
|
82
83
|
"@types/diff": "5.2.1",
|
|
83
84
|
"@types/express": "4.17.21",
|
|
@@ -100,8 +101,8 @@
|
|
|
100
101
|
"typescript": "^5.9.0",
|
|
101
102
|
"vitest": "^3.0.9",
|
|
102
103
|
"@neon-internals/cli-core": "0.0.0",
|
|
103
|
-
"@neon/e2e-harness": "0.0.0",
|
|
104
104
|
"@neon-internals/env-core": "0.0.29",
|
|
105
|
+
"@neon/e2e-harness": "0.0.0",
|
|
105
106
|
"@neon/functions": "0.11.0"
|
|
106
107
|
},
|
|
107
108
|
"publishConfig": {
|