Releases: jdutton/vibe-agent-toolkit
Releases · jdutton/vibe-agent-toolkit
Release v0.1.32
Added
- Evidence substrate (
@vibe-agent-toolkit/agent-skills/evidence). Parsers produce neutralEvidenceRecords with stable pattern IDs fromPATTERN_REGISTRY; a derivation step rolls evidence into capabilityObservations; a verdict engine compares observations against declared targets. Designed so pattern refinement never changes the observation contract. vat audit --verboserenders the evidence chain beneath eachCAPABILITY_*observation — pattern ID, file, line, match text — and includes anevidence[]array in YAML output. Use it to debug false positives or confirm what a detector actually saw.- Runtime profile table (
RUNTIME_PROFILESin@vibe-agent-toolkit/claude-marketplace) is the single source of truth for what each Claude runtime provides and lacks (local shell, browser, network level, preinstalled binaries). - Verdict engine (
computeVerdicts) combines capability observations with declared targets to produceCOMPAT_TARGET_*issues. Four states: expected (silent),COMPAT_TARGET_INCOMPATIBLE(warning),COMPAT_TARGET_NEEDS_REVIEW(warning),COMPAT_TARGET_UNDECLARED(info). - Config-level
targetsdeclaration invibe-agent-toolkit.config.yamlunderskills.defaults.targetsandskills.config.<name>.targets. Declaring targets suppresses non-applicable compat verdicts. - Marketplace-level
defaults.targetsin.claude-plugin/marketplace.json. Layer priority (highest to lowest):plugin.json→marketplace.json→vibe-agent-toolkit.config.yaml. - Post-build validation:
vat skills buildruns the full validation suite against builtdist/skills/*/SKILL.md(skipping source-only codes likeLINK_OUTSIDE_PROJECT). Build failures surface identically to source failures. infoseverity in the validation framework.CAPABILITY_*andCOMPAT_TARGET_UNDECLAREDemit as info; they appear in output and respectvalidation.severityoverrides but do not contribute to build failure status.- New validation codes:
CAPABILITY_LOCAL_SHELL,CAPABILITY_EXTERNAL_CLI,CAPABILITY_BROWSER_AUTH(info);COMPAT_TARGET_INCOMPATIBLE,COMPAT_TARGET_NEEDS_REVIEW(warning);COMPAT_TARGET_UNDECLARED(info). - Skill-smell philosophy doc at
docs/skill-smell-philosophy.mdarticulating rule-addition bar, default severity posture, graduation path, and data-driven evolution. Referenced fromdocs/validation-codes.md. - Cached Anthropic skill-authoring best-practices doc at
docs/external/anthropic-skill-authoring-best-practices.mdwith attribution, source URL, and fetch date. Provides a diffable reference so VAT's tooling stays aligned with upstream Anthropic guidance. CLAUDE.md documents the periodic-refresh policy. vat-skill-review.md(formerlyskill-quality-checklist.md) rewritten with[A]/[VAT]tags distinguishing Anthropic-aligned items from VAT-opinionated additions. Added gerund-form naming guidance (Anthropic's preferred pattern), frontmatter-key conservatism, cross-skill dependency disclosure, in-package YAML-styling consistency, and large-tables-to-reference-files guidance — all from dogfood findings across 17 real skills (8 avonrisk-sdlc + 1 vibe-validate + 8 VAT dev-agents).- Five new skill-quality validation codes, all non-blocking:
SKILL_DESCRIPTION_OVER_CLAUDE_CODE_LIMIT(warning): description > 250 chars — Claude Code's/skillslisting truncation limit since v2.1.86.SKILL_DESCRIPTION_FILLER_OPENER(warning): description opens withThis skill...,A skill that...,Used to...,Use when you want to..., orUse when you need to....SKILL_DESCRIPTION_WRONG_PERSON(warning): description uses first- or second-person voice (Anthropic: "Always write in third person").SKILL_NAME_MISMATCHES_DIR(warning): frontmatternamediffers from the parent directory name.SKILL_TIME_SENSITIVE_CONTENT(info): body containsas of <month> <year>,after <month> <year>, etc. — will go stale.
vat auditandvat skills validatenow print a checklist-discovery footer when skill-level findings are present, pointing at thevat-skill-reviewskill for rationale and judgment-call items.vat skill review <path>command: deep-review a single skill. CombinesvalidateSkillForPackagingoutput, config-aware compat verdicts (when inside a VAT project), and a manual-checklist walkthrough into one report. Groups automated findings by checklist section (Naming / Description / Body structure / References / Frontmatter hygiene / Compatibility). Supports--yamlfor machine-readable output. Designed as a thin composition over existing primitives, not a new validation pipeline.- MCP interpreter observations: the
.mcp.jsonscanner'sMCP_SERVER_COMMANDevidence now rolls up into aCAPABILITY_EXTERNAL_CLIobservation when the command is a python interpreter (python,python3,python3.11, absolute paths) or a node interpreter (node,nodejs, absolute paths). Closes the gap where python3-MCP plugins produced no capability signal and verdicts couldn't fire against them. Bespoke commands (e.g../scripts/my-server.sh) remain un-rolled-up by design. RESERVED_WORD_IN_NAME(warning) — code-registry-framework replacement for the legacy non-overridable errorSKILL_NAME_RESERVED_WORD. Fires when a skill frontmatternamecontainsanthropicorclaude(reserved for Anthropic's certified skills). Overridable viavalidation.severity/validation.allowlike any other framework code. Per the skill-smell philosophy, reserved-word naming is a fix-before-publish smell, not a genuine build breaker, so default severity iswarning.
Changed
vibe-agent-toolkitplugin restructured into 10 sub-skills + a router. Each sub-skill now has a sharp single responsibility and a name that aligns with its CLI command. Published skill names changed:resources→vat-knowledge-resourcesdistribution→vat-skill-distributionauthoring→ split intovat-skill-authoring(SKILL.md authoring) andvat-agent-authoring(TypeScript agents)org-admin→vat-enterprise-org(also avoids the reserved wordclaudein the previous filename)audit→vat-auditskill-quality-checklist→vat-skill-review(now a first-class skill, no longer transcluded)- New:
vat-adoption-and-configuration,vat-skill-authoring,vat-rag - Root
SKILL.md(vibe-agent-toolkit) is now a thin discovery router (~60 lines, prose references to sub-skills only, no transclusion). - Pre-1.0: no backwards-compatibility shims for the old skill names. Adopters with pinned references to the old names should update to the new ones.
- Contributor-only reference docs moved out of the plugin to
docs/contributing/(vat-debugging.md,vat-install-architecture.md). These are not installed with the plugin — they're for people working on VAT itself. - Shortened over-limit descriptions on three VAT development-agent skills (renamed above:
vat-enterprise-org,vat-skill-distribution) to stay under Claude Code's 250-character truncation limit. - BREAKING: Runtime target rename.
claude-desktop→claude-chat,cowork→claude-cowork. Updateplugin.json,marketplace.json, and any config references. Theclaude-desktopname was architecturally wrong — Claude Desktop is a host application, not a runtime. - BREAKING:
runCompatDetectorsreturnsDetectorOutput { evidence, observations }instead ofValidationIssue[]. The skill-validator converts observations to issues viaobservationToIssue; external callers must do the same or consume observations directly. - BREAKING:
CompatibilityResultrestructured. Old shape:{ declared, analyzed: Record<Target, Verdict>, evidence: CompatibilityEvidence[] }. New:{ declaredTargets, evidence: EvidenceRecord[], observations: Observation[], verdicts: Verdict[] }. - BREAKING: Scanner output shape. Scanners in
@vibe-agent-toolkit/claude-marketplacenow returnEvidenceRecord[]with registered pattern IDs;ScannerOutput { evidence, observations }replacesCompatibilityEvidence.
Fixed
vat audit --compatnow honors config-layertargetsdeclared invibe-agent-toolkit.config.yaml, matchingvat skills validateverdicts inside a VAT project. Previously onlyplugin.json/marketplace.jsontargets flowed into plugin-level compat analysis. Multi-skill plugins use the union of every in-plugin skill's targets.vat-skill-review.md(formerlyskill-quality-checklist.md): description-opener rule no longer contradicts Anthropic's official skill-description guidance.Use when <concrete trigger>is now explicitly allowed (it's the recommended pattern); only vague filler likeUse when you want to.../Use when you need to...is banned. Prior wording banned allUse when...openers, which contradicted VAT's own authoring guidance.readMarketplaceDefaultTargets()now walks upward from the starting directory to find the enclosing.claude-plugin/marketplace.json, instead of only checking the parent directory. Canonical layouts (~/.claude/plugins/marketplaces/<m>/<p>/) still work identically; deeper nested layouts now resolve correctly. Safeguarded against runaway walks by max depth (10 levels) andnode_modules/.gitboundaries. Closes limitation #1 from the 0.1.32-rc.1 plan Outcome.vat auditnow walks to the nearest config per SKILL.md instead of loading a single top-level config. In monorepos with per-packagevibe-agent-toolkit.config.yamlfiles (e.g.packages/<pkg>/vibe-agent-toolkit.config.yaml), each skill's validation now honors its own package's config — eliminating cross-package config bleed where a root config was silently applied to skills owned by other packages.vat auditnow honorsresources.excludefrom the config. Previously theexcludelist in theresourcessection only affectedvat resources validate; audit ignored it and reported finding...
Release v0.1.31
Added
- v1 compat smells. Three new
COMPAT_*codes —COMPAT_REQUIRES_BROWSER_AUTH,COMPAT_REQUIRES_LOCAL_SHELL,COMPAT_REQUIRES_EXTERNAL_CLI— detect per-skill runtime capabilities (browser auth, local shell, external CLI) via static analysis of SKILL.md and its transitively linked markdown. Default severitywarning; configure per-skill viavalidation.severity/validation.allowlike any other framework code. Full rationale and when-to-allow guidance indocs/validation-codes.md. vat audit --usernow documentsCLAUDE_CONFIG_DIR. Help text andpackages/cli/docs/audit.mdname the env var, mark~/.claudeas the default rather than unconditional, and document a shell-loop pattern for multi-directory workflows. No code change —CLAUDE_CONFIG_DIRhas always been honored inpackages/claude-marketplace/src/paths/claude-paths.ts— but the UX gap closes.vat audit: gitignore-aware scanning. When scanning inside a git repository, paths matched by.gitignoreare skipped by default — no hardcoded directory list needed.--include-artifactsopts back in. When the user explicitly targets a gitignored path (e.g.,vat audit dist/skills/), filtering is disabled for that subtree.vat audit: config-aware validation in VAT projects. Whenvibe-agent-toolkit.config.yamlis found at the scan root, audit uses the project's build settings (linkFollowDepth,files,excludeReferencesFromBundle) to validate skills — eliminating falseLINK_OUTSIDE_PROJECTwarnings for links the build pipeline resolves. Audit never appliesvalidation.allow(always shows all issues).docs/skill-quality-and-compatibility.md: new project stance doc articulating what VAT believes makes a skill good and compatible. Linked from theauthoringskill and cross-referenced fromdocs/validation-codes.md.
Changed
-
vat auditnow skips gitignored paths by default. Before this change, runningvat auditin a TypeScript project scanned every SKILL.md innode_modules/,dist/, and other artifact directories (often hundreds of duplicate files). The new behavior uses the project's.gitignorerules, which adapts to each project's layout automatically. Use--include-artifactsto opt back in for deliberate artifact audits. -
SKILL_CONSOLE_INCOMPATIBLEretired. The Bash/Edit/Write/NotebookEdit tool-mention warning is replaced by the newCOMPAT_REQUIRES_LOCAL_SHELL, giving adopters a single canonical detector with configurable severity and per-path allow entries.
Removed
- Top-level
parsed['targets']reader inclaude-marketplace/src/scanners/frontmatter-scanner.ts. The reader violated VAT'smetadata.*-for-extensions convention and served no concrete downstream use case after the unified validation framework landed in0.1.30. Information it captured migrates to framework codes andvalidation.allow.
Release v0.1.30
Changed
- BREAKING: Unified validation framework replaces
ignoreValidationErrors. Every overridable integrity check now flows through a singlevalidationblock (severity+allow) underskills.defaults/skills.config.<name>invibe-agent-toolkit.config.yaml. The previous non-overridable error tier (OUTSIDE_PROJECT_BOUNDARY,LINK_TARGETS_DIRECTORY,LINKS_TO_NAVIGATION_FILES) is removed and replaced by unifiedLINK_*codes that accept the same overrides as everything else. Project-config schemas are now strict — configs containing the removedignoreValidationErrorsfield (or any other unknown key) fail at parse time with"Unrecognized key(s) in object"instead of silently dropping, so upgrades surface the migration work immediately. See jdutton/vibe-agent-toolkit#83 for full design rationale and the canonical code reference atdocs/validation-codes.md. - BREAKING:
PACKAGED_UNREFERENCED_FILEandPACKAGED_BROKEN_LINKnow block the build. Previously logged at info level without affecting exit code; now default severityerrorwithvat skills buildexiting1. Downgrade viavalidation.severity: { PACKAGED_UNREFERENCED_FILE: warning }if needed. - BREAKING: Expired
allowentries no longer silently re-fire the underlying error. The allow entry still applies; VAT emits a newALLOW_EXPIREDwarning to surface the stale date for re-review. Opt in to strict expiry withvalidation.severity: { ALLOW_EXPIRED: error }. vat auditis now advisory. Audit always exits0regardless of validation severity, honorsvalidation.severityfor display grouping only, and ignoresvalidation.allow. Usevat skills validateorvat skills buildfor gated checks with per-path allow entries.
Added
- New validation codes —
LINK_OUTSIDE_PROJECT,LINK_TARGETS_DIRECTORY,LINK_TO_NAVIGATION_FILE,LINK_TO_GITIGNORED_FILE,LINK_MISSING_TARGET,LINK_TO_SKILL_DEFINITION,LINK_DROPPED_BY_DEPTH,ALLOW_EXPIRED,ALLOW_UNUSED. Full reference atdocs/validation-codes.mdwith defaults, descriptions, and fix hints.LINK_TO_SKILL_DEFINITIONfires only for cross-skill SKILL.md references; transitive self-references (a bundled resource linking back to the skill's own SKILL.md) are treated as no-ops. LINK_MISSING_TARGETcloses a previously silent walker drop path: links to non-existent (non-deferred) files are now reported at the walker with a clear message, rather than only surfacing post-build as a genericPACKAGED_BROKEN_LINK.ALLOW_UNUSED— analogous to ESLint's unused-disable — surfacesallowentries that match no emitted issues.- Per-path
validation.allowwith requiredreasonand optionalexpiresdate, providing an audit trail for legitimate exceptions.pathsis optional and defaults to["**/*"](the whole skill) — so concerns that apply to an entire skill can omit the paths array entirely. - Canonical code reference at
docs/validation-codes.md, test-locked against the code registry so new codes cannot ship without documentation.
Migration
| Old | New |
|---|---|
ignoreValidationErrors: { CODE: "reason" } |
validation.severity: { CODE: ignore } |
ignoreValidationErrors: { CODE: { reason, expires } } |
validation.severity: { CODE: ignore } for code-wide silence, OR validation.allow: { CODE: [{ paths, reason, expires }] } for scoped allow entries with re-review on expiry |
Release v0.1.29
Added
vat verify --consistency-check— post-build verification that skill distribution config invibe-agent-toolkit.config.yamlandpackage.jsonare consistent. Detects skills missing frompackage.json, orphaned entries, and publish opt-out mismatches. Runs automatically as part ofvat verify.- Post-build integrity checks for packaged skills —
packageSkill()now runsPACKAGED_UNREFERENCED_FILEandPACKAGED_BROKEN_LINKchecks after copying files and rewriting links. Both are best-practice (overridable) errors surfaced viaPackageSkillResult.postBuildIssues; the CLI logs them at info level (non-blocking). Suppress viapackagingOptions.ignoreValidationErrors. Broken-link detection skips fenced code blocks and inline code spans so template strings aren't false-flagged. Unreferenced-file detection counts any mention of a packaged file's output-relative path — inside code blocks, inline code, or prose — as documented; CLI invocations likenode scripts/cli.mjsare legitimate references even though they aren't[text](href)links. - Skill quality checklist — new
skill-quality-checklist.mdresource bundled with the agent-authoring skill. 21-item checklist covering general skill authoring (description triggering, length limits, third-person voice, time-sensitive content, references one-level-deep, TOCs on long files) plus CLI-backed skill specifics (env guards, auth checks, cross-platform commands,filesconfig). Reviewed against external best practices (Anthropic docs, anthropics/skills, superpowers conventions, Claude Code release notes through 2026-04-15).
Fixed
- Link rewriting now handles links with inline-formatted text correctly —
transformContentkeyed its link lookup by[text](href)wheretextcame from remark (formatting stripped) while the regex captured the raw source (formatting preserved). Any link whose text contained backticks, emphasis, or other inline markup silently fell through the rewriter, leaving the original (now-broken) relative path in the packaged output. Lookup is now keyed byhref, which the regex and parser report identically. Templates also gain a newlink.rawTextvariable exposing the original formatted text (falls back tolink.textwhen raw text is unavailable), and the default bundled-link template uses it so[`foo.yaml`](…)survives rewriting as[`foo.yaml`](new/path)rather than losing its code styling. excludeReferencesFromBundlepatterns now apply to terminal non-markdown links — links to YAML, JSON, images, and other assets that are not indexed by the registry were falling through the bundled-link rule and rendering as[text]()becausematchesPatternshort-circuited tofalsewhenever the target resource was unresolved.matchesPatternnow falls back to matching the link's raw href when no resolved resource is available, andbuildRewriteRulesevaluates per-pattern excludes before the bundled-link rule so terminal assets resolve to the user's template.filesconfig inskills.config.<name>.fileswas parsed but not applied at build time —vat skills buildmerged thefilesentries fromvibe-agent-toolkit.config.yamland validated them (vat verifycorrectly reported missing dests), but never passed them intopackageSkill(), so declared files were silently skipped. Now CLI binaries and other build artifacts declared viafilesconfig are copied into skill output as intended.- Skill bundler strips links to non-markdown bundled files — links to YAML, JSON, and script files routed to
templates/,assets/, orscripts/were rewritten to empty()because non-markdown assets weren't added to the output registry. Now all files in the path map are added to the output registry with their mapped output paths, including the duplicate-ID edge case for paired markdown/non-markdown files (e.g.config.md+config.yaml). - Skill bundler strips depth-boundary links to already-bundled resources — when resource D linked to resource C and C was already bundled via a shorter path from SKILL.md, the link from D→C was stripped because depth-exceeded exclusions were unconditionally added to
excludedIds. Bundle membership now wins:excludedIdsfilters out resources already inbundledResources. - Discovery scanner no longer traverses git worktrees —
.worktrees/and.claude/worktrees/added toPERFORMANCE_POISONexclusions, preventing the crawler from physically walking into worktree copies of the repo during scans. - System tests no longer flaky from vitest worker timeout — refactored
skills-list.system.test.tsto run CLI spawns once inbeforeAllinstead of 5 redundant full-project scans. Same coverage, 70% faster (90s → 27s), eliminates theonTaskUpdatetimeout.
Release v0.1.28
Fixed
- Skill bundler no longer silently bundles gitignored files — when a SKILL.md links to files inside a gitignored directory (e.g.,
data/), those files are now excluded from the bundle instead of being silently packaged and published. This includes files reached through symlinks in gitignored directories (e.g., OneDrive/shared drive mounts). Previously required manualexcludeReferencesFromBundleworkarounds; now handled automatically.
Release v0.1.27
Breaking
- Removed top-level
vat installcommand. Install of flat skills now usesvat skills install <source> --target <target> --scope <user|project>. Install of Claude plugins usesvat claude plugin install <source>.
Added
vat skills install <source> --target <target> --scope <user|project>— cross-platform flat skill installer. Supports 7 targets (claude, codex, copilot, gemini, cursor, windsurf, agents) and 2 scopes (user, project). Sources: local directory,.zip,.tgz, ornpm:@scope/package. Pre-verifies all skills before touching the filesystem (all-or-nothing).vat skills list npm:@scope/package— inspect what skills are in an npm package without installing.bun run pre-release— pre-tag validation command that confirms CHANGELOG is stamped, no stale tags exist on remote, marketplace dry-run passes, and version section has content. Prevents failed CI publishes from unready state.bun run bump-versionnow auto-stamps CHANGELOG.md for stable versions — moves[Unreleased]content under a new## [X.Y.Z] - dateheading. Safety guards: fails if[Unreleased]is empty, refuses to stamp if version already exists in CHANGELOG (prevents corruption from backward bumps or re-stamps). Skips for RC/prerelease versions.
Fixed
- CHANGELOG check in pre-publish no longer skipped during
bun run validate— the CHANGELOG stamp check was incorrectly gated behind--skip-git-checks(a git check flag), but it's a content check. Now runs unconditionally.
Changed
- Published VAT skills updated to describe the new
vat skills installcommand surface.
Release v0.1.26
Added
- Cross-skill SKILL.md bundling prevention — VAT now detects when a skill links to another skill's
SKILL.mdand excludes it from the bundle. ASKILL.mdis a skill definition marker, not a resource — bundling one inside another skill creates duplicate definitions that break marketplace sync and confuse skill consumers. Two layers of protection: link-follow filtering (prevents the bad state) and post-build validation (safety net). The exclusion appears in build output asskill-definitionreason. - ESLint rule:
no-fs-promises-cp— Prevents usage of asynccp()fromnode:fs/promisesin favor ofcpSync()fromnode:fs. Node 22's asynccp({ recursive: true })silently drops files in nested directories. The rule auto-fixes and explains the issue so developers can make an informed eslint-disable decision if async is truly needed.
Fixed
- Marketplace publish drops non-markdown files on Node 22 —
composePublishTreeused asynccp()fromnode:fs/promiseswhich silently drops.mjsfiles in nested directories on Node 22. Replaced withcpSyncwhich works correctly across all Node versions. Added a system test that verifies.mjsscripts survive the full compose→publish pipeline. - Marketplace publish
--debugflag not reaching logger —--debugwas defined on the publish command but consumed by a parent command in the Commander hierarchy. Options are now read viaoptsWithGlobals()so--debugworks correctly. - Marketplace publish debug logging —
vat claude marketplace publish --debugnow logs the full file list at each stage of the publish pipeline (cpSync output, git tracked files, git ignored files, early-exit tree). Diagnoses files disappearing between build output and published commit.
Release v0.1.25
Security
- Marketplace publish no longer logs git remote credentials.
vat claude marketplace publishpreviously echoed the full remote URL — including any credentials embedded by the user's config OR injected at runtime fromGH_TOKEN/GITHUB_TOKEN— to stdout via itsRemote:andPushed to …log lines. In CI, GitHub Actions auto-masked the secret, but local runs (including adopter dry-runs) emitted the raw token to the terminal. All URL logging now passes through aredactUrlCredentials()helper that strips userinfo before logging. Git commands still receive the tokenized URL for authentication — only the logged copy is redacted.
Changed
- BREAKING: Marketplace publish no longer rewrites
CHANGELOG.md.vat claude marketplace publishnow mirrors the sourceCHANGELOG.mdbyte-for-byte into the publish tree and extracts release notes for the commit body only. Accepts both Keep a Changelog workflows: a pre-stamped[X.Y.Z]section matchingpackage.json(preferred) or a non-empty[Unreleased]section (fallback). Fails if neither is present. Workflow A adopters whosemainbranch CHANGELOG continues to carry[Unreleased]at publish time will see that heading on the publish branch too — stampCHANGELOG.mdonmainbefore tagging if you want a stamped heading in the published file. Side benefit: corrections/typo-fixes toCHANGELOG.mdonmainnow propagate to the publish branch on the next publish.
Fixed
toAbsolutePath()andgetRelativePath()now return forward-slash paths on Windows — previously these returned backslash paths, bypassing cross-platform normalization.
Release v0.1.24
Feature
- Safe path normalization — added
safePath.join(),safePath.resolve(),safePath.relative()wrappers in@vibe-agent-toolkit/utilsthat always return forward-slash paths. New ESLint rules (no-path-join,no-path-resolve,no-path-relative) enforce their use over rawnode:pathfunctions, with auto-fix support. Adopters can copy these rules frompackages/dev-tools/eslint-local-rules/into their own projects. Closes #38. - Cross-platform ESLint rule parity with vibe-validate — ported
no-path-resolve-dirname(enforcesnormalizePath()overpath.resolve(__dirname)in tests for Windows 8.3 short name safety) andno-test-scoped-functions(enforces module-scope helper functions in test files, SonarQube S1515). VAT now ships 15 custom ESLint rules for cross-platform safety.
Release v0.1.23
Feature
- Marketplace publishing — distribute Claude plugin marketplaces via Git branches.
vat claude marketplace publishcomposes built artifacts with changelog, readme, and license into a squashed commit on a configurable branch. Consumers install with/plugin marketplace add owner/repo#branch. Includes standalone strict validation (vat claude marketplace validate) and automatic marketplace verification invat verify.
Docs
- Marketplace testing guide — added "Testing Your Marketplace" section to marketplace-distribution.md with full local test flow (
marketplace add→install→validate→ verify skills), known issues (name collision,$schemavalidation), and update workflow. - Marketplace README — rewrote marketplace branch README as a developer-facing landing page with two-step install, skill descriptions, and architecture link.
- Main README — added "Claude Plugin Marketplace" section with install commands and links to marketplace branch and distribution guide.
- Distribution skill — added local marketplace testing subsection with commands and known-issue notes.
Changed
- Publish workflow — added marketplace publish step to CI; stable tags push to
claude-marketplacebranch, RC tags push toclaude-marketplace-next. - Pre-publish checks — added marketplace dry-run validation (Check 12) to catch build/changelog issues before any npm mutations.