Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
70bdde2
fix(scripts): ignore fenced blocks in changelog heading scan
Andreas-Garcia Apr 1, 2026
efe706c
Merge pull request #92 from BehindTheMusicTree/release/v2.2.3
Andreas-Garcia Apr 1, 2026
26f2c34
Merge remote-tracking branch 'origin/develop' into fix/prepare-releas…
Andreas-Garcia Apr 1, 2026
8856323
docs(readme): add ecosystem portfolio links
Andreas-Garcia Apr 1, 2026
d07bcba
docs(readme): align ecosystem intro wording with frontend
Andreas-Garcia Apr 1, 2026
7fa7687
docs: update PR description guidelines and clarify draft document loc…
Andreas-Garcia Apr 1, 2026
74423c6
Merge pull request #93 from BehindTheMusicTree/docs/readme-ecosystem-…
Andreas-Garcia Apr 1, 2026
cce3a00
docs(readme): fix GrowTheMusicTree repo link
Andreas-Garcia Apr 5, 2026
2f2a12d
docs(vision): fix GrowTheMusicTree repo link to grow-the-music-tree-f…
Copilot Apr 5, 2026
29a0e08
docs: align Git Flow branch rules across CONTRIBUTING, CI, and Cursor
Andreas-Garcia Apr 5, 2026
ef73775
Merge pull request #94 from BehindTheMusicTree/docs/readme-grow-the-m…
Andreas-Garcia Apr 5, 2026
7ff3021
Merge branch 'develop' into chore/align-gitflow-docs-ci-cursor-rules
Andreas-Garcia Apr 5, 2026
558e4ca
Merge pull request #95 from BehindTheMusicTree/chore/align-gitflow-do…
Andreas-Garcia Apr 5, 2026
ec01f4c
feat: metadata session accepts unified field ids and exposes schema
Andreas-Garcia Apr 5, 2026
01485b3
chore: update CHANGELOG and refine metadata handling in serializers
Andreas-Garcia Apr 6, 2026
44adc68
chore: update CHANGELOG and refine metadata handling to use unified f…
Andreas-Garcia Apr 7, 2026
aeaaa3c
chore: update CHANGELOG and refactor audio metadata handling
Andreas-Garcia Apr 8, 2026
00c7213
ci: pin python-project-standards reusable to v1.0.0
Andreas-Garcia Apr 9, 2026
99cfc5f
chore(ci): bump STANDARDS_VERSION to 2.0.0
Andreas-Garcia Apr 9, 2026
aa752ce
chore(ci): bump python-project-standards to v2.1.0
Andreas-Garcia Apr 9, 2026
e805828
chore(ci): bump python-project-standards to v2.2.0
Andreas-Garcia Apr 9, 2026
a475e12
chore(ci): bump python-project-standards to v2.3.0
Andreas-Garcia Apr 9, 2026
2dc3bd5
chore(ci): sync verify-standards from standards v3.0.1
Andreas-Garcia Apr 10, 2026
0bd5b8b
chore: update project configuration and documentation for Python stan…
Andreas-Garcia Apr 11, 2026
ecaaeb0
chore(dev): setup-dev-tools script and .venv standardization
Andreas-Garcia Apr 11, 2026
1770c3c
fix(pre-commit): update tool version mismatch message for clarity
Andreas-Garcia Apr 11, 2026
251a2fc
fix(release): type _fail as NoReturn in prepare_release_bump
Copilot Apr 11, 2026
6d1e3d9
fix(test): add bash shebang for shellcheck on commands.sh
Andreas-Garcia Apr 11, 2026
8dcd5ea
chore: normalize shell script EOF newlines
Andreas-Garcia Apr 11, 2026
e84e050
chore(ci): align baselines with python-project-standards v4.1.0
Andreas-Garcia Apr 11, 2026
6d6fc06
chore(ci): add tag release workflow and v4.2.0 standards sync
Andreas-Garcia Apr 12, 2026
a8774ce
chore(lint): use StrEnum, fix schema assert, rename test folder
Andreas-Garcia Apr 12, 2026
9e4b86b
chore: sync workspace, format, and add mypy baseline
Andreas-Garcia Apr 12, 2026
6a9f4b5
chore: fix ruff lint and drop conflicting isort pre-commit hook
Andreas-Garcia Apr 12, 2026
e182d71
chore: align python-project-standards v4.3.0
Andreas-Garcia Apr 12, 2026
ce23039
chore: align python-project-standards v4.3.1
Andreas-Garcia Apr 12, 2026
26e2f42
chore(ruff): ignore PLC0415 under api/** via per-file-ignores
Andreas-Garcia Apr 12, 2026
e4ba9ef
style(docs): format markdown with prettier
Andreas-Garcia Apr 12, 2026
fb46795
fix(test): ruff fixes, subprocess check, and Path.iterdir in tests
Andreas-Garcia Apr 12, 2026
2a024ca
fix(api): ruff fixes for models and migrations
Andreas-Garcia Apr 12, 2026
98b7897
fix(api): ruff fixes for serializers, fields, filtering, and validation
Andreas-Garcia Apr 12, 2026
d028fe5
fix(api): ruff for views, middleware, settings, utils, and scripts
Andreas-Garcia Apr 12, 2026
e5f86e1
chore(workflow): update mypy CI configuration with environment variab…
Andreas-Garcia Apr 13, 2026
cdceee1
Merge pull request #96 from BehindTheMusicTree/chore/strenum-lint-ci-…
Andreas-Garcia Apr 13, 2026
cc55bca
Remove metadata session API (moved to audiometa-api)
Andreas-Garcia Apr 19, 2026
e4b77d6
Remove full metadata endpoint (moved to audiometa-api)
Andreas-Garcia Apr 19, 2026
b454b24
ci: pin python-project-standards reusable to v1.0.0
Andreas-Garcia Apr 9, 2026
fe0e1b7
chore(ci): bump STANDARDS_VERSION to 2.0.0
Andreas-Garcia Apr 9, 2026
cd1f240
chore(ci): bump python-project-standards to v2.1.0
Andreas-Garcia Apr 9, 2026
1328125
chore(ci): bump python-project-standards to v2.2.0
Andreas-Garcia Apr 9, 2026
01acc34
chore(ci): bump python-project-standards to v2.3.0
Andreas-Garcia Apr 9, 2026
ce06b0e
chore(ci): sync verify-standards from standards v3.0.1
Andreas-Garcia Apr 10, 2026
c21f84b
chore: update project configuration and documentation for Python stan…
Andreas-Garcia Apr 11, 2026
113cd26
chore(dev): setup-dev-tools script and .venv standardization
Andreas-Garcia Apr 11, 2026
d2a1b0c
fix(pre-commit): update tool version mismatch message for clarity
Andreas-Garcia Apr 11, 2026
460b615
fix(release): type _fail as NoReturn in prepare_release_bump
Copilot Apr 11, 2026
3b68b9f
fix(test): add bash shebang for shellcheck on commands.sh
Andreas-Garcia Apr 11, 2026
c136ae8
chore: normalize shell script EOF newlines
Andreas-Garcia Apr 11, 2026
e5e1a76
chore(ci): align baselines with python-project-standards v4.1.0
Andreas-Garcia Apr 11, 2026
2c900a5
chore(ci): add tag release workflow and v4.2.0 standards sync
Andreas-Garcia Apr 12, 2026
c73b6cd
chore(lint): use StrEnum, fix schema assert, rename test folder
Andreas-Garcia Apr 12, 2026
f84b3ef
chore: sync workspace, format, and add mypy baseline
Andreas-Garcia Apr 12, 2026
667b8ed
chore: fix ruff lint and drop conflicting isort pre-commit hook
Andreas-Garcia Apr 12, 2026
51061ae
chore: align python-project-standards v4.3.0
Andreas-Garcia Apr 12, 2026
b2bb24b
chore: align python-project-standards v4.3.1
Andreas-Garcia Apr 12, 2026
b106a0c
chore(ruff): ignore PLC0415 under api/** via per-file-ignores
Andreas-Garcia Apr 12, 2026
f069698
style(docs): format markdown with prettier
Andreas-Garcia Apr 12, 2026
4c92908
fix(test): ruff fixes, subprocess check, and Path.iterdir in tests
Andreas-Garcia Apr 12, 2026
d85990a
fix(api): ruff fixes for models and migrations
Andreas-Garcia Apr 12, 2026
f3b7c0b
fix(api): ruff fixes for serializers, fields, filtering, and validation
Andreas-Garcia Apr 12, 2026
f68b503
fix(api): ruff for views, middleware, settings, utils, and scripts
Andreas-Garcia Apr 12, 2026
04267a1
chore(workflow): update mypy CI configuration with environment variab…
Andreas-Garcia Apr 13, 2026
2bd21cd
chore(workflow): rename VPS_IP to SERVER_HOST in actionlint and sync-…
Andreas-Garcia Apr 20, 2026
20c768f
refactor(api): streamline environment variable loading and remove dep…
Andreas-Garcia Apr 20, 2026
72f456b
chore(workflow): update DB app naming variables to use DB_APP_NAME_SU…
Andreas-Garcia Apr 28, 2026
7b9516e
chore(workflow): enforce strict environment contract in sync-env-to-s…
Andreas-Garcia Apr 28, 2026
4ff2443
chore(workflow): require explicit runtime path keys in setup-filesyst…
Andreas-Garcia Apr 28, 2026
41c6ccf
chore(workflow): adjust required environment variables in setup-files…
Andreas-Garcia Apr 28, 2026
2ea02dd
chore(workflow): refine environment variable handling in sync-env-to-…
Andreas-Garcia Apr 28, 2026
d3efcc7
chore(workflow): simplify libraries directory handling and update rel…
Andreas-Garcia Apr 28, 2026
f3b9dc3
chore(workflow): update release-on-tag workflow to prevent GitHub Rel…
Andreas-Garcia Apr 28, 2026
31d0734
chore(changelog): update changelog for Django startup changes and cov…
Andreas-Garcia Apr 28, 2026
1a91d11
chore(changelog): update changelog for added setuptools dependency to…
Andreas-Garcia Apr 28, 2026
2140b23
chore(workflow): remove calculated paths loader and standardize STATI…
Andreas-Garcia Apr 28, 2026
b23ef48
Merge branch 'develop' into feature/unified-metadata-session-patch
Andreas-Garcia Apr 28, 2026
93aa56e
chore(changelog): document CI workflow changes and omit STATIC_FILES …
Andreas-Garcia Apr 28, 2026
035abe5
fix(serializer): restore audio metadata Fields and session download
Andreas-Garcia Apr 29, 2026
4a75d6c
chore(docker): add compose stack and INSTALL_DEV for local dev
Andreas-Garcia Apr 29, 2026
0a5d28d
chore(pre-commit): ease venv guard for Docker-first workflows
Andreas-Garcia Apr 29, 2026
d8b30e4
chore(dev-tools): remove repo-specific Python environment assumptions
Andreas-Garcia Apr 29, 2026
cd98212
docs(workflow): make Python tooling guidance environment-agnostic
Andreas-Garcia Apr 29, 2026
1fe5cb2
fix(api): restore metadata_session utilities
Andreas-Garcia Apr 29, 2026
87c91a9
chore(scripts): use root .env for host tooling env loading
Andreas-Garcia Apr 29, 2026
fdfb606
fix(utils): use shutil.move for flac md5 cross-device
Andreas-Garcia Apr 29, 2026
673d6f9
chore(docker): share uploads volume with afp and default optional flags
Andreas-Garcia Apr 29, 2026
6f6413f
chore(changelog): update entries for host tooling env source and meta…
Andreas-Garcia Apr 30, 2026
19498f7
chore(pre-commit): implement Docker-backed git hook and update setup …
Andreas-Garcia Apr 30, 2026
aec1933
Merge pull request #97 from BehindTheMusicTree/feature/unified-metada…
Andreas-Garcia Apr 30, 2026
1b66dc2
chore(env): remove LIBRARIES_DIR_NAME and update related configurations
Andreas-Garcia Apr 30, 2026
11fd2a8
Merge pull request #98 from BehindTheMusicTree/chore/use-libraries-di…
Andreas-Garcia Apr 30, 2026
72dcdab
chore(release): drop venv requirement from prepare_release_bump
Andreas-Garcia Apr 30, 2026
5513859
chore(release): replace bump2version with bump-my-version
Andreas-Garcia Apr 30, 2026
6cef783
style(scripts): ruff-format prepare_release_bump message string
Andreas-Garcia Apr 30, 2026
908b542
Revert "style(scripts): ruff-format prepare_release_bump message string"
Andreas-Garcia Apr 30, 2026
cd23a49
style(scripts): ruff-format prepare_release_bump message string
Andreas-Garcia Apr 30, 2026
17ad9e6
fix(githooks): fall back to host pre-commit when api down
Andreas-Garcia Apr 30, 2026
db407ec
revert(githooks): require Docker api for pre-commit (no host fallback)
Andreas-Garcia Apr 30, 2026
136639f
Merge pull request #99 from BehindTheMusicTree/chore/release-script-d…
Andreas-Garcia Apr 30, 2026
0fce6d7
chore(release): prepare release v2.2.4
Andreas-Garcia Apr 30, 2026
95c6ccb
Merge branch 'main' into release/v2.2.4
Andreas-Garcia Apr 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
22 changes: 0 additions & 22 deletions .bumpversion.cfg

This file was deleted.

16 changes: 16 additions & 0 deletions .cursor/rules/changelog-alignment.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
description: Substantive changes must update CHANGELOG.md [Unreleased] in the same work
alwaysApply: true
---

# Changelog alignment

When you **modify this repository** in a way that is **not purely trivial** (anything a maintainer or consumer would care about: behavior, public API of scripts, templates, CI, pins, baselines, docs that describe shipped behavior, or release/version flow):

1. **Update `CHANGELOG.md` in the same change** under **`## [Unreleased]`**, using the same categories as the rest of the file (`Added`, `Changed`, `Fixed`, etc.). Summarize what changed and why in plain language; link paths or script names when helpful.
2. **Keep it accurate**: If you touch **`STANDARDS_VERSION`**, template pins, **`templates/`**, **`scripts/`** consumed by adopters, or **`.github/workflows`**, the changelog entry should reflect that so releases and migration notes stay truthful.
3. **Do not ship substantive edits without a matching `[Unreleased]` line** unless the user explicitly asked to skip the changelog (rare).

**Exempt (no changelog line required):** typo-only fixes in comments, formatting-only edits with no semantic change, or purely mechanical refactors explicitly scoped as “no changelog” by the user.

If you are **aligning another repo** to these standards, that consumer’s **`CHANGELOG.md`** (or their agreed release notes) should be updated there—not only the standards repo—when your work there is user-visible.
6 changes: 3 additions & 3 deletions .cursor/rules/changelog-best-practices.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# Changelog Best Practices
Expand Down Expand Up @@ -139,7 +139,7 @@ Documentation changes should be grouped under the **Documentation** category, no

## Release Process

Follow **CONTRIBUTING.md §7 (Releasing for maintainers)** (Git Flow: `release/*` branch). Maintainers **must run** **`python3 scripts/prepare_release_bump.py`** `patch`|`minor`|`major` before creating/pushing a `release/*` branch. The script applies the `## [Unreleased] <!-- release -->` marker (see `.bumpversion.cfg`), runs **bump2version**, **`scripts/fix_changelog_after_bump.py`**, and inserts an empty `## [Unreleased]` for the next cycle. Contributors use plain `## [Unreleased]` until the maintainer runs the script.
Follow **CONTRIBUTING.md §7 (Releasing for maintainers)** (Git Flow: `release/*` branch). Maintainers **must run** **`python3 scripts/prepare_release_bump.py`** `patch`|`minor`|`major` before creating/pushing a `release/*` branch. The script applies the `## [Unreleased] <!-- release -->` marker (see `[tool.bumpversion]` in `pyproject.toml`), runs **bump-my-version**, **`scripts/fix_changelog_after_bump.py`**, and inserts an empty `## [Unreleased]` for the next cycle. Contributors use plain `## [Unreleased]` until the maintainer runs the script.

During releases, maintainers also:
1. Review and consolidate entries moved under the new version
Expand Down
4 changes: 2 additions & 2 deletions .cursor/rules/comments.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# No Useless Comments
Expand Down
4 changes: 2 additions & 2 deletions .cursor/rules/commit-message-convention.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# Commit Message Convention
Expand Down
6 changes: 3 additions & 3 deletions .cursor/rules/divide-test-cases.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# Divide Test Cases
Expand Down Expand Up @@ -87,4 +87,4 @@ def test_invalid_input_then_error(self):
- Easier test maintenance
- Better test readability
- Faster test execution (can run specific scenarios)
- Easier to debug failures
- Easier to debug failures
4 changes: 2 additions & 2 deletions .cursor/rules/field-name-constants.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---

Expand Down
8 changes: 4 additions & 4 deletions .cursor/rules/focused-tests.mdc
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
---
description:
globs:
description:
globs:
alwaysApply: true
---
# Divide Test Cases
Expand Down
12 changes: 10 additions & 2 deletions .cursor/rules/git-flow-workflow.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# Git Flow Workflow
Expand All @@ -22,6 +22,14 @@ This project follows **strict Git Flow**. All changes must follow the branching
2. Include issue numbers when applicable: `feature/123-add-ogg-support`
3. Be descriptive: `feature/improve-genre-classification`, not `feature/fix`

## Pull Requests to `develop` (enforced in CI)

Allowed **source branch** prefixes only: `feature/`, `chore/`, `dependabot/`, `release/`.

Classic Git Flow uses **`feature/*`** to integrate features and fixes into `develop`. This repository also allows **`chore/*`** (maintenance, documentation, CI), **`dependabot/*`**, and **`release/*`** when merging release work back into `develop`.

Do **not** use other top-level prefixes (e.g. `docs/`, `fix/`, `refactor/`) for the branch name — CI will fail. Use `feature/<topic>` or `chore/<topic>` instead.

## Important Rules

- **No direct commits** to `main` or `develop` - all changes must go through Pull Requests
Expand Down
4 changes: 2 additions & 2 deletions .cursor/rules/issue-description-in-separate-file.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# Issue Description in Separate File
Expand Down
4 changes: 2 additions & 2 deletions .cursor/rules/issue-template-usage.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# Issue Template Usage
Expand Down
6 changes: 3 additions & 3 deletions .cursor/rules/no-useless-comments.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# No Useless Comments
Expand All @@ -21,4 +21,4 @@ Bad comments:
- "Verify Metal branch" (redundant with code)
- "Check root" (obvious from code)
- "Get the genre" (redundant with method name)
- "Loop through items" (obvious from code)
- "Loop through items" (obvious from code)
4 changes: 2 additions & 2 deletions .cursor/rules/one-class-per-file.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# One Class Per File
Expand Down
14 changes: 8 additions & 6 deletions .cursor/rules/pr-description-in-separate-file.mdc
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
---
description:
globs:
description: PR descriptions must be written to .github/pr-descriptions/ as the primary deliverable
globs:
alwaysApply: true
---
# PR Description in Separate File

When creating Pull Requests, always provide the PR description in a separate markdown file located in `.github/pr-descriptions/` directory, rather than writing it directly in the PR body. This directory is git-ignored to keep draft descriptions out of version control.
When creating Pull Requests **or when the user asks for a PR description** (including phrases like "PR description", "pr desc", "draft PR", or "PR body"), **write the full description to a new markdown file** under `.github/pr-descriptions/` as the primary deliverable. Do not satisfy the request with only chat text: create or update the file, then you may briefly confirm the path in the reply.

When creating the GitHub PR, copy the body from that file and set the PR title from the file header (see **PR Title Required** below). This directory is git-ignored to keep draft descriptions out of version control.

## File Naming Convention

Expand All @@ -21,7 +23,7 @@ When a PR description file is provided, **the PR title must be present** in that

## File Structure

Each PR description file should follow the structure from `.github/pull_request_template.md`:
Each PR description file should follow the structure from `.github/pr-descriptions/pull_request_template.md`:

- **PR Title** (required) — imperative, concise; e.g. `# PR Description: one-time scripts and migration 0011 fix` or `## PR Title` / `feat(scripts): add one-time DB rename script`
- Description
Expand All @@ -37,11 +39,11 @@ Each PR description file should follow the structure from `.github/pull_request_

## Usage

1. Create the PR description file in `.github/pr-descriptions/` with a descriptive name
1. Create the PR description file in `.github/pr-descriptions/` with a descriptive kebab-case name (e.g. match the branch topic)
2. **Include the PR title** at the top of the file (required when a PR description is provided)
3. Write the full PR description in that file following the PR template structure
4. When creating the GitHub PR, set the PR title from the file and copy the body content
5. The file remains local and git-ignored (not committed to version control)
5. The file remains local and git-ignored (not committed to version control); see root `.gitignore` under “Draft documents” for any negated paths

## Benefits

Expand Down
17 changes: 9 additions & 8 deletions .cursor/rules/pre-pr-checklist.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# Pre-PR Checklist
Expand All @@ -16,10 +16,11 @@ Before submitting a Pull Request, ensure all checks are completed. This checklis
- ✅ One class per file (see `one-class-per-file.mdc`)
- ✅ Use field name constants from `Fields.py` files (see `field-name-constants.mdc`)
- ✅ Private resource filtering includes user in query (see `private-resource-filtering.mdc`)
- ✅ String enums use `StrEnum`, not `(str, Enum)` (see `.cursor/rules/strenum-string-enums.mdc`, [python-project-standards development baseline](https://github.com/BehindTheMusicTree/python-project-standards/blob/main/docs/development.md) → [string enums](https://github.com/BehindTheMusicTree/python-project-standards/blob/main/docs/string-enums.md), `scripts/check_prefer_strenum.py`, pre-commit / CI `pre-commit` job)

## Tests

- ✅ All tests pass: `pytest`
- ✅ All tests pass: `docker compose exec api pytest` (or `pytest` after `python -m pip install -e ".[dev]"` on your machine)
- ✅ New features have corresponding tests
- ✅ Bug fixes include regression tests
- ✅ Tests follow naming convention: `test_{scenario}_then_{expected_result}` (see `test-naming-convention.mdc`)
Expand All @@ -37,19 +38,19 @@ Before submitting a Pull Request, ensure all checks are completed. This checklis
## Git Hygiene

- ✅ Commit messages follow the commit message convention (see `commit-message-convention.mdc`)
- ✅ Branch is up to date with target branch (`develop` for features, `main` for hotfixes)
- ✅ Branch follows naming convention (`feature/`, `chore/`, `hotfix/`, `release/`)
- ✅ Branch is up to date with target branch (`develop` for `feature/*`, `chore/*`, `dependabot/*`, `release/*`; `main` for `hotfix/*`, `release/*`)
- ✅ Branch follows naming convention for PRs to `develop`: `feature/`, `chore/`, `dependabot/`, `release/`; for PRs to `main`: `hotfix/`, `release/` (see `git-flow-workflow.mdc` and CONTRIBUTING.md **Branch Protection**)
- ✅ No accidental commits (large files, secrets, personal configs)

## Branch Target

- ✅ Feature branches target `develop` branch
- ✅ `feature/*`, `chore/*`, `dependabot/*`, and `release/*` (when merging into `develop`) target the `develop` branch
- ✅ Hotfix branches target `main` branch
- ✅ Release branches target both `main` and `develop` (maintainers only)

## Quick Pre-PR Command

```bash
# Run all checks at once
pytest && git status
# Run all checks at once (Docker dev stack)
docker compose exec api pytest && git status
```
4 changes: 2 additions & 2 deletions .cursor/rules/private-resource-filtering.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# Private Resource Filtering
Expand Down
9 changes: 5 additions & 4 deletions .cursor/rules/pull-request-convention.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# Pull Request Title Convention
Expand Down Expand Up @@ -29,11 +29,12 @@ PR titles must follow the same format as commit messages: `<type>(<optional-scop

## Branch Prefixes vs PR Title Types

Branch prefixes (`feature/`, `chore/`, `hotfix/`) differ from PR title types:
Branch names use Git Flow prefixes; PR titles use Conventional Commits types — they are not the same. Allowed source branches for PRs to `develop` are `feature/`, `chore/`, `dependabot/`, and `release/` only (no `docs/`, `fix/`, etc.); see `git-flow-workflow.mdc`.

- Branch `feature/add-flac-support` → PR title: `feat: add flac support` (use `feat`, not `feature`)
- Branch `chore/update-dependencies` → PR title: `chore: update dependencies` (use `chore`)
- Branch `hotfix/critical-bug` → PR title: `fix: critical bug` (use `fix`, not `hotfix`)
- Dependabot branches keep the `dependabot/` prefix; PR title is usually left as the bot generated or adjusted per review

## GitHub Auto-Suggested Titles

Expand All @@ -55,6 +56,6 @@ Branch prefixes (`feature/`, `chore/`, `hotfix/`) differ from PR title types:

## Target Branch

- Feature branches target `develop`
- `feature/*`, `chore/*`, `dependabot/*`, and `release/*` (into `develop`) target `develop`
- Hotfix branches target `main`
- Release branches target both `main` and `develop` (maintainers only)
14 changes: 14 additions & 0 deletions .cursor/rules/strenum-string-enums.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
alwaysApply: true
---

# String enumerations (`StrEnum`)

For enumerations whose members are **strings** (API keys, serializer field keys, error codes, filter keys, etc.), subclass **`enum.StrEnum`**. Do **not** use **`class Foo(str, Enum)`**.

- Policy and examples: [docs/string-enums.md](https://github.com/BehindTheMusicTree/python-project-standards/blob/main/docs/string-enums.md)
- Org doc hub: [docs/development.md](https://github.com/BehindTheMusicTree/python-project-standards/blob/main/docs/development.md)

If a call site requires a built-in `str` (e.g. `type(x) is str` instead of `isinstance`), pass **`str(member)`**.

Ruff **UP042** (`replace-str-enum`) enforces this when **`UP`** is in `select` and `target-version` is 3.11+. Optional: **`prefer-strenum`** / `scripts/check_prefer_strenum.py` as an extra guardrail.
4 changes: 2 additions & 2 deletions .cursor/rules/test-naming-convention.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# Test Naming Convention
Expand Down
6 changes: 3 additions & 3 deletions .cursor/rules/test-structure.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# Test Structure
Expand Down Expand Up @@ -47,7 +47,7 @@ def test_invalid_input_then_error(self):
tree_data = [{"name": "", "children": []}]
response = self._post_genres_tree_import(tree_data)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) # Bad

# Test duplicate name - should be separate test
tree_data = [{"name": "Rock", "children": []}, {"name": "Rock", "children": []}]
response = self._post_genres_tree_import(tree_data)
Expand Down
4 changes: 2 additions & 2 deletions .cursor/rules/use-assert-not-assertequal.mdc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
# Use assert Instead of assertEqual
Expand Down
12 changes: 6 additions & 6 deletions .cursor/rules/use-custome-validation-exception.mdc
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
---
description:
globs:
description:
globs:
alwaysApply: true
---
---
description:
globs:
description:
globs:
alwaysApply: true
---
# Use AppValidationException Instead of DRF Validation
Expand All @@ -30,7 +30,7 @@ def validate_genre_name(self, name: str, user: User) -> None:
message="Genre name cannot be empty",
field_validation_error_code=FieldValidationErrorCode.BLANK
)

if Genre.objects.filter(user=user, name=name).exists():
raise AppValidationException(
field_name=Fields.NAME,
Expand All @@ -51,7 +51,7 @@ def validate_genre(self, data: dict, user: User) -> None:
"message": "Genre cannot be its own parent",
"code": FieldValidationErrorCode.SELF_REFERENCE
}

if errors:
raise AppValidationException(
field_name=",".join(errors.keys()),
Expand Down
Loading
Loading