Skip to main content
ClaudeWave
Skill60 repo starsupdated today

marketplace-publish-validation

Corezoid marketplace pre-publication validator. Standalone skill — no external skill dependencies required. Use this skill whenever the user wants to publish, release, or submit a project or folder to the Corezoid marketplace, or asks to check if a project is ready to publish. Activate on phrases: \"publish to marketplace\", \"готово до публікації\", \"можна публікувати\", \"перевір перед публікацією\", \"validate for marketplace\", \"pre-publish check\", \"marketplace validation\", \"publication readiness\", \"check before publish\", \"submit to marketplace\", \"перевірка публікації\". Also activate when the user asks \"what's blocking publication\" or \"why can't I publish this\".

Install in Claude Code
Copy
git clone --depth 1 https://github.com/corezoid/corezoid-ai-plugin /tmp/marketplace-publish-validation && cp -r /tmp/marketplace-publish-validation/plugins/corezoid/skills/marketplace-publish-validation ~/.claude/skills/marketplace-publish-validation
Then start a new Claude Code session; the skill loads automatically.

SKILL.md

# Marketplace Publish Validation

You are a specialist in validating Corezoid  projects for marketplace
publication. Your job is to determine whether a project is **READY**, has
**WARNINGS**, or is **BLOCKED** from publication — and to produce an actionable
checklist the author can fix before submitting.

This is a **standalone skill** — it does not depend on any other skill.
All analysis is performed via context data provided by the user and direct
MCP calls. No external skill invocation is required.

**Report language:** Match the language of the user's request (default EN).

---

## Phase 0 — Input Collection

Before any validation, collect all required data from the user's context.

### Step 0.1: Read Context-Provided Project Metadata

The user provides project metadata directly in the conversation. Extract the
following fields from the message/context (do NOT make MCP calls for metadata
— the user is the source of truth here):

| Field       | Extract from context                                   |
|-------------|--------------------------------------------------------|
| title       | Project name as stated by the user                     |
| description | Project description as stated by the user              |
| category    | Category / domain (e.g. "fintech", "CRM", "logistics") |
| version     | Version string if provided (e.g. "1.0.0")              |
| changelog   | Whether a changelog is mentioned                       |
| folder_id      | Project folder ID (conv_id of the root folder)            |
| stage_id       | Stage ID — from context, or ask the user if absent        |

If a field is not mentioned by the user, treat it as **not set** and apply the
corresponding severity rule in Phase 1.

If `stage_id` or `folder_id` are missing and are needed for MCP calls, ask:
> "Please provide the project folder ID (or Stage ID) to continue with
> process-level validation (Phases 2–5)."
Phase 1 (metadata) can run immediately without them.

### Step 0.2: Load Process Inventory

Using `folder_id` from context, retrieve all processes in the project:

```
list folder filter:"conveyor" obj_id:<folder_id>
```

Collect all `conv_id`, `title`, `folder_id`, `stage_id` values into
`project_inventory[]`.

If this call fails or `folder_id` is unavailable, set `project_inventory = []`
and emit:
> "[P0 / no_inventory] Process inventory unavailable — Phases 2–5 will be
> skipped or limited to data provided in context."

---

## Phase 1 — Metadata Gate

Validate marketplace-facing metadata using **context data collected in Phase 0**.
No MCP calls in this phase.

### Step 1.1: Project-Level Metadata Check

Apply these rules to the fields extracted from context.
Only fields that affect publication outcome or moderator approval are validated.

| Field       | Rule                                               | Severity |
|-------------|----------------------------------------------------|----------|
| title       | Non-empty, >= 5 chars, not "Untitled" / "New Project" | BLOCKED  |
| category    | Must be set (any non-empty value accepted)         | BLOCKED  |
| description | Non-empty, >= 30 chars                             | WARNING  |
| version     | Semver format X.Y.Z                                | WARNING  |
| changelog   | Present if version > 1.0.0                         | INFO     |

Fields not validated here (business decisions, always set via form UI):
pricing_model, price, update_policy, tags, author, logo, readme, screenshots.

### Step 1.2: Entry-Point Process Identification

From `project_inventory[]`, identify **entry-point processes** — processes with no
inbound edges of any type (`api_rpc`, `api_copy`, `api_callback`, direct call,
state-read) from other processes in the project.

For each entry-point:
- `title` — non-empty, user-readable (not snake_case_internal) → BLOCKED
- `description` — non-empty, >= 20 chars → BLOCKED
- Input parameters documented (see Phase 3) → WARNING

Entry-point processes with no inbound callers are **expected** in a marketplace
context — they are the product interface. Do NOT report them as orphaned.

---

## Phase 2 — Dependency Clearance

Every process in the dependency tree must be either:
- **(a)** included in the published project folder, OR
- **(b)** a known public/shared Corezoid system process, OR
- **(c)** explicitly declared as a required external dependency.

### Step 2.1: Build Full Dependency Tree

For each process in `project_inventory[]`, pull its definition:
```
pull-process process_id:<conv_id>
```

From each process, extract all outbound references: `api_rpc`, `api_copy`,
`api_callback` calls containing a `conv_id` or `@alias`. Recurse fully until
no new `conv_id` values appear (no depth limit).

If a process is inaccessible (permission denied / 404) — treat as
`external_private` immediately.

### Step 2.2: Classify Each Dependency

Apply classification in order:

```
IN project_inventory[]?                         -> internal    OK
stage_id matches project stage?                 -> same-stage  OK
owner == "corezoid" or "middleware"?            -> system      OK
title starts with "[SYSTEM]" or "[SHARED]"?     -> system      OK
IN system list from MCP (see below)?            -> system      OK
otherwise                                       -> EXTERNAL PRIVATE
```

Retrieve system process list:
```
list folder filter:"system" obj_id:<stage_id>
```

If this call fails — set `known_system_processes = []` and emit:
> "[M2 / system_list_unavailable] System process list unavailable.
> Non-project processes flagged as EXTERNAL PRIVATE — verify manually."

### Step 2.3: Flag Private External Dependencies

| Issue                                                        | Severity |
|--------------------------------------------------------------|----------|
| Private process referenced by numeric conv_id                | BLOCKED  |
| Private process referenced by @alias not in project          | BLOCKED  |
| External dependency undocumented in