funifier-mcp 0.2.25 → 0.2.27

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 (211) hide show
  1. package/.cursor/rules/funifier.mdc +38 -41
  2. package/.github/copilot-instructions.md +38 -41
  3. package/AGENTS.md +56 -49
  4. package/README.md +40 -22
  5. package/datasource-funifier-docs/.coverage.json +326 -0
  6. package/datasource-funifier-docs/.validation.json +593 -0
  7. package/datasource-funifier-docs/knowledge/guides/aggregates.md +182 -70
  8. package/datasource-funifier-docs/knowledge/guides/database-access.md +174 -88
  9. package/datasource-funifier-docs/knowledge/guides/java-entities.md +294 -204
  10. package/datasource-funifier-docs/knowledge/guides/java-libraries.md +202 -226
  11. package/datasource-funifier-docs/knowledge/guides/java-managers.md +343 -265
  12. package/datasource-funifier-docs/knowledge/guides/trigger-examples.md +180 -236
  13. package/datasource-funifier-docs/knowledge/guides/triggers-guide.md +273 -191
  14. package/datasource-funifier-docs/knowledge/index.md +5 -2
  15. package/datasource-funifier-docs/knowledge/modules/achievement.md +1126 -28
  16. package/datasource-funifier-docs/knowledge/modules/action-log.md +469 -62
  17. package/datasource-funifier-docs/knowledge/modules/action.md +522 -70
  18. package/datasource-funifier-docs/knowledge/modules/auth.md +718 -69
  19. package/datasource-funifier-docs/knowledge/modules/avatar.md +483 -18
  20. package/datasource-funifier-docs/knowledge/modules/backup.md +603 -25
  21. package/datasource-funifier-docs/knowledge/modules/challenge.md +1048 -220
  22. package/datasource-funifier-docs/knowledge/modules/compact.md +469 -26
  23. package/datasource-funifier-docs/knowledge/modules/competition.md +811 -109
  24. package/datasource-funifier-docs/knowledge/modules/crossword.md +504 -28
  25. package/datasource-funifier-docs/knowledge/modules/csv-data.md +645 -20
  26. package/datasource-funifier-docs/knowledge/modules/custom-object.md +701 -36
  27. package/datasource-funifier-docs/knowledge/modules/database.md +730 -164
  28. package/datasource-funifier-docs/knowledge/modules/folder.md +1011 -77
  29. package/datasource-funifier-docs/knowledge/modules/kpi-formulas.md +410 -15
  30. package/datasource-funifier-docs/knowledge/modules/lastmile.md +568 -29
  31. package/datasource-funifier-docs/knowledge/modules/leaderboard.md +595 -126
  32. package/datasource-funifier-docs/knowledge/modules/level.md +536 -54
  33. package/datasource-funifier-docs/knowledge/modules/lottery.md +809 -76
  34. package/datasource-funifier-docs/knowledge/modules/marketplace.md +688 -17
  35. package/datasource-funifier-docs/knowledge/modules/mystery.md +662 -52
  36. package/datasource-funifier-docs/knowledge/modules/notification.md +564 -26
  37. package/datasource-funifier-docs/knowledge/modules/patterns.md +519 -814
  38. package/datasource-funifier-docs/knowledge/modules/player.md +773 -73
  39. package/datasource-funifier-docs/knowledge/modules/point.md +380 -83
  40. package/datasource-funifier-docs/knowledge/modules/public.md +508 -178
  41. package/datasource-funifier-docs/knowledge/modules/question.md +619 -99
  42. package/datasource-funifier-docs/knowledge/modules/quiz.md +565 -120
  43. package/datasource-funifier-docs/knowledge/modules/scheduler.md +1092 -39
  44. package/datasource-funifier-docs/knowledge/modules/security.md +674 -112
  45. package/datasource-funifier-docs/knowledge/modules/staging.md +742 -19
  46. package/datasource-funifier-docs/knowledge/modules/story.md +565 -29
  47. package/datasource-funifier-docs/knowledge/modules/studio-page.md +470 -144
  48. package/datasource-funifier-docs/knowledge/modules/swap.md +552 -84
  49. package/datasource-funifier-docs/knowledge/modules/team.md +563 -45
  50. package/datasource-funifier-docs/knowledge/modules/trigger.md +876 -134
  51. package/datasource-funifier-docs/knowledge/modules/upload.md +468 -95
  52. package/datasource-funifier-docs/knowledge/modules/virtual-good.md +510 -63
  53. package/datasource-funifier-docs/knowledge/modules/webhook.md +375 -28
  54. package/datasource-funifier-docs/knowledge/modules/websocket.md +459 -26
  55. package/datasource-funifier-docs/knowledge/modules/widget.md +613 -27
  56. package/dist/cli/init.d.ts.map +1 -1
  57. package/dist/cli/init.js +42 -1
  58. package/dist/cli/init.js.map +1 -1
  59. package/dist/cli/init.test.js +74 -3
  60. package/dist/cli/init.test.js.map +1 -1
  61. package/dist/cli/persona.d.ts +3 -0
  62. package/dist/cli/persona.d.ts.map +1 -0
  63. package/dist/cli/persona.js +25 -0
  64. package/dist/cli/persona.js.map +1 -0
  65. package/dist/core/api-client.d.ts +21 -1
  66. package/dist/core/api-client.d.ts.map +1 -1
  67. package/dist/core/api-client.js +154 -1
  68. package/dist/core/api-client.js.map +1 -1
  69. package/dist/core/constants.d.ts +14 -0
  70. package/dist/core/constants.d.ts.map +1 -1
  71. package/dist/core/constants.js +14 -0
  72. package/dist/core/constants.js.map +1 -1
  73. package/dist/core/types/Folder.d.ts +16 -0
  74. package/dist/core/types/Folder.d.ts.map +1 -0
  75. package/dist/core/types/Folder.js +3 -0
  76. package/dist/core/types/Folder.js.map +1 -0
  77. package/dist/core/types/FolderContent.d.ts +10 -0
  78. package/dist/core/types/FolderContent.d.ts.map +1 -0
  79. package/dist/core/types/FolderContent.js +3 -0
  80. package/dist/core/types/FolderContent.js.map +1 -0
  81. package/dist/core/types/FolderContentType.d.ts +10 -0
  82. package/dist/core/types/FolderContentType.d.ts.map +1 -0
  83. package/dist/core/types/FolderContentType.js +3 -0
  84. package/dist/core/types/FolderContentType.js.map +1 -0
  85. package/dist/core/types/FolderLog.d.ts +11 -0
  86. package/dist/core/types/FolderLog.d.ts.map +1 -0
  87. package/dist/core/types/FolderLog.js +3 -0
  88. package/dist/core/types/FolderLog.js.map +1 -0
  89. package/dist/core/types/index.d.ts +4 -0
  90. package/dist/core/types/index.d.ts.map +1 -1
  91. package/dist/core/types/index.js +4 -0
  92. package/dist/core/types/index.js.map +1 -1
  93. package/dist/mcp/bundle.js +121 -87
  94. package/dist/mcp/check-update.d.ts +2 -0
  95. package/dist/mcp/check-update.d.ts.map +1 -0
  96. package/dist/mcp/check-update.js +44 -0
  97. package/dist/mcp/check-update.js.map +1 -0
  98. package/dist/mcp/index.js +5 -2
  99. package/dist/mcp/index.js.map +1 -1
  100. package/dist/mcp/resources/documentation.d.ts +1 -1
  101. package/dist/mcp/resources/documentation.d.ts.map +1 -1
  102. package/dist/mcp/resources/documentation.js +39 -3
  103. package/dist/mcp/resources/documentation.js.map +1 -1
  104. package/dist/mcp/tools/_char-guard.js +1 -1
  105. package/dist/mcp/tools/_char-guard.js.map +1 -1
  106. package/dist/mcp/tools/_fetch-current.d.ts +1 -1
  107. package/dist/mcp/tools/_fetch-current.d.ts.map +1 -1
  108. package/dist/mcp/tools/_fetch-current.js +12 -0
  109. package/dist/mcp/tools/_fetch-current.js.map +1 -1
  110. package/dist/mcp/tools/connect.d.ts.map +1 -1
  111. package/dist/mcp/tools/connect.js +18 -8
  112. package/dist/mcp/tools/connect.js.map +1 -1
  113. package/dist/mcp/tools/database.d.ts.map +1 -1
  114. package/dist/mcp/tools/database.js +59 -47
  115. package/dist/mcp/tools/database.js.map +1 -1
  116. package/dist/mcp/tools/database.test.js +2 -2
  117. package/dist/mcp/tools/database.test.js.map +1 -1
  118. package/dist/mcp/tools/delete.d.ts.map +1 -1
  119. package/dist/mcp/tools/delete.js +33 -3
  120. package/dist/mcp/tools/delete.js.map +1 -1
  121. package/dist/mcp/tools/execute.d.ts.map +1 -1
  122. package/dist/mcp/tools/execute.js +20 -9
  123. package/dist/mcp/tools/execute.js.map +1 -1
  124. package/dist/mcp/tools/folder.d.ts +4 -0
  125. package/dist/mcp/tools/folder.d.ts.map +1 -0
  126. package/dist/mcp/tools/folder.js +68 -0
  127. package/dist/mcp/tools/folder.js.map +1 -0
  128. package/dist/mcp/tools/get.d.ts.map +1 -1
  129. package/dist/mcp/tools/get.js +16 -6
  130. package/dist/mcp/tools/get.js.map +1 -1
  131. package/dist/mcp/tools/index.d.ts +1 -1
  132. package/dist/mcp/tools/index.d.ts.map +1 -1
  133. package/dist/mcp/tools/index.js +5 -1
  134. package/dist/mcp/tools/index.js.map +1 -1
  135. package/dist/mcp/tools/list.d.ts.map +1 -1
  136. package/dist/mcp/tools/list.js +38 -14
  137. package/dist/mcp/tools/list.js.map +1 -1
  138. package/dist/mcp/tools/logs.d.ts.map +1 -1
  139. package/dist/mcp/tools/logs.js +15 -5
  140. package/dist/mcp/tools/logs.js.map +1 -1
  141. package/dist/mcp/tools/save.d.ts.map +1 -1
  142. package/dist/mcp/tools/save.js +26 -4
  143. package/dist/mcp/tools/save.js.map +1 -1
  144. package/dist/mcp/tools/save.test.js +192 -1
  145. package/dist/mcp/tools/save.test.js.map +1 -1
  146. package/dist/mcp/tools/search-docs.d.ts +3 -0
  147. package/dist/mcp/tools/search-docs.d.ts.map +1 -0
  148. package/dist/mcp/tools/search-docs.js +102 -0
  149. package/dist/mcp/tools/search-docs.js.map +1 -0
  150. package/package.json +6 -2
  151. package/skills/acquire-funifier-knowledge/SKILL.md +132 -0
  152. package/skills/acquire-funifier-knowledge/assets/templates/CONCERNS.md +25 -0
  153. package/skills/acquire-funifier-knowledge/assets/templates/CUSTOM_ENDPOINTS.md +24 -0
  154. package/skills/acquire-funifier-knowledge/assets/templates/CUSTOM_PAGES.md +24 -0
  155. package/skills/acquire-funifier-knowledge/assets/templates/GAME_MECHANICS.md +35 -0
  156. package/skills/acquire-funifier-knowledge/assets/templates/INTEGRATIONS.md +35 -0
  157. package/skills/acquire-funifier-knowledge/assets/templates/LEADERBOARDS.md +24 -0
  158. package/skills/acquire-funifier-knowledge/assets/templates/OVERVIEW.md +47 -0
  159. package/skills/acquire-funifier-knowledge/assets/templates/PLAYER_MODEL.md +31 -0
  160. package/skills/acquire-funifier-knowledge/assets/templates/SCHEDULERS.md +25 -0
  161. package/skills/acquire-funifier-knowledge/assets/templates/TECHNIQUES_AND_PATTERNS.md +26 -0
  162. package/skills/acquire-funifier-knowledge/assets/templates/TRIGGERS.md +27 -0
  163. package/skills/acquire-funifier-knowledge/references/funifier-inventory-checklist.md +81 -0
  164. package/skills/acquire-funifier-knowledge/references/game-techniques-taxonomy.md +62 -0
  165. package/skills/acquire-funifier-knowledge/references/mcp-call-patterns.md +118 -0
  166. package/skills/funifier/SKILL.md +88 -0
  167. package/skills/funifier/references/configure-security.md +96 -0
  168. package/skills/{funifier-create-action/SKILL.md → funifier/references/create-action.md} +0 -33
  169. package/skills/funifier/references/create-aggregate.md +144 -0
  170. package/skills/funifier/references/create-challenge.md +116 -0
  171. package/skills/funifier/references/create-competition.md +98 -0
  172. package/skills/funifier/references/create-crossword.md +574 -0
  173. package/skills/funifier/references/create-custom-object.md +91 -0
  174. package/skills/funifier/references/create-custom-page.md +135 -0
  175. package/skills/funifier/references/create-folder.md +104 -0
  176. package/skills/funifier/references/create-lastmile.md +643 -0
  177. package/skills/{funifier-create-leaderboard/SKILL.md → funifier/references/create-leaderboard.md} +0 -33
  178. package/skills/funifier/references/create-level.md +94 -0
  179. package/skills/funifier/references/create-lottery.md +913 -0
  180. package/skills/funifier/references/create-mystery.md +769 -0
  181. package/skills/funifier/references/create-notification.md +75 -0
  182. package/skills/{funifier-create-point/SKILL.md → funifier/references/create-point.md} +0 -33
  183. package/skills/funifier/references/create-quiz.md +98 -0
  184. package/skills/funifier/references/create-scheduler.md +141 -0
  185. package/skills/funifier/references/create-story.md +636 -0
  186. package/skills/funifier/references/create-swap.md +95 -0
  187. package/skills/{funifier-create-trigger/SKILL.md → funifier/references/create-trigger.md} +0 -33
  188. package/skills/funifier/references/create-virtual-good.md +96 -0
  189. package/skills/funifier/references/create-webhook.md +72 -0
  190. package/skills/funifier/references/create-websocket.md +71 -0
  191. package/skills/funifier/references/create-widget.md +76 -0
  192. package/skills/funifier/references/debug.md +87 -0
  193. package/skills/funifier/references/help.md +81 -0
  194. package/skills/funifier/references/implement-frontend.md +106 -0
  195. package/skills/funifier/references/import-csv.md +75 -0
  196. package/skills/funifier/references/manage-player.md +82 -0
  197. package/skills/funifier/references/manage-team.md +76 -0
  198. package/skills/funifier/references/upload-file.md +91 -0
  199. package/datasource-funifier-docs/.search-index.json +0 -17318
  200. package/datasource-funifier-docs/.skills-map.json +0 -73
  201. package/skills/funifier-create-aggregate/SKILL.md +0 -127
  202. package/skills/funifier-create-challenge/SKILL.md +0 -88
  203. package/skills/funifier-create-custom-page/SKILL.md +0 -127
  204. package/skills/funifier-create-level/SKILL.md +0 -87
  205. package/skills/funifier-create-quiz/SKILL.md +0 -87
  206. package/skills/funifier-create-scheduler/SKILL.md +0 -127
  207. package/skills/funifier-create-virtual-good/SKILL.md +0 -87
  208. package/skills/funifier-debug/SKILL.md +0 -92
  209. package/skills/funifier-help/SKILL.md +0 -86
  210. package/skills/funifier-implement-frontend/SKILL.md +0 -90
  211. package/skills/funifier-index/SKILL.md +0 -58
@@ -0,0 +1,135 @@
1
+ # funifier-create-custom-page
2
+
3
+ Create a Funifier Studio custom page — guided workflow for building admin dashboards, CRUDs, reports, and KPI pages using AngularJS + Bootstrap
4
+
5
+ ---
6
+
7
+ ## Formato do payload (obrigatório)
8
+
9
+ Funifier armazena código como **strings JSON escapadas**. Ao montar o payload do `funifier_save`:
10
+
11
+ - **Quebra de linha** → `\n` (nunca newline literal dentro da string)
12
+ - **Aspas duplas** dentro do código → `\"`
13
+ - **Backslash** → `\\` (regex `\b` vira `\\b`; dentro de Groovy com string-building pode exigir `\\\\b`)
14
+ - **Tab** → `\t` (se usar)
15
+ - **Pipelines de aggregate** vão como **string JSON** (não objeto aninhado) — serialize o array inteiro
16
+
17
+ A regra prática: monte o objeto em JavaScript normalmente e passe por `JSON.stringify` — o MCP faz isso automaticamente quando você entrega o payload como JSON. **Nunca** cole código multilinha cru no meio do JSON.
18
+
19
+ ### Exemplo 1 — custom-page (html + angularjs script)
20
+
21
+ ```json
22
+ {
23
+ "title": "Ciclos",
24
+ "slug": "studio/custom/ciclos",
25
+ "html": "<div class=\"row\">\n <div class=\"col-md-12\">\n <h2>Ciclos</h2>\n </div>\n</div>\n",
26
+ "script": "$scope.all = [];\n$scope.loading = false;\n\n$scope.list = function () {\n $scope.loading = true;\n};\n$scope.list();\n"
27
+ }
28
+ ```
29
+
30
+ ### Exemplo 2 — aggregate preparado (pipeline JSON + script Groovy)
31
+
32
+ ```json
33
+ {
34
+ "_id": "extrato",
35
+ "title": "Extrato de Pontos",
36
+ "collection": "extrato",
37
+ "aggregate": "[\n {\n \"$match\": { \"player\": \"$param:player\" }\n },\n {\n \"$sort\": { \"time\": -1 }\n }\n]",
38
+ "script": "void prepare(aggregations, params) {\n if (context.get(\"player\") != null) {\n params.put(\"player\", context.get(\"player\"));\n } else {\n params.put(\"player\", \"NAO_EXISTE\");\n }\n}\n"
39
+ }
40
+ ```
41
+
42
+ Note que `aggregate` é uma **string** contendo JSON serializado (com `\n` e `\"` escapados), **não** um array nativo. Mesma regra vale para `script` em triggers/schedulers/aggregates e `html`/`script` em custom-pages.
43
+
44
+ ---
45
+
46
+ ## Before starting — find relevant docs
47
+
48
+ Run lexical search to load only what you need:
49
+
50
+ ```bash
51
+ npx funifier-mcp search "custom page studio dashboard angularjs bootstrap admin crud kpi" --skill funifier-create-custom-page
52
+ ```
53
+
54
+ Read only files returned with score > 0.5 (this threshold is printed in the search output).
55
+
56
+ ## Primary docs for this skill
57
+
58
+ If search returns insufficient results, read directly:
59
+
60
+ - `datasource-funifier-docs/knowledge/modules/studio-page.md`
61
+ - `datasource-funifier-docs/knowledge/guides/aggregates.md`
62
+ - `datasource-funifier-docs/knowledge/modules/auth.md`
63
+
64
+ ## Steps
65
+
66
+ ### Regras críticas
67
+
68
+ - **Collection é `studio_page`** — não `page`. Salvar via `PUT /v3/database/studio_page`
69
+ - **`html` e `script` são strings JSON-escapadas** — nunca cole código multilinha cru no JSON
70
+ - Contexto JS: `$scope`, `$http`, `$location`, `$routeParams`, `Marketplace`
71
+ - Para autenticação: `Marketplace.auth.getAuthorization()` e `Marketplace.auth.getService()`
72
+ - `?strict=true` em GETs para preservar tipos BSON (evita conversão de datas/IDs)
73
+
74
+ ### Variáveis de contexto
75
+
76
+ | Variável | Uso |
77
+ |---|---|
78
+ | `Marketplace.auth.getService()` | URL da API (ex: https://service2.funifier.com) |
79
+ | `Marketplace.auth.getAuthorization()` | Bearer token do Studio |
80
+ | `Marketplace.range.parse(content_range)` | Parseia header de paginação |
81
+ | `Marketplace.range.paginate(page, range)` | Gera header Range para paginação |
82
+
83
+ ---
84
+
85
+ ## Steps
86
+
87
+ ### 1. Definir o objetivo da página
88
+
89
+ - Dashboard? Lista? CRUD? Relatório com gráfico?
90
+ - Precisa de parâmetros na URL? (ex: `:id` no slug para edição)
91
+
92
+ ### 2. Verificar se já existe
93
+
94
+ ```
95
+ GET /v3/database/studio_page
96
+ ```
97
+
98
+ ### 3. Escrever html + script
99
+
100
+ Hello World:
101
+ ```json
102
+ {
103
+ "_id": "hello1",
104
+ "display": true,
105
+ "title": "Hello World!",
106
+ "slug": "studio/custom/hello",
107
+ "html": "<button ng-click=\"hello()\" class=\"btn btn-warning\">Hello</button>",
108
+ "script": "$scope.hello = function(){ alert('Hello World!'); };"
109
+ }
110
+ ```
111
+
112
+ Lista simples:
113
+ ```javascript
114
+ // script para listar jogadores
115
+ $scope.all = [];
116
+ $scope.list = function () {
117
+ $http({
118
+ method: 'GET',
119
+ url: Marketplace.auth.getService() + '/v3/database/player',
120
+ headers: { "Authorization": Marketplace.auth.getAuthorization(), "content-type": "application/json" }
121
+ }).then(function(data) { $scope.all = data.data; });
122
+ };
123
+ $scope.list();
124
+ ```
125
+
126
+ ### 4. Salvar a página
127
+
128
+ ```
129
+ PUT /v3/database/studio_page { "_id": "...", "display": true, "title": "...", "slug": "studio/custom/...", "html": "...", "script": "..." }
130
+ ```
131
+
132
+ ### 5. Validar no Studio
133
+
134
+ Acesse `/studio/custom/<slug>` no browser para testar.
135
+ Para CRUD completo: crie página de lista (`display: true`) + formulário (`display: false`, slug com `/:id`).
@@ -0,0 +1,104 @@
1
+ # funifier-create-folder
2
+
3
+ Create a Funifier learning trail (folder) — hierarchical courses with content types, progress tracking, conditional unlock policies, and trigger events; use when structuring sequenced training journeys, not when standalone challenges are enough
4
+
5
+ ---
6
+
7
+ ## Before starting — find relevant docs
8
+
9
+ Run lexical search to load only what you need:
10
+
11
+ ```bash
12
+ npx funifier-mcp search "folder trail course learning progress content hierarchy unlock training lms" --skill funifier-create-folder
13
+ ```
14
+
15
+ Read only files returned with score > 0.5 (this threshold is printed in the search output).
16
+
17
+ ## Primary docs for this skill
18
+
19
+ If search returns insufficient results, read directly:
20
+
21
+ - `datasource-funifier-docs/knowledge/modules/folder.md`
22
+
23
+ ## Steps
24
+
25
+ ### Regras críticas
26
+
27
+ - **`DELETE /v3/folder/:id` é cascata e irreversível** — deleta sub-pastas, conteúdos, logs e dados de formulário
28
+ - **Sempre use `/v3/folder/log`** para registrar progresso — nunca insira direto na collection `folder_log`
29
+ - **`insertLog` é idempotente** — atualiza log existente por `(player, item)` sem duplicar
30
+ - **`status: "done"`** → `percent = 100` (automático); `percent >= 100` → `status = "done"` (automático)
31
+ - Herança de `unlock_policy`: pastas sem policy própria herdam do pai
32
+
33
+ ### MCP tools para folder
34
+
35
+ | Operação | Tool | Parâmetro |
36
+ |---|---|---|
37
+ | Criar/atualizar pasta | `funifier_save` | `type: "folder"` |
38
+ | Adicionar conteúdo | `funifier_save` | `type: "folder-content"` |
39
+ | Definir tipo de conteúdo | `funifier_save` | `type: "folder-content-type"` |
40
+ | Registrar progresso | `funifier_save` | `type: "folder-log"` |
41
+ | Ver árvore completa | `funifier_folder` | `operation: "inside"` |
42
+ | Ver progresso do jogador | `funifier_folder` | `operation: "progress"` |
43
+
44
+ ---
45
+
46
+ ## Steps
47
+
48
+ ### 1. Criar estrutura de pastas
49
+
50
+ Raiz da trilha:
51
+ ```json
52
+ { "title": "Sales Trail" }
53
+ ```
54
+
55
+ Módulo com unlock sequencial (requer 80% do anterior):
56
+ ```json
57
+ {
58
+ "title": "Module 2 — Closing",
59
+ "parent": "<root_id>",
60
+ "position": 1,
61
+ "unlock_policy": { "type": "progress", "folder_ref": "prev", "min_percent": 80 }
62
+ }
63
+ ```
64
+
65
+ ```
66
+ funifier_save type=folder payload=<json>
67
+ ```
68
+
69
+ ### 2. Definir tipos de conteúdo (se necessário)
70
+
71
+ ```json
72
+ { "_id": "video", "entity": "video__c", "input": "repository", "title": "Video" }
73
+ ```
74
+
75
+ ```
76
+ funifier_save type=folder-content-type payload=<json>
77
+ ```
78
+
79
+ ### 3. Adicionar conteúdo às pastas
80
+
81
+ ```json
82
+ { "type": "video", "content": "<video_id>", "parent": "<module_id>", "position": 0 }
83
+ ```
84
+
85
+ ```
86
+ funifier_save type=folder-content payload=<json>
87
+ ```
88
+
89
+ ### 4. Registrar progresso do jogador
90
+
91
+ ```json
92
+ { "item": "<content_id>", "player": "player123", "status": "done" }
93
+ ```
94
+
95
+ ```
96
+ funifier_save type=folder-log payload=<json>
97
+ ```
98
+
99
+ ### 5. Verificar progresso
100
+
101
+ ```
102
+ funifier_folder operation=progress { "folder": "<root_id>", "player": "player123" }
103
+ funifier_folder operation=inside { "folder": "<root_id>" }
104
+ ```