alias with direct `model.$.\u003cfield>`\naccess everywhere it was declared:\n\n- example code: mcp-credit-application (core-v20, renderer-react-v20)\n and complex-multy-step-form (validation, render-schema)\n- doc examples: renderer-react docs/llms/* (+ regenerated llms\n[…]\n`item` (e.g.\naddressFields' `m: FormModel\u003cAddress>` accessed as `m.$.x`) are left\nas-is — they are not the alias. The plan doc discussing the idiom is\nintentionally untouched.\n\ntsc -b and eslint pass.", "is_bot": false, "headline": "refactor: inline model.$ and drop the `const m = model. AlexandrBukhtatyy/ReFormer — índice de salud 62/100, Moderado — inspect.software alias", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-11T00:09:57Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "db2d7ab7cec86d4813816a494981ad67567db07c", "body": "Accumulated dev-plan files under docs/plans/ (untracked until now).", "is_bot": false, "headline": "chore(docs): add planning documents", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-10T23:25:29Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "bfdaa5aab0618c79512674790a40f81fcff5af29", "body": ".beads/.auto-import-issues.jsonl is a per-machine import watermark\n(size+mtime of issues.jsonl); it must not be tracked. Add it to\n.beads/.gitignore next to the other local-only sync-state files.", "is_bot": false, "headline": "chore: gitignore beads local auto-import watermark", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-10T23:25:03Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "ec1c589ec00cdf49af60de4cc6905ce82177e801", "body": "Clarify that beads changes reach git via `bd export -o .beads/issues.jsonl`\nplus a `chore(beads): sync issues jsonl` commit -- not `bd dolt push`, which\nonly pushes the embedded Dolt DB and leaves the git working tree unchanged.\nMirrored \"Beads sync\" section added to CLAUDE.md and AGENTS.md.", "is_bot": false, "headline": "docs: document beads git-sync process", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-10T23:16:07Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "3bd4805d73e46d9a66301847a88da0f7b433edd4", "body": null, "is_bot": false, "headline": "chore(beads): sync issues jsonl", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-10T22:55:35Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "106c615066a6e57256b69789f31ebeb07fd24cd9", "body": null, "is_bot": false, "headline": "bd: update sync.remote", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-10T22:44:01Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "5e2304f717160ef478cc44974a836acf052e849a", "body": "…alias\n\nModelApi.set: change signature Partial\u003cT> -> T and remove @deprecated.\n- rewrite JSDoc (full set; derived compute-targets untouched; patch for partial)\n- runtime unchanged: set/patch still share group.set merge; with a full T it\n writes every key while preserving the derived-field skip (F9)\n- fix form-model.test.ts: pass a complete CreditForm to set()\n- sync llms docs (28/29/03, mcp/05) + regenerated llms.txt; partial-payload\n example switched set -> patch\n\nCloses ReFormer-d8z", "is_bot": false, "headline": "refactor(reformer): require full value in model set, drop deprecated …", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-10T22:41:34Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "8bd809a0eead87f9ac2d8337aa08cf60430dfec3", "body": null, "is_bot": false, "headline": "chore(react-playground): remove async-select demo page", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-10T21:43:16Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "fc7c3d454390f4daad29125a111a8412c0c1bb09", "body": "model.\u003cgroup> now returns a full FormModel\u003cT[K]> (with .$ and ModelApi),\nsymmetric with array items — so group sub-schema helpers mirror the\narray-item form: (m: FormModel\u003cSub>) => m.$.field, called helper(model.group).\n\nAdditive: ModelValue's object branch becomes FormModel (a superset of the\nold v\n[…]\nty\n- examples: migrate group helpers in complex-multy-step-form schema/validation;\n inline/array bindings stay uniform as model.$.\u003cpath> / item.$.\u003cpath>\n- docs: JSDoc, docs/llms, reformer-doc (en+ru)", "is_bot": false, "headline": "feat(reformer): promote nested object groups to sub-models", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-10T21:02:33Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "bd4824cff924920100626eb7c3f2bd88e224d298", "body": "ui-kit imports RenderNodeComponent from @reformer/renderer-react, but the\nstackblitz:start chain built ui-kit first. On a clean StackBlitz clone\nrenderer-react/dist did not yet exist when vite-plugin-dts resolved ui-kit\ntypes, breaking the build and aborting the chain before playground started.\nReorder to the correct topological order:\ncore -> cdk -> renderer-react -> ui-kit -> renderer-json -> playground.", "is_bot": false, "headline": "fix(stackblitz): build renderer-react before ui-kit in start chain", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-10T14:45:41Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "7e19105f1f17ed8c99a2447c750ecf9742f94878", "body": null, "is_bot": false, "headline": "docs(reformer): restyle some parts", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-07T17:52:27Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "4be1a69d6ca01f08f3e86d30a95b318d4bb96324", "body": "Rewrite the Core docs section for @reformer/core v6 (m1 architecture:\ncreateModel + createForm + validateFormModel), removing legacy API\n(new FieldNode, form.controls, show/hide, omnibus number, path/validate).\n\n- restructure coreSidebar into a progressive onboarding path\n- add pages: core-concepts/model and patterns arrays, submit-and-reset, async-preload\n- split intro (philosophy) from packages/core (package hub)\n- mirror updated russian content into the i18n/ru locale slot", "is_bot": false, "headline": "docs(reformer): rewrite core documentation for m1 architecture", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-07T17:36:34Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "fd33999d19683f59f213ecd1108c2352cc3fc25b", "body": "Docs deploy has failed since the docs began importing @reformer/* live:\ndeploy-docs ran `npm run build -w reformer-doc` right after `npm ci` without\nbuilding the workspace packages first, so their `exports` (-> dist/) resolved\nto missing files (\"no valid target file was found\").\n\nBuild core/cdk/renderer-json/renderer-react/ui-kit before the docs build.", "is_bot": false, "headline": "fix(ci): build workspace packages before docs build", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-06T21:30:53Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "fa662aa322e88c76abc7eafd0c5b062b2005ad67", "body": "… capability recipes\n\nVariants = the component's configuration-forms (default + customizations),\ngrounded in the real API; Examples = capability/behavior recipes. Component\nstates (empty/filled/disabled/invalid) and styling are no longer Variants.\n\n- Select: single / grouped / custom-item (manual co\n[…]\ned\n forms (multi-select, indeterminate checkbox, branching wizard) recorded as TODO\n- harness: add touched flag (used by validation examples)\n- Add audit report documenting the forms-vs-recipes split", "is_bot": false, "headline": "feat(docs): recut component variants as functional forms, examples as…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-06T21:02:17Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "54e80acf527157eeb79fa84d7f03db5ce44a5c2c", "body": "…ev-warn\n\nThe structured { $locale, params } string form now resolves a $model(path)\nparam to a static snapshot (signalAt(path).peek() — current value at convert\ntime, no subscription) instead of passing the raw operator string to the\nformatter. Because the string path is non-reactive by design, it \n[…]\nthe reactive \u003cI18n> component for live model values.\n\nLiteral-only params are unaffected (same object reference, no warning).\nTests: snapshot value + warn assertion, no-warn for literals (54 passing).", "is_bot": false, "headline": "feat(renderer-json): snapshot $model in structured $locale params + d…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-06T20:05:51Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "a20e1067e3796f49f1c3d36493ca88a337833780", "body": "Two registry-resolved JSON-DSL markers plus a pluggable, dependency-free\nlocalization layer for @reformer/renderer-json.\n\nMarkers:\n- $fn(name): pass a registry-registered function to a component prop. Separate\n registry kind (reg.fn) with a callable assert + static cross-type validation\n (validate\n[…]\nson_schema gains fnNames/localeKeys. Docs: 02/03 updated, new\n08-i18n guide. Tests: operators, converter, validate, registry, locale-service,\nsignal-unwrap (52 passing). Full monorepo typecheck clean.", "is_bot": false, "headline": "feat(renderer-json): add $fn/$locale markers and flexible i18n system", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-06T18:34:45Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "3812e3ea8b73a05cd212adefafd5f23444fa14ed", "body": "- minimal mode: toolbar shows only Preview/Code tabs, canvas is\n edge-to-edge (no track gutter, border or resize handle); in minimal\n the preview theme follows the active site theme reactively\n- opt-in hint prop: info icon + hover tooltip at the toolbar right edge\n in any mode; tooltip width is b\n[…]\n never gets\n clipped by the panel overflow on narrow variants cards\n- variants cards now show the title only; the description is moved into\n the hint tooltip (hint falls back to variant description)", "is_bot": false, "headline": "feat(docs): add minimal preview mode and header hint tooltip", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-06T18:06:58Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "5704fa8265d3f92f2cedb95a898171612af510d4", "body": "Add an Info-icon button at the right of the ComponentDoc tab bar that\nreveals a hover/focus tooltip clarifying the difference: variants are\npreconfigured states of a component, examples are usage recipes in code.\nWired with useId + aria-describedby for accessibility.", "is_bot": false, "headline": "feat(docs): add info tooltip explaining variants vs examples tabs", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-05T19:11:30Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "b39945a6861dd0fc75be82ee2a5a7c1c71972f8a", "body": "…button\n\nThe chevron was a flex child of the trigger, so the pr-8 added for the\nclear button also pushed the chevron onto the clear button's right-8\nposition: both icons landed in the same 32-48px band and overlapped.\n\nPin the chevron with absolute right-3 (independent of padding), give the\ntrigger relative + pr-9 to reserve room for it, and widen the wrapper's\nclearable padding to pr-14. Result: value then clear then chevron, no overlap.", "is_bot": false, "headline": "fix(reformer-ui-kit): keep select chevron from overlapping the clear …", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-05T18:52:46Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "9238e1c84bd487dcea16665507d8e87086f72a97", "body": "Extract the preview panel from ApiExplorer into a reusable \u003cApiPreview>\n(toolbar with Preview/Code tabs + Dark/Background toggles, resizable\nthemed canvas, code view with per-flavor select, optional footer slot).\n\n- Variants and Examples now render \u003cApiPreview showFooter={false}> — the\n form-bound \n[…]\n to 1 at \u003c=996px); card\n drops its own border (the panel provides it); toolbar wraps in narrow\n cells; last panel section drops its bottom divider so a footerless\n panel has a clean rounded bottom.", "is_bot": false, "headline": "refactor(docs): reuse preview panel on variants and examples tabs", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-05T16:31:29Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "32ac4f46a2950af48a846c83e0b2cba085606d17", "body": "…ections\n\n- Таб API: ручка ресайзит тематизированную превью-поверхность (apiCanvas)\n внутри полноширинного трека — разделитель карточки остаётся непрерывным;\n ручка во всю высоту поверхности на правом крае, иконка GripVertical вместо\n полоски. Починен чекбокс-фон (перекрывался цветом темы).\n- Главная: грид пакетов перемещён вниз (после quick-start и фич).", "is_bot": false, "headline": "feat(docs): resizable preview canvas with grip handle; reorder home s…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-05T12:55:15Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "f54866f1a0ea1582055aaa0c732ea08968e4947d", "body": "…ponent docs\n\nПолная переработка сайта документации reformer-doc:\n\n- Главная: новый лендинг (hero, грид пакетов, quick-start, фичи).\n- Навигация: раздельные per-package сайдбары (Core/CDK/UI-Kit/Renderer/MCP)\n + Playground; боковая навигация показывает только активный раздел.\n- Landing-страницы для\n[…]\nворк демо-компонентов.\n- Контент: validation/behaviors/schemas/patterns переписаны с legacy\n path-API на M1 (обе локали ru/en).\n- Витрина Examples и очистка template-остатков; onBrokenLinks: 'throw'.", "is_bot": false, "headline": "feat(docs): reimagine site — per-package navigation + interactive com…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-05T10:59:58Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "9ec3beaff38151c4700a3231e82df29a38a5604d", "body": "Preview component now fills full available width and is left-aligned\n(was centered + capped at 520px). Add a drag handle on the canvas right\nedge to resize the container and check responsive behavior; a live width\nbadge shows during drag, double-click resets to 100%.", "is_bot": false, "headline": "feat(docs): resizable, left-aligned api preview canvas", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-05T09:57:57Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "4f63f8d7a421d1db39a2bf3cd552e06972a352a9", "body": "…ntainers", "is_bot": false, "headline": "style(react-playground): remove max-width constraints from example co…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T21:40:46Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "0e02e692105804a5b1b7bb7b1546021a35424603", "body": "Re-ran gen:form-schema after the generator change. componentOp is now an enum of\n$component(Name) values; node discrimination uses if/then/else (from the base schema).", "is_bot": false, "headline": "chore(react-playground): regenerate form meta-schema with component enum", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T20:59:57Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "db80f72165521c1a41958489796b70624e1379e7", "body": "…tern in meta-schema\n\nbuildFormSchemaMetaSchema now tightens $component(...) to an enum of exact values\n(\"$component(Input)\", …) rather than an alternation pattern.\n\n- ajv lists the allowed names in the error text instead of a regex mismatch\n- IDE autocompletes the enum values\n- no regex escaping of names (e.g. $fieldWrapper); escapeRe removed", "is_bot": false, "headline": "fix(reformer-renderer-json): emit component enum instead of regex pat…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T20:59:42Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "00f843d65b60163bd8d71b315c71f2cc0f7796af", "body": "- #94 core readme quick start rewritten to createModel + createForm({model,schema})\n- #95 doc site validation/behaviors pages use the m1 validator/behavior api\n- #96 top-level validation.md and behaviors.md reference real types/options\n- #97/#99 package readmes fixed (ui-kit no longer a cdk copy; renderer-react stub)", "is_bot": false, "headline": "docs: remove pre-m1 legacy api from guides and doc site", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T19:43:56Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "910b1b77ef4d8f91f3fbf6e84969d20798640a16", "body": "…oneof errors\n\n- #69 ajv oneOf errors condensed to the relevant node instead of a wall\n- #70 wrapper field on JsonFieldNode honored by the converter\n- #73 object-array items get a proper default when initialValue is omitted\n- #74 resolveDataSource enforces the dataSource type check\n- #98 add a real README; fix files field\n- + converter unit tests", "is_bot": false, "headline": "fix(reformer-renderer-json): converter wrapper/initialvalue; clearer …", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T19:43:28Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "6a55aa6c646d1e3944c6415cea8cd18fd13ee65d", "body": "…th exports\n\n- #68 error boundary around user field/container components\n- #63 memoized render nodes; per-node version instead of one global signal\n- #64 field renderer consumes only value+disabled; stable handlers\n- #66 movement aria-labels and button classes overridable via componentProps\n- #67 lifecycle helpers aligned (onInit/onDestroy)\n- #62 package.json drops unbuilt ./form-array and ./form-wizard exports\n- + first tests for the react renderer", "is_bot": false, "headline": "fix(reformer-renderer-react): error boundary, memo granularity, subpa…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T19:43:15Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "9686ff96c00cfe87d13553d0f9c532e046a7f355", "body": "- #81 add-form-array json guidance uses m1 operator dsl\n- #82 add-wizard b3 uses createRenderSchemaFromJsonM1 + m1 mount flow\n- #83/#87 plan-form marks credit fixtures as example; drops removed path-context\n- #85/#86 debug.md legacy applyWhen; clearWhenOff marked playground-local\n- #78/#79 find-recipe ranked matching + guarded topic arg\n- #77 report-issue guarded fs writes\n- + first tests for the mcp package (find-recipe, report-issue)", "is_bot": false, "headline": "fix(reformer-mcp): correct pre-m1 prompt drift; harden tools; add tests", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T19:43:02Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "92b03a8e9664cbc2eb52864a563e29aec1adf665", "body": "- #42 FormArray exposes errors/valid/invalid + FormArrayError subcomponent (barrel)\n- #43 disabled arrays disable Add/Remove buttons\n- #44 removeAt/at + reorder helpers on hook/context for api parity\n- #45 control prop admits ModelArrayNode without a cast\n- #48 FormField.Control asChild binds value/\n[…]\nge/onBlur/disabled\n- #54 FormField.Error keeps ref in multi/render modes\n- #49/#51 wizard step-change live-region; completedSteps invalidated on back\n- + headless unit tests for FormArray/Wizard/Field", "is_bot": false, "headline": "fix(reformer-cdk): surface array errors/disabled; wizard and field fixes", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T19:42:45Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "6dd1556f53adefcd24342d74bd9ef2ed80b772e2", "body": "…ut buffer\n\n- #105 Select forwards label/description/error/required ARIA to trigger\n- #56/#106 Checkbox associates label with input; drops dangling aria-labelledby\n- #107 RadioGroup gets role=radiogroup, shared name, aria wiring\n- #55 Number Input keeps a raw string buffer for decimals/intermediate \n[…]\nut\n- #58/#59 Select theming + surfaced resource-load errors\n- #110 loading/error/pending states announced via aria-live/role\n- #57 ./form-field subpath export points at a built file; + component tests", "is_bot": false, "headline": "fix(reformer-ui-kit): a11y for select/checkbox/radiogroup; number inp…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T19:39:52Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "4ce1754d64d7503408f507d1244f1107e26ec0f5", "body": "…eset/dispose leaks\n\n- #1 submit()/validate() run schema validators via bound validateFormModel\n- #2 GroupNode.reset() clears form-level errors\n- #4 ModelArrayNode disposes per-item forms on remove/clear/dispose\n- #14 schema-node asyncValidators executed by validate walk()\n- #9/#25 unmarkDerived ref\n[…]\n errors via FormErrorHandler, returns canceller\n- #17/#20/#21 validator message fallback, RegExp reuse, required empty array\n- #28 proxy escape-hatch; #5 array-node validate errors; + regression tests", "is_bot": false, "headline": "fix(reformer): enforce m1 schema validators in submit/validate; fix r…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T19:39:33Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "7e25e407b778a96325da57d173461e454d0f335d", "body": "Develop", "is_bot": false, "headline": "Merge pull request #37 from AlexandrBukhtatyy/develop", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T01:51:27Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "19cea4c4deed91104e1742612a33b55aac6497d3", "body": null, "is_bot": false, "headline": "Merge branch 'main' into develop", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T01:51:13Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "6f269aa08536e878e8d2277d3a873a3782e98343", "body": "…er into develop", "is_bot": false, "headline": "Merge branch 'develop' of https://github.com/AlexandrBukhtatyy/ReForm…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T01:47:54Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "0e19b873be3c0ff12409b93a298163144516ab15", "body": "Regenerate llms.txt across all packages so the generated API docs match the\ncommitted source. Two things fold in:\n\n- Package-relative `_Source: src/...` paths (the generator's current output;\n ui-kit was already committed this way, the others lagged in the old\n `packages/\u003cpkg>/src/...` format).\n- \n[…]\nps\n discriminated union, non-generic Select.\n\nAlso tighten the plan-form prompt's directory-layout bullet to reference the\n`{{target}}` layout instead of hard-coding the core-target lib/schema split.", "is_bot": false, "headline": "docs: regenerate llms.txt; make plan-form layout note target-aware", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T01:47:25Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "1147ab830604996881d99c4865572e825be9cee4", "body": "Set `.claude/settings.json` attribution.commit to empty so Claude Code no longer\nappends the `Co-Authored-By: Claude \u003cnoreply@anthropic.com>` trailer to commits.", "is_bot": false, "headline": "chore: remove claude co-author trailer from commit attribution", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T01:46:58Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "018e98c759ddbde092d34c5167116a9c07019e64", "body": "Small, independent fixes surfaced by the package typing review; each removes an\nunsafe cast, a dead branch, or a lax signature without weakening any type.\n\ncore:\n- FieldNode: `asyncResults.filter(Boolean) as ValidationError[]` -> a\n `(e): e is ValidationError => e !== null` type guard (drops the bl\n[…]\nkept `@deprecated Target` alias), add\n `REFORMER_TARGETS` const + `isReformerTarget` guard, and thread the named type\n through create-form/discover-context instead of bare string literals.\n\nRefs #32", "is_bot": false, "headline": "refactor: misc type-safety cleanups from typing review", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T00:51:13Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "36f16f7ae6d9f8c650d1a5e7ebacd7e031bbe736", "body": "Split the flat `InputProps` into a discriminated union on `type`:\n\n- `NumberInputProps` (`type: 'number'`) — `value?: number | null`,\n `onChange?: (v: number | null) => void`.\n- `TextInputProps` (all other types) — string value/onChange.\n- `InputProps = NumberInputProps | TextInputProps`.\n\nBefore, \n[…]\nprops.type` (non-\ndestructured) and forwards the rest via a single destructure that peels off\nvalue/onChange/type so they don't leak into `...nativeRest`. JSDoc casts dropped.\n\nNo new `any`.\n\nRefs #32", "is_bot": false, "headline": "refactor(reformer-ui-kit): discriminate input value/onchange by type", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T00:50:30Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "19e243de864084234b04e4641a869e46d24a1226", "body": "Remove generic parameters that gave only fake type-safety, and the casts they\nrequired.\n\n- ui-kit Select: `SelectProps\u003cT>` -> non-generic (`resource?: ResourceConfig\u003c\n unknown>`). T reached only `resource`, never value/onChange (always string|null),\n and forwardRef pinned it to `SelectProps\u003cany>` \n[…]\nas\n ConfigWithValue` property casts (kept together with createNode since the guard\n is what enables the cast removal).\n\nHonest `unknown` replaces fake generics; no new `any` (one removed).\n\nRefs #32", "is_bot": false, "headline": "refactor(reformer): drop phantom generics on select and node-factory", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T00:48:13Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "67915b36ae5374f33c60f1c347bc4cfefa29e88c", "body": "Validator/AsyncValidator typed the 2nd arg as `control: FormProxy\u003cTField>`, but\nFormProxy is the type of a GROUP and TField is a field's value type — expanding\nto a nonsensical `FormProxy\u003cnumber>`. And the M1 engine never passes form nodes\nthere at all: validateModel/validateFormModel/validateModelS\n[…]\ns fake safety, so this is not a regression:\nvalue/root are typed, the phantom node type is gone, no new casts. The 20 built-in\nvalidator factories only read `value`, so nothing else changes.\n\nRefs #32", "is_bot": false, "headline": "refactor(reformer): align validator contract with the m1 runtime", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T00:46:52Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "9a47d301edd6c8770c7b27f6ff71f74598920f5e", "body": "FieldControlState.componentProps and FieldNode's componentProps signal /\nupdateComponentProps were `Record\u003cstring, any>`, which silently disables type\nchecking on every read (`state.componentProps.foo.bar` type-checks with zero\nsafety). The runtime already builds this value as `Record\u003cstring, unknow\n[…]\nasts), and fix `UnknownRecord`\nto actually be `Record\u003cstring, unknown>` as its own JSDoc promised. Removes four\n`eslint-disable no-explicit-any`. Type-safety strictly improves; no new casts.\n\nRefs #32", "is_bot": false, "headline": "refactor(reformer): tighten componentprops record value type to unknown", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T00:46:34Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "3a526a002edcf1e3f8de9eca2ac50abb74e4b32e", "body": "FormModel.set and patch have identical implementations (both delegate to\nGroupNode.set, which merges only the keys present in the payload), but the docs\nclaimed set = \"mass replace (load from server)\" while patch = \"partial merge\".\nThat contract was a lie: set never replaced, it merged.\n\nFix the con\n[…]\nl.set({ ...model.get(),\n...data })` in the renderer-react-v20 example becomes `model.patch(data)`\n(equivalent, since patch already merges).\n\nNo runtime/behavior change; signatures unchanged.\n\nRefs #32", "is_bot": false, "headline": "refactor(reformer): deprecate modelapi.set as a merge-alias of patch", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T00:13:46Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "4ae7c6de35886c380531dfd7fea2cdffe64e62ad", "body": "…/object\n\nFormFields was `Record\u003cstring, FormValue>` — structurally identical to FormValue's\nown object branch (`{ [key: string]: FormValue }`), and it was marked\n`@deprecated @internal` yet leaked into public types. Rather than un-deprecate a\nduplicate, remove it and use its two real meanings direc\n[…]\n `\u003cT extends object>` makes the\n`control as ArrayNode\u003cFormFields>` cast in cdk useFormArray unnecessary — removed.\n\nBreaking only in that the deprecated/internal `FormFields` export is gone.\n\nRefs #32", "is_bot": false, "headline": "refactor(reformer): drop the formfields type; consolidate into record…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-04T00:06:36Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "986bfe95244524654fdc5b651661f12a234936c0", "body": "Second pass of the safe review findings (real bugs + type-correctness + hygiene),\nall verified: full typecheck (incl. cdk + mcp) green, all package tests pass.\n\nReal bug:\n- reformer-ui-kit inputs: add checked/defaultChecked (checkbox) and defaultValue\n (input/input-mask/input-password/textarea) to \n[…]\n validate-json-schema: type the dynamic import via\n `typeof import(...)` so contract drift is caught by the compiler.\n- reformer-mcp discover-context: guard JSON.parse('null') with `?? {}`.\n\nRefs #32", "is_bot": false, "headline": "fix: address the safe remaining minor findings from typing review", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-03T23:42:33Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "ce91fc3cf1370f218a5e72c016c6d49f5bfbf0ee", "body": "Real bugs and safety wins from the review (low blast radius):\n\n- reformer/validators/multipleOf: raw float modulo flagged legitimate decimal\n multiples (0.3 % 0.1 !== 0). Compare the remainder with an epsilon (+ test).\n- reformer-cdk/FormWizard.Progress: percent was NaN/Infinity when totalSteps=0.\n\n[…]\nd API decisions / wider blast radius): Record\u003cstring,any>->unknown\non public componentProps, X|unknown collapses, registry discriminated union,\nduplicate interface renames, phantom generics.\n\nRefs #32", "is_bot": false, "headline": "fix: address safe minor findings from typing review", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-03T23:21:58Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "46390df9eccfda196692a8edc243e93124f76818", "body": "…pecheck\n\nreformer-cdk was absent from the root `typecheck` script and had accumulated\n5 real type errors. Add it to the script and fix them:\n\n- 3 Context.Provider sites (FormArray / FormArrayList / FormWizard): a generic\n component providing `\u003cT>` to an `\u003cany>`-typed React context — FormProxy\u003cT> i\n[…]\n so\n add(initialValue: Partial\u003cT>) typechecks.\n- useFormArray: core useFormControl's array overload is narrowed to\n ArrayNode\u003cFormFields>; cast the ArrayNode\u003cT extends object> at the call.\n\nRefs #32", "is_bot": false, "headline": "fix(reformer-cdk): fix pre-existing type errors and gate cdk in ci ty…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-03T23:21:36Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "694a1d49395f0f67f510ace8eed1b9ad0a23be88", "body": "Each test fails on the pre-fix code:\n- useFormControl-rules-of-hooks: mocks React hooks and asserts undefined /\n field / array all call the same non-zero hook count (undefined used to be 0).\n- model-array-node-state: markAsUntouched/markAsPristine/disable now propagate\n to item forms (were no-ops).\n- date-age: calculateAge/minAge/maxAge return N (not N-1) on the exact birthday.\n\nRefs #32", "is_bot": false, "headline": "test(reformer): regression coverage for the major runtime fixes", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-03T23:21:19Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "e41d1c935bdc398f84633d0a9a41003553f5fc25", "body": "All six confirmed by adversarial verification in the packages typing review.\n\n- reformer/hooks/useFormControl: undefined branch called ZERO hooks while\n field/array called N — a Rules-of-Hooks crash on undefined\u003c->node toggle.\n Route undefined through the same hook sequence (useEmptyControl).\n- re\n[…]\n an\n Opaque-aware ModelArrayItem facade.\n- reformer-cdk/FormField.Error: rendered raw error.message, silently bypassing\n ValidationMessagesProvider. Resolve via useValidationErrorResolver.\n\nRefs #32", "is_bot": false, "headline": "fix: resolve 6 verified major findings from typing review", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-03T23:21:04Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "1302a32408286963214a1c401e575e09715a2d75", "body": "resolve.dedupe для react/react-dom/@radix-ui/@preact-signals-core против двух копий.\n\npackage-lock.json обновлён под перенос зависимостей в манифестах пакетов.\n\nRefs: #33", "is_bot": false, "headline": "chore(react-playground): dedupe singleton runtimes; sync lockfile", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-03T22:36:28Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "9446c94c8ee4488e32fa0b2562d198c93e507501", "body": "…encies\n\nRadix Select/Slot и lucide-react перенесены из peerDependencies в dependencies.\n\nДобавлен tslib как страховка от отката версии Radix; дубли из devDependencies убраны.\n\nЧинит Vite-ошибку \"Failed to resolve import tslib\" у потребителей.\n\nRefs: #33", "is_bot": false, "headline": "fix(reformer-ui-kit): move @radix-ui/*, lucide-react, tslib to depend…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-03T22:36:20Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "8c79d8106f31e19e32a8ab0dd0c3bd144a3d9cbe", "body": "…/signals\n\nУбран прямой (и необъявленный, phantom) импорт @preact/signals-core в 5 файлах core/.\n\nSignal/signal/effect/computed теперь берутся из @reformer/core/signals.\n\nГарантирует единую идентичность Signal через границу пакетов (value instanceof Signal).\n\nЧинит Vite-ошибку \"Failed to resolve import @preact/signals-core\".\n\nRefs: #33", "is_bot": false, "headline": "fix(reformer-renderer-react): resolve signals-core via @reformer/core…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-03T22:36:08Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "aed4d4bc99c86c3d0c91232e2a5e8d33089b11cb", "body": "… peer->dep\n\nНовый подпуть @reformer/core/signals реэкспортит Signal/signal/computed/effect/batch/untracked.\n\nДругие @reformer-пакеты берут рантайм через core: единый владелец, одна копия класса Signal.\n\n@preact/signals-core перенесён из peerDependencies в dependencies.\n\nRefs: #33", "is_bot": false, "headline": "feat(reformer): re-export signals runtime via ./signals; signals-core…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-03T22:35:56Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "227eddf75e9aa4fc9bbc2b2b722e6f1afd3c4408", "body": "…fault\n\nCalibrate the @reformer/mcp server (paper-listing + code-gen iterations), close the\ngaps it surfaced, and make a flat minimalist form layout the default.\n\nCalibration harness (docs/iter-prompts, docs/iter-summaries):\n- Paper-listing mode: orchestrator-md, sub-agent-md, form-listing template \n[…]\nvior; folders = scale-up\n- REFORMER_FORM_LAYOUT env var (minimalist|folders) steers the create-form prompt\n\nExamples: v20 credit-application forms (core / renderer-react / renderer-json) in new layout", "is_bot": false, "headline": "feat(reformer-mcp): calibrate guidance + minimalist form layout as de…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-03T19:23:37Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "daee2a57fd4a1d60f759f104e61265349c85e75f", "body": "Follow-up type cleanup for the M1 schema types.\n\n- Remove renderer-react `render-model.tsx` (RenderModelNode / RenderModelArray /\n ModelNode / ModelFieldNode / ModelContainerNode / ModelArrayControl /\n RenderModelArrayProps) and its test. It was a trimmed-down duplicate of\n RenderNodeComponent / \n[…]\ns (schema config) vs\n ContainerComponentProps (runtime props).\n\nFormSchema / ValidatorFn / FieldConfig are kept: they are the node foundation\n(GroupNode / FieldNode), not legacy duplicates.\n\nRefs #32", "is_bot": false, "headline": "refactor(reformer): remove legacy render-model, dedupe schema types", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-03T18:55:43Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "799fcef3c80ff3ba20a0e7becf58a711618ac620", "body": "CreateFormFromModelArgs.schema and validateModel/validateFormModel/\nvalidateModelSync were typed `unknown`. Introduce a public FormSchemaNode\nnode type: an open interface with typed known fields (value/component/\ncomponentProps/validators/children/array/item/when/…) plus an index\nsignature that admi\n[…]\nterface must inherit the index signature\nto stay assignable to it). `value` is polymorphic in core (Signal or, for\narrays, a signal-tree) and narrowed to Signal in the renderer node types.\n\nCloses #32", "is_bot": false, "headline": "feat(reformer): type unified m1 schema instead of unknown", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-03T18:38:56Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "f176d9687ef11fec7008626a17341cbaa0f635d1", "body": "Squash-merging release PRs collapses the whole branch into one commit that\ntouches every package and aggregates all commit messages (incl. BREAKING CHANGE)\nin its body, so semantic-release-monorepo majors all six packages at once.\nDocument merging via rebase (or merge commit) in release-and-publishing.md\n(new section + PR checklist item) and CONTRIBUTING.md. Squash is disabled at the\nrepository level.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com>", "is_bot": false, "headline": "docs: require rebase-merge over squash to keep per-package versioning", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-02T23:03:50Z", "body_truncated": false, "is_coding_agent": true }, { "oid": "08779398769b2889eeb14f06aaaeb933177334cf", "body": "* chore(react-playground): remove baseline clean mcp credit examples\n\nDrop the three mcp-credit-application-*-clean experiment pages and their\nnav/route entries in App.tsx.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com>\n\n* refactor(reformer)!: restore real proxy types and propagate schema root for \n[…]\nes kept in schema/. Update the create-form / plan-form hints and\nregenerate the mcp llms.txt.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com>", "is_bot": false, "headline": "Develop (#36)", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-02T20:06:24Z", "body_truncated": true, "is_coding_agent": true }, { "oid": "def71590271508404ba297efa71e50a5c5c1551c", "body": null, "is_bot": false, "headline": "Merge branch 'main' into develop", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-02T20:03:16Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "9c3d174618843d2238d675696e01ec1371dee4be", "body": "…/, co-located variant)\n\nRework 06-form-directory-layout.md so the module root stays lean — entry + index.ts\nplus three folders: lib/ (domain helpers), schema/ (form definition), components/.\nLift the renderer-json base component registry and generated DSL meta-schema to app\nlevel (src/renderer-json\n[…]\ned vs per-step co-located, with form-level\n(cross-step) rules kept in schema/. Update the create-form / plan-form hints and\nregenerate the mcp llms.txt.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com>", "is_bot": false, "headline": "docs(reformer-mcp): restructure directory-layout guide (schema/ + lib…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-02T19:47:33Z", "body_truncated": true, "is_coding_agent": true }, { "oid": "5104d74e5f9d98484d94c491c07f76800c6351e2", "body": "* chore(react-playground): remove baseline clean mcp credit examples\n\nDrop the three mcp-credit-application-*-clean experiment pages and their\nnav/route entries in App.tsx.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com>\n\n* refactor(reformer)!: restore real proxy types and propagate schema root for \n[…]\n layout hints to the create-form and\nplan-form prompt templates. Regenerate the mcp llms.txt.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com>", "is_bot": false, "headline": "Develop (#34)", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-02T17:13:00Z", "body_truncated": true, "is_coding_agent": true }, { "oid": "e26c6a97216bb415200163f749ec845e4066d1b0", "body": "New docs/llms/06-form-directory-layout.md documents how to organize a form's\nfiles for each render target (core, renderer-react, renderer-json): a shared\ncore (types/model/validation/behavior/api/utils) reused across targets, plus the\nper-target presentation layer. Generalized from a real multi-step\n[…]\nt-structure keeps\nresolving to the core-specific guide. Add layout hints to the create-form and\nplan-form prompt templates. Regenerate the mcp llms.txt.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com>", "is_bot": false, "headline": "feat(reformer-mcp): add cross-target form directory-layout guide", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-02T16:43:27Z", "body_truncated": true, "is_coding_agent": true }, { "oid": "e85d9857c192ee0894e5ef7437152e8bfe60e9ec", "body": "…source docs\n\nsymbols-parser only read src/index.ts, which is absent from installed packages\n(files = dist + llms.txt), so list_symbols/get_symbol_docs returned nothing for\nconsumers. Fall back to dist/*.d.ts when src is missing (src still preferred in\ndev). Verified against a dist-only package: cdk\n[…]\n FormSchema\u003cT>, top-level disabled\n (componentProps.disabled is ignored), and the model.get() reactivity gotcha in\n compute. Regenerate core llms.txt.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com>", "is_bot": false, "headline": "fix(reformer-mcp): index symbols from published dist/*.d.ts; align re…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-02T16:23:02Z", "body_truncated": true, "is_coding_agent": true }, { "oid": "e046813178c2279473fa531a313390180b41b9c5", "body": "Package docs must be self-contained and not point at projects/react-playground.\nRemove \"(monorepo example)\" pointers, examples/* paths, and the projects/... link\nfrom docs/llms across ui-kit, renderer-json, renderer-react, cdk and core, keeping\nthe generic API guidance intact. Regenerate the affected llms.txt files.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com>", "is_bot": false, "headline": "docs(packages): remove references to react-playground example code", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-02T16:22:21Z", "body_truncated": false, "is_coding_agent": true }, { "oid": "bad84cfb5ad763b3ed61d1f36b4bb3b01fa53b43", "body": "…I fixes (#29)\n\n* chore(react-playground): remove baseline clean mcp credit examples\n\nDrop the three mcp-credit-application-*-clean experiment pages and their\nnav/route entries in App.tsx.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com>\n\n* refactor(reformer)!: restore real proxy types and propagate \n[…]\nchain. Verified locally: clean build\ncore -> renderer-react -> renderer-json -> mcp = exit 0.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com>", "is_bot": false, "headline": "Promote develop → main: features, breaking registry changes, docs & C…", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-02T06:38:39Z", "body_truncated": true, "is_coding_agent": true }, { "oid": "930a1a93bf4e6f78c8cad96b6e9db1a96e3cd6da", "body": "# Conflicts:\n#\t.github/workflows/test.yml\n#\t.prettierignore\n#\tpackages/reformer-mcp/src/prompts/templates/add-behavior.md\n#\tpackages/reformer-mcp/src/prompts/templates/add-validation.md\n#\tpackages/reformer-mcp/src/prompts/templates/add-wizard.md", "is_bot": false, "headline": "Merge remote-tracking branch 'origin/main' into develop", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-02T06:31:26Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "b0bb057fd51c1ade6fb22351e74395eb4a8feb0f", "body": "mcp tsc imports @reformer/renderer-json/validate (validate_json_schema tool),\nso the release job failed at \"Build @reformer/mcp\" (TS2307) because mcp had\ndeps='' — renderer-json (and its own deps core + renderer-react) were not built\nfirst. Set mcp deps to the full chain. Verified locally: clean build\ncore -> renderer-react -> renderer-json -> mcp = exit 0.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com>", "is_bot": false, "headline": "fix(ci): build renderer-json chain before mcp in release matrix", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-02T00:05:47Z", "body_truncated": false, "is_coding_agent": true }, { "oid": "64f6678777675c072dd90774931ae1bfe354799a", "body": "The Typecheck step ran before the build steps, but in CI packages have no dist\nyet at that point, so dependents fail to resolve @reformer/core (TS2307). Moved\nthe step to the end, after all package builds emit their type declarations.\nVerified by simulating CI order locally (build all packages -> typecheck = 0).\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com>", "is_bot": false, "headline": "fix(ci): run typecheck after package builds so dist types resolve", "author_name": "Alexandr Bukhtatyy", "author_login": "AlexandrBukhtatyy", "committed_at": "2026-07-01T23:44:23Z", "body_truncated": false, "is_coding_agent": true } ], "releases_count": 100, "commits_last_year": 769, "latest_release_at": "2026-07-20T16:15:43Z", "latest_release_tag": "ui-kit-v11.0.0", "releases_from_tags": false, "days_since_last_push": 1, "active_weeks_last_year": 24, "days_since_latest_release": 1, "mean_days_between_releases": 0.4 }, "community": { "has_readme": true, "has_license": true, "has_description": false, "has_contributing": true, "health_percentage": 71, "has_issue_template": false, "has_code_of_conduct": true, "has_pull_request_template": false }, "ecosystem": { "packages": [ { "name": "@reformer/core", "exists": true, "license": "MIT", "keywords": [ "react", "forms", "form-validation", "validation", "state-management", "signals", "reactive", "typescript", "hooks", "form-builder", "dynamic-forms" ], "ecosystem": "npm", "matches_repo": true, "registry_url": "https://www.npmjs.com/package/@reformer/core", "is_deprecated": false, "latest_version": "9.1.1", "repository_url": "https://github.com/AlexandrBukhtatyy/ReFormer", "versions_count": 48, "total_downloads": null, "dependents_count": null, "deprecation_note": null, "maintainers_count": 1, "monthly_downloads": 2216, "first_published_at": "2025-12-02T19:26:43.089000Z", "latest_published_at": "2026-07-17T11:51:27.140000Z", "latest_version_yanked": null, "days_since_latest_publish": 5 }, { "name": "@reformer/cdk", "exists": true, "license": "MIT", "keywords": [ "react", "forms", "headless-ui", "compound-components", "form-array", "multi-step-form", "wizard", "reformer", "typescript" ], "ecosystem": "npm", "matches_repo": true, "registry_url": "https://www.npmjs.com/package/@reformer/cdk", "is_deprecated": false, "latest_version": "10.0.0", "repository_url": "https://github.com/AlexandrBukhtatyy/ReFormer", "versions_count": 22, "total_downloads": null, "dependents_count": null, "deprecation_note": null, "maintainers_count": 1, "monthly_downloads": 1885, "first_published_at": "2026-05-02T13:48:20.336000Z", "latest_published_at": "2026-07-20T16:13:20.389000Z", "latest_version_yanked": null, "days_since_latest_publish": 1 }, { "name": "@reformer/mcp", "exists": true, "license": "MIT", "keywords": [ "mcp", "reformer", "claude", "ai", "forms", "react", "model-context-protocol" ], "ecosystem": "npm", "matches_repo": true, "registry_url": "https://www.npmjs.com/package/@reformer/mcp", "is_deprecated": false, "latest_version": "10.1.0", "repository_url": "https://github.com/AlexandrBukhtatyy/ReFormer", "versions_count": 28, "total_downloads": null, "dependents_count": null, "deprecation_note": null, "maintainers_count": 1, "monthly_downloads": 1775, "first_published_at": "2025-12-10T17:07:05.224000Z", "latest_published_at": "2026-07-17T11:58:51.804000Z", "latest_version_yanked": null, "days_since_latest_publish": 5 }, { "name": "@reformer/ui-kit", "exists": true, "license": "MIT", "keywords": [ "react", "forms", "ui-components", "tailwindcss", "radix-ui", "form-array", "multi-step-form", "wizard", "reformer", "typescript" ], "ecosystem": "npm", "matches_repo": true, "registry_url": "https://www.npmjs.com/package/@reformer/ui-kit", "is_deprecated": false, "latest_version": "11.0.0", "repository_url": "https://github.com/AlexandrBukhtatyy/ReFormer", "versions_count": 25, "total_downloads": null, "dependents_count": null, "deprecation_note": null, "maintainers_count": 1, "monthly_downloads": 2165, "first_published_at": "2026-05-03T10:35:12.489000Z", "latest_published_at": "2026-07-20T16:15:42.757000Z", "latest_version_yanked": null, "days_since_latest_publish": 1 }, { "name": "@reformer/renderer-json", "exists": true, "license": "MIT", "keywords": [ "react", "forms", "reformer", "renderer", "json", "typescript" ], "ecosystem": "npm", "matches_repo": true, "registry_url": "https://www.npmjs.com/package/@reformer/renderer-json", "is_deprecated": false, "latest_version": "9.1.1", "repository_url": "https://github.com/AlexandrBukhtatyy/ReFormer", "versions_count": 22, "total_downloads": null, "dependents_count": null, "deprecation_note": null, "maintainers_count": 1, "monthly_downloads": 1890, "first_published_at": "2026-05-03T07:58:03.336000Z", "latest_published_at": "2026-07-17T11:57:07.993000Z", "latest_version_yanked": null, "days_since_latest_publish": 5 }, { "name": "@reformer/renderer-react", "exists": true, "license": "MIT", "keywords": [ "react", "forms", "reformer", "renderer", "typescript" ], "ecosystem": "npm", "matches_repo": true, "registry_url": "https://www.npmjs.com/package/@reformer/renderer-react", "is_deprecated": false, "latest_version": "9.0.0", "repository_url": "https://github.com/AlexandrBukhtatyy/ReFormer", "versions_count": 22, "total_downloads": null, "dependents_count": null, "deprecation_note": null, "maintainers_count": 1, "monthly_downloads": 2002, "first_published_at": "2026-05-03T07:41:12.046000Z", "latest_published_at": "2026-07-20T16:14:27.607000Z", "latest_version_yanked": null, "days_since_latest_publish": 1 } ] }, "popularity": { "forks": 0, "stars": 2, "watchers": 1, "fork_history": { "days": [], "complete": true, "collected": 0, "total_forks": 0 }, "star_history": null, "open_issues_and_prs": 1 }, "ai_readiness": { "has_nix": false, "example_dirs": [ "examples" ], "has_llms_txt": true, "has_dockerfile": false, "has_mcp_signal": true, "bootstrap_files": [], "api_schema_files": [ "projects/react-playground/src/mocks/_generated/openapi.json" ], "has_devcontainer": false, "typecheck_configs": [ "packages/reformer-cdk/tsconfig.json", "packages/reformer-mcp/tsconfig.json", "packages/reformer-renderer-json/tsconfig.json", "packages/reformer-renderer-react/tsconfig.json", "packages/reformer-ui-kit/tsconfig.json", "packages/reformer/tsconfig.json", "projects/react-playground/tsconfig.json", "projects/reformer-doc/tsconfig.json", "tsconfig.json" ], "toolchain_manifests": [], "largest_source_bytes": 51806, "source_files_sampled": 770, "oversized_source_files": 0, "agent_instruction_files": [ "AGENTS.md", "CLAUDE.md" ], "agent_instruction_max_bytes": 15581 }, "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": "@emnapi/core", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "1.9.2" }, { "name": "@emnapi/runtime", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "1.9.2" }, { "name": "@napi-rs/wasm-runtime", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "1.1.2" }, { "name": "@tailwindcss/vite", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^4.1.17" }, { "name": "napi-wasm", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "1.1.3" }, { "name": "tailwindcss", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^4.1.17" }, { "name": "uuid", "manifest": "package.json", "ecosystem": "npm", "version_constraint": "^13.0.0" }, { "name": "@modelcontextprotocol/sdk", "manifest": "packages/reformer-mcp/package.json", "ecosystem": "npm", "version_constraint": "^1.0.0" }, { "name": "handlebars", "manifest": "packages/reformer-mcp/package.json", "ecosystem": "npm", "version_constraint": "^4.7.9" }, { "name": "typescript", "manifest": "packages/reformer-mcp/package.json", "ecosystem": "npm", "version_constraint": "^5.7.0" }, { "name": "ajv", "manifest": "packages/reformer-renderer-json/package.json", "ecosystem": "npm", "version_constraint": "^8.17.1" }, { "name": "class-variance-authority", "manifest": "packages/reformer-ui-kit/package.json", "ecosystem": "npm", "version_constraint": "^0.7.0" }, { "name": "clsx", "manifest": "packages/reformer-ui-kit/package.json", "ecosystem": "npm", "version_constraint": "^2.0.0" }, { "name": "lucide-react", "manifest": "packages/reformer-ui-kit/package.json", "ecosystem": "npm", "version_constraint": "^0.553.0" }, { "name": "radix-ui", "manifest": "packages/reformer-ui-kit/package.json", "ecosystem": "npm", "version_constraint": "^1.4.3" }, { "name": "tailwind-merge", "manifest": "packages/reformer-ui-kit/package.json", "ecosystem": "npm", "version_constraint": "^2.0.0 || ^3.0.0" }, { "name": "tslib", "manifest": "packages/reformer-ui-kit/package.json", "ecosystem": "npm", "version_constraint": "^2.6.0" }, { "name": "tw-animate-css", "manifest": "packages/reformer-ui-kit/package.json", "ecosystem": "npm", "version_constraint": "^1.4.0" }, { "name": "@preact/signals-core", "manifest": "packages/reformer/package.json", "ecosystem": "npm", "version_constraint": "^1.8.0" }, { "name": "use-sync-external-store", "manifest": "packages/reformer/package.json", "ecosystem": "npm", "version_constraint": "^1.2.0" }, { "name": "@preact/signals-core", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "^1.8.0" }, { "name": "@radix-ui/react-select", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "^2.2.6" }, { "name": "@radix-ui/react-slot", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "^1.2.4" }, { "name": "@reformer/cdk", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "*" }, { "name": "@reformer/core", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "*" }, { "name": "@reformer/renderer-json", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "*" }, { "name": "@reformer/renderer-react", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "*" }, { "name": "@reformer/ui-kit", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "*" }, { "name": "@tailwindcss/vite", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "^4.1.17" }, { "name": "axios", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "^1.13.2" }, { "name": "class-variance-authority", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "^0.7.1" }, { "name": "clsx", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "^2.1.1" }, { "name": "lucide-react", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "^0.553.0" }, { "name": "react", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "^19.2.1" }, { "name": "react-dom", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "^19.2.1" }, { "name": "react-router-dom", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "^6.30.2" }, { "name": "tailwind-merge", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "^3.4.0" }, { "name": "tailwindcss", "manifest": "projects/react-playground/package.json", "ecosystem": "npm", "version_constraint": "^4.1.17" }, { "name": "@docusaurus/core", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "3.9.2" }, { "name": "@docusaurus/preset-classic", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "3.9.2" }, { "name": "@mdx-js/react", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "^3.0.0" }, { "name": "@preact/signals-core", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "^1.8.0" }, { "name": "@radix-ui/react-select", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "^2.2.6" }, { "name": "@radix-ui/react-slot", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "^1.2.4" }, { "name": "@reformer/cdk", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "*" }, { "name": "@reformer/core", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "*" }, { "name": "@reformer/renderer-json", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "*" }, { "name": "@reformer/renderer-react", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "*" }, { "name": "@reformer/ui-kit", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "*" }, { "name": "class-variance-authority", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "^0.7.1" }, { "name": "clsx", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "^2.1.1" }, { "name": "lucide-react", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "^0.553.0" }, { "name": "prism-react-renderer", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "^2.3.0" }, { "name": "react", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "^19.0.0" }, { "name": "react-dom", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "^19.0.0" }, { "name": "tailwind-merge", "manifest": "projects/reformer-doc/package.json", "ecosystem": "npm", "version_constraint": "^3.4.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": 36, "open_issues": 1, "closed_ratio": 0.8, "closed_issues": 4, "closed_unmerged_prs": 1 }, "bus_factor": 1, "bot_contributors": 1, "top_contributors": [ { "type": "User", "login": "AlexandrBukhtatyy", "commits": 754, "avatar_url": "https://avatars.githubusercontent.com/u/2250253?v=4" }, { "type": "User", "login": "semantic-release-bot", "commits": 14, "avatar_url": "https://avatars.githubusercontent.com/u/32174276?v=4" } ], "contributors_sampled": 2, "top_contributor_share": 0.982 }, "quality_signals": { "has_ci": true, "has_tests": true, "ci_workflows": [ "align-versions.yml", "ci.yml", "deploy-docs.yml", "release.yml", "test.yml" ], "has_docs_dir": true, "linter_configs": [ "eslint.config.js" ], "has_editorconfig": false, "has_linter_config": true, "has_precommit_config": false }, "security_signals": { "lockfiles": [ "package-lock.json" ], "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": 7, "reason": "7 out of 9 merged PRs checked by a CI test -- score normalized to 7", "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/11 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": 0, "reason": "project is not fuzzed", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing" }, { "name": "License", "score": 10, "reason": "license file detected", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license" }, { "name": "Maintained", "score": 10, "reason": "30 commit(s) and 5 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": 10, "reason": "packaging workflow detected", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging" }, { "name": "Pinned-Dependencies", "score": 2, "reason": "dependency not pinned by hash detected -- score normalized to 2", "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": 4, "reason": "security policy file detected", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy" }, { "name": "Signed-Releases", "score": null, "reason": "no releases found", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases" }, { "name": "Token-Permissions", "score": 0, "reason": "detected GitHub workflow tokens with excessive permissions", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions" }, { "name": "Vulnerabilities", "score": 0, "reason": "115 existing vulnerabilities detected", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities" } ], "commit": "df9f667b3f107dd90b2ea5bb82f5b430e0a07c2d", "ran_at": "2026-07-22T12:01:25Z", "aggregate_score": 3.9, "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-20T16:36:02Z", "oldest_open_prs": [], "last_merged_pr_at": "2026-07-20T16:07:58Z", "ci_last_conclusion": "SUCCESS", "oldest_open_issues": [ { "number": 33, "created_at": "2026-07-02T13:30:38Z", "last_comment_at": "2026-07-04T01:52:33Z", "last_comment_author": "AlexandrBukhtatyy" } ] } }, "config": { "disabled_metrics": [], "disabled_categories": [], "disabled_components": {} }, "source": { "url": "https://github.com/AlexandrBukhtatyy/ReFormer", "host": "github.com", "name": "ReFormer", "owner": "AlexandrBukhtatyy" }, "metrics": { "overall": { "key": "overall", "band": "moderate", "name": "Overall health", "note": null, "notes": [], "value": 62, "inputs": { "security": 39, "vitality": 89, "community": 47, "governance": 56, "engineering": 69 }, "components": [] }, "categories": [ { "key": "vitality", "band": "excellent", "name": "Vitality", "value": 89, "weight": 0.22, "metrics": [ { "key": "development_activity", "band": "good", "name": "Development activity", "note": null, "notes": [], "value": 81, "inputs": { "commits_last_year": 769, "human_commit_share": 1, "days_since_last_push": 1, "active_weeks_last_year": 24 }, "components": [ { "key": "push_recency", "name": "Push recency", "detail": "last push 1 days ago", "points": 36, "status": "met", "details": [ { "code": "push_recency", "params": { "days": 1 } } ], "max_points": 36 }, { "key": "commit_cadence", "name": "Commit cadence", "detail": "24/52 weeks with commits", "points": 16.6, "status": "partial", "details": [ { "code": "commit_cadence_weeks", "params": { "weeks": 24 } } ], "max_points": 36 }, { "key": "commit_volume", "name": "Commit volume", "detail": "769 commits in the last year", "points": 18, "status": "met", "details": [ { "code": "commits_last_year", "params": { "count": 769 } } ], "max_points": 18 }, { "key": "openssf_scorecard_maintained", "name": "OpenSSF Scorecard: Maintained", "detail": "30 commit(s) and 5 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": 100, "latest_release_tag": "ui-kit-v11.0.0", "releases_from_tags": false, "days_since_latest_release": 1, "mean_days_between_releases": 0.4 }, "components": [ { "key": "ships_releases", "name": "Ships releases", "detail": "100 releases published", "points": 27, "status": "met", "details": [ { "code": "releases_published", "params": { "count": 100 } } ], "max_points": 27 }, { "key": "release_recency", "name": "Release recency", "detail": "latest release 1 days ago", "points": 36, "status": "met", "details": [ { "code": "release_recency", "params": { "days": 1 } } ], "max_points": 36 }, { "key": "release_cadence", "name": "Release cadence", "detail": "a release every ~0.4 days", "points": 27, "status": "met", "details": [ { "code": "release_cadence", "params": { "gap": 0.4 } } ], "max_points": 27 }, { "key": "openssf_scorecard_signed_releases", "name": "OpenSSF Scorecard: Signed-Releases", "detail": "no releases found", "points": 0, "status": "excluded", "details": [ { "code": "no_data", "params": {} } ], "max_points": 10 } ] }, { "key": "abandonment", "band": "excellent", "name": "Abandonment", "note": null, "notes": [], "value": 100, "inputs": { "cap": null, "state": "maintained", "guards": [], "signals": [], "red_flag": false, "multiplier_pct": 100, "declared_reason": null, "unverified_reason": null, "unanswered_open_prs": null, "unanswered_open_issues": null, "days_since_last_merged_pr": null, "days_since_last_human_commit": 1, "days_since_last_human_commit_is_floor": false }, "components": [ { "key": "project_is_still_maintained", "name": "Project is still maintained", "detail": "last human commit 1 days ago", "points": 100, "status": "met", "details": [ { "code": "abandonment_maintained", "params": { "days": 1 } } ], "max_points": 100 } ] } ], "description": "Is the project alive — is code being written and are releases shipping?" }, { "key": "community", "band": "at_risk", "name": "Community & Adoption", "value": 47, "weight": 0.18, "metrics": [ { "key": "popularity", "band": "critical", "name": "Popularity & adoption", "note": null, "notes": [], "value": 1, "inputs": { "forks": 0, "stars": 2, "watchers": 1, "growth_state": "unverified", "growth_factor_pct": 100, "growth_unverified_reason": "no_history" }, "components": [ { "key": "stars", "name": "Stars", "detail": "2 stars", "points": 0, "status": "missed", "details": [ { "code": "stars", "params": { "count": 2 } } ], "max_points": 60 }, { "key": "forks", "name": "Forks", "detail": "0 forks", "points": 0, "status": "missed", "details": [ { "code": "forks", "params": { "count": 0 } } ], "max_points": 25 }, { "key": "watchers", "name": "Watchers", "detail": "1 watchers", "points": 0, "status": "missed", "details": [ { "code": "watchers", "params": { "count": 1 } } ], "max_points": 15 } ] }, { "key": "community_health", "band": "excellent", "name": "Community health", "note": null, "notes": [], "value": 85, "inputs": { "has_readme": true, "has_license": true, "has_contributing": true, "has_issue_template": false, "has_code_of_conduct": true, "has_pull_request_template": false }, "components": [ { "key": "readme", "name": "README", "detail": null, "points": 22.5, "status": "met", "details": [], "max_points": 22.5 }, { "key": "license", "name": "License", "detail": "recognized license (MIT)", "points": 22.5, "status": "met", "details": [ { "code": "license_standard", "params": {} }, { "code": "license_spdx", "params": { "spdx": "MIT" } } ], "max_points": 22.5 }, { "key": "contributing_guide", "name": "CONTRIBUTING guide", "detail": null, "points": 18, "status": "met", "details": [], "max_points": 18 }, { "key": "code_of_conduct", "name": "Code of conduct", "detail": null, "points": 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": 0, "status": "missed", "details": [], "max_points": 6.3 } ] }, { "key": "ecosystem_adoption", "band": "moderate", "name": "Ecosystem adoption (downloads)", "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.", "notes": [ { "code": "excluded_no_data", "params": { "components": [ "registry_dependents" ] } }, { "code": "weights_renormalized", "params": {} } ], "value": 68, "inputs": { "packages": [ "@reformer/core", "@reformer/cdk", "@reformer/mcp", "@reformer/ui-kit", "@reformer/renderer-json", "@reformer/renderer-react" ], "dependents": null, "ecosystems": "npm", "total_downloads": null, "monthly_downloads": 11933 }, "components": [ { "key": "monthly_downloads", "name": "Monthly downloads", "detail": "11,933 downloads/month across npm", "points": 54.4, "status": "partial", "details": [ { "code": "downloads_monthly", "params": { "count": 11933, "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": 56, "weight": 0.24, "metrics": [ { "key": "maintainer_resilience", "band": "critical", "name": "Maintainer resilience (bus factor)", "note": null, "notes": [], "value": 15, "inputs": { "bus_factor": 1, "contributors_sampled": 2, "top_contributor_share": 0.982 }, "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 98% of commits", "points": 0.4, "status": "partial", "details": [ { "code": "top_contributor_share", "params": { "share": 98 } } ], "max_points": 22.5 }, { "key": "contributor_breadth", "name": "Contributor breadth", "detail": "2 contributors", "points": 2.7, "status": "partial", "details": [ { "code": "contributors_sampled", "params": { "count": 2 } } ], "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": "good", "name": "Issue & PR responsiveness", "note": null, "notes": [], "value": 75, "inputs": { "merged_prs": 36, "open_issues": 1, "closed_issues": 4, "issue_closed_ratio": 0.8, "closed_unmerged_prs": 1 }, "components": [ { "key": "issue_resolution", "name": "Issue resolution", "detail": "80% of issues closed", "points": 37.4, "status": "partial", "details": [ { "code": "issues_closed_share", "params": { "share": 80 } } ], "max_points": 46.75 }, { "key": "pr_acceptance", "name": "PR acceptance", "detail": "36/37 decided PRs merged", "points": 37.2, "status": "partial", "details": [ { "code": "decided_prs_merged", "params": { "merged": 36, "decided": 37 } } ], "max_points": 38.25 }, { "key": "openssf_scorecard_code_review", "name": "OpenSSF Scorecard: Code-Review", "detail": "Found 0/11 approved changesets -- score normalized to 0", "points": 0, "status": "missed", "details": [], "max_points": 15 } ] }, { "key": "stewardship", "band": "moderate", "name": "Ownership & stewardship", "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.", "notes": [ { "code": "excluded_no_data", "params": { "components": [ "verified_domain" ] } }, { "code": "weights_renormalized", "params": {} } ], "value": 51, "inputs": { "followers": 8, "owner_type": "User", "is_verified": null, "owner_login": "AlexandrBukhtatyy", "public_repos": 38, "account_age_days": 5073 }, "components": [ { "key": "ownership_backing", "name": "Ownership backing", "detail": "personal (user) account", "points": 10, "status": "partial", "details": [ { "code": "owner_personal", "params": {} } ], "max_points": 30 }, { "key": "verified_domain", "name": "Verified domain", "detail": "not applicable to user accounts", "points": 0, "status": "excluded", "details": [ { "code": "not_applicable_to_user_accounts", "params": {} } ], "max_points": 20 }, { "key": "owner_reach", "name": "Owner reach", "detail": "8 followers of AlexandrBukhtatyy", "points": 6.9, "status": "partial", "details": [ { "code": "owner_followers", "params": { "count": 8, "login": "AlexandrBukhtatyy" } } ], "max_points": 25 }, { "key": "track_record", "name": "Track record", "detail": "38 public repos, account ~13 yr old", "points": 23.6, "status": "partial", "details": [ { "code": "public_repos", "params": { "count": 38 } }, { "code": "account_age_years", "params": { "years": 13 } } ], "max_points": 25 } ] }, { "key": "package_maintenance", "band": "excellent", "name": "Package maintenance", "note": null, "notes": [], "value": 100, "inputs": { "packages": [ "@reformer/core", "@reformer/cdk", "@reformer/mcp", "@reformer/ui-kit", "@reformer/renderer-json", "@reformer/renderer-react" ], "ecosystems": "npm", "any_deprecated": false, "min_days_since_publish": 1 }, "components": [ { "key": "published_resolvable", "name": "Published & resolvable", "detail": "6 package(s) on npm", "points": 25, "status": "met", "details": [ { "code": "packages_published", "params": { "count": 6, "ecosystems": "npm" } } ], "max_points": 25 }, { "key": "publish_recency", "name": "Publish recency", "detail": "latest publish 1 days ago", "points": 35, "status": "met", "details": [ { "code": "publish_recency", "params": { "days": 1 } } ], "max_points": 35 }, { "key": "version_history", "name": "Version history", "detail": "48 published versions", "points": 20, "status": "met", "details": [ { "code": "published_versions", "params": { "count": 48 } } ], "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": "moderate", "name": "Engineering Quality", "value": 69, "weight": 0.2, "metrics": [ { "key": "engineering_practices", "band": "good", "name": "Engineering practices", "note": null, "notes": [], "value": 78, "inputs": { "has_ci": true, "has_tests": true, "has_editorconfig": false, "has_linter_config": true, "has_precommit_config": false }, "components": [ { "key": "ci_workflows", "name": "CI workflows", "detail": "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": 0, "status": "missed", "details": [], "max_points": 6.4 }, { "key": "openssf_scorecard_ci_tests", "name": "OpenSSF Scorecard: CI-Tests", "detail": "7 out of 9 merged PRs checked by a CI test -- score normalized to 7", "points": 14, "status": "partial", "details": [], "max_points": 20 } ] }, { "key": "documentation", "band": "moderate", "name": "Documentation", "note": null, "notes": [], "value": 55, "inputs": { "topics": [], "has_wiki": false, "homepage": null, "has_readme": true, "has_docs_dir": true, "has_description": false }, "components": [ { "key": "readme", "name": "README", "detail": null, "points": 30, "status": "met", "details": [], "max_points": 30 }, { "key": "documentation_directory", "name": "Documentation directory", "detail": null, "points": 25, "status": "met", "details": [], "max_points": 25 }, { "key": "documentation_homepage_site", "name": "Documentation / homepage site", "detail": null, "points": 0, "status": "missed", "details": [], "max_points": 15 }, { "key": "repository_description", "name": "Repository description", "detail": null, "points": 0, "status": "missed", "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": 0, "status": "missed", "details": [], "max_points": 10 } ] } ], "description": "Are baseline engineering and documentation practices in place?" }, { "key": "security", "band": "at_risk", "name": "Security", "value": 39, "weight": 0.16, "metrics": [ { "key": "security_posture", "band": "at_risk", "name": "Security posture", "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.", "notes": [ { "code": "excluded_no_data", "params": { "components": [ "signed_releases" ] } }, { "code": "weights_renormalized", "params": {} } ], "value": 39, "inputs": { "source": "openssf_scorecard", "checks_evaluated": 17, "scorecard_version": "v5.5.0", "checks_inconclusive": 1, "scorecard_aggregate": 3.9 }, "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": "7 out of 9 merged PRs checked by a CI test -- score normalized to 7", "points": 1.8, "status": "partial", "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/11 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 not fuzzed", "points": 0, "status": "missed", "details": [], "max_points": 5 }, { "key": "license", "name": "License", "detail": "license file detected", "points": 2.5, "status": "met", "details": [], "max_points": 2.5 }, { "key": "maintained", "name": "Maintained", "detail": "30 commit(s) and 5 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 detected", "points": 5, "status": "met", "details": [], "max_points": 5 }, { "key": "pinned_dependencies", "name": "Pinned-Dependencies", "detail": "dependency not pinned by hash detected -- score normalized to 2", "points": 1, "status": "partial", "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": 2, "status": "partial", "details": [], "max_points": 5 }, { "key": "signed_releases", "name": "Signed-Releases", "detail": "no releases found", "points": 0, "status": "excluded", "details": [ { "code": "no_data", "params": {} } ], "max_points": 7.5 }, { "key": "token_permissions", "name": "Token-Permissions", "detail": "detected GitHub workflow tokens with excessive permissions", "points": 0, "status": "missed", "details": [], "max_points": 7.5 }, { "key": "vulnerabilities", "name": "Vulnerabilities", "detail": "115 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": 1 }, "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": "excellent", "name": "AI Readiness", "value": 86, "weight": 0, "metrics": [ { "key": "ai_agent_context", "band": "excellent", "name": "Agent context & guidance", "note": null, "notes": [], "value": 100, "inputs": { "has_llms_txt": true, "legible_history_share": 0.97, "agent_instruction_files": [ "AGENTS.md", "CLAUDE.md" ], "agent_instruction_max_bytes": 15581 }, "components": [ { "key": "agent_instructions", "name": "Agent instructions", "detail": "AGENTS.md, CLAUDE.md", "points": 45, "status": "met", "details": [ { "code": "file_list", "params": { "files": "AGENTS.md, CLAUDE.md" } } ], "max_points": 45 }, { "key": "machine_readable_docs_llms_txt", "name": "Machine-readable docs (llms.txt)", "detail": "llms.txt present", "points": 15, "status": "met", "details": [ { "code": "llms_txt_present", "params": {} } ], "max_points": 15 }, { "key": "legible_commit_history", "name": "Legible commit history", "detail": "97 of 100 human commits state their intent (structured subject or explanatory body)", "points": 40, "status": "met", "details": [ { "code": "legible_history", "params": { "legible": 97, "sampled": 100 } } ], "max_points": 40 } ] }, { "key": "ai_verify_loop", "band": "moderate", "name": "Verify loop (build / test / typecheck)", "note": null, "notes": [], "value": 66, "inputs": { "has_nix": false, "has_tests": true, "lockfiles": [ "package-lock.json" ], "has_dockerfile": false, "typed_language": true, "bootstrap_files": [], "has_devcontainer": false, "has_linter_config": true, "typecheck_configs": [ "packages/reformer-cdk/tsconfig.json", "packages/reformer-mcp/tsconfig.json", "packages/reformer-renderer-json/tsconfig.json", "packages/reformer-renderer-react/tsconfig.json", "packages/reformer-ui-kit/tsconfig.json", "packages/reformer/tsconfig.json", "projects/react-playground/tsconfig.json", "projects/reformer-doc/tsconfig.json", "tsconfig.json" ], "agent_commit_share": 0.1, "toolchain_manifests": [], "dependency_bot_commit_share": 0 }, "components": [ { "key": "one_command_bootstrap", "name": "One-command bootstrap", "detail": null, "points": 0, "status": "missed", "details": [], "max_points": 18 }, { "key": "automated_tests", "name": "Automated tests", "detail": null, "points": 22, "status": "met", "details": [], "max_points": 22 }, { "key": "lint_format_config", "name": "Lint / format config", "detail": "eslint.config.js", "points": 11, "status": "met", "details": [ { "code": "file_list", "params": { "files": "eslint.config.js" } } ], "max_points": 11 }, { "key": "static_type_checking", "name": "Static type checking", "detail": "packages/reformer-cdk/tsconfig.json, packages/reformer-mcp/tsconfig.json, packages/reformer-renderer-json/tsconfig.json, packages/reformer-renderer-react/tsconfig.json, packages/reformer-ui-kit/tsconfig.json, packages/reformer/tsconfig.json, projects/react-playground/tsconfig.json, projects/reformer-doc/tsconfig.json, tsconfig.json", "points": 11, "status": "met", "details": [ { "code": "file_list", "params": { "files": "packages/reformer-cdk/tsconfig.json, packages/reformer-mcp/tsconfig.json, packages/reformer-renderer-json/tsconfig.json, packages/reformer-renderer-react/tsconfig.json, packages/reformer-ui-kit/tsconfig.json, packages/reformer/tsconfig.json, projects/react-playground/tsconfig.json, projects/reformer-doc/tsconfig.json, tsconfig.json" } } ], "max_points": 11 }, { "key": "reproducible_environment", "name": "Reproducible environment", "detail": "lockfile", "points": 10, "status": "met", "details": [ { "code": "file_list", "params": { "files": "lockfile" } } ], "max_points": 10 }, { "key": "demonstrated_agent_practice", "name": "Demonstrated agent practice", "detail": "10 of the last 100 commits agent-authored or agent-credited", "points": 10, "status": "met", "details": [ { "code": "agent_authored_commits", "params": { "count": 10, "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 2", "points": 2, "status": "partial", "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": 51806, "source_files_sampled": 770, "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/770 source files over 60KB", "points": 55, "status": "met", "details": [ { "code": "oversized_source_files", "params": { "kb": 60, "sampled": 770, "oversized": 0 } } ], "max_points": 55 } ] }, { "key": "ai_interfaces", "band": "excellent", "name": "Machine-readable interfaces", "note": null, "notes": [], "value": 100, "inputs": { "example_dirs": [ "examples" ], "has_mcp_signal": true, "api_schema_files": [ "projects/react-playground/src/mocks/_generated/openapi.json" ] }, "components": [ { "key": "api_schema_openapi_graphql_proto", "name": "API schema (OpenAPI/GraphQL/proto)", "detail": "projects/react-playground/src/mocks/_generated/openapi.json", "points": 40, "status": "met", "details": [ { "code": "file_list", "params": { "files": "projects/react-playground/src/mocks/_generated/openapi.json" } } ], "max_points": 40 }, { "key": "mcp_server", "name": "MCP server", "detail": null, "points": 20, "status": "met", "details": [], "max_points": 20 }, { "key": "runnable_examples", "name": "Runnable examples", "detail": "examples", "points": 40, "status": "met", "details": [ { "code": "file_list", "params": { "files": "examples" } } ], "max_points": 40 } ] } ], "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score." } ], "metrics_version": "1.13.0" }, "warnings": [ "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token", "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository", "deps.dev does not index npm:@reformer/core@9.1.1; advisories assessed against the repository dependency graph instead" ], "report_type": "repository", "generated_at": "2026-07-22T12:01:43.141200Z", "schema_version": "0.26.0", "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/AlexandrBukhtatyy/ReFormer.svg", "full_name": "AlexandrBukhtatyy/ReFormer", "license_state": "standard", "license_spdx": "MIT" }, "repoMeta": null, "notFound": false, "related": [ { "id": 24748, "full_name": "ionic-team/ionic-framework", "url": "https://github.com/ionic-team/ionic-framework", "description": "A powerful cross-platform UI toolkit for building native-quality iOS, Android, and Progressive Web Apps with HTML, CSS, and JavaScript.", "ecosystem": "npm", "ecosystems": [ "npm" ], "primary_language": "TypeScript", "languages": [ "TypeScript", "HTML", "SCSS" ], "topics": [ "ionic", "mobile", "framework", "angular", "javascript", "frontend", "pwa", "typescript", "web", "stencil", "stenciljs", "capacitor", "react", "vue", "webcomponents", "ios", "material-design", "ui-components", "app", "webapp", "cordova", "electron", "progressive-web-app" ], "license_spdx": "MIT", "license_state": "standard", "stars": 52595, "forks": 13332, "watchers": 1548, "monthly_downloads": 1633198, "latest_score": 90, "latest_band": "excellent", "latest_scanned_at": "2026-07-23T02:00:02.353535Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "maintained", "red_flags": [], "badge_url": "" }, { "id": 107, "full_name": "n8n-io/n8n", "url": "https://github.com/n8n-io/n8n", "description": "Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.", "ecosystem": "npm", "ecosystems": [ "npm" ], "primary_language": "TypeScript", "languages": [], "topics": [ "ai", "apis", "automation", "cli", "data-flow", "development", "integration-framework", "integrations", "ipaas", "low-code", "low-code-platform", "mcp", "mcp-client", "mcp-server", "n8n", "no-code", "self-hosted", "typescript", "workflow", "workflow-automation" ], "license_spdx": null, "license_state": "custom", "stars": 196209, "forks": 59293, "watchers": 1138, "monthly_downloads": 0, "latest_score": 87, "latest_band": "excellent", "latest_scanned_at": "2026-07-13T01:46:04.380428Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" }, { "id": 29340, "full_name": "ComposioHQ/composio", "url": "https://github.com/ComposioHQ/composio", "description": "Composio powers 1000+ toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.", "ecosystem": "pypi", "ecosystems": [ "pypi", "npm" ], "primary_language": "TypeScript", "languages": [ "TypeScript", "Python" ], "topics": [ "ai", "python", "agents", "aiagents", "function-calling", "developer-tools", "gpt-4", "llm", "llmops", "typescript", "javascript", "js", "ai-agents", "mcp", "remote-mcp-server", "sse", "agentic-ai" ], "license_spdx": "MIT", "license_state": "standard", "stars": 29296, "forks": 4669, "watchers": 67, "monthly_downloads": 1680219, "latest_score": 86, "latest_band": "excellent", "latest_scanned_at": "2026-07-20T20:14:42.137008Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" }, { "id": 19192, "full_name": "ui5/webcomponents-react", "url": "https://github.com/ui5/webcomponents-react", "description": "A wrapper implementation for React of the UI5 Web Components that are compliant with the SAP Fiori User Experience", "ecosystem": "npm", "ecosystems": [ "npm" ], "primary_language": "TypeScript", "languages": [ "TypeScript" ], "topics": [ "open-source", "web-components", "react", "typescript", "ui-components" ], "license_spdx": "Apache-2.0", "license_state": "standard", "stars": 533, "forks": 111, "watchers": 12, "monthly_downloads": null, "latest_score": 85, "latest_band": "excellent", "latest_scanned_at": "2026-07-17T23:32:20.033555Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" }, { "id": 9441, "full_name": "stacklok/toolhive", "url": "https://github.com/stacklok/toolhive", "description": "ToolHive is an enterprise-grade platform for running and managing Model Context Protocol (MCP) servers.", "ecosystem": "go", "ecosystems": [ "go" ], "primary_language": "Go", "languages": [ "Go" ], "topics": [ "ai", "aicodeassistant", "mcp", "ai-security", "mcp-security", "mcp-servers", "mcp-tools", "security", "golang", "kubernetes", "model-context-protocol" ], "license_spdx": "Apache-2.0", "license_state": "standard", "stars": 1944, "forks": 247, "watchers": 15, "monthly_downloads": null, "latest_score": 89, "latest_band": "excellent", "latest_scanned_at": "2026-07-16T01:22:43.245066Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" }, { "id": 19749, "full_name": "stackloklabs/toolhive", "url": "https://github.com/stackloklabs/toolhive", "description": "ToolHive is an enterprise-grade platform for running and managing Model Context Protocol (MCP) servers.", "ecosystem": "go", "ecosystems": [ "go" ], "primary_language": "Go", "languages": [ "Go" ], "topics": [ "ai", "aicodeassistant", "mcp", "ai-security", "mcp-security", "mcp-servers", "mcp-tools", "security", "golang", "kubernetes", "model-context-protocol" ], "license_spdx": "Apache-2.0", "license_state": "standard", "stars": 1951, "forks": 249, "watchers": 15, "monthly_downloads": null, "latest_score": 88, "latest_band": "excellent", "latest_scanned_at": "2026-07-18T02:26:11.684256Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" } ] } }
Registro público
Informe de salud del softwareesquema 0.26.0 · métricas 1.13.0 · 2026-07-22 12:01 UTC

AlexandrBukhtatyy / ReFormer

TypeScriptMIT★ 2 estrellas⑂ 0 forksdesde nov 2025Ver en GitHub ↗

AlexandrBukhtatyy/ReFormer tiene un índice de salud de 62 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (89/100) y la más baja, Security (39/100). Se actualizó por última vez hace 1 día. Una sola persona concentra la mayor parte del trabajo reciente.

62
global / 100
Moderado

Índice de salud del software

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

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

Perfil de puntuación

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

Titularidad

Alexandr BukhtatyyCuenta personal
8 seguidores38 repositorios públicosdesde ago 2012

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

Métricas por categoría

Vitalidad

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

89Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 1 días
16.6/36Cadencia de commits — 24/52 semanas con commits
18/18Volumen de commits — 769 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year769
human_commit_share1
days_since_last_push1
active_weeks_last_year24
Cómo se puntúa
27/27Publica versiones — 100 versiones publicadas
36/36Recencia de las versiones — última versión hace 1 días
27/27Cadencia de publicación — una versión cada ~0,4 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count100
latest_release_tagui-kit-v11.0.0
releases_from_tagsno
days_since_latest_release1
mean_days_between_releases0,4
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

47En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 2 estrellas
0/25Forks — 0 forks
0/15Observadores — 1 observadores
Datos de entrada utilizados
forks0
stars2
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
has_pull_request_templateno
Cómo se puntúa
54.4/80Descargas mensuales — 11.933 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@reformer/core, @reformer/cdk, @reformer/mcp, @reformer/ui-kit, @reformer/renderer-json, @reformer/renderer-react
dependents
ecosystemsnpm
total_downloads
monthly_downloads11.933
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

56Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0.4/22.5Distribución de commits — el principal contribuyente firma el 98% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,982
Cómo se puntúa
37.4/46.8Resolución de issues — 80% de issues cerradas
37.2/38.3Aceptación de PR — 36/37 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/11 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs36
open_issues1
closed_issues4
issue_closed_ratio0,8
closed_unmerged_prs1
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
6.9/25Alcance del propietario — 8 seguidores de AlexandrBukhtatyy
23.6/25Trayectoria — 38 repos públicos, cuenta de ~13 años
Datos de entrada utilizados
followers8
owner_typeUser
is_verified
owner_loginAlexandrBukhtatyy
public_repos38
account_age_days5073
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 6 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 1 días
20/20Historial de versiones — 48 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@reformer/core, @reformer/cdk, @reformer/mcp, @reformer/ui-kit, @reformer/renderer-json, @reformer/renderer-react
ecosystemsnpm
any_deprecatedno
min_days_since_publish1

Calidad de Ingeniería

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

69Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 5 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — eslint.config.js
0/9.6Hooks de pre-commit
0/6.4.editorconfig
14/20OpenSSF Scorecard: CI-Tests — 7 out of 9 merged PRs checked by a CI test -- score normalized to 7
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno

Documentación

55Moderado
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
0/10Descripción del repositorio
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
homepage
has_readme
has_docs_dir
has_descriptionno

Seguridad

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

39En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
1.8/2.5CI-Tests — 7 out of 9 merged PRs checked by a CI test -- score normalized to 7
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/11 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
2/5Security-Policy — security policy file detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 115 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3,9
Excluidos de la puntuación (sin datos o no aplicable): signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

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

86Excelente · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
15/15Documentación legible por máquinas (llms.txt) — llms.txt presente
40/40Historial de commits legible — 97 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txt
legible_history_share0,97
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes15.581
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — eslint.config.js
11/11Verificación estática de tipos — packages/reformer-cdk/tsconfig.json, packages/reformer-mcp/tsconfig.json, packages/reformer-renderer-json/tsconfig.json, packages/reformer-renderer-react/tsconfig.json, packages/reformer-ui-kit/tsconfig.json, packages/reformer/tsconfig.json, projects/react-playground/tsconfig.json, projects/reformer-doc/tsconfig.json, tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 10 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
2/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configspackages/reformer-cdk/tsconfig.json, packages/reformer-mcp/tsconfig.json, packages/reformer-renderer-json/tsconfig.json, packages/reformer-renderer-react/tsconfig.json, packages/reformer-ui-kit/tsconfig.json, packages/reformer/tsconfig.json, projects/react-playground/tsconfig.json, projects/reformer-doc/tsconfig.json, tsconfig.json
agent_commit_share0,1
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
55/55Tamaños de archivo manejables — 0/770 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes51.806
source_files_sampled770
oversized_source_files0
Cómo se puntúa
40/40Esquema de API (OpenAPI/GraphQL/proto) — projects/react-playground/src/mocks/_generated/openapi.json
20/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signal
api_schema_filesprojects/react-playground/src/mocks/_generated/openapi.json

Datos clave

2estrellas de GitHub
2contribuidores
769commits en los últimos 12 meses
1días desde el último push
100versiones publicadas
1factor bus
1issues abiertas
npmecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 3.9 / 10
3.9agregado

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
7CI-Tests7 out of 9 merged PRs checked by a CI test -- score normalized to 7
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/11 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
0SASTSAST tool is not run on all commits -- score normalized to 0
4Security-Policysecurity policy file detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities115 existing vulnerabilities detected
Dependencias directas 56
RegistroPaqueteRestricción de versiónManifiesto
npm@emnapi/core1.9.2package.json
npm@emnapi/runtime1.9.2package.json
npm@napi-rs/wasm-runtime1.1.2package.json
npm@tailwindcss/vite^4.1.17package.json
npmnapi-wasm1.1.3package.json
npmtailwindcss^4.1.17package.json
npmuuid^13.0.0package.json
npm@modelcontextprotocol/sdk^1.0.0packages/reformer-mcp/package.json
npmhandlebars^4.7.9packages/reformer-mcp/package.json
npmtypescript^5.7.0packages/reformer-mcp/package.json
npmajv^8.17.1packages/reformer-renderer-json/package.json
npmclass-variance-authority^0.7.0packages/reformer-ui-kit/package.json
npmclsx^2.0.0packages/reformer-ui-kit/package.json
npmlucide-react^0.553.0packages/reformer-ui-kit/package.json
npmradix-ui^1.4.3packages/reformer-ui-kit/package.json
npmtailwind-merge^2.0.0 || ^3.0.0packages/reformer-ui-kit/package.json
npmtslib^2.6.0packages/reformer-ui-kit/package.json
npmtw-animate-css^1.4.0packages/reformer-ui-kit/package.json
npm@preact/signals-core^1.8.0packages/reformer/package.json
npmuse-sync-external-store^1.2.0packages/reformer/package.json
npm@preact/signals-core^1.8.0projects/react-playground/package.json
npm@radix-ui/react-select^2.2.6projects/react-playground/package.json
npm@radix-ui/react-slot^1.2.4projects/react-playground/package.json
npm@reformer/cdk*projects/react-playground/package.json
npm@reformer/core*projects/react-playground/package.json
npm@reformer/renderer-json*projects/react-playground/package.json
npm@reformer/renderer-react*projects/react-playground/package.json
npm@reformer/ui-kit*projects/react-playground/package.json
npm@tailwindcss/vite^4.1.17projects/react-playground/package.json
npmaxios^1.13.2projects/react-playground/package.json
npmclass-variance-authority^0.7.1projects/react-playground/package.json
npmclsx^2.1.1projects/react-playground/package.json
npmlucide-react^0.553.0projects/react-playground/package.json
npmreact^19.2.1projects/react-playground/package.json
npmreact-dom^19.2.1projects/react-playground/package.json
npmreact-router-dom^6.30.2projects/react-playground/package.json
npmtailwind-merge^3.4.0projects/react-playground/package.json
npmtailwindcss^4.1.17projects/react-playground/package.json
npm@docusaurus/core3.9.2projects/reformer-doc/package.json
npm@docusaurus/preset-classic3.9.2projects/reformer-doc/package.json
npm@mdx-js/react^3.0.0projects/reformer-doc/package.json
npm@preact/signals-core^1.8.0projects/reformer-doc/package.json
npm@radix-ui/react-select^2.2.6projects/reformer-doc/package.json
npm@radix-ui/react-slot^1.2.4projects/reformer-doc/package.json
npm@reformer/cdk*projects/reformer-doc/package.json
npm@reformer/core*projects/reformer-doc/package.json
npm@reformer/renderer-json*projects/reformer-doc/package.json
npm@reformer/renderer-react*projects/reformer-doc/package.json
npm@reformer/ui-kit*projects/reformer-doc/package.json
npmclass-variance-authority^0.7.1projects/reformer-doc/package.json
npmclsx^2.1.1projects/reformer-doc/package.json
npmlucide-react^0.553.0projects/reformer-doc/package.json
npmprism-react-renderer^2.3.0projects/reformer-doc/package.json
npmreact^19.0.0projects/reformer-doc/package.json
npmreact-dom^19.0.0projects/reformer-doc/package.json
npmtailwind-merge^3.4.0projects/reformer-doc/package.json
Todas las dependencias no recopilado

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 10965,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "CSS": 39328,
        "MDX": 57729,
        "HTML": 365,
        "Shell": 5738,
        "JavaScript": 67759,
        "TypeScript": 3837091
      },
      "pushed_at": "2026-07-20T16:45:16Z",
      "created_at": "2025-11-11T14:24:14Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T16:28:17Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Alexandr Bukhtatyy",
      "type": "User",
      "login": "AlexandrBukhtatyy",
      "company": null,
      "location": null,
      "followers": 8,
      "avatar_url": "https://avatars.githubusercontent.com/u/2250253?v=4",
      "created_at": "2012-08-30T18:09:00Z",
      "is_verified": null,
      "public_repos": 38,
      "account_age_days": 5073
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "ui-kit-v11.0.0",
          "kind": "other",
          "published_at": "2026-07-20T16:15:43Z"
        },
        {
          "tag": "renderer-react-v9.0.0",
          "kind": "other",
          "published_at": "2026-07-20T16:14:28Z"
        },
        {
          "tag": "cdk-v10.0.0",
          "kind": "other",
          "published_at": "2026-07-20T16:13:21Z"
        },
        {
          "tag": "ui-kit-v10.0.0",
          "kind": "other",
          "published_at": "2026-07-17T12:09:05Z"
        },
        {
          "tag": "mcp-v10.1.0",
          "kind": "other",
          "published_at": "2026-07-17T11:58:52Z"
        },
        {
          "tag": "renderer-json-v9.1.1",
          "kind": "other",
          "published_at": "2026-07-17T11:57:08Z"
        },
        {
          "tag": "ui-kit-v9.0.2",
          "kind": "other",
          "published_at": "2026-07-17T11:55:41Z"
        },
        {
          "tag": "renderer-react-v8.1.2",
          "kind": "other",
          "published_at": "2026-07-17T11:54:27Z"
        },
        {
          "tag": "cdk-v9.0.2",
          "kind": "other",
          "published_at": "2026-07-17T11:52:51Z"
        },
        {
          "tag": "v9.1.1",
          "kind": "patch",
          "published_at": "2026-07-17T11:51:28Z"
        },
        {
          "tag": "renderer-json-v9.1.0",
          "kind": "other",
          "published_at": "2026-07-17T10:56:42Z"
        },
        {
          "tag": "ui-kit-v9.0.1",
          "kind": "other",
          "published_at": "2026-07-17T10:54:58Z"
        },
        {
          "tag": "renderer-react-v8.1.1",
          "kind": "other",
          "published_at": "2026-07-17T10:53:20Z"
        },
        {
          "tag": "cdk-v9.0.1",
          "kind": "other",
          "published_at": "2026-07-17T10:52:03Z"
        },
        {
          "tag": "v9.1.0",
          "kind": "minor",
          "published_at": "2026-07-17T10:51:02Z"
        },
        {
          "tag": "mcp-v9.0.0-beta.2",
          "kind": "other",
          "published_at": "2026-07-06T21:03:44Z"
        },
        {
          "tag": "renderer-json-v9.0.0-beta.2",
          "kind": "other",
          "published_at": "2026-07-06T21:02:38Z"
        },
        {
          "tag": "ui-kit-v9.0.0-beta.2",
          "kind": "other",
          "published_at": "2026-07-05T19:21:40Z"
        },
        {
          "tag": "mcp-v9.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-07-04T21:10:09Z"
        },
        {
          "tag": "renderer-json-v9.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-07-04T21:08:53Z"
        },
        {
          "tag": "ui-kit-v9.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-07-04T21:07:38Z"
        },
        {
          "tag": "renderer-react-v8.1.0-beta.1",
          "kind": "other",
          "published_at": "2026-07-04T21:06:27Z"
        },
        {
          "tag": "cdk-v9.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-07-04T21:05:21Z"
        },
        {
          "tag": "v9.0.0-beta.2",
          "kind": "prerelease",
          "published_at": "2026-07-04T21:04:24Z"
        },
        {
          "tag": "mcp-v10.0.0",
          "kind": "other",
          "published_at": "2026-07-04T02:01:29Z"
        },
        {
          "tag": "renderer-json-v9.0.0",
          "kind": "other",
          "published_at": "2026-07-04T02:00:03Z"
        },
        {
          "tag": "ui-kit-v9.0.0",
          "kind": "other",
          "published_at": "2026-07-04T01:58:46Z"
        },
        {
          "tag": "renderer-react-v8.1.0",
          "kind": "other",
          "published_at": "2026-07-04T01:57:30Z"
        },
        {
          "tag": "cdk-v9.0.0",
          "kind": "other",
          "published_at": "2026-07-04T01:56:14Z"
        },
        {
          "tag": "v9.0.0",
          "kind": "major",
          "published_at": "2026-07-04T01:55:04Z"
        },
        {
          "tag": "v9.0.0-beta.1",
          "kind": "prerelease",
          "published_at": "2026-07-04T01:50:25Z"
        },
        {
          "tag": "mcp-v9.0.0",
          "kind": "other",
          "published_at": "2026-07-02T20:13:47Z"
        },
        {
          "tag": "mcp-v8.0.0",
          "kind": "other",
          "published_at": "2026-07-02T17:21:10Z"
        },
        {
          "tag": "renderer-json-v8.0.0",
          "kind": "other",
          "published_at": "2026-07-02T17:20:09Z"
        },
        {
          "tag": "ui-kit-v8.0.0",
          "kind": "other",
          "published_at": "2026-07-02T17:19:09Z"
        },
        {
          "tag": "renderer-react-v8.0.0",
          "kind": "other",
          "published_at": "2026-07-02T17:18:05Z"
        },
        {
          "tag": "cdk-v8.0.0",
          "kind": "other",
          "published_at": "2026-07-02T17:17:03Z"
        },
        {
          "tag": "v8.0.0",
          "kind": "major",
          "published_at": "2026-07-02T17:16:00Z"
        },
        {
          "tag": "mcp-v7.0.0-beta.2",
          "kind": "other",
          "published_at": "2026-07-02T17:10:53Z"
        },
        {
          "tag": "renderer-json-v7.0.0-beta.2",
          "kind": "other",
          "published_at": "2026-07-02T17:09:38Z"
        },
        {
          "tag": "ui-kit-v7.0.0-beta.3",
          "kind": "other",
          "published_at": "2026-07-02T17:08:27Z"
        },
        {
          "tag": "renderer-react-v7.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-07-02T17:07:08Z"
        },
        {
          "tag": "cdk-v7.0.0-beta.2",
          "kind": "other",
          "published_at": "2026-07-02T17:05:57Z"
        },
        {
          "tag": "v7.0.0-beta.3",
          "kind": "prerelease",
          "published_at": "2026-07-02T17:04:49Z"
        },
        {
          "tag": "mcp-v7.0.0",
          "kind": "other",
          "published_at": "2026-07-02T06:47:33Z"
        },
        {
          "tag": "renderer-json-v7.0.0",
          "kind": "other",
          "published_at": "2026-07-02T06:46:21Z"
        },
        {
          "tag": "ui-kit-v7.0.0",
          "kind": "other",
          "published_at": "2026-07-02T06:45:15Z"
        },
        {
          "tag": "renderer-react-v7.0.0",
          "kind": "other",
          "published_at": "2026-07-02T06:44:15Z"
        },
        {
          "tag": "cdk-v7.0.0",
          "kind": "other",
          "published_at": "2026-07-02T06:43:16Z"
        },
        {
          "tag": "v7.0.0",
          "kind": "major",
          "published_at": "2026-07-02T06:42:04Z"
        },
        {
          "tag": "mcp-v7.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-07-02T00:12:47Z"
        },
        {
          "tag": "renderer-json-v7.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-07-01T23:55:45Z"
        },
        {
          "tag": "ui-kit-v7.0.0-beta.2",
          "kind": "other",
          "published_at": "2026-07-01T23:54:43Z"
        },
        {
          "tag": "v7.0.0-beta.2",
          "kind": "prerelease",
          "published_at": "2026-07-01T23:52:06Z"
        },
        {
          "tag": "renderer-json-v6.1.0-beta.1",
          "kind": "other",
          "published_at": "2026-07-01T00:07:07Z"
        },
        {
          "tag": "ui-kit-v7.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-07-01T00:06:03Z"
        },
        {
          "tag": "renderer-react-v6.1.0-beta.1",
          "kind": "other",
          "published_at": "2026-07-01T00:05:04Z"
        },
        {
          "tag": "cdk-v7.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-07-01T00:04:07Z"
        },
        {
          "tag": "v7.0.0-beta.1",
          "kind": "prerelease",
          "published_at": "2026-07-01T00:03:11Z"
        },
        {
          "tag": "v1.0.0-beta.2",
          "kind": "prerelease",
          "published_at": "2026-05-17T23:18:59Z"
        },
        {
          "tag": "ui-kit-v5.0.3",
          "kind": "other",
          "published_at": "2026-05-09T17:27:08Z"
        },
        {
          "tag": "mcp-v4.0.1-beta.1",
          "kind": "other",
          "published_at": "2026-05-09T16:12:01Z"
        },
        {
          "tag": "ui-kit-v4.0.1-beta.2",
          "kind": "other",
          "published_at": "2026-05-09T16:09:29Z"
        },
        {
          "tag": "mcp-v4.0.1",
          "kind": "other",
          "published_at": "2026-05-09T11:35:30Z"
        },
        {
          "tag": "renderer-json-v4.0.1",
          "kind": "other",
          "published_at": "2026-05-09T11:34:33Z"
        },
        {
          "tag": "ui-kit-v4.0.1",
          "kind": "other",
          "published_at": "2026-05-09T11:33:27Z"
        },
        {
          "tag": "renderer-react-v4.0.1",
          "kind": "other",
          "published_at": "2026-05-09T11:32:19Z"
        },
        {
          "tag": "cdk-v4.0.1",
          "kind": "other",
          "published_at": "2026-05-09T11:31:15Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2025-12-02T20:15:25Z"
        },
        {
          "tag": "renderer-json-v4.0.1-beta.1",
          "kind": "other",
          "published_at": "2026-05-09T10:36:58Z"
        },
        {
          "tag": "ui-kit-v4.0.1-beta.1",
          "kind": "other",
          "published_at": "2026-05-09T10:35:55Z"
        },
        {
          "tag": "renderer-react-v4.0.1-beta.1",
          "kind": "other",
          "published_at": "2026-05-09T10:34:44Z"
        },
        {
          "tag": "cdk-v4.0.1-beta.1",
          "kind": "other",
          "published_at": "2026-05-09T10:33:52Z"
        },
        {
          "tag": "v1.0.0-beta.1",
          "kind": "prerelease",
          "published_at": "2026-05-09T09:58:26Z"
        },
        {
          "tag": "mcp-v1.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-05-09T10:04:37Z"
        },
        {
          "tag": "renderer-json-v1.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-05-09T10:03:30Z"
        },
        {
          "tag": "ui-kit-v1.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-05-09T10:02:16Z"
        },
        {
          "tag": "renderer-react-v1.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-05-09T10:00:49Z"
        },
        {
          "tag": "cdk-v1.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-05-02T13:48:21Z"
        },
        {
          "tag": "mcp-v4.0.0",
          "kind": "other",
          "published_at": "2026-05-08T22:27:19Z"
        },
        {
          "tag": "renderer-json-v4.0.0",
          "kind": "other",
          "published_at": "2026-05-08T22:25:46Z"
        },
        {
          "tag": "ui-kit-v4.0.0",
          "kind": "other",
          "published_at": "2026-05-08T22:23:52Z"
        },
        {
          "tag": "renderer-react-v4.0.0",
          "kind": "other",
          "published_at": "2026-05-08T22:22:02Z"
        },
        {
          "tag": "cdk-v4.0.0",
          "kind": "other",
          "published_at": "2026-05-08T22:20:09Z"
        },
        {
          "tag": "v5.0.0",
          "kind": "major",
          "published_at": "2026-05-08T22:18:39Z"
        },
        {
          "tag": "mcp-v4.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-05-08T18:15:21Z"
        },
        {
          "tag": "renderer-json-v4.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-05-08T18:14:01Z"
        },
        {
          "tag": "ui-kit-v4.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-05-08T18:12:37Z"
        },
        {
          "tag": "renderer-react-v4.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-05-08T18:10:56Z"
        },
        {
          "tag": "cdk-v4.0.0-beta.1",
          "kind": "other",
          "published_at": "2026-05-08T18:09:34Z"
        },
        {
          "tag": "v2.0.0-beta.14",
          "kind": "prerelease",
          "published_at": "2026-05-08T18:07:59Z"
        },
        {
          "tag": "mcp-v1.0.0-beta.14",
          "kind": "other",
          "published_at": "2026-05-07T14:38:04Z"
        },
        {
          "tag": "renderer-json-v1.0.0-beta.6",
          "kind": "other",
          "published_at": "2026-05-07T14:36:39Z"
        },
        {
          "tag": "ui-kit-v1.0.0-beta.4",
          "kind": "other",
          "published_at": "2026-05-07T14:35:19Z"
        },
        {
          "tag": "renderer-react-v1.0.0-beta.6",
          "kind": "other",
          "published_at": "2026-05-07T14:33:38Z"
        },
        {
          "tag": "cdk-v1.0.0-beta.6",
          "kind": "other",
          "published_at": "2026-05-07T14:31:59Z"
        },
        {
          "tag": "v2.0.0-beta.13",
          "kind": "prerelease",
          "published_at": "2026-05-07T14:30:15Z"
        },
        {
          "tag": "mcp-v1.0.0-beta.13",
          "kind": "other",
          "published_at": "2026-05-03T15:02:07Z"
        },
        {
          "tag": "renderer-json-v1.0.0-beta.5",
          "kind": "other",
          "published_at": "2026-05-03T15:01:20Z"
        },
        {
          "tag": "ui-kit-v1.0.0-beta.3",
          "kind": "other",
          "published_at": "2026-05-03T15:00:10Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "df9f667b3f107dd90b2ea5bb82f5b430e0a07c2d",
          "body": "В CLAUDE.md/AGENTS.md было сказано, что beads сам автокоммитит свои файлы и\nручной `bd export` обычно не нужен. Это не соответствует поведению в\nembedded-режиме: задачи пишутся в gitignored .beads/embeddeddolt/, а трекаемый\nissues.jsonl не обновляется — за 11–20 июля из git выпали 24 задачи.\n\nДобавл\n[…]\nь\nрассинхрон, предупреждение про `bd export` без `-o` (печатает в stdout) и про\nисключение памяти из экспорта. Уточнено, что interactions.jsonl — append-only\nжурнал и коммитится вместе с issues.jsonl.",
          "is_bot": false,
          "headline": "docs: исправить инструкцию по beads-синхронизации",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-20T16:19:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2a174de7ea0fc4183e02ae694028869d4a7c66d8",
          "body": "Экспорт накопленных задач из embedded Dolt в трекаемый JSONL: +24 задачи\n(включая эпик ReFormer-aa6 с 7 подзадачами по императивным handle) и +8 записей\nаудита. Только append, существующие 34 записи не тронуты.\n\nПредыдущая синхронизация была 11 июля — с тех пор задачи жили только в\n.beads/embeddeddolt/, который в .gitignore, то есть не переживали клон.",
          "is_bot": false,
          "headline": "chore(beads): sync issues jsonl",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-20T16:18:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d071eff083e9d1737a4826891987c1f0d5c4070",
          "body": "…andles\n\nfeat(reformer-ui-kit)!: императивные handle полей, доступные из схемы по селектору",
          "is_bot": false,
          "headline": "Merge pull request #46 from AlexandrBukhtatyy/feat/imperative-field-h…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-20T16:07:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7c1e7d2feb1c1a1283204c53864868094eb5a55",
          "body": "… по селектору\n\nПоля ui-kit получают типизированный императивный handle через ref, доступный из\nrender-схемы по селектору: schema.node(sel).getRef<H>(). Мост «узел схемы → живой\nкомпонент» раньше работал только для контейнеров (FormWizard/FormArray): для\nлистовых полей ref не прикреплялся, и getRef(\n[…]\nPassword\nотдаёт InputPasswordHandle вместо HTMLInputElement, SelectAsync —\nSelectAsyncHandle вместо HTMLButtonElement. Код, который читал через ref сам\nDOM-узел, должен перейти на handle.getElement().",
          "is_bot": false,
          "headline": "feat(reformer-ui-kit)!: императивные handle полей, доступные из схемы…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-20T15:27:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "206b463ccff16e521c09180c3217acd054b790ce",
          "body": "…norepo-patch\n\nfix(ci): guard undefined commits в fail-хуке semantic-release-monorepo",
          "is_bot": false,
          "headline": "Merge pull request #45 from AlexandrBukhtatyy/fix/semantic-release-mo…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-17T12:53:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ff51f1b517df0472ba677598a147bddf45ff68f",
          "body": "withFiles делает commits.map без guard. В хуке fail при раннем сбое\n(verifyConditions — до analyzeCommits) context.commits ещё не собран, и\nTypeError затирает настоящую ошибку релиза: сбой по протухшему NPM_TOKEN\nчитался как невнятный TypeError на всех 6 пакетах.\n\nUpstream 8.0.2 — latest, фикса нет, репозиторий не указан. Отключить fail\nнельзя: через него @semantic-release/github создаёт issue о сбое релиза.\nПатчим через patch-package: (commits ?? []).map.\n\nRefs: ReFormer-yli",
          "is_bot": false,
          "headline": "fix(ci): guard undefined commits in semantic-release-monorepo fail hook",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-17T12:48:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e7e873af0febfec28017bd57a4e871abb08eb52",
          "body": "feat(reformer-ui-kit): описать миграцию с v6 и выпустить мажор",
          "is_bot": false,
          "headline": "Merge pull request #44 from AlexandrBukhtatyy/fix/ui-kit-major-release",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-17T12:01:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec680dccbc161027f516fe3f93bd75b319cbbd0b",
          "body": "Миграция на shadcn уже в main, но вышла как 9.0.1/9.0.2 (patch): сначала\nsemantic-release работал на angular-preset и не понял \"!\" в заголовке, затем\nпустой релизный коммит был отфильтрован semantic-release-monorepo — тот отбирает\nкоммиты по изменённым файлам пакета, а пустой не трогает ничего.\n\nЭто\n[…]\nrt, table, calendar, sidebar, combobox, date-picker,\ndrawer, command, carousel, sonner, input-otp, resizable, message-scroller)\nдоступны только через свой subpath и требуют optional peer-зависимостей.",
          "is_bot": false,
          "headline": "feat(reformer-ui-kit): описать миграцию с v6 и выпустить мажор",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-17T12:01:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b921b086196d0c9f1a613f1d1e44d5ed4c46c9fd",
          "body": "fix(ci): починить релиз mcp и распознавание breaking-коммитов",
          "is_bot": false,
          "headline": "Merge pull request #43 from AlexandrBukhtatyy/fix/release-pipeline",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-17T11:47:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8470839f3be40a737a5ef5f32b39309fb92f7808",
          "body": "Пустой релизный коммит: сама миграция уже в main (e1877ad), но вышла как 9.0.1\n(patch) — прошлый прогон semantic-release работал на angular-preset и не понял\n\"!\" в заголовке. Этот коммит несёт корректный футер, чтобы выпустить мажор.\n\nBREAKING CHANGE: @reformer/ui-kit переписан на shadcn/ui (new-yor\n[…]\nrt, table, calendar, sidebar, combobox, date-picker,\ndrawer, command, carousel, sonner, input-otp, resizable, message-scroller)\nдоступны только через свой subpath и требуют optional peer-зависимостей.",
          "is_bot": false,
          "headline": "feat(reformer-ui-kit): v7 shadcn migration",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-17T11:28:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "76ba7fe4fc46ee0dfabb2e49183b4f3a14a08d4f",
          "body": "Две проблемы, вскрытые первым успешным Release после восстановления npm-токена\n(5 из 6 пакетов опубликовались, mcp упал):\n\n1. Release @reformer/mcp падал на сборке: TS2307 Cannot find module\n   '@reformer/ui-kit/meta'. Волна 4 добавила в mcp ленивый import ui-kit/meta\n   (props-валидация) — импорт д\n[…]\nсть фильтрация коммитов\n   по пакету сохраняется.\n\nЗаодно добавляю renderer-react в deps ui-kit — без него ui-kit собирался с\nTS2307 (declaration-файлы неполные), хотя vite-plugin-dts сборку не валил.",
          "is_bot": false,
          "headline": "fix(ci): починить релиз mcp и распознавание breaking-коммитов",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-17T11:27:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7283847d9b3143219776f9bb5975982cd2f55680",
          "body": "fix(deps): пересинхронизировать package-lock — чинит npm ci на main",
          "is_bot": false,
          "headline": "Merge pull request #42 from AlexandrBukhtatyy/feat/ui-kit-shadcn-v7",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-17T09:41:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcf8d23258eab5f4189fb5f60820d352731a229f",
          "body": "…ю input\n\nChrome рисует ::-webkit-calendar-picker-indicator вплотную к дате (margin-left: 0,\nposition: static), из-за чего в боевых формах иконка висела в середине широкого\nполя, а не у правого края.\n\nshadcn это не покрывает: для дат он предлагает DatePicker и native type=\"date\" не\nстилизует. У нас \n[…]\nльзуется в формах напрямую — поэтому осознанно\nотклоняемся от upstream на один класс: [&::-webkit-calendar-picker-indicator]:ml-auto.\nУ остальных типов input этого псевдоэлемента нет, класс безвреден.",
          "is_bot": false,
          "headline": "fix(reformer-ui-kit): прижать нативную иконку календаря к правому кра…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-17T08:21:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d41018cd39fafd02272933759d56600270c8d0b5",
          "body": "…egistry\n\nВолна 4 добавила @reformer/ui-kit в optionalDependencies mcp со спецификатором\n>=7.0.0. Две проблемы:\n\n- optionalDependencies npm ставит с registry, а не линкует workspace. В итоге\n  mcp тянул опубликованный @reformer/ui-kit@9.0.0 (старый v6-код) вместо нашего\n  локального v7 — то есть pro\n[…]\nt в peerDependencies + peerDependenciesMeta.optional (так же,\nкак объявлен @reformer/core в mcp и @reformer/ui-kit в renderer-json) и\nослабляю до >=6.0.0. Registry-дубль исчез, mcp резолвит workspace.",
          "is_bot": false,
          "headline": "fix(reformer-mcp): ui-kit в peer-optional — резолв workspace вместо r…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-17T07:49:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b143979fa7fc3b0072964da4969ee758b61dd61c",
          "body": "CI падал на npm ci, а за ним ещё 4 шага. Разобрано по порядку:\n\n- npm ci: package-lock не был синхронизирован с package.json после установки\n  тяжёлых optional-peer зависимостей ui-kit -> npm install пересинхронизировал\n- typecheck: message-scroller импортировал @shadcn/react/message-scroller (это\n \n[…]\nhite, дефолт стал bg-card (токен темы) -> обновлён\n\nЛокально пройдены все шаги CI: lint (0 errors), format:check, typecheck (0),\nui-kit 649 тестов, renderer-json 60, size-limit, form-schema diff пуст.",
          "is_bot": false,
          "headline": "fix(ci): починить пайплайн после v7-миграции",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-17T07:02:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1e87d922c5158cfe03fe563ccfab0453715b72ec",
          "body": "npm ci в CI падал (Missing @reformer/ui-kit... from lock file): при установке\nтяжёлых optional-peer зависимостей ui-kit (react-day-picker/date-fns/cmdk/vaul/\nsonner/embla/recharts/@tanstack-react-table/input-otp/react-resizable-panels)\npackage-lock.json не был полностью пересинхронизирован. npm install обновил lock.",
          "is_bot": false,
          "headline": "fix(deps): пересинхронизировать package-lock с heavy-deps ui-kit",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-17T06:40:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00091fa1a1b19d5ab2c4f6ba1ced91a2864aacd5",
          "body": "feat(ui-kit): миграция @reformer/ui-kit на shadcn/ui (v7, breaking)",
          "is_bot": false,
          "headline": "Merge pull request #41 from AlexandrBukhtatyy/feat/ui-kit-shadcn-v7",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-17T06:25:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e03ecdb1f570c5941b7a36f7cfcbf6f2f99b088b",
          "body": "v6-версия ExampleCard использовала жёсткие цвета (bg-white, text-gray-600,\nbg-blue-100), из-за чего в витрине заголовок карточки был почти невидим\n(наследовал светлый цвет на белом фоне) и карточка не адаптировалась к теме.\n\n- bgColor по умолчанию bg-white -> bg-card\n- заголовок: + text-card-foregro\n[…]\nt-gray-600 -> text-muted-foreground\n- кнопка-тумблер: bg-blue-100/text-gray-* -> bg-primary/10, accent, muted-foreground\n\nCode-блок оставлен тёмным (осознанный terminal-стиль, читается в обеих темах).",
          "is_bot": false,
          "headline": "fix(reformer-ui-kit): example-card на токены темы вместо жёстких цветов",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-17T06:05:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "636227c242f5e4d9aee6404ac652fdc4340c40ed",
          "body": "…омпонентов\n\nКорневая причина, из-за которой многие компоненты витрины (Alert/Card/Dialog/\nCombobox/Command/Context-menu/Input/Select) выглядели не как в shadcn: у них\nчёрные рамки вместо светло-серых. shadcn опирается на глобальное правило\n`@layer base { * { @apply border-border } }`, которое задаё\n[…]\n а reformer-demo.css — нет.\n\nЗадаю border-color: var(--border) в универсальном reset (демо + radix-порталы).\nПроверено: Alert/Combobox(trigger+dropdown+items)/Dialog — рамки oklch(0.922) как в shadcn.",
          "is_bot": false,
          "headline": "fix(docs): задать border-color var(--border) — корень «непохожести» к…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-16T22:47:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e25cd3b529f30fa118c59c980112f1e9088d6bd7",
          "body": "react-day-picker внутри Calendar/DatePicker рендерит <table>, а тема Docusaurus\n(Infima) вешает на неё зебра-полосы (tr:nth-child(2n) → фон) и рамки ячеек —\nиз-за чего сетка календаря шла тёмными полосами. Гашу background/border-color\nу table/tr/td/th в зоне демо и radix-порталов (вне @layer + !important, чтобы\nперебить неслойные правила Infima по специфичности).",
          "is_bot": false,
          "headline": "fix(docs): погасить зебру и рамки темы docusaurus у table в демо",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-16T22:34:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d053c8f8ce1787a8012c124f1792320f08a20f2c",
          "body": "…adding\n\nPortal-контент (Popover/Select/DropdownMenu/Tooltip/Dialog/Sheet и Calendar\nв DatePicker) Radix рендерит в document.body — вне .reformer-demo, поэтому\nscoped preflight туда не доставал: дни календаря и пункты дропдаунов рисовались\nнативными кнопками (серый outset). Плюс в универсальном rese\n[…]\nрен на [data-radix-popper-content-wrapper] + data-slot\n  контента модалок (dialog/alert-dialog/sheet/drawer/command)\n- добавлены margin: 0 / padding: 0 в универсальный reset (как в Tailwind Preflight)",
          "is_bot": false,
          "headline": "fix(docs): распространить preflight-reset на radix-порталы и margin/p…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-16T22:24:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5cd7b0cbfe6573296c86d939d9b685cf324fa33f",
          "body": "Витрина ui-kit в Docusaurus не тянет полный @import 'tailwindcss' (preflight\nсломал бы Infima-тему), но восстанавливала из него только box-sizing. shadcn-\nкомпоненты рассчитывают на весь reset — без него нативные стили ломали верстку\n(кнопки с border: 2px outset и Arial, border-классы давали outset,\n[…]\n (bg-primary) побеждают reset\n- добавил недостающие токены --chart-* / --sidebar-* (+ @theme inline) для chart/sidebar\n\nInfima-тема сайта не задета (reset заскоуплен в .reformer-demo). Build проходит.",
          "is_bot": false,
          "headline": "fix(docs): scoped preflight для живых демо ui-kit",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-16T22:00:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e1877ada7ac97e6e7b932c512e8a4ad6812041eb",
          "body": "Полная переработка @reformer/ui-kit на shadcn/ui (breaking, greenfield replace).\n\nКомпоненты (волны 1-3):\n- 72 компонента в src/components/<cmp>/variants/{base,...}, концепт вариантов\n- form-версии через withFormControl + адаптеры + алиасы *Field\n- props-компаньоны (.props.ts): controls в доке + DSL\n[…]\n-json: валидация componentProps (60 тестов) + MCP validate_json_schema\n- README (пакет + корень) + llms.txt; size-limit в CI (21 кап)\n\ne2e-адаптация под v7 DOM (796/984) -> follow-up ReFormer-jjl.7.1.",
          "is_bot": false,
          "headline": "feat(reformer-ui-kit)!: migrate to shadcn/ui new-york (v7)",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-16T21:38:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9faaf2df434eecbcb538fe4d838a920e0a320af1",
          "body": "docs: translate readme to russian for language uniformity",
          "is_bot": false,
          "headline": "Merge pull request #40 from AlexandrBukhtatyy/develop",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-12T18:04:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be9ee9dcebd629aaf50c03dbbab3c66b998b0532",
          "body": "Bring the README to a single language (Russian): prose, section headings,\ncode comments, and UI-facing example strings (labels, buttons, error messages)\nare now Russian, while code identifiers, APIs, operators, package names,\nimports, testId and enum values stay unchanged.",
          "is_bot": false,
          "headline": "docs: translate readme to russian for language uniformity",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-12T09:28:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5eef17091ac10fdb55f828f59ab734116a95ef0",
          "body": "Develop",
          "is_bot": false,
          "headline": "Merge pull request #39 from AlexandrBukhtatyy/develop",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-12T08:55:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "766ca8a67c32863429a8a91d544fba3785d8d0b6",
          "body": "Rewrite all code examples for the current M1 architecture: createModel +\ncreateForm({ model, schema }) + validateFormModel, validators inline in the\nschema, and defineFormBehavior behaviors. Drop the removed legacy validation\nengine (validate/applyWhen/ValidationSchemaFn) and path-based renderer/beh\n[…]\ne approaches\" section that renders the same form via\nimperative FormField, renderer-react (createRenderSchema, value: model.$.x),\nand renderer-json (string operators + registry + convertJsonToM1Tree).",
          "is_bot": false,
          "headline": "docs: update readme examples to v6 m1 api and add rendering approaches",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-11T23:17:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "db567b41a4aa7978d29826fcd0d8470794067199",
          "body": null,
          "is_bot": false,
          "headline": "chore(core): regenerate llms.txt after safe-effect jsdoc cleanup",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-11T23:00:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "293079c67c0d7b3a3536caed4180ac9a6fa50522",
          "body": "Reorganize @reformer/core src into two boundary-enforced modules over a shared\nsignals runtime:\n\n- src/state/**: pure reactive substrate — createModel/FormModel (proxy on\n  @preact/signals-core), value behaviors (computeFrom/copyFrom/...), producer\n  flag (derived-registry), safe-effect, subscriptio\n[…]\neck, full build, size all green; boundary\nfires on negative test; single-runtime identity preserved across . / /state /\n/signals. Design + module-contract roadmap: docs/plans/snappy-bouncing-rossum.md",
          "is_bot": false,
          "headline": "refactor(core): split into state + form modules with enforced boundary",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-11T22:12:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "845d306a7cfca49a09a9267a3242d66fc87ed8a0",
          "body": "Develop",
          "is_bot": false,
          "headline": "Merge pull request #38 from AlexandrBukhtatyy/develop",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-11T09:25:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "417c8123f0f82857b46b430583f1ac429e065b2b",
          "body": "… index\n\nRemove the `async-select` entry from the examples list in App.tsx and\nthe corresponding bullet in the docs examples overview.",
          "is_bot": false,
          "headline": "chore: drop the async-select example from the playground nav and docs…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-11T08:25:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e793bcb0f984fb3e356e94fc25ee53b26d529a77",
          "body": "Replace the local `const m = model.$` alias with direct `model.$.<field>`\naccess everywhere it was declared:\n\n- example code: mcp-credit-application (core-v20, renderer-react-v20)\n  and complex-multy-step-form (validation, render-schema)\n- doc examples: renderer-react docs/llms/* (+ regenerated llms\n[…]\n`item` (e.g.\naddressFields' `m: FormModel<Address>` accessed as `m.$.x`) are left\nas-is — they are not the alias. The plan doc discussing the idiom is\nintentionally untouched.\n\ntsc -b and eslint pass.",
          "is_bot": false,
          "headline": "refactor: inline model.$ and drop the `const m = model.$` alias",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-11T00:09:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "db2d7ab7cec86d4813816a494981ad67567db07c",
          "body": "Accumulated dev-plan files under docs/plans/ (untracked until now).",
          "is_bot": false,
          "headline": "chore(docs): add planning documents",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-10T23:25:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfdaa5aab0618c79512674790a40f81fcff5af29",
          "body": ".beads/.auto-import-issues.jsonl is a per-machine import watermark\n(size+mtime of issues.jsonl); it must not be tracked. Add it to\n.beads/.gitignore next to the other local-only sync-state files.",
          "is_bot": false,
          "headline": "chore: gitignore beads local auto-import watermark",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-10T23:25:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec1c589ec00cdf49af60de4cc6905ce82177e801",
          "body": "Clarify that beads changes reach git via `bd export -o .beads/issues.jsonl`\nplus a `chore(beads): sync issues jsonl` commit -- not `bd dolt push`, which\nonly pushes the embedded Dolt DB and leaves the git working tree unchanged.\nMirrored \"Beads sync\" section added to CLAUDE.md and AGENTS.md.",
          "is_bot": false,
          "headline": "docs: document beads git-sync process",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-10T23:16:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3bd4805d73e46d9a66301847a88da0f7b433edd4",
          "body": null,
          "is_bot": false,
          "headline": "chore(beads): sync issues jsonl",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-10T22:55:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "106c615066a6e57256b69789f31ebeb07fd24cd9",
          "body": null,
          "is_bot": false,
          "headline": "bd: update sync.remote",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-10T22:44:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e2304f717160ef478cc44974a836acf052e849a",
          "body": "…alias\n\nModelApi.set: change signature Partial<T> -> T and remove @deprecated.\n- rewrite JSDoc (full set; derived compute-targets untouched; patch for partial)\n- runtime unchanged: set/patch still share group.set merge; with a full T it\n  writes every key while preserving the derived-field skip (F9)\n- fix form-model.test.ts: pass a complete CreditForm to set()\n- sync llms docs (28/29/03, mcp/05) + regenerated llms.txt; partial-payload\n  example switched set -> patch\n\nCloses ReFormer-d8z",
          "is_bot": false,
          "headline": "refactor(reformer): require full value in model set, drop deprecated …",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-10T22:41:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8bd809a0eead87f9ac2d8337aa08cf60430dfec3",
          "body": null,
          "is_bot": false,
          "headline": "chore(react-playground): remove async-select demo page",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-10T21:43:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc7c3d454390f4daad29125a111a8412c0c1bb09",
          "body": "model.<group> now returns a full FormModel<T[K]> (with .$ and ModelApi),\nsymmetric with array items — so group sub-schema helpers mirror the\narray-item form: (m: FormModel<Sub>) => m.$.field, called helper(model.group).\n\nAdditive: ModelValue's object branch becomes FormModel (a superset of the\nold v\n[…]\nty\n- examples: migrate group helpers in complex-multy-step-form schema/validation;\n  inline/array bindings stay uniform as model.$.<path> / item.$.<path>\n- docs: JSDoc, docs/llms, reformer-doc (en+ru)",
          "is_bot": false,
          "headline": "feat(reformer): promote nested object groups to sub-models",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-10T21:02:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bd4824cff924920100626eb7c3f2bd88e224d298",
          "body": "ui-kit imports RenderNodeComponent from @reformer/renderer-react, but the\nstackblitz:start chain built ui-kit first. On a clean StackBlitz clone\nrenderer-react/dist did not yet exist when vite-plugin-dts resolved ui-kit\ntypes, breaking the build and aborting the chain before playground started.\nReorder to the correct topological order:\ncore -> cdk -> renderer-react -> ui-kit -> renderer-json -> playground.",
          "is_bot": false,
          "headline": "fix(stackblitz): build renderer-react before ui-kit in start chain",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-10T14:45:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e19105f1f17ed8c99a2447c750ecf9742f94878",
          "body": null,
          "is_bot": false,
          "headline": "docs(reformer): restyle some parts",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-07T17:52:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4be1a69d6ca01f08f3e86d30a95b318d4bb96324",
          "body": "Rewrite the Core docs section for @reformer/core v6 (m1 architecture:\ncreateModel + createForm + validateFormModel), removing legacy API\n(new FieldNode, form.controls, show/hide, omnibus number, path/validate).\n\n- restructure coreSidebar into a progressive onboarding path\n- add pages: core-concepts/model and patterns arrays, submit-and-reset, async-preload\n- split intro (philosophy) from packages/core (package hub)\n- mirror updated russian content into the i18n/ru locale slot",
          "is_bot": false,
          "headline": "docs(reformer): rewrite core documentation for m1 architecture",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-07T17:36:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd33999d19683f59f213ecd1108c2352cc3fc25b",
          "body": "Docs deploy has failed since the docs began importing @reformer/* live:\ndeploy-docs ran `npm run build -w reformer-doc` right after `npm ci` without\nbuilding the workspace packages first, so their `exports` (-> dist/) resolved\nto missing files (\"no valid target file was found\").\n\nBuild core/cdk/renderer-json/renderer-react/ui-kit before the docs build.",
          "is_bot": false,
          "headline": "fix(ci): build workspace packages before docs build",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-06T21:30:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa662aa322e88c76abc7eafd0c5b062b2005ad67",
          "body": "… capability recipes\n\nVariants = the component's configuration-forms (default + customizations),\ngrounded in the real API; Examples = capability/behavior recipes. Component\nstates (empty/filled/disabled/invalid) and styling are no longer Variants.\n\n- Select: single / grouped / custom-item (manual co\n[…]\ned\n  forms (multi-select, indeterminate checkbox, branching wizard) recorded as TODO\n- harness: add touched flag (used by validation examples)\n- Add audit report documenting the forms-vs-recipes split",
          "is_bot": false,
          "headline": "feat(docs): recut component variants as functional forms, examples as…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-06T21:02:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "54e80acf527157eeb79fa84d7f03db5ce44a5c2c",
          "body": "…ev-warn\n\nThe structured { $locale, params } string form now resolves a $model(path)\nparam to a static snapshot (signalAt(path).peek() — current value at convert\ntime, no subscription) instead of passing the raw operator string to the\nformatter. Because the string path is non-reactive by design, it \n[…]\nthe reactive <I18n> component for live model values.\n\nLiteral-only params are unaffected (same object reference, no warning).\nTests: snapshot value + warn assertion, no-warn for literals (54 passing).",
          "is_bot": false,
          "headline": "feat(renderer-json): snapshot $model in structured $locale params + d…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-06T20:05:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a20e1067e3796f49f1c3d36493ca88a337833780",
          "body": "Two registry-resolved JSON-DSL markers plus a pluggable, dependency-free\nlocalization layer for @reformer/renderer-json.\n\nMarkers:\n- $fn(name): pass a registry-registered function to a component prop. Separate\n  registry kind (reg.fn) with a callable assert + static cross-type validation\n  (validate\n[…]\nson_schema gains fnNames/localeKeys. Docs: 02/03 updated, new\n08-i18n guide. Tests: operators, converter, validate, registry, locale-service,\nsignal-unwrap (52 passing). Full monorepo typecheck clean.",
          "is_bot": false,
          "headline": "feat(renderer-json): add $fn/$locale markers and flexible i18n system",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-06T18:34:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3812e3ea8b73a05cd212adefafd5f23444fa14ed",
          "body": "- minimal mode: toolbar shows only Preview/Code tabs, canvas is\n  edge-to-edge (no track gutter, border or resize handle); in minimal\n  the preview theme follows the active site theme reactively\n- opt-in hint prop: info icon + hover tooltip at the toolbar right edge\n  in any mode; tooltip width is b\n[…]\n never gets\n  clipped by the panel overflow on narrow variants cards\n- variants cards now show the title only; the description is moved into\n  the hint tooltip (hint falls back to variant description)",
          "is_bot": false,
          "headline": "feat(docs): add minimal preview mode and header hint tooltip",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-06T18:06:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5704fa8265d3f92f2cedb95a898171612af510d4",
          "body": "Add an Info-icon button at the right of the ComponentDoc tab bar that\nreveals a hover/focus tooltip clarifying the difference: variants are\npreconfigured states of a component, examples are usage recipes in code.\nWired with useId + aria-describedby for accessibility.",
          "is_bot": false,
          "headline": "feat(docs): add info tooltip explaining variants vs examples tabs",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-05T19:11:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b39945a6861dd0fc75be82ee2a5a7c1c71972f8a",
          "body": "…button\n\nThe chevron was a flex child of the trigger, so the pr-8 added for the\nclear button also pushed the chevron onto the clear button's right-8\nposition: both icons landed in the same 32-48px band and overlapped.\n\nPin the chevron with absolute right-3 (independent of padding), give the\ntrigger relative + pr-9 to reserve room for it, and widen the wrapper's\nclearable padding to pr-14. Result: value then clear then chevron, no overlap.",
          "is_bot": false,
          "headline": "fix(reformer-ui-kit): keep select chevron from overlapping the clear …",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-05T18:52:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9238e1c84bd487dcea16665507d8e87086f72a97",
          "body": "Extract the preview panel from ApiExplorer into a reusable <ApiPreview>\n(toolbar with Preview/Code tabs + Dark/Background toggles, resizable\nthemed canvas, code view with per-flavor select, optional footer slot).\n\n- Variants and Examples now render <ApiPreview showFooter={false}> — the\n  form-bound \n[…]\n to 1 at <=996px); card\n  drops its own border (the panel provides it); toolbar wraps in narrow\n  cells; last panel section drops its bottom divider so a footerless\n  panel has a clean rounded bottom.",
          "is_bot": false,
          "headline": "refactor(docs): reuse preview panel on variants and examples tabs",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-05T16:31:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "32ac4f46a2950af48a846c83e0b2cba085606d17",
          "body": "…ections\n\n- Таб API: ручка ресайзит тематизированную превью-поверхность (apiCanvas)\n  внутри полноширинного трека — разделитель карточки остаётся непрерывным;\n  ручка во всю высоту поверхности на правом крае, иконка GripVertical вместо\n  полоски. Починен чекбокс-фон (перекрывался цветом темы).\n- Главная: грид пакетов перемещён вниз (после quick-start и фич).",
          "is_bot": false,
          "headline": "feat(docs): resizable preview canvas with grip handle; reorder home s…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-05T12:55:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f54866f1a0ea1582055aaa0c732ea08968e4947d",
          "body": "…ponent docs\n\nПолная переработка сайта документации reformer-doc:\n\n- Главная: новый лендинг (hero, грид пакетов, quick-start, фичи).\n- Навигация: раздельные per-package сайдбары (Core/CDK/UI-Kit/Renderer/MCP)\n  + Playground; боковая навигация показывает только активный раздел.\n- Landing-страницы для\n[…]\nворк демо-компонентов.\n- Контент: validation/behaviors/schemas/patterns переписаны с legacy\n  path-API на M1 (обе локали ru/en).\n- Витрина Examples и очистка template-остатков; onBrokenLinks: 'throw'.",
          "is_bot": false,
          "headline": "feat(docs): reimagine site — per-package navigation + interactive com…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-05T10:59:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9ec3beaff38151c4700a3231e82df29a38a5604d",
          "body": "Preview component now fills full available width and is left-aligned\n(was centered + capped at 520px). Add a drag handle on the canvas right\nedge to resize the container and check responsive behavior; a live width\nbadge shows during drag, double-click resets to 100%.",
          "is_bot": false,
          "headline": "feat(docs): resizable, left-aligned api preview canvas",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-05T09:57:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f63f8d7a421d1db39a2bf3cd552e06972a352a9",
          "body": "…ntainers",
          "is_bot": false,
          "headline": "style(react-playground): remove max-width constraints from example co…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T21:40:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e02e692105804a5b1b7bb7b1546021a35424603",
          "body": "Re-ran gen:form-schema after the generator change. componentOp is now an enum of\n$component(Name) values; node discrimination uses if/then/else (from the base schema).",
          "is_bot": false,
          "headline": "chore(react-playground): regenerate form meta-schema with component enum",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T20:59:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db80f72165521c1a41958489796b70624e1379e7",
          "body": "…tern in meta-schema\n\nbuildFormSchemaMetaSchema now tightens $component(...) to an enum of exact values\n(\"$component(Input)\", …) rather than an alternation pattern.\n\n- ajv lists the allowed names in the error text instead of a regex mismatch\n- IDE autocompletes the enum values\n- no regex escaping of names (e.g. $fieldWrapper); escapeRe removed",
          "is_bot": false,
          "headline": "fix(reformer-renderer-json): emit component enum instead of regex pat…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T20:59:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00f843d65b60163bd8d71b315c71f2cc0f7796af",
          "body": "- #94 core readme quick start rewritten to createModel + createForm({model,schema})\n- #95 doc site validation/behaviors pages use the m1 validator/behavior api\n- #96 top-level validation.md and behaviors.md reference real types/options\n- #97/#99 package readmes fixed (ui-kit no longer a cdk copy; renderer-react stub)",
          "is_bot": false,
          "headline": "docs: remove pre-m1 legacy api from guides and doc site",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T19:43:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "910b1b77ef4d8f91f3fbf6e84969d20798640a16",
          "body": "…oneof errors\n\n- #69 ajv oneOf errors condensed to the relevant node instead of a wall\n- #70 wrapper field on JsonFieldNode honored by the converter\n- #73 object-array items get a proper default when initialValue is omitted\n- #74 resolveDataSource enforces the dataSource type check\n- #98 add a real README; fix files field\n- + converter unit tests",
          "is_bot": false,
          "headline": "fix(reformer-renderer-json): converter wrapper/initialvalue; clearer …",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T19:43:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a55aa6c646d1e3944c6415cea8cd18fd13ee65d",
          "body": "…th exports\n\n- #68 error boundary around user field/container components\n- #63 memoized render nodes; per-node version instead of one global signal\n- #64 field renderer consumes only value+disabled; stable handlers\n- #66 movement aria-labels and button classes overridable via componentProps\n- #67 lifecycle helpers aligned (onInit/onDestroy)\n- #62 package.json drops unbuilt ./form-array and ./form-wizard exports\n- + first tests for the react renderer",
          "is_bot": false,
          "headline": "fix(reformer-renderer-react): error boundary, memo granularity, subpa…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T19:43:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9686ff96c00cfe87d13553d0f9c532e046a7f355",
          "body": "- #81 add-form-array json guidance uses m1 operator dsl\n- #82 add-wizard b3 uses createRenderSchemaFromJsonM1 + m1 mount flow\n- #83/#87 plan-form marks credit fixtures as example; drops removed path-context\n- #85/#86 debug.md legacy applyWhen; clearWhenOff marked playground-local\n- #78/#79 find-recipe ranked matching + guarded topic arg\n- #77 report-issue guarded fs writes\n- + first tests for the mcp package (find-recipe, report-issue)",
          "is_bot": false,
          "headline": "fix(reformer-mcp): correct pre-m1 prompt drift; harden tools; add tests",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T19:43:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92b03a8e9664cbc2eb52864a563e29aec1adf665",
          "body": "- #42 FormArray exposes errors/valid/invalid + FormArrayError subcomponent (barrel)\n- #43 disabled arrays disable Add/Remove buttons\n- #44 removeAt/at + reorder helpers on hook/context for api parity\n- #45 control prop admits ModelArrayNode without a cast\n- #48 FormField.Control asChild binds value/\n[…]\nge/onBlur/disabled\n- #54 FormField.Error keeps ref in multi/render modes\n- #49/#51 wizard step-change live-region; completedSteps invalidated on back\n- + headless unit tests for FormArray/Wizard/Field",
          "is_bot": false,
          "headline": "fix(reformer-cdk): surface array errors/disabled; wizard and field fixes",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T19:42:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6dd1556f53adefcd24342d74bd9ef2ed80b772e2",
          "body": "…ut buffer\n\n- #105 Select forwards label/description/error/required ARIA to trigger\n- #56/#106 Checkbox associates label with input; drops dangling aria-labelledby\n- #107 RadioGroup gets role=radiogroup, shared name, aria wiring\n- #55 Number Input keeps a raw string buffer for decimals/intermediate \n[…]\nut\n- #58/#59 Select theming + surfaced resource-load errors\n- #110 loading/error/pending states announced via aria-live/role\n- #57 ./form-field subpath export points at a built file; + component tests",
          "is_bot": false,
          "headline": "fix(reformer-ui-kit): a11y for select/checkbox/radiogroup; number inp…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T19:39:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ce1754d64d7503408f507d1244f1107e26ec0f5",
          "body": "…eset/dispose leaks\n\n- #1 submit()/validate() run schema validators via bound validateFormModel\n- #2 GroupNode.reset() clears form-level errors\n- #4 ModelArrayNode disposes per-item forms on remove/clear/dispose\n- #14 schema-node asyncValidators executed by validate walk()\n- #9/#25 unmarkDerived ref\n[…]\n errors via FormErrorHandler, returns canceller\n- #17/#20/#21 validator message fallback, RegExp reuse, required empty array\n- #28 proxy escape-hatch; #5 array-node validate errors; + regression tests",
          "is_bot": false,
          "headline": "fix(reformer): enforce m1 schema validators in submit/validate; fix r…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T19:39:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7e25e407b778a96325da57d173461e454d0f335d",
          "body": "Develop",
          "is_bot": false,
          "headline": "Merge pull request #37 from AlexandrBukhtatyy/develop",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T01:51:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19cea4c4deed91104e1742612a33b55aac6497d3",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into develop",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T01:51:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f269aa08536e878e8d2277d3a873a3782e98343",
          "body": "…er into develop",
          "is_bot": false,
          "headline": "Merge branch 'develop' of https://github.com/AlexandrBukhtatyy/ReForm…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T01:47:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e19b873be3c0ff12409b93a298163144516ab15",
          "body": "Regenerate llms.txt across all packages so the generated API docs match the\ncommitted source. Two things fold in:\n\n- Package-relative `_Source: src/...` paths (the generator's current output;\n  ui-kit was already committed this way, the others lagged in the old\n  `packages/<pkg>/src/...` format).\n- \n[…]\nps\n  discriminated union, non-generic Select.\n\nAlso tighten the plan-form prompt's directory-layout bullet to reference the\n`{{target}}` layout instead of hard-coding the core-target lib/schema split.",
          "is_bot": false,
          "headline": "docs: regenerate llms.txt; make plan-form layout note target-aware",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T01:47:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1147ab830604996881d99c4865572e825be9cee4",
          "body": "Set `.claude/settings.json` attribution.commit to empty so Claude Code no longer\nappends the `Co-Authored-By: Claude <noreply@anthropic.com>` trailer to commits.",
          "is_bot": false,
          "headline": "chore: remove claude co-author trailer from commit attribution",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T01:46:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "018e98c759ddbde092d34c5167116a9c07019e64",
          "body": "Small, independent fixes surfaced by the package typing review; each removes an\nunsafe cast, a dead branch, or a lax signature without weakening any type.\n\ncore:\n- FieldNode: `asyncResults.filter(Boolean) as ValidationError[]` -> a\n  `(e): e is ValidationError => e !== null` type guard (drops the bl\n[…]\nkept `@deprecated Target` alias), add\n  `REFORMER_TARGETS` const + `isReformerTarget` guard, and thread the named type\n  through create-form/discover-context instead of bare string literals.\n\nRefs #32",
          "is_bot": false,
          "headline": "refactor: misc type-safety cleanups from typing review",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T00:51:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "36f16f7ae6d9f8c650d1a5e7ebacd7e031bbe736",
          "body": "Split the flat `InputProps` into a discriminated union on `type`:\n\n- `NumberInputProps` (`type: 'number'`) — `value?: number | null`,\n  `onChange?: (v: number | null) => void`.\n- `TextInputProps` (all other types) — string value/onChange.\n- `InputProps = NumberInputProps | TextInputProps`.\n\nBefore, \n[…]\nprops.type` (non-\ndestructured) and forwards the rest via a single destructure that peels off\nvalue/onChange/type so they don't leak into `...nativeRest`. JSDoc casts dropped.\n\nNo new `any`.\n\nRefs #32",
          "is_bot": false,
          "headline": "refactor(reformer-ui-kit): discriminate input value/onchange by type",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T00:50:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "19e243de864084234b04e4641a869e46d24a1226",
          "body": "Remove generic parameters that gave only fake type-safety, and the casts they\nrequired.\n\n- ui-kit Select: `SelectProps<T>` -> non-generic (`resource?: ResourceConfig<\n  unknown>`). T reached only `resource`, never value/onChange (always string|null),\n  and forwardRef pinned it to `SelectProps<any>` \n[…]\nas\n  ConfigWithValue` property casts (kept together with createNode since the guard\n  is what enables the cast removal).\n\nHonest `unknown` replaces fake generics; no new `any` (one removed).\n\nRefs #32",
          "is_bot": false,
          "headline": "refactor(reformer): drop phantom generics on select and node-factory",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T00:48:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "67915b36ae5374f33c60f1c347bc4cfefa29e88c",
          "body": "Validator/AsyncValidator typed the 2nd arg as `control: FormProxy<TField>`, but\nFormProxy is the type of a GROUP and TField is a field's value type — expanding\nto a nonsensical `FormProxy<number>`. And the M1 engine never passes form nodes\nthere at all: validateModel/validateFormModel/validateModelS\n[…]\ns fake safety, so this is not a regression:\nvalue/root are typed, the phantom node type is gone, no new casts. The 20 built-in\nvalidator factories only read `value`, so nothing else changes.\n\nRefs #32",
          "is_bot": false,
          "headline": "refactor(reformer): align validator contract with the m1 runtime",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T00:46:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9a47d301edd6c8770c7b27f6ff71f74598920f5e",
          "body": "FieldControlState.componentProps and FieldNode's componentProps signal /\nupdateComponentProps were `Record<string, any>`, which silently disables type\nchecking on every read (`state.componentProps.foo.bar` type-checks with zero\nsafety). The runtime already builds this value as `Record<string, unknow\n[…]\nasts), and fix `UnknownRecord`\nto actually be `Record<string, unknown>` as its own JSDoc promised. Removes four\n`eslint-disable no-explicit-any`. Type-safety strictly improves; no new casts.\n\nRefs #32",
          "is_bot": false,
          "headline": "refactor(reformer): tighten componentprops record value type to unknown",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T00:46:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a526a002edcf1e3f8de9eca2ac50abb74e4b32e",
          "body": "FormModel.set and patch have identical implementations (both delegate to\nGroupNode.set, which merges only the keys present in the payload), but the docs\nclaimed set = \"mass replace (load from server)\" while patch = \"partial merge\".\nThat contract was a lie: set never replaced, it merged.\n\nFix the con\n[…]\nl.set({ ...model.get(),\n...data })` in the renderer-react-v20 example becomes `model.patch(data)`\n(equivalent, since patch already merges).\n\nNo runtime/behavior change; signatures unchanged.\n\nRefs #32",
          "is_bot": false,
          "headline": "refactor(reformer): deprecate modelapi.set as a merge-alias of patch",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T00:13:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ae7c6de35886c380531dfd7fea2cdffe64e62ad",
          "body": "…/object\n\nFormFields was `Record<string, FormValue>` — structurally identical to FormValue's\nown object branch (`{ [key: string]: FormValue }`), and it was marked\n`@deprecated @internal` yet leaked into public types. Rather than un-deprecate a\nduplicate, remove it and use its two real meanings direc\n[…]\n `<T extends object>` makes the\n`control as ArrayNode<FormFields>` cast in cdk useFormArray unnecessary — removed.\n\nBreaking only in that the deprecated/internal `FormFields` export is gone.\n\nRefs #32",
          "is_bot": false,
          "headline": "refactor(reformer): drop the formfields type; consolidate into record…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-04T00:06:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "986bfe95244524654fdc5b651661f12a234936c0",
          "body": "Second pass of the safe review findings (real bugs + type-correctness + hygiene),\nall verified: full typecheck (incl. cdk + mcp) green, all package tests pass.\n\nReal bug:\n- reformer-ui-kit inputs: add checked/defaultChecked (checkbox) and defaultValue\n  (input/input-mask/input-password/textarea) to \n[…]\n validate-json-schema: type the dynamic import via\n  `typeof import(...)` so contract drift is caught by the compiler.\n- reformer-mcp discover-context: guard JSON.parse('null') with `?? {}`.\n\nRefs #32",
          "is_bot": false,
          "headline": "fix: address the safe remaining minor findings from typing review",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-03T23:42:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ce91fc3cf1370f218a5e72c016c6d49f5bfbf0ee",
          "body": "Real bugs and safety wins from the review (low blast radius):\n\n- reformer/validators/multipleOf: raw float modulo flagged legitimate decimal\n  multiples (0.3 % 0.1 !== 0). Compare the remainder with an epsilon (+ test).\n- reformer-cdk/FormWizard.Progress: percent was NaN/Infinity when totalSteps=0.\n\n[…]\nd API decisions / wider blast radius): Record<string,any>->unknown\non public componentProps, X|unknown collapses, registry discriminated union,\nduplicate interface renames, phantom generics.\n\nRefs #32",
          "is_bot": false,
          "headline": "fix: address safe minor findings from typing review",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-03T23:21:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "46390df9eccfda196692a8edc243e93124f76818",
          "body": "…pecheck\n\nreformer-cdk was absent from the root `typecheck` script and had accumulated\n5 real type errors. Add it to the script and fix them:\n\n- 3 Context.Provider sites (FormArray / FormArrayList / FormWizard): a generic\n  component providing `<T>` to an `<any>`-typed React context — FormProxy<T> i\n[…]\n so\n  add(initialValue: Partial<T>) typechecks.\n- useFormArray: core useFormControl's array overload is narrowed to\n  ArrayNode<FormFields>; cast the ArrayNode<T extends object> at the call.\n\nRefs #32",
          "is_bot": false,
          "headline": "fix(reformer-cdk): fix pre-existing type errors and gate cdk in ci ty…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-03T23:21:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "694a1d49395f0f67f510ace8eed1b9ad0a23be88",
          "body": "Each test fails on the pre-fix code:\n- useFormControl-rules-of-hooks: mocks React hooks and asserts undefined /\n  field / array all call the same non-zero hook count (undefined used to be 0).\n- model-array-node-state: markAsUntouched/markAsPristine/disable now propagate\n  to item forms (were no-ops).\n- date-age: calculateAge/minAge/maxAge return N (not N-1) on the exact birthday.\n\nRefs #32",
          "is_bot": false,
          "headline": "test(reformer): regression coverage for the major runtime fixes",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-03T23:21:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e41d1c935bdc398f84633d0a9a41003553f5fc25",
          "body": "All six confirmed by adversarial verification in the packages typing review.\n\n- reformer/hooks/useFormControl: undefined branch called ZERO hooks while\n  field/array called N — a Rules-of-Hooks crash on undefined<->node toggle.\n  Route undefined through the same hook sequence (useEmptyControl).\n- re\n[…]\n an\n  Opaque-aware ModelArrayItem facade.\n- reformer-cdk/FormField.Error: rendered raw error.message, silently bypassing\n  ValidationMessagesProvider. Resolve via useValidationErrorResolver.\n\nRefs #32",
          "is_bot": false,
          "headline": "fix: resolve 6 verified major findings from typing review",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-03T23:21:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1302a32408286963214a1c401e575e09715a2d75",
          "body": "resolve.dedupe для react/react-dom/@radix-ui/@preact-signals-core против двух копий.\n\npackage-lock.json обновлён под перенос зависимостей в манифестах пакетов.\n\nRefs: #33",
          "is_bot": false,
          "headline": "chore(react-playground): dedupe singleton runtimes; sync lockfile",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-03T22:36:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9446c94c8ee4488e32fa0b2562d198c93e507501",
          "body": "…encies\n\nRadix Select/Slot и lucide-react перенесены из peerDependencies в dependencies.\n\nДобавлен tslib как страховка от отката версии Radix; дубли из devDependencies убраны.\n\nЧинит Vite-ошибку \"Failed to resolve import tslib\" у потребителей.\n\nRefs: #33",
          "is_bot": false,
          "headline": "fix(reformer-ui-kit): move @radix-ui/*, lucide-react, tslib to depend…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-03T22:36:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c79d8106f31e19e32a8ab0dd0c3bd144a3d9cbe",
          "body": "…/signals\n\nУбран прямой (и необъявленный, phantom) импорт @preact/signals-core в 5 файлах core/.\n\nSignal/signal/effect/computed теперь берутся из @reformer/core/signals.\n\nГарантирует единую идентичность Signal через границу пакетов (value instanceof Signal).\n\nЧинит Vite-ошибку \"Failed to resolve import @preact/signals-core\".\n\nRefs: #33",
          "is_bot": false,
          "headline": "fix(reformer-renderer-react): resolve signals-core via @reformer/core…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-03T22:36:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aed4d4bc99c86c3d0c91232e2a5e8d33089b11cb",
          "body": "… peer->dep\n\nНовый подпуть @reformer/core/signals реэкспортит Signal/signal/computed/effect/batch/untracked.\n\nДругие @reformer-пакеты берут рантайм через core: единый владелец, одна копия класса Signal.\n\n@preact/signals-core перенесён из peerDependencies в dependencies.\n\nRefs: #33",
          "is_bot": false,
          "headline": "feat(reformer): re-export signals runtime via ./signals; signals-core…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-03T22:35:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "227eddf75e9aa4fc9bbc2b2b722e6f1afd3c4408",
          "body": "…fault\n\nCalibrate the @reformer/mcp server (paper-listing + code-gen iterations), close the\ngaps it surfaced, and make a flat minimalist form layout the default.\n\nCalibration harness (docs/iter-prompts, docs/iter-summaries):\n- Paper-listing mode: orchestrator-md, sub-agent-md, form-listing template \n[…]\nvior; folders = scale-up\n- REFORMER_FORM_LAYOUT env var (minimalist|folders) steers the create-form prompt\n\nExamples: v20 credit-application forms (core / renderer-react / renderer-json) in new layout",
          "is_bot": false,
          "headline": "feat(reformer-mcp): calibrate guidance + minimalist form layout as de…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-03T19:23:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "daee2a57fd4a1d60f759f104e61265349c85e75f",
          "body": "Follow-up type cleanup for the M1 schema types.\n\n- Remove renderer-react `render-model.tsx` (RenderModelNode / RenderModelArray /\n  ModelNode / ModelFieldNode / ModelContainerNode / ModelArrayControl /\n  RenderModelArrayProps) and its test. It was a trimmed-down duplicate of\n  RenderNodeComponent / \n[…]\ns (schema config) vs\n  ContainerComponentProps (runtime props).\n\nFormSchema / ValidatorFn / FieldConfig are kept: they are the node foundation\n(GroupNode / FieldNode), not legacy duplicates.\n\nRefs #32",
          "is_bot": false,
          "headline": "refactor(reformer): remove legacy render-model, dedupe schema types",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-03T18:55:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "799fcef3c80ff3ba20a0e7becf58a711618ac620",
          "body": "CreateFormFromModelArgs.schema and validateModel/validateFormModel/\nvalidateModelSync were typed `unknown`. Introduce a public FormSchemaNode\nnode type: an open interface with typed known fields (value/component/\ncomponentProps/validators/children/array/item/when/…) plus an index\nsignature that admi\n[…]\nterface must inherit the index signature\nto stay assignable to it). `value` is polymorphic in core (Signal or, for\narrays, a signal-tree) and narrowed to Signal in the renderer node types.\n\nCloses #32",
          "is_bot": false,
          "headline": "feat(reformer): type unified m1 schema instead of unknown",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-03T18:38:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f176d9687ef11fec7008626a17341cbaa0f635d1",
          "body": "Squash-merging release PRs collapses the whole branch into one commit that\ntouches every package and aggregates all commit messages (incl. BREAKING CHANGE)\nin its body, so semantic-release-monorepo majors all six packages at once.\nDocument merging via rebase (or merge commit) in release-and-publishing.md\n(new section + PR checklist item) and CONTRIBUTING.md. Squash is disabled at the\nrepository level.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: require rebase-merge over squash to keep per-package versioning",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-02T23:03:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "08779398769b2889eeb14f06aaaeb933177334cf",
          "body": "* chore(react-playground): remove baseline clean mcp credit examples\n\nDrop the three mcp-credit-application-*-clean experiment pages and their\nnav/route entries in App.tsx.\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n* refactor(reformer)!: restore real proxy types and propagate schema root for \n[…]\nes kept in schema/. Update the create-form / plan-form hints and\nregenerate the mcp llms.txt.\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Develop (#36)",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-02T20:06:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "def71590271508404ba297efa71e50a5c5c1551c",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into develop",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-02T20:03:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c3d174618843d2238d675696e01ec1371dee4be",
          "body": "…/, co-located variant)\n\nRework 06-form-directory-layout.md so the module root stays lean — entry + index.ts\nplus three folders: lib/ (domain helpers), schema/ (form definition), components/.\nLift the renderer-json base component registry and generated DSL meta-schema to app\nlevel (src/renderer-json\n[…]\ned vs per-step co-located, with form-level\n(cross-step) rules kept in schema/. Update the create-form / plan-form hints and\nregenerate the mcp llms.txt.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(reformer-mcp): restructure directory-layout guide (schema/ + lib…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-02T19:47:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5104d74e5f9d98484d94c491c07f76800c6351e2",
          "body": "* chore(react-playground): remove baseline clean mcp credit examples\n\nDrop the three mcp-credit-application-*-clean experiment pages and their\nnav/route entries in App.tsx.\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n* refactor(reformer)!: restore real proxy types and propagate schema root for \n[…]\n layout hints to the create-form and\nplan-form prompt templates. Regenerate the mcp llms.txt.\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Develop (#34)",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-02T17:13:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e26c6a97216bb415200163f749ec845e4066d1b0",
          "body": "New docs/llms/06-form-directory-layout.md documents how to organize a form's\nfiles for each render target (core, renderer-react, renderer-json): a shared\ncore (types/model/validation/behavior/api/utils) reused across targets, plus the\nper-target presentation layer. Generalized from a real multi-step\n[…]\nt-structure keeps\nresolving to the core-specific guide. Add layout hints to the create-form and\nplan-form prompt templates. Regenerate the mcp llms.txt.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(reformer-mcp): add cross-target form directory-layout guide",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-02T16:43:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e85d9857c192ee0894e5ef7437152e8bfe60e9ec",
          "body": "…source docs\n\nsymbols-parser only read src/index.ts, which is absent from installed packages\n(files = dist + llms.txt), so list_symbols/get_symbol_docs returned nothing for\nconsumers. Fall back to dist/*.d.ts when src is missing (src still preferred in\ndev). Verified against a dist-only package: cdk\n[…]\n FormSchema<T>, top-level disabled\n  (componentProps.disabled is ignored), and the model.get() reactivity gotcha in\n  compute. Regenerate core llms.txt.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(reformer-mcp): index symbols from published dist/*.d.ts; align re…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-02T16:23:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e046813178c2279473fa531a313390180b41b9c5",
          "body": "Package docs must be self-contained and not point at projects/react-playground.\nRemove \"(monorepo example)\" pointers, examples/* paths, and the projects/... link\nfrom docs/llms across ui-kit, renderer-json, renderer-react, cdk and core, keeping\nthe generic API guidance intact. Regenerate the affected llms.txt files.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(packages): remove references to react-playground example code",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-02T16:22:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bad84cfb5ad763b3ed61d1f36b4bb3b01fa53b43",
          "body": "…I fixes (#29)\n\n* chore(react-playground): remove baseline clean mcp credit examples\n\nDrop the three mcp-credit-application-*-clean experiment pages and their\nnav/route entries in App.tsx.\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n* refactor(reformer)!: restore real proxy types and propagate \n[…]\nchain. Verified locally: clean build\ncore -> renderer-react -> renderer-json -> mcp = exit 0.\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Promote develop → main: features, breaking registry changes, docs & C…",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-02T06:38:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "930a1a93bf4e6f78c8cad96b6e9db1a96e3cd6da",
          "body": "# Conflicts:\n#\t.github/workflows/test.yml\n#\t.prettierignore\n#\tpackages/reformer-mcp/src/prompts/templates/add-behavior.md\n#\tpackages/reformer-mcp/src/prompts/templates/add-validation.md\n#\tpackages/reformer-mcp/src/prompts/templates/add-wizard.md",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into develop",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-02T06:31:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0bb057fd51c1ade6fb22351e74395eb4a8feb0f",
          "body": "mcp tsc imports @reformer/renderer-json/validate (validate_json_schema tool),\nso the release job failed at \"Build @reformer/mcp\" (TS2307) because mcp had\ndeps='' — renderer-json (and its own deps core + renderer-react) were not built\nfirst. Set mcp deps to the full chain. Verified locally: clean build\ncore -> renderer-react -> renderer-json -> mcp = exit 0.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): build renderer-json chain before mcp in release matrix",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-02T00:05:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "64f6678777675c072dd90774931ae1bfe354799a",
          "body": "The Typecheck step ran before the build steps, but in CI packages have no dist\nyet at that point, so dependents fail to resolve @reformer/core (TS2307). Moved\nthe step to the end, after all package builds emit their type declarations.\nVerified by simulating CI order locally (build all packages -> typecheck = 0).\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): run typecheck after package builds so dist types resolve",
          "author_name": "Alexandr Bukhtatyy",
          "author_login": "AlexandrBukhtatyy",
          "committed_at": "2026-07-01T23:44:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 100,
      "commits_last_year": 769,
      "latest_release_at": "2026-07-20T16:15:43Z",
      "latest_release_tag": "ui-kit-v11.0.0",
      "releases_from_tags": false,
      "days_since_last_push": 1,
      "active_weeks_last_year": 24,
      "days_since_latest_release": 1,
      "mean_days_between_releases": 0.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": true,
      "health_percentage": 71,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@reformer/core",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "react",
            "forms",
            "form-validation",
            "validation",
            "state-management",
            "signals",
            "reactive",
            "typescript",
            "hooks",
            "form-builder",
            "dynamic-forms"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@reformer/core",
          "is_deprecated": false,
          "latest_version": "9.1.1",
          "repository_url": "https://github.com/AlexandrBukhtatyy/ReFormer",
          "versions_count": 48,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2216,
          "first_published_at": "2025-12-02T19:26:43.089000Z",
          "latest_published_at": "2026-07-17T11:51:27.140000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@reformer/cdk",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "react",
            "forms",
            "headless-ui",
            "compound-components",
            "form-array",
            "multi-step-form",
            "wizard",
            "reformer",
            "typescript"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@reformer/cdk",
          "is_deprecated": false,
          "latest_version": "10.0.0",
          "repository_url": "https://github.com/AlexandrBukhtatyy/ReFormer",
          "versions_count": 22,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1885,
          "first_published_at": "2026-05-02T13:48:20.336000Z",
          "latest_published_at": "2026-07-20T16:13:20.389000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 1
        },
        {
          "name": "@reformer/mcp",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "mcp",
            "reformer",
            "claude",
            "ai",
            "forms",
            "react",
            "model-context-protocol"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@reformer/mcp",
          "is_deprecated": false,
          "latest_version": "10.1.0",
          "repository_url": "https://github.com/AlexandrBukhtatyy/ReFormer",
          "versions_count": 28,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1775,
          "first_published_at": "2025-12-10T17:07:05.224000Z",
          "latest_published_at": "2026-07-17T11:58:51.804000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@reformer/ui-kit",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "react",
            "forms",
            "ui-components",
            "tailwindcss",
            "radix-ui",
            "form-array",
            "multi-step-form",
            "wizard",
            "reformer",
            "typescript"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@reformer/ui-kit",
          "is_deprecated": false,
          "latest_version": "11.0.0",
          "repository_url": "https://github.com/AlexandrBukhtatyy/ReFormer",
          "versions_count": 25,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2165,
          "first_published_at": "2026-05-03T10:35:12.489000Z",
          "latest_published_at": "2026-07-20T16:15:42.757000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 1
        },
        {
          "name": "@reformer/renderer-json",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "react",
            "forms",
            "reformer",
            "renderer",
            "json",
            "typescript"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@reformer/renderer-json",
          "is_deprecated": false,
          "latest_version": "9.1.1",
          "repository_url": "https://github.com/AlexandrBukhtatyy/ReFormer",
          "versions_count": 22,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1890,
          "first_published_at": "2026-05-03T07:58:03.336000Z",
          "latest_published_at": "2026-07-17T11:57:07.993000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@reformer/renderer-react",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "react",
            "forms",
            "reformer",
            "renderer",
            "typescript"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@reformer/renderer-react",
          "is_deprecated": false,
          "latest_version": "9.0.0",
          "repository_url": "https://github.com/AlexandrBukhtatyy/ReFormer",
          "versions_count": 22,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2002,
          "first_published_at": "2026-05-03T07:41:12.046000Z",
          "latest_published_at": "2026-07-20T16:14:27.607000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 1
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 1,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [
        "projects/react-playground/src/mocks/_generated/openapi.json"
      ],
      "has_devcontainer": false,
      "typecheck_configs": [
        "packages/reformer-cdk/tsconfig.json",
        "packages/reformer-mcp/tsconfig.json",
        "packages/reformer-renderer-json/tsconfig.json",
        "packages/reformer-renderer-react/tsconfig.json",
        "packages/reformer-ui-kit/tsconfig.json",
        "packages/reformer/tsconfig.json",
        "projects/react-playground/tsconfig.json",
        "projects/reformer-doc/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 51806,
      "source_files_sampled": 770,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 15581
    },
    "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": "@emnapi/core",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "1.9.2"
        },
        {
          "name": "@emnapi/runtime",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "1.9.2"
        },
        {
          "name": "@napi-rs/wasm-runtime",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "1.1.2"
        },
        {
          "name": "@tailwindcss/vite",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.17"
        },
        {
          "name": "napi-wasm",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "1.1.3"
        },
        {
          "name": "tailwindcss",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.17"
        },
        {
          "name": "uuid",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.0.0"
        },
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "packages/reformer-mcp/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.0"
        },
        {
          "name": "handlebars",
          "manifest": "packages/reformer-mcp/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.7.9"
        },
        {
          "name": "typescript",
          "manifest": "packages/reformer-mcp/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.7.0"
        },
        {
          "name": "ajv",
          "manifest": "packages/reformer-renderer-json/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.17.1"
        },
        {
          "name": "class-variance-authority",
          "manifest": "packages/reformer-ui-kit/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.0"
        },
        {
          "name": "clsx",
          "manifest": "packages/reformer-ui-kit/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.0"
        },
        {
          "name": "lucide-react",
          "manifest": "packages/reformer-ui-kit/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.553.0"
        },
        {
          "name": "radix-ui",
          "manifest": "packages/reformer-ui-kit/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.4.3"
        },
        {
          "name": "tailwind-merge",
          "manifest": "packages/reformer-ui-kit/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.0 || ^3.0.0"
        },
        {
          "name": "tslib",
          "manifest": "packages/reformer-ui-kit/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.6.0"
        },
        {
          "name": "tw-animate-css",
          "manifest": "packages/reformer-ui-kit/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.4.0"
        },
        {
          "name": "@preact/signals-core",
          "manifest": "packages/reformer/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.8.0"
        },
        {
          "name": "use-sync-external-store",
          "manifest": "packages/reformer/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.2.0"
        },
        {
          "name": "@preact/signals-core",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.8.0"
        },
        {
          "name": "@radix-ui/react-select",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.2.6"
        },
        {
          "name": "@radix-ui/react-slot",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.2.4"
        },
        {
          "name": "@reformer/cdk",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "*"
        },
        {
          "name": "@reformer/core",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "*"
        },
        {
          "name": "@reformer/renderer-json",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "*"
        },
        {
          "name": "@reformer/renderer-react",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "*"
        },
        {
          "name": "@reformer/ui-kit",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "*"
        },
        {
          "name": "@tailwindcss/vite",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.17"
        },
        {
          "name": "axios",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.13.2"
        },
        {
          "name": "class-variance-authority",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.1"
        },
        {
          "name": "clsx",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "lucide-react",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.553.0"
        },
        {
          "name": "react",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.1"
        },
        {
          "name": "react-dom",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.1"
        },
        {
          "name": "react-router-dom",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.30.2"
        },
        {
          "name": "tailwind-merge",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.4.0"
        },
        {
          "name": "tailwindcss",
          "manifest": "projects/react-playground/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.17"
        },
        {
          "name": "@docusaurus/core",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "3.9.2"
        },
        {
          "name": "@docusaurus/preset-classic",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "3.9.2"
        },
        {
          "name": "@mdx-js/react",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.0.0"
        },
        {
          "name": "@preact/signals-core",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.8.0"
        },
        {
          "name": "@radix-ui/react-select",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.2.6"
        },
        {
          "name": "@radix-ui/react-slot",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.2.4"
        },
        {
          "name": "@reformer/cdk",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "*"
        },
        {
          "name": "@reformer/core",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "*"
        },
        {
          "name": "@reformer/renderer-json",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "*"
        },
        {
          "name": "@reformer/renderer-react",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "*"
        },
        {
          "name": "@reformer/ui-kit",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "*"
        },
        {
          "name": "class-variance-authority",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.1"
        },
        {
          "name": "clsx",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "lucide-react",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.553.0"
        },
        {
          "name": "prism-react-renderer",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.3.0"
        },
        {
          "name": "react",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0.0"
        },
        {
          "name": "react-dom",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0.0"
        },
        {
          "name": "tailwind-merge",
          "manifest": "projects/reformer-doc/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.4.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": 36,
        "open_issues": 1,
        "closed_ratio": 0.8,
        "closed_issues": 4,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "AlexandrBukhtatyy",
          "commits": 754,
          "avatar_url": "https://avatars.githubusercontent.com/u/2250253?v=4"
        },
        {
          "type": "User",
          "login": "semantic-release-bot",
          "commits": 14,
          "avatar_url": "https://avatars.githubusercontent.com/u/32174276?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.982
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "align-versions.yml",
        "ci.yml",
        "deploy-docs.yml",
        "release.yml",
        "test.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.js"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "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": 7,
            "reason": "7 out of 9 merged PRs checked by a CI test -- score normalized to 7",
            "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/11 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": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 5 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": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "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": 4,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "115 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "df9f667b3f107dd90b2ea5bb82f5b430e0a07c2d",
        "ran_at": "2026-07-22T12:01:25Z",
        "aggregate_score": 3.9,
        "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-20T16:36:02Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-20T16:07:58Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 33,
          "created_at": "2026-07-02T13:30:38Z",
          "last_comment_at": "2026-07-04T01:52:33Z",
          "last_comment_author": "AlexandrBukhtatyy"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/AlexandrBukhtatyy/ReFormer",
    "host": "github.com",
    "name": "ReFormer",
    "owner": "AlexandrBukhtatyy"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 62,
      "inputs": {
        "security": 39,
        "vitality": 89,
        "community": 47,
        "governance": 56,
        "engineering": 69
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 89,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "commits_last_year": 769,
              "human_commit_share": 1,
              "days_since_last_push": 1,
              "active_weeks_last_year": 24
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "24/52 weeks with commits",
                "points": 16.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 24
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "769 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 769
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 5 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": 100,
              "latest_release_tag": "ui-kit-v11.0.0",
              "releases_from_tags": false,
              "days_since_latest_release": 1,
              "mean_days_between_releases": 0.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 1,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 1 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 47,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 2,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 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": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 68,
            "inputs": {
              "packages": [
                "@reformer/core",
                "@reformer/cdk",
                "@reformer/mcp",
                "@reformer/ui-kit",
                "@reformer/renderer-json",
                "@reformer/renderer-react"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 11933
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "11,933 downloads/month across npm",
                "points": 54.4,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 11933,
                      "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": 56,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.982
            },
            "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 98% of commits",
                "points": 0.4,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 98
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "merged_prs": 36,
              "open_issues": 1,
              "closed_issues": 4,
              "issue_closed_ratio": 0.8,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "80% of issues closed",
                "points": 37.4,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 80
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "36/37 decided PRs merged",
                "points": 37.2,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 36,
                      "decided": 37
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/11 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 51,
            "inputs": {
              "followers": 8,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "AlexandrBukhtatyy",
              "public_repos": 38,
              "account_age_days": 5073
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "8 followers of AlexandrBukhtatyy",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 8,
                      "login": "AlexandrBukhtatyy"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "38 public repos, account ~13 yr old",
                "points": 23.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 38
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@reformer/core",
                "@reformer/cdk",
                "@reformer/mcp",
                "@reformer/ui-kit",
                "@reformer/renderer-json",
                "@reformer/renderer-react"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 1
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "6 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 6,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 1 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "48 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 48
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 69,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "7 out of 9 merged PRs checked by a CI test -- score normalized to 7",
                "points": 14,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 39,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 39,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3.9
            },
            "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": "7 out of 9 merged PRs checked by a CI test -- score normalized to 7",
                "points": 1.8,
                "status": "partial",
                "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/11 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 not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 5 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 detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 1,
                "status": "partial",
                "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": 2,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "115 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": 1
            },
            "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": "excellent",
        "name": "AI Readiness",
        "value": 86,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 0.97,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 15581
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "97 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 97,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "packages/reformer-cdk/tsconfig.json",
                "packages/reformer-mcp/tsconfig.json",
                "packages/reformer-renderer-json/tsconfig.json",
                "packages/reformer-renderer-react/tsconfig.json",
                "packages/reformer-ui-kit/tsconfig.json",
                "packages/reformer/tsconfig.json",
                "projects/react-playground/tsconfig.json",
                "projects/reformer-doc/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.1,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "eslint.config.js",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "packages/reformer-cdk/tsconfig.json, packages/reformer-mcp/tsconfig.json, packages/reformer-renderer-json/tsconfig.json, packages/reformer-renderer-react/tsconfig.json, packages/reformer-ui-kit/tsconfig.json, packages/reformer/tsconfig.json, projects/react-playground/tsconfig.json, projects/reformer-doc/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/reformer-cdk/tsconfig.json, packages/reformer-mcp/tsconfig.json, packages/reformer-renderer-json/tsconfig.json, packages/reformer-renderer-react/tsconfig.json, packages/reformer-ui-kit/tsconfig.json, packages/reformer/tsconfig.json, projects/react-playground/tsconfig.json, projects/reformer-doc/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "10 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 10,
                      "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 2",
                "points": 2,
                "status": "partial",
                "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": 51806,
              "source_files_sampled": 770,
              "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/770 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 770,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "excellent",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": true,
              "api_schema_files": [
                "projects/react-playground/src/mocks/_generated/openapi.json"
              ]
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": "projects/react-playground/src/mocks/_generated/openapi.json",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "projects/react-playground/src/mocks/_generated/openapi.json"
                    }
                  }
                ],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:@reformer/core@9.1.1; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T12:01:43.141200Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/AlexandrBukhtatyy/ReFormer.svg",
  "full_name": "AlexandrBukhtatyy/ReFormer",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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