From f0c4504a82af45060e8423010201b2f63a5ca9e3 Mon Sep 17 00:00:00 2001 From: Toshiaki Wakabayashi Date: Thu, 21 May 2026 16:53:04 +0900 Subject: [PATCH 01/10] =?UTF-8?q?ci:=20=F0=9F=8E=A1=20=E8=87=AA=E5=8B=95?= =?UTF-8?q?=E5=8C=96=E3=80=81SaaS=E9=80=A3=E6=90=BA=E3=80=81=E3=82=BB?= =?UTF-8?q?=E3=82=AD=E3=83=A5=E3=83=AA=E3=83=86=E3=82=A3=E3=81=8A=E3=82=88?= =?UTF-8?q?=E3=81=B3=E5=93=81=E8=B3=AA=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E3=81=AE=E7=B5=B1=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - パブリックリポジトリ共通の最新のCI/CDパイプライン、自動化ツール、SaaS連携、セキュリティスキャン設定を導入。 - CodeQL(高度なコード脆弱性スキャン)ワークフローを追加。 - Gitleaks(シークレット漏洩防止スキャン)ワークフローを追加。 - Trivy(FS脆弱性・設定不備スキャン)ワークフローを追加。 - Actionlint、Markdownlint、Stale Issue/PR管理、PR競合自動通知などの自動化設定を追加。 - CodeRabbit(AI PR日本語自動レビュー)設定を追加。 - 共通コードフォーマット(Prettier)およびドキュメント品質用のルールを追加。 - 開発時・PR時のセルフチェックを促すPRテンプレート(PULL_REQUEST_TEMPLATE.md)を導入。 --- .coderabbit.yaml | 76 ++++++-- .github/PULL_REQUEST_TEMPLATE.md | 17 +- .github/workflows/actionlint.yml | 4 +- .github/workflows/codeql.yml | 53 +++--- .github/workflows/gitleaks.yml | 12 +- .github/workflows/markdownlint.yml | 19 +- .github/workflows/pr_conflict_notify.yml | 220 +++++++++++++++++++++++ .github/workflows/stale.yml | 52 ++++++ .github/workflows/trivy.yml | 58 ++++++ .husky/commit-msg | 1 + .husky/pre-commit | 27 +++ .markdownlint-cli2.jsonc | 17 +- .prettierrc | 10 ++ 13 files changed, 487 insertions(+), 79 deletions(-) create mode 100644 .github/workflows/pr_conflict_notify.yml create mode 100644 .github/workflows/stale.yml create mode 100644 .github/workflows/trivy.yml create mode 100755 .husky/commit-msg create mode 100755 .husky/pre-commit create mode 100644 .prettierrc diff --git a/.coderabbit.yaml b/.coderabbit.yaml index bf0e332..e10d566 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -1,19 +1,28 @@ # CodeRabbit configuration # https://docs.coderabbit.ai/reference/configuration -language: ja-JP +language: 'ja-JP' early_access: false enable_free_tier: true reviews: - # 個人運営のためレビューはまず "chill" で緩めに始める。 - # 必要に応じて "assertive" に切り替えて検出感度を上げる。 - profile: chill - - # CodeRabbit を bot reviewer として動作させる。 - # 問題なしと判断した PR に対して Approve ステータスを返す。 - # 個人運営での self-merge 運用 (PR 作成者は自分の PR を承認できない GitHub 仕様) - # を補助する目的で有効化。Approve は最終判断ではなく補助。 + # 個人運営だが、main マージ後に Cloud Run / Cloudflare Pages の本番環境へ + # 自動デプロイされる前提のため検出漏れを避けたい。"assertive" で検出感度を + # 高めに維持し、ノイズが過剰になった場合は "chill" に戻すことも検討する。 + profile: 'assertive' + + # PR 全体に対する指針。path_instructions に "**/*" を入れるとファイル毎に + # 繰り返し適用されてノイズが増えるため、広範な指示は instructions に集約する。 + instructions: | + 変更がプロジェクト全体に与える影響や、アーキテクチャの観点など、広いスコープからコードレビューを行ってください。必ず日本語でコメントしてください。 + メインブランチにマージされた場合に Cloud Run / Cloudflare Pages 上の本番環境にデプロイされることを考慮し、以下の観点を強調し、重要視して必ずレビューに盛り込んでください: + - 実行環境へのアクセス方法(認証情報、API キー、DB 接続文字列、内部 URL など)がコードやログから漏洩していないこと。 + - 実行環境に不正にアクセスするための攻撃手法や脆弱性(インジェクション、認可不足、不適切な権限設定、CORS / CSRF / Secure Cookie / Secure Headers の設定崩れなど)が入り込んでいないこと。 + + # CodeRabbit を bot reviewer として動作させる。問題なしと判断した PR に対して + # Approve ステータスを返す。個人運営での self-merge 運用 (PR 作成者は自分の + # PR を承認できない GitHub 仕様) を補助する目的で有効化。Approve は最終判断 + # ではなく補助。 request_changes_workflow: true high_level_summary: true @@ -27,22 +36,51 @@ reviews: base_branches: - main + path_instructions: + - path: 'backend/src/**/*.ts' + instructions: | + Hono + Better Auth + Drizzle 構成のサーバサイドコードとしてレビューしてください: + - 認可チェック (requireOperator / requireTenant 等のミドルウェア適用漏れ) が無いか。 + - DB クエリでテナント境界 (tenant_id) の絞り込みが抜けていないか。 + - 外部入力 (HTTP body / query / webhook payload) が zod 等で検証されているか。 + - path: 'frontend/src/**/*.{ts,tsx}' + instructions: | + React + Vite + better-auth/react のクライアントコードとしてレビューしてください: + - 認証状態に依存する画面遷移・データ取得が SSR/CSR 境界で正しく扱われているか。 + - 認証/権限が必要な API 呼び出しで credentials の送信が漏れていないか。 + - ユーザー入力をそのまま innerHTML / dangerouslySetInnerHTML 等に流していないか。 + - path: '.github/workflows/**' + instructions: | + GitHub Actions ワークフローとしてレビューしてください: + - シークレットの露出 (echo / set-output 経由のリーク) が無いか。 + - 外部 action は SHA pin されているか。 + - permissions: が最小権限になっているか。 + - path: 'db/migrations/**' + instructions: | + Drizzle のマイグレーション SQL です。以下を必ず確認してください: + - 既存行に対して破壊的 (DROP COLUMN / NOT NULL 追加 / 型変更) になっていないか、なるなら backfill / default 設定が整合しているか。 + - インデックス追加が大規模テーブルでロックを引き起こさないか (CONCURRENTLY の検討)。 + # 生成物 / 依存物 / ロックファイルなどはレビュー対象から除外する。 - # path_filters は明示的な include がないと全ファイルが対象外になる仕様のため、 - # 先頭で "**" を指定して全ファイルを対象としたうえで個別に除外する。 path_filters: - - '**' - - '!dist/**' - - '!build/**' - - '!coverage/**' - - '!node_modules/**' - - '!pnpm-lock.yaml' - - '!package-lock.json' - - '!yarn.lock' + - '!**/dist/**' + - '!**/build/**' + - '!**/coverage/**' + - '!**/node_modules/**' + - '!**/.wrangler/**' + - '!**/.turbo/**' + - '!**/.next/**' + - '!infra/cdktf.out/**' + - '!infra/.gen/**' + - '!**/bun.lock' + - '!**/package-lock.json' + - '!**/yarn.lock' + - '!**/pnpm-lock.yaml' - '!**/*.min.js' - '!**/*.min.css' - '!**/*.map' - '!**/*.snap' + - '!**/*.tsbuildinfo' abort_on_close: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f13c12d..7c01923 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,29 +7,34 @@ -## 関連 Issue +## 関連 Issue / 設計ドキュメント - + ## 変更内容 +- - ## 動作確認 - + - [ ] ローカルで動作確認した - [ ] テストを追加・更新した(または不要な理由を記載) ## セルフチェック -- [ ] 既存の lint / typecheck / test がパスする +- [ ] `bun --cwd backend run lint` / `bun --cwd frontend run lint` がパスする +- [ ] `bun --cwd backend run typecheck` / `bun --cwd frontend run typecheck` がパスする - [ ] 破壊的変更がある場合、README または docs を更新した +- [ ] DB マイグレーションがある場合、ロールバック手順を確認した - [ ] secret / 個人情報を含むコードや設定が含まれていない -## 補足 +## デプロイ時の注意 + + - +なし diff --git a/.github/workflows/actionlint.yml b/.github/workflows/actionlint.yml index e94bbf8..ccf6542 100644 --- a/.github/workflows/actionlint.yml +++ b/.github/workflows/actionlint.yml @@ -24,9 +24,7 @@ jobs: name: actionlint runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.0 - with: - persist-credentials: false + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - name: Download actionlint id: actionlint diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index e33a910..e67e88e 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,13 +1,13 @@ -name: CodeQL +name: "CodeQL" on: push: - branches: [main] + branches: [ "main" ] pull_request: - branches: [main] + # The branches below must be a subset of the branches above + branches: [ "main" ] schedule: - # 毎週月曜 03:00 JST (= 日曜 18:00 UTC) に main を再スキャン - - cron: '0 18 * * 0' + - cron: '30 1 * * 1' # 毎週月曜 10:30 JST (01:30 UTC) にスキャン concurrency: group: codeql-${{ github.ref }} @@ -16,32 +16,35 @@ concurrency: permissions: contents: read security-events: write - actions: read jobs: analyze: name: Analyze (${{ matrix.language }}) runs-on: ubuntu-latest + timeout-minutes: 360 + strategy: fail-fast: false matrix: - # frontend は tsx、backend は ts。両方とも 'javascript-typescript' でまとめてスキャン。 - language: ['javascript-typescript'] + language: [ 'javascript-typescript' ] + steps: - - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.0 - with: - persist-credentials: false - - - name: Initialize CodeQL - uses: github/codeql-action/init@458d36d7d4f47d0dd16ca424c1d3cda0060f1360 # v3 - with: - languages: ${{ matrix.language }} - # security-extended は誤検知が増えるため、まずは security-and-quality で運用。 - # ノイズが多い場合は 'security' に下げる。 - queries: security-and-quality - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@458d36d7d4f47d0dd16ca424c1d3cda0060f1360 # v3 - with: - category: '/language:${{ matrix.language }}' + - name: Checkout repository + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + persist-credentials: false + + - name: Initialize CodeQL + uses: github/codeql-action/init@78ed0c7291d93e40c51b085850dc669a4c3ab73b # v3 + with: + languages: ${{ matrix.language }} + # クエリセットを指定してセキュリティ・品質チェックを強化可能 + # queries: security-extended,security-and-quality + + - name: Autobuild + uses: github/codeql-action/autobuild@78ed0c7291d93e40c51b085850dc669a4c3ab73b # v3 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@78ed0c7291d93e40c51b085850dc669a4c3ab73b # v3 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/gitleaks.yml b/.github/workflows/gitleaks.yml index 9a79794..bda3c0d 100644 --- a/.github/workflows/gitleaks.yml +++ b/.github/workflows/gitleaks.yml @@ -23,7 +23,7 @@ jobs: name: Scan for leaked secrets runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.0 + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: # 履歴全体をスキャンするためフルクローン fetch-depth: 0 @@ -33,12 +33,8 @@ jobs: run: | set -euo pipefail GITLEAKS_VERSION=8.21.2 - BASE_URL="https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}" - ARCHIVE="gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" - curl -fsSLO "${BASE_URL}/${ARCHIVE}" - curl -fsSLO "${BASE_URL}/gitleaks_${GITLEAKS_VERSION}_checksums.txt" - grep " ${ARCHIVE}$" "gitleaks_${GITLEAKS_VERSION}_checksums.txt" | sha256sum -c - - tar -xzf "${ARCHIVE}" gitleaks + curl -fsSLO "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" + tar -xzf "gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" gitleaks sudo mv gitleaks /usr/local/bin/gitleaks gitleaks version @@ -55,7 +51,7 @@ jobs: - name: Upload SARIF if: always() - uses: github/codeql-action/upload-sarif@458d36d7d4f47d0dd16ca424c1d3cda0060f1360 # v3 + uses: github/codeql-action/upload-sarif@78ed0c7291d93e40c51b085850dc669a4c3ab73b # v3 with: sarif_file: gitleaks.sarif category: gitleaks diff --git a/.github/workflows/markdownlint.yml b/.github/workflows/markdownlint.yml index 88310b0..c9c42b8 100644 --- a/.github/workflows/markdownlint.yml +++ b/.github/workflows/markdownlint.yml @@ -29,21 +29,12 @@ jobs: # 整備完了後に continue-on-error を外して赤検知に切り替える。 continue-on-error: true steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.0 + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: persist-credentials: false - - name: Setup Node.js - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.0.0 - with: - # プロジェクト全体で Node.js 20.19 に統一(ESLint v10 の最低要件に合わせて) - node-version: '20.19' - - - name: Install markdownlint-cli2 - # DavidAnson/markdownlint-cli2-action は allowed_actions に含まれない - # third-party action のため、npm 経由で実行する。 - # --ignore-scripts で postinstall 経由の任意コード実行を防ぐ。 - run: npm install -g --no-fund --no-audit --ignore-scripts markdownlint-cli2@0.22.1 - - name: Run markdownlint-cli2 - run: markdownlint-cli2 --config .markdownlint-cli2.jsonc "**/*.md" + uses: DavidAnson/markdownlint-cli2-action@992badcdf24e3b8eb7e87ff9287fe931bcb00c6e # v20 + with: + config: '.markdownlint-cli2.jsonc' + globs: '**/*.md' diff --git a/.github/workflows/pr_conflict_notify.yml b/.github/workflows/pr_conflict_notify.yml new file mode 100644 index 0000000..f5254a5 --- /dev/null +++ b/.github/workflows/pr_conflict_notify.yml @@ -0,0 +1,220 @@ +name: PR Conflict Notification + +on: + # main ブランチへの push 時に全 PR をチェック + push: + branches: + - main + # 定期実行 (毎日 09:00 JST = 00:00 UTC) + schedule: + - cron: '0 0 * * *' + workflow_dispatch: + +permissions: + contents: read + pull-requests: write + +jobs: + check-conflicts: + runs-on: ubuntu-latest + steps: + - name: Check PR conflicts and notify authors + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const owner = context.repo.owner; + const repo = context.repo.repo; + + console.log(`🔍 Checking for conflicting PRs in ${owner}/${repo}...`); + + const pullRequests = await github.paginate(github.rest.pulls.list, { + owner, + repo, + state: 'open', + per_page: 100, + }); + + console.log(`📋 Found ${pullRequests.length} open PRs`); + + if (pullRequests.length === 0) { + console.log('✅ No open PRs found'); + return; + } + + const conflictedPRs = []; + const mergeableByPrNumber = new Map(); + + for (const pr of pullRequests) { + console.log(`\n🔎 Checking PR #${pr.number}: ${pr.title}`); + + const { data: prDetail } = await github.rest.pulls.get({ + owner, + repo, + pull_number: pr.number, + }); + + // mergeable が null の場合は計算中なのでリトライ + let mergeable = prDetail.mergeable; + const maxRetries = 3; + const retryDelays = [3000, 5000, 10000]; + + for (let retry = 0; retry < maxRetries && mergeable === null; retry++) { + console.log(`⏳ Mergeable status is being calculated for PR #${pr.number}, waiting... (retry ${retry + 1}/${maxRetries})`); + await new Promise(resolve => setTimeout(resolve, retryDelays[retry])); + + const { data: prDetailRetry } = await github.rest.pulls.get({ + owner, + repo, + pull_number: pr.number, + }); + mergeable = prDetailRetry.mergeable; + } + + mergeableByPrNumber.set(pr.number, mergeable); + + if (mergeable === null) { + console.log(`⚠️ WARNING: Mergeable status is still null for PR #${pr.number} after ${maxRetries} retries. Manual check may be required.`); + continue; + } + + console.log(` - Mergeable: ${mergeable}`); + console.log(` - Mergeable State: ${prDetail.mergeable_state}`); + console.log(` - Author: @${pr.user.login}`); + + if (mergeable === false) { + conflictedPRs.push({ + number: pr.number, + title: pr.title, + author: pr.user.login, + url: pr.html_url, + }); + } + } + + console.log(`\n📊 Summary: ${conflictedPRs.length} PR(s) with conflicts`); + + // コンフリクトが解消された PR の古いコメントを削除 + // mergeable === true が確認できた PR のみを対象にする(null の PR は除外) + console.log('\n🧹 Checking for resolved conflicts...'); + const nonConflictedPRNumbers = pullRequests + .filter(pr => mergeableByPrNumber.get(pr.number) === true) + .map(pr => pr.number); + + const botCommentMarker = ''; + + for (const prNumber of nonConflictedPRNumbers) { + const comments = await github.paginate(github.rest.issues.listComments, { + owner, + repo, + issue_number: prNumber, + per_page: 100, + }); + + const existingComment = comments.find( + comment => comment.body && comment.body.includes(botCommentMarker) + ); + + if (existingComment) { + console.log(` Deleting resolved conflict comment from PR #${prNumber}`); + try { + await github.rest.issues.deleteComment({ + owner, + repo, + comment_id: existingComment.id, + }); + console.log(` ✅ Comment deleted from PR #${prNumber}`); + } catch (error) { + if (error.status === 404) { + console.log(` ⚠️ Comment #${existingComment.id} was already deleted`); + } else { + throw error; + } + } + } + } + + if (conflictedPRs.length === 0) { + console.log('✅ No conflicting PRs found'); + return; + } + + for (const pr of conflictedPRs) { + console.log(`\n💬 Posting comment to PR #${pr.number}...`); + + const comments = await github.paginate(github.rest.issues.listComments, { + owner, + repo, + issue_number: pr.number, + per_page: 100, + }); + + const existingComment = comments.find( + comment => comment.body && comment.body.includes(botCommentMarker) + ); + + const commentBody = `${botCommentMarker} + ## ⚠️ コンフリクトが発生しています + + @${pr.author} さん + + このプルリクエストは \`main\` ブランチとコンフリクトが発生しています。 + マージする前にコンフリクトを解消してください。 + + ### 解消方法 + + \`\`\`bash + # ローカルで main ブランチを最新化 + git checkout main + git pull origin main + + # 作業ブランチに戻って main をマージ + git checkout + git merge main + + # コンフリクトを解消してコミット + git add . + git commit -m "fix: 🐛 main ブランチとのコンフリクトを解消" + git push + \`\`\` + + --- + *このコメントは自動的に投稿されました。コンフリクトが解消されると、次回のチェック時にこのコメントは削除されます。* + `; + + if (existingComment) { + console.log(` Updating existing comment #${existingComment.id}`); + try { + await github.rest.issues.updateComment({ + owner, + repo, + comment_id: existingComment.id, + body: commentBody, + }); + } catch (error) { + if (error.status === 404) { + console.log(` ⚠️ Comment #${existingComment.id} was already deleted, creating new comment instead`); + await github.rest.issues.createComment({ + owner, + repo, + issue_number: pr.number, + body: commentBody, + }); + } else { + throw error; + } + } + } else { + console.log(` Creating new comment`); + await github.rest.issues.createComment({ + owner, + repo, + issue_number: pr.number, + body: commentBody, + }); + } + + console.log(` ✅ Comment posted to PR #${pr.number}`); + } + + console.log('\n🎉 PR conflict check completed!'); diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000..bd59cce --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,52 @@ +name: Close stale PRs + +on: + schedule: + - cron: '0 1 * * *' # 毎日 10:00 JST + workflow_dispatch: + +permissions: + pull-requests: write + issues: write + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10 + with: + # PR のみを対象(Issue は除外) + days-before-issue-stale: -1 + days-before-issue-close: -1 + + # PR 設定: 14 日無更新で stale、さらに 16 日無更新で close + days-before-pr-stale: 14 + days-before-pr-close: 16 + + stale-pr-label: 'stale' + + stale-pr-message: | + このPRは14日間更新がないため、`stale`ラベルが付与されました。 + + **対応が必要な場合:** + - PRを更新するか、コメントを追加してください + - `stale`ラベルを削除すると、カウンターがリセットされます + + **対応が不要な場合:** + - このままにしておくと、16日間の無更新後に自動でクローズされます + - 必要に応じて、後から新しいPRとして再作成してください + + close-pr-message: | + このPRは長期間更新がなかったため、自動でクローズされました。 + + 作業を再開する場合は、`main` ブランチから新しいブランチを作成し、 + 新しいPRとして再作成することを推奨します。 + + # 除外設定: 作業中 / 保留中 / Dependabot は対象外 + exempt-pr-labels: 'WIP,do-not-close,dependencies' + exempt-draft-pr: true + + operations-per-run: 100 + ascending: true + delete-branch: false + remove-stale-when-updated: true diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml new file mode 100644 index 0000000..c636038 --- /dev/null +++ b/.github/workflows/trivy.yml @@ -0,0 +1,58 @@ +name: Trivy Scan + +on: + push: + branches: [main] + pull_request: + branches: [main] + schedule: + # 毎週月曜 04:00 JST (= 日曜 19:00 UTC) に再スキャンして新規 CVE を拾う + - cron: '0 19 * * 0' + +concurrency: + group: trivy-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + security-events: write + +jobs: + fs-scan: + name: Trivy filesystem scan + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + persist-credentials: false + + - name: Install Trivy + env: + TRIVY_VERSION: v0.70.0 + run: | + ARCH=Linux-64bit + BASE_URL="https://github.com/aquasecurity/trivy/releases/download/${TRIVY_VERSION}" + TARBALL="trivy_${TRIVY_VERSION#v}_${ARCH}.tar.gz" + curl -sSfL -o "${TARBALL}" "${BASE_URL}/${TARBALL}" + curl -sSfL -o trivy_checksums.txt "${BASE_URL}/trivy_${TRIVY_VERSION#v}_checksums.txt" + grep "${TARBALL}" trivy_checksums.txt | sha256sum -c - + tar -xzf "${TARBALL}" trivy + sudo install -m 0755 trivy /usr/local/bin/trivy + + - name: Run Trivy (vulnerabilities + misconfig) + run: | + trivy fs \ + --format sarif \ + --output trivy-fs.sarif \ + --severity CRITICAL,HIGH \ + --ignore-unfixed \ + --scanners vuln,misconfig,secret \ + --exit-code 0 \ + . + + - name: Upload SARIF to GitHub Security + if: always() + uses: github/codeql-action/upload-sarif@78ed0c7291d93e40c51b085850dc669a4c3ab73b # v3 + with: + sarif_file: 'trivy-fs.sarif' + category: trivy-fs diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..e81b051 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1 @@ +npx commitlint --edit "$1" diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..214c77c --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,27 @@ +npx lint-staged + +# Run gitleaks local check if installed to prevent committing secrets +if command -v gitleaks &> /dev/null; then + echo "🔒 Running local gitleaks check..." + gitleaks protect --staged --verbose +else + echo "⚠️ gitleaks is not installed locally. Skipping local secret scan. (Highly recommended: brew install gitleaks)" +fi + +# Run typecheck for changed workspaces +changed_backend=$(git diff --cached --name-only -- 'backend/src/') +changed_frontend=$(git diff --cached --name-only -- 'frontend/src/') + +if [ -n "$changed_backend" ]; then + echo "🔍 Running backend typecheck..." + npm run typecheck --prefix backend + echo "🧪 Running backend tests..." + npm run test --prefix backend +fi + +if [ -n "$changed_frontend" ]; then + echo "🔍 Running frontend typecheck..." + npm run typecheck --prefix frontend + echo "🧪 Running frontend tests..." + npm run test --prefix frontend +fi diff --git a/.markdownlint-cli2.jsonc b/.markdownlint-cli2.jsonc index 165d2c4..16d1903 100644 --- a/.markdownlint-cli2.jsonc +++ b/.markdownlint-cli2.jsonc @@ -9,19 +9,28 @@ "MD033": false, // 単一の H1 を強制: 既存ドキュメントが満たさないものがあるため無効化 "MD025": false, - // 重複ヘッダ: docs で「概要」が複数出るので緩める + // 重複ヘッダ: docs/ROADMAP.md などで「概要」が複数出るので緩める "MD024": { "siblings_only": true }, // 最初の行が H1 でなくてもよい (PR テンプレなど) "MD041": false, - // 強調を見出しに使ってよい + // 強調を見出しに使ってよい (README の Phase X 表記など) "MD036": false, // bare URL を許可 (GitHub flavored Markdown で自動リンク化される) "MD034": false, - // テーブル列スタイル: 重要度が低いため無効化 + // テーブル列スタイル: 重要度が低く既存表が多いので無効化 "MD060": false, // blockquote 内の空行: 引用節を見やすくするため許可 "MD028": false, }, "globs": ["**/*.md"], - "ignores": ["**/node_modules/**", ".claude/**", "**/dist/**", "**/build/**"], + "ignores": [ + "node_modules/**", + "**/node_modules/**", + ".wrangler/**", + ".claude/**", + "backup/**", + "backend/dist/**", + "frontend/dist/**", + "docs/superpowers/**", + ], } diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..0b59de9 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,10 @@ +{ + "semi": true, + "singleQuote": true, + "printWidth": 80, + "tabWidth": 2, + "trailingComma": "all", + "bracketSpacing": true, + "arrowParens": "always", + "useTabs": false +} From e478a67d60dc33015e66948de47b2482a912b895 Mon Sep 17 00:00:00 2001 From: Toshiaki Wakabayashi Date: Thu, 21 May 2026 17:19:26 +0900 Subject: [PATCH 02/10] =?UTF-8?q?fix:=20=F0=9F=90=9B=20[Code=20Review]=20c?= =?UTF-8?q?ommitlint=20=E3=82=92=20devDependencies=20=E3=81=AB=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit .husky/commit-msg で実行される `npx commitlint` 用に、@commitlint/cli と @commitlint/config-conventional をプロジェクトの devDependencies に追加した。 これにより npx が都度ダウンロードを試みることがなくなり、commit-msg フックの 実行が安定する。 レビューコメント: https://github.com/genzouw/kakezan-manabo/pull/55#discussion_r3279547700 レビュアー: gemini-code-assist 優先度: high --- package-lock.json | 985 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 + 2 files changed, 987 insertions(+) diff --git a/package-lock.json b/package-lock.json index 3ad111d..a22f17b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,8 @@ "version": "1.0.0", "license": "MIT", "devDependencies": { + "@commitlint/cli": "^21.0.1", + "@commitlint/config-conventional": "^21.0.1", "@eslint/js": "^10.0.1", "eslint": "^10.4.0", "eslint-config-prettier": "^10.1.8", @@ -17,6 +19,332 @@ "prettier": "^3.8.3" } }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@commitlint/cli": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-21.0.1.tgz", + "integrity": "sha512-8vq10krmbJwBkvzXKhbs4o4JQEVscd3pqOlWuDUaDBwbeL694/P33UC29tZQFTAgPU9fVJ2+f2m3zw16yKWxHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/format": "^21.0.1", + "@commitlint/lint": "^21.0.1", + "@commitlint/load": "^21.0.1", + "@commitlint/read": "^21.0.1", + "@commitlint/types": "^21.0.1", + "tinyexec": "^1.0.0", + "yargs": "^18.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-21.0.1.tgz", + "integrity": "sha512-gRorrkfWOh/+V5X8GYWWbQvrzPczopGMS4CCNrQdHkK4xWElv82BDvIsDhJZWTlI7TazOlYea6VATufCsFs+sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.0.1", + "conventional-changelog-conventionalcommits": "^9.2.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-21.0.1.tgz", + "integrity": "sha512-Zd2UFdndeMMaW2O96HK0tdfT4gOImUvidMpAd/pws2zZ4m1nrAZ/9b/v2JYuE8fs86GpXv9F7LNaIuCIWhY+pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.0.1", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/config-validator/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@commitlint/ensure": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-21.0.1.tgz", + "integrity": "sha512-jJ1037967wU7YN/xkv+iRlOBlmaOXPhPO5KQSqya6GyXzBlwuLzELBFao16DVg9dZyqmNrhewzwZ3SAibetHBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.0.1", + "es-toolkit": "^1.46.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-21.0.1.tgz", + "integrity": "sha512-RifH+FmImozKBE6mozhF4K3r2RRKP7SMi/Q/zLCmExtp5e05lhHOUYqGBlFBAGNHaZxU/WYw1XuugYK9jQzqnA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/format": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-21.0.1.tgz", + "integrity": "sha512-ksmG2+cHGtuDPQQbhBbC4unwm444+6TiPw0d1bKf67hntgZqZ8E0g1MuYKUuyT5IH4IMmXZhKq22/Z3jBvtQIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.0.1", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-21.0.1.tgz", + "integrity": "sha512-iNDP8SFdw8JEkM0CHZ2XFnhTN4Zg5jKUY2d8kBOSFrI2aA+3YJI7fcqVpfgbpJ9xtxFVYpi+DBATU5AvhoTq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.0.1", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/lint": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-21.0.1.tgz", + "integrity": "sha512-gF+iYtUw1gBG3HUH9z3VxwUjGg2R2G5j+nmvPs8aIeYkiB7TtneBu3wO85I0bUl93bYNsvsCNI9Nte2fmDUMww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/is-ignored": "^21.0.1", + "@commitlint/parse": "^21.0.1", + "@commitlint/rules": "^21.0.1", + "@commitlint/types": "^21.0.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/load": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-21.0.1.tgz", + "integrity": "sha512-Btg1q1mKmiihN4W3x0EsPDrJMOQfMa9NIqlzlJyXAfxvsOGdGXOW5p3R3RcSxDCaY7JabY9flIl+Om1af3PSrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^21.0.1", + "@commitlint/execute-rule": "^21.0.1", + "@commitlint/resolve-extends": "^21.0.1", + "@commitlint/types": "^21.0.1", + "cosmiconfig": "^9.0.1", + "cosmiconfig-typescript-loader": "^6.1.0", + "es-toolkit": "^1.46.0", + "is-plain-obj": "^4.1.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/message": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-21.0.1.tgz", + "integrity": "sha512-R3dVQeJQ0B6yqrZEjkUHD4r7UJYLV9Lvk2xs3PTOmtWk2G3mI6Xgc+YdRxL1PwcDfBiUjv2SkIkW4AUc976w1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/parse": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-21.0.1.tgz", + "integrity": "sha512-oh/nCSOqdoeQNA1tO8aAmxkq5EBo8/NzcFQRvv66AWc9HpED28sL2iSicCKU6hPintWuscL6BJEWi77Wq1LPMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^21.0.1", + "conventional-changelog-angular": "^8.2.0", + "conventional-commits-parser": "^6.3.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/read": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-21.0.1.tgz", + "integrity": "sha512-pMEu4lbpC8W0ZgKJj2U6WaobXIZWdFlULpIEewYhkPXx+WZcnoO53YrVPc7QErQuNolq2Me8dP58Wu7YAVXVOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/top-level": "^21.0.1", + "@commitlint/types": "^21.0.1", + "git-raw-commits": "^5.0.0", + "tinyexec": "^1.0.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-21.0.1.tgz", + "integrity": "sha512-0DhjYWL6uYrY16Efa032fYk3woGJDU4AGWiG1XXltT9AMUNYKyb5cIZU2ivbaMZ3+kKFqUjikD2cjh66Sbh/Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^21.0.1", + "@commitlint/types": "^21.0.1", + "es-toolkit": "^1.46.0", + "global-directory": "^5.0.0", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/rules": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-21.0.1.tgz", + "integrity": "sha512-VMooYpz4nJg7xlaUso6CCOWEz8D/ChkvsvZUMARcoJ1ZpfKPyFCGrHNha2tbsETNAb6ErgiRuCr2DvghrvPDYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/ensure": "^21.0.1", + "@commitlint/message": "^21.0.1", + "@commitlint/to-lines": "^21.0.1", + "@commitlint/types": "^21.0.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-21.0.1.tgz", + "integrity": "sha512-bd1BFII7p1EQZre9Kaj+kKaMFP3cFCdt21K7DItVux9XP5WjLgJ0/Uy1pJJh9aPwVJ6SKg62PxqlZaHI8hQAXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/top-level": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-21.0.1.tgz", + "integrity": "sha512-4esUYqzY7K0FCgcJ/1xWEZekV7Ch4yZT1+xjEb7KzqbJ05XEkxHVsTfC8ADKNNtlCE2pj98KEbPGZWw9WwEnVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@commitlint/types": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-21.0.1.tgz", + "integrity": "sha512-4u7w8jcoCUFWhjWnASYzZHAP34OqOtuFBN87nQmFvqda03YU0T6z+yB4w0gSAMpekiRqqGk5rt+qSlW+a2vSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-parser": "^6.3.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@conventional-changelog/git-client": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.7.0.tgz", + "integrity": "sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/child-process-utils": "^1.0.0", + "@simple-libs/stream-utils": "^1.2.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.4.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", @@ -197,6 +525,35 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@simple-libs/child-process-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.2.tgz", + "integrity": "sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@simple-libs/stream-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", + "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, "node_modules/@types/esrecurse": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", @@ -218,6 +575,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/node": { + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -258,6 +626,19 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -274,6 +655,20 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true, + "license": "MIT" + }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -348,6 +743,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -365,6 +770,21 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -385,6 +805,60 @@ "dev": true, "license": "MIT" }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.1.tgz", + "integrity": "sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.3.1.tgz", + "integrity": "sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-commits-parser": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", + "integrity": "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0", + "meow": "^13.0.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/corser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", @@ -395,6 +869,51 @@ "node": ">= 0.4.0" } }, + "node_modules/cosmiconfig": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.3.0.tgz", + "integrity": "sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jiti": "2.6.1" + }, + "engines": { + "node": ">=v18" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=9", + "typescript": ">=5" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -435,6 +954,19 @@ "dev": true, "license": "MIT" }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -450,6 +982,33 @@ "node": ">= 0.4" } }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -483,6 +1042,27 @@ "node": ">= 0.4" } }, + "node_modules/es-toolkit": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz", + "integrity": "sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -692,6 +1272,23 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -774,6 +1371,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -813,6 +1433,23 @@ "node": ">= 0.4" } }, + "node_modules/git-raw-commits": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.1.tgz", + "integrity": "sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@conventional-changelog/git-client": "^2.6.0", + "meow": "^13.0.0" + }, + "bin": { + "git-raw-commits": "src/cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -826,6 +1463,22 @@ "node": ">=10.13.0" } }, + "node_modules/global-directory": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", + "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "6.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globals": { "version": "17.6.0", "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", @@ -977,6 +1630,33 @@ "node": ">= 4" } }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -987,6 +1667,23 @@ "node": ">=0.8.19" } }, + "node_modules/ini": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1010,6 +1707,29 @@ "node": ">=0.10.0" } }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1017,6 +1737,36 @@ "dev": true, "license": "ISC" }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -1024,6 +1774,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -1062,6 +1819,13 @@ "node": ">= 0.8.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -1088,6 +1852,19 @@ "node": ">= 0.4" } }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -1214,6 +1991,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -1234,6 +2043,13 @@ "node": ">=8" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/portfinder": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", @@ -1300,6 +2116,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -1307,6 +2133,16 @@ "dev": true, "license": "MIT" }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -1328,6 +2164,19 @@ "dev": true, "license": "MIT" }, + "node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1427,6 +2276,40 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1440,6 +2323,16 @@ "node": ">=8" } }, + "node_modules/tinyexec": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", + "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -1453,6 +2346,29 @@ "node": ">= 0.8.0" } }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/union": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", @@ -1521,6 +2437,75 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index a0237f8..2ab0fbe 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ "author": "", "license": "MIT", "devDependencies": { + "@commitlint/cli": "^21.0.1", + "@commitlint/config-conventional": "^21.0.1", "@eslint/js": "^10.0.1", "eslint": "^10.4.0", "eslint-config-prettier": "^10.1.8", From 733f8663be6ced84a657d9ef3e2a296003c3e3fc Mon Sep 17 00:00:00 2001 From: Toshiaki Wakabayashi Date: Thu, 21 May 2026 17:19:44 +0900 Subject: [PATCH 03/10] =?UTF-8?q?fix:=20=F0=9F=90=9B=20[Code=20Review]=20p?= =?UTF-8?q?re-commit=20=E3=82=92=E3=83=97=E3=83=AD=E3=82=B8=E3=82=A7?= =?UTF-8?q?=E3=82=AF=E3=83=88=E6=A7=8B=E9=80=A0=E3=81=AB=E5=90=88=E3=82=8F?= =?UTF-8?q?=E3=81=9B=E3=81=A6=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 本プロジェクトは vanilla JS の単一パッケージ構成のため、以下を修正した: - 未インストールの lint-staged 呼び出しを削除 - 存在しない backend/ frontend/ ディレクトリ向けの typecheck/test 実行ブロックを削除 - ルートで定義済みの npm run format:check と npm run lint を実行するよう変更 これにより pre-commit フックが現状の package.json と整合して動作する。 レビューコメント: https://github.com/genzouw/kakezan-manabo/pull/55#discussion_r3279547706 レビュアー: gemini-code-assist 優先度: high --- .husky/pre-commit | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index 214c77c..f27ad62 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,5 +1,3 @@ -npx lint-staged - # Run gitleaks local check if installed to prevent committing secrets if command -v gitleaks &> /dev/null; then echo "🔒 Running local gitleaks check..." @@ -8,20 +6,10 @@ else echo "⚠️ gitleaks is not installed locally. Skipping local secret scan. (Highly recommended: brew install gitleaks)" fi -# Run typecheck for changed workspaces -changed_backend=$(git diff --cached --name-only -- 'backend/src/') -changed_frontend=$(git diff --cached --name-only -- 'frontend/src/') - -if [ -n "$changed_backend" ]; then - echo "🔍 Running backend typecheck..." - npm run typecheck --prefix backend - echo "🧪 Running backend tests..." - npm run test --prefix backend -fi +# Run format check +echo "🎨 Running format check..." +npm run format:check -if [ -n "$changed_frontend" ]; then - echo "🔍 Running frontend typecheck..." - npm run typecheck --prefix frontend - echo "🧪 Running frontend tests..." - npm run test --prefix frontend -fi +# Run lint +echo "🔍 Running lint..." +npm run lint From 3ff6ad1e11656582e47c3531be8ef139b4ed1a89 Mon Sep 17 00:00:00 2001 From: Toshiaki Wakabayashi Date: Thu, 21 May 2026 17:20:19 +0900 Subject: [PATCH 04/10] =?UTF-8?q?fix:=20=F0=9F=90=9B=20[Code=20Review]=20c?= =?UTF-8?q?oderabbit.yaml=20=E3=82=92=E3=83=97=E3=83=AD=E3=82=B8=E3=82=A7?= =?UTF-8?q?=E3=82=AF=E3=83=88=E5=AE=9F=E6=85=8B=E3=81=AB=E5=90=88=E3=82=8F?= =?UTF-8?q?=E3=81=9B=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 本プロジェクトは vanilla JS (ES modules) の単一構成であり、Hono / Better Auth / Drizzle / React / backend / frontend / db といったディレクトリや技術スタックは 存在しない。CodeRabbit が誤った前提でレビューしないよう、該当する path_instructions を削除し、代わりに js/ 配下に対するクライアントコード向け レビュー指示を追加した。 レビューコメント: https://github.com/genzouw/kakezan-manabo/pull/55#discussion_r3279547708 レビュアー: gemini-code-assist 優先度: medium --- .coderabbit.yaml | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/.coderabbit.yaml b/.coderabbit.yaml index e10d566..764a5f6 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -37,29 +37,18 @@ reviews: - main path_instructions: - - path: 'backend/src/**/*.ts' + - path: 'js/**/*.js' instructions: | - Hono + Better Auth + Drizzle 構成のサーバサイドコードとしてレビューしてください: - - 認可チェック (requireOperator / requireTenant 等のミドルウェア適用漏れ) が無いか。 - - DB クエリでテナント境界 (tenant_id) の絞り込みが抜けていないか。 - - 外部入力 (HTTP body / query / webhook payload) が zod 等で検証されているか。 - - path: 'frontend/src/**/*.{ts,tsx}' - instructions: | - React + Vite + better-auth/react のクライアントコードとしてレビューしてください: - - 認証状態に依存する画面遷移・データ取得が SSR/CSR 境界で正しく扱われているか。 - - 認証/権限が必要な API 呼び出しで credentials の送信が漏れていないか。 - - ユーザー入力をそのまま innerHTML / dangerouslySetInnerHTML 等に流していないか。 + ブラウザ上で動作する vanilla JavaScript (ES modules) のクライアントコードとしてレビューしてください: + - ユーザー入力をそのまま innerHTML 等に流していないか (XSS 観点)。 + - イベントリスナのリーク (重複登録 / 解除漏れ) が無いか。 + - DOM 操作が描画パフォーマンスを著しく落としていないか。 - path: '.github/workflows/**' instructions: | GitHub Actions ワークフローとしてレビューしてください: - シークレットの露出 (echo / set-output 経由のリーク) が無いか。 - 外部 action は SHA pin されているか。 - permissions: が最小権限になっているか。 - - path: 'db/migrations/**' - instructions: | - Drizzle のマイグレーション SQL です。以下を必ず確認してください: - - 既存行に対して破壊的 (DROP COLUMN / NOT NULL 追加 / 型変更) になっていないか、なるなら backfill / default 設定が整合しているか。 - - インデックス追加が大規模テーブルでロックを引き起こさないか (CONCURRENTLY の検討)。 # 生成物 / 依存物 / ロックファイルなどはレビュー対象から除外する。 path_filters: From 9160b5c8cffc04a8682da7f4f22776bbaf7a370a Mon Sep 17 00:00:00 2001 From: Toshiaki Wakabayashi Date: Thu, 21 May 2026 17:20:37 +0900 Subject: [PATCH 05/10] =?UTF-8?q?fix:=20=F0=9F=90=9B=20[Code=20Review]=20P?= =?UTF-8?q?R=20=E3=83=86=E3=83=B3=E3=83=97=E3=83=AC=E3=83=BC=E3=83=88?= =?UTF-8?q?=E3=81=AE=E3=82=BB=E3=83=AB=E3=83=95=E3=83=81=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=82=92=20npm=20=E3=81=AB=E7=B5=B1=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 本プロジェクトは npm を使用する単一パッケージ構成のため、bun および backend/frontend ディレクトリを前提とした項目を実態に合わせて修正した: - bun --cwd backend/frontend run lint → npm run lint - typecheck 行は本プロジェクトに該当スクリプトが無いため format:check に置換 - DB マイグレーション項目は本プロジェクトに DB が無いため削除 レビューコメント: https://github.com/genzouw/kakezan-manabo/pull/55#discussion_r3279547710 レビュアー: gemini-code-assist 優先度: medium --- .github/PULL_REQUEST_TEMPLATE.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 7c01923..5951b3e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -27,10 +27,9 @@ ## セルフチェック -- [ ] `bun --cwd backend run lint` / `bun --cwd frontend run lint` がパスする -- [ ] `bun --cwd backend run typecheck` / `bun --cwd frontend run typecheck` がパスする +- [ ] `npm run lint` がパスする +- [ ] `npm run format:check` がパスする - [ ] 破壊的変更がある場合、README または docs を更新した -- [ ] DB マイグレーションがある場合、ロールバック手順を確認した - [ ] secret / 個人情報を含むコードや設定が含まれていない ## デプロイ時の注意 From ad3081bbb85b84b542d44b0232d3afe36cb0da9f Mon Sep 17 00:00:00 2001 From: Toshiaki Wakabayashi Date: Thu, 21 May 2026 17:20:53 +0900 Subject: [PATCH 06/10] =?UTF-8?q?fix:=20=F0=9F=90=9B=20[Code=20Review]=20m?= =?UTF-8?q?arkdownlint=20ignore=20=E3=81=AE=E9=87=8D=E8=A4=87=E3=83=91?= =?UTF-8?q?=E3=82=BF=E3=83=BC=E3=83=B3=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **/node_modules/** はルートを含むあらゆる階層の node_modules にマッチするため、 ルート専用の node_modules/** は冗長だった。重複を解消するため削除した。 レビューコメント: https://github.com/genzouw/kakezan-manabo/pull/55#discussion_r3279547725 レビュアー: gemini-code-assist 優先度: low --- .markdownlint-cli2.jsonc | 1 - 1 file changed, 1 deletion(-) diff --git a/.markdownlint-cli2.jsonc b/.markdownlint-cli2.jsonc index 16d1903..f5fba38 100644 --- a/.markdownlint-cli2.jsonc +++ b/.markdownlint-cli2.jsonc @@ -24,7 +24,6 @@ }, "globs": ["**/*.md"], "ignores": [ - "node_modules/**", "**/node_modules/**", ".wrangler/**", ".claude/**", From e130ef81fd0d717287621cca02d9e8c5a6ef3217 Mon Sep 17 00:00:00 2001 From: Toshiaki Wakabayashi Date: Thu, 21 May 2026 17:21:11 +0900 Subject: [PATCH 07/10] =?UTF-8?q?fix:=20=F0=9F=90=9B=20[Code=20Review]=20c?= =?UTF-8?q?odeql.yml=20=E3=81=AE=20Prettier=20=E3=83=95=E3=82=A9=E3=83=BC?= =?UTF-8?q?=E3=83=9E=E3=83=83=E3=83=88=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit prettier --check で失敗していた配列のブラケット内スペースを除去した。 - branches: [ "main" ] → branches: [main] - language: [ 'javascript-typescript' ] → language: ['javascript-typescript'] 併せて Prettier の自動整形により、quote / インデント / step ハイフン位置が プロジェクト標準に揃った。 レビューコメント: https://github.com/genzouw/kakezan-manabo/pull/55#discussion_r3279557235 レビュアー: coderabbitai 優先度: low --- .github/workflows/codeql.yml | 46 ++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index e67e88e..a0bb009 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,11 +1,11 @@ -name: "CodeQL" +name: 'CodeQL' on: push: - branches: [ "main" ] + branches: [main] pull_request: # The branches below must be a subset of the branches above - branches: [ "main" ] + branches: [main] schedule: - cron: '30 1 * * 1' # 毎週月曜 10:30 JST (01:30 UTC) にスキャン @@ -26,25 +26,25 @@ jobs: strategy: fail-fast: false matrix: - language: [ 'javascript-typescript' ] + language: ['javascript-typescript'] steps: - - name: Checkout repository - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - with: - persist-credentials: false - - - name: Initialize CodeQL - uses: github/codeql-action/init@78ed0c7291d93e40c51b085850dc669a4c3ab73b # v3 - with: - languages: ${{ matrix.language }} - # クエリセットを指定してセキュリティ・品質チェックを強化可能 - # queries: security-extended,security-and-quality - - - name: Autobuild - uses: github/codeql-action/autobuild@78ed0c7291d93e40c51b085850dc669a4c3ab73b # v3 - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@78ed0c7291d93e40c51b085850dc669a4c3ab73b # v3 - with: - category: "/language:${{matrix.language}}" + - name: Checkout repository + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + with: + persist-credentials: false + + - name: Initialize CodeQL + uses: github/codeql-action/init@78ed0c7291d93e40c51b085850dc669a4c3ab73b # v3 + with: + languages: ${{ matrix.language }} + # クエリセットを指定してセキュリティ・品質チェックを強化可能 + # queries: security-extended,security-and-quality + + - name: Autobuild + uses: github/codeql-action/autobuild@78ed0c7291d93e40c51b085850dc669a4c3ab73b # v3 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@78ed0c7291d93e40c51b085850dc669a4c3ab73b # v3 + with: + category: '/language:${{matrix.language}}' From 61fc25b04d8531c7401ccce967302bb114cba5b6 Mon Sep 17 00:00:00 2001 From: Toshiaki Wakabayashi Date: Thu, 21 May 2026 17:21:29 +0900 Subject: [PATCH 08/10] =?UTF-8?q?fix:=20=F0=9F=90=9B=20[Code=20Review]=20p?= =?UTF-8?q?r=5Fconflict=5Fnotify=20=E3=81=AB=20concurrency=20=E3=81=A8?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E6=A8=A9=E9=99=90=E3=82=92=E9=81=A9=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - schedule / push / workflow_dispatch の同時実行による PR コメント更新の競合を 防ぐため、workflow レベルに concurrency stanza を追加した。 - 本ワークフローは Issues API (createComment / updateComment / deleteComment) でコメントを操作しているため、workflow レベルでは pull-requests: read のみと し、job レベルに issues: write を付与する最小権限構成に変更した。 レビューコメント: https://github.com/genzouw/kakezan-manabo/pull/55#discussion_r3279557239 レビュアー: coderabbitai 優先度: medium --- .github/workflows/pr_conflict_notify.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pr_conflict_notify.yml b/.github/workflows/pr_conflict_notify.yml index f5254a5..9c24fd2 100644 --- a/.github/workflows/pr_conflict_notify.yml +++ b/.github/workflows/pr_conflict_notify.yml @@ -10,12 +10,23 @@ on: - cron: '0 0 * * *' workflow_dispatch: +concurrency: + group: pr-conflict-notify-${{ github.ref }} + cancel-in-progress: true + +# 既定は読み取り権限のみ。コメント書き込みが必要なジョブに限定して +# issues: write を付与し、最小権限原則を維持する。 permissions: contents: read - pull-requests: write + pull-requests: read jobs: check-conflicts: + # PR コメントは Issues API (createComment/updateComment/deleteComment) で + # 行うため、pull-requests: write ではなく issues: write を付与する。 + permissions: + pull-requests: read + issues: write runs-on: ubuntu-latest steps: - name: Check PR conflicts and notify authors From 8c2a1b071471ac70375073a153467711dd7d23cd Mon Sep 17 00:00:00 2001 From: Toshiaki Wakabayashi Date: Thu, 21 May 2026 17:28:16 +0900 Subject: [PATCH 09/10] =?UTF-8?q?fix:=20style.css=20=E3=81=AE=20Prettier?= =?UTF-8?q?=20=E3=83=95=E3=82=A9=E3=83=BC=E3=83=9E=E3=83=83=E3=83=88?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CSS 属性セレクターのクォートをシングルクォートに統一し、 Prettier の format:check を通過するよう修正。 --- style.css | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/style.css b/style.css index b7e8cba..0f744b9 100644 --- a/style.css +++ b/style.css @@ -1354,88 +1354,88 @@ h3 { } /* 段ごとのカラーコーディング */ -.level-checkbox[data-level="1"] { +.level-checkbox[data-level='1'] { background: var(--color-dan-1); border-color: var(--color-dan-1-border); } -.level-checkbox[data-level="1"]:hover { +.level-checkbox[data-level='1']:hover { border-color: var(--color-dan-1-hover); } -.level-checkbox[data-level="2"] { +.level-checkbox[data-level='2'] { background: var(--color-dan-2); border-color: var(--color-dan-2-border); } -.level-checkbox[data-level="2"]:hover { +.level-checkbox[data-level='2']:hover { border-color: var(--color-dan-2-hover); } -.level-checkbox[data-level="3"] { +.level-checkbox[data-level='3'] { background: var(--color-dan-3); border-color: var(--color-dan-3-border); } -.level-checkbox[data-level="3"]:hover { +.level-checkbox[data-level='3']:hover { border-color: var(--color-dan-3-hover); } -.level-checkbox[data-level="4"] { +.level-checkbox[data-level='4'] { background: var(--color-dan-4); border-color: var(--color-dan-4-border); } -.level-checkbox[data-level="4"]:hover { +.level-checkbox[data-level='4']:hover { border-color: var(--color-dan-4-hover); } -.level-checkbox[data-level="5"] { +.level-checkbox[data-level='5'] { background: var(--color-dan-5); border-color: var(--color-dan-5-border); } -.level-checkbox[data-level="5"]:hover { +.level-checkbox[data-level='5']:hover { border-color: var(--color-dan-5-hover); } -.level-checkbox[data-level="6"] { +.level-checkbox[data-level='6'] { background: var(--color-dan-6); border-color: var(--color-dan-6-border); } -.level-checkbox[data-level="6"]:hover { +.level-checkbox[data-level='6']:hover { border-color: var(--color-dan-6-hover); } -.level-checkbox[data-level="7"] { +.level-checkbox[data-level='7'] { background: var(--color-dan-7); border-color: var(--color-dan-7-border); } -.level-checkbox[data-level="7"]:hover { +.level-checkbox[data-level='7']:hover { border-color: var(--color-dan-7-hover); } -.level-checkbox[data-level="8"] { +.level-checkbox[data-level='8'] { background: var(--color-dan-8); border-color: var(--color-dan-8-border); } -.level-checkbox[data-level="8"]:hover { +.level-checkbox[data-level='8']:hover { border-color: var(--color-dan-8-hover); } -.level-checkbox[data-level="9"] { +.level-checkbox[data-level='9'] { background: var(--color-dan-9); border-color: var(--color-dan-9-border); } -.level-checkbox[data-level="9"]:hover { +.level-checkbox[data-level='9']:hover { border-color: var(--color-dan-9-hover); } -.level-checkbox input[type="checkbox"] { +.level-checkbox input[type='checkbox'] { position: absolute; top: 8px; right: 8px; @@ -1446,12 +1446,12 @@ h3 { accent-color: var(--color-brand-primary); } -.level-checkbox input[type="checkbox"]:checked ~ .level-icon { +.level-checkbox input[type='checkbox']:checked ~ .level-icon { transform: scale(1.1); filter: drop-shadow(0 2px 4px rgba(102, 126, 234, 0.3)); } -.level-checkbox input[type="checkbox"]:checked ~ .level-text { +.level-checkbox input[type='checkbox']:checked ~ .level-text { font-weight: 700; color: var(--color-brand-primary); } From 0f37d78099237c073f94078484486586b32e1ca1 Mon Sep 17 00:00:00 2001 From: Toshiaki Wakabayashi Date: Thu, 21 May 2026 17:31:49 +0900 Subject: [PATCH 10/10] =?UTF-8?q?fix:=20=F0=9F=90=9B=20[Code=20Review]=20p?= =?UTF-8?q?re-commit=20=E3=83=95=E3=83=83=E3=82=AF=E3=81=AB=E5=A4=B1?= =?UTF-8?q?=E6=95=97=E4=BC=9D=E6=92=AD=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit .husky/pre-commit 内の npm run format:check および npm run lint 実行時に、失敗時に即座にコミットを中断するよう、"|| exit 1" を追加しました。 レビューコメント: https://github.com/genzouw/kakezan-manabo/pull/55#discussion_r3279714703 レビュアー: coderabbitai 優先度: high --- .husky/pre-commit | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index f27ad62..1f79a85 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -8,8 +8,8 @@ fi # Run format check echo "🎨 Running format check..." -npm run format:check +npm run format:check || exit 1 # Run lint echo "🔍 Running lint..." -npm run lint +npm run lint || exit 1