Skip to content

Commit bb62c64

Browse files
authored
docs(plugins): publish Plugin V1 format contract, schemas and a dependency-free public validator (#484)
* docs(community): add community on-call SLA and group layering docs Register the two new community documents in the public source inventory so check:source passes. - docs/community/oncall.md: role split (chat vs GitHub), rotation windows, 48h triage SLA, label hygiene rules, contribution-request rules, weekly feedback replay, reply templates, weekly metrics. - docs/community/groups.md: three community layers and what belongs in each, the single entry point, movement rules, Insider external-disclosure rule, showcase wall and AMA format. * docs(plugins): publish Plugin V1 format contract, schemas and public validator External authors had no path to the Plugin package format: the contract, the four JSON Schemas, the reference vectors and the validator all lived in the internal marketplace repository, and the only onboarding tool (plugin-creator) is private. This publishes the contract into the public repository: - docs/plugins/package-format-v1.md, host-bindings.md, showcases.md - schemas/plugins/{plugin,mcp,app,host-binding,marketplace}-v1.schema.json - test-vectors/plugins/content-digest-v1.{source,expected}.json - tools/plugins/validate-plugin.mjs The public validator runs the same code path an external author runs, and check:source now calls it, so the published schemas and the validator cannot drift apart. It uses only dependencies the repository already declares. Catalog membership, cross-file capability closure, archive limits and content_digest remain the responsibility of the official Marketplace validator at submission time. * chore(source): record published Plugin contract paths in the source inventory * chore(source): drop temporary validator fixtures from the source inventory * fix(plugins): make the public Plugin validator dependency-free check:source also runs inside the exported source snapshot, which has no node_modules, so importing a YAML parser made the gate fail there. The Skill frontmatter subset the V1 contract requires is a flat scalar mapping, so it is parsed inline instead. * docs(plugins): add the external author onboarding guide and check:plugin entry The contract was published without a way in. This adds docs/plugins/README.md with the clone-to-submit path and a pnpm check:plugin script so an author can run the same validation the CI runs.
1 parent 851b583 commit bb62c64

17 files changed

Lines changed: 2559 additions & 0 deletions

‎docs/community/groups.md‎

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# Community groups
2+
3+
This document defines the three community layers, what each layer is for, and the rule for moving
4+
between them. It is public so that joining a group is a predictable decision rather than a guess.
5+
6+
## Layers
7+
8+
| Layer | Who can join | What belongs there | What does not |
9+
| --- | --- | --- | --- |
10+
| Newcomer | Anyone with the group QR code or the Discord link | Install, configuration, first-run usage, frequently asked questions | Unreleased features, internal roadmap, internal test builds |
11+
| Advanced | Anyone who has opened at least one issue, or who is invited | Architecture discussion, PR intentions, performance findings, design proposals | Internal roadmap, unreleased features |
12+
| Insider | Invitation only, after signing the external-disclosure rule | Test builds, unreleased features, early feedback | Screenshots of accounts, session identifiers, or unreleased versions |
13+
14+
The three layers are rules first and separate groups second. A new group with fewer than 50 active
15+
members is not created; the rule applies to the existing group until the volume justifies a split.
16+
17+
## The one entry point
18+
19+
Every layer carries the same pinned card, pointing at the same three places:
20+
21+
1. **Report an issue** — `https://github.com/MiniMax-AI/minimax-code/issues/new/choose`
22+
2. **Claim a task** — the `good first issue` label:
23+
`https://github.com/MiniMax-AI/minimax-code/labels/good%20first%20issue`
24+
3. **See the on-call rota and the weekly replay** — [Community on-call](oncall.md)
25+
26+
Feedback posted in chat without an issue number is not tracked. If a chat report is not converted into
27+
an issue within 24 hours, the on-call owner raises it on the reporter's behalf.
28+
29+
## Moving between layers
30+
31+
- **Newcomer → Advanced**: automatic, as soon as the member opens an issue or is invited. There is no
32+
application and no approval.
33+
- **Advanced → Insider**: invitation only. The invite includes the external-disclosure rule below, and
34+
the rule is acknowledged before any test build is shared.
35+
- **Insider → public**: content returns to a public layer only through the formal release notes. Chat
36+
history is never the source for external material.
37+
38+
## External-disclosure rule for the Insider layer
39+
40+
Acknowledged by every Insider member before receiving a test build.
41+
42+
1. Test builds, unreleased feature names, and internal version numbers stay in the Insider layer. They
43+
are not posted to a public group, a public issue, a screenshot, a blog post, or a video.
44+
2. Account identifiers, session identifiers, tokens, and customer project content are never shared in
45+
any layer. Use synthetic files and dedicated test accounts.
46+
3. External material about a feature comes from the release notes for a released version, not from a
47+
chat log. If a screenshot is needed for a public post, it must be regenerated from a released
48+
build.
49+
4. A leak is reported to the release coordinator immediately, and the affected material is withdrawn
50+
as soon as it is identified. Reporting a leak is never held against the reporter.
51+
52+
## What a layer may be used for
53+
54+
| Activity | Newcomer | Advanced | Insider |
55+
| --- | --- | --- | --- |
56+
| Install and configuration help | Yes | Yes | Yes |
57+
| Bug report and question answering | Yes | Yes | Yes |
58+
| Weekly feedback replay | Yes | Yes | Yes |
59+
| AMA session (biweekly) | Yes | Yes | Yes |
60+
| Showcase wall submission | Yes | Yes | Yes |
61+
| Architecture and design discussion | No | Yes | Yes |
62+
| Pull request review participation | No | On invitation | Yes |
63+
| Test build distribution | No | No | Yes |
64+
65+
## Showcase wall
66+
67+
Showcases are collected in `docs/showcase/` and mirrored to a GitHub Discussions category.
68+
69+
- **Threshold:** a showcase must be runnable — a repository, or a prompt that reproduces it, plus the
70+
verification command. Screenshots alone are not accepted.
71+
- **Every showcase produces a task.** Each accepted showcase must yield at least one
72+
`good first issue` task, by extracting the step a newcomer could do independently. This is the point
73+
of the wall: a showcase that produces no task brings in visitors who find nothing to do.
74+
- **Low bar by design:** the entry requirement is "post a prompt that runs". A showcase is not a
75+
product pitch.
76+
77+
## AMA sessions
78+
79+
Biweekly, 30 minutes: 20 minutes of product questions, 10 minutes walking through live issues.
80+
81+
- **Agenda comes from the queue.** Every question discussed is drawn from the current
82+
`needs-triage` queue or a contribution request. The host does not choose topics independently.
83+
- **Recording and minutes** are archived to the Discussions `AMA` category, with the issue numbers
84+
discussed listed in the minutes.
85+
- **Failure condition:** if three consecutive sessions draw fewer than 30% of registrants, the format
86+
changes to a smaller closed-door session over live issues instead of a public AMA. Adding more
87+
sessions is not the response.

‎docs/community/oncall.md‎

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
# Community on-call and issue SLA
2+
3+
This document defines who watches the community channels, what counts as a response, and how
4+
feedback is replayed back to reporters. It is a public commitment: anyone reading it should be able
5+
to predict when they will hear back.
6+
7+
## Scope
8+
9+
The community on-call covers two surfaces:
10+
11+
| Surface | Meaning | Owner |
12+
| --- | --- | --- |
13+
| Community chat (Chinese Feishu group, Discord) | User questions, feedback, event coordination | On-call A |
14+
| GitHub issues (`MiniMax-AI/minimax-code`) | Bug reports, feature requests, contribution requests | On-call B |
15+
16+
These are two different roles and they are staffed by two different people. A single person holding
17+
both roles cannot cover the 18:00–20:00 window, so that window is explicitly not covered by either
18+
role.
19+
20+
## Rotation
21+
22+
| Role | Window | Timezone | Coverage |
23+
| --- | --- | --- | --- |
24+
| On-call A | Weekdays 10:00–18:00 | Asia/Shanghai | Community chat |
25+
| On-call B | Daily 09:00, 20:00–23:00, and weekends | Asia/Shanghai | GitHub issues |
26+
| Uncovered | 18:00–20:00 weekdays | — | Neither role; escalate to the release coordinator |
27+
28+
The rotation is published in the community chat as a pinned card. It is replaced every two weeks.
29+
30+
## Response SLA
31+
32+
**Every open issue must receive a triage action within 48 hours of being opened.** A triage action is
33+
one of the following, and one of them counts:
34+
35+
- applying a type and product label;
36+
- asking the reporter for the specific missing information (`needs-info`);
37+
- linking a duplicate to its original issue;
38+
- recording a next step in a comment, including a decision to decline with a reason.
39+
40+
A triage action is not a promise to fix or to ship in a release. Classification alone does not commit
41+
the project to a delivery date, and this distinction is stated in every response so reporters know
42+
what they are getting.
43+
44+
Anything that has been open for more than 48 hours without any of the above is a SLA breach and is
45+
listed in the weekly feedback replay.
46+
47+
## Label hygiene
48+
49+
- An issue must not stay on `needs-triage` after it is closed. When closing an issue, remove
50+
`needs-triage` in the same action.
51+
- `needs-triage` counts only open issues. Reporting a `needs-triage` ratio that includes closed
52+
issues overstates the backlog; the canonical number is `is:issue is:open label:needs-triage`.
53+
- When an issue is closed as `duplicate` or `wontfix`, the reason is stated in a comment, per the
54+
triage policy in [Maintainers](../maintainers.md).
55+
56+
## Contribution requests
57+
58+
A request for repository access is a request for a decision, and a decision must be communicated.
59+
Even when the answer is "no", the answer is sent.
60+
61+
- Tag contribution requests with `contribution-request` so the funnel from request to decision is
62+
measurable.
63+
- Respond within 48 hours with one of: approved, declined with a reason, or already completed
64+
internally.
65+
- **When the underlying task is completed internally first, the requester is told explicitly and their
66+
fork and branch are still declared valid.** If the internal fix missed anything, the requester is
67+
invited to open a fork PR. Silently closing a contribution request because the work was done
68+
elsewhere is treated as a SLA breach, not as resolution.
69+
- Submission of a fork PR does not require collaborator access. Access is a convenience for
70+
maintainers, not a precondition for contributing.
71+
72+
## Weekly feedback replay
73+
74+
Every Friday, the on-call owner posts a single message to the community chat summarising the week:
75+
76+
- every issue that received a triage action, with its number and what the action was;
77+
- every issue that was asked for more information, and what is still needed;
78+
- every issue that was closed, and why;
79+
- every open issue that has breached the 48-hour SLA, listed by number.
80+
81+
The replay links issue numbers directly. It exists so that a reporter can see what happened to their
82+
report without having to ask, and it is the mechanism that keeps feedback from being silently dropped.
83+
84+
## Reply templates
85+
86+
### Triage response
87+
88+
```
89+
Thanks for the report — received and triaged.
90+
91+
Triage action: <label / needs-info / duplicate / next step recorded>, removed from `needs-triage`.
92+
93+
What we need from you to take this further:
94+
1. <specific question>
95+
2. <specific question>
96+
97+
We will reply within 48 hours. This triage action is not a commitment to a release date.
98+
```
99+
100+
### Contribution request — already completed internally
101+
102+
```
103+
Thanks for the patch and for following the contribution route. Sorry for the long silence on this
104+
thread; that was our failure, not yours.
105+
106+
The task you prepared for (#<n>) was completed internally by #<n> and #<n>, so that specific task is no
107+
longer open.
108+
109+
Your fork and branch are still valid. If you spot anything the internal fix missed or got wrong,
110+
please open a fork PR — no collaborator access is required to submit a fork PR, and we review it
111+
within 48 hours. The same applies to any other change you have prepared.
112+
113+
If you would like to pick up a scoped task, the `good first issue` label is the canonical list:
114+
<label url> — items there are expected to be independently completable, with
115+
`pnpm verify --profile docs` as the verification command for documentation tasks.
116+
```
117+
118+
The two sentences that matter here are the second and third paragraphs. Reporting that the work was
119+
done elsewhere, and then stating that the requester's work is still valid, is what keeps a second
120+
applicant from being treated the same way. Never write "the task is already done, please resubmit".
121+
122+
### Contribution request — approved
123+
124+
```
125+
Approved. You now have the requested access.
126+
127+
The change is expected to be scoped in an issue first, then submitted as a PR from your fork.
128+
Please run the verification command for the profile that covers your change
129+
(`pnpm verify --profile docs` for documentation) and paste the real command output into the PR
130+
description. Review target is 48 hours; if you have not heard back by then, ping the on-call owner.
131+
```
132+
133+
### Security-relevant report
134+
135+
```
136+
Thank you for the detailed report. This is treated as a safety-priority report and escalated for a
137+
code-level review.
138+
139+
Please do not post further exploit detail in this public thread. If the reproduction involves a
140+
pattern that could affect other users, open a private report per SECURITY.md and reference this issue
141+
number.
142+
143+
We will reply within 48 hours.
144+
```
145+
146+
## Reporting
147+
148+
The on-call owner reports these numbers weekly to the community chat and to the project maintainers:
149+
150+
| Metric | Definition |
151+
| --- | --- |
152+
| 48h triage coverage | share of issues opened in the week that received a triage action within 48 hours |
153+
| Open `needs-triage` | open issues still carrying `needs-triage` (open scope only) |
154+
| SLA breaches | issues open for more than 48 hours with no triage action |
155+
| Zero-reply issues | open issues with no comment at all |
156+
| Contribution request resolution time | hours from request to a communicated decision |

‎docs/plugins/README.md‎

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# 写一个 MiniMax Code Plugin
2+
3+
本文是外部作者的上手路径:从零到一个可提交校验的 Plugin 包。目标是让你在本地
4+
就能跑出与官方 CI 同一条校验命令,避免提交后才发现格式问题。
5+
6+
## 1. 先跑通环境
7+
8+
```bash
9+
git clone https://github.com/MiniMax-AI/minimax-code.git
10+
cd minimax-code
11+
pnpm install
12+
pnpm verify --profile docs
13+
```
14+
15+
最后一条必须先通过。它验证的是本仓库自身的公开边界,能跑通说明你的环境是对的——
16+
这是整条路径的信任锚点。
17+
18+
## 2. 创建一个 Plugin 包
19+
20+
一个 Plugin 是一个独立目录,根下必须有 `.minimax-plugin/plugin.json`:
21+
22+
```text
23+
my-plugin/
24+
.minimax-plugin/plugin.json
25+
skills/research/SKILL.md
26+
my-tool.mcp.json
27+
```
28+
29+
最小的 manifest:
30+
31+
```json
32+
{
33+
"schemaVersion": 1,
34+
"name": "my-plugin",
35+
"version": "0.1.0",
36+
"description": "一句话说明这个 Plugin 做什么。",
37+
"author": "你的名字或组织",
38+
"icon": "icon.png",
39+
"category": "Code",
40+
"exampleQueries": ["用它做一件具体的事"],
41+
"apps": [],
42+
"mcpServers": ["my-tool.mcp.json"],
43+
"skills": ["skills/research/SKILL.md"]
44+
}
45+
```
46+
47+
`name` 必须与目录名一致。`category` 只能取 `Office`、`Studio`、`Design & Sites`、
48+
`Code`、`Business`、`Sales`、`Productivity`、`Science & Healthcare`、`Education`、`Other`。
49+
`apps`、`mcpServers`、`skills`、`hooks` 至少有一项非空。
50+
51+
完整字段与约束见 [Plugin 包格式 V1](package-format-v1.md)。
52+
53+
## 3. 本地校验
54+
55+
```bash
56+
node tools/plugins/validate-plugin.mjs path/to/my-plugin
57+
```
58+
59+
或用仓库脚本:
60+
61+
```bash
62+
pnpm check:plugin path/to/my-plugin
63+
```
64+
65+
这条校验与 `pnpm verify --profile docs` 内部执行的是**同一段代码**,所以本地通过
66+
意味着 CI 也会通过。它会检查:
67+
68+
- manifest 是否满足 `schemas/plugins/plugin-v1.schema.json`
69+
- 被引用的 App / MCP / Hook 文件是否存在且满足各自 schema
70+
- 每个 Skill 的 frontmatter 是否包含与目录一致的 `name` 和非空 `description`
71+
- 路径是否为 V1 允许的 portable ASCII path(禁止绝对路径、`..`、反斜杠、Windows 保留名)
72+
73+
退出码 `0` 表示通过,`1` 表示发现问题,`2` 表示用法错误。
74+
75+
## 4. 提交
76+
77+
通过校验后按仓库的贡献流程提交 Plugin:先开 issue 描述你的 Plugin 与改动范围,
78+
再从 fork 提 PR。PR 描述里请贴上 `validate-plugin.mjs` 的真实输出。
79+
80+
## 5. 这条校验不覆盖什么
81+
82+
本地校验**不等于**发布通过。以下由官方 Marketplace validator 在提交时执行:
83+
84+
- catalog 成员资格(Plugin 是否进入官方目录)
85+
- 跨文件能力闭合(manifest 引用与实际文件树完全一致)
86+
- archive 体积与 entry 上限、`content_digest` 计算
87+
- icon 与 Showcase 媒体的真实字节校验
88+
89+
因此请不要把本地校验通过理解为"可以直接上架"。它保证的是包**格式正确**,
90+
而不是包**内容合格**。
91+
92+
## 6. 参考
93+
94+
| 主题 | 文档 |
95+
| --- | --- |
96+
| 包格式、路径契约、安全上限、digest | [package-format-v1.md](package-format-v1.md) |
97+
| Host Binding 扩展 | [host-bindings.md](host-bindings.md) |
98+
| Showcase 案例配置 | [showcases.md](showcases.md) |
99+
| JSON Schema | `schemas/plugins/` |
100+
| 路径与 digest 参考向量 | `test-vectors/plugins/` |

0 commit comments

Comments
 (0)