---
id: gh-extension-data-viewer
name: "extension-data-viewer"
url: https://skills.yangsir.net/skill/gh-extension-data-viewer
author: caffeinelabs
domain: ai-system-observability-sre
tags: ["data-viewer", "debugging", "observability", "backend-data", "admin-tool"]
install_count: 9900
rating: 4.50 (120 reviews)
github: https://github.com/caffeinelabs/skills/tree/main/skills/extension-data-viewer
---

# extension-data-viewer

> 此技能为AI应用提供管理员专用的分页数据查看器，自动为后端稳定状态变量生成查询接口。它能帮助开发者快速浏览、调试用户、订单、日志等数据，极大提升问题诊断和管理效率，无需手动编写复杂的查询代码。

**Stats**: 9,900 installs · 4.5/5 (120 reviews)

## Before / After 对比

### 快速数据调试与管理

**Before**:

在没有这个技能之前，开发者需要手动为每个需要查看的后端数据结构编写定制化的查询接口，或者依赖复杂的数据库工具进行数据检查，这耗时且容易出错，严重拖慢了开发和问题诊断的进度。

**After**:

此技能自动为后端稳定变量生成安全的、分页的查询接口，开发者可以立即通过管理员界面查看和调试数据，极大地简化了数据管理流程，显著提升了问题排查效率。

| Metric | Before | After | Change |
|---|---|---|---|
| 数据查看接口开发时间 | 240分钟 | 5分钟 | -97% |

## Readme

# Data Viewer

Admin-only data inspection extension for [Caffeine AI](https://caffeine.ai?utm_source=caffeine-skill&utm_medium=referral).

## 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.

```motoko filepath=src/backend/main.mo
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.


---
*Source: https://skills.yangsir.net/skill/gh-extension-data-viewer*
*Markdown mirror: https://skills.yangsir.net/api/skill/gh-extension-data-viewer/markdown*