Skip to content

Commit 39c6bc8

Browse files
committed
refactor: consolidate cli-config into global-config
1 parent 04c3785 commit 39c6bc8

File tree

11 files changed

+53
-59
lines changed

11 files changed

+53
-59
lines changed

src/cli/__tests__/global-config.test.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { getOrCreateInstallationId, readGlobalConfig, updateGlobalConfig } from '../global-config';
1+
import {
2+
getOrCreateInstallationId,
3+
readGlobalConfig,
4+
readGlobalConfigSync,
5+
updateGlobalConfig,
6+
} from '../../lib/schemas/io/global-config';
27
import { createTempConfig } from './helpers/temp-config';
38
import { readFile, writeFile } from 'fs/promises';
49
import { afterAll, beforeEach, describe, expect, it } from 'vitest';
@@ -39,6 +44,21 @@ describe('global-config', () => {
3944
});
4045
});
4146

47+
describe('readGlobalConfigSync', () => {
48+
it('returns parsed config when file exists', async () => {
49+
await writeFile(tmp.configFile, JSON.stringify({ telemetry: { enabled: false } }));
50+
51+
expect(readGlobalConfigSync(tmp.configFile)).toEqual({ telemetry: { enabled: false } });
52+
});
53+
54+
it('returns empty object when file is missing or invalid', async () => {
55+
expect(readGlobalConfigSync(tmp.testDir + '/nonexistent.json')).toEqual({});
56+
57+
await writeFile(tmp.configFile, 'not json');
58+
expect(readGlobalConfigSync(tmp.configFile)).toEqual({});
59+
});
60+
});
61+
4262
describe('updateGlobalConfig', () => {
4363
it('creates directory and writes config when none exists', async () => {
4464
const fresh = createTempConfig('gc-fresh');

src/cli/cli.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { getOrCreateInstallationId } from '../lib/schemas/io/global-config';
12
import { registerAdd } from './commands/add';
23
import { registerCreate } from './commands/create';
34
import { registerDeploy } from './commands/deploy';
@@ -19,7 +20,6 @@ import { registerTraces } from './commands/traces';
1920
import { registerUpdate } from './commands/update';
2021
import { registerValidate } from './commands/validate';
2122
import { PACKAGE_VERSION } from './constants';
22-
import { getOrCreateInstallationId } from './global-config';
2323
import { ALL_PRIMITIVES } from './primitives';
2424
import { App } from './tui/App';
2525
import { LayoutProvider } from './tui/context';

src/cli/commands/telemetry/__tests__/telemetry.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
import { readGlobalConfig } from '../../../../lib/schemas/io/global-config';
12
import { createTempConfig } from '../../../__tests__/helpers/temp-config';
2-
import { readGlobalConfig } from '../../../global-config';
33
import { handleTelemetryDisable, handleTelemetryEnable, handleTelemetryStatus } from '../actions';
44
import { chmod, mkdir, rm, writeFile } from 'fs/promises';
55
import { afterAll, afterEach, beforeEach, describe, expect, it, vi } from 'vitest';

src/cli/commands/telemetry/actions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { GLOBAL_CONFIG_DIR, GLOBAL_CONFIG_FILE, updateGlobalConfig } from '../../global-config.js';
1+
import { GLOBAL_CONFIG_DIR, GLOBAL_CONFIG_FILE, updateGlobalConfig } from '../../../lib/schemas/io/global-config.js';
22
import { resolveTelemetryPreference } from '../../telemetry/resolve.js';
33

44
export async function handleTelemetryDisable(

src/cli/operations/deploy/__tests__/post-deploy-observability.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
import { setupTransactionSearch } from '../post-deploy-observability.js';
22
import { beforeEach, describe, expect, it, vi } from 'vitest';
33

4-
const { mockEnableTransactionSearch, mockReadCliConfig } = vi.hoisted(() => ({
4+
const { mockEnableTransactionSearch, mockReadGlobalConfigSync } = vi.hoisted(() => ({
55
mockEnableTransactionSearch: vi.fn(),
6-
mockReadCliConfig: vi.fn(),
6+
mockReadGlobalConfigSync: vi.fn(),
77
}));
88

99
vi.mock('../../../aws/transaction-search', () => ({
1010
enableTransactionSearch: mockEnableTransactionSearch,
1111
}));
1212

13-
vi.mock('../../../../lib/schemas/io/cli-config', () => ({
14-
readCliConfig: mockReadCliConfig,
13+
vi.mock('../../../../lib/schemas/io/global-config', () => ({
14+
readGlobalConfigSync: mockReadGlobalConfigSync,
1515
}));
1616

1717
describe('setupTransactionSearch', () => {
1818
beforeEach(() => {
1919
vi.clearAllMocks();
20-
mockReadCliConfig.mockReturnValue({});
20+
mockReadGlobalConfigSync.mockReturnValue({});
2121
mockEnableTransactionSearch.mockResolvedValue({ success: true });
2222
});
2323

@@ -33,7 +33,7 @@ describe('setupTransactionSearch', () => {
3333
});
3434

3535
it('passes custom transactionSearchIndexPercentage from config', async () => {
36-
mockReadCliConfig.mockReturnValue({ transactionSearchIndexPercentage: 25 });
36+
mockReadGlobalConfigSync.mockReturnValue({ transactionSearchIndexPercentage: 25 });
3737

3838
const result = await setupTransactionSearch({
3939
region: 'us-east-1',
@@ -57,7 +57,7 @@ describe('setupTransactionSearch', () => {
5757
});
5858

5959
it('skips when disableTransactionSearch is true in config', async () => {
60-
mockReadCliConfig.mockReturnValue({ disableTransactionSearch: true });
60+
mockReadGlobalConfigSync.mockReturnValue({ disableTransactionSearch: true });
6161

6262
const result = await setupTransactionSearch({
6363
region: 'us-east-1',

src/cli/operations/deploy/post-deploy-observability.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { readCliConfig } from '../../../lib/schemas/io/cli-config';
1+
import { readGlobalConfigSync } from '../../../lib/schemas/io/global-config';
22
import { enableTransactionSearch } from '../../aws/transaction-search';
33

44
export interface TransactionSearchSetupOptions {
@@ -31,7 +31,7 @@ export async function setupTransactionSearch(
3131
return { success: true };
3232
}
3333

34-
const config = readCliConfig();
34+
const config = readGlobalConfigSync();
3535
if (config.disableTransactionSearch) {
3636
return { success: true };
3737
}

src/cli/telemetry/resolve.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { readGlobalConfig } from '../global-config.js';
1+
import { readGlobalConfig } from '../../lib/schemas/io/global-config.js';
22

33
export interface TelemetryPreference {
44
enabled: boolean;

src/lib/packaging/build-args.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { readCliConfig } from '../schemas/io/cli-config';
1+
import { readGlobalConfigSync } from '../schemas/io/global-config';
22

33
/**
44
* Return Docker --build-arg flags for UV index URLs configured in ~/.agentcore/config.json.
55
* Returns an empty array when no custom indexes are configured.
66
*/
77
export function getUvBuildArgs(): string[] {
8-
const config = readCliConfig();
8+
const config = readGlobalConfigSync();
99
const args: string[] = [];
1010
if (config.uvDefaultIndex) args.push('--build-arg', `UV_DEFAULT_INDEX=${config.uvDefaultIndex}`);
1111
if (config.uvIndex) args.push('--build-arg', `UV_INDEX=${config.uvIndex}`);

src/lib/schemas/io/cli-config.ts

Lines changed: 0 additions & 36 deletions
This file was deleted.
Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { readFileSync } from 'fs';
12
import { mkdir, readFile, writeFile } from 'fs/promises';
23
import { randomUUID } from 'node:crypto';
34
import { homedir } from 'os';
@@ -9,18 +10,19 @@ export const GLOBAL_CONFIG_FILE = join(GLOBAL_CONFIG_DIR, 'config.json');
910

1011
const GlobalConfigSchema = z
1112
.object({
12-
installationId: z.string().optional(),
13-
uvDefaultIndex: z.string().optional(),
14-
uvIndex: z.string().optional(),
15-
disableTransactionSearch: z.boolean().optional(),
16-
transactionSearchIndexPercentage: z.number().min(0).max(100).optional(),
13+
installationId: z.string().optional().catch(undefined),
14+
uvDefaultIndex: z.string().optional().catch(undefined),
15+
uvIndex: z.string().optional().catch(undefined),
16+
disableTransactionSearch: z.boolean().optional().catch(undefined),
17+
transactionSearchIndexPercentage: z.number().int().min(0).max(100).optional().catch(undefined),
1718
telemetry: z
1819
.object({
1920
enabled: z.boolean().optional(),
2021
endpoint: z.string().optional(),
2122
audit: z.boolean().optional(),
2223
})
23-
.optional(),
24+
.optional()
25+
.catch(undefined),
2426
})
2527
.passthrough();
2628

@@ -35,6 +37,15 @@ export async function readGlobalConfig(configFile = GLOBAL_CONFIG_FILE): Promise
3537
}
3638
}
3739

40+
export function readGlobalConfigSync(configFile = GLOBAL_CONFIG_FILE): GlobalConfig {
41+
try {
42+
const data = readFileSync(configFile, 'utf-8');
43+
return GlobalConfigSchema.parse(JSON.parse(data));
44+
} catch {
45+
return {};
46+
}
47+
}
48+
3849
export async function updateGlobalConfig(
3950
partial: GlobalConfig,
4051
configDir = GLOBAL_CONFIG_DIR,

0 commit comments

Comments
 (0)