funifier-mcp 0.3.21 → 0.4.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 (52) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +15 -11
  3. package/datasource-funifier-docs/.coverage.json +11 -3
  4. package/datasource-funifier-docs/.validation.json +87 -11
  5. package/datasource-funifier-docs/knowledge/guides/database-access.md +3 -0
  6. package/datasource-funifier-docs/knowledge/guides/explain-diagnostics.md +170 -0
  7. package/datasource-funifier-docs/knowledge/index.md +3 -0
  8. package/datasource-funifier-docs/knowledge/modules/custom-object.md +12 -7
  9. package/datasource-funifier-docs/knowledge/modules/database.md +48 -5
  10. package/dist/cli/config-writers.d.ts +1 -3
  11. package/dist/cli/config-writers.d.ts.map +1 -1
  12. package/dist/cli/config-writers.js +20 -11
  13. package/dist/cli/config-writers.js.map +1 -1
  14. package/dist/cli/config-writers.test.js +25 -18
  15. package/dist/cli/config-writers.test.js.map +1 -1
  16. package/dist/cli/init.d.ts.map +1 -1
  17. package/dist/cli/init.js +37 -36
  18. package/dist/cli/init.js.map +1 -1
  19. package/dist/cli/init.test.js +51 -17
  20. package/dist/cli/init.test.js.map +1 -1
  21. package/dist/cli/prompts.d.ts +1 -0
  22. package/dist/cli/prompts.d.ts.map +1 -1
  23. package/dist/cli/prompts.js +9 -0
  24. package/dist/cli/prompts.js.map +1 -1
  25. package/dist/mcp/bundle.js +132 -109
  26. package/dist/mcp/tools/database.d.ts.map +1 -1
  27. package/dist/mcp/tools/database.js +14 -2
  28. package/dist/mcp/tools/database.js.map +1 -1
  29. package/dist/mcp/tools/database.test.js +16 -0
  30. package/dist/mcp/tools/database.test.js.map +1 -1
  31. package/dist/mcp/tools/db-explain.d.ts +4 -0
  32. package/dist/mcp/tools/db-explain.d.ts.map +1 -0
  33. package/dist/mcp/tools/db-explain.js +187 -0
  34. package/dist/mcp/tools/db-explain.js.map +1 -0
  35. package/dist/mcp/tools/db-explain.test.d.ts +2 -0
  36. package/dist/mcp/tools/db-explain.test.d.ts.map +1 -0
  37. package/dist/mcp/tools/db-explain.test.js +142 -0
  38. package/dist/mcp/tools/db-explain.test.js.map +1 -0
  39. package/dist/mcp/tools/index.d.ts.map +1 -1
  40. package/dist/mcp/tools/index.js +2 -0
  41. package/dist/mcp/tools/index.js.map +1 -1
  42. package/dist/mcp/tools/list-tools.d.ts.map +1 -1
  43. package/dist/mcp/tools/list-tools.js +8 -0
  44. package/dist/mcp/tools/list-tools.js.map +1 -1
  45. package/package.json +1 -1
  46. package/skills/funifier/references/create-aggregate.md +10 -5
  47. package/skills/funifier/references/create-audit.md +0 -8
  48. package/skills/funifier/references/create-custom-object.md +0 -6
  49. package/skills/funifier/references/date-handling.md +0 -6
  50. package/skills/funifier/references/debug.md +2 -1
  51. package/skills/funifier/references/manage-indexes.md +0 -6
  52. package/skills/funifier/references/query-aggregate.md +2 -6
@@ -93,6 +93,16 @@ Síncrono. Idêntico ao POST exceto:
93
93
 
94
94
  **PUT é full replace, não PATCH:** campos ausentes no corpo são removidos do documento. Como `_id` é gerado quando ausente (passo [3]), um PUT sem `_id` **cria** um documento novo a cada chamada.
95
95
 
96
+ **Edição parcial segura (read-modify-write):** não existe merge — enviar `{_id, campoX}` para "mudar só o campoX" **apaga** todos os demais campos. Para editar um único campo de um documento existente, faça o ciclo completo:
97
+
98
+ ```
99
+ 1. query → busque o documento por _id (funifier_database action=query, query={"_id": "<id>"})
100
+ 2. edite → altere o campo desejado no objeto retornado (mantendo todos os outros campos)
101
+ 3. update → reenvie o DOCUMENTO COMPLETO (funifier_database action=update, data=<doc inteiro>)
102
+ ```
103
+
104
+ O agente é quem faz o read-modify-write, explicitamente — a tool `funifier_database action=update` não relê nem mescla. O mesmo vale para os módulos que usam `POST` como upsert (`player`, `point`, `level`, `mystery`): sempre reenvie o objeto completo.
105
+
96
106
  ### 2.4 Pipeline — `delete()` (DELETE por filtro)
97
107
 
98
108
  ```
@@ -113,6 +123,20 @@ Síncrono. Idêntico ao POST exceto:
113
123
  >
114
124
  > O comentário no código diz "menor que 1000", mas o limite real codificado é `<= 20_000`.
115
125
 
126
+ > ⚠️ **TIMEOUT — segunda armadilha (independente do no-op):** mesmo **abaixo** de 20.000, o `delete()` é **síncrono e pesado num único request HTTP**. Para `1 ≤ total ≤ 20.000` ele faz, em sequência, **três varreduras na coleção** mais a materialização de **todos** os `_id`s casados em memória:
127
+ >
128
+ > | Passo | Operação | Custo |
129
+ > |---|---|---|
130
+ > | 1 | `count("{q}")` | varredura (scan #1) |
131
+ > | 2 | `distinct("_id").query("{q}")` | varredura (scan #2) **+ materializa todos os N `_id`s** num `List<String>` |
132
+ > | 3 | `executeStrict(before_delete, ids)` | itera sobre `ids` (O(1) só sem delete-trigger registrado) |
133
+ > | 4 | `remove("{q}")` | varredura (scan #3) + N deleções |
134
+ > | 5 | `execute(after_delete, ids)` + `auditManager.log(..., ids)` | itera sobre `ids` |
135
+ >
136
+ > Para N na casa dos **milhares** (ex.: ~10.000) sobre um campo de filtro **não indexado**, cada varredura é O(tamanho da coleção); a soma das três + materialização **estoura o timeout do request/gateway**. Ou seja, há **duas cliffs distintas**: `> 20.000` = **no-op silencioso** (correção); milhares `≤ 20.000` = **timeout** (performance). Mitigação: §10.5 (lotes de **1.000** sobre **campo indexado**).
137
+ >
138
+ > ⚠️ Se a coleção tiver **delete-trigger** registrado ou **audit** configurado, os passos 3/5 rodam **por `_id`** — o custo multiplica e o lote seguro cai abaixo de 1.000.
139
+
116
140
  #### Fluxo de exclusão — `delete()`
117
141
 
118
142
  ```mermaid
@@ -363,7 +387,7 @@ Diferenças do REST padrão: é **full replace** (campos ausentes somem); sem `_
363
387
  | Validação | `collection > 0` E `q.trim().length() >= 3` |
364
388
  | Retorno | `200` body null (sempre) |
365
389
 
366
- Comportamento real (ver 2.4): `q` < 3 chars → no-op silencioso; **`total > 20.000` → no-op silencioso** (não apaga, não dispara trigger, não audita). A validação de 3 chars é só de comprimento — `q=a:1` (3 chars) apaga tudo onde `a==1`.
390
+ Comportamento real (ver 2.4): `q` < 3 chars → no-op silencioso; **`total > 20.000` → no-op silencioso** (não apaga, não dispara trigger, não audita). A validação de 3 chars é só de comprimento — `q=a:1` (3 chars) apaga tudo onde `a==1`. **E mesmo abaixo de 20.000**, casar **milhares** de docs faz a operação síncrona (count + distinct/materializa ids + remove = 3 varreduras) **estourar o timeout** — apague em **lotes de 1.000 sobre campo indexado** (§2.4, §10.5).
367
391
 
368
392
  ### 4.6 `POST /v3/database/{collection}/bulk`
369
393
 
@@ -576,6 +600,7 @@ Não há transação multi-documento. Bulk e aggregate-`out` gravam item a item;
576
600
 
577
601
  - **`PUT /{collection}/operations`** (update com `$inc`/`$set`/multi/upsert) — **comentado no código**, inexistente em runtime.
578
602
  - **DELETE acima de 20.000 documentos** — **no-op silencioso** (não apaga nada; ver 2.4).
603
+ - **DELETE de milhares de documentos (≤ 20.000)** — **timeout HTTP**: operação síncrona com 3 varreduras + materialização de todos os `_id`s num único request (ver 2.4). Apague em **lotes de 1.000 sobre campo indexado** (§10.5).
579
604
  - **Ordenação no GET list** — sem `$sort`; use `/aggregate`.
580
605
  - **Decriptação no GET list e no aggregate** — só GET-by-id decripta.
581
606
  - **Audit em bulk** — bulk não gera audit log.
@@ -656,6 +681,7 @@ GET /v3/database/{collection}/index # índices de uma coleção
656
681
  | GET list retorna `[]` com `q` complexo | Erro de query engolido por `getPageResult` |
657
682
  | Aggregate retorna 500 | Sintaxe de pipeline inválida (`getPageResultThrowsException`) |
658
683
  | **DELETE não apaga nada** | `q` < 3 chars, **ou filtro casa > 20.000 docs (no-op)**, ou nenhum match |
684
+ | **DELETE dá timeout / 504 / conexão cai** | Filtro casa **milhares de docs (≤ 20.000)**: operação síncrona (3 varreduras + materializa ids) estoura o timeout. → Apague em **lotes de 1.000 sobre campo indexado** (§10.5); se houver delete-trigger/audit, lotes menores |
659
685
  | Bulk async: dados somem após restart | Fila em memória, sem persistência |
660
686
  | Campo criptografado vem `null` na leitura | Foi gravado em texto puro por token sem `read_encrypted_field_values`, ou secret trocada |
661
687
  | Senha do player apagada após PUT | Token com `read_encrypted_player_password` e `password` não enviado |
@@ -663,7 +689,7 @@ GET /v3/database/{collection}/index # índices de uma coleção
663
689
  ### 9.3 Queries úteis (mongosh / via aggregate)
664
690
 
665
691
  ```javascript
666
- // quantos documentos um DELETE tentaria apagar (cheque o limite de 20.000!)
692
+ // quantos documentos um DELETE tentaria apagar (>20.000 = no-op; milhares = timeout — apague em lotes de 1.000)
667
693
  db.minha__c.countDocuments({ status: "active" })
668
694
 
669
695
  // ver índices reais de uma coleção
@@ -687,7 +713,7 @@ POST /v3/database/action_log/aggregate
687
713
 
688
714
  1. O token tem o scope correto? (`database`; e `read_encrypted_*` se aplicável)
689
715
  2. O nome da coleção respeita o tamanho mínimo do endpoint (ver 5.2)?
690
- 3. No DELETE: o filtro casa **entre 1 e 20.000** documentos?
716
+ 3. No DELETE: o filtro casa **entre 1 e 20.000** documentos (acima = no-op)? E **cada chamada** casa **≤ 1.000** sobre **campo indexado** (acima = risco de timeout)?
691
717
  4. Há `CryptObjectField` + `CryptTenantSecret` ativa coerentes com o que foi gravado?
692
718
  5. A fila async está drenando (`/queue/info`)?
693
719
 
@@ -780,7 +806,24 @@ Sem `_id`, cada PUT **cria** um documento novo (ObjectId gerado). Sempre inclua
780
806
  DELETE /v3/database/logs__c?q=ttl:1
781
807
  ```
782
808
 
783
- Se o filtro casar **mais de 20.000** documentos, **nada é apagado** (no-op silencioso, 200). Apague em lotes (`q` que limite a ≤ 20.000 por chamada) ou use `drop` se a coleção inteira puder ir embora.
809
+ Um filtro amplo cai numa de **duas armadilhas** (ver §2.4):
810
+
811
+ - **> 20.000 docs → no-op silencioso** (200, nada apagado).
812
+ - **Milhares ≤ 20.000 → timeout HTTP**: o `delete()` é síncrono e faz 3 varreduras na coleção + materializa todos os `_id`s em memória, tudo num único request.
813
+
814
+ **Apague em lotes de 1.000 documentos por chamada, sobre um campo de filtro indexado.** O número 1.000 vem do próprio comentário do código (`DatabaseRest.delete`: *"…se o número de registros for menor que 1000…"*) — é a intenção original de lote seguro, não um limite da plataforma; ajuste conforme a latência observada.
815
+
816
+ > ⚠️ O `DELETE` REST **não aceita `$limit`/`max_results`** — não dá para "apagar 1.000 por vez" sem particionar o filtro. "Lote" aqui = montar `q` que **case ≤ 1.000** por chamada (janelas de data, prefixos de `_id`, faixas de uma chave) e **repetir** até zerar. Cada chamada deve filtrar por **campo indexado** — senão as 3 varreduras continuam O(coleção inteira) e o timeout volta.
817
+
818
+ ```http
819
+ # ✅ Em lotes, por janela de tempo (campo `time` indexado), repetindo até zerar:
820
+ GET /v3/database/logs__c/count?q=ttl:1,time:{$lt:1704067200000} # confirme ≤ 1.000
821
+ DELETE /v3/database/logs__c?q=ttl:1,time:{$lt:1704067200000}
822
+ ```
823
+
824
+ **Alternativas:**
825
+ - Se a coleção **inteira** pode ir embora → `DELETE /v3/database/logs__c/drop` (uma operação, sem as 3 varreduras; ⚠️ não checa scope — §8.2).
826
+ - Para exclusão massiva sem o timeout do REST → mova a deleção para **trigger/scheduler/public endpoint** (`manager.getJongoConnection().getCollection(...).remove(...)` em laço server-side, fora do request HTTP).
784
827
 
785
828
  **NÃO FAÇA — ler dados sensíveis por GET list ou aggregate esperando decriptação:**
786
829
 
@@ -800,7 +843,7 @@ O valor vai em **texto puro** e a leitura futura (com o scope) retorna `null`. U
800
843
 
801
844
  - [ ] Token tem o scope `database` (lembre: a checagem é por **substring**).
802
845
  - [ ] Coleções customizadas usam sufixo `__c`; `out` de aggregate **deve** terminar em `__c`.
803
- - [ ] DELETE: o filtro `q` tem ≥ 3 chars **e** casa **no máximo 20.000** documentos (acima disso é no-op).
846
+ - [ ] DELETE: o filtro `q` tem ≥ 3 chars **e** casa **no máximo 20.000** documentos (acima disso é no-op) **e cada chamada casa ≤ 1.000 sobre campo indexado** (acima disso, risco de timeout — apague em lotes; §10.5).
804
847
  - [ ] Para preservar `password` em `player`: garanta o mesmo nível de permissão (`read_encrypted_player_password`) ao ler e gravar.
805
848
  - [ ] Para campos criptografados: ler **e** gravar com `read_encrypted_field_values`; `CryptObjectField` (tenant) e `CryptTenantSecret` ativa (sistema) coerentes.
806
849
  - [ ] `drop`, `collections` (tenant) e `queue/*` não checam scope — proteja esses tokens de clientes não confiáveis.
@@ -5,11 +5,9 @@ export interface Credentials {
5
5
  }
6
6
  export interface ConfigInput {
7
7
  projectDir: string;
8
- bundlePath: string;
9
- docsPath: string;
10
8
  creds: Credentials;
11
9
  }
12
- export declare function renderCodexConfig({ projectDir, bundlePath, docsPath, creds }: ConfigInput): string;
10
+ export declare function renderCodexConfig({ projectDir, creds }: ConfigInput): string;
13
11
  export declare function renderOpencodeConfig(input: ConfigInput): string;
14
12
  export declare function renderCursorConfig(input: ConfigInput): string;
15
13
  export declare function renderKimiConfig(input: ConfigInput): string;
@@ -1 +1 @@
1
- {"version":3,"file":"config-writers.d.ts","sourceRoot":"","sources":["../../src/cli/config-writers.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;CACpB;AAMD,wBAAgB,iBAAiB,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,WAAW,GAAG,MAAM,CAclG;AAYD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAe/D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAe7D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAe3D"}
1
+ {"version":3,"file":"config-writers.d.ts","sourceRoot":"","sources":["../../src/cli/config-writers.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;CACpB;AAiBD,wBAAgB,iBAAiB,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,WAAW,GAAG,MAAM,CAa5E;AAaD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAe/D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAe7D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAe3D"}
@@ -4,13 +4,22 @@ exports.renderCodexConfig = renderCodexConfig;
4
4
  exports.renderOpencodeConfig = renderOpencodeConfig;
5
5
  exports.renderCursorConfig = renderCursorConfig;
6
6
  exports.renderKimiConfig = renderKimiConfig;
7
+ // The MCP server ships as an npm package with an npx-ready bin. Every client runs it via
8
+ // `npx -y funifier-mcp@latest` so nothing is installed into the consumer's project —
9
+ // no package.json/lockfile/node_modules mutation, no dependency conflicts. `@latest`
10
+ // keeps clients current on each cold start (npx caches in ~/.npm/_npx).
11
+ const NPX_COMMAND = "npx";
12
+ const NPX_ARGS = ["-y", "funifier-mcp@latest"];
7
13
  function tomlString(v) {
8
14
  return `"${v.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
9
15
  }
10
- function renderCodexConfig({ projectDir, bundlePath, docsPath, creds }) {
16
+ function tomlStringArray(items) {
17
+ return `[${items.map(tomlString).join(", ")}]`;
18
+ }
19
+ function renderCodexConfig({ projectDir, creds }) {
11
20
  return `[mcp_servers.funifier]
12
- command = "node"
13
- args = [${tomlString(bundlePath)}]
21
+ command = ${tomlString(NPX_COMMAND)}
22
+ args = ${tomlStringArray(NPX_ARGS)}
14
23
  cwd = ${tomlString(projectDir)}
15
24
  enabled = true
16
25
 
@@ -18,16 +27,16 @@ enabled = true
18
27
  FUNIFIER_API_KEY = ${tomlString(creds.apiKey)}
19
28
  FUNIFIER_SECRET_KEY = ${tomlString(creds.secretKey)}
20
29
  FUNIFIER_SERVER_URL = ${tomlString(creds.serverUrl)}
21
- FUNIFIER_DOCS_PATH = ${tomlString(docsPath)}
22
30
  FUNIFIER_PROJECT_ROOT = ${tomlString(projectDir)}
23
31
  `;
24
32
  }
25
- function funifierEnv({ projectDir, docsPath, creds }) {
33
+ // The server auto-resolves its bundled docs from the running package (see
34
+ // resolveDocsPath in resources/documentation.ts), so no FUNIFIER_DOCS_PATH is needed.
35
+ function funifierEnv({ projectDir, creds }) {
26
36
  return {
27
37
  FUNIFIER_API_KEY: creds.apiKey,
28
38
  FUNIFIER_SECRET_KEY: creds.secretKey,
29
39
  FUNIFIER_SERVER_URL: creds.serverUrl,
30
- FUNIFIER_DOCS_PATH: docsPath,
31
40
  FUNIFIER_PROJECT_ROOT: projectDir,
32
41
  };
33
42
  }
@@ -36,7 +45,7 @@ function renderOpencodeConfig(input) {
36
45
  mcp: {
37
46
  funifier: {
38
47
  type: "local",
39
- command: ["node", input.bundlePath],
48
+ command: [NPX_COMMAND, ...NPX_ARGS],
40
49
  cwd: input.projectDir,
41
50
  environment: funifierEnv(input),
42
51
  },
@@ -47,8 +56,8 @@ function renderCursorConfig(input) {
47
56
  return JSON.stringify({
48
57
  mcpServers: {
49
58
  funifier: {
50
- command: "node",
51
- args: [input.bundlePath],
59
+ command: NPX_COMMAND,
60
+ args: NPX_ARGS,
52
61
  cwd: input.projectDir,
53
62
  env: funifierEnv(input),
54
63
  },
@@ -59,8 +68,8 @@ function renderKimiConfig(input) {
59
68
  return JSON.stringify({
60
69
  mcpServers: {
61
70
  funifier: {
62
- command: "node",
63
- args: [input.bundlePath],
71
+ command: NPX_COMMAND,
72
+ args: NPX_ARGS,
64
73
  cwd: input.projectDir,
65
74
  env: funifierEnv(input),
66
75
  },
@@ -1 +1 @@
1
- {"version":3,"file":"config-writers.js","sourceRoot":"","sources":["../../src/cli/config-writers.ts"],"names":[],"mappings":";;AAiBA,8CAcC;AAYD,oDAeC;AAED,gDAeC;AAED,4CAeC;AA/ED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;AAC9D,CAAC;AAED,SAAgB,iBAAiB,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAe;IACxF,OAAO;;UAEC,UAAU,CAAC,UAAU,CAAC;QACxB,UAAU,CAAC,UAAU,CAAC;;;;qBAIT,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;wBACrB,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;wBAC3B,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;uBAC5B,UAAU,CAAC,QAAQ,CAAC;0BACjB,UAAU,CAAC,UAAU,CAAC;CAC/C,CAAC;AACF,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAe;IAC/D,OAAO;QACL,gBAAgB,EAAE,KAAK,CAAC,MAAM;QAC9B,mBAAmB,EAAE,KAAK,CAAC,SAAS;QACpC,mBAAmB,EAAE,KAAK,CAAC,SAAS;QACpC,kBAAkB,EAAE,QAAQ;QAC5B,qBAAqB,EAAE,UAAU;KAClC,CAAC;AACJ,CAAC;AAED,SAAgB,oBAAoB,CAAC,KAAkB;IACrD,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,GAAG,EAAE;YACH,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC;gBACnC,GAAG,EAAE,KAAK,CAAC,UAAU;gBACrB,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC;aAChC;SACF;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAgB,kBAAkB,CAAC,KAAkB;IACnD,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;gBACxB,GAAG,EAAE,KAAK,CAAC,UAAU;gBACrB,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC;aACxB;SACF;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAkB;IACjD,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;gBACxB,GAAG,EAAE,KAAK,CAAC,UAAU;gBACrB,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC;aACxB;SACF;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config-writers.js","sourceRoot":"","sources":["../../src/cli/config-writers.ts"],"names":[],"mappings":";;AA0BA,8CAaC;AAaD,oDAeC;AAED,gDAeC;AAED,4CAeC;AA1FD,yFAAyF;AACzF,qFAAqF;AACrF,qFAAqF;AACrF,wEAAwE;AACxE,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;AAE/C,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;AAC9D,CAAC;AAED,SAAS,eAAe,CAAC,KAAe;IACtC,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACjD,CAAC;AAED,SAAgB,iBAAiB,CAAC,EAAE,UAAU,EAAE,KAAK,EAAe;IAClE,OAAO;YACG,UAAU,CAAC,WAAW,CAAC;SAC1B,eAAe,CAAC,QAAQ,CAAC;QAC1B,UAAU,CAAC,UAAU,CAAC;;;;qBAIT,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;wBACrB,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;wBAC3B,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;0BACzB,UAAU,CAAC,UAAU,CAAC;CAC/C,CAAC;AACF,CAAC;AAED,0EAA0E;AAC1E,sFAAsF;AACtF,SAAS,WAAW,CAAC,EAAE,UAAU,EAAE,KAAK,EAAe;IACrD,OAAO;QACL,gBAAgB,EAAE,KAAK,CAAC,MAAM;QAC9B,mBAAmB,EAAE,KAAK,CAAC,SAAS;QACpC,mBAAmB,EAAE,KAAK,CAAC,SAAS;QACpC,qBAAqB,EAAE,UAAU;KAClC,CAAC;AACJ,CAAC;AAED,SAAgB,oBAAoB,CAAC,KAAkB;IACrD,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,GAAG,EAAE;YACH,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC;gBACnC,GAAG,EAAE,KAAK,CAAC,UAAU;gBACrB,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC;aAChC;SACF;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAgB,kBAAkB,CAAC,KAAkB;IACnD,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,OAAO,EAAE,WAAW;gBACpB,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,KAAK,CAAC,UAAU;gBACrB,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC;aACxB;SACF;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAkB;IACjD,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,OAAO,EAAE,WAAW;gBACpB,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,KAAK,CAAC,UAAU;gBACrB,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC;aACxB;SACF;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -7,54 +7,61 @@ const creds = {
7
7
  secretKey: "SK",
8
8
  serverUrl: "https://acme.funifier.com",
9
9
  };
10
- const pkgRoot = "/pkg/root";
11
10
  const projectDir = "/proj";
12
- const bundlePath = "/pkg/root/dist/mcp/bundle.js";
13
- const docsPath = "/pkg/root/datasource-funifier-docs/knowledge";
14
11
  (0, vitest_1.describe)("renderCodexConfig", () => {
15
- (0, vitest_1.it)("produces valid TOML with command, args, cwd, and env", () => {
16
- const out = (0, config_writers_1.renderCodexConfig)({ projectDir, bundlePath, docsPath, creds });
12
+ (0, vitest_1.it)("runs the server via npx with command, args, cwd, and env", () => {
13
+ const out = (0, config_writers_1.renderCodexConfig)({ projectDir, creds });
17
14
  (0, vitest_1.expect)(out).toContain("[mcp_servers.funifier]");
18
- (0, vitest_1.expect)(out).toContain('command = "node"');
19
- (0, vitest_1.expect)(out).toContain(`args = ["${bundlePath}"]`);
15
+ (0, vitest_1.expect)(out).toContain('command = "npx"');
16
+ (0, vitest_1.expect)(out).toContain('args = ["-y", "funifier-mcp@latest"]');
20
17
  (0, vitest_1.expect)(out).toContain(`cwd = "${projectDir}"`);
21
18
  (0, vitest_1.expect)(out).toContain("enabled = true");
22
19
  (0, vitest_1.expect)(out).toContain("[mcp_servers.funifier.env]");
23
20
  (0, vitest_1.expect)(out).toContain('FUNIFIER_API_KEY = "AK"');
24
21
  (0, vitest_1.expect)(out).toContain('FUNIFIER_SECRET_KEY = "SK"');
25
22
  (0, vitest_1.expect)(out).toContain('FUNIFIER_SERVER_URL = "https://acme.funifier.com"');
26
- (0, vitest_1.expect)(out).toContain(`FUNIFIER_DOCS_PATH = "${docsPath}"`);
27
23
  (0, vitest_1.expect)(out).toContain(`FUNIFIER_PROJECT_ROOT = "${projectDir}"`);
24
+ // No project-local install coupling.
25
+ (0, vitest_1.expect)(out).not.toContain("bundle.js");
26
+ (0, vitest_1.expect)(out).not.toContain("FUNIFIER_DOCS_PATH");
28
27
  });
29
28
  (0, vitest_1.it)("escapes double quotes in values", () => {
30
29
  const out = (0, config_writers_1.renderCodexConfig)({
31
30
  projectDir,
32
- bundlePath,
33
- docsPath,
34
31
  creds: { ...creds, apiKey: 'has"quote' },
35
32
  });
36
33
  (0, vitest_1.expect)(out).toContain('FUNIFIER_API_KEY = "has\\"quote"');
37
34
  });
38
35
  });
39
36
  (0, vitest_1.describe)("renderOpencodeConfig", () => {
40
- (0, vitest_1.it)("produces valid JSON with mcp.funifier.command array, cwd, and environment", () => {
41
- const out = JSON.parse((0, config_writers_1.renderOpencodeConfig)({ projectDir, bundlePath, docsPath, creds }));
37
+ (0, vitest_1.it)("produces valid JSON with an npx command array, cwd, and environment", () => {
38
+ const out = JSON.parse((0, config_writers_1.renderOpencodeConfig)({ projectDir, creds }));
42
39
  (0, vitest_1.expect)(out.mcp.funifier.type).toBe("local");
43
- (0, vitest_1.expect)(out.mcp.funifier.command).toEqual(["node", bundlePath]);
40
+ (0, vitest_1.expect)(out.mcp.funifier.command).toEqual(["npx", "-y", "funifier-mcp@latest"]);
44
41
  (0, vitest_1.expect)(out.mcp.funifier.cwd).toBe(projectDir);
45
42
  (0, vitest_1.expect)(out.mcp.funifier.environment.FUNIFIER_API_KEY).toBe("AK");
46
- (0, vitest_1.expect)(out.mcp.funifier.environment.FUNIFIER_DOCS_PATH).toBe(docsPath);
47
43
  (0, vitest_1.expect)(out.mcp.funifier.environment.FUNIFIER_PROJECT_ROOT).toBe(projectDir);
44
+ (0, vitest_1.expect)(out.mcp.funifier.environment.FUNIFIER_DOCS_PATH).toBeUndefined();
48
45
  });
49
46
  });
50
47
  (0, vitest_1.describe)("renderCursorConfig", () => {
51
- (0, vitest_1.it)("produces valid JSON with mcpServers.funifier.command/args/cwd/env", () => {
52
- const out = JSON.parse((0, config_writers_1.renderCursorConfig)({ projectDir, bundlePath, docsPath, creds }));
53
- (0, vitest_1.expect)(out.mcpServers.funifier.command).toBe("node");
54
- (0, vitest_1.expect)(out.mcpServers.funifier.args).toEqual([bundlePath]);
48
+ (0, vitest_1.it)("produces valid JSON with npx command/args/cwd/env", () => {
49
+ const out = JSON.parse((0, config_writers_1.renderCursorConfig)({ projectDir, creds }));
50
+ (0, vitest_1.expect)(out.mcpServers.funifier.command).toBe("npx");
51
+ (0, vitest_1.expect)(out.mcpServers.funifier.args).toEqual(["-y", "funifier-mcp@latest"]);
55
52
  (0, vitest_1.expect)(out.mcpServers.funifier.cwd).toBe(projectDir);
56
53
  (0, vitest_1.expect)(out.mcpServers.funifier.env.FUNIFIER_SECRET_KEY).toBe("SK");
57
54
  (0, vitest_1.expect)(out.mcpServers.funifier.env.FUNIFIER_PROJECT_ROOT).toBe(projectDir);
55
+ (0, vitest_1.expect)(out.mcpServers.funifier.env.FUNIFIER_DOCS_PATH).toBeUndefined();
56
+ });
57
+ });
58
+ (0, vitest_1.describe)("renderKimiConfig", () => {
59
+ (0, vitest_1.it)("produces valid JSON with npx command/args/cwd/env", () => {
60
+ const out = JSON.parse((0, config_writers_1.renderKimiConfig)({ projectDir, creds }));
61
+ (0, vitest_1.expect)(out.mcpServers.funifier.command).toBe("npx");
62
+ (0, vitest_1.expect)(out.mcpServers.funifier.args).toEqual(["-y", "funifier-mcp@latest"]);
63
+ (0, vitest_1.expect)(out.mcpServers.funifier.cwd).toBe(projectDir);
64
+ (0, vitest_1.expect)(out.mcpServers.funifier.env.FUNIFIER_API_KEY).toBe("AK");
58
65
  });
59
66
  });
60
67
  //# sourceMappingURL=config-writers.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-writers.test.js","sourceRoot":"","sources":["../../src/cli/config-writers.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-writers.test.js","sourceRoot":"","sources":["../../src/cli/config-writers.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AA8OA,wBAA8B,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDzF"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAmPA,wBAA8B,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CzF"}
package/dist/cli/init.js CHANGED
@@ -47,13 +47,6 @@ const PLACEHOLDER_CREDS = {
47
47
  secretKey: "your-secret-key",
48
48
  serverUrl: "https://your-instance.funifier.com",
49
49
  };
50
- function ensurePackageJson(projectDir) {
51
- if (!fs.existsSync(path.join(projectDir, "package.json"))) {
52
- console.log("📋 No package.json found — running `npm init -y`...");
53
- (0, child_process_1.execSync)("npm init -y", { cwd: projectDir, stdio: "inherit" });
54
- console.log("");
55
- }
56
- }
57
50
  function requireTty() {
58
51
  if (!process.stdout.isTTY || !process.stdin.isTTY) {
59
52
  console.error("❌ funifier-mcp init requires an interactive terminal.");
@@ -173,15 +166,13 @@ async function copyPlatformFiles(pkgRoot, projectDir, platforms, resolver) {
173
166
  }
174
167
  }
175
168
  }
176
- function writePlatformConfigs(pkgRoot, projectDir, platforms, creds) {
177
- const bundlePath = path.join(pkgRoot, "dist", "mcp", "bundle.js");
178
- const docsPath = path.join(pkgRoot, "datasource-funifier-docs", "knowledge");
169
+ function writePlatformConfigs(projectDir, platforms, creds) {
179
170
  for (const platform of platforms) {
180
171
  if (!platform.configFile)
181
172
  continue;
182
173
  const target = path.join(projectDir, platform.configFile.dest);
183
174
  fs.mkdirSync(path.dirname(target), { recursive: true });
184
- const content = platform.configFile.render({ projectDir, bundlePath, docsPath, creds });
175
+ const content = platform.configFile.render({ projectDir, creds });
185
176
  fs.writeFileSync(target, content);
186
177
  console.log(` ✓ ${platform.configFile.dest}`);
187
178
  }
@@ -196,24 +187,38 @@ function removeLegacyFunifierSkills(skillsDir) {
196
187
  }
197
188
  }
198
189
  }
199
- function installFunifierMcp(projectDir) {
200
- // Detect update mode: funifier-mcp already installed means any failure strands the user on the old version.
201
- const isUpdate = fs.existsSync(path.join(projectDir, "node_modules", "funifier-mcp"));
202
- console.log("📥 Installing funifier-mcp@latest locally...");
190
+ // The MCP now runs via npx (see config-writers.ts), so a project-local install is dead weight
191
+ // and the classic source of dependency conflicts. Detect a legacy install and offer to remove it.
192
+ function hasLegacyLocalInstall(projectDir) {
193
+ if (fs.existsSync(path.join(projectDir, "node_modules", "funifier-mcp")))
194
+ return true;
195
+ const pkgJsonPath = path.join(projectDir, "package.json");
196
+ if (!fs.existsSync(pkgJsonPath))
197
+ return false;
203
198
  try {
204
- (0, child_process_1.execSync)("npm install funifier-mcp@latest --save", { cwd: projectDir, stdio: "inherit" });
199
+ const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"));
200
+ return Boolean(pkg.dependencies?.["funifier-mcp"] || pkg.devDependencies?.["funifier-mcp"]);
205
201
  }
206
- catch (err) {
207
- if (isUpdate) {
208
- throw new Error("npm install funifier-mcp@latest failed — existing installation was not updated. " +
209
- "Fix the npm error above and re-run init.");
210
- }
211
- console.warn(" ⚠ npm install failed — continuing with bundled package");
202
+ catch {
203
+ return false;
212
204
  }
213
205
  }
214
- function resolveEffectivePkgRoot(projectDir) {
215
- const local = path.join(projectDir, "node_modules", "funifier-mcp");
216
- return fs.existsSync(local) ? local : (0, paths_1.resolvePackageRoot)();
206
+ async function cleanupLegacyInstall(projectDir) {
207
+ if (!hasLegacyLocalInstall(projectDir))
208
+ return;
209
+ console.log("\nℹ funifier-mcp is installed as a project dependency. The MCP now runs via npx —" +
210
+ " the local install is no longer needed.");
211
+ if (!(await (0, prompts_1.askUninstallLegacy)())) {
212
+ console.log(" – kept the local funifier-mcp install (safe to remove: `npm uninstall funifier-mcp`)");
213
+ return;
214
+ }
215
+ try {
216
+ (0, child_process_1.execSync)("npm uninstall funifier-mcp", { cwd: projectDir, stdio: "inherit" });
217
+ console.log(" ✗ removed local funifier-mcp dependency");
218
+ }
219
+ catch {
220
+ console.warn(" ⚠ `npm uninstall funifier-mcp` failed — remove it manually if conflicts persist");
221
+ }
217
222
  }
218
223
  /**
219
224
  * Build the TF-IDF search index from the docs directory and write it to disk.
@@ -253,16 +258,11 @@ async function main(targetDir, devPkgRoot) {
253
258
  console.log("📦 Funifier MCP Setup\n");
254
259
  const projectDir = targetDir ? path.resolve(targetDir) : process.cwd();
255
260
  requireTty();
256
- ensurePackageJson(projectDir);
257
- let pkgRoot;
258
- if (devPkgRoot) {
261
+ // Run the MCP straight from the package that hosts this `init` command (npx cache in prod,
262
+ // the checked-out repo in dev). Nothing is installed into the consumer project.
263
+ const pkgRoot = devPkgRoot ?? (0, paths_1.resolvePackageRoot)();
264
+ if (devPkgRoot)
259
265
  console.log(`🔧 Dev mode — using local package at ${devPkgRoot}\n`);
260
- pkgRoot = devPkgRoot;
261
- }
262
- else {
263
- installFunifierMcp(projectDir);
264
- pkgRoot = resolveEffectivePkgRoot(projectDir);
265
- }
266
266
  const platforms = await (0, prompts_1.selectPlatforms)();
267
267
  const creds = await (0, prompts_1.askCredentials)(projectDir);
268
268
  console.log("");
@@ -271,10 +271,11 @@ async function main(targetDir, devPkgRoot) {
271
271
  const resolver = makeConflictResolver();
272
272
  await copyPlatformFiles(pkgRoot, projectDir, platforms, resolver);
273
273
  await cleanupLegacyDocsCopy(projectDir);
274
+ await cleanupLegacyInstall(projectDir);
274
275
  ensurePersonaSection(projectDir, platforms);
275
276
  writeFunifierJson(projectDir, creds);
276
277
  ensureGitignoreEntries(projectDir, !!creds);
277
- writePlatformConfigs(pkgRoot, projectDir, platforms, creds ?? PLACEHOLDER_CREDS);
278
+ writePlatformConfigs(projectDir, platforms, creds ?? PLACEHOLDER_CREDS);
278
279
  console.log("\n✅ Setup complete.");
279
280
  if (platforms.some((p) => p.key === "claude-code")) {
280
281
  console.log(" Claude Code: type /funifier to start.");
@@ -289,7 +290,7 @@ async function main(targetDir, devPkgRoot) {
289
290
  const homeDir = process.env.USERPROFILE || process.env.HOME || "~";
290
291
  const globalConfigPath = path.join(homeDir, ".kimi", "mcp.json");
291
292
  console.log(` Kimi: merge .kimi/mcp.json into ${globalConfigPath}`);
292
- console.log(" Or: run `kimi mcp add --transport stdio funifier -- node <path-to-bundle.js>`");
293
+ console.log(" Or: run `kimi mcp add --transport stdio funifier -- npx -y funifier-mcp@latest`");
293
294
  }
294
295
  if (!creds) {
295
296
  console.log(" ⚠ Fill in funifier.json.example and rename to funifier.json before using the MCP.");
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -46,6 +46,7 @@ vitest_1.vi.mock("./prompts", () => ({
46
46
  askCredentials: vitest_1.vi.fn(),
47
47
  askConflict: vitest_1.vi.fn(),
48
48
  askRemoveLegacyDocs: vitest_1.vi.fn(),
49
+ askUninstallLegacy: vitest_1.vi.fn(),
49
50
  }));
50
51
  vitest_1.vi.mock("./paths", () => ({
51
52
  resolvePackageRoot: vitest_1.vi.fn(),
@@ -107,7 +108,19 @@ const originalExit = process.exit;
107
108
  { src: "skills", dest: ".agents/skills", isDir: true },
108
109
  { src: "AGENTS.md", dest: "AGENTS.md" },
109
110
  ],
110
- configFile: { dest: "opencode.json", render: ({ projectDir, bundlePath, docsPath, creds }) => JSON.stringify({ projectDir, bundlePath, docsPath, creds }) },
111
+ configFile: {
112
+ dest: "opencode.json",
113
+ render: ({ projectDir, creds }) => JSON.stringify({
114
+ mcpServers: {
115
+ funifier: {
116
+ command: "npx",
117
+ args: ["-y", "funifier-mcp@latest"],
118
+ cwd: projectDir,
119
+ env: { FUNIFIER_API_KEY: creds.apiKey },
120
+ },
121
+ },
122
+ }),
123
+ },
111
124
  },
112
125
  ]);
113
126
  });
@@ -217,7 +230,7 @@ const originalExit = process.exit;
217
230
  (0, vitest_1.expect)(content).toContain(".funifier/backups/");
218
231
  (0, vitest_1.expect)(content.split("funifier.json").length - 1).toBe(1);
219
232
  });
220
- (0, vitest_1.it)("writes platform config with docs path pointing at the package (node_modules)", async () => {
233
+ (0, vitest_1.it)("writes an npx-based platform config with no project-local install coupling", async () => {
221
234
  const creds = {
222
235
  apiKey: "test-api-key",
223
236
  secretKey: "test-secret",
@@ -228,10 +241,21 @@ const originalExit = process.exit;
228
241
  await (0, init_1.default)();
229
242
  const configPath = path.join(projectDir, "opencode.json");
230
243
  (0, vitest_1.expect)(fs.existsSync(configPath)).toBe(true);
231
- const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
232
- // docsPath should point to the package's bundled docs, not a project-local copy
233
- (0, vitest_1.expect)(config.docsPath).toBe(path.join(pkgRoot, "datasource-funifier-docs", "knowledge"));
234
- (0, vitest_1.expect)(config.docsPath).not.toContain(projectDir);
244
+ const raw = fs.readFileSync(configPath, "utf-8");
245
+ const config = JSON.parse(raw);
246
+ (0, vitest_1.expect)(config.mcpServers.funifier.command).toBe("npx");
247
+ (0, vitest_1.expect)(config.mcpServers.funifier.args).toEqual(["-y", "funifier-mcp@latest"]);
248
+ // Nothing points at the consumer's node_modules / bundle.
249
+ (0, vitest_1.expect)(raw).not.toContain("bundle.js");
250
+ (0, vitest_1.expect)(raw).not.toContain("node_modules");
251
+ });
252
+ (0, vitest_1.it)("does not install funifier-mcp into the project (no npm install / npm init)", async () => {
253
+ vitest_1.vi.mocked(prompts_1.askCredentials).mockResolvedValue(null);
254
+ vitest_1.vi.mocked(prompts_1.askConflict).mockResolvedValue("overwrite");
255
+ await (0, init_1.default)();
256
+ const calls = vitest_1.vi.mocked(child_process_1.execSync).mock.calls.map((c) => String(c[0]));
257
+ (0, vitest_1.expect)(calls.some((cmd) => cmd.includes("npm install"))).toBe(false);
258
+ (0, vitest_1.expect)(calls.some((cmd) => cmd.includes("npm init"))).toBe(false);
235
259
  });
236
260
  (0, vitest_1.it)("exits when not in a TTY", async () => {
237
261
  Object.defineProperty(process.stdout, "isTTY", { value: false, configurable: true });
@@ -313,23 +337,33 @@ const originalExit = process.exit;
313
337
  (0, vitest_1.expect)(countOccurrences(claude, PERSONA_HEADING)).toBe(1);
314
338
  });
315
339
  });
316
- (0, vitest_1.describe)("installFunifierMcp", () => {
317
- (0, vitest_1.it)("throws when execSync fails and funifier-mcp is already installed (update mode)", async () => {
340
+ (0, vitest_1.describe)("cleanupLegacyInstall (migration)", () => {
341
+ (0, vitest_1.it)("offers to uninstall a legacy project-local install and runs npm uninstall when accepted", async () => {
318
342
  fs.mkdirSync(path.join(projectDir, "node_modules", "funifier-mcp"), { recursive: true });
319
- vitest_1.vi.mocked(child_process_1.execSync).mockImplementation(() => {
320
- throw new Error("npm error");
321
- });
322
343
  vitest_1.vi.mocked(prompts_1.askCredentials).mockResolvedValue(null);
323
344
  vitest_1.vi.mocked(prompts_1.askConflict).mockResolvedValue("overwrite");
324
- await (0, vitest_1.expect)((0, init_1.default)()).rejects.toThrow("npm install funifier-mcp@latest failed — existing installation was not updated.");
345
+ vitest_1.vi.mocked(prompts_1.askUninstallLegacy).mockResolvedValue(true);
346
+ await (0, init_1.default)();
347
+ (0, vitest_1.expect)(prompts_1.askUninstallLegacy).toHaveBeenCalled();
348
+ const calls = vitest_1.vi.mocked(child_process_1.execSync).mock.calls.map((c) => String(c[0]));
349
+ (0, vitest_1.expect)(calls.some((cmd) => cmd.includes("npm uninstall funifier-mcp"))).toBe(true);
350
+ });
351
+ (0, vitest_1.it)("detects a legacy install declared only in package.json dependencies", async () => {
352
+ fs.writeFileSync(path.join(projectDir, "package.json"), JSON.stringify({ name: "test-project", dependencies: { "funifier-mcp": "^0.3.0" } }));
353
+ vitest_1.vi.mocked(prompts_1.askCredentials).mockResolvedValue(null);
354
+ vitest_1.vi.mocked(prompts_1.askConflict).mockResolvedValue("overwrite");
355
+ vitest_1.vi.mocked(prompts_1.askUninstallLegacy).mockResolvedValue(false);
356
+ await (0, init_1.default)();
357
+ (0, vitest_1.expect)(prompts_1.askUninstallLegacy).toHaveBeenCalled();
358
+ // Declined → no uninstall command issued.
359
+ const calls = vitest_1.vi.mocked(child_process_1.execSync).mock.calls.map((c) => String(c[0]));
360
+ (0, vitest_1.expect)(calls.some((cmd) => cmd.includes("npm uninstall"))).toBe(false);
325
361
  });
326
- (0, vitest_1.it)("warns and continues when execSync fails without a prior funifier-mcp installation", async () => {
327
- vitest_1.vi.mocked(child_process_1.execSync).mockImplementation(() => {
328
- throw new Error("npm error");
329
- });
362
+ (0, vitest_1.it)("does not prompt when there is no legacy install", async () => {
330
363
  vitest_1.vi.mocked(prompts_1.askCredentials).mockResolvedValue(null);
331
364
  vitest_1.vi.mocked(prompts_1.askConflict).mockResolvedValue("overwrite");
332
- await (0, vitest_1.expect)((0, init_1.default)()).resolves.toBeUndefined();
365
+ await (0, init_1.default)();
366
+ (0, vitest_1.expect)(prompts_1.askUninstallLegacy).not.toHaveBeenCalled();
333
367
  });
334
368
  });
335
369
  (0, vitest_1.describe)("ensureSearchIndex", () => {