Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [
"cli",
"go",
"terminal",
"utility",
"bubbletea",
"cli-tool",
"code-generator",
"command-line",
"golang",
"interactive",
"scaffold",
"tui",
"wizard",
"yaml"
],
"is_fork": false,
"size_kb": 641,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 536059
},
"pushed_at": "2026-07-16T10:33:38Z",
"created_at": "2026-04-02T18:09:51Z",
"owner_type": "User",
"updated_at": "2026-07-01T14:31:09Z",
"description": "Config-driven CLI wizard framework",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": "https://www.svyatov.com",
"name": "Leonid Svyatov",
"type": "User",
"login": "svyatov",
"company": null,
"location": "Yerevan, Armenia",
"followers": 33,
"avatar_url": "https://avatars.githubusercontent.com/u/310043?v=4",
"created_at": "2010-06-20T15:48:24Z",
"is_verified": null,
"public_repos": 27,
"account_age_days": 5875
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2026-07-01T14:32:26Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2026-04-02T20:33:51Z"
}
],
"recent_commits": [
{
"oid": "a15b781fe1c1075157294bfc5c5700fd267e2c4f",
"body": null,
"is_bot": false,
"headline": "chore(release): 0.2.0",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-07-01T14:30:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "faf405a6bc1e24f347f75994f12168a93edb4a9b",
"body": null,
"is_bot": false,
"headline": "chore: stop tracking CONCEPTS.md",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-07-01T14:21:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5d0afa5caff09144e96c57a36969b8ca3bbac861",
"body": "## Summary\n\nWizards can now collect two kinds of input they couldn't before: secrets\nand bounded numbers.\n\nA `password` option masks input as it's typed, renders as `****`\neverywhere oz prints a command or answer (dry-run, confirmation prompt,\n`oz run show`, and the pins/presets editors), and is nev\n[…]\n both-set warning; and positional-password\nrejection.\n\nNo live TUI recording is attached — the behavior is covered by the test\nsuite above; the interactive prompt itself is a standard Bubbletea\nfield.",
"is_bot": false,
"headline": "feat(wizard): add password and number option types (#9)",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-07-01T14:01:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6d7677a96107ec2a52571a295fadad27f4ace2bc",
"body": "Add CONCEPTS.md with core wizard/command-build domain vocabulary, and a\n\"Documented Knowledge\" section in CLAUDE.md pointing agents at docs/solutions/\nand CONCEPTS.md.",
"is_bot": false,
"headline": "docs: seed CONCEPTS.md vocabulary and surface knowledge stores",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-06-30T16:52:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7332b813b5980bb2bce72a42fb2d479f459d0e5d",
"body": "Add `oz test [wizard]`, a snapshot harness that asserts a wizard's fixture\nanswers build the expected command, wired as a CI gate so registry wizards\ncan't silently rot.\n\n- internal/wizardtest: fixture loader + hermetic BuildCommand that mirrors the\n run path (EffectiveCommand + FilterOptions + Fil\n[…]\nbundle-gem version-gating fixtures\n- CI runs `oz test --config-dir ./wizards` on every push/PR\n\nDocs: README commands + fixture-contributing flow, CONTRIBUTING fixture format,\nCHANGELOG Added entries.",
"is_bot": false,
"headline": "feat(test): add hermetic wizard test harness (oz test)",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-06-30T16:52:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6eb90072fa15dd6d2cafe411b7e3e1a786930526",
"body": null,
"is_bot": false,
"headline": "chore: ignore docs directory",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-06-30T16:16:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d144155a2e384c3f48cd7b3e44940b99d6315b06",
"body": "Wraps Bundler's `bundle gem` generator with interactive, version-aware\noptions, verified against real Bundler binaries from 2.2.0 to 4.0.12:\n\n- --changelog (>=2.2.8), --github-username (>=2.2.16), --linter (>=2.2.31)\n- --ext values: c, rust (>=2.4), go (>=4.0)\n- --bundle (>=2.7); --rubocop confirm f\n[…]\n <2.2.31, then --linter takes over\n and --rubocop is hidden on 4.x where Bundler removed it\n- version picker via `bundle _<version>_ gem`\n\nRegistered in index.yml for `oz add` and `oz list --remote`.",
"is_bot": false,
"headline": "feat(wizards): add bundle-gem wizard",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-06-30T16:08:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3ca2d4cde81c588f22af283349b5c5b1160b3157",
"body": null,
"is_bot": false,
"headline": "chore: ignore .compound-engineering directory",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-06-30T14:54:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "163d57931c3a02568f093f2250924b0ebdd2253e",
"body": "Both 'oz list' and 'oz list --remote' ended without the trailing blank\nline every other command emits (ui.*Msgf, dry-run, doctor, show, pins,\npresets). Match the convention: leading + trailing blank around output.",
"is_bot": false,
"headline": "fix(ui): add trailing blank line to wizard list output",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-06-30T14:42:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "78f683e194a5e378f6614a8e97235a17d13aa4f2",
"body": "The shared list table's StyleFunc set no horizontal padding between\ncolumns, gluing name, description, and the (installed) tag together in\nboth 'oz list' and 'oz list --remote'.",
"is_bot": false,
"headline": "fix(ui): add column spacing to wizard list output",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-06-30T14:36:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "24644f21f327958cd1ce5bc4c4a8b2f28b78a1c8",
"body": "Point the default registry at svyatov/oz (wizards/ + new index.yml on\nmain) instead of a separate, non-existent oz-wizards repo. Fixes the\nHTTP 404 from 'oz add <name>', 'oz list --remote', and 'oz update'.\nOverride still available via OZ_REGISTRY_URL. Docs updated.",
"is_bot": false,
"headline": "fix(registry): serve wizards from the main repo",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-06-30T14:30:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dfb255363397848bd7ccb31418884ce0686a2728",
"body": "The asset-pipeline selector is gated < 8.0, leaving Rails 8.x with no\nway to reach --skip-asset-pipeline. Add a >= 8.0 version-gated confirm\nto close the gap. Verified against real rails 7.2.3.1/8.0.5/8.1.3.",
"is_bot": false,
"headline": "fix(wizards): expose --skip-asset-pipeline on Rails 8.x in rails-new",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-06-30T14:01:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c0356781f21aadf0cab8fcff1b1dc8f56a65cc56",
"body": null,
"is_bot": false,
"headline": "build(deps): bump charm.land/lipgloss/v2 from 2.0.2 to 2.0.4",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-06-30T11:57:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8f76ed372a05d208faef9f64716081ff83367b22",
"body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to\n7.\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a\nhref=\"https://github.com/actions/checkout/releases\">actions/checkout's\nreleases</a>.</em></p>\n<blockquote>\n<h2>v7.0.0</h2>\n<h2>What's Changed</h2>\n<ul>\n<li>blo\n[…]\nnless you reopen the\nPR or upgrade to it yourself)\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps): bump actions/checkout from 6 to 7 (#8)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-30T11:55:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e110d6143475d05ebd890c9a2e6f87eeae60f389",
"body": "Bumps\n[charm.land/bubbletea/v2](https://github.com/charmbracelet/bubbletea)\nfrom 2.0.2 to 2.0.7.\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a\nhref=\"https://github.com/charmbracelet/bubbletea/releases\">charm.land/bubbletea/v2's\nreleases</a>.</em></p>\n<blockquote>\n<h2>v2.0.7</h2>\n\n[…]\nnless you reopen the\nPR or upgrade to it yourself)\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps): bump charm.land/bubbletea/v2 from 2.0.2 to 2.0.7 (#6)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-30T11:55:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ddab07191a1bbdc664291501bb6a1422d1d2c731",
"body": "…0 (#5)\n\nBumps\n[github.com/Masterminds/semver/v3](https://github.com/Masterminds/semver)\nfrom 3.4.0 to 3.5.0.\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a\nhref=\"https://github.com/Masterminds/semver/releases\">github.com/Masterminds/semver/v3's\nreleases</a>.</em></p>\n<blockquote>\n[…]\nnless you reopen the\nPR or upgrade to it yourself)\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps): bump github.com/Masterminds/semver/v3 from 3.4.0 to 3.5.…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-30T11:55:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a9073acc0173f3237b09ce7d8af729b8fa22c851",
"body": null,
"is_bot": false,
"headline": "ci: bump golangci-lint from v2.11 to v2.12",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-06-30T11:51:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "66449666c32aaaa821f6a5be85372aad55589cc1",
"body": "Resolves goconst findings surfaced by golangci-lint v2.12 (counts\ntest-file occurrences): cmdRun/cmdList, boolFalse, flagHelp, keyEnter/\nkeyEsc, labelYes/labelNone.",
"is_bot": false,
"headline": "style(lint): extract repeated literals into named constants",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-06-30T11:51:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "999962f15de49e4feddb73e5667065256b0b0b90",
"body": null,
"is_bot": false,
"headline": "chore(graphify): ignore output dir and add query-first hooks",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-06-30T11:19:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cf1a7e7e254524ee6f832cf350815ff6022c77ff",
"body": null,
"is_bot": false,
"headline": "docs(claude): document command/extra.go in architecture tree",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-06-30T11:06:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4cc4371066d125615eeea21098d507d0555ccbec",
"body": "- Group RunPins/newPinsModel 7 positional params into PinsParams struct\n- Move shared test helpers (stripANSI, key, specialKey) to helpers_test.go\n- Fix preset name validation to use filepath.IsLocal() matching store\n- Extract magic numbers in parse.go to named constants",
"is_bot": false,
"headline": "refactor: minor cleanup across wizard, generate, and presets",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T21:46:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "49942064d065c35885042fe147fd4719223ba56a",
"body": null,
"is_bot": false,
"headline": "build(goreleaser): add post-install hook to remove macOS quarantine",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T21:20:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "23b34fafdb2f9aded89e508aadfb21554750e585",
"body": "brews was deprecated in goreleaser v2.10. homebrew_casks is the proper\nway to distribute pre-compiled binaries via Homebrew. Also adds\nauto-generated shell completions for bash, zsh, and fish.",
"is_bot": false,
"headline": "build(goreleaser): migrate from deprecated brews to homebrew_casks",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T21:08:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "366dcadbb0257bb18017df9d8228b8e5a93114f6",
"body": null,
"is_bot": false,
"headline": "chore(deps): update all dependencies",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T20:58:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3a6f3d1f210e2307d8fd824331c121241ea1bb91",
"body": "Bumps [charm.land/bubbles/v2](https://github.com/charmbracelet/bubbles)\nfrom 2.0.0 to 2.1.0.\n<details>\n<summary>Release notes</summary>\n<p><em>Sourced from <a\nhref=\"https://github.com/charmbracelet/bubbles/releases\">charm.land/bubbles/v2's\nreleases</a>.</em></p>\n<blockquote>\n<h2>v2.1.0</h2>\n<h1>Shri\n[…]\nnless you reopen the\nPR or upgrade to it yourself)\n\n\n</details>\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps): bump charm.land/bubbles/v2 from 2.0.0 to 2.1.0 (#1)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-04-02T20:55:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6c17c97b9ac920d38f1f0b1c6d5b5ab928b3be64",
"body": null,
"is_bot": false,
"headline": "build(goreleaser): use GitHub changelog with short SHA and @logins",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T20:53:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4192ed22b583d07b205946786256c8101c875cb8",
"body": "Remove GitHub-style changelog (includes full SHA and author email).\nFilter out non-user-facing commits (docs, test, chore, ci, build).",
"is_bot": false,
"headline": "build: clean up goreleaser changelog format",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T20:41:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "16931a83ef64987ff4341202c6f5f614c1e159a1",
"body": null,
"is_bot": false,
"headline": "docs: set v0.1.0 release date",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T20:31:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a3e292b3b3c7c3c16554fce36014c2b3a2f40ae0",
"body": "- Overhaul README with install options, available wizards, features\n- Add CONTRIBUTING.md with dev setup and wizard contribution guide\n- Add Contributor Covenant v2.1 code of conduct\n- Add issue templates (bug, feature, wizard) and PR template\n- Add VHS demo tape for recording demo GIF\n- Configure dependabot for Go modules and GitHub Actions",
"is_bot": false,
"headline": "docs: add README, contributing guide, code of conduct, and templates",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T20:30:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9a471ba190337bf1a0801a79c5ccbe9890f456ae",
"body": "- G602: replace manual slice comparison with slices.Equal\n- G703: sanitize wizard name via filepath.Base to prevent path traversal",
"is_bot": false,
"headline": "fix(lint): properly resolve gosec G602/G703 issues",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T20:21:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eef8c4b08d45a2160c78064b5ca765aa93e67949",
"body": "Use strconv.FormatBool instead of string literals in FieldValue.\nExclude gosec G602/G703 rules (false positives for CLI tools).",
"is_bot": false,
"headline": "fix(lint): resolve golangci-lint v2.11 compatibility issues",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T20:12:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "122494c8db707062749504d050263e4455ca9697",
"body": null,
"is_bot": false,
"headline": "Create dependabot.yml",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T20:10:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1e2a7244027ebc6b849cfa59286e7da5c5a17d28",
"body": null,
"is_bot": false,
"headline": "docs: finalize changelog for v0.1.0 release",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T20:05:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8c914b800e6708b00e4c5cf9452d0b4c5bb93885",
"body": null,
"is_bot": false,
"headline": "build: add goreleaser config for cross-platform releases",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T20:03:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4bf8472e1d632e8d2cc24813d820fb2c32986fbb",
"body": null,
"is_bot": false,
"headline": "ci: add release workflow with goreleaser",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T19:58:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "87b11a10842520e36e061af1cbdf1cc0c0166118",
"body": null,
"is_bot": false,
"headline": "ci: add lint and test workflow",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-04-02T19:54:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2dd3709f3479bacfbcb651994868774f3fbbbe25",
"body": "Parse CLI args after -- against wizard option definitions: flags\nmatching wizard options override their values, positional args fill\nrequired positional options, and unrecognized args are appended raw\nto the built command. This enables running presets with dynamic\npositional args (e.g., `oz run rails-new -p api -- myapp`).\n\nAlso adds MissingRequired validation to catch unfilled required\noptions at runtime, and fixes a nil pointer when preset path\nreturns successfully from runWizardLoop.",
"is_bot": false,
"headline": "feat(run): add passthrough args via -- with smart option matching",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-16T16:14:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5848efbdd88c6734e81d16787bfd03932002559c",
"body": null,
"is_bot": false,
"headline": "feat(add): add 'a' alias for add command",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-16T15:30:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c5f8143d17feb03ae14b9e37aa024c75ed6a8c46",
"body": "Default output changed from stdout to ~/.config/oz/wizards/<name>.yml.\nAdded --force/-f for overwrite protection. Removed --stdin and --install\nflags that added complexity without clear value.",
"is_bot": false,
"headline": "feat(generate): write to config directory by default",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-16T15:14:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "690c87a6e5ca264a28f6795daf62b6bc42247966",
"body": "Errors and warnings were printing plain unstyled text to stderr while\nthe rest of the app used the lipgloss theme. Add WarningStyle,\nErrorMsgf, and WarnMsgf to the theme package and replace all 14\nunstyled fmt.Fprintf(os.Stderr, ...) calls. Also style metadata labels\nin the show command with MutedStyle for consistency.",
"is_bot": false,
"headline": "fix(ui): style all error, warning, and metadata output with theme colors",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-15T15:38:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fe294904047f6f914623d305e5745eb7a1ba1e43",
"body": "…CLAUDE.md",
"is_bot": false,
"headline": "docs: add registry, add/update commands, and missing wizard files to …",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-15T15:16:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ce9d7bc18e8dbf87b859311f908daa03a1017c28",
"body": "Remove nonexistent compat block, update workflow to use oz generate,\nadd \"Writing Self-Sufficient Descriptions\" section with three-question\nframework and before/after examples. Enrich all choice descriptions\nso users can pick without reading tool docs. Add markdown lint hook\nto project settings.",
"is_bot": false,
"headline": "docs(skill): rewrite wizard-scaffold with self-sufficient descriptions",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-15T15:09:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eed0404ef128d943034db7200718e09d3a281106",
"body": "Add regex patterns to clean Clap [possible values: ...], Azure CLI\nAllowed values, [env: VAR=] hints, and standalone [default] markers.\nCollapse double spaces left by metadata stripping. Update fixture\ntests with new enum and description assertions.",
"is_bot": false,
"headline": "fix(generate): strip more CLI metadata from scaffold descriptions",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-15T15:08:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bd20ecdd0083a41636eae073bcae9e716b37770e",
"body": "Rewrite Thor preprocessor to intelligently handle multi-flag lines:\nstrip negation variants (--no-X, --skip-X) when base form exists,\nresolve aliases to canonical bracketed form (--js → --javascript),\nand prefer flags with =PLACEHOLDER for correct type inference.\n\nAdd bare Default: value extraction \n[…]\nails new generating wrong types (--javascript as confirm\ninstead of select), polluted descriptions (negation variants leaking),\nalias flags chosen over canonical forms, and unextracted defaults/enums.",
"is_bot": false,
"headline": "feat(generate): improve Thor-style help parsing quality",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-15T14:38:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4b022a956692ba0d57d5ab00df1e7405b0556570",
"body": "Hooks receive JSON on stdin, not via $CLAUDE_TOOL_INPUT. Also fix\nJSON path from .file_path to .tool_input.file_path.",
"is_bot": false,
"headline": "fix(hooks): read tool input from stdin instead of nonexistent env var",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-15T13:39:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8002187ef7200e51ecc45183503ec4b351bc717f",
"body": "Document oz generate in README with usage examples, flag reference,\nand supported help format list. Update CLAUDE.md architecture tree\nwith generate.go, internal/generate/ package, and key abstractions.",
"is_bot": false,
"headline": "docs: add generate command to README and CLAUDE.md",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T22:45:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9589f1106d729b5986d1bc0af8d803186ad2977a",
"body": "…code\n\nRevert var-based function overrides (confirmPrompt, promptPresetSave,\nExecCommand) and io.Writer indirection (ui.Output, PrintCommand) that\nadded mutable global state to production code solely for test mocking.\nRemove tests that depended on these overrides.\n\nCoverage drops from 86.2% to 83.6% — the lost tests covered TTY-dependent\ncode paths that aren't unit-testable without the mocks. Accepting this\ngap keeps production code clean.",
"is_bot": false,
"headline": "revert: remove testability-only architecture changes from production …",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T22:43:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6739bda6f222110dd6d394525c30bb1097eb51ad",
"body": "Add `oz generate <tool> [subcommand...]` command that parses any CLI\ntool's --help output and scaffolds a wizard YAML config. Supports GNU,\nCobra, kubectl, Clap, argparse, Thor, Hanami, npm, man page, and\nheaderless formats with automatic format detection.\n\nParser heuristics include ANSI/man-page st\n[…]\nlicate name dedup.\n\nTested against 59 real-world CLI tools (60 fixture files, 188 test\nsubtests) spanning Ruby, Python, Node, Go, Rust, Docker, Kubernetes,\nAWS, GCP, Azure, and general CLI ecosystems.",
"is_bot": false,
"headline": "feat(generate): scaffold wizard YAML from CLI --help output",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T22:35:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "88e08418b0959e96454a57aee80384299e70ef54",
"body": "Add comprehensive tests across all packages and refactor key\ninterfaces for testability:\n\n- Extract io.Writer params for PrintCommand and ui.Output for\n SuccessMsgf/InfoMsgf to enable output assertions in tests\n- Convert confirmPrompt/promptPresetSave to overridable function\n variables for testing\n[…]\nements by package:\n compat: 71.2% → 100.0%\n ui: 62.3% → 98.1%\n config: 89.0% → 96.4%\n command: 69.7% → 92.0%\n wizard: 69.3% → 87.2%\n store: 77.3% → 84.4%\n cmd/oz: 43.0% → 74.5%",
"is_bot": false,
"headline": "test: increase code coverage from 65.8% to 86.2%",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T21:31:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1bb71b3d858f505e4667a840eb2015988fabe510",
"body": "… functions\n\nExtract cursorUp, cursorDown, numberKeyIndex, and choiceCursor helpers to\neliminate duplicated cursor navigation and rendering logic across select,\nmulti-select, and confirm field types. Merge confirmPrompt and\nconfirmDangerousPrompt into a single parameterized function with proper\nerror handling for huh.Run() failures. Add ui package tests (0% → 62%).",
"is_bot": false,
"headline": "refactor(wizard): extract shared field helpers and consolidate prompt…",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T20:41:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fab92c20a4ebf0b182bc49248cce260c5a2f37fc",
"body": "Add MIT LICENSE, comprehensive test coverage for the wizard TUI package\n(engine, field_confirm, field_multi, version_loader, values_editor),\ndefensive bounds check in presets.go, updated README with registry/version\ncontrol/visibility/dynamic choices docs, and CHANGELOG for v0.1.0.\n\nWizard package coverage: 42.4% → 69.4%.",
"is_bot": false,
"headline": "chore: prepare v0.1.0 release",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T20:22:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3dcf7876064f9ec472b819f6dffa95f7c037fb8a",
"body": null,
"is_bot": false,
"headline": "chore(deps): update lipgloss to v2.0.2",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T14:55:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d2c7f3cffb4678727345589bbf590f634141b849",
"body": "- Fix update command printing \"Added\" instead of \"Updated\" by\n parameterizing installWizard with a verb string\n- Add cobra.NoArgs to 8 leaf commands that silently ignored extra args\n- Tighten update Args to reject extra args with --all and require\n exactly 1 arg without it\n- Print \"Cancelled\" on d\n[…]\nto remove for cleaning up state, pins, and presets\n- Add \"u\" alias for update command\n- Show wizard name in validate success message\n- Document NO_COLOR support and preset immediate execution behavior",
"is_bot": false,
"headline": "fix(cli): improve command consistency, argument validation, and UX",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T14:51:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "965cb62db4b7677e20f47f65656d2a635615b2e6",
"body": "- Replace 10 repetitive NavHint functions in ui/theme.go with a generic\n NavHints(hints ...Hint) builder and reusable hint constants\n- Replace manual column padding in list output with lipgloss/table\n- Replace manual bufio stdin prompts with charmbracelet/huh/v2 for\n styled, keyboard-navigable confirmations and inputs\n- Replace hardcoded ~/.config/oz with adrg/xdg for proper\n $XDG_CONFIG_HOME support\n- Replace manual path validation in store.go with filepath.IsLocal",
"is_bot": false,
"headline": "refactor: adopt external packages to reduce manual code",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T14:23:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e0951245751f91f4c59cb2210374281209841674",
"body": "The concatenation approach (a + \", \" + b) broke OR (||) handling: an OR\nbranch in either constraint escaped the AND, causing false positives.\nFix by checking probes against both constraints separately.\n\nAdd 24 option/choice mismatch tests covering tilde, caret, wildcard,\nOR, exact version, and large version boundaries. Replace fvptr helpers\nwith Go 1.26 new(expr) syntax to fix modernize lint warnings.",
"is_bot": false,
"headline": "fix(compat): check constraints independently in overlap detection",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T14:14:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "78cfe26afef501fa4f1cc7f93a418d1fea56ddbc",
"body": "…ints\n\nCover all constraint syntax (hyphen ranges, tilde, caret with 0.x,\nwildcards, multi-group OR), boundary conditions (strict inequalities,\ntouching ranges), large version numbers (calendar versioning, high\nminors), v-prefix handling, pre-release semantics, and invalid inputs.\nAdd direct TestConstraintsOverlap tests for the probe-based heuristic.",
"is_bot": false,
"headline": "test(compat): add comprehensive edge case coverage for semver constra…",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T14:06:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6973a989325d8964f43779764e74b9fda0c28d62",
"body": "…semver/v3\n\nReplace ~166 lines of duplicated version comparison, constraint matching,\nand boundary probing code with the battle-tested semver library. Wizard\nYAML configs now support the full semver constraint syntax: tilde (~),\ncaret (^), wildcards (x/X/*), hyphen ranges, OR (||), and != operator.",
"is_bot": false,
"headline": "refactor(compat): replace hand-rolled version logic with Masterminds/…",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T13:59:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f312dd4caa08f4cd5ca521df8d31a29b8fa032b7",
"body": "…ons and choices\n\nMove version constraints from a separate compat section to inline\n`versions` fields on Option and Choice structs. This eliminates the\nindirection of cross-referencing compat entries with option names and\nremoves the need to duplicate options when only choices differ by\nversion (e.g\n[…]\nemove MatchedRanges (no longer needed)\n- Add version-gating validation: unreachable choices, defaults in\n versioned choices, visibility refs to versioned options\n- Migrate rails-new.yml to new format",
"is_bot": false,
"headline": "refactor(compat): replace compat section with inline versions on opti…",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T12:50:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "14b939f58411ee2703d275147d7bb51c06a97b5f",
"body": "Extract shared value-editing logic from PinsModel into ValuesEditor,\nthen build a new PresetsModel that composes it for preset CRUD\noperations. Bare `oz run <wizard> presets` now launches the TUI\nwhile existing subcommands remain for scripting.\n\n- Extract ValuesEditor (cycle, toggle, field edit, row\n[…]\ndelete, edit\n- Validate required options on exit with force-exit on second Esc\n- Show required indicator (*) and compat hints in values view\n- Add RenamePreset to store, UI nav hints, and preset tests",
"is_bot": false,
"headline": "feat(wizard): add interactive TUI for preset management",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T12:31:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4fb59a96c93064a66ab58d776ccb40979435bdc9",
"body": "… --remote\n\nIntroduce registry client for fetching and installing wizards from a\nremote index. Add `oz add` and `oz update` commands, and extend\n`oz list` with a `--remote` flag that shows available wizards with\ninstalled status.",
"is_bot": false,
"headline": "feat(registry): add remote wizard registry with add, update, and list…",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T10:13:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "40de81f19166080f84e5be28fdd957675091ec0e",
"body": "Allow quick value cycling with ←/h and →/l keys in the pins list view,\nremoving the need to enter edit mode for select and confirm options.\nCycling wraps through all choices plus an unpinned state.",
"is_bot": false,
"headline": "feat(wizard): add h/l arrow key cycling in pins TUI",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-14T10:13:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ea96415dcac14241d6383d6f32857a94ffcaa3e5",
"body": "Hide frontend options (javascript, css, asset_pipeline, skip_hotwire)\nwhen api mode is selected. Move api/minimal before selects so\nhide_when references resolve correctly.\n\nUpdate wizard-scaffold skill: remove advanced_mode pattern (pins\nhandle this), document additive compat semantics, replace examples\nwith practical hide_when/show_when patterns.",
"is_bot": false,
"headline": "feat(wizard): add hide_when for API mode and update scaffold skill",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-13T16:39:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "15e43f60f43729d0dc34684ea426e7c7faa1201b",
"body": "Change FilterOptions from first-match allowlist to additive semantics:\noptions not in any compat entry are always shown, gated options appear\nonly when their entry's version matches. This eliminates redundant\nfull-option lists in compat entries.\n\nAdd --for-version flag to the show command to inspect options for a\nspecific version without requiring the tool to be installed.\n\nRename MatchedRange to MatchedRanges (returns []string) since multiple\nentries can now match simultaneously.",
"is_bot": false,
"headline": "feat(compat): make compat entries additive and add --for-version to show",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-13T16:25:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "58c30bfa5ab5a64004b7d03c7b3214fd81e7769a",
"body": null,
"is_bot": false,
"headline": "docs: fix markdownlint line-length violations in CLAUDE.md",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-13T15:14:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2dcbac376a0b8f2c1776eb80059b255d21d61e3d",
"body": "Add markdownlint-cli2 as a post-edit hook for .md files, configure\n.markdownlint.jsonc with 120-char line limit (code blocks and tables\nexcluded), and fix all lint violations in wizard-scaffold SKILL.md.",
"is_bot": false,
"headline": "chore(claude): add markdownlint hook and fix skill markdown issues",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-13T15:12:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4fea8ebfe90c0a650e5abe3a1bff116c60c3417b",
"body": "…validation rules\n\nAdd 7-step workflow driven by CLI help output, type selection guide,\nlabel/description guidelines, common YAML patterns, and full type\nconstraint rules covering all features from schema.go and validator.go.",
"is_bot": false,
"headline": "docs(skill): expand wizard-scaffold with help parsing, patterns, and …",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-13T14:52:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "568602405835a354b8481b7f2e85146faf8082b3",
"body": null,
"is_bot": false,
"headline": "docs: add blank lines before markdown lists for consistent formatting",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-13T14:28:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5a107f23052e6947da7a2f9ae442f5c2345b976a",
"body": "Auto-run golangci-lint and go test for the edited package\nafter every .go file edit.",
"is_bot": false,
"headline": "chore(claude): add post-edit lint and test hooks",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-13T14:23:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2e428e5681f1dd23d29ebb34828b9d6376c290bd",
"body": "Add Claude Code automations for the oz project:\n- wizard-scaffold skill for interactive YAML config generation\n- code-reviewer agent for convention-aware Go code review",
"is_bot": false,
"headline": "chore(claude): add wizard-scaffold skill and code-reviewer agent",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-13T14:22:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6dcf37c35f5d5a2afb1084b65a721a7d870f36ce",
"body": "… config path",
"is_bot": false,
"headline": "docs: fix linter count, add missing linter rules, and document wizard…",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-13T12:31:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "970d404c7c915c2283b0b2a0b16e025a00e9816b",
"body": "Expand Go Conventions with subsections for error handling, type safety,\nperformance, style, modern Go, and string constants — matching the\nproject's golangci-lint rules so code is written correctly from the start.",
"is_bot": false,
"headline": "docs: add linter-aligned coding guidelines to CLAUDE.md",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-13T12:29:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "97316558e95f3d64724fb0363f6b59a58b15f4fa",
"body": "…LAUDE.md",
"is_bot": false,
"headline": "docs: add working style, pre-commit checklist, and UI guidelines to C…",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-13T12:04:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c4506168dcd50184341ab27a48d23b61fa6cf02e",
"body": "Add CyanBoldStyle and Width() to internal/ui/theme.go, replace direct\nlipgloss calls in builder.go, pins.go, and version_loader.go with\nui package exports.",
"is_bot": false,
"headline": "refactor(ui): encapsulate all lipgloss usage in ui package",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-13T11:40:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "88b126e2778d3414be700a36846a0b13d18dca90",
"body": "…elpers\n\nAdd GreenStyle, SuccessMsgf, and InfoMsgf to ui/theme.go, then replace\nad-hoc fmt.Print calls across all commands with consistent green success\nconfirmations and accent-colored empty-state messages, each padded with\nblank lines to match the list command's formatting.",
"is_bot": false,
"headline": "refactor(ui): unify output formatting with SuccessMsgf and InfoMsgf h…",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-13T11:35:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "89f047dde9edcbd2ed6fdbc72da218eee4c61e38",
"body": "Add musttag, forcetypeassert, fatcontext, wastedassign, nilnesserr,\ngoconst, nestif, usestdlibvars, usetesting, asciicheck,\ngocheckcompilerdirectives, reassign, and iface linters. Enable all\ngovet analyzers including fieldalignment and shadow.\n\nFix all violations: extract key constants to eliminate goconst hits,\nadd checked type assertions, fix variable shadowing, reorder struct\nfields for alignment, and extract helpers to reduce nesting complexity.",
"is_bot": false,
"headline": "chore(lint): add 14 linters and enable all govet analyzers",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T15:32:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8bcbdc1ab104b1948237ca512ca3dd83713e226b",
"body": "Move --dry-run and --preset to run command as PersistentFlags so they\nappear in `oz run -h`. Rename --with-preset to --preset for brevity.\nDrop ambiguous `v` alias from validate (conflicts with `oz -v`).\nAdd wizard subcommand listing to run help text.",
"is_bot": false,
"headline": "refactor(cli): improve flag discoverability and naming consistency",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T15:04:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "36d161d7d02be45941d5850e86264af142a85dad",
"body": null,
"is_bot": false,
"headline": "style(wizard): add blank line between top-level declarations",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T14:50:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1e01e8abd882c90fc72eb4368bf38992dad2e992",
"body": null,
"is_bot": false,
"headline": "docs: add missing godoc comments",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T14:50:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d3af997935cc8d353e5c94a35fb602b8a8b6d42f",
"body": null,
"is_bot": false,
"headline": "refactor(store): rename DeletePreset to RemovePreset",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T14:49:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "059785a9be53d02c88b9ea95448f50e59973b50c",
"body": null,
"is_bot": false,
"headline": "refactor(config): add OptionType.IsValid method",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T14:49:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "db87b74d2b1067f2629be605436fe5c6c7efdec9",
"body": null,
"is_bot": false,
"headline": "refactor(config): encapsulate validator error collector",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T14:48:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cfbe887a119a22b5ddc38a481d8efcce42f95622",
"body": "Add missing top-level commands (list, validate, edit, create, remove),\nexpand file map with new modules (schema, value, validator_graph,\nversion_loader, pins, choices, state), and document FieldValue sum type\nand hide_when visibility.",
"is_bot": false,
"headline": "docs: update CLAUDE.md architecture to reflect current codebase",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T14:31:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fce2edee15664fed69c1ba0c4417c25b248d20ab",
"body": "… into show -v\n\nRename wizard-level inspect → show (alias s), merge presets inspect\ninto presets show --verbose, change bare presets to show help, add\nLong descriptions and Examples to all commands, and fix README/CLAUDE.md\nto match actual CLI surface.",
"is_bot": false,
"headline": "refactor(cli): unify inspect/explain into show, merge presets inspect…",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T14:26:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b2c9185b803d4a939cd576fab6bf64591686a25c",
"body": "Introduce FieldValue discriminated union (string | bool | []string) and\nValues named map type to eliminate ~150 occurrences of any and\nmap[string]any. All wizard answers, pins, presets, defaults, and\nvisibility conditions are now statically typed.\n\n- Add config.FieldValue with constructors, accessor\n[…]\n resolveDefault helpers\n- Rename Engine receiver e → m (Bubbletea convention)\n- Rename pinnedCnt → pinnedCount, SetPinnedAnswers → SetPinnedValues\n- Add named const for spinner delay in version_loader",
"is_bot": false,
"headline": "refactor: replace any with typed FieldValue sum type across codebase",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T11:08:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c2bc54c6a85509544e6bdba7df9b51e3438036cf",
"body": "Add concise Long descriptions to run, create, doctor, inspect, and\npins commands where Short alone was insufficient.",
"is_bot": false,
"headline": "docs(cli): add Long descriptions to key commands",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T10:33:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "43c1190cefe22b13c6495abfbbb92da8fc6802a9",
"body": "Consistent periods on status messages, %q for user-provided names,\ntype qualifiers in prompts, AccentStyle for identifiers in list output.",
"is_bot": false,
"headline": "fix(cli): normalize output formatting and punctuation",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T10:32:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "60848513f06afbbd3e5a1dba4d2c4a83a6b7594f",
"body": "Bare \"presets\" now lists presets (like bare \"pins\" launches TUI)\ninstead of showing help text.",
"is_bot": false,
"headline": "refactor(cli): make bare presets command list presets",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T10:31:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c71330ac652d43269473ea04cd372e3f9f68263f",
"body": "Matches pins clear and presets remove, enabling scripted usage.",
"is_bot": false,
"headline": "feat(cli): add --force flag to root remove command",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T10:30:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f396d76bc947c42614b6805595d4c0abe14dfeb0",
"body": "Match the \"list\" verb used by presets for enumerating items.",
"is_bot": false,
"headline": "refactor(cli): rename pins show to pins list",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T10:30:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "44f7ab045ac13db19d4d1d3454d2b0f2f6d04c53",
"body": "Unify on \"inspect\" for annotated views — both wizard-level and\npresets now use the same verb.",
"is_bot": false,
"headline": "refactor(cli): rename wizard-level explain to inspect",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T10:29:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e793667193b3c466c2d80b094b4271c86828a336",
"body": "…ebase\n\nIntroduce OptionType and FlagStyle custom types with constants, replacing\nbare string literals across switches in validator, builder, engine, state,\nand pins. Centralize NoneValue constant in config package. Unify field\nconstructors to all accept config.Option. Extract RunParams struct for\nw\n[…]\nePins helper (DRY),\nand prompt helpers into cmd/oz/prompt.go. Simplify FormatCommand to reuse\nPlainParts, remove trivial DryRun wrapper, and use wizard.Answers type\nalias consistently for answer maps.",
"is_bot": false,
"headline": "refactor: improve type safety, consistency, and modularity across cod…",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T10:26:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1caa53d0edb6484be880fda02a8fe3dade5cceb0",
"body": "- Add RunE to presetsCmd so bare `oz run <w> presets` shows help\n- Add confirmDangerousPrompt (default-no) for destructive ops with --force flag\n- Make `validate` accept wizard name or path, add `v` alias and completion\n- Rename `presets explain` → `presets inspect`, `presets delete` → `presets remo\n[…]\nompletion to show, inspect, save, remove\n- Add Example strings to run, create, validate, and wizard commands\n- Improve bare `oz run` error to suggest `oz list`\n- Add --no-edit flag to `create` command",
"is_bot": false,
"headline": "feat(cli): audit and improve CLI API consistency and ergonomics",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T09:54:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4d88adb1f0c8eca294dc004b21305e702dedbf09",
"body": "Add 20+ new checks that catch logical errors at config-load time:\n\nSemantic checks: default not in choices, duplicate choices, required +\nallow_none conflict, confirm flag ambiguity, type-field mismatches\n(allow_none/flag_true/flag_false/flag_none/choices), InputRule bounds,\nmulti_select scalar defa\n[…]\nhen\nwith correct AND-semantics (subset-based conflict detection).\n\nAccept empty-string default on select with allow_none as \"default to\nnone\" to avoid leaking the internal _none sentinel into configs.",
"is_bot": false,
"headline": "feat(config): add semantic and visibility graph validation",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-10T09:50:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "515d52c370ccb0d9585c9084f542261e97cb2389",
"body": null,
"is_bot": false,
"headline": "fix(cli): add missing version_control.label to create template",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-09T17:24:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "629632eca7386c72b1e87d502d2c3260c3e84659",
"body": "…s in pins UI\n\nShow (default) tag on select and confirm fields in both wizard run and\npins edit mode. Fix description indent in pins edit view after replacing\nthe step counter with the shorter \"pin\" indicator. Add up/down nav hints\nfor select, confirm, and multi-select fields in pins edit mode.",
"is_bot": false,
"headline": "fix(wizard): add default tags, fix header alignment, and add nav hint…",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-09T17:15:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5610adcbf0c346bdae70f48cae752453cab41140",
"body": "Pass opt.Validate and opt.Required to NewInputField in buildPinsField\ninstead of nil/false. Space-toggle now validates resolved values for\ninput fields and falls back to edit mode when invalid or missing.",
"is_bot": false,
"headline": "fix(wizard): validate input fields when pinning",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-09T16:58:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "05fae4d54e4802da4e3f9d9174fa3daddf961eda",
"body": null,
"is_bot": false,
"headline": "chore: add .plans/ to gitignore",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-09T16:38:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1ec7505d277d5131473ea04bb4d748013d024558",
"body": "Validate custom version pins using compat.VerifyVersion() at both entry\npoints: the pins TUI (on submit) and the version loader (at wizard run\ntime). Invalid pins now show an error in the pins editor or fall through\nto the normal version selector with a stderr warning.",
"is_bot": false,
"headline": "feat(wizard): verify pinned versions before use",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-09T16:24:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b0e53dff9f3758528f10b8279b5b400b1b50323b",
"body": "…sion pin UX\n\nPins are now stored at the top level of VersionedState (not per-version),\nwith dedicated LoadPins/SavePins and LoadPinnedVersion/SavePinnedVersion\nAPIs replacing the old version-scoped approach. Version pin sentinel\nchanges from \"default\" to \"current\", blank input stores \"current\", and\n[…]\nting a \"current\" pin starts with an empty field. NumberGutter gains a\nwidth parameter for right-aligned multi-digit lists. Pins UI shows\ncompat version hints per option and filters stale keys on load.",
"is_bot": false,
"headline": "refactor(store): move pins to version-independent storage and fix ver…",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-09T16:03:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4a4eacf5e67939bc7e0bbc23257dae772ea8df1c",
"body": "During completion, detectWizardName no longer bails on __complete\ntokens. Instead it skips them and finds the wizard name after run/r,\nenabling cobra to register the wizard subcommand with its children\n(doctor, explain, pins, presets, flags). Partial input (e.g. \"cre\")\nis excluded by checking whether the candidate is the last arg (the\nword currently being typed). completeWizardNames also guards against\nsuggesting wizard names for subsequent positions.",
"is_bot": false,
"headline": "fix(cli): stop suggesting wizards after first arg in completion",
"author_name": "Leonid Svyatov",
"author_login": "svyatov",
"committed_at": "2026-03-09T14:43:17Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 2,
"commits_last_year": 127,
"latest_release_at": "2026-07-01T14:32:26Z",
"latest_release_tag": "v0.2.0",
"releases_from_tags": false,
"days_since_last_push": 5,
"active_weeks_last_year": 6,
"days_since_latest_release": 20,
"mean_days_between_releases": 89.7
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 85,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"ecosystem": {
"packages": [
{
"name": "github.com/svyatov/oz",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/svyatov/oz",
"is_deprecated": false,
"latest_version": "v0.2.0",
"repository_url": "https://github.com/svyatov/oz",
"versions_count": 2,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-01T14:30:28Z",
"latest_version_yanked": null,
"days_since_latest_publish": 20
}
]
},
"popularity": {
"forks": 0,
"stars": 2,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [
{
"date": "2026-04-06",
"count": 1
},
{
"date": "2026-06-30",
"count": 1
}
],
"complete": true,
"collected": 2,
"total_stars": 2
},
"open_issues_and_prs": 4
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"Taskfile.yml"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 27545,
"source_files_sampled": 77,
"oversized_source_files": 0,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 10464
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": "repository_graph",
"source": "osv",
"findings": [],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 31,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "charm.land/bubbles/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.1.0"
},
{
"name": "charm.land/bubbletea/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.0.7"
},
{
"name": "charm.land/huh/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.0.3"
},
{
"name": "charm.land/lipgloss/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.0.4"
},
{
"name": "github.com/Masterminds/semver/v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.5.0"
},
{
"name": "github.com/adrg/xdg",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.5.3"
},
{
"name": "github.com/charmbracelet/x/term",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.2.2"
},
{
"name": "github.com/spf13/cobra",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.10.2"
},
{
"name": "gopkg.in/yaml.v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.0.1"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "charm.land/bubbles/v2",
"direct": true,
"version": "v2.1.0",
"ecosystem": "go"
},
{
"name": "charm.land/bubbletea/v2",
"direct": true,
"version": "v2.0.7",
"ecosystem": "go"
},
{
"name": "charm.land/huh/v2",
"direct": true,
"version": "v2.0.3",
"ecosystem": "go"
},
{
"name": "charm.land/lipgloss/v2",
"direct": true,
"version": "v2.0.4",
"ecosystem": "go"
},
{
"name": "github.com/adrg/xdg",
"direct": true,
"version": "v0.5.3",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/x/term",
"direct": true,
"version": "v0.2.2",
"ecosystem": "go"
},
{
"name": "github.com/masterminds/semver/v3",
"direct": true,
"version": "v3.5.0",
"ecosystem": "go"
},
{
"name": "github.com/spf13/cobra",
"direct": true,
"version": "v1.10.2",
"ecosystem": "go"
},
{
"name": "gopkg.in/yaml.v3",
"direct": true,
"version": "v3.0.1",
"ecosystem": "go"
},
{
"name": "github.com/atotto/clipboard",
"direct": false,
"version": "v0.1.4",
"ecosystem": "go"
},
{
"name": "github.com/catppuccin/go",
"direct": false,
"version": "v0.3.0",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/colorprofile",
"direct": false,
"version": "v0.4.3",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/ultraviolet",
"direct": false,
"version": "v0.0.0-20260525132238-948f4557a654",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/x/ansi",
"direct": false,
"version": "v0.11.7",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/x/exp/ordered",
"direct": false,
"version": "v0.1.0",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/x/exp/strings",
"direct": false,
"version": "v0.1.0",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/x/termios",
"direct": false,
"version": "v0.1.1",
"ecosystem": "go"
},
{
"name": "github.com/charmbracelet/x/windows",
"direct": false,
"version": "v0.2.2",
"ecosystem": "go"
},
{
"name": "github.com/clipperhouse/displaywidth",
"direct": false,
"version": "v0.11.0",
"ecosystem": "go"
},
{
"name": "github.com/clipperhouse/uax29/v2",
"direct": false,
"version": "v2.7.0",
"ecosystem": "go"
},
{
"name": "github.com/dustin/go-humanize",
"direct": false,
"version": "v1.0.1",
"ecosystem": "go"
},
{
"name": "github.com/inconshreveable/mousetrap",
"direct": false,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/lucasb-eyer/go-colorful",
"direct": false,
"version": "v1.4.0",
"ecosystem": "go"
},
{
"name": "github.com/mattn/go-runewidth",
"direct": false,
"version": "v0.0.23",
"ecosystem": "go"
},
{
"name": "github.com/mitchellh/hashstructure/v2",
"direct": false,
"version": "v2.0.2",
"ecosystem": "go"
},
{
"name": "github.com/muesli/cancelreader",
"direct": false,
"version": "v0.2.2",
"ecosystem": "go"
},
{
"name": "github.com/rivo/uniseg",
"direct": false,
"version": "v0.4.7",
"ecosystem": "go"
},
{
"name": "github.com/spf13/pflag",
"direct": false,
"version": "v1.0.10",
"ecosystem": "go"
},
{
"name": "github.com/xo/terminfo",
"direct": false,
"version": "v0.0.0-20220910002029-abceb7e1c41e",
"ecosystem": "go"
},
{
"name": "golang.org/x/sync",
"direct": false,
"version": "v0.20.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "v0.45.0",
"ecosystem": "go"
}
],
"collected": true,
"truncated": false,
"total_count": 31,
"direct_count": 9,
"indirect_count": 22
}
},
"maintainership": {
"issues": {
"open_prs": 4,
"merged_prs": 5,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 4
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "svyatov",
"commits": 123,
"avatar_url": "https://avatars.githubusercontent.com/u/310043?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"release.yml"
],
"has_docs_dir": false,
"linter_configs": [
".golangci.yml"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 3,
"reason": "branch protection is not maximal on development and all release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 8,
"reason": "4 out of 5 merged PRs checked by a CI test -- score normalized to 8",
"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/26 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 8,
"reason": "SAST tool is not run on all commits -- score normalized to 8",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": 0,
"reason": "Project has not signed or included provenance with any releases.",
"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": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "a15b781fe1c1075157294bfc5c5700fd267e2c4f",
"ran_at": "2026-07-22T09:31:05Z",
"aggregate_score": 5.3,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-18T14:06:52Z",
"oldest_open_prs": [
{
"number": 10,
"created_at": "2026-07-09T10:33:50Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 11,
"created_at": "2026-07-09T10:33:56Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 12,
"created_at": "2026-07-09T10:34:02Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 13,
"created_at": "2026-07-16T10:33:38Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": "2026-07-01T14:01:45Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/svyatov/oz",
"host": "github.com",
"name": "oz",
"owner": "svyatov"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 59,
"inputs": {
"security": 62,
"vitality": 74,
"community": 43,
"governance": 45,
"engineering": 72
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 74,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 68,
"inputs": {
"commits_last_year": 127,
"human_commit_share": 0.96,
"days_since_last_push": 5,
"active_weeks_last_year": 6
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 5 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 5
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "6/52 weeks with commits",
"points": 4.2,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 6
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "127 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 127
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "good",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 83,
"inputs": {
"releases_count": 2,
"latest_release_tag": "v0.2.0",
"releases_from_tags": false,
"days_since_latest_release": 20,
"mean_days_between_releases": 89.7
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "2 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 2
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 20 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 20
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~89.7 days",
"points": 19.8,
"status": "partial",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 89.7
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 43,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 2,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "below_threshold"
},
"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": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "excellent",
"name": "Community health",
"note": null,
"notes": [],
"value": 92,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (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": 6.3,
"status": "met",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 45,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 10,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "at_risk",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 40,
"inputs": {
"merged_prs": 5,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 4
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "5/9 decided PRs merged",
"points": 21.2,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 5,
"decided": 9
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/26 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": 54,
"inputs": {
"followers": 33,
"owner_type": "User",
"is_verified": null,
"owner_login": "svyatov",
"public_repos": 27,
"account_age_days": 5875
},
"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": "33 followers of svyatov",
"points": 11,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 33,
"login": "svyatov"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "27 public repos, account ~16 yr old",
"points": 22.5,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 27
}
},
{
"code": "account_age_years",
"params": {
"years": 16
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 92,
"inputs": {
"packages": [
"github.com/svyatov/oz"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 20
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 20 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 20
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "2 published versions",
"points": 12,
"status": "partial",
"details": [
{
"code": "published_versions",
"params": {
"count": 2
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 72,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 80,
"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": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"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": ".golangci.yml",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yml"
}
}
],
"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": "4 out of 5 merged PRs checked by a CI test -- score normalized to 8",
"points": 16,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"topics": [
"cli",
"go",
"terminal",
"utility",
"bubbletea",
"cli-tool",
"code-generator",
"command-line",
"golang",
"interactive",
"scaffold",
"tui",
"wizard",
"yaml"
],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": false,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "14 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 14
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 62,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": null,
"notes": [],
"value": 53,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 18,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 0,
"scorecard_aggregate": 5.3
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection is not maximal on development and all release branches",
"points": 2.2,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "4 out of 5 merged PRs checked by a CI test -- score normalized to 8",
"points": 2,
"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/26 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "20 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow 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 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 8",
"points": 4,
"status": "partial",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"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": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 31 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"indirect_dependencies_free_of_known_advisories",
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_repository",
"params": {
"assessed": 31
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 0,
"affected_packages": 0,
"assessed_packages": 31,
"unassessed_packages": 0,
"affected_by_severity": "none",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "transitive set not separable from development and test dependencies in this scope",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_scope_not_separable",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 31,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 2
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "excellent",
"name": "AI Readiness",
"value": 85,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.99,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 10464
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "95 of 96 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 95,
"sampled": 96
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "good",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 80,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"Taskfile.yml"
],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0.04
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Taskfile.yml",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Taskfile.yml"
}
}
],
"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": ".golangci.yml",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yml"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "4 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 4,
"sampled": 100
}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 27545,
"source_files_sampled": 77,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/77 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 77,
"oversized": 0
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [],
"report_type": "repository",
"generated_at": "2026-07-22T09:31:13.370792Z",
"schema_version": "0.26.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/svyatov/oz.svg",
"full_name": "svyatov/oz",
"license_state": "standard",
"license_spdx": "MIT"
}