toon-memory 1.0.5 ā 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/setup.js +101 -16
- package/bin/toon-memory.js +15 -0
- package/mcp/server.js +27862 -0
- package/package.json +1 -1
- package/skills/toon-memory.md +113 -0
- package/src/mcp/server.ts +251 -0
- package/src/memory.ts +237 -0
package/bin/setup.js
CHANGED
|
@@ -1,36 +1,121 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { existsSync, mkdirSync, writeFileSync, cpSync } from "fs"
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, cpSync } from "fs"
|
|
3
3
|
import { dirname, join } from "path"
|
|
4
4
|
import { fileURLToPath } from "url"
|
|
5
5
|
import { execSync } from "child_process"
|
|
6
|
+
import { createInterface } from "readline"
|
|
7
|
+
import { createRequire } from "module"
|
|
6
8
|
|
|
7
9
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
8
10
|
const projectRoot = process.cwd()
|
|
9
|
-
const toolsDir = join(projectRoot, ".opencode", "tools")
|
|
10
|
-
const memoryDir = join(projectRoot, ".opencode", "memory")
|
|
11
|
-
const memoryFile = join(memoryDir, "data.toon")
|
|
12
11
|
const sourceDir = join(__dirname, "..", "src")
|
|
13
12
|
|
|
14
13
|
// Auto-install @toon-format/toon if not present
|
|
15
14
|
try {
|
|
16
|
-
|
|
15
|
+
createRequire(import.meta.url).resolve("@toon-format/toon")
|
|
17
16
|
} catch {
|
|
18
17
|
console.log("Installing @toon-format/toon...")
|
|
19
18
|
execSync("npm install @toon-format/toon", { cwd: projectRoot, stdio: "inherit" })
|
|
20
19
|
}
|
|
21
20
|
|
|
22
|
-
//
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
// Detect agents
|
|
22
|
+
function detectAgents() {
|
|
23
|
+
const agents = []
|
|
24
|
+
|
|
25
|
+
// OpenCode
|
|
26
|
+
const opencodeGlobal = join(process.env.HOME || "~", ".config", "opencode", "opencode.json")
|
|
27
|
+
const opencodeLocal = join(projectRoot, ".opencode", "opencode.json")
|
|
28
|
+
if (existsSync(opencodeGlobal) || existsSync(opencodeLocal)) {
|
|
29
|
+
agents.push({ name: "opencode", global: opencodeGlobal, local: opencodeLocal })
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Claude Code
|
|
33
|
+
const claudeGlobal = join(process.env.HOME || "~", ".claude", "settings.json")
|
|
34
|
+
const claudeLocal = join(projectRoot, ".claude", "settings.json")
|
|
35
|
+
if (existsSync(claudeGlobal) || existsSync(claudeLocal)) {
|
|
36
|
+
agents.push({ name: "claude", global: claudeGlobal, local: claudeLocal })
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Cursor
|
|
40
|
+
const cursorLocal = join(projectRoot, ".cursor", "mcp.json")
|
|
41
|
+
if (existsSync(cursorLocal)) {
|
|
42
|
+
agents.push({ name: "cursor", local: cursorLocal })
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return agents
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Install custom tools for OpenCode
|
|
49
|
+
function installOpenCodeTools() {
|
|
50
|
+
const toolsDir = join(projectRoot, ".opencode", "tools")
|
|
51
|
+
const memoryDir = join(projectRoot, ".opencode", "memory")
|
|
52
|
+
const memoryFile = join(memoryDir, "data.toon")
|
|
53
|
+
|
|
54
|
+
if (!existsSync(toolsDir)) mkdirSync(toolsDir, { recursive: true })
|
|
55
|
+
if (!existsSync(memoryDir)) mkdirSync(memoryDir, { recursive: true })
|
|
25
56
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
57
|
+
cpSync(join(sourceDir, "memory.ts"), join(toolsDir, "memory.ts"))
|
|
58
|
+
console.log(" Copied memory.ts to .opencode/tools/")
|
|
59
|
+
|
|
60
|
+
if (!existsSync(memoryFile)) {
|
|
61
|
+
writeFileSync(memoryFile, "version: 1\nentries[0|]{id|category|key|content|file|tags|date}:\n")
|
|
62
|
+
console.log(" Created .opencode/memory/data.toon")
|
|
63
|
+
}
|
|
64
|
+
}
|
|
29
65
|
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
66
|
+
// Install MCP server config for OpenCode
|
|
67
|
+
function installOpenCodeMCP(scope) {
|
|
68
|
+
const configPath = scope === "global"
|
|
69
|
+
? join(process.env.HOME || "~", ".config", "opencode", "opencode.json")
|
|
70
|
+
: join(projectRoot, ".opencode", "opencode.json")
|
|
71
|
+
|
|
72
|
+
const configDir = dirname(configPath)
|
|
73
|
+
if (!existsSync(configDir)) mkdirSync(configDir, { recursive: true })
|
|
74
|
+
|
|
75
|
+
let config = {}
|
|
76
|
+
if (existsSync(configPath)) {
|
|
77
|
+
config = JSON.parse(readFileSync(configPath, "utf-8"))
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (!config.mcp) config.mcp = {}
|
|
81
|
+
config.mcp["toon-memory"] = {
|
|
82
|
+
type: "local",
|
|
83
|
+
command: ["npx", "-y", "toon-memory", "mcp"],
|
|
84
|
+
enabled: true
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2))
|
|
88
|
+
console.log(` MCP server added to ${configPath}`)
|
|
34
89
|
}
|
|
35
90
|
|
|
36
|
-
|
|
91
|
+
// Main
|
|
92
|
+
const agents = detectAgents()
|
|
93
|
+
console.log("\nš§ toon-memory installer\n")
|
|
94
|
+
|
|
95
|
+
if (agents.length === 0) {
|
|
96
|
+
console.log("No supported agents detected. Installing custom tools...")
|
|
97
|
+
installOpenCodeTools()
|
|
98
|
+
console.log("\nDone! Restart your agent to use memory tools.")
|
|
99
|
+
process.exit(0)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
console.log("Detected agents:")
|
|
103
|
+
agents.forEach((a, i) => console.log(` ${i + 1}. ${a.name}`))
|
|
104
|
+
console.log("")
|
|
105
|
+
|
|
106
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout })
|
|
107
|
+
rl.question("Install (1) Local or (2) Global? [1/2]: ", (answer) => {
|
|
108
|
+
const scope = answer === "2" ? "global" : "local"
|
|
109
|
+
console.log(`\nInstalling ${scope}ly...\n`)
|
|
110
|
+
|
|
111
|
+
for (const agent of agents) {
|
|
112
|
+
if (agent.name === "opencode") {
|
|
113
|
+
console.log("OpenCode:")
|
|
114
|
+
installOpenCodeTools()
|
|
115
|
+
installOpenCodeMCP(scope)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
console.log("\nDone! Restart your agent to use memory tools.")
|
|
120
|
+
rl.close()
|
|
121
|
+
})
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { dirname, join } from "path"
|
|
3
|
+
import { fileURLToPath } from "url"
|
|
4
|
+
import { spawn } from "child_process"
|
|
5
|
+
|
|
6
|
+
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
7
|
+
const args = process.argv.slice(2)
|
|
8
|
+
|
|
9
|
+
const target = args[0] === "mcp"
|
|
10
|
+
? join(__dirname, "..", "mcp", "server.js")
|
|
11
|
+
: join(__dirname, "setup.js")
|
|
12
|
+
|
|
13
|
+
const extraArgs = args[0] === "mcp" ? [] : args
|
|
14
|
+
const child = spawn("node", [target, ...extraArgs], { stdio: "inherit" })
|
|
15
|
+
child.on("exit", (code) => process.exit(code ?? 0))
|