Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 674,
"has_wiki": true,
"homepage": "https://whosee.me",
"languages": {
"Go": 470079,
"Shell": 14009,
"Dockerfile": 2122
},
"pushed_at": "2025-12-30T08:51:20Z",
"created_at": "2025-03-28T12:24:08Z",
"owner_type": "User",
"updated_at": "2026-07-01T15:12:00Z",
"description": "(whosee)Domain WHOIS Lookup的后端服务器",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": null,
"name": "Yu",
"type": "User",
"login": "AsisYu",
"company": null,
"location": null,
"followers": 9,
"avatar_url": "https://avatars.githubusercontent.com/u/68932312?v=4",
"created_at": "2020-07-29T01:14:15Z",
"is_verified": null,
"public_repos": 19,
"account_age_days": 2189
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.0.0",
"kind": "major",
"published_at": "2025-06-08T14:58:40Z"
}
],
"recent_commits": [
{
"oid": "d1343c7702de8137857527a16dcdf17808f37d33",
"body": "在所有API响应示例中添加success字段,使文档与后端实际返回格式保持一致。\n这解决了前端类型校验失败的问题。\n\n主要更新:\n- WHOIS查询API: 添加 \"success\": true 字段\n- DNS查询API: 添加 \"success\": true 字段\n- 网站截图API: 添加 \"success\": true 字段\n- ITDog测速API (所有类型): 添加 \"success\": true 字段\n- 错误响应格式: 更新为正确的嵌套结构,包含 \"success\": false\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(api): 修复API文档返回格式不一致问题",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-30T08:51:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cdcf63c8e9606b5843816817213c7d627ed50826",
"body": "- 集成uber-go/zap实现高性能结构化日志\n- 自动记录caller信息(文件:行号:函数)帮助快速定位错误\n- 实现Request ID全链路追踪贯穿整个调用链\n- 新增HTTP访问日志中间件记录请求详情\n- 迁移认证中间件和主服务到结构化日志\n- Error级别日志自动附带完整stack trace\n\n解决前端开发者调试时无法快速定位后端错误根源的问题,大幅提升开发者体验(DX)和问题排查效率。\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(logging): 实现企业级结构化日志系统提升错误定位能力",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-30T08:11:58Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "90471f4cdc49ce036956feba93c4a84e1d18a9c3",
"body": "本次提交修复了认证系统中的多个P0级安全漏洞并显著改善了开发体验:\n\n## 修复的安全问题\n\n### 1. Nonce重放攻击竞争条件 (P0)\n- 问题:EXISTS+SET非原子操作,允许并发重放攻击\n- 修复:使用Redis SetNX原子操作\n- 影响:彻底消除nonce验证的竞争条件\n\n### 2. Rate Limiter失败开放漏洞 (P0)\n- 问题:Redis错误被忽略,导致速率限制完全失效\n- 修复:Redis错误时返回503 fail-closed\n- 影响:防止Redis故障期间的无限请求\n\n### 3. JWT_SECRET缺失验证 (P0)\n- 问题:空密钥=任何人\n[…]\n向后兼容\n\n## 部署注意\n- 需要JWT_SECRET环境变量(缺失将Fatal)\n- 生产环境自动强制Release模式\n- Redis故障时rate limiter返回503\n\nReviewed-by: Codex AI\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>\n🤖 Generated with Claude Code",
"is_bot": false,
"headline": "security(auth): 修复认证中间件的关键安全漏洞和DX问题",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-30T06:49:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a4e0ec61f646ba64ae5ed567164c4d979cb778ff",
"body": "Increased initial delay and failure threshold for liveness and readiness probes to allow more time for startup.",
"is_bot": false,
"headline": "Update liveness and readiness probe settings",
"author_name": "Yu",
"author_login": "AsisYu",
"committed_at": "2025-12-19T09:37:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8c0da727d819b36ee93144b968d3c956806ebd3a",
"body": "修复编译错误:conversion from int to string yields a string of one rune\n\n问题:\n- middleware/cors.go:141使用string(int)进行类型转换\n- 在Go中,string(int)会将数字转换为Unicode字符,而非数字字符串\n- 导致编译失败\n\n修复:\n- 添加strconv包import\n- 使用strconv.Itoa()正确转换int到string\n- Access-Control-Max-Age头现在包含正确的数字字符串\n\n此bug由新添加的unit-test job发现,证明CI优化的价值 ✅\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(middleware): 修复CORS中int到string的类型转换错误",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-18T14:00:30Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "22c360dd72a10d981a11971de4a301b8501ccb0d",
"body": "通过智能文件检测,大幅减少Docker构建次数和CI资源消耗。\n\n主要优化:\n1. 添加paths-filter检测Docker相关文件变更\n2. 添加unit-test job快速验证代码质量\n3. 添加workflow_dispatch支持手动触发\n4. 条件化build-and-push job,仅在必要时构建\n\nWorkflow结构:\n- unit-test:每次都运行(~1-2分钟)\n- detect-docker-impact:检测文件变更(~10-20秒)\n- build-and-push:条件触发(~5-10分钟)\n\n触发条件:\n- ✅ tag推送(v*.*.*):总是构建\n-\n[…]\n额\n\n修复:\n- 添加build步骤的id以正确输出digest\n- 修复多行if表达式的YAML语法\n\n已通过Codex多轮review验证(LGTM)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "perf(ci): 优化Docker workflow避免不必要的镜像构建",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-18T13:47:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "196ac82f6d24ead7616cf102670e0abb3caa39af",
"body": "添加Docker Hub部署相关文档和自动化workflow。\n\n新增文件:\n- DOCKER_HUB_README.md: Docker Hub镜像使用文档\n - 完整的快速开始指南\n - API端点说明\n - 环境变量配置\n - 故障排查指南\n\n- .github/workflows/docker-publish.yml: Docker镜像构建和发布workflow\n - 支持main分支push和tag触发\n - 多架构构建(linux/amd64, linux/arm64)\n - 自动推送到Docker Hub (hansomeyu/whosee-server)\n - 多种tag策略(branch, semver, sha, latest)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: 添加Docker Hub README和GitHub Actions workflow",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-18T13:21:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a64d2ace6a3b200c79a749bf5283495c4764dc6d",
"body": "修复了P0和P1级别的配置问题,使K8s配置达到生产就绪状态。\n\nP0修复(阻止部署):\n- 修复镜像地址:移除无效的变量占位符,使用实际镜像名\n- 修复健康检查路径:/health → /api/health\n- 修复健康检查端口:3000 → 3900\n- 添加RWX存储说明:强制用户配置storageClassName\n\nP1修复(生产环境):\n- 统一端口配置为3900(与Dockerfile、文档保持一致)\n- 添加Redis密码认证(使用Secret + ConfigMap)\n- 优化资源配置(CPU: 2核, Memory: 2Gi)\n- 优化Chrome配置(GOMEMLIMI\n[…]\n加密码认证和ConfigMap配置\n- k8s/pvc.yaml: 添加44行RWX存储说明文档\n\n所有修改已通过Codex review验证(LGTM)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(k8s): 修复Kubernetes配置的关键部署问题",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-18T13:21:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "74ee8877fc3748dc39d752152dabf88f1e986a0d",
"body": "This workflow builds and pushes a Docker image to Docker Hub on pushes to the main branch or version tags. It includes steps for setting up QEMU, Docker Buildx, logging in to Docker Hub, extracting metadata, and building the image.",
"is_bot": false,
"headline": "Add Docker Build & Push GitHub Actions workflow",
"author_name": "Yu",
"author_login": "AsisYu",
"committed_at": "2025-12-17T17:21:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d3a8f8998e96cc33993d33e1f4751e5c959736f2",
"body": "新增:\n- docs/DOCKER_PUBLISH_GUIDE.md: 完整的Docker自动构建配置指南\n\n更新:\n- README.md: 添加Docker Hub徽章和部署指南\n - 预构建镜像使用方法\n - docker-compose示例\n - 多平台支持说明\n\nDocker Hub地址:\nhttps://hub.docker.com/r/hansomeyu/whosee-server\n\n注:GitHub Actions workflow需要单独配置(需要workflow权限)",
"is_bot": false,
"headline": "docs: 添加Docker Hub部署指南和更新README",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-17T17:18:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7e2b1e7ca3fbf9a476e049e910bf942423d873fe",
"body": "修复SCREENSHOT_USAGE_GUIDE.md文档示例无法使用的问题\n\n问题:\n- domainValidationMiddleware只检查URL和query参数\n- 统一截图API使用JSON body传递domain参数\n- middleware在handler之前执行,直接拒绝请求\n\n修复:\n- 新增extractDomainFromBody函数支持从JSON body提取domain\n- 只处理POST/PUT/PATCH的JSON请求\n- 读取body后重置,不影响后续handler\n- 参数优先级:URL路径 > Query > JSON body\n\n测试验证:\n- 基础截图(JSON body)✓\n- 元素截图(JSON body)✓\n- Query参数方式 ✓\n- 混合参数方式 ✓",
"is_bot": false,
"headline": "fix(middleware): 支持从JSON body提取domain参数",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-04T10:02:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ff65f72aea4e060c86d476ebe5e8c43408416f41",
"body": "修复两个crypto/x509标准库漏洞:\n- GO-2025-4175: 通配符名称验证的DNS约束应用不当\n- GO-2025-4155: 证书验证错误字符串的资源过度消耗\n\n变更:\n- 升级go.mod toolchain从1.24.1到1.24.11\n- GitHub Actions将自动使用go.mod中的toolchain版本",
"is_bot": false,
"headline": "fix(security): 升级Go toolchain到1.24.11修复CVE漏洞",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-04T08:45:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "31cbfe0df8aafa6bce95302bf7f86a5ca296c986",
"body": "- 移除README.md中的表情符号\n- 清理所有文档中的emoji图标\n- 统一文档风格\n- 符合用户要求:禁止使用emoji表情和图标",
"is_bot": false,
"headline": "docs: 清理所有文档中的emoji表情符号",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-04T07:56:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b21a7100ecf0bc6e2357c30987d8723322217658",
"body": "创建完整的截图服务使用指南文档 (SCREENSHOT_USAGE_GUIDE.md)\n\n## 内容概要\n\n1. 快速开始\n - 前提条件\n - 三种认证方式(JWT+API Key, 仅API Key, 开发模式)\n\n2. 统一API使用(推荐)\n - POST /api/v1/screenshot/ 端点\n - 基本请求格式\n\n3. 六种截图类型详解\n - basic: 完整页面截图\n - element: 特定元素截图(CSS/XPath选择器)\n - itdog_map: ITDog性能地图\n - itdog_table: ITDog结果表格\n - \n[…]\n性能提示\n - Chrome模式选择\n - 并发控制\n - 响应时间预期\n\n12. 故障排查\n - 3种常见问题的解决方法\n\n13. 完整示例脚本\n - 端到端的Bash脚本\n\n该文档提供了从入门到精通的完整使用指导。\n\nGenerated with Claude Code\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: 添加截图服务使用指南",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-04T07:33:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c5b58c160985392ed539ac238126b284130d73e6",
"body": "1. 修复BACKEND_AUTHENTICATION_FLOW.md的Mermaid语法错误\n - 问题: Mermaid无法解析 C[/api/auth/token] 语法\n - 原因: /符号在Mermaid中有特殊含义\n - 修复: 使用引号包裹 C[\"POST /api/auth/token\"]\n - 测试: GitHub Mermaid渲染器现在可以正确显示流程图\n\n2. 创建docs/SCREENSHOT_REFACTOR.md完整文档\n - 架构设计和核心组件详解\n - ScreenshotService功能说明(6种截图类型)\n - ChromeM\n[…]\nleware顺序修复说明\n - 性能优化对比(4-6倍速度提升,90%内存降低)\n - 监控健康检查指标\n - 迁移指南和故障排查\n - 配置参考和最佳实践\n - 技术栈和未来规划\n\n文档现在完整覆盖截图服务重构架构的所有方面。\n\nGenerated with Claude Code\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: 修复Mermaid流程图错误并添加截图服务重构文档",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-04T07:28:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b1f8ab4b4988d62d357ad321f885ad2fd4aa3010",
"body": "- 新增: docs/reports/P2_SECURITY_FIX_REPORT.md\n - P2-1 JWT Token IP绑定验证详细说明\n - P2-2 Screenshot缓存TTL限制详细说明\n - P2-3 统一截图架构启用详细说明\n - Codex发现的middleware顺序bug及修复\n - 完整的测试验证和部署建议\n\n- 更新: docs/reports/README.md\n - 添加P2报告到目录结构\n - 添加P2报告说明章节\n - 更新问题追踪表格(P2标记为已修复)\n - 更新修复阶段表格(添加P2修复commit)\n - 更新质量指标(P2\n[…]\nd\n - 将\"修复优先级建议\"改为\"修复优先级建议与完成状态\"\n - 标记P0/P1/P2所有问题的修复状态和commit\n - 添加报告引用链接\n - 更新\"下一步行动\"为最新状态\n\n本次文档更新移除了所有emoji图标,采用纯文本格式。\n\nGenerated with Claude Code\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: 添加P2修复报告并更新文档状态",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-04T07:12:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "50bd2fbf58da1925544e01fab86674794e21582a",
"body": "## P2-1: JWT Token IP绑定验证 🔐\n**文件**: middleware/auth.go\n- 添加normalizeIP()函数,正确处理IPv4/IPv6和IPv4-mapped-IPv6\n- 在AuthRequired中验证token IP与请求IP必须匹配\n- 拒绝跨网络使用的token,返回IP_BINDING_FAILED错误\n- 添加安全日志用于审计\n\n**影响**: 关闭token横向重用攻击向量\n\n## P2-2: Screenshot缓存TTL限制 🔐\n**文件**: services/screenshot_service.go\n- 新增MaxUserCa\n[…]\nmd (P2章节)\n- Codex协作: 全程code review和middleware顺序bug发现\n\n🤖 Generated with Claude Code + Codex MCP collaboration\n\nCo-Authored-By: Claude <noreply@anthropic.com>\nCo-Reviewed-By: Codex <codex@anthropic.com>",
"is_bot": false,
"headline": "fix(security): 修复P2中等优先级安全和功能问题",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-04T06:26:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "21f4897c9badff39a497f15f133e65bceef7ae4d",
"body": "## 并发测试文件\n\n### services/whois_manager_test.go\n- **MockProvider**: 模拟WHOIS提供商用于测试\n- **4个并发测试**:\n 1. TestSelectProviderConcurrency - 高并发selectProvider调用(1000次)\n 2. TestTestProvidersHealthNonBlocking - 验证健康检查不阻塞查询\n 3. TestConcurrentQueryAndHealthCheck - 混合并发操作(30查询+5健康检查)\n 4. TestNoDataRace - Race \n[…]\n阻塞查询)\n\n### 测试覆盖\n- 单元测试: 4个专门的并发测试\n- Race Detector: 完整验证\n- 压力测试: 1000+次并发操作\n- 真实场景: 查询+健康检查混合\n\n🧪 Concurrency safety tests with Race Detector verification\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: 添加P1并发安全测试和验证报告",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-04T04:06:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6a4708d440624fa69d1342e2ba6024984fc6504e",
"body": "## 新建目录\n\n### tests/\n- 集中管理测试脚本和测试工具\n- 包含README.md索引说明\n- 移入文件:\n - test_runtime.sh (旧版)\n - test_runtime_v2.sh (推荐使用)\n\n### docs/reports/\n- 集中管理项目健康报告和修复报告\n- 包含README.md索引说明(报告时间线、问题追踪表)\n- 移入文件:\n - PROJECT_HEALTH_REPORT.md (项目健康检查)\n - P0_FIX_REVIEW.md (P0安全修复审查)\n - RUNTIME_TEST_REPORT.md (运行时测试报告)\n\n[…]\n概览、文档计划、规范\n\n## 收益\n\n- ✅ 根目录更整洁(8个文件 → 4个文件)\n- ✅ 文档分类清晰(报告 vs 架构 vs API文档)\n- ✅ 测试脚本集中管理\n- ✅ 每个目录都有README索引\n- ✅ 便于新开发者快速导航\n\n📂 Project structure refactoring\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: 整理项目目录结构",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-04T03:21:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c33da209dace53c686281655495482c3e80bf937",
"body": "## P1-1: selectProvider()并发安全修复\n\n### 问题\n- 在读锁期间修改共享状态(status.count++, status.lastUsed等)\n- 导致数据竞争和不可预测的熔断逻辑\n\n### 修复方案(两阶段选择)\n1. **阶段1(读锁)**: 复制providersSnapshot和statusSnapshot\n2. **阶段2(无锁)**: 使用快照计算得分,收集pendingReEnable\n3. **阶段3(短暂写锁)**: 回写状态变更\n - 重新启用的provider(isAvailable, errorCount)\n - 选中provid\n[…]\nex review通过: \"符合预期\"\n- ⏳ Race detector: 待执行 `go test -race`\n\n🔧 Concurrency safety fixes with Codex collaboration\n\nCo-Authored-By: Codex <noreply@codex.ai>\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(concurrency): 修复P1并发安全问题",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-04T02:42:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c55fd031d7a1324399007f7826bb178898569860",
"body": "## 测试脚本\n\n- test_runtime_v2.sh: 自动化运行时测试脚本\n - 测试.env文件错误处理(不存在 vs 解析错误)\n - 测试Authorization header边界情况(防DoS)\n - 测试IP白名单逻辑(防认证绕过)\n - 验证WHOIS核心功能未受影响\n\n## 测试结果\n\n✅ 所有测试通过 (6/6)\n- ✅ .env不存在时正确警告\n- ✅ .env解析错误时fatal终止\n- ✅ 短Authorization header不会panic\n- ✅ 健康检查端点正常\n- ✅ WHOIS服务全部可用(4/4提供商)\n- ✅ IP白名单逻辑正常\n\n##\n[…]\nTEST_REPORT.md 包含:\n- 详细测试方法和结果\n- 安全修复验证\n- 性能影响评估\n- 向后兼容性验证\n- Codex review改进说明\n\n## 结论\n\n✅ P0修复通过运行时验证,批准部署到生产环境\n\n🧪 Generated with automated runtime testing\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: 添加P0修复运行时测试及报告",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-03T10:39:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "355cfc2663d1bfe0f9c0eea37c2898162844f65d",
"body": "## 改进内容\n\n### main.go\n- 区分.env文件不存在 vs 解析/权限错误\n- 对解析错误进行fatal处理,防止配置静默失败\n- 保持对文件不存在的宽容(支持纯环境变量部署)\n\n### middleware/auth.go\n- 添加TrimSpace处理Authorization header(防御多余空格)\n- 添加显式长度检查(更安全的边界检查)\n- 添加TrimSpace处理提取的token(防御多余空格)\n- 保持Bearer大小写敏感(严格遵循RFC 6750)\n\n## 协作过程\n- 与codex进行技术争辩,质疑RFC 6750合规性\n- 达成共识:改进防御性编程,同时严格遵循规范\n\n🔐 Security improvements based on codex review\n\nCo-Authored-By: Codex <noreply@codex.ai>\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(security): 根据codex review改进P0修复",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-03T10:19:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "fb7999125fae725ccd7ed2888e75cba08c147b6d",
"body": "🔐 P0-1: 修复Dockerfile泄露密钥\n- 删除.env.example复制到镜像中\n- 添加安全注释说明环境变量注入方式\n- 支持docker-compose环境变量注入\n\n🔐 P0-2: 修复IP白名单缓存绕过漏洞\n- 分离IP检查和API Key验证的缓存逻辑\n- 修改缓存键从ip:whitelist:<ip>到ip:check:<ip>\n- 只缓存IP白名单判定结果,API Key每次验证\n- 防止攻击者使用API Key获得5分钟免认证访问\n\n🔐 P0-3: 修复Authorization header DoS漏洞\n- 添加Bearer前缀验证\n- 防止短字符串导致slice bounds out of range panic\n- 验证token非空\n\n🛠️ 其他改进:\n- main.go: godotenv.Load()改为非fatal,支持纯环境变量部署\n\n参考: PROJECT_HEALTH_REPORT.md\n测试: 编译通过,无语法错误\n\n🤖 Generated with Claude Code + Codex Analysis",
"is_bot": false,
"headline": "fix(security): 修复P0严重安全问题",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-12-03T09:47:39Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d63f5afbdbd590f787f0e1f1c1bc6002f22d3961",
"body": "- 将 .env.example 中的 APP_VERSION 从 1.1.5 更新至 1.2.0。\n- 移除 Dockerfile 中静态资源的注释行,以简化构建流程。\n- 清理 .gitignore 文件,移除不必要的静态资源条目。",
"is_bot": false,
"headline": "chore: 更新环境版本并清理 Dockerfile",
"author_name": "AsisYu",
"author_login": null,
"committed_at": "2025-09-20T15:00:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1514a9caa37017fa505516b0487bfff8194dd6d4",
"body": "- 在docker-compose.dev.yml中添加Chrome运行所需的安全配置,包括security_opt、cap_add和privileged模式。\n- 注释掉开发时的源码映射,以避免覆盖编译后的二进制文件。\n- 在Dockerfile中复制Chrome运行时文件,确保在构建过程中包含必要的资源。",
"is_bot": false,
"headline": "feat(docker): 更新Docker配置以支持Chrome运行时",
"author_name": "AsisYu",
"author_login": null,
"committed_at": "2025-09-20T14:24:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9492f8e7f0ba832855fe270c0e9379e90dceb507",
"body": "- 更新Dockerfile,修改暴露端口和环境变量配置,确保与新服务架构一致。\n- 在README中详细描述了重构后的截图服务,包括统一接口、性能提升和安全增强。\n- 增加了新的截图服务API和Chrome管理API,支持状态检查和重启功能。\n- 更新了相关文档,提供了迁移指南和使用示例,确保向后兼容。\n- 在.gitignore中添加了新的静态资源和截图相关文件的忽略规则。",
"is_bot": false,
"headline": "feat(重构): 完善截图服务和Chrome管理功能",
"author_name": "AsisYu",
"author_login": null,
"committed_at": "2025-09-20T12:30:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "16eefc901d8354918fcc1da32af0a664c48917c2",
"body": "- 新增 buildPublicURL 函数,构建对外访问 URL,支持环境变量配置。\n- 实现 deriveEnvironment 函数,推断当前环境名,优先使用 APP_ENV 和 ENV。\n- 增强 printReadyBanner 函数,提供服务就绪时的详细信息,包括版本、环境、监听端口和对外 URL。\n- 更新主函数中的日志输出,确保使用 deriveEnvironment 获取环境信息。\n- 优化 DNS 查询和截图处理中的缓存逻辑,减少重复代码,提高可读性。\n- 添加多个内部工具函数,简化缓存操作和文件处理逻辑。",
"is_bot": false,
"headline": "feat(服务): 增强服务启动日志和环境推断功能",
"author_name": "AsisYu",
"author_login": null,
"committed_at": "2025-09-06T15:00:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dad0b771ce59d4d17faf117d19267124f97ee7a2",
"body": "feat(日志): 实现健康检查日志分离功能",
"is_bot": false,
"headline": "Merge pull request #3 from BiaogeAI002/main",
"author_name": "Qin",
"author_login": "AsisYu",
"committed_at": "2025-08-26T10:25:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f3709f5e0734709591a53ab572a9e552eee63e4b",
"body": "添加健康检查专用日志记录器,支持将健康检查日志分离到独立文件\n新增环境变量 HEALTH_LOG_SEPARATE 和 HEALTH_LOG_SILENT 控制日志分离行为\n更新相关服务组件使用健康检查专用日志记录器\n完善健康检查日志内容,增加详细统计和总结信息\n更新文档说明新功能和配置方式",
"is_bot": false,
"headline": "feat(日志): 实现健康检查日志分离功能",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-08-26T10:24:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d12832f8cf60889c5f593c94c0d3691abcb020e1",
"body": "feat(auth): 添加IP白名单严格模式配置并完善文档",
"is_bot": false,
"headline": "Merge pull request #2 from BiaogeAI002/main",
"author_name": "Qin",
"author_login": "AsisYu",
"committed_at": "2025-08-26T08:46:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ec43faa9c0d07868261d6f796b441d93a5e29a21",
"body": "docs: 添加后端认证流程文档和示例集合\nrefactor(routes): 将IP白名单严格模式改为环境变量配置\nstyle(env): 更新环境变量示例和注释\nchore: 整理文档结构并更新README",
"is_bot": false,
"headline": "feat(auth): 添加IP白名单严格模式配置并完善文档",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-08-26T08:42:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "df7351f79d9adc80c97450b515925f49fdfb4abb",
"body": "docs: 更新README中的联系方式和AI工具说明",
"is_bot": false,
"headline": "Merge pull request #1 from BiaogeAI002/main",
"author_name": "Qin",
"author_login": "AsisYu",
"committed_at": "2025-08-25T09:32:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fa1b4e100e3568a34232087536f57ac55c12c11e",
"body": "fix(cors): 改进CORS配置处理并添加默认开发环境地址\n\n更新README.md文件,移除联系方式并添加AI开发工具说明。同时改进CORS配置:\n1. 添加常用开发环境地址作为默认值\n2. 统一环境变量命名(CORS_ORIGINS)\n3. 添加对HTTP方法和请求头的环境变量配置支持\n4. 清理输入字符串中的空格",
"is_bot": false,
"headline": "docs: 更新README中的联系方式和AI工具说明",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-08-25T09:20:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e2e2a914b45fe91037b198bab3801be6131ccdbf",
"body": "- Added github.com/gin-contrib/cors v1.7.5 as a new dependency.\n- Updated github.com/golang-jwt/jwt/v4 from v4.5.1 to v4.5.2.\n- Removed unused dependencies from go.sum and added new indirect dependencies including github.com/kr/text v0.2.0 and github.com/kr/pretty v0.3.0.",
"is_bot": false,
"headline": "chore: update dependencies in go.mod and go.sum",
"author_name": "AsisYu",
"author_login": null,
"committed_at": "2025-06-19T16:26:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4b6638b11df2a81f5c91e729b7c3df1609ef6a07",
"body": "- 更新了.env.example文件中的应用版本号至1.1.5。\n- 在ALL_JSON.md中添加了API安全认证部分,详细说明了JWT令牌的使用流程。\n- 新增RDAP查询API的文档,提供了标准化JSON格式响应和相关信息。\n- 优化了Chrome工具的管理,支持智能混合模式,自动下载和平台检测,提升了资源管理和性能。\n- 更新了README.md,增加了Chrome智能管理的详细说明和使用示例。",
"is_bot": false,
"headline": "feat: 增强API文档和Chrome工具管理",
"author_name": "AsisYu",
"author_login": null,
"committed_at": "2025-06-19T16:18:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "693803d1948c733aeed91cbc6e1cb92c615cb2ea",
"body": "…main workflow\n\n- Deleted the alternative security workflow file.\n- Updated the Go version in the main security workflow from 1.21 to 1.24.",
"is_bot": false,
"headline": "chore: remove alternative security workflow and update Go version in …",
"author_name": "AsisYu",
"author_login": null,
"committed_at": "2025-06-08T15:33:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4c11cd14c37fe7b85286abf65e2dbba39555fb3b",
"body": "- Deleted the go.list file.\n- Updated GitHub Actions workflow to use actions/checkout@v3 and actions/setup-go@v4 with Go version 1.21.\n- Added steps for installing govulncheck and running Trivy for enhanced security scanning.",
"is_bot": false,
"headline": "chore: remove go.list and update security workflow",
"author_name": "AsisYu",
"author_login": null,
"committed_at": "2025-06-08T15:27:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7685b954f2ca6c550f6e7546530c77827a8f5001",
"body": "- 更新了ITDog截图相关的API,增加了对表格和IP统计截图的支持。\n- 引入了Base64编码的截图返回功能,提升了API的灵活性。\n- 优化了Chrome工具的管理,增加了健康检查和诊断功能,确保Chrome实例的稳定性和性能。\n- 更新了.env.example文件中的应用版本号至1.1.2。",
"is_bot": false,
"headline": "feat: 更新ITDog截图功能并优化Chrome工具管理",
"author_name": "AsisYu",
"author_login": null,
"committed_at": "2025-06-08T15:07:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "72fd4e87fe3db2296b5cf94084689fc4d79059f6",
"body": null,
"is_bot": false,
"headline": "api端点更新",
"author_name": "AsisYu",
"author_login": null,
"committed_at": "2025-05-12T12:46:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "10e6c45521c932732ce13abb53e93a356a847f73",
"body": null,
"is_bot": false,
"headline": "计划docker",
"author_name": "AsisYu",
"author_login": null,
"committed_at": "2025-04-26T14:15:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8bb6ee62362e86d8c88336b5c768294278b324b3",
"body": null,
"is_bot": false,
"headline": "小更新",
"author_name": "AsisYu",
"author_login": null,
"committed_at": "2025-04-26T14:12:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "52d12905d447aad2a4eba70cb3004f5cf7f77284",
"body": "更新了go.mod文件,添加了github.com/golang-jwt/jwt/v4依赖,并移除了未使用的github.com/redis/go-redis/v9模块。同时,清理了go.sum文件中的冗余条目。",
"is_bot": false,
"headline": "chore: 更新依赖并移除未使用的模块",
"author_name": "BiaogeAI002",
"author_login": null,
"committed_at": "2025-03-29T08:34:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "04488ba843be7b6c0481f2cac9ecc436b53adadd",
"body": "移除handlers/whoisxml.go和handlers/whois.go中的多余空行,提升代码整洁度。同时,优化.env.example文件中的注释,使其更加清晰和详细,便于开发者理解配置项。",
"is_bot": false,
"headline": "refactor: 移除多余的空行并优化.env.example的注释",
"author_name": "BiaogeAI002",
"author_login": null,
"committed_at": "2025-03-29T08:28:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bd75cb563f90899d724628335053869c35cdf44c",
"body": null,
"is_bot": false,
"headline": "Update README.md",
"author_name": "Qin",
"author_login": "AsisYu",
"committed_at": "2025-03-29T01:48:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1bbb7eef9ddeb5ebe3b5c62fa73c636229502204",
"body": null,
"is_bot": false,
"headline": "Initial commit",
"author_name": "AsisYu",
"author_login": "AsisYu",
"committed_at": "2025-03-28T12:32:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "84e06863d29b20561d0459e107101acfdf9d2afa",
"body": null,
"is_bot": false,
"headline": "Initial commit",
"author_name": "Qin",
"author_login": "AsisYu",
"committed_at": "2025-03-28T12:24:08Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 1,
"commits_last_year": 33,
"latest_release_at": "2025-06-08T14:58:40Z",
"latest_release_tag": "v1.0.0",
"releases_from_tags": false,
"days_since_last_push": 209,
"active_weeks_last_year": 7,
"days_since_latest_release": 414,
"mean_days_between_releases": null
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": []
},
"popularity": {
"forks": 0,
"stars": 3,
"watchers": 1,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 55206,
"source_files_sampled": 56,
"oversized_source_files": 0,
"agent_instruction_files": [
".cursor/rules/api-structure.mdc",
".cursor/rules/deployment-operations.mdc",
".cursor/rules/development-guidelines.mdc",
".cursor/rules/middleware-security.mdc",
".cursor/rules/project-overview.mdc",
".cursor/rules/service-layer.mdc",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 18044
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": "repository_graph",
"source": "osv",
"findings": [
{
"name": "golang.org/x/crypto",
"direct": false,
"version": "v0.36.0",
"severity": "critical",
"ecosystem": "go",
"cvss_score": 10,
"advisory_ids": [
"GHSA-45gg-vh54-h5m9",
"GHSA-5cgq-3rg8-m6cv",
"GHSA-78mq-xcr3-xm33",
"GHSA-89gr-r52h-f8rx",
"GHSA-9m57-25v3-79x9",
"GHSA-f5wc-c3c7-36mc",
"GHSA-f6x5-jh6r-wrfv",
"GHSA-j5w8-q4qc-rx2x",
"GHSA-jppx-rxg9-jmrx",
"GHSA-q4h4-gmj2-qvw2"
],
"fixed_version": "0.52.0",
"advisory_count": 32,
"oldest_advisory_days": 256
},
{
"name": "golang.org/x/net",
"direct": false,
"version": "v0.38.0",
"severity": "moderate",
"ecosystem": "go",
"cvss_score": 6.5,
"advisory_ids": [
"GHSA-5cv4-jp36-h3mw",
"GO-2026-4440",
"GO-2026-4441",
"GO-2026-4918",
"GO-2026-5025",
"GO-2026-5026",
"GO-2026-5027",
"GO-2026-5028",
"GO-2026-5029",
"GO-2026-5030"
],
"fixed_version": "1.26.3",
"advisory_count": 11,
"oldest_advisory_days": 172
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "v0.31.0",
"severity": "unknown",
"ecosystem": "go",
"cvss_score": null,
"advisory_ids": [
"GO-2026-5024"
],
"fixed_version": "0.44.0",
"advisory_count": 1,
"oldest_advisory_days": 66
},
{
"name": "golang.org/x/text",
"direct": false,
"version": "v0.23.0",
"severity": "unknown",
"ecosystem": "go",
"cvss_score": null,
"advisory_ids": [
"GO-2026-5970"
],
"fixed_version": "0.39.0",
"advisory_count": 1,
"oldest_advisory_days": 13
}
],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {
"unknown": 2,
"critical": 1,
"moderate": 1
},
"advisory_count": 45,
"affected_count": 4,
"assessed_count": 46,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/chromedp/chromedp",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.13.3"
},
{
"name": "github.com/gin-contrib/cors",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.7.5"
},
{
"name": "github.com/gin-gonic/gin",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.10.0"
},
{
"name": "github.com/go-redis/redis/v8",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v8.11.5"
},
{
"name": "github.com/golang-jwt/jwt/v4",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v4.5.2"
},
{
"name": "github.com/joho/godotenv",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.5.1"
},
{
"name": "golang.org/x/exp",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.0.0-20250106191152-7588d65b2ba8"
},
{
"name": "golang.org/x/time",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.9.0"
},
{
"name": "gopkg.in/natefinch/lumberjack.v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.2.1"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "github.com/chromedp/chromedp",
"direct": true,
"version": "v0.13.3",
"ecosystem": "go"
},
{
"name": "github.com/gin-contrib/cors",
"direct": true,
"version": "v1.7.5",
"ecosystem": "go"
},
{
"name": "github.com/gin-gonic/gin",
"direct": true,
"version": "v1.10.0",
"ecosystem": "go"
},
{
"name": "github.com/go-redis/redis/v8",
"direct": true,
"version": "v8.11.5",
"ecosystem": "go"
},
{
"name": "github.com/golang-jwt/jwt/v4",
"direct": true,
"version": "v4.5.2",
"ecosystem": "go"
},
{
"name": "github.com/joho/godotenv",
"direct": true,
"version": "v1.5.1",
"ecosystem": "go"
},
{
"name": "golang.org/x/exp",
"direct": true,
"version": "v0.0.0-20250106191152-7588d65b2ba8",
"ecosystem": "go"
},
{
"name": "golang.org/x/time",
"direct": true,
"version": "v0.9.0",
"ecosystem": "go"
},
{
"name": "gopkg.in/natefinch/lumberjack.v2",
"direct": true,
"version": "v2.2.1",
"ecosystem": "go"
},
{
"name": "github.com/bytedance/sonic",
"direct": false,
"version": "v1.13.2",
"ecosystem": "go"
},
{
"name": "github.com/bytedance/sonic/loader",
"direct": false,
"version": "v0.2.4",
"ecosystem": "go"
},
{
"name": "github.com/cespare/xxhash/v2",
"direct": false,
"version": "v2.2.0",
"ecosystem": "go"
},
{
"name": "github.com/chromedp/cdproto",
"direct": false,
"version": "v0.0.0-20250319231242-a755498943c8",
"ecosystem": "go"
},
{
"name": "github.com/chromedp/sysutil",
"direct": false,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/cloudwego/base64x",
"direct": false,
"version": "v0.1.5",
"ecosystem": "go"
},
{
"name": "github.com/dgryski/go-rendezvous",
"direct": false,
"version": "v0.0.0-20200823014737-9f7001d12a5f",
"ecosystem": "go"
},
{
"name": "github.com/gabriel-vasile/mimetype",
"direct": false,
"version": "v1.4.8",
"ecosystem": "go"
},
{
"name": "github.com/gin-contrib/sse",
"direct": false,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "github.com/go-json-experiment/json",
"direct": false,
"version": "v0.0.0-20250211171154-1ae217ad3535",
"ecosystem": "go"
},
{
"name": "github.com/go-playground/locales",
"direct": false,
"version": "v0.14.1",
"ecosystem": "go"
},
{
"name": "github.com/go-playground/universal-translator",
"direct": false,
"version": "v0.18.1",
"ecosystem": "go"
},
{
"name": "github.com/go-playground/validator/v10",
"direct": false,
"version": "v10.26.0",
"ecosystem": "go"
},
{
"name": "github.com/gobwas/httphead",
"direct": false,
"version": "v0.1.0",
"ecosystem": "go"
},
{
"name": "github.com/gobwas/pool",
"direct": false,
"version": "v0.2.1",
"ecosystem": "go"
},
{
"name": "github.com/gobwas/ws",
"direct": false,
"version": "v1.4.0",
"ecosystem": "go"
},
{
"name": "github.com/goccy/go-json",
"direct": false,
"version": "v0.10.5",
"ecosystem": "go"
},
{
"name": "github.com/google/uuid",
"direct": false,
"version": "v1.6.0",
"ecosystem": "go"
},
{
"name": "github.com/json-iterator/go",
"direct": false,
"version": "v1.1.12",
"ecosystem": "go"
},
{
"name": "github.com/klauspost/cpuid/v2",
"direct": false,
"version": "v2.2.10",
"ecosystem": "go"
},
{
"name": "github.com/kr/text",
"direct": false,
"version": "v0.2.0",
"ecosystem": "go"
},
{
"name": "github.com/leodido/go-urn",
"direct": false,
"version": "v1.4.0",
"ecosystem": "go"
},
{
"name": "github.com/mattn/go-isatty",
"direct": false,
"version": "v0.0.20",
"ecosystem": "go"
},
{
"name": "github.com/modern-go/concurrent",
"direct": false,
"version": "v0.0.0-20180306012644-bacd9c7ef1dd",
"ecosystem": "go"
},
{
"name": "github.com/modern-go/reflect2",
"direct": false,
"version": "v1.0.2",
"ecosystem": "go"
},
{
"name": "github.com/pelletier/go-toml/v2",
"direct": false,
"version": "v2.2.3",
"ecosystem": "go"
},
{
"name": "github.com/twitchyliquid64/golang-asm",
"direct": false,
"version": "v0.15.1",
"ecosystem": "go"
},
{
"name": "github.com/ugorji/go/codec",
"direct": false,
"version": "v1.2.12",
"ecosystem": "go"
},
{
"name": "go.uber.org/multierr",
"direct": false,
"version": "v1.11.0",
"ecosystem": "go"
},
{
"name": "go.uber.org/zap",
"direct": false,
"version": "v1.27.1",
"ecosystem": "go"
},
{
"name": "golang.org/x/arch",
"direct": false,
"version": "v0.15.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/crypto",
"direct": false,
"version": "v0.36.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/net",
"direct": false,
"version": "v0.38.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "v0.31.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/text",
"direct": false,
"version": "v0.23.0",
"ecosystem": "go"
},
{
"name": "google.golang.org/protobuf",
"direct": false,
"version": "v1.36.6",
"ecosystem": "go"
},
{
"name": "gopkg.in/yaml.v3",
"direct": false,
"version": "v3.0.1",
"ecosystem": "go"
}
],
"collected": true,
"truncated": false,
"total_count": 46,
"direct_count": 9,
"indirect_count": 37
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 3,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "AsisYu",
"commits": 32,
"avatar_url": "https://avatars.githubusercontent.com/u/68932312?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"docker-publish.yml",
"security.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 10,
"reason": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 2/29 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "29 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "d1343c7702de8137857527a16dcdf17808f37d33",
"ran_at": "2026-07-28T00:22:25Z",
"aggregate_score": 2.8,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2025-12-30T08:51:38Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2025-08-26T10:25:37Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/AsisYu/whosee-server",
"host": "github.com",
"name": "whosee-server",
"owner": "AsisYu"
},
"metrics": {
"overall": {
"key": "overall",
"band": "at_risk",
"name": "Overall health",
"note": null,
"notes": [],
"value": 44,
"inputs": {
"security": 42,
"vitality": 34,
"community": 26,
"governance": 41,
"engineering": 77
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "at_risk",
"name": "Vitality",
"value": 34,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "critical",
"name": "Development activity",
"note": null,
"notes": [],
"value": 22,
"inputs": {
"commits_last_year": 33,
"human_commit_share": 1,
"days_since_last_push": 209,
"active_weeks_last_year": 7
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 209 days ago",
"points": 3.6,
"status": "partial",
"details": [
{
"code": "push_recency",
"params": {
"days": 209
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "7/52 weeks with commits",
"points": 4.8,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 7
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "33 commits in the last year",
"points": 13.8,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 33
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "moderate",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 52,
"inputs": {
"releases_count": 1,
"latest_release_tag": "v1.0.0",
"releases_from_tags": false,
"days_since_latest_release": 414,
"mean_days_between_releases": null
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "1 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 1
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 414 days ago",
"points": 7.2,
"status": "partial",
"details": [
{
"code": "release_recency",
"params": {
"days": 414
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "cadence unknown (single release)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "release_cadence_unknown",
"params": {}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "dormant",
"guards": [
"no_open_demand"
],
"signals": [
"scorecard_unmaintained"
],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": 0,
"unanswered_open_issues": 0,
"days_since_last_merged_pr": 335,
"days_since_last_human_commit": 209,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "no human commit for 209 days, with nothing left unanswered; held at dormant by nothing open to answer",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_quiet",
"params": {
"days": 209
}
},
{
"code": "abandonment_guarded",
"params": {
"guards": "nothing open to answer"
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "critical",
"name": "Community & Adoption",
"value": 26,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 5,
"inputs": {
"forks": 0,
"stars": 3,
"watchers": 1,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "3 stars",
"points": 4.9,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 3
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "1 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 1
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 41,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 10,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 72,
"inputs": {
"merged_prs": 3,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "3/3 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 3,
"decided": 3
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 2/29 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 48,
"inputs": {
"followers": 9,
"owner_type": "User",
"is_verified": null,
"owner_login": "AsisYu",
"public_repos": 19,
"account_age_days": 2189
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "9 followers of AsisYu",
"points": 7.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 9,
"login": "AsisYu"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "19 public repos, account ~5 yr old",
"points": 21.5,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 19
}
},
{
"code": "account_age_years",
"params": {
"years": 5
}
}
],
"max_points": 25
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 77,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 68,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": "https://whosee.me",
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://whosee.me",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 42,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 28,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 2.8
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 2/29 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "29 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 46 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"indirect_dependencies_free_of_known_advisories",
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_repository",
"params": {
"assessed": 46
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 45,
"affected_packages": 4,
"assessed_packages": 46,
"unassessed_packages": 0,
"affected_by_severity": "critical 1, moderate 1, unknown 2",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "transitive set not separable from development and test dependencies in this scope",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_scope_not_separable",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 46,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 79,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.87,
"agent_instruction_files": [
".cursor/rules/api-structure.mdc",
".cursor/rules/deployment-operations.mdc",
".cursor/rules/development-guidelines.mdc",
".cursor/rules/middleware-security.mdc",
".cursor/rules/project-overview.mdc",
".cursor/rules/service-layer.mdc",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 18044
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": ".cursor/rules/api-structure.mdc, .cursor/rules/deployment-operations.mdc, .cursor/rules/development-guidelines.mdc, .cursor/rules/middleware-security.mdc, .cursor/rules/project-overview.mdc, .cursor/rules/service-layer.mdc, CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".cursor/rules/api-structure.mdc, .cursor/rules/deployment-operations.mdc, .cursor/rules/development-guidelines.mdc, .cursor/rules/middleware-security.mdc, .cursor/rules/project-overview.mdc, .cursor/rules/service-layer.mdc, CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "40 of 46 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 40,
"sampled": 46
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 66,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.37,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "go.mod (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "go.mod"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "17 of the last 46 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 17,
"sampled": 46
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 55206,
"source_files_sampled": 56,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/56 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 56,
"oversized": 0
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
],
"report_type": "repository",
"generated_at": "2026-07-28T00:22:32.257480Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/AsisYu/whosee-server.svg",
"full_name": "AsisYu/whosee-server",
"license_state": "standard",
"license_spdx": "MIT"
}