{
  "issues": [
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/41",
      "id": 3479588104,
      "node_id": "I_kwDOP6UBrs7PZk0I",
      "number": 41,
      "title": "[UI] 地圖關閉改為 Toggle 開啟/關閉",
      "user": {
        "login": "mitchhuang777",
        "id": 79703512,
        "node_id": "MDQ6VXNlcjc5NzAzNTEy",
        "avatar_url": "https://avatars.githubusercontent.com/u/79703512?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mitchhuang777",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-03T03:01:04Z",
      "updated_at": "2025-10-03T03:01:04Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### 描述\n目前在地圖右上方按下 `x` 關閉後，整個地圖元件會被移除，導致使用者無法在同一頁重新開啟地圖。若要再次顯示地圖，需重新載入或重新進入該頁面\n\n### 重現步驟\n1. 進入地圖頁面\n2. 按下右上方的 `x` 按鈕\n3. 嘗試重新顯示地圖 → 無法再顯示，需重新載入頁面\n\n### 預期行為\n- x 按鈕應改為 toggle 機制，僅控制地圖元件的顯示與隱藏，不應移除元件本身\n- 使用者應能在同一頁透過按鈕或操作重新開啟地圖，無須重新載入頁面",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/41/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/40",
      "id": 3479546163,
      "node_id": "I_kwDOP6UBrs7PZakz",
      "number": 40,
      "title": "建議新增 README 協作說明章節",
      "user": {
        "login": "mitchhuang777",
        "id": 79703512,
        "node_id": "MDQ6VXNlcjc5NzAzNTEy",
        "avatar_url": "https://avatars.githubusercontent.com/u/79703512?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mitchhuang777",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-03T02:31:17Z",
      "updated_at": "2025-10-03T02:33:35Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "目前專案的 README 說明文件主要介紹了專案的功能與系統架構，但**缺少如何一起協作**的相關資訊。對於想加入的工程師來說，可能會增加上手成本，影響 bug 修復與新功能開發的速度\n\n建議在 README 裡新增**如何協作**的章節，內容可包含：\n\n1. 協作流程\n- Issue / 任務分配方式\n\n2. 社群與討論空間 (如有)\n- Line\n- Discord\n\n3. 目前專案分配\n- 各模組或功能的負責人\n- 各功能預計上線時間",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/40/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/39",
      "id": 3479476714,
      "node_id": "I_kwDOP6UBrs7PZJnq",
      "number": 39,
      "title": "新增響應式斷點。 不過測試時在 375px（常見手機寬度）有點跑版。",
      "user": {
        "login": "tivenlou",
        "id": 12709664,
        "node_id": "MDQ6VXNlcjEyNzA5NjY0",
        "avatar_url": "https://avatars.githubusercontent.com/u/12709664?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tivenlou",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "tivenlou",
        "id": 12709664,
        "node_id": "MDQ6VXNlcjEyNzA5NjY0",
        "avatar_url": "https://avatars.githubusercontent.com/u/12709664?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tivenlou",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "tivenlou",
          "id": 12709664,
          "node_id": "MDQ6VXNlcjEyNzA5NjY0",
          "avatar_url": "https://avatars.githubusercontent.com/u/12709664?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/tivenlou",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": null,
      "comments": 1,
      "created_at": "2025-10-03T01:49:28Z",
      "updated_at": "2025-10-03T01:51:36Z",
      "closed_at": null,
      "author_association": "COLLABORATOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<img width=\"814\" height=\"753\" alt=\"image\" src=\"https://github.com/user-attachments/assets/cf8cfdda-04b5-4e6d-a0cc-4765b1b0bd29\" />\r\nLGTM\r\n\r\n#30，這次改動主要是新增響應式斷點。\r\n不過測試時在 375px（常見手機寬度）有點跑版。\r\n\r\n_Originally posted by @acogn30 in https://github.com/shovel-heroes-org/shovel-heroes/pull/30#pullrequestreview-3295276688_\r\n            ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/39/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/33",
      "id": 3478103266,
      "node_id": "I_kwDOP6UBrs7PT6Ti",
      "number": 33,
      "title": "Line登入問題",
      "user": {
        "login": "tivenlou",
        "id": 12709664,
        "node_id": "MDQ6VXNlcjEyNzA5NjY0",
        "avatar_url": "https://avatars.githubusercontent.com/u/12709664?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tivenlou",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-02T16:13:48Z",
      "updated_at": "2025-10-02T16:13:48Z",
      "closed_at": null,
      "author_association": "COLLABORATOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "目前用LINE 登入時出現問題.\n\n成功登入:\n<img width=\"840\" height=\"741\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/0a95cde0-f5e8-4580-9b68-38aba2ad0dd2\" />\n\n點完成登入後:\n<img width=\"931\" height=\"700\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/158cc625-1425-4fbf-b84e-f9a43edcb917\" />",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/33/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/32",
      "id": 3478065050,
      "node_id": "I_kwDOP6UBrs7PTw-a",
      "number": 32,
      "title": "分頁功能",
      "user": {
        "login": "PichuChen",
        "id": 600238,
        "node_id": "MDQ6VXNlcjYwMDIzOA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/600238?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/PichuChen",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-02T16:00:36Z",
      "updated_at": "2025-10-02T16:00:36Z",
      "closed_at": null,
      "author_association": "COLLABORATOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "接下來案件數量會越來越多，所以需要分頁功能。\n\n分頁功能可以參考 JSON-LD 的 Collection 的設計，在請求參數中增加 offset, limit 參數\n在回應參數中增加 `totalItems`, `first`, `next`, `prev`, `last`\n\n具體可參考這支 API\n\nhttps://guangfu250923.pttapp.cc/supplies",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/32/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/31",
      "id": 3478058373,
      "node_id": "I_kwDOP6UBrs7PTvWF",
      "number": 31,
      "title": "所有的寫入改動都必須要能被稽核",
      "user": {
        "login": "PichuChen",
        "id": 600238,
        "node_id": "MDQ6VXNlcjYwMDIzOA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/600238?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/PichuChen",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-02T15:58:10Z",
      "updated_at": "2025-10-02T15:58:10Z",
      "closed_at": null,
      "author_association": "COLLABORATOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "目前我們已經有 Line 登入了，所以接下來所有的寫入改動我們應該都要\n\n1. 驗證這個人是不是有登入\n2. 紀錄這個人的行為\n\n紀錄行為中，我希望我們要記錄下列資訊\n* method\n* path\n* query\n* ip `Cf-Connecting-Ip`\n* 標頭 \n* 請求的 payload\n* 回傳的 payload\n* 事件時間",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/31/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/28",
      "id": 3477924893,
      "node_id": "I_kwDOP6UBrs7PTOwd",
      "number": 28,
      "title": "新增 AGENTS.md",
      "user": {
        "login": "r05323028",
        "id": 37167503,
        "node_id": "MDQ6VXNlcjM3MTY3NTAz",
        "avatar_url": "https://avatars.githubusercontent.com/u/37167503?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/r05323028",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-02T15:16:48Z",
      "updated_at": "2025-10-02T15:16:48Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## 問題描述\n\n目前應該蠻多人會使用 Coding agent 來提升開發效率的, 希望能新增一份 [AGENTS.md](https://agents.md/) 讓大家的 Agent 產出的結果比較有一致性",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/28/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/25",
      "id": 3477627909,
      "node_id": "I_kwDOP6UBrs7PSGQF",
      "number": 25,
      "title": "標題跑版",
      "user": {
        "login": "r05323028",
        "id": 37167503,
        "node_id": "MDQ6VXNlcjM3MTY3NTAz",
        "avatar_url": "https://avatars.githubusercontent.com/u/37167503?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/r05323028",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "tivenlou",
        "id": 12709664,
        "node_id": "MDQ6VXNlcjEyNzA5NjY0",
        "avatar_url": "https://avatars.githubusercontent.com/u/12709664?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tivenlou",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "tivenlou",
          "id": 12709664,
          "node_id": "MDQ6VXNlcjEyNzA5NjY0",
          "avatar_url": "https://avatars.githubusercontent.com/u/12709664?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/tivenlou",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": null,
      "comments": 3,
      "created_at": "2025-10-02T13:53:20Z",
      "updated_at": "2025-10-02T15:05:15Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## 問題描述\n\n標題在寬度 767px ~ 869px 之間會跑出 AppBar\n\n## 截圖\n\n<img width=\"851\" height=\"810\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/499b98f7-17b3-4b05-894e-4ab5293ea04f\" />",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/25/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/21",
      "id": 3477324008,
      "node_id": "I_kwDOP6UBrs7PQ8Do",
      "number": 21,
      "title": "個資填寫聯絡資訊核取方塊",
      "user": {
        "login": "tanyakuo",
        "id": 48439150,
        "node_id": "MDQ6VXNlcjQ4NDM5MTUw",
        "avatar_url": "https://avatars.githubusercontent.com/u/48439150?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tanyakuo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9383743825,
          "node_id": "LA_kwDOP6UBrs8AAAACL1CRUQ",
          "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/labels/good%20first%20issue",
          "name": "good first issue",
          "color": "7057ff",
          "default": true,
          "description": "Good for newcomers"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-02T12:24:07Z",
      "updated_at": "2025-10-02T15:49:43Z",
      "closed_at": null,
      "author_association": "COLLABORATOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "新建位置需求、報名志工、捐獻物資填寫三位置的聯絡資訊核取方塊\n\n<img width=\"1052\" height=\"802\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/555d5123-dc82-4335-98f3-3b11ec72dd4e\" />\n<img width=\"930\" height=\"786\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/1dd8c82f-c1cc-4ee3-a6f6-15c06b053da0\" />\n\n勾選後才可送出表單",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/21/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/10",
      "id": 3475832935,
      "node_id": "I_kwDOP6UBrs7PLQBn",
      "number": 10,
      "title": "Security Policy 是錯的",
      "user": {
        "login": "PichuChen",
        "id": 600238,
        "node_id": "MDQ6VXNlcjYwMDIzOA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/600238?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/PichuChen",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-02T03:20:05Z",
      "updated_at": "2025-10-02T03:20:05Z",
      "closed_at": null,
      "author_association": "COLLABORATOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "> 請優先使用 GitHub 的 Security Advisories 私下回報（若有權限），或寄信至 [shovel-heroes@noreply.github.com](mailto:shovel-heroes@noreply.github.com)。\n\n這個信箱不會有人收，請直接在這邊開 ISSUE 或是送往 zeroday.hitcon.org",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/10/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    }
  ],
  "pulls": [
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/38",
      "id": 2882763746,
      "node_id": "PR_kwDOP6UBrs6r03vi",
      "number": 38,
      "state": "open",
      "locked": false,
      "title": "fix: 改善救援地圖頁面 UI 顯示",
      "user": {
        "login": "alianrektdoug",
        "id": 128123695,
        "node_id": "U_kgDOB6MDLw",
        "avatar_url": "https://avatars.githubusercontent.com/u/128123695?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/alianrektdoug",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "# 兩個功能修正\r\n     - Issue 1：桌面版右邊救援任務列表下方一塊空白，在手機版點地圖隱藏時，下方會跑出一塊空白\r\n        - Fix：拉長卡片列表與 Footer 貼齊\r\n\r\n     - Issues 2：桌面版在點 X 關閉地圖時會無法重新打開地圖\r\n        - Fix：重新調整顯示地圖按鈕，同步手機版的顯示地圖按鈕位置做顯示\r\n\r\n\r\n# 修正詳細資訊\r\n      - 修正桌面版「顯示地圖」按鈕邏輯\r\n        - 地圖隱藏時：桌面版和手機版都顯示「顯示地圖」按鈕\r\n        - 地圖顯示時：桌面版隱藏此按鈕（使用 X 按鈕），手機版隱藏\r\n\r\n      - 優化任務列表 ScrollArea 高度\r\n        - 調整為 h-[calc(100vh-280px)] 讓內容區域填滿到 footer\r\n        - 增加底部 padding (pb-6) 與 footer 明確分隔 - 調整卡片間距為 space-y-3 使視覺更緊湊\r\n\r\n\r\n\r\n# 修改前\r\n\r\n## 桌面版\r\n- 右邊救援任務列表下方一塊空白\r\n<img width=\"3000\" height=\"1812\" alt=\"image\" src=\"https://github.com/user-attachments/assets/d406d9ac-d691-46cd-836f-a52188c7b208\" />\r\n\r\n- 關閉地圖後無法找到重新打開地圖的按鈕\r\n<img width=\"2999\" height=\"1817\" alt=\"image\" src=\"https://github.com/user-attachments/assets/ce29d7f1-35cc-44cd-90a4-62cd6be4bc15\" />\r\n\r\n## 手機版\r\n- 隱藏地圖後救援任務列表下方一塊空白\r\n<img width=\"883\" height=\"1782\" alt=\"image\" src=\"https://github.com/user-attachments/assets/9243325f-d104-4993-971e-655f47049127\" />\r\n\r\n- 顯示地圖後救援任務列表下方一塊空白\r\n<img width=\"876\" height=\"1769\" alt=\"image\" src=\"https://github.com/user-attachments/assets/b11379d8-d504-4c67-bf6f-124d4119b1c5\" />\r\n\r\n\r\n# 修改後\r\n\r\n## 桌面版\r\n- 修正拉長卡片列表與 Footer 貼齊\r\n<img width=\"2908\" height=\"1697\" alt=\"image\" src=\"https://github.com/user-attachments/assets/7ce5540a-9281-44b2-a570-564a9a6a11b5\" />\r\n\r\n- 恢復顯示出顯示地圖的按鈕\r\n<img width=\"2934\" height=\"1788\" alt=\"image\" src=\"https://github.com/user-attachments/assets/6697e9b5-fc10-4138-ad28-d50b39b63588\" />\r\n\r\n## 手機版\r\n- 修正隱藏地圖拉長卡片列表與 Footer 貼齊\r\n<img width=\"720\" height=\"1768\" alt=\"image\" src=\"https://github.com/user-attachments/assets/e8ea0a53-b88f-4847-ba32-d8ab628f9310\" />\r\n\r\n- 修正顯示地圖拉長卡片列表與 Footer 貼齊\r\n<img width=\"733\" height=\"1780\" alt=\"image\" src=\"https://github.com/user-attachments/assets/f392a55f-2916-4cfd-96ad-d57218d47ca3\" />\r\n",
      "created_at": "2025-10-02T19:10:19Z",
      "updated_at": "2025-10-03T03:00:15Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "ace11f404783b7048be50c576aa1530ba6fdb8dd",
      "assignee": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "alianrektdoug:fix/map-ui-improvements",
        "ref": "fix/map-ui-improvements",
        "sha": "586cf5a9702d7ccc20f9502d6ed3d9d19fd3201a",
        "user": {
          "login": "alianrektdoug",
          "id": 128123695,
          "node_id": "U_kgDOB6MDLw",
          "avatar_url": "https://avatars.githubusercontent.com/u/128123695?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/alianrektdoug",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1068332960,
          "node_id": "R_kgDOP613oA",
          "name": "shovel-heroes",
          "full_name": "alianrektdoug/shovel-heroes",
          "private": false,
          "owner": {
            "login": "alianrektdoug",
            "id": 128123695,
            "node_id": "U_kgDOB6MDLw",
            "avatar_url": "https://avatars.githubusercontent.com/u/128123695?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/alianrektdoug",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "鏟子英雄",
          "fork": true,
          "url": "https://api.github.com/repos/alianrektdoug/shovel-heroes",
          "created_at": "2025-10-02T08:15:32Z",
          "updated_at": "2025-10-03T03:03:47Z",
          "pushed_at": "2025-10-03T03:03:41Z",
          "homepage": null,
          "size": 249,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "JavaScript",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": null,
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "shovel-heroes-org:main",
        "ref": "main",
        "sha": "a4559028cfd520f06f76205feb2040971b470fd8",
        "user": {
          "login": "shovel-heroes-org",
          "id": 235674219,
          "node_id": "O_kgDODgwaaw",
          "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/shovel-heroes-org",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1067778478,
          "node_id": "R_kgDOP6UBrg",
          "name": "shovel-heroes",
          "full_name": "shovel-heroes-org/shovel-heroes",
          "private": false,
          "owner": {
            "login": "shovel-heroes-org",
            "id": 235674219,
            "node_id": "O_kgDODgwaaw",
            "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/shovel-heroes-org",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "鏟子英雄",
          "fork": false,
          "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes",
          "created_at": "2025-10-01T11:29:17Z",
          "updated_at": "2025-10-03T01:22:41Z",
          "pushed_at": "2025-10-03T02:06:28Z",
          "homepage": null,
          "size": 287,
          "stargazers_count": 94,
          "watchers_count": 94,
          "language": "JavaScript",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 28,
          "archived": false,
          "disabled": false,
          "open_issues_count": 17,
          "license": null,
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 28,
          "open_issues": 17,
          "watchers": 94,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/38"
        },
        "html": {
          "href": "https://github.com/shovel-heroes-org/shovel-heroes/pull/38"
        },
        "issue": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/38"
        },
        "comments": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/38/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/38/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/38/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/statuses/586cf5a9702d7ccc20f9502d6ed3d9d19fd3201a"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/37",
      "id": 2882753411,
      "node_id": "PR_kwDOP6UBrs6r01OD",
      "number": 37,
      "state": "open",
      "locked": false,
      "title": "feat: basic pagination on volunteers route",
      "user": {
        "login": "ctchen222",
        "id": 49014608,
        "node_id": "MDQ6VXNlcjQ5MDE0NjA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/49014608?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ctchen222",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Summary\r\n---\r\nAdd proper pagination functionality on `/GET volunteers`\r\n\r\nChanges\r\n---\r\n- Originally, `offset` and `limit` were passed via params, I changed `offset` to `page`. Since it's more intuitive and more compatible with frontend.\r\n- I've preserved the `include_counts` parameter but refactored the status_counts logic to correctly handle pagination (limit, page).",
      "created_at": "2025-10-02T19:05:41Z",
      "updated_at": "2025-10-02T19:15:29Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "b0c279d834939ff079be0606ca2bc1995db4dad5",
      "assignee": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "ctchen222:feature/volunteer-pagination",
        "ref": "feature/volunteer-pagination",
        "sha": "10827b7046d8979de8c3953c79085c33f13cc2c9",
        "user": {
          "login": "ctchen222",
          "id": 49014608,
          "node_id": "MDQ6VXNlcjQ5MDE0NjA4",
          "avatar_url": "https://avatars.githubusercontent.com/u/49014608?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ctchen222",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1068577882,
          "node_id": "R_kgDOP7E0Wg",
          "name": "shovel-heroes",
          "full_name": "ctchen222/shovel-heroes",
          "private": false,
          "owner": {
            "login": "ctchen222",
            "id": 49014608,
            "node_id": "MDQ6VXNlcjQ5MDE0NjA4",
            "avatar_url": "https://avatars.githubusercontent.com/u/49014608?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/ctchen222",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "鏟子英雄",
          "fork": true,
          "url": "https://api.github.com/repos/ctchen222/shovel-heroes",
          "created_at": "2025-10-02T15:37:46Z",
          "updated_at": "2025-10-02T16:52:50Z",
          "pushed_at": "2025-10-02T18:51:35Z",
          "homepage": null,
          "size": 248,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "JavaScript",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": null,
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "shovel-heroes-org:main",
        "ref": "main",
        "sha": "a4559028cfd520f06f76205feb2040971b470fd8",
        "user": {
          "login": "shovel-heroes-org",
          "id": 235674219,
          "node_id": "O_kgDODgwaaw",
          "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/shovel-heroes-org",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1067778478,
          "node_id": "R_kgDOP6UBrg",
          "name": "shovel-heroes",
          "full_name": "shovel-heroes-org/shovel-heroes",
          "private": false,
          "owner": {
            "login": "shovel-heroes-org",
            "id": 235674219,
            "node_id": "O_kgDODgwaaw",
            "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/shovel-heroes-org",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "鏟子英雄",
          "fork": false,
          "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes",
          "created_at": "2025-10-01T11:29:17Z",
          "updated_at": "2025-10-03T01:22:41Z",
          "pushed_at": "2025-10-03T02:06:28Z",
          "homepage": null,
          "size": 287,
          "stargazers_count": 94,
          "watchers_count": 94,
          "language": "JavaScript",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 28,
          "archived": false,
          "disabled": false,
          "open_issues_count": 17,
          "license": null,
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 28,
          "open_issues": 17,
          "watchers": 94,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/37"
        },
        "html": {
          "href": "https://github.com/shovel-heroes-org/shovel-heroes/pull/37"
        },
        "issue": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/37"
        },
        "comments": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/37/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/37/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/37/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/statuses/10827b7046d8979de8c3953c79085c33f13cc2c9"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/36",
      "id": 2882694183,
      "node_id": "PR_kwDOP6UBrs6r0mwn",
      "number": 36,
      "state": "open",
      "locked": false,
      "title": "chore: add Zod schema generation from OpenAPI components",
      "user": {
        "login": "ericsen-tsai",
        "id": 90230992,
        "node_id": "MDQ6VXNlcjkwMjMwOTky",
        "avatar_url": "https://avatars.githubusercontent.com/u/90230992?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ericsen-tsai",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "## Summary\n\nThis PR introduces automated Zod schema generation from OpenAPI components, enabling runtime validation for the Shovel Heroes API. The implementation includes a comprehensive schema generation pipeline that extracts schemas from OpenAPI definitions and converts them to Zod schemas using ts-to-zod.\n\n## Changes\n\n- **Added Zod schema generation pipeline**: Created `generate-schemas.ts` script that extracts schemas from `openapi.ts` and generates Zod schemas\n- **Implemented build system**: Replaced TypeScript compiler with tsup for better ESM/CJS dual package support\n- **Added comprehensive schemas**: Generated Zod schemas for all OpenAPI components including `disasterAreaSchema`, `gridSchema`, `volunteerRegistrationSchema`, etc.\n- **Updated package scripts**: Added new npm scripts for schema generation (`schemas:generate`, `schemas:generate:components`, `schemas:generate:simple`)\n- **Enhanced codegen workflow**: Updated `codegen` script to include schema generation step\n\n## Additional Notes\n\nThe generated schemas include proper TypeScript types with Chinese descriptions and support for all OpenAPI schema features including unions, optional fields, and nested objects. The build system now supports both ESM and CommonJS formats with proper external dependency handling for Zod.",
      "created_at": "2025-10-02T18:43:01Z",
      "updated_at": "2025-10-03T02:23:27Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "d2d2891c1d8a63067cea11a42ba2a059dea44c27",
      "assignee": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "ericsen-tsai:chore/generate-zod-schema-from-openapi",
        "ref": "chore/generate-zod-schema-from-openapi",
        "sha": "28cc4b2b7e659a1b73a8e8d0b50a1f97897d32b7",
        "user": {
          "login": "ericsen-tsai",
          "id": 90230992,
          "node_id": "MDQ6VXNlcjkwMjMwOTky",
          "avatar_url": "https://avatars.githubusercontent.com/u/90230992?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ericsen-tsai",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1068587974,
          "node_id": "R_kgDOP7Fbxg",
          "name": "shovel-heroes",
          "full_name": "ericsen-tsai/shovel-heroes",
          "private": false,
          "owner": {
            "login": "ericsen-tsai",
            "id": 90230992,
            "node_id": "MDQ6VXNlcjkwMjMwOTky",
            "avatar_url": "https://avatars.githubusercontent.com/u/90230992?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/ericsen-tsai",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "鏟子英雄",
          "fork": true,
          "url": "https://api.github.com/repos/ericsen-tsai/shovel-heroes",
          "created_at": "2025-10-02T15:54:53Z",
          "updated_at": "2025-10-02T15:54:53Z",
          "pushed_at": "2025-10-03T02:22:57Z",
          "homepage": null,
          "size": 262,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": null,
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "shovel-heroes-org:main",
        "ref": "main",
        "sha": "fc00d14f98cbb8f52477cc1d4601ca2b30da4261",
        "user": {
          "login": "shovel-heroes-org",
          "id": 235674219,
          "node_id": "O_kgDODgwaaw",
          "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/shovel-heroes-org",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1067778478,
          "node_id": "R_kgDOP6UBrg",
          "name": "shovel-heroes",
          "full_name": "shovel-heroes-org/shovel-heroes",
          "private": false,
          "owner": {
            "login": "shovel-heroes-org",
            "id": 235674219,
            "node_id": "O_kgDODgwaaw",
            "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/shovel-heroes-org",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "鏟子英雄",
          "fork": false,
          "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes",
          "created_at": "2025-10-01T11:29:17Z",
          "updated_at": "2025-10-03T01:22:41Z",
          "pushed_at": "2025-10-03T02:06:28Z",
          "homepage": null,
          "size": 287,
          "stargazers_count": 94,
          "watchers_count": 94,
          "language": "JavaScript",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 28,
          "archived": false,
          "disabled": false,
          "open_issues_count": 17,
          "license": null,
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 28,
          "open_issues": 17,
          "watchers": 94,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/36"
        },
        "html": {
          "href": "https://github.com/shovel-heroes-org/shovel-heroes/pull/36"
        },
        "issue": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/36"
        },
        "comments": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/36/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/36/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/36/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/statuses/28cc4b2b7e659a1b73a8e8d0b50a1f97897d32b7"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/35",
      "id": 2882666893,
      "node_id": "PR_kwDOP6UBrs6r0gGN",
      "number": 35,
      "state": "open",
      "locked": false,
      "title": "Update issue templates",
      "user": {
        "login": "PichuChen",
        "id": 600238,
        "node_id": "MDQ6VXNlcjYwMDIzOA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/600238?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/PichuChen",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": null,
      "created_at": "2025-10-02T18:31:14Z",
      "updated_at": "2025-10-02T18:31:38Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "bec97960ef15a0be17e2616f154a1a416a27b573",
      "assignee": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "shovel-heroes-org:PichuChen-patch-2",
        "ref": "PichuChen-patch-2",
        "sha": "15f3b2061b93655ecaeaa41478e75ce571f324a3",
        "user": {
          "login": "shovel-heroes-org",
          "id": 235674219,
          "node_id": "O_kgDODgwaaw",
          "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/shovel-heroes-org",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1067778478,
          "node_id": "R_kgDOP6UBrg",
          "name": "shovel-heroes",
          "full_name": "shovel-heroes-org/shovel-heroes",
          "private": false,
          "owner": {
            "login": "shovel-heroes-org",
            "id": 235674219,
            "node_id": "O_kgDODgwaaw",
            "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/shovel-heroes-org",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "鏟子英雄",
          "fork": false,
          "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes",
          "created_at": "2025-10-01T11:29:17Z",
          "updated_at": "2025-10-03T01:22:41Z",
          "pushed_at": "2025-10-03T02:06:28Z",
          "homepage": null,
          "size": 287,
          "stargazers_count": 94,
          "watchers_count": 94,
          "language": "JavaScript",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 28,
          "archived": false,
          "disabled": false,
          "open_issues_count": 17,
          "license": null,
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 28,
          "open_issues": 17,
          "watchers": 94,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "shovel-heroes-org:main",
        "ref": "main",
        "sha": "a4559028cfd520f06f76205feb2040971b470fd8",
        "user": {
          "login": "shovel-heroes-org",
          "id": 235674219,
          "node_id": "O_kgDODgwaaw",
          "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/shovel-heroes-org",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1067778478,
          "node_id": "R_kgDOP6UBrg",
          "name": "shovel-heroes",
          "full_name": "shovel-heroes-org/shovel-heroes",
          "private": false,
          "owner": {
            "login": "shovel-heroes-org",
            "id": 235674219,
            "node_id": "O_kgDODgwaaw",
            "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/shovel-heroes-org",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "鏟子英雄",
          "fork": false,
          "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes",
          "created_at": "2025-10-01T11:29:17Z",
          "updated_at": "2025-10-03T01:22:41Z",
          "pushed_at": "2025-10-03T02:06:28Z",
          "homepage": null,
          "size": 287,
          "stargazers_count": 94,
          "watchers_count": 94,
          "language": "JavaScript",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 28,
          "archived": false,
          "disabled": false,
          "open_issues_count": 17,
          "license": null,
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 28,
          "open_issues": 17,
          "watchers": 94,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/35"
        },
        "html": {
          "href": "https://github.com/shovel-heroes-org/shovel-heroes/pull/35"
        },
        "issue": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/35"
        },
        "comments": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/35/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/35/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/35/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/statuses/15f3b2061b93655ecaeaa41478e75ce571f324a3"
        }
      },
      "author_association": "COLLABORATOR",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/34",
      "id": 2882373324,
      "node_id": "PR_kwDOP6UBrs6rzYbM",
      "number": 34,
      "state": "open",
      "locked": false,
      "title": "Add CodeQL analysis workflow configuration",
      "user": {
        "login": "PichuChen",
        "id": 600238,
        "node_id": "MDQ6VXNlcjYwMDIzOA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/600238?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/PichuChen",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": null,
      "created_at": "2025-10-02T16:40:59Z",
      "updated_at": "2025-10-02T16:41:41Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "9d32a411102a35705b1652bfec39bad78f2e999e",
      "assignee": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "shovel-heroes-org:PichuChen-patch-1",
        "ref": "PichuChen-patch-1",
        "sha": "60178ad3957e2408250764b77366acb29f5d15f2",
        "user": {
          "login": "shovel-heroes-org",
          "id": 235674219,
          "node_id": "O_kgDODgwaaw",
          "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/shovel-heroes-org",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1067778478,
          "node_id": "R_kgDOP6UBrg",
          "name": "shovel-heroes",
          "full_name": "shovel-heroes-org/shovel-heroes",
          "private": false,
          "owner": {
            "login": "shovel-heroes-org",
            "id": 235674219,
            "node_id": "O_kgDODgwaaw",
            "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/shovel-heroes-org",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "鏟子英雄",
          "fork": false,
          "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes",
          "created_at": "2025-10-01T11:29:17Z",
          "updated_at": "2025-10-03T01:22:41Z",
          "pushed_at": "2025-10-03T02:06:28Z",
          "homepage": null,
          "size": 287,
          "stargazers_count": 94,
          "watchers_count": 94,
          "language": "JavaScript",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 28,
          "archived": false,
          "disabled": false,
          "open_issues_count": 17,
          "license": null,
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 28,
          "open_issues": 17,
          "watchers": 94,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "shovel-heroes-org:main",
        "ref": "main",
        "sha": "a4559028cfd520f06f76205feb2040971b470fd8",
        "user": {
          "login": "shovel-heroes-org",
          "id": 235674219,
          "node_id": "O_kgDODgwaaw",
          "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/shovel-heroes-org",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1067778478,
          "node_id": "R_kgDOP6UBrg",
          "name": "shovel-heroes",
          "full_name": "shovel-heroes-org/shovel-heroes",
          "private": false,
          "owner": {
            "login": "shovel-heroes-org",
            "id": 235674219,
            "node_id": "O_kgDODgwaaw",
            "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/shovel-heroes-org",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "鏟子英雄",
          "fork": false,
          "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes",
          "created_at": "2025-10-01T11:29:17Z",
          "updated_at": "2025-10-03T01:22:41Z",
          "pushed_at": "2025-10-03T02:06:28Z",
          "homepage": null,
          "size": 287,
          "stargazers_count": 94,
          "watchers_count": 94,
          "language": "JavaScript",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 28,
          "archived": false,
          "disabled": false,
          "open_issues_count": 17,
          "license": null,
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 28,
          "open_issues": 17,
          "watchers": 94,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/34"
        },
        "html": {
          "href": "https://github.com/shovel-heroes-org/shovel-heroes/pull/34"
        },
        "issue": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/34"
        },
        "comments": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/34/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/34/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/34/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/statuses/60178ad3957e2408250764b77366acb29f5d15f2"
        }
      },
      "author_association": "COLLABORATOR",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/26",
      "id": 2881950530,
      "node_id": "PR_kwDOP6UBrs6rxxNC",
      "number": 26,
      "state": "open",
      "locked": false,
      "title": "fix: adjust text size for better responsiveness in header",
      "user": {
        "login": "r05323028",
        "id": 37167503,
        "node_id": "MDQ6VXNlcjM3MTY3NTAz",
        "avatar_url": "https://avatars.githubusercontent.com/u/37167503?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/r05323028",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "## Original issue\r\n#25 標題跑版\r\n\r\n## Resolution\r\n- 姑且在這個寬度區間先把副標題藏起來\r\n\r\n## Before\r\n<img width=\"1702\" height=\"1620\" alt=\"image\" src=\"https://github.com/user-attachments/assets/58b5a9d1-9172-47c6-aef7-0c210200d596\" />\r\n\r\n\r\n## After\r\n<img width=\"857\" height=\"618\" alt=\"截圖 2025-10-02 晚上10 09 00\" src=\"https://github.com/user-attachments/assets/d11fb397-d1e7-440a-8916-aab1921453aa\" />\r\n",
      "created_at": "2025-10-02T14:13:53Z",
      "updated_at": "2025-10-03T01:04:31Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignee": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "r05323028:fix/header-style",
        "ref": "fix/header-style",
        "sha": "01c6775b1f02e26db75db57781bee784eac67727",
        "user": {
          "login": "r05323028",
          "id": 37167503,
          "node_id": "MDQ6VXNlcjM3MTY3NTAz",
          "avatar_url": "https://avatars.githubusercontent.com/u/37167503?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/r05323028",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1068451653,
          "node_id": "R_kgDOP69HRQ",
          "name": "shovel-heroes",
          "full_name": "r05323028/shovel-heroes",
          "private": false,
          "owner": {
            "login": "r05323028",
            "id": 37167503,
            "node_id": "MDQ6VXNlcjM3MTY3NTAz",
            "avatar_url": "https://avatars.githubusercontent.com/u/37167503?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/r05323028",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "鏟子英雄",
          "fork": true,
          "url": "https://api.github.com/repos/r05323028/shovel-heroes",
          "created_at": "2025-10-02T12:06:49Z",
          "updated_at": "2025-10-02T14:07:53Z",
          "pushed_at": "2025-10-02T14:08:34Z",
          "homepage": null,
          "size": 241,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "JavaScript",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": null,
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "shovel-heroes-org:main",
        "ref": "main",
        "sha": "f87d5839476a4a4befb8b7e69ca327cb2f4a772c",
        "user": {
          "login": "shovel-heroes-org",
          "id": 235674219,
          "node_id": "O_kgDODgwaaw",
          "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/shovel-heroes-org",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1067778478,
          "node_id": "R_kgDOP6UBrg",
          "name": "shovel-heroes",
          "full_name": "shovel-heroes-org/shovel-heroes",
          "private": false,
          "owner": {
            "login": "shovel-heroes-org",
            "id": 235674219,
            "node_id": "O_kgDODgwaaw",
            "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/shovel-heroes-org",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "鏟子英雄",
          "fork": false,
          "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes",
          "created_at": "2025-10-01T11:29:17Z",
          "updated_at": "2025-10-03T01:22:41Z",
          "pushed_at": "2025-10-03T02:06:28Z",
          "homepage": null,
          "size": 287,
          "stargazers_count": 94,
          "watchers_count": 94,
          "language": "JavaScript",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 28,
          "archived": false,
          "disabled": false,
          "open_issues_count": 17,
          "license": null,
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 28,
          "open_issues": 17,
          "watchers": 94,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/26"
        },
        "html": {
          "href": "https://github.com/shovel-heroes-org/shovel-heroes/pull/26"
        },
        "issue": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/26"
        },
        "comments": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/26/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/26/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/26/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/statuses/01c6775b1f02e26db75db57781bee784eac67727"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": [
        2
      ]
    },
    {
      "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/24",
      "id": 2881776945,
      "node_id": "PR_kwDOP6UBrs6rxG0x",
      "number": 24,
      "state": "open",
      "locked": false,
      "title": "feat(security): 實施最小化安全強化措施",
      "user": {
        "login": "s123104",
        "id": 88911350,
        "node_id": "MDQ6VXNlcjg4OTExMzUw",
        "avatar_url": "https://avatars.githubusercontent.com/u/88911350?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/s123104",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "## 📋 變更摘要\n\n本 PR 實施全面的後端與前端安全強化措施，遵循**最小修改原則**，僅包含必要的安全性改善，無過度工程化。\n\n---\n\n## 🛡️ 安全改善清單\n\n### 後端安全強化\n\n#### 1. Helmet 安全標頭\n- ✅ 自動設定多項安全 HTTP 標頭\n- ✅ 啟用 HSTS (HTTP Strict Transport Security)\n  - `maxAge: 31536000` (1 年)\n  - `includeSubDomains: true`\n  - `preload: true`\n\n#### 2. API 速率限制\n- ✅ 防止 DDoS 和暴力破解攻擊\n- ✅ 限制: 每分鐘 100 個請求\n- ✅ 友善的錯誤訊息包含 `retryAfter`\n\n#### 3. CORS 白名單配置\n- ✅ 環境分離策略：\n  - **開發環境**: 允許 localhost:5173-5178\n  - **生產環境**: 僅允許 `ALLOWED_ORIGINS` 環境變數指定的域名\n  - **預設值**: `https://shovel-heroes.netlify.app`\n- ✅ 彈性配置支援多個域名（逗號分隔）\n- ✅ 記錄被阻擋的請求（安全審計）\n- ✅ 防止 CSRF 攻擊和資料洩露\n\n#### 4. 認證中間件\n- ✅ `requireAuth`: 保護需要認證的路由\n- ✅ `optionalAuth`: 支援可選認證的路由\n- ✅ JWT token 驗證框架（TODO: 實作真實 JWT 驗證）\n- ✅ 型別安全的 `AuthenticatedRequest`\n\n#### 5. 路由層級認證保護\n根據 Fastify 官方文檔的 `preHandler` hooks 最佳實踐實施：\n\n**已保護的路由**:\n- `announcements` - GET (可選), POST (必須)\n- `disaster-areas` - GET (可選), POST/PUT/DELETE (必須)\n- `grids` - GET (可選), POST (必須)\n- `supply-donations` - 完整認證\n- `grid-discussions` - 完整認證\n- `users` - 完整認證\n- `volunteers` - 完整認證\n- `volunteer-registrations` - 完整認證\n\n### 前端安全強化\n\n#### 6. Content Security Policy (CSP)\n在 `index.html` 新增 CSP meta tag：\n```html\n<meta http-equiv=\"Content-Security-Policy\" \n      content=\"default-src 'self'; \n               script-src 'self' 'unsafe-inline'; \n               style-src 'self' 'unsafe-inline'; \n               img-src 'self' data: https:; \n               connect-src 'self' https:; \n               font-src 'self' https:;\" />\n```\n\n#### 7. Netlify 部署安全標頭\n新增 `netlify.toml` 配置：\n- ✅ SPA 路由重定向\n- ✅ `X-Frame-Options: DENY` - 防止點擊劫持\n- ✅ `X-Content-Type-Options: nosniff` - 防止 MIME 嗅探\n- ✅ `Referrer-Policy: strict-origin-when-cross-origin`\n- ✅ `Permissions-Policy: geolocation=()` - 限制瀏覽器功能\n\n### 配置與文檔\n\n#### 8. 環境變數配置\n更新 `.env.example` 包含完整說明：\n```bash\n# CORS Configuration\n# Comma-separated list of allowed origins for production\n# Example: ALLOWED_ORIGINS=https://shovel-heroes.netlify.app,https://www.shovel-heroes.com\nALLOWED_ORIGINS=https://shovel-heroes.netlify.app\n```\n\n---\n\n## 📊 與 feature/essential-updates 的對比\n\n### ✅ 安全功能完整性\n所有安全功能都已完整實現，無任何遺漏。\n\n### ✨ 改進之處\n1. **CORS 配置更靈活** - 支援環境變數動態配置\n2. **環境變數文檔更完整** - 清楚的範例和說明\n3. **程式碼風格統一** - 雙引號格式化\n\n### 🎯 遵循最小修改原則\n- ✅ **無格式化變更混入** - 僅雙引號風格統一（IDE 自動格式化）\n- ✅ **無內容變更** - title、favicon 等保持原樣\n- ✅ **無開發工具配置混入** - 無 .gitmessage、.gitignore 等\n- ✅ **無版本升級混入** - 僅安全相關套件\n- ✅ **純粹的安全性增強** - 每個變更都有明確的安全理由\n\n---\n\n## 🔍 技術實作細節\n\n### 基於官方文檔\n- Fastify Hooks: [context7:/fastify/fastify:2025-10-02]\n- @fastify/cors: [context7:/fastify/fastify-cors:2025-10-02]\n- @fastify/helmet: 官方推薦配置\n- @fastify/rate-limit: 官方推薦配置\n\n### 提交歷史\n```\n3117683 - 路由認證 + 前端安全 + Netlify 配置\n7c4ec14 - CORS 白名單 (環境變數配置)\nb020fc1 - Fastify 套件版本修復\n0387728 - 認證中間件 + HSTS\n326d6c1 - 最小安全強化 (Helmet + Rate Limit)\n```\n\n---\n\n## ✅ 測試驗證\n\n- ✅ TypeScript 編譯通過\n- ✅ 無 Linter 錯誤\n- ✅ 後端啟動正常\n- ✅ CORS 白名單運作正常\n- ✅ 認證中間件運作正常\n\n---\n\n## 📚 相關文檔\n\n- 安全分析報告: `security-reports/` (已刪除，避免混淆)\n- 環境變數配置: `packages/backend/.env.example`\n\n---\n\n## 🚀 部署注意事項\n\n### Netlify 環境變數設定\n生產環境需設定以下環境變數：\n```\nNODE_ENV=production\nALLOWED_ORIGINS=https://shovel-heroes.netlify.app\n```\n\n如需支援多個域名：\n```\nALLOWED_ORIGINS=https://shovel-heroes.netlify.app,https://www.shovel-heroes.com\n```\n\n---\n\n## 👥 Review 重點\n\n1. **安全配置是否符合專案需求**\n2. **CORS 白名單域名是否正確**\n3. **認證邏輯是否需要調整**\n4. **環境變數配置是否清楚**\n\n---\n\n**Type**: Security Enhancement  \n**Priority**: High  \n**Breaking Changes**: None  \n**Backward Compatible**: Yes",
      "created_at": "2025-10-02T13:20:05Z",
      "updated_at": "2025-10-02T19:37:11Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignee": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "haotool:feature/security-minimal",
        "ref": "feature/security-minimal",
        "sha": "f4a0f3788d0fbdebe9aa97ffeebd0389b86de35e",
        "user": {
          "login": "haotool",
          "id": 226545447,
          "node_id": "O_kgDODYDPJw",
          "avatar_url": "https://avatars.githubusercontent.com/u/226545447?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/haotool",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1068032227,
          "node_id": "R_kgDOP6jg4w",
          "name": "shovel-heroes",
          "full_name": "haotool/shovel-heroes",
          "private": false,
          "owner": {
            "login": "haotool",
            "id": 226545447,
            "node_id": "O_kgDODYDPJw",
            "avatar_url": "https://avatars.githubusercontent.com/u/226545447?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/haotool",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "鏟子英雄",
          "fork": true,
          "url": "https://api.github.com/repos/haotool/shovel-heroes",
          "created_at": "2025-10-01T18:47:48Z",
          "updated_at": "2025-10-02T09:51:58Z",
          "pushed_at": "2025-10-02T19:36:41Z",
          "homepage": null,
          "size": 265,
          "stargazers_count": 1,
          "watchers_count": 1,
          "language": "JavaScript",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 1,
          "license": null,
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 1,
          "watchers": 1,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "shovel-heroes-org:main",
        "ref": "main",
        "sha": "a4559028cfd520f06f76205feb2040971b470fd8",
        "user": {
          "login": "shovel-heroes-org",
          "id": 235674219,
          "node_id": "O_kgDODgwaaw",
          "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/shovel-heroes-org",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1067778478,
          "node_id": "R_kgDOP6UBrg",
          "name": "shovel-heroes",
          "full_name": "shovel-heroes-org/shovel-heroes",
          "private": false,
          "owner": {
            "login": "shovel-heroes-org",
            "id": 235674219,
            "node_id": "O_kgDODgwaaw",
            "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/shovel-heroes-org",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "鏟子英雄",
          "fork": false,
          "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes",
          "created_at": "2025-10-01T11:29:17Z",
          "updated_at": "2025-10-03T01:22:41Z",
          "pushed_at": "2025-10-03T02:06:28Z",
          "homepage": null,
          "size": 287,
          "stargazers_count": 94,
          "watchers_count": 94,
          "language": "JavaScript",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 28,
          "archived": false,
          "disabled": false,
          "open_issues_count": 17,
          "license": null,
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 28,
          "open_issues": 17,
          "watchers": 94,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/24"
        },
        "html": {
          "href": "https://github.com/shovel-heroes-org/shovel-heroes/pull/24"
        },
        "issue": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/24"
        },
        "comments": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/issues/24/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/24/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/pulls/24/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes/statuses/f4a0f3788d0fbdebe9aa97ffeebd0389b86de35e"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": []
    }
  ],
  "discussions": [],
  "details": {
    "id": 1067778478,
    "node_id": "R_kgDOP6UBrg",
    "name": "shovel-heroes",
    "full_name": "shovel-heroes-org/shovel-heroes",
    "private": false,
    "owner": {
      "login": "shovel-heroes-org",
      "id": 235674219,
      "node_id": "O_kgDODgwaaw",
      "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/shovel-heroes-org",
      "type": "Organization",
      "user_view_type": "public",
      "site_admin": false
    },
    "description": "鏟子英雄",
    "fork": false,
    "url": "https://api.github.com/repos/shovel-heroes-org/shovel-heroes",
    "created_at": "2025-10-01T11:29:17Z",
    "updated_at": "2025-10-03T01:22:41Z",
    "pushed_at": "2025-10-03T02:06:28Z",
    "homepage": null,
    "size": 287,
    "stargazers_count": 94,
    "watchers_count": 94,
    "language": "JavaScript",
    "has_issues": true,
    "has_projects": true,
    "has_downloads": true,
    "has_wiki": false,
    "has_pages": false,
    "has_discussions": false,
    "forks_count": 28,
    "archived": false,
    "disabled": false,
    "open_issues_count": 17,
    "license": null,
    "allow_forking": true,
    "is_template": false,
    "web_commit_signoff_required": false,
    "topics": {},
    "visibility": "public",
    "forks": 28,
    "open_issues": 17,
    "watchers": 94,
    "default_branch": "main",
    "permissions": {
      "admin": false,
      "maintain": false,
      "push": false,
      "triage": false,
      "pull": true
    },
    "temp_clone_token": "",
    "custom_properties": {},
    "organization": {
      "login": "shovel-heroes-org",
      "id": 235674219,
      "node_id": "O_kgDODgwaaw",
      "avatar_url": "https://avatars.githubusercontent.com/u/235674219?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/shovel-heroes-org",
      "type": "Organization",
      "user_view_type": "public",
      "site_admin": false
    },
    "network_count": 28,
    "subscribers_count": 3
  },
  "lastFetched": 1759461095673
}