Since v0.2.0 scribetronic ships its skills via a Claude Code plugin marketplace. The CLI handles project scaffolding (calendar, ideas, publish-config, settings); skills, hooks, and agents are loaded by Claude Code at runtime from a separate repo: r-bart/scribetronic-plugin.
This document explains the architecture, what gets written where, and how to migrate from v0.1.x.
Plugins give scribetronic three things the bundled-skills approach can't:
- Auto-update. Bump the plugin repo's
plugin.json:versionand every install picks it up the next time Claude Code starts. Noinitre-run. - Namespacing. Skills load as
/scribetronic:write,/scribetronic:agenda, etc. Avoids collisions with other tools or your own/write. - Workflow hooks. SessionStart and Stop hooks ship with the plugin and run automatically — no per-project configuration.
The CLI still owns everything that has to live in your project (calendar templates, publish config, drafts) — those can't be served from a remote plugin.
npx scribetronic init .
│
▼
.claude/settings.json
┌────────────────────────────────────────────┐
│ extraKnownMarketplaces: { │
│ "scribetronic": { │
│ source: { source: "github", │
│ repo: "r-bart/ │
│ scribetronic-plugin"} │
│ } │
│ } │
│ enabledPlugins: { │
│ "scribetronic@scribetronic": true │
│ } │
└────────────────────────────────────────────┘
│
▼
Claude Code at startup:
1. Reads .claude/settings.json
2. Clones r-bart/scribetronic-plugin (cached)
3. Reads marketplace.json → finds plugin "scribetronic"
4. Reads plugin.json → checks version
5. Loads skills/ + hooks/
6. Skills available as /scribetronic:write, /scribetronic:agenda, ...
your-project/
├── .claude/
│ └── settings.json # marketplace registration
└── scribetronic/
├── README.md
├── publish-config.yaml # renamed from .example.yaml
├── calendar/
│ ├── README.md
│ ├── index.md
│ ├── rules.yaml # renamed from .example.yaml
│ ├── history.md
│ └── archive/.gitkeep
└── ideas/
├── README.md
└── <14 type files>.md
No SKILL.md files in your project — those live in the marketplace repo and load at runtime.
In the plugin marketplace (r-bart/scribetronic-plugin)
.claude-plugin/marketplace.json # marketplace descriptor
plugins/scribetronic/
├── .claude-plugin/plugin.json # plugin metadata + version
├── skills/ # 23 SKILL.md files
└── hooks/hooks.json # SessionStart + Stop hooks
The plugin marketplace ships a neutral writing-style/SKILL.md template. Your personalized voice lives in your project at scribetronic/style/writing-style.md. Voice-consuming skills resolve in this order:
scribetronic/style/writing-style.md(project root) — if present, this wins.writing-style/SKILL.md(bundled with the plugin) — fallback baseline.
To create the override:
scribetronic style # copies the template, then opens in $EDITOR
scribetronic style --reset # overwrite (asks for confirmation)Or generate from samples:
/scribetronic:style-extract # interview-driven, reads 3-5 reference + 1-2 own samples
To refine after publishing:
/scribetronic:style-refine # proposes deltas from your real (draft → published) edit history
This is the only file that requires personalization. Every other skill is format-only and works the same for everyone.
Two hooks ship with the plugin and run automatically. Both stay silent in non-scribetronic projects, so the plugin is safe to enable globally.
| Hook | Trigger | What it does |
|---|---|---|
SessionStart |
Claude Code session opens | If scribetronic/calendar/<ISO-week>/plan.md exists, prints today's resolved slot in 1–2 lines. Suggests /scribetronic:agenda plan-week if the week is missing. |
Stop |
Claude Code session ends | If drafts under scribetronic/calendar/*/drafts/ were touched in this session, reminds about /editing-pass + /ai-slop-check before marking status: ready. |
Both use the Haiku model (cheap, fast) and exit silently when irrelevant.
| Command | Purpose |
|---|---|
scribetronic init [path] |
Scaffolds project templates and registers the marketplace in .claude/settings.json. |
scribetronic update [path] |
Re-applies the marketplace registration. Use after a fresh git clone of a scribetronic project, after upgrading the CLI globally, or if settings.json drifted. |
scribetronic doctor [path] |
Verifies the install end-to-end. Checks: scribetronic/ exists, calendar/ exists, publish-config.yaml is present, plugin is enabled in settings, marketplace points at the canonical repo, scribetronic/style/writing-style.md (the user's voice override) is seeded. Exits 1 on failure. |
scribetronic uninstall [path] |
Disables the plugin and removes the marketplace entry. Leaves scribetronic/ content (drafts, calendar, history) intact — those are yours. |
If you only want the skills and don't need scribetronic's calendar templates, install the plugin directly inside Claude Code:
/plugin marketplace add r-bart/scribetronic-plugin
/plugin install scribetronic@scribetronic
This is what the CLI does for you under the hood. Without the CLI, you won't get scribetronic/calendar/, publish-config.yaml, or the editorial scaffolding — but every skill (/scribetronic:writing-style, /scribetronic:editing-pass, /scribetronic:ai-slop-check, etc.) will still work standalone.
# 1. Update the CLI
npm install -g scribetronic@latest
# 2. Register the marketplace in your existing project
cd your-writing-project
npx scribetronic update
# 3. Remove the old bundled skill copies (they're now duplicated by the marketplace)
rm -rf .claude/skills/agenda .claude/skills/write .claude/skills/write-publish \
.claude/skills/long-form-* .claude/skills/short-form-* \
.claude/skills/writing-style .claude/skills/editing-pass \
.claude/skills/ai-slop-check .claude/skills/style-extract \
.claude/skills/style-refine
# 4. Restart Claude Code
# Skills now load as /scribetronic:write, /scribetronic:agenda, etc.
# 5. Verify
npx scribetronic doctorYour scribetronic/ directory (drafts, calendar, history, publish-config) is untouched throughout.
The plugin repo's plugin.json:version tracks the CLI's package.json:version lockstep. Both repos get the same vX.Y.Z tag at release time. If they ever drift, scribetronic doctor will not detect it (only Claude Code's /plugin update scribetronic shows the installed plugin version) — open an issue if you spot a mismatch.
Claude Code caches the marketplace clone under ~/.claude/plugins/cache/. To force a refresh:
/plugin marketplace update scribetronic
/plugin update scribetronic
This pulls the latest commit on the plugin repo's default branch.