From f4f81f4ef780b08876dd5d45946b6e52ede58a42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2026 09:26:15 +0000 Subject: [PATCH 1/2] chore(deps-dev): bump the pm-toolchain group across 1 directory with 3 updates Bumps the pm-toolchain group with 3 updates in the / directory: [@unbrained/pm-cli](https://github.com/unbraind/pm-cli), [pm-changelog](https://github.com/unbraind/pm-changelog) and [pm-ops](https://github.com/unbraind/pm-ops). Updates `@unbrained/pm-cli` from 2026.10.17 to 2026.10.20 - [Release notes](https://github.com/unbraind/pm-cli/releases) - [Changelog](https://github.com/unbraind/pm-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/unbraind/pm-cli/compare/v2026.10.17...v2026.10.20) Updates `pm-changelog` from 2026.10.16 to 2026.10.20 - [Release notes](https://github.com/unbraind/pm-changelog/releases) - [Changelog](https://github.com/unbraind/pm-changelog/blob/main/CHANGELOG.md) - [Commits](https://github.com/unbraind/pm-changelog/compare/v2026.10.16...v2026.10.20) Updates `pm-ops` from 2026.10.16 to 2026.10.20 - [Release notes](https://github.com/unbraind/pm-ops/releases) - [Changelog](https://github.com/unbraind/pm-ops/blob/main/CHANGELOG.md) - [Commits](https://github.com/unbraind/pm-ops/compare/v2026.10.16...v2026.10.20) --- updated-dependencies: - dependency-name: "@unbrained/pm-cli" dependency-version: 2026.10.18 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: pm-toolchain - dependency-name: pm-changelog dependency-version: 2026.10.17 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: pm-toolchain - dependency-name: pm-ops dependency-version: 2026.10.17 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: pm-toolchain ... Signed-off-by: dependabot[bot] --- package-lock.json | 99 +++++++++++++++++++++++++++++++++-------------- package.json | 6 +-- 2 files changed, 74 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index f9bd89fb..1c5834bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,12 +13,12 @@ "@babel/plugin-syntax-typescript": "8.0.3", "@toon-format/toon": "4.4.0", "@types/node": "26.6.5", - "@unbrained/pm-cli": "2026.10.17", + "@unbrained/pm-cli": "2026.10.20", "c8": "12.0.0", "eslint": "10.13.0", "jscpd": "5.4.1", - "pm-changelog": "2026.10.16", - "pm-ops": "2026.10.16", + "pm-changelog": "2026.10.20", + "pm-ops": "2026.10.20", "typescript": "7.0.2" }, "engines": { @@ -995,9 +995,9 @@ } }, "node_modules/@unbrained/pm-cli": { - "version": "2026.10.17", - "resolved": "https://registry.npmjs.org/@unbrained/pm-cli/-/pm-cli-2026.10.17.tgz", - "integrity": "sha512-uVByzpR7SXheHr2oYdsYl4rNj60nLtaqMLHHEroKeJRjWWQJodB6GuUkwTsHn7KaXn/VfAVHrh1Zt3aMsuYuxA==", + "version": "2026.10.20", + "resolved": "https://registry.npmjs.org/@unbrained/pm-cli/-/pm-cli-2026.10.20.tgz", + "integrity": "sha512-Q5odfHU1DInVPXeiuEfVVxGm+NdnTulvfbUHwjhD3a6I6tdr4XJiDR/SmOaXZq5x4Os0JfbdKZga8MxfnpSlOg==", "bundleDependencies": [ "@sentry/node", "@toon-format/toon", @@ -1012,8 +1012,8 @@ "dev": true, "license": "MIT", "dependencies": { - "@sentry/node": "10.76.0", - "@toon-format/toon": "^4.1.1", + "@sentry/node": "10.76.2", + "@toon-format/toon": "^4.4.0", "commander": "^15.0.0", "fast-json-patch": "^3.1.1", "npm-package-arg": "^13.0.2", @@ -1079,6 +1079,7 @@ "inBundle": true, "license": "Apache-2.0", "dependencies": { + "@opentelemetry/api": "1.9.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -1094,6 +1095,7 @@ "inBundle": true, "license": "Apache-2.0", "dependencies": { + "@opentelemetry/api": "1.9.1", "@opentelemetry/api-logs": "0.220.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" @@ -1111,6 +1113,7 @@ "inBundle": true, "license": "Apache-2.0", "dependencies": { + "@opentelemetry/api": "1.9.1", "@opentelemetry/core": "2.12.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -1127,6 +1130,7 @@ "inBundle": true, "license": "Apache-2.0", "dependencies": { + "@opentelemetry/api": "1.9.1", "@opentelemetry/core": "2.12.0", "@opentelemetry/resources": "2.12.0", "@opentelemetry/semantic-conventions": "^1.29.0" @@ -1144,6 +1148,7 @@ "inBundle": true, "license": "Apache-2.0", "dependencies": { + "@opentelemetry/api": "1.9.1", "@opentelemetry/core": "2.12.0", "@opentelemetry/resources": "2.12.0", "@opentelemetry/sdk-trace": "2.12.0", @@ -1175,7 +1180,7 @@ } }, "node_modules/@unbrained/pm-cli/node_modules/@sentry/core": { - "version": "10.76.0", + "version": "10.76.2", "dev": true, "inBundle": true, "license": "MIT", @@ -1187,7 +1192,7 @@ } }, "node_modules/@unbrained/pm-cli/node_modules/@sentry/node": { - "version": "10.76.0", + "version": "10.76.2", "dev": true, "inBundle": true, "license": "MIT", @@ -1196,10 +1201,10 @@ "@opentelemetry/instrumentation": "^0.220.0", "@opentelemetry/sdk-trace-base": "^2.9.0", "@sentry/conventions": "^0.16.0", - "@sentry/core": "10.76.0", - "@sentry/node-core": "10.76.0", - "@sentry/opentelemetry": "10.76.0", - "@sentry/server-utils": "10.76.0", + "@sentry/core": "10.76.2", + "@sentry/node-core": "10.76.2", + "@sentry/opentelemetry": "10.76.2", + "@sentry/server-utils": "10.76.2", "import-in-the-middle": "^3.0.0" }, "engines": { @@ -1207,19 +1212,25 @@ } }, "node_modules/@unbrained/pm-cli/node_modules/@sentry/node-core": { - "version": "10.76.0", + "version": "10.76.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@sentry/conventions": "^0.16.0", - "@sentry/core": "10.76.0", - "@sentry/opentelemetry": "10.76.0", + "@sentry/core": "10.76.2", + "@sentry/opentelemetry": "10.76.2", "import-in-the-middle": "^3.0.0" }, "engines": { "node": ">=18" }, + "optionalDependencies": { + "@opentelemetry/api": "1.9.1", + "@opentelemetry/core": "2.12.0", + "@opentelemetry/instrumentation": "0.220.0", + "@opentelemetry/sdk-trace-base": "2.12.0" + }, "peerDependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/core": "^1.30.1 || ^2.1.0", @@ -1246,13 +1257,16 @@ } }, "node_modules/@unbrained/pm-cli/node_modules/@sentry/opentelemetry": { - "version": "10.76.0", + "version": "10.76.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { + "@opentelemetry/api": "1.9.1", + "@opentelemetry/core": "2.12.0", + "@opentelemetry/sdk-trace-base": "2.12.0", "@sentry/conventions": "^0.16.0", - "@sentry/core": "10.76.0" + "@sentry/core": "10.76.2" }, "engines": { "node": ">=18" @@ -1264,20 +1278,20 @@ } }, "node_modules/@unbrained/pm-cli/node_modules/@sentry/server-utils": { - "version": "10.76.0", + "version": "10.76.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@sentry/conventions": "^0.16.0", - "@sentry/core": "10.76.0" + "@sentry/core": "10.76.2" }, "engines": { "node": ">=18" } }, "node_modules/@unbrained/pm-cli/node_modules/@toon-format/toon": { - "version": "4.1.1", + "version": "4.4.0", "dev": true, "inBundle": true, "license": "MIT" @@ -1317,6 +1331,9 @@ "engines": { "node": ">=6.0" }, + "optionalDependencies": { + "supports-color": "7.2.0" + }, "peerDependenciesMeta": { "supports-color": { "optional": true @@ -1343,6 +1360,9 @@ "engines": { "node": ">=12.0.0" }, + "optionalDependencies": { + "picomatch": "4.0.7" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -1352,6 +1372,16 @@ } } }, + "node_modules/@unbrained/pm-cli/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@unbrained/pm-cli/node_modules/hosted-git-info": { "version": "9.0.3", "dev": true, @@ -1481,6 +1511,19 @@ "node": ">=10" } }, + "node_modules/@unbrained/pm-cli/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@unbrained/pm-cli/node_modules/tar": { "version": "7.5.22", "dev": true, @@ -2764,9 +2807,9 @@ "peer": true }, "node_modules/pm-changelog": { - "version": "2026.10.16", - "resolved": "https://registry.npmjs.org/pm-changelog/-/pm-changelog-2026.10.16.tgz", - "integrity": "sha512-qBFRSUIF0HVVLLDWIjjfbqd3fVo5tSOnphv/JYEcQtycfv1mImfWTCZXkTqNAfcxqpjVQj7PS9JnuQvsL5HIzw==", + "version": "2026.10.20", + "resolved": "https://registry.npmjs.org/pm-changelog/-/pm-changelog-2026.10.20.tgz", + "integrity": "sha512-btEJ2eIbcvK839rPqJ1H/1HsGhJqQ5WTAfp5iwwFaCoHl56+RcO1f9XUSH0dqQgQB4i2ozT3FL1T4ipbah1gaw==", "dev": true, "license": "MIT", "bin": { @@ -2780,9 +2823,9 @@ } }, "node_modules/pm-ops": { - "version": "2026.10.16", - "resolved": "https://registry.npmjs.org/pm-ops/-/pm-ops-2026.10.16.tgz", - "integrity": "sha512-PCaVhjffgJx/TDDfFAnhViFhNcV2vXiTP8iAdPh431bXEalCUZ5khTmeZZqgXpc/ykW+wNF16JGN+MZRv7jRbg==", + "version": "2026.10.20", + "resolved": "https://registry.npmjs.org/pm-ops/-/pm-ops-2026.10.20.tgz", + "integrity": "sha512-8Xz98Bff2d0prXzexNyiAwFLDZ2LanaK+S2uFFgzXwClTuSwrq42O5I36NTUn/MVtWQtBSEiaWXUzQPqsfp/rQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index cb417a97..f7bddb95 100644 --- a/package.json +++ b/package.json @@ -51,12 +51,12 @@ "@babel/plugin-syntax-typescript": "8.0.3", "@toon-format/toon": "4.4.0", "@types/node": "26.6.5", - "@unbrained/pm-cli": "2026.10.17", + "@unbrained/pm-cli": "2026.10.20", "c8": "12.0.0", "eslint": "10.13.0", "jscpd": "5.4.1", - "pm-changelog": "2026.10.16", - "pm-ops": "2026.10.16", + "pm-changelog": "2026.10.20", + "pm-ops": "2026.10.20", "typescript": "7.0.2" }, "keywords": [ From 75ec8bbd2112c07b0365ae482f09b3f173a5e29c Mon Sep 17 00:00:00 2001 From: SteveBot <1153461+unbraind@users.noreply.github.com> Date: Fri, 23 Oct 2026 12:06:59 +0200 Subject: [PATCH 2/2] Re-copy the pm-ops 2026.10.20 merge-driver launcher template for the pm-ops bump --- scripts/prepare-merge-driver.ts | 63 ++++++++------------------------- 1 file changed, 15 insertions(+), 48 deletions(-) diff --git a/scripts/prepare-merge-driver.ts b/scripts/prepare-merge-driver.ts index d9730dea..31d62501 100644 --- a/scripts/prepare-merge-driver.ts +++ b/scripts/prepare-merge-driver.ts @@ -1,70 +1,37 @@ /** - * npm `prepare` hook that registers pm's field-aware Git merge drivers. - * - * Git never clones `.git/config`, so every clone must register the drivers - * `.gitattributes` declares. The installer lives in the devDependency pm-ops, - * which an `npm install --omit=dev` checkout does not have. This launcher - * therefore imports nothing from pm-ops: it resolves the installer entry from - * the package root and runs it in a child process. Only a missing pm-ops package skips, with one - * notice; any other resolution failure (for example a pm-ops too old to export - * the entry, or a `pm-ops` directory whose package.json is gone) and any - * installer failure fail the install. - * Artifact-time prepare (`npm pack` or `npm publish`) instead exits with one - * notice before resolving pm-ops, preserving the packing clone's Git config. - * - * Canonical copy: `pm-ops/templates/prepare-merge-driver.ts`. Copy it - * unchanged to `scripts/prepare-merge-driver.ts`. + * Frozen v1 bootstrap: copy unchanged once; behavior lives in pm-ops. + * Keep dependency-free absence checks here so omit-dev installs can succeed. + * Changes require a new launcher version and retention of this hash. */ - import { spawnSync } from "node:child_process"; import { lstatSync } from "node:fs"; import { createRequire } from "node:module"; import { join } from "node:path"; -// npm also runs prepare while creating artifacts. Git configuration belongs -// to clone installation, so artifact creation must stop before resolution or -// spawning the installer. Keep the install/ci broken-package checks intact. if (process.env.npm_command === "pack" || process.env.npm_command === "publish") { console.error(`npm ${process.env.npm_command}: skipping merge-driver install during artifact creation`); } else { - // npm runs `prepare` from the package root, so pm-ops is resolved from there. const resolver = createRequire(join(process.cwd(), "package.json")); let installer: string | undefined; try { installer = resolver.resolve("pm-ops/merge-driver/prepare"); } catch (error) { - // Only an absent pm-ops package may skip. Probing its package.json tells that - // apart from an installed pm-ops that cannot serve the entry (exports without - // it, no exports map, a missing file): those resolve or fail differently, and - // the original error is rethrown. A probe that finds no package.json is not - // yet proof of absence: a broken install can leave `node_modules/pm-ops` (a - // directory or a dangling link) with no package.json in any ancestor Node - // searches. Such an entry also counts as present. Keep Node's global paths - // too: the installer resolution above can use them, so an absent local - // package alone cannot prove absence. An unreadable or malformed lookup path - // leaves presence uncertain and must fail closed with the original error. - // Node returns null paths only for built-in modules; pm-ops/package.json is - // a package specifier. - let packagePresent = true; + if ((error as NodeJS.ErrnoException).code !== "MODULE_NOT_FOUND") throw error; + // Metadata also detects self-references; physical entries include broken links. + let present = true; try { resolver.resolve("pm-ops/package.json"); } catch (probe) { - packagePresent = - !(probe instanceof Error && "code" in probe && probe.code === "MODULE_NOT_FOUND") || - resolver.resolve.paths("pm-ops/package.json")!.some( - (directory) => { - try { - return lstatSync(join(directory, "pm-ops"), { throwIfNoEntry: false }) !== undefined; - } catch { - // throwIfNoEntry:false only suppresses ENOENT, not EACCES, EPERM, - // ENOTDIR, or ELOOP. Do not replace the installer diagnostic or - // treat an inconclusive presence check as an omit-dev install. - return true; - } - }, - ); + present = (probe as NodeJS.ErrnoException).code !== "MODULE_NOT_FOUND" || + resolver.resolve.paths("pm-ops/package.json")!.some((directory) => { + try { + return lstatSync(join(directory, "pm-ops"), { throwIfNoEntry: false }) !== undefined; + } catch { + return true; + } + }); } - if (packagePresent) throw error; + if (present) throw error; } if (installer === undefined) { console.error("pm-ops is not installed (omit-dev install); skipping merge-driver install");