diff --git a/AGENTS.md b/AGENTS.md index 1b9992d..fd9884a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -72,3 +72,90 @@ git push -u origin gh pr create --fill ``` Wait for CI to pass on the PR before merging. + +## Batch PR Workflow + +When handling multiple issues split across several PRs that target the same files: + +1. **Group issues by logical category** into separate PR branches (e.g., memory-safety, refactoring, test-coverage). +2. **Fix and push** each branch independently. Let CI run on each PR. +3. **Run all 3 reviewer types** on each PR and post results to Gitea via `tea pr approve/reject` or the Gitea API: + - `reviewer` — general code correctness + - `code-quality-guardian` — code quality, duplication, complexity + - `security-auditor` — vulnerability assessment +4. **Iterate**: if any reviewer requests changes, fix, push, re-review. Repeat until all 3 approve. +5. **Merge approved PRs** one at a time into `main`. +6. **Create a combined merge branch** for the remaining PRs that conflict with the new `main`: + ```bash + git checkout -b merge-all origin/main + for branch in branch1 branch2 branch3; do + git merge origin/$branch --no-edit || true + # Resolve conflicts, build, test + done + ``` +7. **Run review again** on the combined branch. Fix issues, push, re-review until approved. +8. **Merge** the combined PR, **close** the redundant individual PRs, and **close all resolved issues** via the Gitea API: + ```bash + curl -s -X PATCH -H "Authorization: token $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"state":"closed"}' \ + "https://gitea.tap-tap.win/api/v1/repos/owner/repo/issues/" + ``` + +## CI Troubleshooting + +### If lint (clang-format) fails +Run clang-format in the CI Docker image to match the exact CI version: +```bash +docker run --rm -v "$PWD:/workspace" -w /workspace gitea.tap-tap.win/taptap/fastsync-ci:v9 \ + sh -c 'find src/ tests/ -name "*.c" -o -name "*.h" | xargs clang-format -i' +``` + +### If cppcheck fails +Fix reported issues locally, then verify with: +```bash +docker run --rm -v "$PWD:/workspace" -w /workspace gitea.tap-tap.win/taptap/fastsync-ci:v9 \ + sh -c 'cppcheck --enable=warning,style,performance,portability --suppress=missingIncludeSystem --error-exitcode=1 --inline-suppr src/ tests/' +``` + +### If integration tests fail +Run locally before pushing: +```bash +python3 -m pytest tests/ -v --tb=short +``` + +## Gitea API & tea CLI + +### Check CI status via API +```bash +TOKEN="" +curl -s -H "Authorization: token $TOKEN" \ + "https://gitea.tap-tap.win/api/v1/repos/TapTap/FastSync/actions/runs?limit=5" \ + | python3 -c " +import json,sys; d=json.load(sys.stdin) +for r in d.get('workflow_runs',[]): + path = r.get('path','') + prn = path.split('@')[1].replace('refs/pull/','').replace('/head','') if '@' in path else '' + print(f'PR #{prn}: sha={r[\"head_sha\"][:8]} {r[\"status\"]} {r.get(\"conclusion\",\"\")}') +" +``` + +### Post review comments +```bash +curl -s -X POST -H "Authorization: token $TOKEN" -H "Content-Type: application/json" \ + -d '{"body":"MARKDOWN_REVIEW_BODY"}' \ + "https://gitea.tap-tap.win/api/v1/repos/TapTap/FastSync/issues//comments" +``` + +### Use tea for PR operations +```bash +tea pr list --repo TapTap/FastSync +tea pr close --repo TapTap/FastSync +``` + +## Common pitfalls + +- **`__thread` on shared SSL context**: io_ssl must NOT be thread-local — worker threads inherit the SSL context from the main thread. Use regular `static SSL* io_ssl`. +- **SSL WANT_READ/WANT_WRITE retry**: Always retry on `SSL_ERROR_WANT_READ` and `SSL_ERROR_WANT_WRITE` in `send_n_data`/`receive_n_data`. Removing these breaks TLS multithreaded transfers. +- **clang-format version**: The CI image uses clang-format 18. Always format inside the CI Docker container for exact match. +- **Merge order matters**: Merge the most comprehensive branch first, then smaller ones, to minimize conflicts when creating a combined branch.