feat: 为两个市场团队及全部成员发布透明头像 (#203)

## Summary

Publish transparent portraits for both marketplace teams and all 11
roster members. Team cards use the supervisor portrait; a separate
`member-avatars.v1.json` sidecar supplies member images without changing
the strict `entry.json` member contract accepted by older clients. The
two catalog pointers now reference the merged team releases and their
updated member locks.

为市场中的两个团队和全部 11 位成员发布透明人像。团队卡片复用组长形象,成员图片由独立 sidecar
提供,旧客户端仍可读取原有团队条目。团队指针更新至已合并的团队版本与成员锁文件。

## Validation

- Catalog metadata validation: 0 errors (123 existing warnings)
- i18n validation: 0 errors (123 existing warnings)
- Translation freshness: passed
- Image assets: all 11 member portraits and 2 team portraits are
transparent WebP files
This commit is contained in:
2026-09-30 18:13:27 +08:00
committed by GitHub
parent 81aa0cf450
commit 7ce79c5cc9
21 changed files with 164 additions and 37 deletions

View File

@@ -0,0 +1,45 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Market Team Member Portraits",
"description": "Optional market-only portraits for published team members. Keep this separate from entry.json so older clients can continue to read the team.",
"type": "object",
"required": ["schemaVersion", "members"],
"properties": {
"$schema": {
"type": "string",
"description": "Relative path to this validation schema."
},
"schemaVersion": {
"type": "integer",
"const": 1,
"description": "Sidecar format version."
},
"members": {
"type": "object",
"description": "Portraits keyed by published team roster member ID.",
"propertyNames": {
"pattern": "^[A-Za-z0-9_-]+$"
},
"additionalProperties": {
"type": "object",
"required": ["image"],
"properties": {
"image": {
"type": "object",
"required": ["path"],
"properties": {
"path": {
"type": "string",
"pattern": "^(?!/|[A-Za-z]:|.*\\.\\.)(?:[A-Za-z0-9_.-]+/)*[A-Za-z0-9_.-]+\\.(?:png|jpe?g|webp)$",
"description": "Relative portrait image path inside the market team directory."
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}