# Contributing to OpenMAIC Thank you for your interest in contributing to OpenMAIC! This guide will help you get started and ensure a smooth collaboration. ## How to Contribute | Contribution type | What to do | | --- | --- | | **Bug fix** | Open a PR directly (link the issue if one exists) | | **Extending existing features** (e.g. adding a new model provider, new TTS engine) | Open a PR directly | | **New feature or architecture change** | Start a [GitHub Discussion](https://github.com/THU-MAIC/OpenMAIC/discussions) or ask in [Discord](https://discord.gg/p8Pf2r3SaG) **before** opening a PR | | **Design / UI change** | Discuss in a GitHub Discussion or Discord first — include mockups or screenshots | | **Refactor-only PR** | Not accepted unless a maintainer explicitly requests it | | **Documentation** | Open a PR directly | | **Question** | Ask in [Discord](https://discord.gg/p8Pf2r3SaG) | ## Claiming Issues To avoid duplicate effort, please **comment on an issue** to claim it before you start working. A maintainer will assign you. - If **no PR or meaningful update** (WIP commit, progress comment) appears within **1 day**, the issue may be reassigned to someone else. - If you see an issue already assigned, reach out to the assignee first to coordinate — you may be able to collaborate or split the work. - If you can no longer work on a claimed issue, please leave a comment so others can pick it up. ## Prerequisites - [Node.js](https://nodejs.org/) >= 20.9.0 - [pnpm](https://pnpm.io/) (latest) - A copy of `.env.local` — see [`.env.example`](.env.example) for reference ## Getting Started ```bash # Clone the repository git clone https://github.com/THU-MAIC/OpenMAIC.git cd OpenMAIC # Install dependencies pnpm install # Set up environment variables cp .env.example .env.local # Edit .env.local with your API keys # Start the development server pnpm dev ``` ## Development Workflow 1. **Fork** the repository and create a branch from `main`: ```bash git checkout -b feat/your-feature main ``` 2. **Branch naming convention:** - `feat/` — new features or enhancements - `fix/` — bug fixes - `docs/` — documentation changes 3. Make your changes and **test locally**. 4. Run **all CI checks** before committing (see below). 5. Open a **Pull Request** against `main`. ## Before You Submit a PR Run the following checks locally — CI will run them too, but catching issues early saves everyone time: ```bash # 1. Format code pnpm format # 2. Lint (with auto-fix) pnpm lint --fix # 3. TypeScript type checking npx tsc --noEmit ``` If formatting or lint auto-fixes produce changes, include them in your commit. ### Local Testing Before marking a PR as **Ready for Review**, you **must**: 1. **Verify your goal** — confirm that the PR achieves what it set out to do (bug is fixed, feature works as expected, etc.) 2. **Regression test** — manually check that existing functionality is not broken by your changes (e.g. navigate key flows, verify related features still work) 3. **Run CI checks locally** (see above) If you have not completed local verification, keep your PR in **Draft** status. Only move it to Ready for Review once you are confident it works and does not regress other features. ### PR Guidelines - **Every PR must link to an issue** — use `Closes #123` or `Fixes #456` in the PR description. If no issue exists yet, create one first. PRs without a linked issue will not be reviewed. - **Keep PRs focused** — one concern per PR; do not mix unrelated changes - **Describe what and why** — fill out the [PR template](.github/pull_request_template.md) - **Include screenshots** — for UI changes, show before/after - **Ensure CI passes** before requesting review - **All UI text must be internationalized (i18n)** — do not hardcode user-facing strings ## Commit Message Convention We follow [Conventional Commits](https://www.conventionalcommits.org/): ``` (): [optional body] [optional footer] ``` **Types:** `feat`, `fix`, `docs`, `refactor`, `test`, `chore`, `ci`, `perf`, `style` Examples: ``` feat(tts): add Azure TTS provider fix(whiteboard): prevent canvas from resetting on window resize docs: add CONTRIBUTING.md ``` ## Changing a Published Package Four packages under `packages/@openmaic/` are published to npm: `dsl`, `storage`, `renderer`, and `importer`. Anything that ships inside one of those tarballs is under version control in the literal sense — the version number on npm has to keep meaning "this exact source". **If your PR changes a publishable file in one of those packages, bump that package's `version` in its `package.json` in the same PR.** CI enforces this, and without the bump you will see: ``` : publishable package inputs changed but version did not increase ``` What counts as publishable: everything under the package directory except files that never reach the tarball, such as `docs/`, `test/`, and `vitest.config.ts`. Editing only those needs no bump. The exact set lives in `scripts/check-package-version-bumps.mjs`. Choosing the number is a [semver](https://semver.org/) judgement, and it is yours to make rather than something CI can infer: - **patch** — a fix that changes no documented behaviour - **minor** — new behaviour that existing consumers can ignore - **major** — anything an existing consumer must react to For packages below `1.0.0`, a **minor** bump signals a breaking change and a **patch** bump signals a compatible change, following common 0.x semver practice; the **major** rule applies from `1.0.0`. Be deliberate with `@openmaic/dsl`. It is the contract the other packages and downstream deployments validate against, so a change that narrows what an existing document may contain is a breaking change even when the diff looks small. You never publish anything yourself. Once your PR is merged, a version that is not yet on the registry is released automatically, and a `@openmaic/@` tag is written afterwards to record it. That tag is a marker, not a trigger: pushing one does not release anything. ## AI-Assisted PRs 🤖 PRs built with AI tools (Codex, Claude, Cursor, etc.) are welcome! We just ask for transparency and self-review: - **Mark it** — note in the PR title or description that the PR is AI-assisted - **AI-review your own code first** — before requesting maintainer review, run an AI code review (e.g. Claude, Codex, Copilot) on your changes and address the findings. This is **required** for AI-assisted PRs to avoid dumping large amounts of unreviewed generated code on maintainers. - **You are responsible for what you submit** — understand the code, not just the prompt. AI-assisted PRs are held to the same quality standard as any other PR. Community members are also encouraged to leave constructive feedback on any PR — peer review helps everyone improve. ## Project Structure ``` OpenMAIC/ ├── app/ # Next.js app router pages and API routes ├── components/ # React components ├── lib/ # Shared utilities and core logic (i18n in lib/i18n/locales/) ├── packages/ # Internal packages (mathml2omml, pptxgenjs) ├── public/ # Static assets └── .github/ # Issue templates, PR template, CI workflows ``` ## Reporting Bugs Use the [Bug Report](https://github.com/THU-MAIC/OpenMAIC/issues/new?template=bug_report.yml) issue template. Include: - Steps to reproduce - Expected vs. actual behavior - Browser / OS / Node version - Screenshots or error logs if applicable ## Requesting Features Use the [Feature Request](https://github.com/THU-MAIC/OpenMAIC/issues/new?template=feature_request.yml) issue template. For larger features, please open a [Discussion](https://github.com/THU-MAIC/OpenMAIC/discussions) first. ## Security Vulnerabilities Please report security vulnerabilities through [GitHub Security Advisories](https://github.com/THU-MAIC/OpenMAIC/security/advisories/new). **Do not** open a public issue for security vulnerabilities. ## License By contributing to OpenMAIC, you agree that your contributions will be licensed under the [MIT License](LICENSE).