* chore(config): 添加 demo 目录到 git 忽略列表
- 防止 demo 相关文件被意外提交到仓库
- 保持仓库整洁,避免临时演示文件污染版本历史
* feat(qqbot): add file attachment send and receive support
- Add downloadAttachmentFiles() to download non-image attachments
- Populate core.Message.Files in group and C2C message handlers
- Implement core.FileSender via SendFile() using rich media API (file_type=4)
* ci: add test-build workflow for tag-triggered linux/amd64 builds
* fix(ci): add contents:write permission for release creation
* fix(ci): separate build and release jobs with artifact passing
* fix(qqbot): pass file_name in rich media upload for correct filename display
* chore: remove test-build workflow and restore gitignore
* fix(qqbot): add HTTP status check, LimitReader, and tests for file download
- Check resp.StatusCode in downloadAttachmentImages and downloadAttachmentFiles
- Use io.LimitReader with 20MB cap to prevent unbounded memory reads
- Add unit tests for download functions and uploadRichMedia file_name branch
- Restore test-build.yml workflow
* chore: remove test-build workflow
* test(qqbot): use httptest in SkipsImages test instead of example.com
* fix(qqbot): extract quoted message content from msg_elements for quote replies
When a user quotes/replies to a message, QQ Bot API sends message_type=103
with the referenced content in msg_elements[0]. Previously only message_reference
inline fields and cache were checked, which often came up empty.
* chore: restore test-build workflow for tag-based CI
* chore: remove test-build workflow
---------
Co-authored-by: ferock <ferock@example.com>