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"
}