funifier-mcp 0.3.18 → 0.3.20

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 (146) hide show
  1. package/.cursor/rules/funifier.mdc +2 -1
  2. package/.github/copilot-instructions.md +2 -1
  3. package/AGENTS.md +2 -1
  4. package/CHANGELOG.md +78 -0
  5. package/README.md +1 -1
  6. package/datasource-funifier-docs/.coverage.json +4 -1
  7. package/datasource-funifier-docs/.search-index.json +949 -605
  8. package/datasource-funifier-docs/.skills-map.json +5 -0
  9. package/datasource-funifier-docs/.validation.json +12 -7
  10. package/datasource-funifier-docs/knowledge/guides/aggregates.md +13 -6
  11. package/datasource-funifier-docs/knowledge/guides/trigger-examples.md +6 -6
  12. package/datasource-funifier-docs/knowledge/guides/triggers-guide.md +74 -11
  13. package/datasource-funifier-docs/knowledge/index.md +2 -2
  14. package/datasource-funifier-docs/knowledge/modules/trigger.md +29 -1
  15. package/dist/cli/init.d.ts.map +1 -1
  16. package/dist/cli/init.js +3 -1
  17. package/dist/cli/init.js.map +1 -1
  18. package/dist/core/api-client.d.ts +2 -0
  19. package/dist/core/api-client.d.ts.map +1 -1
  20. package/dist/core/api-client.js +98 -47
  21. package/dist/core/api-client.js.map +1 -1
  22. package/dist/core/api-client.test.js +27 -0
  23. package/dist/core/api-client.test.js.map +1 -1
  24. package/dist/core/constants.d.ts +4 -0
  25. package/dist/core/constants.d.ts.map +1 -1
  26. package/dist/core/constants.js +8 -0
  27. package/dist/core/constants.js.map +1 -1
  28. package/dist/core/logger.d.ts +9 -0
  29. package/dist/core/logger.d.ts.map +1 -0
  30. package/dist/core/logger.js +50 -0
  31. package/dist/core/logger.js.map +1 -0
  32. package/dist/mcp/api-holder.test.d.ts +2 -0
  33. package/dist/mcp/api-holder.test.d.ts.map +1 -0
  34. package/dist/mcp/api-holder.test.js +45 -0
  35. package/dist/mcp/api-holder.test.js.map +1 -0
  36. package/dist/mcp/bundle.js +114 -111
  37. package/dist/mcp/check-update.d.ts +9 -0
  38. package/dist/mcp/check-update.d.ts.map +1 -1
  39. package/dist/mcp/check-update.js +35 -9
  40. package/dist/mcp/check-update.js.map +1 -1
  41. package/dist/mcp/check-update.test.js +36 -6
  42. package/dist/mcp/check-update.test.js.map +1 -1
  43. package/dist/mcp/doc-path.d.ts +11 -0
  44. package/dist/mcp/doc-path.d.ts.map +1 -0
  45. package/dist/mcp/doc-path.js +66 -0
  46. package/dist/mcp/doc-path.js.map +1 -0
  47. package/dist/mcp/doc-path.test.d.ts +2 -0
  48. package/dist/mcp/doc-path.test.d.ts.map +1 -0
  49. package/dist/mcp/doc-path.test.js +77 -0
  50. package/dist/mcp/doc-path.test.js.map +1 -0
  51. package/dist/mcp/index.js +19 -0
  52. package/dist/mcp/index.js.map +1 -1
  53. package/dist/mcp/resources/documentation.d.ts.map +1 -1
  54. package/dist/mcp/resources/documentation.js +7 -3
  55. package/dist/mcp/resources/documentation.js.map +1 -1
  56. package/dist/mcp/tools/_backup.d.ts.map +1 -1
  57. package/dist/mcp/tools/_backup.js +5 -3
  58. package/dist/mcp/tools/_backup.js.map +1 -1
  59. package/dist/mcp/tools/_char-guard.d.ts +2 -1
  60. package/dist/mcp/tools/_char-guard.d.ts.map +1 -1
  61. package/dist/mcp/tools/_char-guard.js +10 -3
  62. package/dist/mcp/tools/_char-guard.js.map +1 -1
  63. package/dist/mcp/tools/_fetch-current.d.ts +2 -1
  64. package/dist/mcp/tools/_fetch-current.d.ts.map +1 -1
  65. package/dist/mcp/tools/_fetch-current.js +2 -74
  66. package/dist/mcp/tools/_fetch-current.js.map +1 -1
  67. package/dist/mcp/tools/_registry.d.ts +183 -0
  68. package/dist/mcp/tools/_registry.d.ts.map +1 -0
  69. package/dist/mcp/tools/_registry.js +88 -0
  70. package/dist/mcp/tools/_registry.js.map +1 -0
  71. package/dist/mcp/tools/_registry.test.d.ts +2 -0
  72. package/dist/mcp/tools/_registry.test.d.ts.map +1 -0
  73. package/dist/mcp/tools/_registry.test.js +103 -0
  74. package/dist/mcp/tools/_registry.test.js.map +1 -0
  75. package/dist/mcp/tools/database.d.ts +4 -0
  76. package/dist/mcp/tools/database.d.ts.map +1 -1
  77. package/dist/mcp/tools/database.js +23 -4
  78. package/dist/mcp/tools/database.js.map +1 -1
  79. package/dist/mcp/tools/database.test.js +19 -0
  80. package/dist/mcp/tools/database.test.js.map +1 -1
  81. package/dist/mcp/tools/delete.d.ts.map +1 -1
  82. package/dist/mcp/tools/delete.js +3 -98
  83. package/dist/mcp/tools/delete.js.map +1 -1
  84. package/dist/mcp/tools/execute.d.ts.map +1 -1
  85. package/dist/mcp/tools/execute.js +36 -4
  86. package/dist/mcp/tools/execute.js.map +1 -1
  87. package/dist/mcp/tools/execute.test.d.ts +2 -0
  88. package/dist/mcp/tools/execute.test.d.ts.map +1 -0
  89. package/dist/mcp/tools/execute.test.js +87 -0
  90. package/dist/mcp/tools/execute.test.js.map +1 -0
  91. package/dist/mcp/tools/get.d.ts.map +1 -1
  92. package/dist/mcp/tools/get.js +4 -93
  93. package/dist/mcp/tools/get.js.map +1 -1
  94. package/dist/mcp/tools/index.d.ts.map +1 -1
  95. package/dist/mcp/tools/index.js +42 -1
  96. package/dist/mcp/tools/index.js.map +1 -1
  97. package/dist/mcp/tools/list.d.ts.map +1 -1
  98. package/dist/mcp/tools/list.js +3 -91
  99. package/dist/mcp/tools/list.js.map +1 -1
  100. package/dist/mcp/tools/logs.d.ts.map +1 -1
  101. package/dist/mcp/tools/logs.js +5 -3
  102. package/dist/mcp/tools/logs.js.map +1 -1
  103. package/dist/mcp/tools/read-doc.d.ts.map +1 -1
  104. package/dist/mcp/tools/read-doc.js +10 -28
  105. package/dist/mcp/tools/read-doc.js.map +1 -1
  106. package/dist/mcp/tools/save.d.ts.map +1 -1
  107. package/dist/mcp/tools/save.js +4 -81
  108. package/dist/mcp/tools/save.js.map +1 -1
  109. package/package.json +3 -2
  110. package/skills/funifier/SKILL.md +2 -1
  111. package/skills/funifier/references/audit-permissions.md +8 -0
  112. package/skills/funifier/references/configure-security.md +6 -0
  113. package/skills/funifier/references/create-action.md +7 -0
  114. package/skills/funifier/references/create-aggregate.md +99 -79
  115. package/skills/funifier/references/create-audit.md +8 -0
  116. package/skills/funifier/references/create-challenge.md +7 -0
  117. package/skills/funifier/references/create-competition.md +7 -0
  118. package/skills/funifier/references/create-crossword.md +6 -0
  119. package/skills/funifier/references/create-custom-object.md +6 -0
  120. package/skills/funifier/references/create-custom-page.md +6 -0
  121. package/skills/funifier/references/create-folder.md +7 -0
  122. package/skills/funifier/references/create-lastmile.md +6 -0
  123. package/skills/funifier/references/create-leaderboard.md +6 -0
  124. package/skills/funifier/references/create-level.md +7 -0
  125. package/skills/funifier/references/create-lottery.md +7 -0
  126. package/skills/funifier/references/create-mystery.md +6 -0
  127. package/skills/funifier/references/create-notification.md +6 -0
  128. package/skills/funifier/references/create-point.md +7 -0
  129. package/skills/funifier/references/create-quiz.md +7 -0
  130. package/skills/funifier/references/create-scheduler.md +6 -0
  131. package/skills/funifier/references/create-story.md +6 -0
  132. package/skills/funifier/references/create-swap.md +6 -0
  133. package/skills/funifier/references/create-trigger.md +28 -8
  134. package/skills/funifier/references/create-virtual-good.md +6 -0
  135. package/skills/funifier/references/create-webhook.md +6 -0
  136. package/skills/funifier/references/create-websocket.md +6 -0
  137. package/skills/funifier/references/create-widget.md +6 -0
  138. package/skills/funifier/references/date-handling.md +6 -0
  139. package/skills/funifier/references/help.md +6 -0
  140. package/skills/funifier/references/implement-frontend.md +7 -0
  141. package/skills/funifier/references/import-csv.md +6 -0
  142. package/skills/funifier/references/manage-indexes.md +6 -0
  143. package/skills/funifier/references/manage-player.md +7 -0
  144. package/skills/funifier/references/manage-team.md +6 -0
  145. package/skills/funifier/references/query-aggregate.md +111 -0
  146. package/skills/funifier/references/upload-file.md +6 -0
@@ -80,3 +80,10 @@ GET /v3/player/<_id>/status
80
80
  ```
81
81
  GET /v3/team/<team_id>/member/add/<player_id>
82
82
  ```
83
+
84
+ ## Verified References
85
+
86
+ | Claim | Status | Evidence |
87
+ |-------|--------|----------|
88
+ | Player is the entity class with _id, name, email, teams, extra fields in funifier-service | ✓ verified | Class:src/main/java/com/funifier/engine/player/Player.java:Player |
89
+ | PlayerManager handles player CRUD, authentication, and status queries in funifier-service | ✓ verified | Class:src/main/java/com/funifier/engine/player/PlayerManager.java:PlayerManager |
@@ -74,3 +74,9 @@ GET /v3/team/sales/status
74
74
  ```
75
75
  GET /v3/team/sales/member/remove/tom
76
76
  ```
77
+
78
+ ## Verified References
79
+
80
+ | Claim | Status | Evidence |
81
+ |-------|--------|----------|
82
+ | Team is the entity class for player groups with _id, name, members, owner fields in funifier-service | ✓ verified | Class:src/main/java/com/funifier/engine/team/Team.java:Team |
@@ -0,0 +1,111 @@
1
+ # funifier-query-aggregate
2
+
3
+ Run an ad-hoc MongoDB aggregate (one-off query) on a Funifier collection via POST /v3/database/{collection}/aggregate — for reports and exploration, without saving a resource
4
+
5
+ ---
6
+
7
+ ## Before starting — find relevant docs
8
+
9
+ Use the `funifier_search_docs` MCP tool to load only what you need:
10
+
11
+ ```
12
+ funifier_search_docs "aggregate mongodb pipeline query report ad-hoc consulta"
13
+ ```
14
+
15
+ Then read the most relevant results with `funifier_read_doc path=<path>`.
16
+
17
+ ## Primary docs for this skill
18
+
19
+ If search returns insufficient results, read these directly:
20
+
21
+ - `funifier_read_doc path=guides/aggregates`
22
+ - `funifier_read_doc path=guides/database-access`
23
+ - `funifier_read_doc path=modules/database`
24
+
25
+ ## Steps
26
+
27
+ > **Aggregate ad-hoc** = uma consulta **pontual** executada direto numa coleção via `POST /v3/database/{collection}/aggregate`, com o pipeline no corpo. Sem `_id`, sem salvar, sem `$param`, sem `script`. Use para relatórios e exploração. Se você precisa de um pipeline **salvo, parametrizado e reutilizável** (dashboards, `POST /v3/find/<id>`), use a skill `funifier-create-aggregate` (prepared aggregate).
28
+
29
+ ### 1. Definir a consulta
30
+
31
+ - Qual coleção tem os dados? (ver tabela abaixo)
32
+ - Qual o filtro (`$match`), agrupamento (`$group`), ordenação (`$sort`) e limite (`$limit`)?
33
+ - Precisa juntar coleções? (`$lookup` — ver relações abaixo)
34
+
35
+ ### Coleções principais e relações (para `$lookup`)
36
+
37
+ | Coleção | Relação-chave |
38
+ |---|---|
39
+ | `player` | `_id` é a ponta de `userId`/`player` — `name`, `teams`, `extra` |
40
+ | `action_log` | `userId` → `player._id`; `actionId` → `action._id` — `attributes`, `time` |
41
+ | `achievement` | `player` → `player._id`; `item` → coleção do `type` (0=Point, 1=Challenge, 2=VirtualGood, 3=Level) |
42
+ | `challenge` | `_id` referenciado por `achievement.item` (type 1) |
43
+ | `catalog_item` | `_id` referenciado por `achievement.item` (type 2) |
44
+ | `point_category` | `_id` referenciado por `achievement.item` (type 0) |
45
+
46
+ > Em `achievement`, junte por `$player`/`$item` — **não** por `_id` (senão o `$lookup` volta vazio). Campos completos das coleções: `funifier_read_doc path=guides/java-entities`.
47
+
48
+ ### 2. Operadores suportados
49
+
50
+ `$match`, `$group`, `$sort`, `$limit`, `$lookup`, `$project`, `$unwind`, `$addFields`, `$count`.
51
+
52
+ ### 3. Filtros por data
53
+
54
+ A gramática de expressões de data Funifier (`{"$date": "-0M-"}` = início do mês, `-0M+` = fim, `-1d-`, ISO-8601, millis) é detalhada em `aggregates.md` §4 (**dono único** das expressões `$date`) — leia com `funifier_read_doc path=guides/aggregates`. Não reescreva a gramática aqui.
55
+
56
+ > ⚠️ **Use `?strict=true`** no endpoint ad-hoc ao filtrar por data: sem ele, `Date` degrada para número e o `$match` por data falha. Exemplo: `{ "$match": { "time": { "$gte": {"$date": "-0M-"}, "$lte": {"$date": "-0M+"} } } }`.
57
+
58
+ ### 4. Antes de executar: índices e forma da query
59
+
60
+ 1. Liste os campos que dirigem o plano: filtros de `$match`, campos de `$sort`, e `localField`/`foreignField` de cada `$lookup` (atenção ao `foreignField` na coleção `from`).
61
+ 2. Cheque/crie índices: `funifier_index action=list collection=<coll>` para cada coleção tocada; crie os single-field faltantes com `funifier_index action=create`. Índice **composto** (ex.: `{player:1,time:-1}`) → o endpoint REST é single-field apenas; use o caminho Groovy `createIndex(...append...)` (ver skill `funifier-manage-indexes`). Não duplique a mecânica de índice aqui.
62
+ 3. Boas práticas: `$match` o mais cedo possível · reduza documentos com `$project`/`$match` **antes** do `$lookup` · `$sort` seguido imediatamente de `$limit` · cuidado com explosão de documentos do `$unwind` · garanta o `$lookup.foreignField` indexado.
63
+ 4. ⚠️ **Ad-hoc NÃO usa `allowDiskUse`** — um `$match`/`$sort` sem índice em coleção grande tende a ser lento ou falhar. (Prepared aggregate usa `allowDiskUse(true)`; ad-hoc não.)
64
+
65
+ ### 5. Executar
66
+
67
+ Via MCP:
68
+ ```
69
+ funifier_database action=aggregate collection=<coll> pipeline=<json-array>
70
+ ```
71
+
72
+ Via API REST:
73
+ ```
74
+ POST /v3/database/{collection}/aggregate?strict=true
75
+ <json-array do pipeline no corpo>
76
+ ```
77
+
78
+ > O GET de listagem (`GET /v3/database/{collection}`) **não ordena** — para ordenar, use sempre `$sort` num aggregate.
79
+
80
+ ### Exemplos
81
+
82
+ **Top 10 jogadores com mais XP no mês atual** (coleção `achievement`):
83
+ ```json
84
+ [
85
+ {"$match": {"type": 0, "item": "xp", "time": {"$gte": {"$date": "-0M-"}, "$lte": {"$date": "-0M+"}}}},
86
+ {"$group": {"_id": "$player", "total": {"$sum": "$total"}}},
87
+ {"$sort": {"total": -1}},
88
+ {"$lookup": {"from": "player", "localField": "_id", "foreignField": "_id", "as": "p"}},
89
+ {"$unwind": "$p"},
90
+ {"$project": {"_id": 1, "player": "$p.name", "total": 1}},
91
+ {"$limit": 10}
92
+ ]
93
+ ```
94
+
95
+ **Jogadores distintos que executaram ações ontem** (coleção `action_log`):
96
+ ```json
97
+ [
98
+ {"$match": {"time": {"$gte": {"$date": "-1d-"}, "$lte": {"$date": "-1d+"}}}},
99
+ {"$group": {"_id": "$userId"}},
100
+ {"$lookup": {"from": "player", "localField": "_id", "foreignField": "_id", "as": "p"}},
101
+ {"$project": {"_id": 1, "playerName": {"$first": "$p.name"}}}
102
+ ]
103
+ ```
104
+
105
+ Mais exemplos prontos (médias, distintos, top-N por período) em `aggregates.md` §6 — `funifier_read_doc path=guides/aggregates`.
106
+
107
+ ## Verified References
108
+
109
+ | Claim | Status | Evidence |
110
+ |-------|--------|----------|
111
+
@@ -89,3 +89,9 @@ funifier_save type=player payload=<json>
89
89
  ```
90
90
  DELETE /v3/upload/<upload_id>
91
91
  ```
92
+
93
+ ## Verified References
94
+
95
+ | Claim | Status | Evidence |
96
+ |-------|--------|----------|
97
+