Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 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 р.Переглянути на GitHub ↗

wkoverfield/switchboard має індекс здоров’я 63 зі 100, що відповідає смузі «Помірний». Найвищий показник — Engineering Quality (86/100), найнижчий — Community & Adoption (43/100). Останнє оновлення було 5 днів тому. Більшість нещодавньої роботи виконує один учасник.

63
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

63
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

Wilson Kiagiri OverfieldОсобистий обліковий запис
12 підписників12 публічних репозиторіївз січ. 2023 р.

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
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Свіжість push — останній push 5 дн. тому
4.2/36Ритм комітів — 6/52 тижнів із комітами
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
Як обчислюється оцінка
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
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
18/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
6.3/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingтак
has_issue_templateні
has_code_of_conductні
has_pull_request_templateтак
Як обчислюється оцінка
50.6/80Щомісячні завантаження — 6 244 завантажень/місяць у npm
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Вирішення issue — закрито 100% issue
37.1/38.3Прийняття PR — злито 192/198 вирішених PR
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

Власність та опіка

42У зоні ризику
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
8/25Охоплення власника — 12 підписників у wkoverfield
15.2/25Послужний список — 12 публічних репозиторіїв, вік облікового запису ~3 р.
Використані вхідні дані
followers12
owner_typeUser
is_verified
owner_loginwkoverfield
public_repos12
account_age_days1 295
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 4 пакет(ів) у npm
35/35Свіжість публікацій — остання публікація 5 дн. тому
20/20Історія версій — 10 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packages@switchboard-mcp/cli, @switchboard-mcp/core, @switchboard-mcp/docs-mcp, @switchboard-mcp/mcp-runtime
ecosystemsnpm
any_deprecatedні
min_days_since_publish5

Інженерна якість

Чи наявні базові інженерні практики та документація?

86Відмінний · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 1 процес(ів) CI
24/24Наявні тести
16/16Конфігурація лінтера — 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
Звірено з runtime-замиканням залежностей npm:@switchboard-mcp/cli@0.2.2 — тим, що тягне за собою встановлення опублікованого пакета, — 144 пакетів. Досяжність не аналізується.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

69Помірний · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
15/15Машиночитана документація (llms.txt) — llms.txt наявний
40/40Читабельна історія комітів — намір зазначено у 92 з 98 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtтак
legible_history_share0,939
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — 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Підтверджена практика роботи з агентами — 74 з останніх 100 комітів створено агентом або з його зазначенням
8/8Автоматизоване супроводження — 2 з останніх 100 комітів — автоматичні оновлення залежностей
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Керовані розміри файлів — 3/122 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageTypeScript
largest_source_bytes410 270
source_files_sampled122
oversized_source_files3
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
20/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalтак
api_schema_files

Ключові факти

0зірок GitHub
1контриб'юторів
240комітів за останні 12 місяців
5днів від останнього пушу
3релізів
1бас-фактор
0відкритих issue
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 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
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.