@savestate/cli 0.1.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.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +256 -0
  3. package/dist/adapters/claude-code.d.ts +81 -0
  4. package/dist/adapters/claude-code.d.ts.map +1 -0
  5. package/dist/adapters/claude-code.js +540 -0
  6. package/dist/adapters/claude-code.js.map +1 -0
  7. package/dist/adapters/clawdbot.d.ts +93 -0
  8. package/dist/adapters/clawdbot.d.ts.map +1 -0
  9. package/dist/adapters/clawdbot.js +673 -0
  10. package/dist/adapters/clawdbot.js.map +1 -0
  11. package/dist/adapters/index.d.ts +9 -0
  12. package/dist/adapters/index.d.ts.map +1 -0
  13. package/dist/adapters/index.js +8 -0
  14. package/dist/adapters/index.js.map +1 -0
  15. package/dist/adapters/interface.d.ts +8 -0
  16. package/dist/adapters/interface.d.ts.map +1 -0
  17. package/dist/adapters/interface.js +8 -0
  18. package/dist/adapters/interface.js.map +1 -0
  19. package/dist/adapters/openai-assistants.d.ts +51 -0
  20. package/dist/adapters/openai-assistants.d.ts.map +1 -0
  21. package/dist/adapters/openai-assistants.js +114 -0
  22. package/dist/adapters/openai-assistants.js.map +1 -0
  23. package/dist/adapters/registry.d.ts +38 -0
  24. package/dist/adapters/registry.d.ts.map +1 -0
  25. package/dist/adapters/registry.js +79 -0
  26. package/dist/adapters/registry.js.map +1 -0
  27. package/dist/cli.d.ts +18 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +81 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/commands/adapters.d.ts +5 -0
  32. package/dist/commands/adapters.d.ts.map +1 -0
  33. package/dist/commands/adapters.js +49 -0
  34. package/dist/commands/adapters.js.map +1 -0
  35. package/dist/commands/config.d.ts +10 -0
  36. package/dist/commands/config.d.ts.map +1 -0
  37. package/dist/commands/config.js +60 -0
  38. package/dist/commands/config.js.map +1 -0
  39. package/dist/commands/diff.d.ts +5 -0
  40. package/dist/commands/diff.d.ts.map +1 -0
  41. package/dist/commands/diff.js +51 -0
  42. package/dist/commands/diff.js.map +1 -0
  43. package/dist/commands/index.d.ts +12 -0
  44. package/dist/commands/index.d.ts.map +1 -0
  45. package/dist/commands/index.js +12 -0
  46. package/dist/commands/index.js.map +1 -0
  47. package/dist/commands/init.d.ts +5 -0
  48. package/dist/commands/init.d.ts.map +1 -0
  49. package/dist/commands/init.js +71 -0
  50. package/dist/commands/init.js.map +1 -0
  51. package/dist/commands/list.d.ts +10 -0
  52. package/dist/commands/list.d.ts.map +1 -0
  53. package/dist/commands/list.js +89 -0
  54. package/dist/commands/list.js.map +1 -0
  55. package/dist/commands/restore.d.ts +11 -0
  56. package/dist/commands/restore.d.ts.map +1 -0
  57. package/dist/commands/restore.js +86 -0
  58. package/dist/commands/restore.js.map +1 -0
  59. package/dist/commands/search.d.ts +11 -0
  60. package/dist/commands/search.d.ts.map +1 -0
  61. package/dist/commands/search.js +50 -0
  62. package/dist/commands/search.js.map +1 -0
  63. package/dist/commands/snapshot.d.ts +12 -0
  64. package/dist/commands/snapshot.d.ts.map +1 -0
  65. package/dist/commands/snapshot.js +84 -0
  66. package/dist/commands/snapshot.js.map +1 -0
  67. package/dist/config.d.ts +44 -0
  68. package/dist/config.d.ts.map +1 -0
  69. package/dist/config.js +83 -0
  70. package/dist/config.js.map +1 -0
  71. package/dist/encryption.d.ts +40 -0
  72. package/dist/encryption.d.ts.map +1 -0
  73. package/dist/encryption.js +120 -0
  74. package/dist/encryption.js.map +1 -0
  75. package/dist/format.d.ts +47 -0
  76. package/dist/format.d.ts.map +1 -0
  77. package/dist/format.js +198 -0
  78. package/dist/format.js.map +1 -0
  79. package/dist/index-file.d.ts +42 -0
  80. package/dist/index-file.d.ts.map +1 -0
  81. package/dist/index-file.js +68 -0
  82. package/dist/index-file.js.map +1 -0
  83. package/dist/index.d.ts +15 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +22 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/passphrase.d.ts +23 -0
  88. package/dist/passphrase.d.ts.map +1 -0
  89. package/dist/passphrase.js +82 -0
  90. package/dist/passphrase.js.map +1 -0
  91. package/dist/restore.d.ts +46 -0
  92. package/dist/restore.d.ts.map +1 -0
  93. package/dist/restore.js +113 -0
  94. package/dist/restore.js.map +1 -0
  95. package/dist/search.d.ts +35 -0
  96. package/dist/search.d.ts.map +1 -0
  97. package/dist/search.js +59 -0
  98. package/dist/search.js.map +1 -0
  99. package/dist/snapshot.d.ts +43 -0
  100. package/dist/snapshot.d.ts.map +1 -0
  101. package/dist/snapshot.js +95 -0
  102. package/dist/snapshot.js.map +1 -0
  103. package/dist/storage/index.d.ts +7 -0
  104. package/dist/storage/index.d.ts.map +1 -0
  105. package/dist/storage/index.js +6 -0
  106. package/dist/storage/index.js.map +1 -0
  107. package/dist/storage/interface.d.ts +8 -0
  108. package/dist/storage/interface.d.ts.map +1 -0
  109. package/dist/storage/interface.js +8 -0
  110. package/dist/storage/interface.js.map +1 -0
  111. package/dist/storage/local.d.ts +22 -0
  112. package/dist/storage/local.d.ts.map +1 -0
  113. package/dist/storage/local.js +63 -0
  114. package/dist/storage/local.js.map +1 -0
  115. package/dist/storage/resolve.d.ts +11 -0
  116. package/dist/storage/resolve.d.ts.map +1 -0
  117. package/dist/storage/resolve.js +21 -0
  118. package/dist/storage/resolve.js.map +1 -0
  119. package/dist/types.d.ts +273 -0
  120. package/dist/types.d.ts.map +1 -0
  121. package/dist/types.js +8 -0
  122. package/dist/types.js.map +1 -0
  123. package/package.json +61 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 SaveState 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.
package/README.md ADDED
@@ -0,0 +1,256 @@
1
+ # ⚡ SaveState
2
+
3
+ ### Time Machine for AI
4
+
5
+ **Backup, restore, and migrate your AI identity.**
6
+
7
+ > Your AI knows you — your preferences, your history, your workflows.
8
+ > What happens when it disappears?
9
+
10
+ ---
11
+
12
+ ## The Problem
13
+
14
+ People build deep relationships with AI assistants. Months of conversations, learned preferences, custom instructions, tool configurations — **none of it is portable, none of it is backed up.**
15
+
16
+ If the service changes, the API breaks, or you want to switch platforms — you lose everything.
17
+
18
+ ## The Solution
19
+
20
+ SaveState is an encrypted backup and restore system for AI agent state. Think **Time Machine**, but for your AI.
21
+
22
+ ```bash
23
+ npx savestate init # Set up encryption + storage
24
+ npx savestate snapshot # Capture current state
25
+ npx savestate restore latest # Restore from last snapshot
26
+ npx savestate search "cocktail recs" # Search across all snapshots
27
+ npx savestate diff v3 v5 # What changed between snapshots
28
+ ```
29
+
30
+ ## Features
31
+
32
+ - 🔐 **Encrypted at rest** — AES-256-GCM with scrypt key derivation. Your keys, your data.
33
+ - 📦 **Open archive format** — The SaveState Archive Format (SAF) is an open spec. No vendor lock-in.
34
+ - 🔌 **Platform adapters** — Works with ChatGPT, Claude, Gemini, Clawdbot, OpenAI Assistants, and more.
35
+ - 🔍 **Searchable** — Query across all snapshots without restoring. Find anything.
36
+ - 📊 **Incremental** — Like git — only captures what changed. Full history, tiny storage.
37
+ - 💾 **Flexible storage** — Local filesystem, S3, R2, Backblaze, Dropbox, iCloud — you choose.
38
+ - ⏰ **Scheduled backups** — Set it and forget it. Auto-snapshot on your schedule.
39
+ - 🖥️ **CLI-first** — Built for developers. Also has a web dashboard (coming soon).
40
+
41
+ ## Quick Start
42
+
43
+ ```bash
44
+ # Install globally
45
+ npm install -g savestate
46
+
47
+ # Initialize in your AI workspace
48
+ cd ~/my-ai-workspace
49
+ savestate init
50
+
51
+ # Take your first snapshot
52
+ savestate snapshot
53
+
54
+ # List all snapshots
55
+ savestate list
56
+
57
+ # Search across snapshots
58
+ savestate search "that recipe from last month"
59
+
60
+ # Restore from a snapshot
61
+ savestate restore latest
62
+ ```
63
+
64
+ ## Supported Platforms
65
+
66
+ | Platform | Extract | Restore | Status |
67
+ |----------|---------|---------|--------|
68
+ | **Clawdbot / Moltbot** | ✅ | ✅ | Available now |
69
+ | **OpenAI Assistants API** | ✅ | ✅ | Coming soon |
70
+ | **Custom file-based agents** | ✅ | ✅ | Coming soon |
71
+ | **ChatGPT** | ✅ | ⚠️ Partial | Planned |
72
+ | **Claude** | ✅ | ⚠️ Partial | Planned |
73
+ | **Gemini** | ✅ | ⚠️ Limited | Planned |
74
+
75
+ Community adapters welcome! See [Contributing](#contributing).
76
+
77
+ ## Architecture
78
+
79
+ ```
80
+ ┌─────────────────────────────────────────────────┐
81
+ │ SaveState CLI │
82
+ │ init · snapshot · restore · search · diff │
83
+ ├─────────────────────────────────────────────────┤
84
+ │ Adapter Layer │
85
+ │ clawdbot · chatgpt · claude · openai · custom │
86
+ ├─────────────────────────────────────────────────┤
87
+ │ Core Engine │
88
+ │ snapshot · restore · search · diff · format │
89
+ ├─────────────────────────────────────────────────┤
90
+ │ Encryption Layer │
91
+ │ AES-256-GCM · scrypt KDF · integrity check │
92
+ ├─────────────────────────────────────────────────┤
93
+ │ Storage Backends │
94
+ │ local · s3 · r2 · b2 · filesystem │
95
+ └─────────────────────────────────────────────────┘
96
+ ```
97
+
98
+ ### SaveState Archive Format (SAF)
99
+
100
+ Each snapshot produces a `.saf.enc` file:
101
+
102
+ ```
103
+ snapshot.saf.enc (encrypted)
104
+ └── snapshot.tar.gz
105
+ ├── manifest.json # Version, platform, timestamp, checksum
106
+ ├── identity/
107
+ │ ├── personality.md # System prompt, SOUL, custom instructions
108
+ │ ├── config.json # Settings, preferences
109
+ │ └── tools.json # Tool/plugin configurations
110
+ ├── memory/
111
+ │ ├── core.json # Platform memory entries
112
+ │ └── knowledge/ # Uploaded docs, RAG sources
113
+ ├── conversations/
114
+ │ ├── index.json # Conversation list with metadata
115
+ │ └── threads/ # Individual conversation exports
116
+ └── meta/
117
+ ├── platform.json # Source platform details
118
+ ├── snapshot-chain.json # Incremental snapshot chain
119
+ └── restore-hints.json # Platform-specific restore steps
120
+ ```
121
+
122
+ ### Encryption
123
+
124
+ ```
125
+ User passphrase
126
+ → scrypt (N=2^17, r=8, p=1) key derivation
127
+ → 256-bit AES key
128
+ → AES-256-GCM authenticated encryption
129
+ → Integrity verification built into GCM auth tag
130
+ ```
131
+
132
+ Your master key is never stored — it's derived from your passphrase each time. Data is encrypted before it leaves your machine.
133
+
134
+ ## CLI Reference
135
+
136
+ ```
137
+ savestate init Initialize SaveState in current directory
138
+ savestate snapshot Capture current AI state
139
+ -l, --label <label> Label for the snapshot
140
+ -t, --tags <tags> Comma-separated tags
141
+ -a, --adapter <adapter> Adapter to use
142
+ -s, --schedule <interval> Auto-snapshot interval (e.g., 6h)
143
+ savestate restore [snapshot-id] Restore from a snapshot (default: latest)
144
+ --to <platform> Restore to different platform
145
+ --dry-run Preview without making changes
146
+ --include <categories> Only restore specific categories
147
+ savestate list List all snapshots
148
+ --json Output as JSON
149
+ --limit <n> Max snapshots to show
150
+ savestate search <query> Search across snapshots
151
+ --type <types> Filter by content type
152
+ --limit <n> Max results
153
+ savestate diff <a> <b> Compare two snapshots
154
+ savestate config View/edit configuration
155
+ --set <key=value> Set a config value
156
+ --json Output as JSON
157
+ savestate adapters List available adapters
158
+ ```
159
+
160
+ ## Storage Backends
161
+
162
+ ```bash
163
+ # Local filesystem (default)
164
+ savestate config --set storage.type=local
165
+
166
+ # Amazon S3
167
+ savestate config --set storage.type=s3
168
+ savestate config --set storage.options.bucket=my-savestate-backups
169
+
170
+ # Cloudflare R2
171
+ savestate config --set storage.type=r2
172
+
173
+ # Any sync folder (Dropbox, iCloud, etc.)
174
+ savestate config --set storage.type=local
175
+ savestate config --set storage.options.path=~/Dropbox/savestate
176
+ ```
177
+
178
+ All backends receive **only encrypted data**. Zero-knowledge by design.
179
+
180
+ ## Contributing
181
+
182
+ SaveState is open source. We welcome contributions!
183
+
184
+ ### Building from source
185
+
186
+ ```bash
187
+ git clone https://github.com/savestatedev/savestate.git
188
+ cd savestate
189
+ npm install
190
+ npm run build
191
+ node dist/cli.js --help
192
+ ```
193
+
194
+ ### Creating an adapter
195
+
196
+ Adapters implement the `Adapter` interface:
197
+
198
+ ```typescript
199
+ import type { Adapter, Snapshot, PlatformMeta } from 'savestate';
200
+
201
+ export class MyAdapter implements Adapter {
202
+ readonly id = 'my-platform';
203
+ readonly name = 'My Platform';
204
+ readonly platform = 'my-platform';
205
+ readonly version = '0.1.0';
206
+
207
+ async detect(): Promise<boolean> { /* ... */ }
208
+ async extract(): Promise<Snapshot> { /* ... */ }
209
+ async restore(snapshot: Snapshot): Promise<void> { /* ... */ }
210
+ async identify(): Promise<PlatformMeta> { /* ... */ }
211
+ }
212
+ ```
213
+
214
+ Publish as `@savestate/adapter-<name>` on npm for auto-discovery.
215
+
216
+ ### Project structure
217
+
218
+ ```
219
+ src/
220
+ ├── cli.ts # CLI entry point (commander)
221
+ ├── index.ts # Public API
222
+ ├── types.ts # All TypeScript interfaces
223
+ ├── encryption.ts # AES-256-GCM encryption
224
+ ├── format.ts # SAF archive packing/unpacking
225
+ ├── config.ts # Configuration management
226
+ ├── snapshot.ts # Snapshot creation
227
+ ├── restore.ts # Snapshot restoration
228
+ ├── search.ts # Cross-snapshot search
229
+ ├── commands/ # CLI command handlers
230
+ │ ├── init.ts
231
+ │ ├── snapshot.ts
232
+ │ ├── restore.ts
233
+ │ ├── list.ts
234
+ │ ├── search.ts
235
+ │ ├── diff.ts
236
+ │ ├── config.ts
237
+ │ └── adapters.ts
238
+ ├── storage/ # Storage backends
239
+ │ ├── interface.ts
240
+ │ └── local.ts
241
+ └── adapters/ # Platform adapters
242
+ ├── interface.ts
243
+ ├── clawdbot.ts
244
+ └── registry.ts
245
+ ```
246
+
247
+ ## License
248
+
249
+ MIT © [SaveState Contributors](LICENSE)
250
+
251
+ ---
252
+
253
+ <p align="center">
254
+ <strong>SaveState</strong> — Your AI identity, backed up.<br>
255
+ <a href="https://savestate.dev">savestate.dev</a>
256
+ </p>
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Claude Code Adapter
3
+ *
4
+ * Adapter for Anthropic's Claude Code coding agent.
5
+ * Captures CLAUDE.md files, .claude/ directory state,
6
+ * global settings, and project structure metadata.
7
+ *
8
+ * Claude Code works in project directories with:
9
+ * - CLAUDE.md — project instructions (root + subdirectories)
10
+ * - .claude/ — local state and settings
11
+ * - ~/.claude/ — global settings and instructions
12
+ */
13
+ import type { Adapter, PlatformMeta, Snapshot } from '../types.js';
14
+ export declare class ClaudeCodeAdapter implements Adapter {
15
+ readonly id = "claude-code";
16
+ readonly name = "Claude Code";
17
+ readonly platform = "claude-code";
18
+ readonly version = "0.1.0";
19
+ private readonly projectDir;
20
+ private warnings;
21
+ constructor(projectDir?: string);
22
+ detect(): Promise<boolean>;
23
+ extract(): Promise<Snapshot>;
24
+ restore(snapshot: Snapshot): Promise<void>;
25
+ identify(): Promise<PlatformMeta>;
26
+ /**
27
+ * Read all CLAUDE.md files — root + subdirectories.
28
+ * Concatenates with path markers.
29
+ */
30
+ private readClaudeMdFiles;
31
+ /**
32
+ * Read memory files from .claude/memory/ and other locations.
33
+ */
34
+ private readMemoryFiles;
35
+ /**
36
+ * Read settings from .claude/ and ~/.claude/
37
+ */
38
+ private readSettings;
39
+ /**
40
+ * Read project metadata files (package.json, pyproject.toml, etc.)
41
+ */
42
+ private readProjectMeta;
43
+ /**
44
+ * Build a file manifest of the project (paths + sizes, no content).
45
+ */
46
+ private buildFileManifest;
47
+ private walkForManifest;
48
+ /**
49
+ * Build knowledge documents from CLAUDE.md files and settings.
50
+ */
51
+ private buildKnowledge;
52
+ /**
53
+ * Parse concatenated CLAUDE.md personality back into individual files.
54
+ */
55
+ private restoreClaudeMdFiles;
56
+ /**
57
+ * Restore settings files.
58
+ */
59
+ private restoreSettings;
60
+ /**
61
+ * Restore memory entries to their source files.
62
+ */
63
+ private restoreMemory;
64
+ private isBinary;
65
+ private safeReadFile;
66
+ /**
67
+ * Find files with a specific name up to maxDepth levels.
68
+ */
69
+ private findFiles;
70
+ private parsePersonality;
71
+ private backupFile;
72
+ /**
73
+ * Try to detect Claude Code version from common locations.
74
+ */
75
+ private detectClaudeCodeVersion;
76
+ /**
77
+ * Detect project type from metadata files.
78
+ */
79
+ private detectProjectType;
80
+ }
81
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,QAAQ,EAIT,MAAM,aAAa,CAAC;AA4CrB,qBAAa,iBAAkB,YAAW,OAAO;IAC/C,QAAQ,CAAC,EAAE,iBAAiB;IAC5B,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,QAAQ,iBAAiB;IAClC,QAAQ,CAAC,OAAO,WAAW;IAE3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,UAAU,CAAC,EAAE,MAAM;IAIzB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAgB1B,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;IAgF5B,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB1C,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAevC;;;OAGG;YACW,iBAAiB;IA0B/B;;OAEG;YACW,eAAe;IA4D7B;;OAEG;YACW,YAAY;IAiC1B;;OAEG;YACW,eAAe;IAgB7B;;OAEG;YACW,iBAAiB;YAMjB,eAAe;IAiC7B;;OAEG;YACW,cAAc;IAwB5B;;OAEG;YACW,oBAAoB;IAWlC;;OAEG;YACW,eAAe;IAiB7B;;OAEG;YACW,aAAa;IAiB3B,OAAO,CAAC,QAAQ;YAKF,YAAY;IAc1B;;OAEG;YACW,SAAS;IAqBvB,OAAO,CAAC,gBAAgB;YAoBV,UAAU;IAWxB;;OAEG;YACW,uBAAuB;IAsBrC;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAa1B"}