mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-17 13:55:50 +00:00
- /local-memory: 本地记忆管理(store/entry CRUD、搜索、归档) - /local-vault: 本地密钥保险库管理(加解密、keychain 集成) - permissionValidation: vault 权限校验增强 Co-Authored-By: glm-5-turbo <zai-org@claude-code-best.win>
107 lines
3.1 KiB
TypeScript
107 lines
3.1 KiB
TypeScript
import { describe, test, expect } from 'bun:test'
|
|
import { parseLocalMemoryArgs } from '../parseArgs.js'
|
|
|
|
describe('parseLocalMemoryArgs', () => {
|
|
test('empty string → list', () => {
|
|
expect(parseLocalMemoryArgs('')).toEqual({ action: 'list' })
|
|
})
|
|
|
|
test('"list" → list', () => {
|
|
expect(parseLocalMemoryArgs('list')).toEqual({ action: 'list' })
|
|
})
|
|
|
|
test('create with store name', () => {
|
|
expect(parseLocalMemoryArgs('create my-store')).toEqual({
|
|
action: 'create',
|
|
store: 'my-store',
|
|
})
|
|
})
|
|
|
|
test('create without store name → invalid', () => {
|
|
expect(parseLocalMemoryArgs('create').action).toBe('invalid')
|
|
})
|
|
|
|
test('store with store, key, value', () => {
|
|
expect(parseLocalMemoryArgs('store my-store my-key my value here')).toEqual(
|
|
{
|
|
action: 'store',
|
|
store: 'my-store',
|
|
key: 'my-key',
|
|
value: 'my value here',
|
|
},
|
|
)
|
|
})
|
|
|
|
test('store without key → invalid', () => {
|
|
expect(parseLocalMemoryArgs('store my-store').action).toBe('invalid')
|
|
})
|
|
|
|
test('store without value → invalid', () => {
|
|
expect(parseLocalMemoryArgs('store my-store my-key').action).toBe('invalid')
|
|
})
|
|
|
|
test('fetch with store and key', () => {
|
|
expect(parseLocalMemoryArgs('fetch notes hello')).toEqual({
|
|
action: 'fetch',
|
|
store: 'notes',
|
|
key: 'hello',
|
|
})
|
|
})
|
|
|
|
test('fetch without key → invalid', () => {
|
|
expect(parseLocalMemoryArgs('fetch notes').action).toBe('invalid')
|
|
})
|
|
|
|
test('entries with store name', () => {
|
|
expect(parseLocalMemoryArgs('entries my-store')).toEqual({
|
|
action: 'entries',
|
|
store: 'my-store',
|
|
})
|
|
})
|
|
|
|
test('entries without store name → invalid', () => {
|
|
expect(parseLocalMemoryArgs('entries').action).toBe('invalid')
|
|
})
|
|
|
|
test('archive with store name', () => {
|
|
expect(parseLocalMemoryArgs('archive old-store')).toEqual({
|
|
action: 'archive',
|
|
store: 'old-store',
|
|
})
|
|
})
|
|
|
|
test('archive without store name → invalid', () => {
|
|
expect(parseLocalMemoryArgs('archive').action).toBe('invalid')
|
|
})
|
|
|
|
test('unknown sub-command → invalid with reason', () => {
|
|
const result = parseLocalMemoryArgs('frobnicate')
|
|
expect(result.action).toBe('invalid')
|
|
if (result.action === 'invalid') {
|
|
expect(result.reason).toContain('frobnicate')
|
|
}
|
|
})
|
|
|
|
test('"list" with trailing args still returns list action', () => {
|
|
// 'list extra' bypasses the short-circuit on line 33 and hits the
|
|
// tokens-based branch on line 41-43.
|
|
expect(parseLocalMemoryArgs('list extra-arg')).toEqual({ action: 'list' })
|
|
})
|
|
|
|
test('store sub-command with no args → invalid (missing store name)', () => {
|
|
const r = parseLocalMemoryArgs('store')
|
|
expect(r.action).toBe('invalid')
|
|
if (r.action === 'invalid') {
|
|
expect(r.reason).toContain('store name')
|
|
}
|
|
})
|
|
|
|
test('fetch sub-command with no args → invalid (missing store name)', () => {
|
|
const r = parseLocalMemoryArgs('fetch')
|
|
expect(r.action).toBe('invalid')
|
|
if (r.action === 'invalid') {
|
|
expect(r.reason).toContain('store name')
|
|
}
|
|
})
|
|
})
|