Skip to content

Commit ca7aaf5

Browse files
committed
refactor: collapse command client facets
1 parent 57ef9cb commit ca7aaf5

18 files changed

Lines changed: 81 additions & 121 deletions

File tree

src/commands/batch/index.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,6 @@ import { commonToClientOptions } from '../command-input.ts';
77
import { createBatchCommandMetadata, type BatchInput } from './metadata.ts';
88
import { createBatchDaemonWriter } from './projection.ts';
99

10-
const batchCommandDescription = 'Run multiple structured command steps in one daemon request.';
11-
12-
export const batchCommandDescriptions = {
13-
batch: batchCommandDescription,
14-
} as const;
15-
1610
export const batchCommandMetadata = createBatchCommandMetadata();
1711

1812
export const batchCommandDefinition = defineExecutableCommand(

src/commands/capture/index.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ import {
4444
settingsCliReader as settingsCliReaderImpl,
4545
settingsCliSchema,
4646
settingsCommandDefinition,
47-
settingsCommandDescription,
4847
settingsCommandMetadata,
4948
settingsDaemonWriter as settingsDaemonWriterImpl,
5049
} from './settings.ts';
@@ -61,15 +60,6 @@ const diffCommandDescription = 'Diff accessibility snapshots.';
6160
const waitCommandDescription = 'Wait for duration, text, ref, or selector.';
6261
const alertCommandDescription = 'Inspect or handle platform alerts.';
6362

64-
export const captureCommandDescriptions = {
65-
[SNAPSHOT_COMMAND_NAME]: snapshotCommandDescription,
66-
[SCREENSHOT_COMMAND_NAME]: screenshotCommandDescription,
67-
[DIFF_COMMAND_NAME]: diffCommandDescription,
68-
[WAIT_COMMAND_NAME]: waitCommandDescription,
69-
[ALERT_COMMAND_NAME]: alertCommandDescription,
70-
[SETTINGS_COMMAND_NAME]: settingsCommandDescription,
71-
} as const;
72-
7363
const snapshotCommandMetadata = defineFieldCommandMetadata(
7464
SNAPSHOT_COMMAND_NAME,
7565
snapshotCommandDescription,

src/commands/capture/settings.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import type { CliReader, DaemonWriter } from '../cli-grammar/types.ts';
1818
import { defineFieldCommandMetadata } from '../field-command-contract.ts';
1919

2020
export const SETTINGS_COMMAND_NAME = 'settings';
21-
export const settingsCommandDescription = 'Change OS settings and app permissions.';
21+
const settingsCommandDescription = 'Change OS settings and app permissions.';
2222

2323
export const settingsCommandMetadata = defineFieldCommandMetadata(
2424
SETTINGS_COMMAND_NAME,

src/commands/client-command-contracts.ts

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { captureCommandDefinitions, captureCommandMetadata } from './capture/index.ts';
2+
import { managementCommandDefinitions, managementCommandMetadata } from './management/index.ts';
3+
import { metroCommandDefinition, metroCommandMetadata } from './metro/index.ts';
4+
import {
5+
observabilityCommandDefinitions,
6+
observabilityCommandMetadata,
7+
} from './observability/index.ts';
8+
import { reactNativeCommandDefinition, reactNativeCommandMetadata } from './react-native/index.ts';
9+
import { recordingCommandDefinitions, recordingCommandMetadata } from './recording/index.ts';
10+
import { replayCommandDefinitions, replayCommandMetadataList } from './replay/index.ts';
11+
import { systemCommandDefinitions, systemCommandMetadata } from './system/index.ts';
12+
13+
const clientCommandFamilyFacets = [
14+
{
15+
metadata: managementCommandMetadata,
16+
definitions: managementCommandDefinitions,
17+
},
18+
{
19+
metadata: captureCommandMetadata,
20+
definitions: captureCommandDefinitions,
21+
},
22+
{
23+
metadata: systemCommandMetadata,
24+
definitions: systemCommandDefinitions,
25+
},
26+
{
27+
metadata: [reactNativeCommandMetadata],
28+
definitions: [reactNativeCommandDefinition],
29+
},
30+
{
31+
metadata: replayCommandMetadataList,
32+
definitions: replayCommandDefinitions,
33+
},
34+
{
35+
metadata: observabilityCommandMetadata,
36+
definitions: observabilityCommandDefinitions,
37+
},
38+
{
39+
metadata: recordingCommandMetadata,
40+
definitions: recordingCommandDefinitions,
41+
},
42+
{
43+
metadata: [metroCommandMetadata],
44+
definitions: [metroCommandDefinition],
45+
},
46+
] as const;
47+
48+
export const clientCommandMetadata = readClientCommandMetadata(clientCommandFamilyFacets);
49+
50+
export const clientCommandDefinitions = readClientCommandDefinitions(clientCommandFamilyFacets);
51+
52+
function readClientCommandMetadata<
53+
const TFacets extends readonly { metadata: readonly unknown[] }[],
54+
>(facets: TFacets): Array<TFacets[number]['metadata'][number]> {
55+
return facets.flatMap((family) => [...family.metadata]) as Array<
56+
TFacets[number]['metadata'][number]
57+
>;
58+
}
59+
60+
function readClientCommandDefinitions<
61+
const TFacets extends readonly { definitions: readonly unknown[] }[],
62+
>(facets: TFacets): Array<TFacets[number]['definitions'][number]> {
63+
return facets.flatMap((family) => [...family.definitions]) as Array<
64+
TFacets[number]['definitions'][number]
65+
>;
66+
}

src/commands/client-command-metadata.ts

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,13 @@
1-
import { batchCommandDescriptions } from './batch/index.ts';
2-
import { captureCommandDescriptions } from './capture/index.ts';
3-
import { interactionCommandDescriptions } from './interaction/index.ts';
4-
import { managementCommandDescriptions } from './management/index.ts';
5-
import { metroCommandDescriptions } from './metro/index.ts';
6-
import { observabilityCommandDescriptions } from './observability/index.ts';
7-
import { reactNativeCommandDescriptions } from './react-native/index.ts';
8-
import { recordingCommandDescriptions } from './recording/index.ts';
9-
import { replayCommandDescriptions } from './replay/index.ts';
10-
import { systemCommandDescriptions } from './system/index.ts';
1+
import { listCommandMetadata, type CommandName } from './command-metadata.ts';
112

12-
const COMMAND_DESCRIPTIONS = {
13-
...managementCommandDescriptions,
14-
...captureCommandDescriptions,
15-
...interactionCommandDescriptions,
16-
...systemCommandDescriptions,
17-
...reactNativeCommandDescriptions,
18-
...replayCommandDescriptions,
19-
...observabilityCommandDescriptions,
20-
...recordingCommandDescriptions,
21-
...metroCommandDescriptions,
22-
...batchCommandDescriptions,
23-
} as const;
24-
25-
export type DescribedCommandName = keyof typeof COMMAND_DESCRIPTIONS;
3+
export type DescribedCommandName = CommandName;
264

275
export function listCommandDescriptionMetadata(): Array<{
286
name: DescribedCommandName;
297
description: string;
308
}> {
31-
return Object.entries(COMMAND_DESCRIPTIONS).map(([name, description]) => ({
32-
name: name as DescribedCommandName,
33-
description,
9+
return listCommandMetadata().map((metadata) => ({
10+
name: metadata.name,
11+
description: metadata.description,
3412
}));
3513
}

src/commands/command-metadata.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { listMcpExposedCommandNames } from '../command-catalog.ts';
22
import { batchCommandMetadata } from './batch/index.ts';
3-
import { clientCommandMetadata } from './client-command-metadata.ts';
3+
import { clientCommandMetadata } from './client-command-facets.ts';
44
import type { CommandMetadata } from './command-contract.ts';
55
import { interactionCommandMetadata } from './interaction/index.ts';
66

@@ -18,6 +18,10 @@ const commandMetadataMap: ReadonlyMap<CommandName, AnyCommandMetadata> = new Map
1818
commandMetadata.map((definition) => [definition.name, definition as AnyCommandMetadata]),
1919
);
2020

21+
export function listCommandMetadata(): AnyCommandMetadata[] {
22+
return [...commandMetadata];
23+
}
24+
2125
export function listMcpCommandMetadata(): AnyCommandMetadata[] {
2226
return listMcpExposedCommandNames().map((name) => {
2327
if (!isCommandName(name)) {

src/commands/command-surface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { AgentDeviceClient } from '../client-types.ts';
22
import { batchCommandDefinition } from './batch/index.ts';
3-
import { clientCommandDefinitions } from './client-command-contracts.ts';
3+
import { clientCommandDefinitions } from './client-command-facets.ts';
44
import type { JsonSchema } from './command-contract.ts';
55
import { interactionCommandDefinitions } from './interaction/index.ts';
66
import type { BatchCommandName } from './command-projection.ts';

src/commands/interaction/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import {
4444

4545
export { gestureCliReaders, gestureDaemonWriters } from './gesture.ts';
4646
export { interactionCliReaders, interactionDaemonWriters } from './interactions.ts';
47-
export { interactionCommandDescriptions, interactionCommandMetadata } from './metadata.ts';
47+
export { interactionCommandMetadata } from './metadata.ts';
4848
export { selectorCliReaders, selectorDaemonWriters } from './selectors.ts';
4949

5050
export const interactionCliSchemas = {

0 commit comments

Comments
 (0)