mirror of
https://github.com/supermemoryai/supermemory.git
synced 2026-10-11 03:37:56 +00:00
Every integration (AI SDK, OpenAI, Mastra, VoltAgent, Claude memory) now calls v5 through `supermemory@5`. The config takes one `namespace` instead of `containerTags` or `projectId`, and `withSupermemory` takes `namespace` and `id` instead of `containerTag` and `customId`. No aliases. With no config the tools still use `sm_project_default`. Conversations are stored as one document per conversation keyed by `id` instead of `/v4/conversations`. `memoryForget` drops `reason`; forgetting by text previews with `forgetMatching` and then forgets exact matches by id. Claude memory marks its files with `metadata.source` instead of a second tag. Search keeps the 2.x defaults so results do not shift. `packages/ai-sdk` is removed: npm already deprecates it in favor of `@supermemory/tools/ai-sdk`, so its CI steps and playground wiring go too. `apps/sdk-playground` moves to the new tools API and v5 routes, including its Python server. Tested against production: add, search, profile, list and delete. 112 unit tests pass; type errors drop from 148 to 141, none new. The `supermemory` dependency pins the rc until 5.0.0 is published.
197 lines
5.1 KiB
TypeScript
197 lines
5.1 KiB
TypeScript
#!/usr/bin/env bun
|
||
/**
|
||
* Manual test script for Claude Memory Tool
|
||
* Run with: bun run src/test-memory-tool.ts
|
||
*/
|
||
|
||
import { createClaudeMemoryTool, type MemoryCommand } from "./claude-memory"
|
||
import "dotenv/config"
|
||
|
||
async function testMemoryTool() {
|
||
console.log("🧪 Testing Claude Memory Tool Operations")
|
||
console.log("=".repeat(50))
|
||
|
||
if (!process.env.SUPERMEMORY_API_KEY) {
|
||
console.error("❌ SUPERMEMORY_API_KEY environment variable is required")
|
||
process.exit(1)
|
||
}
|
||
|
||
const memoryTool = createClaudeMemoryTool(process.env.SUPERMEMORY_API_KEY, {
|
||
namespace: "memory-tool-test",
|
||
baseUrl: process.env.SUPERMEMORY_BASE_URL,
|
||
})
|
||
|
||
const testCases: Array<{
|
||
name: string
|
||
command: MemoryCommand
|
||
expectSuccess: boolean
|
||
}> = [
|
||
{
|
||
name: "Check empty memory directory",
|
||
command: { command: "view", path: "/memories/" },
|
||
expectSuccess: true,
|
||
},
|
||
{
|
||
name: "Create a project notes file",
|
||
command: {
|
||
command: "create",
|
||
path: "/memories/project-notes.md",
|
||
file_text:
|
||
"# Project Notes\\n\\n## Meeting Notes\\n- Discussed requirements\\n- Set timeline\\n- Assigned tasks\\n\\n## Technical Stack\\n- Frontend: React\\n- Backend: Node.js\\n- Database: PostgreSQL",
|
||
},
|
||
expectSuccess: true,
|
||
},
|
||
{
|
||
name: "Create a todo list",
|
||
command: {
|
||
command: "create",
|
||
path: "/memories/todo.txt",
|
||
file_text:
|
||
"TODO List:\\n1. Set up development environment\\n2. Create database schema\\n3. Build authentication system\\n4. Implement user dashboard\\n5. Write documentation",
|
||
},
|
||
expectSuccess: true,
|
||
},
|
||
{
|
||
name: "List directory contents (should show 2 files)",
|
||
command: { command: "view", path: "/memories/" },
|
||
expectSuccess: true,
|
||
},
|
||
{
|
||
name: "Read project notes with line numbers",
|
||
command: { command: "view", path: "/memories/project-notes.md" },
|
||
expectSuccess: true,
|
||
},
|
||
{
|
||
name: "Read specific lines from todo list",
|
||
command: {
|
||
command: "view",
|
||
path: "/memories/todo.txt",
|
||
view_range: [1, 3],
|
||
},
|
||
expectSuccess: true,
|
||
},
|
||
{
|
||
name: "Replace text in project notes",
|
||
command: {
|
||
command: "str_replace",
|
||
path: "/memories/project-notes.md",
|
||
old_str: "Node.js",
|
||
new_str: "Express.js",
|
||
},
|
||
expectSuccess: true,
|
||
},
|
||
{
|
||
name: "Insert new item in todo list at line 3",
|
||
command: {
|
||
command: "insert",
|
||
path: "/memories/todo.txt",
|
||
insert_line: 3,
|
||
insert_text: "2.5. Design database relationships",
|
||
},
|
||
expectSuccess: true,
|
||
},
|
||
{
|
||
name: "Read updated todo list",
|
||
command: { command: "view", path: "/memories/todo.txt" },
|
||
expectSuccess: true,
|
||
},
|
||
{
|
||
name: "Create a personal notes file",
|
||
command: {
|
||
command: "create",
|
||
path: "/memories/personal/preferences.md",
|
||
file_text:
|
||
"# My Preferences\\n\\n- Prefers React over Vue\\n- Uses TypeScript for type safety\\n- Likes clean, readable code\\n- Prefers functional programming style",
|
||
},
|
||
expectSuccess: true,
|
||
},
|
||
{
|
||
name: "List root directory (should show files and personal/ subdirectory)",
|
||
command: { command: "view", path: "/memories/" },
|
||
expectSuccess: true,
|
||
},
|
||
{
|
||
name: "Rename project notes",
|
||
command: {
|
||
command: "rename",
|
||
path: "/memories/project-notes.md",
|
||
new_path: "/memories/project-meeting-notes.md",
|
||
},
|
||
expectSuccess: true,
|
||
},
|
||
{
|
||
name: "List directory after rename",
|
||
command: { command: "view", path: "/memories/" },
|
||
expectSuccess: true,
|
||
},
|
||
{
|
||
name: "Test invalid path (should fail)",
|
||
command: { command: "view", path: "/etc/passwd" },
|
||
expectSuccess: false,
|
||
},
|
||
{
|
||
name: "Test file not found (should fail)",
|
||
command: { command: "view", path: "/memories/nonexistent.txt" },
|
||
expectSuccess: false,
|
||
},
|
||
]
|
||
|
||
let passed = 0
|
||
let failed = 0
|
||
|
||
for (let i = 0; i < testCases.length; i++) {
|
||
const testCase = testCases[i]
|
||
console.log(`\\n🔄 Test ${i + 1}/${testCases.length}: ${testCase.name}`)
|
||
|
||
try {
|
||
const result = await memoryTool.handleCommand(testCase.command)
|
||
|
||
if (result.success === testCase.expectSuccess) {
|
||
console.log("✅ PASS")
|
||
if (result.content && result.content.length < 500) {
|
||
console.log("📄 Result:")
|
||
console.log(result.content)
|
||
} else if (result.content) {
|
||
console.log(
|
||
`📄 Result: ${result.content.substring(0, 100)}... (truncated)`,
|
||
)
|
||
}
|
||
passed++
|
||
} else {
|
||
console.log("❌ FAIL")
|
||
console.log(
|
||
`Expected success: ${testCase.expectSuccess}, got: ${result.success}`,
|
||
)
|
||
if (result.error) {
|
||
console.log(`Error: ${result.error}`)
|
||
}
|
||
failed++
|
||
}
|
||
} catch (error) {
|
||
console.log("💥 ERROR")
|
||
console.log(`Exception: ${error}`)
|
||
failed++
|
||
}
|
||
|
||
// Add a small delay to avoid rate limiting
|
||
await new Promise((resolve) => setTimeout(resolve, 500))
|
||
}
|
||
|
||
console.log("\\n📊 Test Results:")
|
||
console.log(`✅ Passed: ${passed}`)
|
||
console.log(`❌ Failed: ${failed}`)
|
||
console.log(
|
||
`📈 Success Rate: ${((passed / (passed + failed)) * 100).toFixed(1)}%`,
|
||
)
|
||
|
||
if (failed === 0) {
|
||
console.log(
|
||
"\\n🎉 All tests passed! Claude Memory Tool is working perfectly!",
|
||
)
|
||
} else {
|
||
console.log(`\\n⚠️ ${failed} test(s) failed. Check the errors above.`)
|
||
}
|
||
}
|
||
|
||
// Run the tests
|
||
testMemoryTool().catch(console.error)
|