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 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
- require.resolve("@toon-format/toon")
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
- // Create directories
23
- if (!existsSync(toolsDir)) mkdirSync(toolsDir, { recursive: true })
24
- if (!existsSync(memoryDir)) mkdirSync(memoryDir, { recursive: true })
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
- // Copy memory.ts
27
- cpSync(join(sourceDir, "memory.ts"), join(toolsDir, "memory.ts"))
28
- console.log("Copied memory.ts to .opencode/tools/")
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
- // Create empty memory file if it doesn't exist
31
- if (!existsSync(memoryFile)) {
32
- writeFileSync(memoryFile, "version: 1\nentries[0|]{id|category|key|content|file|tags|date}:\n")
33
- console.log("Created .opencode/memory/data.toon")
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
- console.log("toon-memory installed! Restart opencode to use memory tools.")
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))