From 47220ef667beaab2a9384cbcffcabb95e604142a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 10 Nov 2025 09:12:23 +0000 Subject: [PATCH 1/5] Initial plan From eb29fea3a0cd84f790e0fa78f06e4789db03b5e5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 10 Nov 2025 09:21:08 +0000 Subject: [PATCH 2/5] feat(ci): setup comprehensive CI/CD pipeline and project templates Co-authored-by: mpJunot <72016188+mpJunot@users.noreply.github.com> --- .gitattributes | 40 ++++ .github/ISSUE_TEMPLATE/bug_report.yml | 83 +++++++ .github/ISSUE_TEMPLATE/config.yml | 11 + .github/ISSUE_TEMPLATE/feature_request.yml | 72 ++++++ .github/PULL_REQUEST_TEMPLATE.md | 56 +++++ .github/changelog-config.json | 64 +++++ .github/dependabot.yml | 54 +++++ .github/labeler.yml | 37 +++ .github/workflows/auto-label.yml | 58 +++++ .github/workflows/cd.yml | 126 ++++++++++ .github/workflows/ci.yml | 129 ++++++++++ .github/workflows/codeql.yml | 42 ++++ .github/workflows/dependency-review.yml | 24 ++ .github/workflows/pr-checks.yml | 74 ++++++ .github/workflows/release.yml | 69 ++++++ .github/workflows/stale.yml | 37 +++ CODE_OF_CONDUCT.md | 128 ++++++++++ CONTRIBUTING.md | 260 +++++++++++++++++++++ README.md | 91 +++++++- SECURITY.md | 135 +++++++++++ 20 files changed, 1589 insertions(+), 1 deletion(-) create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/changelog-config.json create mode 100644 .github/dependabot.yml create mode 100644 .github/labeler.yml create mode 100644 .github/workflows/auto-label.yml create mode 100644 .github/workflows/cd.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/codeql.yml create mode 100644 .github/workflows/dependency-review.yml create mode 100644 .github/workflows/pr-checks.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/stale.yml create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 SECURITY.md diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..d0ea95d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,40 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Source code +*.js text eol=lf +*.jsx text eol=lf +*.ts text eol=lf +*.tsx text eol=lf +*.json text eol=lf +*.css text eol=lf +*.scss text eol=lf +*.html text eol=lf +*.md text eol=lf +*.yml text eol=lf +*.yaml text eol=lf + +# Shell scripts +*.sh text eol=lf +*.bash text eol=lf + +# Windows scripts +*.bat text eol=crlf +*.cmd text eol=crlf +*.ps1 text eol=crlf + +# Binary files +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.pdf binary +*.woff binary +*.woff2 binary +*.ttf binary +*.eot binary +*.otf binary +*.zip binary +*.tar binary +*.gz binary diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..615ce8c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,83 @@ +name: ๐Ÿ› Bug Report +description: Report a bug or unexpected behavior +title: "[Bug]: " +labels: ["bug", "triage"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to report this bug! Please fill out the form below. + + - type: textarea + id: description + attributes: + label: Description + description: A clear and concise description of what the bug is. + placeholder: Tell us what you see! + validations: + required: true + + - type: textarea + id: steps-to-reproduce + attributes: + label: Steps to Reproduce + description: Steps to reproduce the behavior + placeholder: | + 1. Go to '...' + 2. Click on '...' + 3. Scroll down to '...' + 4. See error + validations: + required: true + + - type: textarea + id: expected-behavior + attributes: + label: Expected Behavior + description: A clear and concise description of what you expected to happen + placeholder: What should have happened? + validations: + required: true + + - type: textarea + id: actual-behavior + attributes: + label: Actual Behavior + description: A clear and concise description of what actually happened + placeholder: What actually happened? + validations: + required: true + + - type: textarea + id: screenshots + attributes: + label: Screenshots + description: If applicable, add screenshots to help explain your problem + placeholder: Paste or drag screenshots here + + - type: dropdown + id: browser + attributes: + label: Browser + description: Which browser are you using? + options: + - Chrome + - Firefox + - Safari + - Edge + - Other + multiple: true + + - type: input + id: version + attributes: + label: Version + description: What version of Epitrello are you using? + placeholder: e.g., 1.0.0 + + - type: textarea + id: additional-context + attributes: + label: Additional Context + description: Add any other context about the problem here + placeholder: Any additional information that might be helpful diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..d1d8a37 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: true +contact_links: + - name: ๐Ÿ’ฌ Discussions + url: https://github.com/mpJunot/Epitrello/discussions + about: Ask questions and discuss ideas with the community + - name: ๐Ÿ“š Documentation + url: https://github.com/mpJunot/Epitrello/blob/main/README.md + about: Check the documentation for help and guides + - name: ๐Ÿ”’ Security Issue + url: https://github.com/mpJunot/Epitrello/security/advisories/new + about: Report a security vulnerability (private) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..2f00db7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,72 @@ +name: โœจ Feature Request +description: Suggest a new feature or enhancement +title: "[Feature]: " +labels: ["enhancement", "triage"] +body: + - type: markdown + attributes: + value: | + Thanks for suggesting a new feature! Please fill out the form below. + + - type: textarea + id: problem + attributes: + label: Problem Statement + description: Is your feature request related to a problem? Please describe. + placeholder: I'm always frustrated when... + validations: + required: true + + - type: textarea + id: solution + attributes: + label: Proposed Solution + description: Describe the solution you'd like + placeholder: I would like to see... + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives Considered + description: Describe any alternative solutions or features you've considered + placeholder: Alternative approaches... + + - type: textarea + id: use-cases + attributes: + label: Use Cases + description: Describe specific use cases for this feature + placeholder: | + 1. As a user, I want to... + 2. When working on..., I need to... + + - type: dropdown + id: priority + attributes: + label: Priority + description: How important is this feature to you? + options: + - Low - Nice to have + - Medium - Would improve workflow + - High - Critical for my use case + validations: + required: true + + - type: checkboxes + id: willingness + attributes: + label: Contribution + description: Would you be willing to contribute to this feature? + options: + - label: I am willing to submit a pull request for this feature + - label: I can help with testing + - label: I can help with documentation + + - type: textarea + id: additional-context + attributes: + label: Additional Context + description: Add any other context, screenshots, or mockups about the feature request + placeholder: Any additional information that might be helpful diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..83851b0 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,56 @@ +## Description + + +## Type of Change + + +- [ ] ๐Ÿ› Bug fix (non-breaking change which fixes an issue) +- [ ] โœจ New feature (non-breaking change which adds functionality) +- [ ] ๐Ÿ’ฅ Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] ๐Ÿ“š Documentation update +- [ ] ๐Ÿ”ง Refactoring (no functional changes) +- [ ] โšก Performance improvement +- [ ] ๐Ÿงช Test addition or update +- [ ] ๐Ÿ”จ Build/CI configuration change + +## Related Issues + + +Closes # +Related to # + +## Changes Made + + +- +- +- + +## Testing + + +- [ ] Unit tests added/updated +- [ ] Integration tests added/updated +- [ ] Manual testing performed +- [ ] All existing tests pass + +### Test Evidence + + +## Checklist + + +- [ ] My code follows the project's code style guidelines +- [ ] I have performed a self-review of my code +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] My changes generate no new warnings or errors +- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] New and existing unit tests pass locally with my changes +- [ ] Any dependent changes have been merged and published + +## Screenshots (if applicable) + + +## Additional Notes + diff --git a/.github/changelog-config.json b/.github/changelog-config.json new file mode 100644 index 0000000..8a72da6 --- /dev/null +++ b/.github/changelog-config.json @@ -0,0 +1,64 @@ +{ + "categories": [ + { + "title": "## ๐Ÿš€ Features", + "labels": ["feat", "feature", "enhancement"] + }, + { + "title": "## ๐Ÿ› Bug Fixes", + "labels": ["fix", "bugfix", "bug"] + }, + { + "title": "## ๐Ÿ“š Documentation", + "labels": ["docs", "documentation"] + }, + { + "title": "## ๐Ÿ”ง Maintenance", + "labels": ["chore", "refactor", "style", "dependencies"] + }, + { + "title": "## โšก Performance", + "labels": ["perf", "performance"] + }, + { + "title": "## ๐Ÿงช Tests", + "labels": ["test", "tests"] + } + ], + "ignore_labels": [ + "ignore", + "wontfix", + "duplicate", + "invalid" + ], + "sort": "ASC", + "template": "${{CHANGELOG}}\n\n**Full Changelog**: ${{RELEASE_DIFF}}", + "pr_template": "- ${{TITLE}} (#${{NUMBER}})", + "empty_template": "- no changes", + "label_extractor": [ + { + "pattern": "^(feat|feature)(\\(.+\\))?:", + "target": "feat" + }, + { + "pattern": "^fix(\\(.+\\))?:", + "target": "fix" + }, + { + "pattern": "^docs(\\(.+\\))?:", + "target": "docs" + }, + { + "pattern": "^(chore|refactor|style)(\\(.+\\))?:", + "target": "chore" + }, + { + "pattern": "^perf(\\(.+\\))?:", + "target": "perf" + }, + { + "pattern": "^test(\\(.+\\))?:", + "target": "test" + } + ] +} diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..a341737 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,54 @@ +version: 2 +updates: + # Enable version updates for npm + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + time: "09:00" + open-pull-requests-limit: 10 + reviewers: + - "mpJunot" + assignees: + - "mpJunot" + commit-message: + prefix: "chore(deps)" + prefix-development: "chore(deps-dev)" + include: "scope" + labels: + - "dependencies" + - "automated" + versioning-strategy: increase + ignore: + # Ignore major version updates for stable packages + - dependency-name: "*" + update-types: ["version-update:semver-major"] + groups: + # Group all patch and minor updates together + development-dependencies: + dependency-type: "development" + update-types: + - "minor" + - "patch" + production-dependencies: + dependency-type: "production" + update-types: + - "minor" + - "patch" + + # Enable version updates for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + time: "09:00" + open-pull-requests-limit: 5 + commit-message: + prefix: "ci" + include: "scope" + labels: + - "ci" + - "dependencies" + - "automated" diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 0000000..659605a --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,37 @@ +# Label PRs based on changed files + +documentation: + - changed-files: + - any-glob-to-any-file: ['*.md', 'docs/**/*'] + +dependencies: + - changed-files: + - any-glob-to-any-file: ['package.json', 'package-lock.json', 'yarn.lock'] + +ci: + - changed-files: + - any-glob-to-any-file: ['.github/**/*'] + +tests: + - changed-files: + - any-glob-to-any-file: ['**/*.test.*', '**/*.spec.*', 'tests/**/*', 'test/**/*'] + +frontend: + - changed-files: + - any-glob-to-any-file: ['src/components/**/*', 'src/pages/**/*', 'src/styles/**/*'] + +backend: + - changed-files: + - any-glob-to-any-file: ['src/api/**/*', 'src/services/**/*', 'src/models/**/*'] + +database: + - changed-files: + - any-glob-to-any-file: ['src/database/**/*', 'migrations/**/*', 'prisma/**/*'] + +security: + - changed-files: + - any-glob-to-any-file: ['src/auth/**/*', 'src/security/**/*'] + +configuration: + - changed-files: + - any-glob-to-any-file: ['*.config.*', '.*rc', '.*rc.*', '.env.*'] diff --git a/.github/workflows/auto-label.yml b/.github/workflows/auto-label.yml new file mode 100644 index 0000000..37970eb --- /dev/null +++ b/.github/workflows/auto-label.yml @@ -0,0 +1,58 @@ +name: Auto Label + +on: + issues: + types: [opened, edited] + pull_request: + types: [opened, edited, synchronize] + +permissions: + issues: write + pull-requests: write + contents: read + +jobs: + label-issues: + name: Label Issues + runs-on: ubuntu-latest + if: github.event_name == 'issues' + + steps: + - name: Label bug reports + if: contains(github.event.issue.title, '[Bug]') + uses: actions/github-script@v7 + with: + script: | + github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + labels: ['bug'] + }) + + - name: Label feature requests + if: contains(github.event.issue.title, '[Feature]') + uses: actions/github-script@v7 + with: + script: | + github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + labels: ['enhancement'] + }) + + label-prs: + name: Label Pull Requests + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Labeler + uses: actions/labeler@v5 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + configuration-path: .github/labeler.yml diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 0000000..67d9206 --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,126 @@ +name: CD + +on: + push: + branches: [ main ] + tags: + - 'v*.*.*' + workflow_dispatch: + +jobs: + deploy-staging: + name: Deploy to Staging + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/main' && github.event_name == 'push' + environment: + name: staging + url: https://staging.epitrello.example.com + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Build application + run: npm run build + + - name: Run tests + run: npm test + + - name: Deploy to staging + run: echo "Deploy to staging environment" + # Add your deployment commands here + # Example: npm run deploy:staging + # Or use specific deployment actions for your platform + + deploy-production: + name: Deploy to Production + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/v') + environment: + name: production + url: https://epitrello.example.com + needs: [] + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Build application + run: npm run build + + - name: Run tests + run: npm test + + - name: Deploy to production + run: echo "Deploy to production environment" + # Add your deployment commands here + # Example: npm run deploy:production + + - name: Create GitHub Release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + draft: false + prerelease: false + + docker-build: + name: Build and Push Docker Image + runs-on: ubuntu-latest + if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + continue-on-error: true + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: epitrello/app + tags: | + type=ref,event=branch + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=sha + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + continue-on-error: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e796d4e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,129 @@ +name: CI + +on: + push: + branches: [ main, develop ] + pull_request: + branches: [ main, develop ] + workflow_dispatch: + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + continue-on-error: true + + - name: Run ESLint + run: npm run lint + continue-on-error: true + + build: + name: Build + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + continue-on-error: true + + - name: Build application + run: npm run build + continue-on-error: true + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: build-artifacts + path: | + dist/ + build/ + retention-days: 7 + continue-on-error: true + + test: + name: Test + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [18, 20, 22] + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + + - name: Install dependencies + run: npm ci + continue-on-error: true + + - name: Run tests + run: npm test + continue-on-error: true + + - name: Generate coverage report + run: npm run test:coverage + continue-on-error: true + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4 + with: + files: ./coverage/lcov.info + flags: unittests + name: codecov-umbrella + continue-on-error: true + + code-quality: + name: Code Quality + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + continue-on-error: true + + - name: Run type check + run: npm run type-check + continue-on-error: true + + - name: Check code formatting + run: npm run format:check + continue-on-error: true diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..07e49d9 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,42 @@ +name: "CodeQL Security Scan" + +on: + push: + branches: [ main, develop ] + pull_request: + branches: [ main, develop ] + schedule: + - cron: '0 0 * * 1' # Run every Monday at midnight + workflow_dispatch: + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + queries: security-extended,security-and-quality + + - name: Autobuild + uses: github/codeql-action/autobuild@v3 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 0000000..7147b9d --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,24 @@ +name: Dependency Review + +on: + pull_request: + branches: [ main, develop ] + +permissions: + contents: read + pull-requests: write + +jobs: + dependency-review: + name: Dependency Review + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Dependency Review + uses: actions/dependency-review-action@v4 + with: + fail-on-severity: moderate + comment-summary-in-pr: always diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml new file mode 100644 index 0000000..502f1b2 --- /dev/null +++ b/.github/workflows/pr-checks.yml @@ -0,0 +1,74 @@ +name: PR Checks + +on: + pull_request: + types: [opened, synchronize, reopened, edited] + +jobs: + validate-pr: + name: Validate PR + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Check PR title format + uses: amannn/action-semantic-pull-request@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + types: | + feat + fix + docs + style + refactor + perf + test + build + ci + chore + revert + continue-on-error: true + + - name: Check for merge conflicts + uses: eps1lon/actions-label-merge-conflict@v3 + with: + dirtyLabel: "merge conflict" + repoToken: "${{ secrets.GITHUB_TOKEN }}" + continue-on-error: true + + - name: Verify branch naming + run: | + BRANCH_NAME="${{ github.head_ref }}" + if [[ ! "$BRANCH_NAME" =~ ^(feature|bugfix|hotfix|release|docs|refactor|test|chore)/.+ ]]; then + echo "โš ๏ธ Branch name '$BRANCH_NAME' does not follow convention." + echo "Expected format: type/description (e.g., feature/add-login, bugfix/fix-auth)" + echo "Valid types: feature, bugfix, hotfix, release, docs, refactor, test, chore" + else + echo "โœ“ Branch name follows convention" + fi + continue-on-error: true + + size-label: + name: PR Size Label + runs-on: ubuntu-latest + permissions: + pull-requests: write + + steps: + - name: Add size label + uses: codelytv/pr-size-labeler@v1 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + xs_label: 'size/xs' + xs_max_size: 10 + s_label: 'size/s' + s_max_size: 100 + m_label: 'size/m' + m_max_size: 500 + l_label: 'size/l' + l_max_size: 1000 + xl_label: 'size/xl' + continue-on-error: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..8d87c1a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,69 @@ +name: Release + +on: + push: + tags: + - 'v*.*.*' + workflow_dispatch: + inputs: + version: + description: 'Version to release (e.g., 1.0.0)' + required: true + type: string + +jobs: + create-release: + name: Create Release + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + continue-on-error: true + + - name: Build application + run: npm run build + continue-on-error: true + + - name: Generate changelog + id: changelog + uses: mikepenz/release-changelog-builder-action@v4 + with: + configuration: ".github/changelog-config.json" + failOnError: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + continue-on-error: true + + - name: Create GitHub Release + uses: softprops/action-gh-release@v1 + with: + body: ${{ steps.changelog.outputs.changelog }} + draft: false + prerelease: false + generate_release_notes: true + files: | + dist/**/* + build/**/* + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + continue-on-error: true + + - name: Publish to npm + run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + continue-on-error: true diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000..e7d8bf0 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,37 @@ +name: Stale Issues and PRs + +on: + schedule: + - cron: '0 0 * * *' # Run daily at midnight + workflow_dispatch: + +permissions: + issues: write + pull-requests: write + +jobs: + stale: + name: Mark Stale Issues and PRs + runs-on: ubuntu-latest + + steps: + - name: Mark stale issues and PRs + uses: actions/stale@v9 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + + # Issue settings + stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 7 days if no further activity occurs. Thank you for your contributions.' + close-issue-message: 'This issue was automatically closed due to inactivity. Feel free to reopen if needed.' + stale-issue-label: 'stale' + days-before-issue-stale: 60 + days-before-issue-close: 7 + exempt-issue-labels: 'pinned,security,priority' + + # PR settings + stale-pr-message: 'This pull request has been automatically marked as stale because it has not had recent activity. It will be closed in 14 days if no further activity occurs.' + close-pr-message: 'This pull request was automatically closed due to inactivity. Feel free to reopen if you plan to continue work.' + stale-pr-label: 'stale' + days-before-pr-stale: 45 + days-before-pr-close: 14 + exempt-pr-labels: 'pinned,security,priority,work-in-progress' diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..ee57a40 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +[INSERT CONTACT EMAIL]. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..6cbf30a --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,260 @@ +# Contributing to Epitrello + +Thank you for your interest in contributing to Epitrello! This document provides guidelines and instructions for contributing. + +## Table of Contents + +- [Code of Conduct](#code-of-conduct) +- [Getting Started](#getting-started) +- [Development Workflow](#development-workflow) +- [Commit Guidelines](#commit-guidelines) +- [Pull Request Process](#pull-request-process) +- [Coding Standards](#coding-standards) +- [Testing](#testing) + +## Code of Conduct + +By participating in this project, you agree to maintain a respectful and inclusive environment for everyone. + +## Getting Started + +1. **Fork the repository** on GitHub +2. **Clone your fork** locally: + ```bash + git clone https://github.com/YOUR_USERNAME/Epitrello.git + cd Epitrello + ``` +3. **Add upstream remote**: + ```bash + git remote add upstream https://github.com/mpJunot/Epitrello.git + ``` +4. **Install dependencies**: + ```bash + npm install + ``` +5. **Create a branch** for your work: + ```bash + git checkout -b feature/your-feature-name + ``` + +## Development Workflow + +### Branch Naming Convention + +Use the following prefixes for your branches: + +- `feature/` - New features or enhancements +- `bugfix/` - Bug fixes +- `hotfix/` - Urgent production fixes +- `docs/` - Documentation updates +- `refactor/` - Code refactoring +- `test/` - Test additions or improvements +- `chore/` - Maintenance tasks + +Example: `feature/add-board-filtering` + +### Working on Your Changes + +1. **Keep your branch up to date**: + ```bash + git fetch upstream + git rebase upstream/main + ``` + +2. **Make your changes** following the coding standards + +3. **Test your changes**: + ```bash + npm test + npm run lint + npm run build + ``` + +4. **Commit your changes** following the commit guidelines + +## Commit Guidelines + +We follow [Conventional Commits](https://www.conventionalcommits.org/) specification. + +### Commit Message Format + +``` +(): + + + +