diff --git a/packages/core/src/agent/config-loader.ts b/packages/core/src/agent/config-loader.ts index 00c989a..84c2967 100644 --- a/packages/core/src/agent/config-loader.ts +++ b/packages/core/src/agent/config-loader.ts @@ -1,12 +1,12 @@ import * as fs from 'fs'; import * as path from 'path'; -import * as os from 'os'; import type { AgentConfigFile } from './types.js'; +import { getConfigDir } from '../constants/paths.js'; /** * 全局配置目录 */ -const GLOBAL_CONFIG_DIR = path.join(os.homedir(), '.ai-terminal-assistant'); +const GLOBAL_CONFIG_DIR = getConfigDir(); /** * 加载用户自定义 Agent 配置 diff --git a/packages/core/src/checkpoint/manager.ts b/packages/core/src/checkpoint/manager.ts index 140c605..7efad2c 100644 --- a/packages/core/src/checkpoint/manager.ts +++ b/packages/core/src/checkpoint/manager.ts @@ -4,8 +4,8 @@ */ import * as path from 'path'; -import * as os from 'os'; import { nanoid } from 'nanoid'; +import { getCheckpointsDir } from '../constants/paths.js'; import { ShadowGit, createShadowGit } from './shadow-git.js'; import { CheckpointLock } from './lock.js'; import { CheckpointSafetyChecker } from './safety.js'; @@ -75,7 +75,7 @@ export class CheckpointManager { }, maxCheckpoints: 100, maxAge: 7 * 24 * 60 * 60 * 1000, - storageDir: path.join(os.homedir(), '.ai-assist', 'checkpoints'), + storageDir: getCheckpointsDir(), ...config, }; diff --git a/packages/core/src/constants/index.ts b/packages/core/src/constants/index.ts new file mode 100644 index 0000000..b3031d9 --- /dev/null +++ b/packages/core/src/constants/index.ts @@ -0,0 +1 @@ +export * from './paths.js'; diff --git a/packages/core/src/constants/paths.ts b/packages/core/src/constants/paths.ts new file mode 100644 index 0000000..a45a396 --- /dev/null +++ b/packages/core/src/constants/paths.ts @@ -0,0 +1,60 @@ +/** + * 统一存储路径常量 + * 所有数据统一存储在 ~/.ai-terminal-assistant/ 目录下 + */ + +import * as path from 'path'; +import * as os from 'os'; + +/** + * 应用根目录名称 + */ +export const APP_DIR_NAME = '.ai-terminal-assistant'; + +/** + * 获取应用根目录 + * ~/.ai-terminal-assistant/ + */ +export function getAppDir(): string { + return path.join(os.homedir(), APP_DIR_NAME); +} + +/** + * 获取配置目录(与应用根目录相同) + * ~/.ai-terminal-assistant/ + */ +export function getConfigDir(): string { + return getAppDir(); +} + +/** + * 获取数据存储目录 + * ~/.ai-terminal-assistant/data/ + */ +export function getDataDir(): string { + return path.join(getAppDir(), 'data'); +} + +/** + * 获取 Checkpoint 存储目录 + * ~/.ai-terminal-assistant/checkpoints/ + */ +export function getCheckpointsDir(): string { + return path.join(getAppDir(), 'checkpoints'); +} + +/** + * 获取缓存目录 + * ~/.ai-terminal-assistant/cache/ + */ +export function getCacheDir(): string { + return path.join(getAppDir(), 'cache'); +} + +/** + * 获取日志目录 + * ~/.ai-terminal-assistant/logs/ + */ +export function getLogsDir(): string { + return path.join(getAppDir(), 'logs'); +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index bff5667..db511da 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -248,3 +248,14 @@ export type { FileIndexEntry, FileSearchOptions, } from './file-index/index.js'; + +// Constants - 统一存储路径 +export { + APP_DIR_NAME, + getAppDir, + getConfigDir, + getDataDir, + getCheckpointsDir, + getCacheDir, + getLogsDir, +} from './constants/index.js'; diff --git a/packages/core/src/mcp/config.ts b/packages/core/src/mcp/config.ts index 8bc996e..ae88481 100644 --- a/packages/core/src/mcp/config.ts +++ b/packages/core/src/mcp/config.ts @@ -11,6 +11,7 @@ import type { LocalMCPServer, RemoteMCPServer, } from './types.js'; +import { getConfigDir } from '../constants/paths.js'; /** 默认配置值 */ const DEFAULTS = { @@ -239,20 +240,20 @@ function mergeConfigs(base: MCPConfig, override: MCPConfig): MCPConfig { /** * 加载 MCP 配置 * 按优先级从低到高加载: - * 1. 用户级: ~/.ai-assist/config.{json,yaml} + * 1. 用户级: ~/.ai-terminal-assistant/mcp.{json,yaml} * 2. 项目级: .ai-assist/config.{json,yaml} */ export function loadMCPConfig(workdir?: string): MCPConfig { const cwd = workdir || process.cwd(); - const homeDir = process.env.HOME || process.env.USERPROFILE || ''; + const configDir = getConfigDir(); // 配置文件搜索路径 const searchPaths = [ - // 用户级配置 - path.join(homeDir, '.ai-assist', 'config.json'), - path.join(homeDir, '.ai-assist', 'config.jsonc'), - path.join(homeDir, '.ai-assist', 'config.yaml'), - path.join(homeDir, '.ai-assist', 'config.yml'), + // 用户级配置(统一到 ~/.ai-terminal-assistant/) + path.join(configDir, 'mcp.json'), + path.join(configDir, 'mcp.jsonc'), + path.join(configDir, 'mcp.yaml'), + path.join(configDir, 'mcp.yml'), // 项目级配置 path.join(cwd, '.ai-assist', 'config.json'), path.join(cwd, '.ai-assist', 'config.jsonc'), diff --git a/packages/core/src/session/storage/base.ts b/packages/core/src/session/storage/base.ts index dcc154f..7b4ee9b 100644 --- a/packages/core/src/session/storage/base.ts +++ b/packages/core/src/session/storage/base.ts @@ -1,8 +1,8 @@ import * as fs from 'fs/promises'; import * as path from 'path'; -import * as os from 'os'; import { Lock } from '../../utils/lock.js'; import { z } from 'zod'; +import { getDataDir } from '../../constants/paths.js'; /** * 存储错误类型 @@ -19,14 +19,10 @@ export class StorageNotFoundError extends Error { /** * 获取默认存储目录 - * 遵循 XDG 规范:~/.local/share/ai-assist/ + * 统一存储在 ~/.ai-terminal-assistant/data/ */ export function getDefaultStorageDir(): string { - const xdgDataHome = process.env.XDG_DATA_HOME; - if (xdgDataHome) { - return path.join(xdgDataHome, 'ai-assist'); - } - return path.join(os.homedir(), '.local', 'share', 'ai-assist'); + return getDataDir(); } /**