Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-24 00:15 UTC

oinam / ovellum

Write what matters, generate the rest - open source documentation where both live together.

TypeScriptMIT★ 1 estrella⑂ 0 forksdesde may 2026Ver en GitHub ↗

oinam/ovellum tiene un índice de salud de 62 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (93/100) y la más baja, Security (27/100). Se actualizó por última vez hace 5 días. Una sola persona concentra la mayor parte del trabajo reciente.

62
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

62
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

OinamOrganización
3 seguidores99 repositorios públicosdesde ago 2010

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npmovellum0.25.0309529hace 5 díasdocumentationdocstypescriptjavascriptmarkdownmdxstatic-site-generatorapi-docstsdocjsdocsite-generator

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

77Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
7.6/36Cadencia de commits — 11/52 semanas con commits
18/18Volumen de commits — 312 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year312
human_commit_share1
days_since_last_push5
active_weeks_last_year11
Cómo se puntúa
27/27Publica versiones — 27 versiones publicadas
36/36Recencia de las versiones — última versión hace 5 días
27/27Cadencia de publicación — una versión cada ~2,5 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count27
latest_release_tagovellum@0.25.0
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases2,5
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

42En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 1 estrellas
0/25Forks — 0 forks
0/15Observadores — 1 observadores
Datos de entrada utilizados
forks0
stars1
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_template
Cómo se puntúa
46.5/80Descargas mensuales — 3095 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesovellum
dependents
ecosystemsnpm
total_downloads
monthly_downloads3095
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

59Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 3 contributing companies or organizations -- score normalized to 10
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
38.2/38.3Aceptación de PR — 2/2 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs2
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
4.3/25Alcance del propietario — 3 seguidores de oinam
25/25Trayectoria — 99 repos públicos, cuenta de ~15 años
Datos de entrada utilizados
followers3
owner_typeOrganization
is_verified
owner_loginoinam
public_repos99
account_age_days5818
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 29 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesovellum
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

93Excelente · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 5 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — eslint.config.js
0/9.6Hooks de pre-commit
6.4/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

100Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://ovellum.oss.oinam.com
10/10Descripción del repositorio
10/10Topics — 2 topics
10/10Wiki
Datos de entrada utilizados
topicsdocumentation, documentation-tool
has_wiki
homepagehttps://ovellum.oss.oinam.com
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

27Crítico · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 3 contributing companies or organizations -- score normalized to 10
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 12 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate2,8
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

71Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 100 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes3592
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — eslint.config.js
11/11Verificación estática de tipos — packages/cli/tsconfig.json, packages/core/tsconfig.json, packages/generator/tsconfig.json, packages/merger/tsconfig.json, packages/parser/tsconfig.json, packages/reader/tsconfig.json, packages/site/tsconfig.json, tsconfig.json
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilespnpm-lock.yaml
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configspackages/cli/tsconfig.json, packages/core/tsconfig.json, packages/generator/tsconfig.json, packages/merger/tsconfig.json, packages/parser/tsconfig.json, packages/reader/tsconfig.json, packages/site/tsconfig.json, tsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
54.3/55Tamaños de archivo manejables — 2/160 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes72.143
source_files_sampled160
oversized_source_files2
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
20/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signal
api_schema_files

Datos clave

1estrellas de GitHub
1contribuidores
312commits en los últimos 12 meses
5días desde el último push
27versiones publicadas
1factor bus
0issues abiertas
npmecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:ovellum@0.25.0; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 2.8 / 10
2.8agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-24 00:15 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities12 existing vulnerabilities detected
Dependencias directas 43
RegistroPaqueteRestricción de versiónManifiesto
npm@inquirer/prompts^8.4.3packages/cli/package.json
npmc123.3.4packages/cli/package.json
npmchokidar^5.0.0packages/cli/package.json
npmcitty^0.2.2packages/cli/package.json
npmgray-matter^4.0.3packages/cli/package.json
npmlucide^1.16.0packages/cli/package.json
npmpagefind^1.5.2packages/cli/package.json
npmrehype-autolink-headings^7.1.0packages/cli/package.json
npmrehype-raw^7.0.0packages/cli/package.json
npmrehype-sanitize^6.0.0packages/cli/package.json
npmrehype-slug^6.0.0packages/cli/package.json
npmrehype-stringify^10.0.1packages/cli/package.json
npmremark-parse^11.0.0packages/cli/package.json
npmremark-rehype^11.1.2packages/cli/package.json
npmshiki^4.0.2packages/cli/package.json
npmts-morph^28.0.0packages/cli/package.json
npmunified^11.0.5packages/cli/package.json
npmunist-util-visit^5.1.0packages/cli/package.json
npmc123.3.4packages/core/package.json
npm@ovellum/coreworkspace:*packages/generator/package.json
npm@ovellum/coreworkspace:*packages/merger/package.json
npm@ovellum/readerworkspace:*packages/merger/package.json
npm@ovellum/coreworkspace:*packages/parser/package.json
npmts-morph^28.0.0packages/parser/package.json
npm@ovellum/coreworkspace:*packages/reader/package.json
npmgray-matter^4.0.3packages/reader/package.json
npm@ovellum/coreworkspace:*packages/site/package.json
npm@ovellum/readerworkspace:*packages/site/package.json
npmgray-matter^4.0.3packages/site/package.json
npmlucide^1.16.0packages/site/package.json
npmpagefind^1.5.2packages/site/package.json
npmrehype-autolink-headings^7.1.0packages/site/package.json
npmrehype-raw^7.0.0packages/site/package.json
npmrehype-sanitize^6.0.0packages/site/package.json
npmrehype-slug^6.0.0packages/site/package.json
npmrehype-stringify^10.0.1packages/site/package.json
npmremark-directive^4.0.0packages/site/package.json
npmremark-gfm^4.0.0packages/site/package.json
npmremark-parse^11.0.0packages/site/package.json
npmremark-rehype^11.1.2packages/site/package.json
npmshiki^4.0.2packages/site/package.json
npmunified^11.0.5packages/site/package.json
npmunist-util-visit^5.1.0packages/site/package.json
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "documentation",
        "documentation-tool"
      ],
      "is_fork": false,
      "size_kb": 4038,
      "has_wiki": true,
      "homepage": "https://ovellum.oss.oinam.com",
      "languages": {
        "CSS": 98947,
        "Shell": 8962,
        "JavaScript": 35226,
        "TypeScript": 960422
      },
      "pushed_at": "2026-07-18T15:58:52Z",
      "created_at": "2026-05-13T03:47:08Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-18T15:58:55Z",
      "description": "Write what matters, generate the rest - open source documentation where both live together.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "https://oinam.com",
      "name": "Oinam",
      "type": "Organization",
      "login": "oinam",
      "company": null,
      "location": "Internet",
      "followers": 3,
      "avatar_url": "https://avatars.githubusercontent.com/u/368471?v=4",
      "created_at": "2010-08-18T13:43:27Z",
      "is_verified": null,
      "public_repos": 99,
      "account_age_days": 5818
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "ovellum@0.25.0",
          "kind": "other",
          "published_at": "2026-07-18T15:51:21Z"
        },
        {
          "tag": "ovellum@0.24.0",
          "kind": "other",
          "published_at": "2026-07-13T03:23:26Z"
        },
        {
          "tag": "ovellum@0.23.0",
          "kind": "other",
          "published_at": "2026-07-09T13:42:22Z"
        },
        {
          "tag": "ovellum@0.22.0",
          "kind": "other",
          "published_at": "2026-07-04T17:03:56Z"
        },
        {
          "tag": "ovellum@0.21.0",
          "kind": "other",
          "published_at": "2026-06-30T08:15:45Z"
        },
        {
          "tag": "ovellum@0.20.0",
          "kind": "other",
          "published_at": "2026-06-29T15:43:13Z"
        },
        {
          "tag": "ovellum@0.19.0",
          "kind": "other",
          "published_at": "2026-06-27T10:29:45Z"
        },
        {
          "tag": "ovellum@0.18.0",
          "kind": "other",
          "published_at": "2026-06-26T12:41:49Z"
        },
        {
          "tag": "ovellum@0.17.0",
          "kind": "other",
          "published_at": "2026-06-26T11:09:27Z"
        },
        {
          "tag": "ovellum@0.16.0",
          "kind": "other",
          "published_at": "2026-06-26T06:30:47Z"
        },
        {
          "tag": "ovellum@0.15.0",
          "kind": "other",
          "published_at": "2026-06-25T19:59:53Z"
        },
        {
          "tag": "ovellum@0.14.0",
          "kind": "other",
          "published_at": "2026-06-25T15:50:41Z"
        },
        {
          "tag": "ovellum@0.13.0",
          "kind": "other",
          "published_at": "2026-06-25T01:49:41Z"
        },
        {
          "tag": "ovellum@0.12.0",
          "kind": "other",
          "published_at": "2026-06-14T15:40:25Z"
        },
        {
          "tag": "ovellum@0.11.0",
          "kind": "other",
          "published_at": "2026-06-14T13:31:11Z"
        },
        {
          "tag": "ovellum@0.10.1",
          "kind": "other",
          "published_at": "2026-06-14T12:16:34Z"
        },
        {
          "tag": "ovellum@0.10.0",
          "kind": "other",
          "published_at": "2026-06-14T10:11:06Z"
        },
        {
          "tag": "ovellum@0.9.0",
          "kind": "other",
          "published_at": "2026-06-14T08:41:23Z"
        },
        {
          "tag": "ovellum@0.8.0",
          "kind": "other",
          "published_at": "2026-06-14T07:53:02Z"
        },
        {
          "tag": "ovellum@0.7.0",
          "kind": "other",
          "published_at": "2026-06-14T05:49:46Z"
        },
        {
          "tag": "ovellum@0.6.0",
          "kind": "other",
          "published_at": "2026-06-13T16:41:02Z"
        },
        {
          "tag": "ovellum@0.5.1",
          "kind": "other",
          "published_at": "2026-06-13T15:18:19Z"
        },
        {
          "tag": "ovellum@0.5.0",
          "kind": "other",
          "published_at": "2026-06-13T14:31:32Z"
        },
        {
          "tag": "ovellum@0.4.0",
          "kind": "other",
          "published_at": "2026-06-13T11:24:42Z"
        },
        {
          "tag": "ovellum@0.3.0",
          "kind": "other",
          "published_at": "2026-06-08T02:46:32Z"
        },
        {
          "tag": "ovellum@0.2.2",
          "kind": "other",
          "published_at": "2026-05-31T08:13:05Z"
        },
        {
          "tag": "ovellum@0.2.1",
          "kind": "other",
          "published_at": "2026-05-30T17:49:36Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "630417b310ab021a9ee0c530194cb79d839e58b6",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): mark 0.25.0 live + note MCP registry blocker",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-18T15:58:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a17b6ee50478ac6c9832a262b33badbf908b75be",
          "body": null,
          "is_bot": false,
          "headline": "chore: release 0.25.0",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-18T13:05:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0526d478e100a70461beb4428981abd556de1bc",
          "body": "Three related slices around documentation \"Edited\" dates and the per-page\naction row.\n\nGenerated docs now respect the source's edited date. The generator baked\nbuild-time timestamps into every file (frontmatter `generated:` + an anchor\n`generated=` attribute), so regeneration churned the file each b\n[…]\ni (filled brand marks via renderBrandIcon). Copy flashes a\ncheck on success. Gemini's deep-link is best-effort — see TODO.\n\nDocs (en+ja) + FEATURES updated; three changesets (ovellum minor -> 0.25.0).",
          "is_bot": false,
          "headline": "feat(docs): respect edited dates and refresh per-page actions",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-18T12:57:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "185513309ea38ce9b1088756e4677abec31725ff",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): mark 0.24.0 live + sweep handoff state",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-13T03:27:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff52f3756eb76a773e79fcfe864a1c03107497ae",
          "body": null,
          "is_bot": false,
          "headline": "chore: release 0.24.0",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-13T03:21:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcd3b787cf0c450515541823e3fa7645b794b83e",
          "body": "mailto:hi@oinam.com after the npm icon, localized label (en/ja). No\nexternal flag — mailto links shouldn't get target=\"_blank\".",
          "is_bot": false,
          "headline": "feat(website): add Contact mail icon to the topbar",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-13T03:20:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1226195d9fe67a198ff903fed73997845fadae5",
          "body": "Drop the editorial page frame — the fixed vertical rules and the \"+\"\ncorner marks at the header baseline and footer top border. Header keeps\nonly its hairline border-bottom, footer its border-top. One --page-inset\ntoken replaces --frame-inset/--frame-gutter; the doc layout pads\nsymmetrically so the \n[…]\na translucent foreground tint (dark-mode safe). Hide\nthe shortcut chip while the input holds a query so it never sits under\nClear. Define the missing --radius-sm token (referenced 10x, never\nshipped).",
          "is_bot": false,
          "headline": "feat(site): simplify default theme chrome and finish theming search",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-13T03:19:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b60716c879d19a5410ff39c178b96c4cdd305c80",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): mark 0.23.0 live + sweep handoff state",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-09T13:45:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef38788cac722760c7c026cd03ad086af6e9739c",
          "body": null,
          "is_bot": false,
          "headline": "chore: release 0.23.0",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-09T12:47:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00465266882b4b436172c933004dd82e976d7451",
          "body": "…lback + check validation",
          "is_bot": false,
          "headline": "feat(site,cli): reusable snippets — ::include directive with i18n fal…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-09T12:45:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fed648e806f601f3c8a3f838f8a2c70cb8d4e1b",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): mark 0.22.0 live + sweep handoff state",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-04T17:05:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1db532a18292fb4659556d15af51779badad6d4c",
          "body": null,
          "is_bot": false,
          "headline": "chore: release 0.22.0",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-04T17:01:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27a2eb8e35105abdc22810af9c9a81ac5f3bc30b",
          "body": "…nding OG cards",
          "is_bot": false,
          "headline": "feat(site): images slice 3 — maxWidth resize cap, AVIF conversion, la…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-04T16:59:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d25788498e698138fb66954bab37f12b8bb053d7",
          "body": "…temap exclusion, ovellum snapshot",
          "is_bot": false,
          "headline": "feat(site,cli): versioning polish — old-version banner + noindex + si…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-04T16:49:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9af0e7975a73fedaa50d82ce14af9b72d44c567",
          "body": "…ult robots.txt",
          "is_bot": false,
          "headline": "feat(site): AI discoverability — text/markdown alternate links + defa…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-04T16:38:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6deb4b1ba2ac43a172f56a2328a111dd79b8c5e6",
          "body": "… verbose fallback note",
          "is_bot": false,
          "headline": "fix: orphan filename collision suffix, dev-server stat race, notifier…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-04T16:33:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d41ddbcd5c0e024475eadfd9c26d5e5afd47f2cf",
          "body": "…n, re-plan toward v1.0.0",
          "is_bot": false,
          "headline": "docs(internal): roadmap second edition — archive cleared first editio…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-03T16:01:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70a23b714bac750658bbd55c1c17ab572a621728",
          "body": "…S.md/CLAUDE.md",
          "is_bot": false,
          "headline": "feat(cli): ovellum agents — canonical \"Ovellum docs\" section in AGENT…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-02T14:37:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec57dd0b85903111928df43c25740674ec2bdf89",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): competitive analysis of OpenWiki (langchain-ai)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-07-02T14:37:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b6e1ff76e4afaa8d59d140e83a84302591f74a4",
          "body": "cli.md (en): drop the stale '## Planned subcommands' heading and promote\n'ovellum clean' to a proper '## ovellum clean' section — clean shipped in 0.21.0.\ncli.md (ja): promote the mis-nested 'ovellum clean' to '## ovellum clean'.\nthemes.md (en+ja): remove the delivered 'site.theme' roadmap bullet — named\npage-wide palette switching (Nord, etc.) ships today as site.palette. ja\nre-stamped; check 0/0/0, 58 pages.",
          "is_bot": false,
          "headline": "docs(site): fix post-0.21.0 doc drift",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T08:26:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d7a4c83a2b05747cd880b160646ded984eea2192",
          "body": "CLAUDE.md version → 0.21.0; TODO.md Current state updated with the B9 image\nfeatures (site.images/format/ogImage), site.minify, ovellum clean, and the\nrelease-gotcha note (mid-publish OTP expiry from cold-cache prepublishOnly).",
          "is_bot": false,
          "headline": "docs(internal): mark 0.21.0 live + sweep handoff state",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T08:18:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad535a63094c60fb7ca5f8c455b0f49d2e781aa7",
          "body": "WebP conversion (site.images.format), OpenGraph cards (site.ogImage), CSS/JS\nminification (site.minify), ovellum clean, and image optimization (site.images)\n— five minor changesets. Version sources bumped (cli package.json via changeset\nversion, site.version badge, server.json x2) and CHANGELOG written.",
          "is_bot": false,
          "headline": "chore: release 0.21.0",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T08:07:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "678b141098d5296d7a6fe85fb182a065a2ea6853",
          "body": "Two opt-in image features, both reusing the lazy-sharp optional-peer pattern.\n\nWebP conversion (site.images.format: 'webp'): converts .png/.jpg/.jpeg to a\nsibling .webp and rewrites the matching Markdown <img src> to it via a post-\nsanitize rehypeWebpImages pass (by-extension; skips schemes/data:/no\n[…]\nsets \"Converting to WebP\" + \"Social share images\" + config ref (en+ja). Tests:\nvalidate (2) + markdown rewrite (2) + og-image unit (3, real 1200x630 PNG) +\ncli-smoke (3, compiled CLI). Two changesets.",
          "is_bot": false,
          "headline": "feat(site): B9 slice 2 — WebP conversion + OpenGraph cards",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T08:03:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a78d500406915a036031cc3342af4841515c21ba",
          "body": "CI lint (@typescript-eslint/no-unused-expressions) flagged run-build.ts:99,\nan expression-statement ternary introduced in B8. No behavior change. Local\ngate now mirrors CI (lint + typecheck + test + build + frozen-lockfile): all\ngreen, 495 tests.",
          "is_bot": false,
          "headline": "fix(cli): lint — countWarnings ternary-as-statement → if/else",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T07:30:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44da6b9811d936563e068b5af811a166f67d1135",
          "body": "A new `ovellum clean` command (commands/clean.ts, registered in index.ts).\nDry-run by default — lists what it would remove; --confirm deletes.\n\n  manual mode  → removes the whole output dir (100% generated from input)\n  auto/hybrid  → removes generated .md (ovellum: true frontmatter), but NEVER a\n  \n[…]\nommand table flipped to \"available\" (en+ja);\nCLAUDE.md command list updated. Tests: cli-smoke (2 — hybrid preserve-matrix +\nmanual whole-dir/--orphans) + real-CLI smoke. FEATURES/ROADMAP/TODO updated.",
          "is_bot": false,
          "headline": "feat(cli): ovellum clean — safe removal of generated output",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T07:16:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c33dfc3569d441c9179408bbaae3a4789f70785f",
          "body": "Opt-in site.minify: boolean minifies author-supplied .css/.js during the build\nvia lazily-imported esbuild. Scope is narrow by design: the bundled theme is\nalready minified and esbuild can't do HTML, so this touches only content-folder\npassthrough .css/.js (via copyAsset) and a templateDir's user st\n[…]\noolean). Docs: assets guide\n\"Minifying CSS and JS\" + config reference (en+ja). Tests: validate (1) + minify\n(2) + cli-smoke integration (1). HTML-page minification deferred (needs a\nnon-esbuild tool).",
          "is_bot": false,
          "headline": "feat(site): CSS/JS minification — site.minify, lazy esbuild",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T07:04:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "87911ae8db42d498b61c35c1ef88551b0700b2d3",
          "body": "A framing section up top: the two alternatives' failure modes (pure generator\n→ hand edits lost / prose-in-separate-files drift; hand-written-only → silently\nstale), then a \"when the source changes\" table (change signature / rename-delete\n/ add symbol × generator / hand-written / hybrid) whose last \n[…]\n\n\"never fall out of sync\" payoff. Cross-links the migration guide rather than\nduplicating its TypeDoc comparison. en+ja 1:1; ROADMAP U7 done (U-series\nU1–U8 all complete). Website-only (no changeset).",
          "is_bot": false,
          "headline": "docs(site): \"Why hybrid\" comparison in the hybrid guide (U7)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T06:27:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dc924e383338e61487610299e8104e0e8fcc0f9a",
          "body": "U1 — guides/troubleshooting: protected zones not merging (id-less positional\nwarning + --strict positional-zone/stale-anchor), unbalanced @manual tags, the\n\"prose disappeared → orphans\" recovery walkthrough (ovellum orphans\n[--stale|--reattach], present/gone/unknown status), config not loading (miss\n[…]\n guides nav; ROADMAP U1/U2 marked done. Every\ncross-link anchor (incl. hand-written Japanese slugs) verified to resolve;\nwebsite builds 58 pages / 0 warnings, check 0/0/0. Website-only (no changeset).",
          "is_bot": false,
          "headline": "docs(site): troubleshooting + migration guides (U1, U2)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T06:20:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2ed6e95931ca711da2db47820f689610a4355662",
          "body": "Slice 2 is two independent M-features (webp format conversion via a new\nimg-rewrite rehype pass; net-new OG-image generation). Maintainer deferred to\nbacklog after the design pass; captured the approach so it isn't lost.",
          "is_bot": false,
          "headline": "docs(internal): record B9 slice-2 design + defer to backlog",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T06:03:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c27b2b080d01ff02d46c191a85ce506f5085b0a",
          "body": "Opt-in raster re-compression: site.images: { quality? } re-encodes\n.jpg/.jpeg/.png/.webp/.avif assets in place (same path + format, smaller bytes,\nno <img src> rewriting) via sharp. packages/site/src/images.ts: lossy quality\n(default 80) for jpeg/webp/avif, lossless max-deflate for png; keeps the\nor\n[…]\ne) + validation (quality 1-100 int). Docs: assets guide\n+ config reference (en+ja). Tests: validate (1) + site images (2) + cli-smoke\nintegration (1). Slice 2 (format conversion + OG images) deferred.",
          "is_bot": false,
          "headline": "feat(site): image optimization — site.images, lazy sharp (B9 slice 1)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-30T05:47:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f5708e9d00e1cd65e63596248211756b185c0e44",
          "body": "Update TODO 'Current state' to 0.20.0 (theme inheritance B10, build-output\nseverity B8, the complete plugin/extension API B1 + D3) and the version fact\nin CLAUDE.md. 0.20.0 is live on npm; tree was clean and pushed.",
          "is_bot": false,
          "headline": "docs(internal): sweep handoff state for 0.20.0 (published)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T15:47:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d64730c1cfc8a2ba5e788f445b8a42662b9fa4b",
          "body": "ovellum 0.19.0 → 0.20.0. Consumes 7 changesets: theme inheritance (site.css,\nsite.appearance, palette: 'bare'), build-output severity levels, and the\nplugin/extension API (lifecycle hooks / D3, markdown plugins, site.templateDir).\nBumps packages/cli/package.json + CHANGELOG, site.version badge, and server.json\n(MCP registry manifest).",
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T15:32:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60f664eb71e38aaa21bbc98d8577710bea3f5f4f",
          "body": "… (B1 slice 3)\n\nsite.templateDir points at a directory whose assets replace the bundled theme's,\nper file with fallback: style.css → /assets/ovellum.css, script.js →\n/assets/ovellum.js, fonts/ → /assets/fonts/. Provide only some and the rest fall\nback to the default (writeStaticAssets pick()), so yo\n[…]\ndown\nplugins (slice 2), template overrides (slice 3). Validation (1) + api e2e (1);\ndocs themes \"Bring your own template directory\" + config reference (en+ja);\nPLUGINS.md / ROADMAP / FEATURES updated.",
          "is_bot": false,
          "headline": "feat(site,core): bring your own template directory — site.templateDir…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T15:28:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "afaafe1f53a9cf08eed8149f7e025c7d3a2dc309",
          "body": "A plugin can extend the Markdown pipeline with remarkPlugins / rehypePlugins\n(each a unified Pluggable). remark plugins inject after Ovellum's built-ins and\nbefore the HTML conversion; rehype plugins inject BEFORE rehypeSanitize, so\nsanitize stays the security guard over everything they produce — a\n\n[…]\nwn, not HTML).\n\nDocs: plugins guide \"Markdown plugins\" + security note (en+ja). Tests: validate\n(1) + markdown (3, incl. the <script>-stripped pin) + api e2e (1). Slice 3\n(template overrides) remains.",
          "is_bot": false,
          "headline": "feat(site,core): plugin markdown plugins — remark/rehype (B1 slice 2)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T14:58:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d65161bbf152f06fa625a9c4231903ccf3e1b485",
          "body": "… slice 1, D3)\n\nconfig.plugins: OvellumPlugin[] extends the build with named units of\nlifecycle hooks (the Vite/Rollup model), run in array order:\n\n  onResolveConfig(config) → config|void   replace config (CLI overrides still win)\n  onBuildStart({config,cwd,mode})          before any output\n  transf\n[…]\n\nSlice 2 (remark/rehype) and slice 3 (template overrides) remain.\n\nDocs: plugins guide + config reference (en+ja). Tests: validate (1) + api\nlifecycle (3); proven e2e through a real ovellum.config.ts.",
          "is_bot": false,
          "headline": "feat(cli,core,site): plugin/extension API — build lifecycle hooks (B1…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T14:07:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c681e53a472016cc9bcc043238c1524a591e5bf1",
          "body": "Build diagnostics now carry a severity. New BuildWarning {message, severity:\n'info'|'warning'} in @ovellum/core (exported from the ovellum package);\nBuildSiteResult.warnings and BuildSummary.warnings are BuildWarning[].\n\n'warning' = a real problem to act on (orphaned block, asset skipped for\nsafety,\n[…]\nad of bare strings — branch\non severity === 'warning' to gate CI. check's own issue list is unchanged.\n\nDocs: automation + cli reference (en+ja). build-warnings.test.ts (4) +\ncli-smoke + rename-build.",
          "is_bot": false,
          "headline": "feat(cli,site): build-output severity levels — info vs warning (B8)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T13:42:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "db6d510f8325d325db0df8bed4c81467556e7900",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): mark B10 theme inheritance complete (B10.1+B10.2+B10.3)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T13:28:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c2ae057e724042a6e00442aa0119eb5e8a285b6",
          "body": "…(B10.3)\n\nsite.palette: 'bare' ships no baked palette. renderBareThemeHead injects a\n[data-palette=\"bare\"] <style> that maps each color + --font-body token to\nvar(--ov-host-NAME, <Ovellum default>), with mode-aware light/dark/auto blocks\nso \"define none → default look\" holds in both modes. A host st\n[…]\nheritance (B10.1 site.css + B10.2 site.appearance +\nB10.3 palette: 'bare'). Core OvellumPalette/PALETTES widened; themes guide\n\"Bare mode\" + config reference, en+ja; template (2) + validate (1) tests.",
          "is_bot": false,
          "headline": "feat(site): token-only \"bare\" palette — host as sole source of color …",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T12:24:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "04708a1468340e76a88a61cf9d232b708ab35b2d",
          "body": "…rance host light/dark (B10.1, B10.2)\n\nMake Ovellum docs adopt a host project's design when embedded under it.\n\nB10.1 — site.css (string | string[]): author stylesheet URL(s) linked into\n<head> AFTER the base theme CSS so :root token re-declarations win the\ncascade. The supported hook for overriding\n[…]\nboot-script branch; script.js\ninherit-follow. Themes guide \"Inheriting a host project's design\" +\n\"Following the host's light/dark switch\" + config reference, en+ja.\ntemplate (3) + validate (2) tests.",
          "is_bot": false,
          "headline": "feat(site): theme inheritance — site.css token overrides + site.appea…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-29T11:48:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6f8ba80b0a8a8da84a703aa8b8a08fb912eabeec",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): sweep handoff state for 0.19.0 (published)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T10:33:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c7b7089989bc8f84ca5445cea829c833a7bc434",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T10:25:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "21847d3e598e4ebe3035e98a46dad47e5765c12d",
          "body": "…opbar picker (B6)\n\nPublish multiple versions side by side. `site.versions: [{ id, label?, latest? }]`\nmaps each id to a `content/<id>/` subtree; the `latest` (or first) serves at the\nroot, the rest under `/<id>/`. A topbar version picker switches between them,\nkeeping the reader on the same page wh\n[…]\n e2e (v2 at root, v1 under /v1/,\n  cross-version page mapping). Changeset (minor).\n\nDeferred to a slice 2: old-version noindex/sitemap exclusion, an \"old version\"\nbanner, a `version snapshot` command.",
          "is_bot": false,
          "headline": "feat(site): versioned docs — site.versions, directory-per-version + t…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T10:15:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2ade2dc8a598d15f2436d76771602a63d65122ba",
          "body": "…blocks (B5)\n\n`site.landing.sections: OvellumLandingSection[]` (union: hero | install |\nfeatures | trust | scene | prose | custom-html) takes over the fixed\nhero→install→features→prose→trust order — arrange/repeat blocks and inject\nfree-form prose or raw HTML anywhere.\n\n- core: OvellumLandingSection\n[…]\ndoubles as shorthand. Inline prose/custom-html isn't localized (flat blocks\n  are). Docs en+ja (config reference + composable-sections section).\n- Tests: landing (4) + validate (1). Changeset (minor).",
          "is_bot": false,
          "headline": "feat(site): composable landing — site.landing.sections ordered typed …",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T09:57:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec8832ede21cf2b950ccfab1901fc54e3d028393",
          "body": "…o?, source?, label? } object (B4)\n\nBring your own self-hosted typeface to the default template with no headExtra\nhacking. Alongside the 'sans'|'serif'|'inter'|'geist' keywords, site.font now\ntakes an object:\n\n- core: OvellumCustomFont type + validation (body required; family values reject\n  `< > { \n[…]\nfamily.\n- FOUT is the author's @font-face `font-display` call (STYLES.md §1.3).\n- init annotated config + themes/config docs rewritten (en+ja).\n- Tests: template (2) + validate (1). Changeset (minor).",
          "is_bot": false,
          "headline": "feat(site): custom fonts via config — site.font accepts a { body, mon…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T09:46:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ccd3afa967f7da4e194377033152d570838acc4b",
          "body": "On an i18n site each locale now gets its own feed — /feed.xml for the default\nlanguage, /<code>/feed.xml for the rest — scoped to that locale's pages, with\nthe channel <link> and atom self-link prefixed. The sitemap stays one combined\nfile; single-language output is byte-identical.\n\n- rss.ts: `local\n[…]\n (9).\n\nAlso resolves B3 (ROADMAP): `extractMarkdownLinks` is no longer dead code\n(`check` uses it); build-time link warnings deliberately not added (build/check\nseparation). Changeset (minor) for RSS.",
          "is_bot": false,
          "headline": "feat(site): per-locale RSS feeds (closes the last i18n gap)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T08:45:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a048674d6460d6b7cbbbaf77f31fb2ba1412fe6f",
          "body": "…ick wins (U6)\n\nU5 — better small messages:\n- `ovellum dev --verbose` logs each request (METHOD path → status;\n  DevServerOptions.logRequests, skips SSE/reload internals).\n- `upgrade` registry-failure now hints `npm install -D ovellum@latest`.\n- `dev` manual-only error points at watch/build (dropped\n[…]\nanding mode-explainer — redundant with the Three Modes card + hero.)\n\ncli.md documents `dev --verbose` (en+ja). Changeset (minor) for the U5 CLI bits;\nU6 is docs-only. 149 cli tests; link check clean.",
          "is_bot": false,
          "headline": "feat(cli): clearer messages + dev --verbose request log (U5); docs qu…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T08:37:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d8f9981b1480cd37a14b77024e7c0396a02a66d2",
          "body": "…(U3)\n\nThe hybrid starter index.md now leads with a `@manual id=\"welcome-note\"` zone\n(\"Add your own notes here — this block survives every rebuild\"), so new hybrid\nprojects meet the merge contract on day one. Manual mode is unchanged.\n`renderStarterIndex` exported + pinned by init-render.test.ts (2). Dev guide\nnotes the hybrid example (en+ja; the --yes fast path was already documented).\nChangeset (patch).",
          "is_bot": false,
          "headline": "feat(init): scaffold a @manual protected-zone example in hybrid mode …",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T08:26:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea4e22017388c216487840f19e894ec97340fe54",
          "body": "The published cli bundles @ovellum/* source via tsup `noExternal`, but the root\n`build` task had no `inputs` — so turbo only hashed the cli's own files plus\ndependency `.d.ts` outputs. Template (CSS/JS) edits and signature-stable site\n`src` edits left those outputs unchanged, so the cli build cache-\n[…]\nte-copy script invalidates the cli build. Verified: touching style.css\nnow cache-misses `ovellum:build`; an unchanged build stays FULL TURBO. Repo-only\ntooling (not in the npm package) — no changeset.",
          "is_bot": false,
          "headline": "build(turbo): track bundled @ovellum/* source in the cli build cache",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-27T08:17:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "79f313be8ebeb5611b8b2a627501fbdc6c154d65",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): sweep handoff state for 0.18.0 (published)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T12:44:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "223f2a108565897273d4a9cc7e34096b5ecf083d",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T12:35:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d16c7b864a5c968b95045961df43e4c375f332ae",
          "body": "Mermaid:\n- ```mermaid fences → <pre class=\"mermaid\"> (rehypeMermaid). Runtime lazy-loaded\n  client-side, ONLY on pages with a diagram (script.js reads <html\n  data-ov-mermaid>), from a pinned jsDelivr build by default. No-JS/offline keeps\n  the readable source as fallback.\n- Config site.mermaid: { e\n[…]\nents guide (Mermaid section) + config (site.mermaid) + automation\n(per-page actions) + live examples in the styleguide (en+ja). 195 site tests.\nCOMPETITIVE adopt items #2 + #4 done. Changeset (minor).",
          "is_bot": false,
          "headline": "feat: Mermaid diagrams + per-page \"use with an LLM\" actions",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T12:33:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0f48fa3b126ed5b802e7a14fde4072137a07f3a7",
          "body": "- :::code-group wraps fenced code blocks into a tabbed switcher; each tab is\n  labeled by the fence's language or a `title=\"…\"` on the info string. Reuses\n  the .ov-tabs / rehypeTabs path (shiki highlights after the upgrade); a single\n  `:::` since its children are fences, not directives. (directive\n[…]\nrified .mdx end-to-end via a build. Changeset (minor).\n\nAlso noted a dev gotcha in TODO.md: the CLI bundles @ovellum/site source, so\n`turbo --force` is needed after site edits (turbo cache misses it).",
          "is_bot": false,
          "headline": "feat: B2.2 — :::code-group (tabbed code) + .mdx files as Markdown",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T12:04:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c76eaa2db54ee0f3518c2a692503095be3994c28",
          "body": "…h + text-wrap: balance)",
          "is_bot": false,
          "headline": "fix(site): widen landing hero title to two balanced lines (16ch → 30c…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T11:54:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79759402cc115db4a4cd36a3223f6e16ef6635e4",
          "body": "…tabs (B2)\n\nAuthor rich content blocks with `:::` directive syntax (remark-directive), no\nJSX/MDX — output stays portable Markdown.\n\n- packages/site/src/directives.ts: `remarkComponents` (remark phase) maps\n  :::note|tip|important|warning|caution / :::steps+:::step / :::cards+:::card /\n  :::tabs+:::\n[…]\nocs: guides/components (en+ja) + live examples in the styleguide. FEATURES +\nROADMAP (B2 slice 1 done; B2.2 = code-group + .mdx files deferred). 193 site\ntests (+5 directive cases). Changeset (minor).",
          "is_bot": false,
          "headline": "feat: Markdown-native component directives — callouts, steps, cards, …",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T11:48:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3949ccd1b8ed6fa4d9b0bbb12d1b4e74c0965783",
          "body": "- Add docs/internal/COMPETITIVE.md — study of the leading commercial docs\n  platform: our edge (hybrid merge, write_zone moat, portability, free/OSS,\n  i18n), what to adopt (component directives/B2, mermaid, copy-for-LLM,\n  versioning/B6, migration/U2), what to skip (the SaaS surface), and the futur\n[…]\n named.\n- ROADMAP pointer + CLAUDE.md keepers updated (add COMPETITIVE.md; TODO-Human.md\n  reference repointed to repo-root TODO.md).\n- TODO.md publish-state → 0.17.0 live + MCP Registry shows 0.17.0.",
          "is_bot": false,
          "headline": "docs(internal): competitive analysis + 0.17.0 publish-state sweep",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T11:24:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9ce43a7dfd96e3aa34dde8d61b40dbbf1393764c",
          "body": "…-login flag; fix --help",
          "is_bot": false,
          "headline": "build(publish.sh): auto re-login to MCP Registry on expired token + -…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T11:16:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a3395bc2eb3ba6564a635d663f86a3ab10ffa93",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T11:07:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cda4f13851b1be2991bc1fd889af35f8201a6ddd",
          "body": "- Move the human task list to root TODO.md (maintainer reorg); delete\n  docs/internal/TODO-Human.md.\n- Repoint all references: public Contributing links (en+ja) + internal\n  clickable links (RELEASE/TODO/FEATURES) → root TODO.md (no dangling paths).\n- README trimmed to essentials with the finalized tagline.",
          "is_bot": false,
          "headline": "docs: relocate TODO-Human.md → root TODO.md; finalize minimal README",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T11:05:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7620ffde7e93c25bad702b2de7ee871fe471b7e",
          "body": null,
          "is_bot": false,
          "headline": "build: add publish.sh release script + document it in RELEASE.md",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T10:56:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50c327cbd09d9e5fe1d82d220963037aa6e4e783",
          "body": "… out of sync' (from README)",
          "is_bot": false,
          "headline": "docs: update tagline to 'Auto, manual, or hybrid docs that never fall…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T10:56:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "994daded197f1bf2e3528de5f8a682da3f2b8f83",
          "body": "…urfaces\n\nSingle source of truth = root README (tagline in the blockquote, extended\ndescription in the next paragraph). Propagated to:\n- packages/cli/package.json `description` (npm) → extended description\n- CLI `--help` meta (index.ts) → tagline\n- server.json `description` (MCP Registry, 83/100 cha\n[…]\ne npm-facing packages/cli/README.md (was \"v0.1.x\", broken\n/reference/cli/ links, drift-prone feature lists) to mirror the minimal root\nREADME. Changeset (patch) for the npm-visible description change.",
          "is_bot": false,
          "headline": "docs: sync product tagline + description from the README across all s…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T10:41:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f2be46d1353c6b059dcabfd16753c491f7fa9213",
          "body": "…e, theme black/white)\n\n1. `clean` must preserve `.ovellum/orphans/` by default; an explicit `--orphans`\n   flag opts into removing the archive. Spec updated in cli.md (en+ja) + TODO note\n   (clean still unimplemented).\n2. Class-level `@preserve` protects only the class-level block — methods stay\n  \n[…]\ndard\n   palettes (nord/solarized/flexoki) follow their published spec. Policy in\n   STYLES.md §6.1a + a note in the themes guide (en+ja).\n\nDocs + one regression test; no behavior change, no changeset.",
          "is_bot": false,
          "headline": "docs: codify three product decisions (clean --orphans, @preserve scop…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T08:27:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cbd80bd570985412600e0545cb5332ef90404ea7",
          "body": null,
          "is_bot": false,
          "headline": "docs: link the MCP Registry listing from the README",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T08:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5181c2e561179f30aac2cd0bc5175087df2f6ed7",
          "body": "… site\n\n- site.landing.features[] gains an optional `href`: the whole card becomes a\n  link, site-relative (locale-prefixed automatically) or absolute (new tab).\n  Core type + validator + renderer (`renderFeatures` emits an <a> with\n  `.ov-feature-card-link`; calm hover via CSS). Plain cards unchang\n[…]\ntined, Deploy Anywhere — each\n  pointing into /docs (per-locale).\n\nTests: landing.test.ts (+2: link/external/plain + locale prefix). Docs en+ja\n(config reference `features[].href`). Changeset (minor).",
          "is_bot": false,
          "headline": "feat: linkable landing feature cards + AI-Native/MCP highlight on the…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T07:34:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "368d4bd85aa7082f8fc8c3f127886cf53bdbb728",
          "body": null,
          "is_bot": false,
          "headline": "docs: AI-native contribution guide (CONTRIBUTING + site docs, en+ja)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T07:26:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a3407e5a970814b1b633628dc119425c29f948c",
          "body": "…ext Protocol (MCP)'",
          "is_bot": false,
          "headline": "docs(internal): rename AI-NATIVE-MCP.md → MCP.md, retitle 'Model Cont…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T07:24:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "129aa2a616fd1823680d265d9c46291574751523",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): record 0.16.0 + MCP registry live in publish state",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T06:32:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e225a46fd53f0feb235ee6554113a0d38a21e5b",
          "body": null,
          "is_bot": false,
          "headline": "fix(mcp): trim server.json description to registry's 100-char limit",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T06:25:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92b2df7dcbb8d439983a323c9cde8680bc6f055a",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T06:17:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d48e86d21066737df0b5e2b5aeb66cf6f757eb5",
          "body": "…ion ready)\n\nAdd the pieces the official MCP Registry needs so the Ovellum server can be\nlisted and discovered:\n\n- packages/cli/package.json gains `mcpName: io.github.oinam/ovellum` (the\n  registry verifies this from the published npm package).\n- repo-root server.json manifest: npm package `ovellum`\n[…]\n.\n- Docs note (automation guide en+ja) that Ovellum is in the MCP Registry.\n\nThe actual `mcp-publisher login/publish` is a human step after 0.16.0 is on npm\n(runbook in TODO-Human). Changeset (minor).",
          "is_bot": false,
          "headline": "feat: MCP Registry manifest — mcpName + server.json (registry submiss…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T06:16:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0cd2a865b24f05b8ea09c257d5941c06f829c29a",
          "body": null,
          "is_bot": false,
          "headline": "docs: refresh MCP tool/resource list in automation guide + FEATURES date",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-26T06:11:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a6d9216af839a3a28af1c8ca186722cedc78aa7",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): sweep handoff state for the 0.15.0 release",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T20:02:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfe0c3b93ea3c629157532e30eec5b77370bd972",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T19:57:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d860c3341e8fbe4f02cb768805865fda4f96e43c",
          "body": "- ovellum_search_docs: full-text search over the built docs (dev/mcp/search.ts —\n  term-frequency over the output .md, title-match bonus, snippets). Not Pagefind:\n  its query runtime is browser-only WASM (the npm package only builds indexes),\n  so a built-in text search is mode-agnostic and dependen\n[…]\n\n\nTests: mcp-server.test.ts now 13 (search + reattach). Docs en+ja (mcp tool\ntable). Changeset (minor). AI-Native MCP arc complete (M1–M3); only the human\nMCP-registry submission remains (TODO-Human).",
          "is_bot": false,
          "headline": "feat: MCP tools ovellum_search_docs + ovellum_reattach (M3)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T18:20:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b1bfffb1d959e00d4a70d7c7d4e63954aa61c17",
          "body": "… (M2)\n\n- Claude Code plugin at plugins/ovellum/ (.claude-plugin/plugin.json + .mcp.json\n  registering `npx -y ovellum mcp` + the bundled ovellum-docs skill, moved from\n  the old top-level skills/), listed by repo-root .claude-plugin/marketplace.json\n  → `/plugin marketplace add oinam/ovellum` + `/p\n[…]\naces over the existing non-TTY gate).\n\nRegistry/connector-directory submission is a human follow-up (TODO-Human).\nTests: plugin.test.ts (4). Changeset (minor). Plan: AI-NATIVE-MCP.md M2 done; M3 next.",
          "is_bot": false,
          "headline": "feat: one-step MCP adoption — Claude Code plugin + cross-tool install…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T17:22:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0e23a66d57362f7b88c564bdf531799abfdbd4ce",
          "body": "`ovellum mcp` now advertises capabilities:{tools,resources,prompts} and\nimplements the resources + prompts primitives, not just tools:\n\n- resources/{list,templates/list,read} (dev/mcp/resources.ts): ovellum://llms.txt,\n  ovellum://llms-full.txt, ovellum://page/{path} (template), ovellum://ir,\n  ovel\n[…]\n, templates, prompts list/get) + verified\ne2e over stdio. Docs en+ja (cli mcp reference). Changeset (minor).\n\nPlan: docs/internal/AI-NATIVE-MCP.md (M1 done; M2 distribution + M3 search/reattach next).",
          "is_bot": false,
          "headline": "feat: MCP Resources + Prompts — first-class MCP server (M1)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T16:35:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "99b1acb00867b7aff12ecaaf377209bd0b6f4547",
          "body": "- Add docs/internal/AI-NATIVE-MCP.md — the plan for making the MCP server a\n  first-class citizen (Resources + Prompts), one-step distribution (Claude Code\n  plugin + registry + cross-tool snippets), and rounding out tools\n  (ovellum_search_docs, ovellum_reattach). ROADMAP gets pickable M1–M3 entrie\n[…]\n+ `ovellum orphans`; config orphanRetention drops\n  \"a future\"; FEATURES \"Last updated\" refreshed. en+ja, re-stamped.\n\nAll 12 recently-shipped features verified present in the website docs + FEATURES.",
          "is_bot": false,
          "headline": "docs: AI-Native MCP plan + documentation completeness sweep",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T16:26:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2803e37ccab75bfcb8f0a62ff955dada072c8af2",
          "body": "Add an \"Embedding in another project's build\" section to the deploy guide\n(en+ja): point output into a host's served folder via config or\n`ovellum build --out/--base`, chain into the host's scripts (concurrently for\ndev, incremental watch), or drive it in-process with the D2 programmatic API;\nplus a manifest-based S3/CDN sync recipe. \"Ovellum never deploys — it builds a\nportable folder.\" Website-only, no changeset; ja anchors verified.",
          "is_bot": false,
          "headline": "docs: deploy recipes for embedding Ovellum in another build (D5)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T16:19:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26edfb1ed6bfc63fd473d6948d8226cf1c44ced4",
          "body": "Import Ovellum as a library to drive it in-process instead of shelling out:\n`import { build, watch, loadConfig, defineConfig } from 'ovellum'`. build()\nreturns the structured BuildSummary; watch() returns a closable handle\n(incremental in auto/hybrid); loadConfig() returns the resolved config.\n\nSpli\n[…]\nay unpublished — no need to flip the bundled-private decision.\nCurated facade over runBuild/watchAndBuild.\n\nTests: api.test.ts (5). Docs en+ja (automation guide → Programmatic API).\nChangeset (minor).",
          "is_bot": false,
          "headline": "feat: programmatic API — `build()` / `watch()` from `ovellum` (D2)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T16:15:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cbcf27413c82983f2cfd8b7ef2cd84a03aa68c9c",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): sweep handoff state for 0.14.0 (published)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T15:52:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5c1dee419059fa0b97ed80e42b8b7916b7725e7",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T15:48:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d1e1c562deb4d2465e8dac38c5999409b55c04b",
          "body": "--verbose prints config-resolution and per-stage / file-I/O detail to stderr:\nbuild logs parse timing, generated/wrote/merged per file, and ir/manifest paths\n(threaded as an onLog logger through runBuild → runBuildForMode →\nbuildProjectDocs); check logs config + locales + scanned-file count; diff lo\n[…]\n with C3.)\n\nTests: cli-smoke (build --verbose → stderr, summary still on stdout; --json\n--verbose → stdout valid JSON). Docs en+ja (build/check/diff flag tables +\nautomation guide). Changeset (minor).",
          "is_bot": false,
          "headline": "feat: `--verbose` on build / check / diff (U4)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T12:56:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "172af81ebe1152e540963134e87b6c6d20583ff5",
          "body": "`ovellum watch`/`dev` no longer re-parse the whole project on every save. In\nauto/hybrid mode the watcher keeps a warm ts-morph Project\n(parser createIncrementalParser/IncrementalParser): update() refreshes only the\nchanged files, re-extracts the whole project from the in-memory ASTs (cheap, so\ncros\n[…]\n).\n\nTests: parser incremental.test.ts (5) + cli incremental.test.ts (3); verified\nend-to-end via `ovellum watch` (edit one file → \"rebuilt 1 file(s)\"). Docs en+ja\n+ changeset. Tier A complete (A1–A7).",
          "is_bot": false,
          "headline": "feat: incremental watch builds for auto/hybrid (A7)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T03:29:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e71c847fbd0fd5db78c7cae1f772e7931d231012",
          "body": "In hybrid mode, a `@preserve`-tagged symbol's generated section is now wrapped in\na `@manual` protected zone keyed by the node's anchor id (templates.ts\nwrapPreserved; gated config.mode === 'hybrid' in generate.ts; top-level nodes +\nmethod members). The first build seeds the zone with generated cont\n[…]\n\nTests: generator preserve.test.ts (3) + cli preserve.test.ts (3, full\nseed→edit→survive→orphan cycle); merge-survival unaffected. Docs en+ja\n(anchors-and-zones concept + glossary). Changeset (minor).",
          "is_bot": false,
          "headline": "feat: `@preserve` auto-wrapping in the generator (A5)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T03:07:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8b2e0a9fcdfa86d8a4ef7e6dedc6554fa4fbaad0",
          "body": "--strict adds three checks on top of the defaults:\n- positional-zone: a <!-- @manual:start --> with no id= (fragile positional match)\n- stale-anchor: a generated-doc ovellum:anchor whose symbol is gone from the\n  source (findAnchors vs collectAnchorIds(parseProject))\n- missing-frontmatter: a page wi\n[…]\ntrict.test.ts (3, in-process). Docs en+ja (cli reference strict\nsection + automation issue kinds; ja anchors verified against generated slugs).\nThe website itself is --strict-clean. Changeset (minor).",
          "is_bot": false,
          "headline": "feat: `ovellum check --strict` — opt-in stricter validation (A6)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T02:39:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4d037120fde00e1896eb2ec682430c9de341b55e",
          "body": "…ose (A3/A4 write side)\n\nWalks the orphan archive one at a time and, per orphan, offers to reattach it\n(to a present-again anchor, a name-similar likely-rename, or a typed anchor),\ndelete it, or skip. Reattach splices the prose into a @manual zone under the\ntarget via the shared applyWriteZone — so \n[…]\nests: suggestReattachTarget + reattachOrphan (orphans.test.ts now 11) + non-TTY\nguard e2e. Docs en+ja (cli reference + orphans concept; ja anchors verified\nagainst generated slugs). Changeset (minor).",
          "is_bot": false,
          "headline": "feat: `ovellum orphans --reattach` — interactively rescue orphaned pr…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T02:07:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dec2fe14cede4503f50ef92b4a25568d4a6302a4",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): sweep handoff state for 0.13.0 (published)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T01:58:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "672bf78723694cc0952cf236e53ff68ff2def743",
          "body": null,
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T01:45:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fce6ba421e8edac2d3a8229b32ad897d89148b37",
          "body": "Defense-in-depth; none were exploitable today.\n\n- S1 upgrade: argv-array spawn without a shell on POSIX (the command was already\n  a fixed allowlist); Windows keeps shell:true since .cmd shims require it.\n- S2 dev/serve: resolveFilePath now realpath-re-verifies the result stays under\n  the served ro\n[…]\nontent-length size guard.\n\nTests: dev-server symlink-escape + init-validate. Docs en+ja (security page,\nincl. an honest out-of-scope note now that passthrough symlinks are guarded).\nChangeset (patch).",
          "is_bot": false,
          "headline": "feat(security): harden the latent foot-guns (S1–S6)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T01:23:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2fb69c4b73d075738755755de536e8fdd9441dce",
          "body": "A short, hype-free concept page (concepts/ai-ready, en+ja) framing the AI-Ready\ntheme for adopters: read-ready (llms.txt + .md mirrors), agent-drivable (--json\n+ MCP), and — the differentiator — safely editable (an agent's prose into a\nprotected zone survives regeneration; rename detection + orphans\n[…]\nnding section so the queued\nlanding redesign isn't pre-empted.\n\nWebsite-only (not in the published package), so no changeset. Completes Tier C\n(C1-C5). Also drops a brittle doc-page count in FEATURES.",
          "is_bot": false,
          "headline": "docs: add \"Ovellum for AI agents\" positioning page (C5)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-25T00:52:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b31133ab9c1b1394926f686be1d387a574ae945",
          "body": "Tell AI agents how to use Ovellum in the formats they look for:\n\n- `ovellum init` now scaffolds a mode-aware AGENTS.md at the project root\n  (renderAgentsMd). Hybrid/auto lead with the protected-zone contract (what\n  survives regeneration, what's overwritten, where orphans go); manual leads\n  with \"\n[…]\n the Automation guide for\n  one-copy adoption into .claude/skills/.\n\nAlso fixes a stale protected-zone marker in init's next-steps hint\n(ovellum:manual:start -> @manual:start). Docs en+ja + changeset.",
          "is_bot": false,
          "headline": "feat: agent packaging — scaffold AGENTS.md + ship a Claude Skill (C4)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-24T19:10:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a0a4c54366b6a389d0b755e98fd9c74bd7313aff",
          "body": "An agent or CI job shouldn't scrape human output. `build` and `check` gain\n--json (diff already had it): stdout becomes a single JSON object, no decorative\noutput, clean stderr on success.\n\n- build --json → { ok, command, mode, durationMs, config, warnings, ... } with\n  mode-specific fields (buildSu\n[…]\n0 / 1 / 3); ConfigError emitted as { ok:false, error, hint }\non the JSON path. New /docs/guides/automation/ guide (en+ja) documents the\nschemas, exit codes, MCP, and llms.txt. Changeset + smoke tests.",
          "is_bot": false,
          "headline": "feat: machine-readable CLI — --json on build and check (C3)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-24T18:59:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "89e817fb7fcceadc809b1fc560451cae918c67b5",
          "body": "`ovellum mcp` runs a dependency-free stdio MCP server (hand-rolled\nnewline-delimited JSON-RPC 2.0 — deliberately no SDK/zod, keeping the published\nCLI lean). Tools, all IR-backed and reusing the diff/orphans/query engines:\novellum_query_symbol, ovellum_diff, ovellum_list_orphans, ovellum_get_page\n(o\n[…]\nr,tools,write-zone}.ts; pure handlers + handleMessage unit-tested\nplus a real stdio smoke test. Deferred tools: ovellum_check (needs C3 --json),\novellum_search_docs (Pagefind). Docs en+ja + changeset.",
          "is_bot": false,
          "headline": "feat: add `ovellum mcp` server so agents drive Ovellum as a tool (C2)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-24T18:48:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8f047ac7ba17ae61100c3c9959f4a0a1701a93eb",
          "body": "…-only)\n\nWhen an anchor disappears and a similar symbol appears the same build (same\nkind, similar name, matching signature shape), pair them as a likely rename.\nPure dev/rename.ts detectRenames: kind gate + Levenshtein name similarity +\nsignature-shape similarity + same-file bonus, greedy best-firs\n[…]\nn orphaned block whose anchor probably just\nmoved triggers a \"did X become Y? ... reattach\" warning, computed over the\nprior IR snapshot. Suggest-only — reattach stays manual.\n\nDocs en+ja + changeset.",
          "is_bot": false,
          "headline": "feat: detect likely renames instead of orphaning blindly (A3, suggest…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-24T18:37:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "90d0424a6f726475940f2e0649d5e4674bd06b60",
          "body": "List orphaned @manual blocks under protect.orphanDir: anchor id, source doc,\nage, last-seen, block id, and — vs the .ovellum/ir.json snapshot — whether the\nanchor is back in source (reattachable), gone, or unknown. --stale filters to\n> protect.orphanRetention days; --json for CI. Read-only.\n\ncommand\n[…]\nphaned blocks from the prior IR snapshot's\ngeneratedAt. Interactive reattach/delete still by hand (planned).\n\nAlso ticks the stale B7 (i18n) and U8 (drafts) roadmap checkboxes. Docs en+ja\n+ changeset.",
          "is_bot": false,
          "headline": "feat: add `ovellum orphans` to review quarantined manual blocks (A4)",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-24T18:28:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d41de1fe498a66a58e130f8f151212d9a230f4b2",
          "body": "Parse current source, load the persisted .ovellum/ir.json, and report\nadded/removed/changed symbols plus which output docs would change — writes\nnothing. Matches by anchor id (rename = remove+add), flattens class/interface\nmembers, ignores line/filePath so cosmetic shifts don't register, and maps\nso\n[…]\n machine-readable diff; --exit-code exits 1 on changes\n(git-diff style, default exits 0). Auto/hybrid only; missing/corrupt snapshot\nexits 1 with a hint to run `ovellum build`. Docs en+ja + changeset.",
          "is_bot": false,
          "headline": "feat: add `ovellum diff` to preview rebuild impact from the IR snapshot",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-24T18:01:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d9478d9a2e44f4a0a73695c54ee9710f4b221356",
          "body": "Every auto/hybrid build now writes the parsed DocProject to\n<cwd>/.ovellum/ir.json — build state at the project root (beside\n.ovellum/orphans/), unaffected by --out, gitignored. Reported as a new\n`ir:` summary line. Foundation for diff (A2), rename detection (A3), and\nanchor last-seen (A4). Manual mode writes none.",
          "is_bot": false,
          "headline": "feat: persist parsed IR to .ovellum/ir.json after auto/hybrid builds",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-24T17:51:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b92d351633685509ca1a4dc4df05d019ae70efa9",
          "body": null,
          "is_bot": false,
          "headline": "docs(internal): sweep handoff state for the 0.12.0 release",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-14T15:44:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46f54f36dc381f0a817f26e876196dd0c31de45a",
          "body": "ovellum 0.11.0 → 0.12.0 (AI-Ready output + portable deploy-anywhere build).\nBumps site.version badge to v0.12.0.",
          "is_bot": false,
          "headline": "chore: version packages",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-14T15:35:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1bf83212ee35b0833c36d953b6e613be3c291e2",
          "body": "…ywhere build\n\nsite.ai emits llms.txt / llms-full.txt / per-page .md mirrors (per-locale,\ndrafts+404 excluded, HTML byte-identical). ovellum build gains --out/--base\noverrides and --manifest (hashed deploy inventory). Docs en+ja, FEATURES,\nchangeset.",
          "is_bot": false,
          "headline": "feat: AI-Ready output (llms.txt + .md mirrors) and portable deploy-an…",
          "author_name": "Brajeshwar Oinam",
          "author_login": "brajeshwar",
          "committed_at": "2026-06-14T15:31:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 27,
      "commits_last_year": 312,
      "latest_release_at": "2026-07-18T15:51:21Z",
      "latest_release_tag": "ovellum@0.25.0",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 11,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 2.5
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 75,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "ovellum",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "documentation",
            "docs",
            "typescript",
            "javascript",
            "markdown",
            "mdx",
            "static-site-generator",
            "api-docs",
            "tsdoc",
            "jsdoc",
            "site-generator"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/ovellum",
          "is_deprecated": false,
          "latest_version": "0.25.0",
          "repository_url": "https://github.com/oinam/ovellum",
          "versions_count": 29,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3095,
          "first_published_at": "2026-05-17T10:16:43.024000Z",
          "latest_published_at": "2026-07-18T15:51:16.988000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 1,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "packages/cli/tsconfig.json",
        "packages/core/tsconfig.json",
        "packages/generator/tsconfig.json",
        "packages/merger/tsconfig.json",
        "packages/parser/tsconfig.json",
        "packages/reader/tsconfig.json",
        "packages/site/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 72143,
      "source_files_sampled": 160,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 3592
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@inquirer/prompts",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.4.3"
        },
        {
          "name": "c12",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "3.3.4"
        },
        {
          "name": "chokidar",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.0.0"
        },
        {
          "name": "citty",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.2.2"
        },
        {
          "name": "gray-matter",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.3"
        },
        {
          "name": "lucide",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.16.0"
        },
        {
          "name": "pagefind",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.5.2"
        },
        {
          "name": "rehype-autolink-headings",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.1.0"
        },
        {
          "name": "rehype-raw",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.0"
        },
        {
          "name": "rehype-sanitize",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "rehype-slug",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "rehype-stringify",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.0.1"
        },
        {
          "name": "remark-parse",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.0.0"
        },
        {
          "name": "remark-rehype",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.1.2"
        },
        {
          "name": "shiki",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.2"
        },
        {
          "name": "ts-morph",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^28.0.0"
        },
        {
          "name": "unified",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.0.5"
        },
        {
          "name": "unist-util-visit",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.1.0"
        },
        {
          "name": "c12",
          "manifest": "packages/core/package.json",
          "ecosystem": "npm",
          "version_constraint": "3.3.4"
        },
        {
          "name": "@ovellum/core",
          "manifest": "packages/generator/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@ovellum/core",
          "manifest": "packages/merger/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@ovellum/reader",
          "manifest": "packages/merger/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@ovellum/core",
          "manifest": "packages/parser/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "ts-morph",
          "manifest": "packages/parser/package.json",
          "ecosystem": "npm",
          "version_constraint": "^28.0.0"
        },
        {
          "name": "@ovellum/core",
          "manifest": "packages/reader/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "gray-matter",
          "manifest": "packages/reader/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.3"
        },
        {
          "name": "@ovellum/core",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@ovellum/reader",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "gray-matter",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.3"
        },
        {
          "name": "lucide",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.16.0"
        },
        {
          "name": "pagefind",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.5.2"
        },
        {
          "name": "rehype-autolink-headings",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.1.0"
        },
        {
          "name": "rehype-raw",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.0"
        },
        {
          "name": "rehype-sanitize",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "rehype-slug",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "rehype-stringify",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.0.1"
        },
        {
          "name": "remark-directive",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.0"
        },
        {
          "name": "remark-gfm",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.0"
        },
        {
          "name": "remark-parse",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.0.0"
        },
        {
          "name": "remark-rehype",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.1.2"
        },
        {
          "name": "shiki",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.2"
        },
        {
          "name": "unified",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.0.5"
        },
        {
          "name": "unist-util-visit",
          "manifest": "packages/site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.1.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 2,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "brajeshwar",
          "commits": 310,
          "avatar_url": "https://avatars.githubusercontent.com/u/17795?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "deploy-website.yml",
        "lighthouse.yml",
        "release.yml",
        "website-preview.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.js"
      ],
      "has_editorconfig": true,
      "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": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "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/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 3 contributing companies or organizations -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "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": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "12 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "630417b310ab021a9ee0c530194cb79d839e58b6",
        "ran_at": "2026-07-24T00:15:50Z",
        "aggregate_score": 2.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-18T16:00:37Z",
      "oldest_open_prs": [
        {
          "number": 3,
          "created_at": "2026-06-13T16:37:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-06-08T01:20:42Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/oinam/ovellum",
    "host": "github.com",
    "name": "ovellum",
    "owner": "oinam"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 62,
      "inputs": {
        "security": 27,
        "vitality": 77,
        "community": 42,
        "governance": 59,
        "engineering": 93
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 77,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "commits_last_year": 312,
              "human_commit_share": 1,
              "days_since_last_push": 5,
              "active_weeks_last_year": 11
            },
            "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": "11/52 weeks with commits",
                "points": 7.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 11
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "312 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 312
                    }
                  }
                ],
                "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": 27,
              "latest_release_tag": "ovellum@0.25.0",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 2.5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "27 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 27
                    }
                  }
                ],
                "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.5 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2.5
                    }
                  }
                ],
                "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": 42,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "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": 58,
            "inputs": {
              "packages": [
                "ovellum"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3095
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,095 downloads/month across npm",
                "points": 46.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3095,
                      "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": 59,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 20,
            "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 3 contributing companies or organizations -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 2,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "2/2 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 2,
                      "decided": 2
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 59,
            "inputs": {
              "followers": 3,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "oinam",
              "public_repos": 99,
              "account_age_days": 5818
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "3 followers of oinam",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 3,
                      "login": "oinam"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "99 public repos, account ~15 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 99
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 15
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "ovellum"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "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": "29 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 29
                    }
                  }
                ],
                "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": 93,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "5 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "documentation",
                "documentation-tool"
              ],
              "has_wiki": true,
              "homepage": "https://ovellum.oss.oinam.com",
              "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://ovellum.oss.oinam.com",
                "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": "2 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 27,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 27,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 2.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "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": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "12 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 71,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 3592
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 54,
            "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": [
                "packages/cli/tsconfig.json",
                "packages/core/tsconfig.json",
                "packages/generator/tsconfig.json",
                "packages/merger/tsconfig.json",
                "packages/parser/tsconfig.json",
                "packages/reader/tsconfig.json",
                "packages/site/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "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": "packages/cli/tsconfig.json, packages/core/tsconfig.json, packages/generator/tsconfig.json, packages/merger/tsconfig.json, packages/parser/tsconfig.json, packages/reader/tsconfig.json, packages/site/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/cli/tsconfig.json, packages/core/tsconfig.json, packages/generator/tsconfig.json, packages/merger/tsconfig.json, packages/parser/tsconfig.json, packages/reader/tsconfig.json, packages/site/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": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 72143,
              "source_files_sampled": 160,
              "oversized_source_files": 2
            },
            "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": "2/160 source files over 60KB",
                "points": 54.3,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 160,
                      "oversized": 2
                    }
                  }
                ],
                "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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:ovellum@0.25.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T00:15:55.788414Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/o/oinam/ovellum.svg",
  "full_name": "oinam/ovellum",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasnpm.