@rewind-ai/cli 0.6.2

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 (244) hide show
  1. package/.env.example +8 -0
  2. package/LICENSE +21 -0
  3. package/README.md +39 -0
  4. package/dist/src/action/capture.d.ts +15 -0
  5. package/dist/src/action/capture.js +215 -0
  6. package/dist/src/action/capture.js.map +1 -0
  7. package/dist/src/action/mediate.d.ts +28 -0
  8. package/dist/src/action/mediate.js +109 -0
  9. package/dist/src/action/mediate.js.map +1 -0
  10. package/dist/src/action/mutate.d.ts +11 -0
  11. package/dist/src/action/mutate.js +189 -0
  12. package/dist/src/action/mutate.js.map +1 -0
  13. package/dist/src/action/objects.d.ts +5 -0
  14. package/dist/src/action/objects.js +50 -0
  15. package/dist/src/action/objects.js.map +1 -0
  16. package/dist/src/action/store.d.ts +24 -0
  17. package/dist/src/action/store.js +149 -0
  18. package/dist/src/action/store.js.map +1 -0
  19. package/dist/src/action/types.d.ts +84 -0
  20. package/dist/src/action/types.js +3 -0
  21. package/dist/src/action/types.js.map +1 -0
  22. package/dist/src/action/undo.d.ts +11 -0
  23. package/dist/src/action/undo.js +42 -0
  24. package/dist/src/action/undo.js.map +1 -0
  25. package/dist/src/adapters/filesystem.d.ts +35 -0
  26. package/dist/src/adapters/filesystem.js +499 -0
  27. package/dist/src/adapters/filesystem.js.map +1 -0
  28. package/dist/src/adapters/index.d.ts +7 -0
  29. package/dist/src/adapters/index.js +19 -0
  30. package/dist/src/adapters/index.js.map +1 -0
  31. package/dist/src/adapters/types.d.ts +54 -0
  32. package/dist/src/adapters/types.js +7 -0
  33. package/dist/src/adapters/types.js.map +1 -0
  34. package/dist/src/api/server.d.ts +25 -0
  35. package/dist/src/api/server.js +786 -0
  36. package/dist/src/api/server.js.map +1 -0
  37. package/dist/src/approval/store.d.ts +35 -0
  38. package/dist/src/approval/store.js +113 -0
  39. package/dist/src/approval/store.js.map +1 -0
  40. package/dist/src/checkpoint.d.ts +9 -0
  41. package/dist/src/checkpoint.js +140 -0
  42. package/dist/src/checkpoint.js.map +1 -0
  43. package/dist/src/cli/v5.d.ts +15 -0
  44. package/dist/src/cli/v5.js +110 -0
  45. package/dist/src/cli/v5.js.map +1 -0
  46. package/dist/src/cli.d.ts +2 -0
  47. package/dist/src/cli.js +823 -0
  48. package/dist/src/cli.js.map +1 -0
  49. package/dist/src/clients/types.d.ts +90 -0
  50. package/dist/src/clients/types.js +239 -0
  51. package/dist/src/clients/types.js.map +1 -0
  52. package/dist/src/commercial/auth/provider.d.ts +61 -0
  53. package/dist/src/commercial/auth/provider.js +227 -0
  54. package/dist/src/commercial/auth/provider.js.map +1 -0
  55. package/dist/src/commercial/entitlement/provider.d.ts +27 -0
  56. package/dist/src/commercial/entitlement/provider.js +192 -0
  57. package/dist/src/commercial/entitlement/provider.js.map +1 -0
  58. package/dist/src/commercial/entitlement/signing.d.ts +61 -0
  59. package/dist/src/commercial/entitlement/signing.js +124 -0
  60. package/dist/src/commercial/entitlement/signing.js.map +1 -0
  61. package/dist/src/commercial/env.d.ts +10 -0
  62. package/dist/src/commercial/env.js +40 -0
  63. package/dist/src/commercial/env.js.map +1 -0
  64. package/dist/src/commercial/product.d.ts +26 -0
  65. package/dist/src/commercial/product.js +39 -0
  66. package/dist/src/commercial/product.js.map +1 -0
  67. package/dist/src/commercial/store.d.ts +46 -0
  68. package/dist/src/commercial/store.js +104 -0
  69. package/dist/src/commercial/store.js.map +1 -0
  70. package/dist/src/commercial/stripe/checkout.d.ts +104 -0
  71. package/dist/src/commercial/stripe/checkout.js +469 -0
  72. package/dist/src/commercial/stripe/checkout.js.map +1 -0
  73. package/dist/src/core/compatibility.d.ts +15 -0
  74. package/dist/src/core/compatibility.js +226 -0
  75. package/dist/src/core/compatibility.js.map +1 -0
  76. package/dist/src/core/engine.d.ts +33 -0
  77. package/dist/src/core/engine.js +432 -0
  78. package/dist/src/core/engine.js.map +1 -0
  79. package/dist/src/core/lifecycle.d.ts +17 -0
  80. package/dist/src/core/lifecycle.js +56 -0
  81. package/dist/src/core/lifecycle.js.map +1 -0
  82. package/dist/src/core/types.d.ts +140 -0
  83. package/dist/src/core/types.js +37 -0
  84. package/dist/src/core/types.js.map +1 -0
  85. package/dist/src/destroy.d.ts +21 -0
  86. package/dist/src/destroy.js +219 -0
  87. package/dist/src/destroy.js.map +1 -0
  88. package/dist/src/diff.d.ts +13 -0
  89. package/dist/src/diff.js +251 -0
  90. package/dist/src/diff.js.map +1 -0
  91. package/dist/src/enforcement/detect.d.ts +13 -0
  92. package/dist/src/enforcement/detect.js +75 -0
  93. package/dist/src/enforcement/detect.js.map +1 -0
  94. package/dist/src/enforcement/hook-policy.d.ts +38 -0
  95. package/dist/src/enforcement/hook-policy.js +111 -0
  96. package/dist/src/enforcement/hook-policy.js.map +1 -0
  97. package/dist/src/enforcement/index.d.ts +8 -0
  98. package/dist/src/enforcement/index.js +8 -0
  99. package/dist/src/enforcement/index.js.map +1 -0
  100. package/dist/src/enforcement/perf.d.ts +6 -0
  101. package/dist/src/enforcement/perf.js +18 -0
  102. package/dist/src/enforcement/perf.js.map +1 -0
  103. package/dist/src/enforcement/policy.d.ts +12 -0
  104. package/dist/src/enforcement/policy.js +84 -0
  105. package/dist/src/enforcement/policy.js.map +1 -0
  106. package/dist/src/enforcement/readonly.d.ts +17 -0
  107. package/dist/src/enforcement/readonly.js +124 -0
  108. package/dist/src/enforcement/readonly.js.map +1 -0
  109. package/dist/src/enforcement/sandbox-clone.d.ts +6 -0
  110. package/dist/src/enforcement/sandbox-clone.js +11 -0
  111. package/dist/src/enforcement/sandbox-clone.js.map +1 -0
  112. package/dist/src/enforcement/setup.d.ts +33 -0
  113. package/dist/src/enforcement/setup.js +168 -0
  114. package/dist/src/enforcement/setup.js.map +1 -0
  115. package/dist/src/enforcement/trust.d.ts +10 -0
  116. package/dist/src/enforcement/trust.js +71 -0
  117. package/dist/src/enforcement/trust.js.map +1 -0
  118. package/dist/src/enforcement/types.d.ts +40 -0
  119. package/dist/src/enforcement/types.js +3 -0
  120. package/dist/src/enforcement/types.js.map +1 -0
  121. package/dist/src/entitlement/provider.d.ts +48 -0
  122. package/dist/src/entitlement/provider.js +95 -0
  123. package/dist/src/entitlement/provider.js.map +1 -0
  124. package/dist/src/hash.d.ts +9 -0
  125. package/dist/src/hash.js +23 -0
  126. package/dist/src/hash.js.map +1 -0
  127. package/dist/src/ledger/query.d.ts +19 -0
  128. package/dist/src/ledger/query.js +158 -0
  129. package/dist/src/ledger/query.js.map +1 -0
  130. package/dist/src/manifest.d.ts +32 -0
  131. package/dist/src/manifest.js +242 -0
  132. package/dist/src/manifest.js.map +1 -0
  133. package/dist/src/mcp/server.d.ts +7 -0
  134. package/dist/src/mcp/server.js +364 -0
  135. package/dist/src/mcp/server.js.map +1 -0
  136. package/dist/src/paths.d.ts +94 -0
  137. package/dist/src/paths.js +354 -0
  138. package/dist/src/paths.js.map +1 -0
  139. package/dist/src/permission/engine.d.ts +15 -0
  140. package/dist/src/permission/engine.js +147 -0
  141. package/dist/src/permission/engine.js.map +1 -0
  142. package/dist/src/permission/types.d.ts +42 -0
  143. package/dist/src/permission/types.js +3 -0
  144. package/dist/src/permission/types.js.map +1 -0
  145. package/dist/src/product/setup.d.ts +35 -0
  146. package/dist/src/product/setup.js +300 -0
  147. package/dist/src/product/setup.js.map +1 -0
  148. package/dist/src/protect/audit.d.ts +5 -0
  149. package/dist/src/protect/audit.js +26 -0
  150. package/dist/src/protect/audit.js.map +1 -0
  151. package/dist/src/protect/capture.d.ts +7 -0
  152. package/dist/src/protect/capture.js +250 -0
  153. package/dist/src/protect/capture.js.map +1 -0
  154. package/dist/src/protect/fingerprint.d.ts +4 -0
  155. package/dist/src/protect/fingerprint.js +49 -0
  156. package/dist/src/protect/fingerprint.js.map +1 -0
  157. package/dist/src/protect/hook-cli.d.ts +2 -0
  158. package/dist/src/protect/hook-cli.js +107 -0
  159. package/dist/src/protect/hook-cli.js.map +1 -0
  160. package/dist/src/protect/index.d.ts +12 -0
  161. package/dist/src/protect/index.js +12 -0
  162. package/dist/src/protect/index.js.map +1 -0
  163. package/dist/src/protect/install.d.ts +34 -0
  164. package/dist/src/protect/install.js +293 -0
  165. package/dist/src/protect/install.js.map +1 -0
  166. package/dist/src/protect/intercept.d.ts +11 -0
  167. package/dist/src/protect/intercept.js +390 -0
  168. package/dist/src/protect/intercept.js.map +1 -0
  169. package/dist/src/protect/protect.d.ts +17 -0
  170. package/dist/src/protect/protect.js +194 -0
  171. package/dist/src/protect/protect.js.map +1 -0
  172. package/dist/src/protect/root-paths.d.ts +13 -0
  173. package/dist/src/protect/root-paths.js +140 -0
  174. package/dist/src/protect/root-paths.js.map +1 -0
  175. package/dist/src/protect/shell-policy.d.ts +17 -0
  176. package/dist/src/protect/shell-policy.js +269 -0
  177. package/dist/src/protect/shell-policy.js.map +1 -0
  178. package/dist/src/protect/status.d.ts +11 -0
  179. package/dist/src/protect/status.js +165 -0
  180. package/dist/src/protect/status.js.map +1 -0
  181. package/dist/src/protect/store.d.ts +20 -0
  182. package/dist/src/protect/store.js +170 -0
  183. package/dist/src/protect/store.js.map +1 -0
  184. package/dist/src/protect/types.d.ts +116 -0
  185. package/dist/src/protect/types.js +3 -0
  186. package/dist/src/protect/types.js.map +1 -0
  187. package/dist/src/protect/undo-session.d.ts +14 -0
  188. package/dist/src/protect/undo-session.js +182 -0
  189. package/dist/src/protect/undo-session.js.map +1 -0
  190. package/dist/src/restore.d.ts +39 -0
  191. package/dist/src/restore.js +141 -0
  192. package/dist/src/restore.js.map +1 -0
  193. package/dist/src/sandbox.d.ts +23 -0
  194. package/dist/src/sandbox.js +198 -0
  195. package/dist/src/sandbox.js.map +1 -0
  196. package/dist/src/session/ambient.d.ts +10 -0
  197. package/dist/src/session/ambient.js +53 -0
  198. package/dist/src/session/ambient.js.map +1 -0
  199. package/dist/src/session/attribution.d.ts +27 -0
  200. package/dist/src/session/attribution.js +201 -0
  201. package/dist/src/session/attribution.js.map +1 -0
  202. package/dist/src/session/index.d.ts +25 -0
  203. package/dist/src/session/index.js +472 -0
  204. package/dist/src/session/index.js.map +1 -0
  205. package/dist/src/session/process.d.ts +34 -0
  206. package/dist/src/session/process.js +234 -0
  207. package/dist/src/session/process.js.map +1 -0
  208. package/dist/src/session/store.d.ts +14 -0
  209. package/dist/src/session/store.js +125 -0
  210. package/dist/src/session/store.js.map +1 -0
  211. package/dist/src/session/types.d.ts +111 -0
  212. package/dist/src/session/types.js +3 -0
  213. package/dist/src/session/types.js.map +1 -0
  214. package/dist/src/session/watcher.d.ts +32 -0
  215. package/dist/src/session/watcher.js +186 -0
  216. package/dist/src/session/watcher.js.map +1 -0
  217. package/dist/src/timing.d.ts +7 -0
  218. package/dist/src/timing.js +19 -0
  219. package/dist/src/timing.js.map +1 -0
  220. package/dist/src/types.d.ts +101 -0
  221. package/dist/src/types.js +3 -0
  222. package/dist/src/types.js.map +1 -0
  223. package/dist/src/verify.d.ts +8 -0
  224. package/dist/src/verify.js +126 -0
  225. package/dist/src/verify.js.map +1 -0
  226. package/docs/ADAPTERS.md +37 -0
  227. package/docs/APPROVALS.md +32 -0
  228. package/docs/ARCHITECTURE.md +57 -0
  229. package/docs/ATTRIBUTION.md +179 -0
  230. package/docs/COMMERCIAL.md +51 -0
  231. package/docs/CURSOR-ENFORCEMENT.md +73 -0
  232. package/docs/ENFORCEMENT.md +134 -0
  233. package/docs/FUTURE.md +91 -0
  234. package/docs/HUMAN-SETUP.md +98 -0
  235. package/docs/IDENTITY-AUTHORITY.md +35 -0
  236. package/docs/MCP.md +107 -0
  237. package/docs/PACKAGING.md +77 -0
  238. package/docs/PERMISSIONS.md +53 -0
  239. package/docs/PRODUCT-V5.md +63 -0
  240. package/docs/PRODUCT-V6.md +69 -0
  241. package/docs/PROTECTED-SESSIONS.md +155 -0
  242. package/docs/THREAT-MODEL.md +84 -0
  243. package/docs/TRANSACTIONS.md +57 -0
  244. package/package.json +85 -0
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Product setup / doctor / uninstall / open — user-facing install path.
3
+ */
4
+ import path from "node:path";
5
+ import os from "node:os";
6
+ import { mkdir, writeFile, readFile, rename, access, rm, } from "node:fs/promises";
7
+ import { constants as fsConstants } from "node:fs";
8
+ import { getProjectRoot, getRewindHome, REWIND_DIR_NAME } from "../paths.js";
9
+ import { CursorIntegration, statusAllClients } from "../clients/types.js";
10
+ import { savePolicy, defaultPolicyDocument, loadPolicy } from "../permission/engine.js";
11
+ import { resolveEntitlementProvider } from "../entitlement/provider.js";
12
+ import { loadSession } from "../commercial/auth/provider.js";
13
+ import { listTransactions } from "../ledger/query.js";
14
+ import { listPendingApprovals } from "../approval/store.js";
15
+ import { createSandbox } from "../sandbox.js";
16
+ import { getSandboxPath, SANDBOX_DIR_NAME } from "../paths.js";
17
+ export const PRODUCT_VERSION = "0.6.2";
18
+ async function exists(p) {
19
+ try {
20
+ await access(p, fsConstants.F_OK);
21
+ return true;
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ async function writeJsonAtomic(file, data) {
28
+ await mkdir(path.dirname(file), { recursive: true });
29
+ const tmp = `${file}.tmp-${process.pid}`;
30
+ await writeFile(tmp, JSON.stringify(data, null, 2) + "\n", "utf8");
31
+ await rename(tmp, file);
32
+ }
33
+ export async function loadProjectConfig(projectRoot = getProjectRoot()) {
34
+ try {
35
+ const raw = await readFile(path.join(getRewindHome(projectRoot), "project.json"), "utf8");
36
+ return JSON.parse(raw);
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ export async function runSetup(projectRoot = getProjectRoot(), opts = {}) {
43
+ const lines = [];
44
+ lines.push("REWIND");
45
+ lines.push("");
46
+ const platformOk = process.platform === "darwin" ||
47
+ process.platform === "linux" ||
48
+ process.platform === "win32";
49
+ lines.push(platformOk
50
+ ? `✓ Platform supported (${os.platform()} ${os.arch()}, node ${process.version})`
51
+ : `⚠ Platform ${os.platform()} — best-effort support`);
52
+ lines.push(`✓ Project detected (${projectRoot})`);
53
+ // 1. Init .rewind safely
54
+ const home = getRewindHome(projectRoot);
55
+ await mkdir(home, { recursive: true });
56
+ await mkdir(path.join(home, "actions"), { recursive: true });
57
+ await mkdir(path.join(home, "objects"), { recursive: true });
58
+ await mkdir(path.join(home, "transactions"), { recursive: true });
59
+ await mkdir(path.join(home, "approvals"), { recursive: true });
60
+ await mkdir(path.join(home, "policy"), { recursive: true });
61
+ const cfg = {
62
+ version: 6,
63
+ initializedAt: new Date().toISOString(),
64
+ projectRoot,
65
+ product: "REWIND Personal",
66
+ mediation: "connected",
67
+ notes: [
68
+ "REWIND CONNECTED — mediated actions will be recorded.",
69
+ "Native agent/editor writes outside REWIND are NOT authoritative transactions.",
70
+ ],
71
+ };
72
+ await writeJsonAtomic(path.join(home, "project.json"), cfg);
73
+ // Policy
74
+ try {
75
+ await loadPolicy(projectRoot);
76
+ }
77
+ catch {
78
+ /* */
79
+ }
80
+ const policyFile = path.join(home, "policy", "permissions.json");
81
+ if (!(await exists(policyFile))) {
82
+ await savePolicy(defaultPolicyDocument(), projectRoot);
83
+ }
84
+ // Sandbox for demo (optional)
85
+ if (!opts.skipSandbox) {
86
+ const sandbox = getSandboxPath(projectRoot, SANDBOX_DIR_NAME);
87
+ if (!(await exists(sandbox))) {
88
+ await createSandbox(projectRoot);
89
+ }
90
+ }
91
+ // MCP / Cursor
92
+ if (!opts.skipMcp) {
93
+ const cursor = new CursorIntegration();
94
+ const detected = await cursor.detect();
95
+ if (detected) {
96
+ lines.push("✓ Cursor detected");
97
+ const { path: mcpPath } = await cursor.install(projectRoot);
98
+ const v = await cursor.validate(projectRoot);
99
+ if (v.ok) {
100
+ lines.push(`✓ REWIND MCP configuration installed (${mcpPath})`);
101
+ }
102
+ else {
103
+ lines.push(`✗ MCP config: ${v.message}`);
104
+ }
105
+ }
106
+ else {
107
+ lines.push("⚠ Cursor not detected — install Cursor, then re-run: rewind setup");
108
+ }
109
+ }
110
+ lines.push("✓ Project initialized");
111
+ lines.push("✓ Local service available (rewind open / rewind api)");
112
+ const session = await loadSession();
113
+ if (session) {
114
+ lines.push(`✓ Signed in as ${session.email}`);
115
+ }
116
+ else {
117
+ lines.push("○ Not signed in — optional: rewind login");
118
+ }
119
+ const ent = await (await resolveEntitlementProvider()).check();
120
+ lines.push(`○ Entitlement: ${ent.label}`);
121
+ lines.push("");
122
+ lines.push("REWIND CONNECTED");
123
+ lines.push("");
124
+ lines.push("Mediated actions through REWIND can now be recorded as transactions.");
125
+ lines.push("");
126
+ lines.push("Honesty:");
127
+ lines.push(" Cursor can still perform native writes outside REWIND mediation.");
128
+ lines.push(" Only mediated MCP/CLI actions receive authoritative REWIND transactions.");
129
+ lines.push("");
130
+ lines.push("Next:");
131
+ lines.push(" 1. Restart Cursor / reload MCP");
132
+ lines.push(" 2. Ask your agent to create a test file via REWIND tools");
133
+ lines.push(" 3. rewind transactions");
134
+ lines.push(" 4. rewind undo <id>");
135
+ lines.push(" 5. rewind open — view Activity");
136
+ return lines.join("\n");
137
+ }
138
+ export async function runDoctor(projectRoot = getProjectRoot()) {
139
+ const checks = [];
140
+ checks.push({
141
+ id: "version",
142
+ status: "PASS",
143
+ title: "Installation version",
144
+ detail: `REWIND ${PRODUCT_VERSION}`,
145
+ });
146
+ checks.push({
147
+ id: "platform",
148
+ status: "PASS",
149
+ title: "Platform",
150
+ detail: `${os.platform()} ${os.arch()} node ${process.version}`,
151
+ });
152
+ const home = getRewindHome(projectRoot);
153
+ const cfg = await loadProjectConfig(projectRoot);
154
+ checks.push({
155
+ id: "project",
156
+ status: cfg ? "PASS" : "WARN",
157
+ title: "Project initialization",
158
+ detail: cfg
159
+ ? `Initialized at ${cfg.initializedAt}`
160
+ : `No ${REWIND_DIR_NAME}/project.json — run: rewind setup`,
161
+ });
162
+ checks.push({
163
+ id: "storage",
164
+ status: (await exists(home)) ? "PASS" : "FAIL",
165
+ title: "Storage (.rewind)",
166
+ detail: home,
167
+ });
168
+ try {
169
+ await loadPolicy(projectRoot);
170
+ checks.push({
171
+ id: "policy",
172
+ status: "PASS",
173
+ title: "Permission policy",
174
+ detail: "Readable",
175
+ });
176
+ }
177
+ catch (err) {
178
+ checks.push({
179
+ id: "policy",
180
+ status: "FAIL",
181
+ title: "Permission policy",
182
+ detail: String(err),
183
+ });
184
+ }
185
+ const txns = await listTransactions(projectRoot);
186
+ checks.push({
187
+ id: "ledger",
188
+ status: "PASS",
189
+ title: "Transaction store",
190
+ detail: `${txns.length} transaction(s)`,
191
+ });
192
+ const pending = await listPendingApprovals(projectRoot);
193
+ checks.push({
194
+ id: "approvals",
195
+ status: "PASS",
196
+ title: "Approvals",
197
+ detail: `${pending.length} pending`,
198
+ });
199
+ const clients = await statusAllClients(projectRoot);
200
+ for (const c of clients.filter((x) => x.supported || x.detected)) {
201
+ checks.push({
202
+ id: `client-${c.id}`,
203
+ status: c.status === "configured" || c.status === "connected" ? "PASS" : c.detected ? "WARN" : "WARN",
204
+ title: c.displayName,
205
+ detail: c.message,
206
+ });
207
+ }
208
+ checks.push({
209
+ id: "bypass",
210
+ status: "WARN",
211
+ title: "Native write bypass",
212
+ detail: "Cursor can still perform native writes outside REWIND mediation. " +
213
+ "Only mediated actions receive authoritative REWIND transactions.",
214
+ });
215
+ const session = await loadSession();
216
+ checks.push({
217
+ id: "auth",
218
+ status: session ? "PASS" : "WARN",
219
+ title: "Account",
220
+ detail: session ? `Signed in as ${session.email}` : "Not signed in — rewind login",
221
+ });
222
+ const ent = await (await resolveEntitlementProvider()).check();
223
+ checks.push({
224
+ id: "entitlement",
225
+ status: ent.allowMediatedMutations ? "PASS" : "WARN",
226
+ title: "Entitlement",
227
+ detail: `${ent.label} (undo existing: always allowed)`,
228
+ });
229
+ checks.push({
230
+ id: "api",
231
+ status: "PASS",
232
+ title: "Local API",
233
+ detail: "Start with: rewind open (binds 127.0.0.1 only)",
234
+ });
235
+ const mcpSmoke = await smokeMcpStart(projectRoot);
236
+ checks.push(mcpSmoke);
237
+ const lines = ["REWIND DOCTOR", ""];
238
+ for (const c of checks) {
239
+ lines.push(`${c.status.padEnd(4)} ${c.title}`);
240
+ lines.push(` ${c.detail}`);
241
+ lines.push("");
242
+ }
243
+ const fails = checks.filter((c) => c.status === "FAIL").length;
244
+ const warns = checks.filter((c) => c.status === "WARN").length;
245
+ lines.push(`Summary: ${checks.length} checks — ${fails} FAIL, ${warns} WARN`);
246
+ return { checks, text: lines.join("\n") };
247
+ }
248
+ async function smokeMcpStart(projectRoot) {
249
+ try {
250
+ const { createRewindMcpServer } = await import("../mcp/server.js");
251
+ const server = await createRewindMcpServer(projectRoot);
252
+ // Just constructing is enough smoke; don't connect stdio
253
+ void server;
254
+ return {
255
+ id: "mcp-server",
256
+ status: "PASS",
257
+ title: "MCP server",
258
+ detail: "Server module loads and initializes",
259
+ };
260
+ }
261
+ catch (err) {
262
+ return {
263
+ id: "mcp-server",
264
+ status: "FAIL",
265
+ title: "MCP server",
266
+ detail: err instanceof Error ? err.message : String(err),
267
+ };
268
+ }
269
+ }
270
+ export async function runUninstall(opts = {}) {
271
+ const projectRoot = opts.projectRoot ?? getProjectRoot();
272
+ const lines = ["REWIND UNINSTALL", ""];
273
+ if (opts.removeMcp !== false) {
274
+ const cursor = new CursorIntegration();
275
+ const r = await cursor.remove(projectRoot);
276
+ lines.push(r.removed
277
+ ? `✓ Removed REWIND MCP entry from ${r.path}`
278
+ : `○ No REWIND MCP entry to remove`);
279
+ }
280
+ if (opts.deleteRecoveryData === true) {
281
+ const home = getRewindHome(projectRoot);
282
+ await rm(home, { recursive: true, force: true });
283
+ lines.push(`✓ Deleted recovery data at ${home}`);
284
+ lines.push(" (transactions, CAS objects, policies removed)");
285
+ }
286
+ else {
287
+ lines.push("○ Recovery data PRESERVED");
288
+ lines.push(` Location: ${getRewindHome(projectRoot)}`);
289
+ lines.push(" To destroy recovery data, re-run with: --delete-recovery-data");
290
+ lines.push(" REWIND will never silently delete your undo history.");
291
+ }
292
+ lines.push("");
293
+ lines.push("Application removal: uninstall the npm package / binary separately:");
294
+ lines.push(" npm uninstall -g @rewind-ai/cli");
295
+ return lines.join("\n");
296
+ }
297
+ export function versionText() {
298
+ return `REWIND ${PRODUCT_VERSION}\nUndo for AI agents.\nREWIND Personal — £2.99/month (list price; billing via Stripe when configured).\n`;
299
+ }
300
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/product/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AuditEvent } from "./types.js";
2
+ export declare function appendAuditEvent(event: Omit<AuditEvent, "time"> & {
3
+ time?: string;
4
+ }, projectRoot: string): Promise<AuditEvent>;
5
+ export declare function readAuditEvents(projectRoot: string): Promise<AuditEvent[]>;
@@ -0,0 +1,26 @@
1
+ import path from "node:path";
2
+ import { mkdir, appendFile, readFile } from "node:fs/promises";
3
+ import { getProtectAuditDir } from "./root-paths.js";
4
+ export async function appendAuditEvent(event, projectRoot) {
5
+ const full = {
6
+ ...event,
7
+ time: event.time ?? new Date().toISOString(),
8
+ };
9
+ const dir = getProtectAuditDir(projectRoot);
10
+ await mkdir(dir, { recursive: true });
11
+ await appendFile(path.join(dir, "events.jsonl"), JSON.stringify(full) + "\n", "utf8");
12
+ return full;
13
+ }
14
+ export async function readAuditEvents(projectRoot) {
15
+ try {
16
+ const raw = await readFile(path.join(getProtectAuditDir(projectRoot), "events.jsonl"), "utf8");
17
+ return raw
18
+ .split("\n")
19
+ .filter((l) => l.trim())
20
+ .map((l) => JSON.parse(l));
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ }
26
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/protect/audit.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGrD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAmD,EACnD,WAAmB;IAEnB,MAAM,IAAI,GAAG;QACX,GAAG,KAAK;QACR,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC/B,CAAC;IAChB,MAAM,GAAG,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,UAAU,CACd,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,EAC3B,MAAM,CACP,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CACxB,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC,EAC1D,MAAM,CACP,CAAC;QACF,OAAO,GAAG;aACP,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAe,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { EntrySnapshot } from "../action/types.js";
2
+ export declare function snapshotIdentityHash(snap: EntrySnapshot): string | null;
3
+ export declare function captureProtectedEntry(rel: string, projectRoot: string, options?: {
4
+ storeContent?: boolean;
5
+ captureSubtree?: boolean;
6
+ }): Promise<EntrySnapshot>;
7
+ export declare function restoreProtectedSnapshot(rel: string, snap: EntrySnapshot, projectRoot: string): Promise<void>;
@@ -0,0 +1,250 @@
1
+ import path from "node:path";
2
+ import { lstat, readFile, readlink, readdir, mkdir, writeFile, rm, rename, chmod, symlink, } from "node:fs/promises";
3
+ import { sha256 } from "../hash.js";
4
+ import { assertProtectedNoSymlinkEscape, protectedAbs, } from "./root-paths.js";
5
+ import { PathSafetyError } from "../paths.js";
6
+ function modeOf(m) {
7
+ return m & 0o7777;
8
+ }
9
+ async function storeProtectObject(data, projectRoot) {
10
+ const hash = sha256(data);
11
+ const dest = path.join(projectRoot, ".rewind", "objects", hash.slice(0, 2), hash);
12
+ await mkdir(path.dirname(dest), { recursive: true });
13
+ try {
14
+ await lstat(dest);
15
+ return hash;
16
+ }
17
+ catch {
18
+ /* create */
19
+ }
20
+ const tmp = `${dest}.tmp-${process.pid}-${Date.now()}`;
21
+ await writeFile(tmp, data);
22
+ try {
23
+ await rename(tmp, dest);
24
+ }
25
+ catch (err) {
26
+ await rm(tmp, { force: true }).catch(() => undefined);
27
+ try {
28
+ await lstat(dest);
29
+ return hash;
30
+ }
31
+ catch {
32
+ throw err;
33
+ }
34
+ }
35
+ return hash;
36
+ }
37
+ async function readProtectObject(hash, projectRoot) {
38
+ return readFile(path.join(projectRoot, ".rewind", "objects", hash.slice(0, 2), hash));
39
+ }
40
+ export function snapshotIdentityHash(snap) {
41
+ if (!snap.exists)
42
+ return "ABSENT";
43
+ if (snap.kind === "directory") {
44
+ if (snap.subtree) {
45
+ return sha256(JSON.stringify(snap.subtree.map((e) => ({
46
+ path: e.path,
47
+ kind: e.kind,
48
+ hash: e.hash,
49
+ mode: e.mode,
50
+ linkTarget: e.linkTarget,
51
+ }))));
52
+ }
53
+ return `DIR:${snap.mode ?? 0}:${snap.hash ?? ""}:${snap.size}`;
54
+ }
55
+ return snap.hash;
56
+ }
57
+ export async function captureProtectedEntry(rel, projectRoot, options = {}) {
58
+ const abs = protectedAbs(rel, projectRoot);
59
+ await assertProtectedNoSymlinkEscape(abs, projectRoot).catch(() => undefined);
60
+ let st;
61
+ try {
62
+ st = await lstat(abs);
63
+ }
64
+ catch {
65
+ return {
66
+ exists: false,
67
+ kind: "absent",
68
+ hash: null,
69
+ size: 0,
70
+ mode: null,
71
+ linkTarget: null,
72
+ objectId: null,
73
+ };
74
+ }
75
+ if (st.isSymbolicLink()) {
76
+ const linkTarget = await readlink(abs);
77
+ return {
78
+ exists: true,
79
+ kind: "symlink",
80
+ hash: sha256(linkTarget),
81
+ size: Buffer.byteLength(linkTarget),
82
+ mode: modeOf(st.mode),
83
+ linkTarget,
84
+ objectId: null,
85
+ };
86
+ }
87
+ if (st.isDirectory()) {
88
+ const kids = await readdir(abs);
89
+ kids.sort((a, b) => a.localeCompare(b));
90
+ const listingHash = sha256(kids.join("\n"));
91
+ const snap = {
92
+ exists: true,
93
+ kind: "directory",
94
+ hash: listingHash,
95
+ size: kids.length,
96
+ mode: modeOf(st.mode),
97
+ linkTarget: null,
98
+ objectId: null,
99
+ };
100
+ if (options.captureSubtree) {
101
+ snap.subtree = await captureSubtree(rel, projectRoot);
102
+ snap.hash = snapshotIdentityHash({ ...snap, subtree: snap.subtree });
103
+ }
104
+ return snap;
105
+ }
106
+ if (st.isFile()) {
107
+ const data = await readFile(abs);
108
+ const hash = sha256(data);
109
+ let objectId = null;
110
+ if (options.storeContent !== false) {
111
+ objectId = await storeProtectObject(data, projectRoot);
112
+ }
113
+ return {
114
+ exists: true,
115
+ kind: "file",
116
+ hash,
117
+ size: data.length,
118
+ mode: modeOf(st.mode),
119
+ linkTarget: null,
120
+ objectId,
121
+ };
122
+ }
123
+ throw new PathSafetyError(`Unsupported entry type at ${rel}`);
124
+ }
125
+ async function captureSubtree(rootRel, projectRoot) {
126
+ const out = [];
127
+ async function walk(rel) {
128
+ const abs = protectedAbs(rel, projectRoot);
129
+ await assertProtectedNoSymlinkEscape(abs, projectRoot);
130
+ const st = await lstat(abs);
131
+ if (st.isSymbolicLink()) {
132
+ const linkTarget = await readlink(abs);
133
+ out.push({
134
+ path: rel,
135
+ kind: "symlink",
136
+ hash: sha256(linkTarget),
137
+ size: Buffer.byteLength(linkTarget),
138
+ mode: modeOf(st.mode),
139
+ linkTarget,
140
+ objectId: null,
141
+ });
142
+ return;
143
+ }
144
+ if (st.isDirectory()) {
145
+ out.push({
146
+ path: rel,
147
+ kind: "directory",
148
+ hash: null,
149
+ size: 0,
150
+ mode: modeOf(st.mode),
151
+ linkTarget: null,
152
+ objectId: null,
153
+ });
154
+ const kids = await readdir(abs);
155
+ kids.sort((a, b) => a.localeCompare(b));
156
+ for (const name of kids) {
157
+ const childRel = rel === "" || rel === "." ? name : `${rel}/${name}`;
158
+ await walk(childRel);
159
+ }
160
+ return;
161
+ }
162
+ if (st.isFile()) {
163
+ const data = await readFile(abs);
164
+ const objectId = await storeProtectObject(data, projectRoot);
165
+ out.push({
166
+ path: rel,
167
+ kind: "file",
168
+ hash: sha256(data),
169
+ size: data.length,
170
+ mode: modeOf(st.mode),
171
+ linkTarget: null,
172
+ objectId,
173
+ });
174
+ }
175
+ }
176
+ await walk(rootRel);
177
+ out.sort((a, b) => a.path.localeCompare(b.path));
178
+ return out;
179
+ }
180
+ async function ensureParent(abs, projectRoot) {
181
+ const parent = path.dirname(abs);
182
+ if (!isPathInsideSafe(projectRoot, parent) && parent !== path.resolve(projectRoot)) {
183
+ throw new PathSafetyError(`Parent escapes protected root: ${parent}`);
184
+ }
185
+ await mkdir(parent, { recursive: true });
186
+ }
187
+ function isPathInsideSafe(root, candidate) {
188
+ const rootNorm = path.resolve(root);
189
+ const candNorm = path.resolve(candidate);
190
+ if (candNorm === rootNorm)
191
+ return true;
192
+ const prefix = rootNorm.endsWith(path.sep) ? rootNorm : rootNorm + path.sep;
193
+ return candNorm.startsWith(prefix);
194
+ }
195
+ export async function restoreProtectedSnapshot(rel, snap, projectRoot) {
196
+ const abs = protectedAbs(rel, projectRoot);
197
+ await assertProtectedNoSymlinkEscape(abs, projectRoot).catch(() => undefined);
198
+ if (!snap.exists) {
199
+ await rm(abs, { recursive: true, force: true });
200
+ return;
201
+ }
202
+ if (snap.kind === "file") {
203
+ if (!snap.objectId) {
204
+ throw new PathSafetyError(`Cannot restore file without objectId: ${rel}`);
205
+ }
206
+ const data = await readProtectObject(snap.objectId, projectRoot);
207
+ await ensureParent(abs, projectRoot);
208
+ const tmp = `${abs}.rewind-protect-tmp-${process.pid}`;
209
+ await writeFile(tmp, data, { mode: snap.mode ?? 0o644 });
210
+ await rename(tmp, abs);
211
+ if (snap.mode != null)
212
+ await chmod(abs, snap.mode);
213
+ return;
214
+ }
215
+ if (snap.kind === "symlink") {
216
+ await ensureParent(abs, projectRoot);
217
+ await rm(abs, { force: true }).catch(() => undefined);
218
+ await symlink(snap.linkTarget ?? "", abs);
219
+ return;
220
+ }
221
+ if (snap.kind === "directory") {
222
+ await ensureParent(abs, projectRoot);
223
+ await mkdir(abs, { recursive: true });
224
+ if (snap.mode != null)
225
+ await chmod(abs, snap.mode);
226
+ if (snap.subtree) {
227
+ // Remove unexpected children then restore subtree
228
+ await rm(abs, { recursive: true, force: true });
229
+ for (const e of snap.subtree) {
230
+ const childAbs = protectedAbs(e.path, projectRoot);
231
+ if (e.kind === "directory") {
232
+ await mkdir(childAbs, { recursive: true });
233
+ await chmod(childAbs, e.mode);
234
+ }
235
+ else if (e.kind === "file") {
236
+ if (!e.objectId)
237
+ continue;
238
+ const data = await readProtectObject(e.objectId, projectRoot);
239
+ await ensureParent(childAbs, projectRoot);
240
+ await writeFile(childAbs, data, { mode: e.mode });
241
+ }
242
+ else if (e.kind === "symlink") {
243
+ await ensureParent(childAbs, projectRoot);
244
+ await symlink(e.linkTarget ?? "", childAbs);
245
+ }
246
+ }
247
+ }
248
+ }
249
+ }
250
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../src/protect/capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Deterministic fingerprint of protected project file contents (excludes .rewind/.cursor).
3
+ */
4
+ export declare function fingerprintProject(projectRoot: string): Promise<string>;