This document describes the development workflow, branching strategy, and CI/CD pipeline for the awesome-mcp project.
We use a trunk-based + tag-driven model with two environments:
main ← trunk (auto-deploys to dev on every push)
└── feature/xyz ← your work (CI only, no deploy)
└── fix/some-bug
v* tags on main ← prod deploys (tag-triggered, CI-gated)
| Branch / Tag | Who can push | Protected | Deploys to |
|---|---|---|---|
main |
Merge via PR only | ✅ | Dev |
feature/*, fix/*, chore/* |
Author | ❌ | Nothing |
v* tags |
Admins via create-tag workflow |
✅ (tag ruleset) | Prod |
git checkout main
git pull origin main
git checkout -b feature/my-feature-nameBranch naming:
feature/— new functionalityfix/— bug fixeschore/— maintenance, deps, tooling
<type>(optional scope): <short description>
feat: add OAuth token refresh
fix(auth): handle expired session tokens correctly
chore: upgrade @railway/cli to v3
docs: clarify setup steps in README
Allowed types: feat, fix, docs, style, refactor, perf, test, chore, ci, revert
Include CU-<taskId> anywhere in the commit message (subject or body) to link commits to ClickUp tasks. The task ID is the alphanumeric ID from the ClickUp URL (e.g., app.clickup.com/t/86c9abc).
feat(dashboard): add connection status badges CU-86c9abc
fix(auth): handle expired tokens
Fixes the session timeout issue reported in CU-abc1234.
Also addresses CU-def5678.
Multiple CU- references per commit are supported. These are automatically parsed by the release notes workflow to enrich changelogs with ClickUp task titles and links.
git push origin feature/my-feature-nameThen open a PR targeting main. The CI pipeline runs lint, typecheck, tests, and build. All checks must be green. At least 1 approval is required.
Once your PR merges to main, CI passes, then the Deploy → Dev workflow fires automatically. Verify your change in the dev environment.
When ready, run Create Tag (CI-gated) from the Actions tab with a v* tag (e.g., v1.0.0) pointing to main. The workflow verifies CI passed, creates the tag, which triggers the prod deploy and release notes generation.
⚠️ Never push directly tomain.
- Lint → Type check → Tests → Build (parallel)
- On
mainpush: triggers dev deploy
- Deploys to Railway dev environment via reusable
deploy.yml - Posts result to Slack
- Deploys to Railway production environment
- Posts result to Slack
- Collects commits between tags, resolves ClickUp task titles
- Posts release notes to Slack
- Updates
/updatespage (commits to repo) - Sends email notification to all users
- Validates CI passed on the target commit
- Creates and pushes the tag
- Validates PR title follows Conventional Commits
- Warns if PR changes more than 1000 lines
| Secret | Scope | Description |
|---|---|---|
RAILWAY_TOKEN |
dev, prod environments | Railway API token |
SLACK_WEBHOOK_URL |
all environments | Slack webhook for notifications |
CLICKUP_API_TOKEN |
repository | ClickUp API token for release notes |
INTERNAL_API_KEY |
repository | Shared secret for internal API endpoint |
| Variable | Scope | Example |
|---|---|---|
RAILWAY_SERVICES |
dev, prod environments | awesome-mcp |
APP_URL |
dev, prod environments | https://awesome-mcp-dev.up.railway.app |
npm install # install dependencies
npm test # run tests
npm run lint # lint
npm run typecheck # type check
npm run build # buildTests use the placeholder in src/__tests__/ — add real tests alongside your code.
- Open a GitHub Discussion for questions
- Tag
@evgenor@peterin your PR for a review