PluginBench
Skill
Pass
Audit score 90

extension-data-viewer

caffeinelabs/skills

Admin-only paginated viewer for stable canister state in Caffeine apps.

What is extension-data-viewer?

Auto-generates controller-only queries to inspect stable data structures like Maps, Sets, and Lists in your Caffeine backend. Use this when you need to browse users, items, orders, logs, or any other backend data for debugging and admin dashboards.

  • Auto-generates `__<var>` queries for every stable variable of supported types (Map, Set, Array, List, Stack, Queue)
  • Provides paginated access with optional cursor and count parameters for efficient data browsing
  • Restricts access to controllers only—queries trap for non-admin callers
  • Integrates seamlessly via `include MixinViews()` in your actor with no additional setup required
  • Includes lintoko rule to enforce the mixin include and prevent accidental removal

How to install extension-data-viewer

npx skills add https://github.com/caffeinelabs/skills --skill extension-data-viewer
Prerequisites
  • Caffeine app with `caffeineai-data-viewer` mops package (pre-installed in templates)
  • Actor must include `include MixinViews();` in its body
  • Motoko backend using supported stable collection types
Claude Code
Cursor
Windsurf
Cline

How to use extension-data-viewer

  1. 1.Declare a stable variable using a supported type (Map, Set, Array, List, Stack, or Queue)
  2. 2.Ensure `include MixinViews();` is present in your actor body
  3. 3.The compiler automatically generates a `__<varname>` query for that variable
  4. 4.Call the generated query with optional cursor (?K or ?Nat) and count (?Nat) parameters from an admin/controller context
  5. 5.Use pagination by passing a cursor to fetch subsequent pages of results

Use cases

Good for
  • Browse all users or accounts stored in a stable Map during development and debugging
  • Inspect order history, logs, or event queues with pagination for large datasets
  • Create admin dashboards that display backend state without writing custom list endpoints
  • Debug data integrity issues by viewing the exact contents of stable collections
  • Monitor queue or stack contents in real-time during testing
Who it's for
  • Backend developers building Caffeine apps
  • Admin dashboard builders needing data inspection tools
  • Developers debugging stable state and data integrity issues

extension-data-viewer FAQ

Do I need to manually add the data viewer to my Caffeine app?

No. The `caffeineai-data-viewer` mops package and `--generate-view-queries` flag are pre-installed in every Caffeine app template. Just include `MixinViews()` in your actor.

Can non-admin users call the generated `__<var>` queries?

No. All generated queries trap if called by a non-controller caller. They are admin-only by design and should never be used as public endpoints.

What data types are supported by the viewer?

Map.Map, Set.Set, arrays ([V] and [var V]), List.List, Stack.Stack, and Queue.Queue. Pure (immutable) collections are not supported.

What happens if I remove `include MixinViews();` from my actor?

The lintoko rule `include-mixin-views` will error, and all auto-generated viewer queries will be disabled. Keep the include in place.

How do I paginate through large datasets?

Pass a cursor (the last key or index from the previous result) and a count parameter to the generated query. A null cursor starts at the beginning; null count returns everything from the cursor.

Full instructions (SKILL.md)

Source of truth, from caffeinelabs/skills.


name: extension-data-viewer description: Admin-only paginated viewer for stable canister state. Use whenever the user asks for a viewer, dashboard, debug panel, or admin browse over backend data — users, items, orders, logs, or any stable Map/Set/Array/VarArray/List/Stack/Queue. Pre-installed in every Caffeine app via the caffeineai-data-viewer mops package; this skill explains what it does and how to keep using it correctly. version: 0.1.0 compatibility: mops: caffeineai-data-viewer: "~0.1.0" caffeineai-subscription: [none]

Data Viewer

Admin-only data inspection extension for Caffeine AI.

Overview

Every Caffeine app ships with the caffeineai-data-viewer mops package and the moc --generate-view-queries flag enabled. Together with include MixinViews() in the actor, the compiler auto-exposes a controller-only __<var> query for every stable variable of a supported type:

  • Map.Map<K, V>(?K, ?Nat) -> [(K, V)]
  • Set.Set<K>(?K, ?Nat) -> [K]
  • [V], [var V], List.List<V>, Stack.Stack<V>, Queue.Queue<V>(?Nat, ?Nat) -> [V]

A null cursor starts at the beginning; a null count returns everything from the cursor. Each generated query traps on any non-controller caller — they exist for admin dashboards and debug viewers, not user-facing endpoints.

Backend

The package and include are already wired into the template. You don't need to add or edit anything for the viewer to work — declare a stable variable of a supported type and the __<var> query appears automatically.

import Map "mo:core/Map";
import Principal "mo:core/Principal";
import MixinViews "mo:caffeineai-data-viewer/MixinViews";

actor {
  include MixinViews();

  let users = Map.empty<Principal, Text>();

  // Generated automatically: __users : (ko : ?Principal, count : ?Nat) -> [(Principal, Text)] query
};

Lintoko rule include-mixin-views (shipped with the package) errors if the actor body is missing include MixinViews();. Keep the include — removing it disables every auto-generated viewer.

Rules

  • NEVER use the generated __<var> queries as a substitute for user-facing endpoints — they trap for any non-controller caller. Public list/feed/search methods still need to be written normally with public query func listX(...).
  • NEVER declare an actor member whose name starts with __ — it either collides with an auto-generated query or hits a reserved prefix.
  • Pure (immutable) collections (pure/Map, pure/Set, pure/List, pure/Queue) are not supported. The viewer is mutable-only by design; pure collection field access is a deprecated pattern in Caffeine projects anyway.