公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-24 12:23 UTC

wkoverfield / switchboard

A firewall and password manager for your AI coding agents.

TypeScript · JavaScriptMIT★ 0 星标⑂ 0 复刻始于 2026年6月在 GitHub 上查看 ↗

wkoverfield/switchboard 的健康指数为 100 分中的 63 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(86/100),最低的是Community & Adoption(43/100)。 最近一次更新在 5 天前。 近期的大部分工作由 1 位贡献者完成。

63
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

63
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

12 关注者12 个公开仓库始于 2023年1月

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npm@switchboard-mcp/cli0.2.21,927105 天前mcpmodel-context-protocolai-agentscodexclaude-codecursorvscodesupabasestripeposthogsentrymcp-servermcp-routermcp-gatewaytool-callingdeveloper-tools
npm@switchboard-mcp/core0.2.22,002105 天前
npm@switchboard-mcp/docs-mcp0.2.246635 天前
npm@switchboard-mcp/mcp-runtime0.2.21,849105 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

75良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 5 天前
4.2/36提交节奏 — 52 周中有 6 周有提交
18/18提交量 — 最近一年 240 次提交
0/10OpenSSF Scorecard:Maintained — project was created within the last 90 days. Please review its contents carefully
所用输入
commits_last_year240
human_commit_share0.98
days_since_last_push5
active_weeks_last_year6

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 3 个发布版本
36/36发布时效 — 最近一次发布版本于 5 天前
27/27发布节奏 — 约每 2.4 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count3
latest_release_tagv0.2.2
releases_from_tags
days_since_latest_release5
mean_days_between_releases2.4
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

43存在风险 · 占总体的 18%
评分方式
0/60星标 — 0 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

77良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
6.3/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
50.6/80月度下载量 — npm 合计每月 6,244 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packages@switchboard-mcp/cli, @switchboard-mcp/core, @switchboard-mcp/docs-mcp, @switchboard-mcp/mcp-runtime
dependents
ecosystemsnpm
total_downloads
monthly_downloads6,244
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

54中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
46.8/46.8议题解决 — 100% 的议题已关闭
37.1/38.3PR 接受 — 已裁定的 PR 中 192/198 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/25 approved changesets -- score normalized to 0
所用输入
merged_prs192
open_issues0
closed_issues4
issue_closed_ratio1
closed_unmerged_prs6
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
8/25所有者影响力 — wkoverfield 有 12 位关注者
15.2/25既往记录 — 12 个公开仓库,账户约 3 年
所用输入
followers12
owner_typeUser
is_verified
owner_loginwkoverfield
public_repos12
account_age_days1,295
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — npm 上有 4 个软件包
35/35发布时效 — 最近一次发布于 5 天前
20/20版本历史 — 10 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packages@switchboard-mcp/cli, @switchboard-mcp/core, @switchboard-mcp/docs-mcp, @switchboard-mcp/mcp-runtime
ecosystemsnpm
any_deprecated
min_days_since_publish5

工程质量

基础的工程与文档实践是否到位?

86优秀 · 占总体的 20%

工程实践

84良好
评分方式
24/24CI 工作流 — 1 个工作流
24/24存在测试
16/16Linter 配置 — eslint.config.js
0/9.6Pre-commit 钩子
0/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 25 out of 25 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

90优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://switchboard-beta-nine.vercel.app
10/10仓库描述
10/10主题标签 — 10 个主题标签
0/10Wiki
所用输入
topicsai-agents, claude-code, cli, codex, coding-agents, developer-tools, local-first, mcp, secrets-management, security
has_wiki
homepagehttps://switchboard-beta-nine.vercel.app
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

52中等 · 占总体的 16%

安全态势

43存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — 无数据
2.5/2.5CI-Tests — 25 out of 25 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/25 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — 无数据
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
1.5/7.5Vulnerabilities — 8 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate4.3
已排除计分(无数据或不适用):branch_protection, packaging, signed_releases。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
13.2/25间接依赖不含已知公告 — 1 个受影响:@hono/node-server 1.19.14 (moderate 5.9)
40/40没有长期未处理的公告 — 没有公告公开超过 90 天
所用输入
sourceosv
advisories1
affected_packages1
assessed_packages144
unassessed_packages0
affected_by_severitymoderate 1
direct_affected_packages0
比对的是 npm:@switchboard-mcp/cli@0.2.2 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 144 个软件包。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

69中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
15/15机器可读文档(llms.txt) — 存在 llms.txt
40/40可读的提交历史 — 98 次人类提交中有 92 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.939
agent_instruction_files
agent_instruction_max_bytes
评分方式
0/18一条命令的引导启动
22/22自动化测试
11/11Lint / 格式化配置 — eslint.config.js
11/11静态类型检查 — apps/cli/tsconfig.json, packages/core/tsconfig.json, packages/docs-mcp/tsconfig.json, packages/mcp-runtime/tsconfig.json, tsconfig.json
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 74 次由代理编写或署名代理
8/8自动化维护 — 最近 100 次提交中有 2 次为自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilespnpm-lock.yaml
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configsapps/cli/tsconfig.json, packages/core/tsconfig.json, packages/docs-mcp/tsconfig.json, packages/mcp-runtime/tsconfig.json, tsconfig.json
agent_commit_share0.74
toolchain_manifests
dependency_bot_commit_share0.02
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
53.6/55可控的文件大小 — 采样的 122 个源文件中有 3 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes410,270
source_files_sampled122
oversized_source_files3
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
20/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

0GitHub 星标
1贡献者
240最近 12 个月提交数
5距最近推送天数
3发布版本数
1巴士系数(bus factor)
0开放议题
npm软件包生态系统数

更多细节

OpenSSF Scorecard 4.3 / 10
4.3综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-24 12:23 UTC

10Binary-Artifactsno binaries found in the repo
不适用Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests25 out of 25 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/25 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
不适用Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
2Vulnerabilities8 existing vulnerabilities detected
直接依赖 11
注册表软件包版本约束清单文件
npm@switchboard-mcp/coreworkspace:*apps/cli/package.json
npm@switchboard-mcp/mcp-runtimeworkspace:*apps/cli/package.json
npmcommander^15.0.0apps/cli/package.json
npmcross-keychain^1.1.0packages/core/package.json
npmyaml^2.8.2packages/core/package.json
npmzod^4.2.0packages/core/package.json
npm@modelcontextprotocol/sdk^1.29.0packages/docs-mcp/package.json
npmzod^4.4.3packages/docs-mcp/package.json
npm@switchboard-mcp/coreworkspace:*packages/mcp-runtime/package.json
npm@modelcontextprotocol/sdk^1.29.0packages/mcp-runtime/package.json
npmzod^4.4.3packages/mcp-runtime/package.json
全部依赖 346

来自 GitHub 依赖图的完整解析依赖集合:11 个直接依赖与 335 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
npm@modelcontextprotocol/sdk1.29.0直接
npm@modelcontextprotocol/sdk^1.29.0直接
npmcommander15.0.0直接
npmcommander^15.0.0直接
npmcross-keychain1.1.0直接
npmcross-keychain^1.1.0直接
npmyaml2.9.0直接
npmyaml^2.8.2直接
npmzod4.4.3直接
npmzod^4.2.0直接
npmzod^4.4.3直接
npm@emnapi/core1.10.0间接
npm@emnapi/runtime1.10.0间接
npm@emnapi/wasi-threads1.2.1间接
npm@esbuild/aix-ppc640.28.1间接
npm@esbuild/android-arm0.28.1间接
npm@esbuild/android-arm640.28.1间接
npm@esbuild/android-x640.28.1间接
npm@esbuild/darwin-arm640.28.1间接
npm@esbuild/darwin-x640.28.1间接
npm@esbuild/freebsd-arm640.28.1间接
npm@esbuild/freebsd-x640.28.1间接
npm@esbuild/linux-arm0.28.1间接
npm@esbuild/linux-arm640.28.1间接
npm@esbuild/linux-ia320.28.1间接
npm@esbuild/linux-loong640.28.1间接
npm@esbuild/linux-mips64el0.28.1间接
npm@esbuild/linux-ppc640.28.1间接
npm@esbuild/linux-riscv640.28.1间接
npm@esbuild/linux-s390x0.28.1间接
npm@esbuild/linux-x640.28.1间接
npm@esbuild/netbsd-arm640.28.1间接
npm@esbuild/netbsd-x640.28.1间接
npm@esbuild/openbsd-arm640.28.1间接
npm@esbuild/openbsd-x640.28.1间接
npm@esbuild/openharmony-arm640.28.1间接
npm@esbuild/sunos-x640.28.1间接
npm@esbuild/win32-arm640.28.1间接
npm@esbuild/win32-ia320.28.1间接
npm@esbuild/win32-x640.28.1间接
npm@eslint-community/eslint-utils4.9.1间接
npm@eslint-community/regexpp4.12.2间接
npm@eslint/config-array0.21.2间接
npm@eslint/config-helpers0.4.2间接
npm@eslint/core0.17.0间接
npm@eslint/eslintrc3.3.5间接
npm@eslint/js9.39.4间接
npm@eslint/object-schema2.1.7间接
npm@eslint/plugin-kit0.4.1间接
npm@hono/node-server1.19.14间接
npm@humanfs/core0.19.2间接
npm@humanfs/node0.16.8间接
npm@humanfs/types0.15.0间接
npm@humanwhocodes/module-importer1.0.1间接
npm@humanwhocodes/retry0.4.3间接
npm@inquirer/ansi1.0.2间接
npm@inquirer/checkbox4.3.2间接
npm@inquirer/confirm5.1.21间接
npm@inquirer/core10.3.2间接
npm@inquirer/editor4.2.23间接
npm@inquirer/expand4.0.23间接
npm@inquirer/external-editor1.0.3间接
npm@inquirer/figures1.0.15间接
npm@inquirer/input4.3.1间接
npm@inquirer/number3.0.23间接
npm@inquirer/password4.0.23间接
npm@inquirer/prompts7.10.1间接
npm@inquirer/rawlist4.1.11间接
npm@inquirer/search3.2.2间接
npm@inquirer/select4.4.2间接
npm@inquirer/type3.0.10间接
npm@jridgewell/sourcemap-codec1.5.5间接
npm@napi-rs/keyring1.3.0间接
npm@napi-rs/keyring-darwin-arm641.3.0间接
npm@napi-rs/keyring-darwin-x641.3.0间接
npm@napi-rs/keyring-freebsd-x641.3.0间接
npm@napi-rs/keyring-linux-arm-gnueabihf1.3.0间接
npm@napi-rs/keyring-linux-arm64-gnu1.3.0间接
npm@napi-rs/keyring-linux-arm64-musl1.3.0间接
npm@napi-rs/keyring-linux-riscv64-gnu1.3.0间接
npm@napi-rs/keyring-linux-x64-gnu1.3.0间接
npm@napi-rs/keyring-linux-x64-musl1.3.0间接
npm@napi-rs/keyring-win32-arm64-msvc1.3.0间接
npm@napi-rs/keyring-win32-ia32-msvc1.3.0间接
npm@napi-rs/keyring-win32-x64-msvc1.3.0间接
npm@napi-rs/wasm-runtime1.1.6间接
npm@oxc-project/types0.133.0间接
npm@rolldown/binding-android-arm641.0.3间接
npm@rolldown/binding-darwin-arm641.0.3间接
npm@rolldown/binding-darwin-x641.0.3间接
npm@rolldown/binding-freebsd-x641.0.3间接
npm@rolldown/binding-linux-arm-gnueabihf1.0.3间接
npm@rolldown/binding-linux-arm64-gnu1.0.3间接
npm@rolldown/binding-linux-arm64-musl1.0.3间接
npm@rolldown/binding-linux-ppc64-gnu1.0.3间接
npm@rolldown/binding-linux-s390x-gnu1.0.3间接
npm@rolldown/binding-linux-x64-gnu1.0.3间接
npm@rolldown/binding-linux-x64-musl1.0.3间接
npm@rolldown/binding-openharmony-arm641.0.3间接
npm@rolldown/binding-wasm32-wasi1.0.3间接
npm@rolldown/binding-win32-arm64-msvc1.0.3间接
npm@rolldown/binding-win32-x64-msvc1.0.3间接
npm@rolldown/pluginutils1.0.1间接
npm@standard-schema/spec1.1.0间接
npm@tybys/wasm-util0.10.3间接
npm@types/chai5.2.3间接
npm@types/deep-eql4.0.2间接
npm@types/estree1.0.9间接
npm@types/json-schema7.0.15间接
npm@types/node22.20.0间接
npm@typescript-eslint/eslint-plugin8.62.1间接
npm@typescript-eslint/parser8.62.1间接
npm@typescript-eslint/project-service8.62.1间接
npm@typescript-eslint/scope-manager8.62.1间接
npm@typescript-eslint/tsconfig-utils8.62.1间接
npm@typescript-eslint/type-utils8.62.1间接
npm@typescript-eslint/types8.62.1间接
npm@typescript-eslint/typescript-estree8.62.1间接
npm@typescript-eslint/utils8.62.1间接
npm@typescript-eslint/visitor-keys8.62.1间接
npm@vitest/expect4.1.9间接
npm@vitest/mocker4.1.9间接
npm@vitest/pretty-format4.1.9间接
npm@vitest/runner4.1.9间接
npm@vitest/snapshot4.1.9间接
npm@vitest/spy4.1.9间接
npm@vitest/utils4.1.9间接
npmaccepts2.0.0间接
npmacorn8.17.0间接
npmacorn-jsx5.3.2间接
npmajv6.15.0间接
npmajv8.20.0间接
npmajv-formats3.0.1间接
npmansi-regex5.0.1间接
npmansi-styles4.3.0间接
npmargparse2.0.1间接
npmassertion-error2.0.1间接
npmbalanced-match1.0.2间接
npmbalanced-match4.0.4间接
npmbody-parser2.3.0间接
npmbrace-expansion1.1.15间接
npmbrace-expansion5.0.7间接
npmbytes3.1.2间接
npmcall-bind-apply-helpers1.0.2间接
npmcall-bound1.0.4间接
npmcallsites3.1.0间接
npmchai6.2.2间接
npmchalk4.1.2间接
npmchardet2.2.0间接
npmcli-width4.1.0间接
npmcolor-convert2.0.1间接
npmcolor-name1.1.4间接
npmconcat-map0.0.1间接
npmcontent-disposition1.1.0间接
npmcontent-type1.0.5间接
npmcontent-type2.0.0间接
npmconvert-source-map2.0.0间接
npmcookie0.7.2间接
npmcookie-signature1.2.2间接
npmcors2.8.6间接
npmcross-spawn7.0.6间接
npmdebug4.4.3间接
npmdeep-is0.1.4间接
npmdepd2.0.0间接
npmdetect-libc2.1.2间接
npmdunder-proto1.0.1间接
npmee-first1.1.1间接
npmemoji-regex8.0.0间接
npmencodeurl2.0.0间接
npmes-define-property1.0.1间接
npmes-errors1.3.0间接
npmes-module-lexer2.1.0间接
npmes-object-atoms1.1.2间接
npmesbuild0.28.1间接
npmescape-html1.0.3间接
npmescape-string-regexp4.0.0间接
npmeslint9.39.4间接
npmeslint-scope8.4.0间接
npmeslint-visitor-keys3.4.3间接
npmeslint-visitor-keys4.2.1间接
npmeslint-visitor-keys5.0.1间接
npmespree10.4.0间接
npmesquery1.7.0间接
npmesrecurse4.3.0间接
npmestraverse5.3.0间接
npmestree-walker3.0.3间接
npmesutils2.0.3间接
npmetag1.8.1间接
npmeventsource3.0.7间接
npmeventsource-parser3.1.0间接
npmexpect-type1.3.0间接
npmexpress5.2.1间接
npmexpress-rate-limit8.5.2间接
npmfast-deep-equal3.1.3间接
npmfast-json-stable-stringify2.1.0间接
npmfast-levenshtein2.0.6间接
npmfast-uri3.1.2间接
npmfdir6.5.0间接
npmfile-entry-cache8.0.0间接
npmfinalhandler2.1.1间接
npmfind-up5.0.0间接
npmflat-cache4.0.1间接
npmflatted3.4.2间接
npmforwarded0.2.0间接
npmfresh2.0.0间接
npmfsevents2.3.3间接
npmfunction-bind1.1.2间接
npmget-intrinsic1.3.0间接
npmget-proto1.0.1间接
npmglob-parent6.0.2间接
npmglobals14.0.0间接
npmgopd1.2.0间接
npmhas-flag4.0.0间接
npmhas-symbols1.1.0间接
npmhasown2.0.4间接
npmhono4.12.26间接
npmhttp-errors2.0.1间接
npmiconv-lite0.7.2间接
npmignore5.3.2间接
npmignore7.0.5间接
npmimport-fresh3.3.1间接
npmimurmurhash0.1.4间接
npminherits2.0.4间接
npmip-address10.2.0间接
npmipaddr.js1.9.1间接
npmis-extglob2.1.1间接
npmis-fullwidth-code-point3.0.0间接
npmis-glob4.0.3间接
npmis-promise4.0.0间接
npmisexe2.0.0间接
npmjose6.2.3间接
npmjs-yaml4.2.0间接
npmjson-buffer3.0.1间接
npmjson-schema-traverse0.4.1间接
npmjson-schema-traverse1.0.0间接
npmjson-schema-typed8.0.2间接
npmjson-stable-stringify-without-jsonify1.0.1间接
npmkeyv4.5.4间接
npmlevn0.4.1间接
npmlightningcss1.32.0间接
npmlightningcss-android-arm641.32.0间接
npmlightningcss-darwin-arm641.32.0间接
npmlightningcss-darwin-x641.32.0间接
npmlightningcss-freebsd-x641.32.0间接
npmlightningcss-linux-arm-gnueabihf1.32.0间接
npmlightningcss-linux-arm64-gnu1.32.0间接
npmlightningcss-linux-arm64-musl1.32.0间接
npmlightningcss-linux-x64-gnu1.32.0间接
npmlightningcss-linux-x64-musl1.32.0间接
npmlightningcss-win32-arm64-msvc1.32.0间接
npmlightningcss-win32-x64-msvc1.32.0间接
npmlocate-path6.0.0间接
npmlodash.merge4.6.2间接
npmmagic-string0.30.21间接
npmmarked15.0.12间接
npmmarked^15.0.4间接
npmmath-intrinsics1.1.0间接
npmmedia-typer1.1.0间接
npmmeow14.1.0间接
npmmerge-descriptors2.0.0间接
npmmime-db1.54.0间接
npmmime-types3.0.2间接
npmminimatch10.2.5间接
npmminimatch3.1.5间接
npmms2.1.3间接
npmmute-stream2.0.0间接
npmnanoid3.3.15间接
npmnatural-compare1.4.0间接
npmnegotiator1.0.0间接
npmobject-assign4.1.1间接
npmobject-inspect1.13.4间接
npmobug2.1.3间接
npmon-finished2.4.1间接
npmonce1.4.0间接
npmoptionator0.9.4间接
npmp-limit3.1.0间接
npmp-locate5.0.0间接
npmparent-module1.0.1间接
npmparseurl1.3.3间接
npmpath-exists4.0.0间接
npmpath-key3.1.1间接
npmpath-to-regexp8.4.2间接
npmpathe2.0.3间接
npmpicocolors1.1.1间接
npmpicomatch4.0.4间接
npmpicomatch4.0.5间接
npmpkce-challenge5.0.1间接
npmpostcss8.5.16间接
npmprelude-ls1.2.1间接
npmproxy-addr2.0.7间接
npmpunycode2.3.1间接
npmqs6.15.2间接
npmrange-parser1.2.1间接
npmraw-body3.0.2间接
npmrequire-from-string2.0.2间接
npmresolve-from4.0.0间接
npmrolldown1.0.3间接
npmrouter2.2.0间接
npmsafer-buffer2.1.2间接
npmsemver7.8.5间接
npmsend1.2.1间接
npmserve-static2.2.1间接
npmsetprototypeof1.2.0间接
npmshebang-command2.0.0间接
npmshebang-regex3.0.0间接
npmside-channel1.1.1间接
npmside-channel-list1.0.1间接
npmside-channel-map1.0.1间接
npmside-channel-weakmap1.0.2间接
npmsiginfo2.0.0间接
npmsignal-exit4.1.0间接
npmsource-map-js1.2.1间接
npmstackback0.0.2间接
npmstatuses2.0.2间接
npmstd-env4.1.0间接
npmstring-width4.2.3间接
npmstrip-ansi6.0.1间接
npmstrip-json-comments3.1.1间接
npmsupports-color7.2.0间接
npmtinybench2.9.0间接
npmtinyexec1.2.4间接
npmtinyglobby0.2.17间接
npmtinyrainbow3.1.0间接
npmtoidentifier1.0.1间接
npmts-api-utils2.5.0间接
npmtslib2.8.1间接
npmtsx4.23.0间接
npmtsx^4.23.0间接
npmtype-check0.4.0间接
npmtype-is2.1.0间接
npmtypescript5.9.3间接
npmtypescript-eslint8.62.1间接
npmundici-types6.21.0间接
npmunpipe1.0.0间接
npmuri-js4.4.1间接
npmvary1.1.2间接
npmvite8.0.16间接
npmvitest4.1.9间接
npmwhich2.0.2间接
npmwhy-is-node-running2.3.0间接
npmword-wrap1.2.5间接
npmwrap-ansi6.2.0间接
npmwrappy1.0.2间接
npmyocto-queue0.1.0间接
npmyoctocolors-cjs2.1.3间接
npmzod-to-json-schema3.25.2间接
依赖安全公告 1

安装 npm:@switchboard-mcp/cli@0.2.2 会引入 144 个包(直接与传递):其中 1 个存在已知公告,0 个为直接依赖。

软件包版本关系严重程度公告数修复版本
@hono/node-server1.19.14间接12.0.5

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "ai-agents",
        "claude-code",
        "cli",
        "codex",
        "coding-agents",
        "developer-tools",
        "local-first",
        "mcp",
        "secrets-management",
        "security"
      ],
      "is_fork": false,
      "size_kb": 2050,
      "has_wiki": false,
      "homepage": "https://switchboard-beta-nine.vercel.app",
      "languages": {
        "CSS": 22291,
        "HTML": 27950,
        "JavaScript": 285653,
        "TypeScript": 1703751
      },
      "pushed_at": "2026-07-18T23:39:10Z",
      "created_at": "2026-06-18T20:03:53Z",
      "owner_type": "User",
      "updated_at": "2026-07-18T23:39:12Z",
      "description": "A firewall and password manager for your AI coding agents.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "JavaScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Wilson Kiagiri Overfield",
      "type": "User",
      "login": "wkoverfield",
      "company": null,
      "location": null,
      "followers": 12,
      "avatar_url": "https://avatars.githubusercontent.com/u/122052931?v=4",
      "created_at": "2023-01-05T19:49:13Z",
      "is_verified": null,
      "public_repos": 12,
      "account_age_days": 1295
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-07-18T23:28:56Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-07-17T23:13:37Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-14T02:15:35Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "4893b61b14d4ecf76768777d7e4fc4d654afb3bf",
          "body": "The MCP registry caps server.json description at 100 characters; the\nconsolidation copy pushed it to 128. Drop the trailing clause so it matches\nthe npm package descriptions and validates.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Trim the registry description to the 100-character limit (#205)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-18T23:39:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d1e37e1b657aaf40b0125f45930d03d518e72e03",
          "body": "* Release 0.2.2\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n* Publish the spawn attenuation doc to the docs MCP bundle and the site\n\nThe attenuation security doc existed in the repo but was registered in\nneither the docs-mcp bundle manifest nor the site docs manifest, so it\nshipped nowh\n[…]\nts at the file that actually governs, falling back to the\ndefault when unset.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release 0.2.2 (#202)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-18T21:40:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3dc6b3047c5a4cefaf9bc7ac4ec348337b00bc0a",
          "body": "* Add spawn-time auto-attenuation for Claude Code subagents\n\nGive each subagent spawn its own attenuated child pass automatically, so a\ndelegated worker runs under its own id, its own audit trail, a lease bound to\nthe parent, the inherited seatbelt floor and deny lists, and cascading\nrevocation, whi\n[…]\ntall/status.\nSetup's hooks step inherits the fix through the shared resolver.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add spawn-time auto-attenuation (opt-in, single-level v1) (#201)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-18T21:21:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7df7a8bb28733a705f41de1d95f39c4d6a1555c6",
          "body": "* Resolve each daemon-routed call against the repo its path touches\n\nA user-scoped `switchboard mcp` entry launches with no `--cwd`, so one daemon\nserves a session that may start at `~` and work across several repos. Previously\nevery call resolved config, profiles, and pass against the session's lau\n[…]\nby argument key order (which an agent could use to\nsteer to the weaker repo).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add lazy per-call repo resolution with only-strengthen governance (#200)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-18T20:13:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "93cb7fc32dc1e2f51ddcf280d1510962a30b53d0",
          "body": "* Add the ambient seatbelt: default-on catastrophe denylist with approvable retry\n\nRouted MCP calls are now checked against a small catastrophe denylist on\nevery call: with no pass bound (approvals keyed under a synthetic\n\"seatbelt\" id, 15-minute approval window) and as an un-removable floor\nunder a\n[…]\nases and must-not-trip\nnon-prod redeploy and read-only-inside-subshell cases.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add the ambient seatbelt: default-on catastrophe denylist (#199)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-18T18:18:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "60f3dc83f3a089ec343e307180d55ab6e982465b",
          "body": "Co-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release 0.2.1 (#198)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-17T21:51:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "afc48a007074bc4f4b8f19b02f1ffbf8537392db",
          "body": "…acked rollback (#197)\n\n* Add machine-level switchboard setup with one-command rollback\n\nswitchboard setup without a preset now sets up the whole machine: scan,\nrepo import (skippable with --skip-import), a value-untouched secrets\nstep that prints the exact secrets set <ref> commands without ever\nre\n[…]\nion claim to project-scope\nclient config and describes the snapshot behavior.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add switchboard setup: one-command machine onboarding with manifest-b…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-17T21:45:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "685bf89b48906e925caec6e881461ca0006d14a9",
          "body": "… (#194)\n\n* Make install codex --scope user manage ~/.codex/config.toml\n\nswitchboard install codex --scope user previously only printed a codex\nmcp add command. It now manages the user-level Codex config the same way\nproject scope manages .codex/config.toml: dry run prints the exact TOML\nand target \n[…]\nel tests never\nread the real home directory of the machine running the suite.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Manage user-scoped Codex config and surface user-level client servers…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-16T19:57:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5f27be6ea9f8be49bed9c74af0f8e54a09d1ca8c",
          "body": "…#195)\n\nThe trust model now states the pass model in OAuth token exchange terms\n(issuer, subject, actor, attenuated scope) so the delegation semantics are\nlegible against RFC 8693, and notes why the envelope is a local lease rather\nthan a token. The existing harness-scoped mandates doc is published to the\ndocs site as Concepts > Delegation Model.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: map the pass model to RFC 8693 and publish the delegation doc (…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-16T19:57:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "446fed9b372dc872a7bf13db72636aa70a92dbae",
          "body": "…ge, and hero copy (#193)\n\nThe registry, npm, and llms descriptions now state that Switchboard is one\nplace for every agent's MCP servers and secrets, and the hero subcopy leads\nwith pulling existing servers into one routed place. The README headline is\nunchanged.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: describe MCP server and secret consolidation in registry, packa…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-16T19:57:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2ff78bb352fb59ae8594551dea11014975037204",
          "body": "* feat(site): restore team interest intake\n\nConnect the roadmap card to a validated Formspree endpoint and keep submission feedback inline and accessible.\n\nCo-Authored-By: OpenAI Codex <codex@openai.com>\n\n* fix(site): unify GitHub star link\n\nRemove the internal divider and reserved badge spacing so the label and count read as one navigation item.\n\nCo-Authored-By: OpenAI Codex <codex@openai.com>\n\n---------\n\nCo-authored-by: OpenAI Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Restore the team interest intake (#192)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-15T00:27:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07b67f482d5724f1128d0503dd5708209e84ea95",
          "body": "* feat(site): smooth docs navigation\n\nKeep the landing and docs navigation visually continuous, add native cross-document transitions, and simplify the product loop playback behavior.\n\nCo-Authored-By: OpenAI Codex <codex@openai.com>\n\n* refactor(site): tune docs navigation motion\n\nDifferentiate occas\n[…]\n\n\nDisplay a compact cached repository star count in the shared landing and docs navigation.\n\nCo-Authored-By: OpenAI Codex <codex@openai.com>\n\n---------\n\nCo-authored-by: OpenAI Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Smooth docs navigation and simplify the product loop (#191)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T23:40:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9f31252e9694f8a677dbd825ffeb925e6af7242f",
          "body": "Unify the public site, generated docs, and local dashboard around one authority-focused interface. Align setup examples with the shipped import and pass flow, expose explicit local state and audit outcomes, and harden the dashboard's loopback boundary.",
          "is_bot": false,
          "headline": "Redesign landing page and local dashboard (#190)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T19:59:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad65f035efe95774144c14edc6b9c6792fa88aea",
          "body": "The repository is public. Planning, strategy, and evaluation documents were\nbeing published alongside the product documentation. Remove them and keep the\nrepo to the code plus the documentation a user or an agent actually needs.\n\nRemoved:\n- AGENTS.md\n- docs/product/{README,roadmap,mandate-strategy,e\n[…]\necurity, reference, providers, use-case,\nand demo docs are unchanged.\n\nAlso ignore .claude/ and .codex/, which hold local client configuration.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove internal working documents from the repo (#189)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T19:37:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a602360c46d2f29689e8453cc970bbb49ddd0150",
          "body": "* Remove agent prompt hover preview\n\nKeep the setup prompt as a direct copy action without exposing a hover or focus tooltip.\\n\\nCo-Authored-By: OpenAI Codex <codex@openai.com>\n\n* Anchor stat sources to the pointer\n\nFollow the cursor with collision-aware source tooltips and remove redundant source labels from the stat cards.\\n\\nCo-Authored-By: OpenAI Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Refine landing-page hover interactions (#188)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T05:49:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03b12eec3e94e37587d64cc5ad55b4937dd06397",
          "body": "Resolve symlink-equivalent repository paths consistently during pass lookup and report controlled single-client installations as ready.\\n\\nCo-Authored-By: OpenAI Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Fix golden-path authority readiness (#187)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T05:49:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dbb89cae4a4f483bcee6d7012ed9865fe49fd22c",
          "body": "Set strict local enforcement, ignore generated client routing files, and move the active roadmap slice to blind human validation.\\n\\nCo-Authored-By: OpenAI Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Close post-release authority gaps (#184)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T04:18:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73f977496044363c30c6363f863be7766b5cff2c",
          "body": "Co-authored-by: OpenAI Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Prepare Switchboard 0.2.0 (#183)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T01:50:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "155ce945402e76d9001994c024bef3f34df39400",
          "body": "Co-authored-by: OpenAI Codex <codex@openai.com>",
          "is_bot": false,
          "headline": "Move stat citations into card popovers (#182)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T01:42:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c87f40e5dddc03e12ccbf981eb80b6a899d27c34",
          "body": "The landing page says status tells you which mode you are in, but status did\nnot surface enforcement at all. Add `enforcement` to the status JSON and a\nhuman-readable line (\"Enforcement: strict (no pass means no routing)\" /\n\"Enforcement: default (no pass means configured profiles are served\nungoverned)\"), so a user in strict mode can confirm it and the claim holds.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Report the enforcement mode in switchboard status (#181)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T00:36:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bc5b65d40b32e6fdcee387dbda2040451226ccf5",
          "body": "The hash chain proved no in-place edit, insertion, deletion, or reordering\nwithin the retained file, but it could not see a tail-truncation: deleting\nthe last N entries leaves a valid prefix that verify accepted as \"Chain: OK\".\nThat defeats the whole tamper-evidence claim, since the cheapest attack \n[…]\nmoved-marker,\nand loud-fail-open cases. Updates threat model section 10 + accepted risks,\naudit-logs.md, the public roadmap, and the CHANGELOG.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make the audit log detect tail-truncation and fail loud (#180)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-14T00:30:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f9e08fc86cd9119a1bd18918e5eae89a5f126814",
          "body": "Today, when no pass is bound, the routed paths serve all configured\nprofiles with no tool policy (\"no pass, no policy\"). This adds an opt-in\ndefault-deny so that \"no pass\" can mean \"nothing moves\".\n\nSurface: a top-level `enforcement: strict` key in .switchboard.yaml, and\n`--strict` on `switchboard m\n[…]\nis rejected. Plus a router unit test and config\nschema tests. Updates threat-model 4.3 + accepted risks, the public roadmap,\nand the CHANGELOG.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add opt-in strict mode: no pass, no route (#179)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T18:35:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ea4d53af58f9bfd38db14b66c1d08172934fd6d2",
          "body": "# Conflicts:\n#\tCHANGELOG.md",
          "is_bot": false,
          "headline": "Merge branch 'feat/storefront'",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T17:28:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90ed45c07e88dc264e10ce0120c32bd4162b3825",
          "body": "# Conflicts:\n#\tCHANGELOG.md",
          "is_bot": false,
          "headline": "Merge branch 'feat/denial-demo-dashboard'",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T17:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b83e6737244ec6aa4db85baf058ef063876c6383",
          "body": "# Conflicts:\n#\tCHANGELOG.md",
          "is_bot": false,
          "headline": "Merge branch 'feat/audit-hash-chain'",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T17:26:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9042eab746f0189429dae26dbac6759b3deed966",
          "body": "Section 04: fail-open line becomes strict-mode framing (\"run in strict\nmode and no pass means nothing routes\"), and the audit item now claims\ntruncation detection alongside tampering. The threat model and\naudit-logs docs get updated in lockstep by the enforcement work.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Claim strict mode and truncation detection now that both shipped",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T17:24:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "83200e280e48e8f181a59cf4dcb5d7a627d055fe",
          "body": "The preview still appears on hover; the label was clutter.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop the \"hover to preview\" hint on the prompt pill",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T17:15:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2fc62e67c0a2f6261e90684625d2087879fdb8d7",
          "body": "- Section 01 now opens on the visceral risk a security buyer feels\n  (\"Your coding agent acts with your full access\") and lets the stats\n  land as structural backup, instead of leading with the market stat.\n- Cut the redundant first sentence from the topology caption.\n- Removed the top-border divider row above the loop's step columns;\n  no other section uses one.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Lead section 01 with the fear; trim caption and step divider",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T17:11:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "29f97948dca86fbaf68658945d4231b63aab34dc",
          "body": "ALLOWED and A HUMAN DECIDES sat directly on the green and gated\nstrokes and were hard to read. Nudged ALLOWED up and gave both a\npaper-colored halo so the text clears the line beneath it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Lift the topology edge labels off their lines",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T17:07:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0ee51f1516c540afb921e181e602ae5b2111e4fc",
          "body": "The \"Switchboard governs ... Quilt tracks what they did\" line was\nconfusing since Switchboard also tracks (the audit log). Removed it.\nAlso dropped the green \"_\" after the wordmark in the nav (landing and\ndocs); the mark carries the identity.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop the Quilt sibling line and the trailing wordmark underscore",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T16:59:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7cf6217684bba3c7896eda2a494b40cba0c8ae73",
          "body": "The credential detail (chip, barcode, serial, holo strip, field\nlabels, holder row) was too much to scan in a diagram. Card now shows\nonly what matters at a glance: the mark + SWITCHBOARD, the scope it\nallows (github_ci_*), everything else denied, and expires in 4h.\nShorter card, more breathing room, still reads as a real pass.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Simplify the pass card to a one-glance read",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T16:56:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "735e5dfcc308a2d3c1840701bbcca68b86330bc6",
          "body": "New logo: a gate glyph (two posts with a credential passing between\nthem) on a green tile - firewall and pass in one mark. It anchors the\nfavicon, the nav wordmark (landing + docs), and the topology's center\ncard.\n\nThe card is now a proper access badge: issuer lockup (mark +\nSWITCHBOARD + AGENT ACCESS PASS), HOLDER/SCOPE/EXPIRES fields, a\nsmartcard chip, a pass serial, and a barcode, instead of reading like\na bare terminal window.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add a real Switchboard mark; rebuild the pass card as a credential",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T16:52:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f14958b29e43ba860d9f2bead0a8de1c029f2898",
          "body": "Internal shorthand from the launch plan; \"storefront\" reads like paid\nsoftware. It never appeared on the site itself.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop \"storefront\" from the changelog; it's just the landing page",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T16:44:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fa8f65232b1a5e760b39a4a2719e9f4b668e10e5",
          "body": "The denial was told three times (hero topology, section 01's\nwith/without panel, and the loop's step 3). Cut the with/without\npanel so section 01 is just the lede, the three stats, and sources.\n\nThe standalone \"control\" card grid mostly restated what the topology\nand pass card already show. Folded i\n[…]\n\non the security section and dropped the section. Renumbered security\n04, for-agents 05, teams 06, and removed the now-dead .vs and .limits\nCSS.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Consolidate the landing page: 7 sections to 6",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T16:21:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "87a1efbb8638a3419f91332f8e2d3b856c8d12cc",
          "body": "Teams heading becomes \"Working with a team?\"; llms.txt/llms-full.txt\nsay \"subagents\" instead of \"subagent fleets.\"\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop \"fleet\" from public copy; it reads as VC-speak to devs",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T16:14:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "aba8847297a78929456abef24a8870bbe1cca6b2",
          "body": "The \"firewall\" half owned the topology, the DENIED stamp, and the\nwith/without panel; the keychain story got three passing mentions\ndespite being half the tagline and the more checkable hook. New\nsection 03 (secrets) makes it a beat: a before/after file transform\n(.mcp.json with a live plaintext tok\n[…]\nnjected at launch, redacted\neverywhere\" so it owns the defense-in-depth technical claim without\nduplicating the new section's keychain headline.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Give the password-manager half its own section",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T15:56:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bd8e28d6556b7868573190dd75ebd673c7262a7f",
          "body": "From an external copy review, applied with judgment:\n\n- Topology caption no longer overclaims: \"One pass decides what your\n  agents' tool calls can reach. Denied calls never leave the machine.\"\n- The WITHOUT panel drops the unverifiable \"716 more GitHub tools\" for\n  the sharper, fully defensible \"ev\n[…]\nined from the brief: building --strict this sprint (real\nenforcement work, flagged as a fast-follow) and none of the protected\ncopy was touched.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Copy review pass: fix overclaims, own the fail-open posture, add arc",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T02:05:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "821c7d32c51af059f826cfa535f0c6df90a85a7b",
          "body": "The topology's center card now reads as a physical credential: punched\nlanyard slot, inset double ring, HOLDER/SCOPE/EXPIRES label column\n(scope in grant green, expiry in lease yellow), EVERYTHING ELSE DENIED\nmicroline, refined barcode, and a subtle holo security strip.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Craft pass on the pass card",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T00:58:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cae5f77d931970ee9629ec8e9ce7a689c17c9dfb",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop the waitlist microcopy line",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T00:47:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ddc118eff1e9b1f41455a203b094b8139dff8244",
          "body": "None of the comparable landing pages link npm anywhere. GitHub is the\ncanonical link and the two pages cross-reference each other.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop npm from the footer; the install command is the npm link",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-13T00:33:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "79c61a5291cf95bfd240d3f2f8618001cf918cf8",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Footer credit down to MIT; the repo carries attribution",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T23:57:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a52fc7c1502e84bf04b528af11a768872eb16a9d",
          "body": "Section 06 swaps the raise-your-hand GitHub link for a real email\ncapture: inline form (email + join button in the token system),\nFormspree POST with a honeypot field, AJAX submit that swaps to a\nconfirmation line, and a no-JS fallback that posts to Formspree's\nconfirmation page. Microcopy promises exactly one email.\n\nThe form action carries a YOUR_FORM_ID placeholder with a TODO;\ncreating the Formspree form takes two minutes and one paste.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Capture the team-tier waitlist with an inline Formspree form",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T23:55:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b3a003671d6a068a501b1474d0000fc723c952fe",
          "body": "From a six-site teardown (paperclip.ing, executor.sh, airweave.ai,\nsuperset.sh, manufact.com, boringcomputers.com):\n\n- Section 01 now answers the ecosystem stats with the product: a\n  WITHOUT/WITH panel (token reach vs the DENIED frame), the pattern\n  every comparable site uses instead of leading wi\n[…]\nd/gated/\n  denied audit rows), framed like the credential artifacts. Notably,\n  call tracing is a \"coming soon\" on comparable sites; ours ships.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Market-pattern pass: product proof, capability framing, with/without",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T23:15:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "25144ef4e211ea8069ea7e12319351c140f31d15",
          "body": "Copy pass on the landing page. Gone: \"built to be diligenced,\" \"trust\ntooling that overstates itself is worse than none,\" \"read it before\nyou trust us. Especially then,\" \"we will not claim it before it\nships,\" \"agent-side authority.\" In their place: \"What Switchboard\ndoes not do,\" \"The security work\n[…]\ne the exact same nav as the landing page (same\nwrap, widths, items, GitHub mark). Link positions verified identical\nacross pages via Playwright.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Say it plainly: rewrite abstract copy, unify docs nav with landing",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T22:49:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b1aad6fa00135b8c6b243aa358986f9429920de2",
          "body": "Docs and Roadmap stay text; GitHub becomes the octocat icon top-right\n(the executor/Firecrawl pattern, minus the star count for now). npm\nleaves the nav; it lives in the install command and the footer. Same\ntreatment on the docs shell header.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Nav follows devtool convention: GitHub mark, no npm link",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T22:46:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "759ae476ec437da445193a315198aaa1e2a9f1d0",
          "body": "Toggling humans/agents no longer reflows the hero: both modes occupy\nidentical space (46px control, measured equal container heights). The\nagents side is a \"copy the setup prompt\" pill; the full prompt shows\nin a floating popover on hover or keyboard focus and stays selectable\nwithout JS. Fixed a stacking bug where sibling entrance animations\ncreated contexts that painted the fine print and topology over the\npopover.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Collapse the agent prompt into a pill with a hover preview",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T22:44:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e1e4a095fcaf89ed40d2b90e6282fec3a1c404d9",
          "body": "The topology is now an illustration rather than a schematic. Agent\nand provider chips carry actual logos (simple-icons paths inlined:\nClaude, OpenAI, Cursor, GitHub, Stripe) with soft depth; the center is\nthe pass rendered as a physical credential card (wordmark, pass\nnumber, scope, expiry, barcode \n[…]\ne\" chip, which\nnow wears the DENIED stamp itself.\n\nVerified via Playwright renders (the preview pane's compositor was\ndesyncing on screenshots).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Elevate the hero visual: real brand marks, credential card, motion",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T22:05:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "872a0091ba3c5c276edfb99170182162289143ee",
          "body": "The looping terminal recording fought the paper system and held a\nmostly-dark rectangle above the fold. The diagram already tells the\nallow/gate/deny story in one glance; the DENIED stamp now sits on it,\nand the live demo is a caption link instead of an embed.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop the hero GIF; the topology diagram carries the story",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T20:43:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "513ba2deefd5d541cd10f2622e020530b90bf84d",
          "body": "The agent side of the hero toggle is now the executor-style money\ninteraction: a prompt card you paste into Claude Code, Codex, or\nCursor that walks the agent through scan, dry-run import, import,\nclient routing, grant, and verify. The prompt carries the brand's\nsecurity posture: the agent must hand\n[…]\n. Escaped the <ref>/<duration> placeholders\nso they survive HTML parsing; verified a real click lands the full\n932-char prompt on the clipboard.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make \"for agents\" a copyable setup prompt",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T19:40:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "957014b6bb29154a5ef06fb5b3086e86d62901de",
          "body": "- A hero topology diagram (inline SVG on the token system): agents\n  route through the pass; the allowed edge reaches github_ci_*, the\n  gated edge pauses for a human, and the denied edge stops inside\n  Switchboard, with delete_file struck out and never reached. Caption:\n  one pass decides what leav\n[…]\np story into the hero.\n- A closing CTA echoing the headline before the footer.\n\nNew --gate token for approval-gated color, AA-verified on paper.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Adopt three patterns from executor.sh: topology, agent toggle, closer",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T19:24:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "44b8aae77fcf0b1037210a3cded915e70db89c31",
          "body": "The scan/import/keychain detail it carried is restated in the steps\nsection; the sub now reads in one breath.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Tighten the hero subhead to category plus the sharpest claim",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T18:30:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0e87a05adb3972d973d460351aab0c95cd2e15bb",
          "body": "Pages now emit as docs/<slug>/index.html so extension-less URLs\nresolve without a cleanUrls rewrite, and markdown links are resolved\nat build time: repo-relative .md links between docs map to their site\nURLs, anything else in the repo falls back to a GitHub blob link.\nVerified with a crawl over every emitted page: all internal links 200.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make docs URLs and cross-links work on any static host",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T18:10:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "61f2ce066e7035bed31d07107ef0993b6613b813",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Regenerate the hero GIF with the setup race fixed",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T17:55:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d2371e27ece1f7a9956a15bc713f7930f5ba1d26",
          "body": "The first visible frame captured the setup backlog because Show\nresumed before clear had executed. Sleep inside the Hide block fixes\nthe race.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Settle the hidden setup before capture resumes in the demo tape",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T17:52:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c558f45777d713f3db798968e6e8836e373e60de",
          "body": "From-scratch redesign off a Mobbin pattern pass (Antimetal/Height/\nCursor hero bones, Firecrawl paper-and-hairline framing, Spade stat\ncards) with a design-engineering register: restraint, typography,\nmotion with purpose.\n\nThe system: warm paper and ink (General Sans + IBM Plex Mono, AA\nverified), h\n[…]\nhonoring prefers-reduced-motion; no JS on\nthe page at all. The docs shell mirrors the same tokens so /docs and\nthe landing read as one artifact.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Redesign the landing page and docs shell: credential-paper system",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T17:51:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4eb9ebc475cc3344b7910f15c173c962d2839c81",
          "body": "Both are build outputs (bundle-docs.mjs and site/build.mjs); the\npublished package includes docs-bundle via its files list at pack time.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Ignore generated docs-bundle and site dist",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T17:05:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "41d8d6b40f5baccf973a8960eae19350b459ebe0",
          "body": "…roadmap\n\nsite/ is a static build (one dev dependency, marked): a landing page\nwhose narrative anchors on the July 28, 2026 MCP spec revision and the\n~8.5% OAuth / ~18% scoping adoption gap (cited), a docs site rendered\nfrom the repo's own markdown, and llms.txt copies at the site root.\nThe honesty \n[…]\n/later split.\nOrg model, richer policy engine, enterprise surface, and daemon socket\nhardening are roadmap entries only, deliberately not built.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add the storefront: landing page, docs site, docs MCP server, public …",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T17:05:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5e7afcf5f3ce8d0b7ea1027ca98a6682bed6d16a",
          "body": "Rendered from a local merge with the audit hash-chain branch so the\nclosing frame shows switchboard audit verify reporting Chain: OK.\nAlso strips the MCP error-code prefix from badge detail lines.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Regenerate the hero GIF from the denial-first tape",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T16:51:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "440d0690cc6488988b2757ec9f5f5f99a3a28273",
          "body": "The tape now climaxes on an out-of-scope call getting DENIED through\nthe real MCP front door (demo-agent.mjs is a genuine MCP client), with\nan approval-gated call before it and switchboard audit verify as the\ncloser. The github-ci safety template supplies the real allow/gate/deny\npolicy; the fixture\n[…]\nstream,\npolled from the same local state files the CLI reads. No dependencies;\nall client-side rendering uses textContent, never markup strings.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Re-cut the hero demo around a live denial; add a local dashboard",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T16:44:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b9640ffbb1aa94918395884b29fda2d3500078df",
          "body": "Each JSONL entry now carries prevHash (previous entry's hash, or\n\"genesis\" for the first chained entry) and hash (sha256 over the entry\nJSON without the hash field). Appends serialize through a lockfile next\nto the log, mirroring the mandate store lock, so concurrent daemon and\nCLI writers cannot fo\n[…]\nudit-logs.md,\nincluding what the chain does not detect (tail truncation, whole-file\nrewrite, never-written entries); signing stays out of scope.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make the audit log tamper-evident with hash chaining and audit verify",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T16:28:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4e3a98abfd93af2a3a4c12cfe58c1f51ad441201",
          "body": "docs/security/threat-model.md covers components, threat actors, what\nenforcement binds (routed MCP + switchboard run) vs what it cannot (raw\nshell, provider CLIs, direct MCP, browser), revocation semantics\nincluding in-flight calls, daemon socket assumptions (no SO_PEERCRED,\nstated plainly), secrets\n[…]\nog threat surface, and an\naccepted-risks list. trust-model.md becomes a short posture summary\npointing at it; README and SECURITY.md link to it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add STRIDE threat model as the security diligence artifact",
          "author_name": "Wilson Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-12T16:19:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cc0f3cb668419cb8ea66e0474aa15a349a9b70ed",
          "body": "mcp-publisher publish rejected the listing (400) because the npm\npackage lacked the mcpName field the registry validates npm ownership\nwith. Quilt publishes with the same field. Add\n\"mcpName\": \"io.github.wkoverfield/switchboard\" to the cli package and\nbump so it lands on npm; server.json tracks 0.1.6.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release 0.1.6: add mcpName for the official MCP registry (#173)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T21:12:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9847b1b668d63ad705d609eb72accfac25bb04c6",
          "body": "… (#172)\n\nThe official registry rejects descriptions over 100 characters (422 on\nmcp-publisher publish). Trim to a 93-char version so the listing\nvalidates.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Shorten server.json description to satisfy MCP registry (<=100 chars)…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T21:07:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2b7e7cd18ae1a7d8fdc82850696a3519e610e033",
          "body": "The daemon multiplexing shipped in 0.1.4 but its best capability was\ninvisible. Make it discoverable and carry the MCP registry marker to npm:\n\n- install output now tips users toward --scope user (one server for\n  every repo) at the point of use.\n- README gains a short 'One install for every repo' s\n[…]\n\nThis release exists partly to publish the mcp-name marker (added on\nmain after 0.1.4) so the official MCP registry can validate npm\nownership.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release 0.1.5: surface user-scope install + MCP registry marker (#171)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T20:57:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e38a0f5cf91614daabef582e38f1844cc8512a8b",
          "body": "Sets up publishing to the official MCP registry\n(registry.modelcontextprotocol.io) as io.github.wkoverfield/switchboard,\nwhich auto-feeds Glama, PulseMCP, and Smithery. server.json points at\nthe published @switchboard-mcp/cli npm package launched as\n'switchboard mcp' (stdio); the mcp-name markers pr\n[…]\nublish so registry npm-ownership\nvalidation passes; completing the listing is a one-time\n'mcp-publisher login github && mcp-publisher publish'.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add MCP registry server.json + ownership markers (#170)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T18:08:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7623fed18cc30f1283d3aec0ff41def9347dc82e",
          "body": "…169)\n\nShips the multi-repo daemon work (per-request cwd multiplexing, live\npass auto-bind by repo/branch, and install --scope user) to npm.\nVersion reads from package.json so --version stays accurate.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release 0.1.4: daemon multiplexing, auto-bind, user-scoped install (#…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T16:18:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d9fe4a0f9fbb8d13ff1d8bca0ed6f7aa22c3c511",
          "body": "Bumps the npm group with 3 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) and [tsx](https://github.com/privatenumber/tsx).\n\n\nUpdates `@ty\n[…]\ne-type: version-update:semver-minor\n  dependency-group: npm\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Bump the npm group with 3 updates (#165)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-04T16:08:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2d0fe62610305eb22bd1e9940ebb1639ab910dc2",
          "body": "…(#168)\n\nswitchboard install <client> --scope user prints the one-time command\nto register a single Switchboard MCP server (claude mcp add --scope\nuser, or the codex global equivalent). The server runs with no --cwd\nand no --mandate: each agent session launches it in the project dir, so\nit resolves \n[…]\nauto-bind scopes it. Tests cover the --scope user output shape (no\n--cwd, no --mandate) and scope validation. 407 tests, lint, typecheck\ngreen.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add user-scoped install: one trusted server for every repo (Stage 3) …",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T16:07:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "47dea3496f15dbb766069568ec4da294fc23c8f2",
          "body": "…167)\n\nMakes grant-per-repo auto-scope any agent, and is the piece a\n--mandate-less user-level install needs. When the daemon serves a\nrequest with no mandateId, it resolves the single active pass for that\nrepo and branch and applies its policy. Exactly-one-match only: zero\nactive passes keeps the p\n[…]\nagent saw only the\nallowed tool (1 of 14); closing the pass returned it to the full\nsurface. New daemon-runtime test covers the auto-bind path.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Auto-bind the live pass by repo/branch when no --mandate (Stage 2) (#…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T15:59:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "293150d72259ff053c385bbbe680546dda3c3d2d",
          "body": "* Multiplex the daemon: one daemon serves many repos (Stage 1)\n\nThe daemon was a per-machine singleton bound to one repo cwd; a second\nrepo collided (\"daemon is running for X; use --runtime-dir\"). That\ncontradicts the core value prop of managing MCP access across all your\nrepos. Root cause was narro\n[…]\nng repo; omitting cwd entirely still keeps the legacy single-repo\nfallback.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Multiplex the daemon: one daemon serves many repos (Stage 1) (#166)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T15:50:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f7f34b1b9106203dc6f7c8424a3ddee17b11144d",
          "body": "…(#164)\n\nThe grouped npm PR (#163) bundled a safe tsx bump with TypeScript 5->6,\nESLint 9->10, and @types/node 22->26, so the whole weekly PR failed CI\nand nothing landed. Ignore those specific majors: they are breaking\ntoolchain upgrades that need a dedicated migration, and @types/node\nshould track\n[…]\n Node 22 we run in CI. Routine and minor bumps now flow\nthrough the weekly group green; lift an ignore entry when doing the\nupgrade on purpose.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Defer TS6/ESLint10 majors so the weekly dependabot group stays green …",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T06:11:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3f008dc0905de217da0b3e7bd3414cb2bf13a4aa",
          "body": "* Prepare 0.1.3: ship the real README on the npm page\n\nThe published @switchboard-mcp/cli page was showing a 466-byte stub\nwith pre-carve 'mandate' vocabulary, because npm renders the package's\nown apps/cli/README.md, not the repo root README. Replace it with a\nreal package README: the tagline, the \n[…]\n lockstep.\n\n--version now reports 0.1.3; 403 tests, lint, pack smoke green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Prepare 0.1.3: ship the real README on the npm page (#162)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T06:06:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d71b97bf213689d01feae1b4b2488b5737ea772",
          "body": "- dependabot.yml: one weekly npm group and one weekly actions group\n  (patterns: *), so a small dependency set stops producing one PR per\n  package. Mirrors the quilt config.\n- ci.yml: apply the three action majors dependabot proposed\n  (checkout v7, setup-node v6, pnpm/action-setup v6) in one commit,\n  since all three edit the same file and would otherwise conflict as\n  separate merges. Supersedes PRs #155, #156, #157.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Group dependabot updates (quilt-style) and bump CI actions (#161)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T06:04:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7171b2be275a6346fbfa4287e13c4ac90d109dc3",
          "body": "Bumps [commander](https://github.com/tj/commander.js) from 14.0.3 to 15.0.0.\n- [Release notes](https://github.com/tj/commander.js/releases)\n- [Changelog](https://github.com/tj/commander.js/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/tj/commander.js/compare/v14.0.3...v15.0.0)\n\n---\nupdate\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Bump commander from 14.0.3 to 15.0.0 (#159)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-04T05:53:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f214321509e5160a5fad43fcd244a01d41b58830",
          "body": "The highest-leverage launch asset: a 17s VHS-rendered terminal GIF of\nthe grant flow at the top of the README, in full color. An agent can\nreach every tool and token in the repo, then gets put on a scoped,\nexpiring pass; the PASS GRANTED badge is the hero frame.\n\nBuilt with VHS (the same toolchain a\n[…]\nnt so the\nbadge shows the real enforcing happy path. Image uses an absolute raw\nURL so it renders on the npm package page too, not just GitHub.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add hero demo GIF to the README (#160)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T05:44:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "53927c6794af79cd72cfd7c5c94271311b4bffd9",
          "body": "…#154)\n\nModeled on the quilt repo's kit, tuned defensive for a security tool\nin alpha:\n\n- CONTRIBUTING.md leads with the load-bearing properties: secrets\n  never surface, copy never overclaims, machine contracts stay stable,\n  pass vocabulary on the human surface, local-first with no telemetry.\n  As\n[…]\nin (checks required, linear\nhistory, no force push or deletion), private vulnerability reporting,\ndependabot alerts and security fixes enabled.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add contribution kit: CONTRIBUTING, SECURITY, templates, dependabot (…",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T05:05:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "67ef054449d3d125e2a45b6ea9d7782411095850",
          "body": "PR #151 carved the human CLI surface from \"mandate\" to \"pass\" but the\ndaemon runtime still answered agents in the old vocabulary. Rewrite the\noutgoing tool-result prose (top-level error and mcpError.message) at the\nresponse boundary and point suggested commands at switchboard pass\nrenew/status, foll\n[…]\ners and audit log entries keep the raw core messages,\nand machine contracts (mcpError.code, mandateId fields, the --mandate\nflag) are unchanged.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Carry the pass vocabulary into daemon agent-facing errors (#153)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T04:03:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "68cdcd72c5b0ed504476b30c594ee96a1b61384a",
          "body": "* Rewrite README around the pass, modeled on the best CLI READMEs\n\nStudied ripgrep, fzf, bat, atuin, mise, just, direnv, and age, and\nrebuilt the README on the skeleton they share: tagline, badges, real\nterminal proof in the first screenful, install inside the first 15%,\nquickstart with real output,\n[…]\ncan excerpt keeps the route-missing\nlines so it reads as a real transcript.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Rewrite README around the pass, modeled on the best CLI READMEs (#152)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T03:47:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "69efb22a06d4744ed0d4558b5a53cd85bcf2c3b7",
          "body": "* Carve human vocabulary from mandate to pass across the CLI\n\nThe cold test's confirmed friction: users understand the grant badge's\n\"pass\" instantly but couldn't decode \"mandate\" — two words for one\nconcept. This unifies the human surface under pass, timed before npm\npublish so the rename never bec\n[…]\nard\nmandate store...\"); both now go through mandateMessageInPassVocabulary.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Carve human vocabulary from mandate to pass across the CLI (#151)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T02:03:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca7a728a179486d756f60290291116aece959f83",
          "body": "* Color the grant badge: green frame, bold denials, yellow expiry\n\nZero-dependency ANSI painting, on only for a real TTY and always off\nunder NO_COLOR / TERM=dumb, so piped and captured output stays byte-\nplain. Frame widths are measured on plain text before painting so\nescape codes can never skew a\n[…]\ny@anthropic.com>\n\n* Clearer failure when the badge bottom rule goes missing\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Color the grant badge: green frame, bold denials, yellow expiry (#150)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T00:55:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e9c2d6b0fc9585bab054cbf2d6c64e0c49d25f57",
          "body": "* Show active passes first in status; nudge grant toward install\n\n- switchboard status now answers \"is a pass live right now?\" as its\n  first line, human and JSON (activePasses with id, branch, role,\n  lease, expiry), with human-readable time remaining.\n- switchboard grant now detects whether any ag\n[…]\ntion, not parse success), so a broken repo config can't hide a\n  live pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Show active passes first in status; nudge grant toward install (#149)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T00:46:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "352ec43ab16f73e56f7c3b42d65b84b051354e21",
          "body": "* Add switchboard grant/revoke: a scoped pass that expires\n\ngrant is the one-verb front door to the mandate machinery: it derives\nsensible defaults (all repo profiles, current branch, an 'agent' role,\na 4h lease), scopes allowed tools to exactly those profiles'\nnamespaces, creates the mandate, and r\n[…]\nex-matching a core error message, removing a cross-package string\n  coupling.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add switchboard grant/revoke: a scoped pass that expires (#148)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-04T00:12:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1a2bcc4c9356a26743604a60ff3025be2e333d7",
          "body": "* Reframe CLI entry copy from jargon to plain language\n\nA cold-usability test flagged the --help one-liner ('local mandate\nlayer and MCP profile router') as 'jargon that wouldn't land cold.'\nRewrite the top-level description and the front-door command\ndescriptions (scan, import, status, doctor, inst\n[…]\nes with --write.\n- Relax the guard test to the non-brittle jargon assertions.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Reframe CLI entry copy from jargon to plain language (#147)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-03T23:53:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3206ad9ef3e8762c61dfea1a7af0d1bc56f1ba8e",
          "body": "* Make secret-store failures recoverable instead of a dead end\n\nA cold-usability test got 80% through setup, then secrets set threw a\nbare \"Unsupported state or unable to authenticate data\" crypto error\nwith no path forward, and secrets doctor reported the backend healthy\nand looped back to the cras\n[…]\neck can never destroy a\nuser secret that happens to share the probe ref name.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make secret-store failures recoverable instead of a dead end (#146)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-03T22:34:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5ec7181303ec514ac893d28e7a39d1aa456066b4",
          "body": "* Broaden audit export with mandate, approval, and log evidence\n\nswitchboard audit export gains --include mandates,approvals,logs (or\nall) to append repo-scoped evidence records to the JSONL stream:\nmandate records carry the lease/actor/policy-hash evidence, approval\nrequest records carry gate conte\n[…]\nries with matched vs\nexported counts, and non-positive --log-limit rejection.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Broaden audit export with mandate, approval, and log evidence (#145)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-02T19:51:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d2b33820cacc65bd795f20f133701f6738076694",
          "body": "The repo manifest now includes an additive diff block comparing the\nintended Switchboard client route against active Codex/Claude project\nconfig. Each client reports in-sync, drift, or unknown status with\ntyped findings (missing or stale Switchboard route, unparseable client\nconfig, direct routes, a\n[…]\n the CLI maps\nscan client inspections and configured acceptedRisks.directMcp into it\nand renders a Route drift section in human manifest output.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add manifest route drift diff v0 (#144)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-02T16:03:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3565b76ffb2d1cf8dfd939b39fcfad74e706b8af",
          "body": "* Add mandate lease evidence v0\n\nMandates now record additive authority evidence: an optional --actor\ncreator identity on mandate create/child/renew, an authority source\n(preset, authority-map, parent, or manual), a deterministic sha256\npolicy hash over the granted profile/tool/approval policy, and \n[…]\ns across mandate JSON,\nmcpLaunch policy, workspace lease, and verbose output.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add mandate lease evidence v0 (#143)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T22:53:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cf19ac540c9e751fc9ed7aa1d6d957f809eb621c",
          "body": null,
          "is_bot": false,
          "headline": "Add repo authority manifest v0 (#142)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T19:44:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7f311a3e744b7728522830af0cd2d067623ef11",
          "body": null,
          "is_bot": false,
          "headline": "Create mandates from reviewed authority maps (#141)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T16:31:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c1fe031d63c5234e457a7afa20c0fac1ca8c4e1",
          "body": null,
          "is_bot": false,
          "headline": "Deepen repo authority audit v1 (#140)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T16:17:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56f0bbf09716169cee9d962ccdbfd496aea74ae7",
          "body": null,
          "is_bot": false,
          "headline": "Add repo authority audit v0 (#139)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T15:36:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4114834aaaa67c4bcd9919fbdea62fecf11857f3",
          "body": null,
          "is_bot": false,
          "headline": "Add authority map fresh-agent eval (#138)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T01:16:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af4f5554ecf2267bf4db2949a72c52195de60d0e",
          "body": null,
          "is_bot": false,
          "headline": "Prepare public alpha license release (#137)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T01:02:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ecb7fba9e30d39068fbe313370eb34fc4b734266",
          "body": null,
          "is_bot": false,
          "headline": "Add authority map draft v0 (#136)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-07-01T00:41:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9cddf74e103e598606ad8941d67498fa70053f52",
          "body": null,
          "is_bot": false,
          "headline": "Add opt-in live provider dogfood harnesses (#135)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-06-30T16:34:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3423d58f1148514838ff95557680d5c13e19ab8",
          "body": null,
          "is_bot": false,
          "headline": "Add Supabase dev authority proof (#134)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-06-30T07:50:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a3714cbf91ebd1e40e872fd4f3a5c34c8ef8d51",
          "body": "* test: deepen vercel preview authority proof\n\n* docs: clarify vercel fixture proof scope",
          "is_bot": false,
          "headline": "test: deepen vercel preview authority proof (#133)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-06-30T06:54:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f5d670a1b54eeaa9707b739dc7513618f15feaa",
          "body": null,
          "is_bot": false,
          "headline": "test: add blind alpha evidence runbook (#132)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-06-30T05:56:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67833a802823d4b99dd9681d7af7f7dbdcf7e30c",
          "body": null,
          "is_bot": false,
          "headline": "feat: polish mandate approval operator output (#131)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-06-30T04:08:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61a570101e4fbc3699c9ddbb71c30ac00f3ec95c",
          "body": null,
          "is_bot": false,
          "headline": "test: deepen github ci authority proof (#130)",
          "author_name": "Wilson Kiagiri Overfield",
          "author_login": "wkoverfield",
          "committed_at": "2026-06-29T19:29:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 3,
      "commits_last_year": 240,
      "latest_release_at": "2026-07-18T23:28:56Z",
      "latest_release_tag": "v0.2.2",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 6,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 2.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 85,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@switchboard-mcp/cli",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "mcp",
            "model-context-protocol",
            "ai-agents",
            "codex",
            "claude-code",
            "cursor",
            "vscode",
            "supabase",
            "stripe",
            "posthog",
            "sentry",
            "mcp-server",
            "mcp-router",
            "mcp-gateway",
            "tool-calling",
            "developer-tools"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@switchboard-mcp/cli",
          "is_deprecated": false,
          "latest_version": "0.2.2",
          "repository_url": "https://github.com/wkoverfield/switchboard",
          "versions_count": 10,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1927,
          "first_published_at": "2026-06-27T15:33:39.487000Z",
          "latest_published_at": "2026-07-18T23:24:36.551000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@switchboard-mcp/core",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@switchboard-mcp/core",
          "is_deprecated": false,
          "latest_version": "0.2.2",
          "repository_url": "https://github.com/wkoverfield/switchboard",
          "versions_count": 10,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2002,
          "first_published_at": "2026-06-27T15:33:35.512000Z",
          "latest_published_at": "2026-07-18T23:24:33.279000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@switchboard-mcp/docs-mcp",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@switchboard-mcp/docs-mcp",
          "is_deprecated": false,
          "latest_version": "0.2.2",
          "repository_url": "https://github.com/wkoverfield/switchboard",
          "versions_count": 3,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 466,
          "first_published_at": "2026-07-14T02:13:57.396000Z",
          "latest_published_at": "2026-07-18T23:24:38.122000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@switchboard-mcp/mcp-runtime",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@switchboard-mcp/mcp-runtime",
          "is_deprecated": false,
          "latest_version": "0.2.2",
          "repository_url": "https://github.com/wkoverfield/switchboard",
          "versions_count": 10,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1849,
          "first_published_at": "2026-06-27T15:33:37.156000Z",
          "latest_published_at": "2026-07-18T23:24:34.941000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 3
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "apps/cli/tsconfig.json",
        "packages/core/tsconfig.json",
        "packages/docs-mcp/tsconfig.json",
        "packages/mcp-runtime/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 410270,
      "source_files_sampled": 122,
      "oversized_source_files": 3,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "site/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "@hono/node-server",
            "direct": false,
            "version": "1.19.14",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 5.9,
            "advisory_ids": [
              "GHSA-frvp-7c67-39w9"
            ],
            "fixed_version": "2.0.5",
            "advisory_count": 1,
            "oldest_advisory_days": 2
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "moderate": 1
        },
        "advisory_count": 1,
        "affected_count": 1,
        "assessed_count": 144,
        "malicious_count": 0,
        "assessed_package": "npm:@switchboard-mcp/cli@0.2.2",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@switchboard-mcp/core",
          "manifest": "apps/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@switchboard-mcp/mcp-runtime",
          "manifest": "apps/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "commander",
          "manifest": "apps/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.0.0"
        },
        {
          "name": "cross-keychain",
          "manifest": "packages/core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.0"
        },
        {
          "name": "yaml",
          "manifest": "packages/core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.8.2"
        },
        {
          "name": "zod",
          "manifest": "packages/core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.2.0"
        },
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "packages/docs-mcp/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.29.0"
        },
        {
          "name": "zod",
          "manifest": "packages/docs-mcp/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.4.3"
        },
        {
          "name": "@switchboard-mcp/core",
          "manifest": "packages/mcp-runtime/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "packages/mcp-runtime/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.29.0"
        },
        {
          "name": "zod",
          "manifest": "packages/mcp-runtime/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.4.3"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "@modelcontextprotocol/sdk",
            "direct": true,
            "version": "1.29.0",
            "ecosystem": "npm"
          },
          {
            "name": "@modelcontextprotocol/sdk",
            "direct": true,
            "version": "^1.29.0",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": true,
            "version": "15.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": true,
            "version": "^15.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cross-keychain",
            "direct": true,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "cross-keychain",
            "direct": true,
            "version": "^1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "yaml",
            "direct": true,
            "version": "2.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "yaml",
            "direct": true,
            "version": "^2.8.2",
            "ecosystem": "npm"
          },
          {
            "name": "zod",
            "direct": true,
            "version": "4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "zod",
            "direct": true,
            "version": "^4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "zod",
            "direct": true,
            "version": "^4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/core",
            "direct": false,
            "version": "1.10.0",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/runtime",
            "direct": false,
            "version": "1.10.0",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/wasi-threads",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/aix-ppc64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ia32",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-loong64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-mips64el",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ppc64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-riscv64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-s390x",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openharmony-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/sunos-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-arm64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-ia32",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-x64",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint-community/eslint-utils",
            "direct": false,
            "version": "4.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint-community/regexpp",
            "direct": false,
            "version": "4.12.2",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/config-array",
            "direct": false,
            "version": "0.21.2",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/config-helpers",
            "direct": false,
            "version": "0.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/core",
            "direct": false,
            "version": "0.17.0",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/eslintrc",
            "direct": false,
            "version": "3.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/js",
            "direct": false,
            "version": "9.39.4",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/object-schema",
            "direct": false,
            "version": "2.1.7",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/plugin-kit",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "@hono/node-server",
            "direct": false,
            "version": "1.19.14",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/core",
            "direct": false,
            "version": "0.19.2",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/node",
            "direct": false,
            "version": "0.16.8",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/types",
            "direct": false,
            "version": "0.15.0",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/module-importer",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/retry",
            "direct": false,
            "version": "0.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/ansi",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/checkbox",
            "direct": false,
            "version": "4.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/confirm",
            "direct": false,
            "version": "5.1.21",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/core",
            "direct": false,
            "version": "10.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/editor",
            "direct": false,
            "version": "4.2.23",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/expand",
            "direct": false,
            "version": "4.0.23",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/external-editor",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/figures",
            "direct": false,
            "version": "1.0.15",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/input",
            "direct": false,
            "version": "4.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/number",
            "direct": false,
            "version": "3.0.23",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/password",
            "direct": false,
            "version": "4.0.23",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/prompts",
            "direct": false,
            "version": "7.10.1",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/rawlist",
            "direct": false,
            "version": "4.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/search",
            "direct": false,
            "version": "3.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/select",
            "direct": false,
            "version": "4.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/type",
            "direct": false,
            "version": "3.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/sourcemap-codec",
            "direct": false,
            "version": "1.5.5",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-darwin-arm64",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-darwin-x64",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-freebsd-x64",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-linux-arm-gnueabihf",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-linux-arm64-gnu",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-linux-arm64-musl",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-linux-riscv64-gnu",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-linux-x64-gnu",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-linux-x64-musl",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-win32-arm64-msvc",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-win32-ia32-msvc",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/keyring-win32-x64-msvc",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/wasm-runtime",
            "direct": false,
            "version": "1.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "@oxc-project/types",
            "direct": false,
            "version": "0.133.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-android-arm64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-darwin-arm64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-darwin-x64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-freebsd-x64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm-gnueabihf",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm64-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm64-musl",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-ppc64-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-s390x-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-x64-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-x64-musl",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-openharmony-arm64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-wasm32-wasi",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-win32-arm64-msvc",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-win32-x64-msvc",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/pluginutils",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@standard-schema/spec",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tybys/wasm-util",
            "direct": false,
            "version": "0.10.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/chai",
            "direct": false,
            "version": "5.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/deep-eql",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "@types/json-schema",
            "direct": false,
            "version": "7.0.15",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "22.20.0",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/eslint-plugin",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/parser",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/project-service",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/scope-manager",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/tsconfig-utils",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/type-utils",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/types",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/typescript-estree",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/utils",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript-eslint/visitor-keys",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/expect",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/mocker",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/pretty-format",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/runner",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/snapshot",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/spy",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/utils",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "accepts",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "acorn",
            "direct": false,
            "version": "8.17.0",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-jsx",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "6.15.0",
            "ecosystem": "npm"
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "8.20.0",
            "ecosystem": "npm"
          },
          {
            "name": "ajv-formats",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "argparse",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "assertion-error",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "body-parser",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "1.1.15",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "5.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "bytes",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "call-bind-apply-helpers",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "call-bound",
            "direct": false,
            "version": "1.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "callsites",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "chai",
            "direct": false,
            "version": "6.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "chalk",
            "direct": false,
            "version": "4.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "chardet",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "cli-width",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "color-convert",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "color-name",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "concat-map",
            "direct": false,
            "version": "0.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "content-disposition",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "content-type",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "content-type",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "convert-source-map",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cookie",
            "direct": false,
            "version": "0.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "cookie-signature",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "cors",
            "direct": false,
            "version": "2.8.6",
            "ecosystem": "npm"
          },
          {
            "name": "cross-spawn",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "deep-is",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "depd",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "detect-libc",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "dunder-proto",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ee-first",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "encodeurl",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-define-property",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "es-errors",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-module-lexer",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-object-atoms",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "esbuild",
            "direct": false,
            "version": "0.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "escape-html",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint",
            "direct": false,
            "version": "9.39.4",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-scope",
            "direct": false,
            "version": "8.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-visitor-keys",
            "direct": false,
            "version": "3.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-visitor-keys",
            "direct": false,
            "version": "4.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-visitor-keys",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "espree",
            "direct": false,
            "version": "10.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "esquery",
            "direct": false,
            "version": "1.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "esrecurse",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "estraverse",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "estree-walker",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "esutils",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "etag",
            "direct": false,
            "version": "1.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "eventsource",
            "direct": false,
            "version": "3.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "eventsource-parser",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "expect-type",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "express",
            "direct": false,
            "version": "5.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "express-rate-limit",
            "direct": false,
            "version": "8.5.2",
            "ecosystem": "npm"
          },
          {
            "name": "fast-deep-equal",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "fast-json-stable-stringify",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "fast-levenshtein",
            "direct": false,
            "version": "2.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "fast-uri",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "fdir",
            "direct": false,
            "version": "6.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "file-entry-cache",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "finalhandler",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "find-up",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "flat-cache",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "flatted",
            "direct": false,
            "version": "3.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "forwarded",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "fresh",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "fsevents",
            "direct": false,
            "version": "2.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "function-bind",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "get-intrinsic",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "get-proto",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "glob-parent",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "globals",
            "direct": false,
            "version": "14.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "gopd",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-flag",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-symbols",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "hasown",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "hono",
            "direct": false,
            "version": "4.12.26",
            "ecosystem": "npm"
          },
          {
            "name": "http-errors",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "iconv-lite",
            "direct": false,
            "version": "0.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "7.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "import-fresh",
            "direct": false,
            "version": "3.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "imurmurhash",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "inherits",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "ip-address",
            "direct": false,
            "version": "10.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "ipaddr.js",
            "direct": false,
            "version": "1.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-extglob",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-fullwidth-code-point",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-glob",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-promise",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "isexe",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "jose",
            "direct": false,
            "version": "6.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "js-yaml",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-buffer",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-traverse",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-traverse",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-typed",
            "direct": false,
            "version": "8.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "json-stable-stringify-without-jsonify",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "keyv",
            "direct": false,
            "version": "4.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "levn",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-android-arm64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-darwin-arm64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-darwin-x64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-freebsd-x64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm-gnueabihf",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm64-gnu",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm64-musl",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-x64-gnu",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-x64-musl",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-win32-arm64-msvc",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-win32-x64-msvc",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "locate-path",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "lodash.merge",
            "direct": false,
            "version": "4.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "magic-string",
            "direct": false,
            "version": "0.30.21",
            "ecosystem": "npm"
          },
          {
            "name": "marked",
            "direct": false,
            "version": "15.0.12",
            "ecosystem": "npm"
          },
          {
            "name": "marked",
            "direct": false,
            "version": "^15.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "math-intrinsics",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "media-typer",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "meow",
            "direct": false,
            "version": "14.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "merge-descriptors",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-db",
            "direct": false,
            "version": "1.54.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-types",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "10.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "3.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "mute-stream",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "nanoid",
            "direct": false,
            "version": "3.3.15",
            "ecosystem": "npm"
          },
          {
            "name": "natural-compare",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "negotiator",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "object-assign",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "object-inspect",
            "direct": false,
            "version": "1.13.4",
            "ecosystem": "npm"
          },
          {
            "name": "obug",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "on-finished",
            "direct": false,
            "version": "2.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "once",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "optionator",
            "direct": false,
            "version": "0.9.4",
            "ecosystem": "npm"
          },
          {
            "name": "p-limit",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-locate",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "parent-module",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "parseurl",
            "direct": false,
            "version": "1.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "path-exists",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-key",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-to-regexp",
            "direct": false,
            "version": "8.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "pathe",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "picocolors",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "pkce-challenge",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "postcss",
            "direct": false,
            "version": "8.5.16",
            "ecosystem": "npm"
          },
          {
            "name": "prelude-ls",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "proxy-addr",
            "direct": false,
            "version": "2.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "punycode",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "qs",
            "direct": false,
            "version": "6.15.2",
            "ecosystem": "npm"
          },
          {
            "name": "range-parser",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "raw-body",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "require-from-string",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-from",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "rolldown",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "router",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "safer-buffer",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "7.8.5",
            "ecosystem": "npm"
          },
          {
            "name": "send",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "serve-static",
            "direct": false,
            "version": "2.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "setprototypeof",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "shebang-command",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "shebang-regex",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel-list",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel-map",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel-weakmap",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "siginfo",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "signal-exit",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-js",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "stackback",
            "direct": false,
            "version": "0.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "statuses",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "std-env",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "4.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-json-comments",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinybench",
            "direct": false,
            "version": "2.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinyexec",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "tinyglobby",
            "direct": false,
            "version": "0.2.17",
            "ecosystem": "npm"
          },
          {
            "name": "tinyrainbow",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "toidentifier",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ts-api-utils",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "tslib",
            "direct": false,
            "version": "2.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "tsx",
            "direct": false,
            "version": "4.23.0",
            "ecosystem": "npm"
          },
          {
            "name": "tsx",
            "direct": false,
            "version": "^4.23.0",
            "ecosystem": "npm"
          },
          {
            "name": "type-check",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "type-is",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "5.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "typescript-eslint",
            "direct": false,
            "version": "8.62.1",
            "ecosystem": "npm"
          },
          {
            "name": "undici-types",
            "direct": false,
            "version": "6.21.0",
            "ecosystem": "npm"
          },
          {
            "name": "unpipe",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "uri-js",
            "direct": false,
            "version": "4.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "vary",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "8.0.16",
            "ecosystem": "npm"
          },
          {
            "name": "vitest",
            "direct": false,
            "version": "4.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "which",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "why-is-node-running",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "word-wrap",
            "direct": false,
            "version": "1.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "wrap-ansi",
            "direct": false,
            "version": "6.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "wrappy",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "yocto-queue",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "yoctocolors-cjs",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "zod-to-json-schema",
            "direct": false,
            "version": "3.25.2",
            "ecosystem": "npm"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 346,
        "direct_count": 11,
        "indirect_count": 335
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 3,
        "merged_prs": 192,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 4,
        "closed_unmerged_prs": 6
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "wkoverfield",
          "commits": 238,
          "avatar_url": "https://avatars.githubusercontent.com/u/122052931?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.js"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "pnpm-lock.yaml"
      ],
      "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": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "25 out of 25 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 0/25 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": 10,
            "reason": "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": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not 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": 10,
            "reason": "security policy file 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": 2,
            "reason": "8 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "4893b61b14d4ecf76768777d7e4fc4d654afb3bf",
        "ran_at": "2026-07-24T12:23:21Z",
        "aggregate_score": 4.3,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-24T04:09:42Z",
      "oldest_open_prs": [
        {
          "number": 196,
          "created_at": "2026-07-16T19:34:35Z",
          "last_comment_at": "2026-07-16T19:34:36Z",
          "last_comment_author": "vercel"
        },
        {
          "number": 203,
          "created_at": "2026-07-18T21:52:43Z",
          "last_comment_at": "2026-07-18T21:52:45Z",
          "last_comment_author": "vercel"
        },
        {
          "number": 204,
          "created_at": "2026-07-18T21:53:48Z",
          "last_comment_at": "2026-07-18T21:53:51Z",
          "last_comment_author": "vercel"
        }
      ],
      "last_merged_pr_at": "2026-07-18T23:39:08Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/wkoverfield/switchboard",
    "host": "github.com",
    "name": "switchboard",
    "owner": "wkoverfield"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 63,
      "inputs": {
        "security": 52,
        "vitality": 75,
        "community": 43,
        "governance": 54,
        "engineering": 86
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 75,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 58,
            "inputs": {
              "commits_last_year": 240,
              "human_commit_share": 0.98,
              "days_since_last_push": 5,
              "active_weeks_last_year": 6
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "6/52 weeks with commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "240 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 240
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "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": 100,
            "inputs": {
              "releases_count": 3,
              "latest_release_tag": "v0.2.2",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 2.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "3 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~2.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2.4
                    }
                  }
                ],
                "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": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 43,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "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": 18,
                "status": "met",
                "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": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 63,
            "inputs": {
              "packages": [
                "@switchboard-mcp/cli",
                "@switchboard-mcp/core",
                "@switchboard-mcp/docs-mcp",
                "@switchboard-mcp/mcp-runtime"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 6244
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "6,244 downloads/month across npm",
                "points": 50.6,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 6244,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 54,
        "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": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "merged_prs": 192,
              "open_issues": 0,
              "closed_issues": 4,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 6
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "192/198 decided PRs merged",
                "points": 37.1,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 192,
                      "decided": 198
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/25 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": 42,
            "inputs": {
              "followers": 12,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "wkoverfield",
              "public_repos": 12,
              "account_age_days": 1295
            },
            "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": "12 followers of wkoverfield",
                "points": 8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 12,
                      "login": "wkoverfield"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "12 public repos, account ~3 yr old",
                "points": 15.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 12
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 3
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@switchboard-mcp/cli",
                "@switchboard-mcp/core",
                "@switchboard-mcp/docs-mcp",
                "@switchboard-mcp/mcp-runtime"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "4 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 4,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "10 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 86,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "eslint.config.js",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "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": "25 out of 25 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": [
                "ai-agents",
                "claude-code",
                "cli",
                "codex",
                "coding-agents",
                "developer-tools",
                "local-first",
                "mcp",
                "secrets-management",
                "security"
              ],
              "has_wiki": false,
              "homepage": "https://switchboard-beta-nine.vercel.app",
              "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://switchboard-beta-nine.vercel.app",
                "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": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 52,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 43,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 4.3
            },
            "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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "25 out of 25 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 0/25 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": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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 detected",
                "points": 5,
                "status": "met",
                "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": "8 existing vulnerabilities detected",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Matched the npm:@switchboard-mcp/cli@0.2.2 runtime dependency closure — what installing the published package pulls in — 144 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@switchboard-mcp/cli@0.2.2",
                  "assessed": 144
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "source": "osv",
              "advisories": 1,
              "affected_packages": 1,
              "assessed_packages": 144,
              "unassessed_packages": 0,
              "affected_by_severity": "moderate 1",
              "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": "1 affected: @hono/node-server 1.19.14 (moderate 5.9)",
                "points": 13.2,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "@hono/node-server 1.19.14 (moderate 5.9)"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "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": 144,
              "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": "moderate",
        "name": "AI Readiness",
        "value": 69,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "moderate",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 0.939,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "92 of 98 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 92,
                      "sampled": 98
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "apps/cli/tsconfig.json",
                "packages/core/tsconfig.json",
                "packages/docs-mcp/tsconfig.json",
                "packages/mcp-runtime/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.74,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.02
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "eslint.config.js",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "apps/cli/tsconfig.json, packages/core/tsconfig.json, packages/docs-mcp/tsconfig.json, packages/mcp-runtime/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "apps/cli/tsconfig.json, packages/core/tsconfig.json, packages/docs-mcp/tsconfig.json, packages/mcp-runtime/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "74 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 74,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "2 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 2,
                      "sampled": 100
                    }
                  }
                ],
                "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": 99,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 410270,
              "source_files_sampled": 122,
              "oversized_source_files": 3
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "3/122 source files over 60KB",
                "points": 53.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 122,
                      "oversized": 3
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "moderate",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "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": [],
  "report_type": "repository",
  "generated_at": "2026-07-24T12:23:36.791019Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/w/wkoverfield/switchboard.svg",
  "full_name": "wkoverfield/switchboard",
  "license_state": "standard",
  "license_spdx": "MIT"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计npm.