@zhafron/opencode-memory-md 1.0.0

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/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # @zhafron/opencode-memory-md
2
+
3
+ Simple markdown-based memory plugin for OpenCode.
4
+
5
+ ## Installation
6
+
7
+ Add to your OpenCode configuration at `~/.config/opencode/opencode.json`:
8
+
9
+ ```json
10
+ {
11
+ "plugin": ["@zhafron/opencode-memory-md"]
12
+ }
13
+ ```
14
+
15
+ ## Memory Files
16
+
17
+ | File | Purpose |
18
+ |------|---------|
19
+ | `MEMORY.md` | Long-term memory (crucial facts, decisions, preferences) |
20
+ | `IDENTITY.md` | AI identity (name, persona, behavioral rules) |
21
+ | `USER.md` | User profile (name, preferences, context) |
22
+ | `daily/YYYY-MM-DD.md` | Daily logs (day-to-day activities) |
23
+ | `BOOTSTRAP.md` | First run setup instructions (deleted after setup) |
24
+
25
+ ## Storage Location
26
+
27
+ - **macOS/Linux**: `~/.config/opencode/memory/`
28
+ - **Windows**: `%APPDATA%/opencode/memory/`
29
+
30
+ ## Tool: memory
31
+
32
+ **Actions:**
33
+
34
+ | Action | Description | Parameters |
35
+ |--------|-------------|------------|
36
+ | `read` | Read memory file | `target`: memory, identity, user, daily |
37
+ | `write` | Write to memory file | `target`, `content`, `mode`: append/overwrite |
38
+ | `search` | Search memory files | `query`, `max_results` (optional) |
39
+ | `list` | List all files | - |
40
+
41
+ **Examples:**
42
+
43
+ ```bash
44
+ memory --action read --target memory
45
+ memory --action write --target memory --content "Remember to use PostgreSQL for all projects"
46
+ memory --action write --target identity --content "- **Name**: Jarvis" --mode overwrite
47
+ memory --action write --target daily --content "Fixed critical bug in auth module"
48
+ memory --action search --query "PostgreSQL"
49
+ memory --action list
50
+ ```
51
+
52
+ ## First Run Flow
53
+
54
+ 1. Plugin detects no MEMORY.md exists
55
+ 2. Creates BOOTSTRAP.md with setup instructions
56
+ 3. AI reads BOOTSTRAP.md and asks user questions interactively
57
+ 4. AI writes to MEMORY.md, IDENTITY.md, USER.md
58
+ 5. AI deletes BOOTSTRAP.md
59
+ 6. Setup complete
60
+
61
+ ## Context Injection
62
+
63
+ MEMORY.md, IDENTITY.md, and USER.md are automatically injected into the system prompt at session start.
64
+
65
+ Daily logs must be accessed via the `memory` tool.
66
+
67
+ ## License
68
+
69
+ MIT
@@ -0,0 +1,9 @@
1
+ import { MemoryManager } from "./MemoryManager.js";
2
+ export declare class BootstrapManager {
3
+ private memoryManager;
4
+ constructor(memoryManager: MemoryManager);
5
+ initialize(): void;
6
+ private copyTemplates;
7
+ isBootstrapNeeded(): boolean;
8
+ }
9
+ //# sourceMappingURL=BootstrapManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BootstrapManager.d.ts","sourceRoot":"","sources":["../src/BootstrapManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA4EnD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAAgB;gBAEzB,aAAa,EAAE,aAAa;IAIxC,UAAU,IAAI,IAAI;IAOlB,OAAO,CAAC,aAAa;IAmBrB,iBAAiB,IAAI,OAAO;CAG7B"}
@@ -0,0 +1,92 @@
1
+ const BOOTSTRAP_TEMPLATE = `# BOOTSTRAP.md - First Time Setup
2
+
3
+ This is your first run! Let's set up your memory system.
4
+
5
+ ## Instructions
6
+
7
+ Ask the user the following questions and fill in the memory files:
8
+
9
+ ### For IDENTITY.md
10
+ Ask the user:
11
+ 1. What name should the AI call itself?
12
+ 2. What's the AI's personality/vibe? (e.g., professional, casual, critical, helpful)
13
+ 3. What languages should the AI use?
14
+ 4. Any specific behavioral rules?
15
+
16
+ ### For USER.md
17
+ Ask the user:
18
+ 1. What's your name? (how should AI address you)
19
+ 2. What's your role/profession?
20
+ 3. What programming languages/frameworks do you work with?
21
+ 4. Where are you located? (timezone relevant)
22
+ 5. What's your communication style preference?
23
+ 6. Any specific preferences or constraints?
24
+
25
+ ### For MEMORY.md
26
+ Ask the user:
27
+ 1. Any crucial technical knowledge to remember?
28
+ 2. Any system configurations or paths to remember?
29
+ 3. Any preferences about how code should be written?
30
+
31
+ ## After Setup
32
+
33
+ Once you've collected all the information:
34
+ 1. Write to IDENTITY.md, USER.md, and MEMORY.md using the memory tool
35
+ 2. Delete this BOOTSTRAP.md file manually using bash: \`rm <path-to-BOOTSTRAP.md>\`
36
+ 3. Confirm setup is complete to the user
37
+
38
+ Be conversational and natural. Don't overwhelm with all questions at once.
39
+ `;
40
+ const MEMORY_TEMPLATE = `# MEMORY.md - Long-Term Memory
41
+
42
+ This file stores crucial facts, decisions, and preferences that should persist across sessions.
43
+
44
+ ## Technical Knowledge
45
+
46
+ (Add important technical solutions, patterns, or configurations here)
47
+
48
+ ## Preferences
49
+
50
+ (Add coding preferences, tool preferences, etc.)
51
+
52
+ ## Important Facts
53
+
54
+ (Add any facts that should be remembered)
55
+ `;
56
+ const IDENTITY_TEMPLATE = `# IDENTITY.md - Agent Identity
57
+
58
+ - **Name**: (AI's name)
59
+ - **Vibe**: (personality and style)
60
+ - **Languages**: (primary communication languages)
61
+ - **Behavioral Rules**: (specific behavioral constraints)
62
+ `;
63
+ const USER_TEMPLATE = `# USER.md - User Profile
64
+
65
+ - **Name**: (user's name)
66
+ - **Role**: (profession/role)
67
+ - **Technical Stack**: (languages, frameworks, tools)
68
+ - **Location**: (timezone/location)
69
+ - **Communication Style**: (preferred interaction style)
70
+ `;
71
+ export class BootstrapManager {
72
+ memoryManager;
73
+ constructor(memoryManager) {
74
+ this.memoryManager = memoryManager;
75
+ }
76
+ initialize() {
77
+ this.memoryManager.ensureDirectories();
78
+ if (!this.memoryManager.isInitialized()) {
79
+ this.copyTemplates();
80
+ }
81
+ }
82
+ copyTemplates() {
83
+ this.memoryManager.writeFile(this.memoryManager.getBootstrapPath(), BOOTSTRAP_TEMPLATE);
84
+ this.memoryManager.writeFile(this.memoryManager.getMemoryPath(), MEMORY_TEMPLATE);
85
+ this.memoryManager.writeFile(this.memoryManager.getIdentityPath(), IDENTITY_TEMPLATE);
86
+ this.memoryManager.writeFile(this.memoryManager.getUserPath(), USER_TEMPLATE);
87
+ }
88
+ isBootstrapNeeded() {
89
+ return this.memoryManager.needsBootstrap();
90
+ }
91
+ }
92
+ //# sourceMappingURL=BootstrapManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BootstrapManager.js","sourceRoot":"","sources":["../src/BootstrapManager.ts"],"names":[],"mappings":"AAEA,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsC1B,CAAC;AAEF,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;CAevB,CAAC;AAEF,MAAM,iBAAiB,GAAG;;;;;;CAMzB,CAAC;AAEF,MAAM,aAAa,GAAG;;;;;;;CAOrB,CAAC;AAEF,MAAM,OAAO,gBAAgB;IACnB,aAAa,CAAgB;IAErC,YAAY,aAA4B;QACtC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,UAAU;QACR,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,aAAa,CAAC,SAAS,CAC1B,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,EACrC,kBAAkB,CACnB,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,SAAS,CAC1B,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,EAClC,eAAe,CAChB,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,SAAS,CAC1B,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,EACpC,iBAAiB,CAClB,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,SAAS,CAC1B,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,EAChC,aAAa,CACd,CAAC;IACJ,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;IAC7C,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import type { MemoryConfig, SearchResult, ListResult, ContextFile } from "./types.js";
2
+ export declare class MemoryManager {
3
+ private config;
4
+ private dailyDir;
5
+ constructor(config: MemoryConfig);
6
+ ensureDirectories(): void;
7
+ getMemoryPath(): string;
8
+ getIdentityPath(): string;
9
+ getUserPath(): string;
10
+ getBootstrapPath(): string;
11
+ getDailyPath(date: string): string;
12
+ todayStr(): string;
13
+ readFile(filePath: string): string | null;
14
+ writeFile(filePath: string, content: string): void;
15
+ appendFile(filePath: string, content: string): void;
16
+ deleteFile(filePath: string): void;
17
+ fileExists(filePath: string): boolean;
18
+ isInitialized(): boolean;
19
+ needsBootstrap(): boolean;
20
+ getContextFiles(): ContextFile[];
21
+ searchFiles(query: string, maxResults: number): SearchResult[];
22
+ listFiles(): ListResult;
23
+ }
24
+ //# sourceMappingURL=MemoryManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryManager.d.ts","sourceRoot":"","sources":["../src/MemoryManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,WAAW,EACZ,MAAM,YAAY,CAAC;AAGpB,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,YAAY;IAKhC,iBAAiB,IAAI,IAAI;IAKzB,aAAa,IAAI,MAAM;IAIvB,eAAe,IAAI,MAAM;IAIzB,WAAW,IAAI,MAAM;IAIrB,gBAAgB,IAAI,MAAM;IAI1B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIlC,QAAQ,IAAI,MAAM;IAIlB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQzC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlD,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAWnD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMlC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,aAAa,IAAI,OAAO;IAIxB,cAAc,IAAI,OAAO;IAIzB,eAAe,IAAI,WAAW,EAAE;IAiBhC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,EAAE;IAqC9D,SAAS,IAAI,UAAU;CAyBxB"}
@@ -0,0 +1,146 @@
1
+ import * as path from "node:path";
2
+ import * as fs from "node:fs";
3
+ import { ensureDir } from "./config.js";
4
+ export class MemoryManager {
5
+ config;
6
+ dailyDir;
7
+ constructor(config) {
8
+ this.config = config;
9
+ this.dailyDir = path.join(config.memoryDir, "daily");
10
+ }
11
+ ensureDirectories() {
12
+ ensureDir(this.config.memoryDir);
13
+ ensureDir(this.dailyDir);
14
+ }
15
+ getMemoryPath() {
16
+ return path.join(this.config.memoryDir, "MEMORY.md");
17
+ }
18
+ getIdentityPath() {
19
+ return path.join(this.config.memoryDir, "IDENTITY.md");
20
+ }
21
+ getUserPath() {
22
+ return path.join(this.config.memoryDir, "USER.md");
23
+ }
24
+ getBootstrapPath() {
25
+ return path.join(this.config.memoryDir, "BOOTSTRAP.md");
26
+ }
27
+ getDailyPath(date) {
28
+ return path.join(this.dailyDir, `${date}.md`);
29
+ }
30
+ todayStr() {
31
+ return new Date().toISOString().slice(0, 10);
32
+ }
33
+ readFile(filePath) {
34
+ try {
35
+ return fs.readFileSync(filePath, "utf-8");
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ writeFile(filePath, content) {
42
+ fs.writeFileSync(filePath, content, "utf-8");
43
+ }
44
+ appendFile(filePath, content) {
45
+ const existing = this.readFile(filePath);
46
+ const separator = existing?.trim() ? "\n\n" : "";
47
+ const timestamp = new Date()
48
+ .toISOString()
49
+ .replace("T", " ")
50
+ .replace(/\.\d+Z$/, "");
51
+ const stamped = `<!-- ${timestamp} -->\n${content}`;
52
+ fs.writeFileSync(filePath, (existing ?? "") + separator + stamped, "utf-8");
53
+ }
54
+ deleteFile(filePath) {
55
+ try {
56
+ fs.unlinkSync(filePath);
57
+ }
58
+ catch { }
59
+ }
60
+ fileExists(filePath) {
61
+ return fs.existsSync(filePath);
62
+ }
63
+ isInitialized() {
64
+ return this.fileExists(this.getMemoryPath());
65
+ }
66
+ needsBootstrap() {
67
+ return this.fileExists(this.getBootstrapPath());
68
+ }
69
+ getContextFiles() {
70
+ const files = [];
71
+ const memoryContent = this.readFile(this.getMemoryPath());
72
+ if (memoryContent?.trim()) {
73
+ files.push({ name: "MEMORY.md", content: memoryContent.trim() });
74
+ }
75
+ const identityContent = this.readFile(this.getIdentityPath());
76
+ if (identityContent?.trim()) {
77
+ files.push({ name: "IDENTITY.md", content: identityContent.trim() });
78
+ }
79
+ const userContent = this.readFile(this.getUserPath());
80
+ if (userContent?.trim()) {
81
+ files.push({ name: "USER.md", content: userContent.trim() });
82
+ }
83
+ return files;
84
+ }
85
+ searchFiles(query, maxResults) {
86
+ const results = [];
87
+ const needle = query.toLowerCase();
88
+ const searchPaths = [
89
+ { dir: this.config.memoryDir, prefix: "" },
90
+ { dir: this.dailyDir, prefix: "daily" },
91
+ ];
92
+ for (const { dir, prefix } of searchPaths) {
93
+ try {
94
+ const files = fs.readdirSync(dir).filter((f) => f.endsWith(".md"));
95
+ for (const file of files) {
96
+ if (file === "BOOTSTRAP.md")
97
+ continue;
98
+ if (results.length >= maxResults)
99
+ break;
100
+ const filePath = path.join(dir, file);
101
+ const content = this.readFile(filePath);
102
+ if (!content)
103
+ continue;
104
+ const lines = content.split("\n");
105
+ for (let i = 0; i < lines.length && results.length < maxResults; i++) {
106
+ if (lines[i].toLowerCase().includes(needle)) {
107
+ results.push({
108
+ file: prefix ? `${prefix}/${file}` : file,
109
+ line: i + 1,
110
+ text: lines[i].trimEnd(),
111
+ });
112
+ }
113
+ }
114
+ }
115
+ }
116
+ catch { }
117
+ }
118
+ return results;
119
+ }
120
+ listFiles() {
121
+ const root = [];
122
+ const daily = [];
123
+ try {
124
+ const rootFiles = fs
125
+ .readdirSync(this.config.memoryDir)
126
+ .filter((f) => f.endsWith(".md"))
127
+ .sort();
128
+ for (const f of rootFiles) {
129
+ if (f !== "BOOTSTRAP.md")
130
+ root.push(f);
131
+ }
132
+ }
133
+ catch { }
134
+ try {
135
+ const dailyFiles = fs
136
+ .readdirSync(this.dailyDir)
137
+ .filter((f) => f.endsWith(".md"))
138
+ .sort()
139
+ .reverse();
140
+ daily.push(...dailyFiles);
141
+ }
142
+ catch { }
143
+ return { root, daily };
144
+ }
145
+ }
146
+ //# sourceMappingURL=MemoryManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryManager.js","sourceRoot":"","sources":["../src/MemoryManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { MemoryConfig } from "./types.js";
2
+ export declare function getMemoryDir(): string;
3
+ export declare function resolvePath(filePath: string): string;
4
+ export declare function loadConfig(): MemoryConfig;
5
+ export declare function ensureDir(dir: string): void;
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,YAAY,IAAI,MAAM,CAcrC;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED,wBAAgB,UAAU,IAAI,YAAY,CAGzC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI3C"}
package/dist/config.js ADDED
@@ -0,0 +1,36 @@
1
+ import * as os from "node:os";
2
+ import * as path from "node:path";
3
+ import * as fs from "node:fs";
4
+ export function getMemoryDir() {
5
+ const platform = os.platform();
6
+ const home = os.homedir();
7
+ switch (platform) {
8
+ case "win32":
9
+ return path.join(home, "AppData", "Roaming", "opencode", "memory");
10
+ case "darwin":
11
+ return path.join(home, ".config", "opencode", "memory");
12
+ case "linux":
13
+ return path.join(home, ".config", "opencode", "memory");
14
+ default:
15
+ return path.join(home, ".config", "opencode", "memory");
16
+ }
17
+ }
18
+ export function resolvePath(filePath) {
19
+ if (filePath.startsWith("~")) {
20
+ return path.join(os.homedir(), filePath.slice(1));
21
+ }
22
+ if (path.isAbsolute(filePath)) {
23
+ return filePath;
24
+ }
25
+ return path.resolve(filePath);
26
+ }
27
+ export function loadConfig() {
28
+ const memoryDir = getMemoryDir();
29
+ return { memoryDir };
30
+ }
31
+ export function ensureDir(dir) {
32
+ if (!fs.existsSync(dir)) {
33
+ fs.mkdirSync(dir, { recursive: true });
34
+ }
35
+ }
36
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B,MAAM,UAAU,YAAY;IAC1B,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAE1B,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACrE,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC1D,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC1D;YACE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Plugin } from "@opencode-ai/plugin";
2
+ export declare const MemoryPlugin: Plugin;
3
+ export default MemoryPlugin;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AAM/D,eAAO,MAAM,YAAY,EAAE,MAwH1B,CAAC;AAsJF,eAAe,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,231 @@
1
+ import { tool } from "@opencode-ai/plugin";
2
+ import { loadConfig } from "./config.js";
3
+ import { MemoryManager } from "./MemoryManager.js";
4
+ import { BootstrapManager } from "./BootstrapManager.js";
5
+ export const MemoryPlugin = async (ctx) => {
6
+ const config = loadConfig();
7
+ const memoryManager = new MemoryManager(config);
8
+ const bootstrapManager = new BootstrapManager(memoryManager);
9
+ bootstrapManager.initialize();
10
+ const buildContext = () => {
11
+ const sections = [];
12
+ if (bootstrapManager.isBootstrapNeeded()) {
13
+ const bootstrapContent = memoryManager.readFile(memoryManager.getBootstrapPath());
14
+ if (bootstrapContent?.trim()) {
15
+ sections.push(`## BOOTSTRAP.md (First Run Setup)\n\n${bootstrapContent.trim()}`);
16
+ }
17
+ }
18
+ else {
19
+ const contextFiles = memoryManager.getContextFiles();
20
+ for (const file of contextFiles) {
21
+ sections.push(`## ${file.name}\n\n${file.content}`);
22
+ }
23
+ }
24
+ if (sections.length === 0)
25
+ return "";
26
+ return `# Memory Context\n\n${sections.join("\n\n---\n\n")}`;
27
+ };
28
+ const getMemoryInstructions = () => {
29
+ if (bootstrapManager.isBootstrapNeeded()) {
30
+ return [
31
+ "\n\n## Memory Setup",
32
+ "This is your first run. Read BOOTSTRAP.md above and follow the setup instructions.",
33
+ "Ask the user questions interactively, then write to MEMORY.md, IDENTITY.md, and USER.md.",
34
+ "After setup is complete, delete BOOTSTRAP.md using the memory tool or filesystem.",
35
+ ].join("\n");
36
+ }
37
+ return [
38
+ "\n\n## Memory",
39
+ "Memory files have been loaded above. Use the memory tool to manage them:",
40
+ "- `memory --action write --target memory|daily` - write to MEMORY.md or daily log",
41
+ "- `memory --action read --target memory|identity|user|daily|list` - read memory files",
42
+ "- `memory --action search --query <text>` - search across all memory files",
43
+ "- `memory --action list` - list all memory files",
44
+ ].join("\n");
45
+ };
46
+ return {
47
+ "experimental.chat.system.transform": async (_input, output) => {
48
+ const memoryContext = buildContext();
49
+ if (!memoryContext)
50
+ return;
51
+ const instructions = getMemoryInstructions();
52
+ output.system.push(memoryContext + instructions);
53
+ },
54
+ tool: {
55
+ memory: tool({
56
+ description: [
57
+ "Manage memory files for persistent context across sessions.",
58
+ "",
59
+ "**Actions:**",
60
+ "- `read`: Read a memory file (memory, identity, user, daily, or list all)",
61
+ "- `write`: Write to a memory file (memory, identity, user, daily) with append or overwrite mode",
62
+ "- `search`: Search across all memory files",
63
+ "- `list`: List all memory files",
64
+ "",
65
+ "**Targets:**",
66
+ "- `memory`: MEMORY.md - Long-term memory (crucial facts, decisions, preferences)",
67
+ "- `identity`: IDENTITY.md - AI identity (name, persona, behavioral rules)",
68
+ "- `user`: USER.md - User profile (name, preferences, context)",
69
+ "- `daily`: daily/YYYY-MM-DD.md - Daily logs (day-to-day activities)",
70
+ ].join("\n"),
71
+ args: {
72
+ action: tool.schema
73
+ .enum(["read", "write", "search", "list"])
74
+ .describe("Action to perform"),
75
+ target: tool.schema
76
+ .enum(["memory", "identity", "user", "daily"])
77
+ .optional()
78
+ .describe("Target file: memory, identity, user, or daily"),
79
+ content: tool.schema
80
+ .string()
81
+ .optional()
82
+ .describe("Content to write (for write action)"),
83
+ mode: tool.schema
84
+ .enum(["append", "overwrite"])
85
+ .optional()
86
+ .describe("Write mode (default: append)"),
87
+ date: tool.schema
88
+ .string()
89
+ .optional()
90
+ .describe("Date for daily log (YYYY-MM-DD), defaults to today"),
91
+ query: tool.schema
92
+ .string()
93
+ .optional()
94
+ .describe("Search query (for search action)"),
95
+ max_results: tool.schema
96
+ .number()
97
+ .optional()
98
+ .describe("Max search results (default: 20)"),
99
+ },
100
+ async execute(args) {
101
+ memoryManager.ensureDirectories();
102
+ switch (args.action) {
103
+ case "read":
104
+ return handleRead(args, memoryManager);
105
+ case "write":
106
+ return handleWrite(args, memoryManager);
107
+ case "search":
108
+ return handleSearch(args, memoryManager);
109
+ case "list":
110
+ return handleList(memoryManager);
111
+ default:
112
+ return `Unknown action: ${args.action}`;
113
+ }
114
+ },
115
+ }),
116
+ },
117
+ };
118
+ };
119
+ function handleRead(params, memoryManager) {
120
+ const { target, date } = params;
121
+ if (!target) {
122
+ return handleList(memoryManager);
123
+ }
124
+ let filePath;
125
+ let displayName;
126
+ switch (target) {
127
+ case "memory":
128
+ filePath = memoryManager.getMemoryPath();
129
+ displayName = "MEMORY.md";
130
+ break;
131
+ case "identity":
132
+ filePath = memoryManager.getIdentityPath();
133
+ displayName = "IDENTITY.md";
134
+ break;
135
+ case "user":
136
+ filePath = memoryManager.getUserPath();
137
+ displayName = "USER.md";
138
+ break;
139
+ case "daily": {
140
+ const targetDate = date ?? memoryManager.todayStr();
141
+ filePath = memoryManager.getDailyPath(targetDate);
142
+ displayName = `daily/${targetDate}.md`;
143
+ break;
144
+ }
145
+ default:
146
+ return `Unknown target: ${target}`;
147
+ }
148
+ const content = memoryManager.readFile(filePath);
149
+ if (!content) {
150
+ return `${displayName} not found or empty.`;
151
+ }
152
+ return content;
153
+ }
154
+ function handleWrite(params, memoryManager) {
155
+ const { target, content, mode, date } = params;
156
+ if (!content) {
157
+ return "Error: content is required for write action.";
158
+ }
159
+ if (!target) {
160
+ return "Error: target is required for write action.";
161
+ }
162
+ let filePath;
163
+ let displayName;
164
+ switch (target) {
165
+ case "memory":
166
+ filePath = memoryManager.getMemoryPath();
167
+ displayName = "MEMORY.md";
168
+ break;
169
+ case "identity":
170
+ filePath = memoryManager.getIdentityPath();
171
+ displayName = "IDENTITY.md";
172
+ break;
173
+ case "user":
174
+ filePath = memoryManager.getUserPath();
175
+ displayName = "USER.md";
176
+ break;
177
+ case "daily": {
178
+ const targetDate = date ?? memoryManager.todayStr();
179
+ filePath = memoryManager.getDailyPath(targetDate);
180
+ displayName = `daily/${targetDate}.md`;
181
+ break;
182
+ }
183
+ default:
184
+ return `Unknown target: ${target}. Use 'memory', 'identity', 'user', or 'daily'.`;
185
+ }
186
+ if (mode === "overwrite") {
187
+ const timestamp = new Date()
188
+ .toISOString()
189
+ .replace("T", " ")
190
+ .replace(/\.\d+Z$/, "");
191
+ memoryManager.writeFile(filePath, `<!-- last updated: ${timestamp} -->\n${content}`);
192
+ }
193
+ else {
194
+ memoryManager.appendFile(filePath, content);
195
+ }
196
+ return `${mode === "overwrite" ? "Wrote to" : "Appended to"} ${displayName}`;
197
+ }
198
+ function handleSearch(params, memoryManager) {
199
+ const { query, max_results } = params;
200
+ if (!query) {
201
+ return "Error: query is required for search action.";
202
+ }
203
+ const results = memoryManager.searchFiles(query, max_results ?? 20);
204
+ if (results.length === 0) {
205
+ return `No results for "${query}".`;
206
+ }
207
+ const output = results
208
+ .map((r) => `${r.file}:${r.line}: ${r.text}`)
209
+ .join("\n");
210
+ return `Found ${results.length} results:\n\n${output}`;
211
+ }
212
+ function handleList(memoryManager) {
213
+ const files = memoryManager.listFiles();
214
+ const parts = [];
215
+ if (files.root.length > 0) {
216
+ parts.push(`Root files:\n${files.root.map((f) => `- ${f}`).join("\n")}`);
217
+ }
218
+ if (files.daily.length > 0) {
219
+ const displayDaily = files.daily.slice(0, 10);
220
+ const more = files.daily.length > 10
221
+ ? `\n ... and ${files.daily.length - 10} more`
222
+ : "";
223
+ parts.push(`Daily logs (${files.daily.length}):\n${displayDaily.map((f) => `- daily/${f}`).join("\n")}${more}`);
224
+ }
225
+ if (parts.length === 0) {
226
+ return "No memory files found.";
227
+ }
228
+ return parts.join("\n\n");
229
+ }
230
+ export default MemoryPlugin;
231
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,CAAC,MAAM,YAAY,GAAW,KAAK,EAAE,GAAgB,EAAE,EAAE;IAC7D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAE7D,gBAAgB,CAAC,UAAU,EAAE,CAAC;IAE9B,MAAM,YAAY,GAAG,GAAW,EAAE;QAChC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,gBAAgB,CAAC,iBAAiB,EAAE,EAAE,CAAC;YACzC,MAAM,gBAAgB,GAAG,aAAa,CAAC,QAAQ,CAC7C,aAAa,CAAC,gBAAgB,EAAE,CACjC,CAAC;YACF,IAAI,gBAAgB,EAAE,IAAI,EAAE,EAAE,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CACX,wCAAwC,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAClE,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;gBAChC,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACrC,OAAO,uBAAuB,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;IAC/D,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,GAAW,EAAE;QACzC,IAAI,gBAAgB,CAAC,iBAAiB,EAAE,EAAE,CAAC;YACzC,OAAO;gBACL,qBAAqB;gBACrB,oFAAoF;gBACpF,0FAA0F;gBAC1F,mFAAmF;aACpF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;QACD,OAAO;YACL,eAAe;YACf,0EAA0E;YAC1E,mFAAmF;YACnF,uFAAuF;YACvF,4EAA4E;YAC5E,kDAAkD;SACnD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC;IAEF,OAAO;QACL,oCAAoC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC7D,MAAM,aAAa,GAAG,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa;gBAAE,OAAO;YAC3B,MAAM,YAAY,GAAG,qBAAqB,EAAE,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,EAAE;YACJ,MAAM,EAAE,IAAI,CAAC;gBACX,WAAW,EAAE;oBACX,6DAA6D;oBAC7D,EAAE;oBACF,cAAc;oBACd,2EAA2E;oBAC3E,iGAAiG;oBACjG,4CAA4C;oBAC5C,iCAAiC;oBACjC,EAAE;oBACF,cAAc;oBACd,kFAAkF;oBAClF,2EAA2E;oBAC3E,+DAA+D;oBAC/D,qEAAqE;iBACtE,CAAC,IAAI,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE;oBACJ,MAAM,EAAE,IAAI,CAAC,MAAM;yBAChB,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;yBACzC,QAAQ,CAAC,mBAAmB,CAAC;oBAChC,MAAM,EAAE,IAAI,CAAC,MAAM;yBAChB,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;yBAC7C,QAAQ,EAAE;yBACV,QAAQ,CAAC,+CAA+C,CAAC;oBAC5D,OAAO,EAAE,IAAI,CAAC,MAAM;yBACjB,MAAM,EAAE;yBACR,QAAQ,EAAE;yBACV,QAAQ,CAAC,qCAAqC,CAAC;oBAClD,IAAI,EAAE,IAAI,CAAC,MAAM;yBACd,IAAI,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;yBAC7B,QAAQ,EAAE;yBACV,QAAQ,CAAC,8BAA8B,CAAC;oBAC3C,IAAI,EAAE,IAAI,CAAC,MAAM;yBACd,MAAM,EAAE;yBACR,QAAQ,EAAE;yBACV,QAAQ,CAAC,oDAAoD,CAAC;oBACjE,KAAK,EAAE,IAAI,CAAC,MAAM;yBACf,MAAM,EAAE;yBACR,QAAQ,EAAE;yBACV,QAAQ,CAAC,kCAAkC,CAAC;oBAC/C,WAAW,EAAE,IAAI,CAAC,MAAM;yBACrB,MAAM,EAAE;yBACR,QAAQ,EAAE;yBACV,QAAQ,CAAC,kCAAkC,CAAC;iBAChD;gBACD,KAAK,CAAC,OAAO,CAAC,IAAI;oBAChB,aAAa,CAAC,iBAAiB,EAAE,CAAC;oBAElC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;wBACpB,KAAK,MAAM;4BACT,OAAO,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;wBACzC,KAAK,OAAO;4BACV,OAAO,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;wBAC1C,KAAK,QAAQ;4BACX,OAAO,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;wBAC3C,KAAK,MAAM;4BACT,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC;wBACnC;4BACE,OAAO,mBAAmB,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC5C,CAAC;gBACH,CAAC;aACF,CAAC;SACH;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,SAAS,UAAU,CACjB,MAA0C,EAC1C,aAA4B;IAE5B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAEhC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,QAAgB,CAAC;IACrB,IAAI,WAAmB,CAAC;IAExB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,QAAQ,GAAG,aAAa,CAAC,aAAa,EAAE,CAAC;YACzC,WAAW,GAAG,WAAW,CAAC;YAC1B,MAAM;QACR,KAAK,UAAU;YACb,QAAQ,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;YAC3C,WAAW,GAAG,aAAa,CAAC;YAC5B,MAAM;QACR,KAAK,MAAM;YACT,QAAQ,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;YACvC,WAAW,GAAG,SAAS,CAAC;YACxB,MAAM;QACR,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,UAAU,GAAG,IAAI,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;YACpD,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAClD,WAAW,GAAG,SAAS,UAAU,KAAK,CAAC;YACvC,MAAM;QACR,CAAC;QACD;YACE,OAAO,mBAAmB,MAAM,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,WAAW,sBAAsB,CAAC;IAC9C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAClB,MAA2E,EAC3E,aAA4B;IAE5B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAE/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,8CAA8C,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,6CAA6C,CAAC;IACvD,CAAC;IAED,IAAI,QAAgB,CAAC;IACrB,IAAI,WAAmB,CAAC;IAExB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,QAAQ,GAAG,aAAa,CAAC,aAAa,EAAE,CAAC;YACzC,WAAW,GAAG,WAAW,CAAC;YAC1B,MAAM;QACR,KAAK,UAAU;YACb,QAAQ,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;YAC3C,WAAW,GAAG,aAAa,CAAC;YAC5B,MAAM;QACR,KAAK,MAAM;YACT,QAAQ,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;YACvC,WAAW,GAAG,SAAS,CAAC;YACxB,MAAM;QACR,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,UAAU,GAAG,IAAI,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;YACpD,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAClD,WAAW,GAAG,SAAS,UAAU,KAAK,CAAC;YACvC,MAAM;QACR,CAAC;QACD;YACE,OAAO,mBAAmB,MAAM,iDAAiD,CAAC;IACtF,CAAC;IAED,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE;aACzB,WAAW,EAAE;aACb,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;aACjB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC1B,aAAa,CAAC,SAAS,CACrB,QAAQ,EACR,sBAAsB,SAAS,SAAS,OAAO,EAAE,CAClD,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,IAAI,WAAW,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,YAAY,CACnB,MAAgD,EAChD,aAA4B;IAE5B,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAEtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,6CAA6C,CAAC;IACvD,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;IAEpE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,mBAAmB,KAAK,IAAI,CAAC;IACtC,CAAC;IAED,MAAM,MAAM,GAAG,OAAO;SACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;SAC5C,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,SAAS,OAAO,CAAC,MAAM,gBAAgB,MAAM,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,UAAU,CAAC,aAA4B;IAC9C,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,GACR,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;YACrB,CAAC,CAAC,eAAe,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,OAAO;YAC/C,CAAC,CAAC,EAAE,CAAC;QACT,KAAK,CAAC,IAAI,CACR,eAAe,KAAK,CAAC,KAAK,CAAC,MAAM,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CACpG,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface MemoryConfig {
2
+ memoryDir: string;
3
+ }
4
+ export declare const DEFAULT_CONFIG: MemoryConfig;
5
+ export type MemoryTarget = "memory" | "identity" | "user" | "daily";
6
+ export type WriteMode = "append" | "overwrite";
7
+ export type MemoryAction = "read" | "write" | "search" | "list";
8
+ export interface SearchResult {
9
+ file: string;
10
+ line: number;
11
+ text: string;
12
+ }
13
+ export interface ListResult {
14
+ root: string[];
15
+ daily: string[];
16
+ }
17
+ export interface ContextFile {
18
+ name: string;
19
+ content: string;
20
+ }
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,cAAc,EAAE,YAE5B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AACpE,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;AAC/C,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ export const DEFAULT_CONFIG = {
2
+ memoryDir: "",
3
+ };
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,SAAS,EAAE,EAAE;CACd,CAAC"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@zhafron/opencode-memory-md",
3
+ "version": "1.0.0",
4
+ "description": "Simple markdown-based memory plugin for OpenCode",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "scripts": {
9
+ "build": "tsc",
10
+ "dev": "tsc --watch",
11
+ "typecheck": "tsc --noEmit",
12
+ "format": "prettier --write \"src/**/*.ts\"",
13
+ "format:check": "prettier --check \"src/**/*.ts\"",
14
+ "prepare": "husky"
15
+ },
16
+ "keywords": [
17
+ "opencode",
18
+ "plugin",
19
+ "memory",
20
+ "markdown"
21
+ ],
22
+ "author": "zhafron",
23
+ "license": "MIT",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "https://github.com/zhafron/opencode-memory-md.git"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "dependencies": {
32
+ "@opencode-ai/plugin": "^1.2.6"
33
+ },
34
+ "devDependencies": {
35
+ "@types/bun": "^1.3.8",
36
+ "@types/node": "^22.19.11",
37
+ "husky": "^9.1.7",
38
+ "prettier": "^3.8.1",
39
+ "typescript": "^5.9.3"
40
+ },
41
+ "opencode": {
42
+ "type": "plugin"
43
+ },
44
+ "files": [
45
+ "dist"
46
+ ]
47
+ }