Thanks for helping out. This guide is short on purpose: it covers what you need to get a change from idea to merged PR. A Korean version is in docs/i18n/CONTRIBUTING.ko.md.
projectops is a template and installer (npx projectops) that adds GitHub Actions workflows, version management,
issue/PR templates and agent skills to a repository. If you want to understand how it fits together, start with
docs/NPX-WIZARD.md and docs/SKILLS.md.
- Report a bug or request a feature: open an issue. Use the issue forms and include your projectops version, OS, and the run log (see below) for installer problems.
- Ask a question: use Discussions rather than an issue.
- Fix something small: look for issues labeled
good first issueorhelp wanted. - Anything bigger (new project type, new workflow, behavior change): open an issue first and wait for a maintainer to confirm the direction before you write code.
You need Node.js 20.12 or newer, Python 3.12 (for the script and skill tests) and Git.
git clone https://github.com/<you>/projectops.git
cd projectops
git remote add upstream https://github.com/Cassiiopeia/projectops.git
python3 -m pip install pytest pyyaml pillow numpyThe project has no runtime npm dependencies, so there is nothing else to install.
npm test # installer (Node)
python3 -m pytest .github/scripts/test/ -q # workflow scripts
python3 -m pytest skills/ -q # skill scripts
python3 -m pytest scripts/tests/ -q # shared skill code
python3 .github/util/flutter/_shared/check-consistency.py # only if you touched a Flutter wizardCI runs the same commands on Linux, macOS and Windows. The installer must keep working on macOS
(bash 3.2, BSD tools) and Windows, so please do not use Linux-only shell features in .sh files.
To try the installer on a scratch project:
mkdir /tmp/try && cd /tmp/try && git init
node /path/to/projectops/bin/projectops.js --lang enNew languages are added by adding files, not code. See docs/TRANSLATING.md.
You do not need the branch name and commit format described in the next section. They feed the maintainer's automation (issue helper, version bump), not your pull request.
- Use any branch name.
- Write commit messages as Conventional Commits (
fix: handle an empty version.yml). - Start the PR title with the same type (
fix:,feat:,docs:). The maintainer squashes the PR when merging and rewrites the title into the project format. That title decides the next version, so sayfeat!:only if existing users' settings or CLI arguments stop working.
- Work on a branch named
YYYYMMDD_#<issue number>_<short title>(the issue helper bot posts the exact name in your issue). developcollects finished work.mainis the release branch and is only updated by release PRs.- Open your PR against
develop. - Commit message format:
<issue title> : <type> : <what changed> <issue URL>typeis one offeat,fix,docs,chore,refactor,test.featmakes the next release a minor version,feat!a major one, everything else a patch. Use!only when existing users' settings or CLI arguments stop working.
- Releases go out whenever finished work is on
develop, often several times a day. A stable channel for users who want fewer updates is tracked in #796. - Release PRs are titled
🚀 Deploy <date>-v<version>. To hide them in the PR list, filter withis:pr -head:develop. - This project is actively maintained. Pull requests are reviewed by the code owners listed in
.github/CODEOWNERS.
Before you open a PR:
- There is an issue that describes the change, and the PR links to it.
- Tests pass locally, and you added a test for new behavior or a fixed bug.
- User-facing text is in English and goes through
src/i18n/(CLI) or the English-first docs. Korean goes in thekocatalog. Messages that workflows and scripts post into users' repositories go through.github/scripts/i18n/(see docs/TRANSLATING.md). - If you changed a shared workflow, you changed both copies:
.github/workflows/and.github/workflows/project-types/common/. - Workflows declare
permissions:, and new ones haveworkflow_dispatchandconcurrency.
- Installer (
src/): ES modules, standard library only. Prompts go throughsrc/ui/, messages throughsrc/i18n/. Comments explain why, not what. - Scripts and skills (Python): standard library first. A skill CLI prints JSON and takes its input from arguments or environment variables, never from heredocs or temporary files.
- Workflows: do not rename or delete a shipped workflow without registering it in
src/core/migrations/registry.js, otherwise existing installs keep the old file. - Files that only make sense in this repository must be excluded from user installs in both
src/core/exclusions.jsand.github/scripts/template_initializer.py.
AI tools are welcome. You are responsible for what you submit:
- Read and understand every line before you open the PR, and run the tests yourself.
- Say so in the PR description if an agent wrote a significant part of the change.
- Keep PRs focused. Large generated refactors without a prior issue will be closed.
Every full and workflows run writes a log to .github/.projectops/logs/ (not tracked by git).
Attach the .log file to your issue, after removing anything private.
Please do not open public issues for vulnerabilities. See SECURITY.md.
By contributing you agree that your contributions are licensed under the MIT License.