原始 JSON 报告 机器可读
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 3671,
"has_wiki": true,
"homepage": null,
"languages": {
"CSS": 126336,
"Vue": 2668902,
"HTML": 284,
"JavaScript": 18998,
"TypeScript": 3183060
},
"pushed_at": "2026-07-17T14:25:32Z",
"created_at": "2026-02-22T12:53:49Z",
"owner_type": "Organization",
"updated_at": "2026-07-17T14:26:50Z",
"description": "Cocoar UI Vue - Vue 3 component library monorepo",
"is_archived": false,
"is_disabled": false,
"license_spdx": "Apache-2.0",
"default_branch": "develop",
"license_spdx_raw": "Apache-2.0",
"primary_language": "TypeScript",
"significant_languages": [
"TypeScript",
"Vue"
]
},
"owner": {
"blog": "https://cocoar.dev/",
"name": "COCOAR",
"type": "Organization",
"login": "cocoar-dev",
"company": null,
"location": "Austria",
"followers": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/208673365?v=4",
"created_at": "2025-04-22T15:23:26Z",
"is_verified": null,
"public_repos": 14,
"account_age_days": 456
},
"license": {
"state": "standard",
"spdx_id": "Apache-2.0",
"raw_spdx": "Apache-2.0",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v2.17.1",
"kind": "patch",
"published_at": "2026-07-17T14:06:09Z"
},
{
"tag": "v2.17.0",
"kind": "minor",
"published_at": "2026-07-17T12:22:07Z"
},
{
"tag": "v2.16.0",
"kind": "minor",
"published_at": "2026-07-12T18:11:48Z"
},
{
"tag": "v2.15.0",
"kind": "minor",
"published_at": "2026-07-11T20:55:27Z"
},
{
"tag": "v2.14.0",
"kind": "minor",
"published_at": "2026-07-01T14:39:44Z"
},
{
"tag": "v2.13.0",
"kind": "minor",
"published_at": "2026-06-30T21:45:10Z"
},
{
"tag": "v2.12.0",
"kind": "minor",
"published_at": "2026-06-30T12:39:01Z"
},
{
"tag": "v2.11.0",
"kind": "minor",
"published_at": "2026-06-28T12:44:00Z"
},
{
"tag": "v2.10.0",
"kind": "minor",
"published_at": "2026-06-24T15:50:19Z"
},
{
"tag": "v2.9.0",
"kind": "minor",
"published_at": "2026-06-18T09:56:40Z"
},
{
"tag": "v2.8.0",
"kind": "minor",
"published_at": "2026-06-15T10:59:46Z"
},
{
"tag": "v2.7.0",
"kind": "minor",
"published_at": "2026-06-04T15:57:18Z"
},
{
"tag": "v2.6.0",
"kind": "minor",
"published_at": "2026-06-02T20:59:31Z"
},
{
"tag": "v2.5.2",
"kind": "patch",
"published_at": "2026-05-28T04:00:23Z"
},
{
"tag": "v2.5.1",
"kind": "patch",
"published_at": "2026-05-22T15:15:11Z"
},
{
"tag": "v2.5.0",
"kind": "minor",
"published_at": "2026-05-22T12:50:37Z"
},
{
"tag": "v2.4.0",
"kind": "minor",
"published_at": "2026-05-21T15:45:30Z"
},
{
"tag": "v2.3.0",
"kind": "minor",
"published_at": "2026-05-20T14:48:25Z"
},
{
"tag": "v2.2.1",
"kind": "patch",
"published_at": "2026-05-17T16:19:56Z"
},
{
"tag": "v2.2.0",
"kind": "minor",
"published_at": "2026-05-17T14:40:23Z"
},
{
"tag": "v2.1.0",
"kind": "minor",
"published_at": "2026-05-13T13:15:54Z"
},
{
"tag": "v2.0.0",
"kind": "major",
"published_at": "2026-05-12T14:58:53Z"
},
{
"tag": "v1.18.0",
"kind": "minor",
"published_at": "2026-05-11T13:51:30Z"
},
{
"tag": "v1.17.0",
"kind": "minor",
"published_at": "2026-05-09T09:16:36Z"
},
{
"tag": "v1.16.0",
"kind": "minor",
"published_at": "2026-05-07T16:24:17Z"
},
{
"tag": "v1.15.0",
"kind": "minor",
"published_at": "2026-05-01T21:29:36Z"
},
{
"tag": "v1.14.0",
"kind": "minor",
"published_at": "2026-05-01T11:29:55Z"
},
{
"tag": "v1.13.1",
"kind": "patch",
"published_at": "2026-04-24T20:06:51Z"
},
{
"tag": "v1.13.0",
"kind": "minor",
"published_at": "2026-04-24T17:30:31Z"
},
{
"tag": "v1.12.2",
"kind": "patch",
"published_at": "2026-04-21T05:36:49Z"
},
{
"tag": "v1.12.1",
"kind": "patch",
"published_at": "2026-04-20T04:40:10Z"
},
{
"tag": "v1.12.0",
"kind": "minor",
"published_at": "2026-04-19T17:25:23Z"
},
{
"tag": "v1.11.0",
"kind": "minor",
"published_at": "2026-04-19T10:34:38Z"
},
{
"tag": "v1.10.0",
"kind": "minor",
"published_at": "2026-04-18T22:10:56Z"
},
{
"tag": "v1.9.0",
"kind": "minor",
"published_at": "2026-04-18T11:45:33Z"
},
{
"tag": "v1.8.0",
"kind": "minor",
"published_at": "2026-04-14T07:48:45Z"
},
{
"tag": "v1.7.0",
"kind": "minor",
"published_at": "2026-04-13T18:57:30Z"
},
{
"tag": "v1.6.6",
"kind": "patch",
"published_at": "2026-04-13T14:48:45Z"
},
{
"tag": "v1.6.5",
"kind": "patch",
"published_at": "2026-04-13T14:14:58Z"
},
{
"tag": "v1.6.4",
"kind": "patch",
"published_at": "2026-04-12T17:49:10Z"
},
{
"tag": "v1.6.3",
"kind": "patch",
"published_at": "2026-04-10T11:21:14Z"
},
{
"tag": "v1.6.2",
"kind": "patch",
"published_at": "2026-04-10T10:04:47Z"
},
{
"tag": "v1.6.1",
"kind": "patch",
"published_at": "2026-04-09T17:55:09Z"
},
{
"tag": "v1.6.0",
"kind": "minor",
"published_at": "2026-04-09T12:33:12Z"
},
{
"tag": "v1.5.5",
"kind": "patch",
"published_at": "2026-04-09T05:27:39Z"
},
{
"tag": "v1.5.4",
"kind": "patch",
"published_at": "2026-04-08T04:50:54Z"
},
{
"tag": "v1.5.3",
"kind": "patch",
"published_at": "2026-04-07T14:54:24Z"
},
{
"tag": "v1.5.2",
"kind": "patch",
"published_at": "2026-04-06T17:17:12Z"
},
{
"tag": "v1.5.1",
"kind": "patch",
"published_at": "2026-04-05T22:12:53Z"
},
{
"tag": "v1.5.0",
"kind": "minor",
"published_at": "2026-04-05T15:16:25Z"
},
{
"tag": "v1.3.0",
"kind": "minor",
"published_at": "2026-03-24T20:44:22Z"
},
{
"tag": "v1.2.0",
"kind": "minor",
"published_at": "2026-03-24T11:23:25Z"
},
{
"tag": "v1.1.0",
"kind": "minor",
"published_at": "2026-03-24T09:33:32Z"
},
{
"tag": "v1.0.1",
"kind": "patch",
"published_at": "2026-03-23T19:17:52Z"
},
{
"tag": "v1.0.0",
"kind": "major",
"published_at": "2026-03-23T15:54:17Z"
}
],
"recent_commits": [
{
"oid": "4dcaf725309b436a1f2b0f0f190da29795ab2334",
"body": "The six property tests run up to ~100k expect() calls each (200 runs x 500\niterations); under FULL turbo parallelism on a contended CI runner that\nintermittently blew vitest's 5s default timeout — the known flake that hit\nboth local full runs and the v2.17.1 CD pipeline. Each property now carries\nits own 30s timeout; coverage (numRuns/arbitraries) is unchanged.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(calendar): per-property timeouts kill the measurementCache CI flake",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-07-17T14:25:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "990cb19efb76c97f134d9b62360e55aed2a28827",
"body": "…icker keeps layout & content (2.17.1)\n\n* fix(page-builder): hideElementPicker keeps the Containers group\n\nFields-only authoring still needs layout structure: the flag now removes\nonly the free Elements offering (palette group + element entries of the\noutline add-child menu); Containers stay, govern\n[…]\nocs(changelog): stamp 2.17.1 + registry-doc note on the Inputs/Elements split\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(page-builder): palette splits Inputs from Elements — hideElementP…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-07-17T14:06:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6f26d21eef97c2119ad770c98a02ffa92e0d15a6",
"body": "…ction submit lifecycle (2.17.0)\n\n* fix(page-builder): P0 correctness & data-safety fixes from the GA audit\n\nFixes the 7 code blockers (audit 2026-07-02, .local/PAGE-BUILDER-GA-AUDIT.md):\n\n- moveNode: rebase the target path into post-removal coordinates — dragging a\n node into a later sibling conta\n[…]\ns\nsurfaces per entry in llms.txt and VitePress emits as the meta description.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(page-builder): GA — open element registry, field contract, produ…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-07-17T12:21:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f106d563cabde4d653378c3f709551cdf1052396",
"body": "…d (2.16.0) (#24)\n\nA timed event without `end` keeps its +30-min slot geometry but now\nrenders with a solid start edge in the event color on the start time,\na semi-transparent body (title stays opaque) and no resize handles.\nLayout math (core/*) untouched — fixture parity with the SwiftUI port\nholds; values match Cocoar.Calendar.iOS 0eef2e0 via the new tokens\n--coar-calendar-point-edge-height / --coar-calendar-point-body-opacity.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(calendar): distinguishable point-event rendering in the time gri…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-07-12T18:11:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "fbae4660e6dee5632d79e1ff0a48493bf0f72171",
"body": "…x (2.15.0) (#23)\n\n* fix(calendar): end-less timed events no longer ghost on following days\n\nlayoutDayEvents applied the default 30-minute duration AFTER projecting\nthe start onto the day, so on any day after the event's start day the\nbefore-this-day sentinel (-1) yielded endMin 29 — a visible 0:00-\n[…]\nark-mode ancestor or on the grid\nelement; data-theme is not a trigger there).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(calendar): dark mode for the grid + end-less event ghost-card fi…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-07-11T20:54:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0d6f700c089368f39faabb4ea0c80bbae0f57115",
"body": "…ectives (#22)\n\nembed-directive.conformance.json is the NORMATIVE shared contract between\nthis package and the native Swift implementation (Cocoar.Markdown): 74\nvectors covering parse (37, incl. UTF-16 code-unit scanning edge cases and\nraw newlines in quoted values), serialize (10, incl. JS integer-\n[…]\n-props fold). The Swift repo vendors a synced\ncopy and runs the same file through XCTest — a failure on either side\nmeans the platforms drifted.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(markdown-core): cross-platform conformance vectors for embed dir…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-07-02T06:07:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2b91c158ba2d08d00b695a0d73288dd0f09bc87d",
"body": "…(2.14.0) (#21)\n\n* feat(markdown): diagram support via ```mermaid fence renderer\n\nAdd a language-keyed fence-renderer registry to @cocoar/vue-markdown and a\nnew opt-in @cocoar/vue-markdown-mermaid package that renders ```mermaid\nfenced code blocks as diagrams.\n\nTwo independent decisions, cleanly sep\n[…]\nD release workflow stamps them from the git tag).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: Markdown diagrams via Mermaid + standalone @cocoar/vue-mermaid …",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-07-01T12:20:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "024216b7fc4a788a6aac81a25deb1f884debdbe5",
"body": "CoarZonedDateTimeOrDatePicker / CoarPlainDateTimeOrDatePicker — a date picker\nwhose time is optional. A clock toggle sits beside the field (togglePosition\nstart/end); off enters a Temporal.PlainDate, on enters a date with time\n(ZonedDateTime or PlainDateTime). One v-model carries the union value,\nv-\n[…]\n-picker (+ 3 demos), playground /date-or-time,\nCHANGELOG 2.13.0. Browser-verified via CDP. lint 13/13, build 15/15, ui 1583 tests.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(ui): optional-time date pickers + clock-off icon (#20)",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-30T21:35:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "665f9bca5aac0b5a541788805b280907eeea71e5",
"body": "* feat(map): CoarMapEditor slice 1 — add-on-click, drag-to-move, live route\n\nVisual editor for `@cocoar/vue-map`, the write counterpart of `<CoarMap>`.\nControlled via `v-model:data` — never mutates the prop; every edit emits a\nfresh `MapData` built by the new Leaflet-free `internal/map-edit.ts`.\n\nUn\n[…]\nred with CoarTextInput / CoarSelect / CoarButton.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(map): visual Map Editor + drag-and-drop point list (#19)",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-30T11:03:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "417dcc6af010616913a70678701643ad100504fc",
"body": "…#18)\n\n* feat(markdown-core): :::key{props} custom-embed directive + lossless round-trip\n\nAdds a generic embed directive to the core parser. A standalone `:::key{props}` line folds to an `embed` node ({ key, props }) via the paragraph's raw source, and serializes back verbatim (html node) so parse->\n[…]\n following branches. Declare without initializer.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: markdown custom embeds + @cocoar/vue-map (2.12.0, unreleased) (…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-30T06:43:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8f263ff6491042ca61e9d231b6a362d0232fdc13",
"body": "* feat(theme-editor): initialize state from existing theme on mount\n\nonMounted reads all themeable tokens via getComputedStyle before\napplyTokens() ever runs. If an ancestor .coar-theme--xxx class is already\nactive, the editor starts from those values instead of DEFAULTS — so the\nfirst user interact\n[…]\nthe repo-wide ^0.5.1.\n\nFull `pnpm build` now passes (14/14).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Input & form-control consistency overhaul (2.11.0) (#17)",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-28T12:06:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "55c9a5f97afb0c4474e1d6eb14b4857f89141fde",
"body": "The CoarTree.create aria-label tests passed `kind: 'file'`, which is not a\nmember of `CoarTreeCreateKind` ('folder' | 'leaf'), failing CI typecheck.\nSwitch to 'leaf' (the canonical leaf variant); the aria-label maps any\nnon-folder kind to draftFileName so assertions are unchanged. Also fix a\nstale doc comment that referenced the non-existent 'file' kind.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(tree): use valid 'leaf' kind in CoarTree create tests",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-24T15:23:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8815e7fadc7059f63951b6ecb013540426f6c5c9",
"body": "…aft i18n\n\nTwo beta findings ahead of 2.10.0: root-barrel re-export of CoarTree\ncreate/data-drop payload types, and localizable draft-input aria-label.",
"is_bot": false,
"headline": "Merge fix/coar-tree-create-exports-i18n: CoarTree create exports + dr…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-24T15:10:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a40f30ed4f073bdc3e4a78f3ffad4af84428debd",
"body": "…draft input\n\nTwo beta findings ahead of the 2.10.0 release for the new CoarTree\ninline-create feature:\n\n1. Export gap — CoarTreeCreateEvent, CoarTreeCreateKind, CoarTreeDataDropEvent,\n CoarTreeDraftSlotProps and CoarTreeStartCreateOptions were only reachable via\n the deep ./components/tree path\n[…]\nt-in string.\n\nAdds 2 tests (default + localized aria-label), CHANGELOG 2.10.0 Fixed entries,\nand updates the tree.md i18n section.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(tree): export CoarTree create/data-drop payload types + localize …",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-24T12:57:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "92a48ff67792cb9d384c4ebaca74ce8933793e83",
"body": "…bility switch (2.10.0) (#16)\n\n* feat(markdown-editor): image support — insert by URL + paste/drop upload\n\nAdds three ways to get images into the editor, all round-tripping as\nstandard Markdown ``:\n\n- Insert by URL: a new \"Insert Image\" sidebar button opens a dialog\n (url/alt/tit\n[…]\nst\n(absent from the minimal / no-tables presets).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(markdown-editor): images, full table editing, and a flavor porta…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-24T11:41:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0f90ac4ef206904921217d6b142a218dd4dcbaf4",
"body": "…le-explorer move/optimistic/browse-only, toast fix (2.10.0) (#15)\n\n* fix(toast): default CoarToastContainer :service to the singleton\n\nRendering `<CoarToastContainer />` without `:service` threw\n`Cannot read properties of undefined (reading 'position')` on every render,\nwhich stalled the reactive f\n[…]\nnd an app-internal drop target — reword to match.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: Tellify feedback batch — CoarTree inline create + data-drop, fi…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-24T11:01:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "33bc403af7dc1a75b6a745b2eaa413b7cda8d842",
"body": "…hemes (#13)\n\n* feat(playground): add CoarThemeEditor — live token editor with download\n\nFloating paint-palette FAB (bottom-right, Teleport to body) opens a\nslide-in panel that live-edits CSS custom properties on documentElement:\naccent brand color, success/error/warning/info status colors, a radius\n[…]\nom>\n\n* docs(changelog): update 2.9.0 entry for class-based theme system\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(theming): Theme Editor v2 — 3-layer token system + class-based t…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-18T09:01:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f6f154c85b82a1d1b5a2e748a4e9a340ffaa9a3e",
"body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(changelog): update 2.9.0 entry for class-based theme system",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-18T08:34:07Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "42c0efabe49a227bb2000a579fbd9a761c289f6b",
"body": "…/ -none)\n\nTheme editor now writes tokens into a <style id=\"coar-theme-editor\"> tag\nscoped to .coar-theme-editor instead of setting inline styles on :root.\nDownload exports .coar-theme--{name} (user-named) instead of :root.\n\nNew theme-none.css ships .coar-theme-none — a reset class that re-declares\n\n[…]\nme name monospace input (prefix .coar-theme-- + editable suffix)\n- docs: updated export section with class usage + .coar-theme-none reference\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(theming): class-based theme system (.coar-theme-editor / --name …",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-18T07:34:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "12a7b04fba4dbca07e45c9bc6db1972e6c1a8370",
"body": "v2.8.0 was already tagged and released. Theme Editor redesign + semantic\ntoken layer belongs in the upcoming 2.9.0 release.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(changelog): move Theme Editor entry from 2.8.0 to new 2.9.0 section",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-18T05:36:52Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b13405dca9cf198a02009c35d5862b909eb14c0c",
"body": "- New /foundations/theming page: setup, token-tree diagram, per-tab\n reference, props table, export instructions\n- Sidebar entry \"Theme Editor\" added to both /guide/ and /foundations/\n sidebar groups\n- CHANGELOG 2.8.0 intro + Added entry for the Theme Editor redesign and\n semantic token layer\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(theming): Theme Editor docs page + CHANGELOG entry for 2.8.0",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-18T05:35:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1afbf9f35005919de73119b7f1a9ad908f9ebe34",
"body": "- New Semantic tab between Brand and Corners: per-token palette+step\n selects for all Accent / Error / Success / Warning / Info tokens.\n Live swatch shows the resolved color; reset icon turns accent when\n changed; header Reset + Download both react to semantic overrides.\n- Danger button wired to \n[…]\nghout, no rotate-15deg\n FAB animation, lighter dividers, te-slider accent-color, te-sem-row /\n te-sem-select CSS for the new semantic rows.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(theme-editor): 3-layer semantic token tab + visual redesign",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-18T05:02:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "79f26beebf020cd7a2db288aa6513fb12d6d38ac",
"body": "Each brand color (Accent, Error, Success, Warning, Info) now has a ⊞\nbutton in the Brand tab that opens a floating, draggable palette editor.\n\nThe modal shows all 10 steps (50–900) of the color's oklch scale as a\nvisual swatch strip + per-step L and C sliders with ↺ reset buttons.\nStep 500 is marked\n[…]\ncolor (non-editable). Overrides are\napplied live as --coar-color-{family}-{step} tokens and included in\nthe downloaded coar-theme.css output.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(theme-editor): draggable oklch palette editor modal",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-17T20:53:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7647a4f42502f7a5cda010c39602682cbefd1955",
"body": "- --coar-button-danger-l (0.47) + --coar-button-danger-c (0.13) expose\n the oklch formula params independently; changing them tunes the shade\n without touching --coar-error or other UI that uses the error color\n- Formula/Custom pill toggle in Brand tab: formula mode shows L+C sliders,\n custom mod\n[…]\nbuttons (↺) on every radius scale slider and on danger L/C sliders:\n gray when at default, blue (accent) when changed, click resets that var\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(theme-editor): danger formula editor, reset buttons per variable",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-17T20:44:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f2472d4cd19fdc4cf41cd354365e73fbbe4c7ceb",
"body": "Add sliders for --coar-radius-xxs/xs/s/m/l/xl directly — changing the\nscale propagates to all components that reference these tokens, without\nneeding per-component overrides. Per-component chips move behind an\n\"Advanced\" toggle (collapsed by default). Minimal preset now sets the\nfull scale to 0 instead of per-component overrides.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(theme-editor): primitive radius scale editor in Corners tab",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-17T20:34:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b9332a14004a7f369837120ff1a541c88d31ff83",
"body": "- Rename \"Shape\" tab → \"Corners\" (accurately describes border-radius only)\n- Add --coar-button-danger-bg token with color-mix-derived hover/active,\n wired into CoarButton; independent of --coar-error so vivid reds work\n- Add --coar-component-density token (default 1); CoarButton and\n CoarTextInput\n[…]\n/Default/Comfortable chips),\n Danger colour picker in Brand tab (separate from Error)\n- Tab scrollbar: thin + 3px track for narrow viewports\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(theming): Corners rename, Danger token, Spacing/Density tab",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-17T19:50:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "33d14ebc2ca936f64a1b0fc06ef7b5c965c0bb17",
"body": "## Token layer (new-components.css)\nAdds a semantic middle layer between primitives and components:\n- Radius: --coar-button-radius, --coar-input-radius, --coar-tag-radius,\n --coar-badge-radius, --coar-card-radius, --coar-menu-radius,\n --coar-popover-radius, --coar-dropdown-radius (all default to p\n[…]\nroups\n- Motion: global duration scale slider (0 = instant, 3× = slow)\n- Download emits only the delta tokens; reset restores browser defaults\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(theming): semantic component token layer + Theme Editor with tabs",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-17T18:21:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "dce19cab1bf8f30929fc6b13b3277a7904a35d69",
"body": "…o VitePress\n\n- Moved from apps/playground/src/components/ to packages/ui/src/components/theme-editor/\n- Added hideDarkToggle prop (default false) — suppresses the Light/Dark section\n when the host app already manages dark mode (e.g. VitePress)\n- Added @cocoar/vue-ui/theme-editor alias to playgroun\n[…]\nered in VitePress layout-bottom slot with hide-dark-toggle (VitePress\n owns dark mode via DarkModeSync); playground keeps the toggle visible\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(theme-editor): move CoarThemeEditor to packages/ui, wire int…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-17T17:52:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2f232db456259d2fb6175a24bc2189ade66a0128",
"body": "Floating paint-palette FAB (bottom-right, Teleport to body) opens a\nslide-in panel that live-edits CSS custom properties on documentElement:\naccent brand color, success/error/warning/info status colors, a radius\nscale slider (0–4× multiplier over the base scale), and body/title font\nfamily. Dark-mod\n[…]\n\nDownload button emits only the changed delta tokens as coar-theme.css.\nDesigned as a self-contained component ready to extract to a package.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(playground): add CoarThemeEditor — live token editor with download",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-17T17:09:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "63f130d8746f6077b1b28803a14bc57dba264f9b",
"body": "…izard (#12)\n\n* feat(markdown): placeholder, frontmatter, and a Source view for the editor\n\nAdds three capabilities across the markdown packages.\n\nCoarMarkdownEditor:\n- `placeholder` prop — a Markdown hint shown while empty, rendered as a muted,\n click-through overlay of the shared viewer; never wr\n[…]\nsitions, varying-height steps); browser-verified.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: Markdown editor (placeholder, frontmatter, Source view) + CoarW…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-15T10:23:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "03667aaab2478592408fd4296f5a16d345632442",
"body": "…zy, filter (2.7.0) (#11)\n\n* perf(tree): scale CoarTree to many nodes — O(1) drag + keyboard nav, virtualize nudge\n\nCoarTree's render core already scaled via opt-in virtualization, but\ninteraction stayed O(n) per event and large non-virtual trees froze\nsilently. This makes the hot paths O(1)/O(depth\n[…]\n focusNode as a select+focus alias of selectNode.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(tree): CoarTree professionalization — selection, scale, a11y, la…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-04T15:29:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1fc91368ca4315a1c60ec76b08aeb7592b9533bc",
"body": "…(Preview) (#10)\n\n@cocoar/vue-ui — add CoarSplitPane + CoarPanelLayout (Preview): a VS-Code-style resizable/collapsible workbench (top/left/content/right/bottom/status; an empty slot renders no region) built on a nestable two-pane primitive. Dividers are focusable role=separator window-splitters (po\n[…]\nout primitives (the CoarTree #footer experiment was dropped).\n\nDocs + CHANGELOG (2.6.0) updated; both new surfaces marked Preview.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: panel layout primitives + file-explorer headless-engine rename …",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-06-02T18:49:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d19fe04cbb7502b80a9e44c566aa417224d0cffa",
"body": "…lf, sizing, min-height) (#9)\n\n* feat(page-builder): complete the flex layout model (justify, align-self, sizing, min-height)\n\nGive nodes a coherent, intuitive flexbox model so layouts like a centered\nlogin card are expressible in the builder instead of leaking to host CSS.\n\nNodeStyle additions:\n- j\n[…]\nalkthrough.\n\nVitePress build verified (0 errors).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(page-builder): complete the flex layout model (justify, align-se…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-29T15:02:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c7f6c725ee72c11f94cc8e559c2695a46f1e5c55",
"body": "CoarTextInput and CoarPasswordInput rendered the clear (x) button only once the\nfield had a value (v-if=\"showClearButton\"). As a flex sibling it then pushed the\ninput ~22px narrower on the first keystroke — a visible size jump on every field.\n\nReserve the clear button's layout slot whenever clearing\n[…]\nds. 1388 ui tests pass; the two \"hides when empty\"\ntests now assert the reserved-but-hidden state + a non-clearable coverage test.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(ui): stop text/password inputs resizing on first keystroke (#8)",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-29T15:02:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0032a35655ade78de38438ecf3db0c6a870c7de5",
"body": "@cocoar/vue-ui pinned vue-router to ^4.0.0, so consumers on vue-router@5 hit\nan unmet-peer warning on install even though the integration is optional and\nruntime-detected (resolveDynamicComponent, no hard import). Aligns the range\nwith @cocoar/vue-fragment-parser, which already accepted v5. Bumps the dev\ndependency to ^5.0.4 to match. No runtime change. Logged under an Unreleased\nCHANGELOG section (2.5.2 is already published).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(ui): widen vue-router peer range to ^4.5.0 || ^5.0.0",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-28T04:11:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a7ec275c88ee2469bf6e3aeabf80a6a835485cad",
"body": "An anchored panel (date picker, select, popover, menu) opened from inside a\nmodal/dialog stayed open when clicking elsewhere in the dialog body — it only\nclosed when its own trigger was re-clicked. onDocumentPointerDown treated\n\"click inside overlay X\" as \"collapse X's tree-children and stop\", ignor\n[…]\ne + modal backdrop behaviour unchanged.\n\nAdds a regression test and a playground repro (section 9 of the overlay-\nstacking modal).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(overlay): dismiss anchored panels on outside-click inside modals",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-28T03:51:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8dc91eaaf2480b7353e8c93f56d391bbc4353a0f",
"body": "Closes Dependabot alerts #14 (brace-expansion 5.0.5 → 5.0.6, medium) and\n#15 (js-cookie 3.0.5 → 3.0.7, high). Both are deeply nested devDeps with\nno runtime exposure — js-cookie via @vue/test-utils → js-beautify,\nbrace-expansion via eslint / typescript-eslint / vue-tsc → minimatch.\n\nDirect consumers\n[…]\n cover the patches (^3.0.5\ncovers 3.0.7; ^5.0.5 covers 5.0.6), so a targeted recursive update\nsuffices — no pnpm.overrides needed.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(deps): refresh js-cookie + brace-expansion to patched transitives",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-22T14:43:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b38f349dc4077d4ed3c2262ad17850e53ef55071",
"body": "pdfjs-dist appends an internal working canvas and copy element directly\nto <body> and relies on its own pdf_viewer.css to keep them invisible.\nThe package doesn't ship that stylesheet, so the canvas surfaced as a\n300x150 black rectangle and inflated document.body.scrollHeight by 150\npx in non-modal \n[…]\ndocument-viewer.css as an unscoped global block, next to the existing\ntextLayer subset already mirrored in CoarDocumentViewer.vue.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(document-viewer): hide pdf.js body-level canvas + copy element",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-22T14:39:45Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "98c52e9bc4c11f5f6e72bcbf52e999b3df57a30f",
"body": "The unconditional `--vp-layout-max-width: 2200px` interacts badly with\nVitePress's `@media (min-width: 1440px)` sidebar rule, which computes\nsidebar width as `(viewport - layout-max-width) / 2 + sidebar-width`.\nWhen `layout-max-width > viewport`, the calc goes negative and the\nsidebar collapses to i\n[…]\n\nthe VitePress default 1440 stays in effect (sidebar fully functional).\nWide monitors still fill out the content area as intended.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(docs): sidebar collapses to 64px strip below 2200px viewport",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-22T12:28:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6ae1983a088473309943d8f971d5f6157ca240da",
"body": "Reworks `CoarFormField` from a label-plus-message-row wrapper into a per-\nfield status indicator that surfaces hint / warning / error / rules\nthrough one icon + popover. Severity model is \"highest severity visible\nin the popover\": error > warning > success > pending/hint > none.\n\nNew `rules` prop (`\n[…]\ns (vue/require-default-prop)\n - removed a couple of unused `eslint-disable no-console` directives\n in the file-explorer + tree\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(form-field): status indicator + rules system",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-22T09:51:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e8d21f444cf21395344df87804325008cc7d630f",
"body": "Six fixes from real-world wiring of @cocoar/vue-file-explorer v2.4.0 into\na backend-backed (Pinia + REST + SignalR) editor at Atlas.\n\nfile-explorer:\n- useFileExplorer now calls store.loadTree() on mount and patches its\n internal projection after each successful CRUD op. Stores that surface\n a reac\n[…]\native-ops tables.\n- tabs.md: new \"Fill-Height Tabs\" section with TabsFill demo + standard\n wiring pattern + opt-in rationale tip.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: address Atlas integration feedback (file-explorer + tabs + tree)",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-22T05:15:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4b300ad3d3ea4515fe70dee016b1e8b9afa4971c",
"body": "GitHub Actions is forcing JavaScript actions to Node 24 starting\nJune 2, 2026 (12 days). Node 20 is removed entirely on September 16.\nSeveral of the actions we use still ship on Node 20 (the current\nwarning called out actions/cache@v4, actions/checkout@v4,\nactions/upload-artifact@v4, volta-cli/actio\n[…]\nAll four workflows updated for consistency (ci-develop,\nci-pr-validation, cd-deploy-prerelease, cd-deploy-stable,\ncd-deploy-docs).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: bump all Actions to their Node-24 majors",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-21T15:21:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "dea8bd348e25669aca3e3f857748adfc392c96b2",
"body": "Root cause of the recent CI hangs: Playwright 1.59.1 bundles a yauzl\nversion with a deadlock that triggers on Node 26 — the archive\ndownload completes in ~1 s, then `extract-zip` stalls silently\nuntil the job timeout fires. GitHub Actions began rolling Node 26\ninto ubuntu-latest at some point betwee\n[…]\n were chasing the wrong fix)\n\nVerified locally: 13/13 turbo tasks pass, 59/59 playground E2Es\npass on Playwright 1.60.0 + Windows.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: bump @playwright/test to 1.60.0 (Node 26 install hang)",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-21T15:05:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8f334357bbc825096e5e38d92c616ea40baeefb9",
"body": "Last run got past chromium + ffmpeg in ~5 s total, then Playwright\nre-extracted chromium-headless-shell (third binary, same hang).\nAdd it to the install_archive list. With markers on all three\nbrowsers, the trailing `playwright install chromium` should\nfinally short-circuit.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: also pre-extract chromium-headless-shell",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-21T14:48:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b659f4857a0233d6475f5d539a6465a8ce6fc1a3",
"body": "Last run got past chromium (curl+unzip in 5 s) but Playwright then\nre-invoked its own extract for ffmpeg, which hangs the same way.\nGeneralise the workaround to install both binaries via system unzip,\neach with the INSTALLATION_COMPLETE marker so the trailing\n`playwright install chromium` is a no-op skip.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: also pre-extract ffmpeg in the system-unzip workaround",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-21T14:41:09Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "740eedbede8adedaeeb58b2f902565525be1c358",
"body": "Confirmed via the DEBUG log that the hang is `extract-zip` itself,\nnot download / not cache / not OS (tested 22.04 + 24.04, same hang).\nBypass it entirely:\n\n1. Download the chromium archive via curl.\n2. Extract with the system `unzip` (a few seconds for 170 MiB).\n3. Touch the `INSTALLATION_COMPLETE`\n[…]\n adds no value and just risks\nre-introducing state we can't see.\n\nRevert to `ubuntu-latest` now that we know it's not OS-specific.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: bypass playwright extract-zip with system unzip",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-21T14:34:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fb1c1b17e4f1ba1cc8cab0883f6f3dd4888f8651",
"body": "The Playwright DEBUG logs from the prior run identified the exact\nblocked point: archive download finishes in 1 s, then\n`extract-zip` hangs silently for 5+ min until the step timeout\nfires. Same playwright version (1.59.1) and same workflow worked\nat v2.3.0. The runner image moved from 22.04-era to 24.04 in\nbetween (ubuntu-latest currently resolves to 24.04.4 image\nrelease 20260518.149); pin back to 22.04 as a workaround.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: pin runner to ubuntu-22.04 to dodge chromium extract hang",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-21T14:26:34Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7d3e86733233eee34445525c23061fa5cc6125dc",
"body": "Three runs in a row with the same symptom: chromium archive\ndownloads in ~1s (170 MiB → done), then stdout goes silent for\n5+ minutes until the timeout-minutes:5 guard fires. No error, no\nextract progress, no version line, nothing.\n\nEnable DEBUG=pw:install,pw:download so the next run logs exactly\nwh\n[…]\n, zip extract, version probe,\npost-install hook, etc.). Once we see the real signature we can\nfix it properly instead of guessing.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: enable playwright DEBUG logs to diagnose post-download hang",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-21T14:17:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ec672653f9760a09f0d5821d22c9ebd6c54f7d4b",
"body": "Run 26230878611 showed the actual hang: chromium archive downloaded\nin 1.2s (full 170 MiB), then NOTHING for 5+ minutes until the\ntimeout fired. No error, no progress. That's the post-download\nunzip/verify phase hanging — probably on inconsistent state in the\nrestored cache from a previous interrupt\n[…]\nn.\n\nSuffixing the cache key with `-v2` forces a fresh cache miss + clean\nunzip. If a future hang reappears, bump the suffix again.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: bump playwright cache key to bust corrupt cache state",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-21T14:09:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2a52f2237d72e7878fd2dd4507c05836654b51af",
"body": "The `playwright install --with-deps chromium` step hung indefinitely\ntwice in a row (>28 min, eating the 30-min job timeout), apparently\nbecause `--with-deps` shells out to `sudo apt-get install` and the\napt step gets stuck on this runner / mirror combination.\n\nubuntu-latest already ships most Chrom\n[…]\nd `timeout-minutes: 5` so any future hang in this step fails loud\nwithin 5 min instead of silently consuming the whole job budget.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: drop --with-deps + add 5-min timeout to playwright install",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-21T13:56:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9d7fafd86f17fcb954dbc65ae50453098f3f136d",
"body": "- CoarTree.vue: extract `props.builder` into local before mutating\n inner refs (satisfies vue/no-mutating-props on the computed setter)\n- CoarTree.vue: add explicit `return []` after the discriminated-union\n switch in menuEntries computed (satisfies vue/return-in-computed)\n- CoarTreeNodeLabel.vue:\n[…]\n that h() can't satisfy. Tests run\n unchanged (1355 passing).\n- Drop `as const` on mountOpts so the plugins array isn't readonly.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(ui): CI green — CoarTree lint + typecheck",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-21T13:08:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e38874d094513e15e3f0d940254d0df5d97d5eaf",
"body": "…itive)\n\nIntroduces @cocoar/vue-file-explorer (Preview tier) — a VSCode-style\nfile/asset explorer driven by useFileExplorer({store}) over a pluggable\nAssetStore<T> backend. Composable-only for v1 (no <CoarFileExplorer>\nwrapper — consumers compose the shell themselves; the docs ship five\nlive demos i\n[…]\ny additive — no breaking changes. Full release notes in\n.local/RELEASE-v2.4.0.md, full CHANGELOG entry at the top of\nCHANGELOG.md.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: File Explorer v2.4.0 (@cocoar/vue-file-explorer + CoarTree prim…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-21T12:48:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d990ce3fe29a960d0f22adb783b906699ef3fd0c",
"body": "…r primitives)\n\n@cocoar/vue-document-viewer — new package, v0.0.1 (Preview)\n <CoarDocumentViewer :source> renders PDFs, single images, and multi-page\n image galleries through one component with shared toolbar, side panels,\n info section, and annotation surface. Switching `source` keeps the chrome\n[…]\nrcises all three source kinds, custom\n toolbars, annotation modes, position memory, and the per-canvas\n render tracking fix.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: Document Viewer v2.3.0 (@cocoar/vue-document-viewer + ui sideba…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-20T14:19:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4dfd6689ae15c56bf6deb911b0219a00a98bbe6e",
"body": "Closes a v2.2.0 inconsistency flagged in review: menu items had no way\nto mark current selection (view-mode toggles, settings ✓, sort indicators),\nwhile sidebar items already had it. Mirrors CoarSidebarItem 1:1.\n\n- `active?: boolean` — explicit override\n- auto-falls back to `RouterLink.isActive` when `to` is set\n- new CSS tokens `--coar-menu-item-active-color` / `--bg`\n- menu still auto-closes on click\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(ui): CoarMenuItem `active` prop + RouterLink isActive parity",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-17T15:16:36Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "db170366762e0be7cb3e3d14a4ae30e46bef76d7",
"body": "Add optional `to` prop to CoarSidebarItem, CoarMenuItem, CoarButton,\nCoarBreadcrumbItem, plus a new CoarLink SFC, so consumers no longer have\nto fall back to `@click=\"router.push(...)\"` and lose every native browser\nlink affordance (right-click → \"Open in new tab\", middle-click, Ctrl/Cmd-\nclick, \"Co\n[…]\n3 passing (was 1216 baseline). Downstream consumers (calendar 670,\ndata-grid 258, script-editor 92, markdown-editor 14) all green.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(ui): router-aware navigation items + new CoarLink",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-17T14:20:30Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "078a5437c89ea01a83cf9762cc3d18844e30dfe0",
"body": "feat(page-builder): introduce @cocoar/vue-page-builder (Preview)",
"is_bot": false,
"headline": "Merge pull request #7 from cocoar-dev/feat/page-builder",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-13T13:14:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1a27be6aa313104619bb01e8fe158106bd72d5d8",
"body": "18 ESLint errors flagged by CI:\n - @typescript-eslint/no-explicit-any across BuilderCanvasNode.vue,\n BuilderOutlineNode.vue, CoarPageBuilder.vue — replaced with proper\n optional-property type assertions for the discriminated-union access\n patterns (n as PageNode & { text?; label?; title?; \n[…]\nevTools during\nthe Preview phase) so the test script now passes `--passWithNoTests`\nto keep CI green until proper test files land.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(page-builder): satisfy lint + vitest-no-tests in CI",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-13T12:53:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a42284821fe80f05b0049bf409beed4157ab72a4",
"body": "Generic, headless visual page composition framework. Two components from\none package — <CoarPageBuilder> (3-panel visual editor) and\n<CoarPageRenderer> (runtime renderer that maps JSON → live Cocoar\ncomponents).\n\nShared PageConfig contract:\n - allowedElements — hard security boundary, enforced at b\n[…]\nolding packages — their\nuse cases (login, registration, contact) fit inside the page-builder\nwith narrower config.allowedElements.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(page-builder): introduce @cocoar/vue-page-builder (Preview)",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-13T12:43:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d106473fe19eb6b2231e41ca72299b38f8fc02ba",
"body": "GridPlainDate / GridZonedDateTime / BasicDateViews demos import the\npolyfill directly. Locally pnpm hoisting resolved it transitively via\ndata-grid/ui, but CI's stricter resolution surfaced the gap as a\nRollup \"failed to resolve import\" build error.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(docs): declare @js-temporal/polyfill dependency",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T14:45:05Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a444fe8a5c50b1798b837408d9f7a805edab7ef8",
"body": "…round)\n\nThe .VPBadge.tip override set only background-color to the brand-blue\nvalue, leaving VitePress's default tip text color untouched — which in\nthe brand-blue cascade resolved to also brand-blue, producing\nunreadable blue-on-blue badges everywhere \"New in 2.0\" appeared.\n\nSet the full triplet (text, background, border) so the override is\ncomplete.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(docs): VPBadge tip variant readable (was: blue text on blue backg…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T14:28:44Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4039b7ab29ca6aaf900f598bb465e42f42168f16",
"body": "CHANGELOG:\n - Added popoverPreset export-gap fix to Fixed section (was only in\n the opening paragraph)\n - Added Docs section entries for all new v2.0.0 docs pages:\n multi-select, date-columns, date-views, otp-input, plus the\n live-demos-mirrored-from-playground commit for the calendar pag\n[…]\nzone projection), cross-realm safety note, and a per-\n component API table.\n - Sidebar entry under Form Controls > Date Views.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: Date Views page + CHANGELOG completeness pass for v2.0.0",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T14:26:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bb4faf383b3c03b2f567ceb050f1670f7eefb7f8",
"body": "Clicking a body-teleported overlay inside an already-open editor overlay\n(e.g. timezone CoarSelect inside CoarZonedDateTimePicker panel, which\nitself lives in an AG Grid cell editor) closed the outer panel mid-\ninteraction.\n\nRoot cause: focusout events fired on the editor root with relatedTarget\npoi\n[…]\nditor,\nCoarPlainDateTimeCellEditor, CoarZonedDateTimeCellEditor.\n\nText + number editors stay untouched — their inputs are in-cell.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(data-grid): popup cell editors survive nested-overlay interaction",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T14:20:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d9f3b6119f4178baf36705a87b6edce3c9a0a988",
"body": "…meView\n\nThree read-only display components paired with the existing picker family.\nEach viewer mirrors its picker's formatValue logic exactly — same\nuseDatePickerBase locale + date-format resolution, same coarFormatPlainDate\n+ coarFormatTime + coarFormatTimezoneLabel helpers — so a read-only displa\n[…]\n files. Total @cocoar/vue-data-grid suite 258 tests across 8\nfiles (no test changes; refactor verified by existing factory tests).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(ui): CoarPlainDateView / CoarPlainDateTimeView / CoarZonedDateTi…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T14:04:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e69510c2cb11a4bced6e92feb49a28929c5a0bfc",
"body": "…mn shortcuts\n\nThree Temporal-typed column factories for date / date-time / zoned-\ndate-time cells. Each pairs a locale-aware renderer (toLocaleString\nwith date-style: medium; plainDateTime adds time-style: short;\nzonedDateTime adds short zone-name suffix) with an editor wrapping\nthe matching @cocoa\n[…]\n8 files.\n\nDocs page at /components/data-grid/date-columns with three live demos\n(task scheduling, reminders, cross-zone meetings).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(data-grid): col.plainDate / .plainDateTime / .zonedDateTime colu…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T13:36:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4781f2d99de8acd04b8d2cc6c6c58f72b7e6d920",
"body": "Two new factory methods for multi-value cells. Both store the cell value\nas T[] and share one renderer (CoarMultiSelectCellRenderer) — comma-\nseparated label lookup by default, .display('chips') opts into a\n<CoarTag> per value.\n\n col.multiSelect — editor wraps <CoarMultiSelect> (checkbox-list dropd\n[…]\n\nCHANGELOG: rides into the existing v2.0.0 entry on develop (Added for\nthe new shortcuts, Fixed for the prior commit's focus fix).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(data-grid): col.multiSelect() + col.tagSelect() column shortcuts",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T12:29:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7f8e650a3918a08b7de7ed64774e85c3700cf7ba",
"body": "Previously afterGuiAttached only click()-ed the trigger to auto-open the\ndropdown. Focus stayed on the AG Grid cell wrapper, so the trigger's\n@keydown (ArrowUp/ArrowDown navigation, Enter commit) never fired —\narrow keys bubbled to the document and SCROLLED THE PAGE instead of\nmoving through the opt\n[…]\n focus on\nthe inline <input> whose own @keydown delegates to the same handler —\nsearch-mode keyboard navigation continues to work.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(data-grid): CoarSelectCellEditor focuses trigger on afterGuiAttached",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T12:28:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5ae99869d1421d34d50943421a7d928bbd36dec5",
"body": "…m/accept hooks\n\nNew @cocoar/vue-ui component for 2FA / TOTP / SMS / claim codes. N cells\n(default 6), auto-advance on type, Backspace-jump-back-and-clear on empty\ncell, paste-spread across cells starting at the focused position. Fires\n`complete(value)` once the last cell fills so consumers can auto\n[…]\nValidation, Sizes). Sidebar entry under Form Controls.\n\nShips in v2.0.0 alongside the calendar Phase-4 + Timeline + WorkWeek push.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(ui): CoarOtpInput — N-cell verification code input with transfor…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T11:37:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b049efd1c0e3968bcfce7a84c241e467af4e9f54",
"body": "Major version bump signals the surface delta — the C8 recurrence\npipeline lands end-to-end, three previously-reserved view IDs\n(`workWeek`, `timeline`) become real components, and the event-\ninteraction surface picks up hover handlers for popover wiring.\nNone of the new shapes are strictly breaking \n[…]\neader. Companion `.local/RELEASE-v2.0.0.md`\n(playground / release-notes brief, gitignored per project convention)\nalready renamed.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(changelog): bump 1.19.0 → 2.0.0",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T11:17:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d9c932c7da5ce10f9ba91348daf890ed6ba4dfb7",
"body": "Mirrors two playground demos into the VitePress docs so external\nreaders see real working examples without spinning up the\nplayground (which isn't deployed):\n\n - apps/docs/components/calendar/demos/CalendarPopover.vue — full\n onEventHover + useOverlay() integration with a consumer-defined\n po\n[…]\naviour AND the\nexact wire-up code in one place.\n\nDocs build clean (~80s). The popover section also surfaces in the\nright-side TOC.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(calendar): live popover + timeline demos in VitePress",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T11:14:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b7c0fd08fe06e690f682520b5ad216e89e2bfd1b",
"body": "`components/overlay/index.ts` re-exports `popoverPreset`,\n`datepickerPreset`, `subFlyoutPreset`, `contextMenuPreset`, and\n`sidebarFlyoutPreset` alongside the seven that made it into the\npublic `packages/ui/src/index.ts` (`tooltipPreset`, `modalPreset`,\n`menuPreset`, `selectPreset`, `hoverMenuPreset`\n[…]\nhapes would hit the same gap.\n\nAll five presets are non-leaking primitive constants — same\ncontract as the seven already exported.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(ui): expose popoverPreset + 4 sibling presets from public barrel",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T11:09:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a25e3d10ed2f7d2b8ff0688f699ab55acf18a9d0",
"body": "Fires on pointerenter / pointerleave over any event element across\nall five views (day / week / workWeek / month / agenda / timeline).\nPayload mirrors onEventClick: { event, native: PointerEvent }. The\nDOM event's currentTarget is the event-element node — passed\ndirectly as anchor to useOverlay() fr\n[…]\n with the new handlers + payload\nshape; CHANGELOG entry explains the design choice.\n\n670 tests still pass, typecheck + lint clean.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(calendar): onEventHover / onEventHoverLeave handlers",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T11:01:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "38ec8a4e295db2b9ba2ee88378983b9f70d57912",
"body": "Default rowHeight=32 produced 24px-tall bars (~75% of row) — too\nchunky for a Gantt-style read. Bar now occupies the centre 50% of\nthe row vertically: top padding = 25%, bar height = 50%, scaling\nwith `timelineRowHeight` (32px row → 16px bar / 8px padding above\nand below; 48px row → 24px bar / 12px \n[…]\nday-grid background reads through cleanly. Future\noverlapping-bars-on-the-same-row (Phase-5 hierarchy) gets visual\nbreathing room.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "style(calendar): slimmer timeline bars (50% of row height)",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T10:54:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cf79493343a87b39afc02c6621e4c5fbe9418ff9",
"body": "Adds vertical row virtualization to <CoarTimelineView>: only rows\ninside the viewport plus an 8-row buffer render to DOM. Uniform\nrowHeight makes the visible-range math O(1) (floor(scrollTop /\nrowHeight) ± buffer), so a 1000-task project plan costs ~30-40 DOM\nrows worth of nodes regardless of total \n[…]\nChrome-MCP profile lock prevented live browser verification\nthis round — manual smoke-test on /calendar-timeline-perf\nrecommended.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "perf(calendar): timeline row virtualization + 1000-task perf demo",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T10:49:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "97d39ca5bdc081d5f5ad36d1f92d17c69751bcf3",
"body": "Adds the `'timeline'` view as a peer of day/week/workWeek/month/agenda\n— one-row-per-logical-event horizontal time-axis layout for project-\nplan rendering. Same `CalendarEvent` data as the other views, just\nlaid out as bars on a date axis instead of a calendar grid.\n\nRecurring series collapse to a s\n[…]\n full visible range. Dedicated docs page at\n/components/calendar/timeline-view + sidebar entry; CHANGELOG +\nrelease notes updated.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(calendar): timeline view (Gantt-lite) with grouped recurring series",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T08:47:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "32ba65c21cc3240ae77c419c3cb4a8442be284ff",
"body": "Wires the C8 recurrence pipeline that has shipped as a typed\nthrowing-stub since 1.16.0. `builder.series(...)` /\n`builder.seriesLoader(...)` mirror the events pair and compose with\nit via the merged `getVisibleEvents()`. Engine adapter pattern with\none bundled `rrule-temporal` adapter at the\n`@cocoa\n[…]\ncs page for\nwork-week-view; updated coar-calendar.md with recurring-events\nsection; new playground demo at `/calendar-recurrence`.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(calendar): recurrence engine (RFC 5545 RRULE) + work-week view",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-12T08:01:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e434b70a01f78043ccfd641a73aa81da479eadba",
"body": "Cell-editor suite for the data grid — text, number, select, checkbox columns\nwith shared configurator-callback pattern, AG Grid Tab-through-edit-mode\nnavigation, and unified cellValueChanged commit hook. Plus two fixes\n(CoarNumberInput clear-button visibility, CoarSelectCellEditor option commit).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(release): v1.18.0",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-10T17:36:35Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0e63e9f2b56433adc918b2177c298e0f4ba5da58",
"body": "…opped value)\n\nThe previous version appeared to work in synthetic JS tests but failed under\nreal user clicks. Mousedown on a body-teleported dropdown option shifted\nfocus away from the editor, AG Grid's stopEditingWhenCellsLoseFocus fired\nbefore CoarSelect's option-click handler ran, and getValue() \n[…]\nk() bypasses real focus/blur flow. Mouse-event-driven\nedit-mode editors need real-user verification, not just programmatic clicks.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(data-grid): CoarSelectCellEditor commits selected option (was: dr…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-10T15:01:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9d347581a3c245e33ed3a8e64983e4b93081add4",
"body": "…ditor\n\ncol.select(field, s => s.options(…).clearable().searchable()) bundles a\nread-only label-lookup renderer + interactive CoarSelect editor. Selecting\nan option auto-commits via watch+stopEditing — picking a value IS the edit,\nno separate Tab/Enter needed for mouse users. Keyboard users still ge\n[…]\n-commit,\npredicate gating, search filter, Down+Enter selection, Escape cancel,\nTab-through editable select columns, console clean.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(data-grid): col.select() column shortcut with CoarSelect-based e…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-10T14:51:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f9a728380d29ebc9310dea59a55dca22546af690",
"body": "…n clearable=false\n\nThe .coar-number-input-clear--hidden modifier (opacity: 0) was outranked by\nthe focused/hover overrides (opacity: 1, higher specificity), so the X\nappeared even with clearable=false on focused inputs. Fix by adding\n:not(.coar-number-input-clear--hidden) to the focused/hover rules\n[…]\nrTextInput) since the\nclear button sits to the LEFT of the input — display-based hiding would\nshift the input on appear/disappear.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(ui): CoarNumberInput clear button no longer surfaces on focus whe…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-10T14:34:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "66daafa81fd019941c4f20f780b89edf56554c56",
"body": "Coar-styled in-cell editing via three column shortcuts that share a\nconfigurator-callback pattern, AG Grid's Tab-through-edit-mode navigation,\nand cellValueChanged-based commit:\n\n- col.text(field, t => t.placeholder(…).maxLength(…)) — CoarTextInput editor\n- col.number(field, n => n.decimals(…).min(…\n[…]\nd for cell context (form-vs-cell layout assumptions).\n\nNew \"Data Grid\" sidebar section: Overview, Editing, Text, Number, Checkbox.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(data-grid): cell editor suite — text, number, checkbox columns",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-10T14:34:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e6153b25e27519493002b15a5774bba930b4b596",
"body": "Calendar is shipped but the surface is still settling — recurrence\nengine is a typed throwing-stub (Phase 4 backlog), some sub-views\n(MonthView pill / bar custom renderers) are still in flux, and we've\njust landed two latent-bug fixes (canDrop displayZone forwarding,\nuseViewWindow `{view}` override)\n[…]\nsage as markdown-editor.md.\n\nDoc-only change. Caught by the new `paths-ignore: apps/docs/**`\nrule — CI is skipped for this commit.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(calendar): mark as Preview",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-09T09:52:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0b6b364cc3144d5e5499fc5baa0a9420dc467400",
"body": "Add `paths-ignore` to ci-develop and ci-pr-validation:\n- `*.md` (root-only) — README.md, CHANGELOG.md and similar at the repo\n root carry no code impact\n- `apps/docs/**` — the VitePress site is deployed by the separate\n manual `cd-deploy-docs.yml` workflow, not by CI\n\nMixed commits (docs + code) s\n[…]\n.md` (no `**/`) pattern matches root-level only — they're rare\nto update and a stray code change near them shouldn't slip through.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: skip CI runs for docs-only changes",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-09T09:44:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8033abb8966d6548fd56c265c8ba65b69d58317d",
"body": "The patch-level entry no longer fits the scope: alongside the original\nmarkdown-editor v-model fix and the vue-router peer-range widening, the\nrelease also lands three additive calendar features (DnD composables\ngeneric over TMeta, useViewWindow `{view}` override, canDrop validators\nreceive displayZ\n[…]\nTagline updated to \"Calendar genericized over TMeta, latent bugs swept,\nCI hardened\".\n\nNo code changes — pure changelog reframing.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(changelog): retitle 1.16.1 → 1.17.0 and document calendar work",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-09T09:06:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "29789f2cb3749b47520537e4ec5587ca07e64bfc",
"body": "Test-file overrides (eslint.config.js):\n- `vue/one-component-per-file` off in *.test.ts / *.spec.ts /\n __tests__/**: tests routinely declare multiple `defineComponent({...})`\n harnesses (mount wrapper, slot stub, parent-child pairing) — that's\n the standard Vue test pattern, not a code smell.\n- `\n[…]\n.ts` and `vScrollbar.test.ts` —\n the global override covers them.\n\nLint passes with 0 errors and 0 warnings across the workspace.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(lint): zero warnings — disable rules where they fight semantics",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-09T08:06:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "56a8a04337e103f3c5f2fe3b027e39d01fedecad",
"body": "Background: vite-plugin-dts logs TS errors during build but does not\nfail the run. The CI was therefore green despite 144 type errors in\nthe packages — many were silent runtime bugs (e.g. CoarMonthView /\nCoarAgendaView relied on a `useViewWindow(builder, { view })` 2nd\nargument that never wired thro\n[…]\n and ignored.\n- Across-the-board: 0 TS errors workspace-wide, 0 lint errors,\n 19/19 turbo tasks pass (~2265 unit tests + 59 E2E).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(types): zero TypeScript errors workspace-wide + harden CI",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-09T07:33:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "81ad4281e28379beec60ee5b6899d72f9dcd8412",
"body": "External v-model updates that arrived before Milkdown finished its async\ninit were silently dropped — the watcher bailed when getInstance() was\nnull and the missed value was never replayed, so the editor kept showing\nthe placeholder and a save round-tripped that placeholder back to the\nconsumer. The\n[…]\nocs\n and apps/playground were on ^0.54.0 while script-editor's peer\n demanded ^0.55.1, so the lockfile carried both side-by-side\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(markdown-editor): buffer external v-model updates during init",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-09T05:51:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "54c5bbad5d4d0ee557d0701a20e5445a5301ade2",
"body": "…lanations",
"is_bot": false,
"headline": "docs(calendar): add architecture invariants section with detailed exp…",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-07T16:17:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5cbd168e18c4aa3aea8a7b2348e49c8f0e39d55c",
"body": "feat(calendar): add @cocoar/vue-calendar package",
"is_bot": false,
"headline": "Merge pull request #6 from cocoar-dev/feat/calendar",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-07T14:48:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a6bfefb9b027b985841a3a2b6a766fdd20e98795",
"body": "The `calendar-spike/` doc tree + the `apps/playground/e2e-perf/`\nPlaywright suite + the matching CI \"Calendar perf gate (Tier B)\"\nstep were leftover infrastructure from an internal validation phase.\nThey referenced playground routes (`/calendar-virtual-surface`,\n`/calendar-drag`, …) that were remove\n[…]\nludes a snippet showing how consumers can wire their own\nannouncement via `useA11yAnnouncer` until the lib-side fix lands.\n\n602 / 602 unit tests still green, calendar / docs / playground\nbuilds clean.",
"is_bot": false,
"headline": "chore(calendar): retire calendar-spike, add curated performance page",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-07T10:13:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "016527ec2711bcc6facb4842b7c6666fa9b9664b",
"body": "- Drop unused imports (`watch`, `todayInZone`, `RenderEvent`,\n `RenderDayHeader`, `EventDropPayload`, `isTimedEvent`,\n `buildDropPayload`, `DstResolutionError`, `vi`, `nextTick`).\n- Remove dead handler-forwarder block in `<CoarCalendar>` (six\n `onEventX` functions that were never wired into the t\n[…]\nrn` replaced it).\n\nNo runtime behaviour changes — all edits remove dead code, drop\nunused imports, or are pure style fixes. 602 / 602 unit tests still\ngreen; calendar / docs / playground builds clean.",
"is_bot": false,
"headline": "chore(calendar): fix CI lint errors",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-07T09:49:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b139b710d4a0ccfaa432de4e7f102df2e0fb8c6f",
"body": "Vue 3 calendar component built around Temporal. Day / Week / Month /\nAgenda views, a top-level <CoarCalendar> shell, and standalone\ncomposables (useDayView / useWeekView / useMonthView / useAgendaView)\nfor embedding a single view without the shell.\n\nPublic surface is Temporal.ZonedDateTime (timed) o\n[…]\npins every\nC1–C8 invariant.\n\nPost-launch backlog: recurrence engine (expandSeries throwing stub),\nCtrl+C / Ctrl+V copy-paste, \"+ N more\" overflow signal in MonthView,\npreemptive DST-gap visual marker.",
"is_bot": false,
"headline": "feat(calendar): add @cocoar/vue-calendar package",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-07T09:31:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "65db2505003f0afe252c0886d8f1bc0227fc5034",
"body": "feat(markdown): inline text color + editor↔viewer rendering parity",
"is_bot": false,
"headline": "Merge pull request #4 from cocoar-dev/feat/markdown-editor-text-color",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-01T21:21:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "958156a27da902fd760d068d40ec7bf8d9270895",
"body": "- @cocoar/docs needs @cocoar/vue-markdown{,-core,-editor} for the new\n MarkdownEditorTextColor demo (dynamic imports still need module\n resolution at vitepress build time).\n- textColor plugin bundle gets an explicit MilkdownPlugin[] type\n annotation so vue-tsc doesn't have to reach into the pnpm-virtualised\n @milkdown/ctx path to name the inferred return type.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(ci): add markdown peer deps to docs + annotate textColor type",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-01T21:00:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e7200ae44c0d6f66517d131ceded15bc922914de",
"body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(markdown-editor): expect 18 sidebar buttons (textColor added)",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-01T20:02:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "233e6566bcf7fcfd4776b980327f65c5c03adb2b",
"body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(markdown-editor): drop unused Ctx import in textColorMark",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-01T19:47:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5f490c9709a5288fd29cbe2b0eadcb0766e5911d",
"body": "Inline color marks round-trip as `<span style=\"color: …\">` through a\nshared whitelist sanitizer (hex / rgb / hsl / named); editor exposes a\npalette + custom-hex picker on the floating toolbar and sidebar via the\noverlay service. Shared block stylesheet now covers both viewer and\neditor PM-managed DOM through parallel `:where(...)` selectors so a\nmarkdown document renders identically in both.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(markdown): inline text color + editor↔viewer rendering parity",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-01T19:45:02Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "21ad2998ae224e3fec2bc795d82d1d6a94fde638",
"body": "feat(ui/sidebar): 4-sided layout + auto-scaling collapsed rail",
"is_bot": false,
"headline": "Merge pull request #3 from cocoar-dev/feat/sidebar-4-sides",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-01T11:16:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f37f0c7fdc1f5c52d430d1ef7395eda4f124ff4e",
"body": "CoarSidebar gains a `side` prop (`left | right | top | bottom`); horizontal\norientations lay items out in a row, scroll horizontally when overflowing,\nand derive flyout direction, tooltip placement, active-indicator border\nedge, and collapsed dimension (width vs. height) from the side. Collapsed\nrai\n[…]\nvTooltip` directive value type to allow falsy\n(`false | null | undefined`), matching the existing \"no tooltip\"\nruntime convention.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(ui/sidebar): 4-sided layout + auto-scaling collapsed rail",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-05-01T10:58:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3ebf2b458ceca826ee502aab5bc3d980a71bf638",
"body": "1.13.0 shipped the wrapper column with a latent bug: wrapped factory\ncolumns (tag / tree / date / number / currency / icon) were reading the\nwrapper's config instead of their own via\n`params.colDef.cellRendererParams.config`. Fixed in 9404837; this\ncommit records it under 1.13.1 Fixed.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(changelog): add 1.13.1 entry for wrapper column config-shadow fix",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-04-24T20:00:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "94048376acec31a5db508c56265995c006f5030d",
"body": "Factory-created renderers (tag, tree, date, number, currency, icon) all\nread their config via `params.colDef.cellRendererParams.config`. AG Grid\nhands the *outer* (wrapped) colDef to the renderer, so the inner was\nreading the wrapper's config instead of its own — losing variantMap,\nshowChildCount, d\n[…]\n option was still lost.\n\nNew probe test replicates the factory renderers' read path and asserts\nthe inner receives its own config.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(data-grid): inner renderer config was shadowed by wrapper config",
"author_name": "Bernhard Windisch",
"author_login": "windischb",
"committed_at": "2026-04-24T19:56:07Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 55,
"commits_last_year": 197,
"latest_release_at": "2026-07-17T14:06:09Z",
"latest_release_tag": "v2.17.1",
"releases_from_tags": false,
"days_since_last_push": 5,
"active_weeks_last_year": 21,
"days_since_latest_release": 5,
"mean_days_between_releases": 3.2
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 87,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"ecosystem": {
"packages": [
{
"name": "@cocoar/vue-ui",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"vue",
"vue3",
"component-library",
"design-system",
"ui",
"accessible",
"typescript"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@cocoar/vue-ui",
"is_deprecated": false,
"latest_version": "2.17.1",
"repository_url": "https://github.com/cocoar-dev/cocoar-ui-vue",
"versions_count": 67,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 3040,
"first_published_at": "2026-03-06T09:03:20.637000Z",
"latest_published_at": "2026-07-17T14:16:18.156000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@cocoar/vue-map",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"vue",
"vue3",
"map",
"leaflet",
"geo"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@cocoar/vue-map",
"is_deprecated": false,
"latest_version": "2.17.1",
"repository_url": "https://github.com/cocoar-dev/cocoar-ui-vue",
"versions_count": 7,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 779,
"first_published_at": "2026-06-30T12:45:47.928000Z",
"latest_published_at": "2026-07-17T14:15:57.412000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@cocoar/icons-cli",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"icons",
"cli",
"lucide",
"svg"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@cocoar/icons-cli",
"is_deprecated": false,
"latest_version": "2.17.1",
"repository_url": "https://github.com/cocoar-dev/cocoar-ui-vue",
"versions_count": 64,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 1907,
"first_published_at": "2026-03-22T14:06:02.716000Z",
"latest_published_at": "2026-07-17T14:15:52.566000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@cocoar/vue-mermaid",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"vue",
"vue3",
"mermaid",
"diagram"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@cocoar/vue-mermaid",
"is_deprecated": false,
"latest_version": "2.17.1",
"repository_url": "https://github.com/cocoar-dev/cocoar-ui-vue",
"versions_count": 5,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 614,
"first_published_at": "2026-07-01T14:47:20.375000Z",
"latest_published_at": "2026-07-17T14:16:10.212000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@cocoar/vue-calendar",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"vue",
"vue3",
"calendar",
"scheduler",
"agenda",
"events",
"recurrence",
"rrule",
"virtualization",
"temporal"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@cocoar/vue-calendar",
"is_deprecated": false,
"latest_version": "2.17.1",
"repository_url": "https://github.com/cocoar-dev/cocoar-ui-vue",
"versions_count": 27,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 1531,
"first_published_at": "2026-05-07T16:31:59.624000Z",
"latest_published_at": "2026-07-17T14:15:41.153000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@cocoar/vue-markdown",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"vue",
"vue3",
"markdown",
"viewer",
"renderer",
"registry"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@cocoar/vue-markdown",
"is_deprecated": false,
"latest_version": "2.17.1",
"repository_url": "https://github.com/cocoar-dev/cocoar-ui-vue",
"versions_count": 67,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 2500,
"first_published_at": "2026-03-06T09:03:17.611000Z",
"latest_published_at": "2026-07-17T14:16:07.839000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@cocoar/vue-data-grid",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"vue",
"vue3",
"data-grid",
"ag-grid",
"table"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@cocoar/vue-data-grid",
"is_deprecated": false,
"latest_version": "2.17.1",
"repository_url": "https://github.com/cocoar-dev/cocoar-ui-vue",
"versions_count": 67,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 2178,
"first_published_at": "2026-03-06T09:03:06.331000Z",
"latest_published_at": "2026-07-17T14:15:43.742000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@cocoar/vue-localization",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"vue",
"vue3",
"localization",
"i18n",
"l10n",
"timezone",
"intl"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@cocoar/vue-localization",
"is_deprecated": false,
"latest_version": "2.17.1",
"repository_url": "https://github.com/cocoar-dev/cocoar-ui-vue",
"versions_count": 67,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 3190,
"first_published_at": "2026-03-06T09:03:12.006000Z",
"latest_published_at": "2026-07-17T14:15:55.093000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
}
]
},
"popularity": {
"forks": 0,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0
},
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"demos"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"apps/playground/tsconfig.json",
"packages/calendar/tsconfig.json",
"packages/data-grid/tsconfig.json",
"packages/document-viewer/tsconfig.json",
"packages/file-explorer-core/tsconfig.json",
"packages/fragment-parser/tsconfig.json",
"packages/localization/tsconfig.json",
"packages/map/tsconfig.json",
"packages/markdown-core/tsconfig.json",
"packages/markdown-editor/tsconfig.json",
"packages/markdown-mermaid/tsconfig.json",
"packages/markdown/tsconfig.json",
"packages/mermaid/tsconfig.json",
"packages/page-builder/tsconfig.json",
"packages/script-editor/tsconfig.json",
"packages/ui/tsconfig.json"
],
"toolchain_manifests": [],
"largest_source_bytes": 55549,
"source_files_sampled": 574,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"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": "@cocoar/vue-calendar",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-data-grid",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-document-viewer",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-file-explorer-core",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-fragment-parser",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-localization",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-markdown",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-markdown-core",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-markdown-editor",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-markdown-mermaid",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-mermaid",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-map",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-page-builder",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-script-editor",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-ui",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@dagrejs/dagre",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "^3.0.0"
},
{
"name": "@js-temporal/polyfill",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "^0.5.1"
},
{
"name": "@vue-flow/background",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "^1.3.2"
},
{
"name": "@vue-flow/controls",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "^1.1.3"
},
{
"name": "@vue-flow/core",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "^1.48.2"
},
{
"name": "@vue-flow/node-resizer",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "^1.5.1"
},
{
"name": "monaco-editor",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "^0.55.1"
},
{
"name": "pdfjs-dist",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "^5.7.0"
},
{
"name": "vue",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "^3.5.32"
},
{
"name": "vue-router",
"manifest": "apps/playground/package.json",
"ecosystem": "npm",
"version_constraint": "^5.0.4"
},
{
"name": "@js-temporal/polyfill",
"manifest": "packages/calendar/package.json",
"ecosystem": "npm",
"version_constraint": "^0.5.1"
},
{
"name": "rrule-temporal",
"manifest": "packages/calendar/package.json",
"ecosystem": "npm",
"version_constraint": "~1.5.3"
},
{
"name": "ag-grid-community",
"manifest": "packages/data-grid/package.json",
"ecosystem": "npm",
"version_constraint": "35.0.0"
},
{
"name": "ag-grid-vue3",
"manifest": "packages/data-grid/package.json",
"ecosystem": "npm",
"version_constraint": "35.0.0"
},
{
"name": "path-to-regexp",
"manifest": "packages/fragment-parser/package.json",
"ecosystem": "npm",
"version_constraint": "^8.4.2"
},
{
"name": "leaflet",
"manifest": "packages/map/package.json",
"ecosystem": "npm",
"version_constraint": "^1.9.4"
},
{
"name": "unified",
"manifest": "packages/markdown-core/package.json",
"ecosystem": "npm",
"version_constraint": "^11.0.5"
},
{
"name": "remark-parse",
"manifest": "packages/markdown-core/package.json",
"ecosystem": "npm",
"version_constraint": "^11.0.0"
},
{
"name": "remark-stringify",
"manifest": "packages/markdown-core/package.json",
"ecosystem": "npm",
"version_constraint": "^11.0.0"
},
{
"name": "remark-gfm",
"manifest": "packages/markdown-core/package.json",
"ecosystem": "npm",
"version_constraint": "^4.0.1"
},
{
"name": "remark-frontmatter",
"manifest": "packages/markdown-core/package.json",
"ecosystem": "npm",
"version_constraint": "^5.0.0"
},
{
"name": "yaml",
"manifest": "packages/markdown-core/package.json",
"ecosystem": "npm",
"version_constraint": "^2.8.0"
},
{
"name": "unified",
"manifest": "packages/markdown-editor/package.json",
"ecosystem": "npm",
"version_constraint": "^11.0.5"
},
{
"name": "@milkdown/core",
"manifest": "packages/markdown-editor/package.json",
"ecosystem": "npm",
"version_constraint": "^7.20.0"
},
{
"name": "@milkdown/ctx",
"manifest": "packages/markdown-editor/package.json",
"ecosystem": "npm",
"version_constraint": "^7.20.0"
},
{
"name": "@milkdown/kit",
"manifest": "packages/markdown-editor/package.json",
"ecosystem": "npm",
"version_constraint": "^7.20.0"
},
{
"name": "@milkdown/plugin-clipboard",
"manifest": "packages/markdown-editor/package.json",
"ecosystem": "npm",
"version_constraint": "^7.20.0"
},
{
"name": "@milkdown/plugin-history",
"manifest": "packages/markdown-editor/package.json",
"ecosystem": "npm",
"version_constraint": "^7.20.0"
},
{
"name": "@milkdown/plugin-listener",
"manifest": "packages/markdown-editor/package.json",
"ecosystem": "npm",
"version_constraint": "^7.20.0"
},
{
"name": "@milkdown/preset-commonmark",
"manifest": "packages/markdown-editor/package.json",
"ecosystem": "npm",
"version_constraint": "^7.20.0"
},
{
"name": "@milkdown/preset-gfm",
"manifest": "packages/markdown-editor/package.json",
"ecosystem": "npm",
"version_constraint": "^7.20.0"
},
{
"name": "remark-frontmatter",
"manifest": "packages/markdown-editor/package.json",
"ecosystem": "npm",
"version_constraint": "^5.0.0"
},
{
"name": "@milkdown/prose",
"manifest": "packages/markdown-editor/package.json",
"ecosystem": "npm",
"version_constraint": "^7.20.0"
},
{
"name": "@milkdown/utils",
"manifest": "packages/markdown-editor/package.json",
"ecosystem": "npm",
"version_constraint": "^7.20.0"
},
{
"name": "@milkdown/vue",
"manifest": "packages/markdown-editor/package.json",
"ecosystem": "npm",
"version_constraint": "^7.20.0"
},
{
"name": "@cocoar/vue-mermaid",
"manifest": "packages/markdown-mermaid/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@cocoar/vue-markdown-core",
"manifest": "packages/markdown/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "mermaid",
"manifest": "packages/mermaid/package.json",
"ecosystem": "npm",
"version_constraint": "^11.4.0"
},
{
"name": "@js-temporal/polyfill",
"manifest": "packages/page-builder/package.json",
"ecosystem": "npm",
"version_constraint": "^0.5.1"
},
{
"name": "@cocoar/vue-localization",
"manifest": "packages/ui/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@fontsource/cascadia-code",
"manifest": "packages/ui/package.json",
"ecosystem": "npm",
"version_constraint": "^5.2.3"
},
{
"name": "@fontsource/inter",
"manifest": "packages/ui/package.json",
"ecosystem": "npm",
"version_constraint": "^5.2.8"
},
{
"name": "@fontsource/poppins",
"manifest": "packages/ui/package.json",
"ecosystem": "npm",
"version_constraint": "^5.2.7"
},
{
"name": "@js-temporal/polyfill",
"manifest": "packages/ui/package.json",
"ecosystem": "npm",
"version_constraint": "^0.5.1"
},
{
"name": "@maskito/core",
"manifest": "packages/ui/package.json",
"ecosystem": "npm",
"version_constraint": "^5.2.2"
},
{
"name": "@maskito/kit",
"manifest": "packages/ui/package.json",
"ecosystem": "npm",
"version_constraint": "^5.2.2"
},
{
"name": "@maskito/vue",
"manifest": "packages/ui/package.json",
"ecosystem": "npm",
"version_constraint": "^5.2.2"
},
{
"name": "prismjs",
"manifest": "packages/ui/package.json",
"ecosystem": "npm",
"version_constraint": "^1.30.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": 0,
"merged_prs": 25,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 2
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "windischb",
"commits": 197,
"avatar_url": "https://avatars.githubusercontent.com/u/6182311?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"cd-deploy-docs.yml",
"cd-deploy-prerelease.yml",
"cd-deploy-stable.yml",
"ci-develop.yml",
"ci-pr-validation.yml"
],
"has_docs_dir": false,
"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": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 10,
"reason": "15 out of 15 merged PRs checked by a CI test -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"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": 10,
"reason": "project is 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": 10,
"reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 10,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 7,
"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": "41 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "4dcaf725309b436a1f2b0f0f190da29795ab2334",
"ran_at": "2026-07-22T18:48:59Z",
"aggregate_score": 5,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": true,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-17T14:33:09Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-17T14:25:28Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/cocoar-dev/cocoar-ui-vue",
"host": "github.com",
"name": "cocoar-ui-vue",
"owner": "cocoar-dev"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 63,
"inputs": {
"security": 50,
"vitality": 87,
"community": 50,
"governance": 51,
"engineering": 74
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 87,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 78,
"inputs": {
"commits_last_year": 197,
"human_commit_share": 1,
"days_since_last_push": 5,
"active_weeks_last_year": 21
},
"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": "21/52 weeks with commits",
"points": 14.5,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 21
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "197 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 197
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"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": 55,
"latest_release_tag": "v2.17.1",
"releases_from_tags": false,
"days_since_latest_release": 5,
"mean_days_between_releases": 3.2
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "55 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 55
}
}
],
"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 ~3.2 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 3.2
}
}
],
"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": "moderate",
"name": "Community & Adoption",
"value": 50,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "excellent",
"name": "Community health",
"note": null,
"notes": [],
"value": 92,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": true,
"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 (Apache-2.0)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "Apache-2.0"
}
}
],
"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": 13.5,
"status": "met",
"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": "good",
"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": 70,
"inputs": {
"packages": [
"@cocoar/vue-ui",
"@cocoar/vue-map",
"@cocoar/icons-cli",
"@cocoar/vue-mermaid",
"@cocoar/vue-calendar",
"@cocoar/vue-markdown",
"@cocoar/vue-data-grid",
"@cocoar/vue-localization"
],
"dependents": null,
"ecosystems": "npm",
"total_downloads": null,
"monthly_downloads": 15739
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "15,739 downloads/month across npm",
"points": 56,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 15739,
"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": 51,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 13,
"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 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "moderate",
"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": 66,
"inputs": {
"merged_prs": 25,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 2
},
"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": "25/27 decided PRs merged",
"points": 35.4,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 25,
"decided": 27
}
}
],
"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": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 43,
"inputs": {
"followers": 1,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "cocoar-dev",
"public_repos": 14,
"account_age_days": 456
},
"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": "1 followers of cocoar-dev",
"points": 2.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 1,
"login": "cocoar-dev"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "14 public repos, account ~1 yr old",
"points": 11.1,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 14
}
},
{
"code": "account_age_years",
"params": {
"years": 1
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"@cocoar/vue-ui",
"@cocoar/vue-map",
"@cocoar/icons-cli",
"@cocoar/vue-mermaid",
"@cocoar/vue-calendar",
"@cocoar/vue-markdown",
"@cocoar/vue-data-grid",
"@cocoar/vue-localization"
],
"ecosystems": "npm",
"any_deprecated": false,
"min_days_since_publish": 5
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "8 package(s) on npm",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 8,
"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": "67 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 67
}
}
],
"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": "good",
"name": "Engineering Quality",
"value": 74,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "excellent",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 90,
"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": "15 out of 15 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": false,
"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": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 50,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 50,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 5
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "15 out of 15 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"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 fuzzed",
"points": 5,
"status": "met",
"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": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 5.2,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "41 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": 2
},
"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": "moderate",
"name": "AI Readiness",
"value": 59,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": 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": 64,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"pnpm-lock.yaml"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [
"apps/playground/tsconfig.json",
"packages/calendar/tsconfig.json",
"packages/data-grid/tsconfig.json",
"packages/document-viewer/tsconfig.json",
"packages/file-explorer-core/tsconfig.json",
"packages/fragment-parser/tsconfig.json",
"packages/localization/tsconfig.json",
"packages/map/tsconfig.json",
"packages/markdown-core/tsconfig.json",
"packages/markdown-editor/tsconfig.json",
"packages/markdown-mermaid/tsconfig.json",
"packages/markdown/tsconfig.json",
"packages/mermaid/tsconfig.json",
"packages/page-builder/tsconfig.json",
"packages/script-editor/tsconfig.json",
"packages/ui/tsconfig.json"
],
"agent_commit_share": 0.91,
"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": "apps/playground/tsconfig.json, packages/calendar/tsconfig.json, packages/data-grid/tsconfig.json, packages/document-viewer/tsconfig.json, packages/file-explorer-core/tsconfig.json, packages/fragment-parser/tsconfig.json, packages/localization/tsconfig.json, packages/map/tsconfig.json, packages/markdown-core/tsconfig.json, packages/markdown-editor/tsconfig.json, packages/markdown-mermaid/tsconfig.json, packages/markdown/tsconfig.json, packages/mermaid/tsconfig.json, packages/page-builder/tsconfig.json, packages/script-editor/tsconfig.json, packages/ui/tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "apps/playground/tsconfig.json, packages/calendar/tsconfig.json, packages/data-grid/tsconfig.json, packages/document-viewer/tsconfig.json, packages/file-explorer-core/tsconfig.json, packages/fragment-parser/tsconfig.json, packages/localization/tsconfig.json, packages/map/tsconfig.json, packages/markdown-core/tsconfig.json, packages/markdown-editor/tsconfig.json, packages/markdown-mermaid/tsconfig.json, packages/markdown/tsconfig.json, packages/mermaid/tsconfig.json, packages/page-builder/tsconfig.json, packages/script-editor/tsconfig.json, packages/ui/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": "91 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 91,
"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": 100,
"inputs": {
"primary_language": "TypeScript",
"largest_source_bytes": 55549,
"source_files_sampled": 574,
"oversized_source_files": 0
},
"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": "0/574 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 574,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"demos"
],
"has_mcp_signal": false,
"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": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "demos",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "demos"
}
}
],
"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": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"deps.dev does not index npm:@cocoar/vue-ui@2.17.1; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-07-22T18:49:11.562982Z",
"schema_version": "0.26.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/cocoar-dev/cocoar-ui-vue.svg",
"full_name": "cocoar-dev/cocoar-ui-vue",
"license_state": "standard",
"license_spdx": "Apache-2.0"
}