Skip to content
Back to skills

Admin Debug Context

ASecurity

Admin debug system wiring for the floating AdminIndicator's live debug data and Copy Full Context. Use when adding debug visibility to a route or feature, wiring useDebugContext or the debug panel, capturing console errors, or enabling the copy-context workflow for a page.

  • 3 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 3, 2026
developmentreactapibackendperformance

Works with

  • cli
  • api

Security analysis

A100/100

Scanned October 3, 2026

npx -y skills add armanisadeghi/ai-matrx --skill admin-debug-context --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Admin Debug Context?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Admin Debug Context
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/armanisadeghi-admin-debug-context/badge)](https://www.skillsdirectory.com/skills/armanisadeghi-admin-debug-context)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: admin-debug-context
description: "Admin debug system wiring for the floating AdminIndicator's live debug data and Copy Full Context. Use when adding debug visibility to a route or feature, wiring useDebugContext or the debug panel, capturing console errors, or enabling the copy-context workflow for a page."
---

# Admin Debug Context

## Performance guarantee

The entire debug system is **zero cost for non-admins**:
- `AdminIndicatorWrapper` checks `selectIsAdmin` from Redux and returns `null` immediately if false
- Both `AdminIndicatorIsland` (ssr layout) and `DynamicAdminIndicatorWrapper` (authenticated layout) use `dynamic(..., { ssr: false })` — the admin bundle never downloads for non-admins
- `useDebugContext` is a no-op when `isAdmin` is false — no dispatch, no effect, no render cost

---

## Architecture — four layers

```
Layout (server)
  └── AdminIndicatorWrapper (client, admin-only)
        ├── AdminDebugContextCollector   ← auto: pathname, searchParams, viewport,
        │                                        console errors, unhandledrejection
        └── AdminIndicator (Small/Medium/Large)
              ├── MediumIndicator
              │     └── debugModules icons → DebugModulePanel modal
              └── LargeIndicator
                    ├── API config + health grid
                    ├── Recent API calls log
                    ├── [Copy Full Context] button ← assembles everything for AI agent
                    ├── Console Errors panel        ← captured automatically
                    └── Debug Data (JSON)           ← written via useDebugContext
```

---

## What is auto-captured (no route work needed)

`AdminDebugContextCollector` runs at layout level inside `AdminIndicatorWrapper`. For every admin session it automatically captures:

| Data | How |
|---|---|
| Current pathname | `usePathname()` on every navigation |
| Search params | `useSearchParams()` on every navigation |
| Browser viewport | `window.innerWidth/Height` |
| User agent | `navigator.userAgent` |
| Navigation count | increments on each pathname change |
| `console.error` calls | patches `console.error` while mounted |
| `unhandledrejection` events | `window.addEventListener` |
| `window.error` events | `window.addEventListener` |

This is available instantly in the "Copy Full Context" snapshot even for routes that add zero custom debug code.

---

## Adding route/feature debug data

### The hook — use this everywhere

```tsx
import { useDebugContext } from '@/hooks/useDebugContext';

export default function MyComponent({ sessionId }: { sessionId: string }) {
    const session = useAppSelector(s => selectSession(s, sessionId));
    const { publish, isActive } = useDebugContext('Chat');  // namespace

    useEffect(() => {
        publish({
            'Session ID': sessionId,
            'Status': session?.status,
            'Message Count': session?.messages.length,
            'Conversation ID': session?.conversationId,
        });
    }, [isActive, session?.status, session?.messages.length, sessionId]);
}
```

**Key rules:**
- First arg is the **namespace** — appears as group header in the debug panel
- Keys are auto-prefixed: `"Chat:Session ID"`, `"Chat:Status"`, etc.
- `isActive` is `true` only when `isAdmin && isDebugMode` — use it in `useEffect` deps to gate expensive collection
- The hook **auto-clears all namespace keys on unmount** — no manual cleanup needed
- Safe in any component tree — pure no-op for non-admins

### Hook API

```ts
const { publish, publishKey, isActive } = useDebugContext('Namespace');

publish({ 'Key': value, 'Other Key': otherValue });  // merge namespaced data
publishKey('Key', value);                             // set single key
isActive  // boolean — true only when admin AND debug mode is on
```

---

## Adding a debug module panel

For richer feature-specific UIs (not just JSON data), create a debug module:

### Step 1 — Create the component

```tsx
// components/admin/debug/MyFeatureDebug.tsx
'use client';
import { useAppSelector } from '@/lib/redux/hooks';

export default function MyFeatureDebug() {
    // Read exclusively from Redux selectors — no local fetch, no useState for data
    const data = useAppSelector(selectSomething);
    return <div className="p-4 text-xs font-mono">{JSON.stringify(data, null, 2)}</div>;
}
```

### Step 2 — Register in the registry

```tsx
// components/admin/debug/debugModuleRegistry.tsx
import MyFeatureDebug from './MyFeatureDebug';
import { Zap } from 'lucide-react';

export const debugModules: DebugModule[] = [
    // ... existing modules ...
    {
        id: 'my-feature',
        name: 'My Feature',
        icon: Zap,
        component: MyFeatureDebug,
        description: 'Live state of my feature',
        color: 'text-purple-400',
    },
];
```

The icon appears in the MediumIndicator debug row. Clicking opens the panel modal. Component only mounts when the panel is open — zero overhead when closed.

---

## Copy Full Context — the AI agent workflow

The **Copy** button in LargeIndicator assembles a complete markdown snapshot:

```markdown
# Admin Debug Context Snapshot
Generated: 2026-03-27T10:42:00.000Z
Admin: admin@example.com

## Route
- **Path:** /demos/chat/c/abc-123
- **Viewport:** 1440×900
- **Render Count:** 3

## API Config
- **Active Server:** localhost
- **Backend URL:** http://localhost:8000
- **Health:** healthy (42ms)

## Feature Debug Data
### Chat
- **Session ID:** sess-xyz
- **Status:** streaming
- **Message Count:** 7

## Recent API Calls
| Status | Method | Path | HTTP | Duration |
...

## Console Errors
No errors captured.
```

**Workflow:** Admin sees a bug → opens LargeIndicator → clicks Copy → pastes into AI agent chat. Agent gets full context: what page, what state, what the API is doing, any errors.

---

## Data sources reference

| What | Selector | Slice |
|---|---|---|
| Is admin | `selectIsAdmin` | `userSlice` |
| Debug mode on | `selectIsDebugMode` | `adminDebugSlice` |
| Route context | `selectRouteContext` | `adminDebugSlice` |
| Console errors | `selectConsoleErrors` | `adminDebugSlice` |
| Debug data (JSON) | `selectDebugData` | `adminDebugSlice` |
| Active server | `selectActiveServer` | `apiConfigSlice` |
| Backend URL | `selectResolvedBaseUrl` | `apiConfigSlice` |
| Server health | `selectActiveServerHealth` | `apiConfigSlice` |
| Recent API calls | `selectRecentApiCalls` | `apiConfigSlice` |
| Active chat session | `selectActiveChatSessionId` | `activeChatSlice` |
| Chat session object | `selectSession(state, sessionId)` | `chatConversations` |
| Chat messages | `selectMessages(state, sessionId)` | `chatConversations` |

---

## Viewing debug context

1. **Small indicator** — two colored dots (server env, health)
2. **Medium indicator** — debug icon row; click any icon for that feature's panel
3. **Large indicator** — full admin dashboard:
   - **Copy** button (always visible) — one click to copy everything for an AI agent
   - **Console Errors** panel — auto-captured, collapsible, shows stack traces
   - **Debug Data** section (debug mode on) — namespaced JSON from `useDebugContext`
   - **API calls log** and **all environments health grid**

Enable debug mode: click the **Debug** toggle in MediumIndicator or LargeIndicator.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…