diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..2cefb49 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,31 @@ +--- +name: "🐛 Bug Report" +about: Report a bug or rendering defect in LeadForge OS to help us improve. +title: "bug: [Short description of the bug]" +labels: bug, triage +assignees: "" +--- + +**Describe the Bug** +A clear and concise description of what the bug is. + +**Steps to Reproduce** +Steps to reproduce the behavior: +1. Go to '[...]' +2. Click on '[...]' +3. See error + +**Expected Behavior** +A clear and concise description of what you expected to happen. + +**Screenshots / Console Logs** +If applicable, add screenshots or paste developer tools console logs here to help explain the problem. + +**Environment Details (please complete the following information):** +- OS: [e.g., Windows 11, macOS, Linux] +- Desktop App Version: [e.g., v1.0.0-beta.2] +- Node.js/pnpm Version: [e.g., Node 22, pnpm 9] +- SQLite Database integrity status (if known): [e.g., healthy, corrupted] + +**Additional Context** +Add any other context about the problem here (e.g. SMTP connection status, specific LLM settings). diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..257574d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,22 @@ +--- +name: "🚀 Feature Request" +about: Suggest an idea, enhancement, or new workflow screen for LeadForge OS. +title: "feat: [Short description of the proposed feature]" +labels: enhancement, discussion +assignees: "" +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. E.g., "I find it frustrating when I try to do [...]" + +**Describe the Solution You'd Like** +A clear and concise description of what you want to happen. Explain how the proposed feature fits into the current Forge Design System (no rounded corners, high blur overlays, primary accent colors). + +**Describe Alternatives You've Considered** +A clear and concise description of any alternative solutions or workarounds you've considered. + +**Mockups / Wireframes** +If applicable, include screenshots or sketches of the proposed UI modifications. + +**Additional Context** +Add any other context or screenshots about the feature request here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..515914b --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,27 @@ +## Description +Provide a brief summary of the changes made and the motivation behind them. + +## Related Issues +Closes #[issue-number] (if applicable) + +## Type of Change +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Refactor (code organization, no user-facing visual modifications) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] Documentation update + +## Verification Checklist + +### Automated Validation +- [ ] `pnpm run check-types` passes successfully with 0 errors. +- [ ] `pnpm run lint` matches standards. +- [ ] `pnpm run format` (Prettier checks) runs clean. + +### Visual Verification (for UI/UX edits) +- [ ] Design follows the Forge Design System specifications (`rounded-none`, primary orange accent, semantic badges). +- [ ] Staggered entrance and transitions execute smoothly. +- [ ] Slide-out Sheets contain necessary conditional rendering guards (no null-pointer crashes on closed states). + +## Screenshots / Video Demonstrations +Include visual proof of the changes in action (especially for CSS/UI refactoring). diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..d464f6e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,52 @@ +name: Continuous Integration + +on: + push: + branches: [main] + pull_request: + branches: [main] + +permissions: + contents: read + +jobs: + validate: + name: Verify Code Quality & Type Safety + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Install pnpm + uses: pnpm/action-setup@v3 + with: + version: 9 + + - name: Get pnpm store directory + shell: bash + id: pnpm-cache + run: | + echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + + - name: Setup Cache + uses: actions/cache@v4 + with: + path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + - name: Run Linter Checks + run: pnpm run lint + + - name: Run Type Safety Checks + run: pnpm run check-types diff --git a/.github/workflows/dependency-scan.yml b/.github/workflows/dependency-scan.yml new file mode 100644 index 0000000..d812269 --- /dev/null +++ b/.github/workflows/dependency-scan.yml @@ -0,0 +1,49 @@ +name: Security & Dependency Scan + +on: + schedule: + - cron: '0 0 * * 0' # Every Sunday at midnight UTC + workflow_dispatch: # On-demand trigger + +permissions: + actions: read + contents: read + security-events: write + +jobs: + audit: + name: Node Vulnerability Audit + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Install pnpm + uses: pnpm/action-setup@v3 + with: + version: 9 + + - name: Run Package Vulnerability Audit + run: pnpm audit --audit-level=high + + codeql: + name: CodeQL Semantic Analysis + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: javascript-typescript + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/release-sync.yml b/.github/workflows/release-sync.yml new file mode 100644 index 0000000..ceb25a5 --- /dev/null +++ b/.github/workflows/release-sync.yml @@ -0,0 +1,42 @@ +name: Release Sync + +on: + workflow_run: + workflows: ["Release"] + types: + - completed + +permissions: + contents: write + +jobs: + sync: + name: Sync Release Notes to Marketing + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Run Releases Compilation + run: node scripts/generate-releases.mjs + + - name: Commit and Push Changes + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git add apps/marketing/lib/generated-releases.ts + if ! git diff --cached --quiet; then + git commit -m "docs: auto-sync github release list to marketing website" + git push origin main + else + echo "No changes in generated-releases.ts to commit." + fi diff --git a/.github/workflows/sqlite-check.yml b/.github/workflows/sqlite-check.yml new file mode 100644 index 0000000..5f39a30 --- /dev/null +++ b/.github/workflows/sqlite-check.yml @@ -0,0 +1,50 @@ +name: SQLite Schema Check + +on: + pull_request: + paths: + - 'apps/desktop/src/main/database/**' + - 'scripts/verify-migrations.ts' + - '.github/workflows/sqlite-check.yml' + +permissions: + contents: read + +jobs: + verify: + name: Verify Migrations Integrity + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Install pnpm + uses: pnpm/action-setup@v3 + with: + version: 9 + + - name: Get pnpm store directory + shell: bash + id: pnpm-cache + run: | + echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + + - name: Setup Cache + uses: actions/cache@v4 + with: + path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + - name: Verify Migrations Run Cleanly + run: pnpm --filter @leadforge/desktop exec npx tsx ../../scripts/verify-migrations.ts diff --git a/scripts/verify-migrations.ts b/scripts/verify-migrations.ts new file mode 100644 index 0000000..9124821 --- /dev/null +++ b/scripts/verify-migrations.ts @@ -0,0 +1,14 @@ +import Database from 'better-sqlite3'; +import { runMigrations } from '../apps/desktop/src/main/database/runner'; + +console.log('[Test] Starting database migrations validation...'); +try { + // Run on isolated in-memory SQLite database + const db = new Database(':memory:'); + runMigrations(db); + console.log('[Test] Database migrations verification successfully completed with 0 errors! 🎉'); + process.exit(0); +} catch (err: any) { + console.error('[Test] Database migrations verification failed:', err.message || err); + process.exit(1); +}