Commit Graph

199 Commits

Author SHA1 Message Date
a620906209 990f84c21a chore(docs): 標記 H1、H2 完成並於 .env.example 註明正式環境設定
Run Tests / test (pull_request) Successful in 38s
- todo 文件:H1 由 PR #71、#72 完成;H2 已於 VPS 確認 APP_DEBUG=false、APP_ENV=production、未使用預設 DB 密碼
- .env.example:APP_DEBUG 上方加註正式環境必須的值

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 00:47:01 +08:00
a620906209 ffed798ed5 Merge pull request 'chore(openspec): 歸檔 add-role-middleware 並同步主規格' (#72) from chore/archive-add-role-middleware into master
Deploy Production / deploy (push) Successful in 1m40s
Run Tests / test (push) Successful in 37s
Reviewed-on: #72
2026-10-17 16:40:54 +00:00
a620906209 d83d941993 chore(openspec): 歸檔 add-role-middleware 並同步主規格
Run Tests / test (pull_request) Successful in 34s
- 新增主規格 role-authorization,更新 feature-test-coverage 的 middleware 描述
- 勾選手動驗證任務 5.1、5.2(23/23)
- CLAUDE.md 授權規範與 openspec/config.yaml 移除「member/provider 只有 auth:sanctum」的過時說明

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 00:30:05 +08:00
a620906209 544894fa55 Merge pull request 'security(auth): 新增 member/provider 角色 middleware' (#71) from security/implement-role-middleware into master
Deploy Production / deploy (push) Successful in 1m45s
Run Tests / test (push) Successful in 41s
Reviewed-on: #71
2026-10-17 16:12:02 +00:00
a620906209 90fc8f2d49 style: 以 pint 格式化 routes、Docs 與 BookingListTest
Run Tests / test (pull_request) Successful in 36s
純格式調整,不改變行為。這四個檔案在 master 上即未通過 pint,
因本次功能變更觸及而一併修正,以符合變更檔案需通過 pint 的審查要求。

- 已驗證 route:list 除角色 middleware 外無差異
- 已驗證 l5-swagger 產出的 JSON 在格式化前後完全相同

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 23:57:30 +08:00
a620906209 16ccb4c18c security(auth): 新增 member/provider 角色 middleware
補上待辦 H1:/api/member/*、/api/provider/* 原本只掛 auth:sanctum,
任何已登入帳號都能跨角色建立課程、預約與評價。

- 新增 EnsureMember、EnsureProvider(結構同 EnsureAdmin),註冊 alias
  member、provider,掛到對應路由群組;角色不符回 403
  { status: false, message: "無權限存取" },未登入仍由 auth:sanctum 回 401
- provider middleware 不檢查審核狀態,未通過審核的教練仍可送審
- 新增 RoleAuthorizationTest:member/provider/admin/未登入跨角色測試,
  並驗證越權請求不產生資料;跨角色共用路由(通知、未讀訊息數)不受影響
- Swagger:member/provider 端點的 403 描述補上角色不符,補齊列表端點 403
- 更新 BookingListTest docblock 的過時描述
- 完成 tasks 1.1–4.3;5.1、5.2 手動驗證尚未執行

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 23:57:16 +08:00
a620906209 9e4331d4f7 Merge pull request 'security(openspec): 新增 add-role-middleware change 規劃' (#70) from security/add-role-middleware into master
Deploy Production / deploy (push) Successful in 1m46s
Run Tests / test (push) Successful in 34s
Reviewed-on: #70
2026-10-17 15:30:15 +00:00
a620906209 6feb79bc1a security(openspec): 新增 add-role-middleware change 規劃
Run Tests / test (pull_request) Successful in 36s
待辦 H1:member/provider 路由群組補上角色 middleware。
新增 role-authorization 規格,並修改 feature-test-coverage 的
「預約列表端點測試覆蓋」。spec-reviewer 與 design-hardener 均 PASS。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 23:28:06 +08:00
a620906209 1839e9008f Merge branch 'chore/add-github-test-workflow': 新增 GitHub 鏡像專用測試 workflow
Deploy Production / deploy (push) Successful in 6m21s
Run Tests / test (push) Successful in 35s
2026-10-17 23:09:55 +08:00
a620906209 09aa5175e3 Merge branch 'docs/complete-backlog-items': 待辦新增功能與延後項目 F1–F7 2026-10-17 23:09:55 +08:00
a620906209 efb7d1b773 ci(github): 新增 GitHub 鏡像專用的測試 workflow
Gitea 讀 .gitea/workflows,GitHub 讀 .github/workflows,兩者互不影響。
GitHub 版改用 ubuntu-latest + setup-php(PHP 8.2 對齊正式環境);
不含 deploy,部署只走 Gitea。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 23:06:53 +08:00
a620906209 f07d15609f docs(analysis): 待辦新增功能與延後項目 F1–F7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 23:06:28 +08:00
a620906209 245a0a3f84 Merge pull request 'docs(analysis): 待辦新增 M7(預約例外訊息洩漏)與 M8(預約狀態並發競態)' (#69) from docs/add-review-findings-m7-m8 into master
Deploy Production / deploy (push) Successful in 1m37s
Run Tests / test (push) Successful in 36s
Reviewed-on: #69
2026-10-14 17:02:27 +00:00
a620906209 42b3884f09 docs(analysis): 待辦新增 M7(預約例外訊息洩漏)與 M8(預約狀態並發競態)
Run Tests / test (pull_request) Successful in 34s
2026-10-15 00:39:26 +08:00
a620906209 4fa6822a23 Merge pull request 'chore(claude): 新增 hardener skill(Laravel 版)並於 CLAUDE.md 補上審查流程' (#68) from chore/add-hardener-skill into master
Deploy Production / deploy (push) Successful in 1m38s
Run Tests / test (push) Successful in 35s
Reviewed-on: #68
2026-10-14 16:37:07 +00:00
a620906209 7b90fdc5f9 chore(claude): 新增 hardener skill(Laravel 版)並於 CLAUDE.md 補上審查流程
Run Tests / test (pull_request) Successful in 34s
2026-10-15 00:36:29 +08:00
a620906209 fe533413a9 Merge pull request 'chore(claude): 新增 design-hardener 設計加固審查 subagent(Pi 與 Claude Code 版)' (#67) from chore/add-design-hardener into master
Deploy Production / deploy (push) Successful in 1m35s
Run Tests / test (push) Successful in 36s
Reviewed-on: #67
2026-10-14 16:21:40 +00:00
a620906209 8e079185fa chore(claude): 新增 design-hardener 設計加固審查 subagent(Pi 與 Claude Code 版)
Run Tests / test (pull_request) Successful in 34s
2026-10-15 00:13:44 +08:00
a620906209 2af6be75a9 Merge pull request 'chore(claude): 新增 spec-reviewer、strict-reviewer 的 Claude Code 版本(sonnet)並更新審查流程說明' (#66) from chore/add-claude-review-subagents into master
Deploy Production / deploy (push) Successful in 1m45s
Run Tests / test (push) Successful in 46s
Reviewed-on: #66
2026-10-14 16:09:42 +00:00
a620906209 9f86ccad05 chore(claude): 新增 spec-reviewer、strict-reviewer 的 Claude Code 版本(sonnet)並更新審查流程說明
Run Tests / test (pull_request) Successful in 45s
2026-10-15 00:09:00 +08:00
a620906209 990a260f95 Merge pull request 'chore(pi): 新增 spec-reviewer、strict-reviewer 審查 subagent,並於 CLAUDE.md 補上審查流程' (#65) from chore/add-review-subagents into master
Deploy Production / deploy (push) Successful in 1m39s
Run Tests / test (push) Successful in 39s
Reviewed-on: #65
2026-10-14 16:05:59 +00:00
a620906209 ad455742c6 chore(pi): 新增 spec-reviewer、strict-reviewer 審查 subagent,並於 CLAUDE.md 補上審查流程
Run Tests / test (pull_request) Successful in 34s
2026-10-15 00:05:22 +08:00
a620906209 f9e83cadfe Merge pull request 'chore(openspec): 升級 OpenSpec CLI 至 1.14.1 並重新產生 skill 與指令' (#64) from chore/upgrade-openspec into master
Deploy Production / deploy (push) Successful in 1m39s
Run Tests / test (push) Successful in 42s
Reviewed-on: #64
2026-10-14 15:57:20 +00:00
a620906209 291b7e5889 chore(openspec): 以 operations guidance 取代 apply skill 自訂區塊
Run Tests / test (pull_request) Successful in 35s
2026-10-14 23:56:26 +08:00
a620906209 82d99d00a7 chore(openspec): 升級 OpenSpec CLI 至 1.14.1 並重新產生 skill 與指令 2026-10-14 23:56:26 +08:00
a620906209 e899f38267 Merge pull request 'docs(claude): CLAUDE.md 補上工具分工、專案慣例、授權規範、驗證指令與 Git/PR 流程' (#63) from chore/claude-workflow-tooling into master
Deploy Production / deploy (push) Successful in 1m44s
Run Tests / test (push) Successful in 39s
Reviewed-on: #63
2026-10-14 15:54:37 +00:00
a620906209 a59179d96c docs(analysis): 更新 prompt 改善計畫進度
Run Tests / test (pull_request) Successful in 40s
2026-10-14 23:45:54 +08:00
a620906209 c1698a45b6 chore(claude): 修正 branch-and-propose、apply 加入測試對應檢查,新增 verify-and-report 與 finish-and-pr 2026-10-14 23:45:54 +08:00
a620906209 ee1ba1cef3 chore(windsurf): 移除與 CLAUDE.md 衝突的 ponytail 規則 2026-10-14 23:45:53 +08:00
a620906209 e6f59f25d3 docs(claude): CLAUDE.md 補上工具分工、專案慣例、授權規範、驗證指令與 Git/PR 流程 2026-10-14 23:45:53 +08:00
a620906209 cb64d45572 Merge pull request 'chore(openspec): 更新 config.yaml 專案 context 並補上 proposal/specs/design/tasks 規則' (#62) from chore/update-openspec-config into master
Deploy Production / deploy (push) Successful in 1m39s
Run Tests / test (push) Successful in 34s
Reviewed-on: #62
2026-10-14 15:23:50 +00:00
a620906209 db4f11a740 docs(analysis): 修正 M3 描述,通知實際已多數使用 ShouldQueue,下修優先度
Run Tests / test (pull_request) Successful in 39s
2026-10-14 23:22:19 +08:00
a620906209 529ba94dc7 chore(openspec): 更新 config.yaml 專案 context 並補上 proposal/specs/design/tasks 規則 2026-10-14 23:20:26 +08:00
a620906209 7edd1bfcdc Merge pull request 'chore(claude): 新增 AC 對應測試規則與 branch-and-propose skill' (#61) from chore/claude-md-ac-test-rule into master
Deploy Production / deploy (push) Successful in 1m37s
Run Tests / test (push) Successful in 41s
Reviewed-on: #61
2026-10-14 14:39:43 +00:00
a620906209 871c0546fd docs(analysis): 新增專案審視待辦與 project prompt 改善計畫
Run Tests / test (pull_request) Successful in 35s
2026-10-14 22:36:58 +08:00
a620906209 eb9c7080af chore(claude): 新增 AC 對應測試規則與 branch-and-propose skill 2026-10-14 20:39:43 +08:00
a620906209 4b81166f25 Merge pull request 'chore(openspec): 歸檔 bake-image-remove-bind-mount + 同步主規格' (#60) from chore/archive-bake-image-remove-bind-mount into master
Deploy Production / deploy (push) Successful in 1m40s
Run Tests / test (push) Successful in 38s
Reviewed-on: #60
2026-08-04 09:44:41 +00:00
a620906209 05a116beee chore(openspec): 歸檔 bake-image-remove-bind-mount + 同步主規格
Run Tests / test (pull_request) Successful in 32s
VPS 部署與功能驗證皆已完成(tasks.md 7.7/7.8),change 移入
archive/2026-08-04-bake-image-remove-bind-mount。同步兩份 delta spec:
新建 image-baked-deployment 主規格(multi-stage build、symlink 建立、
nginx 獨立 build target、env_file 注入等 11 條 requirement);更新
scheduler-container 補上「不依賴 bind mount」的敘述與 scenario。
openspec validate --strict --specs 39/39 全過。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0142LC1kQb8EyV59TjHDkhWS
2026-08-04 17:41:59 +08:00
a620906209 286db8ffe2 Merge pull request 'chore(openspec): 新增 bake-image-remove-bind-mount change 規劃' (#59) from feat/bake-image-remove-bind-mount into master
Deploy Production / deploy (push) Successful in 5m50s
Run Tests / test (push) Successful in 33s
Reviewed-on: #59
2026-08-04 09:06:50 +00:00
a620906209 6a7d98b0fe feat(docker): 移除 bind mount,程式碼與 vendor 烘進 image
Run Tests / test (pull_request) Successful in 32s
Dockerfile 改 multi-stage(app + web),app/scheduler/queue-worker/
reverb/nginx 五個服務都不再依賴 ./:/var/www bind mount 取得程式碼;
nginx 改本地 build 從 app 階段 COPY --from 取得 public/,public/storage
symlink 在兩階段各自於 build 時建立。docker-compose.yml 新增具名 volume
storage-app-public 讓上傳檔案跨 image 重建保留;env_file: 取代原本
bind mount 帶入 .env 的方式,只給四個 Laravel runtime 服務。
compose.override.yml 補上開發用 bind mount 維持改 code 立即生效;
docker-entrypoint.sh 收斂到只剩目錄權限設定,migration/cache/swagger
移到 deploy.yml 統一負責,避免職責重疊。

實作驗證時發現並修復三個規劃階段沒預見的問題:app 服務的 build: 缺
target: app 導致預設建到最後一個 stage(image 實際變成 nginx);
.dockerignore 需排除本機既有的 public/storage 符號連結(Windows 上
會讓 build context 打包失敗);env_file: 讓 .env 全部變數變成真實
環境變數、蓋掉 phpunit.xml 的測試隔離設定,已擴大 tests/bootstrap.php
的強制覆蓋清單修復(239 tests 全綠)。

本機 dev 模式與 production 模式(無 override)皆完整驗證:healthcheck、
migration/cache/swagger、上傳檔案持久性、nginx 獨立於 app 服務靜態檔
與 storage 檔案、.env 熱更新、nginx 無 .env 存取權。

openspec change: bake-image-remove-bind-mount

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0142LC1kQb8EyV59TjHDkhWS
2026-08-04 16:59:18 +08:00
a620906209 3b0cdf96d8 chore(openspec): 新增 bake-image-remove-bind-mount change 規劃
P0「移除 Docker bind mount、程式碼烘進 image」的完整規劃:Dockerfile
改 multi-stage(app + web)、docker-compose.yml 拿掉五個服務的 bind
mount、nginx 改本地 build 取得 public/、deploy.yml 改 build-then-up、
entrypoint 職責收斂、.dockerignore 補齊。尚未實作,僅規劃文件。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0142LC1kQb8EyV59TjHDkhWS
2026-08-04 16:22:50 +08:00
a620906209 9a1de393f6 Merge pull request 'docs(openspec): 補齊所有 spec 缺少的 Purpose section' (#58) from chore/openspec-spec-purpose-sections into master
Deploy Production / deploy (push) Successful in 16s
Run Tests / test (push) Successful in 37s
Reviewed-on: #58
2026-08-02 20:14:09 +00:00
a620906209 0cd1047b10 docs(openspec): 補齊所有 spec 缺少的 Purpose section 與規格標頭
Run Tests / test (pull_request) Successful in 30s
repo 內 35/38 份既有 spec 都是舊版歸檔流程留下的原始 delta 內容(`##
ADDED Requirements`,缺標題與 Purpose),openspec CLI 現版本嚴格驗證
(--strict)會報錯或警告。逐一補上:

- 缺標題/Purpose 的 30 份:加上 `# <name> Specification` 標題 + 依內容
  撰寫的 Purpose 段落,`## ADDED Requirements` 改回 `## Requirements`
- compose-cloud-baseline、scheduler-container:已有標題與
  Requirements,只補 Purpose 包裝
- provider-verification:已有標題與 Purpose,只需把
  `## ADDED Requirements` 改回 `## Requirements`
- admin-user-management、notification-email:各有一條 requirement 缺
  SHALL/MUST 關鍵字(純敘述句或表格),補上規範用語,內容不變

`openspec validate --specs --strict`:38/38 全過(原本 4/38)。純文件
補齊,未變更任何 requirement 的實質內容或行為描述。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011LpcY9b7y9x4fusHBTXciQ
2026-08-03 04:11:06 +08:00
a620906209 81411877f8 chore(openspec): 歸檔 cloud-ready-s3-storage + 同步主規格
Run Tests / test (pull_request) Successful in 32s
程式碼部分(tasks 1-3)已完成並測試通過,符合 spec 描述的行為(可測試
的程式邏輯,非部署狀態)。R2 帳號申請、VPS 部署與正式切換(tasks 4-6)
仍暫緩,待後續另開 change 處理,archive 後的 tasks.md 保留暫緩註記。

順便修正 env-cloud-annotations 主規格缺少 ## Purpose section 的問題
(openspec CLI 現版本嚴格驗證要求),這是既有規格檔案的既存缺口,本次
只修了本 change 有動到的這一份,其餘規格檔案的同類問題不在此次範圍。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011LpcY9b7y9x4fusHBTXciQ
2026-08-03 04:00:17 +08:00
a620906209 0af6d2a089 Merge pull request 'fix(ci): 補上 php84-simplexml,修正 aws-sdk-php composer install 失敗' (#56) from feat/cloud-ready-s3-storage into master
Deploy Production / deploy (push) Successful in 16s
Run Tests / test (push) Successful in 40s
Reviewed-on: #56
2026-08-02 19:47:25 +00:00
a620906209 3b73be4051 fix(ci): 補上 php84-simplexml,修正 aws-sdk-php composer install 失敗
Run Tests / test (pull_request) Successful in 39s
aws/aws-sdk-php(因 league/flysystem-aws-s3-v3 新增)要求 ext-simplexml,
CI 的 Alpine runner 用 apk 逐一裝擴充套件,之前沒裝這個 package 導致
composer install 失敗。正式環境的 Dockerfile 是 Debian 版 php:8.2-fpm,
simplexml 內建就有,不受影響,只有 CI 這邊要補。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011LpcY9b7y9x4fusHBTXciQ
2026-08-03 03:46:10 +08:00
a620906209 15318d5734 Merge pull request 'feat(storage): S3 相容物件儲存支援(cloud-ready-s3-storage)' (#55) from feat/cloud-ready-s3-storage into master
Deploy Production / deploy (push) Successful in 23s
Run Tests / test (push) Failing after 15s
Reviewed-on: #55
2026-08-02 19:44:03 +00:00
a620906209 a0fa339d6d docs: 標註 S3 相容儲存尚未啟用(缺 R2 帳號)
Run Tests / test (pull_request) Failing after 11s
在 .env.example 的 AWS_* 區塊與 MigrateStorageToS3 command 加上
TODO(2026-08-03) 註解,說明目前功能已實作但因缺帳號未啟用,直接在
code 裡就看得到狀態,不用另外翻 openspec 文件。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011LpcY9b7y9x4fusHBTXciQ
2026-08-03 03:40:47 +08:00
a620906209 1c81b5fc10 docs(openspec): 標記 cloud-ready-s3-storage R2/VPS 階段暫緩
Hank 目前沒有 S3 相容服務帳號,tasks 4-6(R2 建置、VPS 遷移、切換驗證)
暫緩,等申請帳號後再繼續。程式碼部分(1-3 組)已完成,不受影響。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011LpcY9b7y9x4fusHBTXciQ
2026-08-03 03:38:20 +08:00
a620906209 54178f6d70 feat(storage): S3 相容物件儲存支援 + 一次性遷移指令
實作 cloud-ready-s3-storage 的程式碼部分(tasks 1-3):

- config/filesystems.php:public disk 的 driver 改吃 FILESYSTEM_DISK env,
  切換為 s3 時不需改動既有 6 個 Storage::disk('public') 呼叫點
- .env.example:FILESYSTEM_DISK 維持 local 預設(本機無 S3 服務),補齊
  AWS_ENDPOINT/AWS_URL/AWS_USE_PATH_STYLE_ENDPOINT 供 R2 等服務使用
- 新增 storage:migrate-to-s3 指令:一次性把 storage/app/public 既有檔案
  上傳到 S3,來源固定讀本機磁碟(不受 FILESYSTEM_DISK 影響),支援
  --dry-run,失敗不中斷且不刪除本機檔案
- 新增測試:遷移指令(上傳/dry-run/部分失敗)+ public disk 在 local
  driver 下零 AWS credentials 也能正常運作

239 tests passed / 578 assertions,容器內驗證無回歸。

R2 環境準備、VPS 部署與實際切換(tasks 4-6)待 Hank 自行處理。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011LpcY9b7y9x4fusHBTXciQ
2026-08-03 03:35:24 +08:00