mirror of
https://github.com/NanmiCoder/cc-haha
synced 2026-07-19 13:33:35 +08:00
Merge worktree fixes for agent cache invalidation
This commit is contained in:
commit
b88daccda9
@ -4,6 +4,7 @@ import type { SettingSource } from 'src/utils/settings/constants.js'
|
|||||||
import { getManagedFilePath } from 'src/utils/settings/managedPath.js'
|
import { getManagedFilePath } from 'src/utils/settings/managedPath.js'
|
||||||
import type { AgentMemoryScope } from '../../tools/AgentTool/agentMemory.js'
|
import type { AgentMemoryScope } from '../../tools/AgentTool/agentMemory.js'
|
||||||
import {
|
import {
|
||||||
|
clearAgentDefinitionsCache,
|
||||||
type AgentDefinition,
|
type AgentDefinition,
|
||||||
isBuiltInAgent,
|
isBuiltInAgent,
|
||||||
isPluginAgent,
|
isPluginAgent,
|
||||||
@ -200,6 +201,7 @@ export async function saveAgentToFile(
|
|||||||
}
|
}
|
||||||
throw e
|
throw e
|
||||||
}
|
}
|
||||||
|
clearAgentDefinitionsCache()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -233,6 +235,7 @@ export async function updateAgentFile(
|
|||||||
)
|
)
|
||||||
|
|
||||||
await writeFileAndFlush(filePath, content)
|
await writeFileAndFlush(filePath, content)
|
||||||
|
clearAgentDefinitionsCache()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -255,6 +258,7 @@ export async function deleteAgentFromFile(
|
|||||||
throw e
|
throw e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
clearAgentDefinitionsCache()
|
||||||
}
|
}
|
||||||
|
|
||||||
async function writeFileAndFlush(
|
async function writeFileAndFlush(
|
||||||
|
|||||||
@ -244,6 +244,7 @@ describe('cron scheduler launcher resolution', () => {
|
|||||||
process.env.CLAUDE_APP_ROOT = appRoot
|
process.env.CLAUDE_APP_ROOT = appRoot
|
||||||
process.env.ANTHROPIC_BASE_URL = 'https://stale-parent.example'
|
process.env.ANTHROPIC_BASE_URL = 'https://stale-parent.example'
|
||||||
process.env.ANTHROPIC_MODEL = 'stale-parent-model'
|
process.env.ANTHROPIC_MODEL = 'stale-parent-model'
|
||||||
|
process.env.CLAUDE_CODE_ENTRYPOINT = 'stale-parent-entrypoint'
|
||||||
|
|
||||||
const provider = await new ProviderService().addProvider({
|
const provider = await new ProviderService().addProvider({
|
||||||
presetId: 'custom',
|
presetId: 'custom',
|
||||||
|
|||||||
@ -662,6 +662,7 @@ export class CronScheduler {
|
|||||||
return {
|
return {
|
||||||
...cleanEnv,
|
...cleanEnv,
|
||||||
CLAUDE_CODE_ENABLE_TASKS: '1',
|
CLAUDE_CODE_ENABLE_TASKS: '1',
|
||||||
|
CLAUDE_CODE_ENTRYPOINT: 'sdk-cli',
|
||||||
CALLER_DIR: workDir,
|
CALLER_DIR: workDir,
|
||||||
PWD: workDir,
|
PWD: workDir,
|
||||||
CC_HAHA_SKIP_DOTENV: '1',
|
CC_HAHA_SKIP_DOTENV: '1',
|
||||||
|
|||||||
98
src/tools/AgentTool/loadAgentsDir.cache.test.ts
Normal file
98
src/tools/AgentTool/loadAgentsDir.cache.test.ts
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
import { afterEach, beforeEach, describe, expect, test } from 'bun:test'
|
||||||
|
import * as fs from 'node:fs/promises'
|
||||||
|
import * as os from 'node:os'
|
||||||
|
import * as path from 'node:path'
|
||||||
|
import { getCwdState, setCwdState } from '../../bootstrap/state.js'
|
||||||
|
import { agentsHandler } from '../../cli/handlers/agents.js'
|
||||||
|
import { saveAgentToFile } from '../../components/agents/agentFileUtils.js'
|
||||||
|
import {
|
||||||
|
clearAgentDefinitionsCache,
|
||||||
|
getAgentDefinitionsWithOverrides,
|
||||||
|
} from './loadAgentsDir.js'
|
||||||
|
|
||||||
|
let tmpHome: string
|
||||||
|
let originalHome: string | undefined
|
||||||
|
let originalUserProfile: string | undefined
|
||||||
|
let originalClaudeConfigDir: string | undefined
|
||||||
|
let originalCwdState: string
|
||||||
|
|
||||||
|
describe('agent definition cache invalidation', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
tmpHome = await fs.mkdtemp(path.join(os.tmpdir(), 'agent-def-cache-'))
|
||||||
|
originalHome = process.env.HOME
|
||||||
|
originalUserProfile = process.env.USERPROFILE
|
||||||
|
originalClaudeConfigDir = process.env.CLAUDE_CONFIG_DIR
|
||||||
|
originalCwdState = getCwdState()
|
||||||
|
|
||||||
|
process.env.HOME = tmpHome
|
||||||
|
process.env.USERPROFILE = tmpHome
|
||||||
|
process.env.CLAUDE_CONFIG_DIR = path.join(tmpHome, '.claude')
|
||||||
|
clearAgentDefinitionsCache()
|
||||||
|
})
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
if (originalHome === undefined) {
|
||||||
|
delete process.env.HOME
|
||||||
|
} else {
|
||||||
|
process.env.HOME = originalHome
|
||||||
|
}
|
||||||
|
|
||||||
|
if (originalUserProfile === undefined) {
|
||||||
|
delete process.env.USERPROFILE
|
||||||
|
} else {
|
||||||
|
process.env.USERPROFILE = originalUserProfile
|
||||||
|
}
|
||||||
|
|
||||||
|
if (originalClaudeConfigDir === undefined) {
|
||||||
|
delete process.env.CLAUDE_CONFIG_DIR
|
||||||
|
} else {
|
||||||
|
process.env.CLAUDE_CONFIG_DIR = originalClaudeConfigDir
|
||||||
|
}
|
||||||
|
|
||||||
|
setCwdState(originalCwdState)
|
||||||
|
clearAgentDefinitionsCache()
|
||||||
|
await fs.rm(tmpHome, { recursive: true, force: true })
|
||||||
|
})
|
||||||
|
|
||||||
|
test('shows a newly-created project agent in the /agents output after an initial cached read', async () => {
|
||||||
|
const projectRoot = path.join(tmpHome, 'project')
|
||||||
|
await fs.mkdir(projectRoot, { recursive: true })
|
||||||
|
setCwdState(projectRoot)
|
||||||
|
|
||||||
|
const agentType = 'cache-created-agent'
|
||||||
|
const before = await getAgentDefinitionsWithOverrides(projectRoot)
|
||||||
|
|
||||||
|
expect(before.allAgents.some(agent => agent.agentType === agentType)).toBe(false)
|
||||||
|
|
||||||
|
await saveAgentToFile(
|
||||||
|
'projectSettings',
|
||||||
|
agentType,
|
||||||
|
'Use this agent to verify cache invalidation.',
|
||||||
|
undefined,
|
||||||
|
'You verify cache invalidation.',
|
||||||
|
true,
|
||||||
|
)
|
||||||
|
|
||||||
|
const after = await getAgentDefinitionsWithOverrides(projectRoot)
|
||||||
|
|
||||||
|
expect(after.allAgents).toContainEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
agentType,
|
||||||
|
source: 'projectSettings',
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
const logs: string[] = []
|
||||||
|
const originalLog = console.log
|
||||||
|
console.log = (...args: unknown[]) => {
|
||||||
|
logs.push(args.map(String).join(' '))
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await agentsHandler()
|
||||||
|
} finally {
|
||||||
|
console.log = originalLog
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(logs.join('\n')).toContain(agentType)
|
||||||
|
})
|
||||||
|
})
|
||||||
@ -394,6 +394,7 @@ export const getAgentDefinitionsWithOverrides = memoize(
|
|||||||
|
|
||||||
export function clearAgentDefinitionsCache(): void {
|
export function clearAgentDefinitionsCache(): void {
|
||||||
getAgentDefinitionsWithOverrides.cache.clear?.()
|
getAgentDefinitionsWithOverrides.cache.clear?.()
|
||||||
|
loadMarkdownFilesForSubdir.cache.clear?.()
|
||||||
clearPluginAgentCache()
|
clearPluginAgentCache()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user