Explanation: pack structure — one plugin per skill
Explanation: pack structure — one plugin per skill
Section titled “Explanation: pack structure — one plugin per skill”The convention
Section titled “The convention”Every optional capability ships as a plugin, and each plugin contains exactly one skill. Plugins are grouped into pack families by directory, but the plugin boundary is the individual skill:
packs/├── reports/ # family: deliverable genres (container, NOT a plugin)│ ├── exec-summary/ # a plugin│ │ ├── .claude-plugin/plugin.json│ │ └── skills/exec-summary/SKILL.md│ ├── academic/ # a plugin│ ├── engineering/│ ├── trend-analysis/│ └── briefing/├── market-research/ # family: methodology│ ├── competitive-analysis/ # a plugin│ ├── customer-research/│ ├── financial-analysis/│ ├── market-sizing/│ └── regulatory-review/├── channels/ # family: render adapters│ ├── notebooklm/│ ├── pdf/│ ├── github-discuss/│ └── github-issues/└── trend-modeling/ └── trend-modeling/Each packs/<family>/<skill>/ is a self-contained Claude Code plugin: its
.claude-plugin/plugin.json (validated against schemas/pack.schema.json) plus
a flat skills/<skill>/SKILL.md and that skill’s evals/.
The point is selective adoption. A clone that wants the executive-summary
genre but not the academic one enables exec-summary and leaves academic
disabled — it is never forced to adopt a whole pack to get one skill. New
capabilities are added the same way: drop a new packs/<family>/<skill>/ plugin,
register it in .claude-plugin/marketplace.json, and toggle it in
harness.config.json packs[]. Nothing else changes.
This applies to all families uniformly — market-research, channels, and
trend-modeling follow the same one-plugin-per-skill shape as reports, so the
extension surface is consistent everywhere.
The control plane
Section titled “The control plane”harness.config.json packs[] lists each plugin by its (bare) name with an
enabled flag and a source (bundled, or an external git/marketplace plugin).
scripts/sync-packs.sh resolves each enabled plugin’s directory from the
marketplace source path and materializes the set into Claude Code’s native
enabledPlugins in the instance-local .claude/settings.local.json
(<skill>@research-harness; gitignored, deep-merged with the template-managed
.claude/settings.json). scripts/pack-toggle.sh <skill> on|off flips one plugin.
By default the five reports genres are enabled; every other plugin is
disabled and opt-in.