MyronCMS Developers Hub Docs sandbox review

Content Capabilities

Content Banks Visibility

Content Banks visibility is controlled by the MIC descriptor field bankSurface. It tells MyronCMS whether a MIC type should appear as an owned bank, a picker that links elsewhere, or a toolbar-only insertion type.

This is an advanced current surface because extension resolvers can declare visibility and the Content Banks route reads those descriptors. It is not a generic extension CRUD generator.

Human Path

A developer sets bankSurface in the resolver descriptor. An administrator then sees the registered type in Content Banks according to that descriptor after the extension is loaded.

For picker surfaces, the Content Banks tab links to the parent surface where entries are managed.

AI Path

An AI coding agent can set the descriptor locally while authoring the resolver.

An installed AI client with content.read can inspect registered type descriptors through /api/v1/content/mics/types and through MCP discovery when the action is visible to that caller. The browser Content Banks UI remains a human/admin surface, not a direct MCP operation.

Visibility Values

bankSurfaceCurrent behaviorUse when
editorDeclares that the type is an editor-owned bank surface. Core Tables and Forms have current editor surfaces. Extension authors should not treat this as automatic generic CRUD unless their own UI/actions provide it.The content type has a real editor surface under the current system.
pickerContent Banks lists the type and provides a link to parentSurfaceUrl. Entries are managed in the parent surface.The extension owns authoring elsewhere, such as an extension admin route.
noneThe type is omitted from Content Banks tabs. It may still be discoverable for rich-text insertion where the toolbar allows it.The type is toolbar-only or not appropriate for a bank tab.

picker requires parentSurfaceUrl. The registry rejects picker descriptors without it.

Descriptor Example

public function describe(): array
{
    return [
        'slug' => 'x.my_vendor.catalog',
        'label' => 'Catalog Item',
        'description' => 'Reusable catalog block.',
        'icon' => 'box',
        'scopes' => [MyronApiScopes::CONTENT_READ],
        'bankSurface' => 'picker',
        'parentSurfaceUrl' => $this->sdk->buildAdminUrl('x.my_vendor.catalog'),
    ];
}

Scopes

The type listing action requires content.read. Descriptor scopes should state what the MIC type needs for safe use. Managing entries in a parent surface may require additional route guards or action scopes; document those on the admin route or action page.

Artifacts

Descriptor source:

  • MicElementResolverInterface::describe()
  • MicElementRegistry::normalizeDescriptor()

Runtime surfaces:

  • Content Banks route
  • /api/v1/content/mics/types
  • MCP-visible type listing action for scoped callers

Safety Boundary

Do not use bankSurface: editor to imply that MyronCMS will automatically create extension-owned list, edit, create, duplicate, or delete screens. Current extension-safe behavior is descriptor registration plus rendering/discovery. Extension-owned authoring should be documented as an admin route, action set, or parent surface.

Do not hide a type from Content Banks with none and then claim it is undiscoverable everywhere. none controls the bank tab, not all runtime descriptor listing.

Verification

Run:

php app/tests/verify-content-banks-mic.php
php app/tests/verify-mic-registry.php

Verify:

  • editor, picker, and none normalize as accepted values,
  • picker without parentSurfaceUrl is rejected,
  • Content Banks omits none types from tabs,
  • Content Banks renders a picker tab and parent link for picker types,
  • /api/v1/content/mics/types returns registered descriptors for scoped callers.

Failure Modes

FailureWhat it meansSafe response
Picker registration rejectedparentSurfaceUrl is missing.Add the parent URL or use none.
Type does not appear in Content BanksbankSurface is none, extension did not load, or the type is core-special-cased.Check descriptor, load state, and Content Banks rules.
Tab appears but cannot manage entriesPicker surfaces intentionally link to parent authoring.Implement or link the parent surface.
AI client expects to operate the UIContent Banks is browser/admin mediated.Use documented API/MCP discovery and extension actions instead.
Generic CRUD is assumed for extensionsUnsupported current behavior.Document explicit admin routes or scoped actions for entry management.