Use Project follow-up command helper for display-only paths#7243
Use Project follow-up command helper for display-only paths#7243dmerand wants to merge 1 commit intodonald/package-manager-project-operationsfrom
Conversation
4ed4724 to
17a0158
Compare
|
Warning This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
This stack of pull requests is managed by Graphite. Learn more about stacking. |
|
Solid refactoring — introducing 1. Does the helper guard against invalid/unknown package managers at display time? The PR description says this is the "display-only" sibling to #7242's operation-gating. I notice 2. Is there a race between In the 3. Test coverage for the new helper The PR touches 5 files but I don't see a dedicated unit test for |
17a0158 to
1659ab4
Compare
63d40f8 to
0214c2e
Compare
1659ab4 to
ddbdb62
Compare
68a6662 to
1e6ebeb
Compare
ddbdb62 to
2ffb6c6
Compare
1e6ebeb to
738df5d
Compare
2ffb6c6 to
d837ccb
Compare
Differences in type declarationsWe detected differences in the type declarations generated by Typescript for this branch compared to the baseline ('main' branch). Please, review them to ensure they are backward-compatible. Here are some important things to keep in mind:
New type declarationsWe found no new type declarations in this PR Existing type declarationspackages/cli-kit/dist/public/node/node-package-manager.d.ts@@ -27,6 +27,7 @@ export type DependencyType = 'dev' | 'prod' | 'peer';
*/
export declare const packageManager: readonly ["yarn", "npm", "pnpm", "bun", "homebrew", "unknown"];
export type PackageManager = (typeof packageManager)[number];
+export type ProjectPackageManager = Extract<PackageManager, 'yarn' | 'npm' | 'pnpm' | 'bun'>;
/**
* Returns an abort error that's thrown when the package manager can't be determined.
* @returns An abort error.
@@ -68,6 +69,58 @@ export declare function packageManagerFromUserAgent(env?: NodeJS.ProcessEnv): Pa
* @returns The dependency manager
*/
export declare function getPackageManager(fromDirectory: string): Promise<PackageManager>;
+/**
+ * Resolves the package manager for a directory already known to be the project root.
+ *
+ * Use this when the caller already knows the root directory and wants to inspect that root
+ * directly rather than walking upward from a child directory.
+ *
+ * @param rootDirectory - The known project root directory.
+ * @returns The package manager detected from root markers, defaulting to npm <command>
+
+Usage:
+
+npm install install all the dependencies in your project
+npm install <foo> add the <foo> dependency to your project
+npm test run this project's tests
+npm run <foo> run the script named <foo>
+npm <command> -h quick help on <command>
+npm -l display usage info for all commands
+npm help <term> search for help on <term>
+npm help npm more involved overview
+
+All commands:
+
+ access, adduser, audit, bugs, cache, ci, completion,
+ config, dedupe, deprecate, diff, dist-tag, docs, doctor,
+ edit, exec, explain, explore, find-dupes, fund, get, help,
+ help-search, init, install, install-ci-test, install-test,
+ link, ll, login, logout, ls, org, outdated, owner, pack,
+ ping, pkg, prefix, profile, prune, publish, query, rebuild,
+ repo, restart, root, run-script, sbom, search, set,
+ shrinkwrap, star, stars, start, stop, team, test, token,
+ undeprecate, uninstall, unpublish, unstar, update, version,
+ view, whoami
+
+Specify configs in the ini-formatted file:
+ /home/runner/work/_temp/.npmrc
+or on the command line via: npm <command> --key=value
+
+More configuration info: npm help config
+Configuration fields: npm help 7 config
+
+npm@11.3.0 /opt/hostedtoolcache/node/24.1.0/x64/lib/node_modules/npm when no marker exists.
+ * @throws PackageJsonNotFoundError if the provided directory does not contain a package.json.
+ */
+export declare function getPackageManagerForProjectRoot(rootDirectory: string): Promise<ProjectPackageManager>;
+/**
+ * Builds the command and argv needed to execute a local binary using the package manager
+ * detected from the provided directory or its ancestors.
+ */
+export declare function packageManagerBinaryCommandForDirectory(fromDirectory: string, binary: string, ...binaryArgs: string[]): Promise<{
+ command: string;
+ args: string[];
+}>;
interface InstallNPMDependenciesRecursivelyOptions {
/**
* The dependency manager to use to install the dependencies.
|

What
This follow-up continues the same package-manager stack as #7239, #7241, and #7242.
Add a
formatProjectFollowUpCommand(...)helper for Project-backed follow-up commands, and use it in the display-only callers in deploy, dev, info, and generate instead of formatting commands fromproject.packageManagerdirectly.Why
The stack goal is to make callers choose intent, not implementation.
#7242added an explicit package-manager boundary for project operations. This PR applies the same idea to display-only paths: when a caller only needs the right follow-up command for a project, it should ask for that command shape instead of reaching into package-manager state and formatting it itself.This keeps the slice narrow. It does not change the package-manager values still surfaced for project info output, and it does not reopen the loader/config-link paths.
How
Add
formatProjectFollowUpCommand(...)inpackages/app/src/cli/utilities/project-command.ts.Use it from: