cohvu 2.21.0 → 3.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.
Files changed (102) hide show
  1. package/README.md +37 -0
  2. package/cli.js +15501 -0
  3. package/package.json +15 -26
  4. package/dist/__tests__/instruction-file.unit.test.d.ts +0 -1
  5. package/dist/__tests__/instruction-file.unit.test.js +0 -296
  6. package/dist/__tests__/instruction-file.unit.test.js.map +0 -1
  7. package/dist/__tests__/teardown.unit.test.d.ts +0 -1
  8. package/dist/__tests__/teardown.unit.test.js +0 -196
  9. package/dist/__tests__/teardown.unit.test.js.map +0 -1
  10. package/dist/api.d.ts +0 -292
  11. package/dist/api.js +0 -337
  12. package/dist/api.js.map +0 -1
  13. package/dist/auth.d.ts +0 -4
  14. package/dist/auth.js +0 -96
  15. package/dist/auth.js.map +0 -1
  16. package/dist/constants.d.ts +0 -2
  17. package/dist/constants.js +0 -10
  18. package/dist/constants.js.map +0 -1
  19. package/dist/index.d.ts +0 -2
  20. package/dist/index.js +0 -259
  21. package/dist/index.js.map +0 -1
  22. package/dist/instructions.d.ts +0 -33
  23. package/dist/instructions.js +0 -238
  24. package/dist/instructions.js.map +0 -1
  25. package/dist/log.d.ts +0 -6
  26. package/dist/log.js +0 -51
  27. package/dist/log.js.map +0 -1
  28. package/dist/pause.d.ts +0 -3
  29. package/dist/pause.js +0 -24
  30. package/dist/pause.js.map +0 -1
  31. package/dist/platforms.d.ts +0 -22
  32. package/dist/platforms.js +0 -79
  33. package/dist/platforms.js.map +0 -1
  34. package/dist/postinstall.d.ts +0 -2
  35. package/dist/postinstall.js +0 -11
  36. package/dist/postinstall.js.map +0 -1
  37. package/dist/proxy.d.ts +0 -1
  38. package/dist/proxy.js +0 -371
  39. package/dist/proxy.js.map +0 -1
  40. package/dist/setup.d.ts +0 -15
  41. package/dist/setup.js +0 -295
  42. package/dist/setup.js.map +0 -1
  43. package/dist/teardown.d.ts +0 -15
  44. package/dist/teardown.js +0 -235
  45. package/dist/teardown.js.map +0 -1
  46. package/dist/tui/App.d.ts +0 -1
  47. package/dist/tui/App.js +0 -2245
  48. package/dist/tui/App.js.map +0 -1
  49. package/dist/tui/components/Banner.d.ts +0 -4
  50. package/dist/tui/components/Banner.js +0 -71
  51. package/dist/tui/components/Banner.js.map +0 -1
  52. package/dist/tui/components/Divider.d.ts +0 -1
  53. package/dist/tui/components/Divider.js +0 -8
  54. package/dist/tui/components/Divider.js.map +0 -1
  55. package/dist/tui/components/Footer.d.ts +0 -4
  56. package/dist/tui/components/Footer.js +0 -183
  57. package/dist/tui/components/Footer.js.map +0 -1
  58. package/dist/tui/components/Header.d.ts +0 -4
  59. package/dist/tui/components/Header.js +0 -126
  60. package/dist/tui/components/Header.js.map +0 -1
  61. package/dist/tui/components/LockCard.d.ts +0 -17
  62. package/dist/tui/components/LockCard.js +0 -37
  63. package/dist/tui/components/LockCard.js.map +0 -1
  64. package/dist/tui/components/Modal.d.ts +0 -5
  65. package/dist/tui/components/Modal.js +0 -195
  66. package/dist/tui/components/Modal.js.map +0 -1
  67. package/dist/tui/components/TabBar.d.ts +0 -4
  68. package/dist/tui/components/TabBar.js +0 -17
  69. package/dist/tui/components/TabBar.js.map +0 -1
  70. package/dist/tui/components/Toast.d.ts +0 -4
  71. package/dist/tui/components/Toast.js +0 -9
  72. package/dist/tui/components/Toast.js.map +0 -1
  73. package/dist/tui/index.d.ts +0 -1
  74. package/dist/tui/index.js +0 -20
  75. package/dist/tui/index.js.map +0 -1
  76. package/dist/tui/platform-detect.d.ts +0 -2
  77. package/dist/tui/platform-detect.js +0 -79
  78. package/dist/tui/platform-detect.js.map +0 -1
  79. package/dist/tui/state.d.ts +0 -414
  80. package/dist/tui/state.js +0 -397
  81. package/dist/tui/state.js.map +0 -1
  82. package/dist/tui/tabs/BillingTab.d.ts +0 -5
  83. package/dist/tui/tabs/BillingTab.js +0 -72
  84. package/dist/tui/tabs/BillingTab.js.map +0 -1
  85. package/dist/tui/tabs/KeysTab.d.ts +0 -5
  86. package/dist/tui/tabs/KeysTab.js +0 -92
  87. package/dist/tui/tabs/KeysTab.js.map +0 -1
  88. package/dist/tui/tabs/KnowledgeTab.d.ts +0 -5
  89. package/dist/tui/tabs/KnowledgeTab.js +0 -143
  90. package/dist/tui/tabs/KnowledgeTab.js.map +0 -1
  91. package/dist/tui/tabs/ProjectTab.d.ts +0 -5
  92. package/dist/tui/tabs/ProjectTab.js +0 -34
  93. package/dist/tui/tabs/ProjectTab.js.map +0 -1
  94. package/dist/tui/tabs/TeamTab.d.ts +0 -5
  95. package/dist/tui/tabs/TeamTab.js +0 -57
  96. package/dist/tui/tabs/TeamTab.js.map +0 -1
  97. package/dist/tui/tabs/YouTab.d.ts +0 -5
  98. package/dist/tui/tabs/YouTab.js +0 -25
  99. package/dist/tui/tabs/YouTab.js.map +0 -1
  100. package/dist/tui/utils.d.ts +0 -6
  101. package/dist/tui/utils.js +0 -58
  102. package/dist/tui/utils.js.map +0 -1
package/package.json CHANGED
@@ -1,40 +1,29 @@
1
1
  {
2
2
  "name": "cohvu",
3
- "version": "2.21.0",
4
- "description": "Cohvucontinuous understanding for AI-native development",
3
+ "version": "3.0.0",
4
+ "description": "The cohvu CLI connect your AI coding agents to the Cohvu substrate of project understanding.",
5
5
  "bin": {
6
- "cohvu": "dist/index.js"
7
- },
8
- "scripts": {
9
- "build": "tsc",
10
- "typecheck": "tsc --noEmit",
11
- "postinstall": "node dist/postinstall.js",
12
- "prepublishOnly": "npm run build"
6
+ "cohvu": "./cli.js"
13
7
  },
14
8
  "engines": {
15
9
  "node": ">=20.0.0"
16
10
  },
17
- "dependencies": {
18
- "@modelcontextprotocol/sdk": "^1.27.1",
19
- "chalk": "^5.6.2",
20
- "figures": "^6.1.0",
21
- "ink": "^6.8.0",
22
- "ora": "^9.3.0",
23
- "react": "^19.2.4"
24
- },
25
- "devDependencies": {
26
- "@types/react": "^19.2.14",
27
- "typescript": "^5.9.3"
11
+ "homepage": "https://cohvu.com",
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/cohvu/cohvu.git"
28
15
  },
16
+ "license": "MIT",
29
17
  "files": [
30
- "dist"
18
+ "cli.js",
19
+ "README.md"
31
20
  ],
32
21
  "keywords": [
33
- "mcp",
22
+ "cohvu",
34
23
  "ai",
35
24
  "agents",
36
- "knowledge"
37
- ],
38
- "type": "module",
39
- "license": "MIT"
25
+ "claude-code",
26
+ "mcp",
27
+ "substrate"
28
+ ]
40
29
  }
@@ -1 +0,0 @@
1
- export {};
@@ -1,296 +0,0 @@
1
- // Covers every way a user's instruction file (CLAUDE.md, AGENTS.md, etc.)
2
- // can be mangled and verifies that setup + teardown land it in a sane state.
3
- // All three go through the same stripCohvuMarkers primitive, so the matrix
4
- // of cases really tests one function's behavior end-to-end.
5
- //
6
- // Invariants the tests enforce:
7
- // 1. User content outside cohvu markers is never altered (other than
8
- // runs of 3+ blank lines collapsing to 2).
9
- // 2. Setup converges to exactly one current cohvu block at the end.
10
- // 3. Teardown removes every cohvu trace (paired blocks, duplicates, and
11
- // orphan markers).
12
- // 4. Running setup twice is idempotent — the second run skips.
13
- // 5. Setup-then-teardown leaves the file exactly as the user had it,
14
- // minus cohvu content.
15
- import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync } from "fs";
16
- import { join } from "path";
17
- import { tmpdir } from "os";
18
- import { writeMarkdownInstructions, removeMarkdownInstructions, MARKER_START, MARKER_END, markedSection, } from "../instructions.js";
19
- const TEST_DIR = join(tmpdir(), `cohvu-instruction-file-test-${process.pid}`);
20
- beforeAll(() => {
21
- mkdirSync(TEST_DIR, { recursive: true });
22
- });
23
- afterAll(() => {
24
- rmSync(TEST_DIR, { recursive: true, force: true });
25
- });
26
- let fileCounter = 0;
27
- function makeFile(content) {
28
- const filePath = join(TEST_DIR, `file-${++fileCounter}.md`);
29
- if (content !== undefined)
30
- writeFileSync(filePath, content);
31
- return filePath;
32
- }
33
- function read(filePath) {
34
- return readFileSync(filePath, "utf-8");
35
- }
36
- // A fresh, well-formed cohvu block with whatever markedSection() would
37
- // have written. Tests compare against this to catch drift in the section
38
- // content itself.
39
- const BLOCK = markedSection();
40
- // ---------------------------------------------------------------------------
41
- // setup — writeMarkdownInstructions
42
- // ---------------------------------------------------------------------------
43
- describe("setup — instruction file writer", () => {
44
- it("creates the file with a single block when it doesn't exist", () => {
45
- const filePath = join(TEST_DIR, `new-${++fileCounter}.md`);
46
- expect(existsSync(filePath)).toBe(false);
47
- const result = writeMarkdownInstructions(filePath);
48
- expect(result).toBe("ok");
49
- const final = read(filePath);
50
- expect(final).toBe(BLOCK + "\n");
51
- });
52
- it("appends a block when the file has no cohvu content", () => {
53
- const original = "# My notes\n\nCustom stuff.\nTests go in __tests__/.\n";
54
- const filePath = makeFile(original);
55
- const result = writeMarkdownInstructions(filePath);
56
- expect(result).toBe("ok");
57
- const final = read(filePath);
58
- expect(final).toBe("# My notes\n\nCustom stuff.\nTests go in __tests__/.\n\n" + BLOCK + "\n");
59
- // User content preserved verbatim
60
- expect(final).toContain("# My notes");
61
- expect(final).toContain("Tests go in __tests__/.");
62
- });
63
- it("skips when the current block is already present at the end (idempotent)", () => {
64
- const original = "# My notes\n\nCustom stuff.\n\n" + BLOCK + "\n";
65
- const filePath = makeFile(original);
66
- const result = writeMarkdownInstructions(filePath);
67
- expect(result).toBe("skipped");
68
- expect(read(filePath)).toBe(original);
69
- });
70
- it("replaces an old block in place when instructions have changed", () => {
71
- const oldBlock = `${MARKER_START}\n# Cohvu\n\nOLD STALE INSTRUCTIONS\n${MARKER_END}`;
72
- const original = "# My notes\n\n" + oldBlock + "\n";
73
- const filePath = makeFile(original);
74
- const result = writeMarkdownInstructions(filePath);
75
- expect(result).toBe("ok");
76
- const final = read(filePath);
77
- expect(final).not.toContain("OLD STALE INSTRUCTIONS");
78
- expect(final).toContain(BLOCK);
79
- // Exactly one start marker and one end marker after replacement
80
- expect((final.match(new RegExp(escapeForRegex(MARKER_START), "g")) ?? []).length).toBe(1);
81
- expect((final.match(new RegExp(escapeForRegex(MARKER_END), "g")) ?? []).length).toBe(1);
82
- });
83
- it("collapses duplicate blocks into one", () => {
84
- const stale = `${MARKER_START}\n# Cohvu\n\nFIRST STALE\n${MARKER_END}`;
85
- const stale2 = `${MARKER_START}\n# Cohvu\n\nSECOND STALE\n${MARKER_END}`;
86
- const original = "# Notes\n\n" + stale + "\n\nsome user text\n\n" + stale2 + "\n";
87
- const filePath = makeFile(original);
88
- const result = writeMarkdownInstructions(filePath);
89
- expect(result).toBe("ok");
90
- const final = read(filePath);
91
- expect(final).not.toContain("FIRST STALE");
92
- expect(final).not.toContain("SECOND STALE");
93
- // User text between the duplicates is preserved
94
- expect(final).toContain("some user text");
95
- // Exactly one pair remains
96
- expect((final.match(new RegExp(escapeForRegex(MARKER_START), "g")) ?? []).length).toBe(1);
97
- expect((final.match(new RegExp(escapeForRegex(MARKER_END), "g")) ?? []).length).toBe(1);
98
- });
99
- it("strips an orphan start marker and appends a fresh block", () => {
100
- const original = `# Notes\n\n${MARKER_START}\nhand-edited: end marker was deleted\n\n## A section I care about\n`;
101
- const filePath = makeFile(original);
102
- const result = writeMarkdownInstructions(filePath);
103
- expect(result).toBe("ok");
104
- const final = read(filePath);
105
- expect(final).not.toContain(`${MARKER_START}\nhand-edited`); // orphan start line gone
106
- expect(final).toContain("hand-edited: end marker was deleted"); // surrounding content kept (can't id it as ours)
107
- expect(final).toContain("## A section I care about");
108
- expect(final.endsWith(BLOCK + "\n")).toBe(true);
109
- // Exactly one pair after run
110
- expect((final.match(new RegExp(escapeForRegex(MARKER_START), "g")) ?? []).length).toBe(1);
111
- expect((final.match(new RegExp(escapeForRegex(MARKER_END), "g")) ?? []).length).toBe(1);
112
- });
113
- it("strips an orphan end marker and appends a fresh block", () => {
114
- const original = `# Notes\n\nsomething cohvu-ish\n${MARKER_END}\n\n## User section\n`;
115
- const filePath = makeFile(original);
116
- const result = writeMarkdownInstructions(filePath);
117
- expect(result).toBe("ok");
118
- const final = read(filePath);
119
- expect(final).not.toMatch(new RegExp(`something cohvu-ish\\n${escapeForRegex(MARKER_END)}`));
120
- expect(final).toContain("## User section");
121
- expect(final.endsWith(BLOCK + "\n")).toBe(true);
122
- });
123
- it("recovers from markers in the wrong order (end before start)", () => {
124
- // User hand-edited and ended up with the end marker above the start.
125
- // Old splice math would have duplicated content and left garbage.
126
- const original = `# Notes\n\nstray content above\n${MARKER_END}\n\nmiddle user text\n\n${MARKER_START}\n# Cohvu\n\nOLD\n${MARKER_END}\n`;
127
- const filePath = makeFile(original);
128
- const result = writeMarkdownInstructions(filePath);
129
- expect(result).toBe("ok");
130
- const final = read(filePath);
131
- expect(final).not.toContain("OLD");
132
- expect(final).toContain("stray content above");
133
- expect(final).toContain("middle user text");
134
- // Exactly one fresh pair, at the end
135
- expect((final.match(new RegExp(escapeForRegex(MARKER_START), "g")) ?? []).length).toBe(1);
136
- expect((final.match(new RegExp(escapeForRegex(MARKER_END), "g")) ?? []).length).toBe(1);
137
- expect(final.endsWith(BLOCK + "\n")).toBe(true);
138
- });
139
- it("leaves unmarked cohvu-looking text alone (can't distinguish without markers)", () => {
140
- // User deleted BOTH markers, left the old cohvu text as-is. We have no
141
- // way to identify it as ours, so it stays as user content.
142
- const original = `# Notes\n\n# Cohvu\n\nLooks like old cohvu text without any markers.\nUse understand before starting work.\n\n## User section\n`;
143
- const filePath = makeFile(original);
144
- const result = writeMarkdownInstructions(filePath);
145
- expect(result).toBe("ok");
146
- const final = read(filePath);
147
- // The orphaned cohvu text remains — we can't detect it without markers
148
- expect(final).toContain("Looks like old cohvu text without any markers.");
149
- expect(final).toContain("Use understand before starting work.");
150
- // Fresh block appended at the end
151
- expect(final.endsWith(BLOCK + "\n")).toBe(true);
152
- });
153
- it("moves a manually relocated block to the end (one-time reposition)", () => {
154
- // User dragged the cohvu block into the middle. Next setup moves it
155
- // back to the end. Subsequent setups are idempotent.
156
- const original = "# Notes\n\n" + BLOCK + "\n\n## User section below\n\nMore content.\n";
157
- const filePath = makeFile(original);
158
- const result1 = writeMarkdownInstructions(filePath);
159
- expect(result1).toBe("ok");
160
- const afterFirst = read(filePath);
161
- expect(afterFirst).toContain("# Notes");
162
- expect(afterFirst).toContain("## User section below");
163
- expect(afterFirst).toContain("More content.");
164
- expect(afterFirst.endsWith(BLOCK + "\n")).toBe(true);
165
- // Second run converges — no more moves
166
- const result2 = writeMarkdownInstructions(filePath);
167
- expect(result2).toBe("skipped");
168
- expect(read(filePath)).toBe(afterFirst);
169
- });
170
- it("is idempotent after any messy state converges", () => {
171
- // Start with a messy state, run setup twice, verify the second run is skipped.
172
- const messy = `${MARKER_START}\nA\n${MARKER_END}\n\nuser text\n\n${MARKER_START}\nB\n${MARKER_END}\n\n${MARKER_START}\nleftover orphan\n`;
173
- const filePath = makeFile(messy);
174
- const result1 = writeMarkdownInstructions(filePath);
175
- expect(result1).toBe("ok");
176
- const first = read(filePath);
177
- const result2 = writeMarkdownInstructions(filePath);
178
- expect(result2).toBe("skipped");
179
- expect(read(filePath)).toBe(first);
180
- });
181
- it("preserves user content when there's nothing cohvu-related in the file", () => {
182
- // Important regression check — unrelated files must go through unchanged.
183
- const original = "# Random notes\n\nSome cohvu discussion here that talks about cohvu\nwithout using markers.\n\n## Another section\n";
184
- const filePath = makeFile(original);
185
- writeMarkdownInstructions(filePath);
186
- const final = read(filePath);
187
- // Entire original content preserved verbatim (no marker matches possible)
188
- expect(final.startsWith(original.trimEnd())).toBe(true);
189
- // Fresh block appended
190
- expect(final.endsWith(BLOCK + "\n")).toBe(true);
191
- });
192
- });
193
- // ---------------------------------------------------------------------------
194
- // teardown — removeMarkdownInstructions
195
- // ---------------------------------------------------------------------------
196
- describe("teardown — instruction file remover", () => {
197
- it("skips when the file doesn't exist", () => {
198
- const filePath = join(TEST_DIR, `missing-${++fileCounter}.md`);
199
- expect(existsSync(filePath)).toBe(false);
200
- const result = removeMarkdownInstructions(filePath);
201
- expect(result).toBe("skipped");
202
- });
203
- it("skips when the file has no cohvu markers at all", () => {
204
- const original = "# Just user content\n\nNo cohvu here.\n";
205
- const filePath = makeFile(original);
206
- const result = removeMarkdownInstructions(filePath);
207
- expect(result).toBe("skipped");
208
- expect(read(filePath)).toBe(original);
209
- });
210
- it("removes a clean block and preserves surrounding content", () => {
211
- const original = `# Notes\n\nBefore.\n\n${MARKER_START}\n# Cohvu\n\ninstructions\n${MARKER_END}\n\nAfter.\n`;
212
- const filePath = makeFile(original);
213
- const result = removeMarkdownInstructions(filePath);
214
- expect(result).toBe("ok");
215
- const final = read(filePath);
216
- expect(final).toContain("# Notes");
217
- expect(final).toContain("Before.");
218
- expect(final).toContain("After.");
219
- expect(final).not.toContain("cohvu:start");
220
- expect(final).not.toContain("cohvu:end");
221
- expect(final).not.toContain("instructions");
222
- });
223
- it("deletes the file when cohvu was its only content", () => {
224
- const filePath = makeFile(BLOCK + "\n");
225
- const result = removeMarkdownInstructions(filePath);
226
- expect(result).toBe("ok");
227
- expect(existsSync(filePath)).toBe(false);
228
- });
229
- it("removes duplicate blocks", () => {
230
- const original = `# Notes\n\n${MARKER_START}\nA\n${MARKER_END}\n\nmid\n\n${MARKER_START}\nB\n${MARKER_END}\n`;
231
- const filePath = makeFile(original);
232
- removeMarkdownInstructions(filePath);
233
- const final = read(filePath);
234
- expect(final).not.toContain("cohvu:start");
235
- expect(final).not.toContain("cohvu:end");
236
- expect(final).not.toContain("A\n");
237
- expect(final).not.toContain("B\n");
238
- expect(final).toContain("# Notes");
239
- expect(final).toContain("mid");
240
- });
241
- it("strips orphan start markers", () => {
242
- const original = `# Notes\n\n${MARKER_START}\nuser text below an orphan start\n\n## Section\n`;
243
- const filePath = makeFile(original);
244
- removeMarkdownInstructions(filePath);
245
- const final = read(filePath);
246
- expect(final).not.toContain("cohvu:start");
247
- expect(final).toContain("user text below an orphan start");
248
- expect(final).toContain("## Section");
249
- });
250
- it("strips orphan end markers (doesn't short-circuit on start-only check)", () => {
251
- const original = `# Notes\n\nuser text\n${MARKER_END}\n\n## Section\n`;
252
- const filePath = makeFile(original);
253
- const result = removeMarkdownInstructions(filePath);
254
- expect(result).toBe("ok");
255
- const final = read(filePath);
256
- expect(final).not.toContain("cohvu:end");
257
- expect(final).toContain("user text");
258
- expect(final).toContain("## Section");
259
- });
260
- it("strips markers in the wrong order cleanly", () => {
261
- const original = `# Notes\n\ntext\n${MARKER_END}\n\nmiddle\n\n${MARKER_START}\ncohvu content\n${MARKER_END}\n`;
262
- const filePath = makeFile(original);
263
- removeMarkdownInstructions(filePath);
264
- const final = read(filePath);
265
- expect(final).not.toContain("cohvu:start");
266
- expect(final).not.toContain("cohvu:end");
267
- expect(final).not.toContain("cohvu content");
268
- expect(final).toContain("# Notes");
269
- expect(final).toContain("text");
270
- expect(final).toContain("middle");
271
- });
272
- it("setup-then-teardown returns the file to its pre-setup state", () => {
273
- // The strongest symmetry test: a file that went through setup and then
274
- // teardown should look like the user never installed cohvu, minus any
275
- // whitespace-collapse side effects.
276
- const original = "# My file\n\nImportant content.\n\n## Section\n\nMore.\n";
277
- const filePath = makeFile(original);
278
- writeMarkdownInstructions(filePath);
279
- removeMarkdownInstructions(filePath);
280
- expect(existsSync(filePath)).toBe(true);
281
- const final = read(filePath);
282
- expect(final.trim()).toBe(original.trim());
283
- });
284
- it("setup-then-teardown deletes the file if there was no user content to begin with", () => {
285
- const filePath = join(TEST_DIR, `clean-${++fileCounter}.md`);
286
- writeMarkdownInstructions(filePath);
287
- expect(existsSync(filePath)).toBe(true);
288
- removeMarkdownInstructions(filePath);
289
- expect(existsSync(filePath)).toBe(false);
290
- });
291
- });
292
- // ---------------------------------------------------------------------------
293
- function escapeForRegex(s) {
294
- return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
295
- }
296
- //# sourceMappingURL=instruction-file.unit.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"instruction-file.unit.test.js","sourceRoot":"","sources":["../../src/__tests__/instruction-file.unit.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,196 +0,0 @@
1
- import { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync, rmSync } from "fs";
2
- import { join } from "path";
3
- import { tmpdir } from "os";
4
- // We test the teardown helpers by creating temp files and running the removers.
5
- // The actual runTeardown orchestrator depends on detectPlatforms which reads
6
- // the home directory, so we test the individual functions directly.
7
- // Import the module — we need to reach the internal functions.
8
- // Since they're not exported, we'll test through runTeardown with mocked platforms.
9
- // Actually, let's test the file manipulation logic by creating real temp files.
10
- const TEST_DIR = join(tmpdir(), `cohvu-teardown-test-${process.pid}`);
11
- beforeAll(() => {
12
- mkdirSync(TEST_DIR, { recursive: true });
13
- });
14
- afterAll(() => {
15
- rmSync(TEST_DIR, { recursive: true, force: true });
16
- });
17
- describe("teardown — JSON MCP removal", () => {
18
- it("removes cohvu entry preserving others", () => {
19
- const filePath = join(TEST_DIR, "mcp-json-1.json");
20
- const original = {
21
- mcpServers: {
22
- cohvu: { command: "npx", args: ["cohvu"] },
23
- other: { command: "other-tool", args: [] },
24
- },
25
- };
26
- writeFileSync(filePath, JSON.stringify(original, null, 2));
27
- // Simulate what removeJsonMcpEntry does
28
- const raw = readFileSync(filePath, "utf-8");
29
- const config = JSON.parse(raw);
30
- const servers = config.mcpServers;
31
- delete servers.cohvu;
32
- writeFileSync(filePath, JSON.stringify(config, null, 2) + "\n");
33
- const result = JSON.parse(readFileSync(filePath, "utf-8"));
34
- expect(result.mcpServers.cohvu).toBeUndefined();
35
- expect(result.mcpServers.other).toEqual({ command: "other-tool", args: [] });
36
- });
37
- it("handles file with only cohvu entry", () => {
38
- const filePath = join(TEST_DIR, "mcp-json-2.json");
39
- const original = {
40
- mcpServers: {
41
- cohvu: { command: "npx", args: ["cohvu"] },
42
- },
43
- };
44
- writeFileSync(filePath, JSON.stringify(original, null, 2));
45
- const raw = readFileSync(filePath, "utf-8");
46
- const config = JSON.parse(raw);
47
- const servers = config.mcpServers;
48
- delete servers.cohvu;
49
- writeFileSync(filePath, JSON.stringify(config, null, 2) + "\n");
50
- const result = JSON.parse(readFileSync(filePath, "utf-8"));
51
- expect(result.mcpServers).toEqual({});
52
- });
53
- });
54
- describe("teardown — TOML MCP removal", () => {
55
- it("removes cohvu section preserving others", () => {
56
- const filePath = join(TEST_DIR, "config.toml");
57
- const original = `[mcp_servers.other]
58
- command = "other"
59
- args = ["--flag"]
60
-
61
- [mcp_servers.cohvu]
62
- command = "npx"
63
- args = ["cohvu"]
64
-
65
- [some_other_section]
66
- key = "value"
67
- `;
68
- writeFileSync(filePath, original);
69
- // Simulate removeTomlMcpEntry
70
- const lines = readFileSync(filePath, "utf-8").split("\n");
71
- const result = [];
72
- let skipping = false;
73
- for (const line of lines) {
74
- if (line.trim() === "[mcp_servers.cohvu]") {
75
- skipping = true;
76
- continue;
77
- }
78
- if (skipping && line.trim().startsWith("[")) {
79
- skipping = false;
80
- }
81
- if (!skipping) {
82
- result.push(line);
83
- }
84
- }
85
- const cleaned = result.join("\n").replace(/\n{3,}/g, "\n\n").trim() + "\n";
86
- writeFileSync(filePath, cleaned);
87
- const final = readFileSync(filePath, "utf-8");
88
- expect(final).not.toContain("[mcp_servers.cohvu]");
89
- expect(final).toContain("[mcp_servers.other]");
90
- expect(final).toContain("[some_other_section]");
91
- expect(final).toContain('command = "other"');
92
- });
93
- it("handles cohvu at end of file", () => {
94
- const filePath = join(TEST_DIR, "config-end.toml");
95
- const original = `[mcp_servers.other]
96
- command = "other"
97
-
98
- [mcp_servers.cohvu]
99
- command = "npx"
100
- args = ["cohvu"]
101
- `;
102
- writeFileSync(filePath, original);
103
- const lines = readFileSync(filePath, "utf-8").split("\n");
104
- const result = [];
105
- let skipping = false;
106
- for (const line of lines) {
107
- if (line.trim() === "[mcp_servers.cohvu]") {
108
- skipping = true;
109
- continue;
110
- }
111
- if (skipping && line.trim().startsWith("[")) {
112
- skipping = false;
113
- }
114
- if (!skipping) {
115
- result.push(line);
116
- }
117
- }
118
- const cleaned = result.join("\n").replace(/\n{3,}/g, "\n\n").trim() + "\n";
119
- writeFileSync(filePath, cleaned);
120
- const final = readFileSync(filePath, "utf-8");
121
- expect(final).not.toContain("[mcp_servers.cohvu]");
122
- expect(final).toContain("[mcp_servers.other]");
123
- });
124
- });
125
- describe("teardown — markdown instruction removal", () => {
126
- const MARKER_START = "<!-- cohvu:start -->";
127
- const MARKER_END = "<!-- cohvu:end -->";
128
- it("removes marked section preserving surrounding content", () => {
129
- const filePath = join(TEST_DIR, "CLAUDE.md");
130
- const original = `# My Project
131
-
132
- Some custom instructions here.
133
-
134
- ${MARKER_START}
135
- # Cohvu
136
-
137
- Cohvu instructions here.
138
- ${MARKER_END}
139
-
140
- More custom content below.
141
- `;
142
- writeFileSync(filePath, original);
143
- const content = readFileSync(filePath, "utf-8");
144
- const startIdx = content.indexOf(MARKER_START);
145
- const endIdx = content.indexOf(MARKER_END);
146
- const before = content.slice(0, startIdx).replace(/\n+$/, "");
147
- const after = content.slice(endIdx + MARKER_END.length).replace(/^\n+/, "");
148
- const result = before + "\n\n" + after;
149
- writeFileSync(filePath, result.trimEnd() + "\n");
150
- const final = readFileSync(filePath, "utf-8");
151
- expect(final).not.toContain("cohvu:start");
152
- expect(final).not.toContain("Cohvu instructions");
153
- expect(final).toContain("My Project");
154
- expect(final).toContain("More custom content below.");
155
- });
156
- it("deletes file when only cohvu content exists", () => {
157
- const filePath = join(TEST_DIR, "cohvu-only.md");
158
- const original = `${MARKER_START}
159
- # Cohvu
160
-
161
- Cohvu instructions here.
162
- ${MARKER_END}
163
- `;
164
- writeFileSync(filePath, original);
165
- const content = readFileSync(filePath, "utf-8");
166
- const startIdx = content.indexOf(MARKER_START);
167
- const endIdx = content.indexOf(MARKER_END);
168
- const before = content.slice(0, startIdx).replace(/\n+$/, "");
169
- const after = content.slice(endIdx + MARKER_END.length).replace(/^\n+/, "");
170
- const result = before || after;
171
- if (!result.trim()) {
172
- unlinkSync(filePath);
173
- }
174
- expect(existsSync(filePath)).toBe(false);
175
- });
176
- });
177
- describe("teardown — permissions removal", () => {
178
- it("removes cohvu permission preserving others", () => {
179
- const filePath = join(TEST_DIR, "settings.json");
180
- const original = {
181
- permissions: {
182
- allow: ["mcp__cohvu__*", "mcp__other__*", "Bash(git *)"],
183
- },
184
- };
185
- writeFileSync(filePath, JSON.stringify(original, null, 2));
186
- const raw = readFileSync(filePath, "utf-8");
187
- const config = JSON.parse(raw);
188
- const permissions = config.permissions;
189
- const allow = permissions.allow.filter((rule) => !rule.startsWith("mcp__cohvu__"));
190
- permissions.allow = allow;
191
- writeFileSync(filePath, JSON.stringify(config, null, 2) + "\n");
192
- const result = JSON.parse(readFileSync(filePath, "utf-8"));
193
- expect(result.permissions.allow).toEqual(["mcp__other__*", "Bash(git *)"]);
194
- });
195
- });
196
- //# sourceMappingURL=teardown.unit.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"teardown.unit.test.js","sourceRoot":"","sources":["../../src/__tests__/teardown.unit.test.ts"],"names":[],"mappings":"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"}