Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/01-bug-report.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: Bug report
description: Report a reproducible problem with the Desktop app, CLI, or source build.
title: "[Bug]: "
labels: ["bug"]
labels: ["bug", "needs-triage"]
body:
- type: markdown
attributes:
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/02-feature-request.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: Feature request
description: Suggest an improvement to the Desktop app, CLI, or source distribution.
title: "[Feature]: "
labels: ["enhancement"]
labels: ["enhancement", "needs-triage"]
body:
- type: dropdown
id: product
Expand Down
16 changes: 9 additions & 7 deletions .github/ISSUE_TEMPLATE/03-question.yml
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
name: Usage question
description: Ask about the Desktop app, CLI, or building from source.
name: Usage or repository policy question
description: Ask about the Desktop app, CLI, source builds, or contribution policy.
title: "[Question]: "
labels: ["question"]
labels: ["question", "needs-triage"]
body:
- type: dropdown
id: product
attributes:
label: Product or interface
description: Leave blank if unsure or asking about repository policy.
options:
- Desktop app
- CLI - interactive TUI
- CLI - headless
- CLI - ACP
- Source build or repository tooling
validations:
required: true
required: false
- type: textarea
id: question
attributes:
Expand All @@ -25,18 +26,19 @@ body:
id: platform
attributes:
label: Platform
description: Leave blank if unknown or not applicable.
options:
- macOS
- Windows
- Linux
- WSL
- Multiple platforms
validations:
required: true
required: false
- type: textarea
id: context
attributes:
label: Version and what you have tried
description: Include documentation you followed and relevant redacted output. Do not include keys or account data.
label: Version or policy context
description: For usage questions, include your version and what you tried. For policy questions, link the relevant policy. Do not include keys or account data.
validations:
required: true
3 changes: 3 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Contribution policy
url: https://github.com/MiniMax-AI/minimax-code/blob/main/CONTRIBUTING.md
about: Everyone may report issues and suggest improvements. Pull requests are accepted only from repository collaborators; external PRs are not accepted.
- name: CLI quick start and troubleshooting
url: https://agent.minimax.io/docs/cli/quick-start
about: Installation, account regions, first tasks, and links to troubleshooting.
Expand Down
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/docs.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
name: Documentation issue
description: Report missing, incorrect, or unclear documentation.
title: "[Docs] "
labels: ["documentation", "needs-triage"]
body:
- type: input
id: location
Expand Down
23 changes: 23 additions & 0 deletions docs/maintainers.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,29 @@

These are repository maintenance responsibilities, not an assertion that an account owns the product's copyright. Every PR that requires approval needs a reviewer other than the author, and security reports need a working private response path. Review maintainer additions and policy changes in a PR; do not silently grant repository access.

## Issue triage

Published source covers the standalone CLI (interactive TUI, headless and ACP). The issue tracker also collects Desktop app feedback; accepting those reports does not expand the published source scope.

Everyone may report bugs, request features, ask questions, and flag documentation problems. Code and documentation PRs are accepted only from repository collaborators. Opening an issue or having a proposal accepted does not grant collaborator access or permission to submit a PR. Do not use `good first issue` or `help wanted` while external PRs are closed.

Use these labels independently:

| Category | Labels and meaning |
| --- | --- |
| Type | `bug`: reported malfunction; `enhancement`: requested improvement; `documentation`: missing or incorrect docs; `question`: usage or project-policy question |
| Product | `desktop`: Desktop app; `cli`: standalone mcode, including TUI, headless, ACP and its source builds/tooling |
| Triage | `needs-triage`: awaiting maintainer assessment; `needs-info`: a maintainer has asked the reporter for specific missing information |

1. Start with [needs-triage](https://github.com/MiniMax-AI/minimax-code/issues?q=is%3Aissue+is%3Aopen+label%3Aneeds-triage) and [unlabelled issues](https://github.com/MiniMax-AI/minimax-code/issues?q=is%3Aissue+is%3Aopen+no%3Alabel). Templates add a type and `needs-triage`; reports created through other routes may need both added manually. A type label describes the report and does not confirm a defect or commit to implementation.
2. Confirm one primary type and apply `desktop` or `cli` from the report. Product dropdowns stay in the body; maintainers apply product labels manually. Use both only when the report establishes that both are affected. Leave product labels unset for unclear reports or repository-policy questions. The existing `tui` label may supplement `cli` for interactive-terminal-specific issues; it does not cover headless or ACP.
3. If information is missing, ask for the specific version, reproduction, or expected behavior, replace `needs-triage` with `needs-info`, and retain any known type/product labels. When the reporter replies, remove `needs-info` and reassess. Do not automatically close issues for inactivity.
4. Once assessed, remove `needs-triage` and record the next step in a comment. Assign a collaborator when someone takes responsibility; classification alone does not promise a fix or release date. For duplicates, link the original issue before closing with `duplicate`. For declined requests, explain the reason before closing with `wontfix`.

Route security reports through [Security](../SECURITY.md). Do not ask for secrets or unredacted logs in public issues. Label setup is a separate repository operation: ensure the labels above exist before merging template changes, since forms cannot create missing labels. The Feishu workflow sends notifications only; it does not perform triage.

This small label set draws on the type and information-request handling in [VS Code's triage guide](https://github.com/microsoft/vscode/wiki/Issues-Triaging) and the `needs-triage`/`needs-info` states used by [Ruff](https://github.com/astral-sh/ruff/labels). Contribution eligibility follows this repository's policy.

## Review and merge

1. Repository collaborators open an issue for substantial scope or submit a focused feature-branch PR. Other users may open issues to discuss ideas and proposals. Security details follow the private reporting process.
Expand Down
20 changes: 19 additions & 1 deletion test/source-sync.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@ test('public support forms preserve destination URLs and separate Desktop from C
for (const name of forms) {
const form = parseYaml(readFileSync(new URL(`../.github/ISSUE_TEMPLATE/${name}`, import.meta.url), 'utf8'));
const product = form.body.find(field => field.id === 'product');
assert.equal(product.validations.required, true);
assert.equal(product.validations.required, name !== '03-question.yml');
assert.ok(product.attributes.options.includes('Desktop app'));
assert.ok(product.attributes.options.includes('CLI - ACP'));
assert.ok(product.attributes.options.includes('CLI - headless'));
Expand All @@ -440,6 +440,24 @@ test('public support forms preserve destination URLs and separate Desktop from C
assert.equal(classifyChanges(['README_ZH.md', 'README.md']).docsOnly, true);
});

test('issue forms label incoming reports for triage and retain collaborator-only PR guidance', () => {
for (const [name, type] of [
['01-bug-report.yml', 'bug'], ['02-feature-request.yml', 'enhancement'],
['03-question.yml', 'question'], ['docs.yml', 'documentation'],
]) {
const form = parseYaml(readFileSync(new URL(`../.github/ISSUE_TEMPLATE/${name}`, import.meta.url), 'utf8'));
assert.deepEqual(form.labels, [type, 'needs-triage']);
}
const config = parseYaml(readFileSync(new URL('../.github/ISSUE_TEMPLATE/config.yml', import.meta.url), 'utf8'));
assert.equal(config.blank_issues_enabled, false);
const policy = config.contact_links.find(link => link.url.endsWith('/CONTRIBUTING.md'));
assert.match(policy.about, /only from repository collaborators/);
assert.match(policy.about, /external PRs are not accepted/);
const question = parseYaml(readFileSync(new URL('../.github/ISSUE_TEMPLATE/03-question.yml', import.meta.url), 'utf8'));
assert.equal(question.body.find(field => field.id === 'platform').validations.required, false);
assert.equal(question.body.find(field => field.id === 'question').validations.required, true);
});

test('issue notification is restricted to public destination events and builds payloads offline', t => {
const workflow = parseYaml(readFileSync(new URL('../.github/workflows/sync-issue-to-feishu.yml', import.meta.url), 'utf8'));
assert.deepEqual(workflow.on, { issues: { types: ['opened'] } });
Expand Down
Loading