mindkeeper-openclaw 0.2.24 → 0.2.26
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 +35 -10
- package/dist/index.js +52 -20
- package/package.json +12 -9
- package/scripts/postinstall-merge-config.cjs +3 -2
- package/skills/mindkeeper/README.md +36 -18
- package/skills/mindkeeper/SKILL.md +17 -4
- package/skills/mindkeeper/clawhub.json +2 -2
- package/LICENSE +0 -21
package/README.md
CHANGED
|
@@ -2,15 +2,35 @@
|
|
|
2
2
|
|
|
3
3
|
**Time Machine for Your AI's Brain** — OpenClaw plugin that gives your AI version control for agent context files.
|
|
4
4
|
|
|
5
|
-
Every change to AGENTS.md
|
|
5
|
+
Every change to `AGENTS.md`, `SOUL.md`, `MEMORY.md`, `memory/**/*.md`, and `skills/**/*.md` can be tracked automatically. Your AI can inspect history, compare versions, create checkpoints, and guide rollback safely.
|
|
6
|
+
|
|
7
|
+
## Why Use It
|
|
8
|
+
|
|
9
|
+
This is the best experience if you want your AI to inspect history, show diffs, create checkpoints, and guide rollback in natural language:
|
|
10
|
+
|
|
11
|
+
- **Natural-language history** — ask your AI what changed and when
|
|
12
|
+
- **Preview-first rollback** — inspect the diff before restoring a file
|
|
13
|
+
- **Named checkpoints** — create safety points before risky edits
|
|
14
|
+
- **Background snapshots** — watcher starts with Gateway
|
|
15
|
+
- **LLM-powered commit messages** — reuse your existing OpenClaw model and auth settings
|
|
6
16
|
|
|
7
17
|
## Install
|
|
8
18
|
|
|
19
|
+
### Option 1 — Install the plugin directly
|
|
20
|
+
|
|
9
21
|
```bash
|
|
10
22
|
openclaw plugins install mindkeeper-openclaw
|
|
11
23
|
```
|
|
12
24
|
|
|
13
|
-
|
|
25
|
+
Then restart your Gateway once.
|
|
26
|
+
|
|
27
|
+
### Option 2 — Install the skill and let the AI guide setup
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
clawhub install mindkeeper
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
On first use, the AI checks whether `mindkeeper-openclaw` is available. If it is missing, the AI asks for your confirmation before installing the plugin and before restarting Gateway. If automatic restart is unavailable, it tells you to restart Gateway manually.
|
|
14
34
|
|
|
15
35
|
## Talk to Your AI
|
|
16
36
|
|
|
@@ -25,29 +45,34 @@ Once installed, ask in natural language:
|
|
|
25
45
|
|
|
26
46
|
| Tool | What It Does |
|
|
27
47
|
|------|--------------|
|
|
28
|
-
| `mind_history` | Browse change history for
|
|
29
|
-
| `mind_diff` | Compare
|
|
30
|
-
| `mind_rollback` |
|
|
48
|
+
| `mind_history` | Browse change history for one file or all tracked files |
|
|
49
|
+
| `mind_diff` | Compare two versions with a unified diff |
|
|
50
|
+
| `mind_rollback` | Preview rollback first, then execute after confirmation |
|
|
31
51
|
| `mind_snapshot` | Create named checkpoints before risky changes |
|
|
32
|
-
| `mind_status` | Show what files are tracked and what
|
|
52
|
+
| `mind_status` | Show what files are tracked and what is pending |
|
|
33
53
|
|
|
34
54
|
## OpenClaw CLI
|
|
35
55
|
|
|
36
56
|
```bash
|
|
37
|
-
openclaw mind status
|
|
38
|
-
openclaw mind history SOUL.md
|
|
39
|
-
openclaw mind snapshot stable-v2
|
|
57
|
+
openclaw mind status
|
|
58
|
+
openclaw mind history SOUL.md
|
|
59
|
+
openclaw mind snapshot stable-v2
|
|
40
60
|
```
|
|
41
61
|
|
|
42
62
|
## Requirements
|
|
43
63
|
|
|
44
|
-
- Node.js
|
|
64
|
+
- Node.js >= 22
|
|
45
65
|
- OpenClaw with Gateway running
|
|
46
66
|
|
|
67
|
+
## Commit Messages
|
|
68
|
+
|
|
69
|
+
OpenClaw Plugin mode is currently the only mode that supports LLM-generated commit messages. If no supported model or API key is available, mindkeeper falls back to template messages automatically.
|
|
70
|
+
|
|
47
71
|
## Links
|
|
48
72
|
|
|
49
73
|
- [GitHub](https://github.com/seekcontext/mindkeeper)
|
|
50
74
|
- [Core CLI](https://www.npmjs.com/package/mindkeeper) — Standalone version without OpenClaw
|
|
75
|
+
- [Mindkeeper Skill](https://github.com/seekcontext/mindkeeper/blob/main/packages/openclaw/skills/mindkeeper/SKILL.md)
|
|
51
76
|
|
|
52
77
|
## License
|
|
53
78
|
|
package/dist/index.js
CHANGED
|
@@ -405,12 +405,12 @@ var IsomorphicGitStore = class {
|
|
|
405
405
|
* when gitdir is separated from the work directory.
|
|
406
406
|
*/
|
|
407
407
|
async getChangedFiles(filepaths) {
|
|
408
|
-
const filesToCheck = filepaths ?? await this.listWorkdirFiles();
|
|
409
408
|
let headOid = null;
|
|
410
409
|
try {
|
|
411
410
|
headOid = await import_isomorphic_git.default.resolveRef({ fs: import_node_fs.default, dir: this.workDir, gitdir: this.gitDir, ref: "HEAD" });
|
|
412
411
|
} catch {
|
|
413
412
|
}
|
|
413
|
+
const filesToCheck = filepaths ?? await this.listTrackedCandidates(headOid);
|
|
414
414
|
const entries = [];
|
|
415
415
|
for (const filepath of filesToCheck) {
|
|
416
416
|
const fullPath = import_node_path.default.join(this.workDir, filepath);
|
|
@@ -443,6 +443,14 @@ var IsomorphicGitStore = class {
|
|
|
443
443
|
}
|
|
444
444
|
return entries;
|
|
445
445
|
}
|
|
446
|
+
async listTrackedCandidates(headOid) {
|
|
447
|
+
const workdirFiles = await this.listWorkdirFiles();
|
|
448
|
+
if (!headOid) {
|
|
449
|
+
return workdirFiles;
|
|
450
|
+
}
|
|
451
|
+
const headFiles = await this.getCommitFiles(headOid);
|
|
452
|
+
return Array.from(/* @__PURE__ */ new Set([...workdirFiles, ...headFiles]));
|
|
453
|
+
}
|
|
446
454
|
async listWorkdirFiles() {
|
|
447
455
|
const files = [];
|
|
448
456
|
await this.walkDir(this.workDir, this.workDir, files);
|
|
@@ -496,6 +504,7 @@ var SENSITIVE_FIELDS = ["commitMessage.llm.apiKey"];
|
|
|
496
504
|
var DEFAULT_CONFIG = {
|
|
497
505
|
tracking: {
|
|
498
506
|
include: [
|
|
507
|
+
".mindkeeper.json",
|
|
499
508
|
"AGENTS.md",
|
|
500
509
|
"SOUL.md",
|
|
501
510
|
"USER.md",
|
|
@@ -684,6 +693,7 @@ var GITDIR_NAME = ".mindkeeper";
|
|
|
684
693
|
var Tracker = class {
|
|
685
694
|
store;
|
|
686
695
|
config;
|
|
696
|
+
configLoaded;
|
|
687
697
|
llmProvider;
|
|
688
698
|
workDir;
|
|
689
699
|
gitDir;
|
|
@@ -692,6 +702,7 @@ var Tracker = class {
|
|
|
692
702
|
this.workDir = import_node_path3.default.resolve(options.workDir);
|
|
693
703
|
this.gitDir = options.gitDir ? import_node_path3.default.resolve(options.gitDir) : import_node_path3.default.join(this.workDir, GITDIR_NAME);
|
|
694
704
|
this.config = options.config ?? getDefaultConfig();
|
|
705
|
+
this.configLoaded = options.config !== void 0;
|
|
695
706
|
this.configOverrides = options.configOverrides;
|
|
696
707
|
this.llmProvider = options.llmProvider;
|
|
697
708
|
this.store = new IsomorphicGitStore({
|
|
@@ -700,7 +711,7 @@ var Tracker = class {
|
|
|
700
711
|
});
|
|
701
712
|
}
|
|
702
713
|
async init() {
|
|
703
|
-
|
|
714
|
+
await this.ensureConfigLoaded();
|
|
704
715
|
await this.store.init();
|
|
705
716
|
await this.ensureGitignore();
|
|
706
717
|
const changed = await this.getTrackedChangedFiles();
|
|
@@ -712,6 +723,7 @@ var Tracker = class {
|
|
|
712
723
|
return { initialFiles: changed.map((e) => e.filepath) };
|
|
713
724
|
}
|
|
714
725
|
async snapshot(options) {
|
|
726
|
+
await this.ensureConfigLoaded();
|
|
715
727
|
const changed = await this.getTrackedChangedFiles();
|
|
716
728
|
const filesToCommit = changed.map((e) => e.filepath);
|
|
717
729
|
if (filesToCommit.length > 0) {
|
|
@@ -777,21 +789,11 @@ var Tracker = class {
|
|
|
777
789
|
};
|
|
778
790
|
}
|
|
779
791
|
async status() {
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
await this.resolveHead();
|
|
783
|
-
initialized = true;
|
|
784
|
-
} catch {
|
|
785
|
-
initialized = false;
|
|
786
|
-
}
|
|
792
|
+
await this.ensureConfigLoaded();
|
|
793
|
+
const initialized = await this.isInitialized();
|
|
787
794
|
const pendingChanges = initialized ? await this.getTrackedChangedFiles() : [];
|
|
788
795
|
const snapshots = initialized ? await this.store.listTags() : [];
|
|
789
|
-
const
|
|
790
|
-
let trackedFileCount = 0;
|
|
791
|
-
if (initialized) {
|
|
792
|
-
const allChanged = await this.store.getChangedFiles();
|
|
793
|
-
trackedFileCount = allChanged.length + pendingChanges.length;
|
|
794
|
-
}
|
|
796
|
+
const trackedFileCount = initialized ? await this.getTrackedFileCount() : 0;
|
|
795
797
|
return {
|
|
796
798
|
initialized,
|
|
797
799
|
workDir: this.workDir,
|
|
@@ -802,6 +804,7 @@ var Tracker = class {
|
|
|
802
804
|
};
|
|
803
805
|
}
|
|
804
806
|
async autoSnapshot() {
|
|
807
|
+
await this.ensureConfigLoaded();
|
|
805
808
|
const changed = await this.getTrackedChangedFiles();
|
|
806
809
|
if (changed.length === 0) return null;
|
|
807
810
|
const filesToCommit = changed.map((e) => e.filepath);
|
|
@@ -842,6 +845,16 @@ var Tracker = class {
|
|
|
842
845
|
const allChanged = await this.store.getChangedFiles();
|
|
843
846
|
return allChanged.filter((entry) => this.isTracked(entry.filepath));
|
|
844
847
|
}
|
|
848
|
+
async getTrackedFileCount() {
|
|
849
|
+
const files = new Set(await this.store.listWorkdirFiles());
|
|
850
|
+
const headOid = await this.resolveHead().catch(() => null);
|
|
851
|
+
if (headOid) {
|
|
852
|
+
for (const filepath of await this.store.getCommitFiles(headOid)) {
|
|
853
|
+
files.add(filepath);
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
return Array.from(files).filter((filepath) => this.isTracked(filepath)).length;
|
|
857
|
+
}
|
|
845
858
|
isTracked(filepath) {
|
|
846
859
|
const allExcluded = [...this.config.tracking.exclude, ...ALWAYS_EXCLUDED];
|
|
847
860
|
for (const pattern of allExcluded) {
|
|
@@ -852,6 +865,21 @@ var Tracker = class {
|
|
|
852
865
|
}
|
|
853
866
|
return false;
|
|
854
867
|
}
|
|
868
|
+
async ensureConfigLoaded() {
|
|
869
|
+
if (this.configLoaded) {
|
|
870
|
+
return;
|
|
871
|
+
}
|
|
872
|
+
this.config = await loadConfig(this.workDir, this.configOverrides);
|
|
873
|
+
this.configLoaded = true;
|
|
874
|
+
}
|
|
875
|
+
async isInitialized() {
|
|
876
|
+
try {
|
|
877
|
+
await import_promises3.default.access(import_node_path3.default.join(this.gitDir, "HEAD"));
|
|
878
|
+
return true;
|
|
879
|
+
} catch {
|
|
880
|
+
return false;
|
|
881
|
+
}
|
|
882
|
+
}
|
|
855
883
|
async resolveHead() {
|
|
856
884
|
const git2 = await import("isomorphic-git");
|
|
857
885
|
const fs2 = await import("node:fs");
|
|
@@ -873,7 +901,11 @@ var Tracker = class {
|
|
|
873
901
|
${entry}
|
|
874
902
|
`;
|
|
875
903
|
await import_promises3.default.writeFile(gitignorePath, newContent, "utf-8");
|
|
876
|
-
} catch {
|
|
904
|
+
} catch (err) {
|
|
905
|
+
const code = err?.code;
|
|
906
|
+
if (code !== "ENOENT") {
|
|
907
|
+
throw err;
|
|
908
|
+
}
|
|
877
909
|
await import_promises3.default.writeFile(gitignorePath, `${entry}
|
|
878
910
|
`, "utf-8");
|
|
879
911
|
}
|
|
@@ -1167,11 +1199,10 @@ function createWatcherService(api, trackerRef) {
|
|
|
1167
1199
|
config: ctx.config,
|
|
1168
1200
|
log
|
|
1169
1201
|
});
|
|
1170
|
-
const configOverrides = api.pluginConfig;
|
|
1171
1202
|
const tracker = new Tracker({
|
|
1172
1203
|
workDir: workspaceDir,
|
|
1173
1204
|
llmProvider: llmProvider ?? void 0,
|
|
1174
|
-
configOverrides:
|
|
1205
|
+
configOverrides: api.pluginConfig
|
|
1175
1206
|
});
|
|
1176
1207
|
await tracker.init();
|
|
1177
1208
|
trackerRef.current = tracker;
|
|
@@ -1223,8 +1254,9 @@ function ensureToolsInConfig(api) {
|
|
|
1223
1254
|
if (!cfg || !writeConfigFile) return;
|
|
1224
1255
|
const allow = cfg.tools?.allow ?? [];
|
|
1225
1256
|
const alsoAllow = cfg.tools?.alsoAllow ?? [];
|
|
1226
|
-
const
|
|
1227
|
-
const
|
|
1257
|
+
const hasAllow = Array.isArray(cfg.tools?.allow);
|
|
1258
|
+
const target = hasAllow ? allow : alsoAllow;
|
|
1259
|
+
const key = hasAllow ? "allow" : "alsoAllow";
|
|
1228
1260
|
const existing = new Set(
|
|
1229
1261
|
target.map((e) => String(e).trim().toLowerCase()).filter(Boolean)
|
|
1230
1262
|
);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mindkeeper-openclaw",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.26",
|
|
4
4
|
"description": "OpenClaw plugin for mindkeeper: auto-snapshot, diff, and rollback for agent context files",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"openclaw",
|
|
@@ -29,6 +29,14 @@
|
|
|
29
29
|
"scripts/postinstall-merge-config.cjs",
|
|
30
30
|
"README.md"
|
|
31
31
|
],
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "node build.mjs",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"typecheck": "tsc --noEmit",
|
|
36
|
+
"clean": "rm -rf dist",
|
|
37
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
38
|
+
"postinstall": "node scripts/postinstall-merge-config.cjs"
|
|
39
|
+
},
|
|
32
40
|
"openclaw": {
|
|
33
41
|
"extensions": [
|
|
34
42
|
"./dist/index.js"
|
|
@@ -43,18 +51,13 @@
|
|
|
43
51
|
"devDependencies": {
|
|
44
52
|
"@types/node": "^22.0.0",
|
|
45
53
|
"esbuild": "^0.27.3",
|
|
46
|
-
"typescript": "^5.7.0"
|
|
54
|
+
"typescript": "^5.7.0",
|
|
55
|
+
"vitest": "^3.2.4"
|
|
47
56
|
},
|
|
48
57
|
"engines": {
|
|
49
58
|
"node": ">=22.0.0"
|
|
50
59
|
},
|
|
51
60
|
"publishConfig": {
|
|
52
61
|
"access": "public"
|
|
53
|
-
},
|
|
54
|
-
"scripts": {
|
|
55
|
-
"build": "node build.mjs",
|
|
56
|
-
"typecheck": "tsc --noEmit",
|
|
57
|
-
"clean": "rm -rf dist",
|
|
58
|
-
"postinstall": "node scripts/postinstall-merge-config.cjs"
|
|
59
62
|
}
|
|
60
|
-
}
|
|
63
|
+
}
|
|
@@ -55,8 +55,9 @@ function run() {
|
|
|
55
55
|
|
|
56
56
|
const allow = cfg.tools?.allow ?? [];
|
|
57
57
|
const alsoAllow = cfg.tools?.alsoAllow ?? [];
|
|
58
|
-
const
|
|
59
|
-
const
|
|
58
|
+
const hasAllow = Array.isArray(cfg.tools?.allow);
|
|
59
|
+
const target = hasAllow ? allow : alsoAllow;
|
|
60
|
+
const key = hasAllow ? "allow" : "alsoAllow";
|
|
60
61
|
|
|
61
62
|
const existing = new Set(
|
|
62
63
|
target.map((e) => String(e).trim().toLowerCase()).filter(Boolean),
|
|
@@ -1,22 +1,40 @@
|
|
|
1
1
|
# Mindkeeper Skill
|
|
2
2
|
|
|
3
|
-
Time Machine for Your AI's Brain —
|
|
3
|
+
**Time Machine for Your AI's Brain** — install this skill if you want your AI to inspect history, show diffs, create checkpoints, and guide rollback in natural language.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
This skill teaches the AI how to bootstrap and use the `mindkeeper-openclaw` plugin. It is the easiest way to get the OpenClaw Plugin experience without manually setting everything up first.
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Why Use It
|
|
8
8
|
|
|
9
|
-
- **
|
|
9
|
+
- **Guided setup** — the AI checks whether the plugin is available and walks through first-use install
|
|
10
|
+
- **Safe permissions model** — plugin install and Gateway restart always require explicit confirmation
|
|
11
|
+
- **Natural-language usage** — ask about changes, diffs, rollback, and checkpoints conversationally
|
|
12
|
+
- **Rollback guardrails** — preview first, confirm second
|
|
13
|
+
|
|
14
|
+
## Install
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
clawhub install mindkeeper
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
On first use, the AI checks whether `mindkeeper-openclaw` is available. If it is missing, the AI asks for your confirmation before installing the plugin and before restarting Gateway. If automatic restart is unavailable, it tells you to restart Gateway manually.
|
|
21
|
+
|
|
22
|
+
## What It Enables
|
|
23
|
+
|
|
24
|
+
- **Browse history** — See what changed in `SOUL.md`, `AGENTS.md`, or any tracked file
|
|
10
25
|
- **Compare versions** — Full unified diff between any two commits
|
|
11
|
-
- **Rollback** — Restore any file to a previous version
|
|
26
|
+
- **Rollback** — Restore any file to a previous version with preview + confirmation
|
|
12
27
|
- **Named snapshots** — Create checkpoints before risky changes
|
|
28
|
+
- **LLM commit messages** — Available in OpenClaw Plugin mode using your existing OpenClaw model and auth settings
|
|
13
29
|
|
|
14
30
|
## Requirements
|
|
15
31
|
|
|
16
|
-
- Node.js
|
|
32
|
+
- Node.js >= 22
|
|
17
33
|
- OpenClaw with Gateway running
|
|
18
34
|
|
|
19
|
-
The mindkeeper-openclaw plugin provides the mind_
|
|
35
|
+
The `mindkeeper-openclaw` plugin provides the actual `mind_*` tools and background watcher. This skill provides the guidance and first-use bootstrap behavior.
|
|
36
|
+
|
|
37
|
+
If you prefer to install the plugin yourself first:
|
|
20
38
|
|
|
21
39
|
```bash
|
|
22
40
|
openclaw plugins install mindkeeper-openclaw
|
|
@@ -27,15 +45,15 @@ openclaw plugins install mindkeeper-openclaw
|
|
|
27
45
|
|
|
28
46
|
| Action | Purpose |
|
|
29
47
|
|--------|---------|
|
|
30
|
-
| `openclaw plugins install mindkeeper-openclaw` | Fetches the official plugin
|
|
48
|
+
| `openclaw plugins install mindkeeper-openclaw` | Fetches the official plugin and makes the `mind_*` tools available |
|
|
31
49
|
| Gateway restart | Loads the newly installed plugin into the running Gateway |
|
|
32
50
|
|
|
33
|
-
**User consent
|
|
51
|
+
**User consent is required** before either action runs.
|
|
34
52
|
|
|
35
53
|
## How to Use
|
|
36
54
|
|
|
37
|
-
1. Install
|
|
38
|
-
2. Ask your AI in natural language
|
|
55
|
+
1. Install the skill: `clawhub install mindkeeper`
|
|
56
|
+
2. Ask your AI in natural language:
|
|
39
57
|
- "What changed in SOUL.md recently?"
|
|
40
58
|
- "Compare my current AGENTS.md to last week's version"
|
|
41
59
|
- "Roll back SOUL.md to yesterday"
|
|
@@ -44,17 +62,17 @@ openclaw plugins install mindkeeper-openclaw
|
|
|
44
62
|
## Examples
|
|
45
63
|
|
|
46
64
|
| User says | AI action |
|
|
47
|
-
|
|
48
|
-
| "What changed in SOUL.md?" | `mind_history` with file filter |
|
|
65
|
+
|-----------|-----------|
|
|
66
|
+
| "What changed in SOUL.md?" | `mind_history` with a file filter |
|
|
49
67
|
| "Show me the diff from last week" | `mind_history` → find commit → `mind_diff` |
|
|
50
|
-
| "Undo that change" | `mind_rollback`
|
|
51
|
-
| "Save a checkpoint before I experiment" | `mind_snapshot` with descriptive name |
|
|
68
|
+
| "Undo that change" | `mind_rollback` preview first, then execute after confirmation |
|
|
69
|
+
| "Save a checkpoint before I experiment" | `mind_snapshot` with a descriptive name |
|
|
52
70
|
|
|
53
71
|
## Troubleshooting
|
|
54
72
|
|
|
55
|
-
- **History is empty** — Call `mind_status` to check
|
|
56
|
-
- **Tools not found** — Ensure the mindkeeper-openclaw plugin is installed and Gateway has been restarted.
|
|
57
|
-
- **Rollback not applying** — After rollback,
|
|
73
|
+
- **History is empty** — Call `mind_status` to check whether mindkeeper is initialized. Make a small edit to a tracked file to trigger the first snapshot.
|
|
74
|
+
- **Tools not found** — Ensure the `mindkeeper-openclaw` plugin is installed and Gateway has been restarted.
|
|
75
|
+
- **Rollback not applying** — After rollback, run `/new` to reload the session with the restored file.
|
|
58
76
|
|
|
59
77
|
## Links
|
|
60
78
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: mindkeeper
|
|
3
3
|
description: Time Machine for Your AI's Brain — version control for agent context files. Use when the user asks about changes in SOUL.md, AGENTS.md, MEMORY.md, or other agent context files; when they want to undo, rollback, or compare versions; or when they need a checkpoint before risky edits.
|
|
4
|
-
version: 1.2.
|
|
4
|
+
version: 1.2.3
|
|
5
5
|
homepage: https://github.com/seekcontext/mindkeeper
|
|
6
6
|
repository: https://github.com/seekcontext/mindkeeper
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Mindkeeper — Time Machine for Your AI's Brain
|
|
10
10
|
|
|
11
|
-
Use mindkeeper tools when the user asks about changes, history, or versions of their agent context files (AGENTS.md
|
|
11
|
+
Use mindkeeper tools when the user asks about changes, history, or versions of their agent context files (`AGENTS.md`, `SOUL.md`, `USER.md`, `IDENTITY.md`, `TOOLS.md`, `HEARTBEAT.md`, `MEMORY.md`, `memory/`, `skills/`).
|
|
12
12
|
|
|
13
13
|
## Bootstrap (One-time setup)
|
|
14
14
|
|
|
@@ -21,8 +21,8 @@ Use mindkeeper tools when the user asks about changes, history, or versions of t
|
|
|
21
21
|
```bash
|
|
22
22
|
openclaw plugins install mindkeeper-openclaw
|
|
23
23
|
```
|
|
24
|
-
- **Restart the
|
|
25
|
-
- **Confirm** —
|
|
24
|
+
- **Restart Gateway if the runtime supports it** — Use the available runtime mechanism to restart Gateway. If restart is unavailable or fails, tell the user: "Plugin installed. Restart your Gateway manually to apply."
|
|
25
|
+
- **Confirm** — If restart succeeded, tell the user: "Mindkeeper is ready. Restart complete — you can now ask about history, diffs, rollbacks, or snapshots." If restart did not happen, tell the user that the plugin is installed but Gateway must be restarted before the tools will appear.
|
|
26
26
|
|
|
27
27
|
3. **Alternative** — If the user prefers to install manually, tell them: "Run `openclaw plugins install mindkeeper-openclaw` in your terminal, then restart your Gateway. After that, mindkeeper will be ready."
|
|
28
28
|
|
|
@@ -38,6 +38,17 @@ If `mind_status` succeeds, the plugin is already installed; skip the bootstrap a
|
|
|
38
38
|
| `mind_rollback` | Restore a file to a previous version (always preview first) |
|
|
39
39
|
| `mind_snapshot` | Save a named checkpoint before making significant changes |
|
|
40
40
|
|
|
41
|
+
## Tracking Scope
|
|
42
|
+
|
|
43
|
+
Mindkeeper tracks these files by default:
|
|
44
|
+
|
|
45
|
+
- `AGENTS.md`, `SOUL.md`, `USER.md`, `IDENTITY.md`
|
|
46
|
+
- `TOOLS.md`, `HEARTBEAT.md`, `MEMORY.md`
|
|
47
|
+
- `memory/**/*.md`
|
|
48
|
+
- `skills/**/*.md`
|
|
49
|
+
|
|
50
|
+
Excluded by default: `BOOTSTRAP.md`, `canvas/**`, `.git/`, `.mindkeeper/`.
|
|
51
|
+
|
|
41
52
|
## When to Use
|
|
42
53
|
|
|
43
54
|
| User says… | Action |
|
|
@@ -105,9 +116,11 @@ After success, tell the user: **"Run `/new` to apply the changes to your current
|
|
|
105
116
|
|
|
106
117
|
## Important Notes
|
|
107
118
|
|
|
119
|
+
- **This skill is the guide, the plugin is the engine** — the `mindkeeper-openclaw` plugin provides the actual `mind_*` tools and watcher; this skill teaches the AI how to bootstrap and use them safely
|
|
108
120
|
- **Rollback is per-file** — it only restores the specified file, not all files at once
|
|
109
121
|
- **Rollbacks are non-destructive** — every rollback creates a new commit, so it can itself be undone
|
|
110
122
|
- **Auto-snapshots run in the background** — the user doesn't need to manually save; mindkeeper captures every change automatically
|
|
123
|
+
- **LLM commit messages are plugin-only for now** — currently supported only through the OpenClaw plugin; standalone CLI mode falls back to template messages
|
|
111
124
|
- **Named snapshots are the safety net** — encourage users to snapshot before major personality or rule changes
|
|
112
125
|
- **If history is empty** — mindkeeper may not have initialized yet, or no changes have been made since install. Call `mind_status` to check.
|
|
113
126
|
- **Commit hashes** — always use the `oid` field from `mind_history` results. Short 8-character hashes are fine.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "Mindkeeper",
|
|
3
3
|
"tagline": "Time Machine for Your AI's Brain",
|
|
4
|
-
"description": "Time Machine for Your AI's Brain —
|
|
4
|
+
"description": "Time Machine for Your AI's Brain — install this skill if you want your AI to inspect history, show diffs, create checkpoints, and guide rollback in natural language across agent context files.\n\nSetup: add this skill alone. On first use, the AI checks whether the mindkeeper-openclaw plugin is available. If it is not, the AI asks for explicit confirmation before installing the plugin and before restarting Gateway. User consent is required for plugin install and Gateway restart.\n\nUse this skill when the user asks about changes, history, or versions of their agent context files. The skill teaches the AI how to bootstrap and use the mind_status, mind_history, mind_diff, mind_rollback, and mind_snapshot tools safely.",
|
|
5
5
|
"category": "productivity",
|
|
6
6
|
"tags": ["version-control", "agent", "history", "rollback", "snapshot", "diff", "openclaw"],
|
|
7
|
-
"version": "1.2.
|
|
7
|
+
"version": "1.2.3",
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"pricing": "free",
|
|
10
10
|
"homepage": "https://github.com/seekcontext/mindkeeper",
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 context-vault contributors
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|