File size: 4,308 Bytes
f778c12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Core command registry that lazily imports command groups based on parsed argv.
import type { Command } from "commander";
import { resolveCliArgvInvocation } from "../argv-invocation.js";
import {
  buildCommandGroupEntries,
  type CommandGroupDescriptorSpec,
} from "./command-group-descriptors.js";
import type { ProgramContext } from "./context.js";
import {
  getCoreCliCommandDescriptors,
  getCoreCliCommandNamesCore,
} from "./core-command-descriptors.js";
import {
  findCommandGroupEntry,
  registerCommandGroupByName,
  registerCommandGroups,
  type CommandGroupEntry,
} from "./register-command-groups.js";

const coreEntrySpecs: readonly CommandGroupDescriptorSpec<[ctx: ProgramContext]>[] = [
  [
    ["setup", "crestodian"],
    async (program) => (await import("./register.setup.js")).registerSetupCommand(program),
  ],
  [
    ["onboard"],
    async (program) => (await import("./register.onboard.js")).registerOnboardCommand(program),
  ],
  [
    ["configure"],
    async (program) => (await import("./register.configure.js")).registerConfigureCommand(program),
  ],
  [["config"], async (program) => (await import("../config-cli.js")).registerConfigCli(program)],
  [["claws"], async (program) => (await import("../claws-cli.js")).registerClawsCli(program)],
  [
    ["backup"],
    async (program) => (await import("./register.backup.js")).registerBackupCommand(program),
  ],
  [
    ["database"],
    async (program) => (await import("./register.database.js")).registerDatabaseCommand(program),
  ],
  [
    ["migrate"],
    async (program) => (await import("./register.migrate.js")).registerMigrateCommand(program),
  ],
  [
    ["audit"],
    async (program) => (await import("./register.audit.js")).registerAuditCommand(program),
  ],
  [
    ["doctor", "triage", "dashboard", "reset", "uninstall"],
    async (program) =>
      (await import("./register.maintenance.js")).registerMaintenanceCommands(program),
  ],
  [
    ["message"],
    async (program, ctx) =>
      (await import("./register.message.js")).registerMessageCommands(program, ctx),
  ],
  [["mcp"], async (program) => (await import("../mcp-cli.js")).registerMcpCli(program)],
  [
    ["transcripts"],
    async (program) => (await import("./register.transcripts.js")).registerTranscriptsCli(program),
  ],
  [
    ["agent"],
    async (program, ctx) =>
      (await import("./register.agent-turn.js")).registerAgentTurnCommand(program, {
        agentChannelOptions: ctx.agentChannelOptions,
      }),
  ],
  [
    ["agents"],
    async (program) => (await import("./register.agent.js")).registerAgentsCommands(program),
  ],
  [
    ["status", "health", "sessions", "tasks"],
    async (program) =>
      (await import("./register.status-health-sessions.js")).registerStatusHealthSessionsCommands(
        program,
      ),
  ],
];

function resolveCoreCommandGroups(ctx: ProgramContext): CommandGroupEntry[] {
  const descriptors = getCoreCliCommandDescriptors();
  const visibleCommandNames = new Set(descriptors.map((descriptor) => descriptor.name));
  const visibleEntrySpecs = coreEntrySpecs.filter(([commandNames]) =>
    commandNames.every((name) => visibleCommandNames.has(name)),
  );
  // Descriptor metadata and import specs stay separate so help can stay cheap.
  return buildCommandGroupEntries(descriptors, visibleEntrySpecs, ctx);
}

export function getCoreCliCompletionGroups(ctx: ProgramContext): CommandGroupEntry[] {
  const entries = resolveCoreCommandGroups(ctx);
  // Keep separated visits: an intervening group affects Commander's final output order.
  return getCoreCliCommandNamesCore()
    .map((name) => findCommandGroupEntry(entries, name))
    .filter(
      (entry, index, groups): entry is CommandGroupEntry =>
        entry !== undefined && entry !== groups[index - 1],
    );
}

export async function registerCoreCliByName(
  program: Command,
  ctx: ProgramContext,
  name: string,
): Promise<boolean> {
  return registerCommandGroupByName(program, resolveCoreCommandGroups(ctx), name);
}

export function registerCoreCliCommands(program: Command, ctx: ProgramContext, argv: string[]) {
  const { primary } = resolveCliArgvInvocation(argv);
  registerCommandGroups(program, resolveCoreCommandGroups(ctx), {
    eager: false,
    primary,
    registerPrimaryOnly: true,
  });
}