JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [
"ai-workflows",
"cli",
"mcp",
"python",
"goodeye",
"agentic-ai",
"ai-agents",
"ai-tools",
"anthropic",
"claude",
"developer-tools",
"generative-ai",
"llm",
"workflow-automation"
],
"is_fork": false,
"size_kb": 833,
"has_wiki": true,
"homepage": null,
"languages": {
"Python": 1368526
},
"pushed_at": "2026-07-22T20:53:15Z",
"created_at": "2026-04-21T23:03:26Z",
"owner_type": "Organization",
"updated_at": "2026-07-22T20:38:33Z",
"description": "CLI for Goodeye: turn business outcomes into verified AI workflows that agents run reliably.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Python",
"significant_languages": [
"Python"
]
},
"owner": {
"blog": null,
"name": "Goodeye Labs",
"type": "Organization",
"login": "Goodeye-Labs",
"company": null,
"location": null,
"followers": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/227486020?v=4",
"created_at": "2025-08-19T22:36:13Z",
"is_verified": null,
"public_repos": 7,
"account_age_days": 336
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.3.3",
"kind": "patch",
"published_at": "2026-04-29T01:03:33Z"
}
],
"recent_commits": [
{
"oid": "ffb878704355909313784f964db436e793adbe86",
"body": "* Add put-file and rm-file for single-path skill edits\n\nChange one file in a hosted skill without resending the rest of its tree:\n\n goodeye skills put-file <skill> <path> --from-file ./notes.md\n goodeye skills rm-file <skill> <path>\n\nPaths the command does not name ride forward untouched, unl\n[…]\n, and a path with no local copy is never recorded, so the\nmanifest never describes content its directory does not hold.\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add put-file and rm-file for single-path skill edits (#62)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-22T20:38:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1329bc6361478e8e2e2e9241cf43bcaccfc70bff",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.25.1",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-21T02:35:49Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "89b8efaa087eb2dfa9006fd17a7f65f5a88a4604",
"body": "The upgrade tool exits 0 even when it changes nothing, so a version-pinned\ninstall printed \"Updated goodeye from X to Y\" while still running the old\nversion. The success line reported the intended target rather than what was\nactually installed.\n\nConfirm the outcome by re-reading the installed versio\n[…]\nto force the reinstall, a real upgrade reports the version that\nactually landed, and an unverifiable outcome never claims success.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Report the real result of goodeye update",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-21T02:35:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7dbcb1bf700cd1446b6180229997b5f6ea6f3f1c",
"body": "* Turn automatic sync on once a sync target is configured\n\nConfiguring a target is the statement of intent to keep it current, so\nautomatic sync now resolves to on from that point instead of waiting for\na separate `sync auto on` that most people never found.\n\nA stated preference always wins. `auto o\n[…]\n command returned two payload shapes. Add the field\nto the append branch so machine readers see it on every target add.\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Turn automatic sync on once a sync target is configured (#61)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-20T21:17:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ac7da8216fd6146a58f1ac3799e8147150cb12ab",
"body": "Only a skill's owner may change its verifier references, so a push for a\nskill shared with you has nothing to say about them. The registry carries\nthe stored references forward whenever the field is absent, so omitting it\nis both correct and sufficient.\n\nThe push payload sent them regardless. `_veri\n[…]\nt out.\nBindings the registry reports back are still recorded in the index, so it\nkeeps tracking references the caller cannot edit.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Leave verifier refs out of a push for a skill you do not own (#60)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-20T19:42:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0d21d7044b966d650babc8c5a4e9f6b2f031d4e5",
"body": "* Describe the CLI by what it keeps, not by the retired pitch\n\nThe README, the PyPI package summary, and the top-level `--help` text all led\nwith an older framing built around an agent meeting your standard before you\nsee the output. The product is now described by three properties: skills and\nverif\n[…]\np is unchanged and still correct; only its stated reason\nwas wrong, which would mislead anyone revisiting the decision.\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Refresh CLI positioning, fix dead group help, add a codex preset (#59)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-19T03:46:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a0ec692d0a90655f3295aab04f398039a3711120",
"body": "* feat: goodeye skills command group\n\nRegisters `goodeye skills` as the canonical command group for browsing,\nrunning, saving, and sharing private skills, carrying all 27 leaf\nsubcommands (list, search, get, publish, lineage, archive, unarchive,\ndelete, delete-version, grant, revoke-grant, grants, l\n[…]\n overwrite the current one on a back-compat path.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "goodeye skills command group and wire contract (#58)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-17T22:41:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "23979deca410b78adb72a8a5351fe434dad2bd33",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.23.1",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-06T18:30:39Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d352b004522d0b8df887b2749b6ccbcad2453a12",
"body": "goodeye workflows sync push resolved the target workflow by name, which the\nserver rejects as ambiguous for any workflow the caller has an edit grant on but\ndoes not own: the name matches no row in the caller's own namespace, so a\nname-only save cannot resolve, and the push was reported as skipped-i\n[…]\n client save_workflow method. Owned workflows\nare unaffected; with no id they still resolve by name in the caller's own\nnamespace.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Address workflows by id when syncing so shared workflows push",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-06T18:29:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0dfd68d7c2bd8219f575aefffd1cd662ee96da78",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.23.0",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-05T04:26:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "538f7b9321b9ea5d65764e611cbf1e59490c9b05",
"body": "…up (#56)\n\n* Never open a real browser during tests\n\nAdd a suite-wide autouse fixture that neutralizes webbrowser.open, so a test\ncan never pop a real browser tab even if a per-test stub targets the wrong\nmodule path. Commands that open a checkout or portal URL are exercised through\ntheir command-mo\n[…]\n it reads accurately even when no\ncard is on file, where the server returns a hosted checkout link and\ncharges nothing.\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Rename subscription commands to billing; add buy-credits and auto-top…",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-04T21:12:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3fe6f9fb9d9bdc09ebe28da168d86b03027d151e",
"body": "* feat: add upgrade, downgrade, and billing portal commands\n\nAdd self-service Pro subscription management: `goodeye subscription upgrade`\nstarts a Stripe checkout, `goodeye subscription cancel` (aliased as the\nhidden top-level `goodeye downgrade`, mirroring the existing `upgrade` ->\n`update` alias) \n[…]\nr: drop the downgrade alias in favor of subscription cancel\n\ngoodeye subscription cancel is the only cancel command now; the hidden\ntop-level downgrade alias added confusion without adding capability.",
"is_bot": false,
"headline": "Pro subscription commands (upgrade, cancel, portal) (#55)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-02T21:02:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "807add342d3e946e599033868b23e6ae14d2b452",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.21.3",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-02T19:32:40Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "336f4506b43ceada1f21b0bed2f3c66eb29ed128",
"body": "* Surface the fork and save next_step guidance to CLI agents\n\nThe server now returns a next_step string on template fork (always) and\nworkflow save (only for a hand-edited authored fork with checks), but the\nCLI's strict wire models silently dropped unknown fields. Add next_step to\nTemplateForkResul\n[…]\nthrough TemplateDetail and WorkflowDetail, which lacked run_guidance, so\nthe strengthened field was silently dropped. Add the field to both\nmodels and a test asserting it now appears in --json output.",
"is_bot": false,
"headline": "Surface fork, save, and run guidance to CLI-driven agents (#54)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-02T02:44:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "67cbc843744cff250b006b4ef95690ac4fe4cabf",
"body": "Rewrite the README (and the PyPI project page) to lead with what Goodeye does,\nthe shortest path to value, and a command-area map, deferring the exhaustive\nper-command reference to the docs at goodeye.dev/docs. Add Homepage and\nDocumentation project links, and bump to 0.21.2 so the refreshed page ships\nto PyPI.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Refocus the README on high-value CLI docs and link out for depth",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-01T19:14:19Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c9f960a0a42c2dce89a7c676807216e804a941fb",
"body": "Lead the README and PyPI package description with the active standard-alignment\none-liner used on the landing page and in company messaging, replacing the\nolder passive framing.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Align README and package description with current product framing",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-01T18:44:15Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b56f5754ca0be345d05379cb45f39491f9811b7f",
"body": null,
"is_bot": false,
"headline": "chore: bump version to 0.21.1",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-01T18:04:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3ea3e9b827e2cf1c659f6329f556a72adc1f5b4f",
"body": "Add the current Anthropic and OpenAI models to the goodeye verifiers deploy help text so it matches the server allowlist: Claude Opus 4.8, Claude Sonnet 5, Claude Fable 5, GPT-5.4 Nano, GPT-5.4 Pro, and GPT-5.5 Pro.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Update supported model list in verifiers deploy help text (#53)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-07-01T17:59:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "06ec35dd245aff644b75d015ff095a8bbd4b70ee",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.21.0",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-29T00:57:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ae4ceb1a92c8e7f42b5ca4d03ccf3e11e09a9d02",
"body": "* Add post-login banner for shared workflows and pending invitations\n\nAfter interactive login succeeds on a TTY, print a one-line nudge\nshowing how many workflows are shared with the user and how many team\ninvitations are pending, pointing at the relevant list commands.\n\nThe banner is silent and non\n[…]\nrom only the nonzero categories so an empty\ncategory is omitted entirely.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Show shared workflows and pending invitations after login (#52)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-29T00:09:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3232f7d09cbae8ff71f7d31e563ee8f43dd804d7",
"body": "…#51)\n\n* Retire hardcoded stdout execute markers; render server run guidance\n\nThe server text/markdown response now begins with a standing run-guidance\ndirective composed in-band, so the CLI no longer prepends\n\"# Goodeye workflow - execute the instructions below as the user's agent.\"\nor appends \"# E\n[…]\n text and add round-trip\ntests for both commands.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Retire hardcoded stdout execute markers; render server run guidance (…",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-28T03:39:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6cff9d06ea83f634002475ba19adbcebaed90346",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.20.0",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-26T21:51:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c9dc31442eca39573019074dbc7daa9174841e63",
"body": "* Clarify CLI help text to say what each command is for\n\nLead each command, group, and the root tagline with the task a user or\nagent accomplishes, not the mechanism it runs. The design, teach,\noptimize, and audit commands now make the create, improve, and review\ndistinction unmistakable. Reword the\n[…]\n a new one),\nso the help text now distinguishes unpublish from deprecate and delete\ninstead of promising reversibility.\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Clarify CLI help text to say what each command is for (#50)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-26T20:43:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b985338539d4823e9521e38b3683ebf0fe2ccf45",
"body": "Parse the additive design_checks read field on template summaries and\ndetails, surface the three authoring check states in the templates list\ntable and the publish summary, and print the audit guidance when a publish\nfalls short of a check. Additive and backward compatible: an older server\nthat omits the field leaves all three checks at not_checked.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Render the authoring checks on templates get, list, and publish (#49)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-26T17:28:19Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9029437355eb29cc03b1c2c8a76b390d9edeeb66",
"body": "…tatus (#48)\n\n* Detect added, deleted, and ignore-shifted siblings in sync push and status\n\n`sync push` and `sync status` only examined already-tracked sibling files\nwhen deciding whether a workflow had drifted, so a brand-new file dropped\ninto a tracked directory was never uploaded and status repor\n[…]\ntly the deletion the predicate exists to surface.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Detect added, deleted, and ignore-shifted siblings in sync push and s…",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-26T05:25:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7a11e14fce9afc905878d3ac44b877f3f9a20819",
"body": "generate gains --visibility (public by default) to choose how the hosted copy of each image is stored. For a private image, get shows the capability view link, and a new reset-link command (and update --rotate-view-secret) issues a fresh view link and revokes the links shared earlier. update and unshare surface the view link for private images.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add image visibility control and private view-link commands (#47)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-26T04:34:16Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9dd9a3971c5c935ca6c4358d6de802e183805c07",
"body": "Match the active product framing already in the README. No release; this\nships with the next CLI version.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Drop \"registry\"-adjacent framing from the CLI package summary",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-24T00:58:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4329fbf24af80abfb3071b12efecb4f5c3c99e58",
"body": "The intro called Goodeye an \"outcome-aligned AI workflow registry,\" which reads\nas a passive catalog. Lead with the active outcome instead (Goodeye turns\nbusiness outcomes into verified AI workflows that agents run reliably), matching\nthe product's canonical definition. Component references to the registry\nelsewhere are unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Align README framing: lead with what Goodeye does, not \"registry\"",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-23T22:58:35Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cc24b44d78c66a610ba061b12ffb9cde9e0c5996",
"body": "* Recover over-ceiling binaries on sync pull via raw byte fetch\n\nsync pull fetches a workflow's sibling files through the inline JSON file\nAPI, which refuses any binary larger than the server inline size limit with\nbinary_too_large_for_inline. Those files (typically larger demo images or\nassets) wer\n[…]\ny@anthropic.com>\n\n* chore: bump version to 0.19.3\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Recover over-ceiling binaries on sync pull via raw byte fetch (#46)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-23T00:33:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c4bccdf6f21f52d6fbd5d2a304826b2ccb37c17d",
"body": "…#45)\n\nA published template's verifier definitions are now public, so the\ntemplate wire model carries each verifier's full definition (criterion,\ncalibration examples, judge config, verifier id), and `templates get\n--json` no longer drops those fields.\n\n`templates publish` prints the server's notice that publishing makes a\ntemplate's verifier definitions public when the template references\nverifiers.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Surface public verifier definitions and the publish exposure notice (…",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-19T22:39:18Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4f7ceff15507b0ace3bb26cb4d33d864c8c19078",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.19.2",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-18T06:55:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1957f972cb5e1902ecdb3ceaf8ceada303bd3774",
"body": "This server release adds two error slugs the CLI did not map: ambiguous_workflow_reference (409, from caller-namespace save resolution) and image_dimensions_exceeded (413, the hosted-image pixel guard). Both fell through to ServerError, and ambiguous_workflow_reference was not caught by the sync pus\n[…]\nn is categorized like its sibling input errors. Escape truncated field names in the safety-check renderer for parity with the reasoning output.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Map new image and workflow-namespace error slugs to typed errors",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-18T06:55:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "46184b52dd2c5de621c71b6605fe98a5a99e1921",
"body": "Public image uploads and private-to-public flips can now be rejected by\ncontent screening, returning image_content_rejected (422) or\nimage_screening_unavailable (503). Map both slugs so the CLI renders the\nserver's message and exits non-zero, instead of falling through to a\ngeneric server error. Add end-to-end tests covering both slugs on the\nupload path and the rejection on the flip path.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Surface public-image content-screening errors clearly",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-18T06:18:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7bdd569a2569468197fcb5067a7dcad399e71ef7",
"body": "The template safety check can now truncate an oversized field for the\nscan rather than failing. Parse the new optional truncated and\ntruncated_fields fields on SafetyCheckResult (defaulting so older\nservers still parse) and print a note when a scan was truncated, so\nusers know the verdict was partial and the published status is\nauthoritative.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Surface safety-check field truncation in the response and renderer (#44)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-18T05:30:35Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e525abe56117938a49002fee5c2011ed0fe2afdb",
"body": "…s (#41)\n\nWhen a workflow is mirrored into multiple local directories, a push from one copy that changed a sibling file left the other copies stale while reporting them current, so recovery required a forced pull. Convergence now compares manifests and defers such copies with a new pull-required outcome, leaving the version token unadvanced so the next ordinary pull heals them through the existing pull path.",
"is_bot": false,
"headline": "Heal stale sibling files when a workflow is synced to multiple target…",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-18T05:01:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f196be63addf4197b3467b42ff557b1c630d23ed",
"body": "* fix: clean validation error for malformed front-matter YAML\n\nMalformed YAML in a workflow's front-matter previously raised a raw\nparser error that escaped to the top-level backstop, printing a generic\n\"unexpected error\" instead of a clear validation message. A front-matter\ntypo is a common, user-t\n[…]\nce included. Add a test that pins an\ninterior error to its exact file line.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: clean validation error for malformed front-matter YAML (#43)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-18T04:47:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "96d14dfca6f3055cb8b82edcbddfd8b63dc0cc7e",
"body": "* fix: create CLI credential file atomically at mode 0600\n\nThe credential writer opened the temp file at the process umask and only\nchmod'd it to 0600 after the API key was already written, leaving a window\nin which another local user on a shared host could read the key. It also\nused a fixed \".tmp\" \n[…]\nribes the\nstrictest call site, not a claim that every payload is sensitive.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: create CLI credential file atomically at mode 0600 (#42)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-18T04:43:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e3e8521ae893eb25532b3a54da63e4a2a6ef8dc4",
"body": "…ursor cycles (#40)\n\n- errors.py: handle_invalid, handle_reserved, handle_taken, handle_not_claimed,\n handle_rename_too_soon, and handle_rename_limit_exceeded now map to the\n appropriate typed errors (validation, conflict, rate limited) instead of a\n generic server error, so exit codes and messag\n[…]\nh the server contract.\n- output.py: fetch_pages now detects a repeated pagination cursor and raises a\n clear error instead of looping forever.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Map handle error slugs to typed errors and guard pagination against c…",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-18T04:27:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "881f1964c3f99cf9fba0e5b06ded184c1d6264eb",
"body": null,
"is_bot": false,
"headline": "chore: bump version to 0.19.1",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-18T00:19:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d679b24b736c342d8e47e6195c6365554c73a910",
"body": "Default the workflows list --filter scope to \"all\" (owned plus shared) instead of \"mine\", matching both server surfaces (GET /v1/workflows and the list_workflows tool) so workflows shared via grants are no longer hidden by default. Help text and docstring updated; added a test asserting the default issues scope \"all\".\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Show shared workflows by default in `goodeye workflows list` (#39)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-18T00:18:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d43bfb9121950782cc9f559f3102c256de58e546",
"body": "* feat: add image hosting commands\n\nAdd `goodeye images` command group with upload, list, get, update, delete,\nshare, unshare, and set-ttl subcommands. Upload uses multipart/form-data via\na new `_request_multipart` helper on GoodeyeClient. Wire models (ImageDetail,\nImageList) and image-specific erro\n[…]\nentry for image\nhosting, which declares this feature ships as CLI 0.19.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add goodeye images commands (#38)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-17T21:45:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f3fe1afc100eed11f635ab2a43a001ebeb106286",
"body": "* feat: run interactive sign-in for 'goodeye register' with no --email\n\nA bare 'goodeye register' previously errored on a missing --email option,\nleaving new users with no interactive path (only 'goodeye login' had one).\nRegister now shares the same browser/device-code flow as login, which\ncreates t\n[…]\ne 'register --email' stays for\nautomation.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n* chore: bump version to 0.18.2\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make `goodeye register` interactive when run without --email (#37)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-16T01:28:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b64c95633e668fbcad40079701e2f1da65747697",
"body": "goodeye usage shows referral bonus credits as their own breakdown line and --json includes referral_remaining_usd. The wire field defaults to 0.00 so older-server responses still parse.",
"is_bot": false,
"headline": "fix: show referral credits in goodeye usage (0.18.1)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-16T00:41:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "32158d300f95e364e5f2afb9194773a74ddd0761",
"body": null,
"is_bot": false,
"headline": "chore: bump version to 0.18.0",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-15T18:49:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c3f740a63a1b23826ac6a031c8607b39eddb4937",
"body": "* feat: add referral status and redeem commands\n\n* feat: redeem a referral code during register and login\n\nAdd --referral-code to register-verify, login (device-code), and\nlogin-verify. After credentials are saved, the new _maybe_redeem_referral\nhelper calls the redeem endpoint with the supplied cod\n[…]\n the status value\nstays in the --json payload for programmatic consumers.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add referral commands and a referral-code sign-in flag (#35)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-15T17:45:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cca691c9189466d2cf7469c6e6cb8d433a6edec5",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.17.0",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-15T05:14:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4140e0e37fe2b5a2c9ee89ea4b87a87b0ae27017",
"body": "* feat: add opt-in auto-pull for local workflow sync\n\nAdd an opt-in mode that keeps already-configured sync targets fresh without a manual pull. When enabled, the CLI pulls the safe set (new and behind-server workflows) as a best-effort tail after the command completes: it never blocks the command, \n[…]\normatter\nwraps differently so the branch matches the updated lint baseline.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: opt-in auto-pull for local workflow sync (#33)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-15T04:51:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "72090bc751520f4f23eb55f83552f95fab727e21",
"body": "* chore: pin ruff to 0.15.11 across pre-commit and dev deps\n\nThe dev dependency was a floor-only ruff>=0.6 while the pre-commit hook\nhard-pinned v0.6.9, so local tooling and CI resolved ruff versions almost\na year apart. Pin both to 0.15.11 (a single source of truth) and record it\nin the lockfile.\n\n\n[…]\n5.11. The newer formatter\nrelocates assertion messages; no behavior change.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: align ruff version between CI and local tooling (#34)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-15T04:43:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "112dbc2de11bbc526804a1be41cfcc8cef4e0751",
"body": "…ields (#31)\n\n* feat(cli): bind image generators to workflows and surface dropped fields\n\nAdd --image-generator name=generator_ref (repeatable) and\n--clear-image-generators to `workflows publish`, mirroring the verifier\nflags, and thread image_generators through the save_workflow client and\nthe wire\n[…]\no owners).\nParse both so they are no longer lost from templates get --json.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: bind image generators to workflows and surface dropped detail f…",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-15T03:25:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "33fe99d08578890307db6cabfac0c08410a9ffc7",
"body": "Map the server's 402 anonymous_daily_cap response to a typed AnonymousDailyCapReached error so the CLI renders the server message cleanly instead of falling back to a generic server error. Older CLIs degrade gracefully by showing the server message as a generic error.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(errors): recognize the anonymous_daily_cap error slug (#32)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-14T20:55:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ce2a82e0cc246481d8c02db50852132c8e7ea805",
"body": "…e network errors (#30)\n\ntemplates search now runs anonymously, matching templates list and get and the\npublic search route on the server (which already meters any LLM ranking against\nthe per-IP grant). An un-signed-up user is no longer bounced from the natural\n\"find a template\" command by a client-\n[…]\nmand dumps a\ntraceback on a first run; GOODEYE_DEBUG=1 restores full detail and surfaces the\nunderlying transport cause behind a network error.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix two first-run CLI faceplants: anonymous template search and human…",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-14T07:13:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c775de5af1d9c6115af9a152af2f869da6c2400f",
"body": "Show fetching a real public template, executing its body, producing the artifact, and a verifier returning PASS, all without an account.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add a no-account end-to-end template run to the README (#29)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-14T07:12:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "42480ea4a3d3292b0febe96b5c4c36e934452ee9",
"body": "The --verifier flag already accepts name=verifier_id@version (the suffix rides through to the server), but the help text only showed the unpinned form. Document the pin and when to reach for it, lock the passthrough with a test, and bump to 0.16.1.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Document the @version verifier binding pin in publish --help",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-13T21:50:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e5c8768730d115e891f51083aa8716186f89bea8",
"body": null,
"is_bot": false,
"headline": "chore: bump version to 0.16.0",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-13T20:02:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8e61b13fbad69e0c2dd3a5b25e8bfa2a7667af30",
"body": "* Add raw template-file fetch and surface demo authoring notes\n\nAuthors building a template demo from the CLI can now pull a demo asset\n(or any attached file) as raw bytes and see, at save and publish time,\nwhich demo references will not render.\n\n- `goodeye templates get-file <identifier> <remote-pa\n[…]\nr so it cannot\ndrift between the workflows save flow and templates publish.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add templates get-file raw fetch and surface authoring notes (#28)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-13T16:18:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6a7c3e557b2d1245f1cb06d554205cb0d838281b",
"body": null,
"is_bot": false,
"headline": "chore: bump version to 0.15.0",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-13T01:23:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a51126d2c951c5cfa863f4f0586189e869069e4e",
"body": "* Add workflows audit command\n\nAdd `goodeye workflows audit [<id-or-name>]` and the client.audit_workflow\nmethod. With an id it audits a registry workflow; without one it fetches the\naudit pack for a local skill that is not on Goodeye yet. The command streams\nthe pack to stdout, matching the optimiz\n[…]\next still listed only the older provenance markers,\nleaving a value this release adds undocumented in the very command\nthat uses it.\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add workflows audit command (#27)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-13T01:13:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "66fb0461de7c99445df15d36f533a95bc27f6aa1",
"body": "Fetches the description-optimize pack for a workflow and streams it to\nstdout, mirroring workflows optimize. The pack tunes the workflow's\ndescription (the text that decides when it fires) for trigger accuracy;\nthe agent saves the result with --source description_optimization after\nuser approval.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add workflows optimize-description command (#26)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-13T00:32:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "fcc908b70ee756368e931ec57ef3a8955b0b0359",
"body": "The delete and archive design intentionally has no confirmation ceremony:\npermanence is communicated through command documentation, and the calling\nagent is the human-in-the-loop. The earlier change that made permanent\ndelete and delete-version refuse to run without an explicit --yes when\nstdin is n\n[…]\nive prompt only at a real\nterminal. The --yes flag still skips the prompt; recoverable actions\n(archive, unarchive, leave) were never affected.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Revert non-interactive --yes requirement on permanent delete",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-12T05:38:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "18115f81df8ca5705b3c6968fe4c51072eefc627",
"body": "…README\n\nRelease-gate fixes for the archive/permanent-delete surface:\n\n- README: replace removed soft-delete/undelete surfaces with the shipped\n archive/unarchive/delete/delete-version commands, document\n --include-archived on list and --include-history on workflows grant, and\n drop the stale --i\n[…]\n\n leave) are unchanged.\n\n- templates list --include-archived help now notes a template appears only\n while at least one version is published.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Harden permanent delete and fix deleted-parent fork lineage; refresh …",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-12T05:16:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6b98df4666d45770b8bb2c802b33d7ca365051c5",
"body": "Mirrors the server verb model: archive, unarchive, delete, and delete-version for workflows and templates, plus delete for verifiers and image generators. Removes the old soft-delete delete and undelete commands as a clean break. Destructive commands carry permanence warnings in their help text and a confirmation prompt with a --yes escape hatch. Minor version bump for the breaking command surface change.",
"is_bot": false,
"headline": "Replace soft-delete with archive and permanent delete commands",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-12T01:22:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6bb053b23d1b2f5c41a82e3a36ba0ca528cae6c2",
"body": "… (#24)\n\n* feat: add --include-history to workflows grant and show history scope in grants listing\n\nworkflows grant gains --include-history to share the full version history\nwith the grantee (default: only the version current at share time and later).\nThe flag maps to the include_history field in th\n[…]\nelds, so this branch is only reachable defensively (e.g. an older server\nthat omits both). Relabel it 'unknown' so the fallback reads as an intentional\nunknown-scope state rather than a rendering bug.",
"is_bot": false,
"headline": "Add --include-history to workflows grant and show grant history scope…",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-11T16:34:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "95a22506812ae1ff7d2ef0f015bbde740b156c07",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.13.2",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-10T22:22:25Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c7727601143fd64461d24ee3f50771869118cb1c",
"body": "…t add/remove (#23)\n\n* feat: manage selected sync target allowlist with --only on target add/remove\n\nAdd append_to_allowlist and prune_from_allowlist to sync.py so individual\nworkflow slugs or globs can be added to or removed from an existing selected\ntarget's allowlist without recreating the whole \n[…]\n path (preset resolves\n to same path before matching existing target).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(sync): manage a selected target's allowlist with --only on targe…",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-10T22:21:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4d64a829ecbf54526707e0c42f0885fc4e157a46",
"body": "Clarify sync push docstring: SKILL.md drift is the trigger, but each\npush sends the full directory tree, not just SKILL.md.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.13.1",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-07T22:10:35Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "fee06b52db7f623a14bd0a4a798942150e5f7428",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.13.0",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-06T03:00:50Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ca40923fd1528ea7b9c21f1691de6ee8ee95f0f8",
"body": "* feat: image generator command group\n\nAdd ``goodeye image-generators {deploy,list,show,generate,revoke}`` to\nmirror the verifier command group. Includes wire models, client methods,\nand 30 tests covering success paths, error paths, anonymous auth, path-id\nresolution, and mutual exclusion guards.\n\nC\n[…]\nopens the URL), so the CLI help should not claim HTTPS only.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: image generator command group (#22)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-06T02:06:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d241a976deb7d07d389ec8c4e3f2e6875d26ee5a",
"body": "* feat(sync): add wire models and client methods for multi-file skill directories\n\n- Add `WorkflowFileEntry` manifest-row model and `FileEntryWire` upload model to wire.py\n- Add `files: list[FileEntryWire] | None = None` to `SaveWorkflowInput` (None omits key; [] clears tree)\n- Add `files: list[Work\n[…]\nilently resetting designer-set\nlabels to null on the server.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Sync multi-file skill directories (pull, push, publish) (#21)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-05T22:57:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3a4ad4dd86d93480468fb42d447ca17a605f0221",
"body": "* feat(workflows): add sync target configuration\n\nIntroduce the local sync configuration layer that records where a caller\nwants their registry workflows mirrored on disk. This is the configuration\nand target-directory foundation; pulling and pushing workflow bodies comes\nin later layers.\n\n- Extend \n[…]\nn identical table and hints block from one place.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(workflows): two-way local sync for workflows (workflows sync) (#20)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-06-04T03:30:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f95ac07116506081d7b578acb2ba6b9e59317289",
"body": null,
"is_bot": false,
"headline": "chore: bump version to 0.11.2",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-22T03:50:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "80bc31bcca217939c6189f8de1aa7116913e55eb",
"body": "* feat(workflows): add undelete command and list --include-deleted\n\nAdd `goodeye workflows undelete <id_or_slug>`, the inverse of\n`workflows delete`, calling POST /v1/workflows/{id_or_slug}/undelete.\nIt mirrors the existing `templates undelete` command: same argument\nhandling, idempotent-suffix outp\n[…]\nkflows list` command now passes\n`--include-deleted` through when it is set.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(workflows): add undelete command and list --include-deleted (#19)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-22T03:49:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "83652b917a4129daeeb9b39c67a3ddf1a86b8e30",
"body": "Older CLI installs wrote https://api.goodeyelabs.com into credentials.json\nat login time. The canonical host is now https://api.goodeye.dev; the\nlegacy host still resolves during the REST migration grace period but is\ndeprecated.\n\nRewrite the pin in place, idempotently, whenever load_credentials see\n[…]\nline stderr notice announces the\nrewrite. The on-disk file keeps its 0600 mode. The api_key field is\nuntouched and never appears in the notice.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(config): migrate stale api.goodeyelabs.com server pin",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-19T22:28:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "71983fea2439b93393403b1f7f2e8e2713f82a53",
"body": null,
"is_bot": false,
"headline": "chore: bump version to 0.11.0",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-19T17:25:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "29c0d4925715502fa1830dc3f7b791417223f6d7",
"body": "Point the CLI's DEFAULT_SERVER at the new api.goodeye.dev host for the\ngoodeye.dev migration. The GOODEYE_SERVER env var and credentials.json\n`server` override are unchanged; existing installs keep working while the\nlegacy api.goodeyelabs.com host serves during the grace period.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: default to https://api.goodeye.dev",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-19T17:24:39Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9ad89bfdc8d939a6f6679148cd4dfd532d7bf352",
"body": "The README example referenced openai/gpt-4o, which is not in the\nsupported model_settings list. Replace with openai/gpt-5.4.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: use a supported model in verifier deploy example",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-13T21:32:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "6b3e8580eeb19e9483420d13fb94a9c50f358a0a",
"body": null,
"is_bot": false,
"headline": "chore: bump version to 0.10.0",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-12T22:46:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d286a06c12de38025703053ded7156a82a1b03db",
"body": "* feat(workflows): add `workflows optimize <id>` subcommand\n\nMirrors `workflows teach` for the new server-side optimize_workflow\npack-returner. Streams SKILL.md to stdout and appends each reference\nfile as a labeled sub-section so a piped agent sees the full pack in\norder, matching the rendering use\n[…]\nfirst two; expand it so callers see the full set.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(workflows): add 'workflows optimize <id>' subcommand (#18)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-12T22:35:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2a6dfdbbbea8f6ccfba40c510d4b9ba7ead176b4",
"body": "* feat: add `workflows check-safety` and `templates check-safety` subcommands\n\nWires both new REST endpoints into the CLI:\n\n- `goodeye workflows check-safety <id>[@N]` (auth required) hits\n `POST /v1/workflows/{id}/safety-check`.\n- `goodeye templates check-safety <id>[@N]` (auth optional, supports\n\n[…]\nould raise an unhandled ValidationError on a\nstatus=error response. Loosen the wire types and guard the rendering path.\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add workflows/templates check-safety subcommands (#17)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-12T21:19:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "eb3a8b8529b8e18066a0a6d05e4db329ff154c6a",
"body": "Muscle memory from pipx/uv/brew/apt biases users toward \"upgrade\".\nRegister it as a hidden Typer command pointing at the same callback so\n\"goodeye upgrade\" and \"goodeye upgrade --check\" work without polluting\n--help or pre-committing the verb (plan-tier upgrades may want it later).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(update): accept \"upgrade\" as a hidden alias for \"update\"",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-12T20:55:20Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "fd55f71d9bf5113fbe55a8b2f30617a9278486a8",
"body": "Aligns with the server's new GET /v1/me/usage shape: drops period/granted/\nused/remaining and renders a single \"Available\" balance line with a refill\nnote. When the user holds purchased credits, the breakdown shows the\nmonthly and one-off components.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(usage): render spendable balance, including one-off credits",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-12T20:41:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "db6e82399db088ac6fcbda09018901af8a615a0c",
"body": "Goodeye now restricts model_settings.model to a curated allowlist on the\nserver side. Surfacing the values in the deploy command's help means\nusers see the canonical list locally instead of discovering it from a\nserver validation error on first deploy.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(verifiers): list supported model values in deploy help text (#16)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-12T20:22:17Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "394ed5d7a62d94e69ef5b716f0757020fd79e55d",
"body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.9.2",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-12T03:51:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "909328d16301396c3b8cea49932e9af021938907",
"body": "The `goodeye update` command mixed \"upgrade\" and \"update\" in its output\nand docs. Standardize on \"update\" throughout. The underlying tool\ncommands (uv tool upgrade, pipx upgrade, pip install --upgrade) are\nunchanged since those are the tools' own CLI syntax.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(update): align all user-facing text to \"update\" terminology",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-11T17:55:40Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "77accee15dadf28912a0215e8d42ddfa7b34906d",
"body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.9.1",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-09T21:02:05Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7798f99585bf05c0a9cc24ba00c0ff35605fa147",
"body": "Mirror the server-side schema: drop \"minimal\" (rejected by judge\nmodels at run time) and add \"xhigh\" (now supported).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(verifiers): update reasoning_effort allowed values in deploy help",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-09T18:22:34Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "432cd6f94100aff1a2cc0310d7857137f2c2cba4",
"body": "…lows/{id}/lineage\n\nThe lineage endpoint returns parent_template_deleted_at,\nparent_template_delete_reason, parent_version_deprecated_at, and\nparent_version_deprecation_message. Add them to WorkflowLineage so\n--json output is complete, and render them in the human view when\npresent so users see why a fork's parent is no longer current.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(lineage): surface deletion and deprecation fields from /v1/workf…",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-09T17:17:24Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c644229fa9705c4257a637c1a64b618fac66c5c3",
"body": "…verifiers tables\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "style: use ASCII hyphen for empty-cell placeholders in templates and …",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-09T17:01:22Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1c9f3a857859fbbd29b9e69b3e4896d8e12b413e",
"body": "The slug is no longer returned by the API. Drop the mapping entry; the\nRateLimited fallthrough already covers any retired-but-still-emitted\nrate-limit slug.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: remove unused error slug from response mapper",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-09T16:38:35Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3531e2a3401523be59fc26a582d14f5f78416961",
"body": "* feat(teach): drop trigger_context_echo from response model\n\nThe server-side teach_workflow endpoint no longer returns\ntrigger_context_echo in its response. Remove the field from\nWorkflowTeachResult, stop printing it in the teach command output,\nupdate the --trigger-context help text to drop the \"e\n[…]\nhe now-unused _parse_optional_json_object helper.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Drop trigger_context_echo from teach response model (#15)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-09T06:52:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9182f19469792bb8d546179abbd6ee4c2afff992",
"body": "* feat(cli): invitations list / accept / decline / cancel commands\n\nAdd the invitations subcommand group backed by GET /v1/invitations and\nPOST /v1/invitations/{id}/accept|decline|cancel. Wire models for\nInvitationSummary, InvitationList, InvitationAcceptResult,\nInvitationDeclineResult, InvitationCa\n[…]\n' in the\ntable view so the listing still works in that case.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: invitations subcommand and updated team / ownership flows (#14)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-09T06:23:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0f0e32c8fc1646bdcd48ffe8c283841167f6e19a",
"body": "The server stopped returning this field once anonymous spend moved to\nthe credit ledger. The CLI render branch and wire field were always\ndormant in v0.8.0 (server already sent None). Drop the field from the\nwire model, the dead render branch, and the tests, and reword the\n--anonymous help to point at the per-IP credit budget instead of a\nnonexistent rate limit.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: drop vestigial remaining_anonymous_runs from verifier run wire",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-09T04:02:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "12471bc01ed840c9d3ca83b9381a9dd95b3d002f",
"body": "* feat(cli): goodeye usage command and 402/403 error rendering\n\nAdds a top-level 'goodeye usage' command that calls GET /v1/me/usage and\nprints a human-readable summary (tier, billing period, used, remaining,\noptional unpaid balance) with --json for machine output.\n\nWires the account_suspended (HTTP\n[…]\nip through .isoformat() in the\nhuman-render path.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add goodeye usage command and 402/403 error rendering (#13)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-09T03:16:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f9954de455c0e3c7e5a27d2f5fb9059cb3d35f94",
"body": "…rors (#12)\n\n* feat(templates): surface safety verification on publish, list, and errors\n\nThe publish REST endpoint returns a safety_verification block. Extend\nthe CLI to fully consume it:\n\n - TemplatePublishResult gains an optional TemplateSafetyVerification\n field; TemplateSummary gains safety\n[…]\n fix(templates): chain typer.Exit to source exception (B904)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(templates): surface safety verification on publish, list, and er…",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-09T00:05:30Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "02294d595f5cf01ebaaccfebf6ee9ef79f6e3f87",
"body": "Adds a Claude skill documenting the two-phase version bump workflow:\nbump commit (pyproject.toml + uv lock) followed by optional git tag\npush to trigger PyPI publish via OIDC trusted publishing.\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: add bump-version skill (#11)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-08T21:46:19Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "af1ef9ac17f4c9a3988418613d67054a0c735b98",
"body": "Anonymous run results already include `remaining_anonymous_runs`, but\nthe human-readable output only printed PASS/FAIL plus reasoning. Users\nhad no way to know they were about to hit the per-IP daily cap until\nthe next call 429'd. Now the CLI prints the remaining count on a dim\nline for healthy quota and a yellow line when one or zero runs remain,\nmatching the existing pattern of pointing users at signup for higher\nlimits.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(verifiers): surface remaining anonymous quota after a run",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-07T20:51:21Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c36336e3fc964af6709c50f5a50cfef3f89360fa",
"body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.8.0",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-07T20:42:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c6cb90b58233f66311ab8b25ec813443baa6186c",
"body": "Server consolidated public verifier preview behind POST /v1/verifiers/{id}/runs\nwith optional auth. The CLI now exposes that path through goodeye verifiers run\n--anonymous (UUID or system:<name> only) and drops the goodeye templates\nrun-verifier command and its dedicated client method.\n\nAuthenticate\n[…]\nd resolve them to a UUID via\nget_verifier before the run call, keeping the server-side run boundary\nUUID-or-system: only. Anonymous runs skip the resolver and require a UUID or\nsystem:<name> up front.",
"is_bot": false,
"headline": "Drop run_template_verifier; add --anonymous to verifiers run (#10)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-07T20:36:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ba42c629cf7375f3a624ded80b2bdf7d2f29fd11",
"body": "* feat: PyPI update checks, notices, and goodeye update\n\nAdd cached PyPI version checks, stderr-only background notices (with CI and\n--json suppression), and goodeye update / --check with uv tool, pipx, and pip\ndetection. Document behavior in README.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n[…]\n.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: PyPI update checks, notices, and goodeye update (#9)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-07T17:56:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "34ff1a83b128977b727a59fbf2f9578f37623756",
"body": "* feat: add agent-friendly list output\n\nMake discovery commands emit compact structured output for automation while preserving table output for interactive use.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\n\n* fix: type VerifierSummary.updated_at as datetime for parity\n\nAligns the verifier list w\n[…]\n.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add agent-friendly list output (#8)",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-07T17:32:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ff00a717a2c50d236b64ed53eff273df9132cddd",
"body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
"is_bot": false,
"headline": "chore: ignore local design specs",
"author_name": "Randy Olson",
"author_login": "rhiever",
"committed_at": "2026-05-07T06:10:27Z",
"body_truncated": false,
"is_coding_agent": true
}
],
"releases_count": 1,
"commits_last_year": 161,
"latest_release_at": "2026-04-29T01:03:33Z",
"latest_release_tag": "v0.3.3",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 12,
"days_since_latest_release": 84,
"mean_days_between_releases": null
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 62,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "goodeye",
"exists": true,
"license": null,
"keywords": [
"agents",
"ai",
"cli",
"goodeye",
"llm",
"mcp",
"skills",
"verifiers",
"Development Status :: 3 - Alpha",
"Environment :: Console",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.12",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
"Topic :: Software Development",
"Topic :: Utilities"
],
"ecosystem": "pypi",
"matches_repo": true,
"registry_url": "https://pypi.org/project/goodeye/",
"is_deprecated": false,
"latest_version": "0.25.2",
"repository_url": "https://github.com/Goodeye-Labs/goodeye-cli",
"versions_count": 35,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 2086,
"first_published_at": "2026-05-09T17:23:42.272271Z",
"latest_published_at": "2026-07-22T20:53:38.698238Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 1,
"stars": 4,
"watchers": 0,
"fork_history": {
"days": [
{
"date": "2026-05-29",
"count": 1
}
],
"complete": true,
"collected": 1,
"total_forks": 1
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 146648,
"source_files_sampled": 80,
"oversized_source_files": 4,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"pyproject.toml"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"pypi"
],
"dependencies": [
{
"name": "typer",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.12"
},
{
"name": "httpx",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.27"
},
{
"name": "packaging",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=24"
},
{
"name": "pathspec",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.12"
},
{
"name": "rich",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=13"
},
{
"name": "pydantic",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2.7"
},
{
"name": "pydantic-settings",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2.4"
},
{
"name": "pyyaml",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=6"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 62,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "rhiever",
"commits": 162,
"avatar_url": "https://avatars.githubusercontent.com/u/1719223?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"publish.yml"
],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": true
},
"security_signals": {
"lockfiles": [
"uv.lock"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 10,
"reason": "17 out of 17 merged PRs checked by a CI test -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 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": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 7,
"reason": "3 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "ffb878704355909313784f964db436e793adbe86",
"ran_at": "2026-07-22T20:56:15Z",
"aggregate_score": 4.2,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-22T20:53:42Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-22T20:38:29Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/Goodeye-Labs/goodeye-cli",
"host": "github.com",
"name": "goodeye-cli",
"owner": "Goodeye-Labs"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"security": 42,
"vitality": 77,
"community": 41,
"governance": 53,
"engineering": 80
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 77,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 72,
"inputs": {
"commits_last_year": 161,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 12
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "12/52 weeks with commits",
"points": 8.3,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 12
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "161 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 161
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "good",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 84,
"inputs": {
"releases_count": 1,
"latest_release_tag": "v0.3.3",
"releases_from_tags": false,
"days_since_latest_release": 84,
"mean_days_between_releases": null
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "1 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 1
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 84 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 84
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "cadence unknown (single release)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "release_cadence_unknown",
"params": {}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 41,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 8,
"inputs": {
"forks": 1,
"stars": 4,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "4 stars",
"points": 7.7,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 4
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "1 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 1
}
}
],
"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": "good",
"name": "Community health",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 55,
"inputs": {
"packages": [
"goodeye"
],
"dependents": null,
"ecosystems": "pypi",
"total_downloads": null,
"monthly_downloads": 2086
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "2,086 downloads/month across pypi",
"points": 44.3,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 2086,
"ecosystems": "pypi"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 53,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 13,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 72,
"inputs": {
"merged_prs": 62,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "62/62 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 62,
"decided": 62
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 43,
"inputs": {
"followers": 4,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "Goodeye-Labs",
"public_repos": 7,
"account_age_days": 336
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "4 followers of Goodeye-Labs",
"points": 5,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 4,
"login": "Goodeye-Labs"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "7 public repos, account ~0 yr old",
"points": 8.4,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 7
}
},
{
"code": "account_age_years",
"params": {
"years": 0
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"goodeye"
],
"ecosystems": "pypi",
"any_deprecated": false,
"min_days_since_publish": 0
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on pypi",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "pypi"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 0 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 0
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "35 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 35
}
}
],
"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": 80,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "excellent",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 94,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": true
},
"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": null,
"points": 16,
"status": "met",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 9.6,
"status": "met",
"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": "17 out of 17 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"topics": [
"ai-workflows",
"cli",
"mcp",
"python",
"goodeye",
"agentic-ai",
"ai-agents",
"ai-tools",
"anthropic",
"claude",
"developer-tools",
"generative-ai",
"llm",
"workflow-automation"
],
"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": "at_risk",
"name": "Security",
"value": 42,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 42,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 4.2
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "17 out of 17 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 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 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "3 existing vulnerabilities detected",
"points": 5.2,
"status": "partial",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 1
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "at_risk",
"name": "AI Readiness",
"value": 48,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 100,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 53,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"uv.lock"
],
"has_dockerfile": false,
"typed_language": false,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0.85,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 11,
"status": "met",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"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": "85 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 85,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "moderate",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 52,
"inputs": {
"primary_language": "Python",
"largest_source_bytes": 146648,
"source_files_sampled": 80,
"oversized_source_files": 4
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Python without a type-check config",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_typecheck_config_language",
"params": {
"language": "Python"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "4/80 source files over 60KB",
"points": 52.2,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 80,
"oversized": 4
}
}
],
"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": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"deps.dev does not index pypi:goodeye@0.25.2; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-07-22T20:56:29.617636Z",
"schema_version": "0.26.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/g/Goodeye-Labs/goodeye-cli.svg",
"full_name": "Goodeye-Labs/goodeye-cli",
"license_state": "standard",
"license_spdx": "MIT"
}