funifier-mcp 0.3.17 → 0.3.19
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/.cursor/rules/funifier.mdc +3 -1
- package/.github/copilot-instructions.md +3 -1
- package/AGENTS.md +3 -1
- package/CHANGELOG.md +59 -0
- package/README.md +1 -1
- package/datasource-funifier-docs/.coverage.json +15 -5
- package/datasource-funifier-docs/.validation.json +77 -36
- package/datasource-funifier-docs/knowledge/guides/aggregates.md +13 -6
- package/datasource-funifier-docs/knowledge/guides/permission-audit.md +229 -0
- package/datasource-funifier-docs/knowledge/index.md +3 -2
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +3 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/core/api-client.d.ts +2 -0
- package/dist/core/api-client.d.ts.map +1 -1
- package/dist/core/api-client.js +98 -47
- package/dist/core/api-client.js.map +1 -1
- package/dist/core/api-client.test.js +27 -0
- package/dist/core/api-client.test.js.map +1 -1
- package/dist/core/constants.d.ts +4 -0
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +8 -0
- package/dist/core/constants.js.map +1 -1
- package/dist/core/logger.d.ts +9 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +50 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/mcp/api-holder.test.d.ts +2 -0
- package/dist/mcp/api-holder.test.d.ts.map +1 -0
- package/dist/mcp/api-holder.test.js +45 -0
- package/dist/mcp/api-holder.test.js.map +1 -0
- package/dist/mcp/bundle.js +108 -105
- package/dist/mcp/check-update.d.ts +9 -0
- package/dist/mcp/check-update.d.ts.map +1 -1
- package/dist/mcp/check-update.js +35 -9
- package/dist/mcp/check-update.js.map +1 -1
- package/dist/mcp/check-update.test.js +36 -6
- package/dist/mcp/check-update.test.js.map +1 -1
- package/dist/mcp/doc-path.d.ts +11 -0
- package/dist/mcp/doc-path.d.ts.map +1 -0
- package/dist/mcp/doc-path.js +66 -0
- package/dist/mcp/doc-path.js.map +1 -0
- package/dist/mcp/doc-path.test.d.ts +2 -0
- package/dist/mcp/doc-path.test.d.ts.map +1 -0
- package/dist/mcp/doc-path.test.js +77 -0
- package/dist/mcp/doc-path.test.js.map +1 -0
- package/dist/mcp/index.js +19 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/resources/documentation.d.ts.map +1 -1
- package/dist/mcp/resources/documentation.js +7 -3
- package/dist/mcp/resources/documentation.js.map +1 -1
- package/dist/mcp/tools/_audit.d.ts +103 -0
- package/dist/mcp/tools/_audit.d.ts.map +1 -0
- package/dist/mcp/tools/_audit.js +241 -0
- package/dist/mcp/tools/_audit.js.map +1 -0
- package/dist/mcp/tools/_audit.test.d.ts +2 -0
- package/dist/mcp/tools/_audit.test.d.ts.map +1 -0
- package/dist/mcp/tools/_audit.test.js +412 -0
- package/dist/mcp/tools/_audit.test.js.map +1 -0
- package/dist/mcp/tools/_backup.d.ts +37 -3
- package/dist/mcp/tools/_backup.d.ts.map +1 -1
- package/dist/mcp/tools/_backup.js +142 -11
- package/dist/mcp/tools/_backup.js.map +1 -1
- package/dist/mcp/tools/_backup.test.js +195 -0
- package/dist/mcp/tools/_backup.test.js.map +1 -1
- package/dist/mcp/tools/_char-guard.d.ts +2 -1
- package/dist/mcp/tools/_char-guard.d.ts.map +1 -1
- package/dist/mcp/tools/_char-guard.js +10 -3
- package/dist/mcp/tools/_char-guard.js.map +1 -1
- package/dist/mcp/tools/_fetch-current.d.ts +2 -1
- package/dist/mcp/tools/_fetch-current.d.ts.map +1 -1
- package/dist/mcp/tools/_fetch-current.js +2 -74
- package/dist/mcp/tools/_fetch-current.js.map +1 -1
- package/dist/mcp/tools/_registry.d.ts +183 -0
- package/dist/mcp/tools/_registry.d.ts.map +1 -0
- package/dist/mcp/tools/_registry.js +88 -0
- package/dist/mcp/tools/_registry.js.map +1 -0
- package/dist/mcp/tools/_registry.test.d.ts +2 -0
- package/dist/mcp/tools/_registry.test.d.ts.map +1 -0
- package/dist/mcp/tools/_registry.test.js +103 -0
- package/dist/mcp/tools/_registry.test.js.map +1 -0
- package/dist/mcp/tools/_scope-engine.d.ts +40 -0
- package/dist/mcp/tools/_scope-engine.d.ts.map +1 -0
- package/dist/mcp/tools/_scope-engine.js +197 -0
- package/dist/mcp/tools/_scope-engine.js.map +1 -0
- package/dist/mcp/tools/_scope-engine.test.d.ts +2 -0
- package/dist/mcp/tools/_scope-engine.test.d.ts.map +1 -0
- package/dist/mcp/tools/_scope-engine.test.js +241 -0
- package/dist/mcp/tools/_scope-engine.test.js.map +1 -0
- package/dist/mcp/tools/database.d.ts +4 -0
- package/dist/mcp/tools/database.d.ts.map +1 -1
- package/dist/mcp/tools/database.js +23 -4
- package/dist/mcp/tools/database.js.map +1 -1
- package/dist/mcp/tools/database.test.js +19 -0
- package/dist/mcp/tools/database.test.js.map +1 -1
- package/dist/mcp/tools/delete.d.ts.map +1 -1
- package/dist/mcp/tools/delete.js +3 -98
- package/dist/mcp/tools/delete.js.map +1 -1
- package/dist/mcp/tools/execute.d.ts.map +1 -1
- package/dist/mcp/tools/execute.js +36 -4
- package/dist/mcp/tools/execute.js.map +1 -1
- package/dist/mcp/tools/execute.test.d.ts +2 -0
- package/dist/mcp/tools/execute.test.d.ts.map +1 -0
- package/dist/mcp/tools/execute.test.js +87 -0
- package/dist/mcp/tools/execute.test.js.map +1 -0
- package/dist/mcp/tools/get.d.ts.map +1 -1
- package/dist/mcp/tools/get.js +4 -93
- package/dist/mcp/tools/get.js.map +1 -1
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +42 -1
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/list.d.ts.map +1 -1
- package/dist/mcp/tools/list.js +3 -91
- package/dist/mcp/tools/list.js.map +1 -1
- package/dist/mcp/tools/logs.d.ts.map +1 -1
- package/dist/mcp/tools/logs.js +5 -3
- package/dist/mcp/tools/logs.js.map +1 -1
- package/dist/mcp/tools/permissions.d.ts.map +1 -1
- package/dist/mcp/tools/permissions.js +68 -11
- package/dist/mcp/tools/permissions.js.map +1 -1
- package/dist/mcp/tools/permissions.test.js +268 -4
- package/dist/mcp/tools/permissions.test.js.map +1 -1
- package/dist/mcp/tools/read-doc.d.ts.map +1 -1
- package/dist/mcp/tools/read-doc.js +10 -28
- package/dist/mcp/tools/read-doc.js.map +1 -1
- package/dist/mcp/tools/save.d.ts.map +1 -1
- package/dist/mcp/tools/save.js +4 -81
- package/dist/mcp/tools/save.js.map +1 -1
- package/package.json +3 -2
- package/skills/funifier/SKILL.md +3 -1
- package/skills/funifier/references/audit-permissions.md +97 -0
- package/skills/funifier/references/configure-security.md +6 -0
- package/skills/funifier/references/create-action.md +7 -0
- package/skills/funifier/references/create-aggregate.md +99 -79
- package/skills/funifier/references/create-audit.md +8 -0
- package/skills/funifier/references/create-challenge.md +7 -0
- package/skills/funifier/references/create-competition.md +7 -0
- package/skills/funifier/references/create-crossword.md +6 -0
- package/skills/funifier/references/create-custom-object.md +6 -0
- package/skills/funifier/references/create-custom-page.md +6 -0
- package/skills/funifier/references/create-folder.md +7 -0
- package/skills/funifier/references/create-lastmile.md +6 -0
- package/skills/funifier/references/create-leaderboard.md +6 -0
- package/skills/funifier/references/create-level.md +7 -0
- package/skills/funifier/references/create-lottery.md +7 -0
- package/skills/funifier/references/create-mystery.md +6 -0
- package/skills/funifier/references/create-notification.md +6 -0
- package/skills/funifier/references/create-point.md +7 -0
- package/skills/funifier/references/create-quiz.md +7 -0
- package/skills/funifier/references/create-scheduler.md +6 -0
- package/skills/funifier/references/create-story.md +6 -0
- package/skills/funifier/references/create-swap.md +6 -0
- package/skills/funifier/references/create-trigger.md +8 -0
- package/skills/funifier/references/create-virtual-good.md +6 -0
- package/skills/funifier/references/create-webhook.md +6 -0
- package/skills/funifier/references/create-websocket.md +6 -0
- package/skills/funifier/references/create-widget.md +6 -0
- package/skills/funifier/references/date-handling.md +6 -0
- package/skills/funifier/references/debug.md +6 -0
- package/skills/funifier/references/help.md +6 -0
- package/skills/funifier/references/implement-frontend.md +7 -0
- package/skills/funifier/references/import-csv.md +6 -0
- package/skills/funifier/references/manage-indexes.md +6 -0
- package/skills/funifier/references/manage-player.md +7 -0
- package/skills/funifier/references/manage-team.md +6 -0
- package/skills/funifier/references/query-aggregate.md +111 -0
- package/skills/funifier/references/upload-file.md +6 -0
- package/datasource-funifier-docs/.search-index.json +0 -58758
- package/datasource-funifier-docs/.skills-map.json +0 -141
|
@@ -27,7 +27,8 @@ Then read a result with `funifier_read_doc path=<path>`.
|
|
|
27
27
|
|-----------|-------------|
|
|
28
28
|
| `skills/funifier/references/create-trigger.md` | Create a Funifier trigger — guided workflow from entity/event selection to Groovy code generation |
|
|
29
29
|
| `skills/funifier/references/create-scheduler.md` | Create a Funifier scheduler — guided workflow from naming and cron expression to Groovy code generation |
|
|
30
|
-
| `skills/funifier/references/
|
|
30
|
+
| `skills/funifier/references/query-aggregate.md` | 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 |
|
|
31
|
+
| `skills/funifier/references/create-aggregate.md` | Create/edit a Funifier prepared aggregate — a saved pipeline with _id, $param placeholders, optional Groovy script, cache and execution via POST /v3/find/{id}; for reusable dashboards and parametrized reports |
|
|
31
32
|
| `skills/funifier/references/date-handling.md` | Create, edit, or query Date fields safely via REST, funifier_database, triggers, schedulers, aggregate, and prepared aggregate; use whenever a payload or filter contains dates |
|
|
32
33
|
| `skills/funifier/references/create-challenge.md` | Create a Funifier challenge — missions with action rules and point rewards |
|
|
33
34
|
| `skills/funifier/references/create-action.md` | Create a Funifier action — define trackable player behaviors with attributes |
|
|
@@ -60,6 +61,7 @@ Then read a result with `funifier_read_doc path=<path>`.
|
|
|
60
61
|
| `skills/funifier/references/import-csv.md` | Import or export Funifier platform data via CSV — bulk player import, performance export, and cross-system data migration; use when loading or extracting large datasets, not for individual record CRUD or media file uploads (use funifier-upload-file) |
|
|
61
62
|
| `skills/funifier/references/upload-file.md` | Upload files to Funifier — images and documents for player avatars, challenge resources, and visual assets; use when adding media to the platform, not for CSV data import (use funifier-import-csv) or static frontend hosting (use funifier-implement-frontend) |
|
|
62
63
|
| `skills/funifier/references/manage-indexes.md` | Create, list, and drop MongoDB single-field indexes on Funifier collections via the REST API. Composite (multi-field) indexes are NOT supported by this endpoint — see Limitation section. |
|
|
64
|
+
| `skills/funifier/references/audit-permissions.md` | Cross-check a project's Funifier API calls against the live security document — scan code for usage, build an evidence-backed manifest, run the deterministic audit engine, and report missing scopes, excess tokens, and static danger findings; use when debugging 401s, auditing minimum privilege, or verifying permissions before deploying; audit is read-only and never changes any configuration |
|
|
63
65
|
|
|
64
66
|
Full workflow files: `skills/funifier/references/`
|
|
65
67
|
|
|
@@ -20,7 +20,8 @@ Detailed guided workflows live in `skills/funifier/references/`:
|
|
|
20
20
|
|-----------|-------------|
|
|
21
21
|
| `skills/funifier/references/create-trigger.md` | Create a Funifier trigger — guided workflow from entity/event selection to Groovy code generation |
|
|
22
22
|
| `skills/funifier/references/create-scheduler.md` | Create a Funifier scheduler — guided workflow from naming and cron expression to Groovy code generation |
|
|
23
|
-
| `skills/funifier/references/
|
|
23
|
+
| `skills/funifier/references/query-aggregate.md` | 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 |
|
|
24
|
+
| `skills/funifier/references/create-aggregate.md` | Create/edit a Funifier prepared aggregate — a saved pipeline with _id, $param placeholders, optional Groovy script, cache and execution via POST /v3/find/{id}; for reusable dashboards and parametrized reports |
|
|
24
25
|
| `skills/funifier/references/date-handling.md` | Create, edit, or query Date fields safely via REST, funifier_database, triggers, schedulers, aggregate, and prepared aggregate; use whenever a payload or filter contains dates |
|
|
25
26
|
| `skills/funifier/references/create-challenge.md` | Create a Funifier challenge — missions with action rules and point rewards |
|
|
26
27
|
| `skills/funifier/references/create-action.md` | Create a Funifier action — define trackable player behaviors with attributes |
|
|
@@ -53,6 +54,7 @@ Detailed guided workflows live in `skills/funifier/references/`:
|
|
|
53
54
|
| `skills/funifier/references/import-csv.md` | Import or export Funifier platform data via CSV — bulk player import, performance export, and cross-system data migration; use when loading or extracting large datasets, not for individual record CRUD or media file uploads (use funifier-upload-file) |
|
|
54
55
|
| `skills/funifier/references/upload-file.md` | Upload files to Funifier — images and documents for player avatars, challenge resources, and visual assets; use when adding media to the platform, not for CSV data import (use funifier-import-csv) or static frontend hosting (use funifier-implement-frontend) |
|
|
55
56
|
| `skills/funifier/references/manage-indexes.md` | Create, list, and drop MongoDB single-field indexes on Funifier collections via the REST API. Composite (multi-field) indexes are NOT supported by this endpoint — see Limitation section. |
|
|
57
|
+
| `skills/funifier/references/audit-permissions.md` | Cross-check a project's Funifier API calls against the live security document — scan code for usage, build an evidence-backed manifest, run the deterministic audit engine, and report missing scopes, excess tokens, and static danger findings; use when debugging 401s, auditing minimum privilege, or verifying permissions before deploying; audit is read-only and never changes any configuration |
|
|
56
58
|
|
|
57
59
|
### Funifier Modules
|
|
58
60
|
|
package/AGENTS.md
CHANGED
|
@@ -59,7 +59,8 @@ Before any `funifier_*` MCP tool call or Funifier task, find the matching row an
|
|
|
59
59
|
|-----------|-------------|
|
|
60
60
|
| `skills/funifier/references/create-trigger.md` | Create a Funifier trigger — guided workflow from entity/event selection to Groovy code generation |
|
|
61
61
|
| `skills/funifier/references/create-scheduler.md` | Create a Funifier scheduler — guided workflow from naming and cron expression to Groovy code generation |
|
|
62
|
-
| `skills/funifier/references/
|
|
62
|
+
| `skills/funifier/references/query-aggregate.md` | 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 |
|
|
63
|
+
| `skills/funifier/references/create-aggregate.md` | Create/edit a Funifier prepared aggregate — a saved pipeline with _id, $param placeholders, optional Groovy script, cache and execution via POST /v3/find/{id}; for reusable dashboards and parametrized reports |
|
|
63
64
|
| `skills/funifier/references/date-handling.md` | Create, edit, or query Date fields safely via REST, funifier_database, triggers, schedulers, aggregate, and prepared aggregate; use whenever a payload or filter contains dates |
|
|
64
65
|
| `skills/funifier/references/create-challenge.md` | Create a Funifier challenge — missions with action rules and point rewards |
|
|
65
66
|
| `skills/funifier/references/create-action.md` | Create a Funifier action — define trackable player behaviors with attributes |
|
|
@@ -92,6 +93,7 @@ Before any `funifier_*` MCP tool call or Funifier task, find the matching row an
|
|
|
92
93
|
| `skills/funifier/references/import-csv.md` | Import or export Funifier platform data via CSV — bulk player import, performance export, and cross-system data migration; use when loading or extracting large datasets, not for individual record CRUD or media file uploads (use funifier-upload-file) |
|
|
93
94
|
| `skills/funifier/references/upload-file.md` | Upload files to Funifier — images and documents for player avatars, challenge resources, and visual assets; use when adding media to the platform, not for CSV data import (use funifier-import-csv) or static frontend hosting (use funifier-implement-frontend) |
|
|
94
95
|
| `skills/funifier/references/manage-indexes.md` | Create, list, and drop MongoDB single-field indexes on Funifier collections via the REST API. Composite (multi-field) indexes are NOT supported by this endpoint — see Limitation section. |
|
|
96
|
+
| `skills/funifier/references/audit-permissions.md` | Cross-check a project's Funifier API calls against the live security document — scan code for usage, build an evidence-backed manifest, run the deterministic audit engine, and report missing scopes, excess tokens, and static danger findings; use when debugging 401s, auditing minimum privilege, or verifying permissions before deploying; audit is read-only and never changes any configuration |
|
|
95
97
|
|
|
96
98
|
## Funifier Modules
|
|
97
99
|
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `funifier-mcp` are documented here. Format loosely follows
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/); versions follow semver.
|
|
5
|
+
|
|
6
|
+
## [0.3.19]
|
|
7
|
+
|
|
8
|
+
Implementation of the prioritized improvements from the MCP implementation review
|
|
9
|
+
(`.specs/features/mcp-implementation-review/review-report.md`).
|
|
10
|
+
|
|
11
|
+
### Security
|
|
12
|
+
- **Stop leaking credentials in logs (P0/S1).** API errors are now logged through a
|
|
13
|
+
sanitizer that emits only the message + status; the raw axios error (which carries
|
|
14
|
+
`Authorization: Basic …` and the request body) is never written to stderr.
|
|
15
|
+
- **Close path traversal in the docs resource (P0/S2).** `funifier://docs/{+path}` now
|
|
16
|
+
shares the same root-confinement guard as `funifier_read_doc` via `src/mcp/doc-path.ts`,
|
|
17
|
+
blocking `../` escapes.
|
|
18
|
+
- **Restrict file permissions (P1/S3).** `funifier.json` and backup snapshots are written
|
|
19
|
+
with mode `0600` and the backup directory with `0700` (both hold plaintext secrets).
|
|
20
|
+
- **Mark untrusted API data (P2/S6).** `funifier_database` query/aggregate and
|
|
21
|
+
`funifier_logs` responses are prefixed with a delimiter telling the agent to treat
|
|
22
|
+
end-user-influenced data as data, never as instructions.
|
|
23
|
+
|
|
24
|
+
### Reliability
|
|
25
|
+
- **Request timeout + retry (P0/P3).** The axios client now aborts after 30s and retries
|
|
26
|
+
idempotent GETs (network error / timeout / 5xx) with exponential backoff.
|
|
27
|
+
- **Graceful shutdown (P2/M1).** The server closes the transport on `SIGTERM`/`SIGINT`.
|
|
28
|
+
|
|
29
|
+
### Performance / token usage
|
|
30
|
+
- **Aggregate result cap (P1).** Ad-hoc aggregate pipelines without an explicit `$limit`
|
|
31
|
+
get a `$limit:1000` backstop, and prepared-aggregate `run` results pass through the
|
|
32
|
+
response size guard.
|
|
33
|
+
|
|
34
|
+
### Maintainability
|
|
35
|
+
- **Resource-type registry (P1/A1).** `src/mcp/tools/_registry.ts` is now the single
|
|
36
|
+
source of truth mapping each resource type to its api-client methods and tool exposure,
|
|
37
|
+
replacing the duplicated switch/dispatch blocks in `save`/`delete`/`get`/`list`/
|
|
38
|
+
`_fetch-current`. A consistency test freezes per-tool membership and verifies every
|
|
39
|
+
registered method exists on the client.
|
|
40
|
+
- **Structured logging (P1/O1).** A minimal JSON-lines stderr logger (`src/core/logger.ts`)
|
|
41
|
+
records one line per tool call (tool, duration, outcome) and the reason whenever a list
|
|
42
|
+
call returns `[]` due to an error.
|
|
43
|
+
|
|
44
|
+
### Update notifications
|
|
45
|
+
- The in-session update notice now links to this changelog, and scales its tone with
|
|
46
|
+
severity: routine patch/minor updates get a quiet one-liner, while major bumps
|
|
47
|
+
(including pre-1.0 minor bumps, per semver convention) warn about breaking changes
|
|
48
|
+
and tell the user to review the changelog before updating.
|
|
49
|
+
|
|
50
|
+
### Tests
|
|
51
|
+
- Added coverage for the doc-path guard, retry policy, aggregate cap, resource registry
|
|
52
|
+
dispatch/consistency, `ApiHolder`, and severity-aware update notices. Suite: 471 tests passing.
|
|
53
|
+
|
|
54
|
+
### Deferred (documented, not changed)
|
|
55
|
+
- Replacing the global `Range: items=0-1000` header with per-call pagination on the
|
|
56
|
+
generic list tool (platform-wide behavior change — needs a deliberate decision).
|
|
57
|
+
- True GET-by-id in `fetchCurrentById` (most Funifier resources expose only list endpoints).
|
|
58
|
+
- Automatic backup retention/expiry (auto-deleting snapshots is destructive; left manual).
|
|
59
|
+
- Server-side aggregate stage denylist (`$out`/`$merge`) — pending confirmation of backend behavior.
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ Funifier AI toolkit — API client, MCP server, and AI assistant skills for the
|
|
|
7
7
|
| Component | Description |
|
|
8
8
|
|-----------|-------------|
|
|
9
9
|
| **API Client** | Pure Node.js client for the Funifier REST API (80+ methods, 18 resource types) |
|
|
10
|
-
| **MCP Server** | Model Context Protocol server —
|
|
10
|
+
| **MCP Server** | Model Context Protocol server — 14 tools, 3 prompts, documentation resources |
|
|
11
11
|
| **Skills** | 32 guided workflows for Claude Code, Codex, OpenCode, Copilot, Continue, and Cursor |
|
|
12
12
|
| **CLI** | `npx funifier-mcp@latest init` — interactive setup for AI platforms |
|
|
13
13
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-06-
|
|
2
|
+
"generatedAt": "2026-06-12T18:58:00.000Z",
|
|
3
3
|
"docsRoot": "datasource-funifier-docs/",
|
|
4
4
|
"docs": {
|
|
5
5
|
"knowledge/guides/aggregates.md": {
|
|
6
6
|
"status": "grouped",
|
|
7
7
|
"skillIds": [
|
|
8
|
+
"funifier-query-aggregate",
|
|
8
9
|
"funifier-create-aggregate",
|
|
9
10
|
"funifier-date-handling",
|
|
10
11
|
"funifier-create-custom-page",
|
|
@@ -15,6 +16,7 @@
|
|
|
15
16
|
"knowledge/guides/database-access.md": {
|
|
16
17
|
"status": "grouped",
|
|
17
18
|
"skillIds": [
|
|
19
|
+
"funifier-query-aggregate",
|
|
18
20
|
"funifier-create-aggregate",
|
|
19
21
|
"funifier-date-handling",
|
|
20
22
|
"funifier-implement-frontend"
|
|
@@ -40,6 +42,12 @@
|
|
|
40
42
|
"funifier-create-scheduler"
|
|
41
43
|
]
|
|
42
44
|
},
|
|
45
|
+
"knowledge/guides/permission-audit.md": {
|
|
46
|
+
"status": "covered",
|
|
47
|
+
"skillIds": [
|
|
48
|
+
"funifier-audit-permissions"
|
|
49
|
+
]
|
|
50
|
+
},
|
|
43
51
|
"knowledge/guides/trigger-examples.md": {
|
|
44
52
|
"status": "grouped",
|
|
45
53
|
"skillIds": [
|
|
@@ -142,6 +150,7 @@
|
|
|
142
150
|
"knowledge/modules/database.md": {
|
|
143
151
|
"status": "grouped",
|
|
144
152
|
"skillIds": [
|
|
153
|
+
"funifier-query-aggregate",
|
|
145
154
|
"funifier-create-aggregate",
|
|
146
155
|
"funifier-date-handling",
|
|
147
156
|
"funifier-create-audit",
|
|
@@ -249,9 +258,10 @@
|
|
|
249
258
|
]
|
|
250
259
|
},
|
|
251
260
|
"knowledge/modules/security.md": {
|
|
252
|
-
"status": "
|
|
261
|
+
"status": "grouped",
|
|
253
262
|
"skillIds": [
|
|
254
|
-
"funifier-configure-security"
|
|
263
|
+
"funifier-configure-security",
|
|
264
|
+
"funifier-audit-permissions"
|
|
255
265
|
]
|
|
256
266
|
},
|
|
257
267
|
"knowledge/modules/staging.md": {
|
|
@@ -328,9 +338,9 @@
|
|
|
328
338
|
}
|
|
329
339
|
},
|
|
330
340
|
"summary": {
|
|
331
|
-
"total":
|
|
341
|
+
"total": 52,
|
|
332
342
|
"covered": 32,
|
|
333
|
-
"grouped":
|
|
343
|
+
"grouped": 14,
|
|
334
344
|
"deferred": 6,
|
|
335
345
|
"uncovered": 0
|
|
336
346
|
}
|
|
@@ -1,13 +1,49 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-06-
|
|
2
|
+
"generatedAt": "2026-06-12T17:50:00Z",
|
|
3
3
|
"skills": {
|
|
4
|
+
"funifier-audit-permissions": {
|
|
5
|
+
"configHash": "f0569bdb0e11e1a2c6a11f6a4ff9cfd940668c7431bee06342b29faab32510fc",
|
|
6
|
+
"status": "verified",
|
|
7
|
+
"claims": [
|
|
8
|
+
{
|
|
9
|
+
"claim": "SecurityFilter.doFilter evaluates (method, path) by computing verb (GET→read, POST/PUT→write, DELETE→delete) and entity_full (path after /v3/ with slash→underscore), then matching scope tokens in order: {verb}_all, exact {verb}_{entity_full}, fallback {verb}_{prefix}_all minus-1 and minus-2 trailing segments",
|
|
10
|
+
"gitnexusQuery": "SecurityFilter",
|
|
11
|
+
"critical": true,
|
|
12
|
+
"status": "verified",
|
|
13
|
+
"evidence": {
|
|
14
|
+
"symbol": "Class:src/main/java/com/funifier/rest/v3/filter/SecurityFilter.java:SecurityFilter",
|
|
15
|
+
"file": "src/main/java/com/funifier/rest/v3/filter/SecurityFilter.java"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"claim": "DatabaseRest requires the literal 'database' scope keyword on ALL /v3/database handlers including GET operations — grammar tokens such as read_all alone are insufficient; this is enforced within SecurityFilter.doFilter before requests reach DatabaseRest handlers",
|
|
20
|
+
"gitnexusQuery": "doFilter",
|
|
21
|
+
"critical": true,
|
|
22
|
+
"status": "verified",
|
|
23
|
+
"evidence": {
|
|
24
|
+
"symbol": "Method:src/main/java/com/funifier/rest/v3/filter/SecurityFilter.java:SecurityFilter.doFilter#3",
|
|
25
|
+
"file": "src/main/java/com/funifier/rest/v3/filter/SecurityFilter.java"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"claim": "Bearer tokens embed the player's role scope string at login time; role scope changes only affect sessions created after the change — existing live Bearer tokens carry the scope at their issuance time",
|
|
30
|
+
"gitnexusQuery": "SecurityFilter",
|
|
31
|
+
"critical": true,
|
|
32
|
+
"status": "verified",
|
|
33
|
+
"evidence": {
|
|
34
|
+
"symbol": "Class:src/main/java/com/funifier/rest/v3/filter/SecurityFilter.java:SecurityFilter",
|
|
35
|
+
"file": "src/main/java/com/funifier/rest/v3/filter/SecurityFilter.java"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
},
|
|
4
40
|
"funifier-configure-security": {
|
|
5
|
-
"configHash": "
|
|
41
|
+
"configHash": "a05c3dc778b494d2d9d781787dd2231c1ae5720c3e368b41071f02df85a1a922",
|
|
6
42
|
"status": "verified",
|
|
7
43
|
"claims": []
|
|
8
44
|
},
|
|
9
45
|
"funifier-create-action": {
|
|
10
|
-
"configHash": "
|
|
46
|
+
"configHash": "378dcd46c1dbad66e0363790d65d5bc0bba9ea3b294a97b571cc6d87c26ddf11",
|
|
11
47
|
"status": "verified",
|
|
12
48
|
"claims": [
|
|
13
49
|
{
|
|
@@ -33,7 +69,7 @@
|
|
|
33
69
|
]
|
|
34
70
|
},
|
|
35
71
|
"funifier-create-aggregate": {
|
|
36
|
-
"configHash": "
|
|
72
|
+
"configHash": "c27031c7453134f3386ca29d55ab4d6ad25e20b0aec443d9cf84858f0984415f",
|
|
37
73
|
"status": "verified",
|
|
38
74
|
"claims": [
|
|
39
75
|
{
|
|
@@ -49,7 +85,7 @@
|
|
|
49
85
|
]
|
|
50
86
|
},
|
|
51
87
|
"funifier-create-audit": {
|
|
52
|
-
"configHash": "
|
|
88
|
+
"configHash": "0ca754be3545a16a6efb50ca2c4b360f1438efa1cd1bc2b5109aa76768376e07",
|
|
53
89
|
"status": "verified",
|
|
54
90
|
"claims": [
|
|
55
91
|
{
|
|
@@ -85,7 +121,7 @@
|
|
|
85
121
|
]
|
|
86
122
|
},
|
|
87
123
|
"funifier-create-challenge": {
|
|
88
|
-
"configHash": "
|
|
124
|
+
"configHash": "7065294da9c53a9d1bbe544749ff552d6674d0d77e2534ea17e43fae4c72474c",
|
|
89
125
|
"status": "verified",
|
|
90
126
|
"claims": [
|
|
91
127
|
{
|
|
@@ -111,7 +147,7 @@
|
|
|
111
147
|
]
|
|
112
148
|
},
|
|
113
149
|
"funifier-create-competition": {
|
|
114
|
-
"configHash": "
|
|
150
|
+
"configHash": "0de8bcda95d0a1764ef4ce7aa7e78c53c7f7d492012534ecaf7f87600c42f078",
|
|
115
151
|
"status": "verified",
|
|
116
152
|
"claims": [
|
|
117
153
|
{
|
|
@@ -137,7 +173,7 @@
|
|
|
137
173
|
]
|
|
138
174
|
},
|
|
139
175
|
"funifier-create-crossword": {
|
|
140
|
-
"configHash": "
|
|
176
|
+
"configHash": "63ebc6f1e0589aaa748464e54b3dc3460094fa41764922534b6017288fc79541",
|
|
141
177
|
"status": "verified",
|
|
142
178
|
"claims": [
|
|
143
179
|
{
|
|
@@ -153,7 +189,7 @@
|
|
|
153
189
|
]
|
|
154
190
|
},
|
|
155
191
|
"funifier-create-custom-object": {
|
|
156
|
-
"configHash": "
|
|
192
|
+
"configHash": "8aa7a96fdc72793c3d095db04831396d58a1aca931a7542cc8d5b8eed2e0c31d",
|
|
157
193
|
"status": "verified",
|
|
158
194
|
"claims": [
|
|
159
195
|
{
|
|
@@ -169,7 +205,7 @@
|
|
|
169
205
|
]
|
|
170
206
|
},
|
|
171
207
|
"funifier-create-custom-page": {
|
|
172
|
-
"configHash": "
|
|
208
|
+
"configHash": "0645081a8fd47315f92446ecaf7f8c55837b5e87c1339aad1ea9eb63c6cd7a18",
|
|
173
209
|
"status": "verified",
|
|
174
210
|
"claims": [
|
|
175
211
|
{
|
|
@@ -185,7 +221,7 @@
|
|
|
185
221
|
]
|
|
186
222
|
},
|
|
187
223
|
"funifier-create-folder": {
|
|
188
|
-
"configHash": "
|
|
224
|
+
"configHash": "16b0c0ae4ddebd51a16a0f330a80bed8c186cd7a760a9e52a5fb16d3cf6e462f",
|
|
189
225
|
"status": "verified",
|
|
190
226
|
"claims": [
|
|
191
227
|
{
|
|
@@ -211,7 +247,7 @@
|
|
|
211
247
|
]
|
|
212
248
|
},
|
|
213
249
|
"funifier-create-lastmile": {
|
|
214
|
-
"configHash": "
|
|
250
|
+
"configHash": "e769c3ad773a9069ae41902d52195b81cfaaf6eb61cc15fb1d443c95ae512e55",
|
|
215
251
|
"status": "verified",
|
|
216
252
|
"claims": [
|
|
217
253
|
{
|
|
@@ -227,7 +263,7 @@
|
|
|
227
263
|
]
|
|
228
264
|
},
|
|
229
265
|
"funifier-create-leaderboard": {
|
|
230
|
-
"configHash": "
|
|
266
|
+
"configHash": "f0baaf27834eb5f75c75ba1ddb0054e72a1cf88a52d685601acd4781fafec025",
|
|
231
267
|
"status": "verified",
|
|
232
268
|
"claims": [
|
|
233
269
|
{
|
|
@@ -243,7 +279,7 @@
|
|
|
243
279
|
]
|
|
244
280
|
},
|
|
245
281
|
"funifier-create-level": {
|
|
246
|
-
"configHash": "
|
|
282
|
+
"configHash": "807c32381d542e5e1bbd678b29bc79751af340b7e00a31264a1dd24839306dab",
|
|
247
283
|
"status": "verified",
|
|
248
284
|
"claims": [
|
|
249
285
|
{
|
|
@@ -269,7 +305,7 @@
|
|
|
269
305
|
]
|
|
270
306
|
},
|
|
271
307
|
"funifier-create-lottery": {
|
|
272
|
-
"configHash": "
|
|
308
|
+
"configHash": "ba9945f649f2e2fe91d545d27131b0e705b729deba192d121b8e41a03e3d5078",
|
|
273
309
|
"status": "verified",
|
|
274
310
|
"claims": [
|
|
275
311
|
{
|
|
@@ -295,7 +331,7 @@
|
|
|
295
331
|
]
|
|
296
332
|
},
|
|
297
333
|
"funifier-create-mystery": {
|
|
298
|
-
"configHash": "
|
|
334
|
+
"configHash": "0251df7c50e9629c592abef26894cc4b37d2a00c32ce6021c47eeedad3df35bb",
|
|
299
335
|
"status": "verified",
|
|
300
336
|
"claims": [
|
|
301
337
|
{
|
|
@@ -311,7 +347,7 @@
|
|
|
311
347
|
]
|
|
312
348
|
},
|
|
313
349
|
"funifier-create-notification": {
|
|
314
|
-
"configHash": "
|
|
350
|
+
"configHash": "7c3a31fce953b96fd477ddd1f437cc7b617d38b999fec45944a80ab58693306f",
|
|
315
351
|
"status": "verified",
|
|
316
352
|
"claims": [
|
|
317
353
|
{
|
|
@@ -327,7 +363,7 @@
|
|
|
327
363
|
]
|
|
328
364
|
},
|
|
329
365
|
"funifier-create-point": {
|
|
330
|
-
"configHash": "
|
|
366
|
+
"configHash": "a5d84d1e85e7fe8b3d6af3acb19122243c75456c101b991491ee510716607c4a",
|
|
331
367
|
"status": "verified",
|
|
332
368
|
"claims": [
|
|
333
369
|
{
|
|
@@ -353,7 +389,7 @@
|
|
|
353
389
|
]
|
|
354
390
|
},
|
|
355
391
|
"funifier-create-quiz": {
|
|
356
|
-
"configHash": "
|
|
392
|
+
"configHash": "dd932897848f30800c71e17acdaf08699dd1c28f5d5b9de618c696bfa88be5b6",
|
|
357
393
|
"status": "verified",
|
|
358
394
|
"claims": [
|
|
359
395
|
{
|
|
@@ -379,7 +415,7 @@
|
|
|
379
415
|
]
|
|
380
416
|
},
|
|
381
417
|
"funifier-create-scheduler": {
|
|
382
|
-
"configHash": "
|
|
418
|
+
"configHash": "9f986517a5c5d8caf315b6ee5ce93150666a7f3a0bf45aefe4f46fa883665e38",
|
|
383
419
|
"status": "verified",
|
|
384
420
|
"claims": [
|
|
385
421
|
{
|
|
@@ -395,12 +431,12 @@
|
|
|
395
431
|
]
|
|
396
432
|
},
|
|
397
433
|
"funifier-create-story": {
|
|
398
|
-
"configHash": "
|
|
434
|
+
"configHash": "5c53e20e201766c7b2fe29a253c50655cd7fad0fc82edb3543957c79697996bf",
|
|
399
435
|
"status": "verified",
|
|
400
436
|
"claims": []
|
|
401
437
|
},
|
|
402
438
|
"funifier-create-swap": {
|
|
403
|
-
"configHash": "
|
|
439
|
+
"configHash": "3067da9da8726b0f0191aac05d711e2870dada98044e9fd442bdb2472654d053",
|
|
404
440
|
"status": "verified",
|
|
405
441
|
"claims": [
|
|
406
442
|
{
|
|
@@ -416,7 +452,7 @@
|
|
|
416
452
|
]
|
|
417
453
|
},
|
|
418
454
|
"funifier-create-trigger": {
|
|
419
|
-
"configHash": "
|
|
455
|
+
"configHash": "21a46732f80324f9662064e8d96528f26c7cfa277f152905fd537be8ef12dab1",
|
|
420
456
|
"status": "verified",
|
|
421
457
|
"claims": [
|
|
422
458
|
{
|
|
@@ -452,7 +488,7 @@
|
|
|
452
488
|
]
|
|
453
489
|
},
|
|
454
490
|
"funifier-create-virtual-good": {
|
|
455
|
-
"configHash": "
|
|
491
|
+
"configHash": "9a78b550bfdd28271fcb1d225da8a6f0a68112735209765b32c34fe0be981c33",
|
|
456
492
|
"status": "verified",
|
|
457
493
|
"claims": [
|
|
458
494
|
{
|
|
@@ -468,7 +504,7 @@
|
|
|
468
504
|
]
|
|
469
505
|
},
|
|
470
506
|
"funifier-create-webhook": {
|
|
471
|
-
"configHash": "
|
|
507
|
+
"configHash": "cc84a72a02ade14142576f6f66a806e10b400ce624b42509dd9bcb8777424d70",
|
|
472
508
|
"status": "verified",
|
|
473
509
|
"claims": [
|
|
474
510
|
{
|
|
@@ -484,7 +520,7 @@
|
|
|
484
520
|
]
|
|
485
521
|
},
|
|
486
522
|
"funifier-create-websocket": {
|
|
487
|
-
"configHash": "
|
|
523
|
+
"configHash": "0689d726bebbe170d03132e53a943978b78392e2c1240a38b147e3813d3f6322",
|
|
488
524
|
"status": "verified",
|
|
489
525
|
"claims": [
|
|
490
526
|
{
|
|
@@ -500,7 +536,7 @@
|
|
|
500
536
|
]
|
|
501
537
|
},
|
|
502
538
|
"funifier-create-widget": {
|
|
503
|
-
"configHash": "
|
|
539
|
+
"configHash": "d4e6e29b2dadbe4838b1dd1e820989c2fc88c7a63fc41e0b871ec725cf2c3296",
|
|
504
540
|
"status": "verified",
|
|
505
541
|
"claims": [
|
|
506
542
|
{
|
|
@@ -516,12 +552,12 @@
|
|
|
516
552
|
]
|
|
517
553
|
},
|
|
518
554
|
"funifier-date-handling": {
|
|
519
|
-
"configHash": "
|
|
555
|
+
"configHash": "5a7fd773c2e29a7dacb108bc54262693df7f547cdde225dc95825f1c8dc04651",
|
|
520
556
|
"status": "verified",
|
|
521
557
|
"claims": []
|
|
522
558
|
},
|
|
523
559
|
"funifier-debug": {
|
|
524
|
-
"configHash": "
|
|
560
|
+
"configHash": "e64ae75ed8e9d02014c75480f83888904f408ce87de73e9ab71c142d272fa856",
|
|
525
561
|
"status": "verified",
|
|
526
562
|
"claims": [
|
|
527
563
|
{
|
|
@@ -537,7 +573,7 @@
|
|
|
537
573
|
]
|
|
538
574
|
},
|
|
539
575
|
"funifier-help": {
|
|
540
|
-
"configHash": "
|
|
576
|
+
"configHash": "25fbe8f89b7cb24e2410477d1c033f6761cd94c777995ae69a21eaf276a4d8ad",
|
|
541
577
|
"status": "verified",
|
|
542
578
|
"claims": [
|
|
543
579
|
{
|
|
@@ -553,7 +589,7 @@
|
|
|
553
589
|
]
|
|
554
590
|
},
|
|
555
591
|
"funifier-implement-frontend": {
|
|
556
|
-
"configHash": "
|
|
592
|
+
"configHash": "74c5916808501dd0f10572caf22b92dc083da076493422881060d413cc722681",
|
|
557
593
|
"status": "verified",
|
|
558
594
|
"claims": [
|
|
559
595
|
{
|
|
@@ -579,17 +615,17 @@
|
|
|
579
615
|
]
|
|
580
616
|
},
|
|
581
617
|
"funifier-import-csv": {
|
|
582
|
-
"configHash": "
|
|
618
|
+
"configHash": "9467463bbae7c65363df7137243ff034ccc23dba2426f3e05211ac5bde03ed17",
|
|
583
619
|
"status": "verified",
|
|
584
620
|
"claims": []
|
|
585
621
|
},
|
|
586
622
|
"funifier-manage-indexes": {
|
|
587
|
-
"configHash": "
|
|
623
|
+
"configHash": "bebb7f00e3b8a6eff8276b7264a33dfc6c912a58adc96f3fc8406e8cb1675df3",
|
|
588
624
|
"status": "verified",
|
|
589
625
|
"claims": []
|
|
590
626
|
},
|
|
591
627
|
"funifier-manage-player": {
|
|
592
|
-
"configHash": "
|
|
628
|
+
"configHash": "9d4a397fac4cd79d2a6168ef689ecd8dff76a28324f9a3e67492a1db573d127f",
|
|
593
629
|
"status": "verified",
|
|
594
630
|
"claims": [
|
|
595
631
|
{
|
|
@@ -615,7 +651,7 @@
|
|
|
615
651
|
]
|
|
616
652
|
},
|
|
617
653
|
"funifier-manage-team": {
|
|
618
|
-
"configHash": "
|
|
654
|
+
"configHash": "63c9ead124e4ffbab71fea8d320e12edc9aa48053bd9607c315bdd350fd1e5ac",
|
|
619
655
|
"status": "verified",
|
|
620
656
|
"claims": [
|
|
621
657
|
{
|
|
@@ -630,8 +666,13 @@
|
|
|
630
666
|
}
|
|
631
667
|
]
|
|
632
668
|
},
|
|
669
|
+
"funifier-query-aggregate": {
|
|
670
|
+
"configHash": "830f98451a47c0e2684aa6d77a218a5f9b3dc4d10ea3281d9a7fcde8c79f7dec",
|
|
671
|
+
"status": "verified",
|
|
672
|
+
"claims": []
|
|
673
|
+
},
|
|
633
674
|
"funifier-upload-file": {
|
|
634
|
-
"configHash": "
|
|
675
|
+
"configHash": "9c3dcaf7351189c3395ae3ea5ac122d5b470b3e1db0b0fd94384880c0094f19c",
|
|
635
676
|
"status": "verified",
|
|
636
677
|
"claims": []
|
|
637
678
|
}
|
|
@@ -293,6 +293,10 @@ POST /v3/find/{id}
|
|
|
293
293
|
| Substituição | Cada chave do corpo substitui `"$param:<chave>"` no pipeline diretamente |
|
|
294
294
|
| `context` no script Groovy | Só expõe o player autenticado — `context.get("outro")` retorna `null` |
|
|
295
295
|
| Script vazio | Se o pipeline só usa `"$param:nome"`, o `script` pode ser `""` — não precisa de `prepare()` |
|
|
296
|
+
| Substituição é a nível de **valor** | `"$param:nome"` deve ser a string JSON **inteira**; o valor assume o **tipo** do param (string, número, `Long`, `Date`, array, objeto). Não é interpolação de substring. |
|
|
297
|
+
| Param ausente | Um `"$param:nome"` sem chave correspondente no corpo vira **`null`** → filtro silenciosamente não casa nada. |
|
|
298
|
+
|
|
299
|
+
**Datas parametrizadas (prepared):** a gramática `{"$date": "-0M-"}` (§4) continua válida **dentro** do pipeline salvo para datas relativas fixas. Para uma data **dinâmica vinda de param**, o padrão é `{"$date": "$param:start"}` no pipeline e o `script` `prepare()` injetando millis: `params.put("start", <Date>.getTime())` (ou um `Date`). A §4 deste guia é o dono único das expressões `$date`; o cálculo da janela no script usa `DateUtil` (`java-libraries.md` §4) — ver também a skill `funifier-date-handling`.
|
|
296
300
|
|
|
297
301
|
**Listar os parâmetros esperados:**
|
|
298
302
|
```
|
|
@@ -300,21 +304,24 @@ GET /v3/find/{id}/params
|
|
|
300
304
|
→ ["player", "start"]
|
|
301
305
|
```
|
|
302
306
|
|
|
303
|
-
**Analisar a
|
|
307
|
+
**Analisar/inspecionar a definição** (dry-run — mesmo corpo da execução normal):
|
|
304
308
|
```
|
|
305
309
|
POST /v3/prepared/aggregate/{id}/analyze
|
|
306
310
|
```
|
|
307
311
|
|
|
312
|
+
> ⚠️ O `/analyze` é uma **inspeção (dry-run): NÃO roda a agregação no Mongo.** Ele compila e executa o `script` Groovy `prepare()`, aplica a substituição de `$param` e devolve o **pipeline resolvido** — não os documentos resultantes. Para resultado real, use `POST /v3/find/{id}`.
|
|
313
|
+
|
|
308
314
|
| Campo do retorno | Conteúdo |
|
|
309
315
|
|-------|----------|
|
|
310
|
-
| `script_outputs` | Saídas de `println` do script `prepare()` |
|
|
311
|
-
| `script_exceptions` | Exceções
|
|
312
|
-
| `obj` |
|
|
313
|
-
| `aggregate_step_2
|
|
316
|
+
| `script_outputs` | Saídas de `println` do script `prepare()` (capturadas) |
|
|
317
|
+
| `script_exceptions` | Exceções de compilação/execução do script Groovy — **vazio = script ok** |
|
|
318
|
+
| `obj` | A **definição salva** do prepared aggregate (a entidade, não os resultados) |
|
|
319
|
+
| `aggregate_step_2` | O pipeline **após** o `prepare()` rodar (efeitos do script aplicados) |
|
|
320
|
+
| `aggregate_step_3` | O pipeline **após** a substituição dos `"$param:nome"` pelos valores do corpo |
|
|
314
321
|
|
|
315
322
|
### Armadilhas conhecidas
|
|
316
323
|
|
|
317
324
|
- **Executar via `GET /v3/database/aggregate/{id}`** → retorna `null`/`405` silenciosamente, sem mensagem de erro. Correção: `POST /v3/find/{id}`.
|
|
318
325
|
- **Params na query string** → ignorados. Correção: corpo JSON.
|
|
319
326
|
- **Nome de param divergente** → resultado vazio. Correção: conferir com `GET /v3/find/{id}/params`.
|
|
320
|
-
- **
|
|
327
|
+
- **Script "salvo com sucesso" mas a execução retorna vazio/erro** → o save (`PUT /v3/database/prepared_aggregate`) **não compila** o script; só o `/analyze` (ou a execução) revela falhas. Rode o `/analyze` e inspecione `script_exceptions` (script quebrado) e `aggregate_step_3` (o filtro efetivo após `$param` — se um param faltou, ele vira `null` e o `$match` não casa nada).
|