JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [
"cli",
"developer-tools",
"devops",
"dql",
"dynatrace",
"monitoring",
"observability"
],
"is_fork": false,
"size_kb": 9741,
"has_wiki": false,
"homepage": "https://dynatrace-oss.github.io/dtctl/",
"languages": {
"Go": 4802905,
"Nix": 3787,
"Shell": 5014,
"Makefile": 7201,
"PowerShell": 10519
},
"pushed_at": "2026-07-21T14:53:14Z",
"created_at": "2026-01-09T14:29:29Z",
"owner_type": "Organization",
"updated_at": "2026-07-21T14:52:53Z",
"description": "CLI for managing Dynatrace platform resources - built for humans and AI agents alike",
"is_archived": false,
"is_disabled": false,
"license_spdx": "Apache-2.0",
"default_branch": "main",
"license_spdx_raw": "Apache-2.0",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": "https://engineering.dynatrace.com",
"name": "Dynatrace Open Source",
"type": "Organization",
"login": "dynatrace-oss",
"company": "Dynatrace LLC",
"location": null,
"followers": 267,
"avatar_url": "https://avatars.githubusercontent.com/u/58178984?v=4",
"created_at": "2019-11-25T14:31:58Z",
"is_verified": null,
"public_repos": 94,
"account_age_days": 2430
},
"license": {
"state": "standard",
"spdx_id": "Apache-2.0",
"raw_spdx": "Apache-2.0",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.35.0",
"kind": "minor",
"published_at": "2026-07-21T14:53:14Z"
},
{
"tag": "v0.34.0",
"kind": "minor",
"published_at": "2026-07-13T13:29:34Z"
},
{
"tag": "v0.33.0",
"kind": "minor",
"published_at": "2026-07-03T13:22:40Z"
},
{
"tag": "v0.32.0",
"kind": "minor",
"published_at": "2026-07-02T09:17:43Z"
},
{
"tag": "v0.32.0-rc.4",
"kind": "prerelease",
"published_at": "2026-06-30T07:00:29Z"
},
{
"tag": "v0.32.0-rc.3",
"kind": "prerelease",
"published_at": "2026-06-26T09:04:03Z"
},
{
"tag": "v0.32.0-rc.2",
"kind": "prerelease",
"published_at": "2026-06-24T10:40:51Z"
},
{
"tag": "v0.31.0",
"kind": "minor",
"published_at": "2026-06-23T21:11:56Z"
},
{
"tag": "v0.30.3",
"kind": "patch",
"published_at": "2026-06-18T09:48:17Z"
},
{
"tag": "v0.30.2",
"kind": "patch",
"published_at": "2026-06-16T06:02:11Z"
},
{
"tag": "v0.30.1",
"kind": "patch",
"published_at": "2026-06-15T10:52:02Z"
},
{
"tag": "v0.30.0",
"kind": "minor",
"published_at": "2026-06-12T14:04:44Z"
},
{
"tag": "v0.29.0",
"kind": "minor",
"published_at": "2026-06-11T15:48:29Z"
},
{
"tag": "v0.28.1",
"kind": "patch",
"published_at": "2026-05-29T21:53:53Z"
},
{
"tag": "v0.28.0",
"kind": "minor",
"published_at": "2026-05-26T09:53:16Z"
},
{
"tag": "v0.27.1",
"kind": "patch",
"published_at": "2026-05-11T19:06:53Z"
},
{
"tag": "v0.27.0",
"kind": "minor",
"published_at": "2026-05-05T10:24:27Z"
},
{
"tag": "v0.26.2",
"kind": "patch",
"published_at": "2026-04-29T05:48:15Z"
},
{
"tag": "v0.26.1",
"kind": "patch",
"published_at": "2026-04-28T16:59:41Z"
},
{
"tag": "v0.26.0",
"kind": "minor",
"published_at": "2026-04-28T11:09:32Z"
},
{
"tag": "v0.25.2",
"kind": "patch",
"published_at": "2026-04-22T20:28:35Z"
},
{
"tag": "v0.25.1",
"kind": "patch",
"published_at": "2026-04-21T15:02:17Z"
},
{
"tag": "v0.25.0",
"kind": "minor",
"published_at": "2026-04-20T20:32:00Z"
},
{
"tag": "v0.24.0",
"kind": "minor",
"published_at": "2026-04-14T20:46:21Z"
},
{
"tag": "v0.23.0",
"kind": "minor",
"published_at": "2026-04-10T19:23:20Z"
},
{
"tag": "v0.22.0",
"kind": "minor",
"published_at": "2026-04-01T15:37:22Z"
},
{
"tag": "v0.21.0",
"kind": "minor",
"published_at": "2026-03-30T18:04:17Z"
},
{
"tag": "v0.20.2",
"kind": "patch",
"published_at": "2026-03-30T11:03:30Z"
},
{
"tag": "v0.20.1",
"kind": "patch",
"published_at": "2026-03-25T21:28:30Z"
},
{
"tag": "v0.20.0",
"kind": "minor",
"published_at": "2026-03-25T16:07:13Z"
},
{
"tag": "v0.19.1",
"kind": "patch",
"published_at": "2026-03-20T19:19:30Z"
},
{
"tag": "v0.19.0",
"kind": "minor",
"published_at": "2026-03-20T10:33:10Z"
},
{
"tag": "v0.18.0",
"kind": "minor",
"published_at": "2026-03-18T11:33:23Z"
},
{
"tag": "v0.17.0",
"kind": "minor",
"published_at": "2026-03-16T14:35:27Z"
},
{
"tag": "v0.16.0",
"kind": "minor",
"published_at": "2026-03-12T22:13:06Z"
},
{
"tag": "v0.15.0",
"kind": "minor",
"published_at": "2026-03-11T11:04:50Z"
},
{
"tag": "v0.14.4",
"kind": "patch",
"published_at": "2026-03-10T15:11:20Z"
},
{
"tag": "v0.14.3",
"kind": "patch",
"published_at": "2026-03-10T14:57:16Z"
},
{
"tag": "v0.14.2",
"kind": "patch",
"published_at": "2026-03-10T13:10:38Z"
},
{
"tag": "v0.14.1",
"kind": "patch",
"published_at": "2026-03-09T10:05:13Z"
},
{
"tag": "v0.14.0",
"kind": "minor",
"published_at": "2026-03-06T23:51:11Z"
},
{
"tag": "v0.13.3",
"kind": "patch",
"published_at": "2026-03-05T12:18:19Z"
},
{
"tag": "v0.13.2",
"kind": "patch",
"published_at": "2026-03-04T08:29:56Z"
},
{
"tag": "v0.13.1",
"kind": "patch",
"published_at": "2026-03-02T20:09:45Z"
},
{
"tag": "v0.13.0",
"kind": "minor",
"published_at": "2026-03-02T13:39:03Z"
},
{
"tag": "v0.12.0",
"kind": "minor",
"published_at": "2026-02-26T15:14:46Z"
},
{
"tag": "v0.11.0",
"kind": "minor",
"published_at": "2026-02-18T16:39:42Z"
},
{
"tag": "v0.10.0",
"kind": "minor",
"published_at": "2026-02-06T13:37:15Z"
},
{
"tag": "v0.9.0",
"kind": "minor",
"published_at": "2026-02-02T23:30:37Z"
},
{
"tag": "v0.8.0",
"kind": "minor",
"published_at": "2026-02-02T17:07:29Z"
},
{
"tag": "v0.7.4",
"kind": "patch",
"published_at": "2026-01-22T14:46:21Z"
},
{
"tag": "v0.7.3",
"kind": "patch",
"published_at": "2026-01-19T16:59:32Z"
},
{
"tag": "v0.7.2",
"kind": "patch",
"published_at": "2026-01-19T09:19:36Z"
},
{
"tag": "v0.7.1",
"kind": "patch",
"published_at": "2026-01-18T21:47:40Z"
},
{
"tag": "v0.7.0",
"kind": "minor",
"published_at": "2026-01-16T16:36:52Z"
},
{
"tag": "v0.6.0",
"kind": "minor",
"published_at": "2026-01-15T20:47:06Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2026-01-14T23:01:03Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2026-01-13T21:40:15Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2026-01-13T07:47:36Z"
}
],
"recent_commits": [
{
"oid": "39d109fcfef90adfef19c0c5ec7c0bd41f0acfb0",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release 0.35.0 (#370)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-21T14:52:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "37e7c6e58ffc70caf6f7583703f6e21cbb4cd0a8",
"body": "…ity discovery (#368)\n\n* feat(inventory): environment data inventory with customizable capability discovery\n\n`dtctl commands` answers \"what can I run?\"; the new `dtctl inventory`\nanswers \"what is there to query?\": which Grail data objects are\nfetchable (and which are query-command-only, like metrics\n[…]\n (deterministic:\nalphabetically first offender).\n\nParseDefinitions keeps its own loop deliberately: a parsed document may\ncarry null (the MergeDefinitions removal marker), which a merged set\nmust not.",
"is_bot": false,
"headline": "feat(inventory): environment data inventory with customizable capabil…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-21T14:49:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "baf1cb96613e7cebcab07b7ee08a94133d44419c",
"body": "In agent mode, --metadata/-M was accepted but the requested Grail\nmetadata (executionTimeMilliseconds, scannedRecords/Bytes, sampled,\nqueryId, ...) never reached the envelope: inline results nested it under\nresult.metadata and spilled results dropped it entirely, so an agent\nreading the top-level en\n[…]\ninline and spilled results, mirroring the non-agent -o json --metadata\nshape and honoring field selection. The key is omitted when metadata was\nnot requested or the response carried none.\n\nCloses #362",
"is_bot": false,
"headline": "fix(query): surface Grail metadata in the agent envelope (#366)",
"author_name": "Novikov Kirill",
"author_login": "knQzx",
"committed_at": "2026-07-21T14:47:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ce8dbda6dec2bb76e30c066c4b62cd408cd15542",
"body": "A context created from a bare host without a scheme (e.g.\nabc12345.apps.dynatrace.com) authenticated successfully but every\nsubsequent query failed with \"unsupported protocol scheme\". Normalize\nthe environment URL when persisting a context so a missing scheme\ndefaults to https://, while leaving explicit http:// and https:// URLs\nuntouched.\n\nCloses #292",
"is_bot": false,
"headline": "fix(config): normalize environment URL scheme on context creation (#365)",
"author_name": "Novikov Kirill",
"author_login": "knQzx",
"committed_at": "2026-07-21T14:46:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d35b233f46fcef09d0db309d13b3a7baecb4eb30",
"body": "…idance (#367)\n\n* fix(sdk/query): poll through NOT_STARTED instead of returning it as success\n\nA queued query on a congested tenant answers execute (and early polls)\nwith state NOT_STARTED. Treating any non-RUNNING state as terminal handed\nthe caller the raw {\"state\":\"NOT_STARTED\",\"requestToken\":...\n[…]\n an explicit alias\n- get extension-configs without args: name the missing argument instead\n of \"accepts 1 arg(s), received 0\"\n\n* style(cmd): rewrite dqlErrorAdvice branch chain as a switch (gocritic)",
"is_bot": false,
"headline": "feat(query): agent-mode fix, NOT_STARTED polling, and DQL recovery gu…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-18T20:01:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e2f1170ea705378d494ed85d659ddc72c3cd98eb",
"body": "Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.46.0 to 0.47.0.\n- [Commits](https://github.com/golang/sys/compare/v0.46.0...v0.47.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/sys\n dependency-version: 0.47.0\n dependency-type: direct:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "chore(deps): bump golang.org/x/sys from 0.46.0 to 0.47.0 in /sdk (#364)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-18T19:22:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3986117592960804d43e5d9c39b14b0740c34f98",
"body": "…363)\n\n* fix(auth): cache OAuth access token to cut ~0.5s off every command\n\ndtctl re-ran the SSO refresh-token exchange on every invocation, adding\n~0.5-1s of latency per command. Two issues combined to defeat the existing\ncross-process access-token cache:\n\n1. On macOS the full token JSON exceeds t\n[…]\ncleanup raced the fake store map under `go test -race`. Guard deleteToken\nwith the same lock. Production keyring/file stores are already concurrency-\nsafe; this only affects the in-memory test double.",
"is_bot": false,
"headline": "fix(auth): cache OAuth access token to cut ~0.5s off every command (#…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-16T15:14:31Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4ed73c4b84cebb010abeefc57a1bf8b04f08c020",
"body": "…#360)\n\n* fix(livedebugger): extract message strings from GraphQL error responses\n\nInstead of formatting the raw errors value with %%v (which produces unreadable\nmap[...] output), extract the message field from each GraphQL error object and\njoin them into a human-readable string.\n\n* docs(breakpoints): add condition expression reference to update breakpoint help",
"is_bot": false,
"headline": "Parse and show correct GraphQL Facade error for breakpoint commands (…",
"author_name": "Michael Bishop",
"author_login": "michaelB1sh",
"committed_at": "2026-07-16T12:07:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0eb42ae15bc40eb4866b3129583e3a614e1f3c1b",
"body": "…atch (#359)\n\n* feat: promote the session layer into the sdk and add exec plugin dispatch\n\nEverything a Dynatrace CLI tool needs to go from \"the user's machine\" to\n\"an authenticated client for the right tenant\" now lives in sdk/session:\nthe config model with load/save and schema-version enforcement,\n[…]\npredated sdk/session, was never wired up, and shipping it importable\nin the public SDK is a misuse trap (tokens written through it are not\nfound by dtctl). Removed before the first tagged sdk release.",
"is_bot": false,
"headline": "feat: promote the session layer into the sdk and add exec plugin disp…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-15T11:05:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "74db063d50a8ed152224103c7c0ade9e9ba7943c",
"body": "…nable queries (#358)\n\n* feat(query): explain the double-quote rule on single-quote DQL errors\n\nDQL string literals require double quotes; single quotes fail with\nPARSE_ERROR_SINGLE_QUOTES, which is almost always a shell-quoting\ncollision (wrapping the query in double quotes leaves no room for\ndoubl\n[…]\n a troubleshooting entry\ncovering PARSE_ERROR_SINGLE_QUOTES and the silent zero-rows trap from an\nunquoted bareword, with per-shell command wrappers so agents stop\ngenerating single-quoted DQL values.",
"is_bot": false,
"headline": "feat(query): guide users to double quotes and fail wait fast on unrun…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-14T18:52:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6ae420555c1e1c3102d1ac5d6cb32d386706fd84",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release 0.34.0 (#357)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-13T13:23:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "72f78bc16f7a0f07166ec6f77b2592c5eeb43bce",
"body": "The machine-readable command catalog (dtctl commands) defaulted to the full\nJSON listing (~52KB), which is far more than an agent needs to orient. Most\nverb-noun commands are self-explanatory.\n\nIntroduce three progressive detail tiers:\n - default: minimal overview (verbs, resources, subcommands onl\n[…]\n default output format is now\nTOON; pass -o json/-o yaml to override.\n\nAdd Minimal/NewMinimal and a generic WriteValue helper. Docs updated across\nAGENTS.md, README, SKILL.md, the spec, and site docs.",
"is_bot": false,
"headline": "feat(commands): default to a minimal TOON overview, add --full (#356)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-13T13:15:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "81852ce0a44106db1e228ae179da51aa1e6e7d2c",
"body": "* chore(deps): bump golang.org/x/term from 0.44.0 to 0.45.0\n\nBumps [golang.org/x/term](https://github.com/golang/term) from 0.44.0 to 0.45.0.\n- [Commits](https://github.com/golang/term/compare/v0.44.0...v0.45.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/term\n dependency-version: 0.\n[…]\n3+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>\nCo-authored-by: Christoph Neumüller <christoph.neumueller@dynatrace.com>",
"is_bot": true,
"headline": "chore(deps): bump golang.org/x/term from 0.44.0 to 0.45.0 (#355)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-13T13:10:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "55a0a54e8576ec16f5fc2c5149c3b16dbc1979ae",
"body": "…et (#351)\n\n* docs: add command profiles design proposal\n\n* docs: simplify command profiles to a default-deny allowlist\n\nAdopt six simplifications: allowlist-only (drop exclude), decouple safety\nlevels entirely (drop profile-pinned safety-level), drop extends/inheritance,\ndrop global current-profile\n[…]\nFlagValue stops at the \"--\" end-of-flags terminator, and the\nblock message text is shared between ProfileError.Error() and the agent-mode\nErrorDetail via Headline()/Suggestions() so they cannot drift.",
"is_bot": false,
"headline": "feat(profile): add command profiles to restrict the exposed command s…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-13T12:31:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b2008f01fc605a59a43909848410784ecc1d8e76",
"body": "* feat(config): honor DTCTL_CONFIG as a trusted explicit config\n\nAdd a DTCTL_CONFIG environment variable that names a config file and is\ntreated exactly like --config: dtctl loads that file, honors its aliases\nand apply hooks, and skips auto-discovery entirely.\n\nThis restores hooks/aliases for prepa\n[…]\nboth saveConfig and the viper config-\nfile diagnostic so writes and the '-v' 'Using config file' message target\nthe DTCTL_CONFIG file. Add TestEnvConfigSaveRoundTrips covering the\nround-trip property.",
"is_bot": false,
"headline": "feat(config): honor DTCTL_CONFIG as a trusted explicit config (#352)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-13T12:30:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f29e73b09971d331c914b8969cb42ed4e914aec2",
"body": "Bumps [golang.org/x/text](https://github.com/golang/text) from 0.38.0 to 0.40.0.\n- [Release notes](https://github.com/golang/text/releases)\n- [Commits](https://github.com/golang/text/compare/v0.38.0...v0.40.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/text\n dependency-version: 0.40\n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump golang.org/x/text from 0.38.0 to 0.40.0 (#354)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-13T12:30:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6fc1cf296070da365d70d07fe687725392fb0abf",
"body": "Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.46.0 to 0.47.0.\n- [Commits](https://github.com/golang/sys/compare/v0.46.0...v0.47.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/sys\n dependency-version: 0.47.0\n dependency-type: direct:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump golang.org/x/sys from 0.46.0 to 0.47.0 (#353)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-13T12:29:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7c60c66f2be32d4e86cf3c3b7ac5b001eda3e2df",
"body": "…settings commands (#341)\n\n* feat(settings): add --validate-only flag to create, edit, and delete settings commands\n\nExposes the Settings API validateOnly query parameter through the CLI:\n- create settings --validate-only: POSTs with ?validateOnly=true, skips safety check\n- edit setting --validate-o\n[…]\nexample clarifying the editor still opens but changes are not persisted\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(settings): add --validate-only flag to create, edit, and delete …",
"author_name": "katarzyna-szczerba",
"author_login": "katarzyna-szczerba",
"committed_at": "2026-07-10T10:07:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9533536be617e2a5825d3f3e78ce3c33d6c5e8d3",
"body": "* Initial plan\n\n* chore: bump Go toolchain to 1.26.5\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>",
"is_bot": false,
"headline": "chore: bump Go toolchain to 1.26.5 (#350)",
"author_name": "Copilot",
"author_login": "Copilot",
"committed_at": "2026-07-10T09:59:05Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a41e5f068b62db4941c0dcfeb13ef2086646670e",
"body": "App engine returns field lastModifiedAt in modificationInfo. We\ncurrently use incorrect field name `lastModifiedTime`, hence rename it",
"is_bot": false,
"headline": "fix(get): get app should show correct last modification time (#339)",
"author_name": "khainguyendt",
"author_login": "khainguyendt",
"committed_at": "2026-07-08T08:32:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "16e11ab0ffd9f87734223915c0c55e5d2ff60fdb",
"body": "…g configs (#308)\n\n* feat(cloud): add disable command and edit support for cloud monitoring configs\n\nNew commands:\n- `dtctl disable aws|azure|gcp monitoring` — disables a monitoring config and all\n its credentials in a single PUT (inverse of `dtctl enable`)\n- `dtctl edit aws|azure|gcp monitoring` —\n[…]\nle pattern\n- Guard against whitespace-only EDITOR panicking on parts[0]\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(cloud): add disable command and edit support for cloud monitorin…",
"author_name": "Pawel Siwek",
"author_login": "pawelsiwek",
"committed_at": "2026-07-06T14:38:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d99d56d6057f25e3b65f59c1a4b838f1e741247b",
"body": "* feat(query): add live progress bar for long-running queries\n\nSurface the DQL Query API's progress percentage and preview results\nduring polling via a new --progress flag (auto|always|never).\n\n- sdk/api/query: add ExecuteAndPollWithOptions with an OnUpdate callback\n that fires on each RUNNING poll\n[…]\nth no volume.\n- Reuse the exported output.Colorize instead of a duplicate local colorize.\n\nAdds boundary tests for formatElapsed/humanizeMetric and tests for terminal\nwidth clamping / truncateVisible.",
"is_bot": false,
"headline": "feat(query): live progress bar for long-running queries (#336)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-03T21:02:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "94b46e8b0cbfacfce1d5883c332ed973dc372dac",
"body": "Bumps [golang.org/x/net](https://github.com/golang/net) from 0.54.0 to 0.55.0.\n- [Commits](https://github.com/golang/net/compare/v0.54.0...v0.55.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/net\n dependency-version: 0.55.0\n dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump golang.org/x/net from 0.54.0 to 0.55.0 in /sdk (#335)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-03T19:19:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b822c8eb0712c13c2e515573cbf5fc79980ef3a9",
"body": "Split the single Davis AI docs-site page into two focused pages\n(/docs/analyzers/ and /docs/copilot/) and drop the Davis branding from\ntitles, nav, and headings.\n\n- Add the previously-undocumented 'describe analyzer' command with an\n example and sample output, and round out the analyzers page (list\n[…]\ns own page (chat, nl2dql, dql2nl, document-search,\n skills) with granular per-feature scopes.\n- Update the docs nav, README resource-guide links/table, and index\n feature table to the two new pages.",
"is_bot": false,
"headline": "docs: split Davis AI docs into Analyzers and CoPilot pages (#337)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-03T19:18:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "326dd087b1d594b0e934ce941e989b01ffbbf6e1",
"body": null,
"is_bot": false,
"headline": "docs: add clickable anchor links to doc section headings (#334)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-03T18:53:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b8a8a6f3f59a18f34133d7bed3837689c24e0f9",
"body": "…@ help (#333)\n\nexec function has two modes but only app-function invocation was documented.\nDocument the ad-hoc JavaScript mode (--code, -f/--file) and the previously\nundocumented --data (payload from file/stdin) and --defer (async) flags, plus\nthe mode-selection semantics (--code/-f select ad-hoc \n[…]\nes.\n- docs/dev/API_DESIGN.md: fix --data @ example; --defer is implemented (was\n marked 'not implemented yet'); add ad-hoc examples.\n\nVerified against the built binary; cmd/exec/appengine tests pass.",
"is_bot": false,
"headline": "docs: document exec function ad-hoc mode, --data/--defer; fix --data …",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-03T18:23:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2f9eeda428a2e0a3cffbc63d451521df36c3fd57",
"body": "…it (#332)\n\nAudit the GitHub Pages docs against the actual CLI surface and close gaps in\nthe query/reference pages.\n\n- dql-queries: rewrite Additional Parameters to cover every query flag\n (client-context, fetch-timeout-seconds, enforce-query-consumption-limit,\n include-types, include-contribution\n[…]\nt Commands section.\n- configuration: document the full ctx subcommand set.\n- live-debugger: fix --decode-snapshots --full to --decode-snapshots=full.\n\nAll flag names verified against the built binary.",
"is_bot": false,
"headline": "docs: document query parameters, auth status, ctx subcommands, and wa…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-03T18:06:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8c19a01b0354068b16228d0815a34696d76425b3",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release 0.33.0",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-03T13:22:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2c16a9c107979c44903c18a172b9297973797c5a",
"body": "…#321)\n\n* feat(extension): add --assets flag and -o zip to describe extension\n\nAdds two new capabilities to `dtctl describe extension`:\n\n- `-o zip` downloads the extension package as raw bytes (redirect to file)\n- `--assets=<types>` inspects bundled asset types from the zip package;\n supported type\n[…]\n Claude Sonnet 4.6 <noreply@anthropic.com>\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>",
"is_bot": false,
"headline": "feat(extension): add --assets flag and -o zip to describe extension (…",
"author_name": "MaciejGrynda",
"author_login": "MaciejGrynda",
"committed_at": "2026-07-03T13:00:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2faa5888b0da9891c282a7e26c81349a6c1169c4",
"body": "* feat(breakpoint): add --filters to create breakpoint\n\nAllow setting workspace filters and creating a breakpoint in a single\ncommand. Previously, filters had to be configured up front via\n'update breakpoint --filters' before any breakpoint could be created.\n\n- Add optional --filters flag to 'create\n[…]\neate/update now uses\n printBreakpointMessage instead of raw fmt.Println, matching the\n delete command convention\n\n---------\n\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>",
"is_bot": false,
"headline": "feat(breakpoint): add --filters to create breakpoint (#318)",
"author_name": "Michael Bishop",
"author_login": "michaelB1sh",
"committed_at": "2026-07-03T12:15:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8f7a68078237d08cf39a7d5674b4115f269c48de",
"body": "… expose displayName/description/unit (#330)\n\nThe DQL query API only enriches metadata.metrics[] with catalogue fields\n(displayName, description, unit) when the request carries the\n`enrich=metric-metadata` query-string parameter on query:execute and\nquery:poll. dtctl never sent it, so those fields w\n[…]\n: SDK unmarshal + enrich-param-sent/gating unit tests, output footer\n and map assertions, and an integration test that verifies enrichment\n end-to-end (and that omitting it leaves the fields empty).",
"is_bot": false,
"headline": "feat(query): request metric-metadata enrichment so timeseries metrics…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-03T12:00:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0afb6f5871fab2095d28d0420c4807ddbacaa8c5",
"body": "…in agent mode (#328)\n\n* feat(query): surface scan-limit truncation and reduction advice in agent mode\n\nWhen a query hits the scan limit (or a result/timeout/consumption cap), the\nresult returned is PARTIAL, but agent mode only signalled this on stderr — an\nagent parsing the JSON envelope on stdout \n[…]\nsum(dt.system.sampling_ratio)\nextrapolation tip. For exact values, steer to removing samplingRatio from the\nfetch rather than only --default-sampling-ratio 1 (which cannot override an\nin-query ratio).",
"is_bot": false,
"headline": "feat(query): surface scan-limit truncation and data-reduction advice …",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-03T11:57:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f2cabe2b9fc11f44f906f8e6f834c26f06555448",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release 0.32.0",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-02T09:17:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d4e51439e112203dec76cad8f42711f6b0671a0d",
"body": "…adata=metrics (#326)\n\n* feat(query): expose metadata.metrics for timeseries queries via --metadata=metrics\n\nThe DQL API returns a metadata.metrics array alongside metadata.grail for\ntimeseries queries, describing each referenced metric (key, field alias,\naggregation, and optionally display name and\n[…]\nsilently\ndropped. Also fixes CI: shell-completion tests hardcoded the total\nmetadata field count and broke when \"metrics\" was added, and updates the\nstale --metadata field list in docs/QUICK_START.md.",
"is_bot": false,
"headline": "feat(query): expose metadata.metrics for timeseries queries via --met…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-02T09:09:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "03928ae80cc69493d3e4d8b6e88691f39103e12f",
"body": "…324)\n\n* docs(analyzer): design for dtctl describe analyzer\n\n* docs(analyzer): lock option A, add verify analyzer command\n\n* feat(analyzer): add describe analyzer and verify analyzer commands\n\n- describe analyzer resolves and bundles input/result JSON Schemas, rendering\n required/optional inputs; s\n[…]\n mapper\n always returns non-zero when err != nil).\n- Cover the guard with a cmd unit test and assert the live validate verdict\n maps to the 0/1 verify exit-code contract in the integration e2e test.",
"is_bot": false,
"headline": "feat(analyzer): add describe analyzer and verify analyzer commands (#…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-07-02T08:12:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4e4fcd871672c63d48a8a769a47ed8a12589bd92",
"body": "… v1.41.0 (#322)\n\n* feat(get): align classic-pipelines-translation flag defaults with API v1.41.0\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n* docs: update in-command help example to match new skip-disabled-rules default\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>",
"is_bot": false,
"headline": "feat(get): align classic-pipelines-translation flag defaults with API…",
"author_name": "katarzyna-szczerba",
"author_login": "katarzyna-szczerba",
"committed_at": "2026-07-02T08:03:59Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ab44c962fc341e346f2ac3c6ea10aba746345af9",
"body": "… (#325)\n\n* feat(extension): add --feature-set-metrics flag to describe extension (#323)\n\n- Add --feature-set-metrics flag to dtctl describe extension; without it,\n feature sets show only names (table) and a plain string array (JSON/YAML)\n- Fix SDK JSON tag featureSetDetails → featureSetsDetails to\n[…]\n for both flag states and\n the empty-feature-sets case.\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>",
"is_bot": false,
"headline": "feat(extension): add --feature-set-metrics flag to describe extension…",
"author_name": "MaciejGrynda",
"author_login": "MaciejGrynda",
"committed_at": "2026-07-02T07:48:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cff62d1113425cb96d2a21707508d3099953c0bc",
"body": "….0 (#316)\n\nBumps [github.com/guptarohit/asciigraph](https://github.com/guptarohit/asciigraph) from 0.9.0 to 0.10.0.\n- [Release notes](https://github.com/guptarohit/asciigraph/releases)\n- [Changelog](https://github.com/guptarohit/asciigraph/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/gu\n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump github.com/guptarohit/asciigraph from 0.9.0 to 0.10…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-30T06:53:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e22d4ecbce7fe887f33338b4155edb3a00808e91",
"body": "…pill guarded) (#317)\n\nOn `inspect`, `--jq` now runs as a streaming filter over the WHOLE spilled file\n(per record, like jq over NDJSON) instead of post-filtering the already-windowed\nrows — giving a sandboxed agent the \"only the matching rows\" capability without\nre-querying Grail and without a besp\n[…]\ngh the existing maybeRespill\n byte-budget guard (IN8): over threshold it re-spills to a new managed file\n whose contents are the FILTERED rows, with sampling provenance preserved (IN3).\n\nCloses #313",
"is_bot": false,
"headline": "feat(inspect): full-file predicate filtering via streaming --jq (re-s…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-30T06:53:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "cdafbc6754a608e213f907d3b0f5de06003869aa",
"body": "…lts (PR4) (#312)\n\n* feat(inspect): add `dtctl inspect` for local analysis of spilled results (PR4)\n\nLayer 2 of the result-spill design: a small, fixed set of pure-Go analytics\nprimitives over a file that `dtctl query` spilled to disk, so an agent (or\nhuman) can interrogate the rows without re-query\n[…]\nll\n file — the large window IN8 re-spill exists to handle no longer risks\n OOM before re-spill runs. readTail grows its ring lazily up to N. Add\n a regression test for N far above the prealloc cap.",
"is_bot": false,
"headline": "feat(inspect): add `dtctl inspect` for local analysis of spilled resu…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-26T09:00:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0c2fb5c9267601ad54d77d61a0190b61d8143eb7",
"body": "…alog (#309)\n\n* docs(commands): add Smartscape DQL discovery patterns to commands catalog\n\nAgents bootstrapping from dtctl commands now have grounded guidance for\nquerying Smartscape topology: correct DQL function name, a discovery query\nto enumerate valid node type IDs, and an explicit antipattern \n[…]\nnts survive\nbrief mode, and fix the schema-command docs.\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>",
"is_bot": false,
"headline": "docs(commands): add Smartscape DQL discovery patterns to commands cat…",
"author_name": "John Gallagher",
"author_login": "johngallagherdynatrace",
"committed_at": "2026-06-26T08:42:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fc8eea42ac7c07e913d2cd484566802eebda0eec",
"body": "…ll (#311)\n\n* docs(skills): add token-frugal log pattern analysis loop to dtctl skill\n\n* test(skills): update installed-skill assertions for compacted dtctl skill\n\nPR #307 compacted skills/dtctl/SKILL.md (307->~128 lines) and renamed\nits sections, but installer_test.go still asserted the old section\nnames and a 200+ line floor, leaving main red. Align the assertions\nwith the current structure.",
"is_bot": false,
"headline": "docs(skills): add token-frugal log pattern analysis loop to dtctl ski…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-25T14:39:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6e0aa881805fb88b7ab1ca5d33bfb79968586244",
"body": "… dtctl skill (#307)\n\n* docs(skills): document toon output, --jq, and query result spill\n\nBring the dtctl skill in line with the agent-facing surface:\n\n- add -o toon (token-efficient structured output) and the --jq filter to\n the Output Modes section, recommending both for agents\n- document that dt\n[…]\nlongside the other\n machine formats; both feed the large-result / DuckDB workflow\n- add segment (DQL filter segments), anomaly-detector, and the generic\n document to the agent-relevant resource list",
"is_bot": false,
"headline": "docs(skills): refresh agent surface (toon/--jq/spill) and compact the…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-24T07:38:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5eb1ceeb53a85a2695dcbdfad4e69a87e86a6d89",
"body": "…ope (PR2) (#294)\n\n* feat(query): spill large results to a local file with a summary envelope (PR2)\n\nWhen an agent raises the record cap for an export or full-population scan,\nserialising tens of thousands of rows into the model's context can cost\nmillions of tokens. `dtctl query` now measures the s\n[…]\nmit' / '| fields'), while a\none-off write failure keeps the --spill-to retry advice. Also stop the\ncolumns_omitted hint from pointing at a sidecar that does not exist when\nnothing was written to disk.",
"is_bot": false,
"headline": "feat(query): spill large results to a local file with a summary envel…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-24T07:24:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4f921d221b432d2a62ef439849df4baa53f057fb",
"body": "Switch the release workflow trigger from `push: [main]` to\n`workflow_dispatch` so releases never happen on ordinary merges. A\nrelease is now an explicit, maintainer-driven two-step: dispatch to\nbuild/update the release PR, merge it, then dispatch again to create the\ntag + GitHub Release and run GoRe\n[…]\naser. This also removes the race where\ntwo overlapping push-triggered runs could overwrite the release PR.\n\nUpdate the dtctl-release skill and CONTRIBUTING.md to document the manual\ntwo-dispatch flow.",
"is_bot": false,
"headline": "ci: make releases manual (workflow_dispatch only) (#306)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-23T21:14:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0eaed8858d760d110ee16081f906c3b37fb120bf",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(main): release 0.31.0 (#303)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-23T21:11:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8834082f82f773e408eccb5d39eabefc393de0f1",
"body": "…in-tag false) (#305)\n\nThe first release PR (#303) dumped the entire commit history into the\nrelease notes because release-please prepended the `dtctl` component to\ntags and searched for `dtctl-v*`, which don't exist — so it never found\nv0.30.3 as the baseline (\"Found release tag with component '', \n[…]\ndefaults to true in\nthe config file. Setting it false makes release-please match the\nexisting `v0.30.3` tags, so the release PR only contains commits since\nthe last release and the tag stays `vX.Y.Z`.",
"is_bot": false,
"headline": "fix(ci): match existing v* tags in release-please (include-component-…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-23T20:59:31Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7c43e6f6ac912ad4fdc85925f0a746bc1c0ae8ae",
"body": "TestQueryVerify_ValidQuery and TestQueryVerify_TemplateVariables hard-coded\n`fetch dt.entity.host`, which the DQL API rejects as UNKNOWN_DATA_OBJECT on\nGrail-only tenants (classic dt.entity.* and smartscapeNodes data objects are\nnot available there), so both expected-valid cases failed with valid=fa\n[…]\n\non any tenant, preserving each case's intent: a fetch with a fields\nprojection, and a template variable in the data-object position. Comments\nnote why dt.entity.* is avoided so it isn't reintroduced.",
"is_bot": false,
"headline": "test(e2e): use Grail data objects in query-verify tests (#304)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-23T20:58:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8da00e199c7c782c42f12f9166044047b49bbc50",
"body": "…(#295)\n\n* feat(commands): expose required token scopes in the commands catalog\n\nAdd a canonical (resource, access) -> scopes table in pkg/auth and surface\nper-command required scopes through `dtctl commands`, so agents and operators\ncan determine least-privilege token scopes before running a comman\n[…]\nthe notification fix closes).\n- `ctx token` only prints the locally-stored credential, so mark it local\n (no platform scope).\n\nUpdates the pinned per-level baseline and docs/TOKEN_SCOPES.md to match.",
"is_bot": false,
"headline": "feat(commands): expose required token scopes in the commands catalog …",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-23T20:49:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0aa186d97285d737ebd246646c4c590c619b8cd2",
"body": "…en cmd (#298)\n\n* feat(azure): add clientSecret credential flags to create/update connection\n\n- dtctl create azure connection now accepts --directoryId, --applicationId,\n --clientSecret flags for clientSecret type (full one-command setup)\n- dtctl update azure connection now accepts --clientSecret f\n[…]\ntorKeyringCheck already does) so the lookup is hermetic.\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>",
"is_bot": false,
"headline": "feat(azure): federated issuer override + clientSecret flags + ctx tok…",
"author_name": "Pawel Siwek",
"author_login": "pawelsiwek",
"committed_at": "2026-06-23T20:15:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6ccd20a0c7baa4f6fe5894c99a660b7a23444854",
"body": "Replace the hand-maintained CHANGELOG.md (a frequent merge-conflict\nsource) with release-please-driven release automation.\n\n- Add release-please-config.json (release-type go, skip-changelog) and\n .release-please-manifest.json pinned at 0.30.3\n- Keep pkg/version/version.go in sync via the x-release-\n[…]\nve CHANGELOG.md; the GitHub Release is now the canonical changelog\n- Update dtctl-release/pr-review skills, AGENTS.md, CONTRIBUTING.md, and\n design docs to the conventional-commit/release-please flow",
"is_bot": false,
"headline": "ci: automate releases with release-please, drop manual CHANGELOG (#302)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-23T20:14:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0e8bcdafdcba6686c6b09cb31a754eaee7213807",
"body": "* feat(get): add classic-pipelines-translation command\n\nAdd a read-only `dtctl get classic-pipelines-translation <logs|bizevents>`\ncommand that calls the OpenPipeline classic-pipelines translation endpoint\n(GET /platform/openpipeline/v1/classic-pipelines/translate) and returns the\ntranslated OpenPip\n[…]\nin:openpipeline.<scope>.pipelines).\n- Strengthen the agent-mode test to assert the envelope carries the\n value, the partial-translation warning, and the apply suggestion;\n add a TOON rendering test.",
"is_bot": false,
"headline": "feat(get): add classic-pipelines-translation command (#296)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-23T18:25:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "eff0f5aeeb25e2394be3d7b37b538ef95555f4a6",
"body": null,
"is_bot": false,
"headline": "feat(httpclient): surface API error details in error messages (#300)",
"author_name": "Christoph Bonitz",
"author_login": "chbo-dt",
"committed_at": "2026-06-23T13:48:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ad397c3180e828f160e7bd1faad2cdee98aadd4b",
"body": "An empty DQL result produced a column-less Parquet file. While that is a\nstructurally valid container (parquet-go reopens it fine), mainstream\nreaders reject it: DuckDB, pyarrow, and pandas all fail with \"Need at\nleast one non-root column in the file\". The DQL API returns no type info\nfor an empty r\n[…]\ntParquetPrinter_EmptyWithTypesKeepsSchema\nasserts the placeholder does not leak into a real typed schema.\n\nVerified end-to-end against a live tenant with DuckDB reading the export.\n\nFollow-up to #293.",
"is_bot": false,
"headline": "fix(output): emit a placeholder column for empty Parquet results (#297)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-23T07:19:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2f88e7ba1f3ea0c5762500f4667f5add72155ad2",
"body": "* feat(query): add jsonl and parquet output formats\n\nAdd two first-class -o output formats for `dtctl query`, aimed at large\nresult exports (PR1 of the result-spill design — formats only, no spill\nmachinery or envelope changes).\n\n- `-o jsonl`: newline-delimited JSON, one compact object per line, str\n[…]\nral and in range (reject NaN/Inf/fractional/overflow) rather\nthan silently truncating. Also flush parquet in bounded row groups and reuse\nthe caller's record slice to cap peak memory on large exports.",
"is_bot": false,
"headline": "feat(query): add jsonl and parquet output formats (#293)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-23T07:09:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f6d87901e98bfa02441d52c6509895cf73dc7b19",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.30.3 changelog",
"author_name": "Christoph Neumueller",
"author_login": "discostu105",
"committed_at": "2026-06-18T09:44:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2a31677db0f2eace23da7ff0fc9d9e9ba99b7f06",
"body": "… Keychain limit (#291)\n\nFixes #290\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(auth): fall back to file storage when refresh token exceeds macOS…",
"author_name": "Christian Kreuzberger",
"author_login": "christian-kreuzberger-dtx",
"committed_at": "2026-06-18T09:41:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "486422f14d5005799049f4f0b7768b86aaf6ca45",
"body": "The agent-mode detection map only checked GITHUB_COPILOT, which the\nstandalone GitHub Copilot CLI does not set, so dtctl did not detect it.\n\nVerified against copilot v1.0.63: it injects COPILOT_CLI=1 into every\nsubprocess it spawns. The @github/copilot SDK that sets it is also\nbundled in VS Code Copilot, so this single entry covers both surfaces.\nGITHUB_COPILOT is left in place unchanged.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: detect GitHub Copilot CLI via COPILOT_CLI env var (#289)",
"author_name": "Jakub",
"author_login": "jakubrogowski-dt",
"committed_at": "2026-06-18T07:28:53Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "110417d8625abc93e437488068de5f57d83fc1ed",
"body": "Bumps [golang.org/x/text](https://github.com/golang/text) from 0.37.0 to 0.38.0.\n- [Release notes](https://github.com/golang/text/releases)\n- [Commits](https://github.com/golang/text/compare/v0.37.0...v0.38.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/text\n dependency-version: 0.38\n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump golang.org/x/text from 0.37.0 to 0.38.0 (#279)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-16T06:15:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6021a5e662d54d8f3c2757c9cff4d596fef15586",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.30.2 changelog",
"author_name": "Christoph Neumueller",
"author_login": "discostu105",
"committed_at": "2026-06-16T05:55:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cdfe042333de6b06fba7c175648208d9fcdd9528",
"body": "Kiro detection was keyed on a KIRO environment variable that Kiro does\nnot set, so Detect() never identified a Kiro session and UserAgentSuffix\nreturned empty under Kiro.\n\nAdd the env vars Kiro actually sets. Verified on kiro-cli 2.6.1:\nAGENT_CONTEXT_OUT (the documented ACP side-channel FIFO) is exp\n[…]\ndetecting on\nAGENT_CONTEXT_OUT alone still misses headless Kiro. Key on both, and\nkeep the existing KIRO entry as a manual override.\n\nFixes #282\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: detect Kiro via the env vars it actually sets (#283)",
"author_name": "Carl Audet",
"author_login": "carl-audet",
"committed_at": "2026-06-16T05:50:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ca0366961ebd4f3e30b58daed2da72adb8055896",
"body": "…(#284)\n\n'dtctl auth whoami' hits the platform metadata API and requires an\nOAuth/JWT token with the 'app-engine:apps:run' scope. With a plain API\ntoken or a read-scoped platform token it returns a spurious 403 (and the\nJWT fallback fails, since those tokens are not JWTs) even though read\naccess wor\n[…]\nontext-inspection and troubleshooting flows with\n'dtctl auth status' (token-type aware, works with any credential) and add\na note that connectivity is confirmed by a real query, not an identity probe.",
"is_bot": false,
"headline": "fix(skills): stop recommending 'auth whoami' as a connectivity check …",
"author_name": "Benedict Evert",
"author_login": "dt-benedict",
"committed_at": "2026-06-15T18:00:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1797b319da71abe3c6d0a8bbac78887af1bf00f5",
"body": "Bumps [golang.org/x/term](https://github.com/golang/term) from 0.43.0 to 0.44.0.\n- [Commits](https://github.com/golang/term/compare/v0.43.0...v0.44.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/term\n dependency-version: 0.44.0\n dependency-type: direct:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump golang.org/x/term from 0.43.0 to 0.44.0 (#278)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-15T15:15:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a62b366a2c02b9a010724a057fc35b669cf5ab64",
"body": "Bumps [github.com/itchyny/gojq](https://github.com/itchyny/gojq) from 0.12.17 to 0.12.19.\n- [Release notes](https://github.com/itchyny/gojq/releases)\n- [Changelog](https://github.com/itchyny/gojq/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/itchyny/gojq/compare/v0.12.17...v0.12.19)\n\n---\nup\n[…]\nirect:production\n update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump github.com/itchyny/gojq from 0.12.17 to 0.12.19 (#280)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-15T15:15:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c024068ca682eceddbd980db067bed3540691781",
"body": null,
"is_bot": false,
"headline": "chore(release): polish v0.30.1 release notes",
"author_name": "Christoph Neumueller",
"author_login": "discostu105",
"committed_at": "2026-06-15T10:58:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c391bec46b5c24ba8976f90e868616129dc0174a",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.30.1 changelog",
"author_name": "Christoph Neumueller",
"author_login": "discostu105",
"committed_at": "2026-06-15T09:32:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d30c6cc2e19279975a509b6cdda277770d4160bd",
"body": "…and snapshots (#281)\n\n* fix(document): restore structured content in get dashboard -o yaml/json\n\nThe SDK extraction in 0.28.0 (#239) split the document model into an SDK\ntype and a CLI read-model type, but the CLI type only carried UnmarshalJSON\n— its MarshalJSON/MarshalYAML were not ported. Since \n[…]\nlay-field leakage), a unit test\nfor the shared helper, and single-object golden fixtures for the analyzer\ndefinition and snapshot. Verified all new guards fail without the fix.\n\nAffects 0.28.0-0.30.0.",
"is_bot": false,
"headline": "fix(output): restore structured YAML/JSON for dashboards, analyzers, …",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-15T09:29:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1a25ff245ad259a7f7744318b15b87983dc82e71",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.30.0 changelog",
"author_name": "Christoph Neumueller",
"author_login": "discostu105",
"committed_at": "2026-06-12T14:01:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "47edc0e63758b3601db3f387f96a8a6b34c38a12",
"body": "* feat/jq: add jq filter option\n\n* feat/jq-arg: implement code review design feedbacks\n\n* feat/jq-arg: add --jsonpath as alias of --jq\n\n* chore: run go mod tidy\n\n* feat/jq-arg: handle agentMode with metadata\n\n* feat/jq-arg: implement review feedbacks: remove --jsonpath alias and replace literal by jqFilter variable",
"is_bot": false,
"headline": "feat/jq: add jq filter option (#271)",
"author_name": "Idriss Neumann",
"author_login": "idrissneumann",
"committed_at": "2026-06-12T13:58:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5a984b14daf2320d5bafb23ab96282e0d214c41b",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.29.0 changelog",
"author_name": "Christoph Neumueller",
"author_login": "discostu105",
"committed_at": "2026-06-11T15:44:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eaf4cf1ed4da46056de92d532b4d7f65e514cf47",
"body": "…(#274)\n\nWorkflows without an event or schedule trigger (manual trigger) serialize\nwith no \"trigger\" field, since Trigger is nil and marked omitempty. The apply\nresource-type heuristic required both \"tasks\" and \"trigger\", so the output of\n`dtctl get workflow -o yaml|json` for a manual workflow could\n[…]\nd alone, which is the defining workflow\nfield and is not used as a top-level key by any other resource type. Affects\nboth JSON and YAML output.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(workflow): workflows with manual triggers are detected correctly …",
"author_name": "Christoph Bonitz",
"author_login": "chbo-dt",
"committed_at": "2026-06-11T12:09:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6d5f25a60ea3f726bed14b71d92b7014cf4c5198",
"body": "…… (#264)\n\n* feat(azure): add clientSecret credential flags to create/update connection\n\n- dtctl create azure connection now accepts --directoryId, --applicationId,\n --clientSecret flags for clientSecret type (full one-command setup)\n- dtctl update azure connection now accepts --clientSecret for se\n[…]\ny: Pawel Siwek <pawel.siwek@dynatrace.com>\n\n---------\n\nSigned-off-by: Pawel Siwek <pawel.siwek@dynatrace.com>\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
"is_bot": false,
"headline": "feat(azure): add clientSecret credential flags to create/update conne…",
"author_name": "Pawel Siwek",
"author_login": "pawelsiwek",
"committed_at": "2026-06-11T09:26:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b5ded1d9d5bdb283aef4bc6a49fac1960df23e1e",
"body": null,
"is_bot": false,
"headline": "feat: better workflow and workflow list (#269)",
"author_name": "Christoph Bonitz",
"author_login": "chbo-dt",
"committed_at": "2026-06-11T09:22:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3125b3edaf3014200d079ee7f8f902fd26945916",
"body": null,
"is_bot": false,
"headline": "fix: enforce live debugger filters (#270)",
"author_name": "Dudi Cohen",
"author_login": "ElDuderinos",
"committed_at": "2026-06-11T09:20:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d84c5231a873dbedde12683239ecc3b7cf227b47",
"body": "…fig (#268)\n\n* fix(config): don't honor aliases/hooks from auto-discovered local config\n\nA per-project .dtctl.yaml is auto-discovered by walking up from the current\nworking directory, which means it can come from an untrusted location (a\nchecked-out repo, an unpacked tarball, a shared work dir, a CI\n[…]\n\nskip exec keys when IsLocal(). Values round-trip through save intact.\n\nRename StrippedExecKeys() -> IgnoredExecKeys() to match. Add a\nround-trip regression test and a resolver test for local aliases.",
"is_bot": false,
"headline": "fix(config): don't honor aliases/hooks from auto-discovered local con…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-11T09:19:31Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "13df04348e67d8d339cc3190a81e9633d18d7407",
"body": "…s (#266)\n\nGO-2025-3749 (textproto ReadMIMEHeader) and GO-2026-5037 (crypto/x509\nhostname parsing) are fixed in Go 1.26.4. Updates go.mod and all CI\nworkflow files.",
"is_bot": false,
"headline": "fix(ci): bump Go toolchain to 1.26.4 to resolve stdlib vulnerabilitie…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-06-09T19:40:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c99c7f9ad7e2f185d63297ca8bc4057ae478979c",
"body": "…tlptracehttp from 1.43.0 to 1.44.0 (#262)\n\n* chore(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\n\nBumps [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp](https://github.com/open-telemetry/opentelemetry-go) from 1.43.0 to 1.44.0.\n- [Release notes](https:\n[…]\nndabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/o…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-09T19:33:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e55e5dc46598545f26487ff1a2a97e72a59a2cfa",
"body": "…(#260)\n\nBumps [go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go) from 1.43.0 to 1.44.0.\n- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)\n- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)\n- [Commits]\n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump go.opentelemetry.io/otel/sdk from 1.43.0 to 1.44.0 …",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-01T11:51:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e4d10257f90b6527419290a3aeae67736212561f",
"body": "…0 (#261)\n\nBumps [go.opentelemetry.io/otel/trace](https://github.com/open-telemetry/opentelemetry-go) from 1.43.0 to 1.44.0.\n- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)\n- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)\n- [Comm\n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump go.opentelemetry.io/otel/trace from 1.43.0 to 1.44.…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-31T18:08:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b6b06f065db469d3c1ac1d78fb05a86797a407cc",
"body": "Bumps [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) from 1.43.0 to 1.44.0.\n- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)\n- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)\n- [Commits](https://gith\n[…]\nirect:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump go.opentelemetry.io/otel from 1.43.0 to 1.44.0 (#263)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-31T18:08:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "acf62bd529b25a5304a72c852b087146c21e3189",
"body": null,
"is_bot": false,
"headline": "chore(release): v0.28.1 changelog",
"author_name": "Christoph Neumueller",
"author_login": "discostu105",
"committed_at": "2026-05-29T21:50:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cad2e0e755d068b31844a9fa827161c93afcd9bb",
"body": "…ctid present (#258)\n\ndryRun() was checking doc[\"id\"] to decide between ActionCreated and\nActionUpdated. Settings objects never carry an \"id\" field — they use\nobjectId (camelCase, API format) or objectid (lowercase, YAML round-trip\nformat) — so dry-run always reported \"created\" regardless of whether\n[…]\ntId/objectid so dry-run agrees\nwith actual apply.\n\nAdds regression tests:\n TestApply_Settings_DryRun_WithObjectID_ReportsUpdated\n TestApply_Settings_DryRun_WithoutObjectID_ReportsCreated\n\nFixes #256",
"is_bot": false,
"headline": "fix(apply/settings): dry-run now reports 'updated' when objectId/obje…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-05-29T21:49:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f32086c2541c2b9491d7e39c06fd87209778a099",
"body": "… (#257)\n\nThe --id CLI flag injects doc[\"id\"] via injectID(), but applySettings\nwas only reading objectId/objectid — never id — to decide whether to PUT\nor POST. Every invocation with --id still sent a POST (CREATE) to the DT\nSettings API, returning 400 for any object whose identifier already existe\n[…]\n[\"id\"] as a final fallback in the objectID resolution chain\nin applySettings, so the value injected by --id is honoured.\n\nAdds regression test TestApply_Settings_OverrideID_TriggersUpdate.\n\nFixes #255",
"is_bot": false,
"headline": "fix(apply/settings): --id flag and --write-id --id now trigger UPDATE…",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-05-29T19:35:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "25782e10e9a3700dae6b8b6bce8d5fd6366bd6ce",
"body": "Previously, `dtctl ctx set <name>` only set the context as current when\nit was the very first context or no current context was set. With multiple\nexisting contexts, the command would report success (\"Context set\") but\nleave the current context unchanged — confusing users who expected the\nnamed cont\n[…]\netween create and update to make the outcome unambiguous:\n - \"Context %q created and set as current\"\n - \"Context %q updated and set as current\"\n\nAdded a test case to cover the update-activates path.",
"is_bot": false,
"headline": "fix(ctx): ctx set always activates the configured context (#254)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-05-28T09:09:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8a2494f7f124948e178c1ba893d64ed2eb4116e9",
"body": "dtctl doctor reported [OK] for environment URLs without an https://\nscheme, then immediately failed the connectivity check with\n\"unsupported protocol scheme\"\". The url pattern checker only\nvalidated domain patterns (live vs apps, etc.) but never verified\nthat a scheme was present at all.\n\nAdd an ear\n[…]\nstion right away.\nThis surfaces as a [WARN] in dtctl doctor with the exact fix command\ninstead of a confusing [OK] followed by a [FAIL].\n\nFixes: dtctl doctor gives misleading [OK] for scheme-less URLs",
"is_bot": false,
"headline": "fix(urls): detect missing https:// scheme in environment URL (#253)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-05-27T10:55:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9e914186f2a90a2f27c9c3098e6d9b0294f09622",
"body": "…, OAuth refresh race fix\n\nHighlights:\n- Publish github.com/dynatrace-oss/dtctl/sdk as a separate Go module\n (sdk/api, sdk/api/query, sdk/httpclient, sdk/credstore, sdk/auth,\n sdk/agentmode, sdk/urls).\n- Full AWS provider support (connection + monitoring) with parity to\n Azure/GCP and a least-pri\n[…]\ng list endpoints (AWS/Azure/GCP) now follow\n nextPageKey instead of silently truncating to page 1.\n- Nix flake support, tablewriter v1.1.4 migration, x/net v0.54.0, plus\n the usual dependency bumps.",
"is_bot": false,
"headline": "release v0.28.0: dt-cli-sdk module, AWS provider, workflow exec input…",
"author_name": "Christoph Neumueller",
"author_login": "discostu105",
"committed_at": "2026-05-26T09:49:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3fe2972cff6f434cf93aa163049c7e40ea342064",
"body": "The Dynatrace Settings API now reports a missing schema as\n\"Configuration schema ... does not exist\" rather than the older\n\"not found\" wording, while still returning HTTP 404. The test now\naccepts either phrasing (and falls back to the 404 status code) so\nupstream message drift no longer fails the integration suite.\n\nSame class of test-only fix as #238 (trash restore conflict).",
"is_bot": false,
"headline": "fix: update settings list invalid-schema error assertion (#252)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-05-26T09:42:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab205d7f77ba6bb2e38ff0705259c2c4f20147e9",
"body": "Adds a cross-process advisory flock(2) lock around OAuth refresh-token\nrotation on Unix so that concurrent dtctl processes serialise their\nrefresh calls instead of all racing on the same refresh_token and\ntriggering invalid_grant.\n\nAlso fixes a latent bug where medium-compact tokens (access_token\nst\n[…]\nialises same-process goroutines, matching the intra-process behaviour\nprovided by flock(2) on Unix. Cross-process serialisation on Windows is\na documented future improvement (LockFileEx).\n\nFixes #248.",
"is_bot": false,
"headline": "fix(auth): prevent concurrent OAuth refresh-token rotation race (#249)",
"author_name": "Alessandro Ruzzon",
"author_login": "aleruz-dt",
"committed_at": "2026-05-26T09:20:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d8fd3b0893eff0ace338e64ba4c5c9caa2f3e2df",
"body": "Set ExecuteRequest.PollingPromiseSeconds to a default of 5 in\nExecuteAndPoll so the Dynatrace query API auto-cancels abandoned\nqueries when the client does not follow up within the budget. dtctl\nre-polls immediately after each long-poll returns RUNNING, so the\nclient-side gap is microseconds and no \n[…]\neded. Added a\nregression test that pins the poll-to-poll gap at < 1s to catch any\nsleep or backoff being introduced into the loop.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(query): send pollingPromiseSeconds on DQL query:execute (#250)",
"author_name": "herwigmoser",
"author_login": "herwigmoser",
"committed_at": "2026-05-26T09:15:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4a9945e2ac8f2c863dddd5e776c26a65db81761c",
"body": "Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.44.0 to 0.45.0.\n- [Commits](https://github.com/golang/sys/compare/v0.44.0...v0.45.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/sys\n dependency-version: 0.45.0\n dependency-type: direct:production\n update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump golang.org/x/sys from 0.44.0 to 0.45.0 (#251)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-26T09:10:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ee1a2ee1833a80dcff861b4a2ca921fc16fc1773",
"body": null,
"is_bot": false,
"headline": "feat(workflow): enable --wait for simple workflows (#247)",
"author_name": "Christoph Bonitz",
"author_login": "chbo-dt",
"committed_at": "2026-05-26T09:08:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "44541a9d950716da975d4e5760a7951ba8555a43",
"body": null,
"is_bot": false,
"headline": "fix(workflow): preserve definition fields in get output (#246)",
"author_name": "Christoph Bonitz",
"author_login": "chbo-dt",
"committed_at": "2026-05-26T09:08:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ecb1948eafda64c08c036fff810ecfc186367925",
"body": "* feat(aws): add AWS provider support - connections + monitoring\n\nWIP: Full CRUD for AWS connections and monitoring configurations,\nsymmetric with existing Azure/GCP providers.\n\nNew packages:\n- pkg/resources/awsconnection: Settings 2.0 based connection management\n- pkg/resources/awsmonitoringconfig:\n[…]\nocs/cloud-integrations.md: new AWS section above Azure plus AWS added to the intro paragraph, covering the same 7-step onboarding flow.\n\nAddresses review feedback on PR #240 (no docs updates for AWS).",
"is_bot": false,
"headline": "feat(aws): add AWS provider support - connections + monitoring (#240)",
"author_name": "Pawel Siwek",
"author_login": "pawelsiwek",
"committed_at": "2026-05-21T21:58:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f9ff1e986b4155d56b67f7f5a9ffa7ec593ef642",
"body": "…ntity.* queries (#245)",
"is_bot": false,
"headline": "docs: update DQL reference to prefer smartscapeNodes over legacy dt.e…",
"author_name": "franzpdt",
"author_login": "franzpdt",
"committed_at": "2026-05-19T08:21:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1094a79a79db6e72b67935b363f1115198fe4d45",
"body": "Signed-off-by: Christoph Neumüller <christoph.neumueller@dynatrace.com>",
"is_bot": false,
"headline": "Update README.md",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-05-19T05:20:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b2b82ec6e163b7fe06f468e70ac837b6f0ec363d",
"body": null,
"is_bot": false,
"headline": "docs(sdk): add missing api/query package to README",
"author_name": "Christoph Neumueller",
"author_login": "discostu105",
"committed_at": "2026-05-16T08:59:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6759ba9d3d850e08d6b8660c8424a5270f367d61",
"body": "Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.8.0 to 1.10.2.\n- [Release notes](https://github.com/spf13/cobra/releases)\n- [Commits](https://github.com/spf13/cobra/compare/v1.8.0...v1.10.2)\n\n---\nupdated-dependencies:\n- dependency-name: github.com/spf13/cobra\n dependency-versi\n[…]\nf-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>",
"is_bot": true,
"headline": "chore(deps): bump github.com/spf13/cobra from 1.8.0 to 1.10.2 (#243)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-16T08:51:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d4fef7ad9e55eea6f4abf8672baf6afc34ffe21e",
"body": "…0 (#242)\n\nBumps [github.com/guptarohit/asciigraph](https://github.com/guptarohit/asciigraph) from 0.7.3 to 0.9.0.\n- [Release notes](https://github.com/guptarohit/asciigraph/releases)\n- [Changelog](https://github.com/guptarohit/asciigraph/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/gupt\n[…]\nf-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: Christoph Neumueller <christoph.neumueller@dynatrace.com>",
"is_bot": true,
"headline": "chore(deps): bump github.com/guptarohit/asciigraph from 0.7.3 to 0.9.…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-16T08:50:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "76735be55bb016fcb3e8c60fff19566b4f545b3f",
"body": null,
"is_bot": false,
"headline": "chore(sdk): release v0.2.0",
"author_name": "Christoph Neumueller",
"author_login": "discostu105",
"committed_at": "2026-05-16T08:49:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1c4aa4792adfdfb4cda78d5c0a95675a7038594b",
"body": "* feat(sdk): extract DQL query API into sdk/api/query/\n\nAdd a new SDK package for the Dynatrace DQL Query API\n(/platform/storage/query/v1/) with typed Execute, Poll, Cancel, and\nVerify methods, plus an ExecuteAndPoll convenience that handles async\npolling, context cancellation with backend cancel, a\n[…]\n the SDK applies the returned\ntoken via SetToken, making the contract reliable for all consumers.\n\nAlso replace the unreachable fallthrough return in Execute with an\nerror for unexpected status codes.",
"is_bot": false,
"headline": "feat(sdk): extract DQL query API into sdk/api/query/ (#241)",
"author_name": "Christoph Neumüller",
"author_login": "discostu105",
"committed_at": "2026-05-16T08:42:13Z",
"body_truncated": true,
"is_coding_agent": false
}
],
"releases_count": 59,
"commits_last_year": 619,
"latest_release_at": "2026-07-21T14:53:14Z",
"latest_release_tag": "v0.35.0",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 27,
"days_since_latest_release": 0,
"mean_days_between_releases": 3.9
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 87,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"ecosystem": {
"packages": [
{
"name": "github.com/dynatrace-oss/dtctl",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/dynatrace-oss/dtctl",
"is_deprecated": false,
"latest_version": "v0.35.0",
"repository_url": "https://github.com/dynatrace-oss/dtctl",
"versions_count": 59,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-21T14:52:40Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
},
{
"name": "github.com/dynatrace-oss/dtctl/sdk",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/dynatrace-oss/dtctl/sdk",
"is_deprecated": false,
"latest_version": "v0.2.0",
"repository_url": "https://github.com/dynatrace-oss/dtctl",
"versions_count": 2,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-05-16T08:49:37Z",
"latest_version_yanked": null,
"days_since_latest_publish": 66
}
]
},
"popularity": {
"forks": 58,
"stars": 168,
"watchers": 6,
"fork_history": {
"days": [
{
"date": "2026-01-14",
"count": 1
},
{
"date": "2026-01-15",
"count": 1
},
{
"date": "2026-01-17",
"count": 1
},
{
"date": "2026-01-19",
"count": 1
},
{
"date": "2026-02-03",
"count": 1
},
{
"date": "2026-02-16",
"count": 1
},
{
"date": "2026-02-17",
"count": 2
},
{
"date": "2026-02-20",
"count": 1
},
{
"date": "2026-03-03",
"count": 1
},
{
"date": "2026-03-07",
"count": 1
},
{
"date": "2026-03-09",
"count": 2
},
{
"date": "2026-03-10",
"count": 2
},
{
"date": "2026-03-18",
"count": 1
},
{
"date": "2026-03-26",
"count": 2
},
{
"date": "2026-03-27",
"count": 1
},
{
"date": "2026-03-30",
"count": 2
},
{
"date": "2026-03-31",
"count": 3
},
{
"date": "2026-04-07",
"count": 1
},
{
"date": "2026-04-09",
"count": 1
},
{
"date": "2026-04-15",
"count": 1
},
{
"date": "2026-04-18",
"count": 2
},
{
"date": "2026-04-20",
"count": 1
},
{
"date": "2026-04-21",
"count": 1
},
{
"date": "2026-04-23",
"count": 1
},
{
"date": "2026-04-25",
"count": 1
},
{
"date": "2026-04-27",
"count": 1
},
{
"date": "2026-04-29",
"count": 2
},
{
"date": "2026-04-30",
"count": 1
},
{
"date": "2026-05-11",
"count": 1
},
{
"date": "2026-05-12",
"count": 1
},
{
"date": "2026-05-13",
"count": 1
},
{
"date": "2026-05-19",
"count": 1
},
{
"date": "2026-05-20",
"count": 1
},
{
"date": "2026-06-06",
"count": 1
},
{
"date": "2026-06-08",
"count": 2
},
{
"date": "2026-06-09",
"count": 1
},
{
"date": "2026-06-10",
"count": 1
},
{
"date": "2026-06-15",
"count": 1
},
{
"date": "2026-06-16",
"count": 1
},
{
"date": "2026-06-17",
"count": 1
},
{
"date": "2026-06-24",
"count": 1
},
{
"date": "2026-06-26",
"count": 1
},
{
"date": "2026-06-28",
"count": 1
},
{
"date": "2026-06-30",
"count": 1
},
{
"date": "2026-07-01",
"count": 1
},
{
"date": "2026-07-05",
"count": 1
},
{
"date": "2026-07-06",
"count": 1
},
{
"date": "2026-07-09",
"count": 1
}
],
"complete": true,
"collected": 58,
"total_forks": 58
},
"star_history": {
"days": [
{
"date": "2026-01-09",
"count": 1
},
{
"date": "2026-01-12",
"count": 1
},
{
"date": "2026-01-13",
"count": 8
},
{
"date": "2026-01-14",
"count": 19
},
{
"date": "2026-01-15",
"count": 3
},
{
"date": "2026-01-17",
"count": 1
},
{
"date": "2026-01-18",
"count": 4
},
{
"date": "2026-01-19",
"count": 5
},
{
"date": "2026-01-20",
"count": 1
},
{
"date": "2026-01-21",
"count": 1
},
{
"date": "2026-01-23",
"count": 1
},
{
"date": "2026-01-24",
"count": 1
},
{
"date": "2026-01-26",
"count": 3
},
{
"date": "2026-01-28",
"count": 1
},
{
"date": "2026-02-04",
"count": 1
},
{
"date": "2026-02-06",
"count": 3
},
{
"date": "2026-02-08",
"count": 1
},
{
"date": "2026-02-09",
"count": 1
},
{
"date": "2026-02-13",
"count": 1
},
{
"date": "2026-02-16",
"count": 1
},
{
"date": "2026-02-18",
"count": 1
},
{
"date": "2026-02-19",
"count": 1
},
{
"date": "2026-02-24",
"count": 1
},
{
"date": "2026-02-25",
"count": 2
},
{
"date": "2026-02-28",
"count": 1
},
{
"date": "2026-03-02",
"count": 1
},
{
"date": "2026-03-03",
"count": 2
},
{
"date": "2026-03-04",
"count": 1
},
{
"date": "2026-03-05",
"count": 1
},
{
"date": "2026-03-06",
"count": 3
},
{
"date": "2026-03-09",
"count": 1
},
{
"date": "2026-03-10",
"count": 2
},
{
"date": "2026-03-11",
"count": 1
},
{
"date": "2026-03-12",
"count": 1
},
{
"date": "2026-03-13",
"count": 3
},
{
"date": "2026-03-16",
"count": 3
},
{
"date": "2026-03-17",
"count": 1
},
{
"date": "2026-03-18",
"count": 1
},
{
"date": "2026-03-19",
"count": 2
},
{
"date": "2026-03-20",
"count": 1
},
{
"date": "2026-03-24",
"count": 5
},
{
"date": "2026-03-25",
"count": 2
},
{
"date": "2026-03-26",
"count": 1
},
{
"date": "2026-03-27",
"count": 2
},
{
"date": "2026-03-28",
"count": 2
},
{
"date": "2026-03-30",
"count": 4
},
{
"date": "2026-03-31",
"count": 1
},
{
"date": "2026-04-01",
"count": 1
},
{
"date": "2026-04-03",
"count": 3
},
{
"date": "2026-04-05",
"count": 1
},
{
"date": "2026-04-07",
"count": 3
},
{
"date": "2026-04-08",
"count": 3
},
{
"date": "2026-04-10",
"count": 3
},
{
"date": "2026-04-11",
"count": 1
},
{
"date": "2026-04-14",
"count": 1
},
{
"date": "2026-04-16",
"count": 2
},
{
"date": "2026-04-20",
"count": 1
},
{
"date": "2026-04-25",
"count": 1
},
{
"date": "2026-04-27",
"count": 1
},
{
"date": "2026-04-28",
"count": 1
},
{
"date": "2026-04-30",
"count": 1
},
{
"date": "2026-05-04",
"count": 1
},
{
"date": "2026-05-06",
"count": 1
},
{
"date": "2026-05-07",
"count": 1
},
{
"date": "2026-05-08",
"count": 1
},
{
"date": "2026-05-13",
"count": 1
},
{
"date": "2026-05-18",
"count": 3
},
{
"date": "2026-05-20",
"count": 2
},
{
"date": "2026-05-21",
"count": 1
},
{
"date": "2026-05-25",
"count": 1
},
{
"date": "2026-05-27",
"count": 1
},
{
"date": "2026-06-02",
"count": 1
},
{
"date": "2026-06-03",
"count": 1
},
{
"date": "2026-06-04",
"count": 2
},
{
"date": "2026-06-05",
"count": 1
},
{
"date": "2026-06-11",
"count": 1
},
{
"date": "2026-06-12",
"count": 1
},
{
"date": "2026-06-15",
"count": 2
},
{
"date": "2026-06-16",
"count": 3
},
{
"date": "2026-06-17",
"count": 1
},
{
"date": "2026-06-21",
"count": 1
},
{
"date": "2026-06-25",
"count": 1
},
{
"date": "2026-06-26",
"count": 1
},
{
"date": "2026-06-27",
"count": 1
},
{
"date": "2026-06-29",
"count": 1
},
{
"date": "2026-06-30",
"count": 1
},
{
"date": "2026-07-03",
"count": 2
},
{
"date": "2026-07-04",
"count": 1
},
{
"date": "2026-07-07",
"count": 1
},
{
"date": "2026-07-08",
"count": 1
},
{
"date": "2026-07-09",
"count": 1
},
{
"date": "2026-07-13",
"count": 1
},
{
"date": "2026-07-15",
"count": 1
}
],
"complete": true,
"collected": 168,
"total_stars": 168
},
"open_issues_and_prs": 22
},
"ai_readiness": {
"has_nix": true,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"makefile"
],
"api_schema_files": [],
"has_devcontainer": true,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod",
"sdk/go.mod"
],
"largest_source_bytes": 112576,
"source_files_sampled": 580,
"oversized_source_files": 6,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 17569
},
"dependencies": {
"manifests": [
"go.mod",
"sdk/go.mod"
],
"advisories": {
"error": null,
"scope": "repository_graph",
"source": "osv",
"findings": [
{
"name": "kramdown",
"direct": false,
"version": "1.14.0",
"severity": "critical",
"ecosystem": "rubygems",
"cvss_score": 9.8,
"advisory_ids": [
"GHSA-mqm2-cgpr-p4m6"
],
"fixed_version": "2.3.0",
"advisory_count": 1,
"oldest_advisory_days": 2173
},
{
"name": "activesupport",
"direct": false,
"version": "4.2.9",
"severity": "high",
"ecosystem": "rubygems",
"cvss_score": 7.5,
"advisory_ids": [
"GHSA-2j26-frm8-cmj9",
"GHSA-89vf-4333-qx8v",
"GHSA-cg4j-q9v8-6v38",
"GHSA-j6gc-792m-qgm2",
"GHSA-pj73-v5mw-pm9j"
],
"fixed_version": "8.1.2.1",
"advisory_count": 5,
"oldest_advisory_days": 1280
},
{
"name": "jekyll",
"direct": false,
"version": "3.6.2",
"severity": "high",
"ecosystem": "rubygems",
"cvss_score": 7.5,
"advisory_ids": [
"GHSA-4xjh-m3qx-49wc"
],
"fixed_version": "3.8.4",
"advisory_count": 1,
"oldest_advisory_days": 2853
},
{
"name": "golang.org/x/net",
"direct": false,
"version": "v0.55.0",
"severity": "unknown",
"ecosystem": "go",
"cvss_score": null,
"advisory_ids": [
"GO-2026-5942"
],
"fixed_version": "0.56.0",
"advisory_count": 1,
"oldest_advisory_days": 7
}
],
"collected": true,
"truncated": false,
"by_severity": {
"high": 2,
"unknown": 1,
"critical": 1
},
"advisory_count": 8,
"affected_count": 4,
"assessed_count": 151,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/adrg/xdg",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.5.3"
},
{
"name": "github.com/dynatrace-oss/dtctl/sdk",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.0.0-00010101000000-000000000000"
},
{
"name": "github.com/go-resty/resty/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.17.2"
},
{
"name": "github.com/google/shlex",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.0.0-20191202100458-e7afc7fbc510"
},
{
"name": "github.com/guptarohit/asciigraph",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.10.0"
},
{
"name": "github.com/itchyny/gojq",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.12.19"
},
{
"name": "github.com/olekukonko/tablewriter",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.1.4"
},
{
"name": "github.com/parquet-go/parquet-go",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.30.1"
},
{
"name": "github.com/spf13/cobra",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.10.2"
},
{
"name": "github.com/spf13/pflag",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.0.10"
},
{
"name": "github.com/spf13/viper",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.21.0"
},
{
"name": "github.com/stretchr/testify",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.11.1"
},
{
"name": "github.com/toon-format/toon-go",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.0.0-20251202084852-7ca0e27c4e8c"
},
{
"name": "go.opentelemetry.io/otel",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.44.0"
},
{
"name": "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.44.0"
},
{
"name": "go.opentelemetry.io/otel/sdk",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.44.0"
},
{
"name": "go.opentelemetry.io/otel/trace",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.44.0"
},
{
"name": "golang.org/x/sys",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.47.0"
},
{
"name": "golang.org/x/term",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.45.0"
},
{
"name": "golang.org/x/text",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.40.0"
},
{
"name": "google.golang.org/protobuf",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.36.11"
},
{
"name": "gopkg.in/yaml.v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.0.1"
},
{
"name": "github.com/adrg/xdg",
"manifest": "sdk/go.mod",
"ecosystem": "go",
"version_constraint": "v0.5.3"
},
{
"name": "github.com/go-resty/resty/v2",
"manifest": "sdk/go.mod",
"ecosystem": "go",
"version_constraint": "v2.17.2"
},
{
"name": "github.com/godbus/dbus/v5",
"manifest": "sdk/go.mod",
"ecosystem": "go",
"version_constraint": "v5.2.2"
},
{
"name": "github.com/pkg/browser",
"manifest": "sdk/go.mod",
"ecosystem": "go",
"version_constraint": "v0.0.0-20240102092130-5ac0b6a4141c"
},
{
"name": "github.com/stretchr/testify",
"manifest": "sdk/go.mod",
"ecosystem": "go",
"version_constraint": "v1.11.1"
},
{
"name": "github.com/zalando/go-keyring",
"manifest": "sdk/go.mod",
"ecosystem": "go",
"version_constraint": "v0.2.8"
},
{
"name": "golang.org/x/sys",
"manifest": "sdk/go.mod",
"ecosystem": "go",
"version_constraint": "v0.47.0"
},
{
"name": "gopkg.in/yaml.v3",
"manifest": "sdk/go.mod",
"ecosystem": "go",
"version_constraint": "v3.0.1"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "github.com/adrg/xdg",
"direct": true,
"version": "v0.5.3",
"ecosystem": "go"
},
{
"name": "github.com/go-resty/resty/v2",
"direct": true,
"version": "v2.17.2",
"ecosystem": "go"
},
{
"name": "github.com/godbus/dbus/v5",
"direct": true,
"version": "v5.2.2",
"ecosystem": "go"
},
{
"name": "github.com/google/shlex",
"direct": true,
"version": "v0.0.0-20191202100458-e7afc7fbc510",
"ecosystem": "go"
},
{
"name": "github.com/guptarohit/asciigraph",
"direct": true,
"version": "v0.10.0",
"ecosystem": "go"
},
{
"name": "github.com/itchyny/gojq",
"direct": true,
"version": "v0.12.19",
"ecosystem": "go"
},
{
"name": "github.com/olekukonko/tablewriter",
"direct": true,
"version": "v1.1.4",
"ecosystem": "go"
},
{
"name": "github.com/parquet-go/parquet-go",
"direct": true,
"version": "v0.30.1",
"ecosystem": "go"
},
{
"name": "github.com/pkg/browser",
"direct": true,
"version": "v0.0.0-20240102092130-5ac0b6a4141c",
"ecosystem": "go"
},
{
"name": "github.com/spf13/cobra",
"direct": true,
"version": "v1.10.2",
"ecosystem": "go"
},
{
"name": "github.com/spf13/pflag",
"direct": true,
"version": "v1.0.10",
"ecosystem": "go"
},
{
"name": "github.com/spf13/viper",
"direct": true,
"version": "v1.21.0",
"ecosystem": "go"
},
{
"name": "github.com/stretchr/testify",
"direct": true,
"version": "v1.11.1",
"ecosystem": "go"
},
{
"name": "github.com/toon-format/toon-go",
"direct": true,
"version": "v0.0.0-20251202084852-7ca0e27c4e8c",
"ecosystem": "go"
},
{
"name": "github.com/zalando/go-keyring",
"direct": true,
"version": "v0.2.8",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel",
"direct": true,
"version": "v1.44.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp",
"direct": true,
"version": "v1.44.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/sdk",
"direct": true,
"version": "v1.44.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/trace",
"direct": true,
"version": "v1.44.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/sys",
"direct": true,
"version": "v0.47.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/term",
"direct": true,
"version": "v0.45.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/text",
"direct": true,
"version": "v0.40.0",
"ecosystem": "go"
},
{
"name": "google.golang.org/protobuf",
"direct": true,
"version": "v1.36.11",
"ecosystem": "go"
},
{
"name": "gopkg.in/yaml.v3",
"direct": true,
"version": "v3.0.1",
"ecosystem": "go"
},
{
"name": "github.com/andybalholm/brotli",
"direct": false,
"version": "v1.1.1",
"ecosystem": "go"
},
{
"name": "github.com/cenkalti/backoff/v5",
"direct": false,
"version": "v5.0.3",
"ecosystem": "go"
},
{
"name": "github.com/cespare/xxhash/v2",
"direct": false,
"version": "v2.3.0",
"ecosystem": "go"
},
{
"name": "github.com/clipperhouse/displaywidth",
"direct": false,
"version": "v0.10.0",
"ecosystem": "go"
},
{
"name": "github.com/clipperhouse/uax29/v2",
"direct": false,
"version": "v2.6.0",
"ecosystem": "go"
},
{
"name": "github.com/danieljoos/wincred",
"direct": false,
"version": "v1.2.3",
"ecosystem": "go"
},
{
"name": "github.com/davecgh/go-spew",
"direct": false,
"version": "v1.1.2-0.20180830191138-d8f796af33cc",
"ecosystem": "go"
},
{
"name": "github.com/fatih/color",
"direct": false,
"version": "v1.18.0",
"ecosystem": "go"
},
{
"name": "github.com/fsnotify/fsnotify",
"direct": false,
"version": "v1.9.0",
"ecosystem": "go"
},
{
"name": "github.com/go-logr/logr",
"direct": false,
"version": "v1.4.3",
"ecosystem": "go"
},
{
"name": "github.com/go-logr/stdr",
"direct": false,
"version": "v1.2.2",
"ecosystem": "go"
},
{
"name": "github.com/go-viper/mapstructure/v2",
"direct": false,
"version": "v2.4.0",
"ecosystem": "go"
},
{
"name": "github.com/google/uuid",
"direct": false,
"version": "v1.6.0",
"ecosystem": "go"
},
{
"name": "github.com/grpc-ecosystem/grpc-gateway/v2",
"direct": false,
"version": "v2.29.0",
"ecosystem": "go"
},
{
"name": "github.com/inconshreveable/mousetrap",
"direct": false,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/itchyny/timefmt-go",
"direct": false,
"version": "v0.1.8",
"ecosystem": "go"
},
{
"name": "github.com/klauspost/compress",
"direct": false,
"version": "v1.17.9",
"ecosystem": "go"
},
{
"name": "github.com/kr/pretty",
"direct": false,
"version": "v0.3.1",
"ecosystem": "go"
},
{
"name": "github.com/mattn/go-colorable",
"direct": false,
"version": "v0.1.14",
"ecosystem": "go"
},
{
"name": "github.com/mattn/go-isatty",
"direct": false,
"version": "v0.0.20",
"ecosystem": "go"
},
{
"name": "github.com/mattn/go-runewidth",
"direct": false,
"version": "v0.0.19",
"ecosystem": "go"
},
{
"name": "github.com/olekukonko/cat",
"direct": false,
"version": "v0.0.0-20250911104152-50322a0618f6",
"ecosystem": "go"
},
{
"name": "github.com/olekukonko/errors",
"direct": false,
"version": "v1.2.0",
"ecosystem": "go"
},
{
"name": "github.com/olekukonko/ll",
"direct": false,
"version": "v0.1.6",
"ecosystem": "go"
},
{
"name": "github.com/parquet-go/bitpack",
"direct": false,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "github.com/parquet-go/jsonlite",
"direct": false,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "github.com/pelletier/go-toml/v2",
"direct": false,
"version": "v2.2.4",
"ecosystem": "go"
},
{
"name": "github.com/pierrec/lz4/v4",
"direct": false,
"version": "v4.1.21",
"ecosystem": "go"
},
{
"name": "github.com/pmezard/go-difflib",
"direct": false,
"version": "v1.0.1-0.20181226105442-5d4384ee4fb2",
"ecosystem": "go"
},
{
"name": "github.com/rogpeppe/go-internal",
"direct": false,
"version": "v1.14.1",
"ecosystem": "go"
},
{
"name": "github.com/sagikazarmark/locafero",
"direct": false,
"version": "v0.11.0",
"ecosystem": "go"
},
{
"name": "github.com/sourcegraph/conc",
"direct": false,
"version": "v0.3.1-0.20240121214520-5f936abd7ae8",
"ecosystem": "go"
},
{
"name": "github.com/spf13/afero",
"direct": false,
"version": "v1.15.0",
"ecosystem": "go"
},
{
"name": "github.com/spf13/cast",
"direct": false,
"version": "v1.10.0",
"ecosystem": "go"
},
{
"name": "github.com/subosito/gotenv",
"direct": false,
"version": "v1.6.0",
"ecosystem": "go"
},
{
"name": "github.com/twpayne/go-geom",
"direct": false,
"version": "v1.6.1",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/auto/sdk",
"direct": false,
"version": "v1.2.1",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/exporters/otlp/otlptrace",
"direct": false,
"version": "v1.44.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/otel/metric",
"direct": false,
"version": "v1.44.0",
"ecosystem": "go"
},
{
"name": "go.opentelemetry.io/proto/otlp",
"direct": false,
"version": "v1.10.0",
"ecosystem": "go"
},
{
"name": "go.yaml.in/yaml/v3",
"direct": false,
"version": "v3.0.4",
"ecosystem": "go"
},
{
"name": "golang.org/x/net",
"direct": false,
"version": "v0.55.0",
"ecosystem": "go"
},
{
"name": "google.golang.org/genproto/googleapis/api",
"direct": false,
"version": "v0.0.0-20260526163538-3dc84a4a5aaa",
"ecosystem": "go"
},
{
"name": "google.golang.org/genproto/googleapis/rpc",
"direct": false,
"version": "v0.0.0-20260526163538-3dc84a4a5aaa",
"ecosystem": "go"
},
{
"name": "google.golang.org/grpc",
"direct": false,
"version": "v1.81.1",
"ecosystem": "go"
},
{
"name": "gopkg.in/check.v1",
"direct": false,
"version": "v1.0.0-20201130134442-10cb98267c6c",
"ecosystem": "go"
},
{
"name": "activesupport",
"direct": false,
"version": "4.2.9",
"ecosystem": "rubygems"
},
{
"name": "addressable",
"direct": false,
"version": "2.9.0",
"ecosystem": "rubygems"
},
{
"name": "coffee-script",
"direct": false,
"version": "2.4.1",
"ecosystem": "rubygems"
},
{
"name": "coffee-script-source",
"direct": false,
"version": "1.11.1",
"ecosystem": "rubygems"
},
{
"name": "colorator",
"direct": false,
"version": "1.1.0",
"ecosystem": "rubygems"
},
{
"name": "concurrent-ruby",
"direct": false,
"version": "1.3.7",
"ecosystem": "rubygems"
},
{
"name": "ethon",
"direct": false,
"version": "0.18.0",
"ecosystem": "rubygems"
},
{
"name": "execjs",
"direct": false,
"version": "2.10.1",
"ecosystem": "rubygems"
},
{
"name": "faraday",
"direct": false,
"version": "2.14.3",
"ecosystem": "rubygems"
},
{
"name": "faraday-net_http",
"direct": false,
"version": "3.4.4",
"ecosystem": "rubygems"
},
{
"name": "ffi",
"direct": false,
"version": "1.17.4",
"ecosystem": "rubygems"
},
{
"name": "forwardable-extended",
"direct": false,
"version": "2.6.0",
"ecosystem": "rubygems"
},
{
"name": "gemoji",
"direct": false,
"version": "3.0.1",
"ecosystem": "rubygems"
},
{
"name": "github-pages",
"direct": false,
"version": "170",
"ecosystem": "rubygems"
},
{
"name": "github-pages-health-check",
"direct": false,
"version": "1.3.5",
"ecosystem": "rubygems"
},
{
"name": "html-pipeline",
"direct": false,
"version": "2.14.3",
"ecosystem": "rubygems"
},
{
"name": "i18n",
"direct": false,
"version": "0.9.5",
"ecosystem": "rubygems"
},
{
"name": "jekyll",
"direct": false,
"version": "3.6.2",
"ecosystem": "rubygems"
},
{
"name": "jekyll-avatar",
"direct": false,
"version": "0.5.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-coffeescript",
"direct": false,
"version": "1.0.2",
"ecosystem": "rubygems"
},
{
"name": "jekyll-default-layout",
"direct": false,
"version": "0.1.4",
"ecosystem": "rubygems"
},
{
"name": "jekyll-feed",
"direct": false,
"version": "0.9.2",
"ecosystem": "rubygems"
},
{
"name": "jekyll-gist",
"direct": false,
"version": "1.4.1",
"ecosystem": "rubygems"
},
{
"name": "jekyll-github-metadata",
"direct": false,
"version": "2.9.3",
"ecosystem": "rubygems"
},
{
"name": "jekyll-mentions",
"direct": false,
"version": "1.2.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-optional-front-matter",
"direct": false,
"version": "0.3.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-paginate",
"direct": false,
"version": "1.1.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-readme-index",
"direct": false,
"version": "0.2.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-redirect-from",
"direct": false,
"version": "0.12.1",
"ecosystem": "rubygems"
},
{
"name": "jekyll-relative-links",
"direct": false,
"version": "0.5.2",
"ecosystem": "rubygems"
},
{
"name": "jekyll-remote-theme",
"direct": false,
"version": "0.5.1",
"ecosystem": "rubygems"
},
{
"name": "jekyll-sass-converter",
"direct": false,
"version": "1.5.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-seo-tag",
"direct": false,
"version": "2.3.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-sitemap",
"direct": false,
"version": "1.1.1",
"ecosystem": "rubygems"
},
{
"name": "jekyll-swiss",
"direct": false,
"version": "0.4.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-theme-architect",
"direct": false,
"version": "0.1.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-theme-cayman",
"direct": false,
"version": "0.1.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-theme-dinky",
"direct": false,
"version": "0.1.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-theme-hacker",
"direct": false,
"version": "0.1.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-theme-leap-day",
"direct": false,
"version": "0.1.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-theme-merlot",
"direct": false,
"version": "0.1.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-theme-midnight",
"direct": false,
"version": "0.1.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-theme-minimal",
"direct": false,
"version": "0.1.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-theme-modernist",
"direct": false,
"version": "0.1.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-theme-primer",
"direct": false,
"version": "0.5.2",
"ecosystem": "rubygems"
},
{
"name": "jekyll-theme-slate",
"direct": false,
"version": "0.1.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-theme-tactile",
"direct": false,
"version": "0.1.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-theme-time-machine",
"direct": false,
"version": "0.1.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-titles-from-headings",
"direct": false,
"version": "0.5.0",
"ecosystem": "rubygems"
},
{
"name": "jekyll-watch",
"direct": false,
"version": "1.5.1",
"ecosystem": "rubygems"
},
{
"name": "jemoji",
"direct": false,
"version": "0.8.1",
"ecosystem": "rubygems"
},
{
"name": "json",
"direct": false,
"version": "2.20.0",
"ecosystem": "rubygems"
},
{
"name": "kramdown",
"direct": false,
"version": "1.14.0",
"ecosystem": "rubygems"
},
{
"name": "liquid",
"direct": false,
"version": "4.0.0",
"ecosystem": "rubygems"
},
{
"name": "listen",
"direct": false,
"version": "3.0.6",
"ecosystem": "rubygems"
},
{
"name": "logger",
"direct": false,
"version": "1.7.0",
"ecosystem": "rubygems"
},
{
"name": "mercenary",
"direct": false,
"version": "0.3.6",
"ecosystem": "rubygems"
},
{
"name": "minima",
"direct": false,
"version": "2.1.1",
"ecosystem": "rubygems"
},
{
"name": "minitest",
"direct": false,
"version": "5.27.0",
"ecosystem": "rubygems"
},
{
"name": "net-dns",
"direct": false,
"version": "0.20.0",
"ecosystem": "rubygems"
},
{
"name": "net-http",
"direct": false,
"version": "0.9.1",
"ecosystem": "rubygems"
},
{
"name": "nokogiri",
"direct": false,
"version": "1.19.4",
"ecosystem": "rubygems"
},
{
"name": "octokit",
"direct": false,
"version": "4.25.1",
"ecosystem": "rubygems"
},
{
"name": "openssl",
"direct": false,
"version": "4.0.2",
"ecosystem": "rubygems"
},
{
"name": "pathutil",
"direct": false,
"version": "0.16.2",
"ecosystem": "rubygems"
},
{
"name": "public_suffix",
"direct": false,
"version": "2.0.5",
"ecosystem": "rubygems"
},
{
"name": "racc",
"direct": false,
"version": "1.8.1",
"ecosystem": "rubygems"
},
{
"name": "rb-fsevent",
"direct": false,
"version": "0.11.2",
"ecosystem": "rubygems"
},
{
"name": "rb-inotify",
"direct": false,
"version": "0.11.1",
"ecosystem": "rubygems"
},
{
"name": "rouge",
"direct": false,
"version": "2.2.1",
"ecosystem": "rubygems"
},
{
"name": "rubyzip",
"direct": false,
"version": "2.4.1",
"ecosystem": "rubygems"
},
{
"name": "safe_yaml",
"direct": false,
"version": "1.0.5",
"ecosystem": "rubygems"
},
{
"name": "sass",
"direct": false,
"version": "3.7.4",
"ecosystem": "rubygems"
},
{
"name": "sass-listen",
"direct": false,
"version": "4.0.0",
"ecosystem": "rubygems"
},
{
"name": "sawyer",
"direct": false,
"version": "0.9.3",
"ecosystem": "rubygems"
},
{
"name": "terminal-table",
"direct": false,
"version": "1.8.0",
"ecosystem": "rubygems"
},
{
"name": "thread_safe",
"direct": false,
"version": "0.3.6",
"ecosystem": "rubygems"
},
{
"name": "typhoeus",
"direct": false,
"version": "0.8.0",
"ecosystem": "rubygems"
},
{
"name": "tzinfo",
"direct": false,
"version": "1.2.11",
"ecosystem": "rubygems"
},
{
"name": "unicode-display_width",
"direct": false,
"version": "1.8.0",
"ecosystem": "rubygems"
},
{
"name": "uri",
"direct": false,
"version": "1.1.1",
"ecosystem": "rubygems"
}
],
"collected": true,
"truncated": false,
"total_count": 151,
"direct_count": 24,
"indirect_count": 127
}
},
"maintainership": {
"issues": {
"open_prs": 7,
"merged_prs": 250,
"open_issues": 15,
"closed_ratio": 0.812,
"closed_issues": 65,
"closed_unmerged_prs": 31
},
"bus_factor": 1,
"bot_contributors": 3,
"top_contributors": [
{
"type": "User",
"login": "discostu105",
"commits": 390,
"avatar_url": "https://avatars.githubusercontent.com/u/10918780?v=4"
},
{
"type": "User",
"login": "ElDuderinos",
"commits": 83,
"avatar_url": "https://avatars.githubusercontent.com/u/31986166?v=4"
},
{
"type": "User",
"login": "pawelsiwek",
"commits": 16,
"avatar_url": "https://avatars.githubusercontent.com/u/26413843?v=4"
},
{
"type": "User",
"login": "MaciejGrynda",
"commits": 16,
"avatar_url": "https://avatars.githubusercontent.com/u/85988949?v=4"
},
{
"type": "User",
"login": "herwigmoser",
"commits": 9,
"avatar_url": "https://avatars.githubusercontent.com/u/16954394?v=4"
},
{
"type": "User",
"login": "beeme1mr",
"commits": 7,
"avatar_url": "https://avatars.githubusercontent.com/u/682996?v=4"
},
{
"type": "User",
"login": "mreider",
"commits": 6,
"avatar_url": "https://avatars.githubusercontent.com/u/118036?v=4"
},
{
"type": "User",
"login": "chbo-dt",
"commits": 6,
"avatar_url": "https://avatars.githubusercontent.com/u/137424235?v=4"
},
{
"type": "User",
"login": "christian-kreuzberger-dtx",
"commits": 5,
"avatar_url": "https://avatars.githubusercontent.com/u/56065213?v=4"
},
{
"type": "User",
"login": "alramlechner",
"commits": 5,
"avatar_url": "https://avatars.githubusercontent.com/u/8438592?v=4"
}
],
"contributors_sampled": 40,
"top_contributor_share": 0.658
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"build.yml",
"lint-docs-templates.yml",
"lint.yml",
"makefile.yml",
"pages.yml",
"release.yml",
"sdk.yml",
"security.yml",
"test.yml"
],
"has_docs_dir": true,
"linter_configs": [
".golangci.yml"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"Gemfile.lock",
"go.sum"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": null,
"reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 8,
"reason": "26 out of 29 merged PRs checked by a CI test -- score normalized to 8",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 3,
"reason": "Found 8/22 approved changesets -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 8 contributing companies or organizations",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 15 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": 10,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": 8,
"reason": "5 out of the last 5 releases have a total of 5 signed artifacts.",
"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": 2,
"reason": "8 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "39d109fcfef90adfef19c0c5ec7c0bd41f0acfb0",
"ran_at": "2026-07-21T21:05:03Z",
"aggregate_score": 6.1,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": true,
"has_dependabot_config": true
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/dynatrace-oss/dtctl",
"host": "github.com",
"name": "dtctl",
"owner": "dynatrace-oss"
},
"metrics": {
"overall": {
"key": "overall",
"band": "good",
"name": "Overall health",
"note": null,
"notes": [],
"value": 77,
"inputs": {
"security": 69,
"vitality": 89,
"community": 72,
"governance": 69,
"engineering": 84
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 89,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 83,
"inputs": {
"commits_last_year": 619,
"human_commit_share": 0.79,
"days_since_last_push": 0,
"active_weeks_last_year": 27
},
"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": "27/52 weeks with commits",
"points": 18.7,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 27
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "619 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 619
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 98,
"inputs": {
"releases_count": 59,
"latest_release_tag": "v0.35.0",
"releases_from_tags": false,
"days_since_latest_release": 0,
"mean_days_between_releases": 3.9
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "59 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 59
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~3.9 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 3.9
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "5 out of the last 5 releases have a total of 5 signed artifacts.",
"points": 8,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 0,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 0 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 0
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "good",
"name": "Community & Adoption",
"value": 72,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "moderate",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"forks": 58,
"stars": 168,
"watchers": 6,
"growth_state": "organic",
"growth_factor_pct": 100
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "168 stars",
"points": 36.1,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 168
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "58 forks",
"points": 14.6,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 58
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "6 watchers",
"points": 3.9,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 6
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "excellent",
"name": "Community health",
"note": null,
"notes": [],
"value": 92,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (Apache-2.0)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "Apache-2.0"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 13.5,
"status": "met",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 6.3,
"status": "met",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 69,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 40,
"top_contributor_share": 0.658
},
"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 66% of commits",
"points": 7.7,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 66
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "40 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 40
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 8 contributing companies or organizations",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 76,
"inputs": {
"merged_prs": 250,
"open_issues": 15,
"closed_issues": 65,
"issue_closed_ratio": 0.812,
"closed_unmerged_prs": 31
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "81% of issues closed",
"points": 38,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 81
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "250/281 decided PRs merged",
"points": 34,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 250,
"decided": 281
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 8/22 approved changesets -- score normalized to 3",
"points": 4.5,
"status": "partial",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "good",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 72,
"inputs": {
"followers": 267,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "dynatrace-oss",
"public_repos": 94,
"account_age_days": 2430
},
"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": "267 followers of dynatrace-oss",
"points": 17.5,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 267,
"login": "dynatrace-oss"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "94 public repos, account ~6 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 94
}
},
{
"code": "account_age_years",
"params": {
"years": 6
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/dynatrace-oss/dtctl",
"github.com/dynatrace-oss/dtctl/sdk"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 0
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "2 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 2,
"ecosystems": "go"
}
}
],
"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": "59 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 59
}
}
],
"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": 84,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 80,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "9 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 9
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": ".golangci.yml",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yml"
}
}
],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "26 out of 29 merged PRs checked by a CI test -- score normalized to 8",
"points": 16,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"topics": [
"cli",
"developer-tools",
"devops",
"dql",
"dynatrace",
"monitoring",
"observability"
],
"has_wiki": false,
"homepage": "https://dynatrace-oss.github.io/dtctl/",
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://dynatrace-oss.github.io/dtctl/",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "7 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 7
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 69,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 61,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 6.1
},
"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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "26 out of 29 merged PRs checked by a CI test -- score normalized to 8",
"points": 2,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 8/22 approved changesets -- score normalized to 3",
"points": 2.2,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 8 contributing companies or organizations",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 15 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 detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "5 out of the last 5 releases have a total of 5 signed artifacts.",
"points": 6,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "8 existing vulnerabilities detected",
"points": 1.5,
"status": "partial",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 151 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"indirect_dependencies_free_of_known_advisories",
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_repository",
"params": {
"assessed": 151
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 8,
"affected_packages": 4,
"assessed_packages": 151,
"unassessed_packages": 0,
"affected_by_severity": "critical 1, high 2, unknown 1",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "transitive set not separable from development and test dependencies in this scope",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_scope_not_separable",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 151,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 9
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 82,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.987,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 17569
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "78 of 79 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 78,
"sampled": 79
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "excellent",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"has_nix": true,
"has_tests": true,
"lockfiles": [
"Gemfile.lock",
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"makefile"
],
"has_devcontainer": true,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0.16,
"toolchain_manifests": [
"go.mod",
"sdk/go.mod"
],
"dependency_bot_commit_share": 0.16
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "makefile"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": ".golangci.yml",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".golangci.yml"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "devcontainer, Nix, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "devcontainer, Nix, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "16 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 16,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "16 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 16,
"sampled": 100
}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 99,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 112576,
"source_files_sampled": 580,
"oversized_source_files": 6
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "6/580 source files over 60KB",
"points": 54.4,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 580,
"oversized": 6
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [],
"report_type": "repository",
"generated_at": "2026-07-21T21:05:33.247031Z",
"schema_version": "0.23.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dynatrace-oss/dtctl.svg",
"full_name": "dynatrace-oss/dtctl",
"license_state": "standard",
"license_spdx": "Apache-2.0"
}