@open-mercato/cli 0.6.7 → 0.6.8-canary.320.1.bf889f49e4
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/.turbo/turbo-build.log +77 -4
- package/AGENTS.md +6 -1
- package/build.mjs +68 -11
- package/dist/agentic/claude-code/hooks/entity-migration-check.ts +32 -88
- package/dist/agentic/codex/enforcement-rules.md +2 -16
- package/dist/agentic/cursor/hooks/entity-migration-check.mjs +19 -50
- package/dist/agentic/cursor/rules/entity-guard.mdc +9 -21
- package/dist/agentic/cursor/rules/generated-guard.mdc +3 -5
- package/dist/agentic/cursor/rules/open-mercato.mdc +3 -29
- package/dist/agentic/guides/ai-workflows.md +76 -0
- package/dist/agentic/guides/architecture.md +107 -0
- package/dist/agentic/guides/backend-ui.md +86 -0
- package/dist/agentic/guides/contracts.md +92 -0
- package/dist/agentic/guides/extensions.md +121 -0
- package/dist/agentic/guides/framework-extension-points.md +36 -0
- package/dist/agentic/guides/integrations.md +81 -0
- package/dist/agentic/guides/module-facts.json +116757 -3951
- package/dist/agentic/guides/module-system.md +12 -127
- package/dist/agentic/guides/modules/ai_assistant.md +227 -28
- package/dist/agentic/guides/modules/api_docs.md +58 -2
- package/dist/agentic/guides/modules/api_keys.md +92 -7
- package/dist/agentic/guides/modules/attachments.md +119 -14
- package/dist/agentic/guides/modules/audit_logs.md +131 -10
- package/dist/agentic/guides/modules/auth.md +276 -33
- package/dist/agentic/guides/modules/business_rules.md +149 -14
- package/dist/agentic/guides/modules/catalog.md +482 -43
- package/dist/agentic/guides/modules/channel_gmail.md +82 -3
- package/dist/agentic/guides/modules/channel_imap.md +82 -3
- package/dist/agentic/guides/modules/checkout.md +305 -27
- package/dist/agentic/guides/modules/communication_channels.md +315 -33
- package/dist/agentic/guides/modules/configs.md +104 -8
- package/dist/agentic/guides/modules/content.md +57 -2
- package/dist/agentic/guides/modules/currencies.md +152 -17
- package/dist/agentic/guides/modules/customer_accounts.md +387 -45
- package/dist/agentic/guides/modules/customers.md +746 -85
- package/dist/agentic/guides/modules/dashboards.md +155 -10
- package/dist/agentic/guides/modules/data_sync.md +149 -16
- package/dist/agentic/guides/modules/design_system.md +102 -0
- package/dist/agentic/guides/modules/dictionaries.md +107 -12
- package/dist/agentic/guides/modules/directory.md +148 -15
- package/dist/agentic/guides/modules/entities.md +145 -13
- package/dist/agentic/guides/modules/events.md +59 -2
- package/dist/agentic/guides/modules/feature_toggles.md +119 -9
- package/dist/agentic/guides/modules/gateway_stripe.md +92 -4
- package/dist/agentic/guides/modules/generators.md +45 -2
- package/dist/agentic/guides/modules/inbox_ops.md +207 -27
- package/dist/agentic/guides/modules/integrations.md +149 -16
- package/dist/agentic/guides/modules/messages.md +223 -24
- package/dist/agentic/guides/modules/notifications.md +96 -8
- package/dist/agentic/guides/modules/onboarding.md +77 -6
- package/dist/agentic/guides/modules/payment_gateways.md +168 -21
- package/dist/agentic/guides/modules/perspectives.md +77 -7
- package/dist/agentic/guides/modules/planner.md +136 -18
- package/dist/agentic/guides/modules/portal.md +93 -2
- package/dist/agentic/guides/modules/progress.md +104 -14
- package/dist/agentic/guides/modules/query_index.md +154 -15
- package/dist/agentic/guides/modules/record_locks.md +206 -21
- package/dist/agentic/guides/modules/resources.md +197 -30
- package/dist/agentic/guides/modules/sales.md +687 -84
- package/dist/agentic/guides/modules/scheduler.md +133 -14
- package/dist/agentic/guides/modules/search.md +170 -6
- package/dist/agentic/guides/modules/security.md +294 -35
- package/dist/agentic/guides/modules/shipping_carriers.md +134 -18
- package/dist/agentic/guides/modules/sso.md +151 -26
- package/dist/agentic/guides/modules/staff.md +372 -57
- package/dist/agentic/guides/modules/storage_s3.md +95 -5
- package/dist/agentic/guides/modules/sync_akeneo.md +85 -3
- package/dist/agentic/guides/modules/sync_excel.md +75 -6
- package/dist/agentic/guides/modules/system_status_overlays.md +60 -2
- package/dist/agentic/guides/modules/translations.md +104 -10
- package/dist/agentic/guides/modules/webhooks.md +203 -24
- package/dist/agentic/guides/modules/wms.md +469 -47
- package/dist/agentic/guides/modules/workflows.md +302 -43
- package/dist/agentic/guides/reference-module-facts.json +6942 -0
- package/dist/agentic/guides/reference-modules/example.md +462 -0
- package/dist/agentic/guides/spec-delivery.md +56 -0
- package/dist/agentic/guides/testing-debugging.md +80 -0
- package/dist/agentic/guides/upstream/AGENTS.md +300 -0
- package/dist/agentic/guides/upstream/BACKWARD_COMPATIBILITY.md +334 -0
- package/dist/agentic/guides/upstream/manifest.json +8 -0
- package/dist/agentic/shared/AGENTS.md.template +120 -311
- package/dist/agentic/shared/ai/agentic.config.json +2 -0
- package/dist/agentic/shared/ai/harness/README.md +50 -0
- package/dist/agentic/shared/ai/harness/RELEASE.md +59 -0
- package/dist/agentic/shared/ai/harness/cases.json +20596 -0
- package/dist/agentic/shared/ai/harness/cases.schema.json +196 -0
- package/dist/agentic/shared/ai/harness/design-system-inventory.json +6326 -0
- package/dist/agentic/shared/ai/harness/fixtures/index.json +51 -0
- package/dist/agentic/shared/ai/harness/fixtures/seeds.json +166 -0
- package/dist/agentic/shared/ai/harness/generated-code-review-policy.md +21 -0
- package/dist/agentic/shared/ai/harness/generated-code-review-response.schema.json +96 -0
- package/dist/agentic/shared/ai/harness/generated-code-review-result.schema.json +172 -0
- package/dist/agentic/shared/ai/harness/knowledge-change.schema.json +228 -0
- package/dist/agentic/shared/ai/harness/release-matrix.json +163 -0
- package/dist/agentic/shared/ai/harness/release-result.schema.json +219 -0
- package/dist/agentic/shared/ai/harness/result.schema.json +136 -0
- package/dist/agentic/shared/ai/harness/routing-response.schema.json +22 -0
- package/dist/agentic/shared/ai/harness/source-link-inventory.json +1706 -0
- package/dist/agentic/shared/ai/harness/target-validation-result.schema.json +73 -0
- package/dist/agentic/shared/ai/harness/validators.json +82 -0
- package/dist/agentic/shared/ai/harness/writable-ast-oracles.mjs +2121 -0
- package/dist/agentic/shared/ai/harness/writable-behavior-oracles.mjs +1096 -0
- package/dist/agentic/shared/ai/harness/writable-spec-oracles.mjs +602 -0
- package/dist/agentic/shared/ai/lessons/_template.md +16 -0
- package/dist/agentic/shared/ai/lessons.md +26 -3
- package/dist/agentic/shared/ai/review-checklist.md +36 -0
- package/dist/agentic/shared/ai/skills/om-auto-implement-spec/SKILL.md +21 -0
- package/dist/agentic/shared/ai/skills/om-auto-review-pr/SKILL.md +4 -0
- package/dist/agentic/shared/ai/skills/om-auto-upgrade-0.6.6-to-0.6.7/SKILL.md +98 -0
- package/dist/agentic/shared/ai/skills/om-backend-ui-design/SKILL.md +21 -241
- package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/crud-surfaces.md +31 -0
- package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/frontend-and-design-system.md +53 -0
- package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/page-and-navigation.md +15 -0
- package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/quality-states.md +11 -0
- package/dist/agentic/shared/ai/skills/om-build-workflow/SKILL.md +30 -0
- package/dist/agentic/shared/ai/skills/om-build-workflow/references/activity-contracts.md +12 -0
- package/dist/agentic/shared/ai/skills/om-build-workflow/references/durability-and-progress.md +13 -0
- package/dist/agentic/shared/ai/skills/om-build-workflow/references/workflow-design.md +14 -0
- package/dist/agentic/shared/ai/skills/om-create-ai-agent/SKILL.md +28 -0
- package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/attachments-and-overrides.md +12 -0
- package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/module-agents-and-tools.md +22 -0
- package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/orchestrator-agents.md +12 -0
- package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/surface-selector.md +19 -0
- package/dist/agentic/shared/ai/skills/om-data-model-design/SKILL.md +17 -601
- package/dist/agentic/shared/ai/skills/om-data-model-design/references/integrity-and-concurrency.md +21 -0
- package/dist/agentic/shared/ai/skills/om-data-model-design/references/migration-workflow.md +15 -0
- package/dist/agentic/shared/ai/skills/om-data-model-design/references/schema-design.md +16 -0
- package/dist/agentic/shared/ai/skills/om-data-model-design/references/sensitive-data.md +10 -0
- package/dist/agentic/shared/ai/skills/om-eject-and-customize/SKILL.md +15 -310
- package/dist/agentic/shared/ai/skills/om-eject-and-customize/references/decision-and-procedure.md +19 -0
- package/dist/agentic/shared/ai/skills/om-evolve-harness/SKILL.md +31 -0
- package/dist/agentic/shared/ai/skills/om-evolve-harness/references/case-template.md +100 -0
- package/dist/agentic/shared/ai/skills/om-evolve-harness/references/case-workflow.md +16 -0
- package/dist/agentic/shared/ai/skills/om-evolve-harness/references/knowledge-change.md +133 -0
- package/dist/agentic/shared/ai/skills/om-evolve-harness/references/owner-selection.md +17 -0
- package/dist/agentic/shared/ai/skills/om-framework-context/SKILL.md +25 -0
- package/dist/agentic/shared/ai/skills/om-framework-context/references/resolver-procedure.md +11 -0
- package/dist/agentic/shared/ai/skills/om-framework-context/references/skew-and-escalation.md +13 -0
- package/dist/agentic/shared/ai/skills/om-help/SKILL.md +15 -97
- package/dist/agentic/shared/ai/skills/om-help/references/delivery-workflows.md +18 -0
- package/dist/agentic/shared/ai/skills/om-help/references/task-families.md +20 -0
- package/dist/agentic/shared/ai/skills/om-implement-spec/SKILL.md +33 -152
- package/dist/agentic/shared/ai/skills/om-implement-spec/references/phases-and-gates.md +33 -0
- package/dist/agentic/shared/ai/skills/om-implement-spec/references/planning-and-progress.md +40 -0
- package/dist/agentic/shared/ai/skills/om-implement-spec/references/report-templates.md +27 -0
- package/dist/agentic/shared/ai/skills/om-implement-spec/references/spec-resolution.md +24 -0
- package/dist/agentic/shared/ai/skills/om-integration-builder/SKILL.md +25 -708
- package/dist/agentic/shared/ai/skills/om-integration-builder/references/package-and-activation.md +16 -0
- package/dist/agentic/shared/ai/skills/om-integration-builder/references/provider-families.md +25 -0
- package/dist/agentic/shared/ai/skills/om-integration-builder/references/security-and-reliability.md +15 -0
- package/dist/agentic/shared/ai/skills/om-integration-builder/references/sync-and-files.md +12 -0
- package/dist/agentic/shared/ai/skills/om-judge-agent-session/SKILL.md +34 -0
- package/dist/agentic/shared/ai/skills/om-judge-agent-session/agents/openai.yaml +4 -0
- package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/agentic-setup.md +11 -0
- package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/input-normalization.md +31 -0
- package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/judge-workflow.md +39 -0
- package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/report-template.md +43 -0
- package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/rules.md +11 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/SKILL.md +20 -820
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/api-and-domain.md +32 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/business-one-shot-blueprints.md +172 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/data-and-migrations.md +14 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/discovery-surface-catalog.md +83 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/module-surfaces.md +40 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/planning.md +11 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/runtime-cache-and-queues.md +22 -0
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/verification.md +13 -0
- package/dist/agentic/shared/ai/skills/om-share-this-session/SKILL.md +41 -0
- package/dist/agentic/shared/ai/skills/om-share-this-session/references/agentic-setup.md +19 -0
- package/dist/agentic/shared/ai/skills/om-share-this-session/references/bundle-preparation.md +44 -0
- package/dist/agentic/shared/ai/skills/om-share-this-session/references/consent-and-review.md +39 -0
- package/dist/agentic/shared/ai/skills/om-share-this-session/references/publication.md +20 -0
- package/dist/agentic/shared/ai/skills/om-share-this-session/references/report-templates.md +57 -0
- package/dist/agentic/shared/ai/skills/om-share-this-session/references/rules.md +11 -0
- package/dist/agentic/shared/ai/skills/om-share-this-session/scripts/prepare-share-bundle.mjs +486 -0
- package/dist/agentic/shared/ai/skills/om-system-extension/SKILL.md +20 -843
- package/dist/agentic/shared/ai/skills/om-system-extension/references/extension-branches.md +42 -0
- package/dist/agentic/shared/ai/skills/om-system-extension/references/mechanism-selector.md +27 -0
- package/dist/agentic/shared/ai/skills/om-system-extension/references/read-write-roundtrip.md +13 -0
- package/dist/agentic/shared/ai/skills/om-system-extension/references/unified-overrides.md +43 -0
- package/dist/agentic/shared/ai/skills/om-system-extension/references/verification.md +11 -0
- package/dist/agentic/shared/ai/skills/om-trim-unused-modules/SKILL.md +15 -63
- package/dist/agentic/shared/ai/skills/om-trim-unused-modules/references/dependency-and-redirect.md +15 -0
- package/dist/agentic/shared/ai/skills/om-troubleshooter/SKILL.md +17 -467
- package/dist/agentic/shared/ai/skills/om-troubleshooter/references/diagnosis-map.md +29 -0
- package/dist/agentic/shared/ai/skills/om-troubleshooter/references/regression-oracles.md +14 -0
- package/dist/agentic/shared/ai/skills/tiers.json +143 -21
- package/dist/agentic/shared/ai/skills/tiers.schema.json +52 -40
- package/dist/agentic/shared/ai/specs/2026-08-06-reference-module-activation.md +248 -0
- package/dist/agentic/shared/ai/specs/README.md +4 -3
- package/dist/agentic/shared/ai/specs/SPEC-000-template.md +226 -10
- package/dist/agentic/shared/ai/trackers/github.md +108 -4
- package/dist/agentic/shared/scripts/agent-harness-tool-server.mjs +224 -0
- package/dist/agentic/shared/scripts/check-lessons.mjs +178 -0
- package/dist/agentic/shared/scripts/evaluate-agent-harness.mjs +3812 -0
- package/dist/agentic/shared/scripts/execution-sandbox.mjs +329 -0
- package/dist/agentic/shared/scripts/framework-context.mjs +888 -0
- package/dist/agentic/shared/scripts/install-skills.mjs +1029 -0
- package/dist/agentic/shared/scripts/install-skills.sh +4 -694
- package/dist/agentic/shared/scripts/prepare-agent-harness-fixture.mjs +222 -0
- package/dist/agentic/shared/scripts/run-agent-harness-release.mjs +1774 -0
- package/dist/agentic/shared/scripts/validate-knowledge-change.mjs +1172 -0
- package/dist/bin.js +32 -34
- package/dist/bin.js.map +2 -2
- package/dist/lib/__integration__/TC-INT-008.spec.js +88 -8
- package/dist/lib/__integration__/TC-INT-008.spec.js.map +2 -2
- package/dist/lib/agentic-init.js +13 -3
- package/dist/lib/agentic-init.js.map +2 -2
- package/dist/lib/agentic-setup.js +434 -186
- package/dist/lib/agentic-setup.js.map +2 -2
- package/dist/lib/cli-bootstrap-mode.js +32 -0
- package/dist/lib/cli-bootstrap-mode.js.map +7 -0
- package/dist/lib/dev-supervisor-manifest.js +105 -0
- package/dist/lib/dev-supervisor-manifest.js.map +7 -0
- package/dist/lib/generate-watch-events.js +15 -0
- package/dist/lib/generate-watch-events.js.map +2 -2
- package/dist/lib/generators/entity-ids.js +11 -24
- package/dist/lib/generators/entity-ids.js.map +2 -2
- package/dist/lib/generators/extensions/injection-widgets.js +20 -0
- package/dist/lib/generators/extensions/injection-widgets.js.map +2 -2
- package/dist/lib/generators/module-di.js +10 -23
- package/dist/lib/generators/module-di.js.map +2 -2
- package/dist/lib/generators/module-entities.js +10 -23
- package/dist/lib/generators/module-entities.js.map +2 -2
- package/dist/lib/generators/module-extension-facts.js +1882 -0
- package/dist/lib/generators/module-extension-facts.js.map +7 -0
- package/dist/lib/generators/module-fact-sources.js +70 -0
- package/dist/lib/generators/module-fact-sources.js.map +7 -0
- package/dist/lib/generators/module-facts-discovery.js +64 -7
- package/dist/lib/generators/module-facts-discovery.js.map +2 -2
- package/dist/lib/generators/module-facts.js +1913 -52
- package/dist/lib/generators/module-facts.js.map +3 -3
- package/dist/lib/generators/module-override-targets.js +712 -0
- package/dist/lib/generators/module-override-targets.js.map +7 -0
- package/dist/lib/generators/module-registry.js +405 -36
- package/dist/lib/generators/module-registry.js.map +2 -2
- package/dist/lib/generators/route-manifest-shards.js +170 -0
- package/dist/lib/generators/route-manifest-shards.js.map +7 -0
- package/dist/lib/in-process-generate-watcher.js +12 -3
- package/dist/lib/in-process-generate-watcher.js.map +2 -2
- package/dist/lib/load-env.js +24 -0
- package/dist/lib/load-env.js.map +7 -0
- package/dist/lib/queue-worker-supervisor.js.map +2 -2
- package/dist/lib/resolver.js +28 -3
- package/dist/lib/resolver.js.map +2 -2
- package/dist/lib/telemetry-init.js +358 -0
- package/dist/lib/telemetry-init.js.map +7 -0
- package/dist/lib/testing/integration.js +5 -2
- package/dist/lib/testing/integration.js.map +2 -2
- package/dist/lib/utils.js +15 -8
- package/dist/lib/utils.js.map +2 -2
- package/dist/mercato.js +35 -9
- package/dist/mercato.js.map +2 -2
- package/package.json +13 -11
- package/src/__tests__/mercato.test.ts +144 -0
- package/src/bin.ts +60 -42
- package/src/lib/__integration__/TC-INT-008.spec.ts +107 -9
- package/src/lib/__tests__/agentic-init.test.ts +41 -5
- package/src/lib/__tests__/agentic-setup.ownership.test.ts +386 -0
- package/src/lib/__tests__/cli-bootstrap-mode.test.ts +22 -0
- package/src/lib/__tests__/content-stable-writes.test.ts +74 -0
- package/src/lib/__tests__/dev-supervisor-manifest.test.ts +131 -0
- package/src/lib/__tests__/generate-watch-events.test.ts +76 -0
- package/src/lib/__tests__/in-process-generate-watcher.test.ts +52 -1
- package/src/lib/__tests__/injection-widget-id-validation.test.ts +184 -0
- package/src/lib/__tests__/load-env.test.ts +65 -0
- package/src/lib/__tests__/queue-worker-supervisor.test.ts +33 -0
- package/src/lib/__tests__/resolver.enterprise.test.ts +50 -0
- package/src/lib/__tests__/telemetry-init.test.ts +298 -0
- package/src/lib/agentic-init.ts +15 -3
- package/src/lib/agentic-setup.ts +573 -222
- package/src/lib/cli-bootstrap-mode.ts +31 -0
- package/src/lib/dev-supervisor-manifest.ts +142 -0
- package/src/lib/generate-watch-events.ts +14 -0
- package/src/lib/generators/__tests__/activation-adapter-coverage.test.ts +92 -0
- package/src/lib/generators/__tests__/entity-ids.test.ts +32 -0
- package/src/lib/generators/__tests__/helpers/override-target-diagnostic-fixtures.ts +150 -0
- package/src/lib/generators/__tests__/module-extension-activations.test.ts +762 -0
- package/src/lib/generators/__tests__/module-extension-facts.test.ts +603 -0
- package/src/lib/generators/__tests__/module-facts.bc-guard.test.ts +139 -2
- package/src/lib/generators/__tests__/module-facts.computed-di-token.test.ts +88 -0
- package/src/lib/generators/__tests__/module-facts.customers.fixture.test.ts +1 -0
- package/src/lib/generators/__tests__/module-facts.discovery.test.ts +54 -10
- package/src/lib/generators/__tests__/module-facts.example-fact-coverage.test.ts +414 -0
- package/src/lib/generators/__tests__/module-facts.extension-hosts.test.ts +108 -0
- package/src/lib/generators/__tests__/module-facts.local-reference.test.ts +393 -0
- package/src/lib/generators/__tests__/module-facts.owned-contracts.test.ts +561 -0
- package/src/lib/generators/__tests__/module-facts.search-entity-id.test.ts +151 -0
- package/src/lib/generators/__tests__/module-facts.source-links.test.ts +160 -0
- package/src/lib/generators/__tests__/module-override-targets.diagnostic-wiring.test.ts +92 -0
- package/src/lib/generators/__tests__/module-override-targets.roundtrip.test.ts +149 -0
- package/src/lib/generators/__tests__/module-override-targets.test.ts +328 -0
- package/src/lib/generators/__tests__/module-override-targets.unknown-mode.test.ts +117 -0
- package/src/lib/generators/__tests__/module-subset.test.ts +266 -0
- package/src/lib/generators/__tests__/output-snapshots.test.ts +3 -3
- package/src/lib/generators/__tests__/route-manifest-shards.test.ts +62 -0
- package/src/lib/generators/entity-ids.ts +10 -26
- package/src/lib/generators/extensions/injection-widgets.ts +51 -0
- package/src/lib/generators/module-di.ts +9 -25
- package/src/lib/generators/module-entities.ts +9 -25
- package/src/lib/generators/module-extension-facts.ts +2472 -0
- package/src/lib/generators/module-fact-sources.ts +108 -0
- package/src/lib/generators/module-facts-discovery.ts +104 -7
- package/src/lib/generators/module-facts.ts +2747 -138
- package/src/lib/generators/module-override-targets.ts +907 -0
- package/src/lib/generators/module-registry.ts +448 -35
- package/src/lib/generators/route-manifest-shards.ts +146 -0
- package/src/lib/in-process-generate-watcher.ts +13 -4
- package/src/lib/load-env.ts +30 -0
- package/src/lib/queue-worker-supervisor.ts +7 -2
- package/src/lib/resolver.ts +34 -3
- package/src/lib/telemetry-init.ts +461 -0
- package/src/lib/testing/__tests__/integration.test.ts +4 -0
- package/src/lib/testing/integration.ts +5 -2
- package/src/lib/utils.ts +24 -16
- package/src/mercato.ts +46 -9
- package/dist/agentic/guides/cache.md +0 -45
- package/dist/agentic/guides/core.md +0 -453
- package/dist/agentic/guides/events.md +0 -117
- package/dist/agentic/guides/queue.md +0 -53
- package/dist/agentic/guides/search.md +0 -115
- package/dist/agentic/guides/shared.md +0 -108
- package/dist/agentic/guides/ui.md +0 -347
- package/dist/agentic/shared/ai/skills/om-auto-continue-pr-loop/SKILL.md +0 -27
- package/dist/agentic/shared/ai/skills/om-auto-create-pr-loop/SKILL.md +0 -27
- package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/ui-components.md +0 -260
- package/dist/agentic/shared/ai/skills/om-data-model-design/references/mikro-orm-cheatsheet.md +0 -146
- package/dist/agentic/shared/ai/skills/om-help/references/skills-catalog.md +0 -84
- package/dist/agentic/shared/ai/skills/om-help/references/workflow-sequences.md +0 -193
- package/dist/agentic/shared/ai/skills/om-integration-builder/STANDALONE.md +0 -34
- package/dist/agentic/shared/ai/skills/om-integration-builder/references/adapter-contracts.md +0 -762
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/naming-conventions.md +0 -50
- package/dist/agentic/shared/ai/skills/om-module-scaffold/references/navigation-patterns.md +0 -97
- package/dist/agentic/shared/ai/skills/om-system-extension/references/extension-contracts.md +0 -271
- package/dist/agentic/shared/ai/skills/om-troubleshooter/references/diagnostic-commands.md +0 -101
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
# Events Package — Standalone Developer Guide
|
|
2
|
-
|
|
3
|
-
`@open-mercato/events` provides event-driven communication between modules. Use events for side effects — never direct module-to-module function calls.
|
|
4
|
-
|
|
5
|
-
## Declaring Events
|
|
6
|
-
|
|
7
|
-
Every module that emits events MUST declare them in `events.ts`:
|
|
8
|
-
|
|
9
|
-
```typescript
|
|
10
|
-
import { createModuleEvents } from '@open-mercato/shared/modules/events'
|
|
11
|
-
|
|
12
|
-
const events = [
|
|
13
|
-
{ id: 'my_mod.item.created', label: 'Item Created', entity: 'item', category: 'crud' },
|
|
14
|
-
{ id: 'my_mod.item.updated', label: 'Item Updated', entity: 'item', category: 'crud' },
|
|
15
|
-
{ id: 'my_mod.item.deleted', label: 'Item Deleted', entity: 'item', category: 'crud' },
|
|
16
|
-
] as const
|
|
17
|
-
|
|
18
|
-
export const eventsConfig = createModuleEvents({ moduleId: 'my_mod', events })
|
|
19
|
-
export const emitMyModEvent = eventsConfig.emit
|
|
20
|
-
export default eventsConfig
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
MUST use `as const` — provides compile-time safety. Run `yarn generate` after adding.
|
|
24
|
-
|
|
25
|
-
### Event ID Convention
|
|
26
|
-
|
|
27
|
-
Format: `module.entity.action` (singular entity, past tense action, dots as separators).
|
|
28
|
-
|
|
29
|
-
## Adding Subscribers
|
|
30
|
-
|
|
31
|
-
Create subscriber files in `src/modules/<module>/subscribers/`:
|
|
32
|
-
|
|
33
|
-
```typescript
|
|
34
|
-
// subscribers/item-created-notify.ts
|
|
35
|
-
export const metadata = {
|
|
36
|
-
event: 'my_mod.item.created',
|
|
37
|
-
persistent: true, // survives restarts, retried on failure
|
|
38
|
-
id: 'item-created-notify',
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export default async function handler(payload, ctx) {
|
|
42
|
-
// One side effect per subscriber
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
Run `yarn generate` after adding.
|
|
47
|
-
|
|
48
|
-
## Subscription Types
|
|
49
|
-
|
|
50
|
-
| Type | Use for | Behavior |
|
|
51
|
-
|------|---------|----------|
|
|
52
|
-
| Ephemeral (`persistent: false`) | Real-time UI updates, cache invalidation | In-memory, no retry, lost on restart |
|
|
53
|
-
| Persistent (`persistent: true`) | Notifications, indexing, audit logging | Queue-backed, retried on failure |
|
|
54
|
-
|
|
55
|
-
Persistent subscribers MUST be idempotent — they may be retried.
|
|
56
|
-
|
|
57
|
-
## DOM Event Bridge (Browser Events via SSE)
|
|
58
|
-
|
|
59
|
-
Stream server-side events to the browser for real-time UI updates.
|
|
60
|
-
|
|
61
|
-
### Enable on Events
|
|
62
|
-
|
|
63
|
-
Add `clientBroadcast: true` to event declarations:
|
|
64
|
-
|
|
65
|
-
```typescript
|
|
66
|
-
const events = [
|
|
67
|
-
{ id: 'my_mod.item.created', label: 'Created', category: 'crud', clientBroadcast: true },
|
|
68
|
-
] as const
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Consume in Components
|
|
72
|
-
|
|
73
|
-
```typescript
|
|
74
|
-
import { useAppEvent } from '@open-mercato/ui/backend/injection/useAppEvent'
|
|
75
|
-
|
|
76
|
-
// Wildcard: all events from a module
|
|
77
|
-
useAppEvent('my_mod.*', (event) => {
|
|
78
|
-
// event.id, event.payload — refresh data, show notification
|
|
79
|
-
}, [])
|
|
80
|
-
|
|
81
|
-
// Exact match
|
|
82
|
-
useAppEvent('my_mod.item.created', (event) => {
|
|
83
|
-
reloadItems()
|
|
84
|
-
}, [reloadItems])
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### Track Long-Running Operations
|
|
88
|
-
|
|
89
|
-
```typescript
|
|
90
|
-
import { useOperationProgress } from '@open-mercato/ui/backend/injection/useOperationProgress'
|
|
91
|
-
|
|
92
|
-
const progress = useOperationProgress('my_mod.import.*')
|
|
93
|
-
// progress.status: 'idle' | 'running' | 'completed' | 'failed'
|
|
94
|
-
// progress.progress: 0-100
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
### SSE Audience Filtering
|
|
98
|
-
|
|
99
|
-
Events are server-filtered before SSE delivery by:
|
|
100
|
-
- `tenantId` (must match)
|
|
101
|
-
- `organizationId` / `organizationIds` (must match selected org)
|
|
102
|
-
- `recipientUserId` / `recipientUserIds` (must include user)
|
|
103
|
-
- `recipientRoleId` / `recipientRoleIds` (must intersect roles)
|
|
104
|
-
|
|
105
|
-
Missing `tenantId` in payload = no delivery.
|
|
106
|
-
|
|
107
|
-
## Queue Integration
|
|
108
|
-
|
|
109
|
-
| Queue strategy | Ephemeral | Persistent |
|
|
110
|
-
|----------------|-----------|------------|
|
|
111
|
-
| `local` (dev) | In-process | `.mercato/queue/` filesystem |
|
|
112
|
-
| `async` (prod) | In-process | BullMQ (Redis-backed) |
|
|
113
|
-
|
|
114
|
-
For production, start the event worker:
|
|
115
|
-
```bash
|
|
116
|
-
yarn mercato events worker event-processing --concurrency=5
|
|
117
|
-
```
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# Queue Package — Standalone Developer Guide
|
|
2
|
-
|
|
3
|
-
`@open-mercato/queue` provides background job processing. MUST NOT implement custom job queues or polling loops.
|
|
4
|
-
|
|
5
|
-
## Strategy Selection
|
|
6
|
-
|
|
7
|
-
| Strategy | When | Config |
|
|
8
|
-
|----------|------|--------|
|
|
9
|
-
| Local | Development — processes from `.mercato/queue/` | `QUEUE_STRATEGY=local` |
|
|
10
|
-
| BullMQ | Production — Redis-backed with retries | `QUEUE_STRATEGY=async` |
|
|
11
|
-
|
|
12
|
-
## Adding a Worker
|
|
13
|
-
|
|
14
|
-
Create `src/modules/<module>/workers/<name>.ts`:
|
|
15
|
-
|
|
16
|
-
```typescript
|
|
17
|
-
export const metadata = {
|
|
18
|
-
queue: 'my-queue',
|
|
19
|
-
id: 'my-worker',
|
|
20
|
-
concurrency: 5,
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export default async function handler(job) {
|
|
24
|
-
// MUST be idempotent — jobs may be retried on failure
|
|
25
|
-
// Check state before mutating
|
|
26
|
-
}
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
Run `yarn generate` after adding.
|
|
30
|
-
|
|
31
|
-
## Concurrency Guidelines
|
|
32
|
-
|
|
33
|
-
| Worker type | Concurrency | Rationale |
|
|
34
|
-
|-------------|-------------|-----------|
|
|
35
|
-
| I/O-bound (API calls, email) | 5–10 | Network latency allows parallelism |
|
|
36
|
-
| CPU-bound (calculations) | 1–2 | Avoid blocking event loop |
|
|
37
|
-
| Database-heavy (bulk writes) | 3–5 | Balance with connection pool |
|
|
38
|
-
|
|
39
|
-
Max concurrency: 20.
|
|
40
|
-
|
|
41
|
-
## MUST Rules
|
|
42
|
-
|
|
43
|
-
1. **MUST make workers idempotent** — duplicate execution MUST NOT corrupt data
|
|
44
|
-
2. **MUST export `metadata`** with `{ queue, id?, concurrency? }`
|
|
45
|
-
3. **MUST test with both strategies** (`local` and `async`)
|
|
46
|
-
|
|
47
|
-
## Running Workers (Production)
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
yarn mercato <module> worker <queue-name> --concurrency=5
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
Development: local strategy auto-processes from `.mercato/queue/`.
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
# Search Package — Standalone Developer Guide
|
|
2
|
-
|
|
3
|
-
`@open-mercato/search` provides fulltext, vector, and token-based search. Configure search for your entities via `search.ts` in your module.
|
|
4
|
-
|
|
5
|
-
## Strategy Overview
|
|
6
|
-
|
|
7
|
-
| Strategy | Backend | Use when |
|
|
8
|
-
|----------|---------|----------|
|
|
9
|
-
| **Fulltext** | Meilisearch | Fast, typo-tolerant search (names, titles, descriptions) |
|
|
10
|
-
| **Vector** | OpenAI / Ollama | Semantic, meaning-based search ("find customers interested in X") |
|
|
11
|
-
| **Tokens** | PostgreSQL | Baseline keyword search, always available, no external services |
|
|
12
|
-
|
|
13
|
-
Strategies auto-degrade when their backend is not configured.
|
|
14
|
-
|
|
15
|
-
## Adding Search to a Module
|
|
16
|
-
|
|
17
|
-
Create `src/modules/<module>/search.ts`:
|
|
18
|
-
|
|
19
|
-
```typescript
|
|
20
|
-
import type { SearchModuleConfig, SearchBuildContext } from '@open-mercato/shared/modules/search'
|
|
21
|
-
|
|
22
|
-
export const searchConfig: SearchModuleConfig = {
|
|
23
|
-
entities: [{
|
|
24
|
-
entityId: 'my_module:my_entity', // MUST match entity registry
|
|
25
|
-
priority: 10,
|
|
26
|
-
|
|
27
|
-
// Fulltext: control field indexing
|
|
28
|
-
fieldPolicy: {
|
|
29
|
-
searchable: ['name', 'description'],
|
|
30
|
-
hashOnly: ['email', 'phone'], // exact match only
|
|
31
|
-
excluded: ['password', 'api_key'], // never indexed
|
|
32
|
-
},
|
|
33
|
-
|
|
34
|
-
// Vector: generate text for embeddings
|
|
35
|
-
buildSource: async (ctx: SearchBuildContext) => ({
|
|
36
|
-
text: [`Name: ${ctx.record.name}`, `Description: ${ctx.record.description}`],
|
|
37
|
-
presenter: { title: ctx.record.name, subtitle: ctx.record.status, icon: 'lucide:file', badge: 'Item' },
|
|
38
|
-
links: [{ href: `/backend/my-module/${ctx.record.id}`, label: 'View', kind: 'primary' }],
|
|
39
|
-
checksumSource: { record: ctx.record, customFields: ctx.customFields },
|
|
40
|
-
}),
|
|
41
|
-
|
|
42
|
-
// Tokens: format at search time
|
|
43
|
-
formatResult: async (ctx: SearchBuildContext) => ({
|
|
44
|
-
title: ctx.record.name ?? 'Unknown',
|
|
45
|
-
subtitle: ctx.record.status,
|
|
46
|
-
icon: 'lucide:file',
|
|
47
|
-
badge: 'Item',
|
|
48
|
-
}),
|
|
49
|
-
|
|
50
|
-
resolveUrl: async (ctx) => `/backend/my-module/${ctx.record.id}`,
|
|
51
|
-
}],
|
|
52
|
-
}
|
|
53
|
-
export default searchConfig
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
Run `yarn generate` after creating the file.
|
|
57
|
-
|
|
58
|
-
## MUST Rules
|
|
59
|
-
|
|
60
|
-
1. **MUST create `search.ts`** for every module with searchable entities
|
|
61
|
-
2. **MUST define `fieldPolicy.excluded`** for sensitive fields (passwords, tokens, SSNs)
|
|
62
|
-
3. **MUST define `formatResult`** for every entity using the tokens strategy
|
|
63
|
-
4. **MUST include `checksumSource`** in every `buildSource` return value
|
|
64
|
-
5. **MUST NOT** include encrypted/sensitive fields in `buildSource` text
|
|
65
|
-
6. **MUST NOT** use raw `fetch` against search API — use `apiCall`/`apiCallOrThrow`
|
|
66
|
-
|
|
67
|
-
## Auto-Indexing
|
|
68
|
-
|
|
69
|
-
When CRUD routes have `indexer: { entityType }`, the search module automatically subscribes to entity CRUD events and indexes/removes records. No manual indexing code needed.
|
|
70
|
-
|
|
71
|
-
## CLI Commands
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
yarn mercato search status # Check strategies and connectivity
|
|
75
|
-
yarn mercato search query -q "term" --tenant <id> # Run a search
|
|
76
|
-
yarn mercato search reindex --tenant <id> # Reindex all entities
|
|
77
|
-
yarn mercato search reindex --entity my_module:my_entity --tenant <id> # Reindex specific entity
|
|
78
|
-
yarn mercato search test-meilisearch # Test Meilisearch connection
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
## Environment Variables
|
|
82
|
-
|
|
83
|
-
| Variable | Purpose |
|
|
84
|
-
|----------|---------|
|
|
85
|
-
| `MEILISEARCH_HOST` | Meilisearch URL (enables fulltext) |
|
|
86
|
-
| `MEILISEARCH_API_KEY` | Meilisearch auth key |
|
|
87
|
-
| `OPENAI_API_KEY` | OpenAI API key (enables vector search) |
|
|
88
|
-
| `OM_SEARCH_DEBUG` | Enable verbose debug logging |
|
|
89
|
-
|
|
90
|
-
## Programmatic Search via DI
|
|
91
|
-
|
|
92
|
-
```typescript
|
|
93
|
-
const searchService = container.resolve('searchService')
|
|
94
|
-
const results = await searchService.search('query', {
|
|
95
|
-
tenantId: 'tenant-123',
|
|
96
|
-
limit: 20,
|
|
97
|
-
strategies: ['fulltext', 'vector'],
|
|
98
|
-
})
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
## SearchBuildContext
|
|
102
|
-
|
|
103
|
-
Both `buildSource` and `formatResult` receive this context:
|
|
104
|
-
|
|
105
|
-
```typescript
|
|
106
|
-
interface SearchBuildContext {
|
|
107
|
-
record: Record<string, unknown> // The database record
|
|
108
|
-
customFields: Record<string, unknown> // Custom fields (without cf: prefix)
|
|
109
|
-
tenantId?: string | null
|
|
110
|
-
organizationId?: string | null
|
|
111
|
-
queryEngine?: QueryEngine // For loading related entities
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
Use `queryEngine` to load parent/related entities for richer presenter data.
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
# Shared Package — Standalone Developer Guide
|
|
2
|
-
|
|
3
|
-
`@open-mercato/shared` provides cross-cutting utilities, types, and DSL helpers. Import from here for infrastructure concerns — never from `@open-mercato/core`.
|
|
4
|
-
|
|
5
|
-
## Import Map
|
|
6
|
-
|
|
7
|
-
| Need | Import |
|
|
8
|
-
|------|--------|
|
|
9
|
-
| Client-side translations | `import { useT } from '@open-mercato/shared/lib/i18n/context'` |
|
|
10
|
-
| Server-side translations | `import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'` |
|
|
11
|
-
| Encrypted queries | `import { findWithDecryption, findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'` |
|
|
12
|
-
| Boolean parsing | `import { parseBooleanToken, parseBooleanWithDefault } from '@open-mercato/shared/lib/boolean'` |
|
|
13
|
-
| Command pattern | `import { registerCommand } from '@open-mercato/shared/lib/commands'` |
|
|
14
|
-
| Safe entity flush | `import { withAtomicFlush } from '@open-mercato/shared/lib/commands/flush'` |
|
|
15
|
-
| Data/Query engine types | `import type { DataEngine, QueryEngine } from '@open-mercato/shared/lib/data/engine'` |
|
|
16
|
-
| CRUD multi-ID filtering | `import { parseIdsParam, mergeIdFilter } from '@open-mercato/shared/lib/crud/ids'` |
|
|
17
|
-
| CRUD OpenAPI factory | `import { createCrudOpenApiFactory } from '@open-mercato/shared/lib/openapi/crud'` |
|
|
18
|
-
| Scoped API payloads | `import { withScopedPayload } from '@open-mercato/shared/lib/api/scoped'` |
|
|
19
|
-
| DI setup (Awilix) | `import { ... } from '@open-mercato/shared/lib/di'` |
|
|
20
|
-
| Custom field helpers | `import { splitCustomFieldPayload, normalizeCustomFieldValues } from '@open-mercato/shared/lib/custom-fields'` |
|
|
21
|
-
| DSL helpers | `import { defineLink, entityId, cf } from '@open-mercato/shared/modules/dsl'` |
|
|
22
|
-
| Event declarations | `import { createModuleEvents } from '@open-mercato/shared/modules/events'` |
|
|
23
|
-
| Module setup types | `import type { ModuleSetupConfig } from '@open-mercato/shared/modules/setup'` |
|
|
24
|
-
| Search config types | `import type { SearchModuleConfig } from '@open-mercato/shared/modules/search'` |
|
|
25
|
-
| Widget injection position | `import { InjectionPosition } from '@open-mercato/shared/modules/widgets/injection-position'` |
|
|
26
|
-
| API interceptor types | `import type { ApiInterceptor } from '@open-mercato/shared/lib/crud/api-interceptor'` |
|
|
27
|
-
| Response enricher types | `import type { ResponseEnricher } from '@open-mercato/shared/lib/crud/response-enricher'` |
|
|
28
|
-
| Broadcast event check | `import { isBroadcastEvent } from '@open-mercato/shared/modules/events'` |
|
|
29
|
-
|
|
30
|
-
## i18n — All User-Facing Strings
|
|
31
|
-
|
|
32
|
-
Never hard-code user-facing text. Use locale files and translation helpers.
|
|
33
|
-
|
|
34
|
-
```typescript
|
|
35
|
-
// Client-side (React components)
|
|
36
|
-
const t = useT()
|
|
37
|
-
return <span>{t('my_module.labels.title')}</span>
|
|
38
|
-
|
|
39
|
-
// Server-side (API routes, commands)
|
|
40
|
-
const { t } = await resolveTranslations()
|
|
41
|
-
const label = t('my_module.labels.title')
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
Add translations to `i18n/<locale>.json` files in your module.
|
|
45
|
-
|
|
46
|
-
## Encryption — Query Encrypted Entities
|
|
47
|
-
|
|
48
|
-
MUST use these instead of raw `em.find`/`em.findOne` when the entity may contain encrypted fields:
|
|
49
|
-
|
|
50
|
-
```typescript
|
|
51
|
-
const results = await findWithDecryption(em, 'Entity', filter, { tenantId, organizationId })
|
|
52
|
-
const record = await findOneWithDecryption(em, 'Entity', filter, { tenantId, organizationId })
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## Boolean Parsing
|
|
56
|
-
|
|
57
|
-
For env vars and query params, never use `=== 'true'`:
|
|
58
|
-
|
|
59
|
-
```typescript
|
|
60
|
-
const isEnabled = parseBooleanToken(process.env.MY_FLAG) // true | false | undefined
|
|
61
|
-
const withDefault = parseBooleanWithDefault(query.active, true) // defaults to true
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Safe Entity Flush
|
|
65
|
-
|
|
66
|
-
When a command mutates entities across phases that include queries on the same `EntityManager`, use `withAtomicFlush` to prevent silent data loss:
|
|
67
|
-
|
|
68
|
-
```typescript
|
|
69
|
-
import { withAtomicFlush } from '@open-mercato/shared/lib/commands/flush'
|
|
70
|
-
|
|
71
|
-
await withAtomicFlush(em, [
|
|
72
|
-
() => { record.name = 'New'; record.status = 'active' },
|
|
73
|
-
() => syncEntityTags(em, record, tags), // internal em.find() won't lose changes
|
|
74
|
-
], { transaction: true })
|
|
75
|
-
|
|
76
|
-
// Side effects AFTER the atomic flush
|
|
77
|
-
await emitCrudSideEffects({ ... })
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
**Never** run `em.find`/`em.findOne` between scalar mutations and `em.flush()` without `withAtomicFlush`.
|
|
81
|
-
|
|
82
|
-
## CRUD Multi-ID Filtering
|
|
83
|
-
|
|
84
|
-
Filter list APIs by multiple IDs using `?ids=uuid1,uuid2`:
|
|
85
|
-
|
|
86
|
-
```typescript
|
|
87
|
-
import { parseIdsParam, mergeIdFilter } from '@open-mercato/shared/lib/crud/ids'
|
|
88
|
-
const ids = parseIdsParam(query.ids) // string[] | undefined
|
|
89
|
-
const filter = mergeIdFilter(existingFilter, ids) // intersects with existing id filter
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
## Custom Field Helpers
|
|
93
|
-
|
|
94
|
-
When your entity uses custom fields:
|
|
95
|
-
|
|
96
|
-
```typescript
|
|
97
|
-
import { splitCustomFieldPayload, normalizeCustomFieldValues, normalizeCustomFieldResponse }
|
|
98
|
-
from '@open-mercato/shared/lib/custom-fields'
|
|
99
|
-
|
|
100
|
-
// In create/update: split cf:* fields from standard fields
|
|
101
|
-
const { standard, custom } = splitCustomFieldPayload(body)
|
|
102
|
-
|
|
103
|
-
// Normalize for storage
|
|
104
|
-
const normalized = normalizeCustomFieldValues(custom, fieldDefinitions)
|
|
105
|
-
|
|
106
|
-
// Normalize for API response
|
|
107
|
-
const response = normalizeCustomFieldResponse(record, customFields)
|
|
108
|
-
```
|