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.
- package/CHANGELOG.md +46 -0
- package/README.md +15 -11
- package/datasource-funifier-docs/.coverage.json +11 -3
- package/datasource-funifier-docs/.validation.json +87 -11
- package/datasource-funifier-docs/knowledge/guides/database-access.md +3 -0
- package/datasource-funifier-docs/knowledge/guides/explain-diagnostics.md +170 -0
- package/datasource-funifier-docs/knowledge/index.md +3 -0
- package/datasource-funifier-docs/knowledge/modules/custom-object.md +12 -7
- package/datasource-funifier-docs/knowledge/modules/database.md +48 -5
- package/dist/cli/config-writers.d.ts +1 -3
- package/dist/cli/config-writers.d.ts.map +1 -1
- package/dist/cli/config-writers.js +20 -11
- package/dist/cli/config-writers.js.map +1 -1
- package/dist/cli/config-writers.test.js +25 -18
- package/dist/cli/config-writers.test.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +37 -36
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/init.test.js +51 -17
- package/dist/cli/init.test.js.map +1 -1
- package/dist/cli/prompts.d.ts +1 -0
- package/dist/cli/prompts.d.ts.map +1 -1
- package/dist/cli/prompts.js +9 -0
- package/dist/cli/prompts.js.map +1 -1
- package/dist/mcp/bundle.js +132 -109
- package/dist/mcp/tools/database.d.ts.map +1 -1
- package/dist/mcp/tools/database.js +14 -2
- package/dist/mcp/tools/database.js.map +1 -1
- package/dist/mcp/tools/database.test.js +16 -0
- package/dist/mcp/tools/database.test.js.map +1 -1
- package/dist/mcp/tools/db-explain.d.ts +4 -0
- package/dist/mcp/tools/db-explain.d.ts.map +1 -0
- package/dist/mcp/tools/db-explain.js +187 -0
- package/dist/mcp/tools/db-explain.js.map +1 -0
- package/dist/mcp/tools/db-explain.test.d.ts +2 -0
- package/dist/mcp/tools/db-explain.test.d.ts.map +1 -0
- package/dist/mcp/tools/db-explain.test.js +142 -0
- package/dist/mcp/tools/db-explain.test.js.map +1 -0
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +2 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/list-tools.d.ts.map +1 -1
- package/dist/mcp/tools/list-tools.js +8 -0
- package/dist/mcp/tools/list-tools.js.map +1 -1
- package/package.json +1 -1
- package/skills/funifier/references/create-aggregate.md +10 -5
- package/skills/funifier/references/create-audit.md +0 -8
- package/skills/funifier/references/create-custom-object.md +0 -6
- package/skills/funifier/references/date-handling.md +0 -6
- package/skills/funifier/references/debug.md +2 -1
- package/skills/funifier/references/manage-indexes.md +0 -6
- 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 (
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
|
16
|
+
function tomlStringArray(items) {
|
|
17
|
+
return `[${items.map(tomlString).join(", ")}]`;
|
|
18
|
+
}
|
|
19
|
+
function renderCodexConfig({ projectDir, creds }) {
|
|
11
20
|
return `[mcp_servers.funifier]
|
|
12
|
-
command =
|
|
13
|
-
args =
|
|
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
|
-
|
|
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: [
|
|
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:
|
|
51
|
-
args:
|
|
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:
|
|
63
|
-
args:
|
|
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":";;
|
|
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)("
|
|
16
|
-
const out = (0, config_writers_1.renderCodexConfig)({ projectDir,
|
|
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 = "
|
|
19
|
-
(0, vitest_1.expect)(out).toContain(
|
|
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
|
|
41
|
-
const out = JSON.parse((0, config_writers_1.renderOpencodeConfig)({ projectDir,
|
|
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(["
|
|
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
|
|
52
|
-
const out = JSON.parse((0, config_writers_1.renderCursorConfig)({ projectDir,
|
|
53
|
-
(0, vitest_1.expect)(out.mcpServers.funifier.command).toBe("
|
|
54
|
-
(0, vitest_1.expect)(out.mcpServers.funifier.args).toEqual([
|
|
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":";;AAAA,mCAA8C;AAC9C,
|
|
1
|
+
{"version":3,"file":"config-writers.test.js","sourceRoot":"","sources":["../../src/cli/config-writers.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,qDAM0B;AAE1B,MAAM,KAAK,GAAgB;IACzB,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,2BAA2B;CACvC,CAAC;AAEF,MAAM,UAAU,GAAG,OAAO,CAAC;AAE3B,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAA,WAAE,EAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,GAAG,GAAG,IAAA,kCAAiB,EAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QAChD,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACzC,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAC;QAC9D,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,UAAU,UAAU,GAAG,CAAC,CAAC;QAC/C,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACxC,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACpD,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACpD,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,mDAAmD,CAAC,CAAC;QAC3E,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,4BAA4B,UAAU,GAAG,CAAC,CAAC;QACjE,qCAAqC;QACrC,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACvC,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,GAAG,GAAG,IAAA,kCAAiB,EAAC;YAC5B,UAAU;YACV,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE;SACzC,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAA,WAAE,EAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,qCAAoB,EAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACpE,IAAA,eAAM,EAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAA,eAAM,EAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC;QAC/E,IAAA,eAAM,EAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAA,eAAM,EAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,IAAA,eAAM,EAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5E,IAAA,eAAM,EAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,aAAa,EAAE,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,mCAAkB,EAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAClE,IAAA,eAAM,EAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,IAAA,eAAM,EAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC;QAC5E,IAAA,eAAM,EAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrD,IAAA,eAAM,EAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,IAAA,eAAM,EAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3E,IAAA,eAAM,EAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,aAAa,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iCAAgB,EAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAChE,IAAA,eAAM,EAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,IAAA,eAAM,EAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC;QAC5E,IAAA,eAAM,EAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrD,IAAA,eAAM,EAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/cli/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"
|
|
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(
|
|
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,
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
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
|
|
207
|
-
|
|
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
|
|
215
|
-
|
|
216
|
-
|
|
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
|
-
|
|
257
|
-
|
|
258
|
-
|
|
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(
|
|
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 --
|
|
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.");
|
package/dist/cli/init.js.map
CHANGED
|
@@ -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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"}
|
package/dist/cli/init.test.js
CHANGED
|
@@ -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: {
|
|
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
|
|
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
|
|
232
|
-
|
|
233
|
-
(0, vitest_1.expect)(config.
|
|
234
|
-
(0, vitest_1.expect)(config.
|
|
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)("
|
|
317
|
-
(0, vitest_1.it)("
|
|
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
|
-
|
|
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)("
|
|
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,
|
|
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", () => {
|