neon 8.13.0 → 8.13.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 CHANGED
@@ -955,7 +955,7 @@ The default mints an account-wide API key (or reuses the Bearer already configur
955
955
 
956
956
  ## Install Neon agent skills (`skills`)
957
957
 
958
- `neon skills` installs Neon agent skills by running `npx skills add`. It does not call the Neon API. This command needs Node.js 22.20 or newer. The rest of the CLI supports Node.js 20.19 or newer.
958
+ `neon skills` installs Neon agent skills by running `npx skills@latest add`, so it always uses the latest skills CLI, even when an older one is installed globally. It does not call the Neon API. This command needs Node.js 22.20 or newer. The rest of the CLI supports Node.js 20.19 or newer.
959
959
 
960
960
  ```bash
961
961
  # Interactive: this directory, then agents, then skills.
@@ -11,9 +11,9 @@ import { looksLikeBranchId } from "../utils/formats.js";
11
11
  import { fillSingleProject, listAllProjectBranches } from "../utils/enrichers.js";
12
12
  import { buildCheckoutEvent, readGitContext } from "../utils/git.js";
13
13
  import { buildHookBranch, loadHookConfig, resolveHookEnv, runCheckoutAfterHook, runCheckoutBeforeHook, runCreateAfterHook, runCreateBeforeHook } from "../utils/hooks.js";
14
- import { n as autoPullEnvAfterPin } from "./env-uVRY4xah.js";
15
- import { a as applyPolicyOnCreate, f as envFlag, l as createBranchFromPolicyOnCheckout } from "./config-BnwcGpbq.js";
16
- import { i as handler$1 } from "./link-DOM84hYj.js";
14
+ import { n as autoPullEnvAfterPin } from "./env-5HS5qQGd.js";
15
+ import { a as applyPolicyOnCreate, f as envFlag, l as createBranchFromPolicyOnCheckout } from "./config-BH_qRHiG.js";
16
+ import { i as handler$1 } from "./link-BgtkOBws.js";
17
17
  import chalk from "chalk";
18
18
  import prompts from "prompts";
19
19
  //#region src/commands/checkout.ts
@@ -12,7 +12,7 @@ import { projectConfigPath } from "../project.js";
12
12
  import { resolveEnvFilePath } from "../env_file.js";
13
13
  import { writer } from "../writer.js";
14
14
  import { noPassthrough } from "../utils/flags.js";
15
- import { c as pull } from "./env-uVRY4xah.js";
15
+ import { c as pull } from "./env-5HS5qQGd.js";
16
16
  import { existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
17
17
  import open from "open";
18
18
  import prompts from "prompts";
@@ -23,7 +23,7 @@ import { readGitContext } from "../utils/git.js";
23
23
  import { resolveHookEnv, runDeployAfterHook, runDeployBeforeHook } from "../utils/hooks.js";
24
24
  import { pickServicesInteractively } from "../utils/service_picker.js";
25
25
  import { zipBundle } from "../utils/zip.js";
26
- import { n as autoPullEnvAfterPin } from "./env-uVRY4xah.js";
26
+ import { n as autoPullEnvAfterPin } from "./env-5HS5qQGd.js";
27
27
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
28
28
  import { dirname, join, relative, resolve } from "node:path";
29
29
  import chalk from "chalk";
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
2
  import { fillSingleProject } from "../utils/enrichers.js";
3
- import { f as envFlag, i as applyFlags, p as envPullFlag, r as applyCmd } from "./config-BnwcGpbq.js";
3
+ import { f as envFlag, i as applyFlags, p as envPullFlag, r as applyCmd } from "./config-BH_qRHiG.js";
4
4
  import { DEPLOY_COMMANDS_EPILOGUE } from "../commands/deploy_help.js";
5
5
  //#region src/commands/deploy.ts
6
6
  var deploy_exports = /* @__PURE__ */ __exportAll({
@@ -4,12 +4,12 @@ import { isClaimableEnvTarget } from "../claimable/state.js";
4
4
  import { getCliName } from "../utils/cli_name.js";
5
5
  import { defaultDevEnvFiles, readEnvFile, resolveEnvFilePath } from "../env_file.js";
6
6
  import { l as functionBaseUrlKey } from "./env-BpP3Dqpe.js";
7
+ import { branchIdResolve } from "../utils/enrichers.js";
8
+ import { bundleEntry } from "../utils/esbuild.js";
7
9
  import { a as resolveDevEnv } from "./env-BNm69Qh8.js";
10
+ import { f as envFlag } from "./config-BH_qRHiG.js";
8
11
  import { findConfigFunctionBySource, resolveFunctionsFromConfig } from "../dev/functions.js";
9
12
  import { resolveWatchInputs } from "../dev/inputs.js";
10
- import { branchIdResolve } from "../utils/enrichers.js";
11
- import { bundleEntry } from "../utils/esbuild.js";
12
- import { f as envFlag } from "./config-BnwcGpbq.js";
13
13
  import { existsSync, mkdirSync, rmSync, statSync, writeFileSync } from "node:fs";
14
14
  import { basename, dirname, join, relative, resolve } from "node:path";
15
15
  import { fileURLToPath } from "node:url";
@@ -5,8 +5,8 @@ import { CONTEXT_FILE, contextBranch, gitBranchMap, gitBranchMapping, isUnfollow
5
5
  import { writer } from "../writer.js";
6
6
  import { neonSafeBranchName } from "../utils/branch_name.js";
7
7
  import { currentGitBranch, gitPull, gitRepoRoot, hasUpstream, installPostCheckoutHook, isGitRepo, isManagedHook, localGitBranches, postCheckoutHookPath, readGitContext, removePostCheckoutHook } from "../utils/git.js";
8
- import { o as quoteFlagValue } from "./link-DOM84hYj.js";
9
- import { o as handler$1 } from "./checkout-BGvlLc43.js";
8
+ import { o as quoteFlagValue } from "./link-BgtkOBws.js";
9
+ import { o as handler$1 } from "./checkout-CXIOydqZ.js";
10
10
  import { existsSync } from "node:fs";
11
11
  import { join } from "node:path";
12
12
  import chalk from "chalk";
@@ -13,8 +13,8 @@ import { writer } from "../writer.js";
13
13
  import { createBranch, pickBranchInteractively } from "../utils/branch_picker.js";
14
14
  import { looksLikeBranchId } from "../utils/formats.js";
15
15
  import { listAllProjectBranches } from "../utils/enrichers.js";
16
- import { n as autoPullEnvAfterPin } from "./env-uVRY4xah.js";
17
- import { h as initCmd } from "./config-BnwcGpbq.js";
16
+ import { n as autoPullEnvAfterPin } from "./env-5HS5qQGd.js";
17
+ import { h as initCmd } from "./config-BH_qRHiG.js";
18
18
  import { formatLinkSummary } from "../commands/link_output.js";
19
19
  import { r as REGIONS } from "./projects-BwI2Uo0z.js";
20
20
  import prompts from "prompts";
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
2
  import { fillSingleProject } from "../utils/enrichers.js";
3
- import { y as status } from "./config-BnwcGpbq.js";
3
+ import { y as status } from "./config-BH_qRHiG.js";
4
4
  //#region src/commands/status.ts
5
5
  var status_exports = /* @__PURE__ */ __exportAll({
6
6
  builder: () => builder,
@@ -1 +1 @@
1
- export { t as builder, r as command, i as describe, a as formatCheckoutPolicyFailure, o as handler } from "../_chunks/checkout-BGvlLc43.js";
1
+ export { t as builder, r as command, i as describe, a as formatCheckoutPolicyFailure, o as handler } from "../_chunks/checkout-CXIOydqZ.js";
@@ -1 +1 @@
1
- export { t as CLAIM_CREATE_FIELDS, n as CLAIM_LIST_FIELDS, r as aliases, i as builder, a as claimCreateFields, s as claimableCapabilities, c as command, l as create, u as describe, d as handler } from "../_chunks/claim-DqzLXZMN.js";
1
+ export { t as CLAIM_CREATE_FIELDS, n as CLAIM_LIST_FIELDS, r as aliases, i as builder, a as claimCreateFields, s as claimableCapabilities, c as command, l as create, u as describe, d as handler } from "../_chunks/claim-DqAvAvDm.js";
@@ -1 +1 @@
1
- export { t as ConfigInstallFailed, n as addCmd, r as applyCmd, i as applyFlags, a as applyPolicyOnCreate, o as builder, s as command, l as createBranchFromPolicyOnCheckout, u as describe, d as ensureConfigPackages, f as envFlag, p as envPullFlag, m as handler, h as initCmd, g as installCommandFrom, _ as missingDependencies, v as planCmd, y as status } from "../_chunks/config-BnwcGpbq.js";
1
+ export { t as ConfigInstallFailed, n as addCmd, r as applyCmd, i as applyFlags, a as applyPolicyOnCreate, o as builder, s as command, l as createBranchFromPolicyOnCheckout, u as describe, d as ensureConfigPackages, f as envFlag, p as envPullFlag, m as handler, h as initCmd, g as installCommandFrom, _ as missingDependencies, v as planCmd, y as status } from "../_chunks/config-BH_qRHiG.js";
@@ -1 +1 @@
1
- export { t as builder, n as command, i as describe, a as handler } from "../_chunks/deploy-BCVcDR1O.js";
1
+ export { t as builder, n as command, i as describe, a as handler } from "../_chunks/deploy-D7B0Xfjg.js";
@@ -1 +1 @@
1
- export { t as builder, n as captureShellEnv, r as command, i as describe, a as devBundleDir, o as devEnvContext, c as diffUnits, l as formatEnvFiles, u as formatEnvSummary, d as handler, f as loadDevEnvFiles, p as localFunctionUrlEnv, m as planFunctionsToUnits, h as reportDevCredential, g as sourceFunctionUrlOverlay } from "../_chunks/dev-mrJKMt2R.js";
1
+ export { t as builder, n as captureShellEnv, r as command, i as describe, a as devBundleDir, o as devEnvContext, c as diffUnits, l as formatEnvFiles, u as formatEnvSummary, d as handler, f as loadDevEnvFiles, p as localFunctionUrlEnv, m as planFunctionsToUnits, h as reportDevCredential, g as sourceFunctionUrlOverlay } from "../_chunks/dev-CSvxAecE.js";
@@ -1 +1 @@
1
- export { t as ENV_PULL_SKIPPED_HINT, n as autoPullEnvAfterPin, r as builder, i as command, a as describe, s as handler, c as pull } from "../_chunks/env-uVRY4xah.js";
1
+ export { t as ENV_PULL_SKIPPED_HINT, n as autoPullEnvAfterPin, r as builder, i as command, a as describe, s as handler, c as pull } from "../_chunks/env-5HS5qQGd.js";
@@ -8,7 +8,7 @@ import { writer } from "../writer.js";
8
8
  import { formatInitDone, printInitDone } from "../init/chrome.js";
9
9
  import { FUNCTION_SLUG_PATTERN, deriveFunctionSlug } from "../utils/function_slug.js";
10
10
  import { displayPath } from "./env_output.js";
11
- import { _ as missingDependencies, d as ensureConfigPackages, g as installCommandFrom } from "../_chunks/config-BnwcGpbq.js";
11
+ import { _ as missingDependencies, d as ensureConfigPackages, g as installCommandFrom } from "../_chunks/config-BH_qRHiG.js";
12
12
  import { recommendedOperations } from "../functions/registry.js";
13
13
  import { collidingFiles, operationsFromFlags, planConfigRegistration, planEnvExample, planScaffold, writeScaffold } from "../functions/scaffold.js";
14
14
  import { describeRegistrySource, openRegistry } from "../functions/source.js";
@@ -1 +1 @@
1
- export { t as aliases, n as builder, r as cleanup, i as command, a as describe, s as handler, c as install, l as partitionBranchesToPrune, u as status, d as sync, f as uninstall } from "../_chunks/git-pN4kMH0d.js";
1
+ export { t as aliases, n as builder, r as cleanup, i as command, a as describe, s as handler, c as install, l as partitionBranchesToPrune, u as status, d as sync, f as uninstall } from "../_chunks/git-H32TNt6M.js";
@@ -2,29 +2,29 @@ import { r as auth_exports } from "../_chunks/auth-CIUtXByB.js";
2
2
  import { t as api_exports } from "../_chunks/api-GbEaBZJ5.js";
3
3
  import { n as api_keys_exports } from "../_chunks/api_keys-CNnnugbQ.js";
4
4
  import { n as ask_exports } from "../_chunks/ask-DVwy0eUL.js";
5
- import { o as env_exports } from "../_chunks/env-uVRY4xah.js";
6
- import { c as config_exports } from "../_chunks/config-BnwcGpbq.js";
5
+ import { o as env_exports } from "../_chunks/env-5HS5qQGd.js";
6
+ import { c as config_exports } from "../_chunks/config-BH_qRHiG.js";
7
7
  import { u as projects_exports } from "../_chunks/projects-BwI2Uo0z.js";
8
- import { a as link_exports } from "../_chunks/link-DOM84hYj.js";
8
+ import { a as link_exports } from "../_chunks/link-BgtkOBws.js";
9
9
  import { o as mcp_exports } from "../_chunks/mcp-Bo-7TKc7.js";
10
10
  import { c as plugins_exports } from "../_chunks/plugins-DqD7BDO1.js";
11
11
  import { l as skills_exports } from "../_chunks/skills-BP6pIm7O.js";
12
12
  import { t as bootstrap_exports } from "../_chunks/bootstrap-wPZWa1sT.js";
13
13
  import { r as branches_exports } from "../_chunks/branches-BNa1xX1L.js";
14
14
  import { n as bucket_exports } from "../_chunks/bucket-BCdryTkD.js";
15
- import { n as checkout_exports } from "../_chunks/checkout-BGvlLc43.js";
16
- import { o as claim_exports } from "../_chunks/claim-DqzLXZMN.js";
15
+ import { n as checkout_exports } from "../_chunks/checkout-CXIOydqZ.js";
16
+ import { o as claim_exports } from "../_chunks/claim-DqAvAvDm.js";
17
17
  import { a as connection_string_exports } from "../_chunks/connection_string-DB4awPzZ.js";
18
18
  import { a as credentials_exports } from "../_chunks/credentials-BSjE9fRR.js";
19
19
  import { r as data_api_exports } from "../_chunks/data_api-Djxj5ZQD.js";
20
20
  import { o as databases_exports } from "../_chunks/databases-Dok4wru7.js";
21
- import { r as deploy_exports } from "../_chunks/deploy-BCVcDR1O.js";
22
- import { s as dev_exports } from "../_chunks/dev-mrJKMt2R.js";
21
+ import { r as deploy_exports } from "../_chunks/deploy-D7B0Xfjg.js";
22
+ import { s as dev_exports } from "../_chunks/dev-CSvxAecE.js";
23
23
  import { i as diff_exports } from "../_chunks/diff-DhxxbdQE.js";
24
24
  import { c as docs_exports } from "../_chunks/docs-CrVybkTP.js";
25
25
  import { o as feedback_exports } from "../_chunks/feedback-CMayyTa8.js";
26
26
  import { o as functions_exports } from "../_chunks/functions-Q0zuvtnk.js";
27
- import { o as git_exports } from "../_chunks/git-pN4kMH0d.js";
27
+ import { o as git_exports } from "../_chunks/git-H32TNt6M.js";
28
28
  import { a as init_exports } from "../_chunks/init-BkA6RilG.js";
29
29
  import { o as inspect_exports } from "../_chunks/inspect-g0wekylj.js";
30
30
  import { a as ip_allow_exports } from "../_chunks/ip_allow-5lLFvIuE.js";
@@ -39,7 +39,7 @@ import { s as realtime_exports } from "../_chunks/realtime-BRqIyGR-.js";
39
39
  import { l as roles_exports } from "../_chunks/roles-B4w3YT_7.js";
40
40
  import { a as set_context_exports } from "../_chunks/set_context-DbrwoImy.js";
41
41
  import { s as snapshots_exports } from "../_chunks/snapshots-RJBzW8GM.js";
42
- import { a as status_exports } from "../_chunks/status-DoNjIbKf.js";
42
+ import { a as status_exports } from "../_chunks/status-DV8Z2kw3.js";
43
43
  import { d as triggers_exports } from "../_chunks/triggers-BrRo1z4b.js";
44
44
  import { s as user_exports } from "../_chunks/user-dlOGXbX9.js";
45
45
  import { i as vpc_endpoints_exports } from "../_chunks/vpc_endpoints-CNb0YfMo.js";
@@ -1 +1 @@
1
- export { t as builder, n as command, r as describe, i as handler, o as quoteFlagValue, s as runLink, c as shouldOfferConfigInit } from "../_chunks/link-DOM84hYj.js";
1
+ export { t as builder, n as command, r as describe, i as handler, o as quoteFlagValue, s as runLink, c as shouldOfferConfigInit } from "../_chunks/link-BgtkOBws.js";
@@ -1 +1 @@
1
- export { t as builder, n as command, r as describe, i as handler } from "../_chunks/status-DoNjIbKf.js";
1
+ export { t as builder, n as command, r as describe, i as handler } from "../_chunks/status-DV8Z2kw3.js";
@@ -1,6 +1,6 @@
1
1
  import { writer } from "../writer.js";
2
- import { o as resolveNeonEnvVars } from "../_chunks/env-BNm69Qh8.js";
3
2
  import { branchIdFromProps } from "../utils/enrichers.js";
3
+ import { o as resolveNeonEnvVars } from "../_chunks/env-BNm69Qh8.js";
4
4
  import YAML from "yaml";
5
5
  //#region src/commands/subscribe.ts
6
6
  const builder = (argv) => argv.usage("$0 realtime subscribe \"<query>\" [options]").positional("query", {
package/dist/init/auth.js CHANGED
@@ -4,7 +4,7 @@ import "../config.js";
4
4
  import "../auth.js";
5
5
  import { c as ensureAuth } from "../_chunks/auth-CIUtXByB.js";
6
6
  import { recoverFrom401 } from "../auth_recovery.js";
7
- import { c as pull } from "../_chunks/env-uVRY4xah.js";
7
+ import { c as pull } from "../_chunks/env-5HS5qQGd.js";
8
8
  import { c as setupNeonMcp } from "../_chunks/mcp-Bo-7TKc7.js";
9
9
  //#region src/init/auth.ts
10
10
  const isUnauthorized = (error) => isNeonApiError(error) && error.status === 401;
package/dist/init/link.js CHANGED
@@ -4,7 +4,7 @@ import "../config.js";
4
4
  import "../auth.js";
5
5
  import { c as ensureAuth } from "../_chunks/auth-CIUtXByB.js";
6
6
  import { recoverFrom401 } from "../auth_recovery.js";
7
- import { s as runLink } from "../_chunks/link-DOM84hYj.js";
7
+ import { s as runLink } from "../_chunks/link-BgtkOBws.js";
8
8
  //#region src/init/link.ts
9
9
  const isUnauthorized = (error) => isNeonApiError(error) && error.status === 401;
10
10
  const authenticationFailed = () => /* @__PURE__ */ new Error("Authentication failed.");
package/dist/init/run.js CHANGED
@@ -17,15 +17,15 @@ import { FALLBACK_SKILLS_AGENTS, assertNamedAgentTooling, funnelAgentSetup, plan
17
17
  import { inferPackageManager, resolvePackageManager } from "../utils/package_manager.js";
18
18
  import { CANCELLED_BODY, CLAIMABLE_ACCOUNT_FLAGS, CLAIMABLE_ALREADY_LINKED, CLAIMABLE_MCP_API_KEY, CLAIMABLE_NO_LINK, MCP_API_KEY_NEEDS_AUTH, MCP_SCOPED_NEEDS_PROJECT, NON_TTY_LINK_NEEDS_AUTH, NO_AGENTS_FALLBACK_STATUS, PROGRESS, PROJECT_PINNED_OFFLINE, claimableNext, claimableThenServicesNext, configInitNext, envPullFailedNext, existingConfigNext, installFailedNext, mcpAfterLinkNext, mcpConfigLocationSkipped, mcpConfigLocationUnavailable, mcpKeyFailedNext, namedAgentsUnavailable, newConfigNext, offlinePinNext, skippedLinkNext, unattendedUnauthedNext } from "./copy.js";
19
19
  import { agentsRowValue, configRowValue, formatInitDone, headingForKind, printInitBanner, printInitDone, printInitProgress, projectRowValue, shouldPrintInitBanner } from "./chrome.js";
20
- import { h as initCmd, t as ConfigInstallFailed } from "../_chunks/config-BnwcGpbq.js";
21
- import { o as quoteFlagValue, s as runLink } from "../_chunks/link-DOM84hYj.js";
20
+ import { h as initCmd, t as ConfigInstallFailed } from "../_chunks/config-BH_qRHiG.js";
21
+ import { o as quoteFlagValue, s as runLink } from "../_chunks/link-BgtkOBws.js";
22
22
  import { runAuthenticatedLink } from "./link.js";
23
23
  import { CannotMintApiKeyError } from "../mcp/mint.js";
24
24
  import { pullInitEnv } from "./auth.js";
25
25
  import { InitCancelled, raceSigint, restoreCursor } from "./cancelled.js";
26
26
  import { pickAgentSetupInteractively, pickInitAgentsInteractively, pickInitConfigInteractively, pickInitMcpAuthInteractively, pickInitMcpConfigLocationInteractively, pickInitModeInteractively, pickInitPackageManagerInteractively, pickInitProjectSetupInteractively, pickInitServicesInteractively, pickInitSkillsInteractively } from "./wizard.js";
27
27
  import { runToolingSteps } from "./tooling.js";
28
- import { l as create } from "../_chunks/claim-DqzLXZMN.js";
28
+ import { l as create } from "../_chunks/claim-DqAvAvDm.js";
29
29
  import { INIT_CONFIG_SERVICES_CONFLICT, configPlanFromResolution, initEnvPullAfterConfig, resolveInitConfigChoice } from "./choices.js";
30
30
  import { detectInitEnvironment } from "./detect.js";
31
31
  import { createInitFunnel, emitInitStart, finishInitFunnel, initStartProperties } from "./funnel.js";
@@ -83,17 +83,23 @@ const folderKey = ({ source, folder }) => `${source}:${folder}`;
83
83
  /** `undefined` when the remote side has not been fetched yet. */
84
84
  const skillStatus = (skill, remote) => {
85
85
  if (remote?.missing === true) return "not found upstream";
86
- const latest = skill.hashKind === "tree" ? remote?.tree : remote?.content;
87
- if (latest === void 0) return void 0;
88
- return latest === skill.hash ? "up to date" : "outdated";
86
+ if (skill.hashKind === "tree") {
87
+ if (remote?.tree === void 0) return void 0;
88
+ return remote.tree === skill.hash ? "up to date" : "outdated";
89
+ }
90
+ if (remote?.content === void 0) return void 0;
91
+ if (skill.hash === remote.content) return "up to date";
92
+ if (remote.contentCrlf === void 0) return void 0;
93
+ return skill.hash === remote.contentCrlf ? "up to date" : "outdated";
89
94
  };
90
95
  const parseRemoteFolder = (value) => {
91
96
  if (!isRecord(value)) return void 0;
92
- const { tree, content, missing, pending } = value;
93
- if (tree !== void 0 && typeof tree !== "string" || content !== void 0 && typeof content !== "string" || missing !== void 0 && missing !== true || pending !== void 0 && pending !== true) return;
97
+ const { tree, content, contentCrlf, missing, pending } = value;
98
+ if (tree !== void 0 && typeof tree !== "string" || content !== void 0 && typeof content !== "string" || contentCrlf !== void 0 && typeof contentCrlf !== "string" || missing !== void 0 && missing !== true || pending !== void 0 && pending !== true) return;
94
99
  return {
95
100
  ...tree === void 0 ? {} : { tree },
96
101
  ...content === void 0 ? {} : { content },
102
+ ...contentCrlf === void 0 ? {} : { contentCrlf },
97
103
  ...missing === void 0 ? {} : { missing },
98
104
  ...pending === void 0 ? {} : { pending }
99
105
  };
@@ -137,6 +143,41 @@ const skillContentHash = (files) => {
137
143
  }
138
144
  return hash.digest("hex");
139
145
  };
146
+ const LF = 10;
147
+ const CR = 13;
148
+ /** Control bytes Git counts as printable text: backspace, tab, form feed, escape. */
149
+ const PRINTABLE_CONTROLS = /* @__PURE__ */ new Set([
150
+ 8,
151
+ 9,
152
+ 12,
153
+ 27
154
+ ]);
155
+ /**
156
+ * The bytes Git writes for a blob when `core.autocrlf=true`, the Git for Windows default. The
157
+ * skills CLI hashes that checkout, so a Windows install records a hash of these bytes. Mirrors
158
+ * Git's `convert.c`: a blob that has any CR, a NUL, or mostly non-printable bytes is written
159
+ * unchanged, and every LF in any other blob becomes CRLF.
160
+ */
161
+ const autocrlfCheckout = (bytes) => {
162
+ let lf = 0;
163
+ let printable = 0;
164
+ let nonprintable = 0;
165
+ for (const byte of bytes) {
166
+ if (byte === CR || byte === 0) return bytes;
167
+ if (byte === LF) lf += 1;
168
+ else if (byte === 127 || byte < 32 && !PRINTABLE_CONTROLS.has(byte)) nonprintable += 1;
169
+ else printable += 1;
170
+ }
171
+ if (bytes[bytes.length - 1] === 26) nonprintable -= 1;
172
+ if (lf === 0 || printable >> 7 < nonprintable) return bytes;
173
+ const out = new Uint8Array(bytes.length + lf);
174
+ let at = 0;
175
+ for (const byte of bytes) {
176
+ if (byte === LF) out[at++] = CR;
177
+ out[at++] = byte;
178
+ }
179
+ return out;
180
+ };
140
181
  const gitBlobSha = (bytes) => createHash("sha1").update(`blob ${bytes.byteLength}\0`).update(bytes).digest("hex");
141
182
  const isTreeEntry = (value) => isRecord(value) && typeof value.path === "string" && typeof value.mode === "string" && typeof value.type === "string" && typeof value.sha === "string";
142
183
  const githubHeaders = (env) => {
@@ -168,7 +209,7 @@ const folderFiles = (tree, folder) => tree.filter((entry) => {
168
209
  const dirs = entry.path.slice(folder.length + 1).split("/").slice(0, -1);
169
210
  return !dirs.includes(".git") && !dirs.includes("node_modules");
170
211
  });
171
- const fetchContentHash = async (source, folder, tree) => {
212
+ const fetchContentHashes = async (source, folder, tree) => {
172
213
  const files = await Promise.all(folderFiles(tree, folder).map(async (entry) => {
173
214
  const path = entry.path.split("/").map(encodeURIComponent).join("/");
174
215
  const response = await fetch(`https://raw.githubusercontent.com/${source}/HEAD/${path}`, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) });
@@ -180,7 +221,13 @@ const fetchContentHash = async (source, folder, tree) => {
180
221
  bytes
181
222
  };
182
223
  }));
183
- return skillContentHash(files);
224
+ return {
225
+ content: skillContentHash(files),
226
+ contentCrlf: skillContentHash(files.map((file) => ({
227
+ ...file,
228
+ bytes: autocrlfCheckout(file.bytes)
229
+ })))
230
+ };
184
231
  };
185
232
  /**
186
233
  * The folders to fetch: the given skills, plus every folder already in the cache so
@@ -232,11 +279,14 @@ const refreshSkillsCheckCache = async ({ cachePath, skills, env = process.env, n
232
279
  continue;
233
280
  }
234
281
  const prior = previous[key];
235
- let content = prior?.tree === node.sha ? prior.content : void 0;
236
- if (request.content && content === void 0) content = await fetchContentHash(source, request.folder, tree);
282
+ let hashes = prior?.tree === node.sha && prior.content !== void 0 && prior.contentCrlf !== void 0 ? {
283
+ content: prior.content,
284
+ contentCrlf: prior.contentCrlf
285
+ } : void 0;
286
+ if (request.content && hashes === void 0) hashes = await fetchContentHashes(source, request.folder, tree);
237
287
  folders[key] = {
238
288
  tree: node.sha,
239
- ...content === void 0 ? {} : { content }
289
+ ...hashes
240
290
  };
241
291
  }
242
292
  }
@@ -394,4 +444,4 @@ const notifyIfSkillsOutdated = ({ configDir, cwd, now = Date.now() }) => {
394
444
  }, "skills check cache")) spawnSkillsCheckWorker(cachePath, cwd);
395
445
  };
396
446
  //#endregion
397
- export { formatSkillsNotice, globalLockPath, lockPath, neonSkillsUpdateCommand, notifyIfSkillsOutdated, parseSkillsCheckCache, parseSkillsLock, planSkillsCheck, projectLockPath, readLockedSkills, readSkillsTelemetry, refreshSkillsCheckCache, scopeLabel, skillContentHash, skillStatus, skillsCheckCachePath, skillsStatusRows, skillsTelemetry };
447
+ export { autocrlfCheckout, formatSkillsNotice, globalLockPath, lockPath, neonSkillsUpdateCommand, notifyIfSkillsOutdated, parseSkillsCheckCache, parseSkillsLock, planSkillsCheck, projectLockPath, readLockedSkills, readSkillsTelemetry, refreshSkillsCheckCache, scopeLabel, skillContentHash, skillStatus, skillsCheckCachePath, skillsStatusRows, skillsTelemetry };
@@ -37,11 +37,13 @@ const assertSkillsNode = (version = process.version) => {
37
37
  if (nodeMeetsMinimum(version, "22.20.0")) return;
38
38
  throw new Error(`neon skills needs Node.js ${SKILLS_MIN_NODE} or newer to run the skills CLI. This process is Node.js ${version.replace(/^v/, "")}. Upgrade Node.js, then retry.`);
39
39
  };
40
+ /** A bare `skills` makes npx run any copy already installed globally or cached, however old. */
41
+ const SKILLS_PACKAGE = "skills@latest";
40
42
  const skillsAddArgs = (options) => {
41
43
  if (options.skills.length === 0) throw new Error("skills add needs at least one --skill.");
42
44
  const args = [
43
45
  "-y",
44
- "skills",
46
+ SKILLS_PACKAGE,
45
47
  "add",
46
48
  options.source
47
49
  ];
@@ -83,7 +85,7 @@ const skillsUpdateDetail = (output) => {
83
85
  };
84
86
  const skillsUpdateArgs = (options) => [
85
87
  "-y",
86
- "skills",
88
+ SKILLS_PACKAGE,
87
89
  "update",
88
90
  options.global ? "-g" : "-p",
89
91
  "-y"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neon",
3
- "version": "8.13.0",
3
+ "version": "8.13.1",
4
4
  "description": "CLI tool for Neon, the cloud backend primitives built around Lakebase Postgres",
5
5
  "keywords": [
6
6
  "neon",
@@ -72,9 +72,9 @@
72
72
  "yaml": "^2.9.0",
73
73
  "yargs": "17.7.2",
74
74
  "yoctocolors": "^2.1.2",
75
+ "@neon/config": "1.9.5",
75
76
  "@neon/config-runtime": "1.10.4",
76
77
  "@neon/realtime": "0.1.2",
77
- "@neon/config": "1.9.5",
78
78
  "@neon/sdk": "7.6.0"
79
79
  },
80
80
  "optionalDependencies": {
@@ -113,8 +113,8 @@
113
113
  "vitest": "^3.0.9",
114
114
  "@neon-internals/cli-core": "0.0.0",
115
115
  "@neon-internals/env-core": "0.0.36",
116
- "@neon/e2e-harness": "0.0.0",
117
116
  "@neon/env": "1.6.6",
117
+ "@neon/e2e-harness": "0.0.0",
118
118
  "@neon/functions": "0.11.0"
119
119
  },
120
120
  "publishConfig": {
@@ -7,9 +7,9 @@ import { deprecatedServiceMessage, parseServices, servicesFlagValue, servicesOpt
7
7
  import { mergeEnvFile, readEnvFile, resolveEnvFilePath } from "../env_file.js";
8
8
  import { t as NEON_ENV_VAR_KEYS, u as isFunctionBaseUrlKey } from "./env-BpP3Dqpe.js";
9
9
  import { ENV_PULL_KEY_HELP, ENV_PULL_SERVICES, envKeysForSelection, envPullFlagValue, ownedEnvServiceKeys, parseEnvPullKeys } from "../env_services.js";
10
- import { i as dropClaimableUnsupported, o as resolveNeonEnvVars } from "./env-BNm69Qh8.js";
11
10
  import { fillSingleProject, resolveBranchRef } from "../utils/enrichers.js";
12
11
  import { warnAiGateway } from "../utils/ai_gateway_notice.js";
12
+ import { i as dropClaimableUnsupported, o as resolveNeonEnvVars } from "./env-BNm69Qh8.js";
13
13
  import { formatPulledEnv, pulledBranch } from "../commands/env_output.js";
14
14
  import { existsSync } from "node:fs";
15
15
  import chalk from "chalk";