fix(cli): restore help registration and descriptor graph

This commit is contained in:
Vincent Koc
2026-04-26 22:26:39 -07:00
parent 02dae3e1d1
commit 3d59e8192b
3 changed files with 25 additions and 6 deletions

View File

@@ -14,11 +14,12 @@ export function shouldSkipPluginCommandRegistration(params: {
if (params.hasBuiltinPrimary) {
return true;
}
if (params.primary === "help" && resolveCliArgvInvocation(params.argv).hasHelpOrVersion) {
return true;
const invocation = resolveCliArgvInvocation(params.argv);
if (params.primary === "help") {
return invocation.hasHelpOrVersion && invocation.commandPath.length <= 1;
}
if (!params.primary) {
return resolveCliArgvInvocation(params.argv).hasHelpOrVersion;
return invocation.hasHelpOrVersion;
}
return false;
}

View File

@@ -1,5 +1,4 @@
import type { Command } from "commander";
import type { CommandGroupEntry } from "./register-command-groups.js";
export type NamedCommandDescriptor = {
name: string;
@@ -23,6 +22,11 @@ export type ResolvedCommandGroupEntry<TDescriptor extends NamedCommandDescriptor
register: TRegister;
};
type CommandGroupEntryLike = {
placeholders: NamedCommandDescriptor[];
register: (program: Command) => Promise<void> | void;
};
function buildDescriptorIndex<TDescriptor extends NamedCommandDescriptor>(
descriptors: readonly TDescriptor[],
): Map<string, TDescriptor> {
@@ -49,8 +53,8 @@ export function resolveCommandGroupEntries<TDescriptor extends NamedCommandDescr
export function buildCommandGroupEntries<TRegister>(
descriptors: readonly NamedCommandDescriptor[],
specs: readonly CommandGroupDescriptorSpec<TRegister>[],
mapRegister: (register: TRegister) => CommandGroupEntry["register"],
): CommandGroupEntry[] {
mapRegister: (register: TRegister) => CommandGroupEntryLike["register"],
): CommandGroupEntryLike[] {
return resolveCommandGroupEntries(descriptors, specs).map((entry) => ({
placeholders: entry.placeholders,
register: mapRegister(entry.register),

View File

@@ -12,6 +12,13 @@ const getPluginCliCommandDescriptorsMock = vi.fn(
);
vi.mock("./core-command-descriptors.js", () => ({
CORE_CLI_COMMAND_DESCRIPTORS: [
{
name: "status",
description: "Show status",
hasSubcommands: false,
},
],
getCoreCliCommandDescriptors: () => [
{
name: "status",
@@ -23,6 +30,13 @@ vi.mock("./core-command-descriptors.js", () => ({
}));
vi.mock("./subcli-descriptors.js", () => ({
SUB_CLI_DESCRIPTORS: [
{
name: "config",
description: "Manage config",
hasSubcommands: true,
},
],
getSubCliEntries: () => [
{
name: "config",