250705-force-option-simplified-fix.md•3.44 kB
# Force选项修复方案 - 简化版
## 问题分析
**原始问题:**
- `--force` 选项无法正常工作,仍然触发缓存行为
- 原因:`reconcileIndex()` 在 `initialize()` 内部执行,但 `clearIndexData()` 在 `initialize()` 之后执行
- 时序错误:reconciliation → force清理,应该是:force清理 → reconciliation
**执行流程问题:**
```
当前流程(错误):
initialize() → reconcileIndex() → clearIndexData()
↑ ↑
看到缓存状态 清理太晚了
```
## 解决方案
**核心思路:** 将force标志传递到 `initialize()` 内部,在reconciliation之前处理force清理。
### 1. 修改 `CodeIndexManager.initialize()`
```typescript
public async initialize(options?: { force?: boolean }): Promise<{ requiresRestart: boolean }> {
// 1. ConfigManager 和 CacheManager 初始化...
// (保持现有逻辑)
// 2. 检查特性是否启用...
// (保持现有逻辑)
// 3. CacheManager 初始化...
// (保持现有逻辑)
// 4. 服务创建...
const needsServiceRecreation = !this._serviceFactory || requiresRestart
if (needsServiceRecreation) {
// 停止监控器...
// 创建服务...
// 创建orchestrator...
// **关键修改:force清理在reconciliation之前**
if (options?.force) {
this.dependencies.logger?.info("Force mode enabled, clearing index data before reconciliation...")
// 清理向量存储
if (this.isFeatureConfigured) {
await vectorStore.deleteCollection()
await new Promise(resolve => setTimeout(resolve, 500))
await vectorStore.initialize()
}
// 清理缓存
await this._cacheManager.clearCacheFile()
this.dependencies.logger?.info("Force clear completed, proceeding with reconciliation...")
}
// reconciliation(此时已经是干净状态)
await this.reconcileIndex(vectorStore, scanner)
}
// 5. 处理索引启动/重启...
// (保持现有逻辑)
}
```
### 2. 修改 `tui-runner.ts`
```typescript
// 简化:只需传递force标志
const initResult = await manager.initialize({ force: options.force });
// 删除原来的force处理逻辑
// if (options.force) {
// await manager.clearIndexData(); // 删除这部分
// }
```
### 3. 同时修改其他TUI模式
```typescript
// startMCPServerMode 和其他模式
const initResult = await manager.initialize({ force: options.force });
```
## 方案优势
1. **最小修改** - 只需修改2个文件,删除重复的force处理代码
2. **逻辑清晰** - force清理和reconciliation在同一个方法内,时序可控
3. **无额外状态** - 不需要在多个类之间传递状态
4. **一致性** - 所有初始化路径都通过同一个接口
## 修复后的执行流程
```
正确流程:
initialize({ force: true })
├── 基础服务初始化
├── 服务重新创建时:
│ ├── force清理(如果指定)
│ └── reconciliation(看到干净状态)
└── 启动索引
```
## 关键改进
- **时序修复**: force清理现在在reconciliation之前执行
- **状态一致性**: reconciliation永远看不到"脏"的缓存状态
- **代码简化**: 删除了重复的force处理逻辑
- **接口统一**: 所有初始化都通过同一个带选项的接口
这样 `--force` 选项就能正确工作,跳过缓存并重新索引所有文件。