SLOPSHOPPER

notes-pane

Example: /note saves to $.store, /notes opens a pane with a Clear button

newpanecommand
A shopper browsing a rack in a slop shop
Preview · a replayed session in a sandbox
claude · ~/work/app · notes-pane
│ ┃ Notes ✕ › fix the failing auth test and add an audit log call │ ┃ No notes. Add one with /note. │ ┃ [ Clear ] ⏺ Read(src/auth.ts) │ ⎿ Read 6 lines │ ⏺ Update(src/auth.ts) │ ⎿ Added 2 lines, removed 1 line │ ⏺ Bash(bun test) │ ⎿ 3 pass, 1 fail │ │ ● Done. refresh now rejects expired claims and logs an audit event. │ │ ✻ Worked for 42s · done 4:20 PM │ │ › /note │ ⎿ notes-pane: Usage: /note <text> │ │ ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › ? for shortcuts

Draws

Pane · Notes
No notes. Add one with /note. [ Clear ]
README

mods-expert-developer-plugin

<!--BADGES-START--> Version License <!--BADGES-END-->

A Claude Code plugin that bundles two agents (an expert agent that plans and evaluates, and a forge agent that builds), a skills menu, 60 Claude Code documentation chapters plus one how-to (mods, plugins, hooks, skills, subagents, marketplaces, settings), and three reference-only mod tutorials with example code. Use it to create, fix, improve and evaluate Claude Code mods and plugins.

Components

Agents:

  • mods-expert-developer-plugin:mods-expert-developer-agent plans, evaluates and drives mod work: TRDD proposals, the PLAN, IMPLEMENT, VERIFY loop, delegation. It declares all 61 chapter skills in its frontmatter; Claude Code preloads the first 32.
  • mods-expert-developer-plugin:mods-forge-agent is the hands-on builder: it creates, edits, fixes and debugs mods (hooks modules, commands, panes), one planned TRDD increment or one concrete fix/debug request per dispatch, tests them on both the terminal and Desktop surfaces, and returns a report path. It never commits, publishes or deletes. It preloads only the skills menu and loads each chapter on demand. It is pinned to Opus 5.5 (model: claude-opus-5-5), so every dispatch is billed at Opus rates whatever model the calling session runs; on Bedrock or Vertex that model ID differs and the harness may fall back to the inherited model.

Skills menu: the mods-the-skills-menu skill (skills/mods-the-skills-menu/SKILL.md) is the forge agent's only preload. It names every chapter skill once with its namespaced name, grouped by domain, plus the three reference-only tutorials in a group of their own and the four user-scope tool skills; the full per-skill entries are in skills/mods-the-skills-menu/references/skills-catalog.md. It is a catalogue of the chapters, not a chapter, so it has no row in the table below.

Skills: plugin skills are namespaced mods-expert-developer-plugin:<skill> and are reference-only (user-invocable: false). Sixty wrap a documentation chapter; mods-doc-run-background-sessions wraps an original community how-to.

SkillSKILL.md heading
mods-doc-add-components-to-a-pluginADD COMPONENTS TO A PLUGIN
mods-doc-official-marketplacesANTHROPIC MARKETPLACES
mods-doc-automate-actions-with-hooksAUTOMATE ACTIONS WITH HOOKS
mods-doc-channels-referenceCHANNELS REFERENCE
mods-doc-cc-debug-modeCLAUDE CODE DEBUG MODE
mods-doc-cc-native-memory-and-rulesCLAUDE CODE NATIVE MEMORY AND RULES
mods-doc-cc-settings-referenceCLAUDE CODE SETTINGS REFERENCE
mods-doc-cc-github-actionsCLAUDE GITHUB ACTIONS
mods-doc-cc-permissions-modesCLAUDE PERMISSIONS MODES
mods-doc-cc-projects-directory-structureCLAUDE PROJECTS DIRECTORY STRUCTURE
mods-doc-cc-security-pluginCLAUDE SECURITY PLUGIN
mods-doc-code-intelligence-components-in-pluginsCODE INTELLIGENCE COMPONENTS IN PLUGINS
mods-doc-create-a-marketplaceCreate a marketplace
mods-doc-cross-session-messaging-referenceCROSS SESSION MESSAGING REFERENCE
mods-doc-deep-links-referenceDEEP LINKS REFERENCE
mods-doc-dynamic-workflows-referenceDYNAMIC WORKFLOWS REFERENCE
mods-doc-headless-mode-referenceHEADLESS MODE REFERENCE
mods-doc-hooks-referenceHOOKS REFERENCE
mods-doc-how-to-host-a-marketplaceHOW TO HOST A MARKETPLACE
mods-doc-large-monorepo-plugin-developmentHOW TO USE A LARGE MONOREPO WITH CLAUDE (Usually the case when developing Plugins)
mods-doc-install-and-manage-pluginsINSTALL AND MANAGE PLUGINS
mods-doc-loop-and-chron-referenceLOOP AND CHRON REFERENCE
mods-doc-manage-costs-of-a-pluginMANAGE COSTS OF A PLUGIN
mods-doc-manage-mods-for-organizationsMANAGE MODS FOR ORGANIZATIONS
mods-doc-manage-plugins-from-cliMANAGE PLUGINS FROM CLI
mods-doc-manage-plugins-in-organizationsMANAGE PLUGINS IN ORGANIZATIONS
mods-doc-marketplace-manifest-referenceMARKETPLACE MANIFEST REFERENCE
mods-doc-mcp-servers-referenceMCP SERVERS REFERENCE
mods-doc-models-configurationMODELS CONFIGURATION
mods-doc-mods-and-eventsMODS AND EVENTS
mods-doc-mods-apiMODS API
mods-doc-mods-basic-examplesMODS BASIC EXAMPLES
mods-doc-mods-developmentMods Development
mods-doc-mods-interfacesMODS INTERFACES
mods-doc-mods-overviewMODS OVERVIEW
mods-doc-mods-referenceMODS REFERENCE
mods-doc-mods-testingMODS TESTING
mods-doc-mods-troubleshootingMODS TROUBLESHOOTING
mods-doc-native-toolset-referenceNATIVE TOOLS REFERENCE
mods-doc-output-style-referenceOUTPUT STYLE REFERENCE
mods-doc-platforms-overviewPLATFORMS OVERVIEW
mods-doc-plugin-commands-referencePLUGIN COMMANDS REFERENCE
mods-doc-plugin-manifest-referencePLUGIN MANIFEST REFERENCE
mods-doc-plugin-recomendationsPLUGIN RECOMENDATIONS
mods-doc-plugins-creationPLUGINS CREATION
mods-doc-plugins-depending-on-other-pluginsPLUGINS DEPENDING ON OTHER PLUGINS
mods-doc-plugins-security-and-trustPLUGINS SECURITY AND TRUST
mods-doc-prompt-caching-referencePROMPT CACHING REFERENCE
mods-doc-publish-a-pluginPUBLISH A PLUGIN
mods-doc-recomended-plugins-to-create-pluginsRECOMENDED PLUGINS TO CREATE PLUGINS
mods-doc-run-background-sessionsRUN BACKGROUND SESSIONS
mods-doc-sessions-referenceSESSIONS REFERENCE
mods-doc-settings-precedence-and-scopesSETTINGS PRECEDENCE AND SCOPES
mods-doc-skills-referenceSKILLS REFERENCE
mods-doc-status-line-customizationSTATUS LINE CUSTOMIZATION
mods-doc-subagents-referenceSUBAGENTS REFERENCE
mods-doc-test-plugins-with-evalsTEST PLUGINS WITH EVALS
mods-doc-tracing-the-origin-of-a-pluginTRACING THE ORIGIN OF A PLUGIN
mods-doc-troubleshooting-cc-setupTROUBLESHOOTING CLAUDE SETUP
mods-doc-troubleshooting-pluginsTROUBLESHOOTING PLUGINS
mods-doc-worktrees-referenceWORKTREES REFERENCE

Tutorials

Three tutorial skills are reference only: they hold worked examples for agents, and they do not replace the chapter skills, which stay authoritative and win on any disagreement, except that for API names and type shapes (event, method and argument names and their TypeScript types) the type files your running build generates win, because events and methods change across releases, while for behaviour the types cannot express (ordering, timing, what next does) the chapters still win. The copied examples (hello-mod, redact-output, dice-tool, branch-band, notes-pane) and the upstream tutorial text are adapted from BeLazy167/claude-mods-skill (MIT, see NOTICE). The turn-timer, git-poller and protect-files examples, the house conventions, the quickstart scripts and the text that describes them were written for this plugin. The example code under each tutorial's examples/ folder is for reading and copying into your own project; it is never installed or loaded as part of this plugin. The quickstart scripts are tools to run, not examples to read; the example code stays reference only.

  • mods-tutorial-quickstart: a step-by-step checklist for a first mod that names the chapter skill for each step, the traps the chapters do not settle (marked UNVERIFIED where they do not confirm them), an index of the example mods, the house conventions, and the check-mod.sh, new-mod.sh, keep-mod.sh and plan-diff.sh scripts.
  • mods-tutorial-call-intercept-mods: the hello-mod, redact-output, dice-tool and protect-files example mods, which block, rewrite and answer tool calls, add a tool, and guard paths.
  • mods-tutorial-interface-mods: the branch-band, notes-pane, turn-timer and git-poller example mods, which draw a band above the prompt, a pane opened by a command, a status line, and a band kept current by a git poller.

Prerequisites

The expert agent delegates to the user-scope agents fast-worker and cheap-worker, which are NOT bundled with this plugin. Node is required because mods are written in TypeScript and their tests run on Node; the quicksilver skill also uses it.

Both agents also use these user-scope skills. They are optional but recommended, they are NOT bundled with this plugin, and they are NOT preloaded (a preload of a skill this plugin does not ship is silently skipped by Claude Code): each agent loads them on demand when installed.

  • tldr-code: token-efficient reading of files, line ranges and symbols.
  • fastedit: verified, validated edits with backups.
  • jgrep: search for code by what it does, not by name.
  • quicksilver: bulk triage of many files, lines or items without reading them all.
  • safe-delete: recoverable deletion.

Without them the agents fall back to the native tools (Read, Edit and Write, Grep and Glob, plain reading, and a plain mv into a gitignored _dev folder instead of a deletion) and list the missing skills in their report. Every mods-forge-agent dispatch runs at Opus price.

Installation

Local install for development and testing:

claude --plugin-dir /absolute/path/to/mods-expert-developer-plugin

Marketplace install: once this plugin is published in a Claude Code marketplace you have added, install it with the plugin install command and the marketplace name of your choice:

claude plugin install mods-expert-developer-plugin@<marketplace-name>

Usage

Invoke the agent by its namespaced name, for example through the Agent tool or by asking Claude Code to use it:

mods-expert-developer-plugin:mods-expert-developer-agent

Give it a task such as creating a new mod, fixing a broken plugin hook, or reviewing a plugin manifest. The agent plans with TRDD proposals, loads only the chapter skills it needs, and verifies each step before moving on.

To execute one planned increment or one concrete fix or debug request, dispatch the forge agent instead:

mods-expert-developer-plugin:mods-forge-agent

Give it the TRDD card or the failure to fix. Commit a checkpoint before each dispatch: the forge agent never commits, and it returns only a status line and the path of its report under reports/mods-forge-agent/.

Validate

claude plugin validate .

Adding or reordering a skill

Five artifacts list the chapter skills, and the plugin's tests require specific relationships between them. A skill addition is not one edit:

  1. skills/<name>/SKILL.md — the wrapper, with its skills/<name>/references/chapter.md and skills/<name>/agents/openai.yaml.
  2. README.md — a row in the Components table above. The table must cover every skill exactly once, its heading column must match each SKILL.md's H1, and it is ordered by heading (case-insensitive) — deliberately NOT the same order as the frontmatter.
  3. agents/mods-expert-developer-agent.md — an entry in the skills: frontmatter AND a row in the "Chapter skill index" table, at the same position in the same order, so the two copies of the routing order agree. The body table must cover every skill exactly once, and its label column must match each SKILL.md's H1.
  4. PINNED_PRELOAD_SKILLS in tests/test_skills_menu.py — the set of skills occupying the first 32 frontmatter entries, which are the ones Claude Code preloads in full. It is mirrored as a set, not a list: reordering within the window does not change it, but adding a skill at position 30 or earlier pushes another skill out, and the set must be updated to match. Read the frontmatter's own diff too, since the set records the membership and not which member was displaced. The user-scope tool skills are deliberately NOT in the frontmatter, so they never occupy a window slot; tests/test_skills_menu.py asserts their absence.
  5. skills/mods-the-skills-menu/ — a row in the right domain table of its SKILL.md and a full entry in skills/mods-the-skills-menu/references/skills-catalog.md, both under the namespaced name mods-expert-developer-plugin:<name> and derived only from the new skill's own SKILL.md. The tests require each chapter skill exactly once in both files. A skill that catalogues the chapters instead of wrapping one goes into CATALOG_SKILLS, which both test files define and assert equal.
  6. A tutorial skill is reference-only and is not a chapter: its name contains tutorial, it skips steps 2 to 4, and it goes into TUTORIAL_SKILLS, which both test files define and assert equal. It needs a row in the "Tutorials (reference only)" group of the menu's SKILL.md, an entry in the "Tutorials (reference only)" section of the catalog, and a line in the Tutorials section above. Its first body paragraph is the reference-only notice, and its example code lives only under skills/<name>/examples/<example>/.

Then run the tests:

uv run --project . pytest -q tests/

License

The plugin's own files are licensed under MIT (see LICENSE). The reference chapters are Anthropic documentation and are not covered by MIT. The tutorial example mods are copied from BeLazy167/claude-mods-skill under its own MIT license. See NOTICE for both.

Source 2 files
hooks/register.tsx 56 lines
1import { atom, read, update } from 'claude-code'
2import type { Register } from 'claude-code'
3
4import type { Note } from '../types'
5
6const PANE = 'notes'
7// $.state holds what the pane draws this session. $.store keeps it across sessions.
8const notes = atom({ plugin: 'notes-pane', key: 'notes' } as const, [] as Note[])
9
10export const register: Register = (on) => {
11  on('session.start', async ($, e, next) => {
12    const saved = await $.store.get('notes')
13    await update($, notes, () => (Array.isArray(saved) ? saved.map(String) : []))
14    await $.command.register({ name: 'note', description: 'Save a note', argumentHint: '<text>' })
15    await $.command.register({ name: 'notes', description: 'Show saved notes in a pane' })
16    return next(e)
17  })
18
19  // A command hook answers alone. Its text is the transcript row the model also reads.
20  on('command.run', { command: 'note' }, async ($, e) => {
21    const text = e.args.trim()
22    if (text === '') return { text: 'Usage: /note <text>' }
23    const all = await update($, notes, (list) => [...list, text])
24    await $.store.set('notes', all)
25    return { text: `Saved note ${all.length}.` }
26  })
27
28  on('command.run', { command: 'notes' }, async ($) => {
29    await $.ui.open({ id: PANE, title: 'Notes' })
30    return { text: 'Notes pane opened.' }
31  })
32
33  on('ui.render', { component: 'Pane', requestId: PANE }, async ($, e) => {
34    const { Box, Button, Text } = $.ui.resolve(e)
35    const list = await read($, notes)
36    return (
37      <Box flexDirection="column">
38        {list.length === 0 && <Text dimColor>No notes. Add one with /note.</Text>}
39        {list.map((note, i) => (
40          <Text>
41            {i + 1}. {note}
42          </Text>
43        ))}
44        <Button
45          key="clear"
46          label="Clear"
47          onPress={async () => {
48            await update($, notes, () => [])
49            await $.store.delete('notes')
50          }}
51        />
52      </Box>
53    )
54  })
55}
56
types/index.d.ts 8 lines
1export type Note = string
2
3declare module 'claude-code' {
4  interface PluginState {
5    'notes-pane': { notes: Note[] }
6  }
7}
8