{"owner":"opf","repo":"openproject","hasSkills":true,"totalSkillsCount":6,"totalTokensCount":4535,"categories":["root-instruction","claude-rule","copilot-instructions","mcp-config","marketplace","plugin-manifest"],"hasMcp":true,"mcpConfig":{"mcpServers":{"openproject":{"command":"npx","args":["-y","@modelcontextprotocol/server-openproject"]}}},"found":["AGENTS.md","CLAUDE.md",".github/copilot-instructions.md",".cursor/mcp.json",".claude-plugin/marketplace.json",".claude-plugin/plugin.json"],"skills":{"AGENTS.md":"# OpenProject AI Coding Agent Instructions\n\n> **Note for developers**: You can create `AGENTS.local.md` (or `CLAUDE.local.md`) in this directory to add your own custom instructions or preferences for AI coding agents. These files are git-ignored and will not be committed to the repository.\n\n## Repository Overview\n\n**OpenProject** is a web-based, open-source project management software written in Ruby on Rails with PostgreSQL for data persistence.\n\n- **Size**: Large monorepo (~840MB, ~1M+ lines of code)\n- **Backend**: Ruby 4.0.7, Rails ~8.1.3\n- **Frontend**: Node.js 24.x (>= 24.15.0), npm 11.x, TypeScript\n- **Database**: PostgreSQL (required)\n- **Architecture**: Server-rendered HTML with Hotwire (Turbo + Stimulus). Legacy Angular components exist and are being migrated to custom elements. Uses GitHub's Primer Design System via ViewComponent.\n- **Editions**: Community, Enterprise (SSO, LDAP, SCIM), and BIM (construction industry, code in `modules/bim/`)\n\n## Critical Setup Requirements\n\n**ALWAYS verify versions before building:**\n- Ruby: `4.0.7` (see `.ruby-version`)\n- Node: `^24.15.0` (see `package.json` engines)\n- Bundler: `4.0.21` (see `BUNDLED WITH` in `Gemfile.lock`)\n\n### Local Development Setup\n\n```bash\nbundle install                    # Install Ruby gems\nnpm ci --ignore-scripts           # Install root Node packages (JSON linting)\ncd frontend && npm ci && cd ..   # Install Node packages\nbundle exec rails db:migrate      # Setup database\nbin/dev                          # Start all services (Rails, frontend, Good Job worker)\n# Access at http://localhost:3000\n```\n\n### Docker Development Setup\n\nSee [`docker/dev/AGENTS.md`](docker/dev/AGENTS.md) for full Docker setup and commands.\n\n## Project Structure\n\n### Key Directories\n\n- `app/` — Rails application code\n- `config/` — Rails configuration, routes, locales\n- `db/` — Database migrations and seeds\n- `docker/dev/` — Docker development environment\n- `frontend/` — TypeScript/Angular/Stimulus frontend\n- `lib/` — Ruby libraries and extensions\n- `lookbook/` — ViewComponent previews (<https://qa.openproject-edge.com/lookbook/>)\n- `modules/` — OpenProject plugin modules\n- `spec/` — RSpec test suite\n\n### Configuration Files\n\n- `.ruby-version` - Ruby version\n- `.rubocop.yml` - Ruby linting rules\n- `.erb_lint.yml` - ERB template linting\n- `frontend/eslint.config.mjs` - JavaScript/TypeScript linting\n- `Gemfile` - Ruby dependencies\n- `package.json` / `frontend/package.json` - Node.js dependencies\n- `lefthook.yml` - Git hooks configuration\n\n### Linting (Run Before Committing)\n\n```bash\n# Ruby\nbundle exec rubocop                              # Check all files\nbin/dirty-rubocop --uncommitted                  # Check only uncommitted changes\n\n# JavaScript/TypeScript\ncd frontend && npx eslint src/ && cd ..\ncd frontend && npm run typecheck && cd ..        # Typecheck application and spec sources\n\n# ERB Templates\nerb_lint {files}\n\n# Install Git Hooks (recommended)\nbundle exec lefthook install\n```\n\n### JavaScript and TypeScript Copyright Headers\n\nAll first-party JavaScript and TypeScript files must use the canonical compact\nline-comment copyright header generated from `COPYRIGHT_short`:\n\n```typescript\n//-- copyright\n// OpenProject is an open source project management software.\n// ...\n//++\n\n```\n\nUse `//-- copyright` and `//++` exactly as shown. Prefix non-empty body lines\nwith `// `, prefix empty body lines with `//`, and leave one blank line between\nthe header and the source code. Do not compose or reformat the header manually.\n\nRun `rake copyright:update_typescript` to add or repair headers in `.ts` and\n`.tsx` files. Run `rake copyright:update_js` for `.js`, `.mjs`, and `.cjs`\nfiles. Both commands accept an optional path argument.\n\n## Code Comments\n\nReaders are domain experts who know Ruby, Rails, TypeScript, and the patterns used here.\nWrite self-explanatory code instead of comments.\n\n- Default to zero comments. Sparse is the goal, not thorough coverage.\n- Never restate what the code plainly does (`# increments the counter` above `counter += 1`).\n  These get flagged in review.\n- Never justify the chosen approach. If a comment names a rejected alternative\n  (\"EXISTS rather than a join because…\"), delete it — that reasoning belongs in the commit\n  message or PR description, not the source.\n- Do comment to explain a constraint the code cannot express itself: a workaround for an\n  upstream bug, a non-obvious edge case, an ordering requirement, an invariant the caller\n  must uphold. Link the work package or upstream issue when there is one.\n- Don't add YARD/JSDoc headers to self-descriptive methods. Only where generated\n  documentation is actually consumed.\n- More than a handful of comments in a file is a smell: extract better-named methods,\n  variables, and objects so the code explains itself.\n- When in doubt, delete the comment rather than shortening it.\n\n## Commit Messages\n- First line: < 72 characters, then blank line, then detailed description\n- Reference work packages when applicable\n- Merge strategy: \"Merge pull request\" (not squash), except single-commit PRs can use \"Rebase and merge\"\n\n## Additional Documentation\n\n- `docs/development/` — Development documentation\n- `docs/development/running-tests/` — Testing guide\n- `docs/development/code-review-guidelines/` — Code review standards\n- `CONTRIBUTING.md` — Contribution workflow\n- `.github/copilot-instructions.md` — Extended agent instructions with troubleshooting\n","CLAUDE.md":"# OpenProject AI Coding Agent Instructions\n\n> **Note for developers**: You can create `AGENTS.local.md` (or `CLAUDE.local.md`) in this directory to add your own custom instructions or preferences for AI coding agents. These files are git-ignored and will not be committed to the repository.\n\n## Repository Overview\n\n**OpenProject** is a web-based, open-source project management software written in Ruby on Rails with PostgreSQL for data persistence.\n\n- **Size**: Large monorepo (~840MB, ~1M+ lines of code)\n- **Backend**: Ruby 4.0.7, Rails ~8.1.3\n- **Frontend**: Node.js 24.x (>= 24.15.0), npm 11.x, TypeScript\n- **Database**: PostgreSQL (required)\n- **Architecture**: Server-rendered HTML with Hotwire (Turbo + Stimulus). Legacy Angular components exist and are being migrated to custom elements. Uses GitHub's Primer Design System via ViewComponent.\n- **Editions**: Community, Enterprise (SSO, LDAP, SCIM), and BIM (construction industry, code in `modules/bim/`)\n\n## Critical Setup Requirements\n\n**ALWAYS verify versions before building:**\n- Ruby: `4.0.7` (see `.ruby-version`)\n- Node: `^24.15.0` (see `package.json` engines)\n- Bundler: `4.0.21` (see `BUNDLED WITH` in `Gemfile.lock`)\n\n### Local Development Setup\n\n```bash\nbundle install                    # Install Ruby gems\nnpm ci --ignore-scripts           # Install root Node packages (JSON linting)\ncd frontend && npm ci && cd ..   # Install Node packages\nbundle exec rails db:migrate      # Setup database\nbin/dev                          # Start all services (Rails, frontend, Good Job worker)\n# Access at http://localhost:3000\n```\n\n### Docker Development Setup\n\nSee [`docker/dev/AGENTS.md`](docker/dev/AGENTS.md) for full Docker setup and commands.\n\n## Project Structure\n\n### Key Directories\n\n- `app/` — Rails application code\n- `config/` — Rails configuration, routes, locales\n- `db/` — Database migrations and seeds\n- `docker/dev/` — Docker development environment\n- `frontend/` — TypeScript/Angular/Stimulus frontend\n- `lib/` — Ruby libraries and extensions\n- `lookbook/` — ViewComponent previews (<https://qa.openproject-edge.com/lookbook/>)\n- `modules/` — OpenProject plugin modules\n- `spec/` — RSpec test suite\n\n### Configuration Files\n\n- `.ruby-version` - Ruby version\n- `.rubocop.yml` - Ruby linting rules\n- `.erb_lint.yml` - ERB template linting\n- `frontend/eslint.config.mjs` - JavaScript/TypeScript linting\n- `Gemfile` - Ruby dependencies\n- `package.json` / `frontend/package.json` - Node.js dependencies\n- `lefthook.yml` - Git hooks configuration\n\n### Linting (Run Before Committing)\n\n```bash\n# Ruby\nbundle exec rubocop                              # Check all files\nbin/dirty-rubocop --uncommitted                  # Check only uncommitted changes\n\n# JavaScript/TypeScript\ncd frontend && npx eslint src/ && cd ..\ncd frontend && npm run typecheck && cd ..        # Typecheck application and spec sources\n\n# ERB Templates\nerb_lint {files}\n\n# Install Git Hooks (recommended)\nbundle exec lefthook install\n```\n\n### JavaScript and TypeScript Copyright Headers\n\nAll first-party JavaScript and TypeScript files must use the canonical compact\nline-comment copyright header generated from `COPYRIGHT_short`:\n\n```typescript\n//-- copyright\n// OpenProject is an open source project management software.\n// ...\n//++\n\n```\n\nUse `//-- copyright` and `//++` exactly as shown. Prefix non-empty body lines\nwith `// `, prefix empty body lines with `//`, and leave one blank line between\nthe header and the source code. Do not compose or reformat the header manually.\n\nRun `rake copyright:update_typescript` to add or repair headers in `.ts` and\n`.tsx` files. Run `rake copyright:update_js` for `.js`, `.mjs`, and `.cjs`\nfiles. Both commands accept an optional path argument.\n\n## Code Comments\n\nReaders are domain experts who know Ruby, Rails, TypeScript, and the patterns used here.\nWrite self-explanatory code instead of comments.\n\n- Default to zero comments. Sparse is the goal, not thorough coverage.\n- Never restate what the code plainly does (`# increments the counter` above `counter += 1`).\n  These get flagged in review.\n- Never justify the chosen approach. If a comment names a rejected alternative\n  (\"EXISTS rather than a join because…\"), delete it — that reasoning belongs in the commit\n  message or PR description, not the source.\n- Do comment to explain a constraint the code cannot express itself: a workaround for an\n  upstream bug, a non-obvious edge case, an ordering requirement, an invariant the caller\n  must uphold. Link the work package or upstream issue when there is one.\n- Don't add YARD/JSDoc headers to self-descriptive methods. Only where generated\n  documentation is actually consumed.\n- More than a handful of comments in a file is a smell: extract better-named methods,\n  variables, and objects so the code explains itself.\n- When in doubt, delete the comment rather than shortening it.\n\n## Commit Messages\n- First line: < 72 characters, then blank line, then detailed description\n- Reference work packages when applicable\n- Merge strategy: \"Merge pull request\" (not squash), except single-commit PRs can use \"Rebase and merge\"\n\n## Additional Documentation\n\n- `docs/development/` — Development documentation\n- `docs/development/running-tests/` — Testing guide\n- `docs/development/code-review-guidelines/` — Code review standards\n- `CONTRIBUTING.md` — Contribution workflow\n- `.github/copilot-instructions.md` — Extended agent instructions with troubleshooting\n",".github/copilot-instructions.md":"# OpenProject Coding Agent Instructions\n\nSee [AGENTS.md](../AGENTS.md) for all agent instructions.\n\n## Additional Context for GitHub Copilot\n\n### Common Issues and Workarounds\n\n#### Database Configuration\n- **Issue**: Docker fails with \"database.yml exists\"\n- **Fix**: Delete or rename `config/database.yml` when using Docker\n\n#### Memory Issues in Docker\n- **Issue**: Frontend container exits with status 137\n- **Fix**: Increase Docker memory limit to at least 4GB\n\n#### Test Failures on CI but Passing Locally\n- Run with `CI=true` environment variable (eager loads app)\n- Check for `OPENPROJECT_*` environment variables\n- Match the random seed: `bundle exec rspec --seed 18352`\n- Use `--bisect` to find order-dependent failures\n- View browser tests with `OPENPROJECT_TESTING_NO_HEADLESS=1`\n\n#### Frontend Build Issues\n- **Issue**: \"jQuery not defined\", frontend asset errors, or blank page\n- **Fix**: Run `bin/setup_dev` to rebuild frontend completely\n\n#### Parallel Test Failures\n- Tests run in parallel on CI with different random seeds per group\n- Check `tmp/parallel_runtime.log` for execution times\n- **Flaky specs**: Some tests may fail randomly; see [`docs/development/testing/handling-flaky-tests/README.md`](../docs/development/testing/handling-flaky-tests/README.md) for the full playbook, including the Turbo-aware waiting helpers and a pattern→fix table for feature specs\n  - Use `script/bulk_run_rspec` to run tests multiple times to identify flaky behavior\n\n### Extended Details\n\n#### Service Objects and Result Modeling\n- Return results using the `ServiceResult` class (well-documented in codebase)\n- Some services use monads via [dry-monads](https://github.com/dry-rb/dry-monads) for result modeling\n\n#### Testing with Capybara\n- Feature specs use Capybara (with Cuprite and Selenium WebDriver)\n- Feature specs can use A11y selectors ([capybara_accessible_selectors](https://github.com/citizensadvice/capybara_accessible_selectors)), test IDs, or page objects (in `spec/support/pages/`)\n\n#### Database Migrations\n- OpenProject implements migration \"squashing\" between major releases\n- See `docs/development/migrations/` for details on the squashing process\n- Migrations are consolidated to manage database changes across major versions\n- OpenProject does not currently aim for zero downtime migrations\n\n#### Design System Components\n- [primer_view_components](https://github.com/opf/primer_view_components) - OpenProject's fork of Primer Rails/ViewComponent\n- [openproject-octicons](https://github.com/opf/openproject-octicons) - OpenProject's fork of Primer Octicons\n- [commonmark-ckeditor-build](https://github.com/opf/commonmark-ckeditor-build) - Custom CKEditor build with CommonMark Markdown support\n\n#### Enterprise and BIM Editions\n- **Enterprise Edition**: Includes additional features like Single sign-on (OIDC & SAML), LDAP, Nextcloud integration, SCIM API, and more (requires token for development)\n- **BIM Edition**: Tailored for construction industry needs. Code in `modules/bim/`, docs in `docs/bim-guide/`. Existing instances can be switched to BIM edition.\n\n#### GitHub Actions CI/CD\n- **test-core.yml** - Main test suite (units + features, ~40 min, runs on all PRs)\n- **rubocop-core.yml** - Ruby linting (runs on all PRs with Ruby changes)\n- **eslint-core.yml** - JS/TS linting (runs on all PRs with JS/TS changes)\n- **test-frontend-unit.yml** - Frontend unit tests\n- **brakeman-scan-core.yml** - Security scanning\n- **codeql-scan-core.yml** - Code quality/security analysis\n- **Skip CI**: Add `[ci skip]` to commit message to skip CI (use sparingly)\n\n#### Performance Considerations\n- Main test suite: 40 minutes timeout\n- Full Docker build: ~10-15 minutes (first time)\n- Bundle install: ~2-5 minutes\n- npm install: ~3-7 minutes\n\n### Additional Commands\n\n```bash\n# Database\nbundle exec rake db:migrate:status       # Check migration status\n\n# Frontend\nbundle exec rails openproject:plugins:register_frontend assets:export_locales\n\n# Docker\nbin/compose run                          # Run with backend in foreground\ndocker compose run --rm backend-test \"bundle exec rspec spec/features/work_package_show_spec.rb\"\n```\n\nFor detailed documentation, consult:\n- `docs/development/` - Development documentation\n- `docs/development/running-tests/` - Testing guide\n- `docs/development/code-review-guidelines/` - Code review standards\n- `CONTRIBUTING.md` - Contribution workflow\n",".cursor/mcp.json":"# Model Context Protocol (MCP) Configuration\n\nPath: `.cursor/mcp.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/opf/openproject/HEAD/.cursor/mcp.json)",".claude-plugin/marketplace.json":"# Claude Plugin Marketplace Catalog\n\nPath: `.claude-plugin/marketplace.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/opf/openproject/HEAD/.claude-plugin/marketplace.json)",".claude-plugin/plugin.json":"# claude-plugin Plugin Manifest\n\nPath: `.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/opf/openproject/HEAD/.claude-plugin/plugin.json)"},"files":{"AGENTS.md":"# OpenProject AI Coding Agent Instructions\n\n> **Note for developers**: You can create `AGENTS.local.md` (or `CLAUDE.local.md`) in this directory to add your own custom instructions or preferences for AI coding agents. These files are git-ignored and will not be committed to the repository.\n\n## Repository Overview\n\n**OpenProject** is a web-based, open-source project management software written in Ruby on Rails with PostgreSQL for data persistence.\n\n- **Size**: Large monorepo (~840MB, ~1M+ lines of code)\n- **Backend**: Ruby 4.0.7, Rails ~8.1.3\n- **Frontend**: Node.js 24.x (>= 24.15.0), npm 11.x, TypeScript\n- **Database**: PostgreSQL (required)\n- **Architecture**: Server-rendered HTML with Hotwire (Turbo + Stimulus). Legacy Angular components exist and are being migrated to custom elements. Uses GitHub's Primer Design System via ViewComponent.\n- **Editions**: Community, Enterprise (SSO, LDAP, SCIM), and BIM (construction industry, code in `modules/bim/`)\n\n## Critical Setup Requirements\n\n**ALWAYS verify versions before building:**\n- Ruby: `4.0.7` (see `.ruby-version`)\n- Node: `^24.15.0` (see `package.json` engines)\n- Bundler: `4.0.21` (see `BUNDLED WITH` in `Gemfile.lock`)\n\n### Local Development Setup\n\n```bash\nbundle install                    # Install Ruby gems\nnpm ci --ignore-scripts           # Install root Node packages (JSON linting)\ncd frontend && npm ci && cd ..   # Install Node packages\nbundle exec rails db:migrate      # Setup database\nbin/dev                          # Start all services (Rails, frontend, Good Job worker)\n# Access at http://localhost:3000\n```\n\n### Docker Development Setup\n\nSee [`docker/dev/AGENTS.md`](docker/dev/AGENTS.md) for full Docker setup and commands.\n\n## Project Structure\n\n### Key Directories\n\n- `app/` — Rails application code\n- `config/` — Rails configuration, routes, locales\n- `db/` — Database migrations and seeds\n- `docker/dev/` — Docker development environment\n- `frontend/` — TypeScript/Angular/Stimulus frontend\n- `lib/` — Ruby libraries and extensions\n- `lookbook/` — ViewComponent previews (<https://qa.openproject-edge.com/lookbook/>)\n- `modules/` — OpenProject plugin modules\n- `spec/` — RSpec test suite\n\n### Configuration Files\n\n- `.ruby-version` - Ruby version\n- `.rubocop.yml` - Ruby linting rules\n- `.erb_lint.yml` - ERB template linting\n- `frontend/eslint.config.mjs` - JavaScript/TypeScript linting\n- `Gemfile` - Ruby dependencies\n- `package.json` / `frontend/package.json` - Node.js dependencies\n- `lefthook.yml` - Git hooks configuration\n\n### Linting (Run Before Committing)\n\n```bash\n# Ruby\nbundle exec rubocop                              # Check all files\nbin/dirty-rubocop --uncommitted                  # Check only uncommitted changes\n\n# JavaScript/TypeScript\ncd frontend && npx eslint src/ && cd ..\ncd frontend && npm run typecheck && cd ..        # Typecheck application and spec sources\n\n# ERB Templates\nerb_lint {files}\n\n# Install Git Hooks (recommended)\nbundle exec lefthook install\n```\n\n### JavaScript and TypeScript Copyright Headers\n\nAll first-party JavaScript and TypeScript files must use the canonical compact\nline-comment copyright header generated from `COPYRIGHT_short`:\n\n```typescript\n//-- copyright\n// OpenProject is an open source project management software.\n// ...\n//++\n\n```\n\nUse `//-- copyright` and `//++` exactly as shown. Prefix non-empty body lines\nwith `// `, prefix empty body lines with `//`, and leave one blank line between\nthe header and the source code. Do not compose or reformat the header manually.\n\nRun `rake copyright:update_typescript` to add or repair headers in `.ts` and\n`.tsx` files. Run `rake copyright:update_js` for `.js`, `.mjs`, and `.cjs`\nfiles. Both commands accept an optional path argument.\n\n## Code Comments\n\nReaders are domain experts who know Ruby, Rails, TypeScript, and the patterns used here.\nWrite self-explanatory code instead of comments.\n\n- Default to zero comments. Sparse is the goal, not thorough coverage.\n- Never restate what the code plainly does (`# increments the counter` above `counter += 1`).\n  These get flagged in review.\n- Never justify the chosen approach. If a comment names a rejected alternative\n  (\"EXISTS rather than a join because…\"), delete it — that reasoning belongs in the commit\n  message or PR description, not the source.\n- Do comment to explain a constraint the code cannot express itself: a workaround for an\n  upstream bug, a non-obvious edge case, an ordering requirement, an invariant the caller\n  must uphold. Link the work package or upstream issue when there is one.\n- Don't add YARD/JSDoc headers to self-descriptive methods. Only where generated\n  documentation is actually consumed.\n- More than a handful of comments in a file is a smell: extract better-named methods,\n  variables, and objects so the code explains itself.\n- When in doubt, delete the comment rather than shortening it.\n\n## Commit Messages\n- First line: < 72 characters, then blank line, then detailed description\n- Reference work packages when applicable\n- Merge strategy: \"Merge pull request\" (not squash), except single-commit PRs can use \"Rebase and merge\"\n\n## Additional Documentation\n\n- `docs/development/` — Development documentation\n- `docs/development/running-tests/` — Testing guide\n- `docs/development/code-review-guidelines/` — Code review standards\n- `CONTRIBUTING.md` — Contribution workflow\n- `.github/copilot-instructions.md` — Extended agent instructions with troubleshooting\n","CLAUDE.md":"# OpenProject AI Coding Agent Instructions\n\n> **Note for developers**: You can create `AGENTS.local.md` (or `CLAUDE.local.md`) in this directory to add your own custom instructions or preferences for AI coding agents. These files are git-ignored and will not be committed to the repository.\n\n## Repository Overview\n\n**OpenProject** is a web-based, open-source project management software written in Ruby on Rails with PostgreSQL for data persistence.\n\n- **Size**: Large monorepo (~840MB, ~1M+ lines of code)\n- **Backend**: Ruby 4.0.7, Rails ~8.1.3\n- **Frontend**: Node.js 24.x (>= 24.15.0), npm 11.x, TypeScript\n- **Database**: PostgreSQL (required)\n- **Architecture**: Server-rendered HTML with Hotwire (Turbo + Stimulus). Legacy Angular components exist and are being migrated to custom elements. Uses GitHub's Primer Design System via ViewComponent.\n- **Editions**: Community, Enterprise (SSO, LDAP, SCIM), and BIM (construction industry, code in `modules/bim/`)\n\n## Critical Setup Requirements\n\n**ALWAYS verify versions before building:**\n- Ruby: `4.0.7` (see `.ruby-version`)\n- Node: `^24.15.0` (see `package.json` engines)\n- Bundler: `4.0.21` (see `BUNDLED WITH` in `Gemfile.lock`)\n\n### Local Development Setup\n\n```bash\nbundle install                    # Install Ruby gems\nnpm ci --ignore-scripts           # Install root Node packages (JSON linting)\ncd frontend && npm ci && cd ..   # Install Node packages\nbundle exec rails db:migrate      # Setup database\nbin/dev                          # Start all services (Rails, frontend, Good Job worker)\n# Access at http://localhost:3000\n```\n\n### Docker Development Setup\n\nSee [`docker/dev/AGENTS.md`](docker/dev/AGENTS.md) for full Docker setup and commands.\n\n## Project Structure\n\n### Key Directories\n\n- `app/` — Rails application code\n- `config/` — Rails configuration, routes, locales\n- `db/` — Database migrations and seeds\n- `docker/dev/` — Docker development environment\n- `frontend/` — TypeScript/Angular/Stimulus frontend\n- `lib/` — Ruby libraries and extensions\n- `lookbook/` — ViewComponent previews (<https://qa.openproject-edge.com/lookbook/>)\n- `modules/` — OpenProject plugin modules\n- `spec/` — RSpec test suite\n\n### Configuration Files\n\n- `.ruby-version` - Ruby version\n- `.rubocop.yml` - Ruby linting rules\n- `.erb_lint.yml` - ERB template linting\n- `frontend/eslint.config.mjs` - JavaScript/TypeScript linting\n- `Gemfile` - Ruby dependencies\n- `package.json` / `frontend/package.json` - Node.js dependencies\n- `lefthook.yml` - Git hooks configuration\n\n### Linting (Run Before Committing)\n\n```bash\n# Ruby\nbundle exec rubocop                              # Check all files\nbin/dirty-rubocop --uncommitted                  # Check only uncommitted changes\n\n# JavaScript/TypeScript\ncd frontend && npx eslint src/ && cd ..\ncd frontend && npm run typecheck && cd ..        # Typecheck application and spec sources\n\n# ERB Templates\nerb_lint {files}\n\n# Install Git Hooks (recommended)\nbundle exec lefthook install\n```\n\n### JavaScript and TypeScript Copyright Headers\n\nAll first-party JavaScript and TypeScript files must use the canonical compact\nline-comment copyright header generated from `COPYRIGHT_short`:\n\n```typescript\n//-- copyright\n// OpenProject is an open source project management software.\n// ...\n//++\n\n```\n\nUse `//-- copyright` and `//++` exactly as shown. Prefix non-empty body lines\nwith `// `, prefix empty body lines with `//`, and leave one blank line between\nthe header and the source code. Do not compose or reformat the header manually.\n\nRun `rake copyright:update_typescript` to add or repair headers in `.ts` and\n`.tsx` files. Run `rake copyright:update_js` for `.js`, `.mjs`, and `.cjs`\nfiles. Both commands accept an optional path argument.\n\n## Code Comments\n\nReaders are domain experts who know Ruby, Rails, TypeScript, and the patterns used here.\nWrite self-explanatory code instead of comments.\n\n- Default to zero comments. Sparse is the goal, not thorough coverage.\n- Never restate what the code plainly does (`# increments the counter` above `counter += 1`).\n  These get flagged in review.\n- Never justify the chosen approach. If a comment names a rejected alternative\n  (\"EXISTS rather than a join because…\"), delete it — that reasoning belongs in the commit\n  message or PR description, not the source.\n- Do comment to explain a constraint the code cannot express itself: a workaround for an\n  upstream bug, a non-obvious edge case, an ordering requirement, an invariant the caller\n  must uphold. Link the work package or upstream issue when there is one.\n- Don't add YARD/JSDoc headers to self-descriptive methods. Only where generated\n  documentation is actually consumed.\n- More than a handful of comments in a file is a smell: extract better-named methods,\n  variables, and objects so the code explains itself.\n- When in doubt, delete the comment rather than shortening it.\n\n## Commit Messages\n- First line: < 72 characters, then blank line, then detailed description\n- Reference work packages when applicable\n- Merge strategy: \"Merge pull request\" (not squash), except single-commit PRs can use \"Rebase and merge\"\n\n## Additional Documentation\n\n- `docs/development/` — Development documentation\n- `docs/development/running-tests/` — Testing guide\n- `docs/development/code-review-guidelines/` — Code review standards\n- `CONTRIBUTING.md` — Contribution workflow\n- `.github/copilot-instructions.md` — Extended agent instructions with troubleshooting\n",".github/copilot-instructions.md":"# OpenProject Coding Agent Instructions\n\nSee [AGENTS.md](../AGENTS.md) for all agent instructions.\n\n## Additional Context for GitHub Copilot\n\n### Common Issues and Workarounds\n\n#### Database Configuration\n- **Issue**: Docker fails with \"database.yml exists\"\n- **Fix**: Delete or rename `config/database.yml` when using Docker\n\n#### Memory Issues in Docker\n- **Issue**: Frontend container exits with status 137\n- **Fix**: Increase Docker memory limit to at least 4GB\n\n#### Test Failures on CI but Passing Locally\n- Run with `CI=true` environment variable (eager loads app)\n- Check for `OPENPROJECT_*` environment variables\n- Match the random seed: `bundle exec rspec --seed 18352`\n- Use `--bisect` to find order-dependent failures\n- View browser tests with `OPENPROJECT_TESTING_NO_HEADLESS=1`\n\n#### Frontend Build Issues\n- **Issue**: \"jQuery not defined\", frontend asset errors, or blank page\n- **Fix**: Run `bin/setup_dev` to rebuild frontend completely\n\n#### Parallel Test Failures\n- Tests run in parallel on CI with different random seeds per group\n- Check `tmp/parallel_runtime.log` for execution times\n- **Flaky specs**: Some tests may fail randomly; see [`docs/development/testing/handling-flaky-tests/README.md`](../docs/development/testing/handling-flaky-tests/README.md) for the full playbook, including the Turbo-aware waiting helpers and a pattern→fix table for feature specs\n  - Use `script/bulk_run_rspec` to run tests multiple times to identify flaky behavior\n\n### Extended Details\n\n#### Service Objects and Result Modeling\n- Return results using the `ServiceResult` class (well-documented in codebase)\n- Some services use monads via [dry-monads](https://github.com/dry-rb/dry-monads) for result modeling\n\n#### Testing with Capybara\n- Feature specs use Capybara (with Cuprite and Selenium WebDriver)\n- Feature specs can use A11y selectors ([capybara_accessible_selectors](https://github.com/citizensadvice/capybara_accessible_selectors)), test IDs, or page objects (in `spec/support/pages/`)\n\n#### Database Migrations\n- OpenProject implements migration \"squashing\" between major releases\n- See `docs/development/migrations/` for details on the squashing process\n- Migrations are consolidated to manage database changes across major versions\n- OpenProject does not currently aim for zero downtime migrations\n\n#### Design System Components\n- [primer_view_components](https://github.com/opf/primer_view_components) - OpenProject's fork of Primer Rails/ViewComponent\n- [openproject-octicons](https://github.com/opf/openproject-octicons) - OpenProject's fork of Primer Octicons\n- [commonmark-ckeditor-build](https://github.com/opf/commonmark-ckeditor-build) - Custom CKEditor build with CommonMark Markdown support\n\n#### Enterprise and BIM Editions\n- **Enterprise Edition**: Includes additional features like Single sign-on (OIDC & SAML), LDAP, Nextcloud integration, SCIM API, and more (requires token for development)\n- **BIM Edition**: Tailored for construction industry needs. Code in `modules/bim/`, docs in `docs/bim-guide/`. Existing instances can be switched to BIM edition.\n\n#### GitHub Actions CI/CD\n- **test-core.yml** - Main test suite (units + features, ~40 min, runs on all PRs)\n- **rubocop-core.yml** - Ruby linting (runs on all PRs with Ruby changes)\n- **eslint-core.yml** - JS/TS linting (runs on all PRs with JS/TS changes)\n- **test-frontend-unit.yml** - Frontend unit tests\n- **brakeman-scan-core.yml** - Security scanning\n- **codeql-scan-core.yml** - Code quality/security analysis\n- **Skip CI**: Add `[ci skip]` to commit message to skip CI (use sparingly)\n\n#### Performance Considerations\n- Main test suite: 40 minutes timeout\n- Full Docker build: ~10-15 minutes (first time)\n- Bundle install: ~2-5 minutes\n- npm install: ~3-7 minutes\n\n### Additional Commands\n\n```bash\n# Database\nbundle exec rake db:migrate:status       # Check migration status\n\n# Frontend\nbundle exec rails openproject:plugins:register_frontend assets:export_locales\n\n# Docker\nbin/compose run                          # Run with backend in foreground\ndocker compose run --rm backend-test \"bundle exec rspec spec/features/work_package_show_spec.rb\"\n```\n\nFor detailed documentation, consult:\n- `docs/development/` - Development documentation\n- `docs/development/running-tests/` - Testing guide\n- `docs/development/code-review-guidelines/` - Code review standards\n- `CONTRIBUTING.md` - Contribution workflow\n",".cursor/mcp.json":"# Model Context Protocol (MCP) Configuration\n\nPath: `.cursor/mcp.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/opf/openproject/HEAD/.cursor/mcp.json)",".claude-plugin/marketplace.json":"# Claude Plugin Marketplace Catalog\n\nPath: `.claude-plugin/marketplace.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/opf/openproject/HEAD/.claude-plugin/marketplace.json)",".claude-plugin/plugin.json":"# claude-plugin Plugin Manifest\n\nPath: `.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/opf/openproject/HEAD/.claude-plugin/plugin.json)"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/opf/openproject/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# OpenProject AI Coding Agent Instructions\n\n> **Note for developers**: You can create `AGENTS.local.md` (or `CLAUDE.local.md`) in this directory to add your own custom instructions or preferences for AI coding agents. These files are git-ignored and will not be committed to the repository.\n\n## Repository Overview\n\n**OpenProject** is a web-based, open-source project management software written in Ruby on Rails with PostgreSQL for data persistence.\n\n- **Size**: Large monorepo (~840MB, ~1M+ lines of code)\n- **Backend**: Ruby 4.0.7, Rails ~8.1.3\n- **Frontend**: Node.js 24.x (>= 24.15.0), npm 11.x, TypeScript\n- **Database**: PostgreSQL (required)\n- **Architecture**: Server-rendered HTML with Hotwire (Turbo + Stimulus). Legacy Angular components exist and are being migrated to custom elements. Uses GitHub's Primer Design System via ViewComponent.\n- **Editions**: Community, Enterprise (SSO, LDAP, SCIM), and BIM (construction industry, code in `modules/bim/`)\n\n## Critical Setup Requirements\n\n**ALWAYS verify versions before building:**\n- Ruby: `4.0.7` (see `.ruby-version`)\n- Node: `^24.15.0` (see `package.json` engines)\n- Bundler: `4.0.21` (see `BUNDLED WITH` in `Gemfile.lock`)\n\n### Local Development Setup\n\n```bash\nbundle install                    # Install Ruby gems\nnpm ci --ignore-scripts           # Install root Node packages (JSON linting)\ncd frontend && npm ci && cd ..   # Install Node packages\nbundle exec rails db:migrate      # Setup database\nbin/dev                          # Start all services (Rails, frontend, Good Job worker)\n# Access at http://localhost:3000\n```\n\n### Docker Development Setup\n\nSee [`docker/dev/AGENTS.md`](docker/dev/AGENTS.md) for full Docker setup and commands.\n\n## Project Structure\n\n### Key Directories\n\n- `app/` — Rails application code\n- `config/` — Rails configuration, routes, locales\n- `db/` — Database migrations and seeds\n- `docker/dev/` — Docker development environment\n- `frontend/` — TypeScript/Angular/Stimulus frontend\n- `lib/` — Ruby libraries and extensions\n- `lookbook/` — ViewComponent previews (<https://qa.openproject-edge.com/lookbook/>)\n- `modules/` — OpenProject plugin modules\n- `spec/` — RSpec test suite\n\n### Configuration Files\n\n- `.ruby-version` - Ruby version\n- `.rubocop.yml` - Ruby linting rules\n- `.erb_lint.yml` - ERB template linting\n- `frontend/eslint.config.mjs` - JavaScript/TypeScript linting\n- `Gemfile` - Ruby dependencies\n- `package.json` / `frontend/package.json` - Node.js dependencies\n- `lefthook.yml` - Git hooks configuration\n\n### Linting (Run Before Committing)\n\n```bash\n# Ruby\nbundle exec rubocop                              # Check all files\nbin/dirty-rubocop --uncommitted                  # Check only uncommitted changes\n\n# JavaScript/TypeScript\ncd frontend && npx eslint src/ && cd ..\ncd frontend && npm run typecheck && cd ..        # Typecheck application and spec sources\n\n# ERB Templates\nerb_lint {files}\n\n# Install Git Hooks (recommended)\nbundle exec lefthook install\n```\n\n### JavaScript and TypeScript Copyright Headers\n\nAll first-party JavaScript and TypeScript files must use the canonical compact\nline-comment copyright header generated from `COPYRIGHT_short`:\n\n```typescript\n//-- copyright\n// OpenProject is an open source project management software.\n// ...\n//++\n\n```\n\nUse `//-- copyright` and `//++` exactly as shown. Prefix non-empty body lines\nwith `// `, prefix empty body lines with `//`, and leave one blank line between\nthe header and the source code. Do not compose or reformat the header manually.\n\nRun `rake copyright:update_typescript` to add or repair headers in `.ts` and\n`.tsx` files. Run `rake copyright:update_js` for `.js`, `.mjs`, and `.cjs`\nfiles. Both commands accept an optional path argument.\n\n## Code Comments\n\nReaders are domain experts who know Ruby, Rails, TypeScript, and the patterns used here.\nWrite self-explanatory code instead of comments.\n\n- Default to zero comments. Sparse is the goal, not thorough coverage.\n- Never restate what the code plainly does (`# increments the counter` above `counter += 1`).\n  These get flagged in review.\n- Never justify the chosen approach. If a comment names a rejected alternative\n  (\"EXISTS rather than a join because…\"), delete it — that reasoning belongs in the commit\n  message or PR description, not the source.\n- Do comment to explain a constraint the code cannot express itself: a workaround for an\n  upstream bug, a non-obvious edge case, an ordering requirement, an invariant the caller\n  must uphold. Link the work package or upstream issue when there is one.\n- Don't add YARD/JSDoc headers to self-descriptive methods. Only where generated\n  documentation is actually consumed.\n- More than a handful of comments in a file is a smell: extract better-named methods,\n  variables, and objects so the code explains itself.\n- When in doubt, delete the comment rather than shortening it.\n\n## Commit Messages\n- First line: < 72 characters, then blank line, then detailed description\n- Reference work packages when applicable\n- Merge strategy: \"Merge pull request\" (not squash), except single-commit PRs can use \"Rebase and merge\"\n\n## Additional Documentation\n\n- `docs/development/` — Development documentation\n- `docs/development/running-tests/` — Testing guide\n- `docs/development/code-review-guidelines/` — Code review standards\n- `CONTRIBUTING.md` — Contribution workflow\n- `.github/copilot-instructions.md` — Extended agent instructions with troubleshooting\n","isInternal":false,"tokens":1295,"sizeBytes":5478},{"name":"CLAUDE.md","path":"CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/opf/openproject/HEAD/CLAUDE.md","title":"Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# OpenProject AI Coding Agent Instructions\n\n> **Note for developers**: You can create `AGENTS.local.md` (or `CLAUDE.local.md`) in this directory to add your own custom instructions or preferences for AI coding agents. These files are git-ignored and will not be committed to the repository.\n\n## Repository Overview\n\n**OpenProject** is a web-based, open-source project management software written in Ruby on Rails with PostgreSQL for data persistence.\n\n- **Size**: Large monorepo (~840MB, ~1M+ lines of code)\n- **Backend**: Ruby 4.0.7, Rails ~8.1.3\n- **Frontend**: Node.js 24.x (>= 24.15.0), npm 11.x, TypeScript\n- **Database**: PostgreSQL (required)\n- **Architecture**: Server-rendered HTML with Hotwire (Turbo + Stimulus). Legacy Angular components exist and are being migrated to custom elements. Uses GitHub's Primer Design System via ViewComponent.\n- **Editions**: Community, Enterprise (SSO, LDAP, SCIM), and BIM (construction industry, code in `modules/bim/`)\n\n## Critical Setup Requirements\n\n**ALWAYS verify versions before building:**\n- Ruby: `4.0.7` (see `.ruby-version`)\n- Node: `^24.15.0` (see `package.json` engines)\n- Bundler: `4.0.21` (see `BUNDLED WITH` in `Gemfile.lock`)\n\n### Local Development Setup\n\n```bash\nbundle install                    # Install Ruby gems\nnpm ci --ignore-scripts           # Install root Node packages (JSON linting)\ncd frontend && npm ci && cd ..   # Install Node packages\nbundle exec rails db:migrate      # Setup database\nbin/dev                          # Start all services (Rails, frontend, Good Job worker)\n# Access at http://localhost:3000\n```\n\n### Docker Development Setup\n\nSee [`docker/dev/AGENTS.md`](docker/dev/AGENTS.md) for full Docker setup and commands.\n\n## Project Structure\n\n### Key Directories\n\n- `app/` — Rails application code\n- `config/` — Rails configuration, routes, locales\n- `db/` — Database migrations and seeds\n- `docker/dev/` — Docker development environment\n- `frontend/` — TypeScript/Angular/Stimulus frontend\n- `lib/` — Ruby libraries and extensions\n- `lookbook/` — ViewComponent previews (<https://qa.openproject-edge.com/lookbook/>)\n- `modules/` — OpenProject plugin modules\n- `spec/` — RSpec test suite\n\n### Configuration Files\n\n- `.ruby-version` - Ruby version\n- `.rubocop.yml` - Ruby linting rules\n- `.erb_lint.yml` - ERB template linting\n- `frontend/eslint.config.mjs` - JavaScript/TypeScript linting\n- `Gemfile` - Ruby dependencies\n- `package.json` / `frontend/package.json` - Node.js dependencies\n- `lefthook.yml` - Git hooks configuration\n\n### Linting (Run Before Committing)\n\n```bash\n# Ruby\nbundle exec rubocop                              # Check all files\nbin/dirty-rubocop --uncommitted                  # Check only uncommitted changes\n\n# JavaScript/TypeScript\ncd frontend && npx eslint src/ && cd ..\ncd frontend && npm run typecheck && cd ..        # Typecheck application and spec sources\n\n# ERB Templates\nerb_lint {files}\n\n# Install Git Hooks (recommended)\nbundle exec lefthook install\n```\n\n### JavaScript and TypeScript Copyright Headers\n\nAll first-party JavaScript and TypeScript files must use the canonical compact\nline-comment copyright header generated from `COPYRIGHT_short`:\n\n```typescript\n//-- copyright\n// OpenProject is an open source project management software.\n// ...\n//++\n\n```\n\nUse `//-- copyright` and `//++` exactly as shown. Prefix non-empty body lines\nwith `// `, prefix empty body lines with `//`, and leave one blank line between\nthe header and the source code. Do not compose or reformat the header manually.\n\nRun `rake copyright:update_typescript` to add or repair headers in `.ts` and\n`.tsx` files. Run `rake copyright:update_js` for `.js`, `.mjs`, and `.cjs`\nfiles. Both commands accept an optional path argument.\n\n## Code Comments\n\nReaders are domain experts who know Ruby, Rails, TypeScript, and the patterns used here.\nWrite self-explanatory code instead of comments.\n\n- Default to zero comments. Sparse is the goal, not thorough coverage.\n- Never restate what the code plainly does (`# increments the counter` above `counter += 1`).\n  These get flagged in review.\n- Never justify the chosen approach. If a comment names a rejected alternative\n  (\"EXISTS rather than a join because…\"), delete it — that reasoning belongs in the commit\n  message or PR description, not the source.\n- Do comment to explain a constraint the code cannot express itself: a workaround for an\n  upstream bug, a non-obvious edge case, an ordering requirement, an invariant the caller\n  must uphold. Link the work package or upstream issue when there is one.\n- Don't add YARD/JSDoc headers to self-descriptive methods. Only where generated\n  documentation is actually consumed.\n- More than a handful of comments in a file is a smell: extract better-named methods,\n  variables, and objects so the code explains itself.\n- When in doubt, delete the comment rather than shortening it.\n\n## Commit Messages\n- First line: < 72 characters, then blank line, then detailed description\n- Reference work packages when applicable\n- Merge strategy: \"Merge pull request\" (not squash), except single-commit PRs can use \"Rebase and merge\"\n\n## Additional Documentation\n\n- `docs/development/` — Development documentation\n- `docs/development/running-tests/` — Testing guide\n- `docs/development/code-review-guidelines/` — Code review standards\n- `CONTRIBUTING.md` — Contribution workflow\n- `.github/copilot-instructions.md` — Extended agent instructions with troubleshooting\n","isInternal":false,"tokens":1295,"sizeBytes":5478},{"name":"copilot-instructions.md","path":".github/copilot-instructions.md","rawUrl":"https://raw.githubusercontent.com/opf/openproject/HEAD/.github/copilot-instructions.md","title":"GitHub Copilot Instructions","category":"copilot-instructions","format":"markdown","content":"# OpenProject Coding Agent Instructions\n\nSee [AGENTS.md](../AGENTS.md) for all agent instructions.\n\n## Additional Context for GitHub Copilot\n\n### Common Issues and Workarounds\n\n#### Database Configuration\n- **Issue**: Docker fails with \"database.yml exists\"\n- **Fix**: Delete or rename `config/database.yml` when using Docker\n\n#### Memory Issues in Docker\n- **Issue**: Frontend container exits with status 137\n- **Fix**: Increase Docker memory limit to at least 4GB\n\n#### Test Failures on CI but Passing Locally\n- Run with `CI=true` environment variable (eager loads app)\n- Check for `OPENPROJECT_*` environment variables\n- Match the random seed: `bundle exec rspec --seed 18352`\n- Use `--bisect` to find order-dependent failures\n- View browser tests with `OPENPROJECT_TESTING_NO_HEADLESS=1`\n\n#### Frontend Build Issues\n- **Issue**: \"jQuery not defined\", frontend asset errors, or blank page\n- **Fix**: Run `bin/setup_dev` to rebuild frontend completely\n\n#### Parallel Test Failures\n- Tests run in parallel on CI with different random seeds per group\n- Check `tmp/parallel_runtime.log` for execution times\n- **Flaky specs**: Some tests may fail randomly; see [`docs/development/testing/handling-flaky-tests/README.md`](../docs/development/testing/handling-flaky-tests/README.md) for the full playbook, including the Turbo-aware waiting helpers and a pattern→fix table for feature specs\n  - Use `script/bulk_run_rspec` to run tests multiple times to identify flaky behavior\n\n### Extended Details\n\n#### Service Objects and Result Modeling\n- Return results using the `ServiceResult` class (well-documented in codebase)\n- Some services use monads via [dry-monads](https://github.com/dry-rb/dry-monads) for result modeling\n\n#### Testing with Capybara\n- Feature specs use Capybara (with Cuprite and Selenium WebDriver)\n- Feature specs can use A11y selectors ([capybara_accessible_selectors](https://github.com/citizensadvice/capybara_accessible_selectors)), test IDs, or page objects (in `spec/support/pages/`)\n\n#### Database Migrations\n- OpenProject implements migration \"squashing\" between major releases\n- See `docs/development/migrations/` for details on the squashing process\n- Migrations are consolidated to manage database changes across major versions\n- OpenProject does not currently aim for zero downtime migrations\n\n#### Design System Components\n- [primer_view_components](https://github.com/opf/primer_view_components) - OpenProject's fork of Primer Rails/ViewComponent\n- [openproject-octicons](https://github.com/opf/openproject-octicons) - OpenProject's fork of Primer Octicons\n- [commonmark-ckeditor-build](https://github.com/opf/commonmark-ckeditor-build) - Custom CKEditor build with CommonMark Markdown support\n\n#### Enterprise and BIM Editions\n- **Enterprise Edition**: Includes additional features like Single sign-on (OIDC & SAML), LDAP, Nextcloud integration, SCIM API, and more (requires token for development)\n- **BIM Edition**: Tailored for construction industry needs. Code in `modules/bim/`, docs in `docs/bim-guide/`. Existing instances can be switched to BIM edition.\n\n#### GitHub Actions CI/CD\n- **test-core.yml** - Main test suite (units + features, ~40 min, runs on all PRs)\n- **rubocop-core.yml** - Ruby linting (runs on all PRs with Ruby changes)\n- **eslint-core.yml** - JS/TS linting (runs on all PRs with JS/TS changes)\n- **test-frontend-unit.yml** - Frontend unit tests\n- **brakeman-scan-core.yml** - Security scanning\n- **codeql-scan-core.yml** - Code quality/security analysis\n- **Skip CI**: Add `[ci skip]` to commit message to skip CI (use sparingly)\n\n#### Performance Considerations\n- Main test suite: 40 minutes timeout\n- Full Docker build: ~10-15 minutes (first time)\n- Bundle install: ~2-5 minutes\n- npm install: ~3-7 minutes\n\n### Additional Commands\n\n```bash\n# Database\nbundle exec rake db:migrate:status       # Check migration status\n\n# Frontend\nbundle exec rails openproject:plugins:register_frontend assets:export_locales\n\n# Docker\nbin/compose run                          # Run with backend in foreground\ndocker compose run --rm backend-test \"bundle exec rspec spec/features/work_package_show_spec.rb\"\n```\n\nFor detailed documentation, consult:\n- `docs/development/` - Development documentation\n- `docs/development/running-tests/` - Testing guide\n- `docs/development/code-review-guidelines/` - Code review standards\n- `CONTRIBUTING.md` - Contribution workflow\n","isInternal":false,"tokens":1045,"sizeBytes":4406},{"name":"marketplace.json","path":".claude-plugin/marketplace.json","rawUrl":"https://raw.githubusercontent.com/opf/openproject/HEAD/.claude-plugin/marketplace.json","title":"Claude Plugin Marketplace Catalog","category":"marketplace","format":"json","content":"# Claude Plugin Marketplace Catalog\n\nPath: `.claude-plugin/marketplace.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/opf/openproject/HEAD/.claude-plugin/marketplace.json)","tokens":300,"sizeBytes":194},{"name":"plugin.json","path":".claude-plugin/plugin.json","rawUrl":"https://raw.githubusercontent.com/opf/openproject/HEAD/.claude-plugin/plugin.json","title":"claude-plugin Plugin Manifest","category":"plugin-manifest","format":"json","content":"# claude-plugin Plugin Manifest\n\nPath: `.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/opf/openproject/HEAD/.claude-plugin/plugin.json)","tokens":300,"sizeBytes":180},{"name":"mcp.json","path":".cursor/mcp.json","rawUrl":"https://raw.githubusercontent.com/opf/openproject/HEAD/.cursor/mcp.json","title":"Model Context Protocol (MCP) Configuration","category":"mcp-config","format":"json","content":"# Model Context Protocol (MCP) Configuration\n\nPath: `.cursor/mcp.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/opf/openproject/HEAD/.cursor/mcp.json)","tokens":300,"sizeBytes":173}],"systemPromptSnippet":"<yakaai_skills repo=\"opf/openproject\">\n<!-- File: AGENTS.md (Tokens: ~1295 | Category: root-instruction) -->\n# OpenProject AI Coding Agent Instructions\n\n> **Note for developers**: You can create `AGENTS.local.md` (or `CLAUDE.local.md`) in this directory to add your own custom instructions or preferences for AI coding agents. These files are git-ignored and will not be committed to the repository.\n\n## Repository Overview\n\n**OpenProject** is a web-based, open-source project management software written in Ruby on Rails with PostgreSQL for data persistence.\n\n- **Size**: Large monorepo (~840MB, ~1M+ lines of code)\n- **Backend**: Ruby 4.0.7, Rails ~8.1.3\n- **Frontend**: Node.js 24.x (>= 24.15.0), npm 11.x, TypeScript\n- **Database**: PostgreSQL (required)\n- **Architecture**: Server-rendered HTML with Hotwire (Turbo + Stimulus). Legacy Angular components exist and are being migrated to custom elements. Uses GitHub's Primer Design System via ViewComponent.\n- **Editions**: Community, Enterprise (SSO, LDAP, SCIM), and BIM (construction industry, code in `modules/bim/`)\n\n## Critical Setup Requirements\n\n**ALWAYS verify versions before building:**\n- Ruby: `4.0.7` (see `.ruby-version`)\n- Node: `^24.15.0` (see `package.json` engines)\n- Bundler: `4.0.21` (see `BUNDLED WITH` in `Gemfile.lock`)\n\n### Local Development Setup\n\n```bash\nbundle install                    # Install Ruby gems\nnpm ci --ignore-scripts           # Install root Node packages (JSON linting)\ncd frontend && npm ci && cd ..   # Install Node packages\nbundle exec rails db:migrate      # Setup database\nbin/dev                          # Start all services (Rails, frontend, Good Job worker)\n# Access at http://localhost:3000\n```\n\n### Docker Development Setup\n\nSee [`docker/dev/AGENTS.md`](docker/dev/AGENTS.md) for full Docker setup and commands.\n\n## Project Structure\n\n### Key Directories\n\n- `app/` — Rails application code\n- `config/` — Rails configuration, routes, locales\n- `db/` — Database migrations and seeds\n- `docker/dev/` — Docker development environment\n- `frontend/` — TypeScript/Angular/Stimulus frontend\n- `lib/` — Ruby libraries and extensions\n- `lookbook/` — ViewComponent previews (<https://qa.openproject-edge.com/lookbook/>)\n- `modules/` — OpenProject plugin modules\n- `spec/` — RSpec test suite\n\n### Configuration Files\n\n- `.ruby-version` - Ruby version\n- `.rubocop.yml` - Ruby linting rules\n- `.erb_lint.yml` - ERB template linting\n- `frontend/eslint.config.mjs` - JavaScript/TypeScript linting\n- `Gemfile` - Ruby dependencies\n- `package.json` / `frontend/package.json` - Node.js dependencies\n- `lefthook.yml` - Git hooks configuration\n\n### Linting (Run Before Committing)\n\n```bash\n# Ruby\nbundle exec rubocop                              # Check all files\nbin/dirty-rubocop --uncommitted                  # Check only uncommitted changes\n\n# JavaScript/TypeScript\ncd frontend && npx eslint src/ && cd ..\ncd frontend && npm run typecheck && cd ..        # Typecheck application and spec sources\n\n# ERB Templates\nerb_lint {files}\n\n# Install Git Hooks (recommended)\nbundle exec lefthook install\n```\n\n### JavaScript and TypeScript Copyright Headers\n\nAll first-party JavaScript and TypeScript files must use the canonical compact\nline-comment copyright header generated from `COPYRIGHT_short`:\n\n```typescript\n//-- copyright\n// OpenProject is an open source project management software.\n// ...\n//++\n\n```\n\nUse `//-- copyright` and `//++` exactly as shown. Prefix non-empty body lines\nwith `// `, prefix empty body lines with `//`, and leave one blank line between\nthe header and the source code. Do not compose or reformat the header manually.\n\nRun `rake copyright:update_typescript` to add or repair headers in `.ts` and\n`.tsx` files. Run `rake copyright:update_js` for `.js`, `.mjs`, and `.cjs`\nfiles. Both commands accept an optional path argument.\n\n## Code Comments\n\nReaders are domain experts who know Ruby, Rails, TypeScript, and the patterns used here.\nWrite self-explanatory code instead of comments.\n\n- Default to zero comments. Sparse is the goal, not thorough coverage.\n- Never restate what the code plainly does (`# increments the counter` above `counter += 1`).\n  These get flagged in review.\n- Never justify the chosen approach. If a comment names a rejected alternative\n  (\"EXISTS rather than a join because…\"), delete it — that reasoning belongs in the commit\n  message or PR description, not the source.\n- Do comment to explain a constraint the code cannot express itself: a workaround for an\n  upstream bug, a non-obvious edge case, an ordering requirement, an invariant the caller\n  must uphold. Link the work package or upstream issue when there is one.\n- Don't add YARD/JSDoc headers to self-descriptive methods. Only where generated\n  documentation is actually consumed.\n- More than a handful of comments in a file is a smell: extract better-named methods,\n  variables, and objects so the code explains itself.\n- When in doubt, delete the comment rather than shortening it.\n\n## Commit Messages\n- First line: < 72 characters, then blank line, then detailed description\n- Reference work packages when applicable\n- Merge strategy: \"Merge pull request\" (not squash), except single-commit PRs can use \"Rebase and merge\"\n\n## Additional Documentation\n\n- `docs/development/` — Development documentation\n- `docs/development/running-tests/` — Testing guide\n- `docs/development/code-review-guidelines/` — Code review standards\n- `CONTRIBUTING.md` — Contribution workflow\n- `.github/copilot-instructions.md` — Extended agent instructions with troubleshooting\n\n<!-- File: CLAUDE.md (Tokens: ~1295 | Category: claude-rule) -->\n# OpenProject AI Coding Agent Instructions\n\n> **Note for developers**: You can create `AGENTS.local.md` (or `CLAUDE.local.md`) in this directory to add your own custom instructions or preferences for AI coding agents. These files are git-ignored and will not be committed to the repository.\n\n## Repository Overview\n\n**OpenProject** is a web-based, open-source project management software written in Ruby on Rails with PostgreSQL for data persistence.\n\n- **Size**: Large monorepo (~840MB, ~1M+ lines of code)\n- **Backend**: Ruby 4.0.7, Rails ~8.1.3\n- **Frontend**: Node.js 24.x (>= 24.15.0), npm 11.x, TypeScript\n- **Database**: PostgreSQL (required)\n- **Architecture**: Server-rendered HTML with Hotwire (Turbo + Stimulus). Legacy Angular components exist and are being migrated to custom elements. Uses GitHub's Primer Design System via ViewComponent.\n- **Editions**: Community, Enterprise (SSO, LDAP, SCIM), and BIM (construction industry, code in `modules/bim/`)\n\n## Critical Setup Requirements\n\n**ALWAYS verify versions before building:**\n- Ruby: `4.0.7` (see `.ruby-version`)\n- Node: `^24.15.0` (see `package.json` engines)\n- Bundler: `4.0.21` (see `BUNDLED WITH` in `Gemfile.lock`)\n\n### Local Development Setup\n\n```bash\nbundle install                    # Install Ruby gems\nnpm ci --ignore-scripts           # Install root Node packages (JSON linting)\ncd frontend && npm ci && cd ..   # Install Node packages\nbundle exec rails db:migrate      # Setup database\nbin/dev                          # Start all services (Rails, frontend, Good Job worker)\n# Access at http://localhost:3000\n```\n\n### Docker Development Setup\n\nSee [`docker/dev/AGENTS.md`](docker/dev/AGENTS.md) for full Docker setup and commands.\n\n## Project Structure\n\n### Key Directories\n\n- `app/` — Rails application code\n- `config/` — Rails configuration, routes, locales\n- `db/` — Database migrations and seeds\n- `docker/dev/` — Docker development environment\n- `frontend/` — TypeScript/Angular/Stimulus frontend\n- `lib/` — Ruby libraries and extensions\n- `lookbook/` — ViewComponent previews (<https://qa.openproject-edge.com/lookbook/>)\n- `modules/` — OpenProject plugin modules\n- `spec/` — RSpec test suite\n\n### Configuration Files\n\n- `.ruby-version` - Ruby version\n- `.rubocop.yml` - Ruby linting rules\n- `.erb_lint.yml` - ERB template linting\n- `frontend/eslint.config.mjs` - JavaScript/TypeScript linting\n- `Gemfile` - Ruby dependencies\n- `package.json` / `frontend/package.json` - Node.js dependencies\n- `lefthook.yml` - Git hooks configuration\n\n### Linting (Run Before Committing)\n\n```bash\n# Ruby\nbundle exec rubocop                              # Check all files\nbin/dirty-rubocop --uncommitted                  # Check only uncommitted changes\n\n# JavaScript/TypeScript\ncd frontend && npx eslint src/ && cd ..\ncd frontend && npm run typecheck && cd ..        # Typecheck application and spec sources\n\n# ERB Templates\nerb_lint {files}\n\n# Install Git Hooks (recommended)\nbundle exec lefthook install\n```\n\n### JavaScript and TypeScript Copyright Headers\n\nAll first-party JavaScript and TypeScript files must use the canonical compact\nline-comment copyright header generated from `COPYRIGHT_short`:\n\n```typescript\n//-- copyright\n// OpenProject is an open source project management software.\n// ...\n//++\n\n```\n\nUse `//-- copyright` and `//++` exactly as shown. Prefix non-empty body lines\nwith `// `, prefix empty body lines with `//`, and leave one blank line between\nthe header and the source code. Do not compose or reformat the header manually.\n\nRun `rake copyright:update_typescript` to add or repair headers in `.ts` and\n`.tsx` files. Run `rake copyright:update_js` for `.js`, `.mjs`, and `.cjs`\nfiles. Both commands accept an optional path argument.\n\n## Code Comments\n\nReaders are domain experts who know Ruby, Rails, TypeScript, and the patterns used here.\nWrite self-explanatory code instead of comments.\n\n- Default to zero comments. Sparse is the goal, not thorough coverage.\n- Never restate what the code plainly does (`# increments the counter` above `counter += 1`).\n  These get flagged in review.\n- Never justify the chosen approach. If a comment names a rejected alternative\n  (\"EXISTS rather than a join because…\"), delete it — that reasoning belongs in the commit\n  message or PR description, not the source.\n- Do comment to explain a constraint the code cannot express itself: a workaround for an\n  upstream bug, a non-obvious edge case, an ordering requirement, an invariant the caller\n  must uphold. Link the work package or upstream issue when there is one.\n- Don't add YARD/JSDoc headers to self-descriptive methods. Only where generated\n  documentation is actually consumed.\n- More than a handful of comments in a file is a smell: extract better-named methods,\n  variables, and objects so the code explains itself.\n- When in doubt, delete the comment rather than shortening it.\n\n## Commit Messages\n- First line: < 72 characters, then blank line, then detailed description\n- Reference work packages when applicable\n- Merge strategy: \"Merge pull request\" (not squash), except single-commit PRs can use \"Rebase and merge\"\n\n## Additional Documentation\n\n- `docs/development/` — Development documentation\n- `docs/development/running-tests/` — Testing guide\n- `docs/development/code-review-guidelines/` — Code review standards\n- `CONTRIBUTING.md` — Contribution workflow\n- `.github/copilot-instructions.md` — Extended agent instructions with troubleshooting\n\n<!-- File: .github/copilot-instructions.md (Tokens: ~1045 | Category: copilot-instructions) -->\n# OpenProject Coding Agent Instructions\n\nSee [AGENTS.md](../AGENTS.md) for all agent instructions.\n\n## Additional Context for GitHub Copilot\n\n### Common Issues and Workarounds\n\n#### Database Configuration\n- **Issue**: Docker fails with \"database.yml exists\"\n- **Fix**: Delete or rename `config/database.yml` when using Docker\n\n#### Memory Issues in Docker\n- **Issue**: Frontend container exits with status 137\n- **Fix**: Increase Docker memory limit to at least 4GB\n\n#### Test Failures on CI but Passing Locally\n- Run with `CI=true` environment variable (eager loads app)\n- Check for `OPENPROJECT_*` environment variables\n- Match the random seed: `bundle exec rspec --seed 18352`\n- Use `--bisect` to find order-dependent failures\n- View browser tests with `OPENPROJECT_TESTING_NO_HEADLESS=1`\n\n#### Frontend Build Issues\n- **Issue**: \"jQuery not defined\", frontend asset errors, or blank page\n- **Fix**: Run `bin/setup_dev` to rebuild frontend completely\n\n#### Parallel Test Failures\n- Tests run in parallel on CI with different random seeds per group\n- Check `tmp/parallel_runtime.log` for execution times\n- **Flaky specs**: Some tests may fail randomly; see [`docs/development/testing/handling-flaky-tests/README.md`](../docs/development/testing/handling-flaky-tests/README.md) for the full playbook, including the Turbo-aware waiting helpers and a pattern→fix table for feature specs\n  - Use `script/bulk_run_rspec` to run tests multiple times to identify flaky behavior\n\n### Extended Details\n\n#### Service Objects and Result Modeling\n- Return results using the `ServiceResult` class (well-documented in codebase)\n- Some services use monads via [dry-monads](https://github.com/dry-rb/dry-monads) for result modeling\n\n#### Testing with Capybara\n- Feature specs use Capybara (with Cuprite and Selenium WebDriver)\n- Feature specs can use A11y selectors ([capybara_accessible_selectors](https://github.com/citizensadvice/capybara_accessible_selectors)), test IDs, or page objects (in `spec/support/pages/`)\n\n#### Database Migrations\n- OpenProject implements migration \"squashing\" between major releases\n- See `docs/development/migrations/` for details on the squashing process\n- Migrations are consolidated to manage database changes across major versions\n- OpenProject does not currently aim for zero downtime migrations\n\n#### Design System Components\n- [primer_view_components](https://github.com/opf/primer_view_components) - OpenProject's fork of Primer Rails/ViewComponent\n- [openproject-octicons](https://github.com/opf/openproject-octicons) - OpenProject's fork of Primer Octicons\n- [commonmark-ckeditor-build](https://github.com/opf/commonmark-ckeditor-build) - Custom CKEditor build with CommonMark Markdown support\n\n#### Enterprise and BIM Editions\n- **Enterprise Edition**: Includes additional features like Single sign-on (OIDC & SAML), LDAP, Nextcloud integration, SCIM API, and more (requires token for development)\n- **BIM Edition**: Tailored for construction industry needs. Code in `modules/bim/`, docs in `docs/bim-guide/`. Existing instances can be switched to BIM edition.\n\n#### GitHub Actions CI/CD\n- **test-core.yml** - Main test suite (units + features, ~40 min, runs on all PRs)\n- **rubocop-core.yml** - Ruby linting (runs on all PRs with Ruby changes)\n- **eslint-core.yml** - JS/TS linting (runs on all PRs with JS/TS changes)\n- **test-frontend-unit.yml** - Frontend unit tests\n- **brakeman-scan-core.yml** - Security scanning\n- **codeql-scan-core.yml** - Code quality/security analysis\n- **Skip CI**: Add `[ci skip]` to commit message to skip CI (use sparingly)\n\n#### Performance Considerations\n- Main test suite: 40 minutes timeout\n- Full Docker build: ~10-15 minutes (first time)\n- Bundle install: ~2-5 minutes\n- npm install: ~3-7 minutes\n\n### Additional Commands\n\n```bash\n# Database\nbundle exec rake db:migrate:status       # Check migration status\n\n# Frontend\nbundle exec rails openproject:plugins:register_frontend assets:export_locales\n\n# Docker\nbin/compose run                          # Run with backend in foreground\ndocker compose run --rm backend-test \"bundle exec rspec spec/features/work_package_show_spec.rb\"\n```\n\nFor detailed documentation, consult:\n- `docs/development/` - Development documentation\n- `docs/development/running-tests/` - Testing guide\n- `docs/development/code-review-guidelines/` - Code review standards\n- `CONTRIBUTING.md` - Contribution workflow\n\n<!-- File: .claude-plugin/marketplace.json (Tokens: ~300 | Category: marketplace) -->\n# Claude Plugin Marketplace Catalog\n\nPath: `.claude-plugin/marketplace.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/opf/openproject/HEAD/.claude-plugin/marketplace.json)\n\n<!-- File: .claude-plugin/plugin.json (Tokens: ~300 | Category: plugin-manifest) -->\n# claude-plugin Plugin Manifest\n\nPath: `.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/opf/openproject/HEAD/.claude-plugin/plugin.json)\n\n<!-- File: .cursor/mcp.json (Tokens: ~300 | Category: mcp-config) -->\n# Model Context Protocol (MCP) Configuration\n\nPath: `.cursor/mcp.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/opf/openproject/HEAD/.cursor/mcp.json)\n</yakaai_skills>"}