From 60cc9a2f90644237c15806de50a9531fe700cff4 Mon Sep 17 00:00:00 2001 From: hanna-skryl Date: Tue, 17 Mar 2026 12:08:08 -0400 Subject: [PATCH 1/3] fix(create-cli): add bin entry point wrapper --- packages/create-cli/bin/index.js | 11 +++++++++++ packages/create-cli/package.json | 2 +- packages/create-cli/project.json | 6 +++++- 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100755 packages/create-cli/bin/index.js diff --git a/packages/create-cli/bin/index.js b/packages/create-cli/bin/index.js new file mode 100755 index 0000000000..59c5450504 --- /dev/null +++ b/packages/create-cli/bin/index.js @@ -0,0 +1,11 @@ +#!/usr/bin/env node + +/** + * This file serves as the CLI entry point. + * + * We use a separate bin file (instead of pointing directly to src/index.js) + * because TypeScript build processes don't preserve file permissions. + * By tracking this file in git with executable permissions (+x), we ensure + * the CLI remains executable after npm publish without needing post-install scripts. + */ +import '../src/index.js'; diff --git a/packages/create-cli/package.json b/packages/create-cli/package.json index 6da6774cff..ae138e7a6a 100644 --- a/packages/create-cli/package.json +++ b/packages/create-cli/package.json @@ -2,7 +2,7 @@ "name": "@code-pushup/create-cli", "version": "0.119.0", "license": "MIT", - "bin": "index.js", + "bin": "./bin/index.js", "homepage": "https://github.com/code-pushup/cli/tree/main/packages/create-cli#readme", "bugs": { "url": "https://github.com/code-pushup/cli/issues?q=is%3Aissue%20state%3Aopen%20type%3ABug%20label%3A\"🧩%20create-cli\"" diff --git a/packages/create-cli/project.json b/packages/create-cli/project.json index 7e081800bc..9de19b88b9 100644 --- a/packages/create-cli/project.json +++ b/packages/create-cli/project.json @@ -4,7 +4,11 @@ "sourceRoot": "packages/create-cli/src", "projectType": "library", "targets": { - "build": {}, + "build": { + "options": { + "assets": ["{projectRoot}/*.md", "{projectRoot}/bin/*"] + } + }, "lint": {}, "unit-test": {}, From aa69f3714ad40912ec784a735da0bfd5ebb8d96d Mon Sep 17 00:00:00 2001 From: hanna-skryl Date: Tue, 17 Mar 2026 12:09:01 -0400 Subject: [PATCH 2/3] fix(create-cli): resolve nx devkit from target workspace --- packages/create-cli/src/lib/setup/monorepo.ts | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/create-cli/src/lib/setup/monorepo.ts b/packages/create-cli/src/lib/setup/monorepo.ts index 54f66ebab2..026a0b661f 100644 --- a/packages/create-cli/src/lib/setup/monorepo.ts +++ b/packages/create-cli/src/lib/setup/monorepo.ts @@ -1,4 +1,5 @@ import { select } from '@inquirer/prompts'; +import { createRequire } from 'node:module'; import path from 'node:path'; import { MONOREPO_TOOL_DETECTORS, @@ -8,9 +9,9 @@ import { hasScript, listPackages, listWorkspaces, - loadNxProjectGraph, logger, readPnpmWorkspacePatterns, + stringifyError, toUnixPath, } from '@code-pushup/utils'; import type { @@ -83,7 +84,15 @@ export async function listProjects( } async function listNxProjects(cwd: string): Promise { - const graph = await loadNxProjectGraph(); + const require = createRequire(path.join(cwd, 'package.json')); + const { readCachedProjectGraph, createProjectGraphAsync } = + require('@nx/devkit') as typeof import('@nx/devkit'); + + const graph = await loadProjectGraph( + readCachedProjectGraph, + createProjectGraphAsync, + ); + return Object.values(graph.nodes).map(({ name, data }) => ({ name, directory: path.join(cwd, data.root), @@ -133,7 +142,7 @@ async function addNxTarget( return false; } const config = JSON.parse(raw); - if (config.targets[TASK_NAME] != null) { + if (config.targets?.[TASK_NAME] != null) { return true; } const updated = { @@ -180,3 +189,17 @@ function toProject(cwd: string, pkg: WorkspacePackage): WizardProject { relativeDir: toUnixPath(path.relative(cwd, pkg.directory)), }; } + +async function loadProjectGraph( + readCached: typeof import('@nx/devkit').readCachedProjectGraph, + createAsync: typeof import('@nx/devkit').createProjectGraphAsync, +) { + try { + return readCached(); + } catch (error) { + logger.warn( + `Could not read cached project graph, falling back to async creation.\n${stringifyError(error)}`, + ); + return createAsync({ exitOnError: false }); + } +} From c88e7ae2db8c14b6d3bad5601e602427df9984dd Mon Sep 17 00:00:00 2001 From: hanna-skryl Date: Tue, 17 Mar 2026 13:48:47 -0400 Subject: [PATCH 3/3] refactor: simplify bin wrapper and move to targetDefaults --- eslint.config.js | 2 +- nx.json | 2 +- packages/cli/{bin/index.js => bin.js} | 2 +- packages/cli/package.json | 2 +- packages/cli/project.json | 6 +----- packages/create-cli/{bin/index.js => bin.js} | 2 +- packages/create-cli/package.json | 2 +- packages/create-cli/project.json | 6 +----- 8 files changed, 8 insertions(+), 16 deletions(-) rename packages/cli/{bin/index.js => bin.js} (93%) rename packages/create-cli/{bin/index.js => bin.js} (93%) diff --git a/eslint.config.js b/eslint.config.js index 63b9cc76ab..a28169dbc4 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -166,7 +166,7 @@ export default tseslint.config( }, { // in bin files, imports with side effects are allowed - files: ['**/bin/**/*.ts', '**/bin/**/*.js'], + files: ['**/bin/**/*.ts', '**/bin/**/*.js', '**/bin.js'], rules: { 'import/no-unassigned-import': 'off', }, diff --git a/nx.json b/nx.json index c77d9dff8c..356ac52463 100644 --- a/nx.json +++ b/nx.json @@ -75,7 +75,7 @@ "outputPath": "{projectRoot}/dist", "main": "{projectRoot}/src/index.ts", "tsConfig": "{projectRoot}/tsconfig.lib.json", - "assets": ["{projectRoot}/*.md"] + "assets": ["{projectRoot}/*.md", "{projectRoot}/bin.js"] } }, "unit-test": { diff --git a/packages/cli/bin/index.js b/packages/cli/bin.js similarity index 93% rename from packages/cli/bin/index.js rename to packages/cli/bin.js index 59c5450504..70395c2062 100755 --- a/packages/cli/bin/index.js +++ b/packages/cli/bin.js @@ -8,4 +8,4 @@ * By tracking this file in git with executable permissions (+x), we ensure * the CLI remains executable after npm publish without needing post-install scripts. */ -import '../src/index.js'; +import './src/index.js'; diff --git a/packages/cli/package.json b/packages/cli/package.json index ed1c91f445..58d8d2f7b7 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -39,7 +39,7 @@ }, "type": "module", "bin": { - "code-pushup": "./bin/index.js" + "code-pushup": "./bin.js" }, "engines": { "node": ">=20" diff --git a/packages/cli/project.json b/packages/cli/project.json index e96eb2e2e1..c92b121151 100644 --- a/packages/cli/project.json +++ b/packages/cli/project.json @@ -4,11 +4,7 @@ "sourceRoot": "packages/cli/src", "projectType": "library", "targets": { - "build": { - "options": { - "assets": ["{projectRoot}/*.md", "{projectRoot}/bin/*"] - } - }, + "build": {}, "lint": {}, "unit-test": {}, "int-test": {}, diff --git a/packages/create-cli/bin/index.js b/packages/create-cli/bin.js similarity index 93% rename from packages/create-cli/bin/index.js rename to packages/create-cli/bin.js index 59c5450504..70395c2062 100755 --- a/packages/create-cli/bin/index.js +++ b/packages/create-cli/bin.js @@ -8,4 +8,4 @@ * By tracking this file in git with executable permissions (+x), we ensure * the CLI remains executable after npm publish without needing post-install scripts. */ -import '../src/index.js'; +import './src/index.js'; diff --git a/packages/create-cli/package.json b/packages/create-cli/package.json index ae138e7a6a..615f0eacdd 100644 --- a/packages/create-cli/package.json +++ b/packages/create-cli/package.json @@ -2,7 +2,7 @@ "name": "@code-pushup/create-cli", "version": "0.119.0", "license": "MIT", - "bin": "./bin/index.js", + "bin": "./bin.js", "homepage": "https://github.com/code-pushup/cli/tree/main/packages/create-cli#readme", "bugs": { "url": "https://github.com/code-pushup/cli/issues?q=is%3Aissue%20state%3Aopen%20type%3ABug%20label%3A\"🧩%20create-cli\"" diff --git a/packages/create-cli/project.json b/packages/create-cli/project.json index 9de19b88b9..7e081800bc 100644 --- a/packages/create-cli/project.json +++ b/packages/create-cli/project.json @@ -4,11 +4,7 @@ "sourceRoot": "packages/create-cli/src", "projectType": "library", "targets": { - "build": { - "options": { - "assets": ["{projectRoot}/*.md", "{projectRoot}/bin/*"] - } - }, + "build": {}, "lint": {}, "unit-test": {},