Packager
Stage a product for distribution with triple manifests (MyClaude + Anthropic Plugin + Agent Skills universal).
When to use: After /validate passes. Before /publish.
When NOT to use: If the product hasn't been validated yet (run /validate first).
Activation Protocol
- Shared preamble: Load
references/quality/activation-preamble.md— context assembly, persona adaptation, deterministic routing rules. - Identify product:
$ARGUMENTSas slug →workspace/{slug}/1b. Mode selection (Express vs Guided). Readcreator.yaml → preferences.workflow_style. Resolve the flow mode:--expressflag ORworkflow_style == "autonomous"→ Express mode. Skip the "confirm before stage" prompt, skip the manifest preview step, and produce a single post-stage summary. The safety invariants below still hold — only the conversational confirmations are trimmed.workflow_style == "guided"or missing → Guided mode (default). Confirm before staging, show manifest preview, and walk the creator through the pipeline with full voice.
- Read
.meta.yaml→ verify state is "validated" and MCS score >= 75% - Read
creator.yaml→ load author metadata for manifests. If missing → "Creator profile not found. Run/onboardfirst." and stop. - Maintain creator persona: Adapt language, depth, and examples to
profile.typeandtechnical_levelthroughout this skill's execution. A developer gets code examples; a domain expert gets plain language. - Load
product-dna/{type}.yaml→ get install_target - Load
config.yaml→ vault_defaults for missing fields 6b. Load proactives: Loadreferences/engine-proactive.md— wire #1 (pipeline guidance: after package, guide to /publish), #20 (test mandate: if MCS-2+ and.meta.yaml.test_result != "pass", block packaging with message "Run /test first"). - Load voice identity: Load
references/quality/engine-voice-core.md. Every user-facing line in this skill honors the ✦ signature, three tones, and six anti-patterns. - CLI contract: Load
references/cli-contract.mdfor unified error handling. This skill has conditional severity based on pricing model. Severity map:- Blocking (paid products only):
stripe status— if product price > 0 and Stripe not connected, halt packaging - Silent-skip (free products):
stripe status— irrelevant for free products, skip without warning - Silent-skip:
search --category {type} --sort price-desc— competitive pricing scan, skip without warning on failure - All queries: append
2>/dev/null, 15s timeout, treat invalid JSON as CLI absent
- Blocking (paid products only):
Core Instructions
PACKAGING PIPELINE
SAFETY INVARIANTS — see end of file (positioned per D19 attention-aware authoring for maximum model compliance).
Step 1 — Verify Validation
Read .meta.yaml for validation state:
- If state != "validated" AND state != "packaged": "Product not validated. Run /validate first."
- If MCS score < 75%: "Product below MCS-1 threshold. Run /validate --fix."
- If mcs_target is "MCS-2" or "MCS-3" AND (test_result is null OR test_result != "pass"): "MCS-2+ products require behavioral testing before packaging. Run /test first." — BLOCKING. This gate ensures structural validation (/validate) AND behavioral validation (/test) both pass before distribution.
Step 1.5 — Package Rename (if applicable)
Check product-dna/{type}.yaml for package_rename field. If present, rename the
primary file to the specified pattern during copy to .publish/.
Currently applies to:
- minds:
AGENT.md→{slug}.md(flat file convention for.claude/agents/)
This rename ensures the installed filename matches Claude Code's native discovery pattern.
Step 2 — Strip WHY Comments + Inject Attribution (SE-D17)
Create a clean copy of all product files.
REMOVE:
<!-- WHY: ... -->(HTML comment blocks — may span multiple lines)- Lines matching
# WHY:pattern (markdown comment format) # WHY:pattern in shell scripts (.shfiles)- JSON keys prefixed with
_(e.g.,_comment,_why,_events_reference) from.jsonfiles. These are documentation keys used in workspace but must not pollute the user's settings.json when hooks are installed. Strip by parsing JSON, removing_-prefixed top-level keys, and re-serializing.
INJECT TWO THINGS into the .publish/ copy of the primary file (SKILL.md, AGENT.md, etc.):
1. Marketplace URL in frontmatter (PRD D3 — viral vector #1):
Add a marketplace_url field to the YAML frontmatter of the primary file. This field is read by Claude Code in EVERY session where the product is installed — making every buyer a passive distribution carrier.
---
name: {slug}
description: >
{original description — DO NOT MODIFY}
marketplace_url: "https://myclaude.sh/p/{slug}"
---
Rules:
- Add
marketplace_urlas a NEW field — never modify the existingdescription - Only add to the
.publish/copy — never touch the original in workspace/ - Use the slug from vault.yaml
2. Attribution comment at end of file:
<!-- Published on MyClaude (myclaude.sh) | Quality: MCS-{level} ({score}%) | Engine: Studio v3 -->
This attribution comment is:
- Invisible to Claude (HTML comment, does not affect behavior)
- Visible in source code (GitHub renders it in raw view)
- Indexable by search engines (creates discoverable MyClaude references)
- A quality signal (MCS score travels with the product)
Never modify originals — work on the copy in .publish/.
Step 2c — Inject README Badges (PRD B2 — viral vectors #2)
Append MCS and Available badges to the end of .publish/README.md:
---
[](https://myclaude.sh/quality)
[](https://myclaude.sh/p/{slug})
<sub>Built with MyClaude Studio Engine</sub>
Precondition: Verify .publish/README.md exists before injection. If missing (bundle type has no README requirement), skip badge injection silently — do not create a README just for badges.
README quality gate: Before badge injection, verify README follows templates/readme/README.md.template structure — at minimum: Hero, Install (with myclaude install {slug}), Quick Start, Features (3+), Requirements. If missing critical sections, WARN: "README is missing sections that help users decide to install. Consider running /fill to complete it." Continue packaging — this is advisory, not blocking.
Rules:
- Inject ONLY in
.publish/README.md— never modify the original - MCS level from
.meta.yamlstate.dna_complianceoroverall_score. Default to 1 if not validated - Slug from vault.yaml
namefield - Add a blank line before the
---separator to avoid markdown parsing issues
Step 2b — Verify WHY Removal
Grep all files in .publish/ for the pattern WHY:. If match count > 0, re-run stripping on the matched files. If still > 0 after second pass, report error with file paths and line numbers — do not proceed to manifest generation with unstripped WHY comments.
Step 2d — Post-Strip Integrity Check
After WHY removal, verify the stripped files are still structurally valid:
- For
.mdfiles: verify YAML frontmatter still parses (regex for^---\n...\n---\n) - For
.jsonfiles (hooks.json, settings-fragment.json): parse with JSON validator after_-prefixed key removal. If parse fails → abort with file path and error. Never ship invalid JSON. - For
.shfiles: verify shebang line survived stripping (first line must start with#!) - If any check fails: report the specific file + line + issue. Do NOT proceed to manifest generation.
Step 3 — Generate vault.yaml
Read .meta.yaml → intent_declaration.language (written by /create Step 11). This is
the canonical source of truth for the product's source language — it captures what
language the product was forged in, not what language the cre