@opencoven/coven-code 0.0.1

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 (86) hide show
  1. package/README.md +145 -0
  2. package/bin/coven-code-sdk.mjs +12 -0
  3. package/bin/coven-code.mjs +19 -0
  4. package/docs/CLI.md +192 -0
  5. package/docs/CONFIGURATION.md +107 -0
  6. package/docs/DEVELOPMENT.md +104 -0
  7. package/docs/DOGFOOD-PROTOCOL.md +263 -0
  8. package/docs/MCP-SKILLS-PLUGINS.md +127 -0
  9. package/docs/README.md +38 -0
  10. package/docs/RELEASE.md +33 -0
  11. package/docs/SDK.md +107 -0
  12. package/docs/superpowers/plans/2026-05-25-coven-code-panel-tui.md +904 -0
  13. package/docs/superpowers/plans/2026-05-25-coven-code-rebrand.md +670 -0
  14. package/docs/superpowers/specs/2026-05-25-coven-code-panel-tui-design.md +235 -0
  15. package/docs/superpowers/specs/2026-05-26-slash-first-tui-review.md +63 -0
  16. package/package.json +36 -0
  17. package/src/agent/lane.mjs +136 -0
  18. package/src/agent/local.mjs +95 -0
  19. package/src/cli/dispatch.mjs +66 -0
  20. package/src/cli/execute.mjs +588 -0
  21. package/src/cli/help.mjs +58 -0
  22. package/src/cli/interactive-core.mjs +302 -0
  23. package/src/cli/notifications.mjs +13 -0
  24. package/src/cli/parse.mjs +83 -0
  25. package/src/cli/reasoning.mjs +45 -0
  26. package/src/cli/refs.mjs +162 -0
  27. package/src/cli/repl.mjs +61 -0
  28. package/src/cli/slash-commands.mjs +357 -0
  29. package/src/cli/stream-json.mjs +116 -0
  30. package/src/cli/tui.mjs +757 -0
  31. package/src/commands/agents.mjs +53 -0
  32. package/src/commands/config.mjs +27 -0
  33. package/src/commands/ide.mjs +17 -0
  34. package/src/commands/login.mjs +84 -0
  35. package/src/commands/mcp.mjs +176 -0
  36. package/src/commands/permissions.mjs +328 -0
  37. package/src/commands/plugins.mjs +86 -0
  38. package/src/commands/review.mjs +74 -0
  39. package/src/commands/skill.mjs +23 -0
  40. package/src/commands/threads.mjs +165 -0
  41. package/src/commands/tools.mjs +77 -0
  42. package/src/commands/update.mjs +31 -0
  43. package/src/commands/usage.mjs +34 -0
  44. package/src/constants.mjs +46 -0
  45. package/src/main.mjs +87 -0
  46. package/src/mcp/discover.mjs +154 -0
  47. package/src/mcp/permissions.mjs +52 -0
  48. package/src/mcp/probe.mjs +424 -0
  49. package/src/mcp/registry.mjs +96 -0
  50. package/src/plugins/discover.mjs +880 -0
  51. package/src/sdk-install.mjs +187 -0
  52. package/src/sdk.mjs +314 -0
  53. package/src/settings/load.mjs +134 -0
  54. package/src/settings/paths.mjs +101 -0
  55. package/src/skills/builtin/building-skills/SKILL.md +20 -0
  56. package/src/skills/discover.mjs +95 -0
  57. package/src/threads/store.mjs +176 -0
  58. package/src/tools/builtin/bash.mjs +110 -0
  59. package/src/tools/builtin/create-file.mjs +66 -0
  60. package/src/tools/builtin/edit-file.mjs +76 -0
  61. package/src/tools/builtin/finder.mjs +73 -0
  62. package/src/tools/builtin/glob.mjs +74 -0
  63. package/src/tools/builtin/grep.mjs +82 -0
  64. package/src/tools/builtin/index.mjs +83 -0
  65. package/src/tools/builtin/librarian.mjs +97 -0
  66. package/src/tools/builtin/look-at.mjs +92 -0
  67. package/src/tools/builtin/mcp.mjs +51 -0
  68. package/src/tools/builtin/mermaid.mjs +59 -0
  69. package/src/tools/builtin/oracle.mjs +56 -0
  70. package/src/tools/builtin/painter.mjs +81 -0
  71. package/src/tools/builtin/plugin-tool.mjs +53 -0
  72. package/src/tools/builtin/read-mcp-resource.mjs +63 -0
  73. package/src/tools/builtin/read-web-page.mjs +72 -0
  74. package/src/tools/builtin/read.mjs +59 -0
  75. package/src/tools/builtin/runtime.mjs +215 -0
  76. package/src/tools/builtin/task.mjs +63 -0
  77. package/src/tools/builtin/toolbox-tool.mjs +57 -0
  78. package/src/tools/builtin/undo-edit.mjs +97 -0
  79. package/src/tools/builtin/web-search.mjs +128 -0
  80. package/src/tools/toolbox.mjs +273 -0
  81. package/src/util/fs.mjs +13 -0
  82. package/src/util/glob.mjs +46 -0
  83. package/src/util/html.mjs +21 -0
  84. package/src/util/media.mjs +13 -0
  85. package/src/util/shell.mjs +24 -0
  86. package/src/util/table.mjs +11 -0
@@ -0,0 +1,670 @@
1
+ # Coven Code Rebrand And Move Implementation Plan
2
+
3
+ > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
4
+
5
+ **Goal:** Move the rebuilt Amp-compatible CLI from `/Users/buns/Documents/Projects/ampcode-cli` to `/Users/buns/Documents/GitHub/OpenCoven/coven-code` and comprehensively rename public and internal surfaces from Amp/Ampcode to Coven Code.
6
+
7
+ **Architecture:** Treat `/Users/buns/Documents/Projects/ampcode-cli` as the source checkout and create `/Users/buns/Documents/GitHub/OpenCoven/coven-code` as the new canonical OpenCoven checkout, preserving current worktree contents and git history. Rename public package, executable, SDK, config, env, plugin, docs, tests, and help surfaces together so the target tree does not ship mixed Amp/Coven Code identity except in an explicit migration note if Val requests one.
8
+
9
+ **Tech Stack:** Node.js 20+ ESM CLI, `node --test`, npm package metadata/bin shims, filesystem-backed settings/plugins/threads, OpenCoven repo conventions.
10
+
11
+ ---
12
+
13
+ ## Current Evidence
14
+
15
+ - Source checkout exists: `/Users/buns/Documents/Projects/ampcode-cli`.
16
+ - Target checkout does not exist yet: `/Users/buns/Documents/GitHub/OpenCoven/coven-code`.
17
+ - Source package identity is still Amp: package name `@ampcode/cli`, bins `amp` and `amp-sdk`.
18
+ - Source worktree is dirty with the active CLI recreation work; preserve it instead of cloning from `HEAD`.
19
+ - OpenCoven already has `/Users/buns/Documents/GitHub/OpenCoven/coven`, a separate Rust Coven CLI/runtime. Avoid reusing the `coven` binary name in this JS CLI to prevent local/package collision.
20
+
21
+ ## Rename Policy
22
+
23
+ - Product display name: `Coven Code`.
24
+ - Package name: `@opencoven/coven-code`.
25
+ - Primary executable: `coven-code`.
26
+ - SDK executable: `coven-code-sdk`.
27
+ - Config directory: `coven-code`.
28
+ - Project-local directory: `.coven-code`.
29
+ - Env prefix: `COVEN_CODE_`.
30
+ - Settings prefix: `covenCode.`.
31
+ - Do not keep `amp`, `Amp`, `AMP_`, `@ampcode`, `ampcode.com`, `.amp`, or `amp.*` references unless a task creates a single explicit migration note and the final audit allowlist lists it.
32
+
33
+ ## File Structure
34
+
35
+ - Move/copy source tree to: `/Users/buns/Documents/GitHub/OpenCoven/coven-code`.
36
+ - Rename:
37
+ - `bin/amp.mjs` -> `bin/coven-code.mjs`
38
+ - `bin/amp-sdk.mjs` -> `bin/coven-code-sdk.mjs`
39
+ - Modify:
40
+ - `package.json`
41
+ - `package-lock.json`
42
+ - `README.md`
43
+ - `src/constants.mjs`
44
+ - `src/main.mjs`
45
+ - `src/sdk.mjs`
46
+ - `src/sdk-install.mjs`
47
+ - `src/cli/*.mjs`
48
+ - `src/commands/*.mjs`
49
+ - `src/settings/*.mjs`
50
+ - `src/plugins/discover.mjs`
51
+ - `src/skills/discover.mjs`
52
+ - `src/threads/store.mjs`
53
+ - `test/cli.test.mjs`
54
+ - Create:
55
+ - `docs/MIGRATION-FROM-AMP.md` only if Val wants documented compatibility/migration language.
56
+
57
+ ## Task 1: Create The OpenCoven Target Checkout
58
+
59
+ **Files:**
60
+ - Create directory: `/Users/buns/Documents/GitHub/OpenCoven/coven-code`
61
+ - Preserve source: `/Users/buns/Documents/Projects/ampcode-cli`
62
+
63
+ - [ ] **Step 1: Verify source and target state**
64
+
65
+ Run:
66
+
67
+ ```bash
68
+ pwd
69
+ test -d /Users/buns/Documents/Projects/ampcode-cli
70
+ test ! -e /Users/buns/Documents/GitHub/OpenCoven/coven-code
71
+ git -C /Users/buns/Documents/Projects/ampcode-cli status --short
72
+ ```
73
+
74
+ Expected:
75
+
76
+ ```text
77
+ /Users/buns
78
+ ```
79
+
80
+ `test` commands exit 0, and `git status --short` prints the current dirty Amp recreation changes.
81
+
82
+ - [ ] **Step 2: Copy the full dirty checkout without generated dependencies**
83
+
84
+ Run:
85
+
86
+ ```bash
87
+ rsync -a \
88
+ --exclude node_modules \
89
+ --exclude .DS_Store \
90
+ /Users/buns/Documents/Projects/ampcode-cli/ \
91
+ /Users/buns/Documents/GitHub/OpenCoven/coven-code/
92
+ ```
93
+
94
+ Expected: command exits 0.
95
+
96
+ - [ ] **Step 3: Verify target has git history and working files**
97
+
98
+ Run:
99
+
100
+ ```bash
101
+ git -C /Users/buns/Documents/GitHub/OpenCoven/coven-code status --short
102
+ test -f /Users/buns/Documents/GitHub/OpenCoven/coven-code/package.json
103
+ test -f /Users/buns/Documents/GitHub/OpenCoven/coven-code/bin/amp.mjs
104
+ ```
105
+
106
+ Expected: status matches the source dirty state, and both files exist.
107
+
108
+ ## Task 2: Rename Package And Binary Entrypoints
109
+
110
+ **Files:**
111
+ - Modify: `/Users/buns/Documents/GitHub/OpenCoven/coven-code/package.json`
112
+ - Modify: `/Users/buns/Documents/GitHub/OpenCoven/coven-code/package-lock.json`
113
+ - Move: `/Users/buns/Documents/GitHub/OpenCoven/coven-code/bin/amp.mjs`
114
+ - Move: `/Users/buns/Documents/GitHub/OpenCoven/coven-code/bin/amp-sdk.mjs`
115
+ - Test: `/Users/buns/Documents/GitHub/OpenCoven/coven-code/test/cli.test.mjs`
116
+
117
+ - [ ] **Step 1: Write failing package/bin identity tests**
118
+
119
+ Add tests asserting:
120
+
121
+ ```js
122
+ test('package metadata uses the Coven Code npm package and binaries', async () => {
123
+ const packageJson = JSON.parse(await readFile(path.join(repoRoot, 'package.json'), 'utf8'));
124
+ assert.equal(packageJson.name, '@opencoven/coven-code');
125
+ assert.deepEqual(packageJson.bin, {
126
+ 'coven-code': './bin/coven-code.mjs',
127
+ 'coven-code-sdk': './bin/coven-code-sdk.mjs',
128
+ });
129
+ });
130
+ ```
131
+
132
+ - [ ] **Step 2: Run test to verify it fails**
133
+
134
+ Run:
135
+
136
+ ```bash
137
+ cd /Users/buns/Documents/GitHub/OpenCoven/coven-code
138
+ npm test -- --test-name-pattern "package metadata uses the Coven Code npm package and binaries"
139
+ ```
140
+
141
+ Expected: FAIL because package name is still `@ampcode/cli` and bins are still `amp`/`amp-sdk`.
142
+
143
+ - [ ] **Step 3: Rename bin files and package metadata**
144
+
145
+ Run:
146
+
147
+ ```bash
148
+ mv bin/amp.mjs bin/coven-code.mjs
149
+ mv bin/amp-sdk.mjs bin/coven-code-sdk.mjs
150
+ ```
151
+
152
+ Edit `package.json` to:
153
+
154
+ ```json
155
+ {
156
+ "name": "@opencoven/coven-code",
157
+ "version": "0.0.0",
158
+ "type": "module",
159
+ "exports": {
160
+ ".": "./src/sdk.mjs"
161
+ },
162
+ "bin": {
163
+ "coven-code": "./bin/coven-code.mjs",
164
+ "coven-code-sdk": "./bin/coven-code-sdk.mjs"
165
+ },
166
+ "scripts": {
167
+ "test": "node --test",
168
+ "start": "node ./bin/coven-code.mjs",
169
+ "coven-code": "node ./bin/coven-code.mjs"
170
+ },
171
+ "engines": {
172
+ "node": ">=20"
173
+ }
174
+ }
175
+ ```
176
+
177
+ Update `package-lock.json` package names and bin paths to match.
178
+
179
+ - [ ] **Step 4: Run test to verify it passes**
180
+
181
+ Run:
182
+
183
+ ```bash
184
+ npm test -- --test-name-pattern "package metadata uses the Coven Code npm package and binaries"
185
+ ```
186
+
187
+ Expected: PASS.
188
+
189
+ ## Task 3: Rename CLI Runtime Constants, Help, And Dispatch
190
+
191
+ **Files:**
192
+ - Modify: `src/constants.mjs`
193
+ - Modify: `src/main.mjs`
194
+ - Modify: `src/cli/help.mjs`
195
+ - Modify: `src/cli/dispatch.mjs`
196
+ - Modify: `src/cli/parse.mjs`
197
+ - Modify: `test/cli.test.mjs`
198
+
199
+ - [ ] **Step 1: Write failing help/runtime identity tests**
200
+
201
+ Add tests asserting:
202
+
203
+ ```js
204
+ test('prints a Coven Code help screen with renamed binary', () => {
205
+ const result = runCovenCode(['--help']);
206
+ assert.equal(result.status, 0, result.stderr);
207
+ assert.match(result.stdout, /Coven Code/);
208
+ assert.match(result.stdout, /Usage:\s+coven-code/);
209
+ assert.doesNotMatch(result.stdout, /\bAmp\b|ampcode|Usage:\s+amp\b/);
210
+ });
211
+ ```
212
+
213
+ Define `runCovenCode` beside the existing runner:
214
+
215
+ ```js
216
+ function runCovenCode(args = [], options = {}) {
217
+ return spawnSync(process.execPath, [path.join(repoRoot, 'bin', 'coven-code.mjs'), ...args], {
218
+ cwd: options.cwd ?? repoRoot,
219
+ input: options.input,
220
+ env: { ...process.env, ...options.env },
221
+ encoding: 'utf8',
222
+ });
223
+ }
224
+ ```
225
+
226
+ - [ ] **Step 2: Run test to verify it fails**
227
+
228
+ Run:
229
+
230
+ ```bash
231
+ npm test -- --test-name-pattern "prints a Coven Code help screen with renamed binary"
232
+ ```
233
+
234
+ Expected: FAIL while help still says Amp or the new bin path is not wired.
235
+
236
+ - [ ] **Step 3: Rename runtime identity constants and help text**
237
+
238
+ Replace user-facing strings:
239
+
240
+ ```js
241
+ export const PRODUCT_NAME = 'Coven Code';
242
+ export const CLI_NAME = 'coven-code';
243
+ export const PACKAGE_NAME = '@opencoven/coven-code';
244
+ export const SUPPORT_URL = 'https://opencoven.com';
245
+ ```
246
+
247
+ Update help usage strings to use `coven-code`, not `amp`.
248
+
249
+ - [ ] **Step 4: Run focused help tests**
250
+
251
+ Run:
252
+
253
+ ```bash
254
+ npm test -- --test-name-pattern "Coven Code help|top-level help"
255
+ ```
256
+
257
+ Expected: PASS.
258
+
259
+ ## Task 4: Rename Config, Project Directories, Settings, And Env Vars
260
+
261
+ **Files:**
262
+ - Modify: `src/settings/paths.mjs`
263
+ - Modify: `src/settings/load.mjs`
264
+ - Modify: `src/cli/execute.mjs`
265
+ - Modify: `src/cli/notifications.mjs`
266
+ - Modify: `src/commands/config.mjs`
267
+ - Modify: `src/commands/login.mjs`
268
+ - Modify: `test/cli.test.mjs`
269
+
270
+ - [ ] **Step 1: Write failing config/env tests**
271
+
272
+ Add tests for:
273
+
274
+ ```js
275
+ test('Coven Code stores auth under COVEN_CODE_API_KEY and coven-code config paths', async () => {
276
+ const home = await mkdtemp(path.join(tmpdir(), 'coven-code-home-'));
277
+ const xdg = path.join(home, '.config');
278
+ const result = runCovenCode(['login', '--api-key', 'ck-test-secret'], {
279
+ env: { HOME: home, XDG_CONFIG_HOME: xdg },
280
+ });
281
+ assert.equal(result.status, 0, result.stderr);
282
+ const settings = await readFile(path.join(xdg, 'coven-code', 'settings.jsonc'), 'utf8');
283
+ assert.match(settings, /COVEN_CODE_API_KEY|ck-test-secret/);
284
+ });
285
+
286
+ test('Coven Code discovers project plugins under .coven-code not .amp', async () => {
287
+ const workspace = await makeWorkspace();
288
+ await mkdir(path.join(workspace, '.coven-code', 'plugins'), { recursive: true });
289
+ await writeFile(path.join(workspace, '.coven-code', 'plugins', 'probe.ts'), 'export default function probe() {}\\n');
290
+ const result = runCovenCode(['plugins', 'list'], { cwd: workspace });
291
+ assert.equal(result.status, 0, result.stderr);
292
+ assert.match(result.stdout, /probe/);
293
+ });
294
+ ```
295
+
296
+ - [ ] **Step 2: Run tests to verify they fail**
297
+
298
+ Run:
299
+
300
+ ```bash
301
+ npm test -- --test-name-pattern "Coven Code stores auth|Coven Code discovers project plugins"
302
+ ```
303
+
304
+ Expected: FAIL because code still uses `AMP_*`, `amp`, and `.amp`.
305
+
306
+ - [ ] **Step 3: Rename configuration surfaces**
307
+
308
+ Replace:
309
+
310
+ ```text
311
+ AMP_API_KEY -> COVEN_CODE_API_KEY
312
+ AMP_CLI_PATH -> COVEN_CODE_CLI_PATH
313
+ AMP_HOME -> COVEN_CODE_HOME
314
+ AMP_FORCE_BEL -> COVEN_CODE_FORCE_BEL
315
+ AMP_TOOLBOX -> COVEN_CODE_TOOLBOX
316
+ AMP_PLUGIN_* -> COVEN_CODE_PLUGIN_*
317
+ ~/.config/amp -> ~/.config/coven-code
318
+ .amp -> .coven-code
319
+ amp.* settings keys -> covenCode.*
320
+ ```
321
+
322
+ - [ ] **Step 4: Run focused config/env tests**
323
+
324
+ Run:
325
+
326
+ ```bash
327
+ npm test -- --test-name-pattern "Coven Code stores auth|Coven Code discovers project plugins|settings|config|login"
328
+ ```
329
+
330
+ Expected: PASS.
331
+
332
+ ## Task 5: Rename SDK And Installer Surfaces
333
+
334
+ **Files:**
335
+ - Modify: `src/sdk.mjs`
336
+ - Modify: `src/sdk-install.mjs`
337
+ - Modify: `bin/coven-code-sdk.mjs`
338
+ - Modify: `test/cli.test.mjs`
339
+
340
+ - [ ] **Step 1: Write failing SDK identity tests**
341
+
342
+ Add tests asserting:
343
+
344
+ ```js
345
+ test('SDK package installs a Coven Code managed command', async () => {
346
+ const home = await mkdtemp(path.join(tmpdir(), 'coven-code-sdk-home-'));
347
+ const result = runCovenCode(['--help'], { env: { HOME: home } });
348
+ assert.equal(result.status, 0, result.stderr);
349
+ assert.match(result.stdout, /coven-code/);
350
+ });
351
+ ```
352
+
353
+ Update existing SDK tests to use `coven-code-sdk`, `COVEN_CODE_CLI_PATH`, and `@opencoven/coven-code`.
354
+
355
+ - [ ] **Step 2: Run SDK tests to verify failure**
356
+
357
+ Run:
358
+
359
+ ```bash
360
+ npm test -- --test-name-pattern "SDK .*Coven Code|SDK package"
361
+ ```
362
+
363
+ Expected: FAIL until SDK installer paths and names are renamed.
364
+
365
+ - [ ] **Step 3: Rename SDK installer internals**
366
+
367
+ Replace package/binary/env references:
368
+
369
+ ```text
370
+ amp-sdk -> coven-code-sdk
371
+ amp -> coven-code
372
+ @ampcode/cli -> @opencoven/coven-code
373
+ AMP_CLI_PATH -> COVEN_CODE_CLI_PATH
374
+ AMP_HOME -> COVEN_CODE_HOME
375
+ ```
376
+
377
+ - [ ] **Step 4: Run SDK tests**
378
+
379
+ Run:
380
+
381
+ ```bash
382
+ npm test -- --test-name-pattern "SDK"
383
+ ```
384
+
385
+ Expected: PASS.
386
+
387
+ ## Task 6: Rename Plugin And Tooling Surfaces
388
+
389
+ **Files:**
390
+ - Modify: `src/plugins/discover.mjs`
391
+ - Modify: `src/commands/plugins.mjs`
392
+ - Modify: `src/tools/toolbox.mjs`
393
+ - Modify: `src/skills/discover.mjs`
394
+ - Modify: `src/skills/builtin/building-skills/SKILL.md`
395
+ - Modify: `test/cli.test.mjs`
396
+
397
+ - [ ] **Step 1: Write failing plugin path and docs tests**
398
+
399
+ Add tests asserting:
400
+
401
+ ```js
402
+ test('plugins list reports Coven Code project and user plugin files', async () => {
403
+ const home = await mkdtemp(path.join(tmpdir(), 'coven-code-home-'));
404
+ const xdg = path.join(home, '.config');
405
+ const workspace = path.join(home, 'repo');
406
+ await mkdir(path.join(xdg, 'coven-code', 'plugins'), { recursive: true });
407
+ await mkdir(path.join(workspace, '.coven-code', 'plugins'), { recursive: true });
408
+ await writeFile(path.join(workspace, 'package.json'), '{"name":"fixture"}\\n');
409
+ await writeFile(path.join(workspace, '.coven-code', 'plugins', 'project-status.ts'), 'export default function projectStatus() {}\\n');
410
+ await writeFile(path.join(xdg, 'coven-code', 'plugins', 'notify.ts'), 'export default function notify() {}\\n');
411
+
412
+ const result = runCovenCode(['plugins', 'list'], {
413
+ cwd: workspace,
414
+ env: { XDG_CONFIG_HOME: xdg, HOME: home },
415
+ });
416
+
417
+ assert.equal(result.status, 0, result.stderr);
418
+ assert.match(result.stdout, /project-status/);
419
+ assert.match(result.stdout, /notify/);
420
+ });
421
+ ```
422
+
423
+ - [ ] **Step 2: Run test to verify it fails**
424
+
425
+ Run:
426
+
427
+ ```bash
428
+ npm test -- --test-name-pattern "Coven Code project and user plugin files"
429
+ ```
430
+
431
+ Expected: FAIL until plugin paths are renamed.
432
+
433
+ - [ ] **Step 3: Rename plugin paths and examples**
434
+
435
+ Replace plugin examples and discovery paths:
436
+
437
+ ```text
438
+ .amp/plugins -> .coven-code/plugins
439
+ ~/.config/amp/plugins -> ~/.config/coven-code/plugins
440
+ @ampcode/plugin -> @opencoven/coven-code-plugin
441
+ Amp Plugin API -> Coven Code Plugin API
442
+ ```
443
+
444
+ - [ ] **Step 4: Run focused plugin tests**
445
+
446
+ Run:
447
+
448
+ ```bash
449
+ npm test -- --test-name-pattern "plugin|plugins|tool.call|tool.result"
450
+ ```
451
+
452
+ Expected: PASS.
453
+
454
+ ## Task 7: Rename Tests And Remove Amp Identity Drift
455
+
456
+ **Files:**
457
+ - Modify: `test/cli.test.mjs`
458
+ - Modify: all source/docs containing Amp identity
459
+
460
+ - [ ] **Step 1: Add an identity drift audit test**
461
+
462
+ Add a test that scans tracked source/docs/package files:
463
+
464
+ ```js
465
+ test('repository does not contain unapproved Amp identity strings', async () => {
466
+ const allowed = new Set([
467
+ 'docs/MIGRATION-FROM-AMP.md',
468
+ ]);
469
+ const files = listRepoTextFiles(repoRoot).filter((file) => !allowed.has(path.relative(repoRoot, file)));
470
+ const pattern = /@ampcode|ampcode\\.com|\\bAmp\\b|\\bAMP_[A-Z0-9_]+|\\.amp\\b|\\bamp\\./;
471
+ const offenders = [];
472
+ for (const file of files) {
473
+ const text = await readFile(file, 'utf8');
474
+ if (pattern.test(text)) offenders.push(path.relative(repoRoot, file));
475
+ }
476
+ assert.deepEqual(offenders.sort(), []);
477
+ });
478
+ ```
479
+
480
+ - [ ] **Step 2: Run audit test to verify it fails**
481
+
482
+ Run:
483
+
484
+ ```bash
485
+ npm test -- --test-name-pattern "repository does not contain unapproved Amp identity strings"
486
+ ```
487
+
488
+ Expected: FAIL with a concrete offender list.
489
+
490
+ - [ ] **Step 3: Rename offenders or move intentional legacy text into the migration allowlist**
491
+
492
+ Run:
493
+
494
+ ```bash
495
+ rg -n "@ampcode|ampcode\\.com|\\bAmp\\b|\\bAMP_[A-Z0-9_]+|\\.amp\\b|\\bamp\\." .
496
+ ```
497
+
498
+ For each result:
499
+
500
+ ```text
501
+ rename current product/runtime surface -> Coven Code equivalent
502
+ delete stale upstream marketing/docs text
503
+ move intentional one-time compatibility notes -> docs/MIGRATION-FROM-AMP.md
504
+ ```
505
+
506
+ - [ ] **Step 4: Run audit test to verify it passes**
507
+
508
+ Run:
509
+
510
+ ```bash
511
+ npm test -- --test-name-pattern "repository does not contain unapproved Amp identity strings"
512
+ ```
513
+
514
+ Expected: PASS.
515
+
516
+ ## Task 8: Update README And Operator Docs
517
+
518
+ **Files:**
519
+ - Modify: `README.md`
520
+ - Create optional: `docs/MIGRATION-FROM-AMP.md`
521
+
522
+ - [ ] **Step 1: Write README smoke assertions**
523
+
524
+ Add tests or a small script assertion:
525
+
526
+ ```bash
527
+ node - <<'NODE'
528
+ const fs = require('fs')
529
+ const readme = fs.readFileSync('README.md', 'utf8')
530
+ if (!readme.includes('Coven Code')) throw new Error('README missing Coven Code')
531
+ if (/@ampcode|ampcode\.com|\bAmp\b/.test(readme)) throw new Error('README still contains Amp identity')
532
+ NODE
533
+ ```
534
+
535
+ - [ ] **Step 2: Rewrite README around Coven Code**
536
+
537
+ Required sections:
538
+
539
+ ```markdown
540
+ # Coven Code
541
+
542
+ Coven Code is an OpenCoven CLI for local coding-agent workflows.
543
+
544
+ ## Install
545
+
546
+ ```bash
547
+ npm install -g @opencoven/coven-code
548
+ coven-code --help
549
+ ```
550
+
551
+ ## Configuration
552
+
553
+ - User settings: `~/.config/coven-code/settings.jsonc`
554
+ - Project plugins: `.coven-code/plugins/*.ts`
555
+ - API key env: `COVEN_CODE_API_KEY`
556
+ ```
557
+ ```
558
+
559
+ - [ ] **Step 3: Run docs smoke assertion**
560
+
561
+ Run the Node assertion from Step 1.
562
+
563
+ Expected: exit 0.
564
+
565
+ ## Task 9: Full Verification And Packaging
566
+
567
+ **Files:**
568
+ - Verify entire target checkout.
569
+
570
+ - [ ] **Step 1: Install dependencies in target checkout**
571
+
572
+ Run:
573
+
574
+ ```bash
575
+ cd /Users/buns/Documents/GitHub/OpenCoven/coven-code
576
+ npm install
577
+ ```
578
+
579
+ Expected: exit 0 and `package-lock.json` matches `@opencoven/coven-code`.
580
+
581
+ - [ ] **Step 2: Run full test suite**
582
+
583
+ Run:
584
+
585
+ ```bash
586
+ npm test
587
+ ```
588
+
589
+ Expected:
590
+
591
+ ```text
592
+ fail 0
593
+ ```
594
+
595
+ - [ ] **Step 3: Run package dry run**
596
+
597
+ Run:
598
+
599
+ ```bash
600
+ npm pack --dry-run
601
+ ```
602
+
603
+ Expected: tarball is named for `@opencoven/coven-code`, includes `bin/coven-code.mjs` and `bin/coven-code-sdk.mjs`, and excludes `node_modules`.
604
+
605
+ - [ ] **Step 4: Run executable smoke tests**
606
+
607
+ Run:
608
+
609
+ ```bash
610
+ node ./bin/coven-code.mjs --help
611
+ node ./bin/coven-code.mjs plugins list
612
+ node ./bin/coven-code-sdk.mjs --help
613
+ ```
614
+
615
+ Expected: commands exit 0 and do not print Amp identity.
616
+
617
+ - [ ] **Step 5: Run final identity scan**
618
+
619
+ Run:
620
+
621
+ ```bash
622
+ rg -n "@ampcode|ampcode\\.com|\\bAmp\\b|\\bAMP_[A-Z0-9_]+|\\.amp\\b|\\bamp\\." .
623
+ ```
624
+
625
+ Expected: no output, or only `docs/MIGRATION-FROM-AMP.md` if that file was intentionally created.
626
+
627
+ ## Task 10: Git Hygiene And Handoff
628
+
629
+ **Files:**
630
+ - Verify target repo only.
631
+
632
+ - [ ] **Step 1: Confirm source repo was not destroyed**
633
+
634
+ Run:
635
+
636
+ ```bash
637
+ test -d /Users/buns/Documents/Projects/ampcode-cli
638
+ test -d /Users/buns/Documents/GitHub/OpenCoven/coven-code
639
+ ```
640
+
641
+ Expected: both exit 0.
642
+
643
+ - [ ] **Step 2: Review final target diff**
644
+
645
+ Run:
646
+
647
+ ```bash
648
+ git -C /Users/buns/Documents/GitHub/OpenCoven/coven-code status --short
649
+ git -C /Users/buns/Documents/GitHub/OpenCoven/coven-code diff --stat
650
+ ```
651
+
652
+ Expected: changes are limited to the copied/rebranded Coven Code tree.
653
+
654
+ - [ ] **Step 3: Commit only after verification**
655
+
656
+ Run only after Tasks 1-9 pass:
657
+
658
+ ```bash
659
+ git -C /Users/buns/Documents/GitHub/OpenCoven/coven-code add .
660
+ git -C /Users/buns/Documents/GitHub/OpenCoven/coven-code commit -m "chore: rebrand cli as coven code"
661
+ ```
662
+
663
+ Expected: one squashable local commit in `OpenCoven/coven-code`.
664
+
665
+ ## Self-Review
666
+
667
+ - Spec coverage: The plan covers move, package/bin rename, CLI runtime strings, config/env/settings, SDK, plugins, docs, tests, packaging, and final identity audit.
668
+ - Placeholder scan: No banned placeholder markers remain.
669
+ - Type/name consistency: The plan consistently uses `Coven Code`, `coven-code`, `coven-code-sdk`, `@opencoven/coven-code`, `COVEN_CODE_*`, `.coven-code`, and `covenCode.*`.
670
+ - OpenCoven policy: No AI/model/vendor attribution language is introduced.